canvas-datagrid 0.4.4 → 0.4.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-datagrid.module.js","sources":["../lib/defaults.js","../lib/component.js","../lib/draw.js","../node_modules/is-printable-key-event/dist/index.js","../lib/events/util.js","../lib/events/index.js","../lib/touch.js","../lib/intf.js","../lib/contextMenu.js","../lib/button.js","../lib/dom.js","../lib/groups/util.js","../lib/publicMethods.js","../lib/main.js"],"sourcesContent":["/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n\n'use strict';\nexport default function (self) {\n self.defaults = {\n attributes: [\n ['allowColumnReordering', true],\n ['allowColumnResize', true],\n ['allowColumnResizeFromCell', false],\n ['allowFreezingRows', false],\n ['allowFreezingColumns', false],\n ['allowMovingSelection', true],\n ['allowRowHeaderResize', true],\n ['allowRowReordering', false],\n ['allowRowResize', true],\n ['allowRowResizeFromCell', false],\n ['allowSorting', true],\n ['allowGroupingRows', true],\n ['allowGroupingColumns', true],\n ['animationDurationShowContextMenu', 50],\n ['animationDurationHideContextMenu', 50],\n ['autoGenerateSchema', false],\n ['autoResizeColumns', false],\n ['autoResizeRows', false],\n ['autoScrollOnMousemove', false],\n ['autoScrollMargin', 5],\n ['blanksText', '(Blanks)'],\n ['borderDragBehavior', 'none'],\n ['borderResizeZone', 10],\n ['clearSettingsOptionText', 'Clear saved settings'],\n ['columnHeaderClickBehavior', 'sort'],\n ['columnSelectorHiddenText', '&nbsp;&nbsp;&nbsp;'],\n ['columnSelectorText', 'Add/Remove columns'],\n ['columnSelectorVisibleText', '\\u2713'],\n ['contextHoverScrollAmount', 2],\n ['contextHoverScrollRateMs', 5],\n ['copyHeadersOnSelectAll', true],\n ['copyText', 'Copy'],\n ['debug', false],\n ['editable', true],\n ['ellipsisText', '...'],\n ['filterOptionText', 'Filter %s'],\n ['filterTextPrefix', '(filtered) '],\n ['filterFrozenRows', true],\n ['globalRowResize', false],\n ['hideColumnText', 'Hide %s'],\n ['showUnhideColumnsIndicator', false],\n ['showUnhideRowsIndicator', false],\n ['showHideRow', 'Hide row %s'],\n ['showHideRows', 'Hide rows %s'],\n ['hoverMode', 'cell'],\n ['keepFocusOnMouseOut', false],\n ['maxAutoCompleteItems', 200],\n ['multiLine', false],\n ['name', ''],\n ['pageUpDownOverlap', 1],\n ['pasteText', 'Paste'],\n ['persistantSelectionMode', false],\n ['removeFilterOptionText', 'Remove filter on %s'],\n ['reorderDeadZone', 3],\n ['resizeScrollZone', 20],\n ['rowGrabZoneSize', 5],\n ['columnGrabZoneSize', 30],\n ['saveAppearance', true],\n ['scrollAnimationPPSThreshold', 0.75],\n ['scrollPointerLock', false],\n ['scrollRepeatRate', 75],\n ['selectionFollowsActiveCell', false],\n ['selectionHandleBehavior', 'none'],\n ['selectionMode', 'cell'],\n ['selectionScrollIncrement', 20],\n ['selectionScrollZone', 20],\n ['showClearSettingsOption', true],\n ['showColumnHeaders', true],\n ['showColumnSelector', true],\n ['showCopy', false],\n ['showFilter', true],\n ['showFilterInCell', false],\n ['showNewRow', false],\n ['showOrderByOption', true],\n ['showOrderByOptionTextAsc', 'Order by %s ascending'],\n ['showOrderByOptionTextDesc', 'Order by %s descending'],\n //#region grouping\n ['showGroupColumns', 'Group columns %s'],\n ['showGroupRows', 'Group rows %s'],\n ['showRemoveGroupColumns', 'Remove group %s'],\n ['showRemoveGroupRows', 'Remove group %s'],\n ['showRemoveAllGroupColumns', 'Remove all column groups'],\n ['showRemoveAllGroupRows', 'Remove all row groups'],\n ['showExpandAllGroupColumns', 'Expand all column groups'],\n ['showExpandAllGroupRows', 'Expand all row groups'],\n ['showCollapseAllGroupColumns', 'Collapse all column groups'],\n ['showCollapseAllGroupRows', 'Collapse all row groups'],\n ['columnGroupIndicatorPosition', 'right'],\n ['rowGroupIndicatorPosition', 'bottom'],\n //#endregion grouping\n ['showPaste', false],\n ['showPerformance', false],\n ['showRowHeaders', true],\n ['showRowNumbers', true],\n ['showRowNumberGaps', true],\n ['singleSelectionMode', false],\n ['snapToRow', false],\n ['sortFrozenRows', true],\n ['touchContextMenuTimeMs', 800],\n ['touchDeadZone', 3],\n ['touchEasingMethod', 'easeOutQuad'],\n ['touchReleaseAcceleration', 1000],\n ['touchReleaseAnimationDurationMs', 2000],\n ['touchScrollZone', 20],\n ['touchSelectHandleZone', 20],\n ['touchZoomSensitivity', 0.005],\n ['touchZoomMin', 0.5],\n ['touchZoomMax', 1.75],\n ['maxPixelRatio', 2],\n ['tree', false],\n ['treeHorizontalScroll', false],\n ['rowTree', []],\n ['rowTreeColIndex', 0],\n ['columnTree', []],\n ['columnTreeRowStartIndex', 0],\n ['columnTreeRowEndIndex', 0],\n ],\n styles: [\n ['activeCellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellBorderColor', 'rgba(110, 168, 255, 1)'],\n ['activeCellBorderWidth', 1],\n ['activeCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellFont', '16px sans-serif'],\n ['activeCellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellHorizontalAlignment', 'left'],\n ['activeCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['activeCellOverlayBorderWidth', 1],\n ['activeCellPaddingBottom', 5],\n ['activeCellPaddingLeft', 5],\n ['activeCellPaddingRight', 5],\n ['activeCellPaddingTop', 5],\n ['activeCellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['activeCellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellVerticalAlignment', 'center'],\n ['activeColumnHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeColumnHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeRowHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeRowHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['autocompleteBottomMargin', 60],\n ['autosizeHeaderCellPadding', 8],\n ['autosizePadding', 5],\n ['buttonActiveBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['buttonActiveBorderColor', 'rgba(110, 168, 255, 1)'],\n ['buttonArrowColor', 'rgba(50, 50, 50, 1)'],\n ['buttonArrowDownHTML', '&#x25BC;'],\n ['buttonZIndex', 10000],\n ['buttonBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['buttonBorderColor', 'rgba(172, 172, 172, 1)'],\n ['buttonHoverBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['buttonMenuWindowMargin', 30],\n ['buttonPadding', '3px'],\n ['cellAutoResizePadding', 13],\n ['cellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellBorderColor', 'rgba(195, 199, 202, 1)'],\n ['cellBorderWidth', 1],\n ['cellColor', 'rgba(0, 0, 0, 1)'],\n ['cellFont', '16px sans-serif'],\n ['cellGridHeight', 250],\n ['cellHeight', 24],\n ['cellHeightWithChildGrid', 150],\n ['cellHorizontalAlignment', 'left'],\n ['cellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['cellPaddingBottom', 5],\n ['cellPaddingLeft', 5],\n ['cellPaddingRight', 5],\n ['cellPaddingTop', 5],\n ['cellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['cellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['cellTreeIconBorderColor', 'rgba(162, 174, 207, 1)'],\n ['cellTreeIconFillColor', 'rgba(240, 240, 240, 1)'],\n ['cellTreeIconHoverFillColor', 'rgba(198, 217, 233, 1)'],\n ['cellTreeIconLineColor', 'rgba(43, 53, 81, 1)'],\n ['cellTreeIconLineWidth', 1.5],\n ['cellTreeIconMarginLeft', 0],\n ['cellTreeIconMarginRight', 5],\n ['cellTreeIconMarginTop', 6],\n ['cellTreeIconWidth', 13],\n ['cellVerticalAlignment', 'center'],\n ['cellWidth', 250],\n ['cellWidthWithChildGrid', 250],\n ['cellWhiteSpace', 'nowrap'],\n ['cellLineHeight', 1],\n ['cellLineSpacing', 3],\n ['childContextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['childContextMenuArrowHTML', '&#x25BA;'],\n ['childContextMenuMarginLeft', -11],\n ['childContextMenuMarginTop', -6],\n ['columnGroupRowHeight', 25],\n ['columnHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['columnHeaderCellBorderColor', 'rgba(172, 172, 172, 1)'],\n ['columnHeaderCellBorderWidth', 1],\n ['columnHeaderCellCapBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['columnHeaderCellCapBorderColor', 'rgba(172, 172, 172, 1)'],\n ['columnHeaderCellCapBorderWidth', 1],\n ['columnHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['columnHeaderCellFont', '16px sans-serif'],\n ['columnHeaderCellHeight', 25],\n ['columnHeaderCellHorizontalAlignment', 'left'],\n ['columnHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['columnHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['columnHeaderCellPaddingBottom', 5],\n ['columnHeaderCellPaddingLeft', 5],\n ['columnHeaderCellPaddingRight', 5],\n ['columnHeaderCellPaddingTop', 5],\n ['columnHeaderCellVerticalAlignment', 'center'],\n ['columnHeaderOrderByArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['columnHeaderOrderByArrowBorderWidth', 1],\n ['columnHeaderOrderByArrowColor', 'rgba(155, 155, 155, 1)'],\n ['columnHeaderOrderByArrowHeight', 8],\n ['columnHeaderOrderByArrowMarginLeft', 0],\n ['columnHeaderOrderByArrowMarginRight', 5],\n ['columnHeaderOrderByArrowMarginTop', 6],\n ['columnHeaderOrderByArrowWidth', 13],\n ['contextFilterButtonBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterButtonBorderRadius', '3px'],\n ['contextFilterButtonHTML', '&#x25BC;'],\n ['contextFilterInputBackground', 'rgba(255,255,255,1)'],\n ['contextFilterInputBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterInputBorderRadius', '0'],\n ['contextFilterInputColor', 'rgba(0,0,0,1)'],\n ['contextFilterInputFontFamily', 'sans-serif'],\n ['contextFilterInputFontSize', '14px'],\n ['contextFilterInvalidRegExpBackground', 'rgba(180, 6, 1, 1)'],\n ['contextFilterInvalidRegExpColor', 'rgba(255, 255, 255, 1)'],\n ['contextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuArrowDownHTML', '&#x25BC;'],\n ['contextMenuArrowUpHTML', '&#x25B2;'],\n ['contextMenuBackground', 'rgba(240, 240, 240, 1)'],\n ['contextMenuBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextMenuBorderRadius', '3px'],\n ['contextMenuChildArrowFontSize', '12px'],\n ['contextMenuColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuCursor', 'default'],\n ['contextMenuFilterButtonFontFamily', 'sans-serif'],\n ['contextMenuFilterButtonFontSize', '10px'],\n ['contextMenuFilterInvalidExpresion', 'rgba(237, 155, 156, 1)'],\n ['contextMenuFontFamily', 'sans-serif'],\n ['contextMenuFontSize', '16px'],\n ['contextMenuHoverBackground', 'rgba(182, 205, 250, 1)'],\n ['contextMenuHoverColor', 'rgba(43, 48, 153, 1)'],\n ['contextMenuItemBorderRadius', '3px'],\n ['contextMenuItemMargin', '2px'],\n ['contextMenuLabelDisplay', 'inline-block'],\n ['contextMenuLabelMargin', '0 3px 0 0'],\n ['contextMenuLabelMaxWidth', '700px'],\n ['contextMenuLabelMinWidth', '75px'],\n ['contextMenuMarginLeft', 3],\n ['contextMenuMarginTop', -3],\n ['contextMenuOpacity', '0.98'],\n ['contextMenuPadding', '2px'],\n ['contextMenuWindowMargin', 30],\n ['contextMenuZIndex', 10000],\n ['cornerCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['cornerCellBorderColor', 'rgba(202, 202, 202, 1)'],\n ['debugBackgroundColor', 'rgba(0, 0, 0, .0)'],\n ['debugColor', 'rgba(255, 15, 24, 1)'],\n ['debugEntitiesColor', 'rgba(76, 231, 239, 1.00)'],\n ['debugFont', '11px sans-serif'],\n ['debugPerfChartBackground', 'rgba(29, 25, 26, 1.00)'],\n ['debugPerfChartTextColor', 'rgba(255, 255, 255, 0.8)'],\n ['debugPerformanceColor', 'rgba(252, 255, 37, 1.00)'],\n ['debugScrollHeightColor', 'rgba(248, 33, 103, 1.00)'],\n ['debugScrollWidthColor', 'rgba(66, 255, 27, 1.00)'],\n ['debugTouchPPSXColor', 'rgba(246, 102, 24, 1.00)'],\n ['debugTouchPPSYColor', 'rgba(186, 0, 255, 1.00)'],\n ['display', 'inline-block'],\n ['editCellBackgroundColor', 'white'],\n ['editCellBorder', 'solid 1px rgba(110, 168, 255, 1)'],\n ['editCellBoxShadow', '0 2px 5px rgba(0,0,0,0.4)'],\n ['editCellColor', 'black'],\n ['editCellFontFamily', 'sans-serif'],\n ['editCellFontSize', '16px'],\n ['editCellPaddingLeft', 4],\n ['editCellZIndex', 10000],\n ['filterButtonActiveBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['filterButtonArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['filterButtonArrowBorderWidth', 1],\n ['filterButtonArrowClickRadius', 5],\n ['filterButtonArrowColor', 'rgba(50, 50, 50, 1)'],\n ['filterButtonArrowHeight', 5],\n ['filterButtonArrowWidth', 8],\n ['filterButtonBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['filterButtonBorderColor', 'rgba(172, 172, 172, 1)'],\n ['filterButtonBorderRadius', 3],\n ['filterButtonHeight', 20],\n ['filterButtonHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['filterButtonMenuOffsetTop', 10],\n ['filterButtonWidth', 20],\n ['frozenMarkerHoverColor', 'rgba(165, 198, 254, 1)'],\n ['frozenMarkerHoverBorderColor', 'rgba(165, 198, 254, 1)'],\n ['frozenMarkerActiveColor', 'rgba(165, 198, 254, 0.2)'],\n ['frozenMarkerActiveBorderColor', 'rgba(165, 198, 254, 0.5)'],\n ['frozenMarkerActiveHeaderColor', 'rgba(165, 198, 254, 1)'],\n ['frozenMarkerColor', 'rgba(221, 221, 221, 1)'],\n ['frozenMarkerBorderColor', 'rgba(221, 221, 221, 1)'],\n ['frozenMarkerBorderWidth', 1],\n ['frozenMarkerHeaderColor', 'rgba(188, 188, 188, 1)'],\n ['frozenMarkerWidth', 4],\n ['groupingAreaBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['gridBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['gridBorderCollapse', 'collapse'],\n ['gridBorderColor', 'rgba(202, 202, 202, 1)'],\n ['gridBorderWidth', 1],\n ['groupIndicatorColor', 'rgba(155, 155, 155, 1)'],\n ['groupIndicatorBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['height', 'auto'],\n ['maxHeight', 'inherit'],\n ['maxWidth', 'inherit'],\n ['minColumnWidth', 45],\n ['minHeight', 'inherit'],\n ['minRowHeight', 24],\n ['minWidth', 'inherit'],\n ['mobileContextMenuMargin', 10],\n ['mobileEditInputHeight', 30],\n ['mobileEditFontFamily', 'sans-serif'],\n ['mobileEditFontSize', '16px'],\n ['moveOverlayBorderWidth', 1],\n ['moveOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['moveOverlayBorderSegments', '12, 7'],\n ['name', 'default'],\n ['overflowY', 'auto'],\n ['overflowX', 'auto'],\n ['reorderMarkerBackgroundColor', 'rgba(0, 0, 0, 0.1)'],\n ['reorderMarkerBorderColor', 'rgba(0, 0, 0, 0.2)'],\n ['reorderMarkerBorderWidth', 1.25],\n ['reorderMarkerIndexBorderColor', 'rgba(66, 133, 244, 1)'],\n ['reorderMarkerIndexBorderWidth', 2.75],\n ['rowGroupColumnWidth', 25],\n ['rowHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['rowHeaderCellBorderColor', 'rgba(200, 200, 200, 1)'],\n ['rowHeaderCellBorderWidth', 1],\n ['rowHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellFont', '16px sans-serif'],\n ['rowHeaderCellHeight', 25],\n ['rowHeaderCellHorizontalAlignment', 'left'],\n ['rowHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['rowHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['rowHeaderCellPaddingBottom', 5],\n ['rowHeaderCellPaddingLeft', 5],\n ['rowHeaderCellPaddingRight', 5],\n ['rowHeaderCellPaddingTop', 5],\n ['rowHeaderCellRowNumberGapHeight', 5],\n ['rowHeaderCellRowNumberGapColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellSelectedBackgroundColor', 'rgba(217, 217, 217, 1)'],\n ['rowHeaderCellSelectedColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellVerticalAlignment', 'center'],\n ['rowHeaderCellWidth', 57],\n ['scrollBarActiveColor', 'rgba(125, 125, 125, 1)'],\n ['scrollBarBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarBorderWidth', 0.5],\n ['scrollBarBoxBorderRadius', 4.125],\n ['scrollBarBoxColor', 'rgba(192, 192, 192, 1)'],\n ['scrollBarBoxMargin', 2],\n ['scrollBarBoxMinSize', 15],\n ['scrollBarBoxWidth', 8],\n ['scrollBarCornerBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarCornerBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarWidth', 11],\n ['selectionHandleBorderColor', 'rgba(255, 255, 255, 1)'],\n ['selectionHandleBorderWidth', 1.5],\n ['selectionHandleColor', 'rgba(66, 133, 244, 1)'],\n ['selectionHandleSize', 8],\n ['selectionHandleType', 'square'],\n ['selectionOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['selectionOverlayBorderWidth', 1],\n ['treeArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['treeArrowBorderWidth', 1],\n ['treeArrowClickRadius', 5],\n ['treeArrowColor', 'rgba(155, 155, 155, 1)'],\n ['treeArrowHeight', 8],\n ['treeArrowMarginLeft', 0],\n ['treeArrowMarginRight', 5],\n ['treeArrowMarginTop', 6],\n ['treeArrowWidth', 13],\n ['treeGridHeight', 250],\n ['unhideIndicatorColor', 'rgba(0, 0, 0, 1)'],\n ['unhideIndicatorBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['unhideIndicatorBorderColor', 'rgba(174, 193, 232, 1)'],\n ['unhideIndicatorSize', 16],\n ['width', 'auto'],\n ],\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport defaults from './defaults';\n\nexport default function () {\n var typeMap,\n component = {};\n component.dehyphenateProperty = function hyphenateProperty(prop) {\n prop = prop.replace('--cdg-', '');\n var p = '',\n nextLetterCap;\n Array.prototype.forEach.call(prop, function (char) {\n if (nextLetterCap) {\n nextLetterCap = false;\n p += char.toUpperCase();\n return;\n }\n if (char === '-') {\n nextLetterCap = true;\n return;\n }\n p += char;\n });\n return p;\n };\n component.hyphenateProperty = function hyphenateProperty(prop, cust) {\n var p = '';\n Array.prototype.forEach.call(prop, function (char) {\n if (char === char.toUpperCase()) {\n p += '-' + char.toLowerCase();\n return;\n }\n p += char;\n });\n return (cust ? '--cdg-' : '') + p;\n };\n function getDefaultItem(base, item) {\n var i = {},\n r;\n defaults(i);\n r = i.defaults[base].filter(function (i) {\n return (\n i[0].toLowerCase() === item.toLowerCase() ||\n component.hyphenateProperty(i[0]) === item.toLowerCase() ||\n component.hyphenateProperty(i[0], true) === item.toLowerCase()\n );\n })[0];\n return r;\n }\n component.applyComponentStyle = function (supressChangeAndDrawEvents, intf) {\n if (!intf.isComponent) {\n return;\n }\n var cStyle = window.getComputedStyle(\n intf.tagName === 'CANVAS-DATAGRID' ? intf : intf.canvas,\n null,\n ),\n defs = {};\n intf.computedStyle = cStyle;\n defaults(defs);\n defs = defs.defaults.styles;\n defs.forEach(function (def) {\n var val;\n val = cStyle.getPropertyValue(component.hyphenateProperty(def[0], true));\n if (val === '') {\n val = cStyle.getPropertyValue(\n component.hyphenateProperty(def[0], false),\n );\n }\n if (val !== '' && typeof val === 'string') {\n intf.setStyleProperty(\n def[0],\n typeMap[typeof def[1]](\n val.replace(/^\\s+/, '').replace(/\\s+$/, ''),\n def[1],\n ),\n true,\n );\n }\n });\n if (!supressChangeAndDrawEvents && intf.dispatchEvent) {\n requestAnimationFrame(function () {\n intf.resize(true);\n });\n intf.dispatchEvent('stylechanged', intf.style);\n }\n };\n typeMap = {\n data: function (strData) {\n try {\n return JSON.parse(strData);\n } catch (e) {\n throw new Error('Cannot read JSON data in canvas-datagrid data.');\n }\n },\n schema: function (strSchema) {\n try {\n return JSON.parse(strSchema);\n } catch (e) {\n throw new Error(\n 'Cannot read JSON data in canvas-datagrid schema attribute.',\n );\n }\n },\n number: function (strNum, def) {\n var n = parseInt(strNum, 10);\n return isNaN(n) ? def : n;\n },\n boolean: function (strBool) {\n return /true/i.test(strBool);\n },\n string: function (str) {\n return str;\n },\n };\n component.getObservableAttributes = function () {\n var i = {},\n attrs = ['data', 'schema', 'style', 'className', 'name'];\n defaults(i);\n i.defaults.attributes.forEach(function (attr) {\n attrs.push(attr[0].toLowerCase());\n });\n return attrs;\n };\n component.disconnectedCallback = function () {\n this.connected = false;\n };\n component.connectedCallback = function () {\n var intf = this;\n intf.parentDOMNode.innerHTML = '';\n intf.parentDOMNode.appendChild(intf.canvas);\n intf.connected = true;\n component.observe(intf);\n component.applyComponentStyle(true, intf);\n intf.resize(true);\n };\n component.adoptedCallback = function () {\n this.resize();\n };\n component.attributeChangedCallback = function (attrName, oldVal, newVal) {\n var tfn,\n intf = this,\n def;\n if (attrName === 'style') {\n component.applyComponentStyle(false, intf);\n return;\n }\n if (attrName === 'data') {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = newVal;\n return;\n }\n if (attrName === 'schema') {\n intf.schema = typeMap.schema(newVal);\n return;\n }\n if (attrName === 'name') {\n intf.name = newVal;\n return;\n }\n if (attrName === 'class' || attrName === 'className') {\n return;\n }\n def = getDefaultItem('attributes', attrName);\n if (def) {\n tfn = typeMap[typeof def[1]];\n intf.attributes[def[0]] = tfn(newVal);\n return;\n }\n if (/^on/.test(attrName)) {\n intf.addEventListener('on' + attrName, Function('e', newVal));\n }\n return;\n };\n component.observe = function (intf) {\n var observer;\n if (!window.MutationObserver) {\n return;\n }\n intf.applyComponentStyle = function () {\n component.applyComponentStyle(false, intf);\n intf.resize();\n };\n /**\n * Applies the computed css styles to the grid. In some browsers, changing directives in attached style sheets does not automatically update the styles in this component. It is necessary to call this method to update in these cases.\n * @memberof canvasDatagrid\n * @name applyComponentStyle\n * @method\n */\n observer = new window.MutationObserver(function (mutations) {\n var checkInnerHTML, checkStyle;\n Array.prototype.forEach.call(mutations, function (mutation) {\n if (\n mutation.attributeName === 'class' ||\n mutation.attributeName === 'style'\n ) {\n checkStyle = true;\n return;\n }\n if (mutation.target.nodeName === 'STYLE') {\n checkStyle = true;\n return;\n }\n if (\n mutation.target.parentNode &&\n mutation.target.parentNode.nodeName === 'STYLE'\n ) {\n checkStyle = true;\n return;\n }\n if (\n mutation.target === intf &&\n (mutation.addedNodes.length > 0 || mutation.type === 'characterData')\n ) {\n checkInnerHTML = true;\n }\n });\n if (checkStyle) {\n intf.applyComponentStyle(false, intf);\n }\n if (checkInnerHTML) {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = intf.innerHTML;\n }\n });\n observer.observe(intf, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n Array.prototype.forEach.call(\n document.querySelectorAll('style'),\n function (el) {\n observer.observe(el, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n },\n );\n };\n return component;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals XMLSerializer: false, define: true, Blob: false, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n var perfCounters = [],\n cachedImagesDrawn = false,\n drawCount = 0,\n perfWindowSize = 300,\n entityCount = [],\n hiddenFrozenColumnCount = 0,\n scrollDebugCounters = [],\n touchPPSCounters = [];\n self.htmlImageCache = {};\n // more heavyweight version than fillArray defined in intf.js\n function fillArray(low, high, step, def) {\n step = step || 1;\n var i = [],\n x;\n for (x = low; x <= high; x += step) {\n i[x] = def === undefined ? x : typeof def === 'function' ? def(x) : def;\n }\n return i;\n }\n function drawPerfLine(w, h, x, y, perfArr, arrIndex, max, color, useAbs) {\n var i = w / perfArr.length,\n r = h / max;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.moveTo(x, y + h);\n perfArr.forEach(function (n) {\n var val = arrIndex === undefined ? n : n[arrIndex],\n cx,\n cy;\n if (useAbs) {\n val = Math.abs(val);\n }\n cx = x + i;\n cy = y + h - val * r;\n self.ctx.lineTo(cx, cy);\n x += i;\n });\n self.ctx.moveTo(x + w, y + h);\n self.ctx.strokeStyle = color;\n self.ctx.stroke();\n }\n function drawOnAllImagesLoaded() {\n var loaded = true;\n Object.keys(self.htmlImageCache).forEach(function (html) {\n if (!self.htmlImageCache[html].img.complete) {\n loaded = false;\n }\n });\n if (loaded && !cachedImagesDrawn) {\n cachedImagesDrawn = true;\n self.draw();\n }\n }\n function drawHtml(cell) {\n var img,\n v = cell.innerHTML || cell.formattedValue,\n cacheKey =\n v.toString() + cell.rowIndex.toString() + cell.columnIndex.toString(),\n x = Math.round(cell.x + self.canvasOffsetLeft),\n y = Math.round(cell.y + self.canvasOffsetTop);\n if (self.htmlImageCache[cacheKey]) {\n img = self.htmlImageCache[cacheKey].img;\n if (\n self.htmlImageCache[cacheKey].height !== cell.height ||\n self.htmlImageCache[cacheKey].width !== cell.width\n ) {\n // height and width of the cell has changed, invalidate cache\n self.htmlImageCache[cacheKey] = undefined;\n } else {\n if (!img.complete) {\n return;\n }\n return self.ctx.drawImage(img, x, y);\n }\n } else {\n cachedImagesDrawn = false;\n }\n img = new Image(cell.width, cell.height);\n self.htmlImageCache[cacheKey] = {\n img,\n width: cell.width,\n height: cell.height,\n };\n img.onload = function () {\n self.ctx.drawImage(img, x, y);\n drawOnAllImagesLoaded();\n };\n img.src =\n 'data:image/svg+xml;base64,' +\n btoa(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' +\n cell.width +\n '\" height=\"' +\n cell.height +\n '\">\\n' +\n '<foreignObject class=\"node\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\\n' +\n '<body xmlns=\"http://www.w3.org/1999/xhtml\" style=\"margin:0;padding:0;\">\\n' +\n v +\n '\\n' +\n '</body>' +\n '</foreignObject>\\n' +\n '</svg>\\n',\n );\n }\n /**\n * @param {number[]} coords [x0,y0, x1,y1, x2,y2, ...]\n * @param {boolean} [fill] fill the area that construct by these lines but not stroke\n */\n function drawLines(coords, fill) {\n if (coords.length < 4) return;\n self.ctx.beginPath();\n self.ctx.moveTo(\n coords[0] + self.canvasOffsetLeft,\n coords[1] + self.canvasOffsetTop,\n );\n for (let i = 2; i < coords.length; i += 2) {\n const x = coords[i] + self.canvasOffsetLeft;\n const y = coords[i + 1] + self.canvasOffsetTop;\n self.ctx.lineTo(x, y);\n }\n if (fill) self.ctx.fill();\n else self.ctx.stroke();\n }\n /**\n * @param {number} x based-X (left-top)\n * @param {number} y based-Y (left-top)\n * @param {number} width\n * @param {boolean} collapsed true: '+'; false: '-'\n */\n function drawGroupHandle(x, y, width, collapsed) {\n fillRect(x, y, width, width);\n strokeRect(x, y, width, width);\n const cx = x + width * 0.5;\n const cy = y + width * 0.5;\n drawLines([x + width * 0.2, cy, x + width * 0.78, cy]);\n if (collapsed) drawLines([cx, y + width * 0.22, cx, y + width * 0.8]);\n }\n /**\n * @param {number} x\n * @param {number} y\n * @param {number} size\n * @param {string} dir Direction of the triangle, one of the 't','b','l' and 'r'\n * @param {boolean} [active]\n */\n function drawUnhideIndicator(x, y, size, dir, active) {\n const minPadding = size * 0.2;\n const maxPadding = size * 0.3;\n /** The long edge width of the triangle */\n const longEdge = size - 2 * minPadding;\n /** The median width of the triangle */\n const median = size - 2 * maxPadding;\n const halfLongEdge = longEdge * 0.5;\n let x0, y0;\n let coords, borderCoords;\n switch (dir) {\n case 'r':\n x0 = x + maxPadding;\n y0 = y + minPadding;\n borderCoords = [x, y, x + size, y, x + size, y + size, x, y + size];\n coords = [x0, y0, x0, y0 + longEdge, x0 + median, y0 + halfLongEdge];\n break;\n case 'l':\n x0 = x + size - maxPadding;\n y0 = y + minPadding;\n borderCoords = [x + size, y, x, y, x, y + size, x + size, y + size];\n coords = [x0, y0, x0, y0 + longEdge, x0 - median, y0 + halfLongEdge];\n break;\n case 't':\n x0 = x + minPadding;\n y0 = y + size - maxPadding;\n borderCoords = [x, y + size, x, y, x + size, y, x + size, y + size];\n coords = [x0, y0, x0 + longEdge, y0, x0 + halfLongEdge, y0 - median];\n break;\n case 'b':\n x0 = x + minPadding;\n y0 = y + maxPadding;\n borderCoords = [x, y, x, y + size, x + size, y + size, x + size, y];\n coords = [x0, y0, x0 + longEdge, y0, x0 + halfLongEdge, y0 + median];\n break;\n }\n\n if (active) {\n self.ctx.strokeStyle = self.style.unhideIndicatorBorderColor;\n self.ctx.lineWidth = 2;\n drawLines(borderCoords);\n\n self.ctx.fillStyle = self.style.unhideIndicatorBackgroundColor;\n let offset = dir === 'r' || dir === 'b' ? 1 : 0;\n if (dir === 'l' || dir === 'r')\n fillRect(x - offset, y, size + offset, size);\n else fillRect(x, y - offset, size, size + offset);\n }\n\n self.ctx.fillStyle = self.style.unhideIndicatorColor;\n drawLines(coords, true);\n }\n function drawOrderByArrow(x, y) {\n var mt = self.style.columnHeaderOrderByArrowMarginTop * self.scale,\n ml = self.style.columnHeaderOrderByArrowMarginLeft * self.scale,\n mr = self.style.columnHeaderOrderByArrowMarginRight * self.scale,\n aw = self.style.columnHeaderOrderByArrowWidth * self.scale,\n ah = self.style.columnHeaderOrderByArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.columnHeaderOrderByArrowColor;\n self.ctx.strokeStyle = self.style.columnHeaderOrderByArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.orderDirection === 'asc') {\n self.ctx.lineTo(x, y + ah);\n self.ctx.lineTo(x + aw, y + ah);\n self.ctx.lineTo(x + aw * 0.5, y);\n self.ctx.lineTo(x, y + ah);\n } else {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawTreeArrow(cell, x, y) {\n var mt = self.style.treeArrowMarginTop * self.scale,\n mr = self.style.treeArrowMarginRight * self.scale,\n ml = self.style.treeArrowMarginLeft * self.scale,\n aw = self.style.treeArrowWidth * self.scale,\n ah = self.style.treeArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.treeArrowColor;\n self.ctx.strokeStyle = self.style.treeArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.openChildren[cell.rowIndex]) {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n } else {\n self.ctx.lineTo(x, y);\n self.ctx.lineTo(x + ah, y + aw * 0.5);\n self.ctx.lineTo(x, y + aw);\n self.ctx.lineTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawCellTreeIcon(cell, tree, rowTree) {\n const parentCount = rowTree ? tree.parentCount : 0;\n const iconSize = self.style.cellTreeIconWidth * self.scale,\n marginTop = self.style.cellTreeIconMarginTop * self.scale,\n marginRight = self.style.cellTreeIconMarginRight * self.scale,\n marginLeft =\n self.style.cellTreeIconMarginLeft * self.scale +\n parentCount * (iconSize + cell.paddingLeft);\n\n let x = cell.x + cell.paddingLeft + self.canvasOffsetLeft + marginLeft,\n y = cell.y + self.canvasOffsetTop + marginTop;\n\n if (tree.icon) {\n self.ctx.beginPath();\n const oldFillStyle = self.ctx.fillStyle;\n const oldStrokeStyle = self.ctx.strokeStyle;\n\n if (cell.hovered && self.hovers.onCellTreeIcon) {\n self.ctx.fillStyle = self.style.cellTreeIconHoverFillColor;\n } else {\n self.ctx.fillStyle = self.style.cellTreeIconFillColor;\n }\n\n self.ctx.fillRect(x, y, iconSize, iconSize);\n self.ctx.strokeStyle = self.style.cellTreeIconBorderColor;\n self.ctx.rect(x, y, iconSize, iconSize);\n self.ctx.stroke();\n\n self.ctx.beginPath();\n if (tree.expand) {\n self.ctx.moveTo(x + 3, y + iconSize * 0.5);\n self.ctx.lineTo(x + iconSize - 3, y + iconSize * 0.5);\n } else {\n self.ctx.moveTo(x + 2, y + iconSize * 0.5);\n self.ctx.lineTo(x + iconSize - 2, y + iconSize * 0.5);\n self.ctx.moveTo(x + iconSize * 0.5, y + 2);\n self.ctx.lineTo(x + iconSize * 0.5, y + iconSize - 2);\n }\n self.ctx.lineWidth = self.style.cellTreeIconLineWidth;\n self.ctx.strokeStyle = self.style.cellTreeIconLineColor;\n self.ctx.stroke();\n\n self.ctx.strokeStyle = oldStrokeStyle;\n self.ctx.fillStyle = oldFillStyle;\n }\n\n return marginLeft + iconSize + marginRight;\n }\n function drawFilterButtonArrow(x, y) {\n var mt =\n ((self.style.filterButtonHeight - self.style.filterButtonArrowHeight) /\n 2) *\n self.scale,\n ml =\n ((self.style.filterButtonWidth - self.style.filterButtonArrowWidth) /\n 2) *\n self.scale,\n aw = self.style.filterButtonArrowWidth * self.scale,\n ah = self.style.filterButtonArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.filterButtonArrowColor;\n self.ctx.strokeStyle = self.style.filterButtonArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw;\n }\n function radiusRect(x, y, w, h, radius) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n var r = x + w,\n b = y + h;\n self.ctx.beginPath();\n self.ctx.moveTo(x + radius, y);\n self.ctx.lineTo(r - radius, y);\n self.ctx.quadraticCurveTo(r, y, r, y + radius);\n self.ctx.lineTo(r, y + h - radius);\n self.ctx.quadraticCurveTo(r, b, r - radius, b);\n self.ctx.lineTo(x + radius, b);\n self.ctx.quadraticCurveTo(x, b, x, b - radius);\n self.ctx.lineTo(x, y + radius);\n self.ctx.quadraticCurveTo(x, y, x + radius, y);\n }\n function fillRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillRect(x, y, w, h);\n }\n function strokeRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.strokeRect(x, y, w, h);\n }\n function fillText(text, x, y) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillText(text, x, y);\n }\n function fillCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.fill();\n }\n function strokeCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.stroke();\n }\n function clipFrozenArea(mode) {\n // 0 both, 1 rows, 2 cols\n // self.lastFrozenColumnPixel;\n // self.lastFrozenRowPixel;\n self.ctx.beginPath();\n if (mode === 0) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, self.lastFrozenRowPixel);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 1) {\n self.ctx.moveTo(0, self.lastFrozenRowPixel);\n self.ctx.lineTo(0, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 2) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, 0);\n self.ctx.lineTo(self.width, 0);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n }\n self.ctx.clip();\n }\n function fillHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return fillCircle(x, y, r * 0.5);\n }\n fillRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function strokeHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return strokeCircle(x, y, r * 0.5);\n }\n strokeRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function addselectionHandle(c, pos) {\n var hw = self.style.selectionHandleSize,\n p = {\n tr: function () {\n fillHandle(c.x + c.width, c.y, hw);\n strokeHandle(c.x + c.width, c.y, hw);\n },\n br: function () {\n fillHandle(c.x + c.width, c.y + c.height, hw);\n strokeHandle(c.x + c.width, c.y + c.height, hw);\n },\n tl: function () {\n fillHandle(c.x, c.y, hw);\n strokeHandle(c.x, c.y, hw);\n },\n bl: function () {\n fillHandle(c.x, c.y + c.height, hw);\n strokeHandle(c.x, c.y + c.height, hw);\n },\n };\n p[pos]();\n }\n function addBorderLine(c, pos) {\n self.ctx.beginPath();\n var p = {\n t: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n },\n r: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n b: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n l: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n };\n p[pos]();\n self.ctx.stroke();\n }\n function addEllipsis(text, width) {\n var c,\n w = 0;\n if (self.ellipsisCache[text] && self.ellipsisCache[text][width]) {\n return self.ellipsisCache[text][width];\n }\n //TODO Add ellipsis back when there is a fast way to do it\n w = self.ctx.measureText(text).width;\n self.ellipsisCache[text] = self.ellipsisCache[text] || {};\n c = { value: text, width: w };\n self.ellipsisCache[text][width] = c;\n return c;\n }\n function wrapText(cell, splitChar) {\n if (!cell.formattedValue) {\n return {\n lines: [{ width: 0, value: '' }],\n width: 0,\n height: cell.calculatedLineHeight,\n };\n }\n var max = 0,\n n = '\\n',\n x,\n word,\n words = cell.formattedValue.split(splitChar),\n textHeight = cell.calculatedLineHeight,\n lines = [],\n out = [],\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n autoResize = self.attributes.autoResizeRows && wrap,\n elWidth,\n et = self.attributes.ellipsisText,\n elClipLength,\n plWidth,\n clippedVal,\n ogWordWidth,\n previousLine,\n line = {\n width: 0,\n value: '',\n },\n cHeight = wrap ? cell.paddedHeight : cell.calculatedLineHeight;\n lines.push(line);\n elWidth = self.ctx.measureText(' ' + et).width;\n for (x = 0; x < words.length; x += 1) {\n word = words[x];\n var curSplitChar = word[word.length - 1] === '-' ? '' : splitChar;\n var measure = self.ctx.measureText(word + curSplitChar);\n if (line.width + measure.width + elWidth < cell.paddedWidth) {\n line.value += word + curSplitChar;\n line.width += measure.width;\n continue;\n }\n // if there is a hyphenated word that is too long\n // split it and add the split set to the array\n // then back up and re-read new split set\n // this behavior seems right, it might not be\n if (/\\w-\\w/.test(word) && cell.paddedWidth < measure.width) {\n var arr = word.split('-');\n arr = arr.map((item, index) => {\n return index === arr.length - 1 ? item : item + '-';\n });\n words.splice(x, 1, ...arr);\n x -= 1;\n continue;\n }\n line = {\n width: measure.width,\n value: word + curSplitChar,\n };\n if (x === 0) {\n lines = [];\n lines.push(line);\n }\n textHeight += cell.calculatedLineHeight;\n if (textHeight > cHeight && !autoResize) {\n if (lines.length === 0) {\n break;\n }\n elClipLength = 1;\n previousLine = lines[lines.length - 1];\n if (previousLine.width < cell.paddedWidth && words.length === 1) {\n break;\n }\n clippedVal = previousLine.value + word;\n plWidth = self.ctx.measureText(clippedVal + et).width;\n var originText = clippedVal;\n if (plWidth > cell.paddedWidth) {\n var stepLength = parseInt(clippedVal.length / 2);\n var direction = -1;\n while (stepLength > 0) {\n clippedVal = originText.substr(\n 0,\n stepLength * direction + clippedVal.length,\n );\n plWidth = self.ctx.measureText(clippedVal + et).width;\n direction = plWidth > cell.paddedWidth ? -1 : 1;\n stepLength = parseInt(stepLength / 2);\n }\n }\n clippedVal =\n clippedVal + (originText.length != clippedVal.length ? et : '');\n previousLine.value = clippedVal;\n previousLine.width = plWidth;\n break;\n }\n if (x > 0) {\n lines.push(line);\n }\n }\n return {\n lines: lines,\n width: max,\n height: cell.calculatedLineHeight * lines.length,\n };\n }\n function drawText(cell, treeCellPadding = 0) {\n var ll = cell.text.lines.length,\n h = cell.fontHeight * cell.lineHeight,\n x,\n line,\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n textHeight = 0;\n for (x = 0; x < cell.text.lines.length; x += 1) {\n line = cell.text.lines[x];\n var vPos =\n Math.max(\n (cell.height -\n (wrap ? cell.text.height : cell.calculatedLineHeight)) *\n 0.5,\n 0,\n ) + h,\n hPos =\n cell.paddingLeft +\n treeCellPadding +\n cell.treeArrowWidth +\n cell.orderByArrowWidth;\n if (cell.horizontalAlignment === 'right') {\n hPos =\n cell.paddingLeft + treeCellPadding + cell.paddedWidth - line.width;\n } else if (cell.horizontalAlignment === 'center') {\n hPos =\n cell.paddingLeft +\n treeCellPadding +\n (cell.paddedWidth + cell.paddingRight) / 2 -\n line.width / 2;\n }\n if (cell.verticalAlignment === 'top') {\n vPos = cell.calculatedLineHeight;\n } else if (cell.verticalAlignment === 'bottom') {\n vPos = cell.height - cell.paddingBottom - cell.text.height;\n }\n line.height = h + cell.lineSpacing;\n line.offsetLeft = hPos;\n line.offsetTop = vPos;\n line.x = cell.x + hPos;\n line.y = cell.y + textHeight + vPos;\n textHeight += line.height;\n fillText(line.value, line.x, line.y);\n }\n if (self.attributes.debug && cell.active) {\n requestAnimationFrame(function () {\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n JSON.stringify(\n {\n x: cell.x,\n y: cell.y,\n h: cell.height,\n w: cell.width,\n pw: cell.paddedWidth,\n idx: cell.columnIndex,\n idx_ord: cell.sortColumnIndex,\n },\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 14,\n );\n fillText(\n JSON.stringify(\n cell.text.lines.map(function (l) {\n return { w: l.width, v: l.value.length };\n }),\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 30,\n );\n });\n }\n }\n function getFrozenColumnsWidth() {\n var w = 0,\n s = self.getSchema(),\n x = 0,\n n = Math.min(self.frozenColumn, s.length),\n collapsedGroups = self.getCollapsedColumnGroups(),\n column;\n hiddenFrozenColumnCount = 0;\n while (x < n) {\n column = s[x];\n if (column.hidden) {\n hiddenFrozenColumnCount += 1;\n } else {\n const isCollapsed =\n collapsedGroups.findIndex(\n (group) => x >= group.from && x <= group.to,\n ) >= 0;\n if (isCollapsed) {\n hiddenFrozenColumnCount += 1;\n } else {\n w += self.getColumnWidth(x);\n }\n }\n x += 1;\n }\n return w;\n }\n /**\n * Redraws the grid. No matter what the change, this is the only method required to refresh everything.\n * @memberof canvasDatagrid\n * @name draw\n * @method\n */\n // r = literal row index\n // rd = row data array\n // i = user order index\n // o = literal data index\n // y = y drawing cursor\n // x = x drawing cursor\n // s = visible schema array\n // cx = current x drawing cursor sub calculation var\n // cy = current y drawing cursor sub calculation var\n // a = static cell (like corner cell)\n // p = perf counter\n // l = data length\n // u = current cell\n // h = current height\n // w = current width\n self.draw = function (internal) {\n if (self.dispatchEvent('beforedraw', {})) {\n return;\n }\n if (!self.isChildGrid && (!self.height || !self.width)) {\n return;\n }\n if (self.isChildGrid && internal) {\n requestAnimationFrame(self.parentGrid.draw);\n return;\n }\n if (self.intf.visible === false) {\n return;\n }\n // initial values\n var checkScrollHeight,\n rowHeaderCell,\n p,\n cx,\n cy,\n treeGrid,\n rowOpen,\n rowHeight,\n cornerCell,\n y,\n x,\n c,\n h,\n w,\n schema,\n rowIndex,\n rowData,\n aCell,\n viewData = self.viewData || [],\n bc = self.style.gridBorderCollapse === 'collapse',\n selectionBorders = [],\n moveBorders = [],\n selectionHandles = [],\n rowHeaders = [],\n l = viewData.length,\n u = self.currentCell || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n rowGroupsAreaWidth = self.getRowGroupAreaWidth(),\n columnGroupsAreaHeight = self.getColumnGroupAreaHeight(),\n /** key: boundRowIndex, value: `{y,h}` */\n rowGroupsRectInfo = {},\n /** value: `{y,h}` */\n rowGroupsFrozenInfo = {},\n /** key: columnIndex, value: `{x,w}` */\n columnGroupsRectInfo = {},\n collapsedColumnGroups = self.getCollapsedColumnGroups(),\n collapsedRowGroups = self.getCollapsedRowGroups(),\n cellHeight = self.style.cellHeight,\n currentRowIndexOffset = 0,\n /** @type {Array<{from:number,plus:number}>} */\n rowIndexOffsetByHiddenRows = self.hiddenRowRanges\n .map((range) => ({\n from: range[0],\n plus: range[1] - range[0] + 1,\n }))\n .sort((a, b) => a.from - b.from);\n drawCount += 1;\n p = performance.now();\n self.visibleRowHeights = [];\n // if data length has changed, there is no way to know\n if (viewData.length > self.orders.rows.length) {\n self.createRowOrders();\n }\n function saveRowGroupsRectInfo(cell) {\n let index = cell.boundRowIndex;\n if (index >= -1 === false)\n if (cell.rowIndex === -1) index = -1;\n else return;\n if (rowGroupsRectInfo[index]) return;\n rowGroupsRectInfo[index] = { y: cell.y, h: cell.height };\n }\n function saveColumnGroupsRectInfo(cell) {\n const index = cell.columnIndex;\n if (columnGroupsRectInfo[index]) return;\n columnGroupsRectInfo[index] = { x: cell.x, w: cell.width };\n }\n /**\n * @param {number} columnIndex\n * @returns {boolean}\n */\n function isColumnCollapsedByGroup(columnIndex) {\n return (\n collapsedColumnGroups.findIndex(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n ) >= 0\n );\n }\n\n function drawScrollBars() {\n var drawCorner,\n en = self.scrollBox.entities,\n m = self.style.scrollBarBoxMargin * 2;\n self.ctx.strokeStyle = self.style.scrollBarBorderColor;\n self.ctx.lineWidth = self.style.scrollBarBorderWidth;\n if (self.frozenColumn > 0) {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n self.scrollCache.x[self.frozenColumn - 1] +\n (en.horizontalBar.width -\n self.scrollCache.x[self.frozenColumn - 1] -\n self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n } else {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n (en.horizontalBar.width - self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n }\n en.verticalBox.y =\n columnHeaderCellHeight +\n self.style.scrollBarBoxMargin +\n self.scrollCache.y[self.frozenRow] +\n (en.verticalBar.height -\n self.scrollBox.scrollBoxHeight -\n self.scrollCache.y[self.frozenRow]) *\n (self.scrollBox.scrollTop / self.scrollBox.scrollHeight);\n if (self.scrollBox.horizontalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n strokeRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (self.scrollBox.horizontalBoxVisible) {\n if (/horizontal/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.horizontalBox.x,\n en.horizontalBox.y,\n en.horizontalBox.width,\n en.horizontalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.horizontalBar);\n self.visibleCells.unshift(en.horizontalBox);\n }\n if (self.scrollBox.verticalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n strokeRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n if (self.scrollBox.verticalBoxVisible) {\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (/vertical/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.verticalBox.x,\n en.verticalBox.y,\n en.verticalBox.width,\n en.verticalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.verticalBar);\n self.visibleCells.unshift(en.verticalBox);\n }\n if (drawCorner) {\n //corner\n self.ctx.strokeStyle = self.style.scrollBarCornerBorderColor;\n self.ctx.fillStyle = self.style.scrollBarCornerBackgroundColor;\n radiusRect(\n en.corner.x,\n en.corner.y,\n en.corner.width,\n en.corner.height,\n 0,\n );\n self.ctx.stroke();\n self.ctx.fill();\n self.visibleCells.unshift(en.corner);\n }\n }\n function createHandlesOverlayArray(cell) {\n if (self.attributes.allowMovingSelection || self.mobile) {\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderRight &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tr']);\n cell.selectionHandle = 'tr';\n }\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tl']);\n cell.selectionHandle = 'tl';\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'bl']);\n cell.selectionHandle = 'bl';\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderRight &&\n (self.attributes.selectionHandleBehavior !== 'none' || self.mobile)\n ) {\n selectionHandles.push([cell, 'br']);\n cell.selectionHandle = 'br';\n }\n }\n }\n function createBorderOverlayArray(\n cell,\n drawArray,\n propPrefix,\n offsetPoint,\n ) {\n offsetPoint = offsetPoint || { x: 0, y: 0 };\n cell.selectionBorder = '';\n if (\n !cell.isRowHeader &&\n self.selections[cell.rowIndex + -offsetPoint.y] &&\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) !== -1\n ) {\n if (\n (!self.selections[cell.rowIndex - 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex - 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1 ||\n cell.rowIndex === 0) &&\n !cell.isHeader\n ) {\n drawArray.push([cell, 't']);\n cell[propPrefix + 'BorderTop'] = true;\n cell[propPrefix + 'Border'] += 't';\n }\n if (\n !self.selections[cell.rowIndex + 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex + 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'b']);\n cell[propPrefix + 'BorderBottom'] = true;\n cell[propPrefix + 'Border'] += 'b';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === 0 ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex - 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'l']);\n cell[propPrefix + 'BorderLeft'] = true;\n cell[propPrefix + 'Border'] += 'l';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === schema.length ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'r']);\n cell[propPrefix + 'BorderRight'] = true;\n cell[propPrefix + 'Border'] += 'r';\n }\n }\n }\n function drawCell(rowData, rowOrderIndex, rowIndex) {\n return function drawEach(header, headerIndex, columnOrderIndex) {\n if (header.hidden) {\n return 0;\n }\n var cellStyle = header.style || 'cell',\n cellGridAttributes,\n cell,\n isHeader = /HeaderCell/.test(cellStyle),\n isCorner = /cornerCell/.test(cellStyle),\n isRowHeader = 'rowHeaderCell' === cellStyle,\n isColumnHeader = 'columnHeaderCell' === cellStyle,\n isFilterable =\n self.filterable.rows.includes(rowIndex) &&\n self.filterable.columns.includes(headerIndex),\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n selected =\n self.selections[rowOrderIndex] &&\n self.selections[rowOrderIndex].indexOf(columnOrderIndex) !== -1,\n hovered =\n self.hovers.rowIndex === rowOrderIndex &&\n (self.attributes.hoverMode === 'row' ||\n self.hovers.columnIndex === columnOrderIndex),\n openedFilter =\n self.selectedFilterButton.rowIndex == rowIndex &&\n self.selectedFilterButton.columnIndex == headerIndex,\n active =\n self.activeCell.rowIndex === rowOrderIndex &&\n self.activeCell.columnIndex === columnOrderIndex,\n isColumnHeaderCellCap = cellStyle === 'columnHeaderCellCap',\n rawValue = rowData ? rowData[header.name] : undefined,\n isGrid = header.type === 'canvas-datagrid',\n activeHeader =\n (self.orders.rows[self.activeCell.rowIndex] === rowOrderIndex ||\n self.selectedRows.indexOf(rowOrderIndex) >= 0 ||\n self.orders.columns[self.activeCell.columnIndex] ===\n headerIndex ||\n self.selectedColumns.indexOf(headerIndex) >= 0) &&\n (columnOrderIndex === -1 || rowOrderIndex === -1)\n ? isRowHeader\n ? 'activeRowHeaderCell'\n : 'activeColumnHeaderCell'\n : false,\n val,\n f = self.formatters[header.type || 'string'],\n orderByArrowSize = 0,\n treeArrowSize = 0,\n cellWidth = self.sizes.columns[headerIndex] || header.width,\n ev = {\n value: rawValue,\n row: rowData,\n header: header,\n };\n if (isColumnHeaderCellCap) {\n cellWidth = w - x;\n }\n // if no data or schema are defined, a width is provided to the stub column\n if (cellWidth === undefined) {\n cellWidth = self.style.cellWidth;\n }\n cellWidth = cellWidth * self.scale;\n if (x + cellWidth + self.style.cellBorderWidth < 0) {\n x += cellWidth + self.style.cellBorderWidth;\n }\n if (active && cellStyle !== 'cornerCell') {\n cellStyle = 'activeCell';\n }\n if (self.visibleRows.indexOf(rowIndex) === -1 && !isHeader) {\n self.visibleRows.push(rowIndex);\n }\n val = self.dispatchEvent('formatcellvalue', ev);\n cx = x;\n cy = y;\n if (cellStyle === 'cornerCell') {\n cx = 0;\n cy = 0;\n } else if (isRowHeader) {\n cx = 0;\n } else if (isHeader) {\n cy = 0;\n }\n cell = {\n type: isGrid ? 'canvas-datagrid-cell' : header.type,\n style: cellStyle,\n nodeType: 'canvas-datagrid-cell',\n x: cx,\n y: cy,\n fontHeight: (self.style[cellStyle + 'FontHeight'] || 0) * self.scale,\n horizontalAlignment: self.style[cellStyle + 'HorizontalAlignment'],\n verticalAlignment: self.style[cellStyle + 'VerticalAlignment'],\n paddingLeft:\n (self.style[cellStyle + 'PaddingLeft'] || 0) * self.scale,\n paddingTop: (self.style[cellStyle + 'PaddingTop'] || 0) * self.scale,\n paddingRight:\n (self.style[cellStyle + 'PaddingRight'] || 0) * self.scale,\n paddingBottom:\n (self.style[cellStyle + 'PaddingBottom'] || 0) * self.scale,\n whiteSpace: self.style.cellWhiteSpace,\n lineHeight: self.style.cellLineHeight,\n lineSpacing: self.style.cellLineSpacing,\n offsetTop: self.canvasOffsetTop + cy,\n offsetLeft: self.canvasOffsetLeft + cx,\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n active: active || activeHeader,\n hovered: hovered,\n selected: selected,\n width: cellWidth,\n height: cellHeight,\n offsetWidth: cellWidth,\n offsetHeight: cellHeight,\n parentNode: self.intf.parentNode,\n offsetParent: self.intf.parentNode,\n data: rowData,\n isCorner: isCorner,\n isHeader: isHeader,\n isColumnHeader: isColumnHeader,\n isColumnHeaderCellCap: isColumnHeaderCellCap,\n isRowHeader: isRowHeader,\n isFilterable: isFilterable,\n openedFilter: openedFilter,\n rowOpen: rowOpen,\n header: header,\n\n columnIndex: columnOrderIndex,\n rowIndex: rowOrderIndex,\n\n viewRowIndex: rowOrderIndex,\n viewColumnIndex: columnOrderIndex,\n\n boundRowIndex: self.getBoundRowIndexFromViewRowIndex(rowOrderIndex),\n boundColumnIndex: self.getBoundColumnIndexFromViewColumnIndex(\n columnOrderIndex,\n ),\n\n sortColumnIndex: headerIndex,\n sortRowIndex: rowIndex,\n\n isGrid: isGrid,\n isNormal: !isGrid && !isCorner && !isHeader,\n gridId: (self.attributes.name || '') + rowIndex + ':' + headerIndex,\n parentGrid: self.intf,\n innerHTML: '',\n activeHeader: activeHeader,\n value:\n isHeader && !isRowHeader ? header.title || header.name : rawValue,\n isRowTree:\n rowOrderIndex >= 0 &&\n columnOrderIndex == self.cellTree.rowTreeColIndex &&\n self.cellTree.rows.length > 0 &&\n self.cellTree.rows[rowOrderIndex].icon,\n isColumnTree:\n columnOrderIndex >= 0 &&\n self.cellTree.columns[rowOrderIndex] &&\n self.cellTree.columns[rowOrderIndex][columnOrderIndex].icon,\n };\n cell.calculatedLineHeight =\n cell.fontHeight * cell.lineHeight + cell.lineSpacing;\n cell.paddedWidth = cell.width - cell.paddingRight - cell.paddingLeft;\n cell.paddedHeight = cell.height - cell.paddingTop - cell.paddingBottom;\n ev.cell = cell;\n cell.userHeight = cell.isHeader ? self.sizes.rows[-1] : rowHeight;\n cell.userWidth = cell.isHeader\n ? self.sizes.columns.cornerCell\n : self.sizes.columns[headerIndex];\n self.visibleCells.unshift(cell);\n saveRowGroupsRectInfo(cell);\n saveColumnGroupsRectInfo(cell);\n if (self.dispatchEvent('beforerendercell', ev)) {\n return;\n }\n self.ctx.fillStyle = self.style[cellStyle + 'BackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'BorderColor'];\n self.ctx.lineWidth = self.style[cellStyle + 'BorderWidth'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'HoverBorderColor'];\n }\n if (selected) {\n self.ctx.fillStyle =\n self.style[cellStyle + 'SelectedBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'SelectedBorderColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'BackgroundColor'];\n }\n self.dispatchEvent('rendercell', ev);\n if (cell.isGrid) {\n if (cell.height !== rowHeight) {\n cell.height = rowHeight || self.style.cellHeightWithChildGrid;\n checkScrollHeight = true;\n }\n cell.width =\n self.sizes.columns[headerIndex] ||\n self.style.cellWidthWithChildGrid;\n }\n if (rowOpen && !cell.isRowHeader) {\n cell.height = self.sizes.rows[rowIndex] || self.style.cellHeight;\n }\n if (!cell.isGrid) {\n fillRect(cx, cy, cell.width, cell.height);\n strokeRect(cx, cy, cell.width, cell.height);\n }\n self.ctx.save();\n radiusRect(cell.x, cell.y, cell.width, cell.height, 0);\n self.ctx.clip();\n self.dispatchEvent('afterrendercell', ev);\n if (cell.height !== cellHeight && !(rowOpen && !cell.isRowHeader)) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.height;\n checkScrollHeight = true;\n }\n if (cell.width !== cellWidth) {\n self.sizes.columns[headerIndex] = cell.width;\n checkScrollHeight = true;\n }\n if (isRowHeader && self.attributes.tree) {\n if (!self.dispatchEvent('rendertreearrow', ev)) {\n treeArrowSize = drawTreeArrow(\n cell,\n self.style[cellStyle + 'PaddingLeft'],\n cy,\n 0,\n );\n }\n }\n if ((self.attributes.showRowNumbers && isRowHeader) || !isRowHeader) {\n if (cell.isGrid && !self.dispatchEvent('beforerendercellgrid', ev)) {\n if (!self.childGrids[cell.gridId]) {\n // HACK: this only allows setting of the child grids styles if data is set _after_\n // this is less than desirable. An interface needs to be made to effect the\n // style of all cell grids. One for individual grids already exists.\n cellGridAttributes = self.cellGridAttributes;\n cellGridAttributes.name = self.attributes.saveAppearance\n ? cell.gridId\n : undefined;\n cellGridAttributes.component = false;\n cellGridAttributes.parentNode = cell;\n cellGridAttributes.data = rawValue;\n ev.cellGridAttributes = cellGridAttributes;\n if (self.dispatchEvent('beforecreatecellgrid', ev)) {\n return;\n }\n self.childGrids[cell.gridId] = self.createGrid(\n cellGridAttributes,\n );\n self.sizes.rows[rowIndex] =\n self.sizes.rows[rowIndex] || self.style.cellGridHeight;\n checkScrollHeight = true;\n }\n cell.grid = self.childGrids[cell.gridId];\n cell.grid.parentNode = cell;\n cell.grid.visible = true;\n cell.grid.draw();\n self.dispatchEvent('rendercellgrid', ev);\n } else if (!cell.isGrid) {\n if (self.childGrids[cell.gridId]) {\n self.childGrids[cell.gridId].parentNode.offsetHeight = 0;\n }\n if (isHeader && self.orderBy === header.name) {\n if (!self.dispatchEvent('renderorderbyarrow', ev)) {\n orderByArrowSize = drawOrderByArrow(\n cx + self.style[cellStyle + 'PaddingLeft'],\n 0,\n );\n }\n }\n self.ctx.fillStyle = self.style[cellStyle + 'Color'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverColor'];\n }\n if (selected) {\n self.ctx.fillStyle = self.style[cellStyle + 'SelectedColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'Color'];\n }\n cell.treeArrowWidth = treeArrowSize;\n cell.orderByArrowWidth = orderByArrowSize;\n // create text ref to see if height needs to expand\n val = val !== undefined ? val : f ? f(ev) : '';\n if (val === undefined && !f) {\n val = '';\n console.warn(\n 'canvas-datagrid: Unknown format ' +\n header.type +\n ' add a cellFormater',\n );\n }\n cell.formattedValue = (val !== undefined && val !== null\n ? val\n : ''\n ).toString();\n if (\n self.columnFilters &&\n self.columnFilters[val] !== undefined &&\n isHeader\n ) {\n cell.formattedValue = self.attributes.filterTextPrefix + val;\n }\n self.ctx.font =\n self.style[cellStyle + 'FontHeight'] * self.scale +\n 'px ' +\n self.style[cellStyle + 'FontName'];\n if (!self.dispatchEvent('formattext', ev)) {\n cell.text = wrapText(cell, ' ');\n }\n if (!self.dispatchEvent('rendertext', ev)) {\n if (cell.innerHTML || header.type === 'html') {\n drawHtml(cell);\n } else {\n let treeCellPadding = 0,\n isDrawText = true;\n if (\n cell.columnIndex == self.cellTree.rowTreeColIndex &&\n !cell.isColumnHeader &&\n self.cellTree.rows.length > 0 &&\n Object.keys(self.cellTree.rows[cell.rowIndex]).length > 1\n )\n treeCellPadding = drawCellTreeIcon(\n cell,\n self.cellTree.rows[cell.rowIndex],\n true,\n );\n\n if (\n !cell.isRowHeader &&\n cell.rowIndex > 0 &&\n self.cellTree.columns[cell.rowIndex - 1] &&\n self.cellTree.columns[cell.rowIndex - 1][cell.columnIndex]\n .icon\n ) {\n for (let r = cell.rowIndex - 1; r >= 0; r--) {\n if (!self.cellTree.columns[r]) break;\n if (!self.cellTree.columns[r][cell.columnIndex].icon) break;\n if (!self.cellTree.columns[r][cell.columnIndex].expand) {\n isDrawText = false;\n break;\n }\n }\n }\n if (\n isDrawText &&\n !cell.isRowHeader &&\n self.cellTree.columns[cell.rowIndex] &&\n self.cellTree.columns[cell.rowIndex][cell.columnIndex].icon\n ) {\n if (\n self.viewData.length > 0 &&\n self.viewData[cell.rowIndex][cell.columnIndex].length > 0\n )\n treeCellPadding = drawCellTreeIcon(\n cell,\n self.cellTree.columns[cell.rowIndex][cell.columnIndex],\n false,\n );\n }\n if (isDrawText) drawText(cell, treeCellPadding);\n }\n\n if (wrap && cell.text && cell.text.height > rowHeight) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.text.height;\n checkScrollHeight = true;\n }\n }\n }\n }\n if (active) {\n aCell = cell;\n }\n createBorderOverlayArray(cell, selectionBorders, 'selection');\n // createBorderOverlayArray calculates data for createHandlesOverlayArray so it must go 2nd\n createHandlesOverlayArray(cell);\n if (self.movingSelection) {\n createBorderOverlayArray(cell, moveBorders, 'move', self.moveOffset);\n }\n self.ctx.restore();\n\n if (isFilterable) {\n drawFilterButton(cell);\n }\n\n // Gaps may occur in row numbers between consecutively rendered rows\n // when we are filtering. We draw attention to this by drawing a thick\n // border overlapping the two consecutive row headers. If sorting, visible\n // row numbers stay the same (i.e. they don't correspond to the underlying\n // data's row number), so we do not show row gaps in that case.\n const isSorting =\n self.orderings.columns && self.orderings.columns.length > 0;\n\n if (\n isRowHeader &&\n self.attributes.showRowNumbers &&\n self.attributes.showRowNumberGaps &&\n isSorting === false\n ) {\n const previousRowNumber = self.getBoundRowIndexFromViewRowIndex(\n rowOrderIndex - 1,\n );\n let hasRowGap =\n previousRowNumber !== undefined &&\n cell.boundRowIndex > 0 &&\n cell.boundRowIndex - previousRowNumber > 1;\n if (hasRowGap && collapsedRowGroups.length > 0) {\n hasRowGap =\n collapsedRowGroups.find(\n (group) =>\n group.from === previousRowNumber &&\n group.to === cell.boundRowIndex,\n ) >= 0;\n }\n // We don't treat the row index difference from hidden rows as the row gap.\n if (hasRowGap && self.hiddenRowRanges.length > 0) {\n for (let i = 0; i < self.hiddenRowRanges.length; i++) {\n const [beginRowIndex, endRowIndex] = self.hiddenRowRanges[i];\n if (\n cell.boundRowIndex === endRowIndex + 1 &&\n previousRowNumber === beginRowIndex - 1\n ) {\n hasRowGap = false;\n break;\n }\n }\n }\n\n if (hasRowGap) {\n const barHeight = self.style.rowHeaderCellRowNumberGapHeight;\n const barColor = self.style.rowHeaderCellRowNumberGapColor;\n\n self.ctx.save();\n\n self.ctx.fillStyle = barColor;\n\n fillRect(cell.x, cell.y - barHeight / 2, cell.width, barHeight);\n\n self.ctx.restore();\n }\n }\n\n //#region draw unhide indicator for column headers\n if (isColumnHeader && self.attributes.showUnhideColumnsIndicator) {\n const hovered = self.hovers.unhideIndicator;\n const size = self.style.unhideIndicatorSize;\n const cellX = x;\n const topY = cell.y + Math.max(0.5 * (cell.height - size), 0);\n\n const isActive = (orderIndex) =>\n hovered &&\n (hovered.dir === 'l' || hovered.dir === 'r') &&\n orderIndex >= hovered.orderIndex0 &&\n orderIndex <= hovered.orderIndex1;\n const isHiddenColumn = (columnIndex) =>\n columnIndex >= 0 &&\n schema[columnIndex] &&\n schema[columnIndex].hidden;\n\n let orderIndex0, orderIndex1;\n const drawIndicator = (leftX, dir, active) => {\n self.visibleUnhideIndicators.push({\n x: leftX - 1,\n y: topY - 1,\n x2: leftX + size + 2,\n y2: topY + size + 2,\n orderIndex0,\n orderIndex1,\n dir,\n });\n if (!active) {\n const line = cell.text && cell.text.lines && cell.text.lines[0];\n if (line) {\n const iconsWidth = orderByArrowSize + treeArrowSize;\n const lineX0 = iconsWidth > 0 ? iconsWidth : line.x;\n const lineX1 = line.x + line.width;\n if (leftX + size >= lineX0 && leftX <= lineX1) return;\n }\n }\n drawUnhideIndicator(leftX, topY, size, dir, active);\n }; // end of drawIndicator\n\n let orderIndexPtr = columnOrderIndex - 1;\n const prevColumnIndex = self.orders.columns[orderIndexPtr];\n if (isHiddenColumn(prevColumnIndex)) {\n const active = isActive(prevColumnIndex);\n orderIndex0 = orderIndexPtr;\n orderIndex1 = orderIndexPtr;\n while (--orderIndexPtr >= 0) {\n if (isHiddenColumn(self.orders.columns[orderIndexPtr]))\n orderIndex0 = orderIndexPtr;\n else break;\n }\n drawIndicator(cellX, 'r', active);\n }\n\n orderIndexPtr = columnOrderIndex + 1;\n const nextColumnIndex = self.orders.columns[orderIndexPtr];\n if (isHiddenColumn(nextColumnIndex)) {\n const active = isActive(nextColumnIndex);\n orderIndex0 = orderIndexPtr;\n orderIndex1 = orderIndexPtr;\n while (++orderIndexPtr < self.orders.columns.length) {\n if (isHiddenColumn(self.orders.columns[orderIndexPtr]))\n orderIndex1 = orderIndexPtr;\n else break;\n }\n const indicatorX = x + cell.width - size;\n drawIndicator(indicatorX, 'l', active);\n }\n }\n //#endregion draw unhide indicator for column headers\n\n //#region draw unhide indicator for row headers\n if (\n isRowHeader &&\n self.attributes.showUnhideRowsIndicator &&\n self.hiddenRowRanges.length > 0\n ) {\n // Leo's comment:\n // from the first row to the last row, `rowIndex` is from 0 to the count of rows\n // but `boundRowIndex` can be disordered if there are any ordered columns or filtered columns\n // Like this statement:\n // console.log(rowIndex, cell.boundRowIndex, cell.formattedValue);\n // can output the result like this:\n // 0 1 '2'\n // 1 3 '4'\n const hovered = self.hovers.unhideIndicator;\n const size = self.style.unhideIndicatorSize;\n const leftX = cell.x + cell.width - size - 2;\n const cellY = y;\n const topIndicators = {};\n const bottomIndicators = {};\n self.hiddenRowRanges.forEach((it) => {\n topIndicators[it[0] - 1] = it;\n bottomIndicators[it[1] + 1] = it;\n });\n\n const rowIndex = cell.rowIndex + currentRowIndexOffset;\n const isActive = () =>\n hovered &&\n (hovered.dir === 't' || hovered.dir === 'b') &&\n rowIndex >= hovered.orderIndex0 - 1 &&\n rowIndex <= hovered.orderIndex1 + 1;\n\n let orderIndex0, orderIndex1;\n const drawIndicator = (topY, dir, active) => {\n self.visibleUnhideIndicators.push({\n x: leftX - 1,\n y: topY - 1,\n x2: leftX + size + 2,\n y2: topY + size + 2,\n orderIndex0,\n orderIndex1,\n dir,\n });\n drawUnhideIndicator(leftX, topY, size, dir, active);\n }; // end of drawIndicator\n\n let matched = topIndicators[rowIndex];\n if (matched) {\n const indicatorY = cellY + cell.height - size;\n [orderIndex0, orderIndex1] = matched;\n drawIndicator(indicatorY, 't', isActive());\n }\n matched = bottomIndicators[rowIndex];\n if (matched) {\n const indicatorY = cellY;\n [orderIndex0, orderIndex1] = matched;\n drawIndicator(indicatorY, 'b', isActive());\n }\n }\n //#endregion draw unhide indicator for row headers\n\n x += cell.width + (bc ? 0 : self.style.cellBorderWidth);\n return cell.width;\n }; // end of drawEach\n }\n function drawFilterButton(cell, ev) {\n var posX = cell.x + cell.width - self.style.filterButtonWidth - 1;\n var posY = cell.y + cell.height - self.style.filterButtonHeight - 2;\n if (self.dispatchEvent('beforerenderfilterbutton', ev)) {\n return;\n }\n self.ctx.save();\n self.ctx.strokeStyle = self.style.filterButtonBorderColor;\n self.ctx.fillStyle = self.style.filterButtonBackgroundColor;\n if (cell.openedFilter) {\n self.ctx.fillStyle = self.style.filterButtonActiveBackgroundColor;\n } else if (cell.hovered && self.hovers.onFilterButton) {\n self.ctx.fillStyle = self.style.filterButtonHoverBackgroundColor;\n }\n radiusRect(\n posX,\n posY,\n self.style.filterButtonWidth,\n self.style.filterButtonHeight,\n self.style.filterButtonBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n drawFilterButtonArrow(posX, posY);\n self.ctx.clip();\n self.dispatchEvent('afterrenderfilterbutton', ev);\n self.ctx.restore();\n }\n function drawRowHeader(rowData, rowIndex, rowOrderIndex) {\n if (self.attributes.showRowHeaders) {\n x = 0;\n\n // When filtering we'd like to display the actual row numbers,\n // as it is in the unfiltered data, instead of simply the viewed\n // row index + 1. If rowIndex > viewData.length, it's a new row\n // added to the end, and we want to render that new row's number\n let filteredRowNumber;\n if (self.viewData && rowIndex < self.viewData.length)\n filteredRowNumber =\n self.getBoundRowIndexFromViewRowIndex(rowIndex) + 1;\n else\n filteredRowNumber = self.originalData\n ? self.originalData.length + 1\n : rowOrderIndex + 1;\n\n let rowHeaderValue =\n self.hasActiveFilters() || self.hasCollapsedRowGroup()\n ? filteredRowNumber\n : rowIndex + 1;\n rowHeaderValue += currentRowIndexOffset;\n\n const rowHeaderCell = { rowHeaderCell: rowHeaderValue };\n const headerDescription = {\n name: 'rowHeaderCell',\n width: self.sizes.columns[-1] || self.style.rowHeaderCellWidth,\n style: 'rowHeaderCell',\n type: 'string',\n data: rowHeaderValue,\n index: -1,\n };\n rowOpen = self.openChildren[rowIndex];\n drawCell(rowHeaderCell, rowOrderIndex, rowIndex)(\n headerDescription,\n -1,\n -1,\n );\n\n if (\n rowIndexOffsetByHiddenRows[0] &&\n rowHeaderValue >= rowIndexOffsetByHiddenRows[0].from\n ) {\n const { plus } = rowIndexOffsetByHiddenRows.shift();\n currentRowIndexOffset += plus;\n }\n }\n }\n function drawHeaders() {\n var d,\n g = schema.length,\n i,\n o,\n columnHeaderCell,\n header,\n nonFrozenHeaderWidth;\n function drawHeaderColumnRange(start, end) {\n end = Math.min(end, g);\n for (o = start; o < end; o += 1) {\n i = self.orders.columns[o];\n header = schema[i];\n if (!header.hidden && !isColumnCollapsedByGroup(o)) {\n d = {\n title: header.title,\n name: header.name,\n width: header.width || self.style.cellWidth,\n style: 'columnHeaderCell',\n type: 'string',\n index: o,\n order: i,\n };\n columnHeaderCell = {\n columnHeaderCell: header.title || header.name,\n };\n x += drawCell(columnHeaderCell, -1, -1)(d, i, o);\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n }\n }\n rowHeaders.forEach(function (rArgs, rhIndex) {\n y = rArgs[3];\n cellHeight = rArgs[4];\n if (rhIndex === self.frozenRow) {\n self.ctx.save();\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n drawRowHeader(rArgs[0], rArgs[1], rArgs[2]);\n });\n self.ctx.restore();\n if (self.attributes.showColumnHeaders) {\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n y = 0;\n // cell height might have changed during drawing\n cellHeight = self.getColumnHeaderCellHeight();\n drawHeaderColumnRange(self.scrollIndexLeft, g);\n nonFrozenHeaderWidth = x;\n x = self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n drawHeaderColumnRange(0, self.frozenColumn);\n // fill in the space right of the headers\n x = nonFrozenHeaderWidth;\n if (x < w) {\n c = {\n name: '',\n width: self.style.scrollBarWidth,\n style: 'columnHeaderCellCap',\n isColumnHeaderCell: true,\n isColumnHeaderCellCap: true,\n type: 'string',\n index: schema.length,\n };\n drawCell({ endCap: '' }, -1, -1)(c, -1, -1);\n }\n // fill in the space right of the headers\n if (self.attributes.showRowHeaders) {\n cornerCell = { cornerCell: '' };\n x = 0;\n c = {\n name: 'cornerCell',\n width: self.style.rowHeaderCellWidth,\n style: 'cornerCell',\n type: 'string',\n index: -1,\n };\n drawCell(cornerCell, -1, -1)(c, -1, -1);\n }\n }\n }\n function drawRow(rowOrderIndex, rowIndex) {\n var headerIndex,\n treeHeight,\n rowSansTreeHeight,\n columnOrderIndex,\n g = schema.length;\n if (y - cellHeight * 2 > h) {\n return false;\n }\n rowData = viewData[rowOrderIndex];\n rowOpen = self.openChildren[rowOrderIndex];\n rowSansTreeHeight =\n (self.sizes.rows[rowOrderIndex] || self.style.cellHeight) * self.scale;\n treeHeight = (rowOpen ? self.sizes.trees[rowOrderIndex] : 0) * self.scale;\n rowHeight = rowSansTreeHeight + treeHeight;\n if (y < -rowHeight) {\n return false;\n }\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n cellHeight = rowHeight;\n //draw normal columns\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n if (!isColumnCollapsedByGroup(columnOrderIndex)) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n }\n if (x > self.width) {\n self.scrollIndexRight = columnOrderIndex;\n self.scrollPixelRight = x;\n break;\n }\n }\n //draw frozen columns\n x = 1;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n for (\n columnOrderIndex = 0;\n columnOrderIndex < self.frozenColumn;\n columnOrderIndex += 1\n ) {\n if (!isColumnCollapsedByGroup(columnOrderIndex)) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n }\n if (x > self.width) {\n break;\n }\n }\n self.lastFrozenColumnPixel = x;\n // cell height might have changed during drawing\n cellHeight = rowHeight;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n // don't draw a tree for the new row\n treeGrid = self.childGrids[rowOrderIndex];\n if (rowOrderIndex !== viewData.length && rowOpen) {\n treeGrid.visible = true;\n treeGrid.parentNode = {\n offsetTop: y + rowSansTreeHeight + self.canvasOffsetTop,\n offsetLeft: rowHeaderCellWidth - 1 + self.canvasOffsetLeft,\n offsetHeight: treeHeight,\n offsetWidth:\n self.width - rowHeaderCellWidth - self.style.scrollBarWidth - 1,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: self.style,\n nodeType: 'canvas-datagrid-tree',\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n rowIndex: rowOrderIndex,\n columnGroupsAreaHeight: columnGroupsAreaHeight,\n rowGroupsAreaWidth: rowGroupsAreaWidth,\n };\n if (self.intf.parentNode) {\n const {\n columnGroupsAreaHeight,\n rowGroupsAreaWidth,\n } = self.intf.parentNode;\n treeGrid.parentNode.columnGroupsAreaHeight +=\n columnGroupsAreaHeight || 0;\n treeGrid.parentNode.rowGroupsAreaWidth += rowGroupsAreaWidth || 0;\n }\n self.visibleCells.unshift({\n rowIndex: rowOrderIndex,\n columnIndex: 0,\n y: treeGrid.parentNode.offsetTop,\n x: treeGrid.parentNode.offsetLeft,\n height: treeGrid.height,\n width: treeGrid.width,\n style: 'tree-grid',\n type: treeGrid.parentNode.nodeType,\n });\n treeGrid.draw();\n } else if (treeGrid) {\n treeGrid.parentNode.offsetHeight = 0;\n delete self.sizes.trees[rowOrderIndex];\n }\n rowHeaders.push([rowData, rowOrderIndex, rowIndex, y, rowHeight]);\n self.visibleRowHeights[rowOrderIndex] = rowHeight;\n y += cellHeight + (bc ? 0 : self.style.cellBorderWidth);\n return true;\n }\n function initDraw() {\n self.visibleRows = [];\n schema = self.getSchema();\n self.visibleCells = [];\n self.visibleGroups = [];\n self.visibleUnhideIndicators = [];\n self.canvasOffsetTop = self.isChildGrid ? self.parentNode.offsetTop : 0.5;\n self.canvasOffsetLeft = self.isChildGrid\n ? self.parentNode.offsetLeft\n : -0.5;\n h = self.height;\n w = self.width;\n\n // patch for first row being hidden\n const firstRowIndexOffset = rowIndexOffsetByHiddenRows[0];\n if (firstRowIndexOffset && firstRowIndexOffset.from === 0) {\n currentRowIndexOffset = firstRowIndexOffset.plus;\n rowIndexOffsetByHiddenRows.shift();\n }\n }\n function drawBackground() {\n radiusRect(0, 0, w, h, 0);\n self.ctx.clip();\n self.ctx.fillStyle = self.style.gridBackgroundColor;\n fillRect(0, 0, w, h);\n }\n function initGroupArea() {\n self.ctx.translate(rowGroupsAreaWidth, columnGroupsAreaHeight);\n }\n function drawGroupArea() {\n const mx = rowGroupsAreaWidth;\n const my = columnGroupsAreaHeight;\n const frozenColumnsWidth = getFrozenColumnsWidth();\n const frozenRowsHeight =\n rowGroupsFrozenInfo.y + rowGroupsFrozenInfo.h - columnHeaderCellHeight;\n const onTheLeft = self.attributes.columnGroupIndicatorPosition === 'left';\n const onTheTop = self.attributes.rowGroupIndicatorPosition === 'top';\n\n /** @type {CanvasRenderingContext2D} */\n const ctx = self.ctx;\n ctx.save();\n ctx.fillStyle = self.style.groupingAreaBackgroundColor;\n fillRect(0, -my, w, my);\n fillRect(-mx, -my, mx, h);\n ctx.restore();\n\n //#region Columns Grouping\n /** it extends `self.groupedRows` */\n const groupedColumns = [];\n for (let row = 0; row < self.groupedColumns.length; row++) {\n const groups = self.groupedColumns[row];\n for (let j = 0; j < groups.length; j++) {\n groupedColumns.push(Object.assign({ row }, groups[j]));\n }\n }\n if (groupedColumns.length > 0) {\n const rowHeight = self.style.columnGroupRowHeight;\n const toggleHandleSize = rowHeight * 0.5;\n const toggleHandlePadding = (rowHeight - toggleHandleSize) * 0.5;\n\n for (let i = 0; i < groupedColumns.length; i++) {\n const group = groupedColumns[i];\n const { row, collapsed } = group;\n\n const topY = -my + row * rowHeight;\n const centerY = topY + rowHeight * 0.5;\n const bottomY = topY + rowHeight - toggleHandlePadding;\n const leftmostX =\n rowHeaderCellWidth - toggleHandleSize - toggleHandlePadding;\n\n const drawGroupHandleAtX = (x) =>\n drawGroupHandle(\n x,\n topY + toggleHandlePadding,\n toggleHandleSize,\n group.collapsed,\n );\n const pushToVisibleGroups = (leftX, rightX) =>\n self.visibleGroups.push({\n type: 'c',\n collapsed,\n from: group.from,\n to: group.to,\n row,\n x: leftX + mx,\n y: topY + my,\n x2: rightX + mx,\n y2: bottomY + my,\n });\n\n //#region check the relationship between this group and frozen columns\n const crossTheFrozen =\n group.from < self.frozenColumn && group.to >= self.frozenColumn;\n const notInFrozen = group.from >= self.frozenColumn;\n //#endregion\n\n if (collapsed) {\n let leftX = leftmostX + toggleHandleSize;\n // This group is not sticking on the first column\n if (group.from > 0) {\n let colIndex = group.to + 1;\n let col = columnGroupsRectInfo[colIndex];\n if (!col) {\n colIndex = group.from - 1;\n col = columnGroupsRectInfo[colIndex];\n if (!col) continue; // don't draw this group indicator because it is invisible\n leftX = col.x + col.w - toggleHandleSize * 0.5;\n } else {\n leftX = col.x + toggleHandlePadding;\n }\n if (colIndex >= self.frozenColumn) {\n const compare =\n frozenColumnsWidth + rowHeaderCellWidth - toggleHandlePadding;\n // don't draw this group indicator because it is hidden by frozen columns\n if (leftX < compare) continue;\n }\n }\n const rightX = leftX + toggleHandleSize;\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n drawGroupHandleAtX(leftX);\n ctx.restore();\n pushToVisibleGroups(leftX, rightX);\n } // end of collapsed group\n\n /** @type {number} pointer for loop */\n let ptr;\n let left = columnGroupsRectInfo[group.from];\n let right = columnGroupsRectInfo[group.to];\n\n let containsBegining = true;\n let containsEnd = true;\n ptr = group.from;\n while (!left && ptr < group.to) {\n left = columnGroupsRectInfo[++ptr];\n containsBegining = false;\n }\n ptr = group.to;\n while (!right && ptr > group.from) {\n right = columnGroupsRectInfo[--ptr];\n containsEnd = false;\n }\n if (!left || !right) continue;\n let rightX = right.x + right.w;\n let leftX = left.x;\n if (crossTheFrozen) {\n const rightCompare = columnGroupsRectInfo[self.frozenColumn - 1];\n if (rightCompare) {\n let compareX = rightCompare.x + rightCompare.w;\n if (!onTheLeft) compareX += toggleHandleSize;\n if (compareX >= rightX) {\n right = rightCompare;\n rightX = right.x + right.w;\n containsEnd = false;\n }\n }\n }\n\n let minLeftX =\n rowHeaderCellWidth + (notInFrozen ? frozenColumnsWidth : 0);\n if (rightX + (onTheLeft ? 0 : toggleHandleSize) < minLeftX) continue;\n\n rightX -= toggleHandlePadding;\n leftX += toggleHandlePadding;\n\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n const lineCoords = [];\n\n if (onTheLeft) {\n // avoid lines from two groups be overlapping\n minLeftX += toggleHandlePadding * 2;\n if (leftX < minLeftX) leftX = minLeftX;\n if (group.from === 0) leftX -= toggleHandlePadding * 2;\n if (rightX >= leftX) {\n lineCoords.push(leftX, centerY, rightX, centerY);\n if (containsEnd) lineCoords.push(rightX, bottomY);\n } else {\n rightX = leftX;\n }\n\n leftX -= toggleHandleSize;\n drawGroupHandleAtX(leftX);\n // add more clickable area into `visibleGroups`\n rightX += toggleHandlePadding - 1;\n } else {\n // handle on the right\n if (leftX < minLeftX) leftX = minLeftX;\n if (group.from === 0) leftX -= toggleHandlePadding * 2;\n if (containsEnd) {\n if (group.to === self.frozenColumn - 1) {\n rightX -= toggleHandleSize;\n } else {\n rightX += toggleHandlePadding * 2;\n }\n drawGroupHandleAtX(rightX);\n }\n if (leftX > rightX) {\n leftX = rightX;\n } else {\n if (group.from === 0) {\n containsBegining = true;\n leftX = leftmostX + toggleHandleSize;\n }\n if (containsBegining) lineCoords.push(leftX, bottomY);\n lineCoords.push(leftX, centerY, rightX, centerY);\n }\n\n // add more clickable area into `visibleGroups`\n leftX -= toggleHandlePadding + 1;\n if (containsEnd) rightX += toggleHandleSize;\n }\n drawLines(lineCoords);\n ctx.restore();\n pushToVisibleGroups(leftX, rightX);\n }\n }\n //#endregion Columns Grouping\n\n //#region Rows Grouping\n /** it extends `self.groupedRows` */\n const groupedRows = [];\n for (let col = 0; col < self.groupedRows.length; col++) {\n const groups = self.groupedRows[col];\n for (let j = 0; j < groups.length; j++) {\n groupedRows.push(Object.assign({ col }, groups[j]));\n }\n }\n if (groupedRows.length > 0) {\n const colWidth = self.style.rowGroupColumnWidth;\n const toggleHandleSize = colWidth * 0.5;\n const toggleHandlePadding = (colWidth - toggleHandleSize) * 0.5;\n\n for (let i = 0; i < groupedRows.length; i++) {\n const group = groupedRows[i];\n const { col, collapsed } = group;\n\n const leftX = -mx + col * colWidth;\n const centerX = leftX + colWidth * 0.5;\n const rightX = leftX + colWidth - toggleHandlePadding;\n const topmostY =\n columnHeaderCellHeight - toggleHandleSize - toggleHandlePadding;\n\n const drawGroupHandleAtY = (y) =>\n drawGroupHandle(\n leftX + toggleHandlePadding,\n y,\n toggleHandleSize,\n group.collapsed,\n );\n const pushToVisibleGroups = (topY, bottomY) =>\n self.visibleGroups.push({\n type: 'r',\n collapsed,\n from: group.from,\n to: group.to,\n col,\n x: leftX + mx,\n y: topY + my,\n x2: rightX + mx,\n y2: bottomY + my,\n });\n\n //#region check the relationship between this group and frozen columns\n const crossTheFrozen =\n group.from < self.frozenRow && group.to >= self.frozenRow;\n const notInFrozen = group.from >= self.frozenRow;\n //#endregion\n\n if (collapsed) {\n let topY = topmostY + toggleHandleSize;\n // This group is not sticking on the first column\n if (group.from > 0) {\n let rowIndex = group.to + 1;\n let row = rowGroupsRectInfo[rowIndex];\n if (!row) {\n rowIndex = group.from - 1;\n row = rowGroupsRectInfo[rowIndex];\n if (!row) continue; // don't draw this group indicator because it is invisible\n topY = row.y + row.h - toggleHandleSize * 0.5;\n } else {\n topY = row.y;\n }\n if (rowIndex >= self.frozenRow) {\n const compare =\n frozenRowsHeight +\n columnHeaderCellHeight -\n toggleHandlePadding;\n // don't draw this group indicator because it is hidden by frozen columns\n if (topY < compare) continue;\n }\n }\n const bottomY = topY + toggleHandleSize;\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n drawGroupHandleAtY(topY);\n ctx.restore();\n pushToVisibleGroups(topY, bottomY);\n } // end of collapsed group\n\n /** @type {number} pointer for loop */\n let ptr;\n let top = rowGroupsRectInfo[group.from];\n let bottom = rowGroupsRectInfo[group.to];\n\n let containsBegining = true;\n let containsEnd = true;\n ptr = group.from;\n while (!top && ptr < group.to) {\n top = rowGroupsRectInfo[++ptr];\n containsBegining = false;\n }\n ptr = group.to;\n while (!bottom && ptr > group.from) {\n bottom = rowGroupsRectInfo[--ptr];\n containsEnd = false;\n }\n if (!top || !bottom) continue;\n let bottomY = bottom.y + bottom.h;\n let topY = top.y;\n if (crossTheFrozen) {\n const bottomCompare = rowGroupsRectInfo[self.frozenRow - 1];\n if (bottomCompare) {\n let compareY = bottomCompare.y + bottomCompare.h;\n if (!onTheTop) compareY += toggleHandleSize;\n if (compareY >= bottomY) {\n bottom = bottomCompare;\n bottomY = bottom.y + bottom.h;\n containsEnd = false;\n }\n }\n }\n\n let minTopY =\n columnHeaderCellHeight + (notInFrozen ? frozenRowsHeight : 0);\n if (bottomY + (onTheTop ? 0 : toggleHandleSize) < minTopY) continue;\n\n bottomY -= toggleHandlePadding;\n topY += toggleHandlePadding;\n\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n const lineCoords = [];\n\n if (onTheTop) {\n // avoid lines from two groups be overlapping\n minTopY += toggleHandlePadding * 2;\n if (topY < minTopY) topY = minTopY;\n if (group.from === 0) topY -= toggleHandlePadding * 2;\n if (bottomY >= topY) {\n lineCoords.push(centerX, topY, centerX, bottomY);\n if (containsEnd) lineCoords.push(rightX, bottomY);\n } else {\n bottomY = topY;\n }\n\n topY -= toggleHandleSize;\n drawGroupHandleAtY(topY);\n\n // add more clickable area into `visibleGroups`\n bottomY += toggleHandlePadding - 1;\n } else {\n // handle on the bottom\n if (topY < minTopY) topY = minTopY;\n if (group.from === 0) topY -= toggleHandlePadding * 2;\n if (containsEnd) {\n if (group.to === self.frozenRow - 1) {\n bottomY -= toggleHandleSize;\n } else {\n // bottomY += toggleHandlePadding * 2;\n }\n drawGroupHandleAtY(bottomY);\n }\n if (topY > bottomY) {\n topY = bottomY;\n } else {\n if (group.from === 0) {\n containsBegining = true;\n topY = topmostY + toggleHandleSize;\n }\n if (containsBegining) lineCoords.push(rightX, topY);\n lineCoords.push(centerX, topY, centerX, bottomY);\n // add more clickable area into `visibleGroups`\n topY -= toggleHandlePadding + 1;\n }\n // add more clickable area into `visibleGroups`\n if (containsEnd) bottomY += toggleHandleSize;\n }\n drawLines(lineCoords);\n ctx.restore();\n pushToVisibleGroups(topY, bottomY);\n }\n }\n //#endregion Rows Grouping\n }\n function drawFrozenRows() {\n var rowOrderIndex,\n ln = Math.min(viewData.length, self.frozenRow);\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n y = columnHeaderCellHeight;\n for (rowIndex = 0; rowIndex < ln; rowIndex += 1) {\n rowOrderIndex = self.orders.rows[rowIndex];\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.allowFreezingRows) {\n // HACK great, another stupid magic number.\n // Background will appear as a 0.5px artifact behind the row freeze bar without this hack\n if (y > columnHeaderCellHeight) y += self.style.frozenMarkerWidth;\n y += self.style.frozenMarkerBorderWidth - 0.4999999999;\n }\n self.lastFrozenRowPixel = y;\n }\n function drawRows() {\n self.ctx.save();\n if (self.frozenRow > 0) {\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n var columnOrderIndex,\n rowOrderIndex,\n headerIndex,\n g = schema.length;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n if (!self.attributes.snapToRow) {\n y +=\n -self.scrollBox.scrollTop +\n self.scrollPixelTop +\n self.style.cellBorderWidth;\n }\n for (\n rowIndex = self.frozenRow + self.scrollIndexTop;\n rowIndex < l;\n rowIndex += 1\n ) {\n rowOrderIndex = self.orders.rows[rowIndex];\n self.scrollIndexBottom = rowIndex;\n self.scrollPixelBottom = y;\n if (\n self.cellTree.rows.length > 0 &&\n Object.keys(self.cellTree.rows[rowOrderIndex]).length > 0 &&\n self.cellTree.rows[rowOrderIndex].hide\n )\n continue;\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.showNewRow) {\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n rowHeight = cellHeight = self.style.cellHeight;\n rowOpen = false;\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n if (!isColumnCollapsedByGroup(columnOrderIndex)) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(self.newRow, viewData.length, viewData.length)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n }\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n rowHeaders.push([\n self.newRow,\n viewData.length,\n viewData.length,\n y,\n rowHeight,\n ]);\n }\n self.ctx.restore();\n }\n function drawMoveMarkers() {\n if (!self.movingSelection) {\n return;\n }\n self.ctx.lineWidth = self.style.moveOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.moveOverlayBorderColor;\n self.ctx.setLineDash(self.style.moveOverlayBorderSegments);\n moveBorders.forEach(function (c) {\n addBorderLine(c[0], c[1]);\n });\n self.ctx.setLineDash([]);\n }\n function drawReorderMarkers() {\n if (!self.reorderObject) {\n return;\n }\n var b = {\n height: self.reorderObject.height,\n width: self.reorderObject.width,\n x: self.reorderObject.x + self.reorderObject.dragOffset.x,\n y: self.reorderObject.y + self.reorderObject.dragOffset.y,\n },\n m = {\n width: w,\n height: h,\n x: 0,\n y: 0,\n };\n self.ctx.fillStyle = self.style.reorderMarkerBackgroundColor;\n self.ctx.lineWidth = self.style.reorderMarkerBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerBorderColor;\n if (self.dragMode === 'row-reorder') {\n for (var k = 0; k < self.selections.length; k++) {\n if (!self.selections[k] || k == self.reorderObject.rowIndex) continue;\n b.height += self.getRowHeight(k);\n }\n b.width = w;\n b.x = 0;\n m.width = w;\n m.height = self.currentCell.height;\n m.y = self.currentCell.y;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n self.selectedRows.indexOf(self.reorderTarget.sortRowIndex) === -1 &&\n self.currentCell.rowIndex !== self.reorderObject.rowIndex &&\n self.currentCell.rowIndex > -1 &&\n self.currentCell.rowIndex < l\n ) {\n addBorderLine(\n m,\n self.reorderTarget.sortRowIndex > self.reorderObject.sortRowIndex\n ? 'b'\n : 't',\n );\n }\n } else if (self.dragMode === 'column-reorder' && self.reorderObject) {\n var selectedColumns = self.selections[0];\n if (selectedColumns) {\n for (var k = 1; k < selectedColumns.length; k++) {\n b.width += self.getColumnWidth(\n self.orders.columns[selectedColumns[k]],\n );\n }\n }\n b.height = h;\n b.y = 0;\n m.height = h;\n m.width = self.currentCell.width;\n m.y = 0;\n m.x = self.currentCell.x;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n self.selectedColumns.indexOf(self.reorderTarget.sortColumnIndex) ===\n -1 &&\n self.currentCell.sortColumnIndex !==\n self.reorderObject.sortColumnIndex &&\n self.reorderTarget.columnIndex !== self.reorderObject.columnIndex &&\n self.currentCell.sortColumnIndex > -1 &&\n self.currentCell.sortColumnIndex < schema.length\n ) {\n addBorderLine(\n m,\n self.reorderTarget.columnIndex > self.reorderObject.columnIndex\n ? 'r'\n : 'l',\n );\n }\n }\n }\n function drawBorder() {\n self.ctx.lineWidth = self.style.gridBorderWidth;\n self.ctx.strokeStyle = self.style.gridBorderColor;\n strokeRect(0, 0, self.width, self.height);\n }\n function drawSelectionBorders() {\n self.ctx.lineWidth = self.style.selectionOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.selectionOverlayBorderColor;\n function dsb(c) {\n addBorderLine(c[0], c[1]);\n }\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.save();\n clipFrozenArea(0);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(1);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(2);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n }\n function drawSelectionHandles() {\n if (self.mobile || self.attributes.allowMovingSelection) {\n self.ctx.lineWidth = self.style.selectionHandleBorderWidth;\n self.ctx.strokeStyle = self.style.selectionHandleBorderColor;\n self.ctx.fillStyle = self.style.selectionHandleColor;\n selectionHandles.forEach(function (c) {\n addselectionHandle(c[0], c[1]);\n var az = self.attributes.touchSelectHandleZone / 2,\n ax =\n c[0].x + (c[1] === 'tl' || c[1] === 'bl' ? 0 : c[0].width) - az,\n ay =\n c[0].y + (c[1] === 'bl' || c[1] === 'br' ? c[0].height : 0) - az;\n self.visibleCells.unshift({\n x: ax,\n y: ay,\n height: self.style.selectionHandleSize + az,\n width: self.style.selectionHandleSize + az,\n style: 'selection-handle-' + c[1],\n });\n });\n }\n }\n function drawActiveCell() {\n if (!aCell) {\n return;\n }\n self.ctx.save();\n var cl =\n self.activeCell.columnIndex + 1 > self.frozenColumn ||\n self.activeCell.rowIndex + 1 > self.frozenRow,\n acx = cl ? self.lastFrozenColumnPixel : 0,\n acy = cl ? self.lastFrozenRowPixel : 0,\n acw = cl ? self.width - self.lastFrozenColumnPixel : self.width,\n ach = cl ? self.height - self.lastFrozenRowPixel : self.height;\n radiusRect(acx, acy, acw, ach, 0);\n self.ctx.clip();\n if (self.attributes.selectionMode === 'row') {\n if (self.activeCell && self.activeCell.rowIndex === aCell.rowIndex) {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(\n 1,\n aCell.y,\n self.getHeaderWidth() + rowHeaderCellWidth,\n self.visibleRowHeights[aCell.rowIndex],\n );\n }\n } else {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(aCell.x, aCell.y, aCell.width, aCell.height);\n }\n self.ctx.restore();\n }\n function drawFrozenMarkers() {\n var my = self.lastFrozenRowPixel - self.style.frozenMarkerWidth,\n mx = self.lastFrozenColumnPixel - self.style.frozenMarkerWidth,\n xHover =\n self.currentCell && self.currentCell.style === 'frozen-row-marker',\n yHover =\n self.currentCell && self.currentCell.style === 'frozen-column-marker';\n let rowHeaderCellWidth = self.getRowHeaderCellWidth();\n self.ctx.lineWidth = self.style.frozenMarkerBorderWidth;\n if (self.attributes.allowFreezingColumns) {\n if (\n !self.freezeMarkerPosition ||\n (self.freezeMarkerPosition && self.dragMode === 'frozen-row-marker')\n ) {\n if (mx > self.style.rowHeaderCellWidth) {\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n }\n self.ctx.fillStyle = yHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = yHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerHeaderColor;\n fillRect(\n mx,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n strokeRect(\n mx,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n }\n\n if (\n !self.dragStartObject ||\n (self.dragStartObject &&\n self.dragStartObject.style !== 'rowHeaderCell')\n ) {\n self.visibleCells.unshift({\n x: mx,\n y: 0,\n height: self.height,\n width: self.style.frozenMarkerWidth, // + self.style.frozenMarkerBorderWidth,\n style: 'frozen-column-marker',\n });\n }\n }\n if (self.attributes.allowFreezingRows) {\n if (\n !self.freezeMarkerPosition ||\n (self.freezeMarkerPosition &&\n self.dragMode === 'frozen-column-marker')\n ) {\n if (my > rowHeaderCellWidth) {\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(0, my, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, my, self.width, self.style.frozenMarkerWidth);\n }\n self.ctx.fillStyle = xHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = xHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerHeaderColor;\n fillRect(0, my, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n strokeRect(0, my, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n }\n var height =\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth;\n if (\n !self.dragStartObject ||\n (self.dragStartObject &&\n self.dragStartObject.style !== 'columnHeaderCell')\n ) {\n self.visibleCells.unshift({\n x: 0,\n y: my,\n height: height,\n width: self.width,\n style: 'frozen-row-marker',\n });\n }\n rowGroupsFrozenInfo = { y: my, h: height };\n }\n if (self.freezeMarkerPosition) {\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n if (self.dragMode === 'frozen-column-marker') {\n let posX = self.freezeMarkerPosition.x;\n let nearCell = self.getCellAt(posX, 0);\n if (self.freezeMarkerPosition.isGrab) posX = mx;\n if (posX > rowHeaderCellWidth) {\n let x =\n nearCell.x -\n self.style.frozenMarkerWidth -\n self.style.frozenMarkerBorderWidth;\n if (posX > x + nearCell.width / 2) x = x + nearCell.width;\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(x, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(x, 0, self.style.frozenMarkerWidth, self.height);\n self.ctx.fillStyle = self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerHeaderColor;\n fillRect(\n x,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n strokeRect(\n x,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n }\n self.ctx.fillStyle = self.style.frozenMarkerActiveHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n fillRect(\n posX,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n strokeRect(\n posX,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n fillRect(posX, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(posX, 0, self.style.frozenMarkerWidth, self.height);\n } else {\n let posY = self.freezeMarkerPosition.y;\n let nearCell = self.getCellAt(0, posY);\n if (self.freezeMarkerPosition.isGrab) posY = my;\n if (posY > self.style.columnHeaderCellHeight) {\n let y =\n nearCell.y -\n self.style.frozenMarkerWidth -\n self.style.frozenMarkerBorderWidth;\n if (posY > y + nearCell.height / 2) y = y + nearCell.height;\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(0, y, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, y, self.width, self.style.frozenMarkerWidth);\n self.ctx.fillStyle = self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerHeaderColor;\n fillRect(0, y, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n strokeRect(0, y, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n }\n self.ctx.fillStyle = self.style.frozenMarkerActiveHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n fillRect(0, posY, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n strokeRect(0, posY, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n fillRect(0, posY, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, posY, self.width, self.style.frozenMarkerWidth);\n }\n }\n }\n function drawPerfLines() {\n if (!self.attributes.showPerformance) {\n return;\n }\n var pw = 250,\n px =\n self.width -\n pw -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth * 2,\n py = columnHeaderCellHeight,\n ph = 100;\n if (scrollDebugCounters.length === 0) {\n scrollDebugCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (touchPPSCounters.length === 0) {\n touchPPSCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (entityCount.length === 0) {\n entityCount = fillArray(0, perfWindowSize, 1, 0);\n }\n self.ctx.lineWidth = 0.5;\n function dpl(name, perfArr, arrIndex, max, color, useAbs, rowIndex) {\n var v;\n drawPerfLine(pw, ph, px, py, perfArr, arrIndex, max, color, useAbs);\n self.ctx.fillStyle = color;\n fillRect(3 + px, py + 9 + rowIndex * 11, 8, 8);\n self.ctx.fillStyle = self.style.debugPerfChartTextColor;\n v = arrIndex !== undefined ? perfArr[0][arrIndex] : perfArr[0];\n fillText(\n name + ' ' + (isNaN(v) ? 0 : v).toFixed(3),\n 14 + px,\n py + 16 + rowIndex * 11,\n );\n }\n self.ctx.textAlign = 'left';\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n fillRect(px, py, pw, ph);\n [\n [\n 'Scroll Height',\n scrollDebugCounters,\n 0,\n self.scrollBox.scrollHeight,\n self.style.debugScrollHeightColor,\n false,\n ],\n [\n 'Scroll Width',\n scrollDebugCounters,\n 1,\n self.scrollBox.scrollWidth,\n self.style.debugScrollWidthColor,\n false,\n ],\n [\n 'Performance',\n perfCounters,\n undefined,\n 200,\n self.style.debugPerformanceColor,\n false,\n ],\n [\n 'Entities',\n entityCount,\n undefined,\n 1500,\n self.style.debugEntitiesColor,\n false,\n ],\n [\n 'TouchPPSX',\n touchPPSCounters,\n 0,\n 1000,\n self.style.debugTouchPPSXColor,\n true,\n ],\n [\n 'TouchPPSY',\n touchPPSCounters,\n 1,\n 1000,\n self.style.debugTouchPPSYColor,\n true,\n ],\n ].forEach(function (i, index) {\n i.push(index);\n dpl.apply(null, i);\n });\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n entityCount.pop();\n entityCount.unshift(self.visibleCells.length);\n scrollDebugCounters.pop();\n scrollDebugCounters.unshift([\n self.scrollBox.scrollTop,\n self.scrollBox.scrollLeft,\n ]);\n touchPPSCounters.pop();\n touchPPSCounters.unshift([self.yPPS, self.xPPS]);\n }\n function drawDebug() {\n self.ctx.save();\n var d;\n if (self.attributes.showPerformance || self.attributes.debug) {\n if (perfCounters.length === 0) {\n perfCounters = fillArray(0, perfWindowSize, 1, 0);\n }\n perfCounters.pop();\n perfCounters.unshift(performance.now() - p);\n }\n if (!self.attributes.debug) {\n self.ctx.restore();\n return;\n }\n self.ctx.font = self.style.debugFont;\n d = {};\n d.perf = (\n perfCounters.reduce(function (a, b) {\n return a + b;\n }, 0) / Math.min(drawCount, perfCounters.length)\n ).toFixed(1);\n d.perfDelta = perfCounters[0].toFixed(1);\n d.frozenColumnsWidth = getFrozenColumnsWidth();\n d.htmlImages = Object.keys(self.htmlImageCache).length;\n d.reorderObject =\n 'x: ' +\n (self.reorderObject || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderObject || { rowIndex: 0 }).rowIndex;\n d.reorderTarget =\n 'x: ' +\n (self.reorderTarget || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderTarget || { rowIndex: 0 }).rowIndex;\n d.scale = self.scale;\n d.startScale = self.startScale;\n d.scaleDelta = self.scaleDelta;\n d.zoomDeltaStart = self.zoomDeltaStart;\n d.touchLength = self.touchLength;\n d.touches =\n 'y0: ' +\n (self.touchPosition || { y: 0 }).y +\n ' y1: ' +\n (self.touchPosition1 || { y: 0 }).y;\n d.scrollBox = self.scrollBox.toString();\n d.scrollIndex =\n 'x: ' + self.scrollIndexLeft + ', y: ' + self.scrollIndexTop;\n d.scrollPixel =\n 'x: ' + self.scrollPixelLeft + ', y: ' + self.scrollPixelTop;\n d.canvasOffset =\n 'x: ' + self.canvasOffsetLeft + ', y: ' + self.canvasOffsetTop;\n d.touchDelta = 'x: ' + self.touchDelta.x + ', y: ' + self.touchDelta.y;\n d.touchAnimateTo =\n 'x: ' + self.touchAnimateTo.x + ', y: ' + self.touchAnimateTo.y;\n d.scrollAnimation =\n 'x: ' + self.scrollAnimation.x + ', y: ' + self.scrollAnimation.y;\n d.touchPPS = 'x: ' + self.xPPS + ', y: ' + self.yPPS;\n d.touchPPST = 'x: ' + self.xPPST + ', y: ' + self.yPPST;\n d.touchDuration = self.touchDuration;\n d.pointerLockPosition = self.pointerLockPosition\n ? self.pointerLockPosition.x + ', ' + self.pointerLockPosition.y\n : '';\n d.size = 'w: ' + self.width + ', h: ' + self.height;\n d.mouse = 'x: ' + self.mouse.x + ', y: ' + self.mouse.y;\n d.touch = !self.touchStart\n ? ''\n : 'x: ' + self.touchStart.x + ', y: ' + self.touchStart.y;\n d.entities = self.visibleCells.length;\n d.hasFocus = self.hasFocus;\n d.dragMode = self.dragMode;\n if (self.currentCell) {\n d.columnIndex = self.currentCell.columnIndex;\n d.rowIndex = self.currentCell.rowIndex;\n d.sortColumnIndex = self.currentCell.sortColumnIndex;\n d.sortRowIndex = self.currentCell.sortRowIndex;\n d.context = self.currentCell.context;\n d.dragContext = self.currentCell.dragContext;\n d.style = self.currentCell.style;\n d.type = self.currentCell.type;\n }\n self.ctx.textAlign = 'right';\n self.ctx.fillStyle = self.style.debugBackgroundColor;\n fillRect(0, 0, self.width, self.height);\n Object.keys(d).forEach(function (key, index) {\n var m = key + ': ' + d[key],\n lh = 14;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n m,\n w - 20,\n (self.attributes.showPerformance ? 140 : 24) + index * lh,\n );\n });\n self.ctx.restore();\n }\n self.ctx.save();\n initDraw();\n drawBackground();\n initGroupArea();\n drawFrozenRows();\n drawRows();\n drawActiveCell();\n drawHeaders();\n drawFrozenMarkers();\n drawSelectionHandles();\n drawReorderMarkers();\n drawMoveMarkers();\n drawBorder();\n drawSelectionBorders();\n drawScrollBars();\n if (checkScrollHeight) {\n self.resize(true);\n }\n drawGroupArea();\n drawDebug();\n drawPerfLines();\n if (self.dispatchEvent('afterdraw', {})) {\n return;\n }\n self.ctx.restore();\n };\n}\n","module.exports=function(e){var o={};function a(t){if(o[t])return o[t].exports;var r=o[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}return a.m=e,a.c=o,a.d=function(e,o,t){a.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:t})},a.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},a.t=function(e,o){if(1&o&&(e=a(e)),8&o)return e;if(4&o&&\"object\"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,\"default\",{enumerable:!0,value:e}),2&o&&\"string\"!=typeof e)for(var r in e)a.d(t,r,function(o){return e[o]}.bind(null,r));return t},a.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(o,\"a\",o),o},a.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},a.p=\"\",a(a.s=0)}([function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});var t=a(1),r=Object.keys(t.default).reduce((function(e,o){return e.concat(t.default[o])}),[]);o.default=function(e){return-1===r.indexOf(e.key)}},function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});o.default={modifier:[\"Alt\",\"AltGraph\",\"CapsLock\",\"Control\",\"Fn\",\"FnLock\",\"Meta\",\"NumLock\",\"ScrollLock\",\"Shift\",\"Symbol\",\"SymbolLock\"],legacyModifier:[\"Hyper\",\"Super\"],whiteSpace:[\"Enter\",\"Tab\"],navigation:[\"ArrowDown\",\"ArrowLeft\",\"ArrowRight\",\"ArrowUp\",\"End\",\"Home\",\"PageDown\",\"PageUp\"],editing:[\"Backspace\",\"Clear\",\"Copy\",\"CrSel\",\"Cut\",\"Delete\",\"EraseEof\",\"ExSel\",\"Insert\",\"Paste\",\"Redo\",\"Undo\"],ui:[\"Accept\",\"Again\",\"Attn\",\"Cancel\",\"ContextMenu\",\"Escape\",\"Execute\",\"Find\",\"Help\",\"Pause\",\"Play\",\"Props\",\"Select\",\"ZoomIn\",\"ZoomOut\"],device:[\"BrightnessDown\",\"BrightnessUp\",\"Eject\",\"LogOff\",\"Power\",\"PowerOff\",\"PrintScreen\",\"Hibernate\",\"Standby\",\"WakeUp\"],imeCompositionKeys:[\"AllCandidates\",\"Alphanumeric\",\"CodeInput\",\"Compose\",\"Convert\",\"Dead\",\"FinalMode\",\"GroupFirst\",\"GroupLast\",\"GroupNext\",\"GroupPrevious\",\"ModeChange\",\"NextCandidate\",\"NonConvert\",\"PreviousCandidate\",\"Process\",\"SingleCandidate\"],koreanSpecific:[\"HangulMode\",\"HanjaMode\",\"JunjaMode\"],japaneseSpecific:[\"Eisu\",\"Hankaku\",\"Hiragana\",\"HiraganaKatakana\",\"KanaMode\",\"KanjiMode\",\"Katakana\",\"Romaji\",\"Zenkaku\",\"ZenkakuHankaku\"],commonFunction:[\"F1\",\"F2\",\"F3\",\"F4\",\"F5\",\"F6\",\"F7\",\"F8\",\"F9\",\"F10\",\"F11\",\"F12\",\"Soft1\",\"Soft2\",\"Soft3\",\"Soft4\"],multimedia:[\"ChannelDown\",\"ChannelUp\",\"Close\",\"MailForward\",\"MailReply\",\"MailSend\",\"MediaClose\",\"MediaFastForward\",\"MediaPause\",\"MediaPlay\",\"MediaPlayPause\",\"MediaRecord\",\"MediaRewind\",\"MediaStop\",\"MediaTrackNext\",\"MediaTrackPrevious\",\"New\",\"Open\",\"Print\",\"Save\",\"SpellCheck\"],multimediaNumpad:[\"Key11\",\"Key12\"],audio:[\"AudioBalanceLeft\",\"AudioBalanceRight\",\"AudioBassBoostDown\",\"AudioBassBoostToggle\",\"AudioBassBoostUp\",\"AudioFaderFront\",\"AudioFaderRear\",\"AudioSurroundModeNext\",\"AudioTrebleDown\",\"AudioTrebleUp\",\"AudioVolumeDown\",\"AudioVolumeUp\",\"AudioVolumeMute\",\"MicrophoneToggle\",\"MicrophoneVolumeDown\",\"MicrophoneVolumeUp\",\"MicrophoneVolumeMute\"],speech:[\"SpeechCorrectionList\",\"SpeechInputToggle\"],application:[\"LaunchApplication1\",\"LaunchApplication2\",\"LaunchCalendar\",\"LaunchContacts\",\"LaunchMail\",\"LaunchMediaPlayer\",\"LaunchMusicPlayer\",\"LaunchPhone\",\"LaunchScreenSaver\",\"LaunchSpreadsheet\",\"LaunchWebBrowser\",\"LaunchWebCam\",\"LaunchWordProcessor\"],browser:[\"BrowserBack\",\"BrowserFavorites\",\"BrowserForward\",\"BrowserHome\",\"BrowserRefresh\",\"BrowserSearch\",\"BrowserStop\"],mobilePhone:[\"AppSwitch\",\"Call\",\"Camera\",\"CameraFocus\",\"EndCall\",\"GoBack\",\"GoHome\",\"HeadsetHook\",\"LastNumberRedial\",\"Notification\",\"MannerMode\",\"VoiceDial\"],tv:[\"TV\",\"TV3DMode\",\"TVAntennaCable\",\"TVAudioDescription\",\"TVAudioDescriptionMixDown\",\"TVAudioDescriptionMixUp\",\"TVContentsMenu\",\"TVDataService\",\"TVInput\",\"TVInputComponent1\",\"TVInputComponent2\",\"TVInputComposite1\",\"TVInputComposite2\",\"TVInputHDMI1\",\"TVInputHDMI2\",\"TVInputHDMI3\",\"TVInputHDMI4\",\"TVInputVGA1\",\"TVMediaContext\",\"TVNetwork\",\"TVNumberEntry\",\"TVPower\",\"TVRadioService\",\"TVSatellite\",\"TVSatelliteBS\",\"TVSatelliteCS\",\"TVSatelliteToggle\",\"TVTerrestrialAnalog\",\"TVTerrestrialDigital\",\"TVTimer\"],mediaControls:[\"AVRInput\",\"AVRPower\",\"ColorF0Red\",\"ColorF1Green\",\"ColorF2Yellow\",\"ColorF3Blue\",\"ColorF4Grey\",\"ColorF5Brown\",\"ClosedCaptionToggle\",\"Dimmer\",\"DisplaySwap\",\"DVR\",\"Exit\",\"FavoriteClear0\",\"FavoriteClear1\",\"FavoriteClear2\",\"FavoriteClear3\",\"FavoriteRecall0\",\"FavoriteRecall1\",\"FavoriteRecall2\",\"FavoriteRecall3\",\"FavoriteStore0\",\"FavoriteStore1\",\"FavoriteStore2\",\"FavoriteStore3\",\"Guide\",\"GuideNextDay\",\"GuidePreviousDay\",\"Info\",\"InstantReplay\",\"Link\",\"ListProgram\",\"LiveContent\",\"Lock\",\"MediaApps\",\"MediaAudioTrack\",\"MediaLast\",\"MediaSkipBackward\",\"MediaSkipForward\",\"MediaStepBackward\",\"MediaStepForward\",\"MediaTopMenu\",\"NavigateIn\",\"NavigateNext\",\"NavigateOut\",\"NavigatePrevious\",\"NextFavoriteChannel\",\"NextUserProfile\",\"OnDemand\",\"Pairing\",\"PinPDown\",\"PinPMove\",\"PinPToggle\",\"PinPUp\",\"PlaySpeedDown\",\"PlaySpeedReset\",\"PlaySpeedUp\",\"RandomToggle\",\"RcLowBattery\",\"RecordSpeedNext\",\"RfBypass\",\"ScanChannelsToggle\",\"ScreenModeNext\",\"Settings\",\"SplitScreenToggle\",\"STBInput\",\"STBPower\",\"Subtitle\",\"Teletext\",\"VideoModeNext\",\"Wink\",\"ZoomToggle\"]}}]).default;","'use strict';\n\nconst isSupportedHtml = function (pasteValue) {\n // We need to match new lines in the HTML, .* won't match new line characters.\n // `s` regex modifier can't be used with `ecmaVersion === 2017`.\n // As a workaround using [\\s\\S]*. Fix when we upgrade `ecmaVersion`.\n const genericDiv = /(?:^(<meta[^>]*>)?[\\s\\S]*<div[^>]*>)/;\n const genericSpan = /(?:^(<meta[^>]*>)?[\\s\\S]*<span[^>]*>)/;\n const genericTable = /(?:^(<meta[^>]*>)?[\\s\\S]*<table[^>]*>)/; // Matches Google Sheets format clipboard data format too.\n const excelTable = /(?:<!--StartFragment-->[\\s\\S]*<tr[^>]*>)/;\n const excelTableRow = /(?:<!--StartFragment-->[\\s\\S]*<td[^>]*>)/;\n\n return [\n genericDiv,\n genericTable,\n genericSpan,\n excelTable,\n excelTableRow,\n ].some((expression) => expression.test(pasteValue));\n};\n\n// Explanation of nodeType here: https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst IGNORE_NODETYPES = [8, 3]; // '#text' and '#comment'\n\nconst isHtmlTable = function (pasteValue) {\n return /(?:<table[^>]*>)|(?:<tr[^]*>)/.test(pasteValue);\n};\n\nconst sanitizeElementData = function (element) {\n // It is not entirely clear if this check on nodeType is required.\n let elementData = element.nodeType === 1 ? element.innerText : element.data;\n\n return String(elementData).replace(/\\s+/g, ' ').trim();\n};\n\nconst parseHtmlText = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const element = doc.querySelector('div') || doc.querySelector('span');\n const elementData = sanitizeElementData(element);\n\n return elementData\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseHtmlTable = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const trs = doc.querySelectorAll('table tr');\n const rows = [];\n\n for (const tr of trs) {\n const row = [];\n\n for (const childNode of tr.childNodes) {\n if (IGNORE_NODETYPES.includes(childNode.nodeType)) continue;\n\n const col = { value: [] };\n const value = sanitizeElementData(childNode);\n\n if (value) col.value.push({ value });\n\n row.push(col);\n }\n\n rows.push(row);\n }\n\n return rows;\n};\n\nconst parseText = function (data) {\n return data\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseData = function (data, mimeType) {\n if (mimeType === 'text/html' && isHtmlTable(data)) {\n return parseHtmlTable(data);\n } else if (mimeType === 'text/html') {\n return parseHtmlText(data);\n }\n\n // Default data format is string, so split on new line,\n // and then enclose in an array (a row with one cell):\n return parseText(data);\n};\n\nconst htmlSafe = function (value) {\n if (typeof value !== 'string') return value;\n\n return value.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n};\n\nconst createTextString = function (selectedData, isNeat) {\n // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy.\n // If not isNeat we just return a simple string of concatenated values.\n if (!isNeat)\n return selectedData.map((row) => Object.values(row).join('')).join('');\n\n // If isNeat, we can create tab separated mutti-line text.\n return selectedData.map((row) => Object.values(row).join('\\t')).join('\\n');\n};\n\nconst createHTMLString = function (selectedData, isNeat) {\n if (!isNeat) return createTextString(selectedData, isNeat);\n\n // If isNeat, we can create a HTML table with the selected data.\n let htmlString = '<table>';\n htmlString += selectedData\n .map(\n (row) =>\n '<tr>' +\n Object.values(row)\n .map((value) => ['<td>', htmlSafe(value), '</td>'].join(''))\n .join('') +\n '</tr>',\n )\n .join('');\n htmlString += '</table>';\n\n return htmlString;\n};\n\nexport {\n createTextString,\n createHTMLString,\n isSupportedHtml,\n htmlSafe,\n parseData,\n parseHtmlTable,\n parseHtmlText,\n parseText,\n sanitizeElementData,\n};\n","/*jslint browser: true, unparam: true, todo: true, plusplus: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport isPrintableKeyEvent from 'is-printable-key-event';\nimport { isSupportedHtml, parseData } from './util';\n\nexport default function (self) {\n var wheeling;\n self.stopPropagation = function (e) {\n e.stopPropagation();\n };\n /**\n * Adds an event listener to the given event.\n * @memberof canvasDatagrid\n * @name addEventListener\n * @method\n * @param {string} ev The name of the event to subscribe to.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.addEventListener = function (ev, fn) {\n self.events[ev] = self.events[ev] || [];\n self.events[ev].unshift(fn);\n };\n /**\n * Removes the given listener function from the given event. Must be an actual reference to the function that was bound.\n * @memberof canvasDatagrid\n * @name removeEventListener\n * @method\n * @param {string} ev The name of the event to unsubscribe from.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.removeEventListener = function (ev, fn) {\n (self.events[ev] || []).forEach(function removeEachListener(sfn, idx) {\n if (fn === sfn) {\n self.events[ev].splice(idx, 1);\n }\n });\n };\n /**\n * Fires the given event, passing an event object to the event subscribers.\n * @memberof canvasDatagrid\n * @name dispatchEvent\n * @method\n * @param {number} ev The name of the event to dispatch.\n * @param {number} e The event object.\n */\n self.dispatchEvent = function (ev, e) {\n e = ev.type ? ev : e || {};\n ev = ev.type || ev;\n var defaultPrevented;\n function preventDefault() {\n defaultPrevented = true;\n }\n if (!self.events[ev]) {\n return;\n }\n self.events[ev].forEach(function dispatchEachEvent(fn) {\n e.ctx = self.ctx;\n e.preventDefault = preventDefault;\n fn.apply(self.intf, [e]);\n });\n return defaultPrevented;\n };\n self.getRatio = function () {\n return Math.min(\n self.attributes.maxPixelRatio,\n (window.devicePixelRatio || 1) /\n (self.ctx.webkitBackingStorePixelRatio ||\n self.ctx.mozBackingStorePixelRatio ||\n self.ctx.msBackingStorePixelRatio ||\n self.ctx.oBackingStorePixelRatio ||\n self.ctx.backingStorePixelRatio ||\n 1),\n );\n };\n /**\n * @returns {number} dataWidth\n */\n self.refreshScrollCacheX = function () {\n const s = self.getSchema();\n self.scrollCache.x = [];\n\n /** @type {number} it will be used in `reduceSchema` only */\n let frozenWidth = 0;\n\n const collapsedColumnGroups = self.getCollapsedColumnGroups();\n const isColumnCollapsed = (columnIndex) =>\n collapsedColumnGroups.findIndex(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n ) >= 0;\n\n const dataWidth =\n s.reduce(function reduceSchema(accumulator, column, columnIndex) {\n // intentional redefintion of column. This causes scrollCache to be in the correct order\n const schemaIndex = self.orders.columns[columnIndex];\n const columnWidth = self.getColumnWidth(schemaIndex);\n column = s[schemaIndex];\n if (!column.hidden && !isColumnCollapsed(columnIndex))\n accumulator += columnWidth;\n if (columnIndex < self.frozenColumn) {\n self.scrollCache.x[columnIndex] = accumulator;\n frozenWidth = accumulator;\n } else {\n self.scrollCache.x[columnIndex] = Math.max(\n frozenWidth + columnWidth,\n accumulator,\n );\n }\n return accumulator;\n }, 0) || 0;\n return dataWidth;\n };\n self.resize = function (drawAfterResize) {\n if (!self.canvas) {\n return;\n }\n var x,\n v = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-bar',\n },\n n = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-bar',\n },\n vb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-box',\n },\n nb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-box',\n },\n co = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n isCorner: true,\n isScrollBoxCorner: true,\n style: 'scroll-box-corner',\n },\n m = self.style.scrollBarBoxMargin * 2,\n b = self.style.scrollBarBorderWidth * 2,\n d = self.style.scrollBarBoxMargin * 0.5,\n sbw = self.style.scrollBarWidth + self.style.scrollBarBorderWidth * 2,\n ratio = self.getRatio(),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n cellBorder = self.style.cellBorderWidth * bm,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n dataHeight = 0,\n dataWidth = 0,\n dims,\n l = (self.viewData || []).length,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n topGroupAreaHeight = self.getColumnGroupAreaHeight(),\n leftGroupAreaWidth = self.getRowGroupAreaWidth(),\n ch = self.style.cellHeight;\n // sets actual DOM canvas element\n function checkScrollBoxVisibility() {\n self.scrollBox.horizontalBarVisible =\n (self.style.width !== 'auto' &&\n dataWidth > self.scrollBox.width &&\n self.style.overflowX !== 'hidden') ||\n self.style.overflowX === 'scroll';\n self.scrollBox.horizontalBoxVisible = dataWidth > self.scrollBox.width;\n self.scrollBox.verticalBarVisible =\n (self.style.height !== 'auto' &&\n dataHeight > self.scrollBox.height &&\n self.style.overflowY !== 'hidden') ||\n self.style.overflowY === 'scroll';\n self.scrollBox.verticalBoxVisible = dataHeight > self.scrollBox.height;\n }\n function setScrollBoxSize() {\n self.scrollBox.width =\n self.width - rowHeaderCellWidth - leftGroupAreaWidth;\n self.scrollBox.height =\n self.height - columnHeaderCellHeight - topGroupAreaHeight;\n }\n function setCanvasSize() {\n if (self.isChildGrid) {\n return;\n }\n dims = {\n // HACK +1 ? maybe it's a magic cell border? Required to line up properly in auto height mode.\n height:\n columnHeaderCellHeight +\n topGroupAreaHeight +\n dataHeight +\n cellBorder +\n 1,\n width: dataWidth + rowHeaderCellWidth + cellBorder + leftGroupAreaWidth,\n };\n ['width', 'height'].forEach(function (dim) {\n //TODO: support inherit\n if (\n ['auto', undefined].indexOf(self.style[dim]) !== -1 &&\n ['auto', undefined].indexOf(self.appliedInlineStyles[dim]) !== -1\n ) {\n self.parentNodeStyle[dim] = dims[dim] + 'px';\n } else if (\n ['auto', undefined].indexOf(self.style[dim]) == -1 &&\n ['auto', undefined].indexOf(self.appliedInlineStyles[dim]) == -1\n ) {\n self.parentNodeStyle[dim] = self.style[dim];\n if (self.isComponent) {\n self.canvas.style[dim] = self.style[dim];\n }\n }\n });\n }\n dataWidth = self.refreshScrollCacheX();\n self.scrollCache.y = [];\n for (x = 0; x < l; x += 1) {\n self.scrollCache.y[x] = dataHeight;\n dataHeight +=\n ((self.sizes.rows[x] || ch) + (self.sizes.trees[x] || 0)) * self.scale +\n // HACK? if an expanded tree row is frozen it is necessary to add the tree row's height a second time.\n (self.frozenRow > x ? self.sizes.trees[x] || 0 : 0);\n }\n if (l > 1) {\n self.scrollCache.y[x] = dataHeight;\n }\n if (self.attributes.showNewRow) {\n dataHeight += ch;\n }\n if (self.attributes.snapToRow) {\n dataHeight += self.style.cellHeight;\n }\n setCanvasSize();\n if (self.isChildGrid) {\n self.width = self.parentNode.offsetWidth;\n self.height = self.parentNode.offsetHeight;\n } else if (\n self.height !== self.canvas.offsetHeight ||\n self.width !== self.canvas.offsetWidth\n ) {\n self.height = self.canvas.offsetHeight;\n self.width = self.canvas.offsetWidth;\n self.canvasOffsetLeft = self.args.canvasOffsetLeft || 0;\n self.canvasOffsetTop = self.args.canvasOffsetTop || 0;\n }\n /// calculate scroll bar dimensions\n // non-controversial\n self.scrollBox.top =\n columnHeaderCellHeight + topGroupAreaHeight + columnHeaderCellBorder;\n self.scrollBox.left = rowHeaderCellWidth + leftGroupAreaWidth;\n // width and height of scroll box\n setScrollBoxSize();\n // is the data larger than the scroll box\n checkScrollBoxVisibility();\n // if the scroll box is visible, make room for it by expanding the size of the element\n // if the other dimension is set to auto\n if (self.scrollBox.horizontalBarVisible) {\n if (self.style.height === 'auto' && !self.isChildGrid) {\n self.height += sbw;\n }\n dataHeight += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n if (self.scrollBox.verticalBarVisible) {\n if (self.style.width === 'auto' && !self.isChildGrid) {\n self.width += sbw;\n }\n dataWidth += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n // set again after bar visibility checks\n setScrollBoxSize();\n self.scrollBox.scrollWidth = dataWidth - self.scrollBox.width;\n self.scrollBox.scrollHeight = dataHeight - self.scrollBox.height;\n if (self.frozenColumn > 0) {\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /\n dataWidth;\n } else {\n self.scrollBox.widthBoxRatio = self.scrollBox.width / dataWidth;\n }\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n // TODO: This heightBoxRatio number is terribly wrong.\n // They should be a result of the size of the grid/canvas?\n // it being off causes the scroll bar to \"slide\" under\n // the dragged mouse.\n // https://github.com/TonyGermaneri/canvas-datagrid/issues/97\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n topGroupAreaHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n // horizontal\n n.x += rowHeaderCellWidth;\n n.y += self.height - self.style.scrollBarWidth - d - topGroupAreaHeight;\n n.width =\n self.width -\n self.style.scrollBarWidth -\n rowHeaderCellWidth -\n leftGroupAreaWidth -\n d -\n m;\n n.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n // horizontal box\n nb.y = n.y + self.style.scrollBarBoxMargin;\n nb.width = self.scrollBox.scrollBoxWidth;\n nb.height = self.style.scrollBarBoxWidth;\n // vertical\n v.x +=\n self.width -\n leftGroupAreaWidth -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth -\n d;\n v.y += columnHeaderCellHeight + self.scrollCache.y[self.frozenRow];\n v.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n v.height =\n self.height -\n columnHeaderCellHeight -\n topGroupAreaHeight -\n self.style.scrollBarWidth -\n d -\n m;\n // vertical box\n vb.x = v.x + self.style.scrollBarBoxMargin;\n vb.y += self.scrollCache.y[self.frozenRow];\n vb.width = self.style.scrollBarBoxWidth;\n vb.height = self.scrollBox.scrollBoxHeight;\n // corner\n co.x = n.x + n.width + m;\n co.y = v.y + v.height + m;\n co.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n co.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n self.scrollBox.entities = {\n horizontalBar: n,\n horizontalBox: nb,\n verticalBar: v,\n verticalBox: vb,\n corner: co,\n };\n self.scrollBox.bar = {\n v: v,\n h: n,\n };\n self.scrollBox.box = {\n v: vb,\n h: nb,\n };\n /// calculate page and dom elements\n self.page = Math.max(\n 1,\n self.visibleRows.length - 3 - self.attributes.pageUpDownOverlap,\n );\n // set canvas drawing related items\n if (!self.isChildGrid) {\n const newWidth = self.width * ratio;\n const newHeight = self.height * ratio;\n // We need to check is settings size to canvas necessary,\n // because settings the canvas'size will cause the canvas and its state be cleared\n // even if the size is the same.\n // Notes: Please don't call `self.resize()` without a subsequent call to `self.draw()`\n if (self.canvas.width !== newWidth || self.canvas.height !== newHeight) {\n self.canvas.width = newWidth;\n self.canvas.height = newHeight;\n self.ctx.scale(ratio, ratio);\n }\n }\n // resize any open dom elements (input/textarea)\n self.resizeEditInput();\n self.scroll(true);\n if (drawAfterResize) {\n self.draw(true);\n }\n self.dispatchEvent('resize', {});\n return true;\n };\n self.scroll = function (dontDraw) {\n var s = self.getSchema(),\n l = (self.viewData || []).length,\n ch = self.style.cellHeight;\n // go too far in leaps, then get focused\n self.scrollIndexTop = Math.floor(\n l * (self.scrollBox.scrollTop / self.scrollBox.scrollHeight) - 100,\n );\n self.scrollIndexTop = Math.max(self.scrollIndexTop, 0);\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n // sometimes the grid is rendered but the height is zero\n if (self.scrollBox.scrollHeight === 0) {\n self.scrollIndexTop = 0;\n }\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = self.frozenColumn;\n self.scrollPixelLeft = 0;\n while (\n self.scrollPixelTop < self.scrollBox.scrollTop &&\n self.scrollIndexTop < self.viewData.length\n ) {\n // start on index +1 since index 0 was used in \"go too far\" section above\n self.scrollIndexTop += 1;\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n }\n while (\n self.scrollPixelLeft < self.scrollBox.scrollLeft + 1 &&\n self.scrollIndexLeft < s.length\n ) {\n self.scrollPixelLeft = self.scrollCache.x[self.scrollIndexLeft];\n self.scrollIndexLeft += 1;\n }\n if (s.length > 0) {\n self.scrollIndexLeft = Math.max(self.scrollIndexLeft - 1, 0);\n self.scrollPixelLeft -= self.getColumnWidth(\n self.orders.columns[self.scrollIndexLeft],\n );\n }\n if ((self.viewData || []).length > 0) {\n self.scrollIndexTop = Math.max(self.scrollIndexTop - 1, 0);\n self.scrollPixelTop = Math.max(\n self.scrollPixelTop -\n (self.viewData[self.scrollIndexTop]\n ? (self.sizes.rows[self.scrollIndexTop] || ch) +\n (self.sizes.trees[self.scrollIndexTop] || 0)\n : ch) *\n self.scale,\n 0,\n );\n }\n self.ellipsisCache = {};\n if (!dontDraw) {\n self.draw(true);\n }\n //TODO: figure out why this has to be delayed for child grids\n //BUG: wheeling event on 3rd level hierarchy fails to move input box\n requestAnimationFrame(self.resizeEditInput);\n self.dispatchEvent('scroll', {\n top: self.scrollBox.scrollTop,\n left: self.scrollBox.scrollLeft,\n });\n };\n self.mousemove = function (e, overridePos) {\n if (self.contextMenu || self.input) {\n return;\n }\n\n // Cancel dragging action if user ventures outside grid\n if (self.draggingItem && e.which === 0) {\n self.stopFreezeMove(e);\n self.mouseup(e);\n return;\n }\n\n self.mouse = overridePos || self.getLayerPos(e);\n var ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n i,\n s = self.getSchema(),\n dragBounds,\n sBounds,\n x = self.mouse.x,\n y = self.mouse.y,\n cell = self.getCellAt(x, y),\n delta,\n ev = { NativeEvent: e, cell: cell, x: x, y: y },\n previousCell = self.currentCell;\n clearTimeout(self.scrollTimer);\n if (!self.isInGrid({ x: x, y: y })) {\n self.hasFocus = false;\n }\n if (self.dispatchEvent('mousemove', ev)) {\n return;\n }\n if (cell && self.currentCell) {\n self.rowBoundaryCrossed = self.currentCell.rowIndex !== cell.rowIndex;\n self.columnBoundaryCrossed =\n self.currentCell.columnIndex !== cell.columnIndex;\n self.cellBoundaryCrossed =\n self.rowBoundaryCrossed || self.columnBoundaryCrossed;\n ['row', 'column', 'cell'].forEach(function (prefix) {\n if (self[prefix + 'BoundaryCrossed']) {\n ev.cell = previousCell;\n self.dispatchEvent(prefix + 'mouseout', ev);\n ev.cell = cell;\n self.dispatchEvent(prefix + 'mouseover', ev);\n }\n });\n }\n self.currentCell = cell;\n\n if (\n !self.draggingItem && // It is not in dragging mode (avoid changing hovers frequent)\n cell &&\n (cell.context === 'cell' || cell.context === self.cursorGrab)\n ) {\n const indicator = self.getUnhideIndicator(self.mouse.x, self.mouse.y);\n if (indicator) {\n self.cursor = 'pointer';\n self.hovers = { unhideIndicator: indicator };\n self.draw();\n return;\n }\n }\n\n self.hovers = {};\n if (!self.draggingItem && cell) {\n self.dragItem = cell;\n self.dragMode = cell.dragContext;\n self.cursor = cell.context;\n if (cell.context === 'cell') {\n self.cursor = 'default';\n self.hovers = {\n rowIndex: cell.rowIndex,\n columnIndex: cell.columnIndex,\n onFilterButton: false,\n onCellTreeIcon: false,\n };\n if (\n cell.isFilterable &&\n x >\n cell.x +\n cell.width +\n self.canvasOffsetLeft -\n self.style.filterButtonWidth &&\n x < cell.x + cell.width + self.canvasOffsetLeft &&\n y >\n cell.y +\n cell.height +\n self.canvasOffsetTop -\n self.style.filterButtonHeight &&\n y < cell.y + cell.height + self.canvasOffsetTop\n ) {\n self.hovers.onFilterButton = true;\n self.draw();\n }\n if (cell.isRowTree || cell.isColumnTree) {\n const pc = cell.isRowTree\n ? self.cellTree.rows[cell.rowIndex].parentCount\n : 0;\n const rc = self.style.cellTreeIconWidth * self.scale,\n rx =\n cell.x +\n cell.paddingLeft +\n self.canvasOffsetLeft +\n self.style.cellTreeIconMarginLeft +\n pc * (rc + cell.paddingLeft),\n ry =\n cell.y +\n self.canvasOffsetTop +\n self.style.cellTreeIconMarginTop * self.scale;\n if (x >= rx && x <= rx + rc && y >= ry && y < ry + rc) {\n self.hovers.onCellTreeIcon = true;\n self.draw();\n }\n }\n }\n if (self.selecting || self.reorderObject) {\n delta = {\n x: Math.abs(self.dragStart.x - x),\n y: Math.abs(self.dragStart.y - y),\n };\n if (self.dragStartObject.columnIndex !== -1 && e.shiftKey) {\n self.dragStartObject = {\n rowIndex: self.activeCell.rowIndex,\n columnIndex: self.activeCell.columnIndex,\n };\n }\n dragBounds = {\n top: Math.min(self.dragStartObject.rowIndex, cell.rowIndex),\n left: Math.min(self.dragStartObject.columnIndex, cell.columnIndex),\n bottom: Math.max(self.dragStartObject.rowIndex, cell.rowIndex),\n right: Math.max(self.dragStartObject.columnIndex, cell.columnIndex),\n };\n if (self.dragStartObject.columnIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left = -1;\n dragBounds.right = s.length - 1;\n dragBounds.top = Math.min(sBounds.top, cell.rowIndex);\n dragBounds.bottom = Math.max(sBounds.bottom, cell.rowIndex);\n if (dragBounds.top < 0) dragBounds.top = 0;\n }\n\n if (self.dragStartObject.rowIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left =\n cell.columnIndex === undefined\n ? sBounds.left\n : Math.min(sBounds.left, cell.columnIndex);\n dragBounds.right =\n cell.columnIndex === undefined\n ? sBounds.right\n : Math.max(sBounds.right, cell.columnIndex);\n dragBounds.top = -1;\n dragBounds.bottom = self.viewData.length - 1;\n if (dragBounds.left < 0) dragBounds.left = 0;\n if (dragBounds.left != dragBounds.right)\n self.isMultiColumnsSelected = true;\n else self.isMultiRowsSelected = false;\n }\n\n if (\n self.dragStartObject.rowIndex !== cell.rowIndex ||\n self.dragStartObject.columnIndex !== cell.columnIndex\n ) {\n self.ignoreNextClick = true;\n }\n if (\n self.cellBoundaryCrossed ||\n (delta.x === 0 && delta.y === 0) ||\n self.attributes.selectionMode === 'row'\n ) {\n if (\n cell.rowIndex !== undefined &&\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.rowBoundaryCrossed\n ) {\n if (self.dragStartObject.rowIndex < cell.rowIndex) {\n dragBounds.top = self.dragStartObject.rowIndex;\n dragBounds.bottom = cell.rowIndex;\n } else {\n dragBounds.top = cell.rowIndex;\n dragBounds.bottom = self.dragStartObject.rowIndex;\n }\n } else if (\n cell.rowIndex !== undefined &&\n (self.attributes.selectionMode === 'column' ||\n self.dragStartObject.rowIndex === -1) &&\n self.columnBoundaryCrossed\n ) {\n if (self.dragStartObject.columnIndex < cell.columnIndex) {\n dragBounds.left = self.dragStartObject.columnIndex;\n dragBounds.right = cell.columnIndex;\n } else {\n dragBounds.left = cell.columnIndex;\n dragBounds.right = self.dragStartObject.columnIndex;\n }\n } else if (self.attributes.selectionMode !== 'row') {\n if (cell.hovered && self.hovers.onFilterButton) {\n if (cell.openedFilter) {\n cell.openedFilter = false;\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n } else {\n self.selectedFilterButton.rowIndex = cell.rowIndex;\n self.selectedFilterButton.columnIndex = cell.columnIndex;\n self.contextmenuEvent(e, {\n x: cell.x + cell.width - self.style.filterButtonWidth,\n y: cell.y + cell.height,\n rect: { left: 0, top: 0 },\n });\n }\n self.draw();\n return;\n } else if (\n cell.hovered &&\n self.hovers.onCellTreeIcon &&\n e.type == 'mousedown'\n ) {\n self.toggleCollapseTree(cell.rowIndex, cell.columnIndex);\n return;\n } else {\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n if (self.hovers.onFilterButton) return;\n if (self.hovers.onCellTreeIcon) return;\n if (!self.dragAddToSelection && cell.rowIndex !== undefined) {\n if (\n self.selections[cell.rowIndex] &&\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) !==\n -1\n ) {\n self.selections[cell.rowIndex].splice(\n self.selections[cell.rowIndex].indexOf(cell.columnIndex),\n 1,\n );\n }\n } else {\n self.selections[cell.rowIndex] =\n self.selections[cell.rowIndex] || [];\n if (\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) ===\n -1\n ) {\n self.selections[cell.rowIndex].push(cell.columnIndex);\n var event = {\n selections: self.selections,\n selectedData: self.getSelectedData(),\n selectedCells: self.getSelectedCells(),\n selectionBounds: self.getSelectionBounds(),\n };\n self.dispatchEvent('selectionchanged', event);\n }\n }\n }\n }\n }\n if (\n (!self.selectionBounds ||\n dragBounds.top !== self.selectionBounds.top ||\n dragBounds.left !== self.selectionBounds.left ||\n dragBounds.bottom !== self.selectionBounds.bottom ||\n dragBounds.right !== self.selectionBounds.right) &&\n !ctrl\n ) {\n if (!(cell.hovered && self.hovers.onFilterButton)) {\n self.selections = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n }\n if (dragBounds.top === -1) {\n dragBounds.top = 0;\n }\n sBounds = dragBounds;\n if (self.attributes.selectionMode === 'row') {\n for (i = sBounds.top; i <= sBounds.bottom; i += 1) {\n self.selectRow(i, true, null, true);\n }\n } else {\n self.selectArea(sBounds, true);\n self.activeCell.rowIndex = sBounds.top;\n self.activeCell.columnIndex = sBounds.left;\n if (sBounds.left == -1 && sBounds.top !== sBounds.bottom) {\n self.activeCell.columnIndex = 0;\n self.isMultiRowsSelected = true;\n self.isMultiColumnsSelected = false;\n }\n }\n }\n\n if (self.attributes.autoScrollOnMousemove) {\n var movedVertically = delta.y > self.attributes.autoScrollMargin;\n var movedHorizontally = delta.x > self.attributes.autoScrollMargin;\n\n if (movedVertically && !movedHorizontally)\n self.autoScrollZone(e, -1, y, ctrl);\n else if (movedHorizontally && !movedVertically)\n self.autoScrollZone(e, x, -1, ctrl);\n else if (movedHorizontally && movedVertically)\n self.autoScrollZone(e, x, y, ctrl);\n } else {\n self.autoScrollZone(e, x, y, ctrl);\n }\n }\n }\n const columnGroup = self.getColumnGroupAt(self.mouse.x, self.mouse.y);\n if (columnGroup) self.cursor = 'pointer';\n\n const rowGroup = self.getRowGroupAt(self.mouse.x, self.mouse.y);\n if (rowGroup) self.cursor = 'pointer';\n\n self.cellBoundaryCrossed = false;\n self.rowBoundaryCrossed = false;\n self.columnBoundaryCrossed = false;\n self.draw(true);\n };\n self.click = function (e, overridePos) {\n var i,\n startingBounds = JSON.stringify(self.getSelectionBounds()),\n ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n pos = overridePos || self.getLayerPos(e);\n self.currentCell = self.getCellAt(pos.x, pos.y);\n if (self.currentCell.grid !== undefined) {\n return;\n }\n function checkSelectionChange() {\n var ev,\n sb = self.getSelectionBounds();\n\n if (startingBounds === JSON.stringify(sb)) {\n return;\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n }\n if (self.input) {\n self.endEdit();\n }\n if (self.ignoreNextClick) {\n self.ignoreNextClick = false;\n return;\n }\n i = self.currentCell;\n if (\n self.dispatchEvent('click', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n\n const unhideIndicator = self.getUnhideIndicator(pos.x, pos.y);\n if (unhideIndicator) {\n const { dir, orderIndex0, orderIndex1 } = unhideIndicator;\n if (dir === 'l' || dir === 'r')\n self.unhideColumns(orderIndex0, orderIndex1);\n else self.unhideRows(orderIndex0, orderIndex1);\n return;\n }\n\n let group = self.getColumnGroupAt(pos.x, pos.y);\n if (!group) group = self.getRowGroupAt(pos.x, pos.y);\n if (group) {\n if (self.toggleGroup(group)) {\n self.setStorageData();\n self.refresh();\n return;\n }\n }\n\n if (!self.hasFocus) {\n return;\n }\n\n const leftOffset = self.getRowGroupAreaWidth();\n const topOffset = self.getColumnGroupAreaHeight();\n const xInGrid = pos.x - leftOffset;\n const yInGrid = pos.y - topOffset;\n if (\n ['rowHeaderCell', 'columnHeaderCell'].indexOf(self.currentCell.style) ===\n -1 &&\n !ctrl\n ) {\n if (!self.hovers.onFilterButton) {\n self.setActiveCell(i.columnIndex, i.rowIndex);\n }\n }\n if (self.currentCell.context === 'cell') {\n if (self.currentCell.style === 'cornerCell') {\n self.selectAll();\n self.draw();\n checkSelectionChange();\n return;\n }\n if (self.currentCell.style === 'columnHeaderCell') {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === i.header.name) {\n self.orderDirection =\n self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(i.header.name, self.orderDirection);\n checkSelectionChange();\n return;\n }\n }\n self.selections[i.rowIndex] = self.selections[i.rowIndex] || [];\n if (\n self.attributes.selectionMode === 'row' ||\n self.currentCell.style === 'rowHeaderCell'\n ) {\n if (\n self.currentCell.style === 'rowHeaderCell' &&\n self.attributes.tree &&\n xInGrid > 0 &&\n xInGrid - self.currentCell.x <\n self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight +\n self.style.treeArrowClickRadius &&\n yInGrid - self.currentCell.y <\n self.style.treeArrowHeight +\n self.style.treeArrowMarginTop +\n self.style.treeArrowClickRadius &&\n yInGrid > 0\n ) {\n self.toggleTree(i.rowIndex);\n return;\n }\n }\n if (e.shiftKey && !ctrl) {\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, false);\n }\n }\n checkSelectionChange();\n self.draw(true);\n };\n self.dragResizeColumn = function (e) {\n var pos, x, y;\n pos = self.getLayerPos(e);\n x = self.resizingStartingWidth + pos.x - self.dragStart.x;\n y = self.resizingStartingHeight + pos.y - self.dragStart.y;\n if (x < self.style.minColumnWidth) {\n x = self.style.minColumnWidth;\n }\n if (y < self.style.minRowHeight) {\n y = self.style.minRowHeight;\n }\n if (\n self.dispatchEvent('resizecolumn', {\n x: x,\n y: y,\n draggingItem: self.draggingItem,\n })\n ) {\n return false;\n }\n if (\n self.scrollBox.scrollLeft >\n self.scrollBox.scrollWidth - self.attributes.resizeScrollZone &&\n self.dragMode === 'ew-resize'\n ) {\n self.resize(true);\n }\n if (self.dragMode === 'ew-resize') {\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] = x;\n if (\n ['rowHeaderCell', 'cornerCell'].indexOf(\n self.draggingItem.header.style,\n ) !== -1\n ) {\n self.resize(true);\n }\n self.resizeChildGrids();\n return;\n }\n if (self.dragMode === 'ns-resize') {\n if (self.draggingItem.rowOpen) {\n self.sizes.trees[self.draggingItem.rowIndex] = y;\n } else if (self.attributes.globalRowResize) {\n self.style.cellHeight = y;\n } else {\n self.sizes.rows[self.draggingItem.rowIndex] = y;\n }\n self.dispatchEvent('resizerow', { row: y });\n self.resizeChildGrids();\n return;\n }\n self.ellipsisCache = {};\n };\n self.stopDragResize = function (event) {\n const pos = self.getLayerPos(event);\n\n if (self.dragMode === 'ew-resize') {\n const hasMoved = !!(pos.x - self.dragStart.x);\n // Check that dragItem is selected or part of selection.\n const dragItemIsSelected = self.isColumnSelected(\n self.dragItem.columnIndex,\n );\n\n if (hasMoved && dragItemIsSelected) {\n const width = Math.max(\n self.resizingStartingWidth + pos.x - self.dragStart.x,\n self.style.minColumnWidth,\n );\n // If the column is selected, resize it to width plus any other selected columns.\n self.fitSelectedColumns(width);\n }\n }\n\n self.resize();\n window.removeEventListener('mousemove', self.dragResizeColumn, false);\n window.removeEventListener('mouseup', self.stopDragResize, false);\n self.setStorageData();\n self.draw(true);\n self.ignoreNextClick = true;\n };\n self.scrollGrid = function (e) {\n var pos = self.getLayerPos(e);\n if (\n self.attributes.scrollPointerLock &&\n self.pointerLockPosition &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition.x += e.movementX;\n self.pointerLockPosition.y += e.movementY;\n self.pointerLockPosition.x = Math.min(\n self.width - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.x),\n );\n self.pointerLockPosition.y = Math.min(\n self.height - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.y),\n );\n pos = self.pointerLockPosition;\n }\n self.scrollMode = self.getCellAt(pos.x, pos.y).context;\n if (\n self.scrollMode === 'horizontal-scroll-box' &&\n self.scrollStartMode !== 'horizontal-scroll-box'\n ) {\n self.scrollStartMode = 'horizontal-scroll-box';\n self.dragStart = pos;\n self.scrollStart.left = self.scrollBox.scrollLeft;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollMode === 'vertical-scroll-box' &&\n self.scrollStartMode !== 'vertical-scroll-box'\n ) {\n self.scrollStartMode = 'vertical-scroll-box';\n self.dragStart = pos;\n self.scrollStart.top = self.scrollBox.scrollTop;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollStartMode === 'vertical-scroll-box' &&\n self.scrollMode !== 'vertical-scroll-box'\n ) {\n self.scrollMode = 'vertical-scroll-box';\n }\n if (\n self.scrollStartMode === 'horizontal-scroll-box' &&\n self.scrollMode !== 'horizontal-scroll-box'\n ) {\n self.scrollMode = 'horizontal-scroll-box';\n }\n clearTimeout(self.scrollTimer);\n if (self.scrollModes.indexOf(self.scrollMode) === -1) {\n return;\n }\n if (self.scrollMode === 'vertical-scroll-box') {\n self.scrollBox.scrollTop =\n self.scrollStart.top +\n (pos.y - self.dragStart.y) / self.scrollBox.heightBoxRatio;\n } else if (self.scrollMode === 'vertical-scroll-top') {\n self.scrollBox.scrollTop -= self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'vertical-scroll-bottom') {\n self.scrollBox.scrollTop += self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n if (self.scrollMode === 'horizontal-scroll-box') {\n self.scrollBox.scrollLeft =\n self.scrollStart.left +\n (pos.x - self.dragStart.x) / self.scrollBox.widthBoxRatio;\n } else if (self.scrollMode === 'horizontal-scroll-right') {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'horizontal-scroll-left') {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.stopScrollGrid = function () {\n clearTimeout(self.scrollTimer);\n if (document.exitPointerLock) {\n document.exitPointerLock();\n }\n window.removeEventListener('mousemove', self.scrollGrid, false);\n };\n self.dragReorder = function (e) {\n var pos,\n x,\n y,\n columReorder = self.dragMode === 'column-reorder',\n rowReorder = self.dragMode === 'row-reorder';\n pos = self.getLayerPos(e);\n x = pos.x - self.dragStart.x;\n y = pos.y - self.dragStart.y;\n if (!self.attributes.allowColumnReordering && columReorder) {\n return;\n }\n if (!self.attributes.allowRowReordering && rowReorder) {\n return;\n }\n if ((e.ctrlKey || e.metaKey || e.shiftKey) && self.reorderObject) {\n if (self.dragMode === 'column-reorder' && !self.isMultiColumnsSelected) {\n self.selectColumn(self.draggingItem.header.index, false, false);\n }\n }\n if (\n self.dispatchEvent('reordering', {\n NativeEvent: e,\n source: self.dragStartObject,\n target: self.currentCell,\n dragMode: self.dragMode,\n })\n ) {\n return;\n }\n if (\n Math.abs(x) > self.attributes.reorderDeadZone ||\n Math.abs(y) > self.attributes.reorderDeadZone\n ) {\n self.reorderObject = self.draggingItem;\n if (self.isMultiRowsSelected)\n self.reorderObject = self.getVisibleCellByIndex(\n -1,\n self.activeCell.rowIndex,\n );\n if (self.isMultiColumnsSelected)\n self.reorderObject = self.getVisibleCellByIndex(\n self.activeCell.columnIndex,\n -1,\n );\n if (!self.reorderObject) return;\n self.reorderTarget = self.currentCell;\n self.reorderObject.dragOffset = {\n x: x,\n y: y,\n };\n self.autoScrollZone(\n e,\n columReorder ? pos.x : -1,\n rowReorder ? pos.y : -1,\n false,\n );\n }\n };\n self.stopDragReorder = function (e) {\n var oIndex,\n tIndex,\n odata = [],\n cr = {\n 'row-reorder': self.orders.rows,\n 'column-reorder': self.orders.columns,\n },\n i = {\n 'row-reorder': 'rowIndex',\n 'column-reorder': 'sortColumnIndex',\n }[self.dragMode];\n window.removeEventListener('mousemove', self.dragReorder, false);\n window.removeEventListener('mouseup', self.stopDragReorder, false);\n if (\n self.reorderObject &&\n self.reorderTarget &&\n ((self.dragMode === 'column-reorder' &&\n self.reorderTarget.sortColumnIndex > -1 &&\n self.reorderTarget.sortColumnIndex < self.getSchema().length) ||\n (self.dragMode === 'row-reorder' &&\n self.reorderTarget.rowIndex > -1 &&\n self.reorderTarget.rowIndex < self.viewData.length)) &&\n self.reorderObject[i] !== self.reorderTarget[i] &&\n !self.dispatchEvent('reorder', {\n NativeEvent: e,\n source: self.reorderObject,\n target: self.reorderTarget,\n dragMode: self.dragMode,\n })\n ) {\n self.ignoreNextClick = true;\n oIndex = cr[self.dragMode].indexOf(self.reorderObject[i]);\n tIndex = cr[self.dragMode].indexOf(self.reorderTarget[i]);\n if (self.dragMode === 'column-reorder') {\n var sortColumnIndices = [];\n var selectedColumnIndices = [];\n if (self.selections[0]) {\n oIndex = self.selections[0][0];\n self.selections[0].forEach(function (value) {\n sortColumnIndices.push(self.orders.columns[value]);\n });\n }\n var deleteCount = sortColumnIndices.length;\n if (\n tIndex < oIndex ||\n (tIndex > oIndex && Math.abs(tIndex - oIndex) >= deleteCount)\n ) {\n cr[self.dragMode].splice(oIndex, deleteCount);\n if (tIndex > oIndex) tIndex = tIndex - (deleteCount - 1);\n\n self.selectedColumns = [];\n for (var i = 0; i < sortColumnIndices.length; i++) {\n if (i === 0) self.activeCell.columnIndex = tIndex;\n selectedColumnIndices.push(tIndex + i);\n self.selectedColumns.push(sortColumnIndices[i]);\n cr[self.dragMode].splice(tIndex + i, 0, sortColumnIndices[i]);\n }\n\n self.orders.columns = cr[self.dragMode];\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = selectedColumnIndices;\n });\n }\n } else {\n var selectedRows = [];\n self.selections.forEach(function (row, rowIndex) {\n if (row) {\n selectedRows.push(row);\n odata.push(self.viewData[rowIndex]);\n }\n });\n if (\n tIndex < oIndex ||\n (tIndex > oIndex && Math.abs(tIndex - oIndex) >= odata.length)\n ) {\n self.viewData.splice(oIndex, odata.length);\n self.selections = [];\n self.selectedRows = [];\n if (tIndex > oIndex) tIndex = tIndex - (odata.length - 1);\n self.activeCell.rowIndex = tIndex;\n\n for (var i = 0; i < odata.length; i++) {\n self.viewData.splice(tIndex + i, 0, odata[i]);\n self.selections[tIndex + i] = selectedRows[i];\n self.selectedRows.push(tIndex + i);\n }\n }\n }\n self.resize();\n self.setStorageData();\n }\n self.reorderObject = undefined;\n self.reorderTarget = undefined;\n self.draw(true);\n };\n self.dragMove = function (e) {\n if (\n self.dispatchEvent('moving', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n var pos = self.getLayerPos(e);\n self.moveOffset = {\n x: self.currentCell.columnIndex - self.dragStartObject.columnIndex,\n y: self.currentCell.rowIndex - self.dragStartObject.rowIndex,\n };\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopDragMove = function (e) {\n window.removeEventListener('mousemove', self.dragMove, false);\n window.removeEventListener('mouseup', self.stopDragMove, false);\n var b = self.getSelectionBounds();\n if (\n self.dispatchEvent('endmove', { NativeEvent: e, cell: self.currentCell })\n ) {\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n return;\n }\n if (self.moveOffset) {\n self.moveTo(\n self.movingSelection,\n b.left + self.moveOffset.x,\n b.top + self.moveOffset.y,\n );\n self.moveSelection(self.moveOffset.x, self.moveOffset.y);\n }\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n };\n self.freezeMove = function (e) {\n if (\n self.dispatchEvent('freezemoving', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n var pos = self.getLayerPos(e);\n\n self.ignoreNextClick = true;\n self.freezeMarkerPosition = pos;\n pos.x -= self.getRowGroupAreaWidth();\n pos.y -= self.getColumnGroupAreaHeight();\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopFreezeMove = function (e) {\n let pos = self.getLayerPos(e),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n pos.x -= self.getRowGroupAreaWidth();\n pos.y -= self.getColumnGroupAreaHeight();\n\n if (\n self.currentCell &&\n self.currentCell.rowIndex !== undefined &&\n self.dragMode === 'frozen-row-marker'\n ) {\n self.scrollBox.scrollTop = 0;\n self.frozenRow = self.currentCell.rowIndex + 1;\n self.scrollBox.bar.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n self.scrollBox.box.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n var dataHeight = self.scrollCache.y[self.scrollCache.y.length - 1];\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.v.height = self.scrollBox.scrollBoxHeight;\n }\n if (\n self.currentCell &&\n self.currentCell.columnIndex !== undefined &&\n self.dragMode === 'frozen-column-marker'\n ) {\n const dataWidth = self.refreshScrollCacheX();\n self.scrollBox.scrollLeft = 0;\n let x =\n self.currentCell.x -\n self.style.frozenMarkerWidth -\n self.style.frozenMarkerBorderWidth;\n if (pos.x > x + self.currentCell.width / 2)\n self.frozenColumn = self.currentCell.columnIndex + 1;\n else if (self.currentCell.columnIndex >= 0)\n self.frozenColumn = self.currentCell.columnIndex;\n self.scrollBox.bar.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn];\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn]) /\n dataWidth;\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.h.width = self.scrollBox.scrollBoxWidth;\n }\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n\n window.removeEventListener('mousemove', self.freezeMove, false);\n window.removeEventListener('mouseup', self.stopFreezeMove, false);\n self.freezeMarkerPosition = undefined;\n if (\n self.dispatchEvent('endfreezemove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n self.frozenRow = self.startFreezeMove.x;\n self.frozenColumn = self.startFreezeMove.y;\n self.draw(true);\n return;\n }\n self.draw(true);\n self.resize();\n };\n self.mousedown = function (e, overridePos) {\n self.lastMouseDownTarget = e.target;\n if (\n self.dispatchEvent('mousedown', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (e.button === 2 || self.input) {\n return;\n }\n var ctrl = e.ctrlKey || e.metaKey,\n move = /-move/.test(self.dragMode),\n freeze = /frozen-row-marker|frozen-column-marker/.test(self.dragMode),\n resize = /-resize/.test(self.dragMode);\n const onUnhideIndicator = self.hovers && self.hovers.unhideIndicator;\n self.dragStart = overridePos || self.getLayerPos(e);\n self.scrollStart = {\n left: self.scrollBox.scrollLeft,\n top: self.scrollBox.scrollTop,\n };\n self.dragStartObject = self.getCellAt(self.dragStart.x, self.dragStart.y);\n self.dragAddToSelection = !self.dragStartObject.selected;\n if (\n !ctrl &&\n !e.shiftKey &&\n !/(vertical|horizontal)-scroll-(bar|box)/.test(\n self.dragStartObject.context,\n ) &&\n self.currentCell &&\n !self.currentCell.isColumnHeader &&\n !move &&\n !freeze &&\n !resize\n ) {\n if (\n !(self.dragMode == 'row-reorder' && self.isMultiRowsSelected) &&\n !(self.currentCell.hovered && self.hovers.onFilterButton)\n ) {\n self.selections = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n }\n }\n if (self.dragStartObject.isGrid) {\n return;\n }\n if (\n self.scrollModes.indexOf(self.dragStartObject.context) !== -1 &&\n !onUnhideIndicator\n ) {\n self.scrollMode = self.dragStartObject.context;\n self.scrollStartMode = self.dragStartObject.context;\n self.scrollGrid(e);\n if (\n self.attributes.scrollPointerLock &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition = {\n x: self.dragStart.x,\n y: self.dragStart.y,\n };\n self.canvas.requestPointerLock();\n }\n window.addEventListener('mousemove', self.scrollGrid, false);\n window.addEventListener('mouseup', self.stopScrollGrid, false);\n self.ignoreNextClick = true;\n return;\n }\n if (self.dragMode === 'cell') {\n self.selecting = true;\n if (\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.dragStartObject.rowIndex > -1\n ) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n } else if (\n (self.attributes.selectionMode === 'column' ||\n self.dragStartObject.rowIndex === -1) &&\n self.dragStartObject.columnIndex > -1\n ) {\n self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\n return;\n }\n if (self.attributes.selectionMode !== 'row') {\n self.mousemove(e);\n }\n return;\n }\n if (move) {\n self.draggingItem = self.dragItem;\n self.movingSelection = self.selections.concat([]);\n self.dragging = self.dragStartObject;\n if (\n self.dispatchEvent('beginmove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n window.addEventListener('mousemove', self.dragMove, false);\n window.addEventListener('mouseup', self.stopDragMove, false);\n return self.mousemove(e);\n }\n if (freeze) {\n self.draggingItem = self.dragItem;\n self.startFreezeMove = {\n x: self.frozenRow,\n y: self.frozenColumn,\n };\n if (self.dispatchEvent('beginfreezemove', { NativeEvent: e })) {\n return;\n }\n\n self.freezeMarkerPosition = self.getLayerPos(e);\n self.freezeMarkerPosition.isGrab = true;\n\n window.addEventListener('mousemove', self.freezeMove, false);\n window.addEventListener('mouseup', self.stopFreezeMove, false);\n return self.mousemove(e);\n }\n if (resize && !onUnhideIndicator) {\n self.draggingItem = self.dragItem;\n if (self.draggingItem.rowOpen) {\n self.resizingStartingHeight =\n self.sizes.trees[self.draggingItem.rowIndex];\n } else {\n self.resizingStartingHeight =\n self.sizes.rows[self.draggingItem.rowIndex] || self.style.cellHeight;\n }\n self.resizingStartingWidth =\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] || self.draggingItem.width;\n window.addEventListener('mousemove', self.dragResizeColumn, false);\n window.addEventListener('mouseup', self.stopDragResize, false);\n return;\n }\n if (['row-reorder', 'column-reorder'].indexOf(self.dragMode) !== -1) {\n self.draggingItem = self.dragStartObject;\n if (self.dragMode === 'column-reorder' && !self.isMultiColumnsSelected) {\n self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\n } else if (self.dragMode === 'row-reorder' && !self.isMultiRowsSelected) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n }\n window.addEventListener('mousemove', self.dragReorder, false);\n window.addEventListener('mouseup', self.stopDragReorder, false);\n return;\n }\n };\n self.mouseup = function (e) {\n clearTimeout(self.scrollTimer);\n self.cellBoundaryCrossed = true;\n self.rowBoundaryCrossed = true;\n self.columnBoundaryCrossed = true;\n self.selecting = undefined;\n self.draggingItem = undefined;\n self.dragStartObject = undefined;\n if (\n self.dispatchEvent('mouseup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n if (self.currentCell && self.currentCell.grid !== undefined) {\n return;\n }\n if (self.contextMenu || self.input) {\n return;\n }\n if (self.dragStart && self.isInGrid(self.dragStart)) {\n self.controlInput.focus();\n }\n e.preventDefault();\n };\n // gets the horizontal adjacent cells as well as first/last based on column visibility\n self.getAdjacentCells = function () {\n var x,\n i,\n s = self.getSchema(),\n o = {};\n for (x = 0; x < s.length; x += 1) {\n i = self.orders.columns[x];\n if (!s[i].hidden) {\n if (o.first === undefined) {\n o.first = x;\n o.left = x;\n }\n o.last = x;\n if (x > self.activeCell.columnIndex && o.right === undefined) {\n o.right = x;\n }\n if (x < self.activeCell.columnIndex) {\n o.left = x;\n }\n }\n }\n if (o.right === undefined) {\n o.right = o.last;\n }\n return o;\n };\n self.keydown = function (e) {\n var i,\n ev,\n adjacentCells = self.getAdjacentCells(),\n x = Math.max(self.activeCell.columnIndex, 0),\n y = Math.max(self.activeCell.rowIndex, 0),\n ctrl = e.ctrlKey || e.metaKey,\n last = self.viewData.length - 1,\n s = self.getSchema(),\n cols = s.length - 1;\n\n var defaultPrevented = self.dispatchEvent('keydown', {\n NativeEvent: e,\n cell: self.currentCell,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n if (!self.attributes.keepFocusOnMouseOut && !self.hasFocus) {\n return;\n }\n\n // If a user starts typing content, switch to \"Enter\" mode\n if (isPrintableKeyEvent(e) && !ctrl) {\n return self.beginEditAt(x, y, e, true);\n }\n\n if (self.attributes.showNewRow) {\n last += 1;\n }\n\n if (e.key === 'Tab') {\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.selectNone();\n } else if (ctrl && e.key === 'a') {\n self.selectAll();\n } else if (['Backspace', 'Delete'].includes(e.key)) {\n self.deleteSelectedData();\n } else if (e.key === 'ArrowDown') {\n y += 1;\n } else if (e.key === 'ArrowUp') {\n y -= 1;\n } else if (\n (e.key === 'ArrowLeft' && !ctrl) ||\n (e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.left;\n } else if (\n (e.key === 'ArrowRight' && !ctrl) ||\n (!e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.right;\n } else if (e.key === 'PageUp') {\n y -= self.page;\n e.preventDefault();\n } else if (e.key === 'PageDown') {\n y += self.page;\n e.preventDefault();\n } else if (e.key === 'Home' || (ctrl && e.key === 'ArrowUp')) {\n y = 0;\n } else if (e.key === 'End' || (ctrl && e.key === 'ArrowDown')) {\n y = self.viewData.length - 1;\n } else if (ctrl && e.key === 'ArrowRight') {\n x = adjacentCells.last;\n } else if (ctrl && e.key === 'ArrowLeft') {\n x = adjacentCells.first;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n return self.beginEditAt(x, y, e);\n }\n if (x < 0 || Number.isNaN(x)) {\n x = adjacentCells.first;\n }\n if (y > last) {\n y = last;\n }\n if (y < 0 || Number.isNaN(y)) {\n y = 0;\n }\n if (x > cols) {\n x = adjacentCells.last;\n }\n\n // TODO - most likely some column order related bugs in key based selection\n // Arrows\n var isArrowKey = [\n 'ArrowLeft',\n 'ArrowUp',\n 'ArrowRight',\n 'ArrowDown',\n ].includes(e.key);\n\n // Shrinking and expanding selection using shift and arrow keys\n if (e.shiftKey && isArrowKey) {\n const firstSelectedRowIndex = self.selections.findIndex((el) => !!el);\n const firstSelectedRow = self.selections[firstSelectedRowIndex];\n const firstSelectedColumnIndex = firstSelectedRow[0];\n const lastSelectedColumn = firstSelectedRow[firstSelectedRow.length - 1];\n const yAtTop = y === 0;\n const yAtBottom = y === last;\n const xAtLeft = x === 0;\n const xAtRight = x === cols;\n\n if (e.key === 'ArrowUp') {\n if (y + 1 > firstSelectedRowIndex && !yAtTop) {\n self.selections.pop();\n } else if (y < firstSelectedRowIndex) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (yAtTop && self.activeCell.rowIndex !== 0) {\n self.selections.pop();\n }\n }\n\n if (e.key === 'ArrowDown') {\n if (y > firstSelectedRowIndex && y === self.selections.length) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (y >= firstSelectedRowIndex && !yAtBottom) {\n delete self.selections[y - 1];\n } else if (yAtBottom && self.activeCell.rowIndex !== last) {\n delete self.selections[y - 1];\n }\n }\n\n for (const selection of self.selections) {\n if (e.key === 'ArrowRight' && selection) {\n if (x > lastSelectedColumn) {\n selection.push(x);\n } else if (x <= lastSelectedColumn && !xAtRight) {\n selection.shift();\n } else if (xAtRight && self.activeCell.columnIndex !== cols) {\n selection.shift();\n }\n }\n\n if (e.key === 'ArrowLeft' && selection) {\n if (x < firstSelectedColumnIndex) {\n selection.unshift(x);\n } else if (x >= firstSelectedColumnIndex && !xAtLeft) {\n selection.pop();\n } else if (xAtLeft && self.activeCell.columnIndex !== 0) {\n selection.pop();\n }\n }\n }\n\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, ctrl);\n\n self.draw(true);\n }\n\n if (x !== self.activeCell.columnIndex || y !== self.activeCell.rowIndex) {\n self.scrollIntoView(\n x !== self.activeCell.columnIndex ? x : undefined,\n y !== self.activeCell.rowIndex && !Number.isNaN(y) ? y : undefined,\n );\n\n self.setActiveCell(x, y);\n if (!e.shiftKey && self.attributes.selectionFollowsActiveCell) {\n if (!ctrl) {\n self.selections = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n }\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n ev = {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n }\n self.draw(true);\n }\n };\n self.keyup = function (e) {\n if (\n self.dispatchEvent('keyup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n };\n self.keypress = function (e) {\n if (!self.hasFocus) {\n return;\n }\n if (\n self.dispatchEvent('keypress', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n };\n self.dblclick = function (e) {\n if (\n self.dispatchEvent('dblclick', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'columnHeaderCell'\n ) {\n // Check that double-clicked cell is selected or part of selection.\n const currentCellIsSelected = self.isColumnSelected(\n self.currentCell.columnIndex,\n );\n\n if (currentCellIsSelected) {\n // There might be more\n self.fitSelectedColumns();\n } else {\n self.fitColumnToValues(self.currentCell.header.name);\n }\n } else if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'cornerCell'\n ) {\n self.autosize();\n } else if (\n ['cell', 'activeCell'].includes(self.currentCell.style) &&\n !self.hovers.onFilterButton &&\n !self.hovers.onCellTreeIcon\n ) {\n if (self.currentCell.isRowTree || self.currentCell.isColumnTree) {\n self.cellTreeExpandCollapse(\n self.currentCell.rowIndex,\n self.currentCell.columnIndex,\n );\n self.draw();\n } else {\n self.beginEditAt(\n self.currentCell.columnIndex,\n self.currentCell.rowIndex,\n );\n }\n }\n };\n self.scrollWheel = function (e) {\n var l,\n t,\n ev = e,\n deltaX = e.deltaX === undefined ? e.NativeEvent.deltaX : e.deltaX,\n deltaY = e.deltaY === undefined ? e.NativeEvent.deltaY : e.deltaY,\n deltaMode =\n e.deltaMode === undefined ? e.NativeEvent.deltaMode : e.deltaMode;\n var e = e.NativeEvent || e;\n if (wheeling) {\n ev.preventDefault(e);\n return;\n }\n if (self.dispatchEvent('wheel', { NativeEvent: e })) {\n return;\n }\n self.touchHaltAnimation = true;\n l = self.scrollBox.scrollLeft;\n t = self.scrollBox.scrollTop;\n if (self.hasFocus) {\n //BUG Issue 42: https://github.com/TonyGermaneri/canvas-datagrid/issues/42\n //https://stackoverflow.com/questions/20110224/what-is-the-height-of-a-line-in-a-wheel-event-deltamode-dom-delta-line\n if (deltaMode === 1) {\n // line mode = 17 pixels per line\n deltaY = deltaY * 17;\n }\n if (\n (self.scrollBox.scrollTop < self.scrollBox.scrollHeight &&\n deltaY > 0) ||\n (self.scrollBox.scrollLeft < self.scrollBox.scrollWidth &&\n deltaX > 0) ||\n (self.scrollBox.scrollTop > 0 && deltaY < 0) ||\n (self.scrollBox.scrollLeft > 0 && deltaX < 0)\n ) {\n ev.preventDefault(e);\n }\n wheeling = setTimeout(function () {\n wheeling = undefined;\n self.scrollBox.scrollTo(deltaX + l, deltaY + t);\n }, 1);\n }\n };\n self.pasteData = function (\n pasteValue,\n mimeType,\n startRowIndex,\n startColIndex,\n ) {\n if (mimeType === 'text/html' && !isSupportedHtml(pasteValue)) {\n console.warn(\n 'Unrecognized HTML format. HTML must be a simple table, e.g.: <table><tr><td>data</td></tr></table>.',\n );\n console.warn(\n 'Data with the mime type text/html not in this format will not be imported as row data.',\n );\n\n return;\n }\n var schema = self.getSchema();\n var rows = parseData(pasteValue, mimeType);\n\n // selected cell. This mimics Excel's paste functionality, and works\n // as a poor-man's fill-down.\n if (rows.length === 1 && rows[0].length === 1) {\n var cellData = rows[0][0].value.map((item) => item.value).join();\n\n self.forEachSelectedCell(function (data, rowIndex, colName) {\n data[rowIndex][colName] = cellData;\n });\n } else {\n var selections = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n // Rows may have been moved by user, so get the actual row index\n // (instead of the row index at which the row is rendered):\n var realRowIndex = self.orders.rows[startRowIndex + rowIndex];\n var cells = rows[rowIndex];\n\n var existingRowData = self.viewData[realRowIndex];\n var newRowData = Object.assign({}, existingRowData);\n\n selections[realRowIndex] = [];\n self.selectedRows.push(realRowIndex);\n\n for (var colIndex = 0; colIndex < cells.length; colIndex++) {\n var column = schema[startColIndex + colIndex];\n\n if (!column) {\n console.warn('Paste data exceeded grid bounds. Skipping.');\n continue;\n }\n\n var columnName = column.name;\n var cellData = cells[colIndex].value\n .map((item) => item.value)\n .join('');\n\n if (cellData === undefined || cellData === null) {\n newRowData[columnName] = existingRowData[columnName];\n continue;\n }\n\n selections[realRowIndex].push(startColIndex + colIndex);\n\n newRowData[columnName] = cellData;\n if (self.selectedColumns.indexOf(startColIndex + colIndex) === -1)\n self.selectedColumns.push(startColIndex + colIndex);\n }\n\n self.originalData[self.boundRowIndexMap.get(realRowIndex)] = newRowData;\n // Update view date here to avoid a full refresh of `viewData`.\n // To stay in line with Excel and Google Sheet behaviour,\n // don't perform a full refresh (and filter/sort results)\n // as this would make any pasted values disappear and/or suddenly change position.\n self.viewData[realRowIndex] = newRowData;\n }\n self.selections = selections;\n }\n\n // selections is a sparse array, so we condense:\n var affectedCells = [];\n\n self.selections.forEach(function (row, rowIndex) {\n if (rowIndex === undefined) return;\n\n row.forEach(function (columnIndex) {\n affectedCells.push([\n rowIndex,\n columnIndex,\n self.getBoundRowIndexFromViewRowIndex(rowIndex),\n self.getBoundColumnIndexFromViewColumnIndex(columnIndex),\n ]);\n });\n });\n\n self.dispatchEvent('afterpaste', {\n cells: affectedCells,\n });\n\n return rows.length;\n };\n self.getNextVisibleColumnIndex = function (visibleColumnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === visibleColumnIndex) {\n return s[x + 1].columnIndex;\n }\n }\n return -1;\n };\n self.getVisibleColumnIndexOf = function (columnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === columnIndex) {\n return x;\n }\n }\n return -1;\n };\n self.paste = function (event) {\n if (!self.attributes.editable) {\n return;\n }\n\n var defaultPrevented = self.dispatchEvent('beforepaste', {\n NativeEvent: event,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n var clipboardItems = new Map(\n Array.from(event.clipboardData.items).map((item) => [item.type, item]),\n );\n\n // Supported MIME types, in order of preference:\n var supportedMimeTypes = ['text/html', 'text/csv', 'text/plain'];\n\n // The clipboard will often contain the same data in multiple formats,\n // which can be used depending on the context in which it's pasted. Here\n // we'll prefere more structured (HTML/CSV) over less structured, when\n // available, so we try to find those first:\n var pasteableItems = supportedMimeTypes\n .map((mimeType) => clipboardItems.get(mimeType))\n .filter((item) => !!item); // filter out not-found MIME types (= undefined)\n\n if (pasteableItems.length === 0) {\n console.warn(\n 'Cannot find supported clipboard data type. Supported types are:',\n supportedMimeTypes.join(', '),\n );\n return;\n }\n\n var itemToPaste = pasteableItems[0];\n\n let startCell = [];\n for (\n let rowIndex = 0, len = self.selections.length;\n rowIndex < len;\n rowIndex++\n ) {\n const row = self.selections[rowIndex];\n if (row) {\n if (row[0] === undefined) return;\n startCell = [rowIndex, row[0] < 0 ? row[1] : row[0]];\n break;\n }\n }\n\n // itemToPaste is cleared once accessed (getData or getAsString),\n // so we need to store the type here, before reading its value:\n var pasteType = itemToPaste.type;\n\n itemToPaste.getAsString(function (pasteValue) {\n self.pasteData(pasteValue, pasteType, startCell[0], startCell[1]);\n\n self.draw();\n });\n };\n self.cut = function (event) {\n if (self.dispatchEvent('cut', { NativeEvent: event })) {\n return;\n }\n\n // Expecting instance of `ClipboardEvent` with `clipboardData` attribute\n if (!self.hasFocus || !event.clipboardData) {\n return;\n }\n\n self.copySelectedCellsToClipboard(event.clipboardData);\n\n const affectedCells = self.clearSelectedCells();\n\n self.dispatchEvent('aftercut', {\n cells: affectedCells,\n });\n\n requestAnimationFrame(() => self.draw());\n event.preventDefault();\n };\n self.copy = function (event) {\n if (self.dispatchEvent('copy', { NativeEvent: event })) {\n return;\n }\n\n // Expecting instance of `ClipboardEvent` with `clipboardData` attribute\n if (!self.hasFocus || !event.clipboardData) {\n return;\n }\n\n self.copySelectedCellsToClipboard(event.clipboardData);\n\n event.preventDefault();\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true, plusplus: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n var touchTimerMs = 50,\n debounceTouchMove,\n touchMoving,\n touchScrollTimeout;\n self.scrollAnimation = {};\n self.touchDelta = {};\n self.touchAnimateTo = {};\n self.animationFrames = 0;\n self.getTouchPos = function (e, touchIndex) {\n var t = touchIndex ? e.touches[touchIndex] : e.touches[0],\n rect = self.canvas.getBoundingClientRect(),\n pos;\n if (!t) {\n return;\n }\n pos = {\n x: t.clientX - rect.left,\n y: t.clientY - rect.top,\n };\n if (self.isChildGrid) {\n pos.x -= self.canvasOffsetLeft;\n pos.y -= self.canvasOffsetTop;\n }\n return {\n x: pos.x,\n y: pos.y,\n rect: rect,\n };\n };\n // shamelessly stolen from from https://gist.github.com/gre/1650294\n self.easingFunctions = {\n linear: function (t) {\n return t;\n },\n easeInQuad: function (t) {\n return t * t;\n },\n easeOutQuad: function (t) {\n return t * (2 - t);\n },\n easeInOutQuad: function (t) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n },\n easeInCubic: function (t) {\n return t * t * t;\n },\n easeOutCubic: function (t) {\n return --t * t * t + 1;\n },\n easeInOutCubic: function (t) {\n return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n },\n easeInQuart: function (t) {\n return t * t * t * t;\n },\n easeOutQuart: function (t) {\n return 1 - --t * t * t * t;\n },\n easeInOutQuart: function (t) {\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;\n },\n easeInQuint: function (t) {\n return t * t * t * t * t;\n },\n easeOutQuint: function (t) {\n return 1 + --t * t * t * t * t;\n },\n easeInOutQuint: function (t) {\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;\n },\n };\n self.easing = function (t, b, c, d) {\n return (\n c * self.easingFunctions[self.attributes.touchEasingMethod](t / d) + b\n );\n };\n self.calculatePPSTimed = function () {\n self.xPPST = -(\n (self.touchDelta.x - self.touchSigmaTimed.x) /\n (self.touchDelta.t - self.touchSigmaTimed.t)\n );\n self.yPPST = -(\n (self.touchDelta.y - self.touchSigmaTimed.y) /\n (self.touchDelta.t - self.touchSigmaTimed.t)\n );\n self.touchSigmaTimed = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: performance.now(),\n };\n };\n self.calculatePPS = function () {\n self.xPPS = -(\n (self.touchDelta.x - self.touchSigma.x) /\n (self.touchDelta.t - self.touchSigma.t)\n );\n self.yPPS = -(\n (self.touchDelta.y - self.touchSigma.y) /\n (self.touchDelta.t - self.touchSigma.t)\n );\n self.touchSigma = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: performance.now(),\n };\n };\n self.touchEndAnimation = function () {\n if (!self.canvas || !self.scrollBox.scrollTo) {\n return requestAnimationFrame(self.touchEndAnimation);\n }\n var n = performance.now(),\n d = self.attributes.touchReleaseAnimationDurationMs,\n t;\n t = n - self.touchDelta.t;\n self.animationFrames += 1;\n self.scrollAnimation.x = self.easing(\n t,\n self.touchDelta.scrollLeft,\n self.touchAnimateTo.x,\n d,\n );\n self.scrollAnimation.y = self.easing(\n t,\n self.touchDelta.scrollTop,\n self.touchAnimateTo.y,\n d,\n );\n if (\n t > d ||\n (self.scrollAnimation.y === self.scrollBox.scrollTop &&\n self.scrollAnimation.x === self.scrollBox.scrollLeft) ||\n self.stopAnimation\n ) {\n return;\n }\n self.scrollBox.scrollTo(self.scrollAnimation.x, self.scrollAnimation.y);\n requestAnimationFrame(self.touchEndAnimation);\n };\n self.touchEditCell = function (cell) {\n self.beginEditAt(cell.columnIndex, cell.rowIndex);\n };\n self.touchstart = function (e) {\n if (e.changedTouches[0]) {\n self.touchStart = self.getTouchPos(e);\n self.startingCell = self.getCellAt(\n self.touchStart.x,\n self.touchStart.y,\n true,\n );\n }\n if (\n self.dispatchEvent('touchstart', {\n NativeEvent: e,\n cell: self.startingCell,\n })\n ) {\n return;\n }\n self.disposeContextMenu();\n clearInterval(self.calculatePPSTimer);\n clearTimeout(self.touchContextTimeout);\n self.touchStartEvent = e;\n self.stopAnimation = true;\n self.animationFrames = 0;\n self.stopPropagation(e);\n if (e.touches.length === 1 && e.changedTouches[0] && !self.zoomAltered) {\n self.touchLength = 1;\n self.touchStart = self.touchStart || self.touchStart1;\n self.touchScrollStart = {\n x: self.scrollBox.scrollLeft,\n y: self.scrollBox.scrollTop,\n t: performance.now(),\n };\n self.touchDelta = {\n x: 0,\n y: 0,\n scrollLeft: self.scrollBox.scrollLeft,\n scrollTop: self.scrollBox.scrollTop,\n t: self.touchScrollStart.t,\n };\n self.touchSigma = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: self.touchDelta.t,\n };\n self.touchSigmaTimed = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: self.touchDelta.t,\n };\n self.touchContextTimeout = setTimeout(function () {\n self.contextmenuEvent(e, self.touchStart);\n }, self.attributes.touchContextMenuTimeMs);\n self.calculatePPSTimer = setInterval(\n self.calculatePPSTimed,\n touchTimerMs,\n );\n if (\n self.startingCell &&\n (self.startingCell.isGrid ||\n ['tree', 'inherit'].indexOf(self.startingCell.context) !== -1)\n ) {\n self.hasFocus = false;\n return;\n }\n self.hasFocus = true;\n if (self.startingCell.isHeader) {\n if (self.startingCell.isRowHeader) {\n self.selectArea({\n top: self.startingCell.rowIndex,\n bottom: self.startingCell.rowIndex,\n left: 0,\n right: self.getVisibleSchema().length - 1,\n });\n self.draw(true);\n } else if (self.startingCell.isColumnHeader) {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === self.startingCell.header.name) {\n self.orderDirection =\n self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(self.startingCell.header.name, self.orderDirection);\n }\n if (self.attributes.columnHeaderClickBehavior === 'select') {\n self.selectArea({\n top: 0,\n bottom: self.viewData.length - 1,\n left: self.startingCell.columnIndex,\n right: self.startingCell.columnIndex,\n });\n self.draw(true);\n }\n }\n self.touchEndEvents(e);\n return;\n }\n }\n if (self.zoomAltered) {\n return;\n }\n document.body.addEventListener('touchmove', self.touchmove, {\n passive: false,\n });\n document.body.addEventListener('touchend', self.touchend, false);\n document.body.addEventListener('touchcancel', self.touchcancel, false);\n self.draw(true);\n };\n self.touchSelect = function (cell, handleType) {\n if (cell.rowIndex === undefined || cell.columnIndex === undefined) {\n return;\n }\n self.touchSelecting = true;\n var bounds = self.getSelectionBounds();\n if (\n handleType === 'selection-handle-bl' &&\n cell.rowIndex >= bounds.top &&\n cell.columnIndex <= bounds.right\n ) {\n bounds.bottom = cell.rowIndex;\n bounds.left = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-tl' &&\n cell.rowIndex <= bounds.bottom &&\n cell.columnIndex <= bounds.right\n ) {\n bounds.top = cell.rowIndex;\n bounds.left = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-tr' &&\n cell.rowIndex <= bounds.bottom &&\n cell.columnIndex >= bounds.left\n ) {\n bounds.top = cell.rowIndex;\n bounds.right = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-br' &&\n cell.rowIndex >= bounds.top &&\n cell.columnIndex >= bounds.left\n ) {\n bounds.bottom = cell.rowIndex;\n bounds.right = cell.columnIndex;\n }\n if (self.attributes.selectionMode === 'row' || cell.rowIndex === -1) {\n bounds.left = 0;\n bounds.right = self.getSchema().length - 1;\n } else {\n bounds.left = Math.max(0, bounds.left);\n }\n self.selectArea(bounds);\n self.draw(true);\n };\n function touchMove(e) {\n var ch, rw, rScrollZone, lScrollZone, bScrollZone, tScrollZone, sbw, t1, t2;\n if (self.dispatchEvent('beforetouchmove', { NativeEvent: e })) {\n return;\n }\n clearTimeout(touchScrollTimeout);\n if (e.changedTouches[0]) {\n self.touchPosition = self.getTouchPos(e);\n }\n if (e.changedTouches[1]) {\n self.touchPosition1 = self.getTouchPos(e, 1);\n }\n if (\n Math.abs(self.touchDelta.x) + Math.abs(self.touchDelta.y) >\n self.attributes.touchDeadZone\n ) {\n clearTimeout(self.touchContextTimeout);\n }\n if (e.touches.length === 2 && self.touchPosition && self.touchPosition1) {\n t1 = self.touchPosition.y;\n t2 = self.touchPosition1.y;\n if (!self.zoomDeltaStart) {\n self.zoomDeltaStart = Math.abs(t1 - t2);\n self.startScale = self.scale;\n }\n self.touchLength = 2;\n self.scaleDelta = self.zoomDeltaStart - Math.abs(t1 - t2);\n self.scale =\n self.startScale -\n self.scaleDelta * self.attributes.touchZoomSensitivity;\n self.scale = Math.min(\n Math.max(self.scale, self.attributes.touchZoomMin),\n self.attributes.touchZoomMax,\n );\n self.zoomAltered = true;\n self.resize(true);\n self.resizeChildGrids();\n return;\n }\n if (self.zoomAltered) {\n return;\n }\n self.touchLength = 1;\n self.touchPosition = self.touchPosition || self.touchPosition1;\n ch = self.getColumnHeaderCellHeight();\n rw = self.getRowHeaderCellWidth();\n rScrollZone =\n self.width - self.style.scrollBarWidth - self.touchPosition.x <\n self.attributes.selectionScrollZone;\n lScrollZone =\n self.touchPosition.x - rw < self.attributes.selectionScrollZone;\n bScrollZone =\n self.height - self.style.scrollBarWidth - self.touchPosition.y <\n self.attributes.selectionScrollZone;\n tScrollZone =\n self.touchPosition.y - ch < self.attributes.selectionScrollZone;\n sbw = self.style.scrollBarWidth;\n function touchScroll() {\n var x = self.scrollBox.scrollLeft,\n y = self.scrollBox.scrollTop;\n x += rScrollZone ? self.attributes.selectionScrollIncrement : 0;\n y += bScrollZone ? self.attributes.selectionScrollIncrement : 0;\n y -= tScrollZone ? self.attributes.selectionScrollIncrement : 0;\n x -= lScrollZone ? self.attributes.selectionScrollIncrement : 0;\n self.scrollBox.scrollTo(x, y);\n touchScrollTimeout = setTimeout(\n touchScroll,\n self.attributes.scrollRepeatRate,\n );\n }\n e.stopPropagation();\n self.touchDelta = {\n x: self.touchPosition.x - self.touchStart.x,\n y: self.touchPosition.y - self.touchStart.y,\n scrollLeft: self.scrollBox.scrollLeft,\n scrollTop: self.scrollBox.scrollTop,\n t: performance.now(),\n };\n self.currentCell = self.getCellAt(\n self.touchPosition.x,\n self.touchPosition.y,\n );\n self.dispatchEvent('touchmove', { NativeEvent: e, cell: self.currentCell });\n self.calculatePPS();\n self.touchDuration = performance.now() - self.touchScrollStart.t;\n self.stopAnimation = true;\n self.animationFrames = 0;\n if (\n self.touchSelecting &&\n (rScrollZone || lScrollZone || tScrollZone || bScrollZone)\n ) {\n touchScroll();\n }\n if (/vertical-scroll-/.test(self.startingCell.style)) {\n self.scrollBox.scrollTop =\n self.scrollBox.scrollHeight *\n ((self.touchPosition.y - ch - sbw) /\n (self.scrollBox.height - sbw - ch));\n return;\n }\n if (/horizontal-scroll-/.test(self.startingCell.style)) {\n self.scrollBox.scrollLeft =\n self.scrollBox.scrollWidth *\n ((self.touchPosition.x - rw - sbw) / (self.scrollBox.width - sbw - rw));\n return;\n }\n if (/selection-handle-/.test(self.startingCell.style)) {\n self.touchSelect(self.currentCell, self.startingCell.style);\n return;\n }\n self.scrollBox.scrollTo(\n self.touchScrollStart.x - self.touchDelta.x,\n self.touchScrollStart.y - self.touchDelta.y,\n );\n }\n self.touchmove = function (e) {\n if (touchMoving) {\n return;\n }\n requestAnimationFrame(function () {\n touchMoving = true;\n touchMove(e);\n touchMoving = false;\n });\n };\n self.touchEndEvents = function (e) {\n self.zoomDeltaStart = undefined;\n self.touchSelecting = false;\n clearInterval(self.touchScrollTimeout);\n clearInterval(self.touchContextTimeout);\n clearInterval(self.calculatePPSTimer);\n e.stopPropagation();\n document.body.removeEventListener('touchmove', self.touchmove, {\n passive: false,\n });\n document.body.removeEventListener('touchend', self.touchend, false);\n document.body.removeEventListener('touchcancel', self.touchcancel, false);\n };\n self.touchend = function (e) {\n if (\n self.dispatchEvent('touchend', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n self.zoomDeltaStart = undefined;\n if (e.changedTouches[0]) {\n self.touchPosition = undefined;\n }\n if (e.changedTouches[1]) {\n self.touchPosition1 = undefined;\n }\n if (self.zoomAltered) {\n if (e.touches.length === 0) {\n self.zoomAltered = false;\n }\n return;\n }\n var dz =\n Math.abs(self.touchDelta.x) + Math.abs(self.touchDelta.y) <\n self.attributes.touchDeadZone;\n if (isNaN(self.xPPS)) {\n self.xPPS = 0;\n }\n if (isNaN(self.yPPS)) {\n self.yPPS = 0;\n }\n if (isNaN(self.xPPST)) {\n self.xPPST = 0;\n }\n if (isNaN(self.yPPST)) {\n self.yPPST = 0;\n }\n self.touchAnimateTo.x =\n self.xPPS * self.attributes.touchReleaseAcceleration;\n self.touchAnimateTo.y =\n self.yPPS * self.attributes.touchReleaseAcceleration;\n self.calculatePPSTimed();\n if (\n !dz &&\n self.animationFrames === 0 &&\n (Math.abs(self.xPPST) > self.attributes.scrollAnimationPPSThreshold ||\n Math.abs(self.yPPST) > self.attributes.scrollAnimationPPSThreshold) &&\n !/-scroll-/.test(self.startingCell.style) &&\n !dz\n ) {\n self.stopAnimation = false;\n self.touchEndAnimation();\n }\n self.touchEndEvents(e);\n };\n self.touchcancel = function (e) {\n if (\n self.dispatchEvent('touchcancel', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n self.touchEndEvents(e);\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals HTMLElement: false, Reflect: false, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport { createHTMLString, createTextString } from './events/util';\n\nexport default function (self, ctor) {\n self.scale = 1;\n self.orders = {\n rows: [],\n columns: [],\n };\n self.appliedInlineStyles = {};\n self.cellGridAttributes = {};\n self.treeGridAttributes = {};\n self.visibleRowHeights = [];\n self.hasFocus = false;\n self.activeCell = {\n columnIndex: 0,\n rowIndex: 0,\n };\n self.innerHTML = '';\n self.storageName = 'canvasDataGrid';\n self.invalidSearchExpClass = 'canvas-datagrid-invalid-search-regExp';\n self.localStyleLibraryStorageKey = 'canvas-datagrid-user-style-library';\n self.dataType = 'application/x-canvas-datagrid';\n self.orderBy = null;\n self.orderDirection = 'asc';\n self.orderings = {\n columns: [],\n add: function (orderBy, orderDirection, sortFunction) {\n self.orderings.columns = self.orderings.columns.filter(function (col) {\n return col.orderBy !== orderBy;\n });\n self.orderings.columns.push({\n orderBy: orderBy,\n orderDirection: orderDirection,\n sortFunction: sortFunction,\n });\n },\n sort: function () {\n console.warn(\n 'grid.orderings.sort has been deprecated. Please use grid.refresh().',\n );\n\n self.orderings.columns.forEach(function (col) {\n self.viewData.sort(col.sortFunction(col.orderBy, col.orderDirection));\n });\n },\n };\n self.columnFilters = {};\n self.filters = {};\n self.frozenRow = 0;\n self.frozenColumn = 0;\n self.ellipsisCache = {};\n self.scrollCache = { x: [], y: [] };\n self.scrollBox = {};\n self.visibleRows = [];\n self.visibleCells = [];\n /**\n * Each item of this array contains these properties:\n * - `x`, `y`, `x2`, `y2`\n * - `orderIndex0`, `orderIndex1`: The closed interval of the hiding rows/columns.\n * - `dir`: The directon of the unhide indicator. 'l' and 'r' for columns, 't' and 'b' for rows\n */\n self.visibleUnhideIndicators = [];\n /**\n * Each item is a tuple conatins two numbers:\n * its type difination: Array<[beginRowIndex, endRowIndex]>\n * Each tuple represents a closed Interval\n */\n self.hiddenRowRanges = [];\n /**\n * This array stored all groups information with context for drawing,\n * it is generated by drawing functions,\n * and be used for searching groups when users operate on the spreadsheet\n * Each item of this array contains these properties:\n * - `type`: its available values: 'c' and 'r'. indicates the type of this item, 'c' for column group\n * and 'r' for row group.\n * - `x`,`y`: the left-top point of this group's rendering area.\n * - `x2`, `y2`: the right-bottom of this group's rendering area.\n * - `collapsed`: this value indicates the collapsed status of this group.\n * - `from`, `to`: The column index range of this group (We use this value for searching the group)\n * - `row`: The row index for column groups (We use this value for searching the group)\n */\n self.visibleGroups = [];\n self.sizes = {\n rows: {},\n columns: {},\n trees: {},\n };\n self.selections = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n self.filterable = {\n rows: [],\n columns: [],\n };\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n self.cellTree = {\n rows: [],\n columns: {},\n tempSchema: {},\n rowTreeColIndex: 0,\n columnTreeRowStartIndex: 0,\n columnTreeRowEndIndex: 0,\n origin: {\n rows: [],\n columns: {},\n },\n };\n self.hovers = {};\n self.attributes = {};\n self.style = {};\n self.formatters = {};\n self.sorters = {};\n self.parsers = {};\n self.schemaHashes = {};\n self.events = {};\n self.changes = [];\n self.scrollIndexTop = 0;\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = 0;\n self.scrollPixelLeft = 0;\n self.childGrids = {};\n self.openChildren = {};\n\n /**\n * Array for grouped columns\n * Each item in this array is an array and it represents some grouping in one row\n * A grouping descriptor has three properties:\n * - `from`: The column index of the first column\n * - `to`: The column index of the last column\n * - `collapsed`: Is this group be collapsed\n * @example [[{ from: 1, to: 2, collapsed: false }]]\n */\n self.groupedColumns = [];\n\n /**\n * Array for grouped rows\n * Each item in this array is an array and it represents some grouping in one column\n * A grouping descriptor has three properties:\n * - `from`: The row index of the first row\n * - `to`: The row index of the last row\n * - `collapsed`: Is this group be collapsed\n * @example [[{ from: 1, to: 2, collapsed: false }]]\n */\n self.groupedRows = [];\n\n self.scrollModes = [\n 'vertical-scroll-box',\n 'vertical-scroll-top',\n 'vertical-scroll-bottom',\n 'horizontal-scroll-box',\n 'horizontal-scroll-right',\n 'horizontal-scroll-left',\n ];\n self.componentL1Events = {};\n self.eventNames = [\n 'afterdraw',\n 'afterrendercell',\n 'afterrenderfilterbutton',\n 'aftercreategroup',\n 'attributechanged',\n 'beforebeginedit',\n 'beforecreatecellgrid',\n 'beforedraw',\n 'beforeendedit',\n 'beforerendercell',\n 'beforerendercellgrid',\n 'beforerenderfilterbutton',\n 'beginedit',\n 'cellmouseout',\n 'cellmouseover',\n 'click',\n 'collapsetree',\n 'columnhide',\n 'columnunhide',\n 'contextmenu',\n 'copy',\n 'datachanged',\n 'dblclick',\n 'endedit',\n 'expandtree',\n 'formatcellvalue',\n 'keydown',\n 'keypress',\n 'keyup',\n 'mousedown',\n 'mousemove',\n 'mouseup',\n 'newrow',\n 'ordercolumn',\n 'rendercell',\n 'rendercellgrid',\n 'renderorderbyarrow',\n 'rendertext',\n 'rendertreearrow',\n 'reorder',\n 'reordering',\n 'resize',\n 'resizecolumn',\n 'resizerow',\n 'schemachanged',\n 'scroll',\n 'selectionchanged',\n 'stylechanged',\n 'touchcancel',\n 'touchend',\n 'touchmove',\n 'touchstart',\n 'wheel',\n ];\n self.mouse = { x: 0, y: 0 };\n self.getSelectedData = function (expandToRow) {\n const selectedData = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n // self.selections is a sparse array, so `viewRowIndex` here\n // will equal the row index as where it's rendered,\n // not as where it is in the original data array.\n self.selections.forEach(function (row, viewRowIndex) {\n if (!row) {\n return;\n }\n\n if (viewRowIndex === viewDataLength) {\n return;\n }\n\n if (row.length === 0) {\n selectedData[viewRowIndex] = null;\n return;\n }\n\n selectedData[viewRowIndex] = {};\n\n row.forEach(function (col) {\n if (col === -1 || !schema[col]) {\n return;\n }\n\n const orderedIndex = self.orders.columns[col];\n\n if (!expandToRow && schema[orderedIndex].hidden) {\n return;\n }\n\n if (self.viewData[viewRowIndex]) {\n selectedData[viewRowIndex][schema[orderedIndex].name] =\n self.viewData[viewRowIndex][schema[orderedIndex].name];\n }\n });\n });\n\n return selectedData;\n };\n self.getSelectedCells = function (expandToRow) {\n const selectedCells = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n for (const [viewRowIndex, row] of self.selections.entries()) {\n if (!row || row.length === 0) continue;\n\n for (const [, viewColumnIndex] of row.entries()) {\n if (viewColumnIndex === -1 || !schema[viewColumnIndex]) {\n continue;\n }\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n viewColumnIndex,\n );\n\n if (!expandToRow && schema[boundColumnIndex].hidden) {\n continue;\n }\n\n if (self.viewData[viewRowIndex]) {\n const header = schema[boundColumnIndex];\n const value = self.viewData[viewRowIndex][header.name];\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(\n viewRowIndex,\n );\n\n const cell = {\n value,\n header,\n boundRowIndex,\n boundColumnIndex,\n viewRowIndex,\n viewColumnIndex,\n };\n\n selectedCells.push(cell);\n }\n }\n }\n\n return selectedCells;\n };\n self.copySelectedCellsToClipboard = function (clipboardData) {\n const selectedData = [];\n const schema = self.getSchema();\n let firstRowAsString;\n let isNeat = true; // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy\n\n for (const [rowIndex, row] of self.selections.entries()) {\n // If no cells are selected for a particular rowIndex the selections array will contain an empty element for that rowIndex.\n if (!row) continue;\n\n // Convert to string for easy comparison to the first row.\n const rowAsString = row.join(',').toString();\n const rowDict = {};\n\n if (!firstRowAsString) firstRowAsString = row.join(',').toString();\n if (isNeat && rowAsString !== firstRowAsString) isNeat = false;\n\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n\n for (let columnIndex of row) {\n // If the whole row is selected the columnIndex for the rowHeader is -1.\n if (columnIndex < 0) continue;\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n columnIndex,\n );\n const columnName = schema[boundColumnIndex].name;\n\n const value = self.originalData[boundRowIndex][columnName];\n\n rowDict[columnName] = value;\n }\n selectedData.push(rowDict);\n }\n\n if (selectedData.length > 0) {\n const textString = createTextString(selectedData, isNeat);\n const htmlString = createHTMLString(selectedData, isNeat);\n\n const copiedData = {\n 'text/plain': textString,\n 'text/html': htmlString,\n 'text/csv': textString,\n 'application/json': JSON.stringify(selectedData),\n };\n\n for (const [mimeType, data] of Object.entries(copiedData)) {\n clipboardData.setData(mimeType, data);\n }\n }\n };\n self.clearSelectedCells = function () {\n const schema = self.getSchema();\n const affectedCells = [];\n\n for (const [rowIndex, row] of self.selections.entries()) {\n // If no cells are selected for a particular rowIndex the selections array will contain an empty element for that rowIndex.\n if (!row) continue;\n\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n\n for (let columnIndex of row) {\n // If the whole row is selected the columnIndex for the rowHeader is -1.\n if (columnIndex < 0) continue;\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n columnIndex,\n );\n const columnName = schema[boundColumnIndex].name;\n\n self.viewData[boundRowIndex][columnName] = '';\n\n affectedCells.push([\n rowIndex,\n columnIndex,\n boundRowIndex,\n boundColumnIndex,\n ]);\n }\n }\n\n return affectedCells;\n };\n self.getBoundRowIndexFromViewRowIndex = function (viewRowIndex) {\n if (self.boundRowIndexMap && self.boundRowIndexMap.has(viewRowIndex)) {\n return self.boundRowIndexMap.get(viewRowIndex);\n }\n\n return undefined;\n };\n self.getBoundColumnIndexFromViewColumnIndex = function (viewColumnIndex) {\n return self.orders.columns[viewColumnIndex];\n };\n /**\n * Get the height of the area about column groups for rendering and handling events.\n */\n self.getColumnGroupAreaHeight = function () {\n if (!self.attributes.allowGroupingColumns) {\n return 0;\n }\n const groups = self.groupedColumns.length;\n const base = self.style.columnGroupRowHeight * self.scale;\n return base * groups;\n };\n /**\n * Get the width of the area about row groups for rendering and handling events.\n */\n self.getRowGroupAreaWidth = function () {\n if (!self.attributes.allowGroupingRows) {\n return 0;\n }\n const groups = self.groupedRows.length;\n const base = self.style.rowGroupColumnWidth * self.scale;\n return base * groups;\n };\n self.getCollapsedColumnGroups = function () {\n const result = [];\n for (let rowIndex = 0; rowIndex < self.groupedColumns.length; rowIndex++) {\n const groups = self.groupedColumns[rowIndex];\n for (let groupIndex = 0; groupIndex < groups.length; groupIndex++) {\n const group = groups[groupIndex];\n if (group.collapsed) result.push(group);\n }\n }\n return result;\n };\n self.getCollapsedRowGroups = function () {\n const result = [];\n for (let rowIndex = 0; rowIndex < self.groupedRows.length; rowIndex++) {\n const groups = self.groupedRows[rowIndex];\n for (let groupIndex = 0; groupIndex < groups.length; groupIndex++) {\n const group = groups[groupIndex];\n if (group.collapsed) result.push(group);\n }\n }\n return result;\n };\n /**\n * Toggle the collapse status of a group (expanded/collapsed)\n * @param {{type:string,from:number,to:number}} group\n */\n self.toggleGroup = function (group) {\n if (group.type === 'c') {\n const { from, to } = group;\n /** @type {{from:number,to:number,collapsed:boolean}} */\n let matchedGroup;\n /** @type {Array<Array<{from:number,to:number,collapsed:boolean}>>} */\n const allGroups = self.groupedColumns;\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n if (group.from === from && group.to === to) {\n matchedGroup = group;\n break;\n }\n }\n if (matchedGroup) break;\n }\n if (!matchedGroup) return;\n const nextCollapsed = !matchedGroup.collapsed;\n matchedGroup.collapsed = nextCollapsed;\n return true;\n }\n if (group.type === 'r') {\n const { from, to } = group;\n /** @type {{from:number,to:number,collapsed:boolean}} */\n let matchedGroup;\n /** @type {Array<Array<{from:number,to:number,collapsed:boolean}>>} */\n const allGroups = self.groupedRows;\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n if (group.from === from && group.to === to) {\n matchedGroup = group;\n break;\n }\n }\n if (matchedGroup) break;\n }\n if (!matchedGroup) return;\n const nextCollapsed = !matchedGroup.collapsed;\n matchedGroup.collapsed = nextCollapsed;\n return true;\n }\n return false;\n };\n self.isNewGroupRangeValid = function (groupsArray, from, to) {\n for (let i = 0; i < groupsArray.length; i++) {\n const groups = groupsArray[i];\n for (let gIndex = 0; gIndex < groups.length; gIndex++) {\n const group = groups[gIndex];\n if (from === group.to + 1) return false;\n if (from > group.to) continue;\n\n if (from === group.from) {\n if (to === group.to) return false;\n if (to > group.to) return true;\n break; // check smaller range\n }\n if (from > group.from) {\n if (to > group.to) return false;\n break; // check smaller range\n }\n if (to < group.to) return false;\n return true;\n }\n }\n return true;\n };\n self.getColumnHeaderCellHeight = function () {\n if (!self.attributes.showColumnHeaders) {\n return 0;\n }\n return (\n (self.sizes.rows[-1] || self.style.columnHeaderCellHeight) * self.scale\n );\n };\n self.getRowHeaderCellWidth = function () {\n if (!self.attributes.showRowHeaders) {\n return 0;\n }\n return (\n (self.sizes.columns[-1] || self.style.rowHeaderCellWidth) * self.scale\n );\n };\n self.setStorageData = function () {\n if (!self.attributes.saveAppearance || !self.attributes.name) {\n return;\n }\n var visibility = {};\n self.getSchema().forEach(function (column) {\n visibility[column.name] = !column.hidden;\n });\n localStorage.setItem(\n self.storageName + '-' + self.attributes.name,\n JSON.stringify({\n sizes: {\n rows: self.sizes.rows,\n columns: self.sizes.columns,\n },\n orders: {\n rows: self.orders.rows,\n columns: self.orders.columns,\n },\n orderBy: self.orderBy,\n orderDirection: self.orderDirection,\n visibility: visibility,\n }),\n );\n };\n self.getSchema = function () {\n return self.schema || self.tempSchema || [];\n };\n function fillArray(low, high) {\n var i = [],\n x;\n for (x = low; x <= high; x += 1) {\n i[x] = x;\n }\n return i;\n }\n self.createColumnOrders = function () {\n var s = self.getSchema();\n self.orders.columns = fillArray(0, s.length - 1);\n };\n self.createRowOrders = function () {\n self.orders.rows = fillArray(0, self.originalData.length - 1);\n };\n self.fitSelectedColumns = function (width) {\n const selectedColumns = self.selections[0];\n const schema = self.getSchema();\n\n for (const selectedColumn of selectedColumns) {\n // Make sure the column is not the row header and that the whole column has in fact been selected.\n if (selectedColumn >= 0 && self.isColumnSelected(selectedColumn)) {\n if (isNaN(width)) {\n const column = schema[self.orders.columns[selectedColumn]];\n self.fitColumnToValues(column.name);\n } else {\n self.sizes.columns[selectedColumn] = width;\n self.dispatchEvent('resizecolumn', {\n x: width,\n y: self.resizingStartingHeight,\n draggingItem: self.currentCell,\n });\n }\n }\n }\n };\n self.getVisibleSchema = function () {\n return self.getSchema().filter(function (col) {\n return !col.hidden;\n });\n };\n self.applyDefaultValue = function (row, header, rowIndex) {\n var d = header.defaultValue || '';\n if (typeof d === 'function') {\n d = d.apply(self.intf, [header, rowIndex]);\n }\n row[header.name] = d;\n };\n self.createNewRowData = function () {\n self.newRow = {};\n\n // The third argument of applyDefaultValue is the row index\n // of the row for which to apply the default value. In this\n // case, we're creating a new row but not yet appending it\n // to self.originalData, so no row index exists\n const newRowIndex = undefined;\n\n self.getSchema().forEach(function forEachHeader(header) {\n self.applyDefaultValue(self.newRow, header, newRowIndex);\n });\n };\n self.getSchemaNameHash = function (key) {\n var n = 0;\n while (self.schemaHashes[key]) {\n n += 1;\n key = key + n;\n }\n return key;\n };\n self.filter = function (type) {\n var f = self.filters[type];\n if (!f && type !== undefined) {\n console.warn(\n 'Cannot find filter for type %s, falling back to substring match.',\n type,\n );\n f = self.filters.string;\n }\n return f;\n };\n self.hasActiveFilters = function () {\n return self.columnFilters && Object.keys(self.columnFilters).length > 0;\n };\n self.hasCollapsedRowGroup = function () {\n for (let i = 0; i < self.groupedRows.length; i++) {\n const groups = self.groupedRows[i];\n for (let j = 0; j < groups.length; j++) {\n const g = groups[j];\n if (g.collapsed) return true;\n }\n }\n return false;\n };\n self.getFilteredAndSortedViewData = function (originalData) {\n // We make a copy of originalData here in order be able to\n // filter and sort rows without modifying the original array.\n // Each row is turned into a (row, rowIndex) tuple\n // so that when we apply filters, we can refer back to the\n // row's original row number in originalData. This becomes\n // useful when emitting cell events.\n let newViewData = originalData.map((row, originalRowIndex) => [\n row,\n originalRowIndex,\n ]);\n\n // Remove hidden rows here. So we can keep the bound indexes correct\n if (self.hiddenRowRanges.length > 0) {\n const ranges = self.hiddenRowRanges.sort((a, b) => b[1] - a[1]);\n for (let i = 0; i < ranges.length; i++) {\n const [beginRowIndex, endRowIndex] = ranges[i];\n const countOfRows = endRowIndex - beginRowIndex + 1;\n newViewData.splice(beginRowIndex, countOfRows);\n }\n }\n\n // Apply filtering\n for (const [headerName, filterText] of Object.entries(self.columnFilters)) {\n const header = self.getHeaderByName(headerName);\n\n if (!header) {\n continue;\n }\n\n const currentFilterFunction =\n header.filter || self.filter(header.type || 'string');\n\n newViewData = newViewData.filter(function ([row, originalRowIndex]) {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.filterFrozenRows &&\n originalRowIndex < self.frozenRow\n )\n return true;\n\n return currentFilterFunction(row[headerName], filterText);\n });\n }\n\n //#region Hide rows from collapsed group\n /** @type {number[][]} */\n let collapsedGroups = [];\n for (let i = 0; i < self.groupedRows.length; i++) {\n const rows = self.groupedRows[i];\n for (let j = 0; j < rows.length; j++) {\n const r = rows[j];\n if (!r.collapsed) continue;\n collapsedGroups.push([r.from, r.to]);\n }\n }\n if (collapsedGroups.length > 0) {\n //#region merge groups\n collapsedGroups.sort((a, b) => a[0] - b[0]);\n let newLen = 0;\n const len = collapsedGroups.length;\n for (let i = 0; i < len; i++) {\n const r = collapsedGroups[i];\n if (i === len - 1) {\n collapsedGroups[newLen++] = r;\n break;\n }\n const to = r[1];\n const [from2, to2] = collapsedGroups[i + 1];\n if (from2 > to + 1) {\n collapsedGroups[newLen++] = r;\n continue;\n }\n collapsedGroups[i + 1] = r;\n if (to2 > to) collapsedGroups[i + 1][1] = to2;\n }\n collapsedGroups = collapsedGroups.slice(0, newLen);\n //#endregion merge groups\n\n //#region omit rows by groups\n let g = collapsedGroups.shift();\n for (let start = 0; start < newViewData.length; start++) {\n const it = newViewData[start][1];\n if (it < g[0]) continue;\n let end = start + 1;\n for (; end < newViewData.length; end++) {\n const it2 = newViewData[end][1];\n if (it2 > g[1]) break;\n }\n newViewData.splice(start, end - start);\n g = collapsedGroups.shift();\n if (!g) break;\n start--;\n }\n //#endregion omit rows by groups\n }\n //#endregion Hide rows from collapsed group\n\n // Apply sorting\n for (const column of self.orderings.columns) {\n const sortFn = column.sortFunction(column.orderBy, column.orderDirection);\n\n newViewData.sort(([rowA], [rowB, rowIndexB]) => {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.sortFrozenRows &&\n rowIndexB < self.frozenRow\n )\n return 0;\n return sortFn(rowA, rowB);\n });\n }\n\n return {\n viewData: newViewData.map(([row]) => row),\n boundRowIndexMap: new Map(\n newViewData.map(([_row, originalRowIndex], viewRowIndex) => [\n viewRowIndex,\n originalRowIndex,\n ]),\n ),\n };\n };\n self.refresh = function () {\n const { viewData, boundRowIndexMap } = self.getFilteredAndSortedViewData(\n self.originalData,\n );\n\n self.viewData = viewData;\n self.boundRowIndexMap = boundRowIndexMap;\n\n self.resize();\n self.draw(true);\n };\n self.getBestGuessDataType = function (columnName, data) {\n var t,\n x,\n l = data.length;\n for (x = 0; x < l; x += 1) {\n if (\n data[x] !== undefined &&\n data[x] !== null &&\n [null, undefined].indexOf(data[x][columnName]) !== -1\n ) {\n t = typeof data[x];\n return t === 'object' ? 'string' : t;\n }\n }\n return 'string';\n };\n self.drawChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].draw();\n });\n };\n self.resizeChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].resize();\n });\n };\n self.autoScrollZone = function (e, x, y, ctrl) {\n var setTimer,\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n columnHeaderCellHeight = self.getColumnHeaderCellHeight();\n if (x !== -1) {\n if (x > self.width - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (x - self.attributes.selectionScrollZone - rowHeaderCellWidth < 0) {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (y !== -1) {\n if (y > self.height - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollTop += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (\n y - self.attributes.selectionScrollZone - columnHeaderCellHeight <\n 0\n ) {\n self.scrollBox.scrollTop -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (\n setTimer &&\n !ctrl &&\n self.currentCell &&\n self.currentCell.columnIndex !== -1\n ) {\n self.scrollTimer = setTimeout(\n self.mousemove,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.validateColumn = function (c, s) {\n if (!c.name) {\n throw new Error('A column must contain at least a name.');\n }\n if (\n s.filter(function (i) {\n return i.name === c.name;\n }).length > 0\n ) {\n throw new Error(\n 'A column with the name ' +\n c.name +\n ' already exists and cannot be added again.',\n );\n }\n return true;\n };\n self.setDefaults = function (obj1, obj2, key, def) {\n obj1[key] = obj2[key] === undefined ? def : obj2[key];\n };\n self.setAttributes = function () {\n self.defaults.attributes.forEach(function eachAttribute(i) {\n self.setDefaults(self.attributes, self.args, i[0], i[1]);\n });\n };\n self.setStyle = function () {\n self.defaults.styles.forEach(function eachStyle(i) {\n self.setDefaults(self.style, self.args.style || {}, i[0], i[1]);\n });\n };\n self.autosize = function (colName) {\n self.getVisibleSchema().forEach(function (col, colIndex) {\n if (col.name === colName || colName === undefined) {\n self.sizes.columns[colIndex] = Math.max(\n self.findColumnMaxTextLength(col.name),\n self.style.minColumnWidth,\n );\n }\n });\n self.sizes.columns[-1] = self.findColumnMaxTextLength('cornerCell');\n };\n self.dispose = function () {\n if (!self.isChildGrid && self.canvas && self.canvas.parentNode) {\n self.canvas.parentNode.removeChild(self.canvas);\n }\n if (!self.isChildGrid) {\n document.body.removeChild(self.controlInput);\n }\n self.eventParent.removeEventListener('mousedown', self.mousedown, false);\n self.eventParent.removeEventListener('dblclick', self.dblclick, false);\n self.eventParent.removeEventListener('click', self.click, false);\n self.eventParent.removeEventListener('mousemove', self.mousemove);\n self.eventParent.removeEventListener('wheel', self.scrollWheel, false);\n self.canvas.removeEventListener('contextmenu', self.contextmenu, false);\n self.canvas.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('cut', self.cut);\n self.controlInput.removeEventListener('paste', self.paste);\n self.controlInput.removeEventListener('keypress', self.keypress, false);\n self.controlInput.removeEventListener('keyup', self.keyup, false);\n self.controlInput.removeEventListener('keydown', self.keydown, false);\n window.removeEventListener('mouseup', self.mouseup, false);\n window.removeEventListener('mousemove', self.mousemove);\n window.removeEventListener('resize', self.resize);\n if (self.observer && self.observer.disconnect) {\n self.observer.disconnect();\n }\n };\n self.tryLoadStoredSettings = function () {\n var s;\n self.reloadStoredValues();\n if (\n self.storedSettings &&\n typeof self.storedSettings.orders === 'object' &&\n self.storedSettings.orders !== null\n ) {\n if (\n self.storedSettings.orders.rows.length >= (self.viewData || []).length\n ) {\n self.orders.rows = self.storedSettings.orders.rows;\n }\n s = self.getSchema();\n if (self.storedSettings.orders.columns.length === s.length) {\n self.orders.columns = self.storedSettings.orders.columns;\n }\n self.orderBy =\n self.storedSettings.orderBy === undefined\n ? s[0].name\n : self.storedSettings.orderBy;\n self.orderDirection =\n self.storedSettings.orderDirection === undefined\n ? 'asc'\n : self.storedSettings.orderDirection;\n if (\n self.storedSettings.orderBy !== undefined &&\n self.getHeaderByName(self.orderBy) &&\n self.orderDirection\n ) {\n self.order(self.orderBy, self.orderDirection);\n }\n }\n };\n self.toggleCollapseTree = function (rowIndex, columnIndex, type) {\n let tempData = [];\n let collapsedCount = 0;\n if (\n columnIndex == self.cellTree.rowTreeColIndex &&\n (rowIndex > 0 || (rowIndex == 0 && self.cellTree.rows[0].icon))\n ) {\n let ctr = self.cellTree.rows;\n switch (type) {\n case 'Expand':\n ctr[rowIndex].expand = true;\n self.cellTree.origin.rows[ctr[rowIndex].index].expand = true;\n break;\n\n case 'Collapse':\n ctr[rowIndex].expand = false;\n self.cellTree.origin.rows[ctr[rowIndex].index].expand = false;\n break;\n\n default:\n ctr[rowIndex].expand = !ctr[rowIndex].expand;\n self.cellTree.origin.rows[ctr[rowIndex].index].expand =\n ctr[rowIndex].expand;\n }\n for (\n let ri = ctr[rowIndex].index + 1;\n ri <= ctr[rowIndex].lastchild;\n ri++\n ) {\n let orTree = self.cellTree.origin.rows[ri];\n if (ctr[rowIndex].expand) {\n orTree.hide = false;\n if (orTree.icon && !orTree.expand) ri = orTree.lastchild;\n } else {\n orTree.hide = true;\n }\n }\n } else if (self.cellTree.columns[rowIndex]) {\n let ctc = self.cellTree.columns[rowIndex];\n\n switch (type) {\n case 'Expand':\n ctc[columnIndex].expand = true;\n break;\n\n case 'Collapse':\n ctc[columnIndex].expand = false;\n break;\n\n default:\n ctc[columnIndex].expand = !ctc[columnIndex].expand;\n }\n for (\n let ci = ctc[columnIndex].index + 1;\n ci <= ctc[columnIndex].lastchild;\n ci++\n ) {\n if (ctc[columnIndex].expand)\n self.cellTree.tempSchema[ci].hidden = false;\n else self.cellTree.tempSchema[ci].hidden = true;\n }\n let rc = 0,\n _ri;\n\n if (ctc[columnIndex].expand) {\n while (rc < ctc[columnIndex].child) {\n _ri = rowIndex + rc + 1;\n\n for (\n let _ci = ctc[columnIndex].index;\n _ci <= ctc[columnIndex].lastchild;\n _ci++\n ) {\n if (\n self.cellTree.origin.columns[_ri] &&\n self.cellTree.origin.columns[_ri][_ci].icon &&\n !self.cellTree.origin.columns[_ri][_ci].expand\n ) {\n for (\n let si = _ci + 1;\n si <= self.cellTree.origin.columns[_ri][_ci].lastchild;\n si++\n ) {\n self.cellTree.tempSchema[si].hidden = true;\n }\n }\n }\n\n rc++;\n }\n }\n }\n let otherData = {};\n let collapsed = [];\n self.cellTree.rows = [];\n self.cellTree.columns = {};\n for (let k in self.cellTree.origin.rows) {\n let tempRow = [];\n let tree = self.cellTree.origin.rows[k];\n if (!tree.hide) {\n let colTrees = [];\n let collapsedColCount = 0;\n if (k < self.cellTree.columnTreeRowStartIndex) {\n tempData.push(self.originalData[k]);\n } else {\n if (k > self.cellTree.columnTreeRowEndIndex) {\n otherData[k] = self.viewData[k];\n collapsedCount++;\n } else {\n for (let l = 0; l < self.originalData[k].length; l++) {\n if (!self.cellTree.tempSchema[l].hidden) {\n if (l < self.cellTree.rowTreeColIndex) {\n if (!Object.prototype.hasOwnProperty.call(otherData, k))\n otherData[k] = [];\n otherData[k].push(self.viewData[k][l]);\n }\n tempRow.push(self.originalData[k][l]);\n if (\n Object.prototype.hasOwnProperty.call(\n self.cellTree.origin.columns,\n k,\n )\n )\n colTrees.push(self.cellTree.origin.columns[k][l]);\n } else collapsedColCount++;\n }\n tempRow.push(\n ...Array(collapsedColCount)\n .fill()\n .map(function () {\n return '';\n }),\n );\n if (colTrees.length) {\n colTrees.push(\n ...Array(collapsedColCount)\n .fill()\n .map(() => {\n return {};\n }),\n );\n self.cellTree.columns[k] = colTrees;\n }\n tempData.push(tempRow);\n }\n }\n self.cellTree.rows.push(tree);\n } else {\n for (let l = 0; l < self.cellTree.rowTreeColIndex; l++) {\n tempRow.push(self.viewData[k][l]);\n }\n otherData[k] = tempRow;\n collapsed.push(\n Array(self.viewData[0].length)\n .fill()\n .map(function () {\n return '';\n }),\n );\n collapsedCount++;\n }\n }\n if (collapsedCount) {\n self.cellTree.rows.push(\n ...Array(collapsedCount)\n .fill()\n .map((u, index) => {\n return { index: self.cellTree.rows.length + index };\n }),\n );\n tempData.push(...collapsed);\n }\n for (let k in otherData) {\n if (k > self.cellTree.columnTreeRowEndIndex) tempData[k] = otherData[k];\n else\n for (let l in otherData[k]) {\n tempData[k][l] = otherData[k][l];\n }\n }\n self.viewData = tempData;\n };\n self.cellTreeExpandCollapse = function (rowIndex, columnIndex, type) {\n if (\n columnIndex == self.cellTree.rowTreeColIndex &&\n (rowIndex > 0 || (rowIndex == 0 && self.cellTree.rows[0].icon))\n ) {\n const ctr = self.cellTree.rows;\n switch (type) {\n case 'Expand':\n ctr[rowIndex].expand = true;\n break;\n case 'Collapse':\n ctr[rowIndex].expand = false;\n break;\n default:\n ctr[rowIndex].expand = !ctr[rowIndex].expand;\n }\n for (let ri = rowIndex + 1; ri <= ctr[rowIndex].lastchild; ri++) {\n if (ctr[rowIndex].expand) {\n ctr[ri].hide = false;\n if (ctr[ri].icon && !ctr[ri].expand) ri = ctr[ri].lastchild;\n } else {\n ctr[ri].hide = true;\n }\n }\n } else if (self.cellTree.columns[rowIndex]) {\n const ctc = self.cellTree.columns[rowIndex];\n switch (type) {\n case 'Expand':\n ctc[columnIndex].expand = true;\n break;\n case 'Collapse':\n ctc[columnIndex].expand = false;\n break;\n default:\n ctc[columnIndex].expand = !ctc[columnIndex].expand;\n }\n\n for (let ci = columnIndex + 1; ci <= ctc[columnIndex].lastchild; ci++) {\n if (ctc[columnIndex].expand) self.tempSchema[ci].hidden = false;\n else self.tempSchema[ci].hidden = true;\n }\n\n let rc = 0,\n ri;\n if (ctc[columnIndex].expand) {\n while (rc < ctc[columnIndex].child) {\n ri = rowIndex + rc + 1;\n for (let ci = columnIndex; ci <= ctc[columnIndex].lastchild; ci++) {\n if (\n self.cellTree.columns[ri] &&\n self.cellTree.columns[ri][ci].icon &&\n !self.cellTree.columns[ri][ci].expand\n ) {\n for (\n let si = ci + 1;\n si <= self.cellTree.columns[ri][ci].lastchild;\n si++\n )\n self.tempSchema[si].hidden = true;\n }\n }\n rc++;\n }\n }\n }\n };\n\n self.initCellTreeSettings = function () {\n if (self.viewData === undefined) return;\n if (self.attributes.rowTree.length > 0 && self.viewData.length > 0) {\n self.cellTree.rows = Array(self.viewData.length)\n .fill()\n .map((u, index) => ({ index: index }));\n self.cellTree.rowTreeColIndex = self.attributes.rowTreeColIndex;\n let invalidRowTree = false;\n for (let rt of self.attributes.rowTree) {\n if (self.cellTree.rows.length <= rt.end) {\n invalidRowTree = true;\n break;\n }\n\n for (let ri = rt.begin; ri <= rt.end; ri++) {\n if (ri == rt.begin) {\n self.cellTree.rows[ri].icon = true;\n self.cellTree.rows[ri].lastchild = rt.end;\n self.cellTree.rows[ri].expand = true;\n if (!self.cellTree.rows[ri].parentCount)\n self.cellTree.rows[ri].parentCount = 0;\n } else {\n self.cellTree.rows[ri].hide = false;\n self.cellTree.rows[ri].parentIndex = rt.begin;\n if (self.cellTree.rows[ri] && self.cellTree.rows[ri].parentCount)\n self.cellTree.rows[ri].parentCount += 1;\n else self.cellTree.rows[ri].parentCount = 1;\n }\n }\n }\n if (invalidRowTree) self.cellTree.rows = {};\n }\n if (self.attributes.columnTree.length > 0 && self.viewData.length > 0) {\n self.cellTree.columnTreeRowStartIndex =\n self.attributes.columnTreeRowStartIndex;\n self.cellTree.columnTreeRowEndIndex =\n self.attributes.columnTreeRowEndIndex;\n let dataColumnLength = Object.keys(self.viewData[0]).length;\n let invalidColumnTree = false;\n for (let ct of self.attributes.columnTree) {\n if (dataColumnLength <= ct.end) {\n invalidColumnTree = true;\n break;\n }\n\n if (!self.cellTree.columns[ct.row])\n self.cellTree.columns[ct.row] = Array(dataColumnLength)\n .fill()\n .map((u, index) => ({ index: index }));\n\n for (let i = ct.begin; i <= ct.end; i++) {\n const ctc = self.cellTree.columns[ct.row][i];\n if (i == ct.begin) {\n ctc.icon = true;\n ctc.lastchild = ct.end;\n ctc.length = ct.end - ct.begin;\n ctc.expand = true;\n if (ct.child) ctc.child = ct.child;\n else ctc.child = 0;\n }\n }\n }\n self.cellTree.tempSchema = Array(dataColumnLength)\n .fill()\n .map(function () {\n return { hidden: false };\n });\n if (invalidColumnTree) self.cellTree.columns = {};\n }\n self.cellTree.origin = {\n rows: self.cellTree.rows,\n columns: self.cellTree.columns,\n };\n };\n\n self.getDomRoot = function () {\n return self.shadowRoot ? self.shadowRoot.host : self.parentNode;\n };\n self.getFontName = function (fontStyle) {\n return fontStyle.replace(/\\d+\\.?\\d*px/, '');\n };\n self.getFontHeight = function (fontStyle) {\n return parseFloat(fontStyle, 10);\n };\n self.parseStyleValue = function (key) {\n if (/Font/.test(key)) {\n self.style[key + 'Height'] = self.getFontHeight(self.style[key]);\n self.style[key + 'Name'] = self.getFontName(self.style[key]);\n return;\n }\n // when inheriting styles from already instantiated grids, don't parse already parsed values.\n if (\n key === 'moveOverlayBorderSegments' &&\n typeof self.style[key] === 'string'\n ) {\n self.style[key] = self.style[key].split(',').map(function (i) {\n return parseInt(i, 10);\n });\n }\n };\n self.initProp = function (propName) {\n if (!self.args[propName]) {\n return;\n }\n Object.keys(self.args[propName]).forEach(function (key) {\n self[propName][key] = self.args[propName][key];\n });\n };\n self.getStyleProperty = function (key) {\n if (self.styleKeys.indexOf(key) === -1) {\n return self.parentNodeStyle[key];\n }\n return self.style[key];\n };\n self.setStyleProperty = function (key, value, supressDrawAndEvent) {\n var isDim =\n [\n 'height',\n 'width',\n 'minHeight',\n 'minWidth',\n 'maxHeight',\n 'maxWidth',\n ].indexOf(key) !== -1;\n if (self.styleKeys.indexOf(key) === -1) {\n self.parentNodeStyle[key] = value;\n } else {\n if (/-/.test(key)) {\n key = self.dehyphenateProperty(key);\n }\n self.style[key] = value;\n self.parseStyleValue(key);\n }\n if (isDim) {\n self.resize();\n }\n if (!supressDrawAndEvent) {\n self.draw(true);\n self.dispatchEvent('stylechanged', { name: 'style', value: value });\n }\n };\n self.reloadStoredValues = function () {\n if (self.attributes.name && self.attributes.saveAppearance) {\n try {\n self.storedSettings = localStorage.getItem(\n self.storageName + '-' + self.attributes.name,\n );\n } catch (e) {\n console.warn('Error loading stored values. ' + e.message);\n self.storedSettings = undefined;\n }\n if (self.storedSettings) {\n try {\n self.storedSettings = JSON.parse(self.storedSettings);\n } catch (e) {\n console.warn('could not read settings from localStore', e);\n self.storedSettings = undefined;\n }\n }\n if (self.storedSettings) {\n if (\n typeof self.storedSettings.sizes === 'object' &&\n self.storedSettings.sizes !== null\n ) {\n self.sizes.rows = self.storedSettings.sizes.rows;\n self.sizes.columns = self.storedSettings.sizes.columns;\n ['trees', 'columns', 'rows'].forEach(function (i) {\n if (!self.sizes[i]) {\n self.sizes[i] = {};\n }\n });\n }\n if (typeof self.storedSettings.visibility === 'object') {\n self.getSchema().forEach(function (column) {\n if (\n self.storedSettings.visibility &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n }\n }\n };\n self.init = function () {\n if (self.initialized) {\n return;\n }\n function addStyleKeyIfNoneExists(key) {\n if (self.styleKeys.indexOf(key) === -1) {\n self.styleKeys.push(key);\n }\n }\n var publicStyleKeyIntf = {};\n self.setAttributes();\n self.setStyle();\n self.initScrollBox();\n self.setDom();\n self.nodeType = 'canvas-datagrid';\n self.ie = /Trident/.test(window.navigator.userAgent);\n self.edge = /Edge/.test(window.navigator.userAgent);\n self.webKit = /WebKit/.test(window.navigator.userAgent);\n self.moz = /Gecko/.test(window.navigator.userAgent);\n self.mobile = /Mobile/i.test(window.navigator.userAgent);\n self.blankValues = [undefined, null, ''];\n self.cursorGrab = 'grab';\n self.cursorGrabing = 'grabbing';\n self.cursorGrab = self.webKit ? '-webkit-grab' : self.cursorGrab;\n self.cursorGrabing = self.moz ? '-webkit-grabbing' : self.cursorGrabbing;\n self.pointerLockPosition = { x: 0, y: 0 };\n Object.keys(self.style).forEach(self.parseStyleValue);\n self.intf.moveSelection = self.moveSelection;\n self.intf.deleteSelectedData = self.deleteSelectedData;\n self.intf.moveTo = self.moveTo;\n self.intf.addEventListener = self.addEventListener;\n self.intf.removeEventListener = self.removeEventListener;\n self.intf.dispatchEvent = self.dispatchEvent;\n /**\n * Releases grid resources and removes grid elements.\n * @memberof canvasDatagrid\n * @name dispose\n * @method\n */\n self.intf.dispose = self.dispose;\n /**\n * Appends the grid to another element later. Not implemented.\n * @memberof canvasDatagrid\n * @name appendTo\n * @method\n * @param {number} el The element to append the grid to.\n */\n self.intf.appendTo = self.appendTo;\n self.intf.getVisibleCellByIndex = self.getVisibleCellByIndex;\n self.intf.filters = self.filters;\n self.intf.sorters = self.sorters;\n self.intf.autosize = self.autosize;\n self.intf.beginEditAt = self.beginEditAt;\n self.intf.endEdit = self.endEdit;\n self.intf.setActiveCell = self.setActiveCell;\n self.intf.forEachSelectedCell = self.forEachSelectedCell;\n self.intf.scrollIntoView = self.scrollIntoView;\n self.intf.clearChangeLog = self.clearChangeLog;\n self.intf.gotoCell = self.gotoCell;\n self.intf.gotoRow = self.gotoRow;\n self.intf.addButton = self.addButton;\n self.intf.toggleCellCollapseTree = self.toggleCellCollapseTree;\n self.intf.expandCollapseCellTree = self.expandCollapseCellTree;\n self.intf.getHeaderByName = self.getHeaderByName;\n self.intf.findColumnScrollLeft = self.findColumnScrollLeft;\n self.intf.findRowScrollTop = self.findRowScrollTop;\n self.intf.fitColumnToValues = self.fitColumnToValues;\n self.intf.findColumnMaxTextLength = self.findColumnMaxTextLength;\n self.intf.disposeContextMenu = self.disposeContextMenu;\n self.intf.getCellAt = self.getCellAt;\n self.intf.groupColumns = self.groupColumns;\n self.intf.groupRows = self.groupRows;\n self.intf.removeGroupColumns = self.removeGroupColumns;\n self.intf.removeGroupRows = self.removeGroupRows;\n self.intf.toggleGroupColumns = self.toggleGroupColumns;\n self.intf.toggleGroupRows = self.toggleGroupRows;\n self.intf.getGroupsColumnBelongsTo = self.getGroupsColumnBelongsTo;\n self.intf.getGroupsRowBelongsTo = self.getGroupsRowBelongsTo;\n self.intf.isCellVisible = self.isCellVisible;\n self.intf.isRowVisible = self.isRowVisible;\n self.intf.isColumnVisible = self.isColumnVisible;\n self.intf.order = self.order;\n self.intf.draw = self.draw;\n self.intf.refresh = self.refresh;\n self.intf.isComponent = self.isComponent;\n self.intf.selectArea = self.selectArea;\n self.intf.clipElement = self.clipElement;\n self.intf.getSchemaFromData = self.getSchemaFromData;\n self.intf.setFilter = self.setFilter;\n self.intf.selectRow = self.selectRow;\n self.intf.parentGrid = self.parentGrid;\n self.intf.toggleTree = self.toggleTree;\n self.intf.expandTree = self.expandTree;\n self.intf.collapseTree = self.collapseTree;\n self.intf.canvas = self.canvas;\n self.intf.context = self.ctx;\n self.intf.insertRow = self.insertRow;\n self.intf.deleteRow = self.deleteRow;\n self.intf.addRow = self.addRow;\n self.intf.insertColumn = self.insertColumn;\n self.intf.deleteColumn = self.deleteColumn;\n self.intf.addColumn = self.addColumn;\n self.intf.getClippingRect = self.getClippingRect;\n self.intf.setRowHeight = self.setRowHeight;\n self.intf.setColumnWidth = self.setColumnWidth;\n self.intf.resetColumnWidths = self.resetColumnWidths;\n self.intf.resetRowHeights = self.resetRowHeights;\n self.intf.resize = self.resize;\n self.intf.selectColumn = self.selectColumn;\n self.intf.selectRow = self.selectRow;\n self.intf.selectAll = self.selectAll;\n self.intf.selectNone = self.selectNone;\n self.intf.drawChildGrids = self.drawChildGrids;\n self.intf.assertPxColor = self.assertPxColor;\n self.intf.clearPxColorAssertions = self.clearPxColorAssertions;\n self.intf.integerToAlpha = self.integerToAlpha;\n self.intf.copy = self.copy;\n self.intf.cut = self.cut;\n self.intf.paste = self.paste;\n self.intf.setStyleProperty = self.setStyleProperty;\n self.intf.hideColumns = self.hideColumns;\n self.intf.unhideColumns = self.unhideColumns;\n self.intf.hideRows = self.hideRows;\n self.intf.unhideRows = self.unhideRows;\n Object.defineProperty(self.intf, 'defaults', {\n get: function () {\n return {\n styles: self.defaults.styles.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n attributes: self.defaults.attributes.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n };\n },\n });\n self.styleKeys = Object.keys(self.intf.defaults.styles);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, false);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, true);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.DOMStyles = window.getComputedStyle(document.body, null);\n self.styleKeys.concat(Object.keys(self.DOMStyles)).forEach(function (key) {\n // unless this line is here, Object.keys() will not work on <instance>.style\n publicStyleKeyIntf[key] = undefined;\n Object.defineProperty(publicStyleKeyIntf, key, {\n get: function () {\n return self.getStyleProperty(key);\n },\n set: function (value) {\n if (self.initialized) {\n self.appliedInlineStyles[key] = value;\n }\n self.setStyleProperty(key, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'shadowRoot', {\n get: function () {\n return self.shadowRoot;\n },\n });\n Object.defineProperty(self.intf, 'activeCell', {\n get: function () {\n return self.activeCell;\n },\n });\n Object.defineProperty(self.intf, 'hasFocus', {\n get: function () {\n return self.hasFocus;\n },\n });\n Object.defineProperty(self.intf, 'hasActiveFilters', {\n get: function () {\n return self.hasActiveFilters();\n },\n });\n Object.defineProperty(self.intf, 'style', {\n get: function () {\n return publicStyleKeyIntf;\n },\n set: function (valueObject) {\n Object.keys(valueObject).forEach(function (key) {\n self.setStyleProperty(key, valueObject[key], true);\n });\n self.draw(true);\n self.dispatchEvent('stylechanged', {\n name: 'style',\n value: valueObject,\n });\n },\n });\n Object.defineProperty(self.intf, 'attributes', { value: {} });\n Object.keys(self.attributes).forEach(function (key) {\n Object.defineProperty(self.intf.attributes, key, {\n get: function () {\n return self.attributes[key];\n },\n set: function (value) {\n self.attributes[key] = value;\n if (key === 'name') {\n self.tryLoadStoredSettings();\n }\n if (\n key === 'rowTree' ||\n key === 'columnTree' ||\n key === 'columnTreeRowEndIndex'\n ) {\n self.initCellTreeSettings();\n }\n self.draw(true);\n self.dispatchEvent('attributechanged', {\n name: key,\n value: value[key],\n });\n },\n });\n });\n self.filters.string = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n value = String(value);\n var filterRegExp,\n regEnd = /\\/(i|g|m)*$/,\n pattern = regEnd.exec(filterFor),\n flags = pattern ? pattern[0].substring(1) : '',\n flagLength = flags.length;\n self.invalidFilterRegEx = undefined;\n if (filterFor.substring(0, 1) === '/' && pattern) {\n try {\n filterRegExp = new RegExp(\n filterFor.substring(1, filterFor.length - (flagLength + 1)),\n flags,\n );\n } catch (e) {\n self.invalidFilterRegEx = e;\n return;\n }\n return filterRegExp.test(value);\n }\n return value.toString\n ? value\n .toString()\n .toLocaleUpperCase()\n .indexOf(filterFor.toLocaleUpperCase()) !== -1\n : false;\n };\n self.filters.number = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n if (!filterFor) {\n return true;\n }\n return value === filterFor;\n };\n ['formatters', 'filters', 'sorters'].forEach(self.initProp);\n self.applyComponentStyle(false, self.intf);\n self.reloadStoredValues();\n if (self.args.data) {\n self.intf.data = self.args.data;\n }\n if (self.intf.innerText || self.intf.textContent) {\n if (self.intf.dataType === 'application/x-canvas-datagrid') {\n self.intf.dataType = 'application/json+x-canvas-datagrid';\n }\n self.intf.data = self.intf.innerText || self.intf.textContent;\n }\n if (self.args.schema) {\n self.intf.schema = self.args.schema;\n }\n if (self.isChildGrid || !self.isComponent) {\n requestAnimationFrame(function () {\n self.resize(true);\n });\n } else {\n self.resize(true);\n }\n self.initialized = true;\n return self;\n };\n /**\n * Removes focus from the grid.\n * @memberof canvasDatagrid\n * @name blur\n * @method\n */\n self.intf.blur = function (e) {\n self.hasFocus = false;\n };\n /**\n * Focuses on the grid.\n * @memberof canvasDatagrid\n * @name focus\n * @method\n */\n self.intf.focus = function () {\n self.hasFocus = true;\n self.controlInput.focus();\n };\n if (self.shadowRoot || self.isChildGrid) {\n Object.defineProperty(self.intf, 'height', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.height;\n }\n return self.parentNode.height;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.height = value;\n } else {\n self.parentNode.height = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'width', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.width;\n }\n return self.parentNode.width;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.width = value;\n } else {\n self.parentNode.width = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'parentNode', {\n get: function () {\n return self.parentNode;\n },\n set: function (value) {\n if (!self.isChildGrid) {\n throw new TypeError(\n 'Cannot set property parentNode which has only a getter',\n );\n }\n self.parentNode = value;\n },\n });\n }\n Object.defineProperty(self.intf, 'visibleRowHeights', {\n get: function () {\n return self.visibleRowHeights;\n },\n });\n Object.defineProperty(self.intf, 'openChildren', {\n get: function () {\n return self.openChildren;\n },\n });\n Object.defineProperty(self.intf, 'childGrids', {\n get: function () {\n return Object.keys(self.childGrids).map(function (gridId) {\n return self.childGrids[gridId];\n });\n },\n });\n Object.defineProperty(self.intf, 'isChildGrid', {\n get: function () {\n return self.isChildGrid;\n },\n });\n Object.defineProperty(self, 'cursor', {\n get: function () {\n return self.parentNodeStyle.cursor;\n },\n set: function (value) {\n if (value === 'cell') {\n value = 'default';\n }\n if (self.currentCursor !== value) {\n self.parentNodeStyle.cursor = value;\n self.currentCursor = value;\n }\n },\n });\n Object.defineProperty(self.intf, 'orderDirection', {\n get: function () {\n return self.orderDirection;\n },\n set: function (value) {\n if (value !== 'desc') {\n value = 'asc';\n }\n self.orderDirection = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n Object.defineProperty(self.intf, 'orderBy', {\n get: function () {\n return self.orderBy;\n },\n set: function (value) {\n if (\n self.getSchema().find(function (col) {\n return col.name === value;\n }) === undefined\n ) {\n throw new Error('Cannot sort by unknown column name.');\n }\n self.orderBy = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n if (self.isComponent) {\n Object.defineProperty(self.intf, 'offsetHeight', {\n get: function () {\n return self.canvas.offsetHeight;\n },\n });\n Object.defineProperty(self.intf, 'offsetWidth', {\n get: function () {\n return self.canvas.offsetWidth;\n },\n });\n }\n Object.defineProperty(self.intf, 'scrollHeight', {\n get: function () {\n return self.scrollBox.scrollHeight;\n },\n });\n Object.defineProperty(self.intf, 'scrollWidth', {\n get: function () {\n return self.scrollBox.scrollWidth;\n },\n });\n Object.defineProperty(self.intf, 'scrollTop', {\n get: function () {\n return self.scrollBox.scrollTop;\n },\n set: function (value) {\n self.scrollBox.scrollTop = value;\n },\n });\n Object.defineProperty(self.intf, 'scrollLeft', {\n get: function () {\n return self.scrollBox.scrollLeft;\n },\n set: function (value) {\n self.scrollBox.scrollLeft = value;\n },\n });\n Object.defineProperty(self.intf, 'sizes', {\n get: function () {\n return self.sizes;\n },\n });\n Object.defineProperty(self.intf, 'parentDOMNode', {\n get: function () {\n return self.parentDOMNode;\n },\n });\n Object.defineProperty(self.intf, 'input', {\n get: function () {\n return self.input;\n },\n });\n Object.defineProperty(self.intf, 'controlInput', {\n get: function () {\n return self.controlInput;\n },\n });\n Object.defineProperty(self.intf, 'currentCell', {\n get: function () {\n return self.currentCell;\n },\n });\n Object.defineProperty(self.intf, 'visibleCells', {\n get: function () {\n return self.visibleCells;\n },\n });\n Object.defineProperty(self.intf, 'visibleRows', {\n get: function () {\n return self.visibleRows;\n },\n });\n Object.defineProperty(self.intf, 'selections', {\n get: function () {\n return self.selections;\n },\n });\n Object.defineProperty(self.intf, 'dragMode', {\n get: function () {\n return self.dragMode;\n },\n });\n Object.defineProperty(self.intf, 'changes', {\n get: function () {\n return self.changes;\n },\n });\n self.intf.formatters = self.formatters;\n Object.defineProperty(self.intf, 'dataType', {\n get: function () {\n return self.dataType;\n },\n set: function (value) {\n if (!self.parsers[value]) {\n throw new Error('No parser for MIME type ' + value);\n }\n self.dataType = value;\n },\n });\n self.eventNames.forEach(function (eventName) {\n Object.defineProperty(self.intf, 'on' + eventName, {\n get: function () {\n return self.componentL1Events[eventName];\n },\n set: function (value) {\n self.events[eventName] = [];\n self.componentL1Events[eventName] = value;\n if (!value) {\n return;\n }\n self.addEventListener(eventName, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'frozenRow', {\n get: function () {\n return self.frozenRow;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.visibleRows.length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible rows.',\n );\n }\n self.frozenRow = val;\n },\n });\n Object.defineProperty(self.intf, 'frozenColumn', {\n get: function () {\n return self.frozenColumn;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.getVisibleSchema().length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible columns.',\n );\n }\n self.frozenColumn = val;\n },\n });\n Object.defineProperty(self.intf, 'scrollIndexRect', {\n get: function () {\n return {\n top: self.scrollIndexTop,\n right: self.scrollIndexRight,\n bottom: self.scrollIndexBottom,\n left: self.scrollIndexLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'scrollPixelRect', {\n get: function () {\n return {\n top: self.scrollPixelTop,\n right: self.scrollPixelRight,\n bottom: self.scrollPixelBottom,\n left: self.scrollPixelLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'rowOrder', {\n get: function () {\n return self.orders.rows;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (!self.originalData || val.length < self.originalData.length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of rows.',\n );\n }\n self.orders.rows = val;\n },\n });\n Object.defineProperty(self.intf, 'columnOrder', {\n get: function () {\n return self.orders.columns;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (val.length < self.getSchema().length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of columns.',\n );\n }\n self.orders.columns = val;\n },\n });\n Object.defineProperty(self.intf, 'selectionBounds', {\n get: function () {\n return self.getSelectionBounds();\n },\n });\n Object.defineProperty(self.intf, 'selectedRows', {\n get: function () {\n return self.getSelectedData(true);\n },\n });\n Object.defineProperty(self.intf, 'selectedCells', {\n get: function () {\n return self.getSelectedData();\n },\n });\n Object.defineProperty(self.intf, 'visibleSchema', {\n get: function () {\n return self.getVisibleSchema().map(function eachDataRow(col) {\n return col;\n });\n },\n });\n Object.defineProperty(self.intf, 'treeGridAttributes', {\n get: function () {\n return self.treeGridAttributes;\n },\n set: function setTreeGridAttributes(value) {\n self.treeGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'cellGridAttributes', {\n get: function () {\n return self.cellGridAttributes;\n },\n set: function setCellGridAttributes(value) {\n self.cellGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'ctx', {\n get: function () {\n return self.ctx;\n },\n });\n Object.defineProperty(self.intf, 'schema', {\n get: function schemaGetter() {\n return self.getSchema();\n },\n set: function schemaSetter(value) {\n if (value === undefined) {\n // Issue #89 - allow schema to be set to initialized state\n self.schema = undefined;\n self.tempSchema = undefined;\n self.dispatchEvent('schemachanged', { schema: undefined });\n return;\n }\n if (!Array.isArray(value) || typeof value[0] !== 'object') {\n throw new Error('Schema must be an array of objects.');\n }\n if (value[0].name === undefined) {\n throw new Error(\n 'Expected schema to contain an object with at least a name property.',\n );\n }\n self.schema = value.map(function eachSchemaColumn(column, index) {\n column.width = column.width || self.style.cellWidth;\n column.filter = column.filter || self.filter(column.type);\n column.type = column.type || 'string';\n column.index = index;\n column.columnIndex = index;\n column.rowIndex = -1;\n return column;\n });\n self.tempSchema = undefined;\n self.createNewRowData();\n self.createColumnOrders();\n self.tryLoadStoredSettings();\n if (\n self.storedSettings &&\n typeof self.storedSettings.visibility === 'object'\n ) {\n self.schema.forEach(function hideEachSchemaColumn(column, index) {\n if (\n self.storedSettings &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n self.resize(true);\n self.dispatchEvent('schemachanged', { schema: self.schema });\n },\n });\n /**\n * Gets an array of currently registered MIME types.\n * @memberof canvasDatagrid\n * @name getDataTypes\n * @method\n */\n self.intf.getTypes = function () {\n return Object.keys(self.parsers);\n };\n self.parseInnerHtml = function (data) {\n if (!data || /^ +$/.test(data)) {\n return [];\n }\n try {\n data = JSON.parse(data);\n } catch (e) {\n console.warn(\n Error(\n 'Cannot parse application/json+x-canvas-datagrid formated data. ' +\n e.message +\n ' \\nNote: canvas-datagrid.innerHTML is for string data only. ' +\n 'Use the canvas-datagrid.data property to set object data.',\n ),\n );\n }\n return data;\n };\n self.parsers['application/json+x-canvas-datagrid'] = function (\n data,\n callback,\n ) {\n self.parsers['application/x-canvas-datagrid'](\n self.parseInnerHtml(data),\n function (data, schema) {\n return callback(data, schema);\n },\n );\n };\n self.parsers['application/x-canvas-datagrid'] = function (data, callback) {\n return callback(data);\n };\n self.intf.parsers = self.parsers;\n // send to dataType ETL function to extract from input data\n // and transform into native [{}, {}] format\n self.etl = function (data, callback) {\n if (!self.intf.parsers[self.dataType]) {\n throw new Error('Unsupported data type.');\n }\n self.intf.parsers[self.dataType](data, function (data, schema) {\n // set the unfiltered/sorted data array\n self.originalData = data;\n self.viewData = Array.from(self.originalData);\n\n if (Array.isArray(schema)) {\n self.schema = schema;\n }\n // Issue #89 - allow schema to be auto-created every time data is set\n if (self.attributes.autoGenerateSchema) {\n self.schema = self.getSchemaFromData(data);\n }\n if (!self.schema) {\n self.tempSchema = self.getSchemaFromData(data);\n }\n if (self.getSchema()) {\n self.createColumnOrders();\n }\n // apply filter, sort, etc to incoming dataset, set viewData:\n self.refresh();\n // empty data was set\n if (!self.schema && (self.originalData || []).length === 0) {\n self.tempSchema = [{ name: '' }];\n }\n self.fitColumnToValues('cornerCell', true);\n if (\n (self.tempSchema && !self.schema) ||\n self.attributes.autoGenerateSchema\n ) {\n self.createColumnOrders();\n self.dispatchEvent('schemachanged', { schema: self.tempSchema });\n }\n callback();\n });\n };\n Object.defineProperty(self.intf, 'viewData', {\n get: function () {\n return self.viewData;\n },\n });\n Object.defineProperty(self.intf, 'boundData', {\n get: function () {\n return self.originalData;\n },\n });\n Object.defineProperty(self.intf, 'data', {\n get: function dataGetter() {\n return self.originalData;\n },\n set: function dataSetter(value) {\n self.etl(value, function () {\n self.changes = [];\n self.createNewRowData();\n if (\n self.attributes.autoResizeColumns &&\n self.originalData.length > 0 &&\n self.storedSettings === undefined\n ) {\n self.autosize();\n }\n // set the header column to fit the numbers in it\n self.fitColumnToValues('cornerCell', true);\n self.createRowOrders();\n self.tryLoadStoredSettings();\n self.dispatchEvent('datachanged', { data: self.originalData });\n self.initCellTreeSettings();\n self.resize(true);\n });\n },\n });\n self.initScrollBox = function () {\n var sHeight = 0,\n sWidth = 0,\n scrollTop = 0,\n scrollLeft = 0,\n scrollHeight = 0,\n scrollWidth = 0,\n scrollBoxHeight = 20,\n scrollBoxWidth = 20;\n function setScrollTop(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollTop value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollHeight) {\n value = scrollHeight;\n }\n if (scrollHeight < 0) {\n value = 0;\n }\n scrollTop = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n if (self.button) {\n self.moveButtonPos();\n }\n }\n function setScrollLeft(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollLeft value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollWidth) {\n value = scrollWidth;\n }\n if (scrollWidth < 0) {\n value = 0;\n }\n scrollLeft = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n if (self.button) {\n self.moveButtonPos();\n }\n }\n self.scrollBox.toString = function () {\n return (\n '{\"width\": ' +\n scrollWidth.toFixed(2) +\n ', \"height\": ' +\n scrollHeight.toFixed(2) +\n ', \"left\": ' +\n scrollLeft.toFixed(2) +\n ', \"top\": ' +\n scrollTop.toFixed(2) +\n ', \"widthRatio\": ' +\n self.scrollBox.widthBoxRatio.toFixed(5) +\n ', \"heightRatio\": ' +\n self.scrollBox.heightBoxRatio.toFixed(5) +\n '}'\n );\n };\n self.scrollBox.scrollTo = function (x, y, supressDrawEvent) {\n setScrollLeft(x, true);\n setScrollTop(y, supressDrawEvent);\n };\n Object.defineProperty(self.scrollBox, 'scrollBoxHeight', {\n get: function () {\n return scrollBoxHeight;\n },\n set: function (value) {\n scrollBoxHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollBoxWidth', {\n get: function () {\n return scrollBoxWidth;\n },\n set: function (value) {\n scrollBoxWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'height', {\n get: function () {\n return sHeight;\n },\n set: function (value) {\n sHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'width', {\n get: function () {\n return sWidth;\n },\n set: function (value) {\n sWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollTop', {\n get: function () {\n return scrollTop;\n },\n set: setScrollTop,\n });\n Object.defineProperty(self.scrollBox, 'scrollLeft', {\n get: function () {\n return scrollLeft;\n },\n set: setScrollLeft,\n });\n Object.defineProperty(self.scrollBox, 'scrollHeight', {\n get: function () {\n return scrollHeight;\n },\n set: function (value) {\n if (scrollTop > value) {\n scrollTop = Math.max(value, 0);\n }\n scrollHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollWidth', {\n get: function () {\n return scrollWidth;\n },\n set: function (value) {\n if (scrollLeft > value) {\n scrollLeft = Math.max(value, 0);\n }\n scrollWidth = value;\n },\n });\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n var zIndexTop, hoverScrollTimeout, autoCompleteContext;\n function applyContextItemStyle(contextItemContainer) {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n contextItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n });\n contextItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n }\n function createContextMenu(ev, pos, items, parentContextMenu) {\n var container = document.createElement('div'),\n upArrow = document.createElement('div'),\n downArrow = document.createElement('div'),\n children = [],\n selectedIndex = -1,\n intf = {},\n rect;\n if (!Array.isArray(items)) {\n throw new Error('createContextMenu expects an array.');\n }\n function createItems() {\n items.forEach(function (item) {\n var contextItemContainer = document.createElement('div'),\n childMenuArrow;\n function removeChildContext(e) {\n if (\n e.relatedTarget === container ||\n item.contextMenu.container === e.relatedTarget ||\n childMenuArrow === e.relatedTarget ||\n contextItemContainer === e.relatedTarget ||\n item.contextMenu.container.contains(e.relatedTarget)\n ) {\n return;\n }\n item.contextMenu.dispose();\n children.splice(children.indexOf(item.contextMenu), 1);\n item.contextMenu = undefined;\n contextItemContainer.removeEventListener(\n 'mouseout',\n removeChildContext,\n );\n container.removeEventListener('mouseout', removeChildContext);\n contextItemContainer.setAttribute('contextOpen', '0');\n contextItemContainer.setAttribute('opening', '0');\n }\n function contextAddCallback(items) {\n // check yet again if the user hasn't moved off\n if (\n contextItemContainer.getAttribute('opening') !== '1' ||\n contextItemContainer.getAttribute('contextOpen') === '1'\n ) {\n return;\n }\n var cPos = contextItemContainer.getBoundingClientRect();\n cPos = {\n left:\n cPos.left +\n self.style.childContextMenuMarginLeft +\n container.offsetWidth,\n top: cPos.top + self.style.childContextMenuMarginTop,\n bottom: cPos.bottom,\n right: cPos.right,\n };\n item.contextMenu = createContextMenu(ev, cPos, items, intf);\n contextItemContainer.setAttribute('contextOpen', '1');\n contextItemContainer.addEventListener('mouseout', removeChildContext);\n container.addEventListener('mouseout', removeChildContext);\n children.push(item.contextMenu);\n }\n function createChildContext() {\n var i;\n if (contextItemContainer.getAttribute('contextOpen') === '1') {\n return;\n }\n contextItemContainer.setAttribute('opening', '1');\n if (typeof item.items === 'function') {\n i = item.items.apply(intf, [\n function (items) {\n contextAddCallback(items);\n },\n ]);\n if (i !== undefined && Array.isArray(i)) {\n contextAddCallback(i);\n }\n return;\n }\n contextAddCallback(item.items);\n }\n function addItem(item) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n if (typeof content === 'function') {\n return addContent(content(ev));\n }\n if (typeof content === 'object') {\n contextItemContainer.appendChild(content);\n return;\n }\n applyContextItemStyle(contextItemContainer);\n contextItemContainer.innerHTML = content;\n return;\n }\n addContent(item.title);\n item.contextItemContainer = contextItemContainer;\n if (\n (item.items && item.items.length > 0) ||\n typeof item.items === 'function'\n ) {\n childMenuArrow = document.createElement('div');\n self.createInlineStyle(\n childMenuArrow,\n 'canvas-datagrid-context-child-arrow',\n );\n childMenuArrow.innerHTML = self.style.childContextMenuArrowHTML;\n contextItemContainer.appendChild(childMenuArrow);\n contextItemContainer.addEventListener(\n 'mouseover',\n createChildContext,\n );\n contextItemContainer.addEventListener('mouseout', function () {\n contextItemContainer.setAttribute('opening', '0');\n });\n }\n if (item.click) {\n contextItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n });\n }\n }\n addItem(item);\n container.appendChild(contextItemContainer);\n });\n }\n function clickIndex(idx) {\n items[idx].contextItemContainer.dispatchEvent(new Event('click'));\n }\n function checkArrowVisibility() {\n if (container.scrollTop > 0) {\n self.parentDOMNode.appendChild(upArrow);\n } else if (upArrow.parentNode) {\n upArrow.parentNode.removeChild(upArrow);\n }\n if (\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight &&\n downArrow.parentNode\n ) {\n downArrow.parentNode.removeChild(downArrow);\n } else if (\n container.scrollHeight - container.offsetHeight > 0 &&\n !(\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight\n )\n ) {\n self.parentDOMNode.appendChild(downArrow);\n }\n }\n function fade(element) {\n var opacity = 1;\n var timer = setInterval(function () {\n if (opacity <= 0.1) {\n clearInterval(timer);\n element.style.display = 'none';\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n }\n element.style.opacity = opacity;\n element.style.filter = 'alpha(opacity=' + opacity * 100 + ')';\n opacity -= opacity * 0.1;\n }, self.attributes.animationDurationHideContextMenu * 0.1);\n }\n function unfade(element) {\n var opacity = 0.1;\n element.style.display = 'block';\n var timer = setInterval(function () {\n if (opacity >= 1) {\n clearInterval(timer);\n }\n element.style.opacity = opacity;\n element.style.filter = 'alpha(opacity=' + opacity * 100 + ')';\n opacity += opacity * 0.1;\n }, self.attributes.animationDurationShowContextMenu * 0.1);\n }\n function startHoverScroll(type) {\n return function t() {\n var a = self.attributes.contextHoverScrollAmount;\n if (type === 'up' && container.scrollTop === 0) {\n return;\n }\n if (type === 'down' && container.scrollTop === container.scrollHeight) {\n return;\n }\n container.scrollTop += type === 'up' ? -a : a;\n hoverScrollTimeout = setTimeout(\n t,\n self.attributes.contextHoverScrollRateMs,\n type,\n );\n };\n }\n function endHoverScroll(type) {\n return function () {\n clearTimeout(hoverScrollTimeout);\n };\n }\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n if (zIndexTop === undefined) {\n zIndexTop = self.style.contextMenuZIndex;\n }\n createItems();\n self.createInlineStyle(\n container,\n 'canvas-datagrid-context-menu' + (self.mobile ? '-mobile' : ''),\n );\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n container.style.opacity = 0;\n container.style.position = 'absolute';\n upArrow.style.color = self.style.contextMenuArrowColor;\n downArrow.style.color = self.style.contextMenuArrowColor;\n [upArrow, downArrow].forEach(function (el) {\n el.style.textAlign = 'center';\n el.style.position = 'absolute';\n el.style.zIndex = zIndexTop + 1;\n });\n container.style.zIndex = zIndexTop;\n if (parentContextMenu && parentContextMenu.inputDropdown) {\n container.style.maxHeight =\n window.innerHeight -\n loc.y -\n self.style.autocompleteBottomMargin +\n 'px';\n container.style.minWidth = pos.width + 'px';\n loc.y += pos.height;\n }\n if (self.mobile) {\n container.style.width = pos.width + 'px';\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n container.addEventListener('scroll', checkArrowVisibility);\n container.addEventListener('wheel', function (e) {\n if (self.hasFocus) {\n container.scrollTop += e.deltaY;\n container.scrollLeft += e.deltaX;\n }\n checkArrowVisibility();\n });\n upArrow.innerHTML = self.style.contextMenuArrowUpHTML;\n downArrow.innerHTML = self.style.contextMenuArrowDownHTML;\n container.appendChild(upArrow);\n document.body.appendChild(downArrow);\n document.body.appendChild(container);\n unfade(container);\n rect = container.getBoundingClientRect();\n // TODO: fix !(parentContextMenu && parentContextMenu.inputDropdown) state (autocomplete)\n if (rect.bottom > window.innerHeight) {\n if (!(parentContextMenu && parentContextMenu.inputDropdown)) {\n loc.y -=\n rect.bottom +\n self.style.contextMenuWindowMargin -\n window.innerHeight;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n if (\n container.offsetHeight >\n window.innerHeight - self.style.contextMenuWindowMargin\n ) {\n container.style.height =\n window.innerHeight - self.style.contextMenuWindowMargin * 2 + 'px';\n }\n }\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.contextMenuWindowMargin;\n }\n if (loc.x < 0) {\n loc.x = self.style.contextMenuWindowMargin;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n rect = container.getBoundingClientRect();\n upArrow.style.top = rect.top + 'px';\n downArrow.style.top =\n rect.top + rect.height - downArrow.offsetHeight + 'px';\n upArrow.style.left = rect.left + 'px';\n downArrow.style.left = rect.left + 'px';\n downArrow.style.width = container.offsetWidth + 'px';\n upArrow.style.width = container.offsetWidth + 'px';\n downArrow.addEventListener('mouseover', startHoverScroll('down'));\n downArrow.addEventListener('mouseout', endHoverScroll('down'));\n upArrow.addEventListener('mouseover', startHoverScroll('up'));\n upArrow.addEventListener('mouseout', endHoverScroll('up'));\n checkArrowVisibility();\n }\n intf.parentGrid = self.intf;\n intf.parentContextMenu = parentContextMenu;\n intf.container = container;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n intf.upArrow = upArrow;\n intf.downArrow = downArrow;\n intf.dispose = function () {\n clearTimeout(hoverScrollTimeout);\n children.forEach(function (c) {\n c.dispose();\n });\n [downArrow, upArrow, container].forEach(function (el) {\n fade(el);\n });\n };\n Object.defineProperty(intf, 'selectedIndex', {\n get: function () {\n return selectedIndex;\n },\n set: function (value) {\n if (typeof value !== 'number' || isNaN(value || !isFinite(value))) {\n throw new Error('Context menu selected index must be a sane number.');\n }\n selectedIndex = value;\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n }\n self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n },\n });\n return intf;\n }\n function createFilterContextMenuItems(e) {\n var filterContainer = document.createElement('div'),\n filterLabel = document.createElement('div'),\n filterAutoCompleteButton = document.createElement('button'),\n filterInput = document.createElement('input'),\n n =\n e.cell && e.cell.header\n ? e.cell.header.title || e.cell.header.name\n : '',\n iRect;\n function checkRegExpErrorState() {\n filterInput.style.background = self.style.contextFilterInputBackground;\n filterInput.style.color = self.style.contextFilterInputColor;\n if (self.invalidFilterRegEx) {\n filterInput.style.background =\n self.style.contextFilterInvalidRegExpBackground;\n filterInput.style.color = self.style.contextFilterInvalidRegExpColor;\n }\n }\n function fillAutoComplete() {\n var count = 0;\n var items = {};\n var blanksItem = [];\n\n self.viewData.forEach(function (row) {\n var cellValue =\n row[e.cell.header.name] == null\n ? row[e.cell.header.name]\n : String(row[e.cell.header.name]).trim();\n var value = self.blankValues.includes(cellValue)\n ? self.attributes.blanksText\n : cellValue;\n\n if (items[value] || count > self.attributes.maxAutoCompleteItems) {\n return;\n }\n count += 1;\n items[value] = {\n title: self.formatters[e.cell.header.type || 'string']({\n cell: { value: value },\n }),\n click: function (e) {\n filterInput.value = value;\n e.stopPropagation();\n filterInput.dispatchEvent(new Event('keyup'));\n self.disposeAutocomplete();\n return;\n },\n };\n });\n\n if (Object.keys(items).indexOf(self.attributes.blanksText) !== -1) {\n blanksItem.push(items[self.attributes.blanksText]);\n delete items[self.attributes.blanksText];\n }\n\n return blanksItem.concat(\n Object.keys(items).map(function (key) {\n return items[key];\n }),\n );\n }\n\n function createAutoCompleteContext(ev) {\n if (ev && ['ArrowDown', 'ArrowUp', 'Enter', 'Tab'].includes(ev.key)) {\n return;\n }\n\n var autoCompleteItems = fillAutoComplete();\n\n iRect = filterInput.getBoundingClientRect();\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n autoCompleteContext = createContextMenu(\n e,\n {\n left: iRect.left,\n top: iRect.top,\n right: iRect.right,\n bottom: iRect.bottom,\n height: iRect.height,\n width: iRect.width,\n },\n autoCompleteItems,\n { inputDropdown: true },\n );\n autoCompleteContext.selectedIndex = 0;\n }\n self.createInlineStyle(filterLabel, 'canvas-datagrid-context-menu-label');\n self.createInlineStyle(\n filterAutoCompleteButton,\n 'canvas-datagrid-context-menu-filter-button',\n );\n self.createInlineStyle(\n filterInput,\n 'canvas-datagrid-context-menu-filter-input',\n );\n checkRegExpErrorState();\n filterInput.onclick = self.disposeAutocomplete;\n filterInput.addEventListener('keydown', function (e) {\n if (e.key === 'ArrowDown') {\n autoCompleteContext.selectedIndex += 1;\n }\n\n if (e.key === 'ArrowUp') {\n autoCompleteContext.selectedIndex -= 1;\n }\n\n if (e.key === 'Enter') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n self.disposeContextMenu();\n }\n\n if (e.key === 'Tab') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.disposeContextMenu();\n }\n });\n filterInput.addEventListener('keyup', function () {\n self.setFilter(e.cell.header.name, filterInput.value);\n });\n filterInput.addEventListener('keyup', createAutoCompleteContext);\n ['focus', 'blur', 'keydown', 'keyup', 'change'].forEach(function (en) {\n filterInput.addEventListener(en, checkRegExpErrorState);\n });\n filterInput.value = e.cell.header\n ? self.columnFilters[e.cell.header.name] || ''\n : '';\n filterLabel.innerHTML = self.attributes.filterOptionText.replace(/%s/g, n);\n filterAutoCompleteButton.onclick = function () {\n if (autoCompleteContext) {\n return self.disposeAutocomplete();\n }\n createAutoCompleteContext();\n };\n filterAutoCompleteButton.innerHTML = self.style.contextFilterButtonHTML;\n filterContainer.addEventListener('click', function (e) {\n return e.stopPropagation();\n });\n filterContainer.appendChild(filterLabel);\n filterContainer.appendChild(filterInput);\n filterContainer.appendChild(filterAutoCompleteButton);\n e.items.push({\n title: filterContainer,\n });\n if (Object.keys(self.columnFilters).length) {\n Object.keys(self.columnFilters).forEach(function (cf) {\n var h = self.getHeaderByName(cf);\n e.items.push({\n title: self.attributes.removeFilterOptionText.replace(\n /%s/g,\n h.title || h.name,\n ),\n click: function removeFilterClick(e) {\n e.preventDefault();\n self.setFilter(cf, '');\n self.controlInput.focus();\n },\n });\n });\n }\n }\n\n /**\n * Return a tuple if the user selected contiguous columns, otherwise `null`.\n * Info: Because the user may reorder the columns,\n * the schemaIndex of the first item may be greater than the schemaIndex of the second item,\n * but the columnIndex of the firs item must less than the columnIndex of the second item.\n * @param {any[]} schema from `self.getSchema()`\n * @returns {any[]} column schemas tuple (each schema has an additional field `schemaIndex`)\n */\n function getSelectedContiguousColumns(ev, schema) {\n const memoKey = '__contiguousColumns';\n if (Array.isArray(ev[memoKey]) || ev[memoKey] === null) return ev[memoKey];\n ev[memoKey] = null;\n\n if (!Array.isArray(self.selections) || self.selections.length === 0) return;\n const selection = self.selections[0];\n if (!selection || selection.length === 0) return;\n for (let rowIndex = 0; rowIndex < self.viewData.length; rowIndex++) {\n const row = self.viewData[rowIndex];\n if (!row) continue;\n const compare = self.selections[rowIndex];\n if (!compare) return;\n if (compare.length !== selection.length) return;\n for (let i = 0; i < selection.length; i++)\n if (selection[i] !== compare[i]) return;\n }\n selection.sort((a, b) => a - b);\n\n /** @type {number[][]} */\n const ranges = [];\n let begin = selection[0];\n let end = selection[0];\n for (let i = 1; i < selection.length; i++) {\n const orderIndex = selection[i];\n if (orderIndex === end + 1) {\n end = orderIndex;\n continue;\n }\n ranges.push([begin, end]);\n begin = orderIndex;\n end = orderIndex;\n }\n ranges.push([begin, end]);\n\n const currentOrderIndex = ev.cell.columnIndex;\n const matchedRange = ranges.find(\n (range) =>\n currentOrderIndex >= range[0] &&\n currentOrderIndex <= range[1] &&\n range[0] !== range[1],\n );\n if (!matchedRange) return;\n\n /** @type {number[]} orders[index] => columnIndex */\n const orders = self.orders.columns;\n if (!Array.isArray(orders)) return;\n\n const matchedSchema = matchedRange.map((orderIndex) => {\n const schemaIndex = orders[orderIndex];\n const thisSchema = schema[schemaIndex];\n return Object.assign({}, thisSchema, { orderIndex });\n });\n if (matchedSchema.findIndex((it) => !it) >= 0) return;\n return (ev[memoKey] = matchedSchema);\n }\n /**\n * @param {boolean} [allowOnlyOneRow]\n * @returns {number[]} a rowIndex tuple. It can contains one row index or two row indexes.\n */\n function getSelectedContiguousRows(allowOnlyOneRow) {\n let range = [];\n let prev = -2;\n let ok = true;\n self.selections.forEach(function (row, index) {\n if (!ok) return;\n if (prev < -1) {\n prev = index;\n range[0] = index;\n return;\n }\n if (index !== prev + 1 || !row || row.length === 0) {\n ok = false;\n return;\n }\n prev = index;\n range[1] = index;\n });\n if (ok) {\n if (range.length === 1) return allowOnlyOneRow ? range : null;\n return range;\n }\n }\n function addDefaultContextMenuItem(e) {\n const schema = self.getSchema();\n /**\n * A map between columnIndex and column data\n * @type {Map<string,any>}\n */\n let columns;\n const getColumnsMap = () => {\n if (!columns)\n columns = new Map(schema.map((_col) => [_col.columnIndex, _col]));\n return columns;\n };\n const isSorting =\n self.orderings.columns && self.orderings.columns.length > 0;\n\n const isNormalCell =\n !(\n e.cell.isBackground ||\n e.cell.isColumnHeaderCellCap ||\n e.cell.isScrollBar ||\n e.cell.isCorner ||\n e.cell.isRowHeader\n ) && e.cell.header;\n if (self.attributes.showFilter && isNormalCell) {\n createFilterContextMenuItems(e);\n }\n if (\n self.attributes.showCopy &&\n self.selections.reduce(function (p, r) {\n return p + r.length;\n }, 0) > 0\n ) {\n e.items.push({\n title: self.attributes.copyText,\n click: function () {\n document.execCommand('copy');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (self.attributes.showPaste && self.clipBoardData) {\n e.items.push({\n title: self.attributes.pasteText,\n click: function () {\n self.paste(self.clipBoardData, e.cell.columnIndex, e.cell.rowIndex);\n self.draw();\n },\n });\n }\n if (self.attributes.showColumnSelector) {\n e.items.push({\n title: self.attributes.columnSelectorText,\n items: function () {\n var d = [];\n self.getSchema().forEach(function (column) {\n function toggleColumnVisibility(e) {\n column.hidden = !column.hidden;\n self.dispatchEvent('togglecolumn', {\n column: column,\n hidden: column.hidden,\n });\n e.preventDefault();\n self.stopPropagation(e);\n self.disposeContextMenu();\n self.resize(true);\n self.setStorageData();\n }\n var el = document.createElement('div');\n applyContextItemStyle(el);\n el.addEventListener('touchstart', toggleColumnVisibility);\n el.addEventListener('click', toggleColumnVisibility);\n el.innerHTML =\n (column.hidden\n ? self.attributes.columnSelectorHiddenText\n : self.attributes.columnSelectorVisibleText) +\n (column.title || column.name);\n d.push({\n title: el,\n });\n });\n return d;\n },\n });\n if (e.cell && e.cell.header && e.cell.columnIndex > -1) {\n // This variable represents the order index because of the following codes from `draw.js`:\n // columnIndex: columnOrderIndex,\n const columnOrderIndex = e.cell.columnIndex;\n const columnIndex = self.orders.columns[columnOrderIndex];\n\n const contiguousColumns = getSelectedContiguousColumns(e, schema);\n let title = '';\n if (contiguousColumns) {\n title = contiguousColumns\n .map((col) => col.title || col.name)\n .join('-');\n } else {\n const column = schema[columnIndex];\n if (column) title = column.title || column.name;\n }\n e.items.push({\n title: self.attributes.hideColumnText.replace(/%s/gi, title),\n click: function (ev) {\n ev.preventDefault();\n self.stopPropagation(ev);\n self.disposeContextMenu();\n if (contiguousColumns) {\n self.hideColumns(\n contiguousColumns[0].orderIndex,\n contiguousColumns[1].orderIndex,\n );\n } else {\n self.hideColumns(columnOrderIndex);\n }\n },\n });\n }\n }\n if (\n self.attributes.saveAppearance &&\n self.attributes.showClearSettingsOption &&\n (Object.keys(self.sizes.rows).length > 0 ||\n Object.keys(self.sizes.columns).length > 0)\n ) {\n e.items.push({\n title: self.attributes.clearSettingsOptionText,\n click: function (e) {\n e.preventDefault();\n self.sizes.rows = {};\n self.sizes.columns = {};\n self.createRowOrders();\n self.createColumnOrders();\n self.storedSettings = undefined;\n self.dispatchEvent('resizecolumn', {\n columnWidth: self.style.cellWidth,\n });\n self.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\n });\n self.setStorageData();\n self.resize(true);\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (\n self.attributes.allowSorting &&\n self.attributes.showOrderByOption &&\n isNormalCell\n ) {\n e.items.push({\n title: self.attributes.showOrderByOptionTextAsc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'asc');\n self.controlInput.focus();\n },\n });\n e.items.push({\n title: self.attributes.showOrderByOptionTextDesc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'desc');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n\n //#region hide rows\n const canHideRows = !isSorting && e.cell.isRowHeader && e.cell.header;\n if (canHideRows) {\n const range = getSelectedContiguousRows(true);\n if (range) {\n const boundRowIndexes = range.map((viewRowIndex) =>\n self.getBoundRowIndexFromViewRowIndex(viewRowIndex),\n );\n let title;\n if (boundRowIndexes.length === 1) {\n if (typeof boundRowIndexes[0] === 'number')\n title = boundRowIndexes[0] + 1;\n else title = range[0] + 1;\n\n title = self.attributes.showHideRow.replace('%s', title);\n // hide one row\n e.items.push({\n title,\n click: function (ev) {\n ev.preventDefault();\n self.hideRows(boundRowIndexes[0], boundRowIndexes[0]);\n },\n });\n } else if (boundRowIndexes[0] <= boundRowIndexes[1]) {\n title = boundRowIndexes\n .map((it, index) => {\n if (typeof it === 'number') return it + 1;\n return range[index] + 1;\n })\n .join('-');\n title = self.attributes.showHideRows.replace('%s', title);\n // hide rows\n e.items.push({\n title,\n click: function (ev) {\n ev.preventDefault();\n self.hideRows(boundRowIndexes[0], boundRowIndexes[1]);\n },\n });\n }\n }\n }\n //#endregion hide rows\n\n //#region group/ungroup columns\n const groupAreaHeight = self.getColumnGroupAreaHeight();\n const groupAreaWidth = self.getRowGroupAreaWidth();\n const setCollapseStateForAllGroups = (allGroups, collapsed) => {\n if (allGroups.length === 0) return;\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let j = 0; j < groups.length; j++) {\n const group = groups[j];\n group.collapsed = collapsed;\n }\n }\n self.refresh();\n };\n if (e.pos && e.pos.y < groupAreaHeight) {\n e.items.push({\n title: self.attributes.showRemoveAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n self.groupedColumns = [];\n self.refresh();\n },\n });\n e.items.push({\n title: self.attributes.showExpandAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedColumns, false);\n },\n });\n e.items.push({\n title: self.attributes.showCollapseAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedColumns, true);\n },\n });\n }\n if (e.pos && e.pos.x < groupAreaWidth) {\n e.items.push({\n title: self.attributes.showRemoveAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n self.groupedRows = [];\n self.refresh();\n },\n });\n e.items.push({\n title: self.attributes.showExpandAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedRows, false);\n },\n });\n e.items.push({\n title: self.attributes.showCollapseAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedRows, true);\n },\n });\n }\n\n const canGroupByColumns =\n self.attributes.allowGroupingColumns &&\n e.cell.isColumnHeader &&\n e.cell.header &&\n e.cell.header.index > 0;\n const canUngroupColumns =\n self.attributes.allowGroupingColumns && e.cell.isColumnHeader;\n const canGroupByRows =\n !isSorting &&\n self.attributes.allowGroupingRows &&\n e.cell.isRowHeader &&\n e.cell.header;\n const canUngroupRows =\n self.attributes.allowGroupingRows && e.cell.isRowHeader;\n\n if (canGroupByColumns) {\n /** @type {number[]} */\n const groupIndexes = [];\n /** @type {number} */\n const headerIndex = e.cell.header.index;\n let col = headerIndex;\n for (; col >= 0; col--) {\n if (!self.isColumnSelected(col)) break;\n groupIndexes[0] = col;\n }\n for (col = headerIndex; ; col++) {\n if (!self.isColumnSelected(col)) break;\n groupIndexes[1] = col;\n }\n if (\n col !== headerIndex &&\n groupIndexes.length === 2 &&\n groupIndexes[1] > groupIndexes[0] &&\n self.isNewGroupRangeValid(\n self.groupedColumns,\n groupIndexes[0],\n groupIndexes[1],\n )\n ) {\n const columns = getColumnsMap();\n const groupTitles = [];\n const groupNames = [];\n for (let i = 0; i < groupIndexes.length; i++) {\n const columnIndex = groupIndexes[i];\n const column = columns.get(columnIndex);\n if (column) {\n groupNames.push(column.name);\n groupTitles.push(column.title || column.name || column.index);\n }\n }\n if (groupNames[0] && groupNames[1]) {\n // show group options\n e.items.push({\n title: self.attributes.showGroupColumns.replace(\n '%s',\n groupTitles[0] + '-' + groupTitles[1],\n ),\n click: function (ev) {\n ev.preventDefault();\n self.groupColumns(groupNames[0], groupNames[1]);\n self.controlInput.focus();\n },\n });\n }\n }\n }\n if (canUngroupColumns) {\n const columnIndex = e.cell.columnIndex;\n const groups = self.getGroupsColumnBelongsTo(columnIndex);\n const columns = getColumnsMap();\n for (let i = 0; i < groups.length; i++) {\n const { from, to } = groups[i];\n const cell0 = columns.get(from);\n const cell1 = columns.get(to);\n if (cell0 && cell1) {\n const formatArgs =\n (cell0.title || cell0.name || cell0.index) +\n '-' +\n (cell1.title || cell1.name || cell1.index);\n e.items.push({\n title: self.attributes.showRemoveGroupColumns.replace(\n '%s',\n formatArgs,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.removeGroupColumns(cell0.name, cell1.name);\n self.controlInput.focus();\n },\n });\n } else {\n console.warn(`Cannot find column ${from} or column ${to}`);\n }\n }\n }\n if (canGroupByRows) {\n const range = getSelectedContiguousRows(false) || [];\n const rangeTitle = range\n .map((rowIndex) => {\n const index = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n if (typeof index === 'number') return index + 1;\n return rowIndex + 1;\n })\n .join('-');\n if (\n range.length === 2 &&\n self.isNewGroupRangeValid(self.groupedRows, range[0], range[1])\n ) {\n e.items.push({\n title: self.attributes.showGroupRows.replace('%s', rangeTitle),\n click: function (ev) {\n ev.preventDefault();\n self.groupRows(range[0], range[1]);\n },\n });\n }\n }\n if (canUngroupRows) {\n const rowIndex = e.cell.rowIndex;\n const groups = self.getGroupsRowBelongsTo(rowIndex);\n for (let i = 0; i < groups.length; i++) {\n const { from, to } = groups[i];\n const rangeTitle = [from, to]\n .map((rowIndex) => {\n const index = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n if (typeof index === 'number') return index + 1;\n return rowIndex + 1;\n })\n .join('-');\n e.items.push({\n title: self.attributes.showRemoveGroupRows.replace('%s', rangeTitle),\n click: function (ev) {\n ev.preventDefault();\n self.removeGroupRows(from, to);\n self.controlInput.focus();\n },\n });\n }\n }\n //#endregion group/ungroup columns\n }\n self.disposeAutocomplete = function () {\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n };\n self.disposeContextMenu = function (event) {\n document.removeEventListener('click', self.disposeContextMenu);\n zIndexTop = self.style.contextMenuZIndex;\n self.disposeAutocomplete();\n if (self.contextMenu) {\n self.contextMenu.dispose();\n }\n self.contextMenu = undefined;\n if (event) {\n self.canvas.focus();\n self.mousedown(event);\n self.mouseup(event);\n }\n };\n self.contextmenuEvent = function (e, overridePos) {\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n // don't create context menu for parents if current position is located in child grid\n const children = Object.keys(self.childGrids);\n for (let i = 0; i < children.length; i++) {\n const childGrid = self.childGrids[children[i]];\n const parentNode = childGrid && childGrid.parentNode;\n if (!parentNode) continue;\n const { offsetLeft, offsetWidth, offsetTop, offsetHeight } = parentNode;\n if ((e.x >= offsetLeft && e.x <= offsetLeft + offsetWidth) === false)\n continue;\n if ((e.y >= offsetTop && e.y <= offsetTop + offsetHeight) === false)\n continue;\n return; // in child grid\n }\n // don't create context menu for child if current position is located in parent grid\n if (self.isChildGrid && self.parentNode) {\n //#region check is current child grid closed\n const childGridsOfParent = self.parentGrid && self.parentGrid.childGrids;\n if (!childGridsOfParent || !Array.isArray(childGridsOfParent)) return;\n const matchedMe = childGridsOfParent.find((grid) => {\n const nodeA = grid.parentNode;\n const nodeB = self.parentNode;\n return (\n nodeA.offsetTop == nodeB.offsetTop &&\n nodeA.offsetLeft === nodeB.offsetLeft\n );\n });\n if (!matchedMe) return;\n //#endregion\n\n let x0 = self.parentNode.offsetLeft;\n let x1 = self.parentNode.offsetLeft + self.parentNode.offsetWidth;\n let y0 = self.parentNode.offsetTop;\n let y1 = self.parentNode.offsetTop + self.parentNode.offsetHeight;\n let node = self.parentNode.parentNode;\n while (node) {\n const { offsetLeft, offsetWidth, offsetTop, offsetHeight } = node;\n if (offsetLeft > x0) x0 = offsetLeft;\n if (offsetTop > y0) y0 = offsetTop;\n const newX1 = offsetLeft + offsetWidth;\n const newY1 = offsetTop + offsetHeight;\n if (newX1 < x1) x1 = newX1;\n if (newY1 < y1) y1 = newY1;\n if (node.nodeType !== 'canvas-datagrid-tree') break;\n node = node.parentNode;\n }\n if ((e.x >= x0 && e.x <= x1 && e.y >= y0 && e.y <= y1) === false) return;\n }\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeContextMenu);\n window.removeEventListener('mouseup', createDisposeEvent);\n });\n }\n var contextPosition,\n items = [],\n pos = overridePos || self.getLayerPos(e),\n ev = {\n NativeEvent: e,\n cell: self.getCellAt(pos.x, pos.y),\n pos,\n items: items,\n };\n if (!ev.cell.isGrid) {\n addDefaultContextMenuItem(ev);\n }\n if (e.type !== 'mousedown' && self.dispatchEvent('contextmenu', ev)) {\n return;\n }\n if (!ev.cell.isGrid) {\n if (self.contextMenu) {\n self.disposeContextMenu();\n }\n contextPosition = {\n left:\n pos.x +\n pos.rect.left +\n self.style.contextMenuMarginLeft +\n self.canvasOffsetLeft,\n top:\n pos.y +\n pos.rect.top +\n self.style.contextMenuMarginTop +\n self.canvasOffsetTop,\n right: ev.cell.width + ev.cell.x + pos.rect.left,\n bottom: ev.cell.height + ev.cell.y + pos.rect.top,\n height: ev.cell.height,\n width: ev.cell.width,\n };\n if (self.mobile) {\n contextPosition.left = self.style.mobileContextMenuMargin + 'px';\n contextPosition.width =\n self.width - self.style.mobileContextMenuMargin * 2 + 'px';\n }\n if (e.type == 'mousedown') {\n contextPosition.top += self.style.filterButtonMenuOffsetTop;\n }\n self.contextMenu = createContextMenu(ev, contextPosition, items);\n if (e.type == 'mousedown') {\n window.addEventListener('mouseup', createDisposeEvent);\n } else {\n createDisposeEvent();\n }\n e.preventDefault();\n }\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n let zIndexTop;\n\n function applyButtonMenuItemStyle(buttonMenuItemContainer) {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n buttonMenuItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item:hover',\n );\n });\n buttonMenuItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item',\n );\n });\n }\n\n function applyButtonStyle(button) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper');\n button.addEventListener('mouseover', function () {\n if (!self.buttonMenu) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper:hover');\n }\n });\n button.addEventListener('mouseout', function () {\n if (!self.buttonMenu) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper');\n }\n });\n }\n\n function createButton(pos, items, imgSrc) {\n var wrapper = document.createElement('div'),\n buttonArrow = document.createElement('div'),\n buttonIcon = document.createElement('div'),\n intf = {};\n\n if (!Array.isArray(items)) {\n throw new Error('createButton expects an array.');\n }\n\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n\n if (zIndexTop === undefined) {\n zIndexTop = self.style.buttonZIndex;\n }\n\n applyButtonStyle(wrapper);\n self.createInlineStyle(buttonIcon, 'canvas-datagrid-button-icon');\n self.createInlineStyle(buttonArrow, 'canvas-datagrid-button-arrow');\n\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n wrapper.style.position = 'absolute';\n wrapper.style.zIndex = zIndexTop;\n wrapper.style.left = loc.x + 'px';\n wrapper.style.top = loc.y + 'px';\n wrapper.left = pos.left + self.scrollBox.scrollLeft;\n wrapper.top = pos.top + self.scrollBox.scrollTop;\n buttonArrow.innerHTML = self.style.buttonArrowDownHTML;\n if (imgSrc) {\n let img = document.createElement('img');\n img.setAttribute('src', imgSrc);\n img.style.maxWidth = '100%';\n img.style.height = '100%';\n buttonIcon.appendChild(img);\n }\n wrapper.appendChild(buttonIcon);\n wrapper.appendChild(buttonArrow);\n document.body.appendChild(wrapper);\n wrapper.addEventListener('click', toggleButtonMenu);\n }\n\n intf.wrapper = wrapper;\n intf.items = items;\n init();\n\n intf.dispose = function () {\n if (wrapper.parentNode) {\n wrapper.parentNode.removeChild(wrapper);\n }\n };\n return intf;\n }\n\n function toggleButtonMenu() {\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeButtonMenu);\n });\n }\n if (self.buttonMenu) {\n self.disposeButtonMenu();\n } else {\n let pos = {\n left: self.button.wrapper.left - self.scrollBox.scrollLeft,\n top:\n self.button.wrapper.top +\n self.button.wrapper.offsetHeight -\n self.scrollBox.scrollTop,\n };\n self.buttonMenu = createButtonMenu(pos, self.button.items);\n self.createInlineStyle(\n self.button.wrapper,\n 'canvas-datagrid-button-wrapper:active',\n );\n createDisposeEvent();\n }\n }\n\n function createButtonMenu(pos, items) {\n var buttonMenu = document.createElement('div'),\n selectedIndex = -1,\n intf = {},\n rect;\n\n function createItems() {\n function addItem(item, menuItemContainer) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n\n if (typeof content === 'object') {\n menuItemContainer.appendChild(content);\n return;\n }\n\n applyButtonMenuItemStyle(menuItemContainer);\n menuItemContainer.innerHTML = content;\n return;\n }\n\n addContent(item.title);\n item.buttonMenuItemContainer = menuItemContainer;\n\n if (item.click) {\n menuItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n self.disposeButton();\n });\n }\n }\n\n for (let item of items) {\n var buttonMenuItemContainer = document.createElement('div');\n addItem(item, buttonMenuItemContainer);\n buttonMenu.appendChild(buttonMenuItemContainer);\n }\n }\n\n function clickIndex(idx) {\n items[idx].buttonMenuItemContainer.dispatchEvent(new Event('click'));\n }\n\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n\n if (zIndexTop === undefined) {\n zIndexTop = self.style.buttonZIndex;\n }\n\n createItems();\n self.createInlineStyle(\n buttonMenu,\n 'canvas-datagrid-button-menu' + (self.mobile ? '-mobile' : ''),\n );\n\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n buttonMenu.style.position = 'absolute';\n buttonMenu.style.zIndex = zIndexTop;\n buttonMenu.style.left = loc.x + 'px';\n buttonMenu.style.top = loc.y + 'px';\n document.body.appendChild(buttonMenu);\n rect = buttonMenu.getBoundingClientRect();\n\n if (rect.bottom > window.innerHeight) {\n loc.y =\n self.button.wrapper.top -\n buttonMenu.offsetHeight -\n self.scrollBox.scrollTop;\n if (loc.y < 0) {\n loc.y = self.style.buttonMenuWindowMargin;\n }\n\n if (\n buttonMenu.offsetHeight >\n window.innerHeight - self.style.buttonMenuWindowMargin\n ) {\n buttonMenu.style.height =\n window.innerHeight - self.style.buttonMenuWindowMargin * 2 + 'px';\n }\n }\n\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.buttonMenuWindowMargin;\n }\n\n if (loc.x < 0) {\n loc.x = self.style.buttonMenuWindowMargin;\n }\n\n if (loc.y < 0) {\n loc.y = self.style.buttonMenuWindowMargin;\n }\n\n buttonMenu.style.left = loc.x + 'px';\n buttonMenu.style.top = loc.y + 'px';\n }\n\n intf.buttonMenu = buttonMenu;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n\n intf.dispose = function () {\n if (buttonMenu.parentNode) {\n buttonMenu.parentNode.removeChild(buttonMenu);\n }\n };\n\n Object.defineProperty(intf, 'selectedIndex', {\n get: function get() {\n return selectedIndex;\n },\n set: function set(value) {\n if (typeof value !== 'number' || isNaN(value) || !isFinite(value)) {\n throw new Error('Button menu selected index must be a sane number.');\n }\n\n selectedIndex = value;\n\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item:hover',\n );\n }\n\n self.createInlineStyle(\n item.buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item',\n );\n });\n },\n });\n return intf;\n }\n\n self.disposeButtonMenu = function () {\n if (self.buttonMenu) {\n document.removeEventListener('click', self.disposeButtonMenu);\n self.buttonMenu.dispose();\n self.buttonMenu = undefined;\n self.createInlineStyle(\n self.button.wrapper,\n 'canvas-datagrid-button-wrapper:hover',\n );\n }\n };\n\n self.disposeButton = function (e) {\n if (e && e.keyCode !== 27) return;\n document.removeEventListener('keydown', self.disposeButton);\n zIndexTop = self.style.buttonZIndex;\n self.disposeButtonMenu();\n\n if (self.button) {\n self.button.dispose();\n }\n\n self.button = undefined;\n };\n\n self.moveButtonPos = function () {\n self.button.wrapper.style.left =\n self.button.wrapper.left - self.scrollBox.scrollLeft + 'px';\n self.button.wrapper.style.top =\n self.button.wrapper.top - self.scrollBox.scrollTop + 'px';\n self.disposeButtonMenu();\n };\n\n self.attachButton = function (pos, items, imgSrc) {\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('keydown', self.disposeButton);\n });\n }\n\n if (self.button) {\n self.disposeButton();\n }\n\n self.button = createButton(pos, items, imgSrc);\n createDisposeEvent();\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n self.getClippingRect = function (ele) {\n var boundingRect = self.position(self.parentNode),\n eleRect = self.position(ele),\n s = self.scrollOffset(self.canvas),\n clipRect = {\n x: 0,\n y: 0,\n h: 0,\n w: 0,\n },\n parentRect = {\n x: -Infinity,\n y: -Infinity,\n h: Infinity,\n w: Infinity,\n },\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n boundingRect.top -= s.top;\n boundingRect.left -= s.left;\n eleRect.top -= s.top;\n eleRect.left -= s.left;\n clipRect.h =\n boundingRect.top +\n boundingRect.height -\n ele.offsetTop -\n self.style.scrollBarWidth;\n clipRect.w =\n boundingRect.left +\n boundingRect.width -\n ele.offsetLeft -\n self.style.scrollBarWidth;\n clipRect.x = boundingRect.left + eleRect.left * -1 + rowHeaderCellWidth;\n clipRect.y = boundingRect.top + eleRect.top * -1 + columnHeaderCellHeight;\n return {\n x: clipRect.x > parentRect.x ? clipRect.x : parentRect.x,\n y: clipRect.y > parentRect.y ? clipRect.y : parentRect.y,\n h: clipRect.h < parentRect.h ? clipRect.h : parentRect.h,\n w: clipRect.w < parentRect.w ? clipRect.w : parentRect.w,\n };\n };\n self.clipElement = function (ele) {\n var clipRect = self.getClippingRect(ele);\n if (clipRect.w < 0) {\n clipRect.w = 0;\n }\n if (clipRect.h < 0) {\n clipRect.h = 0;\n }\n ele.style.clip =\n 'rect(' +\n clipRect.y +\n 'px,' +\n clipRect.w +\n 'px,' +\n clipRect.h +\n 'px,' +\n clipRect.x +\n 'px' +\n ')';\n // INFO https://developer.mozilla.org/en-US/docs/Web/CSS/clip\n // clip has been \"deprecated\" for clipPath. Of course nothing but chrome\n // supports clip path, so we'll keep using clip until someday clipPath becomes\n // more widely support. The code below works correctly, but setting clipPath and clip\n // at the same time has undesirable results.\n // ele.style.clipPath = 'polygon('\n // + clipRect.x + 'px ' + clipRect.y + 'px,'\n // + clipRect.x + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.y + 'px'\n // + ')';\n };\n self.scrollOffset = function (e) {\n var x = 0,\n y = 0,\n scrollingElement = document.scrollingElement || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n while (\n e.parentNode &&\n e.nodeName !== 'CANVAS-DATAGRID' &&\n e !== self.intf\n ) {\n if (\n e.nodeType !== 'canvas-datagrid-tree' &&\n e.nodeType !== 'canvas-datagrid-cell'\n ) {\n x -= e.scrollLeft;\n y -= e.scrollTop;\n }\n e = e.parentNode;\n }\n return {\n left: x - scrollingElement.scrollLeft,\n top: y - scrollingElement.scrollTop,\n };\n };\n self.resizeEditInput = function () {\n if (self.input && self.input.editCell) {\n var pos = self.canvas.getBoundingClientRect(),\n s = self.scrollOffset(self.intf),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n borderWidth = self.style.cellBorderWidth * bm,\n cell = self.getVisibleCellByIndex(\n self.input.editCell.columnIndex,\n self.input.editCell.rowIndex,\n ) || { x: -100, y: -100, height: 0, width: 0 };\n if (self.mobile) {\n self.input.style.left = '0';\n self.input.style.top =\n self.height -\n self.style.mobileEditInputHeight -\n borderWidth -\n 1 +\n 'px';\n self.input.style.height = self.style.mobileEditInputHeight + 'px';\n self.input.style.width = self.width - borderWidth - 1 + 'px';\n return;\n }\n let groupAreaOffsetY = self.getColumnGroupAreaHeight();\n let groupAreaOffsetX = self.getRowGroupAreaWidth();\n if (self.parentNode) {\n const { columnGroupsAreaHeight, rowGroupsAreaWidth } = self.parentNode;\n if (columnGroupsAreaHeight) groupAreaOffsetY += columnGroupsAreaHeight;\n if (rowGroupsAreaWidth) groupAreaOffsetX += rowGroupsAreaWidth;\n }\n self.input.style.left =\n pos.left +\n cell.x +\n self.canvasOffsetLeft -\n s.left +\n groupAreaOffsetX +\n 'px';\n self.input.style.top =\n pos.top +\n cell.y -\n self.style.cellBorderWidth +\n self.canvasOffsetTop -\n s.top +\n groupAreaOffsetY +\n 'px';\n self.input.style.height = cell.height - borderWidth + 'px';\n self.input.style.width = cell.width - self.style.cellPaddingLeft + 'px';\n self.clipElement(self.input);\n }\n };\n self.position = function (e, ignoreScrollOffset) {\n var x = 0,\n y = 0,\n s = e,\n h,\n w;\n let calculatedTree = false;\n while (e.offsetParent && e.nodeName !== 'CANVAS-DATAGRID') {\n const isTree = e.nodeType === 'canvas-datagrid-tree';\n if (!isTree || !calculatedTree) {\n x += e.offsetLeft;\n y += e.offsetTop;\n h = e.offsetHeight;\n w = e.offsetWidth;\n }\n if (isTree) calculatedTree = true;\n e = e.offsetParent;\n }\n if (ignoreScrollOffset) {\n return { left: x, top: y, height: h, width: w };\n }\n e = s;\n s = self.scrollOffset(e);\n return { left: x + s.left, top: y + s.top, height: h, width: w };\n };\n self.getLayerPos = function (e) {\n var rect = self.canvas.getBoundingClientRect(),\n pos = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n if (self.isChildGrid) {\n pos.x -= self.canvasOffsetLeft;\n pos.y -= self.canvasOffsetTop;\n if (self.parentNode.rowGroupsAreaWidth)\n pos.x -= self.parentNode.rowGroupsAreaWidth;\n if (self.parentNode.columnGroupsAreaHeight)\n pos.y -= self.parentNode.columnGroupsAreaHeight;\n }\n return {\n x: pos.x,\n y: pos.y,\n rect: rect,\n };\n };\n /**\n * Ends editing, optionally aborting the edit.\n * @memberof canvasDatagrid\n * @name endEdit\n * @method\n * @param {boolean} abort When true, abort the edit.\n */\n self.endEdit = function (abort) {\n var cell = self.input.editCell,\n y = cell.rowIndex;\n function abortEdit() {\n abort = true;\n }\n if (\n self.dispatchEvent('beforeendedit', {\n cell: cell,\n newValue: self.input.value,\n oldValue: cell.value,\n abort: abortEdit,\n input: self.input,\n })\n ) {\n return false;\n }\n if (self.input.value !== cell.value && !abort) {\n self.changes[y] = self.changes[y] || {};\n self.changes[y][cell.header.name] = self.input.value;\n if (!cell.data) {\n self.originalData[cell.boundRowIndex] = {};\n cell.data = self.originalData[cell.boundRowIndex];\n }\n cell.data[cell.header.name] = self.input.value;\n if (y === self.viewData.length) {\n if (\n self.dispatchEvent('newrow', {\n value: self.input.value,\n defaultValue: cell.value,\n aborted: abort,\n cell: cell,\n input: self.input,\n })\n ) {\n return false;\n }\n self.addRow(cell.data);\n self.createNewRowData();\n }\n self.draw(true);\n }\n if (self.input.parentNode) {\n self.input.parentNode.removeChild(self.input);\n }\n self.intf.focus();\n self.dispatchEvent('endedit', {\n cell: cell,\n value: self.input.value,\n aborted: abort,\n input: self.input,\n });\n self.input = undefined;\n return true;\n };\n /**\n * Begins editing at cell x, row y.\n * @memberof canvasDatagrid\n * @name beginEditAt\n * @method\n * @param {number} x The column index of the cell to edit.\n * @param {number} y The row index of the cell to edit.\n * @param {boolean} inEnterMode If true, starting to type in cell will replace the\n * cell's previous value instead of appending, and using the arrow keys will allow\n * the user to navigate to adjacent cells instead of moving the text cursor around\n * (default is false, and means user is in 'edit' mode).\n */\n self.beginEditAt = function (x, y, NativeEvent, inEnterMode = false) {\n if (!self.attributes.editable) {\n return;\n }\n if (self.input) {\n self.endEdit();\n }\n var cell = self.getVisibleCellByIndex(x, y),\n s = self.getSchema(),\n adjacentCells,\n enumItems,\n enu,\n option,\n valueInEnum;\n if (!(cell && cell.header)) {\n return;\n }\n //HACK for IE10, does not like literal enum\n enu = cell.header['enum'];\n if (\n self.dispatchEvent('beforebeginedit', {\n cell: cell,\n NativeEvent: NativeEvent,\n })\n ) {\n return false;\n }\n self.scrollIntoView(x, y);\n self.setActiveCell(x, y);\n adjacentCells = self.getAdjacentCells();\n if (enu) {\n self.input = document.createElement('select');\n } else {\n self.input = document.createElement(\n self.attributes.multiLine ? 'textarea' : 'input',\n );\n }\n cell = self.getVisibleCellByIndex(x, y);\n //HACK on mobile devices sometimes edit can begin without the cell being in view, I don't know how.\n if (!cell) {\n return;\n }\n if (enu) {\n // add enums\n if (typeof enu === 'function') {\n enumItems = enu.apply(self.intf, [{ cell: cell }]);\n } else if (Array.isArray(enu)) {\n enumItems = enu;\n }\n enumItems.forEach(function (e) {\n var i = document.createElement('option'),\n val,\n title;\n if (Array.isArray(e)) {\n val = e[0];\n title = e[1];\n } else {\n val = e;\n title = e;\n }\n if (val === cell.value) {\n valueInEnum = true;\n }\n i.value = val;\n i.innerHTML = title;\n self.input.appendChild(i);\n });\n if (!valueInEnum) {\n option = document.createElement('option');\n option.value = cell.value;\n option.innerHTML = cell.value;\n self.input.appendChild(option);\n }\n self.input.addEventListener('change', function () {\n self.endEdit();\n self.draw(true);\n });\n }\n // if the user has not prevented the default action, append to the body\n if (\n !self.dispatchEvent('appendeditinput', { cell: cell, input: self.input })\n ) {\n document.body.appendChild(self.input);\n }\n self.createInlineStyle(\n self.input,\n self.mobile\n ? 'canvas-datagrid-edit-mobile-input'\n : 'canvas-datagrid-edit-input',\n );\n self.input.style.position = 'absolute';\n self.input.editCell = cell;\n self.resizeEditInput();\n self.input.style.zIndex = self.style.editCellZIndex;\n self.input.style.fontSize =\n parseInt(self.style.editCellFontSize, 10) * self.scale + 'px';\n\n var cellValueIsEmpty = [null, undefined].indexOf(cell.value) !== -1;\n var shouldClearCellValue = cellValueIsEmpty || inEnterMode;\n\n self.input.value = shouldClearCellValue ? '' : cell.value;\n let width = Math.round(\n self.input.value.length *\n parseInt(self.style.editCellFontSize, 10) *\n 0.7 *\n self.scale,\n );\n if (width + self.style.cellPaddingLeft < cell.width) {\n width = cell.width - self.style.cellPaddingLeft;\n } else if (width > self.width - cell.x - self.style.scrollBarWidth) {\n width = self.width - cell.x - self.style.scrollBarWidth;\n self.input.style.height = 'auto';\n }\n self.input.style.width = width + 'px';\n self.input.focus();\n self.input.addEventListener('click', self.stopPropagation);\n self.input.addEventListener('dblclick', self.stopPropagation);\n self.input.addEventListener('mouseup', self.stopPropagation);\n self.input.addEventListener('mousedown', self.stopPropagation);\n self.input.addEventListener('keydown', function (e) {\n var nx = cell.columnIndex,\n ny = cell.rowIndex;\n\n if (e.key === 'Escape') {\n self.endEdit(true); // end edit and abort the value change\n self.draw(true);\n } else if (e.key === 'Enter' && self.attributes.multiLine && e.altKey) {\n self.input.value = self.input.value + '\\n';\n self.input.scrollTop = self.input.scrollHeight;\n } else if (e.key === 'Enter') {\n self.endEdit();\n\n // Move to cell in next or previous row\n var nextRowIndex = e.shiftKey\n ? Math.max(0, ny - 1)\n : Math.min(ny + 1, self.viewData.length - 1);\n\n if (nextRowIndex !== ny) {\n self.scrollIntoView(nx, nextRowIndex);\n self.setActiveCell(nx, nextRowIndex);\n }\n\n self.draw(true);\n } else if (\n ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key) &&\n inEnterMode\n ) {\n switch (e.key) {\n case 'ArrowUp':\n ny = Math.max(0, ny - 1);\n break;\n case 'ArrowDown':\n ny = Math.min(ny + 1, self.viewData.length - 1);\n break;\n case 'ArrowLeft':\n nx = Math.max(nx - 1, 0);\n break;\n case 'ArrowRight':\n nx = adjacentCells.right;\n break;\n }\n\n self.endEdit();\n\n self.scrollIntoView(nx, ny);\n self.setActiveCell(nx, ny);\n\n self.draw(true);\n } else if (e.key === 'Tab') {\n e.preventDefault();\n if (!self.endEdit()) {\n return;\n }\n if (e.shiftKey) {\n nx = adjacentCells.left;\n } else {\n nx = adjacentCells.right;\n }\n if (adjacentCells.left === x && e.shiftKey) {\n nx = adjacentCells.last;\n ny -= 1;\n }\n if (adjacentCells.right === x && !e.shiftKey) {\n nx = adjacentCells.first;\n ny += 1;\n }\n if (ny < 0) {\n ny = self.viewData.length - 1;\n }\n if (ny > self.viewData.length - 1) {\n ny = 0;\n }\n self.scrollIntoView(nx, ny);\n self.beginEditAt(nx, ny, e);\n } else {\n let width = Math.round(\n self.input.value.length *\n parseInt(self.style.editCellFontSize, 10) *\n 0.7 *\n self.scale,\n );\n if (width + self.style.cellPaddingLeft < cell.width) {\n width = cell.width - self.style.cellPaddingLeft;\n } else if (width > self.width - cell.x - self.style.scrollBarWidth) {\n width = self.width - cell.x - self.style.scrollBarWidth;\n self.input.style.height = 'auto';\n }\n self.input.style.width = width + 'px';\n }\n });\n\n self.dispatchEvent('beginedit', { cell: cell, input: self.input });\n };\n self.createInlineStyle = function (el, className) {\n var css = {\n 'canvas-datagrid-button-wrapper': {\n display: 'inline-block',\n padding: self.style.buttonPadding,\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: self.style.buttonBorderColor,\n cursor: 'pointer',\n background: self.style.buttonBackgroundColor,\n userSelect: 'none',\n },\n 'canvas-datagrid-button-wrapper:hover': {\n borderColor: self.style.buttonBorderColor,\n background: self.style.buttonHoverBackgroundColor,\n },\n 'canvas-datagrid-button-wrapper:active': {\n borderColor: self.style.buttonActiveBorderColor,\n background: self.style.buttonActiveBackgroundColor,\n },\n 'canvas-datagrid-button-icon': {\n width: '18px',\n height: '18px',\n display: 'inline-block',\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-arrow': {\n display: 'inline-block',\n color: self.style.buttonArrowColor,\n fontSize: '9px',\n },\n 'canvas-datagrid-button-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-button-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-button-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-button-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-context-menu-filter-input': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextFilterInputBackground,\n color: self.style.contextFilterInputColor,\n border: self.style.contextFilterInputBorder,\n borderRadius: self.style.contextFilterInputBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextFilterInputFontFamily,\n fontSize: self.style.contextFilterInputFontSize,\n },\n 'canvas-datagrid-context-menu-filter-button': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextFilterButtonBorder,\n borderRadius: self.style.contextFilterButtonBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFilterButtonFontFamily,\n fontSize: self.style.contextMenuFilterButtonFontSize,\n },\n 'canvas-datagrid-context-child-arrow': {\n cssFloat: 'right',\n color: self.style.childContextMenuArrowColor,\n fontSize: self.style.contextMenuChildArrowFontSize,\n fontFamily: self.style.contextMenuFontFamily,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-autocomplete': {\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n position: 'absolute',\n zIndex: 9999,\n overflow: 'hidden',\n },\n 'canvas-datagrid-autocomplete-item': {\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n },\n 'canvas-datagrid-autocomplete-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-canvas': {\n position: 'absolute',\n zIndex: '-1',\n },\n 'canvas-datagrid': {\n display: 'block',\n },\n 'canvas-datagrid-control-input': {\n position: 'fixed',\n top: '-5px',\n left: '-5px',\n border: 'none',\n opacity: '0',\n cursor: 'pointer',\n width: '1px',\n height: '1px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n },\n 'canvas-datagrid-edit-mobile-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 0',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.mobileEditFontFamily,\n fontSize: self.style.mobileEditFontSize,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-edit-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 ' + self.style.editCellPaddingLeft + 'px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.editCellFontFamily,\n fontSize: self.style.editCellFontSize,\n boxShadow: self.style.editCellBoxShadow,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-context-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-context-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-context-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-context-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-invalid-search-regExp': {\n background: self.style.contextMenuFilterInvalidExpresion,\n },\n };\n if (css[className]) {\n Object.keys(css[className]).map(function (prop) {\n el.style[prop] = css[className][prop];\n });\n }\n return;\n };\n self.appendTo = function (e) {\n self.parentNode = e;\n self.setDom();\n };\n self.setDom = function () {\n if (self.isChildGrid) {\n self.parentGrid = self.parentNode.parentGrid;\n self.ctx = self.parentGrid.context;\n self.canvas = self.parentGrid.canvas;\n self.controlInput = self.parentGrid.controlInput;\n self.eventParent = self.canvas;\n } else {\n self.controlInput = self.controlInput || document.createElement('input');\n self.controlInput.onblur = self.intf.blur;\n self.createInlineStyle(\n self.controlInput,\n 'canvas-datagrid-control-input',\n );\n self.isChildGrid = false;\n self.parentDOMNode = self.parentNode;\n self.parentIsCanvas = /^canvas$/i.test(self.parentDOMNode.tagName);\n if (self.parentIsCanvas) {\n self.canvas = self.parentDOMNode;\n } else {\n self.canvas = document.createElement('canvas');\n self.parentDOMNode.appendChild(self.canvas);\n }\n document.body.appendChild(self.controlInput);\n self.createInlineStyle(self.canvas, 'canvas-datagrid');\n self.ctx = self.canvas.getContext('2d');\n self.ctx.textBaseline = 'alphabetic';\n self.eventParent = self.canvas;\n }\n self.parentNodeStyle = self.canvas.style;\n self.controlInput.setAttribute('readonly', true);\n self.controlInput.addEventListener('blur', function (e) {\n if (e.target !== self.canvas) {\n self.hasFocus = false;\n }\n });\n self.eventParent.addEventListener('scroll', self.resize, false);\n self.eventParent.addEventListener('touchstart', self.touchstart, false);\n self.eventParent.addEventListener('mousedown', self.mousedown, false);\n self.eventParent.addEventListener('dblclick', self.dblclick, false);\n self.eventParent.addEventListener('click', self.click, false);\n window.addEventListener('mouseup', self.mouseup, false);\n window.addEventListener('mousemove', self.mousemove);\n self[self.isChildGrid ? 'parentGrid' : 'eventParent'].addEventListener(\n 'wheel',\n self.scrollWheel,\n false,\n );\n self.canvas.addEventListener('contextmenu', self.contextmenuEvent, false);\n self.controlInput.addEventListener('copy', self.copy);\n self.controlInput.addEventListener('cut', self.cut);\n self.controlInput.addEventListener('paste', self.paste);\n self.controlInput.addEventListener('keypress', self.keypress, false);\n self.controlInput.addEventListener('keyup', self.keyup, false);\n self.controlInput.addEventListener('keydown', self.keydown, false);\n window.addEventListener('resize', self.resize);\n };\n}\n","'use strict';\n\n/**\n * Merge a new hidden row range into existed ranges array\n * @param {any[]} hiddenRowRanges tuples: Array<[bgeinRowIndex, endRowIndex]>\n * @param {number[]} newRange tuple: [beginRowIndex, endRowIndex]\n * @returns {boolean}\n */\nconst mergeHiddenRowRanges = function (hiddenRowRanges, newRange) {\n const [beginRowIndex, endRowIndex] = newRange;\n if (endRowIndex < beginRowIndex) return false;\n let inserted = false;\n for (let i = 0; i < hiddenRowRanges.length; i++) {\n const range = hiddenRowRanges[i];\n if (beginRowIndex > range[1] + 1) continue;\n if (beginRowIndex <= range[0] && endRowIndex >= range[0]) {\n hiddenRowRanges[i] = [beginRowIndex, Math.max(endRowIndex, range[1])];\n inserted = true;\n break;\n }\n if (beginRowIndex >= range[0]) {\n hiddenRowRanges[i] = [range[0], Math.max(endRowIndex, range[1])];\n inserted = true;\n break;\n }\n }\n if (!inserted) hiddenRowRanges.push([beginRowIndex, endRowIndex]);\n // merge intersections after sorting ranges\n hiddenRowRanges.sort((a, b) => a[0] - b[0]);\n for (let i = 0; i < hiddenRowRanges.length - 1; i++) {\n const range = hiddenRowRanges[i];\n const nextRange = hiddenRowRanges[i + 1];\n if (nextRange[0] <= range[1] + 1) {\n hiddenRowRanges[i] = [range[0], Math.max(range[1], nextRange[1])];\n hiddenRowRanges.splice(i + 1, 1);\n i--;\n }\n }\n return true;\n};\n\nexport { mergeHiddenRowRanges };\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport { mergeHiddenRowRanges } from './groups/util';\n\nexport default function (self) {\n /**\n * Converts a integer into a letter A - ZZZZZ...\n * @memberof canvasDatagrid\n * @name integerToAlpha\n * @method\n * @param {column} n The number to convert.\n */\n self.integerToAlpha = function (n) {\n var ordA = 'a'.charCodeAt(0),\n ordZ = 'z'.charCodeAt(0),\n len = ordZ - ordA + 1,\n s = '';\n while (n >= 0) {\n s = String.fromCharCode((n % len) + ordA) + s;\n n = Math.floor(n / len) - 1;\n }\n return s;\n };\n /**\n * Inserts a new column before the specified index into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name insertColumn\n * @method\n * @param {column} c The column to insert into the schema.\n * @param {number} index The index of the column to insert before.\n */\n self.insertColumn = function (c, index) {\n var s = self.getSchema();\n if (s.length < index) {\n throw new Error('Index is beyond the length of the schema.');\n }\n self.validateColumn(c, s);\n s.splice(index, 0, c);\n\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a column from the schema at the specified index.\n * @memberof canvasDatagrid\n * @name deleteColumn\n * @tutorial schema\n * @method\n * @param {number} index The index of the column to delete.\n */\n self.deleteColumn = function (index) {\n var schema = self.getSchema();\n\n // remove data matching this column name from data\n self.originalData.forEach(function (row) {\n delete row[schema[index].name];\n });\n\n schema.splice(index, 1);\n self.intf.schema = schema;\n\n self.refresh();\n };\n /**\n * Adds a new column into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name addColumn\n * @method\n * @param {column} c The column to add to the schema.\n */\n self.addColumn = function (c) {\n var s = self.getSchema();\n self.validateColumn(c, s);\n s.push(c);\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a row from the dataset at the specified index.\n * @memberof canvasDatagrid\n * @name deleteRow\n * @method\n * @param {number} index The index of the row to delete.\n */\n self.deleteRow = function (index) {\n self.originalData.splice(index, 1);\n self.setFilter();\n self.resize(true);\n };\n /**\n * Inserts a new row into the dataset before the specified index.\n * @memberof canvasDatagrid\n * @name insertRow\n * @method\n * @param {object} d data.\n * @param {number} index The index of the row to insert before.\n */\n self.insertRow = function (d, index) {\n if (self.originalData.length < index) {\n throw new Error('Index is beyond the length of the dataset.');\n }\n self.originalData.splice(index, 0, d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(self.originalData[index], c, index);\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Adds a new row into the dataset.\n * @memberof canvasDatagrid\n * @name addRow\n * @method\n * @param {object} d data.\n */\n self.addRow = function (d) {\n self.originalData.push(d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(\n self.originalData[self.originalData.length - 1],\n c,\n self.originalData.length - 1,\n );\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Sets the height of a given row by index number.\n * @memberof canvasDatagrid\n * @name setRowHeight\n * @method\n * @param {number} rowIndex The index of the row to set.\n * @param {number} height Height to set the row to.\n */\n self.setRowHeight = function (rowIndex, height) {\n self.sizes.rows[rowIndex] = height;\n self.draw(true);\n };\n /**\n * Sets the width of a given column by index number.\n * @memberof canvasDatagrid\n * @name setColumnWidth\n * @method\n * @param {number} colIndex The index of the column to set.\n * @param {number} width Width to set the column to.\n */\n self.setColumnWidth = function (colIndex, width) {\n self.sizes.columns[colIndex] = width;\n self.draw(true);\n };\n /**\n * Removes any changes to the width of the columns due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetColumnWidths\n * @tutorial schema\n * @method\n */\n self.resetColumnWidths = function () {\n self.sizes.columns = {};\n self.draw(true);\n };\n /**\n * Removes any changes to the height of the rows due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetRowHeights\n * @tutorial schema\n * @method\n */\n self.resetRowHeights = function () {\n self.sizes.rows = {};\n self.draw(true);\n };\n /**\n * Sets the value of the filter.\n * @memberof canvasDatagrid\n * @name setFilter\n * @method\n * @param {string} column Name of the column to filter.\n * @param {string} value The value to filter for.\n */\n self.setFilter = function (column, value) {\n if (column === undefined && value === undefined) {\n self.columnFilters = {};\n } else if (column && (value === '' || value === undefined)) {\n delete self.columnFilters[column];\n } else {\n self.columnFilters[column] = value;\n if (self.attributes.showFilterInCell) {\n self.filterable.rows.push(0);\n self.orders.columns.forEach(function (value, index) {\n self.filterable.columns.push(index);\n });\n }\n }\n if (!Object.keys(self.columnFilters).length) {\n self.filterable = {\n rows: [],\n columns: [],\n };\n }\n self.refresh();\n };\n /**\n * Returns the number of pixels to scroll down to line up with row rowIndex.\n * @memberof canvasDatagrid\n * @name findRowScrollTop\n * @method\n * @param {number} rowIndex The row index of the row to scroll find.\n */\n self.findRowScrollTop = function (rowIndex) {\n if (self.scrollCache.y[rowIndex] === undefined) {\n throw new RangeError(\n `Row index ${rowIndex} out of range: ${self.scrollCache.y.length}.`,\n );\n }\n return self.scrollCache.y[rowIndex];\n };\n /**\n * Returns the number of pixels to scroll to the left to line up with column columnIndex.\n * @memberof canvasDatagrid\n * @name findColumnScrollLeft\n * @method\n * @param {number} columnIndex The column index of the column to find.\n */\n self.findColumnScrollLeft = function (columnIndex) {\n var i = Math.max(columnIndex - 1, 0);\n if (self.scrollCache.x[i] === undefined) {\n throw new Error('Column index out of range.');\n }\n return (\n self.scrollCache.x[i] -\n self.getColumnWidth(self.orders.columns[columnIndex])\n );\n };\n /**\n * Scrolls to the cell at columnIndex x, and rowIndex y. If you define both rowIndex and columnIndex additional calculations can be made to center the cell using the target cell's height and width. Defining only one rowIndex or only columnIndex will result in simpler calculations.\n * @memberof canvasDatagrid\n * @name gotoCell\n * @method\n * @param {number} x The column index of the cell to scroll to.\n * @param {number} y The row index of the cell to scroll to.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.gotoCell = function (x, y, offsetX, offsetY) {\n var targetX = x === undefined ? undefined : self.findColumnScrollLeft(x),\n targetY = y === undefined ? undefined : self.findRowScrollTop(y),\n cell,\n sbw =\n self.scrollBox.width -\n (self.scrollBox.verticalBarVisible ? self.style.scrollBarWidth : 0),\n sbh =\n self.scrollBox.height -\n (self.scrollBox.horizontalBarVisible ? self.style.scrollBarWidth : 0);\n offsetX = offsetX === undefined ? 0 : offsetX;\n offsetY = offsetY === undefined ? 0 : offsetY;\n targetX -= sbw * offsetX;\n targetY -= sbh * offsetY;\n if (x !== undefined && y !== undefined) {\n self.scrollBox.scrollTo(targetX, targetY);\n requestAnimationFrame(function () {\n cell = self.getVisibleCellByIndex(x, y);\n // HACK: just don't offset if the target cell cannot be seen\n // TODO: offset does not work on very small grids, not sure why\n if (!cell) {\n return;\n }\n targetX += cell.width * offsetX;\n targetY += cell.height * offsetY;\n self.scrollBox.scrollTo(targetX, targetY);\n });\n } else if (x !== undefined) {\n self.scrollBox.scrollLeft = targetX;\n } else if (y !== undefined) {\n self.scrollBox.scrollTop = targetY;\n }\n };\n /**\n * Scrolls the row y.\n * @memberof canvasDatagrid\n * @name gotoRow\n * @method\n * @param {number} y The row index of the cell to scroll to.\n */\n self.gotoRow = function (y) {\n self.gotoCell(0, y);\n };\n /**\n * Add a button into the cell.\n * @memberof canvasDatagrid\n * @name addButton\n * @method\n * @param {number} columnIndex The column index of the cell to to add a button.\n * @param {number} rowIndex The row index of the cell to to add a button.\n * @param {object} offset Offset how far go away from cell.\n * @param {object} items a list of items to add into button menu.\n * @param {string} imgSrc icon path to add into button.\n */\n self.addButton = function (columnIndex, rowIndex, offset, items, imgSrc) {\n var cells = self.visibleCells.filter(function (c) {\n return c.sortColumnIndex === columnIndex && c.sortRowIndex === rowIndex;\n });\n\n self.attachButton(\n {\n top: cells[0].y + cells[0].height + offset.y,\n left: cells[0].x + cells[0].width + offset.x,\n },\n items,\n imgSrc,\n );\n };\n\n /**\n * Expand/Collapse CellTree.\n * @memberof canvasDatagrid\n * @name toggleCellCollapseTree\n * @method\n * @param {array} treeData The array of cellTree to expand or collapse.\n */\n\n self.toggleCellCollapseTree = function (treeData) {\n for (let type in treeData) {\n for (let t of treeData[type])\n if (t.length > 0) self.toggleCollapseTree(t[0], t[1], type);\n }\n self.draw();\n };\n\n /**\n * Expand/Collapse CellTree.\n * @memberof canvasDatagrid\n * @name expandCollapseCellTree\n * @method\n * @param {array} treeData The array of cellTree to expand or collapse.\n */\n\n self.expandCollapseCellTree = function (treeData) {\n for (let type in treeData) {\n for (let t of treeData[type])\n if (t.length > 0) self.cellTreeExpandCollapse(t[0], t[1], type);\n }\n self.draw();\n };\n\n /**\n * Scrolls the cell at cell x, row y into view if it is not already.\n * @memberof canvasDatagrid\n * @name scrollIntoView\n * @method\n * @param {number} x The column index of the cell to scroll into view.\n * @param {number} y The row index of the cell to scroll into view.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.scrollIntoView = function (x, y, offsetX, offsetY) {\n const matched = self.visibleCells.filter(function (cell) {\n return (\n (cell.rowIndex === y || y === undefined) &&\n (cell.columnIndex === x || x === undefined) &&\n cell.x > 0 &&\n cell.y > 0 &&\n cell.x + cell.width < self.width &&\n cell.y + cell.height < self.height\n );\n });\n if (matched.length === 1 && x !== undefined && y !== undefined) {\n // goto specific cell and its part be hidden by header\n if (\n matched[0].x < self.getRowHeaderCellWidth() ||\n matched[0].y < self.getColumnHeaderCellHeight()\n )\n matched.length = 0;\n }\n if (matched.length === 0) {\n self.gotoCell(x, y, offsetX, offsetY);\n }\n };\n /**\n * Sets the active cell. Requires redrawing.\n * @memberof canvasDatagrid\n * @name setActiveCell\n * @method\n * @param {number} x The column index of the cell to set active.\n * @param {number} y The row index of the cell to set active.\n */\n self.setActiveCell = function (x, y) {\n if (typeof x === 'undefined') return;\n if (x < 0) {\n x = 0;\n }\n if (y < 0) {\n y = 0;\n }\n self.activeCell = {\n rowIndex: y,\n columnIndex: x,\n };\n };\n /**\n * Removes the selection.\n * @memberof canvasDatagrid\n * @name selectNone\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n * @method\n */\n self.selectNone = function (dontDraw) {\n self.selections = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n if (dontDraw) {\n return;\n }\n self.draw();\n };\n /**\n * Selects every visible cell.\n * @memberof canvasDatagrid\n * @name selectAll\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n * @method\n */\n self.selectAll = function (dontDraw) {\n self.selectArea({\n top: 0,\n left: -1,\n right: self.getSchema().length - 1,\n bottom: self.viewData.length - 1,\n });\n if (dontDraw) {\n return;\n }\n self.draw();\n };\n /**\n * Returns true if the selected columnIndex is selected on every row.\n * @memberof canvasDatagrid\n * @name isColumnSelected\n * @method\n * @param {number} columnIndex The column index to check.\n */\n self.isColumnSelected = function (columnIndex) {\n var colIsSelected = true;\n self.viewData.forEach(function (row, rowIndex) {\n if (\n !self.selections[rowIndex] ||\n self.selections[rowIndex].indexOf(columnIndex) === -1\n ) {\n colIsSelected = false;\n }\n });\n return colIsSelected;\n };\n /**\n * Returns true if the selected rowIndex is selected on every column.\n * @memberof canvasDatagrid\n * @name isRowSelected\n * @method\n * @param {number} rowIndex The row index to check.\n */\n\n self.isRowSelected = function (rowIndex) {\n if (!self.selections[rowIndex]) return false;\n var rowIsSelected = true;\n var schema = self.getVisibleSchema();\n schema.forEach(function (col, index) {\n if (\n !self.selections[rowIndex] ||\n self.selections[rowIndex].indexOf(index) === -1\n ) {\n rowIsSelected = false;\n }\n });\n return rowIsSelected;\n };\n\n /**\n * Runs the defined method on each selected cell.\n * @memberof canvasDatagrid\n * @name forEachSelectedCell\n * @method\n * @param {number} fn The function to execute. The signature of the function is: (data, rowIndex, columnName).\n * @param {number} expandToRow When true the data in the array is expanded to the entire row.\n */\n self.forEachSelectedCell = function (fn, expandToRow) {\n var d = [],\n s = expandToRow ? self.getSchema() : self.getVisibleSchema(),\n l = self.viewData.length;\n self.selections.forEach(function (row, index) {\n if (index === l) {\n return;\n }\n if (row.length === 0) {\n d[index] = null;\n return;\n }\n d[index] = {};\n row.forEach(function (col) {\n if (col === -1 || !s[col]) {\n return;\n }\n fn(self.viewData, index, s[col].name);\n });\n });\n };\n /**\n * Selects a column.\n * @memberof canvasDatagrid\n * @name selectColumn\n * @method\n * @param {number} columnIndex The column index to select.\n * @param {boolean} toggleSelectMode When true, behaves as if you were holding control/command when you clicked the column.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the column.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectColumn = function (columnIndex, ctrl, shift, supressEvent) {\n var s, e, x;\n self.isMultiRowsSelected = false;\n self.isMultiColumnsSelected = false;\n function addCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) === -1) {\n self.selections[rowIndex].push(i);\n }\n });\n }\n function removeCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) !== -1) {\n self.selections[rowIndex].splice(\n self.selections[rowIndex].indexOf(i),\n 1,\n );\n }\n });\n }\n if (shift) {\n if (!self.activeCell) {\n return;\n }\n s = Math.min(self.activeCell.columnIndex, columnIndex);\n e = Math.max(self.activeCell.columnIndex, columnIndex);\n for (x = s; e > x; x += 1) {\n addCol(x);\n if (self.selectedColumns.indexOf(x) === -1)\n self.selectedColumns.push(x);\n }\n if (s != e) self.isMultiColumnsSelected = true;\n }\n if (!ctrl && !shift) {\n self.selections = [];\n self.selectedColumns = [];\n self.activeCell.columnIndex = columnIndex;\n self.activeCell.rowIndex = self.scrollIndexTop;\n }\n if (ctrl && self.isColumnSelected(columnIndex)) {\n removeCol(columnIndex);\n self.selectedColumns.splice(columnIndex, 1);\n } else {\n addCol(columnIndex);\n self.selectedColumns.push(columnIndex);\n }\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n });\n };\n /**\n * Selects a row.\n * @memberof canvasDatagrid\n * @name selectRow\n * @method\n * @param {number} rowIndex The row index to select.\n * @param {boolean} ctrl When true, behaves as if you were holding control/command when you clicked the row.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the row.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectRow = function (rowIndex, ctrl, shift, supressEvent) {\n var x,\n st,\n en,\n s = self.getVisibleSchema();\n self.isMultiRowsSelected = false;\n function de() {\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n }\n function addRow(ri) {\n self.selections[ri] = [];\n self.selections[ri].push(-1);\n s.forEach(function (col, index) {\n self.selections[ri].push(self.orders.columns.indexOf(col.index));\n if (\n col.index !== -1 &&\n self.selectedColumns.indexOf(\n self.orders.columns.indexOf(col.index),\n ) === -1\n )\n self.selectedColumns.push(self.orders.columns.indexOf(col.index));\n });\n }\n if (self.dragAddToSelection === false || self.dragObject === undefined) {\n if (\n self.selections[rowIndex] &&\n self.selections[rowIndex].length - 1 === s.length\n ) {\n if (ctrl) {\n self.selections[rowIndex] = [];\n de();\n return;\n }\n }\n }\n if (self.dragAddToSelection === true || self.dragObject === undefined) {\n if (shift && self.dragObject === undefined) {\n if (!self.activeCell) {\n return;\n }\n st = Math.min(self.activeCell.rowIndex, rowIndex);\n en = Math.max(self.activeCell.rowIndex, rowIndex);\n for (x = st; en >= x; x += 1) {\n addRow(x);\n self.selectedRows.push(x);\n }\n } else {\n addRow(rowIndex);\n self.selectedRows = [];\n self.selectedRows.push(rowIndex);\n }\n }\n de();\n };\n /**\n * Collapse a tree grid by row index.\n * @memberof canvasDatagrid\n * @name collapseTree\n * @method\n * @param {number} index The index of the row to collapse.\n */\n self.collapseTree = function (rowIndex) {\n self.dispatchEvent('collapsetree', {\n childGrid: self.childGrids[rowIndex],\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex].blur();\n self.openChildren[rowIndex].dispose();\n delete self.openChildren[rowIndex];\n delete self.sizes.trees[rowIndex];\n delete self.childGrids[rowIndex];\n self.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\n });\n self.resize(true);\n self.draw(true);\n };\n /**\n * Expands a tree grid by row index.\n * @memberof canvasDatagrid\n * @name expandTree\n * @method\n * @param {number} index The index of the row to expand.\n */\n self.expandTree = function (rowIndex) {\n var trArgs = self.args.treeGridAttributes || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth =\n self.sizes.columns.cornerCell || self.style.rowHeaderCellWidth,\n h = self.sizes.trees[rowIndex] || self.style.treeGridHeight,\n treeGrid;\n if (!self.childGrids[rowIndex]) {\n trArgs.debug = self.attributes.debug;\n trArgs.name = self.attributes.saveAppearance\n ? self.attributes.name + 'tree' + rowIndex\n : undefined;\n trArgs.style = trArgs.style || self.style;\n trArgs.parentNode = {\n parentGrid: self.intf,\n nodeType: 'canvas-datagrid-tree',\n offsetHeight: h,\n offsetWidth: self.width - rowHeaderCellWidth,\n header: { width: self.width - rowHeaderCellWidth },\n offsetLeft: rowHeaderCellWidth,\n offsetTop: columnHeaderCellHeight,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: 'tree',\n data: self.viewData[rowIndex],\n };\n treeGrid = self.createGrid(trArgs);\n self.childGrids[rowIndex] = treeGrid;\n }\n treeGrid = self.childGrids[rowIndex];\n treeGrid.visible = true;\n self.dispatchEvent('expandtree', {\n treeGrid: treeGrid,\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex] = treeGrid;\n self.sizes.trees[rowIndex] = h;\n self.dispatchEvent('resizerow', { height: self.style.cellHeight });\n self.resize(true);\n };\n /**\n * Toggles tree grid open and close by row index.\n * @memberof canvasDatagrid\n * @name toggleTree\n * @method\n * @param {number} index The index of the row to toggle.\n */\n self.toggleTree = function (rowIndex) {\n var i = self.openChildren[rowIndex];\n if (i) {\n return self.collapseTree(rowIndex);\n }\n self.expandTree(rowIndex);\n };\n /**\n * Returns a header from the schema by name.\n * @memberof canvasDatagrid\n * @name getHeaderByName\n * @tutorial schema\n * @method\n * @returns {header} header with the selected name, or undefined.\n * @param {string} name The name of the column to resize.\n */\n self.getHeaderByName = function (name) {\n var x,\n i = self.getSchema();\n for (x = 0; x < i.length; x += 1) {\n if (i[x].name === name) {\n return i[x];\n }\n }\n };\n /**\n * Hide column/columns\n * @memberof canvasDatagrid\n * @name hideColumns\n * @method\n * @param {number} beginColumnOrderIndex\n * @param {number} [endColumnOrderIndex]\n */\n self.hideColumns = function (beginColumnOrderIndex, endColumnOrderIndex) {\n const schema = self.getSchema();\n const orders = self.orders.columns;\n const hiddenColumns = [];\n if (typeof endColumnOrderIndex !== 'number')\n endColumnOrderIndex = beginColumnOrderIndex;\n for (\n let orderIndex = beginColumnOrderIndex;\n orderIndex <= endColumnOrderIndex;\n orderIndex++\n ) {\n const columnIndex = orders[orderIndex];\n if (columnIndex >= 0 && !schema[columnIndex].hidden) {\n hiddenColumns.push(columnIndex);\n schema[columnIndex].hidden = true;\n\n self.dispatchEvent('columnhide', {\n columnIndex,\n });\n }\n }\n\n if (hiddenColumns.length > 0) {\n self.setStorageData();\n setTimeout(function () {\n self.resize(true);\n }, 10);\n }\n\n self.dispatchEvent('hidecolumns', {\n hiddenColumns,\n });\n };\n /**\n * Unihde column/columns\n * @memberof canvasDatagrid\n * @name unhideColumns\n * @method\n * @param {number} beginColumnOrderIndex\n * @param {number} [endColumnOrderIndex]\n */\n self.unhideColumns = function (beginColumnOrderIndex, endColumnOrderIndex) {\n const orders = self.orders.columns;\n const schema = self.getSchema();\n\n for (let i = beginColumnOrderIndex; i <= endColumnOrderIndex; i++) {\n const columnIndex = orders[i];\n const s = schema[columnIndex];\n\n if (s && s.hidden) {\n s.hidden = false;\n\n self.dispatchEvent('columnunhide', {\n columnIndex,\n });\n }\n }\n self.refresh();\n };\n /**\n * Hide rows\n * @memberof canvasDatagrid\n * @name hideRows\n * @method\n * @param {number} beginRowIndex\n * @param {number} endRowIndex\n */\n self.hideRows = function (beginRowIndex, endRowIndex) {\n if (\n mergeHiddenRowRanges(self.hiddenRowRanges, [beginRowIndex, endRowIndex])\n )\n self.refresh();\n };\n /**\n * Unhide rows\n * @memberof canvasDatagrid\n * @name unhideRows\n * @method\n * @param {number} beginRowIndex\n * @param {number} endRowIndex\n */\n self.unhideRows = function (beginRowIndex, endRowIndex) {\n self.hiddenRowRanges = self.hiddenRowRanges.filter(\n (range) => range[0] !== beginRowIndex || range[1] !== endRowIndex,\n );\n self.refresh();\n };\n /**\n * Resizes a column to fit the longest value in the column. Call without a value to resize all columns.\n * Warning, can be slow on very large record sets (1m records ~3-5 seconds on an i7).\n * @memberof canvasDatagrid\n * @name fitColumnToValues\n * @method\n * @param {string} name The name of the column to resize.\n */\n self.fitColumnToValues = function (name, internal) {\n if (!self.canvas) {\n return;\n }\n\n const columnIndex =\n name === 'cornerCell' ? -1 : self.getHeaderByName(name).index;\n\n const newSize = Math.max(\n self.findColumnMaxTextLength(name),\n self.style.minColumnWidth,\n );\n\n self.sizes.columns[columnIndex] = newSize;\n\n self.dispatchEvent('resizecolumn', {\n x: newSize,\n y: self.resizingStartingHeight,\n draggingItem: self.currentCell,\n });\n\n if (!internal) {\n self.resize();\n self.draw(true);\n }\n };\n /**\n * Checks if a cell is currently visible.\n * @memberof canvasDatagrid\n * @name isCellVisible\n * @overload\n * @method\n * @returns {boolean} when true, the cell is visible, when false the cell is not currently drawn.\n * @param {number} columnIndex The column index of the cell to check.\n * @param {number} rowIndex The row index of the cell to check.\n */\n self.isCellVisible = function (cell, rowIndex) {\n // overload\n if (rowIndex !== undefined) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === cell && c.rowIndex === rowIndex;\n }).length > 0\n );\n }\n var x,\n l = self.visibleCells.length;\n for (x = 0; x < l; x += 1) {\n if (\n cell.x === self.visibleCells[x].x &&\n cell.y === self.visibleCells[x].y\n ) {\n return true;\n }\n }\n return false;\n };\n /**\n * Sets the order of the data.\n * @memberof canvasDatagrid\n * @name order\n * @method\n * @param {number} columnName Name of the column to be sorted.\n * @param {string} direction `asc` for ascending or `desc` for descending.\n * @param {function} [sortFunction] When defined, override the default sorting method defined in the column's schema and use this one.\n * @param {bool} [dontSetStorageData] Don't store this setting for future use.\n */\n self.order = function (\n columnName,\n direction,\n sortFunction,\n dontSetStorageData,\n ) {\n var f,\n c = self.getSchema().filter(function (col) {\n return col.name === columnName;\n });\n if (\n self.dispatchEvent('beforesortcolumn', {\n name: columnName,\n direction: direction,\n })\n ) {\n return;\n }\n self.orderBy = columnName;\n self.orderDirection = direction;\n if (!self.viewData || self.viewData.length === 0) {\n return;\n }\n if (c.length === 0) {\n throw new Error('Cannot sort. No such column name');\n }\n f = sortFunction || c[0].sorter || self.sorters[c[0].type];\n if (!f && c[0].type !== undefined) {\n console.warn(\n 'Cannot sort type \"%s\" falling back to string sort.',\n c[0].type,\n );\n }\n self.orderings.add(\n columnName,\n direction,\n typeof f === 'function' ? f : self.sorters.string,\n );\n self.refresh();\n self.dispatchEvent('sortcolumn', {\n name: columnName,\n direction: direction,\n });\n\n if (dontSetStorageData) {\n return;\n }\n self.setStorageData();\n };\n\n /**\n * Add grouping\n * @param {'columns'|'rows'} groupFor\n * @method\n * @param {number} from\n * @param {number} to\n */\n function addGroup(groupFor, from, to) {\n let newRow = false;\n const allGroups =\n groupFor === 'rows' ? self.groupedRows : self.groupedColumns;\n for (let i = allGroups.length - 1; i >= 0; i--) {\n const groups = allGroups[i];\n const min = groups[0].from,\n max = groups[groups.length - 1].to;\n if (from <= min && to >= max) {\n if (from === min && to === max && groups.length === 1) return; // nothings happened\n // new group wrap this row\n continue;\n }\n for (let gi = 0; gi < groups.length; gi++) {\n const g = groups[gi];\n if (from > g.to) continue;\n if (from >= g.from) {\n if (to > g.to) {\n if (from === g.from) {\n allGroups.splice(i, 0, [{ from, to, collapsed: false }]);\n self.refresh();\n return;\n }\n throw new Error(`Can't group these ${groupFor}`);\n }\n if (to === g.to) {\n if (from === g.from) return; // nothings happened\n }\n newRow = true;\n break;\n }\n if (to >= g.from) {\n if (to < g.to) throw new Error(`Can't group these ${groupFor}`);\n allGroups.splice(i, 0, [{ from, to, collapsed: false }]);\n } else {\n groups.splice(gi, 0, { from, to, collapsed: false });\n }\n self.refresh();\n return;\n }\n if (newRow) continue;\n groups.push({ from, to, collapsed: false });\n self.refresh();\n return;\n }\n if (newRow) allGroups.push([{ from, to, collapsed: false }]);\n else allGroups.unshift([{ from, to, collapsed: false }]);\n self.refresh();\n }\n /**\n * Remove grouping\n * @param {Array<Array<{from:number,to:number,collapsed:boolean}>>} allGroups\n * @method\n * @param {number} from\n * @param {number} to\n */\n function removeGroup(allGroups, from, to) {\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n if (group.from === from && group.to === to) {\n if (groups.length <= 1) allGroups.splice(i, 1);\n else groups.splice(gi, 1);\n self.refresh();\n return;\n }\n }\n }\n }\n /**\n * Grouping columns\n * @memberof canvasDatagrid\n * @name groupColumns\n * @method\n * @param {number|string} firstColumnName Name of the first column to be grouped.\n * @param {number|string} lastColumnName Name of the last column to be grouped.\n */\n self.groupColumns = function (firstColumnName, lastColumnName) {\n /** @type {Array<{name: string,columnIndex:number}>} */\n const schema = self.getSchema();\n let firstOne, lastOne;\n for (let i = 0; i < schema.length; i++) {\n const it = schema[i];\n if (firstOne && lastOne) break;\n if (it.name === firstColumnName) {\n firstOne = it;\n continue;\n }\n if (it.name === lastColumnName) {\n lastOne = it;\n continue;\n }\n }\n if (!firstOne) throw new Error(`No such column name for first column`);\n if (!lastOne) throw new Error(`No such column name for last column`);\n if (lastOne.columnIndex > firstOne.columnIndex !== true)\n throw new Error(`Can't group these columns`);\n\n const from = firstOne.columnIndex;\n const to = lastOne.columnIndex;\n const ev = { group: { type: 'columns', from, to } };\n try {\n addGroup('columns', from, to);\n } catch (error) {\n ev.error = error;\n }\n self.dispatchEvent('aftercreategroup', ev);\n };\n /**\n * Grouping columns\n * @memberof canvasDatagrid\n * @name groupRows\n * @method\n * @param {number} rowIndexFrom The row index which is the beginning of the group\n * @param {number} rowIndexTo The row index which is the end of the group\n */\n self.groupRows = function (rowIndexFrom, rowIndexTo) {\n if (!Number.isInteger(rowIndexFrom) || rowIndexFrom < 0)\n throw new Error(`No such row for the beginning of the group`);\n\n const dataLength = self.viewData.length;\n if (\n !Number.isInteger(rowIndexFrom) ||\n rowIndexTo <= rowIndexFrom ||\n rowIndexTo >= dataLength\n )\n throw new Error(`No such row for the end of the group`);\n const ev = {\n group: {\n type: 'rows',\n from: rowIndexFrom,\n to: rowIndexTo,\n },\n };\n try {\n addGroup('rows', rowIndexFrom, rowIndexTo);\n } catch (error) {\n ev.error = error;\n }\n self.dispatchEvent('aftercreategroup', ev);\n };\n /**\n * Remove grouping columns\n * @memberof canvasDatagrid\n * @name removeGroupColumns\n * @method\n * @param {number|string} firstColumnName Name of the first column to be grouped.\n * @param {number|string} lastColumnName Name of the last column to be grouped.\n */\n self.removeGroupColumns = function (firstColumnName, lastColumnName) {\n /** @type {Array<{name:string,columnIndex:number}>} */\n const schema = self.getSchema();\n let firstOne, lastOne;\n for (let i = 0; i < schema.length; i++) {\n const it = schema[i];\n if (firstOne && lastOne) break;\n if (it.name === firstColumnName) {\n firstOne = it;\n continue;\n }\n if (it.name === lastColumnName) {\n lastOne = it;\n continue;\n }\n }\n if (!firstOne) throw new Error(`No such column name for first column`);\n if (!lastOne) throw new Error(`No such column name for last column`);\n const from = firstOne.columnIndex;\n const to = lastOne.columnIndex;\n removeGroup(self.groupedColumns, from, to);\n };\n /**\n * Remove grouping columns\n * @memberof canvasDatagrid\n * @name removeGroupRows\n * @method\n * @param {number} rowIndexFrom The row index which is the beginning of the group\n * @param {number} rowIndexTo The row index which is the end of the group\n */\n self.removeGroupRows = function (rowIndexFrom, rowIndexTo) {\n removeGroup(self.groupedRows, rowIndexFrom, rowIndexTo);\n };\n /**\n * Toggle(expand/collapsed) grouping columns\n * @memberof canvasDatagrid\n * @name toggleGroupColumns\n * @method\n * @param {number|string} firstColumnName Name of the first column to be grouped.\n * @param {number|string} lastColumnName Name of the last column to be grouped.\n */\n self.toggleGroupColumns = function (firstColumnName, lastColumnName) {\n /** @type {Array<{name:string,columnIndex:number}>} */\n const schema = self.getSchema();\n let firstOne, lastOne;\n for (let i = 0; i < schema.length; i++) {\n const it = schema[i];\n if (firstOne && lastOne) break;\n if (it.name === firstColumnName) {\n firstOne = it;\n continue;\n }\n if (it.name === lastColumnName) {\n lastOne = it;\n continue;\n }\n }\n if (!firstOne || !lastOne) return;\n const from = firstOne.columnIndex;\n const to = lastOne.columnIndex;\n if (self.toggleGroup({ type: 'c', from, to })) {\n self.disposeContextMenu();\n self.setStorageData();\n self.refresh();\n }\n };\n /**\n * Toggle(expand/collapsed) grouping rows\n * @memberof canvasDatagrid\n * @name toggleGroupRows\n * @method\n * @param {number} rowIndexFrom The row index which is the beginning of the group\n * @param {number} rowIndexTo The row index which is the end of the group\n */\n self.toggleGroupRows = function (rowIndexFrom, rowIndexTo) {\n if (self.toggleGroup({ type: 'r', from: rowIndexFrom, to: rowIndexTo })) {\n self.disposeContextMenu();\n self.setStorageData();\n self.refresh();\n }\n };\n\n self.isInGrid = function (e) {\n if (e.x < 0 || e.x > self.width || e.y < 0 || e.y > self.height) {\n return false;\n }\n return true;\n };\n /**\n * Moves the current selection relative to the its current position. Note: this method does not move the selected data, just the selection itself.\n * @memberof canvasDatagrid\n * @name moveSelection\n * @method\n * @param {number} offsetX The number of columns to offset the selection.\n * @param {number} offsetY The number of rows to offset the selection.\n */\n self.moveSelection = function (offsetX, offsetY) {\n var sel = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n self.selections.forEach(function (row, rowIndex) {\n sel[rowIndex + offsetY] = [];\n self.selectedRows.push(rowIndex + offsetY);\n row.forEach(function (colIndex) {\n sel[rowIndex + offsetY].push(colIndex + offsetX);\n if (self.selectedColumns.indexOf(colIndex + offsetX) === -1)\n self.selectedColumns.push(colIndex + offsetX);\n });\n });\n self.selections = sel;\n };\n /**\n * Deletes currently selected data.\n * @memberof canvasDatagrid\n * @name deleteSelectedData\n * @method\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n */\n self.deleteSelectedData = function (dontDraw) {\n const affectedCells = self.clearSelectedCells();\n\n self.dispatchEvent('afterdelete', {\n cells: affectedCells,\n });\n\n if (dontDraw) {\n return;\n }\n\n requestAnimationFrame(() => self.draw());\n };\n /**\n * Moves data in the provided selection to another position in the grid. Moving data off the edge of the schema (columns/x) will truncate data.\n * @memberof canvasDatagrid\n * @name moveTo\n * @method\n * @param {array} sel 2D array representing selected rows and columns. `canvasDatagrid.selections` is in this format and can be used here.\n * @param {number} x The column index to start inserting the selection at.\n * @param {number} y The row index to start inserting the selection at.\n */\n self.moveTo = function (sel, x, y) {\n var selectedData = self.getSelectedData(),\n visibleSchema = self.getVisibleSchema(),\n selectionLength = sel.length,\n xi,\n maxRowLength = -Infinity,\n minXi = Infinity,\n yi = y - 1;\n\n sel.forEach(function (row, rowIndex) {\n if (rowIndex === selectionLength) {\n return;\n }\n if (row.length === 0) {\n return;\n }\n minXi = Math.min(self.getVisibleColumnIndexOf(x), minXi);\n maxRowLength = Math.max(maxRowLength, row.length);\n row.forEach(function (colIndex) {\n // intentional redef of colIndex\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (!visibleSchema[colIndex]) {\n return;\n }\n // TODO:\n if (!self.data) {\n self.data = {};\n }\n if (!self.data[rowIndex]) {\n self.data[rowIndex] = {};\n }\n // TODO:\n self.data[rowIndex][visibleSchema[colIndex].name] = null;\n });\n });\n\n sel.forEach(function (row, index) {\n var lastSourceIndex;\n yi += 1;\n xi = self.getVisibleColumnIndexOf(x);\n row.forEach(function (colIndex, cidx) {\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (cidx > 0) {\n // this confusing bit of nonsense figures out\n // if the selection has skipped cells\n xi += colIndex - lastSourceIndex;\n }\n lastSourceIndex = colIndex;\n if (\n colIndex === -1 ||\n !visibleSchema[xi] ||\n !visibleSchema[colIndex] ||\n // TODO:\n self.data.length - 1 < yi ||\n yi < 0\n ) {\n return;\n }\n // TODO:\n if (!self.data[yi]) {\n self.data[yi] = {};\n }\n // TODO:\n self.data[yi][visibleSchema[xi].name] =\n selectedData[index][visibleSchema[colIndex].name];\n });\n });\n };\n /**\n * Get the column group info given column belongs to\n * @memberof canvasDatagrid\n * @name getGroupsColumnBelongsTo\n * @method\n * @param {number} columnIndex Column index.\n * @returns {Array<{from:number,to:number,collapsed:boolean}>}\n */\n self.getGroupsColumnBelongsTo = function (columnIndex) {\n if (!self.attributes.allowGroupingColumns) return [];\n const result = [];\n for (let i = 0; i < self.groupedColumns.length; i++) {\n const groups = self.groupedColumns[i];\n for (let j = 0; j < groups.length; j++) {\n const group = groups[j];\n if (columnIndex >= group.from && columnIndex <= group.to) {\n result.push(group);\n break;\n }\n }\n }\n return result;\n };\n /**\n * Get the row group info given row belongs to\n * @memberof canvasDatagrid\n * @name getGroupsRowBelongsTo\n * @method\n * @param {number} rowIndex Row index.\n * @returns {Array<{from:number,to:number,collapsed:boolean}>}\n */\n self.getGroupsRowBelongsTo = function (rowIndex) {\n if (!self.attributes.allowGroupingRows) return [];\n const result = [];\n for (let i = 0; i < self.groupedRows.length; i++) {\n const groups = self.groupedRows[i];\n for (let j = 0; j < groups.length; j++) {\n const group = groups[j];\n if (rowIndex >= group.from && rowIndex <= group.to) {\n result.push(group);\n break;\n }\n }\n }\n return result;\n };\n\n /**\n * Checks if a given column is visible.\n * @memberof canvasDatagrid\n * @name isColumnVisible\n * @method\n * @returns {boolean} When true, the column is visible.\n * @param {number} columnIndex Column index.\n */\n self.isColumnVisible = function (columnIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === columnIndex;\n }).length > 0\n );\n };\n /**\n * Checks if a given row is visible.\n * @memberof canvasDatagrid\n * @name isRowVisible\n * @method\n * @returns {boolean} When true, the row is visible.\n * @param {number} rowIndex Row index.\n */\n self.isRowVisible = function (rowIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.rowIndex === rowIndex;\n }).length > 0\n );\n };\n /**\n * Gets the cell at columnIndex and rowIndex.\n * @memberof canvasDatagrid\n * @name getVisibleCellByIndex\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Column index.\n * @param {number} y Row index.\n */\n self.getVisibleCellByIndex = function (x, y) {\n return self.visibleCells.filter(function (c) {\n return c.columnIndex === x && c.rowIndex === y;\n })[0];\n };\n /**\n * Get an unhide indicator at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getUnhideIndicator\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getUnhideIndicator = function (x, y) {\n const indicators = self.visibleUnhideIndicators;\n if (indicators.length <= 0) return;\n for (let i = 0; i < indicators.length; i++) {\n const indicator = indicators[i];\n if (\n x >= indicator.x &&\n y >= indicator.y &&\n x <= indicator.x2 &&\n y <= indicator.y2\n )\n return indicator;\n }\n };\n /**\n * Get a column group at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getColumnGroupAt\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getColumnGroupAt = function (x, y) {\n const groups = self.groupedColumns.length;\n if (groups <= 0) return;\n const yZero = self.getColumnGroupAreaHeight();\n if (y >= yZero) return;\n for (let i = 0; i < self.visibleGroups.length; i++) {\n const g = self.visibleGroups[i];\n if (g.type !== 'c') continue;\n if (x >= g.x && y >= g.y && x <= g.x2 && y <= g.y2) return g;\n }\n };\n /**\n * Get a row group at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getRowGroupAt\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getRowGroupAt = function (x, y) {\n const groups = self.groupedRows.length;\n if (groups <= 0) return;\n const xZero = self.getRowGroupAreaWidth();\n if (x >= xZero) return;\n for (let i = 0; i < self.visibleGroups.length; i++) {\n const g = self.visibleGroups[i];\n if (g.type !== 'r') continue;\n if (x >= g.x && y >= g.y && x <= g.x2 && y <= g.y2) return g;\n }\n };\n /**\n * Gets the cell at grid pixel coordinate x and y. Author's note. This function ties drawing and events together. This is a very complex function and is core to the component.\n * @memberof canvasDatagrid\n * @name getCellAt\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getCellAt = function (x, y, useTouchScrollZones) {\n function getBorder(entitiy) {\n if (\n entitiy.x + entitiy.width - self.attributes.borderResizeZone * 0.4 <\n x &&\n entitiy.x + entitiy.width + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'r';\n }\n if (\n entitiy.x - self.attributes.borderResizeZone * 0.4 < x &&\n entitiy.x + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'l';\n }\n if (\n entitiy.y + entitiy.height - self.attributes.borderResizeZone * 0.4 <\n y &&\n entitiy.y + entitiy.height + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 'b';\n }\n if (\n entitiy.y - self.attributes.borderResizeZone * 0.4 < y &&\n entitiy.y + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 't';\n }\n }\n if (!self.visibleCells) {\n return;\n }\n x -= self.getRowGroupAreaWidth();\n y -= self.getColumnGroupAreaHeight();\n\n if (self.dragStartObject !== undefined) {\n if (x <= 0) x = 1;\n if (x >= self.width) x = self.width - 1;\n if (y <= 0) y = 1;\n if (y >= self.height) y = self.height - 1;\n }\n\n var border,\n tsz = useTouchScrollZones ? self.attributes.touchScrollZone : 0,\n moveMode = self.attributes.borderDragBehavior === 'move',\n i,\n l = self.visibleCells.length,\n moveBorder,\n xBorderBehavior = moveMode ? self.cursorGrab : 'ew-resize',\n yBorderBehavior = moveMode ? self.cursorGrab : 'ns-resize',\n cell,\n entitiy;\n if (!self.visibleCells || !self.visibleCells.length) {\n return;\n }\n self.hasFocus = true;\n if (!(y < self.height && y > 0 && x < self.width && x > 0)) {\n self.hasFocus = false;\n return {\n dragContext: 'inherit',\n context: 'inherit',\n };\n }\n for (i = 0; i < l; i += 1) {\n cell = self.visibleCells[i];\n // interactive dimensions of the cell. used for touch \"over size\" zones\n entitiy = {\n x: cell.x,\n y: cell.y,\n height: cell.height,\n width: cell.width,\n };\n if (\n useTouchScrollZones &&\n /(vertical|horizontal)-scroll-/.test(cell.style)\n ) {\n entitiy.x -= tsz;\n entitiy.y -= tsz;\n entitiy.height += tsz;\n entitiy.width += tsz;\n }\n if (\n entitiy.x - self.style.cellBorderWidth < x &&\n entitiy.x + entitiy.width + self.style.cellBorderWidth > x &&\n entitiy.y - self.style.cellBorderWidth < y &&\n entitiy.y + entitiy.height + self.style.cellBorderWidth > y\n ) {\n if (/frozen-row-marker/.test(cell.style)) {\n if (self.dragMode === 'frozen-column-marker') continue;\n cell.dragContext = cell.style;\n cell.context = 'grab';\n return cell;\n }\n if (/frozen-column-marker/.test(cell.style)) {\n if (self.dragMode === 'frozen-row-marker') continue;\n cell.dragContext = cell.style;\n cell.context = 'grab';\n return cell;\n }\n if (/selection-handle-/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'crosshair';\n return cell;\n }\n if (/vertical-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'vertical-scroll-box';\n cell.context = 'vertical-scroll-box';\n cell.isScrollBar = true;\n cell.isVerticalScrollBar = true;\n if (y > self.scrollBox.box.v.y + self.scrollBox.scrollBoxHeight) {\n cell.dragContext = 'vertical-scroll-bottom';\n cell.context = 'vertical-scroll-bottom';\n } else if (y < self.scrollBox.box.v.y) {\n cell.dragContext = 'vertical-scroll-top';\n cell.context = 'vertical-scroll-top';\n }\n self.cursor = 'default';\n return cell;\n }\n if (/horizontal-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'horizontal-scroll-box';\n cell.context = 'horizontal-scroll-box';\n cell.isScrollBar = true;\n cell.isHorizontalScrollBar = true;\n if (x > self.scrollBox.box.h.x + self.scrollBox.scrollBoxWidth) {\n cell.dragContext = 'horizontal-scroll-right';\n cell.context = 'horizontal-scroll-right';\n } else if (x < self.scrollBox.box.h.x) {\n cell.dragContext = 'horizontal-scroll-left';\n cell.context = 'horizontal-scroll-left';\n }\n self.cursor = 'default';\n return cell;\n }\n border = getBorder(entitiy);\n // check if the border of this cell is the border of the selection and if so show move cursor in move mode\n moveBorder =\n moveMode &&\n cell.selectionBorder &&\n cell.selectionBorder.indexOf(border) !== -1;\n if (\n ['l', 'r'].indexOf(border) !== -1 &&\n (self.attributes.allowColumnResize || moveBorder) &&\n ((self.attributes.allowColumnResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n ((self.attributes.allowRowHeaderResize &&\n (cell.isRowHeader || cell.isCorner)) ||\n !(cell.isRowHeader && cell.isCorner))\n ) {\n if (\n (cell.isColumnHeader ||\n cell.isCorner ||\n (self.attributes.allowColumnResizeFromCell && cell.isNormal)) &&\n border === 'r'\n ) {\n cell.context = 'ew-resize';\n cell.dragContext = 'ew-resize';\n return cell;\n }\n if (!(cell.isColumnHeader || cell.isCorner) && moveBorder) {\n cell.context = xBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (\n ['t', 'b'].indexOf(border) !== -1 &&\n cell.rowIndex > -1 &&\n (self.attributes.allowRowResize || moveBorder) &&\n ((self.attributes.allowRowResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n !cell.isColumnHeader\n ) {\n if (\n (cell.isRowHeader ||\n cell.isCorner ||\n (self.attributes.allowRowResizeFromCell && cell.isNormal)) &&\n border === 'b'\n ) {\n cell.context = 'ns-resize';\n cell.dragContext = 'ns-resize';\n return cell;\n }\n if (!(cell.isRowHeader || cell.isCorner) && moveBorder) {\n cell.context = yBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (cell.style === 'columnHeaderCell') {\n if (\n (!self.isColumnSelected(cell.columnIndex) &&\n cell.x +\n cell.width -\n self.attributes.columnGrabZoneSize -\n self.style.cellBorderWidth >\n x) ||\n !self.attributes.allowRowReordering\n ) {\n cell.dragContext = 'cell';\n cell.context = 'cell';\n } else {\n cell.context = self.cursorGrab;\n cell.dragContext = 'column-reorder';\n }\n return cell;\n }\n if (cell.style === 'rowHeaderCell') {\n if (\n (!self.isRowSelected(cell.rowIndex) &&\n self.attributes.rowGrabZoneSize +\n (cell.y - self.style.cellBorderWidth) <\n y) ||\n !self.attributes.allowRowReordering\n ) {\n cell.dragContext = 'cell';\n cell.context = 'cell';\n } else {\n cell.context = self.cursorGrab;\n cell.dragContext = 'row-reorder';\n }\n return cell;\n }\n if (cell.isGrid) {\n self.hasFocus = false;\n cell.dragContext = 'cell-grid';\n cell.context = 'cell-grid';\n return cell;\n }\n if (cell.style === 'tree-grid') {\n self.hasFocus = false;\n cell.dragContext = 'tree';\n cell.context = 'tree';\n return cell;\n }\n cell.dragContext = 'cell';\n cell.context = 'cell';\n return cell;\n }\n }\n self.hasFocus = true;\n self.cursor = 'default';\n return {\n dragContext: 'background',\n context: 'background',\n style: 'background',\n isBackground: true,\n };\n };\n /**\n * Gets the bounds of current selection.\n * @returns {rect} selection.\n * @memberof canvasDatagrid\n * @name getSelectionBounds\n * @method\n */\n self.getSelectionBounds = function () {\n var low = { x: Infinity, y: Infinity },\n high = { x: -Infinity, y: -Infinity };\n self.selections.forEach(function (row, rowIndex) {\n var maxCol, minCol;\n low.y = rowIndex < low.y ? rowIndex : low.y;\n high.y = rowIndex > high.y ? rowIndex : high.y;\n maxCol = Math.max.apply(null, row);\n minCol = Math.min.apply(null, row);\n low.x = minCol < low.x ? minCol : low.x;\n high.x = maxCol > high.x ? maxCol : high.x;\n });\n return {\n top: low.y,\n left: low.x,\n bottom: high.y,\n right: high.x,\n };\n };\n /**\n * Returns an auto generated schema based on data structure.\n * @memberof canvasDatagrid\n * @name getSchemaFromData\n * @method\n * @tutorial schema\n * @returns {schema} schema A schema based on the first item in the data array.\n */\n self.getSchemaFromData = function (d) {\n d = d || self.originalData;\n return Object.keys(d[0] || { ' ': '' }).map(function mapEachSchemaColumn(\n key,\n index,\n ) {\n var type = self.getBestGuessDataType(key, d),\n i = {\n name: key,\n title: isNaN(parseInt(key, 10))\n ? key\n : self.integerToAlpha(key).toUpperCase(),\n index: index,\n columnIndex: index,\n type: type,\n filter: self.filter(type),\n };\n if (\n self.storedSettings &&\n self.storedSettings.visibility &&\n self.storedSettings.visibility[i.name] !== undefined\n ) {\n i.hidden = !self.storedSettings.visibility[i.name];\n }\n return i;\n });\n };\n /**\n * Clears the change log grid.changes that keeps track of changes to the data set.\n * This does not undo changes or alter data it is simply a convince array to keep\n * track of changes made to the data since last this method was called.\n * @memberof canvasDatagrid\n * @name clearChangeLog\n * @method\n */\n self.clearChangeLog = function () {\n self.changes = [];\n };\n /**\n * Selects an area of the grid.\n * @memberof canvasDatagrid\n * @name selectArea\n * @method\n * @param {rect} bounds A rect object representing the selected values.\n */\n self.selectArea = function (bounds, ctrl) {\n self.selectionBounds = bounds || self.selectionBounds;\n var ev,\n x,\n y,\n s = self.getSchema();\n if (!ctrl) {\n self.selections = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n }\n if (\n self.selectionBounds.top < -1 ||\n self.selectionBounds.bottom > self.viewData.length ||\n self.selectionBounds.left < -1 ||\n self.selectionBounds.right > s.length\n ) {\n throw new Error('Impossible selection area');\n }\n for (\n x = self.selectionBounds.top;\n x <= self.selectionBounds.bottom;\n x += 1\n ) {\n self.selections[x] = [];\n self.selectedRows.push(x);\n for (\n y = self.selectionBounds.left;\n y <= self.selectionBounds.right;\n y += 1\n ) {\n if (self.selections[x].indexOf(y) === -1) {\n self.selections[x].push(y);\n }\n if (y !== -1 && self.selectedColumns.indexOf(y) === -1) {\n self.selectedColumns.push(y);\n }\n }\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n };\n /**\n * Returns the maximum text width for a given column by column name.\n * @memberof canvasDatagrid\n * @name findColumnMaxTextLength\n * @method\n * @returns {number} The number of pixels wide the maximum width value in the selected column.\n * @param {string} name The name of the column to calculate the value's width of.\n */\n self.findColumnMaxTextLength = function (name) {\n var m = -Infinity;\n if (name === 'cornerCell') {\n self.ctx.font = self.style.rowHeaderCellFont;\n return (\n self.ctx.measureText(\n (\n self.viewData.length + (self.attributes.showNewRow ? 1 : 0)\n ).toString(),\n ).width +\n self.style.autosizePadding +\n self.style.autosizeHeaderCellPadding +\n self.style.rowHeaderCellPaddingRight +\n self.style.rowHeaderCellPaddingLeft +\n (self.attributes.tree\n ? self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight\n : 0)\n );\n }\n var formatter = null;\n self.getSchema().forEach(function (col) {\n if (col.name !== name) {\n return;\n }\n self.ctx.font = self.style.columnHeaderCellFont;\n var t =\n self.ctx.measureText(col.title || col.name).width +\n self.style.columnHeaderCellPaddingRight +\n self.style.columnHeaderCellPaddingLeft +\n self.style.cellAutoResizePadding;\n m = t > m ? t : m;\n formatter = self.formatters[col.type];\n });\n self.viewData.forEach(function (row) {\n var text = row[name];\n if (formatter) {\n text = formatter({ cell: { value: text } });\n }\n self.ctx.font = self.style.cellFont;\n var t =\n self.ctx.measureText(text).width +\n self.style.cellPaddingRight +\n self.style.cellPaddingLeft +\n self.style.cellAutoResizePadding;\n m = t > m ? t : m;\n });\n return m;\n };\n /**\n * Gets the total width of all header columns.\n * @memberof canvasDatagrid\n * @name getHeaderWidth\n * @method\n */\n self.getHeaderWidth = function () {\n return self.getVisibleSchema().reduce(function (total, header) {\n return total + parseInt(header.width || self.style.cellWidth, 10);\n }, 0);\n };\n /**\n * Gets the height of a row by index.\n * @memberof canvasDatagrid\n * @name getRowHeight\n * @method\n * @param {number} rowIndex The row index to lookup.\n */\n self.getRowHeight = function (rowIndex) {\n return (self.sizes.rows[rowIndex] || self.style.cellHeight) * self.scale;\n };\n /**\n * Gets the width of a column by index.\n * @memberof canvasDatagrid\n * @name getColumnWidth\n * @method\n * @param {number} columnIndex The column index to lookup.\n */\n self.getColumnWidth = function (columnIndex) {\n return (\n (self.sizes.columns[columnIndex] ||\n self.getSchema()[columnIndex].width ||\n self.style.cellWidth) * self.scale\n );\n };\n self.formatters.string = function cellFormatterString(e) {\n return e.cell.value !== undefined ? e.cell.value : '';\n };\n self.formatters.rowHeaderCell = self.formatters.string;\n self.formatters.headerCell = self.formatters.string;\n self.formatters.number = self.formatters.string;\n self.formatters.int = self.formatters.string;\n self.formatters.html = self.formatters.string;\n self.sorters.string = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n const aValue = a[columnName] || '';\n const bValue = b[columnName] || '';\n if (asc) {\n if (!aValue.localeCompare) {\n return 1;\n }\n return aValue.localeCompare(bValue);\n }\n if (!bValue.localeCompare) {\n return 1;\n }\n return bValue.localeCompare(aValue);\n };\n };\n self.sorters.number = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return a[columnName] - b[columnName];\n }\n return b[columnName] - a[columnName];\n };\n };\n self.sorters.date = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return (\n new Date(a[columnName]).getTime() - new Date(b[columnName]).getTime()\n );\n }\n return (\n new Date(b[columnName]).getTime() - new Date(a[columnName]).getTime()\n );\n };\n };\n}\n","/*jslint browser: true, unparam: true, todo: true, evil: true*/\n/*globals Reflect: false, HTMLElement: true, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport component from './component';\nimport defaults from './defaults';\nimport draw from './draw';\nimport events from './events';\nimport touch from './touch';\nimport intf from './intf';\nimport contextMenu from './contextMenu';\nimport button from './button';\nimport dom from './dom';\nimport publicMethods from './publicMethods';\n\nvar webComponent = component();\n\nvar modules = [\n defaults,\n draw,\n events,\n touch,\n intf,\n contextMenu,\n button,\n dom,\n publicMethods,\n];\n\nfunction Grid(args) {\n args = args || {};\n var self = {};\n self.isComponent = args.component === undefined;\n self.isChildGrid =\n args.parentNode &&\n /canvas-datagrid-(cell|tree)/.test(args.parentNode.nodeType);\n if (self.isChildGrid) {\n self.intf = {};\n } else {\n self.intf = self.isComponent\n ? eval('Reflect.construct(HTMLElement, [], new.target)')\n : document.createElement('canvas');\n }\n self.args = args;\n self.intf.args = args;\n self.applyComponentStyle = webComponent.applyComponentStyle;\n self.hyphenateProperty = webComponent.hyphenateProperty;\n self.dehyphenateProperty = webComponent.dehyphenateProperty;\n self.createGrid = function grid(args) {\n args.component = false;\n return new Grid(args);\n };\n\n modules.forEach(function (module) {\n module(self);\n });\n\n if (self.isChildGrid) {\n self.shadowRoot = args.parentNode.shadowRoot;\n self.parentNode = args.parentNode;\n } else {\n self.shadowRoot = self.intf.attachShadow({ mode: 'open' });\n self.parentNode = self.shadowRoot;\n }\n self.init();\n return self.intf;\n}\nif (window.HTMLElement) {\n Grid.prototype = Object.create(window.HTMLElement.prototype);\n}\n// export web component\nif (window.customElements) {\n Grid.observedAttributes = webComponent.getObservableAttributes();\n Grid.prototype.disconnectedCallback = webComponent.disconnectedCallback;\n Grid.prototype.attributeChangedCallback =\n webComponent.attributeChangedCallback;\n Grid.prototype.connectedCallback = webComponent.connectedCallback;\n Grid.prototype.adoptedCallback = webComponent.adoptedCallback;\n window.customElements.define('canvas-datagrid', Grid);\n}\n\n// export global\nif (\n window &&\n !window.canvasDatagrid &&\n !window.require &&\n // Present to exclude global declarations from ES Module bundles\n !window.EXCLUDE_GLOBAL\n) {\n window.canvasDatagrid = function (args) {\n return new Grid(args);\n };\n}\n\n// export amd loader\nexport default function canvasDatagrid(args) {\n args = args || {};\n var i,\n tKeys = [\n 'style',\n 'formatters',\n 'sorters',\n 'filters',\n 'treeGridAttributes',\n 'cellGridAttributes',\n 'data',\n 'schema',\n ];\n if (window.customElements) {\n i = document.createElement('canvas-datagrid');\n Object.keys(args).forEach(function (argKey) {\n // set data and parentNode after everything else\n if (argKey === 'data') {\n return;\n }\n if (argKey === 'parentNode') {\n return;\n }\n // top level keys in args\n if (tKeys.indexOf(argKey) !== -1) {\n tKeys.forEach(function (tKey) {\n if (args[tKey] === undefined || tKey !== argKey) {\n return;\n }\n if (['formatters', 'sorters', 'filters'].indexOf(argKey) !== -1) {\n if (typeof args[tKey] === 'object' && args[tKey] !== null) {\n Object.keys(args[tKey]).forEach(function (sKey) {\n i[tKey][sKey] = args[tKey][sKey];\n });\n }\n } else {\n i[tKey] = args[tKey];\n }\n });\n return;\n }\n // all others are attribute level keys\n i.attributes[argKey] = args[argKey];\n });\n if (args.data) {\n i.data = args.data;\n }\n // add to the dom very last to avoid redraws\n if (args.parentNode) {\n args.parentNode.appendChild(i);\n }\n return i;\n }\n args.component = false;\n i = new Grid(args);\n if (args.parentNode && args.parentNode.appendChild) {\n args.parentNode.appendChild(i);\n }\n return i;\n}\n"],"names":["self","defaults","attributes","styles","typeMap","component","dehyphenateProperty","prop","replace","nextLetterCap","p","Array","prototype","forEach","call","char","toUpperCase","hyphenateProperty","cust","toLowerCase","applyComponentStyle","supressChangeAndDrawEvents","intf","isComponent","cStyle","window","getComputedStyle","tagName","canvas","defs","computedStyle","def","val","getPropertyValue","setStyleProperty","dispatchEvent","requestAnimationFrame","resize","style","data","strData","JSON","parse","e","Error","schema","strSchema","number","strNum","n","parseInt","isNaN","boolean","strBool","test","string","str","getObservableAttributes","i","attrs","attr","push","disconnectedCallback","connected","connectedCallback","this","parentDOMNode","innerHTML","appendChild","observe","adoptedCallback","attributeChangedCallback","attrName","oldVal","newVal","tfn","dataType","base","item","filter","addEventListener","Function","name","observer","MutationObserver","mutations","checkInnerHTML","checkStyle","mutation","attributeName","target","nodeName","parentNode","addedNodes","length","type","characterData","childList","subtree","document","querySelectorAll","el","perfCounters","cachedImagesDrawn","drawCount","perfWindowSize","entityCount","scrollDebugCounters","touchPPSCounters","fillArray","low","high","step","x","undefined","drawHtml","cell","img","v","formattedValue","cacheKey","toString","rowIndex","columnIndex","Math","round","canvasOffsetLeft","y","canvasOffsetTop","htmlImageCache","height","width","complete","ctx","drawImage","Image","onload","loaded","Object","keys","html","draw","src","btoa","drawLines","coords","fill","beginPath","moveTo","lineTo","stroke","drawGroupHandle","collapsed","fillRect","strokeRect","cx","cy","drawUnhideIndicator","size","dir","active","x0","y0","borderCoords","minPadding","maxPadding","longEdge","median","halfLongEdge","strokeStyle","unhideIndicatorBorderColor","lineWidth","fillStyle","unhideIndicatorBackgroundColor","offset","unhideIndicatorColor","drawCellTreeIcon","tree","rowTree","parentCount","iconSize","cellTreeIconWidth","scale","marginTop","cellTreeIconMarginTop","marginRight","cellTreeIconMarginRight","marginLeft","cellTreeIconMarginLeft","paddingLeft","icon","oldFillStyle","oldStrokeStyle","hovered","hovers","onCellTreeIcon","cellTreeIconHoverFillColor","cellTreeIconFillColor","cellTreeIconBorderColor","rect","expand","cellTreeIconLineWidth","cellTreeIconLineColor","radiusRect","w","h","radius","r","b","quadraticCurveTo","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fillCircle","strokeHandle","strokeCircle","addBorderLine","c","pos","t","l","getFrozenColumnsWidth","s","getSchema","min","frozenColumn","collapsedGroups","getCollapsedColumnGroups","hidden","findIndex","group","from","to","getColumnWidth","internal","isChildGrid","parentGrid","visible","checkScrollHeight","treeGrid","rowOpen","rowHeight","cornerCell","rowData","aCell","drawCorner","en","m","d","viewData","bc","gridBorderCollapse","selectionBorders","moveBorders","selectionHandles","rowHeaders","u","currentCell","columnHeaderCellHeight","getColumnHeaderCellHeight","rowHeaderCellWidth","getRowHeaderCellWidth","rowGroupsAreaWidth","getRowGroupAreaWidth","columnGroupsAreaHeight","getColumnGroupAreaHeight","rowGroupsRectInfo","rowGroupsFrozenInfo","columnGroupsRectInfo","collapsedColumnGroups","collapsedRowGroups","getCollapsedRowGroups","cellHeight","currentRowIndexOffset","rowIndexOffsetByHiddenRows","hiddenRowRanges","map","range","plus","sort","a","performance","now","visibleRowHeights","orders","rows","createRowOrders","save","visibleRows","visibleCells","visibleGroups","visibleUnhideIndicators","offsetTop","offsetLeft","firstRowIndexOffset","shift","initDraw","gridBackgroundColor","translate","ln","frozenRow","scrollBox","scrollLeft","scrollPixelLeft","cellBorderWidth","drawRow","allowFreezingRows","frozenMarkerWidth","frozenMarkerBorderWidth","drawFrozenRows","columnOrderIndex","rowOrderIndex","headerIndex","g","snapToRow","scrollTop","scrollPixelTop","scrollIndexTop","scrollIndexBottom","scrollPixelBottom","cellTree","hide","showNewRow","showRowHeaders","scrollIndexLeft","isColumnCollapsedByGroup","columns","drawCell","newRow","restore","drawRows","cl","activeCell","selectionMode","activeCellOverlayBorderWidth","activeCellOverlayBorderColor","getHeaderWidth","drawActiveCell","o","columnHeaderCell","header","nonFrozenHeaderWidth","drawHeaderColumnRange","start","end","title","cellWidth","index","order","rArgs","rhIndex","filteredRowNumber","getBoundRowIndexFromViewRowIndex","originalData","rowHeaderValue","hasActiveFilters","hasCollapsedRowGroup","rowHeaderCell","headerDescription","sizes","openChildren","drawRowHeader","showColumnHeaders","columnHeaderCellBorderWidth","scrollBarWidth","isColumnHeaderCell","isColumnHeaderCellCap","endCap","drawHeaders","my","mx","xHover","yHover","allowFreezingColumns","freezeMarkerPosition","dragMode","frozenMarkerColor","frozenMarkerBorderColor","frozenMarkerHoverColor","frozenMarkerHeaderColor","frozenMarkerHoverBorderColor","dragStartObject","unshift","frozenMarkerActiveColor","frozenMarkerActiveBorderColor","posX","nearCell","getCellAt","isGrab","frozenMarkerActiveHeaderColor","posY","drawFrozenMarkers","mobile","allowMovingSelection","selectionHandleBorderWidth","selectionHandleBorderColor","selectionHandleColor","hw","selectionHandleSize","tr","br","tl","bl","addselectionHandle","az","touchSelectHandleZone","ax","ay","reorderObject","dragOffset","reorderMarkerBackgroundColor","reorderMarkerBorderWidth","reorderMarkerBorderColor","k","selections","getRowHeight","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","selectedRows","indexOf","reorderTarget","sortRowIndex","selectedColumns","sortColumnIndex","drawReorderMarkers","movingSelection","moveOverlayBorderWidth","moveOverlayBorderColor","setLineDash","moveOverlayBorderSegments","gridBorderWidth","gridBorderColor","dsb","selectionOverlayBorderWidth","selectionOverlayBorderColor","drawSelectionBorders","entities","scrollBarBoxMargin","scrollBarBorderColor","scrollBarBorderWidth","horizontalBox","scrollCache","horizontalBar","scrollBoxWidth","scrollWidth","verticalBox","verticalBar","scrollBoxHeight","scrollHeight","horizontalBarVisible","scrollBarBackgroundColor","scrollBarBoxColor","horizontalBoxVisible","context","scrollBarActiveColor","scrollBarBoxBorderRadius","verticalBarVisible","verticalBoxVisible","scrollBarCornerBorderColor","scrollBarCornerBackgroundColor","corner","frozenColumnsWidth","frozenRowsHeight","onTheLeft","columnGroupIndicatorPosition","onTheTop","rowGroupIndicatorPosition","groupingAreaBackgroundColor","groupedColumns","row","groups","j","assign","columnGroupRowHeight","toggleHandleSize","toggleHandlePadding","topY","centerY","bottomY","leftmostX","drawGroupHandleAtX","pushToVisibleGroups","leftX","rightX","x2","y2","crossTheFrozen","notInFrozen","colIndex","col","groupIndicatorColor","groupIndicatorBackgroundColor","ptr","left","right","containsBegining","containsEnd","rightCompare","compareX","minLeftX","lineCoords","groupedRows","colWidth","rowGroupColumnWidth","centerX","topmostY","drawGroupHandleAtY","top","bottom","bottomCompare","compareY","minTopY","drawGroupArea","showPerformance","debug","pop","font","debugFont","perf","reduce","toFixed","perfDelta","htmlImages","startScale","scaleDelta","zoomDeltaStart","touchLength","touches","touchPosition","touchPosition1","scrollIndex","scrollPixel","canvasOffset","touchDelta","touchAnimateTo","scrollAnimation","touchPPS","xPPS","yPPS","touchPPST","xPPST","yPPST","touchDuration","pointerLockPosition","mouse","touch","touchStart","hasFocus","dragContext","textAlign","debugBackgroundColor","key","debugColor","px","py","debugPerfChartBackground","debugScrollHeightColor","debugScrollWidthColor","debugPerformanceColor","debugEntitiesColor","debugTouchPPSXColor","debugTouchPPSYColor","dpl","apply","perfArr","arrIndex","max","color","useAbs","abs","drawPerfLine","debugPerfChartTextColor","drawPerfLines","createBorderOverlayArray","drawArray","propPrefix","offsetPoint","selectionBorder","isRowHeader","isHeader","cellGridAttributes","cellStyle","isCorner","isColumnHeader","isFilterable","filterable","includes","wrap","cellWhiteSpace","selected","hoverMode","openedFilter","selectedFilterButton","rawValue","isGrid","activeHeader","f","formatters","orderByArrowSize","treeArrowSize","ev","value","nodeType","fontHeight","horizontalAlignment","verticalAlignment","paddingTop","paddingRight","paddingBottom","whiteSpace","lineHeight","cellLineHeight","lineSpacing","cellLineSpacing","offsetWidth","offsetHeight","offsetParent","viewRowIndex","viewColumnIndex","boundRowIndex","boundColumnIndex","getBoundColumnIndexFromViewColumnIndex","isNormal","gridId","isRowTree","rowTreeColIndex","isColumnTree","calculatedLineHeight","paddedWidth","paddedHeight","userHeight","userWidth","saveRowGroupsRectInfo","saveColumnGroupsRectInfo","cellHeightWithChildGrid","cellWidthWithChildGrid","mt","treeArrowMarginTop","mr","treeArrowMarginRight","ml","treeArrowMarginLeft","aw","treeArrowWidth","ah","treeArrowHeight","treeArrowColor","treeArrowBorderColor","drawTreeArrow","showRowNumbers","childGrids","saveAppearance","createGrid","cellGridHeight","grid","orderBy","columnHeaderOrderByArrowMarginTop","columnHeaderOrderByArrowMarginLeft","columnHeaderOrderByArrowMarginRight","columnHeaderOrderByArrowWidth","columnHeaderOrderByArrowHeight","columnHeaderOrderByArrowColor","columnHeaderOrderByArrowBorderColor","orderDirection","drawOrderByArrow","orderByArrowWidth","console","warn","columnFilters","filterTextPrefix","splitChar","lines","word","elWidth","plWidth","clippedVal","previousLine","words","split","textHeight","autoResize","autoResizeRows","et","ellipsisText","line","cHeight","measureText","curSplitChar","measure","arr","splice","originText","stepLength","direction","substr","wrapText","treeCellPadding","isDrawText","vPos","hPos","stringify","pw","idx","idx_ord","drawText","selectionBorderTop","selectionBorderRight","selectionHandle","selectionBorderLeft","selectionBorderBottom","selectionHandleBehavior","createHandlesOverlayArray","moveOffset","filterButtonWidth","filterButtonHeight","filterButtonBorderColor","filterButtonBackgroundColor","filterButtonActiveBackgroundColor","onFilterButton","filterButtonHoverBackgroundColor","filterButtonBorderRadius","filterButtonArrowHeight","filterButtonArrowWidth","filterButtonArrowColor","filterButtonArrowBorderColor","drawFilterButtonArrow","drawFilterButton","isSorting","orderings","showRowNumberGaps","previousRowNumber","hasRowGap","find","beginRowIndex","endRowIndex","barHeight","rowHeaderCellRowNumberGapHeight","barColor","rowHeaderCellRowNumberGapColor","showUnhideColumnsIndicator","orderIndex0","orderIndex1","unhideIndicator","unhideIndicatorSize","cellX","isActive","orderIndex","isHiddenColumn","drawIndicator","iconsWidth","lineX0","lineX1","orderIndexPtr","prevColumnIndex","nextColumnIndex","showUnhideRowsIndicator","cellY","topIndicators","bottomIndicators","it","matched","indicatorY","treeHeight","rowSansTreeHeight","trees","scrollIndexRight","scrollPixelRight","module","exports","defineProperty","enumerable","get","Symbol","toStringTag","__esModule","create","bind","default","hasOwnProperty","concat","modifier","legacyModifier","navigation","editing","ui","device","imeCompositionKeys","koreanSpecific","japaneseSpecific","commonFunction","multimedia","multimediaNumpad","audio","speech","application","browser","mobilePhone","tv","mediaControls","isSupportedHtml","pasteValue","some","expression","IGNORE_NODETYPES","isHtmlTable","sanitizeElementData","element","elementData","innerText","String","trim","parseHtmlText","doc","DOMParser","parseFromString","querySelector","parseHtmlTable","childNodes","childNode","parseText","parseData","mimeType","htmlSafe","createTextString","selectedData","isNeat","values","join","createHTMLString","htmlString","wheeling","stopPropagation","fn","events","removeEventListener","sfn","defaultPrevented","preventDefault","getRatio","maxPixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","refreshScrollCacheX","frozenWidth","isColumnCollapsed","accumulator","column","schemaIndex","columnWidth","drawAfterResize","dims","vb","nb","co","isScrollBoxCorner","sbw","ratio","bm","cellBorder","columnHeaderCellBorder","dataHeight","dataWidth","topGroupAreaHeight","leftGroupAreaWidth","ch","setCanvasSize","args","setScrollBoxSize","checkScrollBoxVisibility","widthBoxRatio","heightBoxRatio","scrollBarBoxMinSize","scrollBarBoxWidth","bar","box","page","pageUpDownOverlap","newWidth","newHeight","resizeEditInput","scroll","overflowX","overflowY","dim","appliedInlineStyles","parentNodeStyle","dontDraw","floor","ellipsisCache","mousemove","overridePos","contextMenu","input","draggingItem","which","stopFreezeMove","mouseup","getLayerPos","dragBounds","sBounds","delta","ctrl","ctrlKey","metaKey","persistantSelectionMode","singleSelectionMode","NativeEvent","previousCell","clearTimeout","scrollTimer","isInGrid","rowBoundaryCrossed","columnBoundaryCrossed","cellBoundaryCrossed","prefix","cursorGrab","indicator","getUnhideIndicator","cursor","dragItem","pc","rc","rx","ry","selecting","dragStart","shiftKey","getSelectionBounds","isMultiColumnsSelected","isMultiRowsSelected","ignoreNextClick","contextmenuEvent","toggleCollapseTree","dragAddToSelection","event","getSelectedData","selectedCells","getSelectedCells","selectionBounds","selectRow","selectArea","autoScrollOnMousemove","movedVertically","autoScrollMargin","movedHorizontally","autoScrollZone","getColumnGroupAt","getRowGroupAt","click","startingBounds","endEdit","unhideColumns","unhideRows","toggleGroup","setStorageData","refresh","leftOffset","topOffset","xInGrid","yInGrid","setActiveCell","selectAll","checkSelectionChange","columnHeaderClickBehavior","treeArrowClickRadius","toggleTree","sb","dragResizeColumn","resizingStartingWidth","resizingStartingHeight","minColumnWidth","minRowHeight","resizeScrollZone","resizeChildGrids","globalRowResize","stopDragResize","hasMoved","dragItemIsSelected","isColumnSelected","fitSelectedColumns","scrollGrid","scrollPointerLock","scrollStartMode","movementX","movementY","scrollMode","scrollStart","scrollModes","setTimeout","scrollRepeatRate","selectionScrollIncrement","stopScrollGrid","exitPointerLock","dragReorder","columReorder","rowReorder","allowColumnReordering","allowRowReordering","selectColumn","source","reorderDeadZone","getVisibleCellByIndex","stopDragReorder","oIndex","tIndex","odata","cr","sortColumnIndices","selectedColumnIndices","deleteCount","dragMove","stopDragMove","moveSelection","freezeMove","startFreezeMove","mousedown","lastMouseDownTarget","button","move","freeze","onUnhideIndicator","requestPointerLock","dragging","controlInput","focus","getAdjacentCells","first","last","keydown","adjacentCells","cols","keepFocusOnMouseOut","isPrintableKeyEvent","beginEditAt","selectNone","deleteSelectedData","Number","isArrowKey","firstSelectedRowIndex","firstSelectedRow","firstSelectedColumnIndex","lastSelectedColumn","yAtTop","yAtBottom","xAtLeft","xAtRight","selection","scrollIntoView","selectionFollowsActiveCell","keyup","keypress","dblclick","fitColumnToValues","autosize","cellTreeExpandCollapse","scrollWheel","deltaX","deltaY","deltaMode","touchHaltAnimation","scrollTo","pasteData","startRowIndex","startColIndex","cellData","forEachSelectedCell","colName","realRowIndex","cells","existingRowData","newRowData","columnName","boundRowIndexMap","affectedCells","getNextVisibleColumnIndex","visibleColumnIndex","getVisibleSchema","getVisibleColumnIndexOf","paste","editable","clipboardItems","Map","clipboardData","items","supportedMimeTypes","pasteableItems","itemToPaste","startCell","len","pasteType","getAsString","cut","copySelectedCellsToClipboard","clearSelectedCells","copy","touchMoving","touchScrollTimeout","animationFrames","getTouchPos","touchIndex","getBoundingClientRect","clientX","clientY","easingFunctions","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easing","touchEasingMethod","calculatePPSTimed","touchSigmaTimed","calculatePPS","touchSigma","touchEndAnimation","touchReleaseAnimationDurationMs","stopAnimation","touchEditCell","touchstart","changedTouches","startingCell","disposeContextMenu","clearInterval","calculatePPSTimer","touchContextTimeout","touchStartEvent","zoomAltered","touchStart1","touchScrollStart","touchContextMenuTimeMs","setInterval","touchEndEvents","body","touchmove","passive","touchend","touchcancel","touchSelect","handleType","touchSelecting","bounds","rw","rScrollZone","lScrollZone","bScrollZone","tScrollZone","t1","t2","touchDeadZone","touchZoomSensitivity","touchZoomMin","touchZoomMax","selectionScrollZone","touchScroll","touchMove","dz","touchReleaseAcceleration","scrollAnimationPPSThreshold","ctor","treeGridAttributes","storageName","invalidSearchExpClass","localStyleLibraryStorageKey","add","sortFunction","filters","tempSchema","columnTreeRowStartIndex","columnTreeRowEndIndex","origin","sorters","parsers","schemaHashes","changes","componentL1Events","eventNames","expandToRow","viewDataLength","orderedIndex","entries","firstRowAsString","rowAsString","rowDict","textString","copiedData","setData","has","allowGroupingColumns","allowGroupingRows","result","groupIndex","matchedGroup","allGroups","gi","nextCollapsed","isNewGroupRangeValid","groupsArray","gIndex","visibility","localStorage","setItem","createColumnOrders","selectedColumn","applyDefaultValue","defaultValue","createNewRowData","getSchemaNameHash","getFilteredAndSortedViewData","newViewData","originalRowIndex","ranges","countOfRows","headerName","filterText","getHeaderByName","currentFilterFunction","filterFrozenRows","newLen","from2","to2","slice","sortFn","rowA","rowB","rowIndexB","sortFrozenRows","getBestGuessDataType","drawChildGrids","gridKey","setTimer","validateColumn","setDefaults","obj1","obj2","setAttributes","setStyle","findColumnMaxTextLength","dispose","removeChild","eventParent","contextmenu","disconnect","tryLoadStoredSettings","reloadStoredValues","storedSettings","_typeof","tempData","collapsedCount","ctr","ri","lastchild","orTree","ctc","ci","_ri","child","_ci","si","otherData","tempRow","colTrees","collapsedColCount","initCellTreeSettings","invalidRowTree","rt","begin","parentIndex","columnTree","dataColumnLength","invalidColumnTree","ct","getDomRoot","shadowRoot","host","getFontName","fontStyle","getFontHeight","parseFloat","parseStyleValue","initProp","propName","getStyleProperty","styleKeys","supressDrawAndEvent","isDim","getItem","message","init","initialized","publicStyleKeyIntf","initScrollBox","setDom","ie","navigator","userAgent","edge","webKit","moz","blankValues","cursorGrabing","cursorGrabbing","appendTo","clearChangeLog","gotoCell","gotoRow","addButton","toggleCellCollapseTree","expandCollapseCellTree","findColumnScrollLeft","findRowScrollTop","groupColumns","groupRows","removeGroupColumns","removeGroupRows","toggleGroupColumns","toggleGroupRows","getGroupsColumnBelongsTo","getGroupsRowBelongsTo","isCellVisible","isRowVisible","isColumnVisible","clipElement","getSchemaFromData","setFilter","expandTree","collapseTree","insertRow","deleteRow","addRow","insertColumn","deleteColumn","addColumn","getClippingRect","setRowHeight","setColumnWidth","resetColumnWidths","resetRowHeights","assertPxColor","clearPxColorAssertions","integerToAlpha","hideColumns","hideRows","addStyleKeyIfNoneExists","DOMStyles","set","valueObject","filterFor","blanksText","filterRegExp","pattern","exec","flags","substring","flagLength","invalidFilterRegEx","RegExp","toLocaleUpperCase","textContent","blur","TypeError","currentCursor","eventName","RangeError","isArray","getTypes","parseInnerHtml","callback","etl","autoGenerateSchema","autoResizeColumns","sHeight","sWidth","setScrollTop","preventScrollEvent","moveButtonPos","setScrollLeft","supressDrawEvent","zIndexTop","hoverScrollTimeout","autoCompleteContext","applyContextItemStyle","contextItemContainer","createInlineStyle","createContextMenu","parentContextMenu","loc","container","createElement","upArrow","downArrow","children","selectedIndex","checkArrowVisibility","startHoverScroll","contextHoverScrollAmount","contextHoverScrollRateMs","endHoverScroll","scrollOffset","contextMenuZIndex","childMenuArrow","removeChildContext","relatedTarget","contains","setAttribute","contextAddCallback","getAttribute","cPos","childContextMenuMarginLeft","childContextMenuMarginTop","createChildContext","addContent","content","childContextMenuArrowHTML","addItem","opacity","position","contextMenuArrowColor","zIndex","inputDropdown","maxHeight","innerHeight","autocompleteBottomMargin","minWidth","contextMenuArrowUpHTML","contextMenuArrowDownHTML","display","timer","animationDurationShowContextMenu","unfade","contextMenuWindowMargin","innerWidth","clickIndex","Event","animationDurationHideContextMenu","isFinite","createFilterContextMenuItems","iRect","filterContainer","filterLabel","filterAutoCompleteButton","filterInput","checkRegExpErrorState","background","contextFilterInputBackground","contextFilterInputColor","contextFilterInvalidRegExpBackground","contextFilterInvalidRegExpColor","createAutoCompleteContext","count","blanksItem","autoCompleteItems","cellValue","maxAutoCompleteItems","disposeAutocomplete","onclick","filterOptionText","contextFilterButtonHTML","cf","removeFilterOptionText","getSelectedContiguousRows","allowOnlyOneRow","prev","ok","addDefaultContextMenuItem","getColumnsMap","_col","isNormalCell","isBackground","isScrollBar","showFilter","showCopy","copyText","execCommand","showPaste","clipBoardData","pasteText","showColumnSelector","columnSelectorText","toggleColumnVisibility","columnSelectorHiddenText","columnSelectorVisibleText","contiguousColumns","memoKey","compare","currentOrderIndex","matchedRange","matchedSchema","thisSchema","getSelectedContiguousColumns","hideColumnText","showClearSettingsOption","clearSettingsOptionText","allowSorting","showOrderByOption","showOrderByOptionTextAsc","showOrderByOptionTextDesc","boundRowIndexes","showHideRow","showHideRows","groupAreaHeight","groupAreaWidth","setCollapseStateForAllGroups","showRemoveAllGroupColumns","showExpandAllGroupColumns","showCollapseAllGroupColumns","showRemoveAllGroupRows","showExpandAllGroupRows","showCollapseAllGroupRows","canGroupByColumns","canUngroupColumns","canGroupByRows","canUngroupRows","groupIndexes","groupTitles","groupNames","showGroupColumns","cell0","cell1","formatArgs","showRemoveGroupColumns","rangeTitle","showGroupRows","showRemoveGroupRows","childGrid","childGridsOfParent","nodeA","nodeB","x1","y1","node","newX1","newY1","contextPosition","contextMenuMarginLeft","contextMenuMarginTop","mobileContextMenuMargin","filterButtonMenuOffsetTop","createDisposeEvent","createButton","imgSrc","wrapper","buttonArrow","buttonIcon","buttonZIndex","buttonMenu","applyButtonStyle","buttonArrowDownHTML","maxWidth","toggleButtonMenu","disposeButtonMenu","createItems","menuItemContainer","buttonMenuItemContainer","applyButtonMenuItemStyle","disposeButton","buttonMenuWindowMargin","createButtonMenu","keyCode","attachButton","ele","boundingRect","eleRect","clipRect","parentRect","Infinity","scrollingElement","editCell","borderWidth","mobileEditInputHeight","groupAreaOffsetY","groupAreaOffsetX","cellPaddingLeft","ignoreScrollOffset","calculatedTree","isTree","abort","newValue","oldValue","aborted","inEnterMode","enumItems","enu","option","valueInEnum","multiLine","editCellZIndex","fontSize","editCellFontSize","cellValueIsEmpty","shouldClearCellValue","nx","ny","altKey","nextRowIndex","className","css","padding","buttonPadding","borderStyle","borderColor","buttonBorderColor","buttonBackgroundColor","userSelect","buttonHoverBackgroundColor","buttonActiveBorderColor","buttonActiveBackgroundColor","verticalAlign","buttonArrowColor","fontWeight","fontFamily","contextMenuFontFamily","contextMenuFontSize","margin","contextMenuItemMargin","borderRadius","contextMenuItemBorderRadius","contextMenuHoverBackground","contextMenuHoverColor","contextMenuLabelMargin","contextMenuLabelDisplay","contextMenuLabelMinWidth","contextMenuLabelMaxWidth","contextMenuBackground","contextMenuColor","border","contextMenuBorder","contextMenuPadding","contextMenuBorderRadius","contextMenuOpacity","overflow","contextMenuCursor","contextFilterInputBorder","contextFilterInputBorderRadius","contextFilterInputFontFamily","contextFilterInputFontSize","contextFilterButtonBorder","contextFilterButtonBorderRadius","contextMenuFilterButtonFontFamily","contextMenuFilterButtonFontSize","cssFloat","childContextMenuArrowColor","contextMenuChildArrowFontSize","boxSizing","outline","mobileEditFontFamily","mobileEditFontSize","editCellBorder","editCellColor","editCellBackgroundColor","appearance","webkitAppearance","mozAppearance","editCellPaddingLeft","editCellFontFamily","boxShadow","editCellBoxShadow","contextMenuFilterInvalidExpresion","onblur","parentIsCanvas","getContext","textBaseline","mergeHiddenRowRanges","newRange","inserted","nextRange","addGroup","groupFor","removeGroup","ordA","charCodeAt","fromCharCode","showFilterInCell","offsetX","offsetY","targetX","targetY","sbh","treeData","colIsSelected","isRowSelected","rowIsSelected","supressEvent","addCol","st","de","dragObject","trArgs","treeGridHeight","beginColumnOrderIndex","endColumnOrderIndex","hiddenColumns","newSize","dontSetStorageData","sorter","firstColumnName","lastColumnName","firstOne","lastOne","error","rowIndexFrom","rowIndexTo","isInteger","dataLength","sel","xi","visibleSchema","selectionLength","maxRowLength","minXi","yi","lastSourceIndex","cidx","indicators","useTouchScrollZones","getBorder","entitiy","borderResizeZone","moveBorder","tsz","touchScrollZone","moveMode","borderDragBehavior","xBorderBehavior","yBorderBehavior","isVerticalScrollBar","isHorizontalScrollBar","allowColumnResize","allowColumnResizeFromCell","allowRowHeaderResize","allowRowResize","allowRowResizeFromCell","columnGrabZoneSize","rowGrabZoneSize","maxCol","minCol","rowHeaderCellFont","autosizePadding","autosizeHeaderCellPadding","rowHeaderCellPaddingRight","rowHeaderCellPaddingLeft","formatter","columnHeaderCellFont","columnHeaderCellPaddingRight","columnHeaderCellPaddingLeft","cellAutoResizePadding","cellFont","cellPaddingRight","total","headerCell","int","asc","aValue","bValue","localeCompare","date","Date","getTime","webComponent","modules","dom","publicMethods","Grid","eval","attachShadow","canvasDatagrid","tKeys","customElements","argKey","tKey","sKey","HTMLElement","observedAttributes","define","require"],"mappings":"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"}
1
+ {"version":3,"file":"canvas-datagrid.module.js","sources":["../lib/defaults.js","../lib/component.js","../lib/draw.js","../node_modules/is-printable-key-event/dist/index.js","../lib/events/util.js","../lib/events/index.js","../lib/touch.js","../lib/intf.js","../lib/contextMenu.js","../lib/button.js","../lib/dom.js","../lib/groups/util.js","../lib/publicMethods.js","../lib/main.js"],"sourcesContent":["/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n\n'use strict';\nexport default function (self) {\n self.defaults = {\n attributes: [\n ['allowColumnReordering', true],\n ['allowColumnResize', true],\n ['allowColumnResizeFromCell', false],\n ['allowFreezingRows', false],\n ['allowFreezingColumns', false],\n ['allowMovingSelection', true],\n ['allowRowHeaderResize', true],\n ['allowRowReordering', false],\n ['allowRowResize', true],\n ['allowRowResizeFromCell', false],\n ['allowSorting', true],\n ['allowGroupingRows', true],\n ['allowGroupingColumns', true],\n ['animationDurationShowContextMenu', 50],\n ['animationDurationHideContextMenu', 50],\n ['autoGenerateSchema', false],\n ['autoResizeColumns', false],\n ['autoResizeRows', false],\n ['autoScrollOnMousemove', false],\n ['autoScrollMargin', 5],\n ['allowShrinkingSelection', false],\n ['blanksText', '(Blanks)'],\n ['borderDragBehavior', 'none'],\n ['borderResizeZone', 10],\n ['clearCellsWhenShrinkingSelection', false],\n ['clearSettingsOptionText', 'Clear saved settings'],\n ['columnHeaderClickBehavior', 'sort'],\n ['columnSelectorHiddenText', '&nbsp;&nbsp;&nbsp;'],\n ['columnSelectorText', 'Add/Remove columns'],\n ['columnSelectorVisibleText', '\\u2713'],\n ['contextHoverScrollAmount', 2],\n ['contextHoverScrollRateMs', 5],\n ['copyHeadersOnSelectAll', true],\n ['copyText', 'Copy'],\n ['debug', false],\n ['editable', true],\n ['ellipsisText', '...'],\n ['filterOptionText', 'Filter %s'],\n ['filterTextPrefix', '(filtered) '],\n ['filterFrozenRows', true],\n ['globalRowResize', false],\n ['hideColumnText', 'Hide %s'],\n ['showUnhideColumnsIndicator', false],\n ['showUnhideRowsIndicator', false],\n ['showHideRow', 'Hide row %s'],\n ['showHideRows', 'Hide rows %s'],\n ['hoverMode', 'cell'],\n ['keepFocusOnMouseOut', false],\n ['maxAutoCompleteItems', 200],\n ['multiLine', false],\n ['name', ''],\n ['pageUpDownOverlap', 1],\n ['pasteText', 'Paste'],\n ['persistantSelectionMode', false],\n ['removeFilterOptionText', 'Remove filter on %s'],\n ['reorderDeadZone', 3],\n ['resizeScrollZone', 20],\n ['rowGrabZoneSize', 5],\n ['columnGrabZoneSize', 30],\n ['saveAppearance', true],\n ['scrollAnimationPPSThreshold', 0.75],\n ['scrollPointerLock', false],\n ['scrollRepeatRate', 75],\n ['selectionFollowsActiveCell', false],\n ['selectionHandleBehavior', 'none'],\n ['selectionMode', 'cell'],\n ['selectionScrollIncrement', 20],\n ['selectionScrollZone', 20],\n ['showClearSettingsOption', true],\n ['showColumnHeaders', true],\n ['showColumnSelector', true],\n ['showCopy', false],\n ['showFilter', true],\n ['showFilterInCell', false],\n ['showNewRow', false],\n ['showOrderByOption', true],\n ['showOrderByOptionTextAsc', 'Order by %s ascending'],\n ['showOrderByOptionTextDesc', 'Order by %s descending'],\n //#region grouping\n ['showGroupColumns', 'Group columns %s'],\n ['showGroupRows', 'Group rows %s'],\n ['showRemoveGroupColumns', 'Remove group %s'],\n ['showRemoveGroupRows', 'Remove group %s'],\n ['showRemoveAllGroupColumns', 'Remove all column groups'],\n ['showRemoveAllGroupRows', 'Remove all row groups'],\n ['showExpandAllGroupColumns', 'Expand all column groups'],\n ['showExpandAllGroupRows', 'Expand all row groups'],\n ['showCollapseAllGroupColumns', 'Collapse all column groups'],\n ['showCollapseAllGroupRows', 'Collapse all row groups'],\n ['columnGroupIndicatorPosition', 'right'],\n ['rowGroupIndicatorPosition', 'bottom'],\n //#endregion grouping\n ['showPaste', false],\n ['showPerformance', false],\n ['showRowHeaders', true],\n ['showRowNumbers', true],\n ['showRowNumberGaps', true],\n ['singleSelectionMode', false],\n ['snapToRow', false],\n ['sortFrozenRows', true],\n ['touchContextMenuTimeMs', 800],\n ['touchDeadZone', 3],\n ['touchEasingMethod', 'easeOutQuad'],\n ['touchReleaseAcceleration', 1000],\n ['touchReleaseAnimationDurationMs', 2000],\n ['touchScrollZone', 20],\n ['touchSelectHandleZone', 20],\n ['touchZoomSensitivity', 0.005],\n ['touchZoomMin', 0.5],\n ['touchZoomMax', 1.75],\n ['maxPixelRatio', 2],\n ['tree', false],\n ['treeHorizontalScroll', false],\n ['rowTree', []],\n ['rowTreeColIndex', 0],\n ['columnTree', []],\n ['columnTreeRowStartIndex', 0],\n ['columnTreeRowEndIndex', 0],\n ],\n styles: [\n ['activeCellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellBorderColor', 'rgba(110, 168, 255, 1)'],\n ['activeCellBorderWidth', 1],\n ['activeCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellFont', '16px sans-serif'],\n ['activeCellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellHorizontalAlignment', 'left'],\n ['activeCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['activeCellOverlayBorderWidth', 1],\n ['activeCellPaddingBottom', 5],\n ['activeCellPaddingLeft', 5],\n ['activeCellPaddingRight', 5],\n ['activeCellPaddingTop', 5],\n ['activeCellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['activeCellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellVerticalAlignment', 'center'],\n ['activeColumnHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeColumnHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeRowHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeRowHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['autocompleteBottomMargin', 60],\n ['autosizeHeaderCellPadding', 8],\n ['autosizePadding', 5],\n ['buttonActiveBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['buttonActiveBorderColor', 'rgba(110, 168, 255, 1)'],\n ['buttonArrowColor', 'rgba(50, 50, 50, 1)'],\n ['buttonArrowDownHTML', '&#x25BC;'],\n ['buttonZIndex', 10000],\n ['buttonBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['buttonBorderColor', 'rgba(172, 172, 172, 1)'],\n ['buttonHoverBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['buttonMenuWindowMargin', 30],\n ['buttonPadding', '3px'],\n ['cellAutoResizePadding', 13],\n ['cellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellBorderColor', 'rgba(195, 199, 202, 1)'],\n ['cellBorderWidth', 1],\n ['cellColor', 'rgba(0, 0, 0, 1)'],\n ['cellFont', '16px sans-serif'],\n ['cellGridHeight', 250],\n ['cellHeight', 24],\n ['cellHeightWithChildGrid', 150],\n ['cellHorizontalAlignment', 'left'],\n ['cellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['cellPaddingBottom', 5],\n ['cellPaddingLeft', 5],\n ['cellPaddingRight', 5],\n ['cellPaddingTop', 5],\n ['cellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['cellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['cellTreeIconBorderColor', 'rgba(162, 174, 207, 1)'],\n ['cellTreeIconFillColor', 'rgba(240, 240, 240, 1)'],\n ['cellTreeIconHoverFillColor', 'rgba(198, 217, 233, 1)'],\n ['cellTreeIconLineColor', 'rgba(43, 53, 81, 1)'],\n ['cellTreeIconLineWidth', 1.5],\n ['cellTreeIconMarginLeft', 0],\n ['cellTreeIconMarginRight', 5],\n ['cellTreeIconMarginTop', 6],\n ['cellTreeIconWidth', 13],\n ['cellVerticalAlignment', 'center'],\n ['cellWidth', 250],\n ['cellWidthWithChildGrid', 250],\n ['cellWhiteSpace', 'nowrap'],\n ['cellLineHeight', 1],\n ['cellLineSpacing', 3],\n ['childContextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['childContextMenuArrowHTML', '&#x25BA;'],\n ['childContextMenuMarginLeft', -11],\n ['childContextMenuMarginTop', -6],\n ['columnGroupRowHeight', 25],\n ['columnHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['columnHeaderCellBorderColor', 'rgba(172, 172, 172, 1)'],\n ['columnHeaderCellBorderWidth', 1],\n ['columnHeaderCellCapBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['columnHeaderCellCapBorderColor', 'rgba(172, 172, 172, 1)'],\n ['columnHeaderCellCapBorderWidth', 1],\n ['columnHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['columnHeaderCellFont', '16px sans-serif'],\n ['columnHeaderCellHeight', 25],\n ['columnHeaderCellHorizontalAlignment', 'left'],\n ['columnHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['columnHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['columnHeaderCellPaddingBottom', 5],\n ['columnHeaderCellPaddingLeft', 5],\n ['columnHeaderCellPaddingRight', 5],\n ['columnHeaderCellPaddingTop', 5],\n ['columnHeaderCellVerticalAlignment', 'center'],\n ['columnHeaderOrderByArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['columnHeaderOrderByArrowBorderWidth', 1],\n ['columnHeaderOrderByArrowColor', 'rgba(155, 155, 155, 1)'],\n ['columnHeaderOrderByArrowHeight', 8],\n ['columnHeaderOrderByArrowMarginLeft', 0],\n ['columnHeaderOrderByArrowMarginRight', 5],\n ['columnHeaderOrderByArrowMarginTop', 6],\n ['columnHeaderOrderByArrowWidth', 13],\n ['contextFilterButtonBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterButtonBorderRadius', '3px'],\n ['contextFilterButtonHTML', '&#x25BC;'],\n ['contextFilterInputBackground', 'rgba(255,255,255,1)'],\n ['contextFilterInputBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterInputBorderRadius', '0'],\n ['contextFilterInputColor', 'rgba(0,0,0,1)'],\n ['contextFilterInputFontFamily', 'sans-serif'],\n ['contextFilterInputFontSize', '14px'],\n ['contextFilterInvalidRegExpBackground', 'rgba(180, 6, 1, 1)'],\n ['contextFilterInvalidRegExpColor', 'rgba(255, 255, 255, 1)'],\n ['contextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuArrowDownHTML', '&#x25BC;'],\n ['contextMenuArrowUpHTML', '&#x25B2;'],\n ['contextMenuBackground', 'rgba(240, 240, 240, 1)'],\n ['contextMenuBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextMenuBorderRadius', '3px'],\n ['contextMenuChildArrowFontSize', '12px'],\n ['contextMenuColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuCursor', 'default'],\n ['contextMenuFilterButtonFontFamily', 'sans-serif'],\n ['contextMenuFilterButtonFontSize', '10px'],\n ['contextMenuFilterInvalidExpresion', 'rgba(237, 155, 156, 1)'],\n ['contextMenuFontFamily', 'sans-serif'],\n ['contextMenuFontSize', '16px'],\n ['contextMenuHoverBackground', 'rgba(182, 205, 250, 1)'],\n ['contextMenuHoverColor', 'rgba(43, 48, 153, 1)'],\n ['contextMenuItemBorderRadius', '3px'],\n ['contextMenuItemMargin', '2px'],\n ['contextMenuLabelDisplay', 'inline-block'],\n ['contextMenuLabelMargin', '0 3px 0 0'],\n ['contextMenuLabelMaxWidth', '700px'],\n ['contextMenuLabelMinWidth', '75px'],\n ['contextMenuMarginLeft', 3],\n ['contextMenuMarginTop', -3],\n ['contextMenuOpacity', '0.98'],\n ['contextMenuPadding', '2px'],\n ['contextMenuWindowMargin', 30],\n ['contextMenuZIndex', 10000],\n ['cornerCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['cornerCellBorderColor', 'rgba(202, 202, 202, 1)'],\n ['debugBackgroundColor', 'rgba(0, 0, 0, .0)'],\n ['debugColor', 'rgba(255, 15, 24, 1)'],\n ['debugEntitiesColor', 'rgba(76, 231, 239, 1.00)'],\n ['debugFont', '11px sans-serif'],\n ['debugPerfChartBackground', 'rgba(29, 25, 26, 1.00)'],\n ['debugPerfChartTextColor', 'rgba(255, 255, 255, 0.8)'],\n ['debugPerformanceColor', 'rgba(252, 255, 37, 1.00)'],\n ['debugScrollHeightColor', 'rgba(248, 33, 103, 1.00)'],\n ['debugScrollWidthColor', 'rgba(66, 255, 27, 1.00)'],\n ['debugTouchPPSXColor', 'rgba(246, 102, 24, 1.00)'],\n ['debugTouchPPSYColor', 'rgba(186, 0, 255, 1.00)'],\n ['display', 'inline-block'],\n ['editCellBackgroundColor', 'white'],\n ['editCellBorder', 'solid 1px rgba(110, 168, 255, 1)'],\n ['editCellBoxShadow', '0 2px 5px rgba(0,0,0,0.4)'],\n ['editCellColor', 'black'],\n ['editCellFontFamily', 'sans-serif'],\n ['editCellFontSize', '16px'],\n ['editCellPaddingLeft', 4],\n ['editCellZIndex', 10000],\n ['filterButtonActiveBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['filterButtonArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['filterButtonArrowBorderWidth', 1],\n ['filterButtonArrowClickRadius', 5],\n ['filterButtonArrowColor', 'rgba(50, 50, 50, 1)'],\n ['filterButtonArrowHeight', 5],\n ['filterButtonArrowWidth', 8],\n ['filterButtonBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['filterButtonBorderColor', 'rgba(172, 172, 172, 1)'],\n ['filterButtonBorderRadius', 3],\n ['filterButtonHeight', 20],\n ['filterButtonHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['filterButtonMenuOffsetTop', 10],\n ['filterButtonWidth', 20],\n ['frozenMarkerHoverColor', 'rgba(165, 198, 254, 1)'],\n ['frozenMarkerHoverBorderColor', 'rgba(165, 198, 254, 1)'],\n ['frozenMarkerActiveColor', 'rgba(165, 198, 254, 0.2)'],\n ['frozenMarkerActiveBorderColor', 'rgba(165, 198, 254, 0.5)'],\n ['frozenMarkerActiveHeaderColor', 'rgba(165, 198, 254, 1)'],\n ['frozenMarkerColor', 'rgba(221, 221, 221, 1)'],\n ['frozenMarkerBorderColor', 'rgba(221, 221, 221, 1)'],\n ['frozenMarkerBorderWidth', 1],\n ['frozenMarkerHeaderColor', 'rgba(188, 188, 188, 1)'],\n ['frozenMarkerWidth', 4],\n ['groupingAreaBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['gridBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['gridBorderCollapse', 'collapse'],\n ['gridBorderColor', 'rgba(202, 202, 202, 1)'],\n ['gridBorderWidth', 1],\n ['groupIndicatorColor', 'rgba(155, 155, 155, 1)'],\n ['groupIndicatorBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['height', 'auto'],\n ['maxHeight', 'inherit'],\n ['maxWidth', 'inherit'],\n ['minColumnWidth', 45],\n ['minHeight', 'inherit'],\n ['minRowHeight', 24],\n ['minWidth', 'inherit'],\n ['mobileContextMenuMargin', 10],\n ['mobileEditInputHeight', 30],\n ['mobileEditFontFamily', 'sans-serif'],\n ['mobileEditFontSize', '16px'],\n ['moveOverlayBorderWidth', 1],\n ['moveOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['moveOverlayBorderSegments', '12, 7'],\n ['name', 'default'],\n ['overflowY', 'auto'],\n ['overflowX', 'auto'],\n ['reorderMarkerBackgroundColor', 'rgba(0, 0, 0, 0.1)'],\n ['reorderMarkerBorderColor', 'rgba(0, 0, 0, 0.2)'],\n ['reorderMarkerBorderWidth', 1.25],\n ['reorderMarkerIndexBorderColor', 'rgba(66, 133, 244, 1)'],\n ['reorderMarkerIndexBorderWidth', 2.75],\n ['rowGroupColumnWidth', 25],\n ['rowHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['rowHeaderCellBorderColor', 'rgba(200, 200, 200, 1)'],\n ['rowHeaderCellBorderWidth', 1],\n ['rowHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellFont', '16px sans-serif'],\n ['rowHeaderCellHeight', 25],\n ['rowHeaderCellHorizontalAlignment', 'left'],\n ['rowHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['rowHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['rowHeaderCellPaddingBottom', 5],\n ['rowHeaderCellPaddingLeft', 5],\n ['rowHeaderCellPaddingRight', 5],\n ['rowHeaderCellPaddingTop', 5],\n ['rowHeaderCellRowNumberGapHeight', 5],\n ['rowHeaderCellRowNumberGapColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellSelectedBackgroundColor', 'rgba(217, 217, 217, 1)'],\n ['rowHeaderCellSelectedColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellVerticalAlignment', 'center'],\n ['rowHeaderCellWidth', 57],\n ['scrollBarActiveColor', 'rgba(125, 125, 125, 1)'],\n ['scrollBarBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarBorderWidth', 0.5],\n ['scrollBarBoxBorderRadius', 4.125],\n ['scrollBarBoxColor', 'rgba(192, 192, 192, 1)'],\n ['scrollBarBoxMargin', 2],\n ['scrollBarBoxMinSize', 15],\n ['scrollBarBoxWidth', 8],\n ['scrollBarCornerBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarCornerBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarWidth', 11],\n ['selectionHandleBorderColor', 'rgba(255, 255, 255, 1)'],\n ['selectionHandleBorderWidth', 1.5],\n ['selectionHandleColor', 'rgba(66, 133, 244, 1)'],\n ['selectionHandleSize', 8],\n ['selectionHandleType', 'square'],\n ['fillOverlayBorderColor', 'rgba(127, 127, 127, 1)'],\n ['fillOverlayBorderWidth', 2],\n ['selectionOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['selectionOverlayBorderWidth', 1],\n ['treeArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['treeArrowBorderWidth', 1],\n ['treeArrowClickRadius', 5],\n ['treeArrowColor', 'rgba(155, 155, 155, 1)'],\n ['treeArrowHeight', 8],\n ['treeArrowMarginLeft', 0],\n ['treeArrowMarginRight', 5],\n ['treeArrowMarginTop', 6],\n ['treeArrowWidth', 13],\n ['treeGridHeight', 250],\n ['unhideIndicatorColor', 'rgba(0, 0, 0, 1)'],\n ['unhideIndicatorBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['unhideIndicatorBorderColor', 'rgba(174, 193, 232, 1)'],\n ['unhideIndicatorSize', 16],\n ['width', 'auto'],\n ],\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport defaults from './defaults';\n\nexport default function () {\n var typeMap,\n component = {};\n component.dehyphenateProperty = function hyphenateProperty(prop) {\n prop = prop.replace('--cdg-', '');\n var p = '',\n nextLetterCap;\n Array.prototype.forEach.call(prop, function (char) {\n if (nextLetterCap) {\n nextLetterCap = false;\n p += char.toUpperCase();\n return;\n }\n if (char === '-') {\n nextLetterCap = true;\n return;\n }\n p += char;\n });\n return p;\n };\n component.hyphenateProperty = function hyphenateProperty(prop, cust) {\n var p = '';\n Array.prototype.forEach.call(prop, function (char) {\n if (char === char.toUpperCase()) {\n p += '-' + char.toLowerCase();\n return;\n }\n p += char;\n });\n return (cust ? '--cdg-' : '') + p;\n };\n function getDefaultItem(base, item) {\n var i = {},\n r;\n defaults(i);\n r = i.defaults[base].filter(function (i) {\n return (\n i[0].toLowerCase() === item.toLowerCase() ||\n component.hyphenateProperty(i[0]) === item.toLowerCase() ||\n component.hyphenateProperty(i[0], true) === item.toLowerCase()\n );\n })[0];\n return r;\n }\n component.applyComponentStyle = function (supressChangeAndDrawEvents, intf) {\n if (!intf.isComponent) {\n return;\n }\n var cStyle = window.getComputedStyle(\n intf.tagName === 'CANVAS-DATAGRID' ? intf : intf.canvas,\n null,\n ),\n defs = {};\n intf.computedStyle = cStyle;\n defaults(defs);\n defs = defs.defaults.styles;\n defs.forEach(function (def) {\n var val;\n val = cStyle.getPropertyValue(component.hyphenateProperty(def[0], true));\n if (val === '') {\n val = cStyle.getPropertyValue(\n component.hyphenateProperty(def[0], false),\n );\n }\n if (val !== '' && typeof val === 'string') {\n intf.setStyleProperty(\n def[0],\n typeMap[typeof def[1]](\n val.replace(/^\\s+/, '').replace(/\\s+$/, ''),\n def[1],\n ),\n true,\n );\n }\n });\n if (!supressChangeAndDrawEvents && intf.dispatchEvent) {\n requestAnimationFrame(function () {\n intf.resize(true);\n });\n intf.dispatchEvent('stylechanged', intf.style);\n }\n };\n typeMap = {\n data: function (strData) {\n try {\n return JSON.parse(strData);\n } catch (e) {\n throw new Error('Cannot read JSON data in canvas-datagrid data.');\n }\n },\n schema: function (strSchema) {\n try {\n return JSON.parse(strSchema);\n } catch (e) {\n throw new Error(\n 'Cannot read JSON data in canvas-datagrid schema attribute.',\n );\n }\n },\n number: function (strNum, def) {\n var n = parseInt(strNum, 10);\n return isNaN(n) ? def : n;\n },\n boolean: function (strBool) {\n return /true/i.test(strBool);\n },\n string: function (str) {\n return str;\n },\n };\n component.getObservableAttributes = function () {\n var i = {},\n attrs = ['data', 'schema', 'style', 'className', 'name'];\n defaults(i);\n i.defaults.attributes.forEach(function (attr) {\n attrs.push(attr[0].toLowerCase());\n });\n return attrs;\n };\n component.disconnectedCallback = function () {\n this.connected = false;\n };\n component.connectedCallback = function () {\n var intf = this;\n intf.parentDOMNode.innerHTML = '';\n intf.parentDOMNode.appendChild(intf.canvas);\n intf.connected = true;\n component.observe(intf);\n component.applyComponentStyle(true, intf);\n intf.resize(true);\n };\n component.adoptedCallback = function () {\n this.resize();\n };\n component.attributeChangedCallback = function (attrName, oldVal, newVal) {\n var tfn,\n intf = this,\n def;\n if (attrName === 'style') {\n component.applyComponentStyle(false, intf);\n return;\n }\n if (attrName === 'data') {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = newVal;\n return;\n }\n if (attrName === 'schema') {\n intf.schema = typeMap.schema(newVal);\n return;\n }\n if (attrName === 'name') {\n intf.name = newVal;\n return;\n }\n if (attrName === 'class' || attrName === 'className') {\n return;\n }\n def = getDefaultItem('attributes', attrName);\n if (def) {\n tfn = typeMap[typeof def[1]];\n intf.attributes[def[0]] = tfn(newVal);\n return;\n }\n if (/^on/.test(attrName)) {\n intf.addEventListener('on' + attrName, Function('e', newVal));\n }\n return;\n };\n component.observe = function (intf) {\n var observer;\n if (!window.MutationObserver) {\n return;\n }\n intf.applyComponentStyle = function () {\n component.applyComponentStyle(false, intf);\n intf.resize();\n };\n /**\n * Applies the computed css styles to the grid. In some browsers, changing directives in attached style sheets does not automatically update the styles in this component. It is necessary to call this method to update in these cases.\n * @memberof canvasDatagrid\n * @name applyComponentStyle\n * @method\n */\n observer = new window.MutationObserver(function (mutations) {\n var checkInnerHTML, checkStyle;\n Array.prototype.forEach.call(mutations, function (mutation) {\n if (\n mutation.attributeName === 'class' ||\n mutation.attributeName === 'style'\n ) {\n checkStyle = true;\n return;\n }\n if (mutation.target.nodeName === 'STYLE') {\n checkStyle = true;\n return;\n }\n if (\n mutation.target.parentNode &&\n mutation.target.parentNode.nodeName === 'STYLE'\n ) {\n checkStyle = true;\n return;\n }\n if (\n mutation.target === intf &&\n (mutation.addedNodes.length > 0 || mutation.type === 'characterData')\n ) {\n checkInnerHTML = true;\n }\n });\n if (checkStyle) {\n intf.applyComponentStyle(false, intf);\n }\n if (checkInnerHTML) {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = intf.innerHTML;\n }\n });\n observer.observe(intf, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n Array.prototype.forEach.call(\n document.querySelectorAll('style'),\n function (el) {\n observer.observe(el, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n },\n );\n };\n return component;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals XMLSerializer: false, define: true, Blob: false, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n var perfCounters = [],\n cachedImagesDrawn = false,\n drawCount = 0,\n perfWindowSize = 300,\n entityCount = [],\n hiddenFrozenColumnCount = 0,\n scrollDebugCounters = [],\n touchPPSCounters = [];\n self.htmlImageCache = {};\n // more heavyweight version than fillArray defined in intf.js\n function fillArray(low, high, step, def) {\n step = step || 1;\n var i = [],\n x;\n for (x = low; x <= high; x += step) {\n i[x] = def === undefined ? x : typeof def === 'function' ? def(x) : def;\n }\n return i;\n }\n function drawPerfLine(w, h, x, y, perfArr, arrIndex, max, color, useAbs) {\n var i = w / perfArr.length,\n r = h / max;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.moveTo(x, y + h);\n perfArr.forEach(function (n) {\n var val = arrIndex === undefined ? n : n[arrIndex],\n cx,\n cy;\n if (useAbs) {\n val = Math.abs(val);\n }\n cx = x + i;\n cy = y + h - val * r;\n self.ctx.lineTo(cx, cy);\n x += i;\n });\n self.ctx.moveTo(x + w, y + h);\n self.ctx.strokeStyle = color;\n self.ctx.stroke();\n }\n function drawOnAllImagesLoaded() {\n var loaded = true;\n Object.keys(self.htmlImageCache).forEach(function (html) {\n if (!self.htmlImageCache[html].img.complete) {\n loaded = false;\n }\n });\n if (loaded && !cachedImagesDrawn) {\n cachedImagesDrawn = true;\n self.draw();\n }\n }\n function drawHtml(cell) {\n var img,\n v = cell.innerHTML || cell.formattedValue,\n cacheKey =\n v.toString() + cell.rowIndex.toString() + cell.columnIndex.toString(),\n x = Math.round(cell.x + self.canvasOffsetLeft),\n y = Math.round(cell.y + self.canvasOffsetTop);\n if (self.htmlImageCache[cacheKey]) {\n img = self.htmlImageCache[cacheKey].img;\n if (\n self.htmlImageCache[cacheKey].height !== cell.height ||\n self.htmlImageCache[cacheKey].width !== cell.width\n ) {\n // height and width of the cell has changed, invalidate cache\n self.htmlImageCache[cacheKey] = undefined;\n } else {\n if (!img.complete) {\n return;\n }\n return self.ctx.drawImage(img, x, y);\n }\n } else {\n cachedImagesDrawn = false;\n }\n img = new Image(cell.width, cell.height);\n self.htmlImageCache[cacheKey] = {\n img,\n width: cell.width,\n height: cell.height,\n };\n img.onload = function () {\n self.ctx.drawImage(img, x, y);\n drawOnAllImagesLoaded();\n };\n img.src =\n 'data:image/svg+xml;base64,' +\n btoa(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' +\n cell.width +\n '\" height=\"' +\n cell.height +\n '\">\\n' +\n '<foreignObject class=\"node\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\\n' +\n '<body xmlns=\"http://www.w3.org/1999/xhtml\" style=\"margin:0;padding:0;\">\\n' +\n v +\n '\\n' +\n '</body>' +\n '</foreignObject>\\n' +\n '</svg>\\n',\n );\n }\n /**\n * @param {number[]} coords [x0,y0, x1,y1, x2,y2, ...]\n * @param {boolean} [fill] fill the area that construct by these lines but not stroke\n */\n function drawLines(coords, fill) {\n if (coords.length < 4) return;\n self.ctx.beginPath();\n self.ctx.moveTo(\n coords[0] + self.canvasOffsetLeft,\n coords[1] + self.canvasOffsetTop,\n );\n for (let i = 2; i < coords.length; i += 2) {\n const x = coords[i] + self.canvasOffsetLeft;\n const y = coords[i + 1] + self.canvasOffsetTop;\n self.ctx.lineTo(x, y);\n }\n if (fill) self.ctx.fill();\n else self.ctx.stroke();\n }\n /**\n * @param {number} x based-X (left-top)\n * @param {number} y based-Y (left-top)\n * @param {number} width\n * @param {boolean} collapsed true: '+'; false: '-'\n */\n function drawGroupHandle(x, y, width, collapsed) {\n fillRect(x, y, width, width);\n strokeRect(x, y, width, width);\n const cx = x + width * 0.5;\n const cy = y + width * 0.5;\n drawLines([x + width * 0.2, cy, x + width * 0.78, cy]);\n if (collapsed) drawLines([cx, y + width * 0.22, cx, y + width * 0.8]);\n }\n /**\n * @param {number} x\n * @param {number} y\n * @param {number} size\n * @param {string} dir Direction of the triangle, one of the 't','b','l' and 'r'\n * @param {boolean} [active]\n */\n function drawUnhideIndicator(x, y, size, dir, active) {\n const minPadding = size * 0.2;\n const maxPadding = size * 0.3;\n /** The long edge width of the triangle */\n const longEdge = size - 2 * minPadding;\n /** The median width of the triangle */\n const median = size - 2 * maxPadding;\n const halfLongEdge = longEdge * 0.5;\n let x0, y0;\n let coords, borderCoords;\n switch (dir) {\n case 'r':\n x0 = x + maxPadding;\n y0 = y + minPadding;\n borderCoords = [x, y, x + size, y, x + size, y + size, x, y + size];\n coords = [x0, y0, x0, y0 + longEdge, x0 + median, y0 + halfLongEdge];\n break;\n case 'l':\n x0 = x + size - maxPadding;\n y0 = y + minPadding;\n borderCoords = [x + size, y, x, y, x, y + size, x + size, y + size];\n coords = [x0, y0, x0, y0 + longEdge, x0 - median, y0 + halfLongEdge];\n break;\n case 't':\n x0 = x + minPadding;\n y0 = y + size - maxPadding;\n borderCoords = [x, y + size, x, y, x + size, y, x + size, y + size];\n coords = [x0, y0, x0 + longEdge, y0, x0 + halfLongEdge, y0 - median];\n break;\n case 'b':\n x0 = x + minPadding;\n y0 = y + maxPadding;\n borderCoords = [x, y, x, y + size, x + size, y + size, x + size, y];\n coords = [x0, y0, x0 + longEdge, y0, x0 + halfLongEdge, y0 + median];\n break;\n }\n\n if (active) {\n self.ctx.strokeStyle = self.style.unhideIndicatorBorderColor;\n self.ctx.lineWidth = 2;\n drawLines(borderCoords);\n\n self.ctx.fillStyle = self.style.unhideIndicatorBackgroundColor;\n let offset = dir === 'r' || dir === 'b' ? 1 : 0;\n if (dir === 'l' || dir === 'r')\n fillRect(x - offset, y, size + offset, size);\n else fillRect(x, y - offset, size, size + offset);\n }\n\n self.ctx.fillStyle = self.style.unhideIndicatorColor;\n drawLines(coords, true);\n }\n function drawOrderByArrow(x, y) {\n var mt = self.style.columnHeaderOrderByArrowMarginTop * self.scale,\n ml = self.style.columnHeaderOrderByArrowMarginLeft * self.scale,\n mr = self.style.columnHeaderOrderByArrowMarginRight * self.scale,\n aw = self.style.columnHeaderOrderByArrowWidth * self.scale,\n ah = self.style.columnHeaderOrderByArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.columnHeaderOrderByArrowColor;\n self.ctx.strokeStyle = self.style.columnHeaderOrderByArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.orderDirection === 'asc') {\n self.ctx.lineTo(x, y + ah);\n self.ctx.lineTo(x + aw, y + ah);\n self.ctx.lineTo(x + aw * 0.5, y);\n self.ctx.lineTo(x, y + ah);\n } else {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawTreeArrow(cell, x, y) {\n var mt = self.style.treeArrowMarginTop * self.scale,\n mr = self.style.treeArrowMarginRight * self.scale,\n ml = self.style.treeArrowMarginLeft * self.scale,\n aw = self.style.treeArrowWidth * self.scale,\n ah = self.style.treeArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.treeArrowColor;\n self.ctx.strokeStyle = self.style.treeArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.openChildren[cell.rowIndex]) {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n } else {\n self.ctx.lineTo(x, y);\n self.ctx.lineTo(x + ah, y + aw * 0.5);\n self.ctx.lineTo(x, y + aw);\n self.ctx.lineTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawCellTreeIcon(cell, tree, rowTree) {\n const parentCount = rowTree ? tree.parentCount : 0;\n const iconSize = self.style.cellTreeIconWidth * self.scale,\n marginTop = self.style.cellTreeIconMarginTop * self.scale,\n marginRight = self.style.cellTreeIconMarginRight * self.scale,\n marginLeft =\n self.style.cellTreeIconMarginLeft * self.scale +\n parentCount * (iconSize + cell.paddingLeft);\n\n let x = cell.x + cell.paddingLeft + self.canvasOffsetLeft + marginLeft,\n y = cell.y + self.canvasOffsetTop + marginTop;\n\n if (tree.icon) {\n self.ctx.beginPath();\n const oldFillStyle = self.ctx.fillStyle;\n const oldStrokeStyle = self.ctx.strokeStyle;\n\n if (cell.hovered && self.hovers.onCellTreeIcon) {\n self.ctx.fillStyle = self.style.cellTreeIconHoverFillColor;\n } else {\n self.ctx.fillStyle = self.style.cellTreeIconFillColor;\n }\n\n self.ctx.fillRect(x, y, iconSize, iconSize);\n self.ctx.strokeStyle = self.style.cellTreeIconBorderColor;\n self.ctx.rect(x, y, iconSize, iconSize);\n self.ctx.stroke();\n\n self.ctx.beginPath();\n if (tree.expand) {\n self.ctx.moveTo(x + 3, y + iconSize * 0.5);\n self.ctx.lineTo(x + iconSize - 3, y + iconSize * 0.5);\n } else {\n self.ctx.moveTo(x + 2, y + iconSize * 0.5);\n self.ctx.lineTo(x + iconSize - 2, y + iconSize * 0.5);\n self.ctx.moveTo(x + iconSize * 0.5, y + 2);\n self.ctx.lineTo(x + iconSize * 0.5, y + iconSize - 2);\n }\n self.ctx.lineWidth = self.style.cellTreeIconLineWidth;\n self.ctx.strokeStyle = self.style.cellTreeIconLineColor;\n self.ctx.stroke();\n\n self.ctx.strokeStyle = oldStrokeStyle;\n self.ctx.fillStyle = oldFillStyle;\n }\n\n return marginLeft + iconSize + marginRight;\n }\n function drawFilterButtonArrow(x, y) {\n var mt =\n ((self.style.filterButtonHeight - self.style.filterButtonArrowHeight) /\n 2) *\n self.scale,\n ml =\n ((self.style.filterButtonWidth - self.style.filterButtonArrowWidth) /\n 2) *\n self.scale,\n aw = self.style.filterButtonArrowWidth * self.scale,\n ah = self.style.filterButtonArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.filterButtonArrowColor;\n self.ctx.strokeStyle = self.style.filterButtonArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw;\n }\n function radiusRect(x, y, w, h, radius) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n var r = x + w,\n b = y + h;\n self.ctx.beginPath();\n self.ctx.moveTo(x + radius, y);\n self.ctx.lineTo(r - radius, y);\n self.ctx.quadraticCurveTo(r, y, r, y + radius);\n self.ctx.lineTo(r, y + h - radius);\n self.ctx.quadraticCurveTo(r, b, r - radius, b);\n self.ctx.lineTo(x + radius, b);\n self.ctx.quadraticCurveTo(x, b, x, b - radius);\n self.ctx.lineTo(x, y + radius);\n self.ctx.quadraticCurveTo(x, y, x + radius, y);\n }\n function fillRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillRect(x, y, w, h);\n }\n function strokeRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.strokeRect(x, y, w, h);\n }\n function fillText(text, x, y) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillText(text, x, y);\n }\n function fillCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.fill();\n }\n function strokeCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.stroke();\n }\n function clipFrozenArea(mode) {\n // 0 both, 1 rows, 2 cols\n // self.lastFrozenColumnPixel;\n // self.lastFrozenRowPixel;\n self.ctx.beginPath();\n if (mode === 0) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, self.lastFrozenRowPixel);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 1) {\n self.ctx.moveTo(0, self.lastFrozenRowPixel);\n self.ctx.lineTo(0, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 2) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, 0);\n self.ctx.lineTo(self.width, 0);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n }\n self.ctx.clip();\n }\n function fillHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return fillCircle(x, y, r * 0.5);\n }\n fillRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function strokeHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return strokeCircle(x, y, r * 0.5);\n }\n strokeRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function addselectionHandle(c, pos) {\n var hw = self.style.selectionHandleSize,\n p = {\n tr: function () {\n fillHandle(c.x + c.width, c.y, hw);\n strokeHandle(c.x + c.width, c.y, hw);\n },\n br: function () {\n fillHandle(c.x + c.width, c.y + c.height, hw);\n strokeHandle(c.x + c.width, c.y + c.height, hw);\n },\n tl: function () {\n fillHandle(c.x, c.y, hw);\n strokeHandle(c.x, c.y, hw);\n },\n bl: function () {\n fillHandle(c.x, c.y + c.height, hw);\n strokeHandle(c.x, c.y + c.height, hw);\n },\n };\n p[pos]();\n }\n function addBorderLine(c, pos) {\n self.ctx.beginPath();\n var p = {\n t: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n },\n r: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n b: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n l: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n };\n p[pos]();\n self.ctx.stroke();\n }\n function addEllipsis(text, width) {\n var c,\n w = 0;\n if (self.ellipsisCache[text] && self.ellipsisCache[text][width]) {\n return self.ellipsisCache[text][width];\n }\n //TODO Add ellipsis back when there is a fast way to do it\n w = self.ctx.measureText(text).width;\n self.ellipsisCache[text] = self.ellipsisCache[text] || {};\n c = { value: text, width: w };\n self.ellipsisCache[text][width] = c;\n return c;\n }\n function wrapText(cell, splitChar) {\n if (!cell.formattedValue) {\n return {\n lines: [{ width: 0, value: '' }],\n width: 0,\n height: cell.calculatedLineHeight,\n };\n }\n var max = 0,\n n = '\\n',\n x,\n word,\n words = cell.formattedValue.split(splitChar),\n textHeight = cell.calculatedLineHeight,\n lines = [],\n out = [],\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n autoResize = self.attributes.autoResizeRows && wrap,\n elWidth,\n et = self.attributes.ellipsisText,\n elClipLength,\n plWidth,\n clippedVal,\n ogWordWidth,\n previousLine,\n line = {\n width: 0,\n value: '',\n },\n cHeight = wrap ? cell.paddedHeight : cell.calculatedLineHeight;\n lines.push(line);\n elWidth = self.ctx.measureText(' ' + et).width;\n for (x = 0; x < words.length; x += 1) {\n word = words[x];\n var curSplitChar = word[word.length - 1] === '-' ? '' : splitChar;\n var measure = self.ctx.measureText(word + curSplitChar);\n if (line.width + measure.width + elWidth < cell.paddedWidth) {\n line.value += word + curSplitChar;\n line.width += measure.width;\n continue;\n }\n // if there is a hyphenated word that is too long\n // split it and add the split set to the array\n // then back up and re-read new split set\n // this behavior seems right, it might not be\n if (/\\w-\\w/.test(word) && cell.paddedWidth < measure.width) {\n var arr = word.split('-');\n arr = arr.map((item, index) => {\n return index === arr.length - 1 ? item : item + '-';\n });\n words.splice(x, 1, ...arr);\n x -= 1;\n continue;\n }\n line = {\n width: measure.width,\n value: word + curSplitChar,\n };\n if (x === 0) {\n lines = [];\n lines.push(line);\n }\n textHeight += cell.calculatedLineHeight;\n if (textHeight > cHeight && !autoResize) {\n if (lines.length === 0) {\n break;\n }\n elClipLength = 1;\n previousLine = lines[lines.length - 1];\n if (previousLine.width < cell.paddedWidth && words.length === 1) {\n break;\n }\n clippedVal = previousLine.value + word;\n plWidth = self.ctx.measureText(clippedVal + et).width;\n var originText = clippedVal;\n if (plWidth > cell.paddedWidth) {\n var stepLength = parseInt(clippedVal.length / 2);\n var direction = -1;\n while (stepLength > 0) {\n clippedVal = originText.substr(\n 0,\n stepLength * direction + clippedVal.length,\n );\n plWidth = self.ctx.measureText(clippedVal + et).width;\n direction = plWidth > cell.paddedWidth ? -1 : 1;\n stepLength = parseInt(stepLength / 2);\n }\n }\n clippedVal =\n clippedVal + (originText.length != clippedVal.length ? et : '');\n previousLine.value = clippedVal;\n previousLine.width = plWidth;\n break;\n }\n if (x > 0) {\n lines.push(line);\n }\n }\n return {\n lines: lines,\n width: max,\n height: cell.calculatedLineHeight * lines.length,\n };\n }\n function drawText(cell, treeCellPadding = 0) {\n var ll = cell.text.lines.length,\n h = cell.fontHeight * cell.lineHeight,\n x,\n line,\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n textHeight = 0;\n for (x = 0; x < cell.text.lines.length; x += 1) {\n line = cell.text.lines[x];\n var vPos =\n Math.max(\n (cell.height -\n (wrap ? cell.text.height : cell.calculatedLineHeight)) *\n 0.5,\n 0,\n ) + h,\n hPos =\n cell.paddingLeft +\n treeCellPadding +\n cell.treeArrowWidth +\n cell.orderByArrowWidth;\n if (cell.horizontalAlignment === 'right') {\n hPos =\n cell.paddingLeft + treeCellPadding + cell.paddedWidth - line.width;\n } else if (cell.horizontalAlignment === 'center') {\n hPos =\n cell.paddingLeft +\n treeCellPadding +\n (cell.paddedWidth + cell.paddingRight) / 2 -\n line.width / 2;\n }\n if (cell.verticalAlignment === 'top') {\n vPos = cell.calculatedLineHeight;\n } else if (cell.verticalAlignment === 'bottom') {\n vPos = cell.height - cell.paddingBottom - cell.text.height;\n }\n line.height = h + cell.lineSpacing;\n line.offsetLeft = hPos;\n line.offsetTop = vPos;\n line.x = cell.x + hPos;\n line.y = cell.y + textHeight + vPos;\n textHeight += line.height;\n fillText(line.value, line.x, line.y);\n }\n if (self.attributes.debug && cell.active) {\n requestAnimationFrame(function () {\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n JSON.stringify(\n {\n x: cell.x,\n y: cell.y,\n h: cell.height,\n w: cell.width,\n pw: cell.paddedWidth,\n idx: cell.columnIndex,\n idx_ord: cell.sortColumnIndex,\n },\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 14,\n );\n fillText(\n JSON.stringify(\n cell.text.lines.map(function (l) {\n return { w: l.width, v: l.value.length };\n }),\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 30,\n );\n });\n }\n }\n function getFrozenColumnsWidth() {\n var w = 0,\n s = self.getSchema(),\n x = 0,\n n = Math.min(self.frozenColumn, s.length),\n collapsedGroups = self.getCollapsedColumnGroups(),\n column;\n hiddenFrozenColumnCount = 0;\n while (x < n) {\n column = s[x];\n if (column.hidden) {\n hiddenFrozenColumnCount += 1;\n } else {\n const isCollapsed =\n collapsedGroups.findIndex(\n (group) => x >= group.from && x <= group.to,\n ) >= 0;\n if (isCollapsed) {\n hiddenFrozenColumnCount += 1;\n } else {\n w += self.getColumnWidth(x);\n }\n }\n x += 1;\n }\n return w;\n }\n /**\n * Redraws the grid. No matter what the change, this is the only method required to refresh everything.\n * @memberof canvasDatagrid\n * @name draw\n * @method\n */\n // r = literal row index\n // rd = row data array\n // i = user order index\n // o = literal data index\n // y = y drawing cursor\n // x = x drawing cursor\n // s = visible schema array\n // cx = current x drawing cursor sub calculation var\n // cy = current y drawing cursor sub calculation var\n // a = static cell (like corner cell)\n // p = perf counter\n // l = data length\n // u = current cell\n // h = current height\n // w = current width\n self.draw = function (internal) {\n if (self.dispatchEvent('beforedraw', {})) {\n return;\n }\n if (!self.isChildGrid && (!self.height || !self.width)) {\n return;\n }\n if (self.isChildGrid && internal) {\n requestAnimationFrame(self.parentGrid.draw);\n return;\n }\n if (self.intf.visible === false) {\n return;\n }\n // initial values\n var checkScrollHeight,\n rowHeaderCell,\n p,\n cx,\n cy,\n treeGrid,\n rowOpen,\n rowHeight,\n cornerCell,\n y,\n x,\n c,\n h,\n w,\n schema,\n rowIndex,\n rowData,\n aCell,\n viewData = self.viewData || [],\n bc = self.style.gridBorderCollapse === 'collapse',\n selectionBorders = [],\n moveBorders = [],\n selectionHandles = [],\n rowHeaders = [],\n l = viewData.length,\n u = self.currentCell || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n rowGroupsAreaWidth = self.getRowGroupAreaWidth(),\n columnGroupsAreaHeight = self.getColumnGroupAreaHeight(),\n /** key: boundRowIndex, value: `{y,h}` */\n rowGroupsRectInfo = {},\n /** value: `{y,h}` */\n rowGroupsFrozenInfo = {},\n /** key: columnIndex, value: `{x,w}` */\n columnGroupsRectInfo = {},\n collapsedColumnGroups = self.getCollapsedColumnGroups(),\n collapsedRowGroups = self.getCollapsedRowGroups(),\n cellHeight = self.style.cellHeight,\n currentRowIndexOffset = 0,\n /** @type {Array<{from:number,plus:number}>} */\n rowIndexOffsetByHiddenRows = self.hiddenRowRanges\n .map((range) => ({\n from: range[0],\n plus: range[1] - range[0] + 1,\n }))\n .sort((a, b) => a.from - b.from);\n drawCount += 1;\n p = performance.now();\n self.visibleRowHeights = [];\n // if data length has changed, there is no way to know\n if (viewData.length > self.orders.rows.length) {\n self.createRowOrders();\n }\n function saveRowGroupsRectInfo(cell) {\n let index = cell.boundRowIndex;\n if (index >= -1 === false)\n if (cell.rowIndex === -1) index = -1;\n else return;\n if (rowGroupsRectInfo[index]) return;\n rowGroupsRectInfo[index] = { y: cell.y, h: cell.height };\n }\n function saveColumnGroupsRectInfo(cell) {\n const index = cell.columnIndex;\n if (columnGroupsRectInfo[index]) return;\n columnGroupsRectInfo[index] = { x: cell.x, w: cell.width };\n }\n /**\n * @param {number} columnIndex\n * @returns {boolean}\n */\n function isColumnCollapsedByGroup(columnIndex) {\n return (\n collapsedColumnGroups.findIndex(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n ) >= 0\n );\n }\n\n function drawScrollBars() {\n var drawCorner,\n en = self.scrollBox.entities,\n m = self.style.scrollBarBoxMargin * 2;\n self.ctx.strokeStyle = self.style.scrollBarBorderColor;\n self.ctx.lineWidth = self.style.scrollBarBorderWidth;\n if (self.frozenColumn > 0) {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n self.scrollCache.x[self.frozenColumn - 1] +\n (en.horizontalBar.width -\n self.scrollCache.x[self.frozenColumn - 1] -\n self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n } else {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n (en.horizontalBar.width - self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n }\n en.verticalBox.y =\n columnHeaderCellHeight +\n self.style.scrollBarBoxMargin +\n self.scrollCache.y[self.frozenRow] +\n (en.verticalBar.height -\n self.scrollBox.scrollBoxHeight -\n self.scrollCache.y[self.frozenRow]) *\n (self.scrollBox.scrollTop / self.scrollBox.scrollHeight);\n if (self.scrollBox.horizontalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n strokeRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (self.scrollBox.horizontalBoxVisible) {\n if (/horizontal/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.horizontalBox.x,\n en.horizontalBox.y,\n en.horizontalBox.width,\n en.horizontalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.horizontalBar);\n self.visibleCells.unshift(en.horizontalBox);\n }\n if (self.scrollBox.verticalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n strokeRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n if (self.scrollBox.verticalBoxVisible) {\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (/vertical/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.verticalBox.x,\n en.verticalBox.y,\n en.verticalBox.width,\n en.verticalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.verticalBar);\n self.visibleCells.unshift(en.verticalBox);\n }\n if (drawCorner) {\n //corner\n self.ctx.strokeStyle = self.style.scrollBarCornerBorderColor;\n self.ctx.fillStyle = self.style.scrollBarCornerBackgroundColor;\n radiusRect(\n en.corner.x,\n en.corner.y,\n en.corner.width,\n en.corner.height,\n 0,\n );\n self.ctx.stroke();\n self.ctx.fill();\n self.visibleCells.unshift(en.corner);\n }\n }\n function createHandlesOverlayArray(cell) {\n if (self.attributes.allowMovingSelection || self.mobile) {\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderRight &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tr']);\n cell.selectionHandle = 'tr';\n }\n if (cell.selectionBorderTop && cell.selectionBorderLeft) {\n if (self.mobile) {\n selectionHandles.push([cell, 'tl']);\n cell.selectionHandle = 'tl';\n }\n if (self.fillOverlay.handle) {\n self.fillOverlay.snapTo = {\n x: cell.x,\n y: cell.y,\n };\n }\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'bl']);\n cell.selectionHandle = 'bl';\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderRight &&\n (self.attributes.selectionHandleBehavior !== 'none' || self.mobile)\n ) {\n selectionHandles.push([cell, 'br']);\n cell.selectionHandle = 'br';\n\n if (self.fillOverlay.handle) {\n self.fillOverlay.handle.x = cell.x + cell.width;\n self.fillOverlay.handle.y = cell.y + cell.height;\n }\n }\n\n if (self.fillOverlay.handle) {\n // Some corners may not be displaying, so we get at least\n // one correct axis in order to display a fill overlay.\n if (self.fillOverlay.snapTo.x === -1 && cell.selectionBorderLeft) {\n self.fillOverlay.snapTo.x = cell.x;\n }\n if (self.fillOverlay.snapTo.y === -1 && cell.selectionBorderTop) {\n self.fillOverlay.snapTo.y = cell.y;\n }\n }\n }\n }\n function createBorderOverlayArray(\n cell,\n drawArray,\n propPrefix,\n offsetPoint,\n ) {\n offsetPoint = offsetPoint || { x: 0, y: 0 };\n cell.selectionBorder = '';\n if (\n !cell.isRowHeader &&\n self.selections[cell.rowIndex + -offsetPoint.y] &&\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) !== -1\n ) {\n if (\n (!self.selections[cell.rowIndex - 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex - 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1 ||\n cell.rowIndex === 0) &&\n !cell.isHeader\n ) {\n drawArray.push([cell, 't']);\n cell[propPrefix + 'BorderTop'] = true;\n cell[propPrefix + 'Border'] += 't';\n }\n if (\n !self.selections[cell.rowIndex + 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex + 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'b']);\n cell[propPrefix + 'BorderBottom'] = true;\n cell[propPrefix + 'Border'] += 'b';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === 0 ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex - 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'l']);\n cell[propPrefix + 'BorderLeft'] = true;\n cell[propPrefix + 'Border'] += 'l';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === schema.length ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'r']);\n cell[propPrefix + 'BorderRight'] = true;\n cell[propPrefix + 'Border'] += 'r';\n }\n }\n }\n function drawCell(rowData, rowOrderIndex, rowIndex) {\n return function drawEach(header, headerIndex, columnOrderIndex) {\n if (header.hidden) {\n return 0;\n }\n var cellStyle = header.style || 'cell',\n cellGridAttributes,\n cell,\n isHeader = /HeaderCell/.test(cellStyle),\n isCorner = /cornerCell/.test(cellStyle),\n isRowHeader = 'rowHeaderCell' === cellStyle,\n isColumnHeader = 'columnHeaderCell' === cellStyle,\n isFilterable =\n self.filterable.rows.includes(rowIndex) &&\n self.filterable.columns.includes(headerIndex),\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n selected =\n self.selections[rowOrderIndex] &&\n self.selections[rowOrderIndex].indexOf(columnOrderIndex) !== -1,\n hovered =\n self.hovers.rowIndex === rowOrderIndex &&\n (self.attributes.hoverMode === 'row' ||\n self.hovers.columnIndex === columnOrderIndex),\n openedFilter =\n self.selectedFilterButton.rowIndex == rowIndex &&\n self.selectedFilterButton.columnIndex == headerIndex,\n active =\n self.activeCell.rowIndex === rowOrderIndex &&\n self.activeCell.columnIndex === columnOrderIndex,\n isColumnHeaderCellCap = cellStyle === 'columnHeaderCellCap',\n rawValue = rowData ? rowData[header.name] : undefined,\n isGrid = header.type === 'canvas-datagrid',\n activeHeader =\n (self.orders.rows[self.activeCell.rowIndex] === rowOrderIndex ||\n self.selectedRows.indexOf(rowOrderIndex) >= 0 ||\n self.orders.columns[self.activeCell.columnIndex] ===\n headerIndex ||\n self.selectedColumns.indexOf(headerIndex) >= 0) &&\n (columnOrderIndex === -1 || rowOrderIndex === -1)\n ? isRowHeader\n ? 'activeRowHeaderCell'\n : 'activeColumnHeaderCell'\n : false,\n val,\n f = self.formatters[header.type || 'string'],\n orderByArrowSize = 0,\n treeArrowSize = 0,\n cellWidth = self.sizes.columns[headerIndex] || header.width,\n ev = {\n value: rawValue,\n row: rowData,\n header: header,\n };\n if (isColumnHeaderCellCap) {\n cellWidth = w - x;\n }\n // if no data or schema are defined, a width is provided to the stub column\n if (cellWidth === undefined) {\n cellWidth = self.style.cellWidth;\n }\n cellWidth = cellWidth * self.scale;\n if (x + cellWidth + self.style.cellBorderWidth < 0) {\n x += cellWidth + self.style.cellBorderWidth;\n }\n if (active && cellStyle !== 'cornerCell') {\n cellStyle = 'activeCell';\n }\n if (self.visibleRows.indexOf(rowIndex) === -1 && !isHeader) {\n self.visibleRows.push(rowIndex);\n }\n val = self.dispatchEvent('formatcellvalue', ev);\n cx = x;\n cy = y;\n if (cellStyle === 'cornerCell') {\n cx = 0;\n cy = 0;\n } else if (isRowHeader) {\n cx = 0;\n } else if (isHeader) {\n cy = 0;\n }\n cell = {\n type: isGrid ? 'canvas-datagrid-cell' : header.type,\n style: cellStyle,\n nodeType: 'canvas-datagrid-cell',\n x: cx,\n y: cy,\n fontHeight: (self.style[cellStyle + 'FontHeight'] || 0) * self.scale,\n horizontalAlignment: self.style[cellStyle + 'HorizontalAlignment'],\n verticalAlignment: self.style[cellStyle + 'VerticalAlignment'],\n paddingLeft:\n (self.style[cellStyle + 'PaddingLeft'] || 0) * self.scale,\n paddingTop: (self.style[cellStyle + 'PaddingTop'] || 0) * self.scale,\n paddingRight:\n (self.style[cellStyle + 'PaddingRight'] || 0) * self.scale,\n paddingBottom:\n (self.style[cellStyle + 'PaddingBottom'] || 0) * self.scale,\n whiteSpace: self.style.cellWhiteSpace,\n lineHeight: self.style.cellLineHeight,\n lineSpacing: self.style.cellLineSpacing,\n offsetTop: self.canvasOffsetTop + cy,\n offsetLeft: self.canvasOffsetLeft + cx,\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n active: active || activeHeader,\n hovered: hovered,\n selected: selected,\n width: cellWidth,\n height: cellHeight,\n offsetWidth: cellWidth,\n offsetHeight: cellHeight,\n parentNode: self.intf.parentNode,\n offsetParent: self.intf.parentNode,\n data: rowData,\n isCorner: isCorner,\n isHeader: isHeader,\n isColumnHeader: isColumnHeader,\n isColumnHeaderCellCap: isColumnHeaderCellCap,\n isRowHeader: isRowHeader,\n isFilterable: isFilterable,\n openedFilter: openedFilter,\n rowOpen: rowOpen,\n header: header,\n\n columnIndex: columnOrderIndex,\n rowIndex: rowOrderIndex,\n\n viewRowIndex: rowOrderIndex,\n viewColumnIndex: columnOrderIndex,\n\n boundRowIndex: self.getBoundRowIndexFromViewRowIndex(rowOrderIndex),\n boundColumnIndex: self.getBoundColumnIndexFromViewColumnIndex(\n columnOrderIndex,\n ),\n\n sortColumnIndex: headerIndex,\n sortRowIndex: rowIndex,\n\n isGrid: isGrid,\n isNormal: !isGrid && !isCorner && !isHeader,\n gridId: (self.attributes.name || '') + rowIndex + ':' + headerIndex,\n parentGrid: self.intf,\n innerHTML: '',\n activeHeader: activeHeader,\n value:\n isHeader && !isRowHeader ? header.title || header.name : rawValue,\n isRowTree:\n rowOrderIndex >= 0 &&\n columnOrderIndex == self.cellTree.rowTreeColIndex &&\n self.cellTree.rows.length > 0 &&\n self.cellTree.rows[rowOrderIndex].icon,\n isColumnTree:\n columnOrderIndex >= 0 &&\n self.cellTree.columns[rowOrderIndex] &&\n self.cellTree.columns[rowOrderIndex][columnOrderIndex].icon,\n };\n cell.calculatedLineHeight =\n cell.fontHeight * cell.lineHeight + cell.lineSpacing;\n cell.paddedWidth = cell.width - cell.paddingRight - cell.paddingLeft;\n cell.paddedHeight = cell.height - cell.paddingTop - cell.paddingBottom;\n ev.cell = cell;\n cell.userHeight = cell.isHeader ? self.sizes.rows[-1] : rowHeight;\n cell.userWidth = cell.isHeader\n ? self.sizes.columns.cornerCell\n : self.sizes.columns[headerIndex];\n self.visibleCells.unshift(cell);\n saveRowGroupsRectInfo(cell);\n saveColumnGroupsRectInfo(cell);\n if (self.dispatchEvent('beforerendercell', ev)) {\n return;\n }\n self.ctx.fillStyle = self.style[cellStyle + 'BackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'BorderColor'];\n self.ctx.lineWidth = self.style[cellStyle + 'BorderWidth'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'HoverBorderColor'];\n }\n if (selected) {\n self.ctx.fillStyle =\n self.style[cellStyle + 'SelectedBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'SelectedBorderColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'BackgroundColor'];\n }\n self.dispatchEvent('rendercell', ev);\n if (cell.isGrid) {\n if (cell.height !== rowHeight) {\n cell.height = rowHeight || self.style.cellHeightWithChildGrid;\n checkScrollHeight = true;\n }\n cell.width =\n self.sizes.columns[headerIndex] ||\n self.style.cellWidthWithChildGrid;\n }\n if (rowOpen && !cell.isRowHeader) {\n cell.height = self.sizes.rows[rowIndex] || self.style.cellHeight;\n }\n if (!cell.isGrid) {\n fillRect(cx, cy, cell.width, cell.height);\n strokeRect(cx, cy, cell.width, cell.height);\n }\n self.ctx.save();\n radiusRect(cell.x, cell.y, cell.width, cell.height, 0);\n self.ctx.clip();\n self.dispatchEvent('afterrendercell', ev);\n if (cell.height !== cellHeight && !(rowOpen && !cell.isRowHeader)) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.height;\n checkScrollHeight = true;\n }\n if (cell.width !== cellWidth) {\n self.sizes.columns[headerIndex] = cell.width;\n checkScrollHeight = true;\n }\n if (isRowHeader && self.attributes.tree) {\n if (!self.dispatchEvent('rendertreearrow', ev)) {\n treeArrowSize = drawTreeArrow(\n cell,\n self.style[cellStyle + 'PaddingLeft'],\n cy,\n 0,\n );\n }\n }\n if ((self.attributes.showRowNumbers && isRowHeader) || !isRowHeader) {\n if (cell.isGrid && !self.dispatchEvent('beforerendercellgrid', ev)) {\n if (!self.childGrids[cell.gridId]) {\n // HACK: this only allows setting of the child grids styles if data is set _after_\n // this is less than desirable. An interface needs to be made to effect the\n // style of all cell grids. One for individual grids already exists.\n cellGridAttributes = self.cellGridAttributes;\n cellGridAttributes.name = self.attributes.saveAppearance\n ? cell.gridId\n : undefined;\n cellGridAttributes.component = false;\n cellGridAttributes.parentNode = cell;\n cellGridAttributes.data = rawValue;\n ev.cellGridAttributes = cellGridAttributes;\n if (self.dispatchEvent('beforecreatecellgrid', ev)) {\n return;\n }\n self.childGrids[cell.gridId] = self.createGrid(\n cellGridAttributes,\n );\n self.sizes.rows[rowIndex] =\n self.sizes.rows[rowIndex] || self.style.cellGridHeight;\n checkScrollHeight = true;\n }\n cell.grid = self.childGrids[cell.gridId];\n cell.grid.parentNode = cell;\n cell.grid.visible = true;\n cell.grid.draw();\n self.dispatchEvent('rendercellgrid', ev);\n } else if (!cell.isGrid) {\n if (self.childGrids[cell.gridId]) {\n self.childGrids[cell.gridId].parentNode.offsetHeight = 0;\n }\n if (isHeader && self.orderBy === header.name) {\n if (!self.dispatchEvent('renderorderbyarrow', ev)) {\n orderByArrowSize = drawOrderByArrow(\n cx + self.style[cellStyle + 'PaddingLeft'],\n 0,\n );\n }\n }\n self.ctx.fillStyle = self.style[cellStyle + 'Color'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverColor'];\n }\n if (selected) {\n self.ctx.fillStyle = self.style[cellStyle + 'SelectedColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'Color'];\n }\n cell.treeArrowWidth = treeArrowSize;\n cell.orderByArrowWidth = orderByArrowSize;\n // create text ref to see if height needs to expand\n val = val !== undefined ? val : f ? f(ev) : '';\n if (val === undefined && !f) {\n val = '';\n console.warn(\n 'canvas-datagrid: Unknown format ' +\n header.type +\n ' add a cellFormater',\n );\n }\n cell.formattedValue = (val !== undefined && val !== null\n ? val\n : ''\n ).toString();\n if (\n self.columnFilters &&\n self.columnFilters[val] !== undefined &&\n isHeader\n ) {\n cell.formattedValue = self.attributes.filterTextPrefix + val;\n }\n self.ctx.font =\n self.style[cellStyle + 'FontHeight'] * self.scale +\n 'px ' +\n self.style[cellStyle + 'FontName'];\n if (!self.dispatchEvent('formattext', ev)) {\n cell.text = wrapText(cell, ' ');\n }\n if (!self.dispatchEvent('rendertext', ev)) {\n if (cell.innerHTML || header.type === 'html') {\n drawHtml(cell);\n } else {\n let treeCellPadding = 0,\n isDrawText = true;\n if (\n cell.columnIndex == self.cellTree.rowTreeColIndex &&\n !cell.isColumnHeader &&\n self.cellTree.rows.length > 0 &&\n Object.keys(self.cellTree.rows[cell.rowIndex]).length > 1\n )\n treeCellPadding = drawCellTreeIcon(\n cell,\n self.cellTree.rows[cell.rowIndex],\n true,\n );\n\n if (\n !cell.isRowHeader &&\n cell.rowIndex > 0 &&\n self.cellTree.columns[cell.rowIndex - 1] &&\n self.cellTree.columns[cell.rowIndex - 1][cell.columnIndex]\n .icon\n ) {\n for (let r = cell.rowIndex - 1; r >= 0; r--) {\n if (!self.cellTree.columns[r]) break;\n if (!self.cellTree.columns[r][cell.columnIndex].icon) break;\n if (!self.cellTree.columns[r][cell.columnIndex].expand) {\n isDrawText = false;\n break;\n }\n }\n }\n if (\n isDrawText &&\n !cell.isRowHeader &&\n self.cellTree.columns[cell.rowIndex] &&\n self.cellTree.columns[cell.rowIndex][cell.columnIndex].icon\n ) {\n if (\n self.viewData.length > 0 &&\n self.viewData[cell.rowIndex][cell.columnIndex].length > 0\n )\n treeCellPadding = drawCellTreeIcon(\n cell,\n self.cellTree.columns[cell.rowIndex][cell.columnIndex],\n false,\n );\n }\n if (isDrawText) drawText(cell, treeCellPadding);\n }\n\n if (wrap && cell.text && cell.text.height > rowHeight) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.text.height;\n checkScrollHeight = true;\n }\n }\n }\n }\n if (active) {\n aCell = cell;\n }\n createBorderOverlayArray(cell, selectionBorders, 'selection');\n // createBorderOverlayArray calculates data for createHandlesOverlayArray so it must go 2nd\n createHandlesOverlayArray(cell);\n if (self.movingSelection) {\n createBorderOverlayArray(cell, moveBorders, 'move', self.moveOffset);\n }\n self.ctx.restore();\n\n if (isFilterable) {\n drawFilterButton(cell);\n }\n\n // Gaps may occur in row numbers between consecutively rendered rows\n // when we are filtering. We draw attention to this by drawing a thick\n // border overlapping the two consecutive row headers. If sorting, visible\n // row numbers stay the same (i.e. they don't correspond to the underlying\n // data's row number), so we do not show row gaps in that case.\n const isSorting =\n self.orderings.columns && self.orderings.columns.length > 0;\n\n if (\n isRowHeader &&\n self.attributes.showRowNumbers &&\n self.attributes.showRowNumberGaps &&\n isSorting === false\n ) {\n const previousRowNumber = self.getBoundRowIndexFromViewRowIndex(\n rowOrderIndex - 1,\n );\n let hasRowGap =\n previousRowNumber !== undefined &&\n cell.boundRowIndex > 0 &&\n cell.boundRowIndex - previousRowNumber > 1;\n if (hasRowGap && collapsedRowGroups.length > 0) {\n hasRowGap =\n collapsedRowGroups.find(\n (group) =>\n group.from === previousRowNumber &&\n group.to === cell.boundRowIndex,\n ) >= 0;\n }\n // We don't treat the row index difference from hidden rows as the row gap.\n if (hasRowGap && self.hiddenRowRanges.length > 0) {\n for (let i = 0; i < self.hiddenRowRanges.length; i++) {\n const [beginRowIndex, endRowIndex] = self.hiddenRowRanges[i];\n if (\n cell.boundRowIndex === endRowIndex + 1 &&\n previousRowNumber === beginRowIndex - 1\n ) {\n hasRowGap = false;\n break;\n }\n }\n }\n\n if (hasRowGap) {\n const barHeight = self.style.rowHeaderCellRowNumberGapHeight;\n const barColor = self.style.rowHeaderCellRowNumberGapColor;\n\n self.ctx.save();\n\n self.ctx.fillStyle = barColor;\n\n fillRect(cell.x, cell.y - barHeight / 2, cell.width, barHeight);\n\n self.ctx.restore();\n }\n }\n\n //#region draw unhide indicator for column headers\n if (isColumnHeader && self.attributes.showUnhideColumnsIndicator) {\n const hovered = self.hovers.unhideIndicator;\n const size = self.style.unhideIndicatorSize;\n const cellX = x;\n const topY = cell.y + Math.max(0.5 * (cell.height - size), 0);\n\n const isActive = (orderIndex) =>\n hovered &&\n (hovered.dir === 'l' || hovered.dir === 'r') &&\n orderIndex >= hovered.orderIndex0 &&\n orderIndex <= hovered.orderIndex1;\n const isHiddenColumn = (columnIndex) =>\n columnIndex >= 0 &&\n schema[columnIndex] &&\n schema[columnIndex].hidden;\n\n let orderIndex0, orderIndex1;\n const drawIndicator = (leftX, dir, active) => {\n self.visibleUnhideIndicators.push({\n x: leftX - 1,\n y: topY - 1,\n x2: leftX + size + 2,\n y2: topY + size + 2,\n orderIndex0,\n orderIndex1,\n dir,\n });\n if (!active) {\n const line = cell.text && cell.text.lines && cell.text.lines[0];\n if (line) {\n const iconsWidth = orderByArrowSize + treeArrowSize;\n const lineX0 = iconsWidth > 0 ? iconsWidth : line.x;\n const lineX1 = line.x + line.width;\n if (leftX + size >= lineX0 && leftX <= lineX1) return;\n }\n }\n drawUnhideIndicator(leftX, topY, size, dir, active);\n }; // end of drawIndicator\n\n let orderIndexPtr = columnOrderIndex - 1;\n const prevColumnIndex = self.orders.columns[orderIndexPtr];\n if (isHiddenColumn(prevColumnIndex)) {\n const active = isActive(prevColumnIndex);\n orderIndex0 = orderIndexPtr;\n orderIndex1 = orderIndexPtr;\n while (--orderIndexPtr >= 0) {\n if (isHiddenColumn(self.orders.columns[orderIndexPtr]))\n orderIndex0 = orderIndexPtr;\n else break;\n }\n drawIndicator(cellX, 'r', active);\n }\n\n orderIndexPtr = columnOrderIndex + 1;\n const nextColumnIndex = self.orders.columns[orderIndexPtr];\n if (isHiddenColumn(nextColumnIndex)) {\n const active = isActive(nextColumnIndex);\n orderIndex0 = orderIndexPtr;\n orderIndex1 = orderIndexPtr;\n while (++orderIndexPtr < self.orders.columns.length) {\n if (isHiddenColumn(self.orders.columns[orderIndexPtr]))\n orderIndex1 = orderIndexPtr;\n else break;\n }\n const indicatorX = x + cell.width - size;\n drawIndicator(indicatorX, 'l', active);\n }\n }\n //#endregion draw unhide indicator for column headers\n\n //#region draw unhide indicator for row headers\n if (\n isRowHeader &&\n self.attributes.showUnhideRowsIndicator &&\n self.hiddenRowRanges.length > 0\n ) {\n // Leo's comment:\n // from the first row to the last row, `rowIndex` is from 0 to the count of rows\n // but `boundRowIndex` can be disordered if there are any ordered columns or filtered columns\n // Like this statement:\n // console.log(rowIndex, cell.boundRowIndex, cell.formattedValue);\n // can output the result like this:\n // 0 1 '2'\n // 1 3 '4'\n const hovered = self.hovers.unhideIndicator;\n const size = self.style.unhideIndicatorSize;\n const leftX = cell.x + cell.width - size - 2;\n const cellY = y;\n const topIndicators = {};\n const bottomIndicators = {};\n self.hiddenRowRanges.forEach((it) => {\n topIndicators[it[0] - 1] = it;\n bottomIndicators[it[1] + 1] = it;\n });\n\n const rowIndex = cell.rowIndex + currentRowIndexOffset;\n const isActive = () =>\n hovered &&\n (hovered.dir === 't' || hovered.dir === 'b') &&\n rowIndex >= hovered.orderIndex0 - 1 &&\n rowIndex <= hovered.orderIndex1 + 1;\n\n let orderIndex0, orderIndex1;\n const drawIndicator = (topY, dir, active) => {\n self.visibleUnhideIndicators.push({\n x: leftX - 1,\n y: topY - 1,\n x2: leftX + size + 2,\n y2: topY + size + 2,\n orderIndex0,\n orderIndex1,\n dir,\n });\n drawUnhideIndicator(leftX, topY, size, dir, active);\n }; // end of drawIndicator\n\n let matched = topIndicators[rowIndex];\n if (matched) {\n const indicatorY = cellY + cell.height - size;\n [orderIndex0, orderIndex1] = matched;\n drawIndicator(indicatorY, 't', isActive());\n }\n matched = bottomIndicators[rowIndex];\n if (matched) {\n const indicatorY = cellY;\n [orderIndex0, orderIndex1] = matched;\n drawIndicator(indicatorY, 'b', isActive());\n }\n }\n //#endregion draw unhide indicator for row headers\n\n x += cell.width + (bc ? 0 : self.style.cellBorderWidth);\n return cell.width;\n }; // end of drawEach\n }\n function drawFilterButton(cell, ev) {\n var posX = cell.x + cell.width - self.style.filterButtonWidth - 1;\n var posY = cell.y + cell.height - self.style.filterButtonHeight - 2;\n if (self.dispatchEvent('beforerenderfilterbutton', ev)) {\n return;\n }\n self.ctx.save();\n self.ctx.strokeStyle = self.style.filterButtonBorderColor;\n self.ctx.fillStyle = self.style.filterButtonBackgroundColor;\n if (cell.openedFilter) {\n self.ctx.fillStyle = self.style.filterButtonActiveBackgroundColor;\n } else if (cell.hovered && self.hovers.onFilterButton) {\n self.ctx.fillStyle = self.style.filterButtonHoverBackgroundColor;\n }\n radiusRect(\n posX,\n posY,\n self.style.filterButtonWidth,\n self.style.filterButtonHeight,\n self.style.filterButtonBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n drawFilterButtonArrow(posX, posY);\n self.ctx.clip();\n self.dispatchEvent('afterrenderfilterbutton', ev);\n self.ctx.restore();\n }\n function drawRowHeader(rowData, rowIndex, rowOrderIndex) {\n if (self.attributes.showRowHeaders) {\n x = 0;\n\n // When filtering we'd like to display the actual row numbers,\n // as it is in the unfiltered data, instead of simply the viewed\n // row index + 1. If rowIndex > viewData.length, it's a new row\n // added to the end, and we want to render that new row's number\n let filteredRowNumber;\n if (self.viewData && rowIndex < self.viewData.length)\n filteredRowNumber =\n self.getBoundRowIndexFromViewRowIndex(rowIndex) + 1;\n else\n filteredRowNumber = self.originalData\n ? self.originalData.length + 1\n : rowOrderIndex + 1;\n\n let rowHeaderValue =\n self.hasActiveFilters() || self.hasCollapsedRowGroup()\n ? filteredRowNumber\n : rowIndex + 1;\n rowHeaderValue += currentRowIndexOffset;\n\n const rowHeaderCell = { rowHeaderCell: rowHeaderValue };\n const headerDescription = {\n name: 'rowHeaderCell',\n width: self.sizes.columns[-1] || self.style.rowHeaderCellWidth,\n style: 'rowHeaderCell',\n type: 'string',\n data: rowHeaderValue,\n index: -1,\n };\n rowOpen = self.openChildren[rowIndex];\n drawCell(rowHeaderCell, rowOrderIndex, rowIndex)(\n headerDescription,\n -1,\n -1,\n );\n\n if (\n rowIndexOffsetByHiddenRows[0] &&\n rowHeaderValue >= rowIndexOffsetByHiddenRows[0].from\n ) {\n const { plus } = rowIndexOffsetByHiddenRows.shift();\n currentRowIndexOffset += plus;\n }\n }\n }\n function drawHeaders() {\n var d,\n g = schema.length,\n i,\n o,\n columnHeaderCell,\n header,\n nonFrozenHeaderWidth;\n function drawHeaderColumnRange(start, end) {\n end = Math.min(end, g);\n for (o = start; o < end; o += 1) {\n i = self.orders.columns[o];\n header = schema[i];\n if (!header.hidden && !isColumnCollapsedByGroup(o)) {\n d = {\n title: header.title,\n name: header.name,\n width: header.width || self.style.cellWidth,\n style: 'columnHeaderCell',\n type: 'string',\n index: o,\n order: i,\n };\n columnHeaderCell = {\n columnHeaderCell: header.title || header.name,\n };\n x += drawCell(columnHeaderCell, -1, -1)(d, i, o);\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n }\n }\n rowHeaders.forEach(function (rArgs, rhIndex) {\n y = rArgs[3];\n cellHeight = rArgs[4];\n if (rhIndex === self.frozenRow) {\n self.ctx.save();\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n drawRowHeader(rArgs[0], rArgs[1], rArgs[2]);\n });\n self.ctx.restore();\n if (self.attributes.showColumnHeaders) {\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n y = 0;\n // cell height might have changed during drawing\n cellHeight = self.getColumnHeaderCellHeight();\n drawHeaderColumnRange(self.scrollIndexLeft, g);\n nonFrozenHeaderWidth = x;\n x = self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n drawHeaderColumnRange(0, self.frozenColumn);\n // fill in the space right of the headers\n x = nonFrozenHeaderWidth;\n if (x < w) {\n c = {\n name: '',\n width: self.style.scrollBarWidth,\n style: 'columnHeaderCellCap',\n isColumnHeaderCell: true,\n isColumnHeaderCellCap: true,\n type: 'string',\n index: schema.length,\n };\n drawCell({ endCap: '' }, -1, -1)(c, -1, -1);\n }\n // fill in the space right of the headers\n if (self.attributes.showRowHeaders) {\n cornerCell = { cornerCell: '' };\n x = 0;\n c = {\n name: 'cornerCell',\n width: self.style.rowHeaderCellWidth,\n style: 'cornerCell',\n type: 'string',\n index: -1,\n };\n drawCell(cornerCell, -1, -1)(c, -1, -1);\n }\n }\n }\n function drawRow(rowOrderIndex, rowIndex) {\n var headerIndex,\n treeHeight,\n rowSansTreeHeight,\n columnOrderIndex,\n g = schema.length;\n if (y - cellHeight * 2 > h) {\n return false;\n }\n rowData = viewData[rowOrderIndex];\n rowOpen = self.openChildren[rowOrderIndex];\n rowSansTreeHeight =\n (self.sizes.rows[rowOrderIndex] || self.style.cellHeight) * self.scale;\n treeHeight = (rowOpen ? self.sizes.trees[rowOrderIndex] : 0) * self.scale;\n rowHeight = rowSansTreeHeight + treeHeight;\n if (y < -rowHeight) {\n return false;\n }\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n cellHeight = rowHeight;\n //draw normal columns\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n if (!isColumnCollapsedByGroup(columnOrderIndex)) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n }\n if (x > self.width) {\n self.scrollIndexRight = columnOrderIndex;\n self.scrollPixelRight = x;\n break;\n }\n }\n //draw frozen columns\n x = 1;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n for (\n columnOrderIndex = 0;\n columnOrderIndex < self.frozenColumn;\n columnOrderIndex += 1\n ) {\n if (!isColumnCollapsedByGroup(columnOrderIndex)) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n }\n if (x > self.width) {\n break;\n }\n }\n self.lastFrozenColumnPixel = x;\n // cell height might have changed during drawing\n cellHeight = rowHeight;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n // don't draw a tree for the new row\n treeGrid = self.childGrids[rowOrderIndex];\n if (rowOrderIndex !== viewData.length && rowOpen) {\n treeGrid.visible = true;\n treeGrid.parentNode = {\n offsetTop: y + rowSansTreeHeight + self.canvasOffsetTop,\n offsetLeft: rowHeaderCellWidth - 1 + self.canvasOffsetLeft,\n offsetHeight: treeHeight,\n offsetWidth:\n self.width - rowHeaderCellWidth - self.style.scrollBarWidth - 1,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: self.style,\n nodeType: 'canvas-datagrid-tree',\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n rowIndex: rowOrderIndex,\n columnGroupsAreaHeight: columnGroupsAreaHeight,\n rowGroupsAreaWidth: rowGroupsAreaWidth,\n };\n if (self.intf.parentNode) {\n const {\n columnGroupsAreaHeight,\n rowGroupsAreaWidth,\n } = self.intf.parentNode;\n treeGrid.parentNode.columnGroupsAreaHeight +=\n columnGroupsAreaHeight || 0;\n treeGrid.parentNode.rowGroupsAreaWidth += rowGroupsAreaWidth || 0;\n }\n self.visibleCells.unshift({\n rowIndex: rowOrderIndex,\n columnIndex: 0,\n y: treeGrid.parentNode.offsetTop,\n x: treeGrid.parentNode.offsetLeft,\n height: treeGrid.height,\n width: treeGrid.width,\n style: 'tree-grid',\n type: treeGrid.parentNode.nodeType,\n });\n treeGrid.draw();\n } else if (treeGrid) {\n treeGrid.parentNode.offsetHeight = 0;\n delete self.sizes.trees[rowOrderIndex];\n }\n rowHeaders.push([rowData, rowOrderIndex, rowIndex, y, rowHeight]);\n self.visibleRowHeights[rowOrderIndex] = rowHeight;\n y += cellHeight + (bc ? 0 : self.style.cellBorderWidth);\n return true;\n }\n function initDraw() {\n self.visibleRows = [];\n schema = self.getSchema();\n self.visibleCells = [];\n self.visibleGroups = [];\n self.visibleUnhideIndicators = [];\n self.canvasOffsetTop = self.isChildGrid ? self.parentNode.offsetTop : 0.5;\n self.canvasOffsetLeft = self.isChildGrid\n ? self.parentNode.offsetLeft\n : -0.5;\n h = self.height;\n w = self.width;\n\n // patch for first row being hidden\n const firstRowIndexOffset = rowIndexOffsetByHiddenRows[0];\n if (firstRowIndexOffset && firstRowIndexOffset.from === 0) {\n currentRowIndexOffset = firstRowIndexOffset.plus;\n rowIndexOffsetByHiddenRows.shift();\n }\n }\n function drawBackground() {\n radiusRect(0, 0, w, h, 0);\n self.ctx.clip();\n self.ctx.fillStyle = self.style.gridBackgroundColor;\n fillRect(0, 0, w, h);\n }\n function initGroupArea() {\n self.ctx.translate(rowGroupsAreaWidth, columnGroupsAreaHeight);\n }\n function drawGroupArea() {\n const mx = rowGroupsAreaWidth;\n const my = columnGroupsAreaHeight;\n const frozenColumnsWidth = getFrozenColumnsWidth();\n const frozenRowsHeight =\n rowGroupsFrozenInfo.y + rowGroupsFrozenInfo.h - columnHeaderCellHeight;\n const onTheLeft = self.attributes.columnGroupIndicatorPosition === 'left';\n const onTheTop = self.attributes.rowGroupIndicatorPosition === 'top';\n\n /** @type {CanvasRenderingContext2D} */\n const ctx = self.ctx;\n ctx.save();\n ctx.fillStyle = self.style.groupingAreaBackgroundColor;\n fillRect(0, -my, w, my);\n fillRect(-mx, -my, mx, h);\n ctx.restore();\n\n //#region Columns Grouping\n /** it extends `self.groupedRows` */\n const groupedColumns = [];\n for (let row = 0; row < self.groupedColumns.length; row++) {\n const groups = self.groupedColumns[row];\n for (let j = 0; j < groups.length; j++) {\n groupedColumns.push(Object.assign({ row }, groups[j]));\n }\n }\n if (groupedColumns.length > 0) {\n const rowHeight = self.style.columnGroupRowHeight;\n const toggleHandleSize = rowHeight * 0.5;\n const toggleHandlePadding = (rowHeight - toggleHandleSize) * 0.5;\n\n for (let i = 0; i < groupedColumns.length; i++) {\n const group = groupedColumns[i];\n const { row, collapsed } = group;\n\n const topY = -my + row * rowHeight;\n const centerY = topY + rowHeight * 0.5;\n const bottomY = topY + rowHeight - toggleHandlePadding;\n const leftmostX =\n rowHeaderCellWidth - toggleHandleSize - toggleHandlePadding;\n\n const drawGroupHandleAtX = (x) =>\n drawGroupHandle(\n x,\n topY + toggleHandlePadding,\n toggleHandleSize,\n group.collapsed,\n );\n const pushToVisibleGroups = (leftX, rightX) =>\n self.visibleGroups.push({\n type: 'c',\n collapsed,\n from: group.from,\n to: group.to,\n row,\n x: leftX + mx,\n y: topY + my,\n x2: rightX + mx,\n y2: bottomY + my,\n });\n\n //#region check the relationship between this group and frozen columns\n const crossTheFrozen =\n group.from < self.frozenColumn && group.to >= self.frozenColumn;\n const notInFrozen = group.from >= self.frozenColumn;\n //#endregion\n\n if (collapsed) {\n let leftX = leftmostX + toggleHandleSize;\n // This group is not sticking on the first column\n if (group.from > 0) {\n let colIndex = group.to + 1;\n let col = columnGroupsRectInfo[colIndex];\n if (!col) {\n colIndex = group.from - 1;\n col = columnGroupsRectInfo[colIndex];\n if (!col) continue; // don't draw this group indicator because it is invisible\n leftX = col.x + col.w - toggleHandleSize * 0.5;\n } else {\n leftX = col.x + toggleHandlePadding;\n }\n if (colIndex >= self.frozenColumn) {\n const compare =\n frozenColumnsWidth + rowHeaderCellWidth - toggleHandlePadding;\n // don't draw this group indicator because it is hidden by frozen columns\n if (leftX < compare) continue;\n }\n }\n const rightX = leftX + toggleHandleSize;\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n drawGroupHandleAtX(leftX);\n ctx.restore();\n pushToVisibleGroups(leftX, rightX);\n } // end of collapsed group\n\n /** @type {number} pointer for loop */\n let ptr;\n let left = columnGroupsRectInfo[group.from];\n let right = columnGroupsRectInfo[group.to];\n\n let containsBegining = true;\n let containsEnd = true;\n ptr = group.from;\n while (!left && ptr < group.to) {\n left = columnGroupsRectInfo[++ptr];\n containsBegining = false;\n }\n ptr = group.to;\n while (!right && ptr > group.from) {\n right = columnGroupsRectInfo[--ptr];\n containsEnd = false;\n }\n if (!left || !right) continue;\n let rightX = right.x + right.w;\n let leftX = left.x;\n if (crossTheFrozen) {\n const rightCompare = columnGroupsRectInfo[self.frozenColumn - 1];\n if (rightCompare) {\n let compareX = rightCompare.x + rightCompare.w;\n if (!onTheLeft) compareX += toggleHandleSize;\n if (compareX >= rightX) {\n right = rightCompare;\n rightX = right.x + right.w;\n containsEnd = false;\n }\n }\n }\n\n let minLeftX =\n rowHeaderCellWidth + (notInFrozen ? frozenColumnsWidth : 0);\n if (rightX + (onTheLeft ? 0 : toggleHandleSize) < minLeftX) continue;\n\n rightX -= toggleHandlePadding;\n leftX += toggleHandlePadding;\n\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n const lineCoords = [];\n\n if (onTheLeft) {\n // avoid lines from two groups be overlapping\n minLeftX += toggleHandlePadding * 2;\n if (leftX < minLeftX) leftX = minLeftX;\n if (group.from === 0) leftX -= toggleHandlePadding * 2;\n if (rightX >= leftX) {\n lineCoords.push(leftX, centerY, rightX, centerY);\n if (containsEnd) lineCoords.push(rightX, bottomY);\n } else {\n rightX = leftX;\n }\n\n leftX -= toggleHandleSize;\n drawGroupHandleAtX(leftX);\n // add more clickable area into `visibleGroups`\n rightX += toggleHandlePadding - 1;\n } else {\n // handle on the right\n if (leftX < minLeftX) leftX = minLeftX;\n if (group.from === 0) leftX -= toggleHandlePadding * 2;\n if (containsEnd) {\n if (group.to === self.frozenColumn - 1) {\n rightX -= toggleHandleSize;\n } else {\n rightX += toggleHandlePadding * 2;\n }\n drawGroupHandleAtX(rightX);\n }\n if (leftX > rightX) {\n leftX = rightX;\n } else {\n if (group.from === 0) {\n containsBegining = true;\n leftX = leftmostX + toggleHandleSize;\n }\n if (containsBegining) lineCoords.push(leftX, bottomY);\n lineCoords.push(leftX, centerY, rightX, centerY);\n }\n\n // add more clickable area into `visibleGroups`\n leftX -= toggleHandlePadding + 1;\n if (containsEnd) rightX += toggleHandleSize;\n }\n drawLines(lineCoords);\n ctx.restore();\n pushToVisibleGroups(leftX, rightX);\n }\n }\n //#endregion Columns Grouping\n\n //#region Rows Grouping\n /** it extends `self.groupedRows` */\n const groupedRows = [];\n for (let col = 0; col < self.groupedRows.length; col++) {\n const groups = self.groupedRows[col];\n for (let j = 0; j < groups.length; j++) {\n groupedRows.push(Object.assign({ col }, groups[j]));\n }\n }\n if (groupedRows.length > 0) {\n const colWidth = self.style.rowGroupColumnWidth;\n const toggleHandleSize = colWidth * 0.5;\n const toggleHandlePadding = (colWidth - toggleHandleSize) * 0.5;\n\n for (let i = 0; i < groupedRows.length; i++) {\n const group = groupedRows[i];\n const { col, collapsed } = group;\n\n const leftX = -mx + col * colWidth;\n const centerX = leftX + colWidth * 0.5;\n const rightX = leftX + colWidth - toggleHandlePadding;\n const topmostY =\n columnHeaderCellHeight - toggleHandleSize - toggleHandlePadding;\n\n const drawGroupHandleAtY = (y) =>\n drawGroupHandle(\n leftX + toggleHandlePadding,\n y,\n toggleHandleSize,\n group.collapsed,\n );\n const pushToVisibleGroups = (topY, bottomY) =>\n self.visibleGroups.push({\n type: 'r',\n collapsed,\n from: group.from,\n to: group.to,\n col,\n x: leftX + mx,\n y: topY + my,\n x2: rightX + mx,\n y2: bottomY + my,\n });\n\n //#region check the relationship between this group and frozen columns\n const crossTheFrozen =\n group.from < self.frozenRow && group.to >= self.frozenRow;\n const notInFrozen = group.from >= self.frozenRow;\n //#endregion\n\n if (collapsed) {\n let topY = topmostY + toggleHandleSize;\n // This group is not sticking on the first column\n if (group.from > 0) {\n let rowIndex = group.to + 1;\n let row = rowGroupsRectInfo[rowIndex];\n if (!row) {\n rowIndex = group.from - 1;\n row = rowGroupsRectInfo[rowIndex];\n if (!row) continue; // don't draw this group indicator because it is invisible\n topY = row.y + row.h - toggleHandleSize * 0.5;\n } else {\n topY = row.y;\n }\n if (rowIndex >= self.frozenRow) {\n const compare =\n frozenRowsHeight +\n columnHeaderCellHeight -\n toggleHandlePadding;\n // don't draw this group indicator because it is hidden by frozen columns\n if (topY < compare) continue;\n }\n }\n const bottomY = topY + toggleHandleSize;\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n drawGroupHandleAtY(topY);\n ctx.restore();\n pushToVisibleGroups(topY, bottomY);\n } // end of collapsed group\n\n /** @type {number} pointer for loop */\n let ptr;\n let top = rowGroupsRectInfo[group.from];\n let bottom = rowGroupsRectInfo[group.to];\n\n let containsBegining = true;\n let containsEnd = true;\n ptr = group.from;\n while (!top && ptr < group.to) {\n top = rowGroupsRectInfo[++ptr];\n containsBegining = false;\n }\n ptr = group.to;\n while (!bottom && ptr > group.from) {\n bottom = rowGroupsRectInfo[--ptr];\n containsEnd = false;\n }\n if (!top || !bottom) continue;\n let bottomY = bottom.y + bottom.h;\n let topY = top.y;\n if (crossTheFrozen) {\n const bottomCompare = rowGroupsRectInfo[self.frozenRow - 1];\n if (bottomCompare) {\n let compareY = bottomCompare.y + bottomCompare.h;\n if (!onTheTop) compareY += toggleHandleSize;\n if (compareY >= bottomY) {\n bottom = bottomCompare;\n bottomY = bottom.y + bottom.h;\n containsEnd = false;\n }\n }\n }\n\n let minTopY =\n columnHeaderCellHeight + (notInFrozen ? frozenRowsHeight : 0);\n if (bottomY + (onTheTop ? 0 : toggleHandleSize) < minTopY) continue;\n\n bottomY -= toggleHandlePadding;\n topY += toggleHandlePadding;\n\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n const lineCoords = [];\n\n if (onTheTop) {\n // avoid lines from two groups be overlapping\n minTopY += toggleHandlePadding * 2;\n if (topY < minTopY) topY = minTopY;\n if (group.from === 0) topY -= toggleHandlePadding * 2;\n if (bottomY >= topY) {\n lineCoords.push(centerX, topY, centerX, bottomY);\n if (containsEnd) lineCoords.push(rightX, bottomY);\n } else {\n bottomY = topY;\n }\n\n topY -= toggleHandleSize;\n drawGroupHandleAtY(topY);\n\n // add more clickable area into `visibleGroups`\n bottomY += toggleHandlePadding - 1;\n } else {\n // handle on the bottom\n if (topY < minTopY) topY = minTopY;\n if (group.from === 0) topY -= toggleHandlePadding * 2;\n if (containsEnd) {\n if (group.to === self.frozenRow - 1) {\n bottomY -= toggleHandleSize;\n } else {\n // bottomY += toggleHandlePadding * 2;\n }\n drawGroupHandleAtY(bottomY);\n }\n if (topY > bottomY) {\n topY = bottomY;\n } else {\n if (group.from === 0) {\n containsBegining = true;\n topY = topmostY + toggleHandleSize;\n }\n if (containsBegining) lineCoords.push(rightX, topY);\n lineCoords.push(centerX, topY, centerX, bottomY);\n // add more clickable area into `visibleGroups`\n topY -= toggleHandlePadding + 1;\n }\n // add more clickable area into `visibleGroups`\n if (containsEnd) bottomY += toggleHandleSize;\n }\n drawLines(lineCoords);\n ctx.restore();\n pushToVisibleGroups(topY, bottomY);\n }\n }\n //#endregion Rows Grouping\n }\n function drawFrozenRows() {\n var rowOrderIndex,\n ln = Math.min(viewData.length, self.frozenRow);\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n y = columnHeaderCellHeight;\n for (rowIndex = 0; rowIndex < ln; rowIndex += 1) {\n rowOrderIndex = self.orders.rows[rowIndex];\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.allowFreezingRows) {\n // HACK great, another stupid magic number.\n // Background will appear as a 0.5px artifact behind the row freeze bar without this hack\n if (y > columnHeaderCellHeight) y += self.style.frozenMarkerWidth;\n y += self.style.frozenMarkerBorderWidth - 0.4999999999;\n }\n self.lastFrozenRowPixel = y;\n }\n function drawRows() {\n self.ctx.save();\n if (self.frozenRow > 0) {\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n var columnOrderIndex,\n rowOrderIndex,\n headerIndex,\n g = schema.length;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n if (!self.attributes.snapToRow) {\n y +=\n -self.scrollBox.scrollTop +\n self.scrollPixelTop +\n self.style.cellBorderWidth;\n }\n for (\n rowIndex = self.frozenRow + self.scrollIndexTop;\n rowIndex < l;\n rowIndex += 1\n ) {\n rowOrderIndex = self.orders.rows[rowIndex];\n self.scrollIndexBottom = rowIndex;\n self.scrollPixelBottom = y;\n if (\n self.cellTree.rows.length > 0 &&\n Object.keys(self.cellTree.rows[rowOrderIndex]).length > 0 &&\n self.cellTree.rows[rowOrderIndex].hide\n )\n continue;\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.showNewRow) {\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n rowHeight = cellHeight = self.style.cellHeight;\n rowOpen = false;\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n if (!isColumnCollapsedByGroup(columnOrderIndex)) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(self.newRow, viewData.length, viewData.length)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n }\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n rowHeaders.push([\n self.newRow,\n viewData.length,\n viewData.length,\n y,\n rowHeight,\n ]);\n }\n self.ctx.restore();\n }\n function drawMoveMarkers() {\n if (!self.movingSelection) {\n return;\n }\n self.ctx.lineWidth = self.style.moveOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.moveOverlayBorderColor;\n self.ctx.setLineDash(self.style.moveOverlayBorderSegments);\n moveBorders.forEach(function (c) {\n addBorderLine(c[0], c[1]);\n });\n self.ctx.setLineDash([]);\n }\n function drawReorderMarkers() {\n if (!self.reorderObject) {\n return;\n }\n var b = {\n height: self.reorderObject.height,\n width: self.reorderObject.width,\n x: self.reorderObject.x + self.reorderObject.dragOffset.x,\n y: self.reorderObject.y + self.reorderObject.dragOffset.y,\n },\n m = {\n width: w,\n height: h,\n x: 0,\n y: 0,\n };\n self.ctx.fillStyle = self.style.reorderMarkerBackgroundColor;\n self.ctx.lineWidth = self.style.reorderMarkerBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerBorderColor;\n if (self.dragMode === 'row-reorder') {\n for (var k = 0; k < self.selections.length; k++) {\n if (!self.selections[k] || k == self.reorderObject.rowIndex) continue;\n b.height += self.getRowHeight(k);\n }\n b.width = w;\n b.x = 0;\n m.width = w;\n m.height = self.currentCell.height;\n m.y = self.currentCell.y;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n self.selectedRows.indexOf(self.reorderTarget.sortRowIndex) === -1 &&\n self.currentCell.rowIndex !== self.reorderObject.rowIndex &&\n self.currentCell.rowIndex > -1 &&\n self.currentCell.rowIndex < l\n ) {\n addBorderLine(\n m,\n self.reorderTarget.sortRowIndex > self.reorderObject.sortRowIndex\n ? 'b'\n : 't',\n );\n }\n } else if (self.dragMode === 'column-reorder' && self.reorderObject) {\n var selectedColumns = self.selections[0];\n if (selectedColumns) {\n for (var k = 1; k < selectedColumns.length; k++) {\n b.width += self.getColumnWidth(\n self.orders.columns[selectedColumns[k]],\n );\n }\n }\n b.height = h;\n b.y = 0;\n m.height = h;\n m.width = self.currentCell.width;\n m.y = 0;\n m.x = self.currentCell.x;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n self.selectedColumns.indexOf(self.reorderTarget.sortColumnIndex) ===\n -1 &&\n self.currentCell.sortColumnIndex !==\n self.reorderObject.sortColumnIndex &&\n self.reorderTarget.columnIndex !== self.reorderObject.columnIndex &&\n self.currentCell.sortColumnIndex > -1 &&\n self.currentCell.sortColumnIndex < schema.length\n ) {\n addBorderLine(\n m,\n self.reorderTarget.columnIndex > self.reorderObject.columnIndex\n ? 'r'\n : 'l',\n );\n }\n }\n }\n function drawBorder() {\n self.ctx.lineWidth = self.style.gridBorderWidth;\n self.ctx.strokeStyle = self.style.gridBorderColor;\n strokeRect(0, 0, self.width, self.height);\n }\n function drawSelectionBorders() {\n function dsb(c) {\n if (!self.fillOverlay.handle) {\n self.ctx.lineWidth = self.style.selectionOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.selectionOverlayBorderColor;\n addBorderLine(c[0], c[1]);\n }\n }\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.save();\n clipFrozenArea(0);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(1);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(2);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n\n drawFillOverlay();\n }\n function drawSelectionHandles() {\n if (\n (self.mobile || self.attributes.allowMovingSelection) &&\n self.attributes.editable\n ) {\n self.ctx.lineWidth = self.style.selectionHandleBorderWidth;\n self.ctx.strokeStyle = self.style.selectionHandleBorderColor;\n self.ctx.fillStyle = self.style.selectionHandleColor;\n selectionHandles.forEach(function (c) {\n addselectionHandle(c[0], c[1]);\n var az = self.attributes.touchSelectHandleZone / 2,\n ax =\n c[0].x + (c[1] === 'tl' || c[1] === 'bl' ? 0 : c[0].width) - az,\n ay =\n c[0].y + (c[1] === 'bl' || c[1] === 'br' ? c[0].height : 0) - az;\n self.visibleCells.unshift({\n x: ax,\n y: ay,\n height: self.style.selectionHandleSize + az,\n width: self.style.selectionHandleSize + az,\n style: 'selection-handle-' + c[1],\n });\n });\n }\n }\n function drawFillOverlay() {\n if (!self.fillOverlay.handle || !self.fillOverlay.snapTo) {\n return;\n }\n\n self.ctx.save();\n\n const overlay = self.fillOverlay;\n const handle = overlay.handle;\n const toX = overlay.snapTo.x;\n const toY = overlay.snapTo.y;\n\n // The cell that the cursor is moving over. This may be unavailable\n // when the cursor is outside the grid or is pointing to something else.\n //\n // When unavailable, we use the actual position of the cursor to draw\n // the overlay.\n const snap = overlay.snap;\n\n // Calculate the X, Y coordinates of the cursor with snap positions and\n // the direction of the movement in mind.\n //\n // When the movement is horizontal, we get the Y coordinate from the handle,\n // and vice-versa.\n const cursorX =\n overlay.direction === 'x'\n ? snap\n ? snap.x + (overlay.x < toX ? 0 : snap.width)\n : overlay.x\n : handle.x;\n const cursorY =\n overlay.direction === undefined || overlay.direction === 'y'\n ? snap\n ? snap.y + (overlay.y < toY ? 0 : snap.height)\n : overlay.y\n : handle.y;\n\n // The final coordinates of the rect. We use 'minX' and 'minY' to avoid\n // drawing on the frozen area.\n const x = Math.max(Math.min(toX, cursorX), overlay.minX);\n const y = Math.max(Math.min(toY, cursorY), overlay.minY);\n\n // Width and height of the rect are the difference between the\n // coordinates of both the rect and the cursor. The user may be pointing\n // behind and/or upwards of the rect, so we need to take that into\n // account.\n const width = Math.max(toX, cursorX) - x;\n const height = Math.max(toY, cursorY) - y;\n\n self.ctx.strokeStyle = self.style.fillOverlayBorderColor;\n self.ctx.lineWidth = self.style.fillOverlayBorderWidth;\n self.ctx.setLineDash([3, 3]);\n strokeRect(x, y, width, height);\n self.ctx.setLineDash([]);\n self.ctx.restore();\n }\n function drawActiveCell() {\n if (!aCell) {\n return;\n }\n self.ctx.save();\n var cl =\n self.activeCell.columnIndex + 1 > self.frozenColumn ||\n self.activeCell.rowIndex + 1 > self.frozenRow,\n acx = cl ? self.lastFrozenColumnPixel : 0,\n acy = cl ? self.lastFrozenRowPixel : 0,\n acw = cl ? self.width - self.lastFrozenColumnPixel : self.width,\n ach = cl ? self.height - self.lastFrozenRowPixel : self.height;\n radiusRect(acx, acy, acw, ach, 0);\n self.ctx.clip();\n if (self.attributes.selectionMode === 'row') {\n if (self.activeCell && self.activeCell.rowIndex === aCell.rowIndex) {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(\n 1,\n aCell.y,\n self.getHeaderWidth() + rowHeaderCellWidth,\n self.visibleRowHeights[aCell.rowIndex],\n );\n }\n } else {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(aCell.x, aCell.y, aCell.width, aCell.height);\n }\n self.ctx.restore();\n }\n function drawFrozenMarkers() {\n var my = self.lastFrozenRowPixel - self.style.frozenMarkerWidth,\n mx = self.lastFrozenColumnPixel - self.style.frozenMarkerWidth,\n xHover =\n self.currentCell && self.currentCell.style === 'frozen-row-marker',\n yHover =\n self.currentCell && self.currentCell.style === 'frozen-column-marker';\n let rowHeaderCellWidth = self.getRowHeaderCellWidth();\n self.ctx.lineWidth = self.style.frozenMarkerBorderWidth;\n if (self.attributes.allowFreezingColumns) {\n if (\n !self.freezeMarkerPosition ||\n (self.freezeMarkerPosition && self.dragMode === 'frozen-row-marker')\n ) {\n if (mx > self.style.rowHeaderCellWidth) {\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n }\n self.ctx.fillStyle = yHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = yHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerHeaderColor;\n fillRect(\n mx,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n strokeRect(\n mx,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n }\n\n if (\n !self.dragStartObject ||\n (self.dragStartObject &&\n self.dragStartObject.style !== 'rowHeaderCell')\n ) {\n self.visibleCells.unshift({\n x: mx,\n y: 0,\n height: self.height,\n width: self.style.frozenMarkerWidth, // + self.style.frozenMarkerBorderWidth,\n style: 'frozen-column-marker',\n });\n }\n }\n if (self.attributes.allowFreezingRows) {\n if (\n !self.freezeMarkerPosition ||\n (self.freezeMarkerPosition &&\n self.dragMode === 'frozen-column-marker')\n ) {\n if (my > rowHeaderCellWidth) {\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(0, my, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, my, self.width, self.style.frozenMarkerWidth);\n }\n self.ctx.fillStyle = xHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = xHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerHeaderColor;\n fillRect(0, my, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n strokeRect(0, my, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n }\n var height =\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth;\n if (\n !self.dragStartObject ||\n (self.dragStartObject &&\n self.dragStartObject.style !== 'columnHeaderCell')\n ) {\n self.visibleCells.unshift({\n x: 0,\n y: my,\n height: height,\n width: self.width,\n style: 'frozen-row-marker',\n });\n }\n rowGroupsFrozenInfo = { y: my, h: height };\n }\n if (self.freezeMarkerPosition) {\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n if (self.dragMode === 'frozen-column-marker') {\n let posX = self.freezeMarkerPosition.x;\n let nearCell = self.getCellAt(posX, 0);\n if (self.freezeMarkerPosition.isGrab) posX = mx;\n if (posX > rowHeaderCellWidth) {\n let x =\n nearCell.x -\n self.style.frozenMarkerWidth -\n self.style.frozenMarkerBorderWidth;\n if (posX > x + nearCell.width / 2) x = x + nearCell.width;\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(x, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(x, 0, self.style.frozenMarkerWidth, self.height);\n self.ctx.fillStyle = self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerHeaderColor;\n fillRect(\n x,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n strokeRect(\n x,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n }\n self.ctx.fillStyle = self.style.frozenMarkerActiveHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n fillRect(\n posX,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n strokeRect(\n posX,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n fillRect(posX, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(posX, 0, self.style.frozenMarkerWidth, self.height);\n } else {\n let posY = self.freezeMarkerPosition.y;\n let nearCell = self.getCellAt(0, posY);\n if (self.freezeMarkerPosition.isGrab) posY = my;\n if (posY > self.style.columnHeaderCellHeight) {\n let y =\n nearCell.y -\n self.style.frozenMarkerWidth -\n self.style.frozenMarkerBorderWidth;\n if (posY > y + nearCell.height / 2) y = y + nearCell.height;\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(0, y, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, y, self.width, self.style.frozenMarkerWidth);\n self.ctx.fillStyle = self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerHeaderColor;\n fillRect(0, y, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n strokeRect(0, y, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n }\n self.ctx.fillStyle = self.style.frozenMarkerActiveHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n fillRect(0, posY, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n strokeRect(0, posY, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n fillRect(0, posY, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, posY, self.width, self.style.frozenMarkerWidth);\n }\n }\n }\n function drawPerfLines() {\n if (!self.attributes.showPerformance) {\n return;\n }\n var pw = 250,\n px =\n self.width -\n pw -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth * 2,\n py = columnHeaderCellHeight,\n ph = 100;\n if (scrollDebugCounters.length === 0) {\n scrollDebugCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (touchPPSCounters.length === 0) {\n touchPPSCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (entityCount.length === 0) {\n entityCount = fillArray(0, perfWindowSize, 1, 0);\n }\n self.ctx.lineWidth = 0.5;\n function dpl(name, perfArr, arrIndex, max, color, useAbs, rowIndex) {\n var v;\n drawPerfLine(pw, ph, px, py, perfArr, arrIndex, max, color, useAbs);\n self.ctx.fillStyle = color;\n fillRect(3 + px, py + 9 + rowIndex * 11, 8, 8);\n self.ctx.fillStyle = self.style.debugPerfChartTextColor;\n v = arrIndex !== undefined ? perfArr[0][arrIndex] : perfArr[0];\n fillText(\n name + ' ' + (isNaN(v) ? 0 : v).toFixed(3),\n 14 + px,\n py + 16 + rowIndex * 11,\n );\n }\n self.ctx.textAlign = 'left';\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n fillRect(px, py, pw, ph);\n [\n [\n 'Scroll Height',\n scrollDebugCounters,\n 0,\n self.scrollBox.scrollHeight,\n self.style.debugScrollHeightColor,\n false,\n ],\n [\n 'Scroll Width',\n scrollDebugCounters,\n 1,\n self.scrollBox.scrollWidth,\n self.style.debugScrollWidthColor,\n false,\n ],\n [\n 'Performance',\n perfCounters,\n undefined,\n 200,\n self.style.debugPerformanceColor,\n false,\n ],\n [\n 'Entities',\n entityCount,\n undefined,\n 1500,\n self.style.debugEntitiesColor,\n false,\n ],\n [\n 'TouchPPSX',\n touchPPSCounters,\n 0,\n 1000,\n self.style.debugTouchPPSXColor,\n true,\n ],\n [\n 'TouchPPSY',\n touchPPSCounters,\n 1,\n 1000,\n self.style.debugTouchPPSYColor,\n true,\n ],\n ].forEach(function (i, index) {\n i.push(index);\n dpl.apply(null, i);\n });\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n entityCount.pop();\n entityCount.unshift(self.visibleCells.length);\n scrollDebugCounters.pop();\n scrollDebugCounters.unshift([\n self.scrollBox.scrollTop,\n self.scrollBox.scrollLeft,\n ]);\n touchPPSCounters.pop();\n touchPPSCounters.unshift([self.yPPS, self.xPPS]);\n }\n function drawDebug() {\n self.ctx.save();\n var d;\n if (self.attributes.showPerformance || self.attributes.debug) {\n if (perfCounters.length === 0) {\n perfCounters = fillArray(0, perfWindowSize, 1, 0);\n }\n perfCounters.pop();\n perfCounters.unshift(performance.now() - p);\n }\n if (!self.attributes.debug) {\n self.ctx.restore();\n return;\n }\n self.ctx.font = self.style.debugFont;\n d = {};\n d.perf = (\n perfCounters.reduce(function (a, b) {\n return a + b;\n }, 0) / Math.min(drawCount, perfCounters.length)\n ).toFixed(1);\n d.perfDelta = perfCounters[0].toFixed(1);\n d.frozenColumnsWidth = getFrozenColumnsWidth();\n d.htmlImages = Object.keys(self.htmlImageCache).length;\n d.reorderObject =\n 'x: ' +\n (self.reorderObject || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderObject || { rowIndex: 0 }).rowIndex;\n d.reorderTarget =\n 'x: ' +\n (self.reorderTarget || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderTarget || { rowIndex: 0 }).rowIndex;\n d.scale = self.scale;\n d.startScale = self.startScale;\n d.scaleDelta = self.scaleDelta;\n d.zoomDeltaStart = self.zoomDeltaStart;\n d.touchLength = self.touchLength;\n d.touches =\n 'y0: ' +\n (self.touchPosition || { y: 0 }).y +\n ' y1: ' +\n (self.touchPosition1 || { y: 0 }).y;\n d.scrollBox = self.scrollBox.toString();\n d.scrollIndex =\n 'x: ' + self.scrollIndexLeft + ', y: ' + self.scrollIndexTop;\n d.scrollPixel =\n 'x: ' + self.scrollPixelLeft + ', y: ' + self.scrollPixelTop;\n d.canvasOffset =\n 'x: ' + self.canvasOffsetLeft + ', y: ' + self.canvasOffsetTop;\n d.touchDelta = 'x: ' + self.touchDelta.x + ', y: ' + self.touchDelta.y;\n d.touchAnimateTo =\n 'x: ' + self.touchAnimateTo.x + ', y: ' + self.touchAnimateTo.y;\n d.scrollAnimation =\n 'x: ' + self.scrollAnimation.x + ', y: ' + self.scrollAnimation.y;\n d.touchPPS = 'x: ' + self.xPPS + ', y: ' + self.yPPS;\n d.touchPPST = 'x: ' + self.xPPST + ', y: ' + self.yPPST;\n d.touchDuration = self.touchDuration;\n d.pointerLockPosition = self.pointerLockPosition\n ? self.pointerLockPosition.x + ', ' + self.pointerLockPosition.y\n : '';\n d.size = 'w: ' + self.width + ', h: ' + self.height;\n d.mouse = 'x: ' + self.mouse.x + ', y: ' + self.mouse.y;\n d.touch = !self.touchStart\n ? ''\n : 'x: ' + self.touchStart.x + ', y: ' + self.touchStart.y;\n d.entities = self.visibleCells.length;\n d.hasFocus = self.hasFocus;\n d.dragMode = self.dragMode;\n if (self.currentCell) {\n d.columnIndex = self.currentCell.columnIndex;\n d.rowIndex = self.currentCell.rowIndex;\n d.sortColumnIndex = self.currentCell.sortColumnIndex;\n d.sortRowIndex = self.currentCell.sortRowIndex;\n d.context = self.currentCell.context;\n d.dragContext = self.currentCell.dragContext;\n d.style = self.currentCell.style;\n d.type = self.currentCell.type;\n }\n self.ctx.textAlign = 'right';\n self.ctx.fillStyle = self.style.debugBackgroundColor;\n fillRect(0, 0, self.width, self.height);\n Object.keys(d).forEach(function (key, index) {\n var m = key + ': ' + d[key],\n lh = 14;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n m,\n w - 20,\n (self.attributes.showPerformance ? 140 : 24) + index * lh,\n );\n });\n self.ctx.restore();\n }\n self.ctx.save();\n initDraw();\n drawBackground();\n initGroupArea();\n drawFrozenRows();\n drawRows();\n drawActiveCell();\n drawHeaders();\n drawFrozenMarkers();\n drawSelectionHandles();\n drawReorderMarkers();\n drawMoveMarkers();\n drawBorder();\n drawSelectionBorders();\n drawScrollBars();\n if (checkScrollHeight) {\n self.resize(true);\n }\n drawGroupArea();\n drawDebug();\n drawPerfLines();\n if (self.dispatchEvent('afterdraw', {})) {\n return;\n }\n self.ctx.restore();\n };\n}\n","module.exports=function(e){var o={};function a(t){if(o[t])return o[t].exports;var r=o[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}return a.m=e,a.c=o,a.d=function(e,o,t){a.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:t})},a.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},a.t=function(e,o){if(1&o&&(e=a(e)),8&o)return e;if(4&o&&\"object\"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,\"default\",{enumerable:!0,value:e}),2&o&&\"string\"!=typeof e)for(var r in e)a.d(t,r,function(o){return e[o]}.bind(null,r));return t},a.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(o,\"a\",o),o},a.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},a.p=\"\",a(a.s=0)}([function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});var t=a(1),r=Object.keys(t.default).reduce((function(e,o){return e.concat(t.default[o])}),[]);o.default=function(e){return-1===r.indexOf(e.key)}},function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});o.default={modifier:[\"Alt\",\"AltGraph\",\"CapsLock\",\"Control\",\"Fn\",\"FnLock\",\"Meta\",\"NumLock\",\"ScrollLock\",\"Shift\",\"Symbol\",\"SymbolLock\"],legacyModifier:[\"Hyper\",\"Super\"],whiteSpace:[\"Enter\",\"Tab\"],navigation:[\"ArrowDown\",\"ArrowLeft\",\"ArrowRight\",\"ArrowUp\",\"End\",\"Home\",\"PageDown\",\"PageUp\"],editing:[\"Backspace\",\"Clear\",\"Copy\",\"CrSel\",\"Cut\",\"Delete\",\"EraseEof\",\"ExSel\",\"Insert\",\"Paste\",\"Redo\",\"Undo\"],ui:[\"Accept\",\"Again\",\"Attn\",\"Cancel\",\"ContextMenu\",\"Escape\",\"Execute\",\"Find\",\"Help\",\"Pause\",\"Play\",\"Props\",\"Select\",\"ZoomIn\",\"ZoomOut\"],device:[\"BrightnessDown\",\"BrightnessUp\",\"Eject\",\"LogOff\",\"Power\",\"PowerOff\",\"PrintScreen\",\"Hibernate\",\"Standby\",\"WakeUp\"],imeCompositionKeys:[\"AllCandidates\",\"Alphanumeric\",\"CodeInput\",\"Compose\",\"Convert\",\"Dead\",\"FinalMode\",\"GroupFirst\",\"GroupLast\",\"GroupNext\",\"GroupPrevious\",\"ModeChange\",\"NextCandidate\",\"NonConvert\",\"PreviousCandidate\",\"Process\",\"SingleCandidate\"],koreanSpecific:[\"HangulMode\",\"HanjaMode\",\"JunjaMode\"],japaneseSpecific:[\"Eisu\",\"Hankaku\",\"Hiragana\",\"HiraganaKatakana\",\"KanaMode\",\"KanjiMode\",\"Katakana\",\"Romaji\",\"Zenkaku\",\"ZenkakuHankaku\"],commonFunction:[\"F1\",\"F2\",\"F3\",\"F4\",\"F5\",\"F6\",\"F7\",\"F8\",\"F9\",\"F10\",\"F11\",\"F12\",\"Soft1\",\"Soft2\",\"Soft3\",\"Soft4\"],multimedia:[\"ChannelDown\",\"ChannelUp\",\"Close\",\"MailForward\",\"MailReply\",\"MailSend\",\"MediaClose\",\"MediaFastForward\",\"MediaPause\",\"MediaPlay\",\"MediaPlayPause\",\"MediaRecord\",\"MediaRewind\",\"MediaStop\",\"MediaTrackNext\",\"MediaTrackPrevious\",\"New\",\"Open\",\"Print\",\"Save\",\"SpellCheck\"],multimediaNumpad:[\"Key11\",\"Key12\"],audio:[\"AudioBalanceLeft\",\"AudioBalanceRight\",\"AudioBassBoostDown\",\"AudioBassBoostToggle\",\"AudioBassBoostUp\",\"AudioFaderFront\",\"AudioFaderRear\",\"AudioSurroundModeNext\",\"AudioTrebleDown\",\"AudioTrebleUp\",\"AudioVolumeDown\",\"AudioVolumeUp\",\"AudioVolumeMute\",\"MicrophoneToggle\",\"MicrophoneVolumeDown\",\"MicrophoneVolumeUp\",\"MicrophoneVolumeMute\"],speech:[\"SpeechCorrectionList\",\"SpeechInputToggle\"],application:[\"LaunchApplication1\",\"LaunchApplication2\",\"LaunchCalendar\",\"LaunchContacts\",\"LaunchMail\",\"LaunchMediaPlayer\",\"LaunchMusicPlayer\",\"LaunchPhone\",\"LaunchScreenSaver\",\"LaunchSpreadsheet\",\"LaunchWebBrowser\",\"LaunchWebCam\",\"LaunchWordProcessor\"],browser:[\"BrowserBack\",\"BrowserFavorites\",\"BrowserForward\",\"BrowserHome\",\"BrowserRefresh\",\"BrowserSearch\",\"BrowserStop\"],mobilePhone:[\"AppSwitch\",\"Call\",\"Camera\",\"CameraFocus\",\"EndCall\",\"GoBack\",\"GoHome\",\"HeadsetHook\",\"LastNumberRedial\",\"Notification\",\"MannerMode\",\"VoiceDial\"],tv:[\"TV\",\"TV3DMode\",\"TVAntennaCable\",\"TVAudioDescription\",\"TVAudioDescriptionMixDown\",\"TVAudioDescriptionMixUp\",\"TVContentsMenu\",\"TVDataService\",\"TVInput\",\"TVInputComponent1\",\"TVInputComponent2\",\"TVInputComposite1\",\"TVInputComposite2\",\"TVInputHDMI1\",\"TVInputHDMI2\",\"TVInputHDMI3\",\"TVInputHDMI4\",\"TVInputVGA1\",\"TVMediaContext\",\"TVNetwork\",\"TVNumberEntry\",\"TVPower\",\"TVRadioService\",\"TVSatellite\",\"TVSatelliteBS\",\"TVSatelliteCS\",\"TVSatelliteToggle\",\"TVTerrestrialAnalog\",\"TVTerrestrialDigital\",\"TVTimer\"],mediaControls:[\"AVRInput\",\"AVRPower\",\"ColorF0Red\",\"ColorF1Green\",\"ColorF2Yellow\",\"ColorF3Blue\",\"ColorF4Grey\",\"ColorF5Brown\",\"ClosedCaptionToggle\",\"Dimmer\",\"DisplaySwap\",\"DVR\",\"Exit\",\"FavoriteClear0\",\"FavoriteClear1\",\"FavoriteClear2\",\"FavoriteClear3\",\"FavoriteRecall0\",\"FavoriteRecall1\",\"FavoriteRecall2\",\"FavoriteRecall3\",\"FavoriteStore0\",\"FavoriteStore1\",\"FavoriteStore2\",\"FavoriteStore3\",\"Guide\",\"GuideNextDay\",\"GuidePreviousDay\",\"Info\",\"InstantReplay\",\"Link\",\"ListProgram\",\"LiveContent\",\"Lock\",\"MediaApps\",\"MediaAudioTrack\",\"MediaLast\",\"MediaSkipBackward\",\"MediaSkipForward\",\"MediaStepBackward\",\"MediaStepForward\",\"MediaTopMenu\",\"NavigateIn\",\"NavigateNext\",\"NavigateOut\",\"NavigatePrevious\",\"NextFavoriteChannel\",\"NextUserProfile\",\"OnDemand\",\"Pairing\",\"PinPDown\",\"PinPMove\",\"PinPToggle\",\"PinPUp\",\"PlaySpeedDown\",\"PlaySpeedReset\",\"PlaySpeedUp\",\"RandomToggle\",\"RcLowBattery\",\"RecordSpeedNext\",\"RfBypass\",\"ScanChannelsToggle\",\"ScreenModeNext\",\"Settings\",\"SplitScreenToggle\",\"STBInput\",\"STBPower\",\"Subtitle\",\"Teletext\",\"VideoModeNext\",\"Wink\",\"ZoomToggle\"]}}]).default;","'use strict';\n\nconst isSupportedHtml = function (pasteValue) {\n // We need to match new lines in the HTML, .* won't match new line characters.\n // `s` regex modifier can't be used with `ecmaVersion === 2017`.\n // As a workaround using [\\s\\S]*. Fix when we upgrade `ecmaVersion`.\n const genericDiv = /(?:^(<meta[^>]*>)?[\\s\\S]*<div[^>]*>)/;\n const genericSpan = /(?:^(<meta[^>]*>)?[\\s\\S]*<span[^>]*>)/;\n const genericTable = /(?:^(<meta[^>]*>)?[\\s\\S]*<table[^>]*>)/; // Matches Google Sheets format clipboard data format too.\n const excelTable = /(?:<!--StartFragment-->[\\s\\S]*<tr[^>]*>)/;\n const excelTableRow = /(?:<!--StartFragment-->[\\s\\S]*<td[^>]*>)/;\n\n return [\n genericDiv,\n genericTable,\n genericSpan,\n excelTable,\n excelTableRow,\n ].some((expression) => expression.test(pasteValue));\n};\n\n// Explanation of nodeType here: https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst IGNORE_NODETYPES = [8, 3]; // '#text' and '#comment'\n\nconst isHtmlTable = function (pasteValue) {\n return /(?:<table[^>]*>)|(?:<tr[^]*>)/.test(pasteValue);\n};\n\nconst sanitizeElementData = function (element) {\n // It is not entirely clear if this check on nodeType is required.\n let elementData = element.nodeType === 1 ? element.innerText : element.data;\n\n return String(elementData).replace(/\\s+/g, ' ').trim();\n};\n\nconst parseHtmlText = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const element = doc.querySelector('div') || doc.querySelector('span');\n const elementData = sanitizeElementData(element);\n\n return elementData\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseHtmlTable = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const trs = doc.querySelectorAll('table tr');\n const rows = [];\n\n for (const tr of trs) {\n const row = [];\n\n for (const childNode of tr.childNodes) {\n if (IGNORE_NODETYPES.includes(childNode.nodeType)) continue;\n\n const col = { value: [] };\n const value = sanitizeElementData(childNode);\n\n if (value) col.value.push({ value });\n\n row.push(col);\n }\n\n rows.push(row);\n }\n\n return rows;\n};\n\nconst parseText = function (data) {\n return data\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseData = function (data, mimeType) {\n if (mimeType === 'text/html' && isHtmlTable(data)) {\n return parseHtmlTable(data);\n } else if (mimeType === 'text/html') {\n return parseHtmlText(data);\n }\n\n // Default data format is string, so split on new line,\n // and then enclose in an array (a row with one cell):\n return parseText(data);\n};\n\nconst htmlSafe = function (value) {\n if (typeof value !== 'string') return value;\n\n return value.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n};\n\nconst createTextString = function (selectedData, isNeat) {\n // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy.\n // If not isNeat we just return a simple string of concatenated values.\n if (!isNeat)\n return selectedData.map((row) => Object.values(row).join('')).join('');\n\n // If isNeat, we can create tab separated mutti-line text.\n return selectedData.map((row) => Object.values(row).join('\\t')).join('\\n');\n};\n\nconst createHTMLString = function (selectedData, isNeat) {\n if (!isNeat) return createTextString(selectedData, isNeat);\n\n // If isNeat, we can create a HTML table with the selected data.\n let htmlString = '<table>';\n htmlString += selectedData\n .map(\n (row) =>\n '<tr>' +\n Object.values(row)\n .map((value) => ['<td>', htmlSafe(value), '</td>'].join(''))\n .join('') +\n '</tr>',\n )\n .join('');\n htmlString += '</table>';\n\n return htmlString;\n};\n\nexport {\n createTextString,\n createHTMLString,\n isSupportedHtml,\n htmlSafe,\n parseData,\n parseHtmlTable,\n parseHtmlText,\n parseText,\n sanitizeElementData,\n};\n","/*jslint browser: true, unparam: true, todo: true, plusplus: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport isPrintableKeyEvent from 'is-printable-key-event';\nimport { isSupportedHtml, parseData } from './util';\n\nexport default function (self) {\n var wheeling;\n self.stopPropagation = function (e) {\n e.stopPropagation();\n };\n /**\n * Adds an event listener to the given event.\n * @memberof canvasDatagrid\n * @name addEventListener\n * @method\n * @param {string} ev The name of the event to subscribe to.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.addEventListener = function (ev, fn) {\n self.events[ev] = self.events[ev] || [];\n self.events[ev].unshift(fn);\n };\n /**\n * Removes the given listener function from the given event. Must be an actual reference to the function that was bound.\n * @memberof canvasDatagrid\n * @name removeEventListener\n * @method\n * @param {string} ev The name of the event to unsubscribe from.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.removeEventListener = function (ev, fn) {\n (self.events[ev] || []).forEach(function removeEachListener(sfn, idx) {\n if (fn === sfn) {\n self.events[ev].splice(idx, 1);\n }\n });\n };\n /**\n * Fires the given event, passing an event object to the event subscribers.\n * @memberof canvasDatagrid\n * @name dispatchEvent\n * @method\n * @param {number} ev The name of the event to dispatch.\n * @param {number} e The event object.\n */\n self.dispatchEvent = function (ev, e) {\n e = ev.type ? ev : e || {};\n ev = ev.type || ev;\n var defaultPrevented;\n function preventDefault() {\n defaultPrevented = true;\n }\n if (!self.events[ev]) {\n return;\n }\n self.events[ev].forEach(function dispatchEachEvent(fn) {\n e.ctx = self.ctx;\n e.preventDefault = preventDefault;\n fn.apply(self.intf, [e]);\n });\n return defaultPrevented;\n };\n self.getRatio = function () {\n return Math.min(\n self.attributes.maxPixelRatio,\n (window.devicePixelRatio || 1) /\n (self.ctx.webkitBackingStorePixelRatio ||\n self.ctx.mozBackingStorePixelRatio ||\n self.ctx.msBackingStorePixelRatio ||\n self.ctx.oBackingStorePixelRatio ||\n self.ctx.backingStorePixelRatio ||\n 1),\n );\n };\n /**\n * @returns {number} dataWidth\n */\n self.refreshScrollCacheX = function () {\n const s = self.getSchema();\n self.scrollCache.x = [];\n\n /** @type {number} it will be used in `reduceSchema` only */\n let frozenWidth = 0;\n\n const collapsedColumnGroups = self.getCollapsedColumnGroups();\n const isColumnCollapsed = (columnIndex) =>\n collapsedColumnGroups.findIndex(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n ) >= 0;\n\n const dataWidth =\n s.reduce(function reduceSchema(accumulator, column, columnIndex) {\n // intentional redefintion of column. This causes scrollCache to be in the correct order\n const schemaIndex = self.orders.columns[columnIndex];\n const columnWidth = self.getColumnWidth(schemaIndex);\n column = s[schemaIndex];\n if (!column.hidden && !isColumnCollapsed(columnIndex))\n accumulator += columnWidth;\n if (columnIndex < self.frozenColumn) {\n self.scrollCache.x[columnIndex] = accumulator;\n frozenWidth = accumulator;\n } else {\n self.scrollCache.x[columnIndex] = Math.max(\n frozenWidth + columnWidth,\n accumulator,\n );\n }\n return accumulator;\n }, 0) || 0;\n return dataWidth;\n };\n self.resize = function (drawAfterResize) {\n if (!self.canvas) {\n return;\n }\n var x,\n v = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-bar',\n },\n n = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-bar',\n },\n vb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-box',\n },\n nb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-box',\n },\n co = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n isCorner: true,\n isScrollBoxCorner: true,\n style: 'scroll-box-corner',\n },\n m = self.style.scrollBarBoxMargin * 2,\n b = self.style.scrollBarBorderWidth * 2,\n d = self.style.scrollBarBoxMargin * 0.5,\n sbw = self.style.scrollBarWidth + self.style.scrollBarBorderWidth * 2,\n ratio = self.getRatio(),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n cellBorder = self.style.cellBorderWidth * bm,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n dataHeight = 0,\n dataWidth = 0,\n dims,\n l = (self.viewData || []).length,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n topGroupAreaHeight = self.getColumnGroupAreaHeight(),\n leftGroupAreaWidth = self.getRowGroupAreaWidth(),\n ch = self.style.cellHeight;\n // sets actual DOM canvas element\n function checkScrollBoxVisibility() {\n self.scrollBox.horizontalBarVisible =\n (self.style.width !== 'auto' &&\n dataWidth > self.scrollBox.width &&\n self.style.overflowX !== 'hidden') ||\n self.style.overflowX === 'scroll';\n self.scrollBox.horizontalBoxVisible = dataWidth > self.scrollBox.width;\n self.scrollBox.verticalBarVisible =\n (self.style.height !== 'auto' &&\n dataHeight > self.scrollBox.height &&\n self.style.overflowY !== 'hidden') ||\n self.style.overflowY === 'scroll';\n self.scrollBox.verticalBoxVisible = dataHeight > self.scrollBox.height;\n }\n function setScrollBoxSize() {\n self.scrollBox.width =\n self.width - rowHeaderCellWidth - leftGroupAreaWidth;\n self.scrollBox.height =\n self.height - columnHeaderCellHeight - topGroupAreaHeight;\n }\n function setCanvasSize() {\n if (self.isChildGrid) {\n return;\n }\n dims = {\n // HACK +1 ? maybe it's a magic cell border? Required to line up properly in auto height mode.\n height:\n columnHeaderCellHeight +\n topGroupAreaHeight +\n dataHeight +\n cellBorder +\n 1,\n width: dataWidth + rowHeaderCellWidth + cellBorder + leftGroupAreaWidth,\n };\n ['width', 'height'].forEach(function (dim) {\n //TODO: support inherit\n if (\n ['auto', undefined].indexOf(self.style[dim]) !== -1 &&\n ['auto', undefined].indexOf(self.appliedInlineStyles[dim]) !== -1\n ) {\n self.parentNodeStyle[dim] = dims[dim] + 'px';\n } else if (\n ['auto', undefined].indexOf(self.style[dim]) == -1 &&\n ['auto', undefined].indexOf(self.appliedInlineStyles[dim]) == -1\n ) {\n self.parentNodeStyle[dim] = self.style[dim];\n if (self.isComponent) {\n self.canvas.style[dim] = self.style[dim];\n }\n }\n });\n }\n dataWidth = self.refreshScrollCacheX();\n self.scrollCache.y = [];\n for (x = 0; x < l; x += 1) {\n self.scrollCache.y[x] = dataHeight;\n dataHeight +=\n ((self.sizes.rows[x] || ch) + (self.sizes.trees[x] || 0)) * self.scale +\n // HACK? if an expanded tree row is frozen it is necessary to add the tree row's height a second time.\n (self.frozenRow > x ? self.sizes.trees[x] || 0 : 0);\n }\n if (l > 1) {\n self.scrollCache.y[x] = dataHeight;\n }\n if (self.attributes.showNewRow) {\n dataHeight += ch;\n }\n if (self.attributes.snapToRow) {\n dataHeight += self.style.cellHeight;\n }\n setCanvasSize();\n if (self.isChildGrid) {\n self.width = self.parentNode.offsetWidth;\n self.height = self.parentNode.offsetHeight;\n } else if (\n self.height !== self.canvas.offsetHeight ||\n self.width !== self.canvas.offsetWidth\n ) {\n self.height = self.canvas.offsetHeight;\n self.width = self.canvas.offsetWidth;\n self.canvasOffsetLeft = self.args.canvasOffsetLeft || 0;\n self.canvasOffsetTop = self.args.canvasOffsetTop || 0;\n }\n /// calculate scroll bar dimensions\n // non-controversial\n self.scrollBox.top =\n columnHeaderCellHeight + topGroupAreaHeight + columnHeaderCellBorder;\n self.scrollBox.left = rowHeaderCellWidth + leftGroupAreaWidth;\n // width and height of scroll box\n setScrollBoxSize();\n // is the data larger than the scroll box\n checkScrollBoxVisibility();\n // if the scroll box is visible, make room for it by expanding the size of the element\n // if the other dimension is set to auto\n if (self.scrollBox.horizontalBarVisible) {\n if (self.style.height === 'auto' && !self.isChildGrid) {\n self.height += sbw;\n }\n dataHeight += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n if (self.scrollBox.verticalBarVisible) {\n if (self.style.width === 'auto' && !self.isChildGrid) {\n self.width += sbw;\n }\n dataWidth += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n // set again after bar visibility checks\n setScrollBoxSize();\n self.scrollBox.scrollWidth = dataWidth - self.scrollBox.width;\n self.scrollBox.scrollHeight = dataHeight - self.scrollBox.height;\n if (self.frozenColumn > 0) {\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /\n dataWidth;\n } else {\n self.scrollBox.widthBoxRatio = self.scrollBox.width / dataWidth;\n }\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n // TODO: This heightBoxRatio number is terribly wrong.\n // They should be a result of the size of the grid/canvas?\n // it being off causes the scroll bar to \"slide\" under\n // the dragged mouse.\n // https://github.com/TonyGermaneri/canvas-datagrid/issues/97\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n topGroupAreaHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n // horizontal\n n.x += rowHeaderCellWidth;\n n.y += self.height - self.style.scrollBarWidth - d - topGroupAreaHeight;\n n.width =\n self.width -\n self.style.scrollBarWidth -\n rowHeaderCellWidth -\n leftGroupAreaWidth -\n d -\n m;\n n.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n // horizontal box\n nb.y = n.y + self.style.scrollBarBoxMargin;\n nb.width = self.scrollBox.scrollBoxWidth;\n nb.height = self.style.scrollBarBoxWidth;\n // vertical\n v.x +=\n self.width -\n leftGroupAreaWidth -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth -\n d;\n v.y += columnHeaderCellHeight + self.scrollCache.y[self.frozenRow];\n v.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n v.height =\n self.height -\n columnHeaderCellHeight -\n topGroupAreaHeight -\n self.style.scrollBarWidth -\n d -\n m;\n // vertical box\n vb.x = v.x + self.style.scrollBarBoxMargin;\n vb.y += self.scrollCache.y[self.frozenRow];\n vb.width = self.style.scrollBarBoxWidth;\n vb.height = self.scrollBox.scrollBoxHeight;\n // corner\n co.x = n.x + n.width + m;\n co.y = v.y + v.height + m;\n co.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n co.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n self.scrollBox.entities = {\n horizontalBar: n,\n horizontalBox: nb,\n verticalBar: v,\n verticalBox: vb,\n corner: co,\n };\n self.scrollBox.bar = {\n v: v,\n h: n,\n };\n self.scrollBox.box = {\n v: vb,\n h: nb,\n };\n /// calculate page and dom elements\n self.page = Math.max(\n 1,\n self.visibleRows.length - 3 - self.attributes.pageUpDownOverlap,\n );\n // set canvas drawing related items\n if (!self.isChildGrid) {\n const newWidth = self.width * ratio;\n const newHeight = self.height * ratio;\n // We need to check is settings size to canvas necessary,\n // because settings the canvas'size will cause the canvas and its state be cleared\n // even if the size is the same.\n // Notes: Please don't call `self.resize()` without a subsequent call to `self.draw()`\n if (self.canvas.width !== newWidth || self.canvas.height !== newHeight) {\n self.canvas.width = newWidth;\n self.canvas.height = newHeight;\n self.ctx.scale(ratio, ratio);\n }\n }\n // resize any open dom elements (input/textarea)\n self.resizeEditInput();\n self.scroll(true);\n if (drawAfterResize) {\n self.draw(true);\n }\n self.dispatchEvent('resize', {});\n return true;\n };\n self.scroll = function (dontDraw) {\n var s = self.getSchema(),\n l = (self.viewData || []).length,\n ch = self.style.cellHeight;\n // go too far in leaps, then get focused\n self.scrollIndexTop = Math.floor(\n l * (self.scrollBox.scrollTop / self.scrollBox.scrollHeight) - 100,\n );\n self.scrollIndexTop = Math.max(self.scrollIndexTop, 0);\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n // sometimes the grid is rendered but the height is zero\n if (self.scrollBox.scrollHeight === 0) {\n self.scrollIndexTop = 0;\n }\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = self.frozenColumn;\n self.scrollPixelLeft = 0;\n while (\n self.scrollPixelTop < self.scrollBox.scrollTop &&\n self.scrollIndexTop < self.viewData.length\n ) {\n // start on index +1 since index 0 was used in \"go too far\" section above\n self.scrollIndexTop += 1;\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n }\n while (\n self.scrollPixelLeft < self.scrollBox.scrollLeft + 1 &&\n self.scrollIndexLeft < s.length\n ) {\n self.scrollPixelLeft = self.scrollCache.x[self.scrollIndexLeft];\n self.scrollIndexLeft += 1;\n }\n if (s.length > 0) {\n self.scrollIndexLeft = Math.max(self.scrollIndexLeft - 1, 0);\n self.scrollPixelLeft -= self.getColumnWidth(\n self.orders.columns[self.scrollIndexLeft],\n );\n }\n if ((self.viewData || []).length > 0) {\n self.scrollIndexTop = Math.max(self.scrollIndexTop - 1, 0);\n self.scrollPixelTop = Math.max(\n self.scrollPixelTop -\n (self.viewData[self.scrollIndexTop]\n ? (self.sizes.rows[self.scrollIndexTop] || ch) +\n (self.sizes.trees[self.scrollIndexTop] || 0)\n : ch) *\n self.scale,\n 0,\n );\n }\n self.ellipsisCache = {};\n if (!dontDraw) {\n self.draw(true);\n }\n //TODO: figure out why this has to be delayed for child grids\n //BUG: wheeling event on 3rd level hierarchy fails to move input box\n requestAnimationFrame(self.resizeEditInput);\n self.dispatchEvent('scroll', {\n top: self.scrollBox.scrollTop,\n left: self.scrollBox.scrollLeft,\n });\n };\n self.mousemove = function (e, overridePos) {\n if (self.contextMenu || self.input) {\n return;\n }\n\n // Cancel dragging action if user ventures outside grid\n if (self.draggingItem && e.which === 0) {\n self.stopFreezeMove(e);\n self.mouseup(e);\n return;\n }\n\n self.mouse = overridePos || self.getLayerPos(e);\n var ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n i,\n s = self.getSchema(),\n dragBounds,\n sBounds,\n x = self.mouse.x,\n y = self.mouse.y,\n cell = self.getCellAt(x, y),\n delta,\n disallowVerticalAutoScroll = false,\n disallowHorizontalAutoScroll = false,\n ev = { NativeEvent: e, cell: cell, x: x, y: y },\n previousCell = self.currentCell;\n clearTimeout(self.scrollTimer);\n if (!self.isInGrid({ x: x, y: y })) {\n self.hasFocus = false;\n }\n if (self.dispatchEvent('mousemove', ev)) {\n return;\n }\n if (cell && self.currentCell) {\n self.rowBoundaryCrossed = self.currentCell.rowIndex !== cell.rowIndex;\n self.columnBoundaryCrossed =\n self.currentCell.columnIndex !== cell.columnIndex;\n self.cellBoundaryCrossed =\n self.rowBoundaryCrossed || self.columnBoundaryCrossed;\n ['row', 'column', 'cell'].forEach(function (prefix) {\n if (self[prefix + 'BoundaryCrossed']) {\n ev.cell = previousCell;\n self.dispatchEvent(prefix + 'mouseout', ev);\n ev.cell = cell;\n self.dispatchEvent(prefix + 'mouseover', ev);\n }\n });\n }\n self.currentCell = cell;\n\n if (\n !self.draggingItem && // It is not in dragging mode (avoid changing hovers frequent)\n cell &&\n (cell.context === 'cell' || cell.context === self.cursorGrab)\n ) {\n const indicator = self.getUnhideIndicator(self.mouse.x, self.mouse.y);\n if (indicator) {\n self.cursor = 'pointer';\n self.hovers = { unhideIndicator: indicator };\n self.draw();\n return;\n }\n }\n\n self.hovers = {};\n if (!self.draggingItem && cell) {\n self.dragItem = cell;\n self.dragMode = cell.dragContext;\n self.cursor = cell.context;\n if (cell.context === 'cell') {\n self.cursor = 'default';\n self.hovers = {\n rowIndex: cell.rowIndex,\n columnIndex: cell.columnIndex,\n onFilterButton: false,\n onCellTreeIcon: false,\n };\n if (\n cell.isFilterable &&\n x >\n cell.x +\n cell.width +\n self.canvasOffsetLeft -\n self.style.filterButtonWidth &&\n x < cell.x + cell.width + self.canvasOffsetLeft &&\n y >\n cell.y +\n cell.height +\n self.canvasOffsetTop -\n self.style.filterButtonHeight &&\n y < cell.y + cell.height + self.canvasOffsetTop\n ) {\n self.hovers.onFilterButton = true;\n self.draw();\n }\n if (cell.isRowTree || cell.isColumnTree) {\n const pc = cell.isRowTree\n ? self.cellTree.rows[cell.rowIndex].parentCount\n : 0;\n const rc = self.style.cellTreeIconWidth * self.scale,\n rx =\n cell.x +\n cell.paddingLeft +\n self.canvasOffsetLeft +\n self.style.cellTreeIconMarginLeft +\n pc * (rc + cell.paddingLeft),\n ry =\n cell.y +\n self.canvasOffsetTop +\n self.style.cellTreeIconMarginTop * self.scale;\n if (x >= rx && x <= rx + rc && y >= ry && y < ry + rc) {\n self.hovers.onCellTreeIcon = true;\n self.draw();\n }\n }\n }\n if (self.selecting || self.reorderObject) {\n delta = {\n x: Math.abs(self.dragStart.x - x),\n y: Math.abs(self.dragStart.y - y),\n };\n if (self.dragStartObject.columnIndex !== -1 && e.shiftKey) {\n self.dragStartObject = {\n rowIndex: self.activeCell.rowIndex,\n columnIndex: self.activeCell.columnIndex,\n };\n }\n dragBounds = {\n top: Math.min(self.dragStartObject.rowIndex, cell.rowIndex),\n left: Math.min(self.dragStartObject.columnIndex, cell.columnIndex),\n bottom: Math.max(self.dragStartObject.rowIndex, cell.rowIndex),\n right: Math.max(self.dragStartObject.columnIndex, cell.columnIndex),\n };\n if (self.dragStartObject.columnIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left = -1;\n dragBounds.right = s.length - 1;\n dragBounds.top = Math.min(sBounds.top, cell.rowIndex);\n dragBounds.bottom = Math.max(sBounds.bottom, cell.rowIndex);\n if (dragBounds.top < 0) dragBounds.top = 0;\n }\n\n if (self.dragStartObject.rowIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left =\n cell.columnIndex === undefined\n ? sBounds.left\n : Math.min(sBounds.left, cell.columnIndex);\n dragBounds.right =\n cell.columnIndex === undefined\n ? sBounds.right\n : Math.max(sBounds.right, cell.columnIndex);\n dragBounds.top = -1;\n dragBounds.bottom = self.viewData.length - 1;\n if (dragBounds.left < 0) dragBounds.left = 0;\n if (dragBounds.left != dragBounds.right)\n self.isMultiColumnsSelected = true;\n else self.isMultiRowsSelected = false;\n }\n\n if (\n self.dragStartObject.rowIndex !== cell.rowIndex ||\n self.dragStartObject.columnIndex !== cell.columnIndex\n ) {\n self.ignoreNextClick = true;\n }\n if (\n self.cellBoundaryCrossed ||\n (delta.x === 0 && delta.y === 0) ||\n self.attributes.selectionMode === 'row'\n ) {\n if (\n cell.rowIndex !== undefined &&\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.rowBoundaryCrossed\n ) {\n if (self.dragStartObject.rowIndex < cell.rowIndex) {\n dragBounds.top = self.dragStartObject.rowIndex;\n dragBounds.bottom = cell.rowIndex;\n } else {\n dragBounds.top = cell.rowIndex;\n dragBounds.bottom = self.dragStartObject.rowIndex;\n }\n } else if (\n cell.rowIndex !== undefined &&\n (self.attributes.selectionMode === 'column' ||\n self.dragStartObject.rowIndex === -1) &&\n self.columnBoundaryCrossed\n ) {\n if (self.dragStartObject.columnIndex < cell.columnIndex) {\n dragBounds.left = self.dragStartObject.columnIndex;\n dragBounds.right = cell.columnIndex;\n } else {\n dragBounds.left = cell.columnIndex;\n dragBounds.right = self.dragStartObject.columnIndex;\n }\n } else if (self.attributes.selectionMode !== 'row') {\n if (cell.hovered && self.hovers.onFilterButton) {\n if (cell.openedFilter) {\n cell.openedFilter = false;\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n } else {\n self.selectedFilterButton.rowIndex = cell.rowIndex;\n self.selectedFilterButton.columnIndex = cell.columnIndex;\n self.contextmenuEvent(e, {\n x: cell.x + cell.width - self.style.filterButtonWidth,\n y: cell.y + cell.height,\n rect: { left: 0, top: 0 },\n });\n }\n self.draw();\n return;\n } else if (\n cell.hovered &&\n self.hovers.onCellTreeIcon &&\n e.type == 'mousedown'\n ) {\n self.toggleCollapseTree(cell.rowIndex, cell.columnIndex);\n return;\n } else {\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n if (self.hovers.onFilterButton) return;\n if (self.hovers.onCellTreeIcon) return;\n if (!self.dragAddToSelection && cell.rowIndex !== undefined) {\n if (\n self.selections[cell.rowIndex] &&\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) !==\n -1\n ) {\n self.selections[cell.rowIndex].splice(\n self.selections[cell.rowIndex].indexOf(cell.columnIndex),\n 1,\n );\n }\n } else {\n self.selections[cell.rowIndex] =\n self.selections[cell.rowIndex] || [];\n if (\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) ===\n -1\n ) {\n self.selections[cell.rowIndex].push(cell.columnIndex);\n var event = {\n selections: self.selections,\n selectedData: self.getSelectedData(),\n selectedCells: self.getSelectedCells(),\n selectionBounds: self.getSelectionBounds(),\n };\n self.dispatchEvent('selectionchanged', event);\n }\n }\n }\n }\n }\n if (\n (!self.selectionBounds ||\n dragBounds.top !== self.selectionBounds.top ||\n dragBounds.left !== self.selectionBounds.left ||\n dragBounds.bottom !== self.selectionBounds.bottom ||\n dragBounds.right !== self.selectionBounds.right) &&\n !ctrl\n ) {\n if (!(cell.hovered && self.hovers.onFilterButton)) {\n self.selections = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n }\n if (dragBounds.top === -1) {\n dragBounds.top = 0;\n }\n sBounds = dragBounds;\n if (self.attributes.selectionMode === 'row') {\n for (i = sBounds.top; i <= sBounds.bottom; i += 1) {\n self.selectRow(i, true, null, true);\n }\n } else {\n self.selectArea(sBounds, true);\n self.activeCell.rowIndex = sBounds.top;\n self.activeCell.columnIndex = sBounds.left;\n if (sBounds.left == -1 && sBounds.top !== sBounds.bottom) {\n self.activeCell.columnIndex = 0;\n self.isMultiRowsSelected = true;\n self.isMultiColumnsSelected = false;\n }\n }\n }\n } else if (self.movingSelectionHandle) {\n delta = {\n x: Math.abs(self.dragStart.x - x),\n y: Math.abs(self.dragStart.y - y),\n };\n\n // Disallow auto-scroll to the direction that overlay is not\n // moving towards.\n if (self.fillOverlay.direction === 'y') {\n disallowHorizontalAutoScroll = true;\n } else if (self.fillOverlay.direction === 'x') {\n disallowVerticalAutoScroll = true;\n }\n }\n\n if (delta) {\n if (\n self.attributes.autoScrollOnMousemove ||\n disallowVerticalAutoScroll ||\n disallowHorizontalAutoScroll\n ) {\n var movedVertically =\n !disallowVerticalAutoScroll &&\n delta.y > self.attributes.autoScrollMargin;\n var movedHorizontally =\n !disallowHorizontalAutoScroll &&\n delta.x > self.attributes.autoScrollMargin;\n\n if (movedVertically && !movedHorizontally)\n self.autoScrollZone(e, -1, y, ctrl);\n else if (movedHorizontally && !movedVertically)\n self.autoScrollZone(e, x, -1, ctrl);\n else if (movedHorizontally && movedVertically)\n self.autoScrollZone(e, x, y, ctrl);\n } else {\n self.autoScrollZone(e, x, y, ctrl);\n }\n }\n }\n const columnGroup = self.getColumnGroupAt(self.mouse.x, self.mouse.y);\n if (columnGroup) self.cursor = 'pointer';\n\n const rowGroup = self.getRowGroupAt(self.mouse.x, self.mouse.y);\n if (rowGroup) self.cursor = 'pointer';\n\n self.cellBoundaryCrossed = false;\n self.rowBoundaryCrossed = false;\n self.columnBoundaryCrossed = false;\n self.draw(true);\n };\n self.click = function (e, overridePos) {\n var i,\n startingBounds = JSON.stringify(self.getSelectionBounds()),\n ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n pos = overridePos || self.getLayerPos(e);\n self.currentCell = self.getCellAt(pos.x, pos.y);\n if (self.currentCell.grid !== undefined) {\n return;\n }\n function checkSelectionChange() {\n var ev,\n sb = self.getSelectionBounds();\n\n if (startingBounds === JSON.stringify(sb)) {\n return;\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n }\n if (self.input) {\n self.endEdit();\n }\n if (self.ignoreNextClick) {\n self.ignoreNextClick = false;\n return;\n }\n i = self.currentCell;\n if (\n self.dispatchEvent('click', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n\n const unhideIndicator = self.getUnhideIndicator(pos.x, pos.y);\n if (unhideIndicator) {\n const { dir, orderIndex0, orderIndex1 } = unhideIndicator;\n if (dir === 'l' || dir === 'r')\n self.unhideColumns(orderIndex0, orderIndex1);\n else self.unhideRows(orderIndex0, orderIndex1);\n return;\n }\n\n let group = self.getColumnGroupAt(pos.x, pos.y);\n if (!group) group = self.getRowGroupAt(pos.x, pos.y);\n if (group) {\n if (self.toggleGroup(group)) {\n self.setStorageData();\n self.refresh();\n return;\n }\n }\n\n if (!self.hasFocus) {\n return;\n }\n\n const leftOffset = self.getRowGroupAreaWidth();\n const topOffset = self.getColumnGroupAreaHeight();\n const xInGrid = pos.x - leftOffset;\n const yInGrid = pos.y - topOffset;\n if (\n ['rowHeaderCell', 'columnHeaderCell'].indexOf(self.currentCell.style) ===\n -1 &&\n !ctrl\n ) {\n if (!self.hovers.onFilterButton) {\n self.setActiveCell(i.columnIndex, i.rowIndex);\n }\n }\n if (self.currentCell.context === 'cell') {\n if (self.currentCell.style === 'cornerCell') {\n self.selectAll();\n self.draw();\n checkSelectionChange();\n return;\n }\n if (self.currentCell.style === 'columnHeaderCell') {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === i.header.name) {\n self.orderDirection =\n self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(i.header.name, self.orderDirection);\n checkSelectionChange();\n return;\n }\n }\n self.selections[i.rowIndex] = self.selections[i.rowIndex] || [];\n if (\n self.attributes.selectionMode === 'row' ||\n self.currentCell.style === 'rowHeaderCell'\n ) {\n if (\n self.currentCell.style === 'rowHeaderCell' &&\n self.attributes.tree &&\n xInGrid > 0 &&\n xInGrid - self.currentCell.x <\n self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight +\n self.style.treeArrowClickRadius &&\n yInGrid - self.currentCell.y <\n self.style.treeArrowHeight +\n self.style.treeArrowMarginTop +\n self.style.treeArrowClickRadius &&\n yInGrid > 0\n ) {\n self.toggleTree(i.rowIndex);\n return;\n }\n }\n if (e.shiftKey && !ctrl) {\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, false);\n }\n }\n checkSelectionChange();\n self.draw(true);\n };\n self.dragResizeColumn = function (e) {\n var pos, x, y;\n pos = self.getLayerPos(e);\n x = self.resizingStartingWidth + pos.x - self.dragStart.x;\n y = self.resizingStartingHeight + pos.y - self.dragStart.y;\n if (x < self.style.minColumnWidth) {\n x = self.style.minColumnWidth;\n }\n if (y < self.style.minRowHeight) {\n y = self.style.minRowHeight;\n }\n if (\n self.dispatchEvent('resizecolumn', {\n x: x,\n y: y,\n draggingItem: self.draggingItem,\n })\n ) {\n return false;\n }\n if (\n self.scrollBox.scrollLeft >\n self.scrollBox.scrollWidth - self.attributes.resizeScrollZone &&\n self.dragMode === 'ew-resize'\n ) {\n self.resize(true);\n }\n if (self.dragMode === 'ew-resize') {\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] = x;\n if (\n ['rowHeaderCell', 'cornerCell'].indexOf(\n self.draggingItem.header.style,\n ) !== -1\n ) {\n self.resize(true);\n }\n self.resizeChildGrids();\n return;\n }\n if (self.dragMode === 'ns-resize') {\n if (self.draggingItem.rowOpen) {\n self.sizes.trees[self.draggingItem.rowIndex] = y;\n } else if (self.attributes.globalRowResize) {\n self.style.cellHeight = y;\n } else {\n self.sizes.rows[self.draggingItem.rowIndex] = y;\n }\n self.dispatchEvent('resizerow', { row: y });\n self.resizeChildGrids();\n return;\n }\n self.ellipsisCache = {};\n };\n self.stopDragResize = function (event) {\n const pos = self.getLayerPos(event);\n\n if (self.dragMode === 'ew-resize') {\n const hasMoved = !!(pos.x - self.dragStart.x);\n // Check that dragItem is selected or part of selection.\n const dragItemIsSelected = self.isColumnSelected(\n self.dragItem.columnIndex,\n );\n\n if (hasMoved && dragItemIsSelected) {\n const width = Math.max(\n self.resizingStartingWidth + pos.x - self.dragStart.x,\n self.style.minColumnWidth,\n );\n // If the column is selected, resize it to width plus any other selected columns.\n self.fitSelectedColumns(width);\n }\n }\n\n self.resize();\n window.removeEventListener('mousemove', self.dragResizeColumn, false);\n window.removeEventListener('mouseup', self.stopDragResize, false);\n self.setStorageData();\n self.draw(true);\n self.ignoreNextClick = true;\n };\n self.scrollGrid = function (e) {\n var pos = self.getLayerPos(e);\n if (\n self.attributes.scrollPointerLock &&\n self.pointerLockPosition &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition.x += e.movementX;\n self.pointerLockPosition.y += e.movementY;\n self.pointerLockPosition.x = Math.min(\n self.width - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.x),\n );\n self.pointerLockPosition.y = Math.min(\n self.height - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.y),\n );\n pos = self.pointerLockPosition;\n }\n self.scrollMode = self.getCellAt(pos.x, pos.y).context;\n if (\n self.scrollMode === 'horizontal-scroll-box' &&\n self.scrollStartMode !== 'horizontal-scroll-box'\n ) {\n self.scrollStartMode = 'horizontal-scroll-box';\n self.dragStart = pos;\n self.scrollStart.left = self.scrollBox.scrollLeft;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollMode === 'vertical-scroll-box' &&\n self.scrollStartMode !== 'vertical-scroll-box'\n ) {\n self.scrollStartMode = 'vertical-scroll-box';\n self.dragStart = pos;\n self.scrollStart.top = self.scrollBox.scrollTop;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollStartMode === 'vertical-scroll-box' &&\n self.scrollMode !== 'vertical-scroll-box'\n ) {\n self.scrollMode = 'vertical-scroll-box';\n }\n if (\n self.scrollStartMode === 'horizontal-scroll-box' &&\n self.scrollMode !== 'horizontal-scroll-box'\n ) {\n self.scrollMode = 'horizontal-scroll-box';\n }\n clearTimeout(self.scrollTimer);\n if (self.scrollModes.indexOf(self.scrollMode) === -1) {\n return;\n }\n if (self.scrollMode === 'vertical-scroll-box') {\n self.scrollBox.scrollTop =\n self.scrollStart.top +\n (pos.y - self.dragStart.y) / self.scrollBox.heightBoxRatio;\n } else if (self.scrollMode === 'vertical-scroll-top') {\n self.scrollBox.scrollTop -= self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'vertical-scroll-bottom') {\n self.scrollBox.scrollTop += self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n if (self.scrollMode === 'horizontal-scroll-box') {\n self.scrollBox.scrollLeft =\n self.scrollStart.left +\n (pos.x - self.dragStart.x) / self.scrollBox.widthBoxRatio;\n } else if (self.scrollMode === 'horizontal-scroll-right') {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'horizontal-scroll-left') {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.stopScrollGrid = function () {\n clearTimeout(self.scrollTimer);\n if (document.exitPointerLock) {\n document.exitPointerLock();\n }\n window.removeEventListener('mousemove', self.scrollGrid, false);\n };\n self.dragReorder = function (e) {\n var pos,\n x,\n y,\n columReorder = self.dragMode === 'column-reorder',\n rowReorder = self.dragMode === 'row-reorder';\n pos = self.getLayerPos(e);\n x = pos.x - self.dragStart.x;\n y = pos.y - self.dragStart.y;\n if (!self.attributes.allowColumnReordering && columReorder) {\n return;\n }\n if (!self.attributes.allowRowReordering && rowReorder) {\n return;\n }\n if ((e.ctrlKey || e.metaKey || e.shiftKey) && self.reorderObject) {\n if (self.dragMode === 'column-reorder' && !self.isMultiColumnsSelected) {\n self.selectColumn(self.draggingItem.header.index, false, false);\n }\n }\n if (\n self.dispatchEvent('reordering', {\n NativeEvent: e,\n source: self.dragStartObject,\n target: self.currentCell,\n dragMode: self.dragMode,\n })\n ) {\n return;\n }\n if (\n Math.abs(x) > self.attributes.reorderDeadZone ||\n Math.abs(y) > self.attributes.reorderDeadZone\n ) {\n self.reorderObject = self.draggingItem;\n if (self.isMultiRowsSelected)\n self.reorderObject = self.getVisibleCellByIndex(\n -1,\n self.activeCell.rowIndex,\n );\n if (self.isMultiColumnsSelected)\n self.reorderObject = self.getVisibleCellByIndex(\n self.activeCell.columnIndex,\n -1,\n );\n if (!self.reorderObject) return;\n self.reorderTarget = self.currentCell;\n self.reorderObject.dragOffset = {\n x: x,\n y: y,\n };\n self.autoScrollZone(\n e,\n columReorder ? pos.x : -1,\n rowReorder ? pos.y : -1,\n false,\n );\n }\n };\n self.stopDragReorder = function (e) {\n var oIndex,\n tIndex,\n odata = [],\n cr = {\n 'row-reorder': self.orders.rows,\n 'column-reorder': self.orders.columns,\n },\n i = {\n 'row-reorder': 'rowIndex',\n 'column-reorder': 'sortColumnIndex',\n }[self.dragMode];\n window.removeEventListener('mousemove', self.dragReorder, false);\n window.removeEventListener('mouseup', self.stopDragReorder, false);\n if (\n self.reorderObject &&\n self.reorderTarget &&\n ((self.dragMode === 'column-reorder' &&\n self.reorderTarget.sortColumnIndex > -1 &&\n self.reorderTarget.sortColumnIndex < self.getSchema().length) ||\n (self.dragMode === 'row-reorder' &&\n self.reorderTarget.rowIndex > -1 &&\n self.reorderTarget.rowIndex < self.viewData.length)) &&\n self.reorderObject[i] !== self.reorderTarget[i] &&\n !self.dispatchEvent('reorder', {\n NativeEvent: e,\n source: self.reorderObject,\n target: self.reorderTarget,\n dragMode: self.dragMode,\n })\n ) {\n self.ignoreNextClick = true;\n oIndex = cr[self.dragMode].indexOf(self.reorderObject[i]);\n tIndex = cr[self.dragMode].indexOf(self.reorderTarget[i]);\n if (self.dragMode === 'column-reorder') {\n var sortColumnIndices = [];\n var selectedColumnIndices = [];\n if (self.selections[0]) {\n oIndex = self.selections[0][0];\n self.selections[0].forEach(function (value) {\n sortColumnIndices.push(self.orders.columns[value]);\n });\n }\n var deleteCount = sortColumnIndices.length;\n if (\n tIndex < oIndex ||\n (tIndex > oIndex && Math.abs(tIndex - oIndex) >= deleteCount)\n ) {\n cr[self.dragMode].splice(oIndex, deleteCount);\n if (tIndex > oIndex) tIndex = tIndex - (deleteCount - 1);\n\n self.selectedColumns = [];\n for (var i = 0; i < sortColumnIndices.length; i++) {\n if (i === 0) self.activeCell.columnIndex = tIndex;\n selectedColumnIndices.push(tIndex + i);\n self.selectedColumns.push(sortColumnIndices[i]);\n cr[self.dragMode].splice(tIndex + i, 0, sortColumnIndices[i]);\n }\n\n self.orders.columns = cr[self.dragMode];\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = selectedColumnIndices;\n });\n }\n } else {\n var selectedRows = [];\n self.selections.forEach(function (row, rowIndex) {\n if (row) {\n selectedRows.push(row);\n odata.push(self.viewData[rowIndex]);\n }\n });\n if (\n tIndex < oIndex ||\n (tIndex > oIndex && Math.abs(tIndex - oIndex) >= odata.length)\n ) {\n self.viewData.splice(oIndex, odata.length);\n self.selections = [];\n self.selectedRows = [];\n if (tIndex > oIndex) tIndex = tIndex - (odata.length - 1);\n self.activeCell.rowIndex = tIndex;\n\n for (var i = 0; i < odata.length; i++) {\n self.viewData.splice(tIndex + i, 0, odata[i]);\n self.selections[tIndex + i] = selectedRows[i];\n self.selectedRows.push(tIndex + i);\n }\n }\n }\n self.resize();\n self.setStorageData();\n }\n self.reorderObject = undefined;\n self.reorderTarget = undefined;\n self.draw(true);\n };\n self.dragMove = function (e) {\n if (\n self.dispatchEvent('moving', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n var pos = self.getLayerPos(e);\n self.moveOffset = {\n x: self.currentCell.columnIndex - self.dragStartObject.columnIndex,\n y: self.currentCell.rowIndex - self.dragStartObject.rowIndex,\n };\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopDragMove = function (e) {\n window.removeEventListener('mousemove', self.dragMove, false);\n window.removeEventListener('mouseup', self.stopDragMove, false);\n var b = self.getSelectionBounds();\n if (\n self.dispatchEvent('endmove', { NativeEvent: e, cell: self.currentCell })\n ) {\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n return;\n }\n if (self.moveOffset) {\n self.moveTo(\n self.movingSelection,\n b.left + self.moveOffset.x,\n b.top + self.moveOffset.y,\n );\n self.moveSelection(self.moveOffset.x, self.moveOffset.y);\n }\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n };\n self.freezeMove = function (e) {\n if (\n self.dispatchEvent('freezemoving', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n var pos = self.getLayerPos(e);\n\n self.ignoreNextClick = true;\n self.freezeMarkerPosition = pos;\n pos.x -= self.getRowGroupAreaWidth();\n pos.y -= self.getColumnGroupAreaHeight();\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopFreezeMove = function (e) {\n let pos = self.getLayerPos(e),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n pos.x -= self.getRowGroupAreaWidth();\n pos.y -= self.getColumnGroupAreaHeight();\n\n if (\n self.currentCell &&\n self.currentCell.rowIndex !== undefined &&\n self.dragMode === 'frozen-row-marker'\n ) {\n self.scrollBox.scrollTop = 0;\n self.frozenRow = self.currentCell.rowIndex + 1;\n self.scrollBox.bar.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n self.scrollBox.box.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n var dataHeight = self.scrollCache.y[self.scrollCache.y.length - 1];\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.v.height = self.scrollBox.scrollBoxHeight;\n }\n if (\n self.currentCell &&\n self.currentCell.columnIndex !== undefined &&\n self.dragMode === 'frozen-column-marker'\n ) {\n const dataWidth = self.refreshScrollCacheX();\n self.scrollBox.scrollLeft = 0;\n let x =\n self.currentCell.x -\n self.style.frozenMarkerWidth -\n self.style.frozenMarkerBorderWidth;\n if (pos.x > x + self.currentCell.width / 2)\n self.frozenColumn = self.currentCell.columnIndex + 1;\n else if (self.currentCell.columnIndex >= 0)\n self.frozenColumn = self.currentCell.columnIndex;\n self.scrollBox.bar.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn];\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn]) /\n dataWidth;\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.h.width = self.scrollBox.scrollBoxWidth;\n }\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n\n window.removeEventListener('mousemove', self.freezeMove, false);\n window.removeEventListener('mouseup', self.stopFreezeMove, false);\n self.freezeMarkerPosition = undefined;\n if (\n self.dispatchEvent('endfreezemove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n self.frozenRow = self.startFreezeMove.x;\n self.frozenColumn = self.startFreezeMove.y;\n self.draw(true);\n return;\n }\n self.draw(true);\n self.resize();\n };\n self.mousedown = function (e, overridePos) {\n self.lastMouseDownTarget = e.target;\n if (\n self.dispatchEvent('mousedown', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (e.button === 2 || self.input) {\n return;\n }\n var ctrl = e.ctrlKey || e.metaKey,\n move = /-move/.test(self.dragMode),\n freeze = /frozen-row-marker|frozen-column-marker/.test(self.dragMode),\n resize = /-resize/.test(self.dragMode),\n selectionHandleMove = /selection-handle-br/.test(self.dragMode);\n const onUnhideIndicator = self.hovers && self.hovers.unhideIndicator;\n self.dragStart = overridePos || self.getLayerPos(e);\n self.scrollStart = {\n left: self.scrollBox.scrollLeft,\n top: self.scrollBox.scrollTop,\n };\n self.dragStartObject = self.getCellAt(self.dragStart.x, self.dragStart.y);\n self.dragAddToSelection = !self.dragStartObject.selected;\n if (\n !ctrl &&\n !e.shiftKey &&\n !/(vertical|horizontal)-scroll-(bar|box)/.test(\n self.dragStartObject.context,\n ) &&\n self.currentCell &&\n !self.currentCell.isColumnHeader &&\n !move &&\n !freeze &&\n !resize &&\n !selectionHandleMove\n ) {\n if (\n !(self.dragMode == 'row-reorder' && self.isMultiRowsSelected) &&\n !(self.currentCell.hovered && self.hovers.onFilterButton)\n ) {\n self.selections = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n }\n }\n if (self.dragStartObject.isGrid) {\n return;\n }\n if (\n self.scrollModes.indexOf(self.dragStartObject.context) !== -1 &&\n !onUnhideIndicator\n ) {\n self.scrollMode = self.dragStartObject.context;\n self.scrollStartMode = self.dragStartObject.context;\n self.scrollGrid(e);\n if (\n self.attributes.scrollPointerLock &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition = {\n x: self.dragStart.x,\n y: self.dragStart.y,\n };\n self.canvas.requestPointerLock();\n }\n window.addEventListener('mousemove', self.scrollGrid, false);\n window.addEventListener('mouseup', self.stopScrollGrid, false);\n self.ignoreNextClick = true;\n return;\n }\n if (self.dragMode === 'cell') {\n self.selecting = true;\n if (\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.dragStartObject.rowIndex > -1\n ) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n } else if (\n (self.attributes.selectionMode === 'column' ||\n self.dragStartObject.rowIndex === -1) &&\n self.dragStartObject.columnIndex > -1\n ) {\n self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\n return;\n }\n if (self.attributes.selectionMode !== 'row') {\n self.mousemove(e);\n }\n return;\n }\n if (selectionHandleMove) {\n self.movingSelectionHandle = true;\n self.fillOverlay = {\n handle: {\n x: self.dragStartObject.x + self.dragStartObject.width / 2,\n y: self.dragStartObject.y + self.dragStartObject.height / 2,\n },\n snapTo: { x: -1, y: -1 },\n selection: self.getSelectionBounds(),\n };\n if (self.dispatchEvent('beginselectionhandlemove', { NativeEvent: e })) {\n return;\n }\n window.addEventListener('mousemove', self.selectionHandleMove, false);\n window.addEventListener('mouseup', self.stopSelectionHandleMove, false);\n return self.selectionHandleMove(e);\n }\n if (move) {\n self.draggingItem = self.dragItem;\n self.movingSelection = self.selections.concat([]);\n self.dragging = self.dragStartObject;\n if (\n self.dispatchEvent('beginmove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n window.addEventListener('mousemove', self.dragMove, false);\n window.addEventListener('mouseup', self.stopDragMove, false);\n return self.mousemove(e);\n }\n if (freeze) {\n self.draggingItem = self.dragItem;\n self.startFreezeMove = {\n x: self.frozenRow,\n y: self.frozenColumn,\n };\n if (self.dispatchEvent('beginfreezemove', { NativeEvent: e })) {\n return;\n }\n\n self.freezeMarkerPosition = self.getLayerPos(e);\n self.freezeMarkerPosition.isGrab = true;\n\n window.addEventListener('mousemove', self.freezeMove, false);\n window.addEventListener('mouseup', self.stopFreezeMove, false);\n return self.mousemove(e);\n }\n if (resize && !onUnhideIndicator) {\n self.draggingItem = self.dragItem;\n if (self.draggingItem.rowOpen) {\n self.resizingStartingHeight =\n self.sizes.trees[self.draggingItem.rowIndex];\n } else {\n self.resizingStartingHeight =\n self.sizes.rows[self.draggingItem.rowIndex] || self.style.cellHeight;\n }\n self.resizingStartingWidth =\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] || self.draggingItem.width;\n window.addEventListener('mousemove', self.dragResizeColumn, false);\n window.addEventListener('mouseup', self.stopDragResize, false);\n return;\n }\n if (['row-reorder', 'column-reorder'].indexOf(self.dragMode) !== -1) {\n self.draggingItem = self.dragStartObject;\n if (self.dragMode === 'column-reorder' && !self.isMultiColumnsSelected) {\n self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\n } else if (self.dragMode === 'row-reorder' && !self.isMultiRowsSelected) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n }\n window.addEventListener('mousemove', self.dragReorder, false);\n window.addEventListener('mouseup', self.stopDragReorder, false);\n return;\n }\n };\n self.mouseup = function (e) {\n clearTimeout(self.scrollTimer);\n self.cellBoundaryCrossed = true;\n self.rowBoundaryCrossed = true;\n self.columnBoundaryCrossed = true;\n self.selecting = undefined;\n self.draggingItem = undefined;\n self.dragStartObject = undefined;\n if (\n self.dispatchEvent('mouseup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n if (self.currentCell && self.currentCell.grid !== undefined) {\n return;\n }\n if (self.contextMenu || self.input) {\n return;\n }\n if (self.dragStart && self.isInGrid(self.dragStart)) {\n self.controlInput.focus();\n }\n e.preventDefault();\n };\n // gets the horizontal adjacent cells as well as first/last based on column visibility\n self.getAdjacentCells = function () {\n var x,\n i,\n s = self.getSchema(),\n o = {};\n for (x = 0; x < s.length; x += 1) {\n i = self.orders.columns[x];\n if (!s[i].hidden) {\n if (o.first === undefined) {\n o.first = x;\n o.left = x;\n }\n o.last = x;\n if (x > self.activeCell.columnIndex && o.right === undefined) {\n o.right = x;\n }\n if (x < self.activeCell.columnIndex) {\n o.left = x;\n }\n }\n }\n if (o.right === undefined) {\n o.right = o.last;\n }\n return o;\n };\n self.keydown = function (e) {\n var i,\n ev,\n adjacentCells = self.getAdjacentCells(),\n x = Math.max(self.activeCell.columnIndex, 0),\n y = Math.max(self.activeCell.rowIndex, 0),\n ctrl = e.ctrlKey || e.metaKey,\n last = self.viewData.length - 1,\n s = self.getSchema(),\n cols = s.length - 1;\n\n var defaultPrevented = self.dispatchEvent('keydown', {\n NativeEvent: e,\n cell: self.currentCell,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n if (!self.attributes.keepFocusOnMouseOut && !self.hasFocus) {\n return;\n }\n\n // If a user starts typing content, switch to \"Enter\" mode\n if (isPrintableKeyEvent(e) && !ctrl) {\n return self.beginEditAt(x, y, e, true);\n }\n\n if (self.attributes.showNewRow) {\n last += 1;\n }\n\n if (e.key === 'Tab') {\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.selectNone();\n } else if (ctrl && e.key === 'a') {\n self.selectAll();\n } else if (['Backspace', 'Delete'].includes(e.key)) {\n self.deleteSelectedData();\n } else if (e.key === 'ArrowDown') {\n y += 1;\n } else if (e.key === 'ArrowUp') {\n y -= 1;\n } else if (\n (e.key === 'ArrowLeft' && !ctrl) ||\n (e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.left;\n } else if (\n (e.key === 'ArrowRight' && !ctrl) ||\n (!e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.right;\n } else if (e.key === 'PageUp') {\n y -= self.page;\n e.preventDefault();\n } else if (e.key === 'PageDown') {\n y += self.page;\n e.preventDefault();\n } else if (e.key === 'Home' || (ctrl && e.key === 'ArrowUp')) {\n y = 0;\n } else if (e.key === 'End' || (ctrl && e.key === 'ArrowDown')) {\n y = self.viewData.length - 1;\n } else if (ctrl && e.key === 'ArrowRight') {\n x = adjacentCells.last;\n } else if (ctrl && e.key === 'ArrowLeft') {\n x = adjacentCells.first;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n return self.beginEditAt(x, y, e);\n }\n if (x < 0 || Number.isNaN(x)) {\n x = adjacentCells.first;\n }\n if (y > last) {\n y = last;\n }\n if (y < 0 || Number.isNaN(y)) {\n y = 0;\n }\n if (x > cols) {\n x = adjacentCells.last;\n }\n\n // TODO - most likely some column order related bugs in key based selection\n // Arrows\n var isArrowKey = [\n 'ArrowLeft',\n 'ArrowUp',\n 'ArrowRight',\n 'ArrowDown',\n ].includes(e.key);\n\n // Shrinking and expanding selection using shift and arrow keys\n if (e.shiftKey && isArrowKey) {\n const firstSelectedRowIndex = self.selections.findIndex((el) => !!el);\n const firstSelectedRow = self.selections[firstSelectedRowIndex];\n const firstSelectedColumnIndex = firstSelectedRow[0];\n const lastSelectedColumn = firstSelectedRow[firstSelectedRow.length - 1];\n const yAtTop = y === 0;\n const yAtBottom = y === last;\n const xAtLeft = x === 0;\n const xAtRight = x === cols;\n\n if (e.key === 'ArrowUp') {\n if (y + 1 > firstSelectedRowIndex && !yAtTop) {\n self.selections.pop();\n } else if (y < firstSelectedRowIndex) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (yAtTop && self.activeCell.rowIndex !== 0) {\n self.selections.pop();\n }\n }\n\n if (e.key === 'ArrowDown') {\n if (y > firstSelectedRowIndex && y === self.selections.length) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (y >= firstSelectedRowIndex && !yAtBottom) {\n delete self.selections[y - 1];\n } else if (yAtBottom && self.activeCell.rowIndex !== last) {\n delete self.selections[y - 1];\n }\n }\n\n for (const selection of self.selections) {\n if (e.key === 'ArrowRight' && selection) {\n if (x > lastSelectedColumn) {\n selection.push(x);\n } else if (x <= lastSelectedColumn && !xAtRight) {\n selection.shift();\n } else if (xAtRight && self.activeCell.columnIndex !== cols) {\n selection.shift();\n }\n }\n\n if (e.key === 'ArrowLeft' && selection) {\n if (x < firstSelectedColumnIndex) {\n selection.unshift(x);\n } else if (x >= firstSelectedColumnIndex && !xAtLeft) {\n selection.pop();\n } else if (xAtLeft && self.activeCell.columnIndex !== 0) {\n selection.pop();\n }\n }\n }\n\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, ctrl);\n\n self.draw(true);\n }\n\n if (x !== self.activeCell.columnIndex || y !== self.activeCell.rowIndex) {\n self.scrollIntoView(\n x !== self.activeCell.columnIndex ? x : undefined,\n y !== self.activeCell.rowIndex && !Number.isNaN(y) ? y : undefined,\n );\n\n self.setActiveCell(x, y);\n if (!e.shiftKey && self.attributes.selectionFollowsActiveCell) {\n if (!ctrl) {\n self.selections = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n }\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n ev = {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n }\n self.draw(true);\n }\n };\n self.keyup = function (e) {\n if (\n self.dispatchEvent('keyup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n };\n self.keypress = function (e) {\n if (!self.hasFocus) {\n return;\n }\n if (\n self.dispatchEvent('keypress', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n };\n self.dblclick = function (e) {\n if (\n self.dispatchEvent('dblclick', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'columnHeaderCell'\n ) {\n // Check that double-clicked cell is selected or part of selection.\n const currentCellIsSelected = self.isColumnSelected(\n self.currentCell.columnIndex,\n );\n\n if (currentCellIsSelected) {\n // There might be more\n self.fitSelectedColumns();\n } else {\n self.fitColumnToValues(self.currentCell.header.name);\n }\n } else if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'cornerCell'\n ) {\n self.autosize();\n } else if (\n ['cell', 'activeCell'].includes(self.currentCell.style) &&\n !self.hovers.onFilterButton &&\n !self.hovers.onCellTreeIcon\n ) {\n if (self.currentCell.isRowTree || self.currentCell.isColumnTree) {\n self.cellTreeExpandCollapse(\n self.currentCell.rowIndex,\n self.currentCell.columnIndex,\n );\n self.draw();\n } else {\n self.beginEditAt(\n self.currentCell.columnIndex,\n self.currentCell.rowIndex,\n );\n }\n }\n };\n self.scrollWheel = function (e) {\n var l,\n t,\n ev = e,\n deltaX = e.deltaX === undefined ? e.NativeEvent.deltaX : e.deltaX,\n deltaY = e.deltaY === undefined ? e.NativeEvent.deltaY : e.deltaY,\n deltaMode =\n e.deltaMode === undefined ? e.NativeEvent.deltaMode : e.deltaMode;\n var e = e.NativeEvent || e;\n if (wheeling) {\n ev.preventDefault(e);\n return;\n }\n if (self.dispatchEvent('wheel', { NativeEvent: e })) {\n return;\n }\n self.touchHaltAnimation = true;\n l = self.scrollBox.scrollLeft;\n t = self.scrollBox.scrollTop;\n if (self.hasFocus) {\n //BUG Issue 42: https://github.com/TonyGermaneri/canvas-datagrid/issues/42\n //https://stackoverflow.com/questions/20110224/what-is-the-height-of-a-line-in-a-wheel-event-deltamode-dom-delta-line\n if (deltaMode === 1) {\n // line mode = 17 pixels per line\n deltaY = deltaY * 17;\n }\n if (\n (self.scrollBox.scrollTop < self.scrollBox.scrollHeight &&\n deltaY > 0) ||\n (self.scrollBox.scrollLeft < self.scrollBox.scrollWidth &&\n deltaX > 0) ||\n (self.scrollBox.scrollTop > 0 && deltaY < 0) ||\n (self.scrollBox.scrollLeft > 0 && deltaX < 0)\n ) {\n ev.preventDefault(e);\n }\n wheeling = setTimeout(function () {\n wheeling = undefined;\n self.scrollBox.scrollTo(deltaX + l, deltaY + t);\n }, 1);\n }\n };\n self.pasteData = function (\n pasteValue,\n mimeType,\n startRowIndex,\n startColIndex,\n minRowsLength = 0,\n minColumnsLength = 0,\n ) {\n if (mimeType === 'text/html' && !isSupportedHtml(pasteValue)) {\n console.warn(\n 'Unrecognized HTML format. HTML must be a simple table, e.g.: <table><tr><td>data</td></tr></table>.',\n );\n console.warn(\n 'Data with the mime type text/html not in this format will not be imported as row data.',\n );\n\n return;\n }\n\n self.selectedRows = [];\n self.selectedColumns = [];\n\n const rows = parseData(pasteValue, mimeType);\n const columnsLength = rows[0].length;\n\n // selected cell. This mimics Excel's paste functionality, and works\n // as a poor-man's fill-down.\n if (\n rows.length === 1 &&\n columnsLength === 1 &&\n minRowsLength <= 1 &&\n minColumnsLength <= 1\n ) {\n var cellData = rows[0][0].value.map((item) => item.value).join();\n\n self.forEachSelectedCell(function (data, rowIndex, colName) {\n data[rowIndex][colName] = cellData;\n });\n } else {\n let direction = null;\n\n if (minRowsLength > rows.length && minColumnsLength > columnsLength) {\n direction = 'both';\n } else if (minRowsLength > rows.length) {\n direction = 'vertical';\n } else if (minColumnsLength > columnsLength) {\n direction = 'horizontal';\n }\n\n self.insert({\n rows: rows,\n startRowIndex: startRowIndex,\n startColumnIndex: startColIndex,\n minRowsLength: minRowsLength,\n minColumnsLength: minColumnsLength,\n reverseRows: false,\n reverseColumns: false,\n clearSelections: true,\n alwaysFilling: false,\n direction: direction,\n });\n }\n\n // selections is a sparse array, so we condense:\n var affectedCells = [];\n\n self.selections.forEach(function (row, rowIndex) {\n if (rowIndex === undefined) return;\n\n row.forEach(function (columnIndex) {\n affectedCells.push([\n rowIndex,\n columnIndex,\n self.getBoundRowIndexFromViewRowIndex(rowIndex),\n self.getBoundColumnIndexFromViewColumnIndex(columnIndex),\n ]);\n });\n });\n\n self.dispatchEvent('afterpaste', {\n cells: affectedCells,\n });\n\n return rows.length;\n };\n self.insert = function ({\n rows = [],\n startRowIndex = 0,\n startColumnIndex = 0,\n minRowsLength = 0,\n minColumnsLength = 0,\n reverseRows = false,\n reverseColumns = false,\n clearSelections = false,\n alwaysFilling = false,\n direction = 'both',\n }) {\n var schema = self.getSchema();\n const rowsLength = Math.max(rows.length, minRowsLength);\n const fillCellCallback = self.fillCellCallback;\n const selections = clearSelections ? [] : self.selections;\n const filledCells = [];\n\n for (\n let rowPosReal = 0, rowDataPos = 0;\n rowPosReal < rowsLength;\n rowPosReal++, rowDataPos++\n ) {\n if (rowDataPos >= rows.length) {\n rowDataPos = 0;\n }\n\n const fillingRow = rowPosReal >= rows.length;\n const rowPosition = reverseRows\n ? rowsLength - rowPosReal - 1\n : rowPosReal;\n // Rows may have been moved by user, so get the actual row index\n // (instead of the row index at which the row is rendered):\n var realRowIndex = self.orders.rows[startRowIndex + rowPosition];\n var cells = rows[rowDataPos];\n const cellsLength = Math.max(cells.length, minColumnsLength);\n\n var existingRowData = self.viewData[realRowIndex];\n var newRowData = Object.assign({}, existingRowData);\n const fillArgs = fillCellCallback\n ? {\n rows: rows,\n direction: direction,\n rowData: newRowData,\n existingRowData: existingRowData,\n rowIndex: realRowIndex,\n rowOffset: rowDataPos,\n cells: cells,\n reversed: direction === 'horizontal' ? reverseColumns : reverseRows,\n isFillingRow: fillingRow || alwaysFilling,\n fillingRowPosition: alwaysFilling\n ? rowPosReal\n : fillingRow\n ? rowPosReal - rows.length\n : -1,\n fillingRowLength: alwaysFilling\n ? rowsLength\n : fillingRow\n ? rowsLength - rows.length\n : -1,\n }\n : undefined;\n\n self.selectedRows.push(realRowIndex);\n\n if (selections[realRowIndex] === undefined) {\n selections[realRowIndex] = [];\n }\n\n for (\n var colPosReal = 0, cellDataPos = 0;\n colPosReal < cellsLength;\n colPosReal++, cellDataPos++\n ) {\n if (cellDataPos >= cells.length) {\n cellDataPos = 0;\n }\n\n const fillingColumn = colPosReal >= cells.length;\n const colPosition = reverseColumns\n ? cellsLength - colPosReal - 1\n : colPosReal;\n const columnIndex = startColumnIndex + colPosition;\n var column = schema[columnIndex];\n\n if (!column) {\n console.warn('Paste data exceeded grid bounds. Skipping.');\n continue;\n }\n\n var columnName = column.name;\n var cellData = cells[cellDataPos];\n if (cellData && cellData.value) {\n cellData = cellData.value.map((item) => item.value).join('');\n }\n\n const existingCellData = existingRowData[columnName];\n\n if (\n fillCellCallback &&\n (fillingColumn || fillingRow || alwaysFilling)\n ) {\n newRowData[columnName] = fillCellCallback({\n ...fillArgs,\n column: column,\n columnIndex: columnIndex,\n columnOffset: cellDataPos,\n newCellData: cellData,\n existingCellData: existingCellData,\n isFillingColumn: fillingColumn || alwaysFilling,\n fillingColumnPosition: alwaysFilling\n ? colPosReal\n : fillingColumn\n ? colPosReal - cells.length\n : -1,\n fillingColumnLength: alwaysFilling\n ? cellsLength\n : fillingColumn\n ? cellsLength - cells.length\n : -1,\n });\n } else {\n newRowData[columnName] =\n cellData === undefined || cellData === null\n ? existingCellData\n : cellData;\n }\n\n selections[realRowIndex].push(columnIndex);\n\n if (alwaysFilling || fillingRow || fillingColumn) {\n filledCells.push([\n realRowIndex,\n columnIndex,\n self.getBoundRowIndexFromViewRowIndex(realRowIndex),\n self.getBoundColumnIndexFromViewColumnIndex(columnIndex),\n ]);\n }\n\n if (self.selectedColumns.indexOf(columnIndex) === -1)\n self.selectedColumns.push(columnIndex);\n }\n\n self.originalData[self.boundRowIndexMap.get(realRowIndex)] = newRowData;\n // Update view date here to avoid a full refresh of `viewData`.\n // To stay in line with Excel and Google Sheet behaviour,\n // don't perform a full refresh (and filter/sort results)\n // as this would make any pasted values disappear and/or suddenly change position.\n self.viewData[realRowIndex] = newRowData;\n }\n\n self.selections = selections;\n\n if (filledCells.length > 0 || alwaysFilling) {\n self.dispatchEvent('afterfill', {\n filledCells: filledCells,\n });\n }\n };\n self.getNextVisibleColumnIndex = function (visibleColumnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === visibleColumnIndex) {\n return s[x + 1].columnIndex;\n }\n }\n return -1;\n };\n self.getVisibleColumnIndexOf = function (columnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === columnIndex) {\n return x;\n }\n }\n return -1;\n };\n self.getSelectionIndex = function () {\n for (\n let rowIndex = 0, len = self.selections.length;\n rowIndex < len;\n rowIndex++\n ) {\n const row = self.selections[rowIndex];\n if (row) {\n if (row[0] === undefined) break;\n\n return {\n row: rowIndex,\n column: row[0] < 0 ? row[1] : row[0],\n rowLength: len - rowIndex,\n columnLength: row.length - (row[0] < 0 ? 1 : 0),\n };\n }\n }\n\n return null;\n };\n self.paste = function (event) {\n if (!self.attributes.editable) {\n return;\n }\n\n var defaultPrevented = self.dispatchEvent('beforepaste', {\n NativeEvent: event,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n var clipboardItems = new Map(\n Array.from(event.clipboardData.items).map((item) => [item.type, item]),\n );\n\n // Supported MIME types, in order of preference:\n var supportedMimeTypes = ['text/html', 'text/csv', 'text/plain'];\n\n // The clipboard will often contain the same data in multiple formats,\n // which can be used depending on the context in which it's pasted. Here\n // we'll prefere more structured (HTML/CSV) over less structured, when\n // available, so we try to find those first:\n var pasteableItems = supportedMimeTypes\n .map((mimeType) => clipboardItems.get(mimeType))\n .filter((item) => !!item); // filter out not-found MIME types (= undefined)\n\n if (pasteableItems.length === 0) {\n console.warn(\n 'Cannot find supported clipboard data type. Supported types are:',\n supportedMimeTypes.join(', '),\n );\n return;\n }\n\n const selectionIndex = self.getSelectionIndex();\n if (!selectionIndex) return;\n\n var itemToPaste = pasteableItems[0];\n\n // itemToPaste is cleared once accessed (getData or getAsString),\n // so we need to store the type here, before reading its value:\n var pasteType = itemToPaste.type;\n\n itemToPaste.getAsString(function (pasteValue) {\n self.pasteData(\n pasteValue,\n pasteType,\n selectionIndex.row,\n selectionIndex.column,\n selectionIndex.rowLength,\n selectionIndex.columnLength,\n );\n\n self.draw();\n });\n };\n self.cut = function (event) {\n if (self.dispatchEvent('cut', { NativeEvent: event })) {\n return;\n }\n\n // Expecting instance of `ClipboardEvent` with `clipboardData` attribute\n if (!self.hasFocus || !event.clipboardData) {\n return;\n }\n\n self.copySelectedCellsToClipboard(event.clipboardData);\n\n const affectedCells = self.clearSelectedCells();\n\n self.dispatchEvent('aftercut', {\n cells: affectedCells,\n });\n\n requestAnimationFrame(() => self.draw());\n event.preventDefault();\n };\n self.copy = function (event) {\n if (self.dispatchEvent('copy', { NativeEvent: event })) {\n return;\n }\n\n // Expecting instance of `ClipboardEvent` with `clipboardData` attribute\n if (!self.hasFocus || !event.clipboardData) {\n return;\n }\n\n self.copySelectedCellsToClipboard(event.clipboardData);\n\n event.preventDefault();\n };\n self.selectionHandleMove = function (e) {\n if (!self.movingSelectionHandle) {\n return;\n }\n\n const clippingRect = self.getClippingRect(e);\n const rowIndex = self.currentCell.rowIndex;\n const columnIndex = self.currentCell.columnIndex;\n const isInSelectionBounds =\n rowIndex >= -1 &&\n columnIndex >= -1 &&\n self.fillOverlay.selection.left <= columnIndex &&\n self.fillOverlay.selection.right >= columnIndex &&\n self.fillOverlay.selection.top <= rowIndex &&\n self.fillOverlay.selection.bottom >= rowIndex;\n\n self.fillOverlay.minX = clippingRect.x;\n self.fillOverlay.minY = clippingRect.y;\n self.fillOverlay.x = Math.max(clippingRect.x, e.clientX);\n self.fillOverlay.y = Math.max(clippingRect.y, e.clientY);\n\n // If we are in the selection bounds, allow user to change directions.\n if (isInSelectionBounds) {\n self.fillOverlay.lastInBoundsLocation = {\n x: e.clientX,\n y: e.clientY,\n };\n } else if (\n self.fillOverlay.lastInBoundsLocation ||\n !self.fillOverlay.direction\n ) {\n const lastInBoundsLocation = self.fillOverlay.lastInBoundsLocation;\n self.fillOverlay.lastInBoundsLocation = undefined;\n\n const x = lastInBoundsLocation\n ? lastInBoundsLocation.x\n : self.fillOverlay.handle.x;\n const y = lastInBoundsLocation\n ? lastInBoundsLocation.y\n : self.fillOverlay.handle.y;\n const dx = Math.abs(e.clientX - x);\n const dy = Math.abs(e.clientY - y);\n\n if (dx > 5 || dy > 5) {\n self.fillOverlay.direction = dx > dy ? 'x' : 'y';\n }\n }\n\n if (rowIndex >= 0) {\n self.fillOverlay.rowIndex = rowIndex;\n }\n if (columnIndex >= 0) {\n self.fillOverlay.columnIndex = columnIndex;\n if (rowIndex === -1 && self.visibleRows.length) {\n self.fillOverlay.rowIndex = self.visibleRows[0];\n }\n }\n\n if (rowIndex >= -1 && columnIndex >= -1) {\n self.fillOverlay.snap = self.currentCell;\n } else {\n self.fillOverlay.snap = undefined;\n }\n };\n self.stopSelectionHandleMove = function (e) {\n if (!self.fillOverlay.handle) {\n return false;\n }\n\n self.ignoreNextClick = true;\n\n window.removeEventListener('mousemove', self.selectionHandleMove, false);\n window.removeEventListener('mouseup', self.stopSelectionHandleMove, false);\n\n const overlay = self.fillOverlay;\n const selectionIndex = self.getSelectionIndex();\n const bounds = overlay.selection;\n if (!selectionIndex) return;\n\n self.movingSelectionHandle = undefined;\n self.fillOverlay = {};\n\n if (overlay.rowIndex >= 0 && overlay.columnIndex >= 0) {\n const boundsOld = { ...bounds };\n const isVertical = overlay.direction === 'y';\n const isHorizontal = overlay.direction === 'x';\n\n let startRow,\n rowLength,\n startColumn,\n columnLength,\n reverseVertically = false,\n reverseHorizontally = false;\n\n if (isVertical) {\n if (overlay.rowIndex < bounds.top) {\n bounds.top = overlay.rowIndex;\n reverseVertically = true;\n } else if (overlay.rowIndex > bounds.bottom) {\n bounds.bottom = overlay.rowIndex;\n }\n\n startRow =\n bounds.top < boundsOld.top ? bounds.top : boundsOld.bottom + 1;\n rowLength =\n bounds.top < boundsOld.top\n ? boundsOld.top - bounds.top\n : bounds.bottom - boundsOld.bottom;\n startColumn = selectionIndex.column;\n columnLength = selectionIndex.columnLength;\n } else if (isHorizontal) {\n if (overlay.columnIndex < bounds.left) {\n bounds.left = overlay.columnIndex;\n reverseHorizontally = true;\n } else if (overlay.columnIndex > bounds.right) {\n bounds.right = overlay.columnIndex;\n }\n\n startColumn =\n bounds.left < boundsOld.left ? bounds.left : boundsOld.right + 1;\n columnLength =\n bounds.left < boundsOld.left\n ? boundsOld.left - bounds.left\n : bounds.right - boundsOld.right;\n startRow = selectionIndex.row;\n rowLength = selectionIndex.rowLength;\n }\n\n if (\n bounds.left <= bounds.right &&\n bounds.top <= bounds.bottom &&\n (bounds.left < boundsOld.left ||\n bounds.top < boundsOld.top ||\n bounds.right > boundsOld.right ||\n bounds.bottom > boundsOld.bottom)\n ) {\n const schema = self.getSchema();\n const rows = [];\n\n for (\n let rowIndex = 0;\n rowIndex < Math.min(rowLength, selectionIndex.rowLength);\n rowIndex++\n ) {\n const rowData = self.viewData[selectionIndex.row + rowIndex];\n\n rows[rowIndex] = [];\n\n for (\n let columnIndex = 0;\n columnIndex < Math.min(columnLength, selectionIndex.columnLength);\n columnIndex++\n ) {\n const column = schema[selectionIndex.column + columnIndex];\n if (!column) continue;\n\n const cellData = rowData[column.name];\n\n rows[rowIndex][columnIndex] = cellData;\n }\n }\n\n self.insert({\n rows: rows,\n startRowIndex: startRow,\n startColumnIndex: startColumn,\n minRowsLength: rowLength,\n minColumnsLength: columnLength,\n reverseRows: reverseVertically,\n reverseColumns: reverseHorizontally,\n clearSelections: false,\n alwaysFilling: true,\n direction: isHorizontal ? 'horizontal' : 'vertical',\n });\n\n self.draw();\n }\n }\n\n return true;\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true, plusplus: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n var touchTimerMs = 50,\n debounceTouchMove,\n touchMoving,\n touchScrollTimeout;\n self.scrollAnimation = {};\n self.touchDelta = {};\n self.touchAnimateTo = {};\n self.animationFrames = 0;\n self.getTouchPos = function (e, touchIndex) {\n var t = touchIndex ? e.touches[touchIndex] : e.touches[0],\n rect = self.canvas.getBoundingClientRect(),\n pos;\n if (!t) {\n return;\n }\n pos = {\n x: t.clientX - rect.left,\n y: t.clientY - rect.top,\n };\n if (self.isChildGrid) {\n pos.x -= self.canvasOffsetLeft;\n pos.y -= self.canvasOffsetTop;\n }\n return {\n x: pos.x,\n y: pos.y,\n rect: rect,\n };\n };\n // shamelessly stolen from from https://gist.github.com/gre/1650294\n self.easingFunctions = {\n linear: function (t) {\n return t;\n },\n easeInQuad: function (t) {\n return t * t;\n },\n easeOutQuad: function (t) {\n return t * (2 - t);\n },\n easeInOutQuad: function (t) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n },\n easeInCubic: function (t) {\n return t * t * t;\n },\n easeOutCubic: function (t) {\n return --t * t * t + 1;\n },\n easeInOutCubic: function (t) {\n return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n },\n easeInQuart: function (t) {\n return t * t * t * t;\n },\n easeOutQuart: function (t) {\n return 1 - --t * t * t * t;\n },\n easeInOutQuart: function (t) {\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;\n },\n easeInQuint: function (t) {\n return t * t * t * t * t;\n },\n easeOutQuint: function (t) {\n return 1 + --t * t * t * t * t;\n },\n easeInOutQuint: function (t) {\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;\n },\n };\n self.easing = function (t, b, c, d) {\n return (\n c * self.easingFunctions[self.attributes.touchEasingMethod](t / d) + b\n );\n };\n self.calculatePPSTimed = function () {\n self.xPPST = -(\n (self.touchDelta.x - self.touchSigmaTimed.x) /\n (self.touchDelta.t - self.touchSigmaTimed.t)\n );\n self.yPPST = -(\n (self.touchDelta.y - self.touchSigmaTimed.y) /\n (self.touchDelta.t - self.touchSigmaTimed.t)\n );\n self.touchSigmaTimed = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: performance.now(),\n };\n };\n self.calculatePPS = function () {\n self.xPPS = -(\n (self.touchDelta.x - self.touchSigma.x) /\n (self.touchDelta.t - self.touchSigma.t)\n );\n self.yPPS = -(\n (self.touchDelta.y - self.touchSigma.y) /\n (self.touchDelta.t - self.touchSigma.t)\n );\n self.touchSigma = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: performance.now(),\n };\n };\n self.touchEndAnimation = function () {\n if (!self.canvas || !self.scrollBox.scrollTo) {\n return requestAnimationFrame(self.touchEndAnimation);\n }\n var n = performance.now(),\n d = self.attributes.touchReleaseAnimationDurationMs,\n t;\n t = n - self.touchDelta.t;\n self.animationFrames += 1;\n self.scrollAnimation.x = self.easing(\n t,\n self.touchDelta.scrollLeft,\n self.touchAnimateTo.x,\n d,\n );\n self.scrollAnimation.y = self.easing(\n t,\n self.touchDelta.scrollTop,\n self.touchAnimateTo.y,\n d,\n );\n if (\n t > d ||\n (self.scrollAnimation.y === self.scrollBox.scrollTop &&\n self.scrollAnimation.x === self.scrollBox.scrollLeft) ||\n self.stopAnimation\n ) {\n return;\n }\n self.scrollBox.scrollTo(self.scrollAnimation.x, self.scrollAnimation.y);\n requestAnimationFrame(self.touchEndAnimation);\n };\n self.touchEditCell = function (cell) {\n self.beginEditAt(cell.columnIndex, cell.rowIndex);\n };\n self.touchstart = function (e) {\n if (e.changedTouches[0]) {\n self.touchStart = self.getTouchPos(e);\n self.startingCell = self.getCellAt(\n self.touchStart.x,\n self.touchStart.y,\n true,\n );\n }\n if (\n self.dispatchEvent('touchstart', {\n NativeEvent: e,\n cell: self.startingCell,\n })\n ) {\n return;\n }\n self.disposeContextMenu();\n clearInterval(self.calculatePPSTimer);\n clearTimeout(self.touchContextTimeout);\n self.touchStartEvent = e;\n self.stopAnimation = true;\n self.animationFrames = 0;\n self.stopPropagation(e);\n if (e.touches.length === 1 && e.changedTouches[0] && !self.zoomAltered) {\n self.touchLength = 1;\n self.touchStart = self.touchStart || self.touchStart1;\n self.touchScrollStart = {\n x: self.scrollBox.scrollLeft,\n y: self.scrollBox.scrollTop,\n t: performance.now(),\n };\n self.touchDelta = {\n x: 0,\n y: 0,\n scrollLeft: self.scrollBox.scrollLeft,\n scrollTop: self.scrollBox.scrollTop,\n t: self.touchScrollStart.t,\n };\n self.touchSigma = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: self.touchDelta.t,\n };\n self.touchSigmaTimed = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: self.touchDelta.t,\n };\n self.touchContextTimeout = setTimeout(function () {\n self.contextmenuEvent(e, self.touchStart);\n }, self.attributes.touchContextMenuTimeMs);\n self.calculatePPSTimer = setInterval(\n self.calculatePPSTimed,\n touchTimerMs,\n );\n if (\n self.startingCell &&\n (self.startingCell.isGrid ||\n ['tree', 'inherit'].indexOf(self.startingCell.context) !== -1)\n ) {\n self.hasFocus = false;\n return;\n }\n self.hasFocus = true;\n if (self.startingCell.isHeader) {\n if (self.startingCell.isRowHeader) {\n self.selectArea({\n top: self.startingCell.rowIndex,\n bottom: self.startingCell.rowIndex,\n left: 0,\n right: self.getVisibleSchema().length - 1,\n });\n self.draw(true);\n } else if (self.startingCell.isColumnHeader) {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === self.startingCell.header.name) {\n self.orderDirection =\n self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(self.startingCell.header.name, self.orderDirection);\n }\n if (self.attributes.columnHeaderClickBehavior === 'select') {\n self.selectArea({\n top: 0,\n bottom: self.viewData.length - 1,\n left: self.startingCell.columnIndex,\n right: self.startingCell.columnIndex,\n });\n self.draw(true);\n }\n }\n self.touchEndEvents(e);\n return;\n }\n }\n if (self.zoomAltered) {\n return;\n }\n document.body.addEventListener('touchmove', self.touchmove, {\n passive: false,\n });\n document.body.addEventListener('touchend', self.touchend, false);\n document.body.addEventListener('touchcancel', self.touchcancel, false);\n self.draw(true);\n };\n self.touchSelect = function (cell, handleType) {\n if (cell.rowIndex === undefined || cell.columnIndex === undefined) {\n return;\n }\n self.touchSelecting = true;\n var bounds = self.getSelectionBounds();\n if (\n handleType === 'selection-handle-bl' &&\n cell.rowIndex >= bounds.top &&\n cell.columnIndex <= bounds.right\n ) {\n bounds.bottom = cell.rowIndex;\n bounds.left = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-tl' &&\n cell.rowIndex <= bounds.bottom &&\n cell.columnIndex <= bounds.right\n ) {\n bounds.top = cell.rowIndex;\n bounds.left = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-tr' &&\n cell.rowIndex <= bounds.bottom &&\n cell.columnIndex >= bounds.left\n ) {\n bounds.top = cell.rowIndex;\n bounds.right = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-br' &&\n cell.rowIndex >= bounds.top &&\n cell.columnIndex >= bounds.left\n ) {\n bounds.bottom = cell.rowIndex;\n bounds.right = cell.columnIndex;\n }\n if (self.attributes.selectionMode === 'row' || cell.rowIndex === -1) {\n bounds.left = 0;\n bounds.right = self.getSchema().length - 1;\n } else {\n bounds.left = Math.max(0, bounds.left);\n }\n self.selectArea(bounds);\n self.draw(true);\n };\n function touchMove(e) {\n var ch, rw, rScrollZone, lScrollZone, bScrollZone, tScrollZone, sbw, t1, t2;\n if (self.dispatchEvent('beforetouchmove', { NativeEvent: e })) {\n return;\n }\n clearTimeout(touchScrollTimeout);\n if (e.changedTouches[0]) {\n self.touchPosition = self.getTouchPos(e);\n }\n if (e.changedTouches[1]) {\n self.touchPosition1 = self.getTouchPos(e, 1);\n }\n if (\n Math.abs(self.touchDelta.x) + Math.abs(self.touchDelta.y) >\n self.attributes.touchDeadZone\n ) {\n clearTimeout(self.touchContextTimeout);\n }\n if (e.touches.length === 2 && self.touchPosition && self.touchPosition1) {\n t1 = self.touchPosition.y;\n t2 = self.touchPosition1.y;\n if (!self.zoomDeltaStart) {\n self.zoomDeltaStart = Math.abs(t1 - t2);\n self.startScale = self.scale;\n }\n self.touchLength = 2;\n self.scaleDelta = self.zoomDeltaStart - Math.abs(t1 - t2);\n self.scale =\n self.startScale -\n self.scaleDelta * self.attributes.touchZoomSensitivity;\n self.scale = Math.min(\n Math.max(self.scale, self.attributes.touchZoomMin),\n self.attributes.touchZoomMax,\n );\n self.zoomAltered = true;\n self.resize(true);\n self.resizeChildGrids();\n return;\n }\n if (self.zoomAltered) {\n return;\n }\n self.touchLength = 1;\n self.touchPosition = self.touchPosition || self.touchPosition1;\n ch = self.getColumnHeaderCellHeight();\n rw = self.getRowHeaderCellWidth();\n rScrollZone =\n self.width - self.style.scrollBarWidth - self.touchPosition.x <\n self.attributes.selectionScrollZone;\n lScrollZone =\n self.touchPosition.x - rw < self.attributes.selectionScrollZone;\n bScrollZone =\n self.height - self.style.scrollBarWidth - self.touchPosition.y <\n self.attributes.selectionScrollZone;\n tScrollZone =\n self.touchPosition.y - ch < self.attributes.selectionScrollZone;\n sbw = self.style.scrollBarWidth;\n function touchScroll() {\n var x = self.scrollBox.scrollLeft,\n y = self.scrollBox.scrollTop;\n x += rScrollZone ? self.attributes.selectionScrollIncrement : 0;\n y += bScrollZone ? self.attributes.selectionScrollIncrement : 0;\n y -= tScrollZone ? self.attributes.selectionScrollIncrement : 0;\n x -= lScrollZone ? self.attributes.selectionScrollIncrement : 0;\n self.scrollBox.scrollTo(x, y);\n touchScrollTimeout = setTimeout(\n touchScroll,\n self.attributes.scrollRepeatRate,\n );\n }\n e.stopPropagation();\n self.touchDelta = {\n x: self.touchPosition.x - self.touchStart.x,\n y: self.touchPosition.y - self.touchStart.y,\n scrollLeft: self.scrollBox.scrollLeft,\n scrollTop: self.scrollBox.scrollTop,\n t: performance.now(),\n };\n self.currentCell = self.getCellAt(\n self.touchPosition.x,\n self.touchPosition.y,\n );\n self.dispatchEvent('touchmove', { NativeEvent: e, cell: self.currentCell });\n self.calculatePPS();\n self.touchDuration = performance.now() - self.touchScrollStart.t;\n self.stopAnimation = true;\n self.animationFrames = 0;\n if (\n self.touchSelecting &&\n (rScrollZone || lScrollZone || tScrollZone || bScrollZone)\n ) {\n touchScroll();\n }\n if (/vertical-scroll-/.test(self.startingCell.style)) {\n self.scrollBox.scrollTop =\n self.scrollBox.scrollHeight *\n ((self.touchPosition.y - ch - sbw) /\n (self.scrollBox.height - sbw - ch));\n return;\n }\n if (/horizontal-scroll-/.test(self.startingCell.style)) {\n self.scrollBox.scrollLeft =\n self.scrollBox.scrollWidth *\n ((self.touchPosition.x - rw - sbw) / (self.scrollBox.width - sbw - rw));\n return;\n }\n if (/selection-handle-/.test(self.startingCell.style)) {\n self.touchSelect(self.currentCell, self.startingCell.style);\n return;\n }\n self.scrollBox.scrollTo(\n self.touchScrollStart.x - self.touchDelta.x,\n self.touchScrollStart.y - self.touchDelta.y,\n );\n }\n self.touchmove = function (e) {\n if (touchMoving) {\n return;\n }\n requestAnimationFrame(function () {\n touchMoving = true;\n touchMove(e);\n touchMoving = false;\n });\n };\n self.touchEndEvents = function (e) {\n self.zoomDeltaStart = undefined;\n self.touchSelecting = false;\n clearInterval(self.touchScrollTimeout);\n clearInterval(self.touchContextTimeout);\n clearInterval(self.calculatePPSTimer);\n e.stopPropagation();\n document.body.removeEventListener('touchmove', self.touchmove, {\n passive: false,\n });\n document.body.removeEventListener('touchend', self.touchend, false);\n document.body.removeEventListener('touchcancel', self.touchcancel, false);\n };\n self.touchend = function (e) {\n if (\n self.dispatchEvent('touchend', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n self.zoomDeltaStart = undefined;\n if (e.changedTouches[0]) {\n self.touchPosition = undefined;\n }\n if (e.changedTouches[1]) {\n self.touchPosition1 = undefined;\n }\n if (self.zoomAltered) {\n if (e.touches.length === 0) {\n self.zoomAltered = false;\n }\n return;\n }\n var dz =\n Math.abs(self.touchDelta.x) + Math.abs(self.touchDelta.y) <\n self.attributes.touchDeadZone;\n if (isNaN(self.xPPS)) {\n self.xPPS = 0;\n }\n if (isNaN(self.yPPS)) {\n self.yPPS = 0;\n }\n if (isNaN(self.xPPST)) {\n self.xPPST = 0;\n }\n if (isNaN(self.yPPST)) {\n self.yPPST = 0;\n }\n self.touchAnimateTo.x =\n self.xPPS * self.attributes.touchReleaseAcceleration;\n self.touchAnimateTo.y =\n self.yPPS * self.attributes.touchReleaseAcceleration;\n self.calculatePPSTimed();\n if (\n !dz &&\n self.animationFrames === 0 &&\n (Math.abs(self.xPPST) > self.attributes.scrollAnimationPPSThreshold ||\n Math.abs(self.yPPST) > self.attributes.scrollAnimationPPSThreshold) &&\n !/-scroll-/.test(self.startingCell.style) &&\n !dz\n ) {\n self.stopAnimation = false;\n self.touchEndAnimation();\n }\n self.touchEndEvents(e);\n };\n self.touchcancel = function (e) {\n if (\n self.dispatchEvent('touchcancel', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n self.touchEndEvents(e);\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals HTMLElement: false, Reflect: false, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport { createHTMLString, createTextString } from './events/util';\n\nexport default function (self, ctor) {\n self.scale = 1;\n self.orders = {\n rows: [],\n columns: [],\n };\n self.appliedInlineStyles = {};\n self.cellGridAttributes = {};\n self.treeGridAttributes = {};\n self.visibleRowHeights = [];\n self.hasFocus = false;\n self.activeCell = {\n columnIndex: 0,\n rowIndex: 0,\n };\n self.innerHTML = '';\n self.storageName = 'canvasDataGrid';\n self.invalidSearchExpClass = 'canvas-datagrid-invalid-search-regExp';\n self.localStyleLibraryStorageKey = 'canvas-datagrid-user-style-library';\n self.dataType = 'application/x-canvas-datagrid';\n self.orderBy = null;\n self.orderDirection = 'asc';\n self.orderings = {\n columns: [],\n add: function (orderBy, orderDirection, sortFunction) {\n self.orderings.columns = self.orderings.columns.filter(function (col) {\n return col.orderBy !== orderBy;\n });\n self.orderings.columns.push({\n orderBy: orderBy,\n orderDirection: orderDirection,\n sortFunction: sortFunction,\n });\n },\n sort: function () {\n console.warn(\n 'grid.orderings.sort has been deprecated. Please use grid.refresh().',\n );\n\n self.orderings.columns.forEach(function (col) {\n self.viewData.sort(col.sortFunction(col.orderBy, col.orderDirection));\n });\n },\n };\n self.columnFilters = {};\n self.filters = {};\n self.frozenRow = 0;\n self.frozenColumn = 0;\n self.ellipsisCache = {};\n self.scrollCache = { x: [], y: [] };\n self.scrollBox = {};\n self.visibleRows = [];\n self.visibleCells = [];\n /**\n * Each item of this array contains these properties:\n * - `x`, `y`, `x2`, `y2`\n * - `orderIndex0`, `orderIndex1`: The closed interval of the hiding rows/columns.\n * - `dir`: The directon of the unhide indicator. 'l' and 'r' for columns, 't' and 'b' for rows\n */\n self.visibleUnhideIndicators = [];\n /**\n * Each item is a tuple conatins two numbers:\n * its type difination: Array<[beginRowIndex, endRowIndex]>\n * Each tuple represents a closed Interval\n */\n self.hiddenRowRanges = [];\n /**\n * This array stored all groups information with context for drawing,\n * it is generated by drawing functions,\n * and be used for searching groups when users operate on the spreadsheet\n * Each item of this array contains these properties:\n * - `type`: its available values: 'c' and 'r'. indicates the type of this item, 'c' for column group\n * and 'r' for row group.\n * - `x`,`y`: the left-top point of this group's rendering area.\n * - `x2`, `y2`: the right-bottom of this group's rendering area.\n * - `collapsed`: this value indicates the collapsed status of this group.\n * - `from`, `to`: The column index range of this group (We use this value for searching the group)\n * - `row`: The row index for column groups (We use this value for searching the group)\n */\n self.visibleGroups = [];\n self.sizes = {\n rows: {},\n columns: {},\n trees: {},\n };\n self.selections = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n self.fillOverlay = {};\n self.filterable = {\n rows: [],\n columns: [],\n };\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n self.cellTree = {\n rows: [],\n columns: {},\n tempSchema: {},\n rowTreeColIndex: 0,\n columnTreeRowStartIndex: 0,\n columnTreeRowEndIndex: 0,\n origin: {\n rows: [],\n columns: {},\n },\n };\n self.hovers = {};\n self.attributes = {};\n self.style = {};\n self.formatters = {};\n self.sorters = {};\n self.parsers = {};\n self.schemaHashes = {};\n self.events = {};\n self.changes = [];\n self.scrollIndexTop = 0;\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = 0;\n self.scrollPixelLeft = 0;\n self.childGrids = {};\n self.openChildren = {};\n\n /**\n * Array for grouped columns\n * Each item in this array is an array and it represents some grouping in one row\n * A grouping descriptor has three properties:\n * - `from`: The column index of the first column\n * - `to`: The column index of the last column\n * - `collapsed`: Is this group be collapsed\n * @example [[{ from: 1, to: 2, collapsed: false }]]\n */\n self.groupedColumns = [];\n\n /**\n * Array for grouped rows\n * Each item in this array is an array and it represents some grouping in one column\n * A grouping descriptor has three properties:\n * - `from`: The row index of the first row\n * - `to`: The row index of the last row\n * - `collapsed`: Is this group be collapsed\n * @example [[{ from: 1, to: 2, collapsed: false }]]\n */\n self.groupedRows = [];\n\n self.scrollModes = [\n 'vertical-scroll-box',\n 'vertical-scroll-top',\n 'vertical-scroll-bottom',\n 'horizontal-scroll-box',\n 'horizontal-scroll-right',\n 'horizontal-scroll-left',\n ];\n self.componentL1Events = {};\n self.eventNames = [\n 'afterdraw',\n 'afterrendercell',\n 'afterrenderfilterbutton',\n 'aftercreategroup',\n 'attributechanged',\n 'beforebeginedit',\n 'beforecreatecellgrid',\n 'beforedraw',\n 'beforeendedit',\n 'beforerendercell',\n 'beforerendercellgrid',\n 'beforerenderfilterbutton',\n 'beginedit',\n 'cellmouseout',\n 'cellmouseover',\n 'click',\n 'collapsetree',\n 'columnhide',\n 'columnunhide',\n 'contextmenu',\n 'copy',\n 'datachanged',\n 'dblclick',\n 'endedit',\n 'expandtree',\n 'formatcellvalue',\n 'keydown',\n 'keypress',\n 'keyup',\n 'mousedown',\n 'mousemove',\n 'mouseup',\n 'newrow',\n 'ordercolumn',\n 'rendercell',\n 'rendercellgrid',\n 'renderorderbyarrow',\n 'rendertext',\n 'rendertreearrow',\n 'reorder',\n 'reordering',\n 'resize',\n 'resizecolumn',\n 'resizerow',\n 'schemachanged',\n 'scroll',\n 'selectionchanged',\n 'stylechanged',\n 'touchcancel',\n 'touchend',\n 'touchmove',\n 'touchstart',\n 'wheel',\n ];\n self.mouse = { x: 0, y: 0 };\n self.getSelectedData = function (expandToRow) {\n const selectedData = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n // self.selections is a sparse array, so `viewRowIndex` here\n // will equal the row index as where it's rendered,\n // not as where it is in the original data array.\n self.selections.forEach(function (row, viewRowIndex) {\n if (!row) {\n return;\n }\n\n if (viewRowIndex === viewDataLength) {\n return;\n }\n\n if (row.length === 0) {\n selectedData[viewRowIndex] = null;\n return;\n }\n\n selectedData[viewRowIndex] = {};\n\n row.forEach(function (col) {\n if (col === -1 || !schema[col]) {\n return;\n }\n\n const orderedIndex = self.orders.columns[col];\n\n if (!expandToRow && schema[orderedIndex].hidden) {\n return;\n }\n\n if (self.viewData[viewRowIndex]) {\n selectedData[viewRowIndex][schema[orderedIndex].name] =\n self.viewData[viewRowIndex][schema[orderedIndex].name];\n }\n });\n });\n\n return selectedData;\n };\n self.getSelectedCells = function (expandToRow) {\n const selectedCells = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n for (const [viewRowIndex, row] of self.selections.entries()) {\n if (!row || row.length === 0) continue;\n\n for (const [, viewColumnIndex] of row.entries()) {\n if (viewColumnIndex === -1 || !schema[viewColumnIndex]) {\n continue;\n }\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n viewColumnIndex,\n );\n\n if (!expandToRow && schema[boundColumnIndex].hidden) {\n continue;\n }\n\n if (self.viewData[viewRowIndex]) {\n const header = schema[boundColumnIndex];\n const value = self.viewData[viewRowIndex][header.name];\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(\n viewRowIndex,\n );\n\n const cell = {\n value,\n header,\n boundRowIndex,\n boundColumnIndex,\n viewRowIndex,\n viewColumnIndex,\n };\n\n selectedCells.push(cell);\n }\n }\n }\n\n return selectedCells;\n };\n self.copySelectedCellsToClipboard = function (clipboardData) {\n const selectedData = [];\n const schema = self.getSchema();\n let firstRowAsString;\n let isNeat = true; // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy\n\n for (const [rowIndex, row] of self.selections.entries()) {\n // If no cells are selected for a particular rowIndex the selections array will contain an empty element for that rowIndex.\n if (!row) continue;\n\n // Convert to string for easy comparison to the first row.\n const rowAsString = row.join(',').toString();\n const rowDict = {};\n\n if (!firstRowAsString) firstRowAsString = row.join(',').toString();\n if (isNeat && rowAsString !== firstRowAsString) isNeat = false;\n\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n\n for (let columnIndex of row) {\n // If the whole row is selected the columnIndex for the rowHeader is -1.\n if (columnIndex < 0) continue;\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n columnIndex,\n );\n const columnName = schema[boundColumnIndex].name;\n\n const value = self.originalData[boundRowIndex][columnName];\n\n rowDict[columnName] = value;\n }\n selectedData.push(rowDict);\n }\n\n if (selectedData.length > 0) {\n const textString = createTextString(selectedData, isNeat);\n const htmlString = createHTMLString(selectedData, isNeat);\n\n const copiedData = {\n 'text/plain': textString,\n 'text/html': htmlString,\n 'text/csv': textString,\n 'application/json': JSON.stringify(selectedData),\n };\n\n for (const [mimeType, data] of Object.entries(copiedData)) {\n clipboardData.setData(mimeType, data);\n }\n }\n };\n self.clearSelectedCells = function () {\n const schema = self.getSchema();\n const affectedCells = [];\n\n for (const [rowIndex, row] of self.selections.entries()) {\n // If no cells are selected for a particular rowIndex the selections array will contain an empty element for that rowIndex.\n if (!row) continue;\n\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n\n for (let columnIndex of row) {\n // If the whole row is selected the columnIndex for the rowHeader is -1.\n if (columnIndex < 0) continue;\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n columnIndex,\n );\n const columnName = schema[boundColumnIndex].name;\n\n self.viewData[boundRowIndex][columnName] = '';\n\n affectedCells.push([\n rowIndex,\n columnIndex,\n boundRowIndex,\n boundColumnIndex,\n ]);\n }\n }\n\n return affectedCells;\n };\n self.getBoundRowIndexFromViewRowIndex = function (viewRowIndex) {\n if (self.boundRowIndexMap && self.boundRowIndexMap.has(viewRowIndex)) {\n return self.boundRowIndexMap.get(viewRowIndex);\n }\n\n return undefined;\n };\n self.getBoundColumnIndexFromViewColumnIndex = function (viewColumnIndex) {\n return self.orders.columns[viewColumnIndex];\n };\n /**\n * Get the height of the area about column groups for rendering and handling events.\n */\n self.getColumnGroupAreaHeight = function () {\n if (!self.attributes.allowGroupingColumns) {\n return 0;\n }\n const groups = self.groupedColumns.length;\n const base = self.style.columnGroupRowHeight * self.scale;\n return base * groups;\n };\n /**\n * Get the width of the area about row groups for rendering and handling events.\n */\n self.getRowGroupAreaWidth = function () {\n if (!self.attributes.allowGroupingRows) {\n return 0;\n }\n const groups = self.groupedRows.length;\n const base = self.style.rowGroupColumnWidth * self.scale;\n return base * groups;\n };\n self.getCollapsedColumnGroups = function () {\n const result = [];\n for (let rowIndex = 0; rowIndex < self.groupedColumns.length; rowIndex++) {\n const groups = self.groupedColumns[rowIndex];\n for (let groupIndex = 0; groupIndex < groups.length; groupIndex++) {\n const group = groups[groupIndex];\n if (group.collapsed) result.push(group);\n }\n }\n return result;\n };\n self.getCollapsedRowGroups = function () {\n const result = [];\n for (let rowIndex = 0; rowIndex < self.groupedRows.length; rowIndex++) {\n const groups = self.groupedRows[rowIndex];\n for (let groupIndex = 0; groupIndex < groups.length; groupIndex++) {\n const group = groups[groupIndex];\n if (group.collapsed) result.push(group);\n }\n }\n return result;\n };\n /**\n * Toggle the collapse status of a group (expanded/collapsed)\n * @param {{type:string,from:number,to:number}} group\n */\n self.toggleGroup = function (group) {\n if (group.type === 'c') {\n const { from, to } = group;\n /** @type {{from:number,to:number,collapsed:boolean}} */\n let matchedGroup;\n /** @type {Array<Array<{from:number,to:number,collapsed:boolean}>>} */\n const allGroups = self.groupedColumns;\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n if (group.from === from && group.to === to) {\n matchedGroup = group;\n break;\n }\n }\n if (matchedGroup) break;\n }\n if (!matchedGroup) return;\n const nextCollapsed = !matchedGroup.collapsed;\n matchedGroup.collapsed = nextCollapsed;\n return true;\n }\n if (group.type === 'r') {\n const { from, to } = group;\n /** @type {{from:number,to:number,collapsed:boolean}} */\n let matchedGroup;\n /** @type {Array<Array<{from:number,to:number,collapsed:boolean}>>} */\n const allGroups = self.groupedRows;\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n if (group.from === from && group.to === to) {\n matchedGroup = group;\n break;\n }\n }\n if (matchedGroup) break;\n }\n if (!matchedGroup) return;\n const nextCollapsed = !matchedGroup.collapsed;\n matchedGroup.collapsed = nextCollapsed;\n return true;\n }\n return false;\n };\n self.isNewGroupRangeValid = function (groupsArray, from, to) {\n for (let i = 0; i < groupsArray.length; i++) {\n const groups = groupsArray[i];\n for (let gIndex = 0; gIndex < groups.length; gIndex++) {\n const group = groups[gIndex];\n if (from === group.to + 1) return false;\n if (from > group.to) continue;\n\n if (from === group.from) {\n if (to === group.to) return false;\n if (to > group.to) return true;\n break; // check smaller range\n }\n if (from > group.from) {\n if (to > group.to) return false;\n break; // check smaller range\n }\n if (to < group.to) return false;\n return true;\n }\n }\n return true;\n };\n self.getColumnHeaderCellHeight = function () {\n if (!self.attributes.showColumnHeaders) {\n return 0;\n }\n return (\n (self.sizes.rows[-1] || self.style.columnHeaderCellHeight) * self.scale\n );\n };\n self.getRowHeaderCellWidth = function () {\n if (!self.attributes.showRowHeaders) {\n return 0;\n }\n return (\n (self.sizes.columns[-1] || self.style.rowHeaderCellWidth) * self.scale\n );\n };\n self.setStorageData = function () {\n if (!self.attributes.saveAppearance || !self.attributes.name) {\n return;\n }\n var visibility = {};\n self.getSchema().forEach(function (column) {\n visibility[column.name] = !column.hidden;\n });\n localStorage.setItem(\n self.storageName + '-' + self.attributes.name,\n JSON.stringify({\n sizes: {\n rows: self.sizes.rows,\n columns: self.sizes.columns,\n },\n orders: {\n rows: self.orders.rows,\n columns: self.orders.columns,\n },\n orderBy: self.orderBy,\n orderDirection: self.orderDirection,\n visibility: visibility,\n }),\n );\n };\n self.getSchema = function () {\n return self.schema || self.tempSchema || [];\n };\n function fillArray(low, high) {\n var i = [],\n x;\n for (x = low; x <= high; x += 1) {\n i[x] = x;\n }\n return i;\n }\n self.createColumnOrders = function () {\n var s = self.getSchema();\n self.orders.columns = fillArray(0, s.length - 1);\n };\n self.createRowOrders = function () {\n self.orders.rows = fillArray(0, self.originalData.length - 1);\n };\n self.fitSelectedColumns = function (width) {\n const selectedColumns = self.selections[0];\n const schema = self.getSchema();\n\n for (const selectedColumn of selectedColumns) {\n // Make sure the column is not the row header and that the whole column has in fact been selected.\n if (selectedColumn >= 0 && self.isColumnSelected(selectedColumn)) {\n if (isNaN(width)) {\n const column = schema[self.orders.columns[selectedColumn]];\n self.fitColumnToValues(column.name);\n } else {\n self.sizes.columns[selectedColumn] = width;\n self.dispatchEvent('resizecolumn', {\n x: width,\n y: self.resizingStartingHeight,\n draggingItem: self.currentCell,\n });\n }\n }\n }\n };\n self.getVisibleSchema = function () {\n return self.getSchema().filter(function (col) {\n return !col.hidden;\n });\n };\n self.applyDefaultValue = function (row, header, rowIndex) {\n var d = header.defaultValue || '';\n if (typeof d === 'function') {\n d = d.apply(self.intf, [header, rowIndex]);\n }\n row[header.name] = d;\n };\n self.createNewRowData = function () {\n self.newRow = {};\n\n // The third argument of applyDefaultValue is the row index\n // of the row for which to apply the default value. In this\n // case, we're creating a new row but not yet appending it\n // to self.originalData, so no row index exists\n const newRowIndex = undefined;\n\n self.getSchema().forEach(function forEachHeader(header) {\n self.applyDefaultValue(self.newRow, header, newRowIndex);\n });\n };\n self.getSchemaNameHash = function (key) {\n var n = 0;\n while (self.schemaHashes[key]) {\n n += 1;\n key = key + n;\n }\n return key;\n };\n self.filter = function (type) {\n var f = self.filters[type];\n if (!f && type !== undefined) {\n console.warn(\n 'Cannot find filter for type %s, falling back to substring match.',\n type,\n );\n f = self.filters.string;\n }\n return f;\n };\n self.hasActiveFilters = function () {\n return self.columnFilters && Object.keys(self.columnFilters).length > 0;\n };\n self.hasCollapsedRowGroup = function () {\n for (let i = 0; i < self.groupedRows.length; i++) {\n const groups = self.groupedRows[i];\n for (let j = 0; j < groups.length; j++) {\n const g = groups[j];\n if (g.collapsed) return true;\n }\n }\n return false;\n };\n self.getFilteredAndSortedViewData = function (originalData) {\n // We make a copy of originalData here in order be able to\n // filter and sort rows without modifying the original array.\n // Each row is turned into a (row, rowIndex) tuple\n // so that when we apply filters, we can refer back to the\n // row's original row number in originalData. This becomes\n // useful when emitting cell events.\n let newViewData = originalData.map((row, originalRowIndex) => [\n row,\n originalRowIndex,\n ]);\n\n // Remove hidden rows here. So we can keep the bound indexes correct\n if (self.hiddenRowRanges.length > 0) {\n const ranges = self.hiddenRowRanges.sort((a, b) => b[1] - a[1]);\n for (let i = 0; i < ranges.length; i++) {\n const [beginRowIndex, endRowIndex] = ranges[i];\n const countOfRows = endRowIndex - beginRowIndex + 1;\n newViewData.splice(beginRowIndex, countOfRows);\n }\n }\n\n // Apply filtering\n for (const [headerName, filterText] of Object.entries(self.columnFilters)) {\n const header = self.getHeaderByName(headerName);\n\n if (!header) {\n continue;\n }\n\n const currentFilterFunction =\n header.filter || self.filter(header.type || 'string');\n\n newViewData = newViewData.filter(function ([row, originalRowIndex]) {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.filterFrozenRows &&\n originalRowIndex < self.frozenRow\n )\n return true;\n\n return currentFilterFunction(row[headerName], filterText);\n });\n }\n\n //#region Hide rows from collapsed group\n /** @type {number[][]} */\n let collapsedGroups = [];\n for (let i = 0; i < self.groupedRows.length; i++) {\n const rows = self.groupedRows[i];\n for (let j = 0; j < rows.length; j++) {\n const r = rows[j];\n if (!r.collapsed) continue;\n collapsedGroups.push([r.from, r.to]);\n }\n }\n if (collapsedGroups.length > 0) {\n //#region merge groups\n collapsedGroups.sort((a, b) => a[0] - b[0]);\n let newLen = 0;\n const len = collapsedGroups.length;\n for (let i = 0; i < len; i++) {\n const r = collapsedGroups[i];\n if (i === len - 1) {\n collapsedGroups[newLen++] = r;\n break;\n }\n const to = r[1];\n const [from2, to2] = collapsedGroups[i + 1];\n if (from2 > to + 1) {\n collapsedGroups[newLen++] = r;\n continue;\n }\n collapsedGroups[i + 1] = r;\n if (to2 > to) collapsedGroups[i + 1][1] = to2;\n }\n collapsedGroups = collapsedGroups.slice(0, newLen);\n //#endregion merge groups\n\n //#region omit rows by groups\n let g = collapsedGroups.shift();\n for (let start = 0; start < newViewData.length; start++) {\n const it = newViewData[start][1];\n if (it < g[0]) continue;\n let end = start + 1;\n for (; end < newViewData.length; end++) {\n const it2 = newViewData[end][1];\n if (it2 > g[1]) break;\n }\n newViewData.splice(start, end - start);\n g = collapsedGroups.shift();\n if (!g) break;\n start--;\n }\n //#endregion omit rows by groups\n }\n //#endregion Hide rows from collapsed group\n\n // Apply sorting\n for (const column of self.orderings.columns) {\n const sortFn = column.sortFunction(column.orderBy, column.orderDirection);\n\n newViewData.sort(([rowA], [rowB, rowIndexB]) => {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.sortFrozenRows &&\n rowIndexB < self.frozenRow\n )\n return 0;\n return sortFn(rowA, rowB);\n });\n }\n\n return {\n viewData: newViewData.map(([row]) => row),\n boundRowIndexMap: new Map(\n newViewData.map(([_row, originalRowIndex], viewRowIndex) => [\n viewRowIndex,\n originalRowIndex,\n ]),\n ),\n };\n };\n self.refresh = function () {\n const { viewData, boundRowIndexMap } = self.getFilteredAndSortedViewData(\n self.originalData,\n );\n\n self.viewData = viewData;\n self.boundRowIndexMap = boundRowIndexMap;\n\n self.resize();\n self.draw(true);\n };\n self.getBestGuessDataType = function (columnName, data) {\n var t,\n x,\n l = data.length;\n for (x = 0; x < l; x += 1) {\n if (\n data[x] !== undefined &&\n data[x] !== null &&\n [null, undefined].indexOf(data[x][columnName]) !== -1\n ) {\n t = typeof data[x];\n return t === 'object' ? 'string' : t;\n }\n }\n return 'string';\n };\n self.drawChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].draw();\n });\n };\n self.resizeChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].resize();\n });\n };\n self.autoScrollZone = function (e, x, y, ctrl) {\n var setTimer,\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n columnHeaderCellHeight = self.getColumnHeaderCellHeight();\n if (x !== -1) {\n if (x > self.width - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (x - self.attributes.selectionScrollZone - rowHeaderCellWidth < 0) {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (y !== -1) {\n if (y > self.height - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollTop += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (\n y - self.attributes.selectionScrollZone - columnHeaderCellHeight <\n 0\n ) {\n self.scrollBox.scrollTop -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (\n setTimer &&\n !ctrl &&\n self.currentCell &&\n self.currentCell.columnIndex !== -1\n ) {\n self.scrollTimer = setTimeout(\n self.mousemove,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.validateColumn = function (c, s) {\n if (!c.name) {\n throw new Error('A column must contain at least a name.');\n }\n if (\n s.filter(function (i) {\n return i.name === c.name;\n }).length > 0\n ) {\n throw new Error(\n 'A column with the name ' +\n c.name +\n ' already exists and cannot be added again.',\n );\n }\n return true;\n };\n self.setDefaults = function (obj1, obj2, key, def) {\n obj1[key] = obj2[key] === undefined ? def : obj2[key];\n };\n self.setAttributes = function () {\n self.defaults.attributes.forEach(function eachAttribute(i) {\n self.setDefaults(self.attributes, self.args, i[0], i[1]);\n });\n };\n self.setStyle = function () {\n self.defaults.styles.forEach(function eachStyle(i) {\n self.setDefaults(self.style, self.args.style || {}, i[0], i[1]);\n });\n };\n self.autosize = function (colName) {\n self.getVisibleSchema().forEach(function (col, colIndex) {\n if (col.name === colName || colName === undefined) {\n self.sizes.columns[colIndex] = Math.max(\n self.findColumnMaxTextLength(col.name),\n self.style.minColumnWidth,\n );\n }\n });\n self.sizes.columns[-1] = self.findColumnMaxTextLength('cornerCell');\n };\n self.dispose = function () {\n if (!self.isChildGrid && self.canvas && self.canvas.parentNode) {\n self.canvas.parentNode.removeChild(self.canvas);\n }\n if (!self.isChildGrid) {\n document.body.removeChild(self.controlInput);\n }\n self.eventParent.removeEventListener('mousedown', self.mousedown, false);\n self.eventParent.removeEventListener('dblclick', self.dblclick, false);\n self.eventParent.removeEventListener('click', self.click, false);\n self.eventParent.removeEventListener('mousemove', self.mousemove);\n self.eventParent.removeEventListener('wheel', self.scrollWheel, false);\n self.canvas.removeEventListener('contextmenu', self.contextmenu, false);\n self.canvas.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('cut', self.cut);\n self.controlInput.removeEventListener('paste', self.paste);\n self.controlInput.removeEventListener('keypress', self.keypress, false);\n self.controlInput.removeEventListener('keyup', self.keyup, false);\n self.controlInput.removeEventListener('keydown', self.keydown, false);\n window.removeEventListener('mouseup', self.mouseup, false);\n window.removeEventListener('mousemove', self.mousemove);\n window.removeEventListener('resize', self.resize);\n if (self.observer && self.observer.disconnect) {\n self.observer.disconnect();\n }\n };\n self.tryLoadStoredSettings = function () {\n var s;\n self.reloadStoredValues();\n if (\n self.storedSettings &&\n typeof self.storedSettings.orders === 'object' &&\n self.storedSettings.orders !== null\n ) {\n if (\n self.storedSettings.orders.rows.length >= (self.viewData || []).length\n ) {\n self.orders.rows = self.storedSettings.orders.rows;\n }\n s = self.getSchema();\n if (self.storedSettings.orders.columns.length === s.length) {\n self.orders.columns = self.storedSettings.orders.columns;\n }\n self.orderBy =\n self.storedSettings.orderBy === undefined\n ? s[0].name\n : self.storedSettings.orderBy;\n self.orderDirection =\n self.storedSettings.orderDirection === undefined\n ? 'asc'\n : self.storedSettings.orderDirection;\n if (\n self.storedSettings.orderBy !== undefined &&\n self.getHeaderByName(self.orderBy) &&\n self.orderDirection\n ) {\n self.order(self.orderBy, self.orderDirection);\n }\n }\n };\n self.toggleCollapseTree = function (rowIndex, columnIndex, type) {\n let tempData = [];\n let collapsedCount = 0;\n if (\n columnIndex == self.cellTree.rowTreeColIndex &&\n (rowIndex > 0 || (rowIndex == 0 && self.cellTree.rows[0].icon))\n ) {\n let ctr = self.cellTree.rows;\n switch (type) {\n case 'Expand':\n ctr[rowIndex].expand = true;\n self.cellTree.origin.rows[ctr[rowIndex].index].expand = true;\n break;\n\n case 'Collapse':\n ctr[rowIndex].expand = false;\n self.cellTree.origin.rows[ctr[rowIndex].index].expand = false;\n break;\n\n default:\n ctr[rowIndex].expand = !ctr[rowIndex].expand;\n self.cellTree.origin.rows[ctr[rowIndex].index].expand =\n ctr[rowIndex].expand;\n }\n for (\n let ri = ctr[rowIndex].index + 1;\n ri <= ctr[rowIndex].lastchild;\n ri++\n ) {\n let orTree = self.cellTree.origin.rows[ri];\n if (ctr[rowIndex].expand) {\n orTree.hide = false;\n if (orTree.icon && !orTree.expand) ri = orTree.lastchild;\n } else {\n orTree.hide = true;\n }\n }\n } else if (self.cellTree.columns[rowIndex]) {\n let ctc = self.cellTree.columns[rowIndex];\n\n switch (type) {\n case 'Expand':\n ctc[columnIndex].expand = true;\n break;\n\n case 'Collapse':\n ctc[columnIndex].expand = false;\n break;\n\n default:\n ctc[columnIndex].expand = !ctc[columnIndex].expand;\n }\n for (\n let ci = ctc[columnIndex].index + 1;\n ci <= ctc[columnIndex].lastchild;\n ci++\n ) {\n if (ctc[columnIndex].expand)\n self.cellTree.tempSchema[ci].hidden = false;\n else self.cellTree.tempSchema[ci].hidden = true;\n }\n let rc = 0,\n _ri;\n\n if (ctc[columnIndex].expand) {\n while (rc < ctc[columnIndex].child) {\n _ri = rowIndex + rc + 1;\n\n for (\n let _ci = ctc[columnIndex].index;\n _ci <= ctc[columnIndex].lastchild;\n _ci++\n ) {\n if (\n self.cellTree.origin.columns[_ri] &&\n self.cellTree.origin.columns[_ri][_ci].icon &&\n !self.cellTree.origin.columns[_ri][_ci].expand\n ) {\n for (\n let si = _ci + 1;\n si <= self.cellTree.origin.columns[_ri][_ci].lastchild;\n si++\n ) {\n self.cellTree.tempSchema[si].hidden = true;\n }\n }\n }\n\n rc++;\n }\n }\n }\n let otherData = {};\n let collapsed = [];\n self.cellTree.rows = [];\n self.cellTree.columns = {};\n for (let k in self.cellTree.origin.rows) {\n let tempRow = [];\n let tree = self.cellTree.origin.rows[k];\n if (!tree.hide) {\n let colTrees = [];\n let collapsedColCount = 0;\n if (k < self.cellTree.columnTreeRowStartIndex) {\n tempData.push(self.originalData[k]);\n } else {\n if (k > self.cellTree.columnTreeRowEndIndex) {\n otherData[k] = self.viewData[k];\n collapsedCount++;\n } else {\n for (let l = 0; l < self.originalData[k].length; l++) {\n if (!self.cellTree.tempSchema[l].hidden) {\n if (l < self.cellTree.rowTreeColIndex) {\n if (!Object.prototype.hasOwnProperty.call(otherData, k))\n otherData[k] = [];\n otherData[k].push(self.viewData[k][l]);\n }\n tempRow.push(self.originalData[k][l]);\n if (\n Object.prototype.hasOwnProperty.call(\n self.cellTree.origin.columns,\n k,\n )\n )\n colTrees.push(self.cellTree.origin.columns[k][l]);\n } else collapsedColCount++;\n }\n tempRow.push(\n ...Array(collapsedColCount)\n .fill()\n .map(function () {\n return '';\n }),\n );\n if (colTrees.length) {\n colTrees.push(\n ...Array(collapsedColCount)\n .fill()\n .map(() => {\n return {};\n }),\n );\n self.cellTree.columns[k] = colTrees;\n }\n tempData.push(tempRow);\n }\n }\n self.cellTree.rows.push(tree);\n } else {\n for (let l = 0; l < self.cellTree.rowTreeColIndex; l++) {\n tempRow.push(self.viewData[k][l]);\n }\n otherData[k] = tempRow;\n collapsed.push(\n Array(self.viewData[0].length)\n .fill()\n .map(function () {\n return '';\n }),\n );\n collapsedCount++;\n }\n }\n if (collapsedCount) {\n self.cellTree.rows.push(\n ...Array(collapsedCount)\n .fill()\n .map((u, index) => {\n return { index: self.cellTree.rows.length + index };\n }),\n );\n tempData.push(...collapsed);\n }\n for (let k in otherData) {\n if (k > self.cellTree.columnTreeRowEndIndex) tempData[k] = otherData[k];\n else\n for (let l in otherData[k]) {\n tempData[k][l] = otherData[k][l];\n }\n }\n self.viewData = tempData;\n };\n self.cellTreeExpandCollapse = function (rowIndex, columnIndex, type) {\n if (\n columnIndex == self.cellTree.rowTreeColIndex &&\n (rowIndex > 0 || (rowIndex == 0 && self.cellTree.rows[0].icon))\n ) {\n const ctr = self.cellTree.rows;\n switch (type) {\n case 'Expand':\n ctr[rowIndex].expand = true;\n break;\n case 'Collapse':\n ctr[rowIndex].expand = false;\n break;\n default:\n ctr[rowIndex].expand = !ctr[rowIndex].expand;\n }\n for (let ri = rowIndex + 1; ri <= ctr[rowIndex].lastchild; ri++) {\n if (ctr[rowIndex].expand) {\n ctr[ri].hide = false;\n if (ctr[ri].icon && !ctr[ri].expand) ri = ctr[ri].lastchild;\n } else {\n ctr[ri].hide = true;\n }\n }\n } else if (self.cellTree.columns[rowIndex]) {\n const ctc = self.cellTree.columns[rowIndex];\n switch (type) {\n case 'Expand':\n ctc[columnIndex].expand = true;\n break;\n case 'Collapse':\n ctc[columnIndex].expand = false;\n break;\n default:\n ctc[columnIndex].expand = !ctc[columnIndex].expand;\n }\n\n for (let ci = columnIndex + 1; ci <= ctc[columnIndex].lastchild; ci++) {\n if (ctc[columnIndex].expand) self.tempSchema[ci].hidden = false;\n else self.tempSchema[ci].hidden = true;\n }\n\n let rc = 0,\n ri;\n if (ctc[columnIndex].expand) {\n while (rc < ctc[columnIndex].child) {\n ri = rowIndex + rc + 1;\n for (let ci = columnIndex; ci <= ctc[columnIndex].lastchild; ci++) {\n if (\n self.cellTree.columns[ri] &&\n self.cellTree.columns[ri][ci].icon &&\n !self.cellTree.columns[ri][ci].expand\n ) {\n for (\n let si = ci + 1;\n si <= self.cellTree.columns[ri][ci].lastchild;\n si++\n )\n self.tempSchema[si].hidden = true;\n }\n }\n rc++;\n }\n }\n }\n };\n\n self.initCellTreeSettings = function () {\n if (self.viewData === undefined) return;\n if (self.attributes.rowTree.length > 0 && self.viewData.length > 0) {\n self.cellTree.rows = Array(self.viewData.length)\n .fill()\n .map((u, index) => ({ index: index }));\n self.cellTree.rowTreeColIndex = self.attributes.rowTreeColIndex;\n let invalidRowTree = false;\n for (let rt of self.attributes.rowTree) {\n if (self.cellTree.rows.length <= rt.end) {\n invalidRowTree = true;\n break;\n }\n\n for (let ri = rt.begin; ri <= rt.end; ri++) {\n if (ri == rt.begin) {\n self.cellTree.rows[ri].icon = true;\n self.cellTree.rows[ri].lastchild = rt.end;\n self.cellTree.rows[ri].expand = true;\n if (!self.cellTree.rows[ri].parentCount)\n self.cellTree.rows[ri].parentCount = 0;\n } else {\n self.cellTree.rows[ri].hide = false;\n self.cellTree.rows[ri].parentIndex = rt.begin;\n if (self.cellTree.rows[ri] && self.cellTree.rows[ri].parentCount)\n self.cellTree.rows[ri].parentCount += 1;\n else self.cellTree.rows[ri].parentCount = 1;\n }\n }\n }\n if (invalidRowTree) self.cellTree.rows = {};\n }\n if (self.attributes.columnTree.length > 0 && self.viewData.length > 0) {\n self.cellTree.columnTreeRowStartIndex =\n self.attributes.columnTreeRowStartIndex;\n self.cellTree.columnTreeRowEndIndex =\n self.attributes.columnTreeRowEndIndex;\n let dataColumnLength = Object.keys(self.viewData[0]).length;\n let invalidColumnTree = false;\n for (let ct of self.attributes.columnTree) {\n if (dataColumnLength <= ct.end) {\n invalidColumnTree = true;\n break;\n }\n\n if (!self.cellTree.columns[ct.row])\n self.cellTree.columns[ct.row] = Array(dataColumnLength)\n .fill()\n .map((u, index) => ({ index: index }));\n\n for (let i = ct.begin; i <= ct.end; i++) {\n const ctc = self.cellTree.columns[ct.row][i];\n if (i == ct.begin) {\n ctc.icon = true;\n ctc.lastchild = ct.end;\n ctc.length = ct.end - ct.begin;\n ctc.expand = true;\n if (ct.child) ctc.child = ct.child;\n else ctc.child = 0;\n }\n }\n }\n self.cellTree.tempSchema = Array(dataColumnLength)\n .fill()\n .map(function () {\n return { hidden: false };\n });\n if (invalidColumnTree) self.cellTree.columns = {};\n }\n self.cellTree.origin = {\n rows: self.cellTree.rows,\n columns: self.cellTree.columns,\n };\n };\n\n self.getDomRoot = function () {\n return self.shadowRoot ? self.shadowRoot.host : self.parentNode;\n };\n self.getFontName = function (fontStyle) {\n return fontStyle.replace(/\\d+\\.?\\d*px/, '');\n };\n self.getFontHeight = function (fontStyle) {\n return parseFloat(fontStyle, 10);\n };\n self.parseStyleValue = function (key) {\n if (/Font/.test(key)) {\n self.style[key + 'Height'] = self.getFontHeight(self.style[key]);\n self.style[key + 'Name'] = self.getFontName(self.style[key]);\n return;\n }\n // when inheriting styles from already instantiated grids, don't parse already parsed values.\n if (\n key === 'moveOverlayBorderSegments' &&\n typeof self.style[key] === 'string'\n ) {\n self.style[key] = self.style[key].split(',').map(function (i) {\n return parseInt(i, 10);\n });\n }\n };\n self.initProp = function (propName) {\n if (!self.args[propName]) {\n return;\n }\n Object.keys(self.args[propName]).forEach(function (key) {\n self[propName][key] = self.args[propName][key];\n });\n };\n self.getStyleProperty = function (key) {\n if (self.styleKeys.indexOf(key) === -1) {\n return self.parentNodeStyle[key];\n }\n return self.style[key];\n };\n self.setStyleProperty = function (key, value, supressDrawAndEvent) {\n var isDim =\n [\n 'height',\n 'width',\n 'minHeight',\n 'minWidth',\n 'maxHeight',\n 'maxWidth',\n ].indexOf(key) !== -1;\n if (self.styleKeys.indexOf(key) === -1) {\n self.parentNodeStyle[key] = value;\n } else {\n if (/-/.test(key)) {\n key = self.dehyphenateProperty(key);\n }\n self.style[key] = value;\n self.parseStyleValue(key);\n }\n if (isDim) {\n self.resize();\n }\n if (!supressDrawAndEvent) {\n self.draw(true);\n self.dispatchEvent('stylechanged', { name: 'style', value: value });\n }\n };\n self.reloadStoredValues = function () {\n if (self.attributes.name && self.attributes.saveAppearance) {\n try {\n self.storedSettings = localStorage.getItem(\n self.storageName + '-' + self.attributes.name,\n );\n } catch (e) {\n console.warn('Error loading stored values. ' + e.message);\n self.storedSettings = undefined;\n }\n if (self.storedSettings) {\n try {\n self.storedSettings = JSON.parse(self.storedSettings);\n } catch (e) {\n console.warn('could not read settings from localStore', e);\n self.storedSettings = undefined;\n }\n }\n if (self.storedSettings) {\n if (\n typeof self.storedSettings.sizes === 'object' &&\n self.storedSettings.sizes !== null\n ) {\n self.sizes.rows = self.storedSettings.sizes.rows;\n self.sizes.columns = self.storedSettings.sizes.columns;\n ['trees', 'columns', 'rows'].forEach(function (i) {\n if (!self.sizes[i]) {\n self.sizes[i] = {};\n }\n });\n }\n if (typeof self.storedSettings.visibility === 'object') {\n self.getSchema().forEach(function (column) {\n if (\n self.storedSettings.visibility &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n }\n }\n };\n self.init = function () {\n if (self.initialized) {\n return;\n }\n function addStyleKeyIfNoneExists(key) {\n if (self.styleKeys.indexOf(key) === -1) {\n self.styleKeys.push(key);\n }\n }\n var publicStyleKeyIntf = {};\n self.setAttributes();\n self.setStyle();\n self.initScrollBox();\n self.setDom();\n self.nodeType = 'canvas-datagrid';\n self.ie = /Trident/.test(window.navigator.userAgent);\n self.edge = /Edge/.test(window.navigator.userAgent);\n self.webKit = /WebKit/.test(window.navigator.userAgent);\n self.moz = /Gecko/.test(window.navigator.userAgent);\n self.mobile = /Mobile/i.test(window.navigator.userAgent);\n self.blankValues = [undefined, null, ''];\n self.cursorGrab = 'grab';\n self.cursorGrabing = 'grabbing';\n self.cursorGrab = self.webKit ? '-webkit-grab' : self.cursorGrab;\n self.cursorGrabing = self.moz ? '-webkit-grabbing' : self.cursorGrabbing;\n self.pointerLockPosition = { x: 0, y: 0 };\n Object.keys(self.style).forEach(self.parseStyleValue);\n self.intf.moveSelection = self.moveSelection;\n self.intf.deleteSelectedData = self.deleteSelectedData;\n self.intf.moveTo = self.moveTo;\n self.intf.addEventListener = self.addEventListener;\n self.intf.removeEventListener = self.removeEventListener;\n self.intf.dispatchEvent = self.dispatchEvent;\n /**\n * Releases grid resources and removes grid elements.\n * @memberof canvasDatagrid\n * @name dispose\n * @method\n */\n self.intf.dispose = self.dispose;\n /**\n * Appends the grid to another element later. Not implemented.\n * @memberof canvasDatagrid\n * @name appendTo\n * @method\n * @param {number} el The element to append the grid to.\n */\n self.intf.appendTo = self.appendTo;\n self.intf.getVisibleCellByIndex = self.getVisibleCellByIndex;\n self.intf.filters = self.filters;\n self.intf.sorters = self.sorters;\n self.intf.autosize = self.autosize;\n self.intf.beginEditAt = self.beginEditAt;\n self.intf.endEdit = self.endEdit;\n self.intf.setActiveCell = self.setActiveCell;\n self.intf.forEachSelectedCell = self.forEachSelectedCell;\n self.intf.scrollIntoView = self.scrollIntoView;\n self.intf.clearChangeLog = self.clearChangeLog;\n self.intf.gotoCell = self.gotoCell;\n self.intf.gotoRow = self.gotoRow;\n self.intf.addButton = self.addButton;\n self.intf.toggleCellCollapseTree = self.toggleCellCollapseTree;\n self.intf.expandCollapseCellTree = self.expandCollapseCellTree;\n self.intf.getHeaderByName = self.getHeaderByName;\n self.intf.findColumnScrollLeft = self.findColumnScrollLeft;\n self.intf.findRowScrollTop = self.findRowScrollTop;\n self.intf.fitColumnToValues = self.fitColumnToValues;\n self.intf.findColumnMaxTextLength = self.findColumnMaxTextLength;\n self.intf.disposeContextMenu = self.disposeContextMenu;\n self.intf.getCellAt = self.getCellAt;\n self.intf.groupColumns = self.groupColumns;\n self.intf.groupRows = self.groupRows;\n self.intf.removeGroupColumns = self.removeGroupColumns;\n self.intf.removeGroupRows = self.removeGroupRows;\n self.intf.toggleGroupColumns = self.toggleGroupColumns;\n self.intf.toggleGroupRows = self.toggleGroupRows;\n self.intf.getGroupsColumnBelongsTo = self.getGroupsColumnBelongsTo;\n self.intf.getGroupsRowBelongsTo = self.getGroupsRowBelongsTo;\n self.intf.isCellVisible = self.isCellVisible;\n self.intf.isRowVisible = self.isRowVisible;\n self.intf.isColumnVisible = self.isColumnVisible;\n self.intf.order = self.order;\n self.intf.draw = self.draw;\n self.intf.refresh = self.refresh;\n self.intf.isComponent = self.isComponent;\n self.intf.selectArea = self.selectArea;\n self.intf.clipElement = self.clipElement;\n self.intf.getSchemaFromData = self.getSchemaFromData;\n self.intf.setFilter = self.setFilter;\n self.intf.selectRow = self.selectRow;\n self.intf.parentGrid = self.parentGrid;\n self.intf.toggleTree = self.toggleTree;\n self.intf.expandTree = self.expandTree;\n self.intf.collapseTree = self.collapseTree;\n self.intf.canvas = self.canvas;\n self.intf.context = self.ctx;\n self.intf.insertRow = self.insertRow;\n self.intf.deleteRow = self.deleteRow;\n self.intf.addRow = self.addRow;\n self.intf.insertColumn = self.insertColumn;\n self.intf.deleteColumn = self.deleteColumn;\n self.intf.addColumn = self.addColumn;\n self.intf.getClippingRect = self.getClippingRect;\n self.intf.setRowHeight = self.setRowHeight;\n self.intf.setColumnWidth = self.setColumnWidth;\n self.intf.resetColumnWidths = self.resetColumnWidths;\n self.intf.resetRowHeights = self.resetRowHeights;\n self.intf.resize = self.resize;\n self.intf.selectColumn = self.selectColumn;\n self.intf.selectRow = self.selectRow;\n self.intf.selectAll = self.selectAll;\n self.intf.selectNone = self.selectNone;\n self.intf.drawChildGrids = self.drawChildGrids;\n self.intf.assertPxColor = self.assertPxColor;\n self.intf.clearPxColorAssertions = self.clearPxColorAssertions;\n self.intf.integerToAlpha = self.integerToAlpha;\n self.intf.copy = self.copy;\n self.intf.cut = self.cut;\n self.intf.paste = self.paste;\n self.intf.setStyleProperty = self.setStyleProperty;\n self.intf.hideColumns = self.hideColumns;\n self.intf.unhideColumns = self.unhideColumns;\n self.intf.hideRows = self.hideRows;\n self.intf.unhideRows = self.unhideRows;\n Object.defineProperty(self.intf, 'defaults', {\n get: function () {\n return {\n styles: self.defaults.styles.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n attributes: self.defaults.attributes.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n };\n },\n });\n self.styleKeys = Object.keys(self.intf.defaults.styles);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, false);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, true);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.DOMStyles = window.getComputedStyle(document.body, null);\n self.styleKeys.concat(Object.keys(self.DOMStyles)).forEach(function (key) {\n // unless this line is here, Object.keys() will not work on <instance>.style\n publicStyleKeyIntf[key] = undefined;\n Object.defineProperty(publicStyleKeyIntf, key, {\n get: function () {\n return self.getStyleProperty(key);\n },\n set: function (value) {\n if (self.initialized) {\n self.appliedInlineStyles[key] = value;\n }\n self.setStyleProperty(key, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'shadowRoot', {\n get: function () {\n return self.shadowRoot;\n },\n });\n Object.defineProperty(self.intf, 'activeCell', {\n get: function () {\n return self.activeCell;\n },\n });\n Object.defineProperty(self.intf, 'hasFocus', {\n get: function () {\n return self.hasFocus;\n },\n });\n Object.defineProperty(self.intf, 'hasActiveFilters', {\n get: function () {\n return self.hasActiveFilters();\n },\n });\n Object.defineProperty(self.intf, 'style', {\n get: function () {\n return publicStyleKeyIntf;\n },\n set: function (valueObject) {\n Object.keys(valueObject).forEach(function (key) {\n self.setStyleProperty(key, valueObject[key], true);\n });\n self.draw(true);\n self.dispatchEvent('stylechanged', {\n name: 'style',\n value: valueObject,\n });\n },\n });\n Object.defineProperty(self.intf, 'attributes', { value: {} });\n Object.keys(self.attributes).forEach(function (key) {\n Object.defineProperty(self.intf.attributes, key, {\n get: function () {\n return self.attributes[key];\n },\n set: function (value) {\n self.attributes[key] = value;\n if (key === 'name') {\n self.tryLoadStoredSettings();\n }\n if (\n key === 'rowTree' ||\n key === 'columnTree' ||\n key === 'columnTreeRowEndIndex'\n ) {\n self.initCellTreeSettings();\n }\n self.draw(true);\n self.dispatchEvent('attributechanged', {\n name: key,\n value: value[key],\n });\n },\n });\n });\n self.filters.string = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n value = String(value);\n var filterRegExp,\n regEnd = /\\/(i|g|m)*$/,\n pattern = regEnd.exec(filterFor),\n flags = pattern ? pattern[0].substring(1) : '',\n flagLength = flags.length;\n self.invalidFilterRegEx = undefined;\n if (filterFor.substring(0, 1) === '/' && pattern) {\n try {\n filterRegExp = new RegExp(\n filterFor.substring(1, filterFor.length - (flagLength + 1)),\n flags,\n );\n } catch (e) {\n self.invalidFilterRegEx = e;\n return;\n }\n return filterRegExp.test(value);\n }\n return value.toString\n ? value\n .toString()\n .toLocaleUpperCase()\n .indexOf(filterFor.toLocaleUpperCase()) !== -1\n : false;\n };\n self.filters.number = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n if (!filterFor) {\n return true;\n }\n return value === filterFor;\n };\n ['formatters', 'filters', 'sorters'].forEach(self.initProp);\n self.applyComponentStyle(false, self.intf);\n self.reloadStoredValues();\n if (self.args.data) {\n self.intf.data = self.args.data;\n }\n if (self.intf.innerText || self.intf.textContent) {\n if (self.intf.dataType === 'application/x-canvas-datagrid') {\n self.intf.dataType = 'application/json+x-canvas-datagrid';\n }\n self.intf.data = self.intf.innerText || self.intf.textContent;\n }\n if (self.args.schema) {\n self.intf.schema = self.args.schema;\n }\n if (self.isChildGrid || !self.isComponent) {\n requestAnimationFrame(function () {\n self.resize(true);\n });\n } else {\n self.resize(true);\n }\n self.initialized = true;\n return self;\n };\n /**\n * Removes focus from the grid.\n * @memberof canvasDatagrid\n * @name blur\n * @method\n */\n self.intf.blur = function (e) {\n self.hasFocus = false;\n };\n /**\n * Focuses on the grid.\n * @memberof canvasDatagrid\n * @name focus\n * @method\n */\n self.intf.focus = function () {\n self.hasFocus = true;\n self.controlInput.focus();\n };\n if (self.shadowRoot || self.isChildGrid) {\n Object.defineProperty(self.intf, 'height', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.height;\n }\n return self.parentNode.height;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.height = value;\n } else {\n self.parentNode.height = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'width', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.width;\n }\n return self.parentNode.width;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.width = value;\n } else {\n self.parentNode.width = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'parentNode', {\n get: function () {\n return self.parentNode;\n },\n set: function (value) {\n if (!self.isChildGrid) {\n throw new TypeError(\n 'Cannot set property parentNode which has only a getter',\n );\n }\n self.parentNode = value;\n },\n });\n }\n Object.defineProperty(self.intf, 'visibleRowHeights', {\n get: function () {\n return self.visibleRowHeights;\n },\n });\n Object.defineProperty(self.intf, 'openChildren', {\n get: function () {\n return self.openChildren;\n },\n });\n Object.defineProperty(self.intf, 'childGrids', {\n get: function () {\n return Object.keys(self.childGrids).map(function (gridId) {\n return self.childGrids[gridId];\n });\n },\n });\n Object.defineProperty(self.intf, 'isChildGrid', {\n get: function () {\n return self.isChildGrid;\n },\n });\n Object.defineProperty(self, 'cursor', {\n get: function () {\n return self.parentNodeStyle.cursor;\n },\n set: function (value) {\n if (value === 'cell') {\n value = 'default';\n }\n if (self.currentCursor !== value) {\n self.parentNodeStyle.cursor = value;\n self.currentCursor = value;\n }\n },\n });\n Object.defineProperty(self.intf, 'orderDirection', {\n get: function () {\n return self.orderDirection;\n },\n set: function (value) {\n if (value !== 'desc') {\n value = 'asc';\n }\n self.orderDirection = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n Object.defineProperty(self.intf, 'orderBy', {\n get: function () {\n return self.orderBy;\n },\n set: function (value) {\n if (\n self.getSchema().find(function (col) {\n return col.name === value;\n }) === undefined\n ) {\n throw new Error('Cannot sort by unknown column name.');\n }\n self.orderBy = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n if (self.isComponent) {\n Object.defineProperty(self.intf, 'offsetHeight', {\n get: function () {\n return self.canvas.offsetHeight;\n },\n });\n Object.defineProperty(self.intf, 'offsetWidth', {\n get: function () {\n return self.canvas.offsetWidth;\n },\n });\n }\n Object.defineProperty(self.intf, 'scrollHeight', {\n get: function () {\n return self.scrollBox.scrollHeight;\n },\n });\n Object.defineProperty(self.intf, 'scrollWidth', {\n get: function () {\n return self.scrollBox.scrollWidth;\n },\n });\n Object.defineProperty(self.intf, 'scrollTop', {\n get: function () {\n return self.scrollBox.scrollTop;\n },\n set: function (value) {\n self.scrollBox.scrollTop = value;\n },\n });\n Object.defineProperty(self.intf, 'scrollLeft', {\n get: function () {\n return self.scrollBox.scrollLeft;\n },\n set: function (value) {\n self.scrollBox.scrollLeft = value;\n },\n });\n Object.defineProperty(self.intf, 'sizes', {\n get: function () {\n return self.sizes;\n },\n });\n Object.defineProperty(self.intf, 'parentDOMNode', {\n get: function () {\n return self.parentDOMNode;\n },\n });\n Object.defineProperty(self.intf, 'input', {\n get: function () {\n return self.input;\n },\n });\n Object.defineProperty(self.intf, 'controlInput', {\n get: function () {\n return self.controlInput;\n },\n });\n Object.defineProperty(self.intf, 'currentCell', {\n get: function () {\n return self.currentCell;\n },\n });\n Object.defineProperty(self.intf, 'visibleCells', {\n get: function () {\n return self.visibleCells;\n },\n });\n Object.defineProperty(self.intf, 'visibleRows', {\n get: function () {\n return self.visibleRows;\n },\n });\n Object.defineProperty(self.intf, 'selections', {\n get: function () {\n return self.selections;\n },\n });\n Object.defineProperty(self.intf, 'dragMode', {\n get: function () {\n return self.dragMode;\n },\n });\n Object.defineProperty(self.intf, 'changes', {\n get: function () {\n return self.changes;\n },\n });\n self.intf.formatters = self.formatters;\n Object.defineProperty(self.intf, 'dataType', {\n get: function () {\n return self.dataType;\n },\n set: function (value) {\n if (!self.parsers[value]) {\n throw new Error('No parser for MIME type ' + value);\n }\n self.dataType = value;\n },\n });\n self.eventNames.forEach(function (eventName) {\n Object.defineProperty(self.intf, 'on' + eventName, {\n get: function () {\n return self.componentL1Events[eventName];\n },\n set: function (value) {\n self.events[eventName] = [];\n self.componentL1Events[eventName] = value;\n if (!value) {\n return;\n }\n self.addEventListener(eventName, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'frozenRow', {\n get: function () {\n return self.frozenRow;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.visibleRows.length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible rows.',\n );\n }\n self.frozenRow = val;\n },\n });\n Object.defineProperty(self.intf, 'frozenColumn', {\n get: function () {\n return self.frozenColumn;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.getVisibleSchema().length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible columns.',\n );\n }\n self.frozenColumn = val;\n },\n });\n Object.defineProperty(self.intf, 'scrollIndexRect', {\n get: function () {\n return {\n top: self.scrollIndexTop,\n right: self.scrollIndexRight,\n bottom: self.scrollIndexBottom,\n left: self.scrollIndexLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'scrollPixelRect', {\n get: function () {\n return {\n top: self.scrollPixelTop,\n right: self.scrollPixelRight,\n bottom: self.scrollPixelBottom,\n left: self.scrollPixelLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'rowOrder', {\n get: function () {\n return self.orders.rows;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (!self.originalData || val.length < self.originalData.length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of rows.',\n );\n }\n self.orders.rows = val;\n },\n });\n Object.defineProperty(self.intf, 'columnOrder', {\n get: function () {\n return self.orders.columns;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (val.length < self.getSchema().length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of columns.',\n );\n }\n self.orders.columns = val;\n },\n });\n Object.defineProperty(self.intf, 'selectionBounds', {\n get: function () {\n return self.getSelectionBounds();\n },\n });\n Object.defineProperty(self.intf, 'selectedRows', {\n get: function () {\n return self.getSelectedData(true);\n },\n });\n Object.defineProperty(self.intf, 'selectedCells', {\n get: function () {\n return self.getSelectedData();\n },\n });\n Object.defineProperty(self.intf, 'visibleSchema', {\n get: function () {\n return self.getVisibleSchema().map(function eachDataRow(col) {\n return col;\n });\n },\n });\n Object.defineProperty(self.intf, 'treeGridAttributes', {\n get: function () {\n return self.treeGridAttributes;\n },\n set: function setTreeGridAttributes(value) {\n self.treeGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'cellGridAttributes', {\n get: function () {\n return self.cellGridAttributes;\n },\n set: function setCellGridAttributes(value) {\n self.cellGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'fillCellCallback', {\n get: function () {\n return self.fillCellCallback;\n },\n set: function setFillCellCallback(value) {\n self.fillCellCallback = value;\n },\n });\n Object.defineProperty(self.intf, 'ctx', {\n get: function () {\n return self.ctx;\n },\n });\n Object.defineProperty(self.intf, 'schema', {\n get: function schemaGetter() {\n return self.getSchema();\n },\n set: function schemaSetter(value) {\n if (value === undefined) {\n // Issue #89 - allow schema to be set to initialized state\n self.schema = undefined;\n self.tempSchema = undefined;\n self.dispatchEvent('schemachanged', { schema: undefined });\n return;\n }\n if (!Array.isArray(value) || typeof value[0] !== 'object') {\n throw new Error('Schema must be an array of objects.');\n }\n if (value[0].name === undefined) {\n throw new Error(\n 'Expected schema to contain an object with at least a name property.',\n );\n }\n self.schema = value.map(function eachSchemaColumn(column, index) {\n column.width = column.width || self.style.cellWidth;\n column.filter = column.filter || self.filter(column.type);\n column.type = column.type || 'string';\n column.index = index;\n column.columnIndex = index;\n column.rowIndex = -1;\n return column;\n });\n self.tempSchema = undefined;\n self.createNewRowData();\n self.createColumnOrders();\n self.tryLoadStoredSettings();\n if (\n self.storedSettings &&\n typeof self.storedSettings.visibility === 'object'\n ) {\n self.schema.forEach(function hideEachSchemaColumn(column, index) {\n if (\n self.storedSettings &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n self.resize(true);\n self.dispatchEvent('schemachanged', { schema: self.schema });\n },\n });\n /**\n * Gets an array of currently registered MIME types.\n * @memberof canvasDatagrid\n * @name getDataTypes\n * @method\n */\n self.intf.getTypes = function () {\n return Object.keys(self.parsers);\n };\n self.parseInnerHtml = function (data) {\n if (!data || /^ +$/.test(data)) {\n return [];\n }\n try {\n data = JSON.parse(data);\n } catch (e) {\n console.warn(\n Error(\n 'Cannot parse application/json+x-canvas-datagrid formated data. ' +\n e.message +\n ' \\nNote: canvas-datagrid.innerHTML is for string data only. ' +\n 'Use the canvas-datagrid.data property to set object data.',\n ),\n );\n }\n return data;\n };\n self.parsers['application/json+x-canvas-datagrid'] = function (\n data,\n callback,\n ) {\n self.parsers['application/x-canvas-datagrid'](\n self.parseInnerHtml(data),\n function (data, schema) {\n return callback(data, schema);\n },\n );\n };\n self.parsers['application/x-canvas-datagrid'] = function (data, callback) {\n return callback(data);\n };\n self.intf.parsers = self.parsers;\n // send to dataType ETL function to extract from input data\n // and transform into native [{}, {}] format\n self.etl = function (data, callback) {\n if (!self.intf.parsers[self.dataType]) {\n throw new Error('Unsupported data type.');\n }\n self.intf.parsers[self.dataType](data, function (data, schema) {\n // set the unfiltered/sorted data array\n self.originalData = data;\n self.viewData = Array.from(self.originalData);\n\n if (Array.isArray(schema)) {\n self.schema = schema;\n }\n // Issue #89 - allow schema to be auto-created every time data is set\n if (self.attributes.autoGenerateSchema) {\n self.schema = self.getSchemaFromData(data);\n }\n if (!self.schema) {\n self.tempSchema = self.getSchemaFromData(data);\n }\n if (self.getSchema()) {\n self.createColumnOrders();\n }\n // apply filter, sort, etc to incoming dataset, set viewData:\n self.refresh();\n // empty data was set\n if (!self.schema && (self.originalData || []).length === 0) {\n self.tempSchema = [{ name: '' }];\n }\n self.fitColumnToValues('cornerCell', true);\n if (\n (self.tempSchema && !self.schema) ||\n self.attributes.autoGenerateSchema\n ) {\n self.createColumnOrders();\n self.dispatchEvent('schemachanged', { schema: self.tempSchema });\n }\n callback();\n });\n };\n Object.defineProperty(self.intf, 'viewData', {\n get: function () {\n return self.viewData;\n },\n });\n Object.defineProperty(self.intf, 'boundData', {\n get: function () {\n return self.originalData;\n },\n });\n Object.defineProperty(self.intf, 'data', {\n get: function dataGetter() {\n return self.originalData;\n },\n set: function dataSetter(value) {\n self.etl(value, function () {\n self.changes = [];\n self.createNewRowData();\n if (\n self.attributes.autoResizeColumns &&\n self.originalData.length > 0 &&\n self.storedSettings === undefined\n ) {\n self.autosize();\n }\n // set the header column to fit the numbers in it\n self.fitColumnToValues('cornerCell', true);\n self.createRowOrders();\n self.tryLoadStoredSettings();\n self.dispatchEvent('datachanged', { data: self.originalData });\n self.initCellTreeSettings();\n self.resize(true);\n });\n },\n });\n self.initScrollBox = function () {\n var sHeight = 0,\n sWidth = 0,\n scrollTop = 0,\n scrollLeft = 0,\n scrollHeight = 0,\n scrollWidth = 0,\n scrollBoxHeight = 20,\n scrollBoxWidth = 20;\n function setScrollTop(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollTop value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollHeight) {\n value = scrollHeight;\n }\n if (scrollHeight < 0) {\n value = 0;\n }\n scrollTop = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n if (self.button) {\n self.moveButtonPos();\n }\n }\n function setScrollLeft(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollLeft value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollWidth) {\n value = scrollWidth;\n }\n if (scrollWidth < 0) {\n value = 0;\n }\n scrollLeft = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n if (self.button) {\n self.moveButtonPos();\n }\n }\n self.scrollBox.toString = function () {\n return (\n '{\"width\": ' +\n scrollWidth.toFixed(2) +\n ', \"height\": ' +\n scrollHeight.toFixed(2) +\n ', \"left\": ' +\n scrollLeft.toFixed(2) +\n ', \"top\": ' +\n scrollTop.toFixed(2) +\n ', \"widthRatio\": ' +\n self.scrollBox.widthBoxRatio.toFixed(5) +\n ', \"heightRatio\": ' +\n self.scrollBox.heightBoxRatio.toFixed(5) +\n '}'\n );\n };\n self.scrollBox.scrollTo = function (x, y, supressDrawEvent) {\n setScrollLeft(x, true);\n setScrollTop(y, supressDrawEvent);\n };\n Object.defineProperty(self.scrollBox, 'scrollBoxHeight', {\n get: function () {\n return scrollBoxHeight;\n },\n set: function (value) {\n scrollBoxHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollBoxWidth', {\n get: function () {\n return scrollBoxWidth;\n },\n set: function (value) {\n scrollBoxWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'height', {\n get: function () {\n return sHeight;\n },\n set: function (value) {\n sHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'width', {\n get: function () {\n return sWidth;\n },\n set: function (value) {\n sWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollTop', {\n get: function () {\n return scrollTop;\n },\n set: setScrollTop,\n });\n Object.defineProperty(self.scrollBox, 'scrollLeft', {\n get: function () {\n return scrollLeft;\n },\n set: setScrollLeft,\n });\n Object.defineProperty(self.scrollBox, 'scrollHeight', {\n get: function () {\n return scrollHeight;\n },\n set: function (value) {\n if (scrollTop > value) {\n scrollTop = Math.max(value, 0);\n }\n scrollHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollWidth', {\n get: function () {\n return scrollWidth;\n },\n set: function (value) {\n if (scrollLeft > value) {\n scrollLeft = Math.max(value, 0);\n }\n scrollWidth = value;\n },\n });\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n var zIndexTop, hoverScrollTimeout, autoCompleteContext;\n function applyContextItemStyle(contextItemContainer) {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n contextItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n });\n contextItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n }\n function createContextMenu(ev, pos, items, parentContextMenu) {\n var container = document.createElement('div'),\n upArrow = document.createElement('div'),\n downArrow = document.createElement('div'),\n children = [],\n selectedIndex = -1,\n intf = {},\n rect;\n if (!Array.isArray(items)) {\n throw new Error('createContextMenu expects an array.');\n }\n function createItems() {\n items.forEach(function (item) {\n var contextItemContainer = document.createElement('div'),\n childMenuArrow;\n function removeChildContext(e) {\n if (\n e.relatedTarget === container ||\n item.contextMenu.container === e.relatedTarget ||\n childMenuArrow === e.relatedTarget ||\n contextItemContainer === e.relatedTarget ||\n item.contextMenu.container.contains(e.relatedTarget)\n ) {\n return;\n }\n item.contextMenu.dispose();\n children.splice(children.indexOf(item.contextMenu), 1);\n item.contextMenu = undefined;\n contextItemContainer.removeEventListener(\n 'mouseout',\n removeChildContext,\n );\n container.removeEventListener('mouseout', removeChildContext);\n contextItemContainer.setAttribute('contextOpen', '0');\n contextItemContainer.setAttribute('opening', '0');\n }\n function contextAddCallback(items) {\n // check yet again if the user hasn't moved off\n if (\n contextItemContainer.getAttribute('opening') !== '1' ||\n contextItemContainer.getAttribute('contextOpen') === '1'\n ) {\n return;\n }\n var cPos = contextItemContainer.getBoundingClientRect();\n cPos = {\n left:\n cPos.left +\n self.style.childContextMenuMarginLeft +\n container.offsetWidth,\n top: cPos.top + self.style.childContextMenuMarginTop,\n bottom: cPos.bottom,\n right: cPos.right,\n };\n item.contextMenu = createContextMenu(ev, cPos, items, intf);\n contextItemContainer.setAttribute('contextOpen', '1');\n contextItemContainer.addEventListener('mouseout', removeChildContext);\n container.addEventListener('mouseout', removeChildContext);\n children.push(item.contextMenu);\n }\n function createChildContext() {\n var i;\n if (contextItemContainer.getAttribute('contextOpen') === '1') {\n return;\n }\n contextItemContainer.setAttribute('opening', '1');\n if (typeof item.items === 'function') {\n i = item.items.apply(intf, [\n function (items) {\n contextAddCallback(items);\n },\n ]);\n if (i !== undefined && Array.isArray(i)) {\n contextAddCallback(i);\n }\n return;\n }\n contextAddCallback(item.items);\n }\n function addItem(item) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n if (typeof content === 'function') {\n return addContent(content(ev));\n }\n if (typeof content === 'object') {\n contextItemContainer.appendChild(content);\n return;\n }\n applyContextItemStyle(contextItemContainer);\n contextItemContainer.innerHTML = content;\n return;\n }\n addContent(item.title);\n item.contextItemContainer = contextItemContainer;\n if (\n (item.items && item.items.length > 0) ||\n typeof item.items === 'function'\n ) {\n childMenuArrow = document.createElement('div');\n self.createInlineStyle(\n childMenuArrow,\n 'canvas-datagrid-context-child-arrow',\n );\n childMenuArrow.innerHTML = self.style.childContextMenuArrowHTML;\n contextItemContainer.appendChild(childMenuArrow);\n contextItemContainer.addEventListener(\n 'mouseover',\n createChildContext,\n );\n contextItemContainer.addEventListener('mouseout', function () {\n contextItemContainer.setAttribute('opening', '0');\n });\n }\n if (item.click) {\n contextItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n });\n }\n }\n addItem(item);\n container.appendChild(contextItemContainer);\n });\n }\n function clickIndex(idx) {\n items[idx].contextItemContainer.dispatchEvent(new Event('click'));\n }\n function checkArrowVisibility() {\n if (container.scrollTop > 0) {\n self.parentDOMNode.appendChild(upArrow);\n } else if (upArrow.parentNode) {\n upArrow.parentNode.removeChild(upArrow);\n }\n if (\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight &&\n downArrow.parentNode\n ) {\n downArrow.parentNode.removeChild(downArrow);\n } else if (\n container.scrollHeight - container.offsetHeight > 0 &&\n !(\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight\n )\n ) {\n self.parentDOMNode.appendChild(downArrow);\n }\n }\n function fade(element) {\n var opacity = 1;\n var timer = setInterval(function () {\n if (opacity <= 0.1) {\n clearInterval(timer);\n element.style.display = 'none';\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n }\n element.style.opacity = opacity;\n element.style.filter = 'alpha(opacity=' + opacity * 100 + ')';\n opacity -= opacity * 0.1;\n }, self.attributes.animationDurationHideContextMenu * 0.1);\n }\n function unfade(element) {\n var opacity = 0.1;\n element.style.display = 'block';\n var timer = setInterval(function () {\n if (opacity >= 1) {\n clearInterval(timer);\n }\n element.style.opacity = opacity;\n element.style.filter = 'alpha(opacity=' + opacity * 100 + ')';\n opacity += opacity * 0.1;\n }, self.attributes.animationDurationShowContextMenu * 0.1);\n }\n function startHoverScroll(type) {\n return function t() {\n var a = self.attributes.contextHoverScrollAmount;\n if (type === 'up' && container.scrollTop === 0) {\n return;\n }\n if (type === 'down' && container.scrollTop === container.scrollHeight) {\n return;\n }\n container.scrollTop += type === 'up' ? -a : a;\n hoverScrollTimeout = setTimeout(\n t,\n self.attributes.contextHoverScrollRateMs,\n type,\n );\n };\n }\n function endHoverScroll(type) {\n return function () {\n clearTimeout(hoverScrollTimeout);\n };\n }\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n if (zIndexTop === undefined) {\n zIndexTop = self.style.contextMenuZIndex;\n }\n createItems();\n self.createInlineStyle(\n container,\n 'canvas-datagrid-context-menu' + (self.mobile ? '-mobile' : ''),\n );\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n container.style.opacity = 0;\n container.style.position = 'absolute';\n upArrow.style.color = self.style.contextMenuArrowColor;\n downArrow.style.color = self.style.contextMenuArrowColor;\n [upArrow, downArrow].forEach(function (el) {\n el.style.textAlign = 'center';\n el.style.position = 'absolute';\n el.style.zIndex = zIndexTop + 1;\n });\n container.style.zIndex = zIndexTop;\n if (parentContextMenu && parentContextMenu.inputDropdown) {\n container.style.maxHeight =\n window.innerHeight -\n loc.y -\n self.style.autocompleteBottomMargin +\n 'px';\n container.style.minWidth = pos.width + 'px';\n loc.y += pos.height;\n }\n if (self.mobile) {\n container.style.width = pos.width + 'px';\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n container.addEventListener('scroll', checkArrowVisibility);\n container.addEventListener('wheel', function (e) {\n if (self.hasFocus) {\n container.scrollTop += e.deltaY;\n container.scrollLeft += e.deltaX;\n }\n checkArrowVisibility();\n });\n upArrow.innerHTML = self.style.contextMenuArrowUpHTML;\n downArrow.innerHTML = self.style.contextMenuArrowDownHTML;\n container.appendChild(upArrow);\n document.body.appendChild(downArrow);\n document.body.appendChild(container);\n unfade(container);\n rect = container.getBoundingClientRect();\n // TODO: fix !(parentContextMenu && parentContextMenu.inputDropdown) state (autocomplete)\n if (rect.bottom > window.innerHeight) {\n if (!(parentContextMenu && parentContextMenu.inputDropdown)) {\n loc.y -=\n rect.bottom +\n self.style.contextMenuWindowMargin -\n window.innerHeight;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n if (\n container.offsetHeight >\n window.innerHeight - self.style.contextMenuWindowMargin\n ) {\n container.style.height =\n window.innerHeight - self.style.contextMenuWindowMargin * 2 + 'px';\n }\n }\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.contextMenuWindowMargin;\n }\n if (loc.x < 0) {\n loc.x = self.style.contextMenuWindowMargin;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n rect = container.getBoundingClientRect();\n upArrow.style.top = rect.top + 'px';\n downArrow.style.top =\n rect.top + rect.height - downArrow.offsetHeight + 'px';\n upArrow.style.left = rect.left + 'px';\n downArrow.style.left = rect.left + 'px';\n downArrow.style.width = container.offsetWidth + 'px';\n upArrow.style.width = container.offsetWidth + 'px';\n downArrow.addEventListener('mouseover', startHoverScroll('down'));\n downArrow.addEventListener('mouseout', endHoverScroll('down'));\n upArrow.addEventListener('mouseover', startHoverScroll('up'));\n upArrow.addEventListener('mouseout', endHoverScroll('up'));\n checkArrowVisibility();\n }\n intf.parentGrid = self.intf;\n intf.parentContextMenu = parentContextMenu;\n intf.container = container;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n intf.upArrow = upArrow;\n intf.downArrow = downArrow;\n intf.dispose = function () {\n clearTimeout(hoverScrollTimeout);\n children.forEach(function (c) {\n c.dispose();\n });\n [downArrow, upArrow, container].forEach(function (el) {\n fade(el);\n });\n };\n Object.defineProperty(intf, 'selectedIndex', {\n get: function () {\n return selectedIndex;\n },\n set: function (value) {\n if (typeof value !== 'number' || isNaN(value || !isFinite(value))) {\n throw new Error('Context menu selected index must be a sane number.');\n }\n selectedIndex = value;\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n }\n self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n },\n });\n return intf;\n }\n function createFilterContextMenuItems(e) {\n var filterContainer = document.createElement('div'),\n filterLabel = document.createElement('div'),\n filterAutoCompleteButton = document.createElement('button'),\n filterInput = document.createElement('input'),\n n =\n e.cell && e.cell.header\n ? e.cell.header.title || e.cell.header.name\n : '',\n iRect;\n function checkRegExpErrorState() {\n filterInput.style.background = self.style.contextFilterInputBackground;\n filterInput.style.color = self.style.contextFilterInputColor;\n if (self.invalidFilterRegEx) {\n filterInput.style.background =\n self.style.contextFilterInvalidRegExpBackground;\n filterInput.style.color = self.style.contextFilterInvalidRegExpColor;\n }\n }\n function fillAutoComplete() {\n var count = 0;\n var items = {};\n var blanksItem = [];\n\n self.viewData.forEach(function (row) {\n var cellValue =\n row[e.cell.header.name] == null\n ? row[e.cell.header.name]\n : String(row[e.cell.header.name]).trim();\n var value = self.blankValues.includes(cellValue)\n ? self.attributes.blanksText\n : cellValue;\n\n if (items[value] || count > self.attributes.maxAutoCompleteItems) {\n return;\n }\n count += 1;\n items[value] = {\n title: self.formatters[e.cell.header.type || 'string']({\n cell: { value: value },\n }),\n click: function (e) {\n filterInput.value = value;\n e.stopPropagation();\n filterInput.dispatchEvent(new Event('keyup'));\n self.disposeAutocomplete();\n return;\n },\n };\n });\n\n if (Object.keys(items).indexOf(self.attributes.blanksText) !== -1) {\n blanksItem.push(items[self.attributes.blanksText]);\n delete items[self.attributes.blanksText];\n }\n\n return blanksItem.concat(\n Object.keys(items).map(function (key) {\n return items[key];\n }),\n );\n }\n\n function createAutoCompleteContext(ev) {\n if (ev && ['ArrowDown', 'ArrowUp', 'Enter', 'Tab'].includes(ev.key)) {\n return;\n }\n\n var autoCompleteItems = fillAutoComplete();\n\n iRect = filterInput.getBoundingClientRect();\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n autoCompleteContext = createContextMenu(\n e,\n {\n left: iRect.left,\n top: iRect.top,\n right: iRect.right,\n bottom: iRect.bottom,\n height: iRect.height,\n width: iRect.width,\n },\n autoCompleteItems,\n { inputDropdown: true },\n );\n autoCompleteContext.selectedIndex = 0;\n }\n self.createInlineStyle(filterLabel, 'canvas-datagrid-context-menu-label');\n self.createInlineStyle(\n filterAutoCompleteButton,\n 'canvas-datagrid-context-menu-filter-button',\n );\n self.createInlineStyle(\n filterInput,\n 'canvas-datagrid-context-menu-filter-input',\n );\n checkRegExpErrorState();\n filterInput.onclick = self.disposeAutocomplete;\n filterInput.addEventListener('keydown', function (e) {\n if (e.key === 'ArrowDown') {\n autoCompleteContext.selectedIndex += 1;\n }\n\n if (e.key === 'ArrowUp') {\n autoCompleteContext.selectedIndex -= 1;\n }\n\n if (e.key === 'Enter') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n self.disposeContextMenu();\n }\n\n if (e.key === 'Tab') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.disposeContextMenu();\n }\n });\n filterInput.addEventListener('keyup', function () {\n self.setFilter(e.cell.header.name, filterInput.value);\n });\n filterInput.addEventListener('keyup', createAutoCompleteContext);\n ['focus', 'blur', 'keydown', 'keyup', 'change'].forEach(function (en) {\n filterInput.addEventListener(en, checkRegExpErrorState);\n });\n filterInput.value = e.cell.header\n ? self.columnFilters[e.cell.header.name] || ''\n : '';\n filterLabel.innerHTML = self.attributes.filterOptionText.replace(/%s/g, n);\n filterAutoCompleteButton.onclick = function () {\n if (autoCompleteContext) {\n return self.disposeAutocomplete();\n }\n createAutoCompleteContext();\n };\n filterAutoCompleteButton.innerHTML = self.style.contextFilterButtonHTML;\n filterContainer.addEventListener('click', function (e) {\n return e.stopPropagation();\n });\n filterContainer.appendChild(filterLabel);\n filterContainer.appendChild(filterInput);\n filterContainer.appendChild(filterAutoCompleteButton);\n e.items.push({\n title: filterContainer,\n });\n if (Object.keys(self.columnFilters).length) {\n Object.keys(self.columnFilters).forEach(function (cf) {\n var h = self.getHeaderByName(cf);\n e.items.push({\n title: self.attributes.removeFilterOptionText.replace(\n /%s/g,\n h.title || h.name,\n ),\n click: function removeFilterClick(e) {\n e.preventDefault();\n self.setFilter(cf, '');\n self.controlInput.focus();\n },\n });\n });\n }\n }\n\n /**\n * Return a tuple if the user selected contiguous columns, otherwise `null`.\n * Info: Because the user may reorder the columns,\n * the schemaIndex of the first item may be greater than the schemaIndex of the second item,\n * but the columnIndex of the firs item must less than the columnIndex of the second item.\n * @param {any[]} schema from `self.getSchema()`\n * @returns {any[]} column schemas tuple (each schema has an additional field `schemaIndex`)\n */\n function getSelectedContiguousColumns(ev, schema) {\n const memoKey = '__contiguousColumns';\n if (Array.isArray(ev[memoKey]) || ev[memoKey] === null) return ev[memoKey];\n ev[memoKey] = null;\n\n if (!Array.isArray(self.selections) || self.selections.length === 0) return;\n const selection = self.selections[0];\n if (!selection || selection.length === 0) return;\n for (let rowIndex = 0; rowIndex < self.viewData.length; rowIndex++) {\n const row = self.viewData[rowIndex];\n if (!row) continue;\n const compare = self.selections[rowIndex];\n if (!compare) return;\n if (compare.length !== selection.length) return;\n for (let i = 0; i < selection.length; i++)\n if (selection[i] !== compare[i]) return;\n }\n selection.sort((a, b) => a - b);\n\n /** @type {number[][]} */\n const ranges = [];\n let begin = selection[0];\n let end = selection[0];\n for (let i = 1; i < selection.length; i++) {\n const orderIndex = selection[i];\n if (orderIndex === end + 1) {\n end = orderIndex;\n continue;\n }\n ranges.push([begin, end]);\n begin = orderIndex;\n end = orderIndex;\n }\n ranges.push([begin, end]);\n\n const currentOrderIndex = ev.cell.columnIndex;\n const matchedRange = ranges.find(\n (range) =>\n currentOrderIndex >= range[0] &&\n currentOrderIndex <= range[1] &&\n range[0] !== range[1],\n );\n if (!matchedRange) return;\n\n /** @type {number[]} orders[index] => columnIndex */\n const orders = self.orders.columns;\n if (!Array.isArray(orders)) return;\n\n const matchedSchema = matchedRange.map((orderIndex) => {\n const schemaIndex = orders[orderIndex];\n const thisSchema = schema[schemaIndex];\n return Object.assign({}, thisSchema, { orderIndex });\n });\n if (matchedSchema.findIndex((it) => !it) >= 0) return;\n return (ev[memoKey] = matchedSchema);\n }\n /**\n * @param {boolean} [allowOnlyOneRow]\n * @returns {number[]} a rowIndex tuple. It can contains one row index or two row indexes.\n */\n function getSelectedContiguousRows(allowOnlyOneRow) {\n let range = [];\n let prev = -2;\n let ok = true;\n self.selections.forEach(function (row, index) {\n if (!ok) return;\n if (prev < -1) {\n prev = index;\n range[0] = index;\n return;\n }\n if (index !== prev + 1 || !row || row.length === 0) {\n ok = false;\n return;\n }\n prev = index;\n range[1] = index;\n });\n if (ok) {\n if (range.length === 1) return allowOnlyOneRow ? range : null;\n return range;\n }\n }\n function addDefaultContextMenuItem(e) {\n const schema = self.getSchema();\n /**\n * A map between columnIndex and column data\n * @type {Map<string,any>}\n */\n let columns;\n const getColumnsMap = () => {\n if (!columns)\n columns = new Map(schema.map((_col) => [_col.columnIndex, _col]));\n return columns;\n };\n const isSorting =\n self.orderings.columns && self.orderings.columns.length > 0;\n\n const isNormalCell =\n !(\n e.cell.isBackground ||\n e.cell.isColumnHeaderCellCap ||\n e.cell.isScrollBar ||\n e.cell.isCorner ||\n e.cell.isRowHeader\n ) && e.cell.header;\n if (self.attributes.showFilter && isNormalCell) {\n createFilterContextMenuItems(e);\n }\n if (\n self.attributes.showCopy &&\n self.selections.reduce(function (p, r) {\n return p + r.length;\n }, 0) > 0\n ) {\n e.items.push({\n title: self.attributes.copyText,\n click: function () {\n document.execCommand('copy');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (self.attributes.showPaste && self.clipBoardData) {\n e.items.push({\n title: self.attributes.pasteText,\n click: function () {\n self.paste(self.clipBoardData, e.cell.columnIndex, e.cell.rowIndex);\n self.draw();\n },\n });\n }\n if (self.attributes.showColumnSelector) {\n e.items.push({\n title: self.attributes.columnSelectorText,\n items: function () {\n var d = [];\n self.getSchema().forEach(function (column) {\n function toggleColumnVisibility(e) {\n column.hidden = !column.hidden;\n self.dispatchEvent('togglecolumn', {\n column: column,\n hidden: column.hidden,\n });\n e.preventDefault();\n self.stopPropagation(e);\n self.disposeContextMenu();\n self.resize(true);\n self.setStorageData();\n }\n var el = document.createElement('div');\n applyContextItemStyle(el);\n el.addEventListener('touchstart', toggleColumnVisibility);\n el.addEventListener('click', toggleColumnVisibility);\n el.innerHTML =\n (column.hidden\n ? self.attributes.columnSelectorHiddenText\n : self.attributes.columnSelectorVisibleText) +\n (column.title || column.name);\n d.push({\n title: el,\n });\n });\n return d;\n },\n });\n if (e.cell && e.cell.header && e.cell.columnIndex > -1) {\n // This variable represents the order index because of the following codes from `draw.js`:\n // columnIndex: columnOrderIndex,\n const columnOrderIndex = e.cell.columnIndex;\n const columnIndex = self.orders.columns[columnOrderIndex];\n\n const contiguousColumns = getSelectedContiguousColumns(e, schema);\n let title = '';\n if (contiguousColumns) {\n title = contiguousColumns\n .map((col) => col.title || col.name)\n .join('-');\n } else {\n const column = schema[columnIndex];\n if (column) title = column.title || column.name;\n }\n e.items.push({\n title: self.attributes.hideColumnText.replace(/%s/gi, title),\n click: function (ev) {\n ev.preventDefault();\n self.stopPropagation(ev);\n self.disposeContextMenu();\n if (contiguousColumns) {\n self.hideColumns(\n contiguousColumns[0].orderIndex,\n contiguousColumns[1].orderIndex,\n );\n } else {\n self.hideColumns(columnOrderIndex);\n }\n },\n });\n }\n }\n if (\n self.attributes.saveAppearance &&\n self.attributes.showClearSettingsOption &&\n (Object.keys(self.sizes.rows).length > 0 ||\n Object.keys(self.sizes.columns).length > 0)\n ) {\n e.items.push({\n title: self.attributes.clearSettingsOptionText,\n click: function (e) {\n e.preventDefault();\n self.sizes.rows = {};\n self.sizes.columns = {};\n self.createRowOrders();\n self.createColumnOrders();\n self.storedSettings = undefined;\n self.dispatchEvent('resizecolumn', {\n columnWidth: self.style.cellWidth,\n });\n self.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\n });\n self.setStorageData();\n self.resize(true);\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (\n self.attributes.allowSorting &&\n self.attributes.showOrderByOption &&\n isNormalCell\n ) {\n e.items.push({\n title: self.attributes.showOrderByOptionTextAsc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'asc');\n self.controlInput.focus();\n },\n });\n e.items.push({\n title: self.attributes.showOrderByOptionTextDesc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'desc');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n\n //#region hide rows\n const canHideRows = !isSorting && e.cell.isRowHeader && e.cell.header;\n if (canHideRows) {\n const range = getSelectedContiguousRows(true);\n if (range) {\n const boundRowIndexes = range.map((viewRowIndex) =>\n self.getBoundRowIndexFromViewRowIndex(viewRowIndex),\n );\n let title;\n if (boundRowIndexes.length === 1) {\n if (typeof boundRowIndexes[0] === 'number')\n title = boundRowIndexes[0] + 1;\n else title = range[0] + 1;\n\n title = self.attributes.showHideRow.replace('%s', title);\n // hide one row\n e.items.push({\n title,\n click: function (ev) {\n ev.preventDefault();\n self.hideRows(boundRowIndexes[0], boundRowIndexes[0]);\n },\n });\n } else if (boundRowIndexes[0] <= boundRowIndexes[1]) {\n title = boundRowIndexes\n .map((it, index) => {\n if (typeof it === 'number') return it + 1;\n return range[index] + 1;\n })\n .join('-');\n title = self.attributes.showHideRows.replace('%s', title);\n // hide rows\n e.items.push({\n title,\n click: function (ev) {\n ev.preventDefault();\n self.hideRows(boundRowIndexes[0], boundRowIndexes[1]);\n },\n });\n }\n }\n }\n //#endregion hide rows\n\n //#region group/ungroup columns\n const groupAreaHeight = self.getColumnGroupAreaHeight();\n const groupAreaWidth = self.getRowGroupAreaWidth();\n const setCollapseStateForAllGroups = (allGroups, collapsed) => {\n if (allGroups.length === 0) return;\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let j = 0; j < groups.length; j++) {\n const group = groups[j];\n group.collapsed = collapsed;\n }\n }\n self.refresh();\n };\n if (e.pos && e.pos.y < groupAreaHeight) {\n e.items.push({\n title: self.attributes.showRemoveAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n self.groupedColumns = [];\n self.refresh();\n },\n });\n e.items.push({\n title: self.attributes.showExpandAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedColumns, false);\n },\n });\n e.items.push({\n title: self.attributes.showCollapseAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedColumns, true);\n },\n });\n }\n if (e.pos && e.pos.x < groupAreaWidth) {\n e.items.push({\n title: self.attributes.showRemoveAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n self.groupedRows = [];\n self.refresh();\n },\n });\n e.items.push({\n title: self.attributes.showExpandAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedRows, false);\n },\n });\n e.items.push({\n title: self.attributes.showCollapseAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedRows, true);\n },\n });\n }\n\n const canGroupByColumns =\n self.attributes.allowGroupingColumns &&\n e.cell.isColumnHeader &&\n e.cell.header &&\n e.cell.header.index > 0;\n const canUngroupColumns =\n self.attributes.allowGroupingColumns && e.cell.isColumnHeader;\n const canGroupByRows =\n !isSorting &&\n self.attributes.allowGroupingRows &&\n e.cell.isRowHeader &&\n e.cell.header;\n const canUngroupRows =\n self.attributes.allowGroupingRows && e.cell.isRowHeader;\n\n if (canGroupByColumns) {\n /** @type {number[]} */\n const groupIndexes = [];\n /** @type {number} */\n const headerIndex = e.cell.header.index;\n let col = headerIndex;\n for (; col >= 0; col--) {\n if (!self.isColumnSelected(col)) break;\n groupIndexes[0] = col;\n }\n for (col = headerIndex; ; col++) {\n if (!self.isColumnSelected(col)) break;\n groupIndexes[1] = col;\n }\n if (\n col !== headerIndex &&\n groupIndexes.length === 2 &&\n groupIndexes[1] > groupIndexes[0] &&\n self.isNewGroupRangeValid(\n self.groupedColumns,\n groupIndexes[0],\n groupIndexes[1],\n )\n ) {\n const columns = getColumnsMap();\n const groupTitles = [];\n const groupNames = [];\n for (let i = 0; i < groupIndexes.length; i++) {\n const columnIndex = groupIndexes[i];\n const column = columns.get(columnIndex);\n if (column) {\n groupNames.push(column.name);\n groupTitles.push(column.title || column.name || column.index);\n }\n }\n if (groupNames[0] && groupNames[1]) {\n // show group options\n e.items.push({\n title: self.attributes.showGroupColumns.replace(\n '%s',\n groupTitles[0] + '-' + groupTitles[1],\n ),\n click: function (ev) {\n ev.preventDefault();\n self.groupColumns(groupNames[0], groupNames[1]);\n self.controlInput.focus();\n },\n });\n }\n }\n }\n if (canUngroupColumns) {\n const columnIndex = e.cell.columnIndex;\n const groups = self.getGroupsColumnBelongsTo(columnIndex);\n const columns = getColumnsMap();\n for (let i = 0; i < groups.length; i++) {\n const { from, to } = groups[i];\n const cell0 = columns.get(from);\n const cell1 = columns.get(to);\n if (cell0 && cell1) {\n const formatArgs =\n (cell0.title || cell0.name || cell0.index) +\n '-' +\n (cell1.title || cell1.name || cell1.index);\n e.items.push({\n title: self.attributes.showRemoveGroupColumns.replace(\n '%s',\n formatArgs,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.removeGroupColumns(cell0.name, cell1.name);\n self.controlInput.focus();\n },\n });\n } else {\n console.warn(`Cannot find column ${from} or column ${to}`);\n }\n }\n }\n if (canGroupByRows) {\n const range = getSelectedContiguousRows(false) || [];\n const rangeTitle = range\n .map((rowIndex) => {\n const index = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n if (typeof index === 'number') return index + 1;\n return rowIndex + 1;\n })\n .join('-');\n if (\n range.length === 2 &&\n self.isNewGroupRangeValid(self.groupedRows, range[0], range[1])\n ) {\n e.items.push({\n title: self.attributes.showGroupRows.replace('%s', rangeTitle),\n click: function (ev) {\n ev.preventDefault();\n self.groupRows(range[0], range[1]);\n },\n });\n }\n }\n if (canUngroupRows) {\n const rowIndex = e.cell.rowIndex;\n const groups = self.getGroupsRowBelongsTo(rowIndex);\n for (let i = 0; i < groups.length; i++) {\n const { from, to } = groups[i];\n const rangeTitle = [from, to]\n .map((rowIndex) => {\n const index = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n if (typeof index === 'number') return index + 1;\n return rowIndex + 1;\n })\n .join('-');\n e.items.push({\n title: self.attributes.showRemoveGroupRows.replace('%s', rangeTitle),\n click: function (ev) {\n ev.preventDefault();\n self.removeGroupRows(from, to);\n self.controlInput.focus();\n },\n });\n }\n }\n //#endregion group/ungroup columns\n }\n self.disposeAutocomplete = function () {\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n };\n self.disposeContextMenu = function (event) {\n document.removeEventListener('click', self.disposeContextMenu);\n zIndexTop = self.style.contextMenuZIndex;\n self.disposeAutocomplete();\n if (self.contextMenu) {\n self.contextMenu.dispose();\n }\n self.contextMenu = undefined;\n if (event) {\n self.canvas.focus();\n self.mousedown(event);\n self.mouseup(event);\n }\n };\n self.contextmenuEvent = function (e, overridePos) {\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n // don't create context menu for parents if current position is located in child grid\n const children = Object.keys(self.childGrids);\n for (let i = 0; i < children.length; i++) {\n const childGrid = self.childGrids[children[i]];\n const parentNode = childGrid && childGrid.parentNode;\n if (!parentNode) continue;\n const { offsetLeft, offsetWidth, offsetTop, offsetHeight } = parentNode;\n if ((e.x >= offsetLeft && e.x <= offsetLeft + offsetWidth) === false)\n continue;\n if ((e.y >= offsetTop && e.y <= offsetTop + offsetHeight) === false)\n continue;\n return; // in child grid\n }\n // don't create context menu for child if current position is located in parent grid\n if (self.isChildGrid && self.parentNode) {\n //#region check is current child grid closed\n const childGridsOfParent = self.parentGrid && self.parentGrid.childGrids;\n if (!childGridsOfParent || !Array.isArray(childGridsOfParent)) return;\n const matchedMe = childGridsOfParent.find((grid) => {\n const nodeA = grid.parentNode;\n const nodeB = self.parentNode;\n return (\n nodeA.offsetTop == nodeB.offsetTop &&\n nodeA.offsetLeft === nodeB.offsetLeft\n );\n });\n if (!matchedMe) return;\n //#endregion\n\n let x0 = self.parentNode.offsetLeft;\n let x1 = self.parentNode.offsetLeft + self.parentNode.offsetWidth;\n let y0 = self.parentNode.offsetTop;\n let y1 = self.parentNode.offsetTop + self.parentNode.offsetHeight;\n let node = self.parentNode.parentNode;\n while (node) {\n const { offsetLeft, offsetWidth, offsetTop, offsetHeight } = node;\n if (offsetLeft > x0) x0 = offsetLeft;\n if (offsetTop > y0) y0 = offsetTop;\n const newX1 = offsetLeft + offsetWidth;\n const newY1 = offsetTop + offsetHeight;\n if (newX1 < x1) x1 = newX1;\n if (newY1 < y1) y1 = newY1;\n if (node.nodeType !== 'canvas-datagrid-tree') break;\n node = node.parentNode;\n }\n if ((e.x >= x0 && e.x <= x1 && e.y >= y0 && e.y <= y1) === false) return;\n }\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeContextMenu);\n window.removeEventListener('mouseup', createDisposeEvent);\n });\n }\n var contextPosition,\n items = [],\n pos = overridePos || self.getLayerPos(e),\n ev = {\n NativeEvent: e,\n cell: self.getCellAt(pos.x, pos.y),\n pos,\n items: items,\n };\n if (!ev.cell.isGrid) {\n addDefaultContextMenuItem(ev);\n }\n if (e.type !== 'mousedown' && self.dispatchEvent('contextmenu', ev)) {\n return;\n }\n if (!ev.cell.isGrid) {\n if (self.contextMenu) {\n self.disposeContextMenu();\n }\n contextPosition = {\n left:\n pos.x +\n pos.rect.left +\n self.style.contextMenuMarginLeft +\n self.canvasOffsetLeft,\n top:\n pos.y +\n pos.rect.top +\n self.style.contextMenuMarginTop +\n self.canvasOffsetTop,\n right: ev.cell.width + ev.cell.x + pos.rect.left,\n bottom: ev.cell.height + ev.cell.y + pos.rect.top,\n height: ev.cell.height,\n width: ev.cell.width,\n };\n if (self.mobile) {\n contextPosition.left = self.style.mobileContextMenuMargin + 'px';\n contextPosition.width =\n self.width - self.style.mobileContextMenuMargin * 2 + 'px';\n }\n if (e.type == 'mousedown') {\n contextPosition.top += self.style.filterButtonMenuOffsetTop;\n }\n self.contextMenu = createContextMenu(ev, contextPosition, items);\n if (e.type == 'mousedown') {\n window.addEventListener('mouseup', createDisposeEvent);\n } else {\n createDisposeEvent();\n }\n e.preventDefault();\n }\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n let zIndexTop;\n\n function applyButtonMenuItemStyle(buttonMenuItemContainer) {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n buttonMenuItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item:hover',\n );\n });\n buttonMenuItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item',\n );\n });\n }\n\n function applyButtonStyle(button) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper');\n button.addEventListener('mouseover', function () {\n if (!self.buttonMenu) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper:hover');\n }\n });\n button.addEventListener('mouseout', function () {\n if (!self.buttonMenu) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper');\n }\n });\n }\n\n function createButton(pos, items, imgSrc) {\n var wrapper = document.createElement('div'),\n buttonArrow = document.createElement('div'),\n buttonIcon = document.createElement('div'),\n intf = {};\n\n if (!Array.isArray(items)) {\n throw new Error('createButton expects an array.');\n }\n\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n\n if (zIndexTop === undefined) {\n zIndexTop = self.style.buttonZIndex;\n }\n\n applyButtonStyle(wrapper);\n self.createInlineStyle(buttonIcon, 'canvas-datagrid-button-icon');\n self.createInlineStyle(buttonArrow, 'canvas-datagrid-button-arrow');\n\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n wrapper.style.position = 'absolute';\n wrapper.style.zIndex = zIndexTop;\n wrapper.style.left = loc.x + 'px';\n wrapper.style.top = loc.y + 'px';\n wrapper.left = pos.left + self.scrollBox.scrollLeft;\n wrapper.top = pos.top + self.scrollBox.scrollTop;\n buttonArrow.innerHTML = self.style.buttonArrowDownHTML;\n if (imgSrc) {\n let img = document.createElement('img');\n img.setAttribute('src', imgSrc);\n img.style.maxWidth = '100%';\n img.style.height = '100%';\n buttonIcon.appendChild(img);\n }\n wrapper.appendChild(buttonIcon);\n wrapper.appendChild(buttonArrow);\n document.body.appendChild(wrapper);\n wrapper.addEventListener('click', toggleButtonMenu);\n }\n\n intf.wrapper = wrapper;\n intf.items = items;\n init();\n\n intf.dispose = function () {\n if (wrapper.parentNode) {\n wrapper.parentNode.removeChild(wrapper);\n }\n };\n return intf;\n }\n\n function toggleButtonMenu() {\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeButtonMenu);\n });\n }\n if (self.buttonMenu) {\n self.disposeButtonMenu();\n } else {\n let pos = {\n left: self.button.wrapper.left - self.scrollBox.scrollLeft,\n top:\n self.button.wrapper.top +\n self.button.wrapper.offsetHeight -\n self.scrollBox.scrollTop,\n };\n self.buttonMenu = createButtonMenu(pos, self.button.items);\n self.createInlineStyle(\n self.button.wrapper,\n 'canvas-datagrid-button-wrapper:active',\n );\n createDisposeEvent();\n }\n }\n\n function createButtonMenu(pos, items) {\n var buttonMenu = document.createElement('div'),\n selectedIndex = -1,\n intf = {},\n rect;\n\n function createItems() {\n function addItem(item, menuItemContainer) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n\n if (typeof content === 'object') {\n menuItemContainer.appendChild(content);\n return;\n }\n\n applyButtonMenuItemStyle(menuItemContainer);\n menuItemContainer.innerHTML = content;\n return;\n }\n\n addContent(item.title);\n item.buttonMenuItemContainer = menuItemContainer;\n\n if (item.click) {\n menuItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n self.disposeButton();\n });\n }\n }\n\n for (let item of items) {\n var buttonMenuItemContainer = document.createElement('div');\n addItem(item, buttonMenuItemContainer);\n buttonMenu.appendChild(buttonMenuItemContainer);\n }\n }\n\n function clickIndex(idx) {\n items[idx].buttonMenuItemContainer.dispatchEvent(new Event('click'));\n }\n\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n\n if (zIndexTop === undefined) {\n zIndexTop = self.style.buttonZIndex;\n }\n\n createItems();\n self.createInlineStyle(\n buttonMenu,\n 'canvas-datagrid-button-menu' + (self.mobile ? '-mobile' : ''),\n );\n\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n buttonMenu.style.position = 'absolute';\n buttonMenu.style.zIndex = zIndexTop;\n buttonMenu.style.left = loc.x + 'px';\n buttonMenu.style.top = loc.y + 'px';\n document.body.appendChild(buttonMenu);\n rect = buttonMenu.getBoundingClientRect();\n\n if (rect.bottom > window.innerHeight) {\n loc.y =\n self.button.wrapper.top -\n buttonMenu.offsetHeight -\n self.scrollBox.scrollTop;\n if (loc.y < 0) {\n loc.y = self.style.buttonMenuWindowMargin;\n }\n\n if (\n buttonMenu.offsetHeight >\n window.innerHeight - self.style.buttonMenuWindowMargin\n ) {\n buttonMenu.style.height =\n window.innerHeight - self.style.buttonMenuWindowMargin * 2 + 'px';\n }\n }\n\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.buttonMenuWindowMargin;\n }\n\n if (loc.x < 0) {\n loc.x = self.style.buttonMenuWindowMargin;\n }\n\n if (loc.y < 0) {\n loc.y = self.style.buttonMenuWindowMargin;\n }\n\n buttonMenu.style.left = loc.x + 'px';\n buttonMenu.style.top = loc.y + 'px';\n }\n\n intf.buttonMenu = buttonMenu;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n\n intf.dispose = function () {\n if (buttonMenu.parentNode) {\n buttonMenu.parentNode.removeChild(buttonMenu);\n }\n };\n\n Object.defineProperty(intf, 'selectedIndex', {\n get: function get() {\n return selectedIndex;\n },\n set: function set(value) {\n if (typeof value !== 'number' || isNaN(value) || !isFinite(value)) {\n throw new Error('Button menu selected index must be a sane number.');\n }\n\n selectedIndex = value;\n\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item:hover',\n );\n }\n\n self.createInlineStyle(\n item.buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item',\n );\n });\n },\n });\n return intf;\n }\n\n self.disposeButtonMenu = function () {\n if (self.buttonMenu) {\n document.removeEventListener('click', self.disposeButtonMenu);\n self.buttonMenu.dispose();\n self.buttonMenu = undefined;\n self.createInlineStyle(\n self.button.wrapper,\n 'canvas-datagrid-button-wrapper:hover',\n );\n }\n };\n\n self.disposeButton = function (e) {\n if (e && e.keyCode !== 27) return;\n document.removeEventListener('keydown', self.disposeButton);\n zIndexTop = self.style.buttonZIndex;\n self.disposeButtonMenu();\n\n if (self.button) {\n self.button.dispose();\n }\n\n self.button = undefined;\n };\n\n self.moveButtonPos = function () {\n self.button.wrapper.style.left =\n self.button.wrapper.left - self.scrollBox.scrollLeft + 'px';\n self.button.wrapper.style.top =\n self.button.wrapper.top - self.scrollBox.scrollTop + 'px';\n self.disposeButtonMenu();\n };\n\n self.attachButton = function (pos, items, imgSrc) {\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('keydown', self.disposeButton);\n });\n }\n\n if (self.button) {\n self.disposeButton();\n }\n\n self.button = createButton(pos, items, imgSrc);\n createDisposeEvent();\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n self.getClippingRect = function (ele) {\n var boundingRect = self.position(self.parentNode),\n eleRect = self.position(ele),\n s = self.scrollOffset(self.canvas),\n clipRect = {\n x: 0,\n y: 0,\n h: 0,\n w: 0,\n },\n parentRect = {\n x: -Infinity,\n y: -Infinity,\n h: Infinity,\n w: Infinity,\n },\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n boundingRect.top -= s.top;\n boundingRect.left -= s.left;\n eleRect.top -= s.top;\n eleRect.left -= s.left;\n clipRect.h =\n boundingRect.top +\n boundingRect.height -\n ele.offsetTop -\n self.style.scrollBarWidth;\n clipRect.w =\n boundingRect.left +\n boundingRect.width -\n ele.offsetLeft -\n self.style.scrollBarWidth;\n clipRect.x = boundingRect.left + eleRect.left * -1 + rowHeaderCellWidth;\n clipRect.y = boundingRect.top + eleRect.top * -1 + columnHeaderCellHeight;\n return {\n x: clipRect.x > parentRect.x ? clipRect.x : parentRect.x,\n y: clipRect.y > parentRect.y ? clipRect.y : parentRect.y,\n h: clipRect.h < parentRect.h ? clipRect.h : parentRect.h,\n w: clipRect.w < parentRect.w ? clipRect.w : parentRect.w,\n };\n };\n self.clipElement = function (ele) {\n var clipRect = self.getClippingRect(ele);\n if (clipRect.w < 0) {\n clipRect.w = 0;\n }\n if (clipRect.h < 0) {\n clipRect.h = 0;\n }\n ele.style.clip =\n 'rect(' +\n clipRect.y +\n 'px,' +\n clipRect.w +\n 'px,' +\n clipRect.h +\n 'px,' +\n clipRect.x +\n 'px' +\n ')';\n // INFO https://developer.mozilla.org/en-US/docs/Web/CSS/clip\n // clip has been \"deprecated\" for clipPath. Of course nothing but chrome\n // supports clip path, so we'll keep using clip until someday clipPath becomes\n // more widely support. The code below works correctly, but setting clipPath and clip\n // at the same time has undesirable results.\n // ele.style.clipPath = 'polygon('\n // + clipRect.x + 'px ' + clipRect.y + 'px,'\n // + clipRect.x + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.y + 'px'\n // + ')';\n };\n self.scrollOffset = function (e) {\n var x = 0,\n y = 0,\n scrollingElement = document.scrollingElement || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n while (\n e.parentNode &&\n e.nodeName !== 'CANVAS-DATAGRID' &&\n e !== self.intf\n ) {\n if (\n e.nodeType !== 'canvas-datagrid-tree' &&\n e.nodeType !== 'canvas-datagrid-cell'\n ) {\n x -= e.scrollLeft;\n y -= e.scrollTop;\n }\n e = e.parentNode;\n }\n return {\n left: x - scrollingElement.scrollLeft,\n top: y - scrollingElement.scrollTop,\n };\n };\n self.resizeEditInput = function () {\n if (self.input && self.input.editCell) {\n var pos = self.canvas.getBoundingClientRect(),\n s = self.scrollOffset(self.intf),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n borderWidth = self.style.cellBorderWidth * bm,\n cell = self.getVisibleCellByIndex(\n self.input.editCell.columnIndex,\n self.input.editCell.rowIndex,\n ) || { x: -100, y: -100, height: 0, width: 0 };\n if (self.mobile) {\n self.input.style.left = '0';\n self.input.style.top =\n self.height -\n self.style.mobileEditInputHeight -\n borderWidth -\n 1 +\n 'px';\n self.input.style.height = self.style.mobileEditInputHeight + 'px';\n self.input.style.width = self.width - borderWidth - 1 + 'px';\n return;\n }\n let groupAreaOffsetY = self.getColumnGroupAreaHeight();\n let groupAreaOffsetX = self.getRowGroupAreaWidth();\n if (self.parentNode) {\n const { columnGroupsAreaHeight, rowGroupsAreaWidth } = self.parentNode;\n if (columnGroupsAreaHeight) groupAreaOffsetY += columnGroupsAreaHeight;\n if (rowGroupsAreaWidth) groupAreaOffsetX += rowGroupsAreaWidth;\n }\n self.input.style.left =\n pos.left +\n cell.x +\n self.canvasOffsetLeft -\n s.left +\n groupAreaOffsetX +\n 'px';\n self.input.style.top =\n pos.top +\n cell.y -\n self.style.cellBorderWidth +\n self.canvasOffsetTop -\n s.top +\n groupAreaOffsetY +\n 'px';\n self.input.style.height = cell.height - borderWidth + 'px';\n self.input.style.width = cell.width - self.style.cellPaddingLeft + 'px';\n self.clipElement(self.input);\n }\n };\n self.position = function (e, ignoreScrollOffset) {\n var x = 0,\n y = 0,\n s = e,\n h,\n w;\n let calculatedTree = false;\n while (e.offsetParent && e.nodeName !== 'CANVAS-DATAGRID') {\n const isTree = e.nodeType === 'canvas-datagrid-tree';\n if (!isTree || !calculatedTree) {\n x += e.offsetLeft;\n y += e.offsetTop;\n h = e.offsetHeight;\n w = e.offsetWidth;\n }\n if (isTree) calculatedTree = true;\n e = e.offsetParent;\n }\n if (ignoreScrollOffset) {\n return { left: x, top: y, height: h, width: w };\n }\n e = s;\n s = self.scrollOffset(e);\n return { left: x + s.left, top: y + s.top, height: h, width: w };\n };\n self.getLayerPos = function (e) {\n var rect = self.canvas.getBoundingClientRect(),\n pos = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n if (self.isChildGrid) {\n pos.x -= self.canvasOffsetLeft;\n pos.y -= self.canvasOffsetTop;\n if (self.parentNode.rowGroupsAreaWidth)\n pos.x -= self.parentNode.rowGroupsAreaWidth;\n if (self.parentNode.columnGroupsAreaHeight)\n pos.y -= self.parentNode.columnGroupsAreaHeight;\n }\n return {\n x: pos.x,\n y: pos.y,\n rect: rect,\n };\n };\n /**\n * Ends editing, optionally aborting the edit.\n * @memberof canvasDatagrid\n * @name endEdit\n * @method\n * @param {boolean} abort When true, abort the edit.\n */\n self.endEdit = function (abort) {\n var cell = self.input.editCell,\n y = cell.rowIndex;\n function abortEdit() {\n abort = true;\n }\n if (\n self.dispatchEvent('beforeendedit', {\n cell: cell,\n newValue: self.input.value,\n oldValue: cell.value,\n abort: abortEdit,\n input: self.input,\n })\n ) {\n return false;\n }\n if (self.input.value !== cell.value && !abort) {\n self.changes[y] = self.changes[y] || {};\n self.changes[y][cell.header.name] = self.input.value;\n if (!cell.data) {\n self.originalData[cell.boundRowIndex] = {};\n cell.data = self.originalData[cell.boundRowIndex];\n }\n cell.data[cell.header.name] = self.input.value;\n if (y === self.viewData.length) {\n if (\n self.dispatchEvent('newrow', {\n value: self.input.value,\n defaultValue: cell.value,\n aborted: abort,\n cell: cell,\n input: self.input,\n })\n ) {\n return false;\n }\n self.addRow(cell.data);\n self.createNewRowData();\n }\n self.draw(true);\n }\n if (self.input.parentNode) {\n self.input.parentNode.removeChild(self.input);\n }\n self.intf.focus();\n self.dispatchEvent('endedit', {\n cell: cell,\n value: self.input.value,\n aborted: abort,\n input: self.input,\n });\n self.input = undefined;\n return true;\n };\n /**\n * Begins editing at cell x, row y.\n * @memberof canvasDatagrid\n * @name beginEditAt\n * @method\n * @param {number} x The column index of the cell to edit.\n * @param {number} y The row index of the cell to edit.\n * @param {boolean} inEnterMode If true, starting to type in cell will replace the\n * cell's previous value instead of appending, and using the arrow keys will allow\n * the user to navigate to adjacent cells instead of moving the text cursor around\n * (default is false, and means user is in 'edit' mode).\n */\n self.beginEditAt = function (x, y, NativeEvent, inEnterMode = false) {\n if (!self.attributes.editable) {\n return;\n }\n if (self.input) {\n self.endEdit();\n }\n var cell = self.getVisibleCellByIndex(x, y),\n s = self.getSchema(),\n adjacentCells,\n enumItems,\n enu,\n option,\n valueInEnum;\n if (!(cell && cell.header)) {\n return;\n }\n //HACK for IE10, does not like literal enum\n enu = cell.header['enum'];\n if (\n self.dispatchEvent('beforebeginedit', {\n cell: cell,\n NativeEvent: NativeEvent,\n })\n ) {\n return false;\n }\n self.scrollIntoView(x, y);\n self.setActiveCell(x, y);\n adjacentCells = self.getAdjacentCells();\n if (enu) {\n self.input = document.createElement('select');\n } else {\n self.input = document.createElement(\n self.attributes.multiLine ? 'textarea' : 'input',\n );\n }\n cell = self.getVisibleCellByIndex(x, y);\n //HACK on mobile devices sometimes edit can begin without the cell being in view, I don't know how.\n if (!cell) {\n return;\n }\n if (enu) {\n // add enums\n if (typeof enu === 'function') {\n enumItems = enu.apply(self.intf, [{ cell: cell }]);\n } else if (Array.isArray(enu)) {\n enumItems = enu;\n }\n enumItems.forEach(function (e) {\n var i = document.createElement('option'),\n val,\n title;\n if (Array.isArray(e)) {\n val = e[0];\n title = e[1];\n } else {\n val = e;\n title = e;\n }\n if (val === cell.value) {\n valueInEnum = true;\n }\n i.value = val;\n i.innerHTML = title;\n self.input.appendChild(i);\n });\n if (!valueInEnum) {\n option = document.createElement('option');\n option.value = cell.value;\n option.innerHTML = cell.value;\n self.input.appendChild(option);\n }\n self.input.addEventListener('change', function () {\n self.endEdit();\n self.draw(true);\n });\n }\n // if the user has not prevented the default action, append to the body\n if (\n !self.dispatchEvent('appendeditinput', { cell: cell, input: self.input })\n ) {\n document.body.appendChild(self.input);\n }\n self.createInlineStyle(\n self.input,\n self.mobile\n ? 'canvas-datagrid-edit-mobile-input'\n : 'canvas-datagrid-edit-input',\n );\n self.input.style.position = 'absolute';\n self.input.editCell = cell;\n self.resizeEditInput();\n self.input.style.zIndex = self.style.editCellZIndex;\n self.input.style.fontSize =\n parseInt(self.style.editCellFontSize, 10) * self.scale + 'px';\n\n var cellValueIsEmpty = [null, undefined].indexOf(cell.value) !== -1;\n var shouldClearCellValue = cellValueIsEmpty || inEnterMode;\n\n self.input.value = shouldClearCellValue ? '' : cell.value;\n let width = Math.round(\n self.input.value.length *\n parseInt(self.style.editCellFontSize, 10) *\n 0.7 *\n self.scale,\n );\n if (width + self.style.cellPaddingLeft < cell.width) {\n width = cell.width - self.style.cellPaddingLeft;\n } else if (width > self.width - cell.x - self.style.scrollBarWidth) {\n width = self.width - cell.x - self.style.scrollBarWidth;\n self.input.style.height = 'auto';\n }\n self.input.style.width = width + 'px';\n self.input.focus();\n self.input.addEventListener('click', self.stopPropagation);\n self.input.addEventListener('dblclick', self.stopPropagation);\n self.input.addEventListener('mouseup', self.stopPropagation);\n self.input.addEventListener('mousedown', self.stopPropagation);\n self.input.addEventListener('keydown', function (e) {\n var nx = cell.columnIndex,\n ny = cell.rowIndex;\n\n if (e.key === 'Escape') {\n self.endEdit(true); // end edit and abort the value change\n self.draw(true);\n } else if (e.key === 'Enter' && self.attributes.multiLine && e.altKey) {\n self.input.value = self.input.value + '\\n';\n self.input.scrollTop = self.input.scrollHeight;\n } else if (e.key === 'Enter') {\n self.endEdit();\n\n // Move to cell in next or previous row\n var nextRowIndex = e.shiftKey\n ? Math.max(0, ny - 1)\n : Math.min(ny + 1, self.viewData.length - 1);\n\n if (nextRowIndex !== ny) {\n self.scrollIntoView(nx, nextRowIndex);\n self.setActiveCell(nx, nextRowIndex);\n }\n\n self.draw(true);\n } else if (\n ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key) &&\n inEnterMode\n ) {\n switch (e.key) {\n case 'ArrowUp':\n ny = Math.max(0, ny - 1);\n break;\n case 'ArrowDown':\n ny = Math.min(ny + 1, self.viewData.length - 1);\n break;\n case 'ArrowLeft':\n nx = Math.max(nx - 1, 0);\n break;\n case 'ArrowRight':\n nx = adjacentCells.right;\n break;\n }\n\n self.endEdit();\n\n self.scrollIntoView(nx, ny);\n self.setActiveCell(nx, ny);\n\n self.draw(true);\n } else if (e.key === 'Tab') {\n e.preventDefault();\n if (!self.endEdit()) {\n return;\n }\n if (e.shiftKey) {\n nx = adjacentCells.left;\n } else {\n nx = adjacentCells.right;\n }\n if (adjacentCells.left === x && e.shiftKey) {\n nx = adjacentCells.last;\n ny -= 1;\n }\n if (adjacentCells.right === x && !e.shiftKey) {\n nx = adjacentCells.first;\n ny += 1;\n }\n if (ny < 0) {\n ny = self.viewData.length - 1;\n }\n if (ny > self.viewData.length - 1) {\n ny = 0;\n }\n self.scrollIntoView(nx, ny);\n self.beginEditAt(nx, ny, e);\n } else {\n let width = Math.round(\n self.input.value.length *\n parseInt(self.style.editCellFontSize, 10) *\n 0.7 *\n self.scale,\n );\n if (width + self.style.cellPaddingLeft < cell.width) {\n width = cell.width - self.style.cellPaddingLeft;\n } else if (width > self.width - cell.x - self.style.scrollBarWidth) {\n width = self.width - cell.x - self.style.scrollBarWidth;\n self.input.style.height = 'auto';\n }\n self.input.style.width = width + 'px';\n }\n });\n\n self.dispatchEvent('beginedit', { cell: cell, input: self.input });\n };\n self.createInlineStyle = function (el, className) {\n var css = {\n 'canvas-datagrid-button-wrapper': {\n display: 'inline-block',\n padding: self.style.buttonPadding,\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: self.style.buttonBorderColor,\n cursor: 'pointer',\n background: self.style.buttonBackgroundColor,\n userSelect: 'none',\n },\n 'canvas-datagrid-button-wrapper:hover': {\n borderColor: self.style.buttonBorderColor,\n background: self.style.buttonHoverBackgroundColor,\n },\n 'canvas-datagrid-button-wrapper:active': {\n borderColor: self.style.buttonActiveBorderColor,\n background: self.style.buttonActiveBackgroundColor,\n },\n 'canvas-datagrid-button-icon': {\n width: '18px',\n height: '18px',\n display: 'inline-block',\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-arrow': {\n display: 'inline-block',\n color: self.style.buttonArrowColor,\n fontSize: '9px',\n },\n 'canvas-datagrid-button-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-button-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-button-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-button-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-context-menu-filter-input': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextFilterInputBackground,\n color: self.style.contextFilterInputColor,\n border: self.style.contextFilterInputBorder,\n borderRadius: self.style.contextFilterInputBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextFilterInputFontFamily,\n fontSize: self.style.contextFilterInputFontSize,\n },\n 'canvas-datagrid-context-menu-filter-button': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextFilterButtonBorder,\n borderRadius: self.style.contextFilterButtonBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFilterButtonFontFamily,\n fontSize: self.style.contextMenuFilterButtonFontSize,\n },\n 'canvas-datagrid-context-child-arrow': {\n cssFloat: 'right',\n color: self.style.childContextMenuArrowColor,\n fontSize: self.style.contextMenuChildArrowFontSize,\n fontFamily: self.style.contextMenuFontFamily,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-autocomplete': {\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n position: 'absolute',\n zIndex: 9999,\n overflow: 'hidden',\n },\n 'canvas-datagrid-autocomplete-item': {\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n },\n 'canvas-datagrid-autocomplete-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-canvas': {\n position: 'absolute',\n zIndex: '-1',\n },\n 'canvas-datagrid': {\n display: 'block',\n },\n 'canvas-datagrid-control-input': {\n position: 'fixed',\n top: '-5px',\n left: '-5px',\n border: 'none',\n opacity: '0',\n cursor: 'pointer',\n width: '1px',\n height: '1px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n },\n 'canvas-datagrid-edit-mobile-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 0',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.mobileEditFontFamily,\n fontSize: self.style.mobileEditFontSize,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-edit-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 ' + self.style.editCellPaddingLeft + 'px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.editCellFontFamily,\n fontSize: self.style.editCellFontSize,\n boxShadow: self.style.editCellBoxShadow,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-context-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-context-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-context-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-context-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-invalid-search-regExp': {\n background: self.style.contextMenuFilterInvalidExpresion,\n },\n };\n if (css[className]) {\n Object.keys(css[className]).map(function (prop) {\n el.style[prop] = css[className][prop];\n });\n }\n return;\n };\n self.appendTo = function (e) {\n self.parentNode = e;\n self.setDom();\n };\n self.setDom = function () {\n if (self.isChildGrid) {\n self.parentGrid = self.parentNode.parentGrid;\n self.ctx = self.parentGrid.context;\n self.canvas = self.parentGrid.canvas;\n self.controlInput = self.parentGrid.controlInput;\n self.eventParent = self.canvas;\n } else {\n self.controlInput = self.controlInput || document.createElement('input');\n self.controlInput.onblur = self.intf.blur;\n self.createInlineStyle(\n self.controlInput,\n 'canvas-datagrid-control-input',\n );\n self.isChildGrid = false;\n self.parentDOMNode = self.parentNode;\n self.parentIsCanvas = /^canvas$/i.test(self.parentDOMNode.tagName);\n if (self.parentIsCanvas) {\n self.canvas = self.parentDOMNode;\n } else {\n self.canvas = document.createElement('canvas');\n self.parentDOMNode.appendChild(self.canvas);\n }\n document.body.appendChild(self.controlInput);\n self.createInlineStyle(self.canvas, 'canvas-datagrid');\n self.ctx = self.canvas.getContext('2d');\n self.ctx.textBaseline = 'alphabetic';\n self.eventParent = self.canvas;\n }\n self.parentNodeStyle = self.canvas.style;\n self.controlInput.setAttribute('readonly', true);\n self.controlInput.addEventListener('blur', function (e) {\n if (e.target !== self.canvas) {\n self.hasFocus = false;\n }\n });\n self.eventParent.addEventListener('scroll', self.resize, false);\n self.eventParent.addEventListener('touchstart', self.touchstart, false);\n self.eventParent.addEventListener('mousedown', self.mousedown, false);\n self.eventParent.addEventListener('dblclick', self.dblclick, false);\n self.eventParent.addEventListener('click', self.click, false);\n window.addEventListener('mouseup', self.mouseup, false);\n window.addEventListener('mousemove', self.mousemove);\n self[self.isChildGrid ? 'parentGrid' : 'eventParent'].addEventListener(\n 'wheel',\n self.scrollWheel,\n false,\n );\n self.canvas.addEventListener('contextmenu', self.contextmenuEvent, false);\n self.controlInput.addEventListener('copy', self.copy);\n self.controlInput.addEventListener('cut', self.cut);\n self.controlInput.addEventListener('paste', self.paste);\n self.controlInput.addEventListener('keypress', self.keypress, false);\n self.controlInput.addEventListener('keyup', self.keyup, false);\n self.controlInput.addEventListener('keydown', self.keydown, false);\n window.addEventListener('resize', self.resize);\n };\n}\n","'use strict';\n\n/**\n * Merge a new hidden row range into existed ranges array\n * @param {any[]} hiddenRowRanges tuples: Array<[bgeinRowIndex, endRowIndex]>\n * @param {number[]} newRange tuple: [beginRowIndex, endRowIndex]\n * @returns {boolean}\n */\nconst mergeHiddenRowRanges = function (hiddenRowRanges, newRange) {\n const [beginRowIndex, endRowIndex] = newRange;\n if (endRowIndex < beginRowIndex) return false;\n let inserted = false;\n for (let i = 0; i < hiddenRowRanges.length; i++) {\n const range = hiddenRowRanges[i];\n if (beginRowIndex > range[1] + 1) continue;\n if (beginRowIndex <= range[0] && endRowIndex >= range[0]) {\n hiddenRowRanges[i] = [beginRowIndex, Math.max(endRowIndex, range[1])];\n inserted = true;\n break;\n }\n if (beginRowIndex >= range[0]) {\n hiddenRowRanges[i] = [range[0], Math.max(endRowIndex, range[1])];\n inserted = true;\n break;\n }\n }\n if (!inserted) hiddenRowRanges.push([beginRowIndex, endRowIndex]);\n // merge intersections after sorting ranges\n hiddenRowRanges.sort((a, b) => a[0] - b[0]);\n for (let i = 0; i < hiddenRowRanges.length - 1; i++) {\n const range = hiddenRowRanges[i];\n const nextRange = hiddenRowRanges[i + 1];\n if (nextRange[0] <= range[1] + 1) {\n hiddenRowRanges[i] = [range[0], Math.max(range[1], nextRange[1])];\n hiddenRowRanges.splice(i + 1, 1);\n i--;\n }\n }\n return true;\n};\n\nexport { mergeHiddenRowRanges };\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport { mergeHiddenRowRanges } from './groups/util';\n\nexport default function (self) {\n /**\n * Converts a integer into a letter A - ZZZZZ...\n * @memberof canvasDatagrid\n * @name integerToAlpha\n * @method\n * @param {column} n The number to convert.\n */\n self.integerToAlpha = function (n) {\n var ordA = 'a'.charCodeAt(0),\n ordZ = 'z'.charCodeAt(0),\n len = ordZ - ordA + 1,\n s = '';\n while (n >= 0) {\n s = String.fromCharCode((n % len) + ordA) + s;\n n = Math.floor(n / len) - 1;\n }\n return s;\n };\n /**\n * Inserts a new column before the specified index into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name insertColumn\n * @method\n * @param {column} c The column to insert into the schema.\n * @param {number} index The index of the column to insert before.\n */\n self.insertColumn = function (c, index) {\n var s = self.getSchema();\n if (s.length < index) {\n throw new Error('Index is beyond the length of the schema.');\n }\n self.validateColumn(c, s);\n s.splice(index, 0, c);\n\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a column from the schema at the specified index.\n * @memberof canvasDatagrid\n * @name deleteColumn\n * @tutorial schema\n * @method\n * @param {number} index The index of the column to delete.\n */\n self.deleteColumn = function (index) {\n var schema = self.getSchema();\n\n // remove data matching this column name from data\n self.originalData.forEach(function (row) {\n delete row[schema[index].name];\n });\n\n schema.splice(index, 1);\n self.intf.schema = schema;\n\n self.refresh();\n };\n /**\n * Adds a new column into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name addColumn\n * @method\n * @param {column} c The column to add to the schema.\n */\n self.addColumn = function (c) {\n var s = self.getSchema();\n self.validateColumn(c, s);\n s.push(c);\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a row from the dataset at the specified index.\n * @memberof canvasDatagrid\n * @name deleteRow\n * @method\n * @param {number} index The index of the row to delete.\n */\n self.deleteRow = function (index) {\n self.originalData.splice(index, 1);\n self.setFilter();\n self.resize(true);\n };\n /**\n * Inserts a new row into the dataset before the specified index.\n * @memberof canvasDatagrid\n * @name insertRow\n * @method\n * @param {object} d data.\n * @param {number} index The index of the row to insert before.\n */\n self.insertRow = function (d, index) {\n if (self.originalData.length < index) {\n throw new Error('Index is beyond the length of the dataset.');\n }\n self.originalData.splice(index, 0, d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(self.originalData[index], c, index);\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Adds a new row into the dataset.\n * @memberof canvasDatagrid\n * @name addRow\n * @method\n * @param {object} d data.\n */\n self.addRow = function (d) {\n self.originalData.push(d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(\n self.originalData[self.originalData.length - 1],\n c,\n self.originalData.length - 1,\n );\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Sets the height of a given row by index number.\n * @memberof canvasDatagrid\n * @name setRowHeight\n * @method\n * @param {number} rowIndex The index of the row to set.\n * @param {number} height Height to set the row to.\n */\n self.setRowHeight = function (rowIndex, height) {\n self.sizes.rows[rowIndex] = height;\n self.draw(true);\n };\n /**\n * Sets the width of a given column by index number.\n * @memberof canvasDatagrid\n * @name setColumnWidth\n * @method\n * @param {number} colIndex The index of the column to set.\n * @param {number} width Width to set the column to.\n */\n self.setColumnWidth = function (colIndex, width) {\n self.sizes.columns[colIndex] = width;\n self.draw(true);\n };\n /**\n * Removes any changes to the width of the columns due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetColumnWidths\n * @tutorial schema\n * @method\n */\n self.resetColumnWidths = function () {\n self.sizes.columns = {};\n self.draw(true);\n };\n /**\n * Removes any changes to the height of the rows due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetRowHeights\n * @tutorial schema\n * @method\n */\n self.resetRowHeights = function () {\n self.sizes.rows = {};\n self.draw(true);\n };\n /**\n * Sets the value of the filter.\n * @memberof canvasDatagrid\n * @name setFilter\n * @method\n * @param {string} column Name of the column to filter.\n * @param {string} value The value to filter for.\n */\n self.setFilter = function (column, value) {\n if (column === undefined && value === undefined) {\n self.columnFilters = {};\n } else if (column && (value === '' || value === undefined)) {\n delete self.columnFilters[column];\n } else {\n self.columnFilters[column] = value;\n if (self.attributes.showFilterInCell) {\n self.filterable.rows.push(0);\n self.orders.columns.forEach(function (value, index) {\n self.filterable.columns.push(index);\n });\n }\n }\n if (!Object.keys(self.columnFilters).length) {\n self.filterable = {\n rows: [],\n columns: [],\n };\n }\n self.refresh();\n };\n /**\n * Returns the number of pixels to scroll down to line up with row rowIndex.\n * @memberof canvasDatagrid\n * @name findRowScrollTop\n * @method\n * @param {number} rowIndex The row index of the row to scroll find.\n */\n self.findRowScrollTop = function (rowIndex) {\n if (self.scrollCache.y[rowIndex] === undefined) {\n throw new RangeError(\n `Row index ${rowIndex} out of range: ${self.scrollCache.y.length}.`,\n );\n }\n return self.scrollCache.y[rowIndex];\n };\n /**\n * Returns the number of pixels to scroll to the left to line up with column columnIndex.\n * @memberof canvasDatagrid\n * @name findColumnScrollLeft\n * @method\n * @param {number} columnIndex The column index of the column to find.\n */\n self.findColumnScrollLeft = function (columnIndex) {\n var i = Math.max(columnIndex - 1, 0);\n if (self.scrollCache.x[i] === undefined) {\n throw new Error('Column index out of range.');\n }\n return (\n self.scrollCache.x[i] -\n self.getColumnWidth(self.orders.columns[columnIndex])\n );\n };\n /**\n * Scrolls to the cell at columnIndex x, and rowIndex y. If you define both rowIndex and columnIndex additional calculations can be made to center the cell using the target cell's height and width. Defining only one rowIndex or only columnIndex will result in simpler calculations.\n * @memberof canvasDatagrid\n * @name gotoCell\n * @method\n * @param {number} x The column index of the cell to scroll to.\n * @param {number} y The row index of the cell to scroll to.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.gotoCell = function (x, y, offsetX, offsetY) {\n var targetX = x === undefined ? undefined : self.findColumnScrollLeft(x),\n targetY = y === undefined ? undefined : self.findRowScrollTop(y),\n cell,\n sbw =\n self.scrollBox.width -\n (self.scrollBox.verticalBarVisible ? self.style.scrollBarWidth : 0),\n sbh =\n self.scrollBox.height -\n (self.scrollBox.horizontalBarVisible ? self.style.scrollBarWidth : 0);\n offsetX = offsetX === undefined ? 0 : offsetX;\n offsetY = offsetY === undefined ? 0 : offsetY;\n targetX -= sbw * offsetX;\n targetY -= sbh * offsetY;\n if (x !== undefined && y !== undefined) {\n self.scrollBox.scrollTo(targetX, targetY);\n requestAnimationFrame(function () {\n cell = self.getVisibleCellByIndex(x, y);\n // HACK: just don't offset if the target cell cannot be seen\n // TODO: offset does not work on very small grids, not sure why\n if (!cell) {\n return;\n }\n targetX += cell.width * offsetX;\n targetY += cell.height * offsetY;\n self.scrollBox.scrollTo(targetX, targetY);\n });\n } else if (x !== undefined) {\n self.scrollBox.scrollLeft = targetX;\n } else if (y !== undefined) {\n self.scrollBox.scrollTop = targetY;\n }\n };\n /**\n * Scrolls the row y.\n * @memberof canvasDatagrid\n * @name gotoRow\n * @method\n * @param {number} y The row index of the cell to scroll to.\n */\n self.gotoRow = function (y) {\n self.gotoCell(0, y);\n };\n /**\n * Add a button into the cell.\n * @memberof canvasDatagrid\n * @name addButton\n * @method\n * @param {number} columnIndex The column index of the cell to to add a button.\n * @param {number} rowIndex The row index of the cell to to add a button.\n * @param {object} offset Offset how far go away from cell.\n * @param {object} items a list of items to add into button menu.\n * @param {string} imgSrc icon path to add into button.\n */\n self.addButton = function (columnIndex, rowIndex, offset, items, imgSrc) {\n var cells = self.visibleCells.filter(function (c) {\n return c.sortColumnIndex === columnIndex && c.sortRowIndex === rowIndex;\n });\n\n self.attachButton(\n {\n top: cells[0].y + cells[0].height + offset.y,\n left: cells[0].x + cells[0].width + offset.x,\n },\n items,\n imgSrc,\n );\n };\n\n /**\n * Expand/Collapse CellTree.\n * @memberof canvasDatagrid\n * @name toggleCellCollapseTree\n * @method\n * @param {array} treeData The array of cellTree to expand or collapse.\n */\n\n self.toggleCellCollapseTree = function (treeData) {\n for (let type in treeData) {\n for (let t of treeData[type])\n if (t.length > 0) self.toggleCollapseTree(t[0], t[1], type);\n }\n self.draw();\n };\n\n /**\n * Expand/Collapse CellTree.\n * @memberof canvasDatagrid\n * @name expandCollapseCellTree\n * @method\n * @param {array} treeData The array of cellTree to expand or collapse.\n */\n\n self.expandCollapseCellTree = function (treeData) {\n for (let type in treeData) {\n for (let t of treeData[type])\n if (t.length > 0) self.cellTreeExpandCollapse(t[0], t[1], type);\n }\n self.draw();\n };\n\n /**\n * Scrolls the cell at cell x, row y into view if it is not already.\n * @memberof canvasDatagrid\n * @name scrollIntoView\n * @method\n * @param {number} x The column index of the cell to scroll into view.\n * @param {number} y The row index of the cell to scroll into view.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.scrollIntoView = function (x, y, offsetX, offsetY) {\n const matched = self.visibleCells.filter(function (cell) {\n return (\n (cell.rowIndex === y || y === undefined) &&\n (cell.columnIndex === x || x === undefined) &&\n cell.x > 0 &&\n cell.y > 0 &&\n cell.x + cell.width < self.width &&\n cell.y + cell.height < self.height\n );\n });\n if (matched.length === 1 && x !== undefined && y !== undefined) {\n // goto specific cell and its part be hidden by header\n if (\n matched[0].x < self.getRowHeaderCellWidth() ||\n matched[0].y < self.getColumnHeaderCellHeight()\n )\n matched.length = 0;\n }\n if (matched.length === 0) {\n self.gotoCell(x, y, offsetX, offsetY);\n }\n };\n /**\n * Sets the active cell. Requires redrawing.\n * @memberof canvasDatagrid\n * @name setActiveCell\n * @method\n * @param {number} x The column index of the cell to set active.\n * @param {number} y The row index of the cell to set active.\n */\n self.setActiveCell = function (x, y) {\n if (typeof x === 'undefined') return;\n if (x < 0) {\n x = 0;\n }\n if (y < 0) {\n y = 0;\n }\n self.activeCell = {\n rowIndex: y,\n columnIndex: x,\n };\n };\n /**\n * Removes the selection.\n * @memberof canvasDatagrid\n * @name selectNone\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n * @method\n */\n self.selectNone = function (dontDraw) {\n self.selections = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n if (dontDraw) {\n return;\n }\n self.draw();\n };\n /**\n * Selects every visible cell.\n * @memberof canvasDatagrid\n * @name selectAll\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n * @method\n */\n self.selectAll = function (dontDraw) {\n self.selectArea({\n top: 0,\n left: -1,\n right: self.getSchema().length - 1,\n bottom: self.viewData.length - 1,\n });\n if (dontDraw) {\n return;\n }\n self.draw();\n };\n /**\n * Returns true if the selected columnIndex is selected on every row.\n * @memberof canvasDatagrid\n * @name isColumnSelected\n * @method\n * @param {number} columnIndex The column index to check.\n */\n self.isColumnSelected = function (columnIndex) {\n var colIsSelected = true;\n self.viewData.forEach(function (row, rowIndex) {\n if (\n !self.selections[rowIndex] ||\n self.selections[rowIndex].indexOf(columnIndex) === -1\n ) {\n colIsSelected = false;\n }\n });\n return colIsSelected;\n };\n /**\n * Returns true if the selected rowIndex is selected on every column.\n * @memberof canvasDatagrid\n * @name isRowSelected\n * @method\n * @param {number} rowIndex The row index to check.\n */\n\n self.isRowSelected = function (rowIndex) {\n if (!self.selections[rowIndex]) return false;\n var rowIsSelected = true;\n var schema = self.getVisibleSchema();\n schema.forEach(function (col, index) {\n if (\n !self.selections[rowIndex] ||\n self.selections[rowIndex].indexOf(index) === -1\n ) {\n rowIsSelected = false;\n }\n });\n return rowIsSelected;\n };\n\n /**\n * Runs the defined method on each selected cell.\n * @memberof canvasDatagrid\n * @name forEachSelectedCell\n * @method\n * @param {number} fn The function to execute. The signature of the function is: (data, rowIndex, columnName).\n * @param {number} expandToRow When true the data in the array is expanded to the entire row.\n */\n self.forEachSelectedCell = function (fn, expandToRow) {\n var d = [],\n s = expandToRow ? self.getSchema() : self.getVisibleSchema(),\n l = self.viewData.length;\n self.selections.forEach(function (row, index) {\n if (index === l) {\n return;\n }\n if (row.length === 0) {\n d[index] = null;\n return;\n }\n d[index] = {};\n row.forEach(function (col) {\n if (col === -1 || !s[col]) {\n return;\n }\n fn(self.viewData, index, s[col].name);\n });\n });\n };\n /**\n * Selects a column.\n * @memberof canvasDatagrid\n * @name selectColumn\n * @method\n * @param {number} columnIndex The column index to select.\n * @param {boolean} toggleSelectMode When true, behaves as if you were holding control/command when you clicked the column.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the column.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectColumn = function (columnIndex, ctrl, shift, supressEvent) {\n var s, e, x;\n self.isMultiRowsSelected = false;\n self.isMultiColumnsSelected = false;\n function addCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) === -1) {\n self.selections[rowIndex].push(i);\n }\n });\n }\n function removeCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) !== -1) {\n self.selections[rowIndex].splice(\n self.selections[rowIndex].indexOf(i),\n 1,\n );\n }\n });\n }\n if (shift) {\n if (!self.activeCell) {\n return;\n }\n s = Math.min(self.activeCell.columnIndex, columnIndex);\n e = Math.max(self.activeCell.columnIndex, columnIndex);\n for (x = s; e > x; x += 1) {\n addCol(x);\n if (self.selectedColumns.indexOf(x) === -1)\n self.selectedColumns.push(x);\n }\n if (s != e) self.isMultiColumnsSelected = true;\n }\n if (!ctrl && !shift) {\n self.selections = [];\n self.selectedColumns = [];\n self.activeCell.columnIndex = columnIndex;\n self.activeCell.rowIndex = self.scrollIndexTop;\n }\n if (ctrl && self.isColumnSelected(columnIndex)) {\n removeCol(columnIndex);\n self.selectedColumns.splice(columnIndex, 1);\n } else {\n addCol(columnIndex);\n self.selectedColumns.push(columnIndex);\n }\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n });\n };\n /**\n * Selects a row.\n * @memberof canvasDatagrid\n * @name selectRow\n * @method\n * @param {number} rowIndex The row index to select.\n * @param {boolean} ctrl When true, behaves as if you were holding control/command when you clicked the row.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the row.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectRow = function (rowIndex, ctrl, shift, supressEvent) {\n var x,\n st,\n en,\n s = self.getVisibleSchema();\n self.isMultiRowsSelected = false;\n function de() {\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n }\n function addRow(ri) {\n self.selections[ri] = [];\n self.selections[ri].push(-1);\n s.forEach(function (col, index) {\n self.selections[ri].push(self.orders.columns.indexOf(col.index));\n if (\n col.index !== -1 &&\n self.selectedColumns.indexOf(\n self.orders.columns.indexOf(col.index),\n ) === -1\n )\n self.selectedColumns.push(self.orders.columns.indexOf(col.index));\n });\n }\n if (self.dragAddToSelection === false || self.dragObject === undefined) {\n if (\n self.selections[rowIndex] &&\n self.selections[rowIndex].length - 1 === s.length\n ) {\n if (ctrl) {\n self.selections[rowIndex] = [];\n de();\n return;\n }\n }\n }\n if (self.dragAddToSelection === true || self.dragObject === undefined) {\n if (shift && self.dragObject === undefined) {\n if (!self.activeCell) {\n return;\n }\n st = Math.min(self.activeCell.rowIndex, rowIndex);\n en = Math.max(self.activeCell.rowIndex, rowIndex);\n for (x = st; en >= x; x += 1) {\n addRow(x);\n self.selectedRows.push(x);\n }\n } else {\n addRow(rowIndex);\n self.selectedRows = [];\n self.selectedRows.push(rowIndex);\n }\n }\n de();\n };\n /**\n * Collapse a tree grid by row index.\n * @memberof canvasDatagrid\n * @name collapseTree\n * @method\n * @param {number} index The index of the row to collapse.\n */\n self.collapseTree = function (rowIndex) {\n self.dispatchEvent('collapsetree', {\n childGrid: self.childGrids[rowIndex],\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex].blur();\n self.openChildren[rowIndex].dispose();\n delete self.openChildren[rowIndex];\n delete self.sizes.trees[rowIndex];\n delete self.childGrids[rowIndex];\n self.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\n });\n self.resize(true);\n self.draw(true);\n };\n /**\n * Expands a tree grid by row index.\n * @memberof canvasDatagrid\n * @name expandTree\n * @method\n * @param {number} index The index of the row to expand.\n */\n self.expandTree = function (rowIndex) {\n var trArgs = self.args.treeGridAttributes || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth =\n self.sizes.columns.cornerCell || self.style.rowHeaderCellWidth,\n h = self.sizes.trees[rowIndex] || self.style.treeGridHeight,\n treeGrid;\n if (!self.childGrids[rowIndex]) {\n trArgs.debug = self.attributes.debug;\n trArgs.name = self.attributes.saveAppearance\n ? self.attributes.name + 'tree' + rowIndex\n : undefined;\n trArgs.style = trArgs.style || self.style;\n trArgs.parentNode = {\n parentGrid: self.intf,\n nodeType: 'canvas-datagrid-tree',\n offsetHeight: h,\n offsetWidth: self.width - rowHeaderCellWidth,\n header: { width: self.width - rowHeaderCellWidth },\n offsetLeft: rowHeaderCellWidth,\n offsetTop: columnHeaderCellHeight,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: 'tree',\n data: self.viewData[rowIndex],\n };\n treeGrid = self.createGrid(trArgs);\n self.childGrids[rowIndex] = treeGrid;\n }\n treeGrid = self.childGrids[rowIndex];\n treeGrid.visible = true;\n self.dispatchEvent('expandtree', {\n treeGrid: treeGrid,\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex] = treeGrid;\n self.sizes.trees[rowIndex] = h;\n self.dispatchEvent('resizerow', { height: self.style.cellHeight });\n self.resize(true);\n };\n /**\n * Toggles tree grid open and close by row index.\n * @memberof canvasDatagrid\n * @name toggleTree\n * @method\n * @param {number} index The index of the row to toggle.\n */\n self.toggleTree = function (rowIndex) {\n var i = self.openChildren[rowIndex];\n if (i) {\n return self.collapseTree(rowIndex);\n }\n self.expandTree(rowIndex);\n };\n /**\n * Returns a header from the schema by name.\n * @memberof canvasDatagrid\n * @name getHeaderByName\n * @tutorial schema\n * @method\n * @returns {header} header with the selected name, or undefined.\n * @param {string} name The name of the column to resize.\n */\n self.getHeaderByName = function (name) {\n var x,\n i = self.getSchema();\n for (x = 0; x < i.length; x += 1) {\n if (i[x].name === name) {\n return i[x];\n }\n }\n };\n /**\n * Hide column/columns\n * @memberof canvasDatagrid\n * @name hideColumns\n * @method\n * @param {number} beginColumnOrderIndex The begin column order index\n * @param {number} [endColumnOrderIndex] The end column order index\n */\n self.hideColumns = function (beginColumnOrderIndex, endColumnOrderIndex) {\n const schema = self.getSchema();\n const orders = self.orders.columns;\n const hiddenColumns = [];\n if (typeof endColumnOrderIndex !== 'number')\n endColumnOrderIndex = beginColumnOrderIndex;\n for (\n let orderIndex = beginColumnOrderIndex;\n orderIndex <= endColumnOrderIndex;\n orderIndex++\n ) {\n const columnIndex = orders[orderIndex];\n if (columnIndex >= 0 && !schema[columnIndex].hidden) {\n hiddenColumns.push(columnIndex);\n schema[columnIndex].hidden = true;\n\n self.dispatchEvent('columnhide', {\n columnIndex,\n });\n }\n }\n\n if (hiddenColumns.length > 0) {\n self.setStorageData();\n setTimeout(function () {\n self.resize(true);\n }, 10);\n }\n\n self.dispatchEvent('hidecolumns', {\n hiddenColumns,\n });\n };\n /**\n * Unihde column/columns\n * @memberof canvasDatagrid\n * @name unhideColumns\n * @method\n * @param {number} beginColumnOrderIndex The begin column order index\n * @param {number} [endColumnOrderIndex] The end column order index\n */\n self.unhideColumns = function (beginColumnOrderIndex, endColumnOrderIndex) {\n const orders = self.orders.columns;\n const schema = self.getSchema();\n\n for (let i = beginColumnOrderIndex; i <= endColumnOrderIndex; i++) {\n const columnIndex = orders[i];\n const s = schema[columnIndex];\n\n if (s && s.hidden) {\n s.hidden = false;\n\n self.dispatchEvent('columnunhide', {\n columnIndex,\n });\n }\n }\n self.refresh();\n };\n /**\n * Hide rows\n * @memberof canvasDatagrid\n * @name hideRows\n * @method\n * @param {number} beginRowIndex The begin row index\n * @param {number} endRowIndex The end row index\n */\n self.hideRows = function (beginRowIndex, endRowIndex) {\n if (\n mergeHiddenRowRanges(self.hiddenRowRanges, [beginRowIndex, endRowIndex])\n )\n self.refresh();\n };\n /**\n * Unhide rows\n * @memberof canvasDatagrid\n * @name unhideRows\n * @method\n * @param {number} beginRowIndex The begin row index\n * @param {number} endRowIndex The end row index\n */\n self.unhideRows = function (beginRowIndex, endRowIndex) {\n self.hiddenRowRanges = self.hiddenRowRanges.filter(\n (range) => range[0] !== beginRowIndex || range[1] !== endRowIndex,\n );\n self.refresh();\n };\n /**\n * Resizes a column to fit the longest value in the column. Call without a value to resize all columns.\n * Warning, can be slow on very large record sets (1m records ~3-5 seconds on an i7).\n * @memberof canvasDatagrid\n * @name fitColumnToValues\n * @method\n * @param {string} name The name of the column to resize.\n */\n self.fitColumnToValues = function (name, internal) {\n if (!self.canvas) {\n return;\n }\n\n const columnIndex =\n name === 'cornerCell' ? -1 : self.getHeaderByName(name).index;\n\n const newSize = Math.max(\n self.findColumnMaxTextLength(name),\n self.style.minColumnWidth,\n );\n\n self.sizes.columns[columnIndex] = newSize;\n\n self.dispatchEvent('resizecolumn', {\n x: newSize,\n y: self.resizingStartingHeight,\n draggingItem: self.currentCell,\n });\n\n if (!internal) {\n self.resize();\n self.draw(true);\n }\n };\n /**\n * Checks if a cell is currently visible.\n * @memberof canvasDatagrid\n * @name isCellVisible\n * @overload\n * @method\n * @returns {boolean} when true, the cell is visible, when false the cell is not currently drawn.\n * @param {number} columnIndex The column index of the cell to check.\n * @param {number} rowIndex The row index of the cell to check.\n */\n self.isCellVisible = function (cell, rowIndex) {\n // overload\n if (rowIndex !== undefined) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === cell && c.rowIndex === rowIndex;\n }).length > 0\n );\n }\n var x,\n l = self.visibleCells.length;\n for (x = 0; x < l; x += 1) {\n if (\n cell.x === self.visibleCells[x].x &&\n cell.y === self.visibleCells[x].y\n ) {\n return true;\n }\n }\n return false;\n };\n /**\n * Sets the order of the data.\n * @memberof canvasDatagrid\n * @name order\n * @method\n * @param {number} columnName Name of the column to be sorted.\n * @param {string} direction `asc` for ascending or `desc` for descending.\n * @param {function} [sortFunction] When defined, override the default sorting method defined in the column's schema and use this one.\n * @param {bool} [dontSetStorageData] Don't store this setting for future use.\n */\n self.order = function (\n columnName,\n direction,\n sortFunction,\n dontSetStorageData,\n ) {\n var f,\n c = self.getSchema().filter(function (col) {\n return col.name === columnName;\n });\n if (\n self.dispatchEvent('beforesortcolumn', {\n name: columnName,\n direction: direction,\n })\n ) {\n return;\n }\n self.orderBy = columnName;\n self.orderDirection = direction;\n if (!self.viewData || self.viewData.length === 0) {\n return;\n }\n if (c.length === 0) {\n throw new Error('Cannot sort. No such column name');\n }\n f = sortFunction || c[0].sorter || self.sorters[c[0].type];\n if (!f && c[0].type !== undefined) {\n console.warn(\n 'Cannot sort type \"%s\" falling back to string sort.',\n c[0].type,\n );\n }\n self.orderings.add(\n columnName,\n direction,\n typeof f === 'function' ? f : self.sorters.string,\n );\n self.refresh();\n self.dispatchEvent('sortcolumn', {\n name: columnName,\n direction: direction,\n });\n\n if (dontSetStorageData) {\n return;\n }\n self.setStorageData();\n };\n\n /**\n * Add grouping\n * @param {'columns'|'rows'} groupFor\n * @method\n * @param {number} from\n * @param {number} to\n */\n function addGroup(groupFor, from, to) {\n let newRow = false;\n const allGroups =\n groupFor === 'rows' ? self.groupedRows : self.groupedColumns;\n for (let i = allGroups.length - 1; i >= 0; i--) {\n const groups = allGroups[i];\n const min = groups[0].from,\n max = groups[groups.length - 1].to;\n if (from <= min && to >= max) {\n if (from === min && to === max && groups.length === 1) return; // nothings happened\n // new group wrap this row\n continue;\n }\n for (let gi = 0; gi < groups.length; gi++) {\n const g = groups[gi];\n if (from > g.to) continue;\n if (from >= g.from) {\n if (to > g.to) {\n if (from === g.from) {\n allGroups.splice(i, 0, [{ from, to, collapsed: false }]);\n self.refresh();\n return;\n }\n throw new Error(`Can't group these ${groupFor}`);\n }\n if (to === g.to) {\n if (from === g.from) return; // nothings happened\n }\n newRow = true;\n break;\n }\n if (to >= g.from) {\n if (to < g.to) throw new Error(`Can't group these ${groupFor}`);\n allGroups.splice(i, 0, [{ from, to, collapsed: false }]);\n } else {\n groups.splice(gi, 0, { from, to, collapsed: false });\n }\n self.refresh();\n return;\n }\n if (newRow) continue;\n groups.push({ from, to, collapsed: false });\n self.refresh();\n return;\n }\n if (newRow) allGroups.push([{ from, to, collapsed: false }]);\n else allGroups.unshift([{ from, to, collapsed: false }]);\n self.refresh();\n }\n /**\n * Remove grouping\n * @param {Array<Array<{from:number,to:number,collapsed:boolean}>>} allGroups\n * @method\n * @param {number} from\n * @param {number} to\n */\n function removeGroup(allGroups, from, to) {\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n if (group.from === from && group.to === to) {\n if (groups.length <= 1) allGroups.splice(i, 1);\n else groups.splice(gi, 1);\n self.refresh();\n return;\n }\n }\n }\n }\n /**\n * Grouping columns\n * @memberof canvasDatagrid\n * @name groupColumns\n * @method\n * @param {number|string} firstColumnName Name of the first column to be grouped.\n * @param {number|string} lastColumnName Name of the last column to be grouped.\n */\n self.groupColumns = function (firstColumnName, lastColumnName) {\n /** @type {Array<{name: string,columnIndex:number}>} */\n const schema = self.getSchema();\n let firstOne, lastOne;\n for (let i = 0; i < schema.length; i++) {\n const it = schema[i];\n if (firstOne && lastOne) break;\n if (it.name === firstColumnName) {\n firstOne = it;\n continue;\n }\n if (it.name === lastColumnName) {\n lastOne = it;\n continue;\n }\n }\n if (!firstOne) throw new Error(`No such column name for first column`);\n if (!lastOne) throw new Error(`No such column name for last column`);\n if (lastOne.columnIndex > firstOne.columnIndex !== true)\n throw new Error(`Can't group these columns`);\n\n const from = firstOne.columnIndex;\n const to = lastOne.columnIndex;\n const ev = { group: { type: 'columns', from, to } };\n try {\n addGroup('columns', from, to);\n } catch (error) {\n ev.error = error;\n }\n self.dispatchEvent('aftercreategroup', ev);\n };\n /**\n * Grouping columns\n * @memberof canvasDatagrid\n * @name groupRows\n * @method\n * @param {number} rowIndexFrom The row index which is the beginning of the group\n * @param {number} rowIndexTo The row index which is the end of the group\n */\n self.groupRows = function (rowIndexFrom, rowIndexTo) {\n if (!Number.isInteger(rowIndexFrom) || rowIndexFrom < 0)\n throw new Error(`No such row for the beginning of the group`);\n\n const dataLength = self.viewData.length;\n if (\n !Number.isInteger(rowIndexFrom) ||\n rowIndexTo <= rowIndexFrom ||\n rowIndexTo >= dataLength\n )\n throw new Error(`No such row for the end of the group`);\n const ev = {\n group: {\n type: 'rows',\n from: rowIndexFrom,\n to: rowIndexTo,\n },\n };\n try {\n addGroup('rows', rowIndexFrom, rowIndexTo);\n } catch (error) {\n ev.error = error;\n }\n self.dispatchEvent('aftercreategroup', ev);\n };\n /**\n * Remove grouping columns\n * @memberof canvasDatagrid\n * @name removeGroupColumns\n * @method\n * @param {number|string} firstColumnName Name of the first column to be grouped.\n * @param {number|string} lastColumnName Name of the last column to be grouped.\n */\n self.removeGroupColumns = function (firstColumnName, lastColumnName) {\n /** @type {Array<{name:string,columnIndex:number}>} */\n const schema = self.getSchema();\n let firstOne, lastOne;\n for (let i = 0; i < schema.length; i++) {\n const it = schema[i];\n if (firstOne && lastOne) break;\n if (it.name === firstColumnName) {\n firstOne = it;\n continue;\n }\n if (it.name === lastColumnName) {\n lastOne = it;\n continue;\n }\n }\n if (!firstOne) throw new Error(`No such column name for first column`);\n if (!lastOne) throw new Error(`No such column name for last column`);\n const from = firstOne.columnIndex;\n const to = lastOne.columnIndex;\n removeGroup(self.groupedColumns, from, to);\n };\n /**\n * Remove grouping columns\n * @memberof canvasDatagrid\n * @name removeGroupRows\n * @method\n * @param {number} rowIndexFrom The row index which is the beginning of the group\n * @param {number} rowIndexTo The row index which is the end of the group\n */\n self.removeGroupRows = function (rowIndexFrom, rowIndexTo) {\n removeGroup(self.groupedRows, rowIndexFrom, rowIndexTo);\n };\n /**\n * Toggle(expand/collapsed) grouping columns\n * @memberof canvasDatagrid\n * @name toggleGroupColumns\n * @method\n * @param {number|string} firstColumnName Name of the first column to be grouped.\n * @param {number|string} lastColumnName Name of the last column to be grouped.\n */\n self.toggleGroupColumns = function (firstColumnName, lastColumnName) {\n /** @type {Array<{name:string,columnIndex:number}>} */\n const schema = self.getSchema();\n let firstOne, lastOne;\n for (let i = 0; i < schema.length; i++) {\n const it = schema[i];\n if (firstOne && lastOne) break;\n if (it.name === firstColumnName) {\n firstOne = it;\n continue;\n }\n if (it.name === lastColumnName) {\n lastOne = it;\n continue;\n }\n }\n if (!firstOne || !lastOne) return;\n const from = firstOne.columnIndex;\n const to = lastOne.columnIndex;\n if (self.toggleGroup({ type: 'c', from, to })) {\n self.disposeContextMenu();\n self.setStorageData();\n self.refresh();\n }\n };\n /**\n * Toggle(expand/collapsed) grouping rows\n * @memberof canvasDatagrid\n * @name toggleGroupRows\n * @method\n * @param {number} rowIndexFrom The row index which is the beginning of the group\n * @param {number} rowIndexTo The row index which is the end of the group\n */\n self.toggleGroupRows = function (rowIndexFrom, rowIndexTo) {\n if (self.toggleGroup({ type: 'r', from: rowIndexFrom, to: rowIndexTo })) {\n self.disposeContextMenu();\n self.setStorageData();\n self.refresh();\n }\n };\n\n self.isInGrid = function (e) {\n if (e.x < 0 || e.x > self.width || e.y < 0 || e.y > self.height) {\n return false;\n }\n return true;\n };\n /**\n * Moves the current selection relative to the its current position. Note: this method does not move the selected data, just the selection itself.\n * @memberof canvasDatagrid\n * @name moveSelection\n * @method\n * @param {number} offsetX The number of columns to offset the selection.\n * @param {number} offsetY The number of rows to offset the selection.\n */\n self.moveSelection = function (offsetX, offsetY) {\n var sel = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n self.selections.forEach(function (row, rowIndex) {\n sel[rowIndex + offsetY] = [];\n self.selectedRows.push(rowIndex + offsetY);\n row.forEach(function (colIndex) {\n sel[rowIndex + offsetY].push(colIndex + offsetX);\n if (self.selectedColumns.indexOf(colIndex + offsetX) === -1)\n self.selectedColumns.push(colIndex + offsetX);\n });\n });\n self.selections = sel;\n };\n /**\n * Deletes currently selected data.\n * @memberof canvasDatagrid\n * @name deleteSelectedData\n * @method\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n */\n self.deleteSelectedData = function (dontDraw) {\n const affectedCells = self.clearSelectedCells();\n\n self.dispatchEvent('afterdelete', {\n cells: affectedCells,\n });\n\n if (dontDraw) {\n return;\n }\n\n requestAnimationFrame(() => self.draw());\n };\n /**\n * Moves data in the provided selection to another position in the grid. Moving data off the edge of the schema (columns/x) will truncate data.\n * @memberof canvasDatagrid\n * @name moveTo\n * @method\n * @param {array} sel 2D array representing selected rows and columns. `canvasDatagrid.selections` is in this format and can be used here.\n * @param {number} x The column index to start inserting the selection at.\n * @param {number} y The row index to start inserting the selection at.\n */\n self.moveTo = function (sel, x, y) {\n var selectedData = self.getSelectedData(),\n visibleSchema = self.getVisibleSchema(),\n selectionLength = sel.length,\n xi,\n maxRowLength = -Infinity,\n minXi = Infinity,\n yi = y - 1;\n\n sel.forEach(function (row, rowIndex) {\n if (rowIndex === selectionLength) {\n return;\n }\n if (row.length === 0) {\n return;\n }\n minXi = Math.min(self.getVisibleColumnIndexOf(x), minXi);\n maxRowLength = Math.max(maxRowLength, row.length);\n row.forEach(function (colIndex) {\n // intentional redef of colIndex\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (!visibleSchema[colIndex]) {\n return;\n }\n // TODO:\n if (!self.data) {\n self.data = {};\n }\n if (!self.data[rowIndex]) {\n self.data[rowIndex] = {};\n }\n // TODO:\n self.data[rowIndex][visibleSchema[colIndex].name] = null;\n });\n });\n\n sel.forEach(function (row, index) {\n var lastSourceIndex;\n yi += 1;\n xi = self.getVisibleColumnIndexOf(x);\n row.forEach(function (colIndex, cidx) {\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (cidx > 0) {\n // this confusing bit of nonsense figures out\n // if the selection has skipped cells\n xi += colIndex - lastSourceIndex;\n }\n lastSourceIndex = colIndex;\n if (\n colIndex === -1 ||\n !visibleSchema[xi] ||\n !visibleSchema[colIndex] ||\n // TODO:\n self.data.length - 1 < yi ||\n yi < 0\n ) {\n return;\n }\n // TODO:\n if (!self.data[yi]) {\n self.data[yi] = {};\n }\n // TODO:\n self.data[yi][visibleSchema[xi].name] =\n selectedData[index][visibleSchema[colIndex].name];\n });\n });\n };\n /**\n * Get the column group info given column belongs to\n * @memberof canvasDatagrid\n * @name getGroupsColumnBelongsTo\n * @method\n * @param {number} columnIndex Column index.\n * @returns {Array<{from:number,to:number,collapsed:boolean}>}\n */\n self.getGroupsColumnBelongsTo = function (columnIndex) {\n if (!self.attributes.allowGroupingColumns) return [];\n const result = [];\n for (let i = 0; i < self.groupedColumns.length; i++) {\n const groups = self.groupedColumns[i];\n for (let j = 0; j < groups.length; j++) {\n const group = groups[j];\n if (columnIndex >= group.from && columnIndex <= group.to) {\n result.push(group);\n break;\n }\n }\n }\n return result;\n };\n /**\n * Get the row group info given row belongs to\n * @memberof canvasDatagrid\n * @name getGroupsRowBelongsTo\n * @method\n * @param {number} rowIndex Row index.\n * @returns {Array<{from:number,to:number,collapsed:boolean}>}\n */\n self.getGroupsRowBelongsTo = function (rowIndex) {\n if (!self.attributes.allowGroupingRows) return [];\n const result = [];\n for (let i = 0; i < self.groupedRows.length; i++) {\n const groups = self.groupedRows[i];\n for (let j = 0; j < groups.length; j++) {\n const group = groups[j];\n if (rowIndex >= group.from && rowIndex <= group.to) {\n result.push(group);\n break;\n }\n }\n }\n return result;\n };\n\n /**\n * Checks if a given column is visible.\n * @memberof canvasDatagrid\n * @name isColumnVisible\n * @method\n * @returns {boolean} When true, the column is visible.\n * @param {number} columnIndex Column index.\n */\n self.isColumnVisible = function (columnIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === columnIndex;\n }).length > 0\n );\n };\n /**\n * Checks if a given row is visible.\n * @memberof canvasDatagrid\n * @name isRowVisible\n * @method\n * @returns {boolean} When true, the row is visible.\n * @param {number} rowIndex Row index.\n */\n self.isRowVisible = function (rowIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.rowIndex === rowIndex;\n }).length > 0\n );\n };\n /**\n * Gets the cell at columnIndex and rowIndex.\n * @memberof canvasDatagrid\n * @name getVisibleCellByIndex\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Column index.\n * @param {number} y Row index.\n */\n self.getVisibleCellByIndex = function (x, y) {\n return self.visibleCells.filter(function (c) {\n return c.columnIndex === x && c.rowIndex === y;\n })[0];\n };\n /**\n * Get an unhide indicator at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getUnhideIndicator\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getUnhideIndicator = function (x, y) {\n const indicators = self.visibleUnhideIndicators;\n if (indicators.length <= 0) return;\n for (let i = 0; i < indicators.length; i++) {\n const indicator = indicators[i];\n if (\n x >= indicator.x &&\n y >= indicator.y &&\n x <= indicator.x2 &&\n y <= indicator.y2\n )\n return indicator;\n }\n };\n /**\n * Get a column group at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getColumnGroupAt\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getColumnGroupAt = function (x, y) {\n const groups = self.groupedColumns.length;\n if (groups <= 0) return;\n const yZero = self.getColumnGroupAreaHeight();\n if (y >= yZero) return;\n for (let i = 0; i < self.visibleGroups.length; i++) {\n const g = self.visibleGroups[i];\n if (g.type !== 'c') continue;\n if (x >= g.x && y >= g.y && x <= g.x2 && y <= g.y2) return g;\n }\n };\n /**\n * Get a row group at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getRowGroupAt\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getRowGroupAt = function (x, y) {\n const groups = self.groupedRows.length;\n if (groups <= 0) return;\n const xZero = self.getRowGroupAreaWidth();\n if (x >= xZero) return;\n for (let i = 0; i < self.visibleGroups.length; i++) {\n const g = self.visibleGroups[i];\n if (g.type !== 'r') continue;\n if (x >= g.x && y >= g.y && x <= g.x2 && y <= g.y2) return g;\n }\n };\n /**\n * Gets the cell at grid pixel coordinate x and y. Author's note. This function ties drawing and events together. This is a very complex function and is core to the component.\n * @memberof canvasDatagrid\n * @name getCellAt\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getCellAt = function (x, y, useTouchScrollZones) {\n function getBorder(entitiy) {\n if (\n entitiy.x + entitiy.width - self.attributes.borderResizeZone * 0.4 <\n x &&\n entitiy.x + entitiy.width + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'r';\n }\n if (\n entitiy.x - self.attributes.borderResizeZone * 0.4 < x &&\n entitiy.x + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'l';\n }\n if (\n entitiy.y + entitiy.height - self.attributes.borderResizeZone * 0.4 <\n y &&\n entitiy.y + entitiy.height + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 'b';\n }\n if (\n entitiy.y - self.attributes.borderResizeZone * 0.4 < y &&\n entitiy.y + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 't';\n }\n }\n if (!self.visibleCells) {\n return;\n }\n x -= self.getRowGroupAreaWidth();\n y -= self.getColumnGroupAreaHeight();\n\n if (self.dragStartObject !== undefined) {\n if (x <= 0) x = 1;\n if (x >= self.width) x = self.width - 1;\n if (y <= 0) y = 1;\n if (y >= self.height) y = self.height - 1;\n }\n\n var border,\n tsz = useTouchScrollZones ? self.attributes.touchScrollZone : 0,\n moveMode = self.attributes.borderDragBehavior === 'move',\n i,\n l = self.visibleCells.length,\n moveBorder,\n xBorderBehavior = moveMode ? self.cursorGrab : 'ew-resize',\n yBorderBehavior = moveMode ? self.cursorGrab : 'ns-resize',\n cell,\n entitiy;\n if (!self.visibleCells || !self.visibleCells.length) {\n return;\n }\n self.hasFocus = true;\n if (!(y < self.height && y > 0 && x < self.width && x > 0)) {\n self.hasFocus = false;\n return {\n dragContext: 'inherit',\n context: 'inherit',\n };\n }\n for (i = 0; i < l; i += 1) {\n cell = self.visibleCells[i];\n // interactive dimensions of the cell. used for touch \"over size\" zones\n entitiy = {\n x: cell.x,\n y: cell.y,\n height: cell.height,\n width: cell.width,\n };\n if (\n useTouchScrollZones &&\n /(vertical|horizontal)-scroll-/.test(cell.style)\n ) {\n entitiy.x -= tsz;\n entitiy.y -= tsz;\n entitiy.height += tsz;\n entitiy.width += tsz;\n }\n if (\n entitiy.x - self.style.cellBorderWidth < x &&\n entitiy.x + entitiy.width + self.style.cellBorderWidth > x &&\n entitiy.y - self.style.cellBorderWidth < y &&\n entitiy.y + entitiy.height + self.style.cellBorderWidth > y\n ) {\n if (/frozen-row-marker/.test(cell.style)) {\n if (self.dragMode === 'frozen-column-marker') continue;\n cell.dragContext = cell.style;\n cell.context = 'grab';\n return cell;\n }\n if (/frozen-column-marker/.test(cell.style)) {\n if (self.dragMode === 'frozen-row-marker') continue;\n cell.dragContext = cell.style;\n cell.context = 'grab';\n return cell;\n }\n if (/selection-handle-/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'crosshair';\n return cell;\n }\n if (/vertical-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'vertical-scroll-box';\n cell.context = 'vertical-scroll-box';\n cell.isScrollBar = true;\n cell.isVerticalScrollBar = true;\n if (y > self.scrollBox.box.v.y + self.scrollBox.scrollBoxHeight) {\n cell.dragContext = 'vertical-scroll-bottom';\n cell.context = 'vertical-scroll-bottom';\n } else if (y < self.scrollBox.box.v.y) {\n cell.dragContext = 'vertical-scroll-top';\n cell.context = 'vertical-scroll-top';\n }\n self.cursor = 'default';\n return cell;\n }\n if (/horizontal-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'horizontal-scroll-box';\n cell.context = 'horizontal-scroll-box';\n cell.isScrollBar = true;\n cell.isHorizontalScrollBar = true;\n if (x > self.scrollBox.box.h.x + self.scrollBox.scrollBoxWidth) {\n cell.dragContext = 'horizontal-scroll-right';\n cell.context = 'horizontal-scroll-right';\n } else if (x < self.scrollBox.box.h.x) {\n cell.dragContext = 'horizontal-scroll-left';\n cell.context = 'horizontal-scroll-left';\n }\n self.cursor = 'default';\n return cell;\n }\n border = getBorder(entitiy);\n // check if the border of this cell is the border of the selection and if so show move cursor in move mode\n moveBorder =\n moveMode &&\n cell.selectionBorder &&\n cell.selectionBorder.indexOf(border) !== -1;\n if (\n ['l', 'r'].indexOf(border) !== -1 &&\n (self.attributes.allowColumnResize || moveBorder) &&\n ((self.attributes.allowColumnResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n ((self.attributes.allowRowHeaderResize &&\n (cell.isRowHeader || cell.isCorner)) ||\n !(cell.isRowHeader && cell.isCorner))\n ) {\n if (\n (cell.isColumnHeader ||\n cell.isCorner ||\n (self.attributes.allowColumnResizeFromCell && cell.isNormal)) &&\n border === 'r'\n ) {\n cell.context = 'ew-resize';\n cell.dragContext = 'ew-resize';\n return cell;\n }\n if (!(cell.isColumnHeader || cell.isCorner) && moveBorder) {\n cell.context = xBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (\n ['t', 'b'].indexOf(border) !== -1 &&\n cell.rowIndex > -1 &&\n (self.attributes.allowRowResize || moveBorder) &&\n ((self.attributes.allowRowResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n !cell.isColumnHeader\n ) {\n if (\n (cell.isRowHeader ||\n cell.isCorner ||\n (self.attributes.allowRowResizeFromCell && cell.isNormal)) &&\n border === 'b'\n ) {\n cell.context = 'ns-resize';\n cell.dragContext = 'ns-resize';\n return cell;\n }\n if (!(cell.isRowHeader || cell.isCorner) && moveBorder) {\n cell.context = yBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (cell.style === 'columnHeaderCell') {\n if (\n (!self.isColumnSelected(cell.columnIndex) &&\n cell.x +\n cell.width -\n self.attributes.columnGrabZoneSize -\n self.style.cellBorderWidth >\n x) ||\n !self.attributes.allowRowReordering\n ) {\n cell.dragContext = 'cell';\n cell.context = 'cell';\n } else {\n cell.context = self.cursorGrab;\n cell.dragContext = 'column-reorder';\n }\n return cell;\n }\n if (cell.style === 'rowHeaderCell') {\n if (\n (!self.isRowSelected(cell.rowIndex) &&\n self.attributes.rowGrabZoneSize +\n (cell.y - self.style.cellBorderWidth) <\n y) ||\n !self.attributes.allowRowReordering\n ) {\n cell.dragContext = 'cell';\n cell.context = 'cell';\n } else {\n cell.context = self.cursorGrab;\n cell.dragContext = 'row-reorder';\n }\n return cell;\n }\n if (cell.isGrid) {\n self.hasFocus = false;\n cell.dragContext = 'cell-grid';\n cell.context = 'cell-grid';\n return cell;\n }\n if (cell.style === 'tree-grid') {\n self.hasFocus = false;\n cell.dragContext = 'tree';\n cell.context = 'tree';\n return cell;\n }\n cell.dragContext = 'cell';\n cell.context = 'cell';\n return cell;\n }\n }\n self.hasFocus = true;\n self.cursor = 'default';\n return {\n dragContext: 'background',\n context: 'background',\n style: 'background',\n isBackground: true,\n };\n };\n /**\n * Gets the bounds of current selection.\n * @returns {rect} selection.\n * @memberof canvasDatagrid\n * @name getSelectionBounds\n * @method\n */\n self.getSelectionBounds = function () {\n var low = { x: Infinity, y: Infinity },\n high = { x: -Infinity, y: -Infinity };\n self.selections.forEach(function (row, rowIndex) {\n var maxCol, minCol;\n low.y = rowIndex < low.y ? rowIndex : low.y;\n high.y = rowIndex > high.y ? rowIndex : high.y;\n maxCol = Math.max.apply(null, row);\n minCol = Math.min.apply(null, row);\n low.x = minCol < low.x ? minCol : low.x;\n high.x = maxCol > high.x ? maxCol : high.x;\n });\n return {\n top: low.y,\n left: low.x,\n bottom: high.y,\n right: high.x,\n };\n };\n /**\n * Returns an auto generated schema based on data structure.\n * @memberof canvasDatagrid\n * @name getSchemaFromData\n * @method\n * @tutorial schema\n * @returns {schema} schema A schema based on the first item in the data array.\n */\n self.getSchemaFromData = function (d) {\n d = d || self.originalData;\n return Object.keys(d[0] || { ' ': '' }).map(function mapEachSchemaColumn(\n key,\n index,\n ) {\n var type = self.getBestGuessDataType(key, d),\n i = {\n name: key,\n title: isNaN(parseInt(key, 10))\n ? key\n : self.integerToAlpha(key).toUpperCase(),\n index: index,\n columnIndex: index,\n type: type,\n filter: self.filter(type),\n };\n if (\n self.storedSettings &&\n self.storedSettings.visibility &&\n self.storedSettings.visibility[i.name] !== undefined\n ) {\n i.hidden = !self.storedSettings.visibility[i.name];\n }\n return i;\n });\n };\n /**\n * Clears the change log grid.changes that keeps track of changes to the data set.\n * This does not undo changes or alter data it is simply a convince array to keep\n * track of changes made to the data since last this method was called.\n * @memberof canvasDatagrid\n * @name clearChangeLog\n * @method\n */\n self.clearChangeLog = function () {\n self.changes = [];\n };\n /**\n * Selects an area of the grid.\n * @memberof canvasDatagrid\n * @name selectArea\n * @method\n * @param {rect} bounds A rect object representing the selected values.\n */\n self.selectArea = function (bounds, ctrl) {\n self.selectionBounds = bounds || self.selectionBounds;\n var ev,\n x,\n y,\n s = self.getSchema();\n if (!ctrl) {\n self.selections = [];\n self.selectedRows = [];\n self.selectedColumns = [];\n }\n if (\n self.selectionBounds.top < -1 ||\n self.selectionBounds.bottom > self.viewData.length ||\n self.selectionBounds.left < -1 ||\n self.selectionBounds.right > s.length\n ) {\n throw new Error('Impossible selection area');\n }\n for (\n x = self.selectionBounds.top;\n x <= self.selectionBounds.bottom;\n x += 1\n ) {\n self.selections[x] = [];\n self.selectedRows.push(x);\n for (\n y = self.selectionBounds.left;\n y <= self.selectionBounds.right;\n y += 1\n ) {\n if (self.selections[x].indexOf(y) === -1) {\n self.selections[x].push(y);\n }\n if (y !== -1 && self.selectedColumns.indexOf(y) === -1) {\n self.selectedColumns.push(y);\n }\n }\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n };\n /**\n * Returns the maximum text width for a given column by column name.\n * @memberof canvasDatagrid\n * @name findColumnMaxTextLength\n * @method\n * @returns {number} The number of pixels wide the maximum width value in the selected column.\n * @param {string} name The name of the column to calculate the value's width of.\n */\n self.findColumnMaxTextLength = function (name) {\n var m = -Infinity;\n if (name === 'cornerCell') {\n self.ctx.font = self.style.rowHeaderCellFont;\n return (\n self.ctx.measureText(\n (\n self.viewData.length + (self.attributes.showNewRow ? 1 : 0)\n ).toString(),\n ).width +\n self.style.autosizePadding +\n self.style.autosizeHeaderCellPadding +\n self.style.rowHeaderCellPaddingRight +\n self.style.rowHeaderCellPaddingLeft +\n (self.attributes.tree\n ? self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight\n : 0)\n );\n }\n var formatter = null;\n self.getSchema().forEach(function (col) {\n if (col.name !== name) {\n return;\n }\n self.ctx.font = self.style.columnHeaderCellFont;\n var t =\n self.ctx.measureText(col.title || col.name).width +\n self.style.columnHeaderCellPaddingRight +\n self.style.columnHeaderCellPaddingLeft +\n self.style.cellAutoResizePadding;\n m = t > m ? t : m;\n formatter = self.formatters[col.type];\n });\n self.viewData.forEach(function (row) {\n var text = row[name];\n if (formatter) {\n text = formatter({ cell: { value: text } });\n }\n self.ctx.font = self.style.cellFont;\n var t =\n self.ctx.measureText(text).width +\n self.style.cellPaddingRight +\n self.style.cellPaddingLeft +\n self.style.cellAutoResizePadding;\n m = t > m ? t : m;\n });\n return m;\n };\n /**\n * Gets the total width of all header columns.\n * @memberof canvasDatagrid\n * @name getHeaderWidth\n * @method\n */\n self.getHeaderWidth = function () {\n return self.getVisibleSchema().reduce(function (total, header) {\n return total + parseInt(header.width || self.style.cellWidth, 10);\n }, 0);\n };\n /**\n * Gets the height of a row by index.\n * @memberof canvasDatagrid\n * @name getRowHeight\n * @method\n * @param {number} rowIndex The row index to lookup.\n */\n self.getRowHeight = function (rowIndex) {\n return (self.sizes.rows[rowIndex] || self.style.cellHeight) * self.scale;\n };\n /**\n * Gets the width of a column by index.\n * @memberof canvasDatagrid\n * @name getColumnWidth\n * @method\n * @param {number} columnIndex The column index to lookup.\n */\n self.getColumnWidth = function (columnIndex) {\n return (\n (self.sizes.columns[columnIndex] ||\n self.getSchema()[columnIndex].width ||\n self.style.cellWidth) * self.scale\n );\n };\n self.formatters.string = function cellFormatterString(e) {\n return e.cell.value !== undefined ? e.cell.value : '';\n };\n self.formatters.rowHeaderCell = self.formatters.string;\n self.formatters.headerCell = self.formatters.string;\n self.formatters.number = self.formatters.string;\n self.formatters.int = self.formatters.string;\n self.formatters.html = self.formatters.string;\n self.sorters.string = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n const aValue = a[columnName] || '';\n const bValue = b[columnName] || '';\n if (asc) {\n if (!aValue.localeCompare) {\n return 1;\n }\n return aValue.localeCompare(bValue);\n }\n if (!bValue.localeCompare) {\n return 1;\n }\n return bValue.localeCompare(aValue);\n };\n };\n self.sorters.number = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return a[columnName] - b[columnName];\n }\n return b[columnName] - a[columnName];\n };\n };\n self.sorters.date = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return (\n new Date(a[columnName]).getTime() - new Date(b[columnName]).getTime()\n );\n }\n return (\n new Date(b[columnName]).getTime() - new Date(a[columnName]).getTime()\n );\n };\n };\n}\n","/*jslint browser: true, unparam: true, todo: true, evil: true*/\n/*globals Reflect: false, HTMLElement: true, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport component from './component';\nimport defaults from './defaults';\nimport draw from './draw';\nimport events from './events';\nimport touch from './touch';\nimport intf from './intf';\nimport contextMenu from './contextMenu';\nimport button from './button';\nimport dom from './dom';\nimport publicMethods from './publicMethods';\n\nvar webComponent = component();\n\nvar modules = [\n defaults,\n draw,\n events,\n touch,\n intf,\n contextMenu,\n button,\n dom,\n publicMethods,\n];\n\nfunction Grid(args) {\n args = args || {};\n var self = {};\n self.isComponent = args.component === undefined;\n self.isChildGrid =\n args.parentNode &&\n /canvas-datagrid-(cell|tree)/.test(args.parentNode.nodeType);\n if (self.isChildGrid) {\n self.intf = {};\n } else {\n self.intf = self.isComponent\n ? eval('Reflect.construct(HTMLElement, [], new.target)')\n : document.createElement('canvas');\n }\n self.args = args;\n self.intf.args = args;\n self.applyComponentStyle = webComponent.applyComponentStyle;\n self.hyphenateProperty = webComponent.hyphenateProperty;\n self.dehyphenateProperty = webComponent.dehyphenateProperty;\n self.createGrid = function grid(args) {\n args.component = false;\n return new Grid(args);\n };\n\n modules.forEach(function (module) {\n module(self);\n });\n\n if (self.isChildGrid) {\n self.shadowRoot = args.parentNode.shadowRoot;\n self.parentNode = args.parentNode;\n } else {\n self.shadowRoot = self.intf.attachShadow({ mode: 'open' });\n self.parentNode = self.shadowRoot;\n }\n self.init();\n return self.intf;\n}\nif (window.HTMLElement) {\n Grid.prototype = Object.create(window.HTMLElement.prototype);\n}\n// export web component\nif (window.customElements) {\n Grid.observedAttributes = webComponent.getObservableAttributes();\n Grid.prototype.disconnectedCallback = webComponent.disconnectedCallback;\n Grid.prototype.attributeChangedCallback =\n webComponent.attributeChangedCallback;\n Grid.prototype.connectedCallback = webComponent.connectedCallback;\n Grid.prototype.adoptedCallback = webComponent.adoptedCallback;\n window.customElements.define('canvas-datagrid', Grid);\n}\n\n// export global\nif (\n window &&\n !window.canvasDatagrid &&\n !window.require &&\n // Present to exclude global declarations from ES Module bundles\n !window.EXCLUDE_GLOBAL\n) {\n window.canvasDatagrid = function (args) {\n return new Grid(args);\n };\n}\n\n// export amd loader\nexport default function canvasDatagrid(args) {\n args = args || {};\n var i,\n tKeys = [\n 'style',\n 'formatters',\n 'sorters',\n 'filters',\n 'treeGridAttributes',\n 'cellGridAttributes',\n 'fillCellCallback',\n 'data',\n 'schema',\n ];\n if (window.customElements) {\n i = document.createElement('canvas-datagrid');\n Object.keys(args).forEach(function (argKey) {\n // set data and parentNode after everything else\n if (argKey === 'data') {\n return;\n }\n if (argKey === 'parentNode') {\n return;\n }\n // top level keys in args\n if (tKeys.indexOf(argKey) !== -1) {\n tKeys.forEach(function (tKey) {\n if (args[tKey] === undefined || tKey !== argKey) {\n return;\n }\n if (['formatters', 'sorters', 'filters'].indexOf(argKey) !== -1) {\n if (typeof args[tKey] === 'object' && args[tKey] !== null) {\n Object.keys(args[tKey]).forEach(function (sKey) {\n i[tKey][sKey] = args[tKey][sKey];\n });\n }\n } else {\n i[tKey] = args[tKey];\n }\n });\n return;\n }\n // all others are attribute level keys\n i.attributes[argKey] = args[argKey];\n });\n if (args.data) {\n i.data = args.data;\n }\n // add to the dom very last to avoid redraws\n if (args.parentNode) {\n args.parentNode.appendChild(i);\n }\n return i;\n }\n args.component = false;\n i = new Grid(args);\n if (args.parentNode && args.parentNode.appendChild) {\n args.parentNode.appendChild(i);\n }\n return i;\n}\n"],"names":["self","defaults","attributes","styles","typeMap","component","dehyphenateProperty","prop","replace","nextLetterCap","p","Array","prototype","forEach","call","char","toUpperCase","hyphenateProperty","cust","toLowerCase","applyComponentStyle","supressChangeAndDrawEvents","intf","isComponent","cStyle","window","getComputedStyle","tagName","canvas","defs","computedStyle","def","val","getPropertyValue","setStyleProperty","dispatchEvent","requestAnimationFrame","resize","style","data","strData","JSON","parse","e","Error","schema","strSchema","number","strNum","n","parseInt","isNaN","boolean","strBool","test","string","str","getObservableAttributes","i","attrs","attr","push","disconnectedCallback","connected","connectedCallback","this","parentDOMNode","innerHTML","appendChild","observe","adoptedCallback","attributeChangedCallback","attrName","oldVal","newVal","tfn","dataType","base","item","filter","addEventListener","Function","name","observer","MutationObserver","mutations","checkInnerHTML","checkStyle","mutation","attributeName","target","nodeName","parentNode","addedNodes","length","type","characterData","childList","subtree","document","querySelectorAll","el","perfCounters","cachedImagesDrawn","drawCount","perfWindowSize","entityCount","scrollDebugCounters","touchPPSCounters","fillArray","low","high","step","x","undefined","drawHtml","cell","img","v","formattedValue","cacheKey","toString","rowIndex","columnIndex","Math","round","canvasOffsetLeft","y","canvasOffsetTop","htmlImageCache","height","width","complete","ctx","drawImage","Image","onload","loaded","Object","keys","html","draw","src","btoa","drawLines","coords","fill","beginPath","moveTo","lineTo","stroke","drawGroupHandle","collapsed","fillRect","strokeRect","cx","cy","drawUnhideIndicator","size","dir","active","x0","y0","borderCoords","minPadding","maxPadding","longEdge","median","halfLongEdge","strokeStyle","unhideIndicatorBorderColor","lineWidth","fillStyle","unhideIndicatorBackgroundColor","offset","unhideIndicatorColor","drawCellTreeIcon","tree","rowTree","parentCount","iconSize","cellTreeIconWidth","scale","marginTop","cellTreeIconMarginTop","marginRight","cellTreeIconMarginRight","marginLeft","cellTreeIconMarginLeft","paddingLeft","icon","oldFillStyle","oldStrokeStyle","hovered","hovers","onCellTreeIcon","cellTreeIconHoverFillColor","cellTreeIconFillColor","cellTreeIconBorderColor","rect","expand","cellTreeIconLineWidth","cellTreeIconLineColor","radiusRect","w","h","radius","r","b","quadraticCurveTo","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fillCircle","strokeHandle","strokeCircle","addBorderLine","c","pos","t","l","getFrozenColumnsWidth","s","getSchema","min","frozenColumn","collapsedGroups","getCollapsedColumnGroups","hidden","findIndex","group","from","to","getColumnWidth","internal","isChildGrid","parentGrid","visible","checkScrollHeight","treeGrid","rowOpen","rowHeight","cornerCell","rowData","aCell","drawCorner","en","m","d","viewData","bc","gridBorderCollapse","selectionBorders","moveBorders","selectionHandles","rowHeaders","u","currentCell","columnHeaderCellHeight","getColumnHeaderCellHeight","rowHeaderCellWidth","getRowHeaderCellWidth","rowGroupsAreaWidth","getRowGroupAreaWidth","columnGroupsAreaHeight","getColumnGroupAreaHeight","rowGroupsRectInfo","rowGroupsFrozenInfo","columnGroupsRectInfo","collapsedColumnGroups","collapsedRowGroups","getCollapsedRowGroups","cellHeight","currentRowIndexOffset","rowIndexOffsetByHiddenRows","hiddenRowRanges","map","range","plus","sort","a","performance","now","visibleRowHeights","orders","rows","createRowOrders","save","visibleRows","visibleCells","visibleGroups","visibleUnhideIndicators","offsetTop","offsetLeft","firstRowIndexOffset","shift","initDraw","gridBackgroundColor","translate","ln","frozenRow","scrollBox","scrollLeft","scrollPixelLeft","cellBorderWidth","drawRow","allowFreezingRows","frozenMarkerWidth","frozenMarkerBorderWidth","drawFrozenRows","columnOrderIndex","rowOrderIndex","headerIndex","g","snapToRow","scrollTop","scrollPixelTop","scrollIndexTop","scrollIndexBottom","scrollPixelBottom","cellTree","hide","showNewRow","showRowHeaders","scrollIndexLeft","isColumnCollapsedByGroup","columns","drawCell","newRow","restore","drawRows","cl","activeCell","selectionMode","activeCellOverlayBorderWidth","activeCellOverlayBorderColor","getHeaderWidth","drawActiveCell","o","columnHeaderCell","header","nonFrozenHeaderWidth","drawHeaderColumnRange","start","end","title","cellWidth","index","order","rArgs","rhIndex","filteredRowNumber","getBoundRowIndexFromViewRowIndex","originalData","rowHeaderValue","hasActiveFilters","hasCollapsedRowGroup","rowHeaderCell","headerDescription","sizes","openChildren","drawRowHeader","showColumnHeaders","columnHeaderCellBorderWidth","scrollBarWidth","isColumnHeaderCell","isColumnHeaderCellCap","endCap","drawHeaders","my","mx","xHover","yHover","allowFreezingColumns","freezeMarkerPosition","dragMode","frozenMarkerColor","frozenMarkerBorderColor","frozenMarkerHoverColor","frozenMarkerHeaderColor","frozenMarkerHoverBorderColor","dragStartObject","unshift","frozenMarkerActiveColor","frozenMarkerActiveBorderColor","posX","nearCell","getCellAt","isGrab","frozenMarkerActiveHeaderColor","posY","drawFrozenMarkers","mobile","allowMovingSelection","editable","selectionHandleBorderWidth","selectionHandleBorderColor","selectionHandleColor","hw","selectionHandleSize","tr","br","tl","bl","addselectionHandle","az","touchSelectHandleZone","ax","ay","reorderObject","dragOffset","reorderMarkerBackgroundColor","reorderMarkerBorderWidth","reorderMarkerBorderColor","k","selections","getRowHeight","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","selectedRows","indexOf","reorderTarget","sortRowIndex","selectedColumns","sortColumnIndex","drawReorderMarkers","movingSelection","moveOverlayBorderWidth","moveOverlayBorderColor","setLineDash","moveOverlayBorderSegments","gridBorderWidth","gridBorderColor","dsb","fillOverlay","handle","selectionOverlayBorderWidth","selectionOverlayBorderColor","snapTo","overlay","toX","toY","snap","cursorX","direction","cursorY","max","minX","minY","fillOverlayBorderColor","fillOverlayBorderWidth","drawFillOverlay","drawSelectionBorders","entities","scrollBarBoxMargin","scrollBarBorderColor","scrollBarBorderWidth","horizontalBox","scrollCache","horizontalBar","scrollBoxWidth","scrollWidth","verticalBox","verticalBar","scrollBoxHeight","scrollHeight","horizontalBarVisible","scrollBarBackgroundColor","scrollBarBoxColor","horizontalBoxVisible","context","scrollBarActiveColor","scrollBarBoxBorderRadius","verticalBarVisible","verticalBoxVisible","scrollBarCornerBorderColor","scrollBarCornerBackgroundColor","corner","frozenColumnsWidth","frozenRowsHeight","onTheLeft","columnGroupIndicatorPosition","onTheTop","rowGroupIndicatorPosition","groupingAreaBackgroundColor","groupedColumns","row","groups","j","assign","columnGroupRowHeight","toggleHandleSize","toggleHandlePadding","topY","centerY","bottomY","leftmostX","drawGroupHandleAtX","pushToVisibleGroups","leftX","rightX","x2","y2","crossTheFrozen","notInFrozen","colIndex","col","groupIndicatorColor","groupIndicatorBackgroundColor","ptr","left","right","containsBegining","containsEnd","rightCompare","compareX","minLeftX","lineCoords","groupedRows","colWidth","rowGroupColumnWidth","centerX","topmostY","drawGroupHandleAtY","top","bottom","bottomCompare","compareY","minTopY","drawGroupArea","showPerformance","debug","pop","font","debugFont","perf","reduce","toFixed","perfDelta","htmlImages","startScale","scaleDelta","zoomDeltaStart","touchLength","touches","touchPosition","touchPosition1","scrollIndex","scrollPixel","canvasOffset","touchDelta","touchAnimateTo","scrollAnimation","touchPPS","xPPS","yPPS","touchPPST","xPPST","yPPST","touchDuration","pointerLockPosition","mouse","touch","touchStart","hasFocus","dragContext","textAlign","debugBackgroundColor","key","debugColor","px","py","debugPerfChartBackground","debugScrollHeightColor","debugScrollWidthColor","debugPerformanceColor","debugEntitiesColor","debugTouchPPSXColor","debugTouchPPSYColor","dpl","apply","perfArr","arrIndex","color","useAbs","abs","drawPerfLine","debugPerfChartTextColor","drawPerfLines","createBorderOverlayArray","drawArray","propPrefix","offsetPoint","selectionBorder","isRowHeader","isHeader","cellGridAttributes","cellStyle","isCorner","isColumnHeader","isFilterable","filterable","includes","wrap","cellWhiteSpace","selected","hoverMode","openedFilter","selectedFilterButton","rawValue","isGrid","activeHeader","f","formatters","orderByArrowSize","treeArrowSize","ev","value","nodeType","fontHeight","horizontalAlignment","verticalAlignment","paddingTop","paddingRight","paddingBottom","whiteSpace","lineHeight","cellLineHeight","lineSpacing","cellLineSpacing","offsetWidth","offsetHeight","offsetParent","viewRowIndex","viewColumnIndex","boundRowIndex","boundColumnIndex","getBoundColumnIndexFromViewColumnIndex","isNormal","gridId","isRowTree","rowTreeColIndex","isColumnTree","calculatedLineHeight","paddedWidth","paddedHeight","userHeight","userWidth","saveRowGroupsRectInfo","saveColumnGroupsRectInfo","cellHeightWithChildGrid","cellWidthWithChildGrid","mt","treeArrowMarginTop","mr","treeArrowMarginRight","ml","treeArrowMarginLeft","aw","treeArrowWidth","ah","treeArrowHeight","treeArrowColor","treeArrowBorderColor","drawTreeArrow","showRowNumbers","childGrids","saveAppearance","createGrid","cellGridHeight","grid","orderBy","columnHeaderOrderByArrowMarginTop","columnHeaderOrderByArrowMarginLeft","columnHeaderOrderByArrowMarginRight","columnHeaderOrderByArrowWidth","columnHeaderOrderByArrowHeight","columnHeaderOrderByArrowColor","columnHeaderOrderByArrowBorderColor","orderDirection","drawOrderByArrow","orderByArrowWidth","console","warn","columnFilters","filterTextPrefix","splitChar","lines","word","elWidth","plWidth","clippedVal","previousLine","words","split","textHeight","autoResize","autoResizeRows","et","ellipsisText","line","cHeight","measureText","curSplitChar","measure","arr","splice","originText","stepLength","substr","wrapText","treeCellPadding","isDrawText","vPos","hPos","stringify","pw","idx","idx_ord","drawText","selectionBorderTop","selectionBorderRight","selectionHandle","selectionBorderLeft","selectionBorderBottom","selectionHandleBehavior","createHandlesOverlayArray","moveOffset","filterButtonWidth","filterButtonHeight","filterButtonBorderColor","filterButtonBackgroundColor","filterButtonActiveBackgroundColor","onFilterButton","filterButtonHoverBackgroundColor","filterButtonBorderRadius","filterButtonArrowHeight","filterButtonArrowWidth","filterButtonArrowColor","filterButtonArrowBorderColor","drawFilterButtonArrow","drawFilterButton","isSorting","orderings","showRowNumberGaps","previousRowNumber","hasRowGap","find","beginRowIndex","endRowIndex","barHeight","rowHeaderCellRowNumberGapHeight","barColor","rowHeaderCellRowNumberGapColor","showUnhideColumnsIndicator","orderIndex0","orderIndex1","unhideIndicator","unhideIndicatorSize","cellX","isActive","orderIndex","isHiddenColumn","drawIndicator","iconsWidth","lineX0","lineX1","orderIndexPtr","prevColumnIndex","nextColumnIndex","showUnhideRowsIndicator","cellY","topIndicators","bottomIndicators","it","matched","indicatorY","treeHeight","rowSansTreeHeight","trees","scrollIndexRight","scrollPixelRight","module","exports","defineProperty","enumerable","get","Symbol","toStringTag","__esModule","create","bind","default","hasOwnProperty","concat","modifier","legacyModifier","navigation","editing","ui","device","imeCompositionKeys","koreanSpecific","japaneseSpecific","commonFunction","multimedia","multimediaNumpad","audio","speech","application","browser","mobilePhone","tv","mediaControls","isSupportedHtml","pasteValue","some","expression","IGNORE_NODETYPES","isHtmlTable","sanitizeElementData","element","elementData","innerText","String","trim","parseHtmlText","doc","DOMParser","parseFromString","querySelector","parseHtmlTable","childNodes","childNode","parseText","parseData","mimeType","htmlSafe","createTextString","selectedData","isNeat","values","join","createHTMLString","htmlString","wheeling","stopPropagation","fn","events","removeEventListener","sfn","defaultPrevented","preventDefault","getRatio","maxPixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","refreshScrollCacheX","frozenWidth","isColumnCollapsed","accumulator","column","schemaIndex","columnWidth","drawAfterResize","dims","vb","nb","co","isScrollBoxCorner","sbw","ratio","bm","cellBorder","columnHeaderCellBorder","dataHeight","dataWidth","topGroupAreaHeight","leftGroupAreaWidth","ch","setCanvasSize","args","setScrollBoxSize","checkScrollBoxVisibility","widthBoxRatio","heightBoxRatio","scrollBarBoxMinSize","scrollBarBoxWidth","bar","box","page","pageUpDownOverlap","newWidth","newHeight","resizeEditInput","scroll","overflowX","overflowY","dim","appliedInlineStyles","parentNodeStyle","dontDraw","floor","ellipsisCache","mousemove","overridePos","contextMenu","input","draggingItem","which","stopFreezeMove","mouseup","getLayerPos","dragBounds","sBounds","delta","ctrl","ctrlKey","metaKey","persistantSelectionMode","singleSelectionMode","disallowVerticalAutoScroll","disallowHorizontalAutoScroll","NativeEvent","previousCell","clearTimeout","scrollTimer","isInGrid","rowBoundaryCrossed","columnBoundaryCrossed","cellBoundaryCrossed","prefix","cursorGrab","indicator","getUnhideIndicator","cursor","dragItem","pc","rc","rx","ry","selecting","dragStart","shiftKey","getSelectionBounds","isMultiColumnsSelected","isMultiRowsSelected","ignoreNextClick","contextmenuEvent","toggleCollapseTree","dragAddToSelection","event","getSelectedData","selectedCells","getSelectedCells","selectionBounds","selectRow","selectArea","movingSelectionHandle","autoScrollOnMousemove","movedVertically","autoScrollMargin","movedHorizontally","autoScrollZone","getColumnGroupAt","getRowGroupAt","click","startingBounds","endEdit","unhideColumns","unhideRows","toggleGroup","setStorageData","refresh","leftOffset","topOffset","xInGrid","yInGrid","setActiveCell","selectAll","checkSelectionChange","columnHeaderClickBehavior","treeArrowClickRadius","toggleTree","sb","dragResizeColumn","resizingStartingWidth","resizingStartingHeight","minColumnWidth","minRowHeight","resizeScrollZone","resizeChildGrids","globalRowResize","stopDragResize","hasMoved","dragItemIsSelected","isColumnSelected","fitSelectedColumns","scrollGrid","scrollPointerLock","scrollStartMode","movementX","movementY","scrollMode","scrollStart","scrollModes","setTimeout","scrollRepeatRate","selectionScrollIncrement","stopScrollGrid","exitPointerLock","dragReorder","columReorder","rowReorder","allowColumnReordering","allowRowReordering","selectColumn","source","reorderDeadZone","getVisibleCellByIndex","stopDragReorder","oIndex","tIndex","odata","cr","sortColumnIndices","selectedColumnIndices","deleteCount","dragMove","stopDragMove","moveSelection","freezeMove","startFreezeMove","mousedown","lastMouseDownTarget","button","move","freeze","selectionHandleMove","onUnhideIndicator","requestPointerLock","selection","stopSelectionHandleMove","dragging","controlInput","focus","getAdjacentCells","first","last","keydown","adjacentCells","cols","keepFocusOnMouseOut","isPrintableKeyEvent","beginEditAt","selectNone","deleteSelectedData","Number","isArrowKey","firstSelectedRowIndex","firstSelectedRow","firstSelectedColumnIndex","lastSelectedColumn","yAtTop","yAtBottom","xAtLeft","xAtRight","scrollIntoView","selectionFollowsActiveCell","keyup","keypress","dblclick","fitColumnToValues","autosize","cellTreeExpandCollapse","scrollWheel","deltaX","deltaY","deltaMode","touchHaltAnimation","scrollTo","pasteData","startRowIndex","startColIndex","minRowsLength","minColumnsLength","columnsLength","cellData","forEachSelectedCell","colName","insert","startColumnIndex","reverseRows","reverseColumns","clearSelections","alwaysFilling","affectedCells","cells","rowsLength","fillCellCallback","filledCells","rowPosReal","rowDataPos","fillingRow","rowPosition","realRowIndex","cellsLength","existingRowData","newRowData","fillArgs","rowOffset","reversed","isFillingRow","fillingRowPosition","fillingRowLength","colPosReal","cellDataPos","fillingColumn","columnName","existingCellData","columnOffset","newCellData","isFillingColumn","fillingColumnPosition","fillingColumnLength","boundRowIndexMap","getNextVisibleColumnIndex","visibleColumnIndex","getVisibleSchema","getVisibleColumnIndexOf","getSelectionIndex","len","rowLength","columnLength","paste","clipboardItems","Map","clipboardData","items","supportedMimeTypes","pasteableItems","selectionIndex","itemToPaste","pasteType","getAsString","cut","copySelectedCellsToClipboard","clearSelectedCells","copy","clippingRect","getClippingRect","isInSelectionBounds","clientX","clientY","lastInBoundsLocation","dx","dy","bounds","startRow","startColumn","boundsOld","isVertical","isHorizontal","reverseVertically","reverseHorizontally","touchMoving","touchScrollTimeout","animationFrames","getTouchPos","touchIndex","getBoundingClientRect","easingFunctions","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easing","touchEasingMethod","calculatePPSTimed","touchSigmaTimed","calculatePPS","touchSigma","touchEndAnimation","touchReleaseAnimationDurationMs","stopAnimation","touchEditCell","touchstart","changedTouches","startingCell","disposeContextMenu","clearInterval","calculatePPSTimer","touchContextTimeout","touchStartEvent","zoomAltered","touchStart1","touchScrollStart","touchContextMenuTimeMs","setInterval","touchEndEvents","body","touchmove","passive","touchend","touchcancel","touchSelect","handleType","touchSelecting","rw","rScrollZone","lScrollZone","bScrollZone","tScrollZone","t1","t2","touchDeadZone","touchZoomSensitivity","touchZoomMin","touchZoomMax","selectionScrollZone","touchScroll","touchMove","dz","touchReleaseAcceleration","scrollAnimationPPSThreshold","ctor","treeGridAttributes","storageName","invalidSearchExpClass","localStyleLibraryStorageKey","add","sortFunction","filters","tempSchema","columnTreeRowStartIndex","columnTreeRowEndIndex","origin","sorters","parsers","schemaHashes","changes","componentL1Events","eventNames","expandToRow","viewDataLength","orderedIndex","entries","firstRowAsString","rowAsString","rowDict","textString","copiedData","setData","has","allowGroupingColumns","allowGroupingRows","result","groupIndex","matchedGroup","allGroups","gi","nextCollapsed","isNewGroupRangeValid","groupsArray","gIndex","visibility","localStorage","setItem","createColumnOrders","selectedColumn","applyDefaultValue","defaultValue","createNewRowData","getSchemaNameHash","getFilteredAndSortedViewData","newViewData","originalRowIndex","ranges","countOfRows","headerName","filterText","getHeaderByName","currentFilterFunction","filterFrozenRows","newLen","from2","to2","slice","sortFn","rowA","rowB","rowIndexB","sortFrozenRows","getBestGuessDataType","drawChildGrids","gridKey","setTimer","validateColumn","setDefaults","obj1","obj2","setAttributes","setStyle","findColumnMaxTextLength","dispose","removeChild","eventParent","contextmenu","disconnect","tryLoadStoredSettings","reloadStoredValues","storedSettings","_typeof","tempData","collapsedCount","ctr","ri","lastchild","orTree","ctc","ci","_ri","child","_ci","si","otherData","tempRow","colTrees","collapsedColCount","initCellTreeSettings","invalidRowTree","rt","begin","parentIndex","columnTree","dataColumnLength","invalidColumnTree","ct","getDomRoot","shadowRoot","host","getFontName","fontStyle","getFontHeight","parseFloat","parseStyleValue","initProp","propName","getStyleProperty","styleKeys","supressDrawAndEvent","isDim","getItem","message","init","initialized","publicStyleKeyIntf","initScrollBox","setDom","ie","navigator","userAgent","edge","webKit","moz","blankValues","cursorGrabing","cursorGrabbing","appendTo","clearChangeLog","gotoCell","gotoRow","addButton","toggleCellCollapseTree","expandCollapseCellTree","findColumnScrollLeft","findRowScrollTop","groupColumns","groupRows","removeGroupColumns","removeGroupRows","toggleGroupColumns","toggleGroupRows","getGroupsColumnBelongsTo","getGroupsRowBelongsTo","isCellVisible","isRowVisible","isColumnVisible","clipElement","getSchemaFromData","setFilter","expandTree","collapseTree","insertRow","deleteRow","addRow","insertColumn","deleteColumn","addColumn","setRowHeight","setColumnWidth","resetColumnWidths","resetRowHeights","assertPxColor","clearPxColorAssertions","integerToAlpha","hideColumns","hideRows","addStyleKeyIfNoneExists","DOMStyles","set","valueObject","filterFor","blanksText","filterRegExp","pattern","exec","flags","substring","flagLength","invalidFilterRegEx","RegExp","toLocaleUpperCase","textContent","blur","TypeError","currentCursor","eventName","RangeError","isArray","getTypes","parseInnerHtml","callback","etl","autoGenerateSchema","autoResizeColumns","sHeight","sWidth","setScrollTop","preventScrollEvent","moveButtonPos","setScrollLeft","supressDrawEvent","zIndexTop","hoverScrollTimeout","autoCompleteContext","applyContextItemStyle","contextItemContainer","createInlineStyle","createContextMenu","parentContextMenu","loc","container","createElement","upArrow","downArrow","children","selectedIndex","checkArrowVisibility","startHoverScroll","contextHoverScrollAmount","contextHoverScrollRateMs","endHoverScroll","scrollOffset","contextMenuZIndex","childMenuArrow","removeChildContext","relatedTarget","contains","setAttribute","contextAddCallback","getAttribute","cPos","childContextMenuMarginLeft","childContextMenuMarginTop","createChildContext","addContent","content","childContextMenuArrowHTML","addItem","opacity","position","contextMenuArrowColor","zIndex","inputDropdown","maxHeight","innerHeight","autocompleteBottomMargin","minWidth","contextMenuArrowUpHTML","contextMenuArrowDownHTML","display","timer","animationDurationShowContextMenu","unfade","contextMenuWindowMargin","innerWidth","clickIndex","Event","animationDurationHideContextMenu","isFinite","createFilterContextMenuItems","iRect","filterContainer","filterLabel","filterAutoCompleteButton","filterInput","checkRegExpErrorState","background","contextFilterInputBackground","contextFilterInputColor","contextFilterInvalidRegExpBackground","contextFilterInvalidRegExpColor","createAutoCompleteContext","count","blanksItem","autoCompleteItems","cellValue","maxAutoCompleteItems","disposeAutocomplete","onclick","filterOptionText","contextFilterButtonHTML","cf","removeFilterOptionText","getSelectedContiguousRows","allowOnlyOneRow","prev","ok","addDefaultContextMenuItem","getColumnsMap","_col","isNormalCell","isBackground","isScrollBar","showFilter","showCopy","copyText","execCommand","showPaste","clipBoardData","pasteText","showColumnSelector","columnSelectorText","toggleColumnVisibility","columnSelectorHiddenText","columnSelectorVisibleText","contiguousColumns","memoKey","compare","currentOrderIndex","matchedRange","matchedSchema","thisSchema","getSelectedContiguousColumns","hideColumnText","showClearSettingsOption","clearSettingsOptionText","allowSorting","showOrderByOption","showOrderByOptionTextAsc","showOrderByOptionTextDesc","boundRowIndexes","showHideRow","showHideRows","groupAreaHeight","groupAreaWidth","setCollapseStateForAllGroups","showRemoveAllGroupColumns","showExpandAllGroupColumns","showCollapseAllGroupColumns","showRemoveAllGroupRows","showExpandAllGroupRows","showCollapseAllGroupRows","canGroupByColumns","canUngroupColumns","canGroupByRows","canUngroupRows","groupIndexes","groupTitles","groupNames","showGroupColumns","cell0","cell1","formatArgs","showRemoveGroupColumns","rangeTitle","showGroupRows","showRemoveGroupRows","childGrid","childGridsOfParent","nodeA","nodeB","x1","y1","node","newX1","newY1","contextPosition","contextMenuMarginLeft","contextMenuMarginTop","mobileContextMenuMargin","filterButtonMenuOffsetTop","createDisposeEvent","createButton","imgSrc","wrapper","buttonArrow","buttonIcon","buttonZIndex","buttonMenu","applyButtonStyle","buttonArrowDownHTML","maxWidth","toggleButtonMenu","disposeButtonMenu","createItems","menuItemContainer","buttonMenuItemContainer","applyButtonMenuItemStyle","disposeButton","buttonMenuWindowMargin","createButtonMenu","keyCode","attachButton","ele","boundingRect","eleRect","clipRect","parentRect","Infinity","scrollingElement","editCell","borderWidth","mobileEditInputHeight","groupAreaOffsetY","groupAreaOffsetX","cellPaddingLeft","ignoreScrollOffset","calculatedTree","isTree","abort","newValue","oldValue","aborted","inEnterMode","enumItems","enu","option","valueInEnum","multiLine","editCellZIndex","fontSize","editCellFontSize","cellValueIsEmpty","shouldClearCellValue","nx","ny","altKey","nextRowIndex","className","css","padding","buttonPadding","borderStyle","borderColor","buttonBorderColor","buttonBackgroundColor","userSelect","buttonHoverBackgroundColor","buttonActiveBorderColor","buttonActiveBackgroundColor","verticalAlign","buttonArrowColor","fontWeight","fontFamily","contextMenuFontFamily","contextMenuFontSize","margin","contextMenuItemMargin","borderRadius","contextMenuItemBorderRadius","contextMenuHoverBackground","contextMenuHoverColor","contextMenuLabelMargin","contextMenuLabelDisplay","contextMenuLabelMinWidth","contextMenuLabelMaxWidth","contextMenuBackground","contextMenuColor","border","contextMenuBorder","contextMenuPadding","contextMenuBorderRadius","contextMenuOpacity","overflow","contextMenuCursor","contextFilterInputBorder","contextFilterInputBorderRadius","contextFilterInputFontFamily","contextFilterInputFontSize","contextFilterButtonBorder","contextFilterButtonBorderRadius","contextMenuFilterButtonFontFamily","contextMenuFilterButtonFontSize","cssFloat","childContextMenuArrowColor","contextMenuChildArrowFontSize","boxSizing","outline","mobileEditFontFamily","mobileEditFontSize","editCellBorder","editCellColor","editCellBackgroundColor","appearance","webkitAppearance","mozAppearance","editCellPaddingLeft","editCellFontFamily","boxShadow","editCellBoxShadow","contextMenuFilterInvalidExpresion","onblur","parentIsCanvas","getContext","textBaseline","mergeHiddenRowRanges","newRange","inserted","nextRange","addGroup","groupFor","removeGroup","ordA","charCodeAt","fromCharCode","showFilterInCell","offsetX","offsetY","targetX","targetY","sbh","treeData","colIsSelected","isRowSelected","rowIsSelected","supressEvent","addCol","st","de","dragObject","trArgs","treeGridHeight","beginColumnOrderIndex","endColumnOrderIndex","hiddenColumns","newSize","dontSetStorageData","sorter","firstColumnName","lastColumnName","firstOne","lastOne","error","rowIndexFrom","rowIndexTo","isInteger","dataLength","sel","xi","visibleSchema","selectionLength","maxRowLength","minXi","yi","lastSourceIndex","cidx","indicators","useTouchScrollZones","getBorder","entitiy","borderResizeZone","moveBorder","tsz","touchScrollZone","moveMode","borderDragBehavior","xBorderBehavior","yBorderBehavior","isVerticalScrollBar","isHorizontalScrollBar","allowColumnResize","allowColumnResizeFromCell","allowRowHeaderResize","allowRowResize","allowRowResizeFromCell","columnGrabZoneSize","rowGrabZoneSize","maxCol","minCol","rowHeaderCellFont","autosizePadding","autosizeHeaderCellPadding","rowHeaderCellPaddingRight","rowHeaderCellPaddingLeft","formatter","columnHeaderCellFont","columnHeaderCellPaddingRight","columnHeaderCellPaddingLeft","cellAutoResizePadding","cellFont","cellPaddingRight","total","headerCell","int","asc","aValue","bValue","localeCompare","date","Date","getTime","webComponent","modules","dom","publicMethods","Grid","eval","attachShadow","canvasDatagrid","tKeys","customElements","argKey","tKey","sKey","HTMLElement","observedAttributes","define","require"],"mappings":"s4GAIe,kBAAUA,GACvBA,EAAKC,SAAW,CACdC,WAAY,CACV,CAAC,yBAAyB,GAC1B,CAAC,qBAAqB,GACtB,CAAC,6BAA6B,GAC9B,CAAC,qBAAqB,GACtB,CAAC,wBAAwB,GACzB,CAAC,wBAAwB,GACzB,CAAC,wBAAwB,GACzB,CAAC,sBAAsB,GACvB,CAAC,kBAAkB,GACnB,CAAC,0BAA0B,GAC3B,CAAC,gBAAgB,GACjB,CAAC,qBAAqB,GACtB,CAAC,wBAAwB,GACzB,CAAC,mCAAoC,IACrC,CAAC,mCAAoC,IACrC,CAAC,sBAAsB,GACvB,CAAC,qBAAqB,GACtB,CAAC,kBAAkB,GACnB,CAAC,yBAAyB,GAC1B,CAAC,mBAAoB,GACrB,CAAC,2BAA2B,GAC5B,CAAC,aAAc,YACf,CAAC,qBAAsB,QACvB,CAAC,mBAAoB,IACrB,CAAC,oCAAoC,GACrC,CAAC,0BAA2B,wBAC5B,CAAC,4BAA6B,QAC9B,CAAC,2BAA4B,sBAC7B,CAAC,qBAAsB,sBACvB,CAAC,4BAA6B,KAC9B,CAAC,2BAA4B,GAC7B,CAAC,2BAA4B,GAC7B,CAAC,0BAA0B,GAC3B,CAAC,WAAY,QACb,CAAC,SAAS,GACV,CAAC,YAAY,GACb,CAAC,eAAgB,OACjB,CAAC,mBAAoB,aACrB,CAAC,mBAAoB,eACrB,CAAC,oBAAoB,GACrB,CAAC,mBAAmB,GACpB,CAAC,iBAAkB,WACnB,CAAC,8BAA8B,GAC/B,CAAC,2BAA2B,GAC5B,CAAC,cAAe,eAChB,CAAC,eAAgB,gBACjB,CAAC,YAAa,QACd,CAAC,uBAAuB,GACxB,CAAC,uBAAwB,KACzB,CAAC,aAAa,GACd,CAAC,OAAQ,IACT,CAAC,oBAAqB,GACtB,CAAC,YAAa,SACd,CAAC,2BAA2B,GAC5B,CAAC,yBAA0B,uBAC3B,CAAC,kBAAmB,GACpB,CAAC,mBAAoB,IACrB,CAAC,kBAAmB,GACpB,CAAC,qBAAsB,IACvB,CAAC,kBAAkB,GACnB,CAAC,8BAA+B,KAChC,CAAC,qBAAqB,GACtB,CAAC,mBAAoB,IACrB,CAAC,8BAA8B,GAC/B,CAAC,0BAA2B,QAC5B,CAAC,gBAAiB,QAClB,CAAC,2BAA4B,IAC7B,CAAC,sBAAuB,IACxB,CAAC,2BAA2B,GAC5B,CAAC,qBAAqB,GACtB,CAAC,sBAAsB,GACvB,CAAC,YAAY,GACb,CAAC,cAAc,GACf,CAAC,oBAAoB,GACrB,CAAC,cAAc,GACf,CAAC,qBAAqB,GACtB,CAAC,2BAA4B,yBAC7B,CAAC,4BAA6B,2BAE7B,mBAAoB,oBACrB,CAAC,gBAAiB,iBAClB,CAAC,yBAA0B,mBAC3B,CAAC,sBAAuB,mBACxB,CAAC,4BAA6B,4BAC9B,CAAC,yBAA0B,yBAC3B,CAAC,4BAA6B,4BAC9B,CAAC,yBAA0B,yBAC3B,CAAC,8BAA+B,8BAChC,CAAC,2BAA4B,2BAC7B,CAAC,+BAAgC,SACjC,CAAC,4BAA6B,WAE7B,aAAa,GACd,CAAC,mBAAmB,GACpB,CAAC,kBAAkB,GACnB,CAAC,kBAAkB,GACnB,CAAC,qBAAqB,GACtB,CAAC,uBAAuB,GACxB,CAAC,aAAa,GACd,CAAC,kBAAkB,GACnB,CAAC,yBAA0B,KAC3B,CAAC,gBAAiB,GAClB,CAAC,oBAAqB,eACtB,CAAC,2BAA4B,KAC7B,CAAC,kCAAmC,KACpC,CAAC,kBAAmB,IACpB,CAAC,wBAAyB,IAC1B,CAAC,uBAAwB,MACzB,CAAC,eAAgB,IACjB,CAAC,eAAgB,MACjB,CAAC,gBAAiB,GAClB,CAAC,QAAQ,GACT,CAAC,wBAAwB,GACzB,CAAC,UAAW,IACZ,CAAC,kBAAmB,GACpB,CAAC,aAAc,IACf,CAAC,0BAA2B,GAC5B,CAAC,wBAAyB,IAE5BC,OAAQ,CACN,CAAC,4BAA6B,0BAC9B,CAAC,wBAAyB,0BAC1B,CAAC,wBAAyB,GAC1B,CAAC,kBAAmB,oBACpB,CAAC,iBAAkB,mBACnB,CAAC,iCAAkC,0BACnC,CAAC,gCAAiC,QAClC,CAAC,uBAAwB,oBACzB,CAAC,+BAAgC,yBACjC,CAAC,+BAAgC,GACjC,CAAC,0BAA2B,GAC5B,CAAC,wBAAyB,GAC1B,CAAC,yBAA0B,GAC3B,CAAC,uBAAwB,GACzB,CAAC,oCAAqC,0BACtC,CAAC,0BAA2B,oBAC5B,CAAC,8BAA+B,UAChC,CAAC,wCAAyC,0BAC1C,CAAC,8BAA+B,oBAChC,CAAC,qCAAsC,0BACvC,CAAC,2BAA4B,oBAC7B,CAAC,2BAA4B,IAC7B,CAAC,4BAA6B,GAC9B,CAAC,kBAAmB,GACpB,CAAC,8BAA+B,0BAChC,CAAC,0BAA2B,0BAC5B,CAAC,mBAAoB,uBACrB,CAAC,sBAAuB,YACxB,CAAC,eAAgB,KACjB,CAAC,wBAAyB,0BAC1B,CAAC,oBAAqB,0BACtB,CAAC,6BAA8B,0BAC/B,CAAC,yBAA0B,IAC3B,CAAC,gBAAiB,OAClB,CAAC,wBAAyB,IAC1B,CAAC,sBAAuB,0BACxB,CAAC,kBAAmB,0BACpB,CAAC,kBAAmB,GACpB,CAAC,YAAa,oBACd,CAAC,WAAY,mBACb,CAAC,iBAAkB,KACnB,CAAC,aAAc,IACf,CAAC,0BAA2B,KAC5B,CAAC,0BAA2B,QAC5B,CAAC,2BAA4B,0BAC7B,CAAC,iBAAkB,oBACnB,CAAC,oBAAqB,GACtB,CAAC,kBAAmB,GACpB,CAAC,mBAAoB,GACrB,CAAC,iBAAkB,GACnB,CAAC,8BAA+B,0BAChC,CAAC,oBAAqB,oBACtB,CAAC,0BAA2B,0BAC5B,CAAC,wBAAyB,0BAC1B,CAAC,6BAA8B,0BAC/B,CAAC,wBAAyB,uBAC1B,CAAC,wBAAyB,KAC1B,CAAC,yBAA0B,GAC3B,CAAC,0BAA2B,GAC5B,CAAC,wBAAyB,GAC1B,CAAC,oBAAqB,IACtB,CAAC,wBAAyB,UAC1B,CAAC,YAAa,KACd,CAAC,yBAA0B,KAC3B,CAAC,iBAAkB,UACnB,CAAC,iBAAkB,GACnB,CAAC,kBAAmB,GACpB,CAAC,6BAA8B,uBAC/B,CAAC,4BAA6B,YAC9B,CAAC,8BAA+B,IAChC,CAAC,6BAA8B,GAC/B,CAAC,uBAAwB,IACzB,CAAC,kCAAmC,0BACpC,CAAC,8BAA+B,0BAChC,CAAC,8BAA+B,GAChC,CAAC,qCAAsC,0BACvC,CAAC,iCAAkC,0BACnC,CAAC,iCAAkC,GACnC,CAAC,wBAAyB,uBAC1B,CAAC,uBAAwB,mBACzB,CAAC,yBAA0B,IAC3B,CAAC,sCAAuC,QACxC,CAAC,uCAAwC,0BACzC,CAAC,6BAA8B,oBAC/B,CAAC,gCAAiC,GAClC,CAAC,8BAA+B,GAChC,CAAC,+BAAgC,GACjC,CAAC,6BAA8B,GAC/B,CAAC,oCAAqC,UACtC,CAAC,sCAAuC,0BACxC,CAAC,sCAAuC,GACxC,CAAC,gCAAiC,0BAClC,CAAC,iCAAkC,GACnC,CAAC,qCAAsC,GACvC,CAAC,sCAAuC,GACxC,CAAC,oCAAqC,GACtC,CAAC,gCAAiC,IAClC,CAAC,4BAA6B,oCAC9B,CAAC,kCAAmC,OACpC,CAAC,0BAA2B,YAC5B,CAAC,+BAAgC,uBACjC,CAAC,2BAA4B,oCAC7B,CAAC,iCAAkC,KACnC,CAAC,0BAA2B,iBAC5B,CAAC,+BAAgC,cACjC,CAAC,6BAA8B,QAC/B,CAAC,uCAAwC,sBACzC,CAAC,kCAAmC,0BACpC,CAAC,wBAAyB,uBAC1B,CAAC,2BAA4B,YAC7B,CAAC,yBAA0B,YAC3B,CAAC,wBAAyB,0BAC1B,CAAC,oBAAqB,oCACtB,CAAC,0BAA2B,OAC5B,CAAC,gCAAiC,QAClC,CAAC,mBAAoB,uBACrB,CAAC,oBAAqB,WACtB,CAAC,oCAAqC,cACtC,CAAC,kCAAmC,QACpC,CAAC,oCAAqC,0BACtC,CAAC,wBAAyB,cAC1B,CAAC,sBAAuB,QACxB,CAAC,6BAA8B,0BAC/B,CAAC,wBAAyB,wBAC1B,CAAC,8BAA+B,OAChC,CAAC,wBAAyB,OAC1B,CAAC,0BAA2B,gBAC5B,CAAC,yBAA0B,aAC3B,CAAC,2BAA4B,SAC7B,CAAC,2BAA4B,QAC7B,CAAC,wBAAyB,GAC1B,CAAC,wBAAyB,GAC1B,CAAC,qBAAsB,QACvB,CAAC,qBAAsB,OACvB,CAAC,0BAA2B,IAC5B,CAAC,oBAAqB,KACtB,CAAC,4BAA6B,0BAC9B,CAAC,wBAAyB,0BAC1B,CAAC,uBAAwB,qBACzB,CAAC,aAAc,wBACf,CAAC,qBAAsB,4BACvB,CAAC,YAAa,mBACd,CAAC,2BAA4B,0BAC7B,CAAC,0BAA2B,4BAC5B,CAAC,wBAAyB,4BAC1B,CAAC,yBAA0B,4BAC3B,CAAC,wBAAyB,2BAC1B,CAAC,sBAAuB,4BACxB,CAAC,sBAAuB,2BACxB,CAAC,UAAW,gBACZ,CAAC,0BAA2B,SAC5B,CAAC,iBAAkB,oCACnB,CAAC,oBAAqB,6BACtB,CAAC,gBAAiB,SAClB,CAAC,qBAAsB,cACvB,CAAC,mBAAoB,QACrB,CAAC,sBAAuB,GACxB,CAAC,iBAAkB,KACnB,CAAC,oCAAqC,0BACtC,CAAC,+BAAgC,0BACjC,CAAC,+BAAgC,GACjC,CAAC,+BAAgC,GACjC,CAAC,yBAA0B,uBAC3B,CAAC,0BAA2B,GAC5B,CAAC,yBAA0B,GAC3B,CAAC,8BAA+B,0BAChC,CAAC,0BAA2B,0BAC5B,CAAC,2BAA4B,GAC7B,CAAC,qBAAsB,IACvB,CAAC,mCAAoC,0BACrC,CAAC,4BAA6B,IAC9B,CAAC,oBAAqB,IACtB,CAAC,yBAA0B,0BAC3B,CAAC,+BAAgC,0BACjC,CAAC,0BAA2B,4BAC5B,CAAC,gCAAiC,4BAClC,CAAC,gCAAiC,0BAClC,CAAC,oBAAqB,0BACtB,CAAC,0BAA2B,0BAC5B,CAAC,0BAA2B,GAC5B,CAAC,0BAA2B,0BAC5B,CAAC,oBAAqB,GACtB,CAAC,8BAA+B,0BAChC,CAAC,sBAAuB,0BACxB,CAAC,qBAAsB,YACvB,CAAC,kBAAmB,0BACpB,CAAC,kBAAmB,GACpB,CAAC,sBAAuB,0BACxB,CAAC,gCAAiC,0BAClC,CAAC,SAAU,QACX,CAAC,YAAa,WACd,CAAC,WAAY,WACb,CAAC,iBAAkB,IACnB,CAAC,YAAa,WACd,CAAC,eAAgB,IACjB,CAAC,WAAY,WACb,CAAC,0BAA2B,IAC5B,CAAC,wBAAyB,IAC1B,CAAC,uBAAwB,cACzB,CAAC,qBAAsB,QACvB,CAAC,yBAA0B,GAC3B,CAAC,yBAA0B,yBAC3B,CAAC,4BAA6B,SAC9B,CAAC,OAAQ,WACT,CAAC,YAAa,QACd,CAAC,YAAa,QACd,CAAC,+BAAgC,sBACjC,CAAC,2BAA4B,sBAC7B,CAAC,2BAA4B,MAC7B,CAAC,gCAAiC,yBAClC,CAAC,gCAAiC,MAClC,CAAC,sBAAuB,IACxB,CAAC,+BAAgC,0BACjC,CAAC,2BAA4B,0BAC7B,CAAC,2BAA4B,GAC7B,CAAC,qBAAsB,uBACvB,CAAC,oBAAqB,mBACtB,CAAC,sBAAuB,IACxB,CAAC,mCAAoC,QACrC,CAAC,oCAAqC,0BACtC,CAAC,0BAA2B,oBAC5B,CAAC,6BAA8B,GAC/B,CAAC,2BAA4B,GAC7B,CAAC,4BAA6B,GAC9B,CAAC,0BAA2B,GAC5B,CAAC,kCAAmC,GACpC,CAAC,iCAAkC,uBACnC,CAAC,uCAAwC,0BACzC,CAAC,6BAA8B,uBAC/B,CAAC,iCAAkC,UACnC,CAAC,qBAAsB,IACvB,CAAC,uBAAwB,0BACzB,CAAC,2BAA4B,0BAC7B,CAAC,uBAAwB,0BACzB,CAAC,uBAAwB,IACzB,CAAC,2BAA4B,OAC7B,CAAC,oBAAqB,0BACtB,CAAC,qBAAsB,GACvB,CAAC,sBAAuB,IACxB,CAAC,oBAAqB,GACtB,CAAC,iCAAkC,0BACnC,CAAC,6BAA8B,0BAC/B,CAAC,iBAAkB,IACnB,CAAC,6BAA8B,0BAC/B,CAAC,6BAA8B,KAC/B,CAAC,uBAAwB,yBACzB,CAAC,sBAAuB,GACxB,CAAC,sBAAuB,UACxB,CAAC,yBAA0B,0BAC3B,CAAC,yBAA0B,GAC3B,CAAC,8BAA+B,yBAChC,CAAC,8BAA+B,GAChC,CAAC,uBAAwB,0BACzB,CAAC,uBAAwB,GACzB,CAAC,uBAAwB,GACzB,CAAC,iBAAkB,0BACnB,CAAC,kBAAmB,GACpB,CAAC,sBAAuB,GACxB,CAAC,uBAAwB,GACzB,CAAC,qBAAsB,GACvB,CAAC,iBAAkB,IACnB,CAAC,iBAAkB,KACnB,CAAC,uBAAwB,oBACzB,CAAC,iCAAkC,0BACnC,CAAC,6BAA8B,0BAC/B,CAAC,sBAAuB,IACxB,CAAC,QAAS,UCnYD,yBACTC,EACFC,EAAY,UACdA,EAAUC,oBAAsB,SAA2BC,GACzDA,EAAOA,EAAKC,QAAQ,SAAU,QAE5BC,EADEC,EAAI,UAERC,MAAMC,UAAUC,QAAQC,KAAKP,GAAM,SAAUQ,MACvCN,SACFA,GAAgB,OAChBC,GAAKK,EAAKC,eAGC,MAATD,EAIJL,GAAKK,EAHHN,GAAgB,KAKbC,GAETL,EAAUY,kBAAoB,SAA2BV,EAAMW,OACzDR,EAAI,UACRC,MAAMC,UAAUC,QAAQC,KAAKP,GAAM,SAAUQ,GACvCA,IAASA,EAAKC,cAIlBN,GAAKK,EAHHL,GAAK,IAAMK,EAAKI,kBAKZD,EAAO,SAAW,IAAMR,GAelCL,EAAUe,oBAAsB,SAAUC,EAA4BC,MAC/DA,EAAKC,iBAGNC,EAASC,OAAOC,iBACC,oBAAjBJ,EAAKK,QAAgCL,EAAOA,EAAKM,OACjD,MAEFC,EAAO,GACTP,EAAKQ,cAAgBN,EACrBvB,SAAS4B,IACTA,EAAOA,EAAK5B,SAASE,QAChBU,SAAQ,SAAUkB,OACjBC,EAEQ,MADZA,EAAMR,EAAOS,iBAAiB5B,EAAUY,kBAAkBc,EAAI,IAAI,OAEhEC,EAAMR,EAAOS,iBACX5B,EAAUY,kBAAkBc,EAAI,IAAI,KAG5B,KAARC,GAA6B,iBAARA,GACvBV,EAAKY,iBACHH,EAAI,GACJ3B,UAAe2B,EAAI,KACjBC,EAAIxB,QAAQ,OAAQ,IAAIA,QAAQ,OAAQ,IACxCuB,EAAI,KAEN,OAIDV,GAA8BC,EAAKa,gBACtCC,uBAAsB,WACpBd,EAAKe,QAAO,MAEdf,EAAKa,cAAc,eAAgBb,EAAKgB,UAG5ClC,EAAU,CACRmC,KAAM,SAAUC,cAELC,KAAKC,MAAMF,GAClB,MAAOG,SACD,IAAIC,MAAM,oDAGpBC,OAAQ,SAAUC,cAEPL,KAAKC,MAAMI,GAClB,MAAOH,SACD,IAAIC,MACR,gEAING,OAAQ,SAAUC,EAAQjB,OACpBkB,EAAIC,SAASF,EAAQ,WAClBG,MAAMF,GAAKlB,EAAMkB,GAE1BG,QAAS,SAAUC,SACV,QAAQC,KAAKD,IAEtBE,OAAQ,SAAUC,UACTA,IAGXnD,EAAUoD,wBAA0B,eAC9BC,EAAI,GACNC,EAAQ,CAAC,OAAQ,SAAU,QAAS,YAAa,eACnD1D,SAASyD,GACTA,EAAEzD,SAASC,WAAWW,SAAQ,SAAU+C,GACtCD,EAAME,KAAKD,EAAK,GAAGzC,kBAEdwC,GAETtD,EAAUyD,qBAAuB,gBAC1BC,WAAY,GAEnB1D,EAAU2D,kBAAoB,eACxB1C,EAAO2C,KACX3C,EAAK4C,cAAcC,UAAY,GAC/B7C,EAAK4C,cAAcE,YAAY9C,EAAKM,QACpCN,EAAKyC,WAAY,EACjB1D,EAAUgE,QAAQ/C,GAClBjB,EAAUe,qBAAoB,EAAME,GACpCA,EAAKe,QAAO,IAEdhC,EAAUiE,gBAAkB,gBACrBjC,UAEPhC,EAAUkE,yBAA2B,SAAUC,EAAUC,EAAQC,OAC3DC,EAEF5C,EADAT,EAAO2C,QAEQ,UAAbO,MAIa,SAAbA,QACoB,kCAAlBlD,EAAKsD,WACPtD,EAAKsD,SAAW,2CAElBtD,EAAKiB,KAAOmC,MAGG,WAAbF,KAIa,SAAbA,MAIa,UAAbA,GAAqC,cAAbA,OA9HNK,EAAMC,EACxBpB,KADkBmB,EAiID,aAjIOC,EAiION,EA9HnCvE,SAFIyD,EAAI,IAgIR3B,EA7HI2B,EAAEzD,SAAS4E,GAAME,QAAO,SAAUrB,UAElCA,EAAE,GAAGvC,gBAAkB2D,EAAK3D,eAC5Bd,EAAUY,kBAAkByC,EAAE,MAAQoB,EAAK3D,eAC3Cd,EAAUY,kBAAkByC,EAAE,IAAI,KAAUoB,EAAK3D,iBAElD,UAyHDwD,EAAMvE,UAAe2B,EAAI,UACzBT,EAAKpB,WAAW6B,EAAI,IAAM4C,EAAID,IAG5B,MAAMpB,KAAKkB,IACblD,EAAK0D,iBAAiB,KAAOR,EAAUS,SAAS,IAAKP,UAbrDpD,EAAK4D,KAAOR,OAJZpD,EAAKuB,OAASzC,EAAQyC,OAAO6B,QAX7BrE,EAAUe,qBAAoB,EAAOE,IAgCzCjB,EAAUgE,QAAU,SAAU/C,OACxB6D,EACC1D,OAAO2D,mBAGZ9D,EAAKF,oBAAsB,WACzBf,EAAUe,qBAAoB,EAAOE,GACrCA,EAAKe,WAQP8C,EAAW,IAAI1D,OAAO2D,kBAAiB,SAAUC,OAC3CC,EAAgBC,EACpB5E,MAAMC,UAAUC,QAAQC,KAAKuE,GAAW,SAAUG,GAEnB,UAA3BA,EAASC,eACkB,UAA3BD,EAASC,eAKsB,UAA7BD,EAASE,OAAOC,SAKlBH,EAASE,OAAOE,YACwB,UAAxCJ,EAASE,OAAOE,WAAWD,SAE3BJ,GAAa,EAIbC,EAASE,SAAWpE,IACnBkE,EAASK,WAAWC,OAAS,GAAuB,kBAAlBN,EAASO,QAE5CT,GAAiB,GAlBjBC,GAAa,KAqBbA,GACFjE,EAAKF,qBAAoB,EAAOE,GAE9BgE,IACoB,kCAAlBhE,EAAKsD,WACPtD,EAAKsD,SAAW,sCAElBtD,EAAKiB,KAAOjB,EAAK6C,eAGZE,QAAQ/C,EAAM,CACrB0E,eAAe,EACfC,WAAW,EACX/F,YAAY,EACZgG,SAAS,IAEXvF,MAAMC,UAAUC,QAAQC,KACtBqF,SAASC,iBAAiB,UAC1B,SAAUC,GACRlB,EAASd,QAAQgC,EAAI,CACnBL,eAAe,EACfC,WAAW,EACX/F,YAAY,EACZgG,SAAS,SAKV7F,ECrPM,cAAUL,OACnBsG,EAAe,GACjBC,GAAoB,EACpBC,EAAY,EACZC,EAAiB,IACjBC,EAAc,GAEdC,EAAsB,GACtBC,EAAmB,YAGZC,EAAUC,EAAKC,EAAMC,EAAMjF,GAClCiF,EAAOA,GAAQ,MAEbC,EADEvD,EAAI,OAEHuD,EAAIH,EAAKG,GAAKF,EAAME,GAAKD,EAC5BtD,EAAEuD,QAAaC,IAARnF,EAAoBkF,EAAmB,mBAARlF,EAAqBA,EAAIkF,GAAKlF,SAE/D2B,WAqCAyD,EAASC,OACZC,EACFC,EAAIF,EAAKjD,WAAaiD,EAAKG,eAC3BC,EACEF,EAAEG,WAAaL,EAAKM,SAASD,WAAaL,EAAKO,YAAYF,WAC7DR,EAAIW,KAAKC,MAAMT,EAAKH,EAAIjH,EAAK8H,kBAC7BC,EAAIH,KAAKC,MAAMT,EAAKW,EAAI/H,EAAKgI,oBAC3BhI,EAAKiI,eAAeT,GAAW,IACjCH,EAAMrH,EAAKiI,eAAeT,GAAUH,IAElCrH,EAAKiI,eAAeT,GAAUU,SAAWd,EAAKc,QAC9ClI,EAAKiI,eAAeT,GAAUW,QAAUf,EAAKe,MAIxC,KACAd,EAAIe,uBAGFpI,EAAKqI,IAAIC,UAAUjB,EAAKJ,EAAGc,GALlC/H,EAAKiI,eAAeT,QAAYN,OAQlCX,GAAoB,EAEtBc,EAAM,IAAIkB,MAAMnB,EAAKe,MAAOf,EAAKc,QACjClI,EAAKiI,eAAeT,GAAY,CAC9BH,IAAAA,EACAc,MAAOf,EAAKe,MACZD,OAAQd,EAAKc,QAEfb,EAAImB,OAAS,eAzCTC,EA0CFzI,EAAKqI,IAAIC,UAAUjB,EAAKJ,EAAGc,GA1CzBU,GAAS,EACbC,OAAOC,KAAK3I,EAAKiI,gBAAgBpH,SAAQ,SAAU+H,GAC5C5I,EAAKiI,eAAeW,GAAMvB,IAAIe,WACjCK,GAAS,MAGTA,IAAWlC,IACbA,GAAoB,EACpBvG,EAAK6I,SAqCPxB,EAAIyB,IACF,6BACAC,KACE,kDACE3B,EAAKe,MACL,aACAf,EAAKc,OAHP,qJAOEZ,EAPF,gDAkBG0B,EAAUC,EAAQC,QACrBD,EAAOnD,OAAS,IACpB9F,EAAKqI,IAAIc,YACTnJ,EAAKqI,IAAIe,OACPH,EAAO,GAAKjJ,EAAK8H,iBACjBmB,EAAO,GAAKjJ,EAAKgI,qBAEd,IAAItE,EAAI,EAAGA,EAAIuF,EAAOnD,OAAQpC,GAAK,EAAG,KACnCuD,EAAIgC,EAAOvF,GAAK1D,EAAK8H,iBACrBC,EAAIkB,EAAOvF,EAAI,GAAK1D,EAAKgI,gBAC/BhI,EAAKqI,IAAIgB,OAAOpC,EAAGc,GAEjBmB,EAAMlJ,EAAKqI,IAAIa,OACdlJ,EAAKqI,IAAIiB,mBAQPC,EAAgBtC,EAAGc,EAAGI,EAAOqB,GACpCC,EAASxC,EAAGc,EAAGI,EAAOA,GACtBuB,EAAWzC,EAAGc,EAAGI,EAAOA,OAClBwB,EAAK1C,EAAY,GAARkB,EACTyB,EAAK7B,EAAY,GAARI,EACfa,EAAU,CAAC/B,EAAY,GAARkB,EAAayB,EAAI3C,EAAY,IAARkB,EAAcyB,IAC9CJ,GAAWR,EAAU,CAACW,EAAI5B,EAAY,IAARI,EAAcwB,EAAI5B,EAAY,GAARI,aASjD0B,EAAoB5C,EAAGc,EAAG+B,EAAMC,EAAKC,OAQxCC,EAAIC,EACJjB,EAAQkB,EARNC,EAAoB,GAAPN,EACbO,EAAoB,GAAPP,EAEbQ,EAAWR,EAAO,EAAIM,EAEtBG,EAAST,EAAO,EAAIO,EACpBG,EAA0B,GAAXF,SAGbP,OACD,IAGHI,EAAe,CAAClD,EAAGc,EAAGd,EAAI6C,EAAM/B,EAAGd,EAAI6C,EAAM/B,EAAI+B,EAAM7C,EAAGc,EAAI+B,GAC9Db,EAAS,CAHTgB,EAAKhD,EAAIoD,EACTH,EAAKnC,EAAIqC,EAESH,EAAIC,EAAKI,EAAUL,EAAKM,EAAQL,EAAKM,aAEpD,IAGHL,EAAe,CAAClD,EAAI6C,EAAM/B,EAAGd,EAAGc,EAAGd,EAAGc,EAAI+B,EAAM7C,EAAI6C,EAAM/B,EAAI+B,GAC9Db,EAAS,CAHTgB,EAAKhD,EAAI6C,EAAOO,EAChBH,EAAKnC,EAAIqC,EAESH,EAAIC,EAAKI,EAAUL,EAAKM,EAAQL,EAAKM,aAEpD,IAGHL,EAAe,CAAClD,EAAGc,EAAI+B,EAAM7C,EAAGc,EAAGd,EAAI6C,EAAM/B,EAAGd,EAAI6C,EAAM/B,EAAI+B,GAC9Db,EAAS,CAHTgB,EAAKhD,EAAImD,EACTF,EAAKnC,EAAI+B,EAAOO,EAEEJ,EAAKK,EAAUJ,EAAID,EAAKO,EAAcN,EAAKK,aAE1D,IAGHJ,EAAe,CAAClD,EAAGc,EAAGd,EAAGc,EAAI+B,EAAM7C,EAAI6C,EAAM/B,EAAI+B,EAAM7C,EAAI6C,EAAM/B,GACjEkB,EAAS,CAHTgB,EAAKhD,EAAImD,EACTF,EAAKnC,EAAIsC,EAESJ,EAAKK,EAAUJ,EAAID,EAAKO,EAAcN,EAAKK,MAI7DP,EAAQ,CACVhK,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMoI,2BAClC1K,EAAKqI,IAAIsC,UAAY,EACrB3B,EAAUmB,GAEVnK,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMuI,mCAC5BC,EAAiB,MAARf,GAAuB,MAARA,EAAc,EAAI,EAClC,MAARA,GAAuB,MAARA,EACjBN,EAASxC,EAAI6D,EAAQ/C,EAAG+B,EAAOgB,EAAQhB,GACpCL,EAASxC,EAAGc,EAAI+C,EAAQhB,EAAMA,EAAOgB,GAG5C9K,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMyI,qBAChC/B,EAAUC,GAAQ,YA0DX+B,EAAiB5D,EAAM6D,EAAMC,OAC9BC,EAAcD,EAAUD,EAAKE,YAAc,EAC3CC,EAAWpL,EAAKsC,MAAM+I,kBAAoBrL,EAAKsL,MACnDC,EAAYvL,EAAKsC,MAAMkJ,sBAAwBxL,EAAKsL,MACpDG,EAAczL,EAAKsC,MAAMoJ,wBAA0B1L,EAAKsL,MACxDK,EACE3L,EAAKsC,MAAMsJ,uBAAyB5L,EAAKsL,MACzCH,GAAeC,EAAWhE,EAAKyE,aAE/B5E,EAAIG,EAAKH,EAAIG,EAAKyE,YAAc7L,EAAK8H,iBAAmB6D,EAC1D5D,EAAIX,EAAKW,EAAI/H,EAAKgI,gBAAkBuD,KAElCN,EAAKa,KAAM,CACb9L,EAAKqI,IAAIc,gBACH4C,EAAe/L,EAAKqI,IAAIuC,UACxBoB,EAAiBhM,EAAKqI,IAAIoC,YAE5BrD,EAAK6E,SAAWjM,EAAKkM,OAAOC,eAC9BnM,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM8J,2BAEhCpM,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM+J,sBAGlCrM,EAAKqI,IAAIoB,SAASxC,EAAGc,EAAGqD,EAAUA,GAClCpL,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMgK,wBAClCtM,EAAKqI,IAAIkE,KAAKtF,EAAGc,EAAGqD,EAAUA,GAC9BpL,EAAKqI,IAAIiB,SAETtJ,EAAKqI,IAAIc,YACL8B,EAAKuB,QACPxM,EAAKqI,IAAIe,OAAOnC,EAAI,EAAGc,EAAe,GAAXqD,GAC3BpL,EAAKqI,IAAIgB,OAAOpC,EAAImE,EAAW,EAAGrD,EAAe,GAAXqD,KAEtCpL,EAAKqI,IAAIe,OAAOnC,EAAI,EAAGc,EAAe,GAAXqD,GAC3BpL,EAAKqI,IAAIgB,OAAOpC,EAAImE,EAAW,EAAGrD,EAAe,GAAXqD,GACtCpL,EAAKqI,IAAIe,OAAOnC,EAAe,GAAXmE,EAAgBrD,EAAI,GACxC/H,EAAKqI,IAAIgB,OAAOpC,EAAe,GAAXmE,EAAgBrD,EAAIqD,EAAW,IAErDpL,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAMmK,sBAChCzM,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMoK,sBAClC1M,EAAKqI,IAAIiB,SAETtJ,EAAKqI,IAAIoC,YAAcuB,EACvBhM,EAAKqI,IAAIuC,UAAYmB,SAGhBJ,EAAaP,EAAWK,WA8BxBkB,EAAW1F,EAAGc,EAAG6E,EAAGC,EAAGC,OAG1BC,GAFJ9F,GAAKjH,EAAK8H,kBAEE8E,EACVI,GAFFjF,GAAK/H,EAAKgI,iBAEA6E,EACV7M,EAAKqI,IAAIc,YACTnJ,EAAKqI,IAAIe,OAAOnC,EAAI6F,EAAQ/E,GAC5B/H,EAAKqI,IAAIgB,OAAO0D,EAAID,EAAQ/E,GAC5B/H,EAAKqI,IAAI4E,iBAAiBF,EAAGhF,EAAGgF,EAAGhF,EAAI+E,GACvC9M,EAAKqI,IAAIgB,OAAO0D,EAAGhF,EAAI8E,EAAIC,GAC3B9M,EAAKqI,IAAI4E,iBAAiBF,EAAGC,EAAGD,EAAID,EAAQE,GAC5ChN,EAAKqI,IAAIgB,OAAOpC,EAAI6F,EAAQE,GAC5BhN,EAAKqI,IAAI4E,iBAAiBhG,EAAG+F,EAAG/F,EAAG+F,EAAIF,GACvC9M,EAAKqI,IAAIgB,OAAOpC,EAAGc,EAAI+E,GACvB9M,EAAKqI,IAAI4E,iBAAiBhG,EAAGc,EAAGd,EAAI6F,EAAQ/E,YAErC0B,EAASxC,EAAGc,EAAG6E,EAAGC,GACzB5F,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIoB,SAASxC,EAAGc,EAAG6E,EAAGC,YAEpBnD,EAAWzC,EAAGc,EAAG6E,EAAGC,GAC3B5F,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIqB,WAAWzC,EAAGc,EAAG6E,EAAGC,YAEtBK,EAASC,EAAMlG,EAAGc,GACzBd,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAI6E,SAASC,EAAMlG,EAAGc,YAgBpBqF,EAAeC,GAItBrN,EAAKqI,IAAIc,YACI,IAATkE,IACFrN,EAAKqI,IAAIe,OAAOpJ,EAAKsN,sBAAuBtN,EAAKuN,oBACjDvN,EAAKqI,IAAIgB,OAAOrJ,EAAKsN,sBAAuBtN,EAAKkI,QACjDlI,EAAKqI,IAAIgB,OAAOrJ,EAAKmI,MAAOnI,EAAKkI,QACjClI,EAAKqI,IAAIgB,OAAOrJ,EAAKmI,MAAOnI,EAAKuN,qBAEtB,IAATF,IACFrN,EAAKqI,IAAIe,OAAO,EAAGpJ,EAAKuN,oBACxBvN,EAAKqI,IAAIgB,OAAO,EAAGrJ,EAAKkI,QACxBlI,EAAKqI,IAAIgB,OAAOrJ,EAAKmI,MAAOnI,EAAKkI,QACjClI,EAAKqI,IAAIgB,OAAOrJ,EAAKmI,MAAOnI,EAAKuN,qBAEtB,IAATF,IACFrN,EAAKqI,IAAIe,OAAOpJ,EAAKsN,sBAAuB,GAC5CtN,EAAKqI,IAAIgB,OAAOrJ,EAAKmI,MAAO,GAC5BnI,EAAKqI,IAAIgB,OAAOrJ,EAAKmI,MAAOnI,EAAKkI,QACjClI,EAAKqI,IAAIgB,OAAOrJ,EAAKsN,sBAAuBtN,EAAKkI,SAEnDlI,EAAKqI,IAAImF,gBAEFC,EAAWxG,EAAGc,EAAGgF,MACe,WAAnC/M,EAAKsC,MAAMoL,oCAxCGzG,EAAGc,EAAGgF,GACxB9F,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIc,YACTnJ,EAAKqI,IAAIsF,IAAI1G,EAAGc,EAAGgF,EAAG,EAAG,EAAInF,KAAKgG,IAClC5N,EAAKqI,IAAIa,OAoCA2E,CAAW5G,EAAGc,EAAO,GAAJgF,GAE1BtD,EAASxC,EAAQ,GAAJ8F,EAAShF,EAAQ,GAAJgF,EAASA,EAAGA,YAE/Be,EAAa7G,EAAGc,EAAGgF,MACa,WAAnC/M,EAAKsC,MAAMoL,oCAvCKzG,EAAGc,EAAGgF,GAC1B9F,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIc,YACTnJ,EAAKqI,IAAIsF,IAAI1G,EAAGc,EAAGgF,EAAG,EAAG,EAAInF,KAAKgG,IAClC5N,EAAKqI,IAAIiB,SAmCAyE,CAAa9G,EAAGc,EAAO,GAAJgF,GAE5BrD,EAAWzC,EAAQ,GAAJ8F,EAAShF,EAAQ,GAAJgF,EAASA,EAAGA,YAwBjCiB,EAAcC,EAAGC,GACxBlO,EAAKqI,IAAIc,YACD,CACNgF,EAAG,WACDnO,EAAKqI,IAAIe,OACP6E,EAAEhH,EAAIjH,EAAK8H,iBACXmG,EAAElG,EAAI/H,EAAKgI,iBAEbhI,EAAKqI,IAAIgB,OACP4E,EAAEhH,EAAIjH,EAAK8H,iBAAmBmG,EAAE9F,MAChC8F,EAAElG,EAAI/H,EAAKgI,kBAGf+E,EAAG,WACD/M,EAAKqI,IAAIe,OACP6E,EAAEhH,EAAIjH,EAAK8H,iBAAmBmG,EAAE9F,MAChC8F,EAAElG,EAAI/H,EAAKgI,iBAEbhI,EAAKqI,IAAIgB,OACP4E,EAAEhH,EAAIjH,EAAK8H,iBAAmBmG,EAAE9F,MAChC8F,EAAElG,EAAI/H,EAAKgI,gBAAkBiG,EAAE/F,SAGnC8E,EAAG,WACDhN,EAAKqI,IAAIe,OACP6E,EAAEhH,EAAIjH,EAAK8H,iBACXmG,EAAElG,EAAI/H,EAAKgI,gBAAkBiG,EAAE/F,QAEjClI,EAAKqI,IAAIgB,OACP4E,EAAEhH,EAAIjH,EAAK8H,iBAAmBmG,EAAE9F,MAChC8F,EAAElG,EAAI/H,EAAKgI,gBAAkBiG,EAAE/F,SAGnCkG,EAAG,WACDpO,EAAKqI,IAAIe,OACP6E,EAAEhH,EAAIjH,EAAK8H,iBACXmG,EAAElG,EAAI/H,EAAKgI,iBAEbhI,EAAKqI,IAAIgB,OACP4E,EAAEhH,EAAIjH,EAAK8H,iBACXmG,EAAElG,EAAI/H,EAAKgI,gBAAkBiG,EAAE/F,UAInCgG,KACFlO,EAAKqI,IAAIiB,kBAsMF+E,mBACHzB,EAAI,EACN0B,EAAItO,EAAKuO,YACTtH,EAAI,EACJhE,EAAI2E,KAAK4G,IAAIxO,EAAKyO,aAAcH,EAAExI,QAClC4I,EAAkB1O,EAAK2O,2BAGlB1H,EAAIhE,GAAG,IACHqL,EAAErH,GACA2H,aAIPF,EAAgBG,UACd,SAACC,iCAAU7H,GAAK6H,EAAMC,MAAQ9H,GAAK6H,EAAME,iBACtC,IAILpC,GAAK5M,EAAKiP,eAAehI,IAG7BA,GAAK,SAEA2F,EArrBT5M,EAAKiI,eAAiB,GA4sBtBjI,EAAK6I,KAAO,SAAUqG,kBAChBlP,EAAKmC,cAAc,aAAc,MAGhCnC,EAAKmP,aAAiBnP,EAAKkI,QAAWlI,EAAKmI,UAG5CnI,EAAKmP,aAAeD,EACtB9M,sBAAsBpC,EAAKoP,WAAWvG,eAGd,IAAtB7I,EAAKsB,KAAK+N,aAIVC,EAEF5O,EACAiJ,EACAC,EACA2F,EACAC,EACAC,EACAC,EACA3H,EACAd,EACAgH,EACApB,EACAD,EACA/J,EACA6E,EACAiI,EACAC,EA+DIC,EACFC,EACAC,EAulEEC,EAvpEJC,EAAWjQ,EAAKiQ,UAAY,GAC5BC,EAAuC,aAAlClQ,EAAKsC,MAAM6N,mBAChBC,EAAmB,GACnBC,EAAc,GACdC,EAAmB,GACnBC,EAAa,GACbnC,EAAI6B,EAASnK,OACb0K,EAAIxQ,EAAKyQ,aAAe,GACxBC,EAAyB1Q,EAAK2Q,4BAC9BC,GAAqB5Q,EAAK6Q,wBAC1BC,GAAqB9Q,EAAK+Q,uBAC1BC,GAAyBhR,EAAKiR,2BAE9BC,GAAoB,GAEpBC,GAAsB,GAEtBC,GAAuB,GACvBC,GAAwBrR,EAAK2O,2BAC7B2C,GAAqBtR,EAAKuR,wBAC1BC,GAAaxR,EAAKsC,MAAMkP,WACxBC,GAAwB,EAExBC,GAA6B1R,EAAK2R,gBAC/BC,IAAI,SAACC,iCAAW,CACf9C,KAAM8C,EAAM,GACZC,KAAMD,EAAM,GAAKA,EAAM,GAAK,gBAE7BE,KAAK,SAACC,EAAGhF,iCAAMgF,EAAEjD,KAAO/B,EAAE+B,kBAC/BvI,GAAa,EACb9F,EAAIuR,YAAYC,MAChBlS,EAAKmS,kBAAoB,GAErBlC,EAASnK,OAAS9F,EAAKoS,OAAOC,KAAKvM,QACrC9F,EAAKsS,kBAktEPtS,EAAKqI,IAAIkK,kBA9mCPvS,EAAKwS,YAAc,GACnB3P,EAAS7C,EAAKuO,YACdvO,EAAKyS,aAAe,GACpBzS,EAAK0S,cAAgB,GACrB1S,EAAK2S,wBAA0B,GAC/B3S,EAAKgI,gBAAkBhI,EAAKmP,YAAcnP,EAAK4F,WAAWgN,UAAY,GACtE5S,EAAK8H,iBAAmB9H,EAAKmP,YACzBnP,EAAK4F,WAAWiN,YACf,GACLhG,EAAI7M,EAAKkI,OACT0E,EAAI5M,EAAKmI,UAGH2K,EAAsBpB,GAA2B,GACnDoB,GAAoD,IAA7BA,EAAoB/D,OAC7C0C,GAAwBqB,EAAoBhB,KAC5CJ,GAA2BqB,SA+lC/BC,GA3lCErG,EAAW,EAAG,EAAGC,EAAGC,EAAG,GACvB7M,EAAKqI,IAAImF,OACTxN,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM2Q,oBAChCxJ,EAAS,EAAG,EAAGmD,EAAGC,GAGlB7M,EAAKqI,IAAI6K,UAAUpC,GAAoBE,mBAsXrCmC,EAAKvL,KAAK4G,IAAIyB,EAASnK,OAAQ9F,EAAKoT,eACtCnM,GACGjH,EAAKqT,UAAUC,WAChBtT,EAAKuT,gBACLvT,EAAKsC,MAAMkR,gBACbzL,EAAI2I,EACChJ,EAAW,EAAGA,EAAWyL,GAEvBM,GADWzT,EAAKoS,OAAOC,KAAK3K,GACLA,GAFIA,GAAY,GAM1C1H,EAAKE,WAAWwT,oBAGd3L,EAAI2I,IAAwB3I,GAAK/H,EAAKsC,MAAMqR,mBAChD5L,GAAK/H,EAAKsC,MAAMsR,wBAA0B,aAE5C5T,EAAKuN,mBAAqBxF,EAgtB5B8L,cA7sBE7T,EAAKqI,IAAIkK,OACLvS,EAAKoT,UAAY,IACnBzG,EACE,EACA3M,EAAKuN,mBACLvN,EAAKmI,MACLnI,EAAKkI,OAASlI,EAAKuN,mBACnB,GAEFvN,EAAKqI,IAAImF,YAEPsG,EACFC,EACAC,EACAC,EAAIpR,EAAOiD,WACbmB,GACGjH,EAAKqT,UAAUC,WAChBtT,EAAKuT,gBACLvT,EAAKsC,MAAMkR,gBACRxT,EAAKE,WAAWgU,YACnBnM,IACG/H,EAAKqT,UAAUc,UAChBnU,EAAKoU,eACLpU,EAAKsC,MAAMkR,iBAGb9L,EAAW1H,EAAKoT,UAAYpT,EAAKqU,eACjC3M,EAAW0G,IAGX2F,EAAgB/T,EAAKoS,OAAOC,KAAK3K,GACjC1H,EAAKsU,kBAAoB5M,EACzB1H,EAAKuU,kBAAoBxM,EAEvB/H,EAAKwU,SAASnC,KAAKvM,OAAS,GAC5B4C,OAAOC,KAAK3I,EAAKwU,SAASnC,KAAK0B,IAAgBjO,OAAS,GACxD9F,EAAKwU,SAASnC,KAAK0B,GAAeU,MAG/BhB,GAAQM,EAAerM,IAX5BA,GAAY,MAeV1H,EAAKE,WAAWwU,WAAY,KAC1B1U,EAAKE,WAAWyU,iBAClB1N,GAAK2J,IAEPnB,EAAY+B,GAAaxR,EAAKsC,MAAMkP,WACpChC,GAAU,EAERsE,EAAmB9T,EAAK4U,gBACxBd,EAAmBG,IAGdY,GAAyBf,KAC5BE,EAAchU,EAAKoS,OAAO0C,QAAQhB,GAClC7M,GAAK8N,GAAS/U,EAAKgV,OAAQ/E,EAASnK,OAAQmK,EAASnK,OAAhDiP,CACHlS,EAAOmR,GACPA,EACAF,MAGA7M,EAAIjH,EAAKmI,MAAQnI,EAAKqT,UAAUC,aAVpCQ,GAAoB,GActBvD,EAAW1M,KAAK,CACd7D,EAAKgV,OACL/E,EAASnK,OACTmK,EAASnK,OACTiC,EACA0H,IAGJzP,EAAKqI,IAAI4M,UAooBXC,iBAxZOtF,GAGL5P,EAAKqI,IAAIkK,WACL4C,EACAnV,EAAKoV,WAAWzN,YAAc,EAAI3H,EAAKyO,cACvCzO,EAAKoV,WAAW1N,SAAW,EAAI1H,EAAKoT,UAKxCzG,EAJQwI,EAAKnV,EAAKsN,sBAAwB,EAClC6H,EAAKnV,EAAKuN,mBAAqB,EAC/B4H,EAAKnV,EAAKmI,MAAQnI,EAAKsN,sBAAwBtN,EAAKmI,MACpDgN,EAAKnV,EAAKkI,OAASlI,EAAKuN,mBAAqBvN,EAAKkI,OAC3B,GAC/BlI,EAAKqI,IAAImF,OAC6B,QAAlCxN,EAAKE,WAAWmV,cACdrV,EAAKoV,YAAcpV,EAAKoV,WAAW1N,WAAakI,EAAMlI,WACxD1H,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAMgT,6BAChCtV,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMiT,6BAClC7L,EACE,EACAkG,EAAM7H,EACN/H,EAAKwV,iBAAmB5E,GACxB5Q,EAAKmS,kBAAkBvC,EAAMlI,aAIjC1H,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAMgT,6BAChCtV,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMiT,6BAClC7L,EAAWkG,EAAM3I,EAAG2I,EAAM7H,EAAG6H,EAAMzH,MAAOyH,EAAM1H,SAElDlI,EAAKqI,IAAI4M,WA4XXQ,kBA70CMzF,EAEFtM,EACAgS,EACAC,EACAC,EACAC,EALA5B,EAAIpR,EAAOiD,gBAMJgQ,EAAsBC,EAAOC,OACpCA,EAAMpO,KAAK4G,IAAIwH,EAAK/B,GACfyB,EAAIK,EAAOL,EAAIM,IAClBtS,EAAI1D,EAAKoS,OAAO0C,QAAQY,IACxBE,EAAS/S,EAAOa,IACJkL,QAAWiG,GAAyBa,KAC9C1F,EAAI,CACFiG,MAAOL,EAAOK,MACd/Q,KAAM0Q,EAAO1Q,KACbiD,MAAOyN,EAAOzN,OAASnI,EAAKsC,MAAM4T,UAClC5T,MAAO,mBACPyD,KAAM,SACNoQ,MAAOT,EACPU,MAAO1S,GAETiS,EAAmB,CACjBA,iBAAkBC,EAAOK,OAASL,EAAO1Q,SAE3C+B,GAAK8N,GAASY,GAAmB,GAAI,EAAhCZ,CAAmC/E,EAAGtM,EAAGgS,IACtC1V,EAAKmI,MAAQnI,EAAKqT,UAAUC,cAjBfoC,GAAK,IAuBhCnF,EAAW1P,SAAQ,SAAUwV,EAAOC,GAClCvO,EAAIsO,EAAM,GACV7E,GAAa6E,EAAM,GACfC,IAAYtW,EAAKoT,YACnBpT,EAAKqI,IAAIkK,OACT5F,EACE,EACA3M,EAAKuN,mBACLvN,EAAKmI,MACLnI,EAAKkI,OAASlI,EAAKuN,mBACnB,GAEFvN,EAAKqI,IAAImF,iBA7FQmC,EAASjI,EAAUqM,MACpC/T,EAAKE,WAAWyU,eAAgB,KAO9B4B,EANJtP,EAAI,EAQFsP,EADEvW,EAAKiQ,UAAYvI,EAAW1H,EAAKiQ,SAASnK,OAE1C9F,EAAKwW,iCAAiC9O,GAAY,EAEhC1H,EAAKyW,aACrBzW,EAAKyW,aAAa3Q,OAAS,EAC3BiO,EAAgB,MAElB2C,EACF1W,EAAK2W,oBAAsB3W,EAAK4W,uBAC5BL,EACA7O,EAAW,EAGXmP,EAAgB,CAAEA,cAFxBH,GAAkBjF,IAGZqF,EAAoB,CACxB5R,KAAM,gBACNiD,MAAOnI,EAAK+W,MAAMjC,SAAS,IAAM9U,EAAKsC,MAAMsO,mBAC5CtO,MAAO,gBACPyD,KAAM,SACNxD,KAAMmU,EACNP,OAAQ,MAEV3G,EAAUxP,EAAKgX,aAAatP,GAC5BqN,GAAS8B,EAAe9C,EAAerM,EAAvCqN,CACE+B,GACC,GACA,GAIDpF,GAA2B,IAC3BgF,GAAkBhF,GAA2B,GAAG3C,KAChD,KACQ+C,EAASJ,GAA2BqB,QAApCjB,KACRL,IAAyBK,IAmD3BmF,CAAcZ,EAAM,GAAIA,EAAM,GAAIA,EAAM,OAE1CrW,EAAKqI,IAAI4M,UACLjV,EAAKE,WAAWgX,oBAClBjQ,GACGjH,EAAKqT,UAAUC,WAChBtT,EAAKuT,gBACLvT,EAAKsC,MAAM6U,4BACTnX,EAAKE,WAAWyU,iBAClB1N,GAAK2J,IAEP7I,EAAI,EAEJyJ,GAAaxR,EAAK2Q,4BAClBmF,EAAsB9V,EAAK4U,gBAAiBX,GAC5C4B,EAAuB5O,EACvBA,EAAIjH,EAAKsC,MAAM6U,4BACXnX,EAAKE,WAAWyU,iBAClB1N,GAAK2J,IAEPkF,EAAsB,EAAG9V,EAAKyO,eAE9BxH,EAAI4O,GACIjJ,IACNqB,EAAI,CACF/I,KAAM,GACNiD,MAAOnI,EAAKsC,MAAM8U,eAClB9U,MAAO,sBACP+U,oBAAoB,EACpBC,uBAAuB,EACvBvR,KAAM,SACNoQ,MAAOtT,EAAOiD,QAEhBiP,GAAS,CAAEwC,OAAQ,KAAO,GAAI,EAA9BxC,CAAiC9G,GAAI,GAAI,IAGvCjO,EAAKE,WAAWyU,iBAClBjF,EAAa,CAAEA,WAAY,IAC3BzI,EAAI,EACJgH,EAAI,CACF/I,KAAM,aACNiD,MAAOnI,EAAKsC,MAAMsO,mBAClBtO,MAAO,aACPyD,KAAM,SACNoQ,OAAQ,GAEVpB,GAASrF,GAAa,GAAI,EAA1BqF,CAA6B9G,GAAI,GAAI,KAkvC3CuJ,kBA1XMC,EAAKzX,EAAKuN,mBAAqBvN,EAAKsC,MAAMqR,kBAC5C+D,EAAK1X,EAAKsN,sBAAwBtN,EAAKsC,MAAMqR,kBAC7CgE,EACE3X,EAAKyQ,aAA0C,sBAA3BzQ,EAAKyQ,YAAYnO,MACvCsV,EACE5X,EAAKyQ,aAA0C,yBAA3BzQ,EAAKyQ,YAAYnO,MACrCsO,EAAqB5Q,EAAK6Q,2BAC9B7Q,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAMsR,wBAC5B5T,EAAKE,WAAW2X,yBAEf7X,EAAK8X,sBACL9X,EAAK8X,sBAA0C,sBAAlB9X,EAAK+X,YAE/BL,EAAK1X,EAAKsC,MAAMsO,qBAClB5Q,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM0V,kBAChChY,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAM2V,wBAClCxO,EAASiO,EAAI,EAAG1X,EAAKsC,MAAMqR,kBAAmB3T,EAAKkI,QACnDwB,EAAWgO,EAAI,EAAG1X,EAAKsC,MAAMqR,kBAAmB3T,EAAKkI,SAEvDlI,EAAKqI,IAAIuC,UAAYgN,EACjB5X,EAAKsC,MAAM4V,uBACXlY,EAAKsC,MAAM6V,wBACfnY,EAAKqI,IAAIoC,YAAcmN,EACnB5X,EAAKsC,MAAM8V,6BACXpY,EAAKsC,MAAM6V,wBACf1O,EACEiO,EACA,EACA1X,EAAKsC,MAAMqR,kBACX3T,EAAKsC,MAAMoO,wBAEbhH,EACEgO,EACA,EACA1X,EAAKsC,MAAMqR,kBACX3T,EAAKsC,MAAMoO,2BAKZ1Q,EAAKqY,iBACLrY,EAAKqY,iBAC2B,kBAA/BrY,EAAKqY,gBAAgB/V,QAEvBtC,EAAKyS,aAAa6F,QAAQ,CACxBrR,EAAGyQ,EACH3P,EAAG,EACHG,OAAQlI,EAAKkI,OACbC,MAAOnI,EAAKsC,MAAMqR,kBAClBrR,MAAO,0BAITtC,EAAKE,WAAWwT,kBAAmB,GAElC1T,EAAK8X,sBACL9X,EAAK8X,sBACc,yBAAlB9X,EAAK+X,YAEHN,EAAK7G,IACP5Q,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM0V,kBAChChY,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAM2V,wBAClCxO,EAAS,EAAGgO,EAAIzX,EAAKmI,MAAOnI,EAAKsC,MAAMqR,mBACvCjK,EAAW,EAAG+N,EAAIzX,EAAKmI,MAAOnI,EAAKsC,MAAMqR,oBAE3C3T,EAAKqI,IAAIuC,UAAY+M,EACjB3X,EAAKsC,MAAM4V,uBACXlY,EAAKsC,MAAM6V,wBACfnY,EAAKqI,IAAIoC,YAAckN,EACnB3X,EAAKsC,MAAM8V,6BACXpY,EAAKsC,MAAM6V,wBACf1O,EAAS,EAAGgO,EAAI7G,EAAoB5Q,EAAKsC,MAAMqR,mBAC/CjK,EAAW,EAAG+N,EAAI7G,EAAoB5Q,EAAKsC,MAAMqR,wBAE/CzL,EACFlI,EAAKsC,MAAMqR,kBAAoB3T,EAAKsC,MAAMsR,0BAEzC5T,EAAKqY,iBACLrY,EAAKqY,iBAC2B,qBAA/BrY,EAAKqY,gBAAgB/V,QAEvBtC,EAAKyS,aAAa6F,QAAQ,CACxBrR,EAAG,EACHc,EAAG0P,EACHvP,OAAQA,EACRC,MAAOnI,EAAKmI,MACZ7F,MAAO,sBAGX6O,GAAsB,CAAEpJ,EAAG0P,EAAI5K,EAAG3E,MAEhClI,EAAK8X,wBACP9X,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMiW,wBAChCvY,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMkW,8BACZ,yBAAlBxY,EAAK+X,SAAqC,KACxCU,EAAOzY,EAAK8X,qBAAqB7Q,EACjCyR,EAAW1Y,EAAK2Y,UAAUF,EAAM,MAChCzY,EAAK8X,qBAAqBc,SAAQH,EAAOf,GACzCe,EAAO7H,EAAoB,KACzB3J,EACFyR,EAASzR,EACTjH,EAAKsC,MAAMqR,kBACX3T,EAAKsC,MAAMsR,wBACT6E,EAAOxR,EAAIyR,EAASvQ,MAAQ,IAAGlB,GAAQyR,EAASvQ,OACpDnI,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM0V,kBAChChY,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAM2V,wBAClCxO,EAASxC,EAAG,EAAGjH,EAAKsC,MAAMqR,kBAAmB3T,EAAKkI,QAClDwB,EAAWzC,EAAG,EAAGjH,EAAKsC,MAAMqR,kBAAmB3T,EAAKkI,QACpDlI,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM6V,wBAChCnY,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAM6V,wBAClC1O,EACExC,EACA,EACAjH,EAAKsC,MAAMqR,kBACX3T,EAAKsC,MAAMoO,wBAEbhH,EACEzC,EACA,EACAjH,EAAKsC,MAAMqR,kBACX3T,EAAKsC,MAAMoO,wBAGf1Q,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMuW,8BAChC7Y,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMkW,8BAClC/O,EACEgP,EACA,EACAzY,EAAKsC,MAAMqR,kBACX3T,EAAKsC,MAAMoO,wBAEbhH,EACE+O,EACA,EACAzY,EAAKsC,MAAMqR,kBACX3T,EAAKsC,MAAMoO,wBAEb1Q,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMiW,wBAChC9O,EAASgP,EAAM,EAAGzY,EAAKsC,MAAMqR,kBAAmB3T,EAAKkI,QACrDwB,EAAW+O,EAAM,EAAGzY,EAAKsC,MAAMqR,kBAAmB3T,EAAKkI,YAClD,KACD4Q,EAAO9Y,EAAK8X,qBAAqB/P,EACjC2Q,EAAW1Y,EAAK2Y,UAAU,EAAGG,MAC7B9Y,EAAK8X,qBAAqBc,SAAQE,EAAOrB,GACzCqB,EAAO9Y,EAAKsC,MAAMoO,uBAAwB,KACxC3I,EACF2Q,EAAS3Q,EACT/H,EAAKsC,MAAMqR,kBACX3T,EAAKsC,MAAMsR,wBACTkF,EAAO/Q,EAAI2Q,EAASxQ,OAAS,IAAGH,GAAQ2Q,EAASxQ,QACrDlI,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM0V,kBAChChY,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAM2V,wBAClCxO,EAAS,EAAG1B,EAAG/H,EAAKmI,MAAOnI,EAAKsC,MAAMqR,mBACtCjK,EAAW,EAAG3B,EAAG/H,EAAKmI,MAAOnI,EAAKsC,MAAMqR,mBACxC3T,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM6V,wBAChCnY,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAM6V,wBAClC1O,EAAS,EAAG1B,EAAG6I,EAAoB5Q,EAAKsC,MAAMqR,mBAC9CjK,EAAW,EAAG3B,EAAG6I,EAAoB5Q,EAAKsC,MAAMqR,mBAElD3T,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMuW,8BAChC7Y,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMkW,8BAClC/O,EAAS,EAAGqP,EAAMlI,EAAoB5Q,EAAKsC,MAAMqR,mBACjDjK,EAAW,EAAGoP,EAAMlI,EAAoB5Q,EAAKsC,MAAMqR,mBACnD3T,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMiW,wBAChC9O,EAAS,EAAGqP,EAAM9Y,EAAKmI,MAAOnI,EAAKsC,MAAMqR,mBACzCjK,EAAW,EAAGoP,EAAM9Y,EAAKmI,MAAOnI,EAAKsC,MAAMqR,oBAsNjDoF,IA3eK/Y,EAAKgZ,QAAUhZ,EAAKE,WAAW+Y,uBAChCjZ,EAAKE,WAAWgZ,WAEhBlZ,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAM6W,2BAChCnZ,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAM8W,2BAClCpZ,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM+W,qBAChC/I,EAAiBzP,SAAQ,SAAUoN,aAjnEbA,EAAGC,OACzBoL,EAAKtZ,EAAKsC,MAAMiX,qBACd,CACFC,GAAI,WACF/L,EAAWQ,EAAEhH,EAAIgH,EAAE9F,MAAO8F,EAAElG,EAAGuR,GAC/BxL,EAAaG,EAAEhH,EAAIgH,EAAE9F,MAAO8F,EAAElG,EAAGuR,IAEnCG,GAAI,WACFhM,EAAWQ,EAAEhH,EAAIgH,EAAE9F,MAAO8F,EAAElG,EAAIkG,EAAE/F,OAAQoR,GAC1CxL,EAAaG,EAAEhH,EAAIgH,EAAE9F,MAAO8F,EAAElG,EAAIkG,EAAE/F,OAAQoR,IAE9CI,GAAI,WACFjM,EAAWQ,EAAEhH,EAAGgH,EAAElG,EAAGuR,GACrBxL,EAAaG,EAAEhH,EAAGgH,EAAElG,EAAGuR,IAEzBK,GAAI,WACFlM,EAAWQ,EAAEhH,EAAGgH,EAAElG,EAAIkG,EAAE/F,OAAQoR,GAChCxL,EAAaG,EAAEhH,EAAGgH,EAAElG,EAAIkG,EAAE/F,OAAQoR,MAGtCpL,KA8lEI0L,CAAmB3L,EAAE,GAAIA,EAAE,QACvB4L,EAAK7Z,EAAKE,WAAW4Z,sBAAwB,EAC/CC,EACE9L,EAAE,GAAGhH,GAAc,OAATgH,EAAE,IAAwB,OAATA,EAAE,GAAc,EAAIA,EAAE,GAAG9F,OAAS0R,EAC/DG,EACE/L,EAAE,GAAGlG,GAAc,OAATkG,EAAE,IAAwB,OAATA,EAAE,GAAcA,EAAE,GAAG/F,OAAS,GAAK2R,EAClE7Z,EAAKyS,aAAa6F,QAAQ,CACxBrR,EAAG8S,EACHhS,EAAGiS,EACH9R,OAAQlI,EAAKsC,MAAMiX,oBAAsBM,EACzC1R,MAAOnI,EAAKsC,MAAMiX,oBAAsBM,EACxCvX,MAAO,oBAAsB2L,EAAE,uBA/JhCjO,EAAKia,mBAGNjN,EAAI,CACJ9E,OAAQlI,EAAKia,cAAc/R,OAC3BC,MAAOnI,EAAKia,cAAc9R,MAC1BlB,EAAGjH,EAAKia,cAAchT,EAAIjH,EAAKia,cAAcC,WAAWjT,EACxDc,EAAG/H,EAAKia,cAAclS,EAAI/H,EAAKia,cAAcC,WAAWnS,GAE1DgI,EAAI,CACF5H,MAAOyE,EACP1E,OAAQ2E,EACR5F,EAAG,EACHc,EAAG,MAEP/H,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM6X,6BAChCna,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAM8X,yBAChCpa,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAM+X,yBACZ,gBAAlBra,EAAK+X,SAA4B,KAC9B,IAAIuC,EAAI,EAAGA,EAAIta,EAAKua,WAAWzU,OAAQwU,IACrCta,EAAKua,WAAWD,IAAMA,GAAKta,EAAKia,cAAcvS,WACnDsF,EAAE9E,QAAUlI,EAAKwa,aAAaF,IAEhCtN,EAAE7E,MAAQyE,EACVI,EAAE/F,EAAI,EACN8I,EAAE5H,MAAQyE,EACVmD,EAAE7H,OAASlI,EAAKyQ,YAAYvI,OAC5B6H,EAAEhI,EAAI/H,EAAKyQ,YAAY1I,EACvB0B,EAASuD,EAAE/F,EAAG+F,EAAEjF,EAAGiF,EAAE7E,MAAO6E,EAAE9E,QAC9BwB,EAAWsD,EAAE/F,EAAG+F,EAAEjF,EAAGiF,EAAE7E,MAAO6E,EAAE9E,QAChClI,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAMmY,8BAChCza,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMoY,+BAEgC,IAAhE1a,EAAK2a,aAAaC,QAAQ5a,EAAK6a,cAAcC,eAC7C9a,EAAKyQ,YAAY/I,WAAa1H,EAAKia,cAAcvS,UACjD1H,EAAKyQ,YAAY/I,UAAY,GAC7B1H,EAAKyQ,YAAY/I,SAAW0G,GAE5BJ,EACE+B,EACA/P,EAAK6a,cAAcC,aAAe9a,EAAKia,cAAca,aACjD,IACA,UAGH,GAAsB,mBAAlB9a,EAAK+X,UAAiC/X,EAAKia,cAAe,KAC/Dc,EAAkB/a,EAAKua,WAAW,MAClCQ,MACOT,EAAI,EAAGA,EAAIS,EAAgBjV,OAAQwU,IAC1CtN,EAAE7E,OAASnI,EAAKiP,eACdjP,EAAKoS,OAAO0C,QAAQiG,EAAgBT,KAI1CtN,EAAE9E,OAAS2E,EACXG,EAAEjF,EAAI,EACNgI,EAAE7H,OAAS2E,EACXkD,EAAE5H,MAAQnI,EAAKyQ,YAAYtI,MAC3B4H,EAAEhI,EAAI,EACNgI,EAAE9I,EAAIjH,EAAKyQ,YAAYxJ,EACvBwC,EAASuD,EAAE/F,EAAG+F,EAAEjF,EAAGiF,EAAE7E,MAAO6E,EAAE9E,QAC9BwB,EAAWsD,EAAE/F,EAAG+F,EAAEjF,EAAGiF,EAAE7E,MAAO6E,EAAE9E,QAChClI,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAMmY,8BAChCza,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMoY,+BAG7B,IADH1a,EAAK+a,gBAAgBH,QAAQ5a,EAAK6a,cAAcG,kBAEhDhb,EAAKyQ,YAAYuK,kBACfhb,EAAKia,cAAce,iBACrBhb,EAAK6a,cAAclT,cAAgB3H,EAAKia,cAActS,aACtD3H,EAAKyQ,YAAYuK,iBAAmB,GACpChb,EAAKyQ,YAAYuK,gBAAkBnY,EAAOiD,QAE1CkI,EACE+B,EACA/P,EAAK6a,cAAclT,YAAc3H,EAAKia,cAActS,YAChD,IACA,OA6iBZsT,GAtoBOjb,EAAKkb,kBAGVlb,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAM6Y,uBAChCnb,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAM8Y,uBAClCpb,EAAKqI,IAAIgT,YAAYrb,EAAKsC,MAAMgZ,2BAChCjL,EAAYxP,SAAQ,SAAUoN,GAC5BD,EAAcC,EAAE,GAAIA,EAAE,OAExBjO,EAAKqI,IAAIgT,YAAY,KAsFrBrb,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAMiZ,gBAChCvb,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMkZ,gBAClC9R,EAAW,EAAG,EAAG1J,EAAKmI,MAAOnI,EAAKkI,4BAGzBuT,EAAIxN,GACNjO,EAAK0b,YAAYC,SACpB3b,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAMsZ,4BAChC5b,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMuZ,4BAClC7N,EAAcC,EAAE,GAAIA,EAAE,KAG1BmC,EACGrL,QAAO,SAAUkJ,UAEdA,EAAE,GAAGvG,SAAW1H,EAAKoT,WACrBnF,EAAE,GAAGtG,YAAc3H,EAAKyO,gBAG3B5N,QAAQ4a,GACXzb,EAAKqI,IAAIkK,OACTnF,EAAe,GACfgD,EACGrL,QAAO,SAAUkJ,UAEdA,EAAE,GAAGvG,UAAY1H,EAAKoT,WACtBnF,EAAE,GAAGtG,aAAe3H,EAAKyO,gBAG5B5N,QAAQ4a,GACXzb,EAAKqI,IAAI4M,UACTjV,EAAKqI,IAAIkK,OACTnF,EAAe,GACfgD,EACGrL,QAAO,SAAUkJ,UAEdA,EAAE,GAAGvG,UAAY1H,EAAKoT,WACtBnF,EAAE,GAAGtG,YAAc3H,EAAKyO,gBAG3B5N,QAAQ4a,GACXzb,EAAKqI,IAAI4M,UACTjV,EAAKqI,IAAIkK,OACTnF,EAAe,GACfgD,EACGrL,QAAO,SAAUkJ,UAEdA,EAAE,GAAGvG,SAAW1H,EAAKoT,WACrBnF,EAAE,GAAGtG,aAAe3H,EAAKyO,gBAG5B5N,QAAQ4a,GACXzb,EAAKqI,IAAI4M,yBA8BJjV,EAAK0b,YAAYC,SAAW3b,EAAK0b,YAAYI,cAIlD9b,EAAKqI,IAAIkK,WAEHwJ,EAAU/b,EAAK0b,YACfC,EAASI,EAAQJ,OACjBK,EAAMD,EAAQD,OAAO7U,EACrBgV,EAAMF,EAAQD,OAAO/T,EAOrBmU,EAAOH,EAAQG,KAOfC,EACkB,MAAtBJ,EAAQK,UACJF,EACEA,EAAKjV,GAAK8U,EAAQ9U,EAAI+U,EAAM,EAAIE,EAAK/T,OACrC4T,EAAQ9U,EACV0U,EAAO1U,EACPoV,OACkBnV,IAAtB6U,EAAQK,WAAiD,MAAtBL,EAAQK,UACvCF,EACEA,EAAKnU,GAAKgU,EAAQhU,EAAIkU,EAAM,EAAIC,EAAKhU,QACrC6T,EAAQhU,EACV4T,EAAO5T,EAIPd,EAAIW,KAAK0U,IAAI1U,KAAK4G,IAAIwN,EAAKG,GAAUJ,EAAQQ,MAC7CxU,EAAIH,KAAK0U,IAAI1U,KAAK4G,IAAIyN,EAAKI,GAAUN,EAAQS,MAM7CrU,EAAQP,KAAK0U,IAAIN,EAAKG,GAAWlV,EACjCiB,EAASN,KAAK0U,IAAIL,EAAKI,GAAWtU,EAExC/H,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMma,uBAClCzc,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAMoa,uBAChC1c,EAAKqI,IAAIgT,YAAY,CAAC,EAAG,IACzB3R,EAAWzC,EAAGc,EAAGI,EAAOD,GACxBlI,EAAKqI,IAAIgT,YAAY,IACrBrb,EAAKqI,IAAI4M,UAjFT0H,GAofFC,GAlsEI9M,EAAK9P,EAAKqT,UAAUwJ,SACpB9M,EAAoC,EAAhC/P,EAAKsC,MAAMwa,mBACjB9c,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMya,qBAClC/c,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAM0a,qBAC5Bhd,EAAKyO,aAAe,EACtBqB,EAAGmN,cAAchW,EACf2J,GACA5Q,EAAKsC,MAAMwa,mBACX9c,EAAKkd,YAAYjW,EAAEjH,EAAKyO,aAAe,IACtCqB,EAAGqN,cAAchV,MAChBnI,EAAKkd,YAAYjW,EAAEjH,EAAKyO,aAAe,GACvCzO,EAAKqT,UAAU+J,iBACdpd,EAAKqT,UAAUC,WAAatT,EAAKqT,UAAUgK,aAEhDvN,EAAGmN,cAAchW,EACf2J,GACA5Q,EAAKsC,MAAMwa,oBACVhN,EAAGqN,cAAchV,MAAQnI,EAAKqT,UAAU+J,iBACtCpd,EAAKqT,UAAUC,WAAatT,EAAKqT,UAAUgK,aAElDvN,EAAGwN,YAAYvV,EACb2I,EACA1Q,EAAKsC,MAAMwa,mBACX9c,EAAKkd,YAAYnV,EAAE/H,EAAKoT,YACvBtD,EAAGyN,YAAYrV,OACdlI,EAAKqT,UAAUmK,gBACfxd,EAAKkd,YAAYnV,EAAE/H,EAAKoT,aACvBpT,EAAKqT,UAAUc,UAAYnU,EAAKqT,UAAUoK,cAC3Czd,EAAKqT,UAAUqK,uBACjB1d,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMqb,yBAChClU,EACEqG,EAAGqN,cAAclW,EACjB6I,EAAGqN,cAAcpV,EACjB+H,EAAGqN,cAAchV,MAAQ4H,EACzBD,EAAGqN,cAAcjV,QAEnBwB,EACEoG,EAAGqN,cAAclW,EACjB6I,EAAGqN,cAAcpV,EACjB+H,EAAGqN,cAAchV,MAAQ4H,EACzBD,EAAGqN,cAAcjV,QAEnBlI,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMsb,kBAC5B5d,EAAKqT,UAAUwK,uBACb,aAAava,KAAKkN,EAAEsN,WACtB9d,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMyb,sBAElCpR,EACEmD,EAAGmN,cAAchW,EACjB6I,EAAGmN,cAAclV,EACjB+H,EAAGmN,cAAc9U,MACjB2H,EAAGmN,cAAc/U,OACjBlI,EAAKsC,MAAM0b,0BAEbhe,EAAKqI,IAAIiB,SACTtJ,EAAKqI,IAAIa,QAEX2G,GAAa,EACb7P,EAAKyS,aAAa6F,QAAQxI,EAAGqN,eAC7Bnd,EAAKyS,aAAa6F,QAAQxI,EAAGmN,gBAE3Bjd,EAAKqT,UAAU4K,qBACjBje,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMqb,yBAChClU,EACEqG,EAAGyN,YAAYtW,EACf6I,EAAGyN,YAAYxV,EACf+H,EAAGyN,YAAYpV,MACf2H,EAAGyN,YAAYrV,OAAS6H,GAE1BrG,EACEoG,EAAGyN,YAAYtW,EACf6I,EAAGyN,YAAYxV,EACf+H,EAAGyN,YAAYpV,MACf2H,EAAGyN,YAAYrV,OAAS6H,GAEtB/P,EAAKqT,UAAU6K,qBACjBle,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMsb,kBAC5B,WAAWta,KAAKkN,EAAEsN,WACpB9d,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMyb,sBAElCpR,EACEmD,EAAGwN,YAAYrW,EACf6I,EAAGwN,YAAYvV,EACf+H,EAAGwN,YAAYnV,MACf2H,EAAGwN,YAAYpV,OACflI,EAAKsC,MAAM0b,0BAEbhe,EAAKqI,IAAIiB,SACTtJ,EAAKqI,IAAIa,QAEX2G,GAAa,EACb7P,EAAKyS,aAAa6F,QAAQxI,EAAGyN,aAC7Bvd,EAAKyS,aAAa6F,QAAQxI,EAAGwN,cAE3BzN,IAEF7P,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAM6b,2BAClCne,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM8b,+BAChCzR,EACEmD,EAAGuO,OAAOpX,EACV6I,EAAGuO,OAAOtW,EACV+H,EAAGuO,OAAOlW,MACV2H,EAAGuO,OAAOnW,OACV,GAEFlI,EAAKqI,IAAIiB,SACTtJ,EAAKqI,IAAIa,OACTlJ,EAAKyS,aAAa6F,QAAQxI,EAAGuO,SAylE7B/O,GACFtP,EAAKqC,QAAO,kBAjmCNqV,EAAK5G,GACL2G,EAAKzG,GACLsN,EAAqBjQ,IACrBkQ,EACJpN,GAAoBpJ,EAAIoJ,GAAoBtE,EAAI6D,EAC5C8N,EAA6D,SAAjDxe,EAAKE,WAAWue,6BAC5BC,EAAyD,QAA9C1e,EAAKE,WAAWye,0BAG3BtW,EAAMrI,EAAKqI,IACjBA,EAAIkK,OACJlK,EAAIuC,UAAY5K,EAAKsC,MAAMsc,4BAC3BnV,EAAS,GAAIgO,EAAI7K,EAAG6K,GACpBhO,GAAUiO,GAAKD,EAAIC,EAAI7K,GACvBxE,EAAI4M,kBAIE4J,EAAiB,GACdC,EAAM,EAAGA,EAAM9e,EAAK6e,eAAe/Y,OAAQgZ,YAC5CC,EAAS/e,EAAK6e,eAAeC,GAC1BE,EAAI,EAAGA,EAAID,EAAOjZ,OAAQkZ,IACjCH,EAAehb,KAAK6E,OAAOuW,OAAO,CAAEH,IAAAA,GAAOC,EAAOC,KAGlDH,EAAe/Y,OAAS,sBACpB2J,EAAYzP,EAAKsC,MAAM4c,qBACvBC,EAA+B,GAAZ1P,EACnB2P,EAAuD,IAAhC3P,EAAY0P,cAEhCzb,cACDoL,EAAQ+P,EAAenb,GACrBob,EAAmBhQ,EAAnBgQ,IAAKtV,EAAcsF,EAAdtF,UAEP6V,EAAaP,EAAMrP,EAAXgI,EACR6H,EAAUD,EAAmB,GAAZ5P,EACjB8P,EAAUF,EAAO5P,EAAY2P,EAC7BI,EACJ5O,GAAqBuO,EAAmBC,EAEpCK,EAAqB,SAACxY,iCAC1BsC,EACEtC,EACAoY,EAAOD,EACPD,EACArQ,EAAMtF,uBAEJkW,EAAsB,SAACC,EAAOC,iCAClC5f,EAAK0S,cAAc7O,KAAK,CACtBkC,KAAM,IACNyD,UAAAA,EACAuF,KAAMD,EAAMC,KACZC,GAAIF,EAAME,GACV8P,IAAAA,EACA7X,EAAG0Y,EAAQjI,EACX3P,EAAGsX,EAAO5H,EACVoI,GAAID,EAASlI,EACboI,GAAIP,EAAU9H,gBAIZsI,EACJjR,EAAMC,KAAO/O,EAAKyO,cAAgBK,EAAME,IAAMhP,EAAKyO,aAC/CuR,EAAclR,EAAMC,MAAQ/O,EAAKyO,gBAGnCjF,EAAW,KACTmW,EAAQH,EAAYL,KAEpBrQ,EAAMC,KAAO,EAAG,KACdkR,EAAWnR,EAAME,GAAK,EACtBkR,EAAM9O,GAAqB6O,MAC1BC,EAMHP,EAAQO,EAAIjZ,EAAImY,MANR,IACRa,EAAWnR,EAAMC,KAAO,IACxBmR,EAAM9O,GAAqB6O,IACjB,iBACVN,EAAQO,EAAIjZ,EAAIiZ,EAAItT,EAAuB,GAAnBuS,KAItBc,GAAYjgB,EAAKyO,gBAIfkR,EAFFrB,EAAqB1N,GAAqBwO,EAEvB,qBAGnBQ,EAASD,EAAQR,EACvB9W,EAAIkK,OACJlK,EAAIoC,YAAczK,EAAKsC,MAAM6d,oBAC7B9X,EAAIuC,UAAY5K,EAAKsC,MAAM8d,8BAC3BX,EAAmBE,GACnBtX,EAAI4M,UACJyK,EAAoBC,EAAOC,OAIzBS,SACAC,EAAOlP,GAAqBtC,EAAMC,MAClCwR,EAAQnP,GAAqBtC,EAAME,IAEnCwR,GAAmB,EACnBC,GAAc,MAClBJ,EAAMvR,EAAMC,MACJuR,GAAQD,EAAMvR,EAAME,IAC1BsR,EAAOlP,KAAuBiP,GAC9BG,GAAmB,MAErBH,EAAMvR,EAAME,IACJuR,GAASF,EAAMvR,EAAMC,MAC3BwR,EAAQnP,KAAuBiP,GAC/BI,GAAc,MAEXH,IAASC,EAAO,qBACjBX,EAASW,EAAMtZ,EAAIsZ,EAAM3T,EACzB+S,EAAQW,EAAKrZ,KACb8Y,EAAgB,KACZW,EAAetP,GAAqBpR,EAAKyO,aAAe,MAC1DiS,EAAc,KACZC,EAAWD,EAAazZ,EAAIyZ,EAAa9T,EACxC4R,IAAWmC,GAAYxB,GACxBwB,GAAYf,IAEdA,GADAW,EAAQG,GACOzZ,EAAIsZ,EAAM3T,EACzB6T,GAAc,QAKhBG,EACFhQ,IAAsBoP,EAAc1B,EAAqB,MACvDsB,GAAUpB,EAAY,EAAIW,GAAoByB,EAAU,iBAE5DhB,GAAUR,EACVO,GAASP,EAET/W,EAAIkK,OACJlK,EAAIoC,YAAczK,EAAKsC,MAAM6d,oBAC7B9X,EAAIuC,UAAY5K,EAAKsC,MAAM8d,kCACrBS,EAAa,GAEfrC,GAGEmB,GADJiB,GAAkC,EAAtBxB,KACUO,EAAQiB,GACX,IAAf9R,EAAMC,OAAY4Q,GAA+B,EAAtBP,GAC3BQ,GAAUD,GACZkB,EAAWhd,KAAK8b,EAAOL,EAASM,EAAQN,GACpCmB,GAAaI,EAAWhd,KAAK+b,EAAQL,IAEzCK,EAASD,EAIXF,EADAE,GAASR,GAGTS,GAAUR,EAAsB,IAG5BO,EAAQiB,IAAUjB,EAAQiB,GACX,IAAf9R,EAAMC,OAAY4Q,GAA+B,EAAtBP,GAC3BqB,IACE3R,EAAME,KAAOhP,EAAKyO,aAAe,EACnCmR,GAAUT,EAEVS,GAAgC,EAAtBR,EAEZK,EAAmBG,IAEjBD,EAAQC,EACVD,EAAQC,GAEW,IAAf9Q,EAAMC,OACRyR,GAAmB,EACnBb,EAAQH,EAAYL,GAElBqB,GAAkBK,EAAWhd,KAAK8b,EAAOJ,GAC7CsB,EAAWhd,KAAK8b,EAAOL,EAASM,EAAQN,IAI1CK,GAASP,EAAsB,EAC3BqB,IAAab,GAAUT,IAE7BnW,EAAU6X,GACVxY,EAAI4M,UACJyK,EAAoBC,EAAOC,IA5JpBlc,EAAI,EAAGA,EAAImb,EAAe/Y,OAAQpC,MAAlCA,cAmKLod,EAAc,GACXZ,EAAM,EAAGA,EAAMlgB,EAAK8gB,YAAYhb,OAAQoa,YACzCnB,EAAS/e,EAAK8gB,YAAYZ,GACvBlB,EAAI,EAAGA,EAAID,EAAOjZ,OAAQkZ,IACjC8B,EAAYjd,KAAK6E,OAAOuW,OAAO,CAAEiB,IAAAA,GAAOnB,EAAOC,KAG/C8B,EAAYhb,OAAS,sBACjBib,EAAW/gB,EAAKsC,MAAM0e,oBACtB7B,EAA8B,GAAX4B,EACnB3B,EAAsD,IAA/B2B,EAAW5B,cAE/Bzb,cACDoL,EAAQgS,EAAYpd,GAClBwc,EAAmBpR,EAAnBoR,IAAK1W,EAAcsF,EAAdtF,UAEPmW,EAAcO,EAAMa,EAAXrJ,EACTuJ,EAAUtB,EAAmB,GAAXoB,EAClBnB,EAASD,EAAQoB,EAAW3B,EAC5B8B,EACJxQ,EAAyByO,EAAmBC,EAExC+B,EAAqB,SAACpZ,iCAC1BwB,EACEoW,EAAQP,EACRrX,EACAoX,EACArQ,EAAMtF,uBAEJkW,EAAsB,SAACL,EAAME,iCACjCvf,EAAK0S,cAAc7O,KAAK,CACtBkC,KAAM,IACNyD,UAAAA,EACAuF,KAAMD,EAAMC,KACZC,GAAIF,EAAME,GACVkR,IAAAA,EACAjZ,EAAG0Y,EAAQjI,EACX3P,EAAGsX,EAAO5H,EACVoI,GAAID,EAASlI,EACboI,GAAIP,EAAU9H,gBAIZsI,EACJjR,EAAMC,KAAO/O,EAAKoT,WAAatE,EAAME,IAAMhP,EAAKoT,UAC5C4M,EAAclR,EAAMC,MAAQ/O,EAAKoT,aAGnC5J,EAAW,KACT6V,EAAO6B,EAAW/B,KAElBrQ,EAAMC,KAAO,EAAG,KACdrH,EAAWoH,EAAME,GAAK,EACtB8P,EAAM5N,GAAkBxJ,MACvBoX,EAMHO,EAAOP,EAAI/W,MANH,IACRL,EAAWoH,EAAMC,KAAO,IACxB+P,EAAM5N,GAAkBxJ,IACd,iBACV2X,EAAOP,EAAI/W,EAAI+W,EAAIjS,EAAuB,GAAnBsS,KAIrBzX,GAAY1H,EAAKoT,aAMfiM,EAJFd,EACA7N,EACA0O,EAEkB,qBAGlBG,EAAUF,EAAOF,EACvB9W,EAAIkK,OACJlK,EAAIoC,YAAczK,EAAKsC,MAAM6d,oBAC7B9X,EAAIuC,UAAY5K,EAAKsC,MAAM8d,8BAC3Be,EAAmB9B,GACnBhX,EAAI4M,UACJyK,EAAoBL,EAAME,OAIxBc,SACAe,EAAMlQ,GAAkBpC,EAAMC,MAC9BsS,EAASnQ,GAAkBpC,EAAME,IAEjCwR,GAAmB,EACnBC,GAAc,MAClBJ,EAAMvR,EAAMC,MACJqS,GAAOf,EAAMvR,EAAME,IACzBoS,EAAMlQ,KAAoBmP,GAC1BG,GAAmB,MAErBH,EAAMvR,EAAME,IACJqS,GAAUhB,EAAMvR,EAAMC,MAC5BsS,EAASnQ,KAAoBmP,GAC7BI,GAAc,MAEXW,IAAQC,EAAQ,qBACjB9B,EAAU8B,EAAOtZ,EAAIsZ,EAAOxU,EAC5BwS,EAAO+B,EAAIrZ,KACXgY,EAAgB,KACZuB,EAAgBpQ,GAAkBlR,EAAKoT,UAAY,MACrDkO,EAAe,KACbC,EAAWD,EAAcvZ,EAAIuZ,EAAczU,EAC1C6R,IAAU6C,GAAYpC,GACvBoC,GAAYhC,IAEdA,GADA8B,EAASC,GACQvZ,EAAIsZ,EAAOxU,EAC5B4T,GAAc,QAKhBe,EACF9Q,GAA0BsP,EAAczB,EAAmB,MACzDgB,GAAWb,EAAW,EAAIS,GAAoBqC,EAAS,iBAE3DjC,GAAWH,EACXC,GAAQD,EAER/W,EAAIkK,OACJlK,EAAIoC,YAAczK,EAAKsC,MAAM6d,oBAC7B9X,EAAIuC,UAAY5K,EAAKsC,MAAM8d,kCACrBS,EAAa,GAEfnC,GAGEW,GADJmC,GAAiC,EAAtBpC,KACSC,EAAOmC,GACR,IAAf1S,EAAMC,OAAYsQ,GAA8B,EAAtBD,GAC1BG,GAAWF,GACbwB,EAAWhd,KAAKod,EAAS5B,EAAM4B,EAAS1B,GACpCkB,GAAaI,EAAWhd,KAAK+b,EAAQL,IAEzCA,EAAUF,EAIZ8B,EADA9B,GAAQF,GAIRI,GAAWH,EAAsB,IAG7BC,EAAOmC,IAASnC,EAAOmC,GACR,IAAf1S,EAAMC,OAAYsQ,GAA8B,EAAtBD,GAC1BqB,IACE3R,EAAME,KAAOhP,EAAKoT,UAAY,IAChCmM,GAAWJ,GAIbgC,EAAmB5B,IAEjBF,EAAOE,EACTF,EAAOE,GAEY,IAAfzQ,EAAMC,OACRyR,GAAmB,EACnBnB,EAAO6B,EAAW/B,GAEhBqB,GAAkBK,EAAWhd,KAAK+b,EAAQP,GAC9CwB,EAAWhd,KAAKod,EAAS5B,EAAM4B,EAAS1B,GAExCF,GAAQD,EAAsB,GAG5BqB,IAAalB,GAAWJ,IAE9BnW,EAAU6X,GACVxY,EAAI4M,UACJyK,EAAoBL,EAAME,IA/JnB7b,EAAI,EAAGA,EAAIod,EAAYhb,OAAQpC,MAA/BA,MAs5Bb+d,GAhHEzhB,EAAKqI,IAAIkK,QAELvS,EAAKE,WAAWwhB,iBAAmB1hB,EAAKE,WAAWyhB,SACzB,IAAxBrb,EAAaR,SACfQ,EAAeO,EAAU,EAAGJ,EAAgB,EAAG,IAEjDH,EAAasb,MACbtb,EAAagS,QAAQrG,YAAYC,MAAQxR,IAEtCV,EAAKE,WAAWyhB,OAIrB3hB,EAAKqI,IAAIwZ,KAAO7hB,EAAKsC,MAAMwf,WAC3B9R,EAAI,IACF+R,MACAzb,EAAa0b,QAAO,SAAUhQ,EAAGhF,UACxBgF,EAAIhF,IACV,GAAKpF,KAAK4G,IAAIhI,EAAWF,EAAaR,SACzCmc,QAAQ,GACVjS,EAAEkS,UAAY5b,EAAa,GAAG2b,QAAQ,GACtCjS,EAAEsO,mBAAqBjQ,IACvB2B,EAAEmS,WAAazZ,OAAOC,KAAK3I,EAAKiI,gBAAgBnC,OAChDkK,EAAEiK,cACA,OACCja,EAAKia,eAAiB,CAAEtS,YAAa,IAAKA,YAC3C,SACC3H,EAAKia,eAAiB,CAAEvS,SAAU,IAAKA,SAC1CsI,EAAE6K,cACA,OACC7a,EAAK6a,eAAiB,CAAElT,YAAa,IAAKA,YAC3C,SACC3H,EAAK6a,eAAiB,CAAEnT,SAAU,IAAKA,SAC1CsI,EAAE1E,MAAQtL,EAAKsL,MACf0E,EAAEoS,WAAapiB,EAAKoiB,WACpBpS,EAAEqS,WAAariB,EAAKqiB,WACpBrS,EAAEsS,eAAiBtiB,EAAKsiB,eACxBtS,EAAEuS,YAAcviB,EAAKuiB,YACrBvS,EAAEwS,QACA,QACCxiB,EAAKyiB,eAAiB,CAAE1a,EAAG,IAAKA,EACjC,SACC/H,EAAK0iB,gBAAkB,CAAE3a,EAAG,IAAKA,EACpCiI,EAAEqD,UAAYrT,EAAKqT,UAAU5L,WAC7BuI,EAAE2S,YACA,MAAQ3iB,EAAK4U,gBAAkB,QAAU5U,EAAKqU,eAChDrE,EAAE4S,YACA,MAAQ5iB,EAAKuT,gBAAkB,QAAUvT,EAAKoU,eAChDpE,EAAE6S,aACA,MAAQ7iB,EAAK8H,iBAAmB,QAAU9H,EAAKgI,gBACjDgI,EAAE8S,WAAa,MAAQ9iB,EAAK8iB,WAAW7b,EAAI,QAAUjH,EAAK8iB,WAAW/a,EACrEiI,EAAE+S,eACA,MAAQ/iB,EAAK+iB,eAAe9b,EAAI,QAAUjH,EAAK+iB,eAAehb,EAChEiI,EAAEgT,gBACA,MAAQhjB,EAAKgjB,gBAAgB/b,EAAI,QAAUjH,EAAKgjB,gBAAgBjb,EAClEiI,EAAEiT,SAAW,MAAQjjB,EAAKkjB,KAAO,QAAUljB,EAAKmjB,KAChDnT,EAAEoT,UAAY,MAAQpjB,EAAKqjB,MAAQ,QAAUrjB,EAAKsjB,MAClDtT,EAAEuT,cAAgBvjB,EAAKujB,cACvBvT,EAAEwT,oBAAsBxjB,EAAKwjB,oBACzBxjB,EAAKwjB,oBAAoBvc,EAAI,KAAOjH,EAAKwjB,oBAAoBzb,EAC7D,GACJiI,EAAElG,KAAO,MAAQ9J,EAAKmI,MAAQ,QAAUnI,EAAKkI,OAC7C8H,EAAEyT,MAAQ,MAAQzjB,EAAKyjB,MAAMxc,EAAI,QAAUjH,EAAKyjB,MAAM1b,EACtDiI,EAAE0T,MAAS1jB,EAAK2jB,WAEZ,MAAQ3jB,EAAK2jB,WAAW1c,EAAI,QAAUjH,EAAK2jB,WAAW5b,EADtD,GAEJiI,EAAE6M,SAAW7c,EAAKyS,aAAa3M,OAC/BkK,EAAE4T,SAAW5jB,EAAK4jB,SAClB5T,EAAE+H,SAAW/X,EAAK+X,SACd/X,EAAKyQ,cACPT,EAAErI,YAAc3H,EAAKyQ,YAAY9I,YACjCqI,EAAEtI,SAAW1H,EAAKyQ,YAAY/I,SAC9BsI,EAAEgL,gBAAkBhb,EAAKyQ,YAAYuK,gBACrChL,EAAE8K,aAAe9a,EAAKyQ,YAAYqK,aAClC9K,EAAE8N,QAAU9d,EAAKyQ,YAAYqN,QAC7B9N,EAAE6T,YAAc7jB,EAAKyQ,YAAYoT,YACjC7T,EAAE1N,MAAQtC,EAAKyQ,YAAYnO,MAC3B0N,EAAEjK,KAAO/F,EAAKyQ,YAAY1K,MAE5B/F,EAAKqI,IAAIyb,UAAY,QACrB9jB,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMyhB,qBAChCta,EAAS,EAAG,EAAGzJ,EAAKmI,MAAOnI,EAAKkI,QAChCQ,OAAOC,KAAKqH,GAAGnP,SAAQ,SAAUmjB,EAAK7N,OAChCpG,EAAIiU,EAAM,KAAOhU,EAAEgU,GAEvBhkB,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM2hB,WAChC/W,EACE6C,EACAnD,EAAI,IACH5M,EAAKE,WAAWwhB,gBAAkB,IAAM,IALpC,GAK0CvL,MAGnDnW,EAAKqI,IAAI4M,WAlFPjV,EAAKqI,IAAI4M,wBArHNjV,EAAKE,WAAWwhB,qBAInBwC,EACElkB,EAAKmI,MAFA,IAILnI,EAAKsC,MAAM8U,eACuB,EAAlCpX,EAAKsC,MAAM0a,qBACbmH,EAAKzT,EAE4B,IAA/B/J,EAAoBb,SACtBa,EAAsBE,EAAU,EAAGJ,EAAgB,GAAG,iBAC7C,CAAC,EAAG,OAGiB,IAA5BG,EAAiBd,SACnBc,EAAmBC,EAAU,EAAGJ,EAAgB,GAAG,iBAC1C,CAAC,EAAG,OAGY,IAAvBC,EAAYZ,SACdY,EAAcG,EAAU,EAAGJ,EAAgB,EAAG,IAEhDzG,EAAKqI,IAAIsC,UAAY,GAcrB3K,EAAKqI,IAAIyb,UAAY,OACrB9jB,EAAKqI,IAAIwZ,KAAO7hB,EAAKsC,MAAMwf,UAC3B9hB,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM8hB,yBAChC3a,EAASya,EAAIC,EAtCJ,IAOF,MAiCL,CACE,gBACAxd,EACA,EACA3G,EAAKqT,UAAUoK,aACfzd,EAAKsC,MAAM+hB,wBACX,GAEF,CACE,eACA1d,EACA,EACA3G,EAAKqT,UAAUgK,YACfrd,EAAKsC,MAAMgiB,uBACX,GAEF,CACE,cACAhe,OACAY,EACA,IACAlH,EAAKsC,MAAMiiB,uBACX,GAEF,CACE,WACA7d,OACAQ,EACA,KACAlH,EAAKsC,MAAMkiB,oBACX,GAEF,CACE,YACA5d,EACA,EACA,IACA5G,EAAKsC,MAAMmiB,qBACX,GAEF,CACE,YACA7d,EACA,EACA,IACA5G,EAAKsC,MAAMoiB,qBACX,IAEF7jB,SAAQ,SAAU6C,EAAGyS,GACrBzS,EAAEG,KAAKsS,GACPwO,EAAIC,MAAM,KAAMlhB,MAElB1D,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM8hB,yBAChC1d,EAAYkb,MACZlb,EAAY4R,QAAQtY,EAAKyS,aAAa3M,QACtCa,EAAoBib,MACpBjb,EAAoB2R,QAAQ,CAC1BtY,EAAKqT,UAAUc,UACfnU,EAAKqT,UAAUC,aAEjB1M,EAAiBgb,MACjBhb,EAAiB0R,QAAQ,CAACtY,EAAKmjB,KAAMnjB,EAAKkjB,gBA/EjCyB,EAAIzf,EAAM2f,EAASC,EAAUxI,EAAKyI,EAAOC,EAAQtd,OACpDJ,YAvyFYsF,EAAGC,EAAG5F,EAAGc,EAAG8c,EAASC,EAAUxI,EAAKyI,EAAOC,OAC3DthB,EAAIkJ,EAAIiY,EAAQ/e,OAClBiH,EAAIF,EAAIyP,EACVrV,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIc,YACTnJ,EAAKqI,IAAIe,OAAOnC,EAAGc,EAAI8E,GACvBgY,EAAQhkB,SAAQ,SAAUoC,OAEtB0G,EACAC,EAFE5H,OAAmBkF,IAAb4d,EAAyB7hB,EAAIA,EAAE6hB,GAGrCE,IACFhjB,EAAM4F,KAAKqd,IAAIjjB,IAEjB2H,EAAK1C,EAAIvD,EACTkG,EAAK7B,EAAI8E,EAAI7K,EAAM+K,EACnB/M,EAAKqI,IAAIgB,OAAOM,EAAIC,GACpB3C,GAAKvD,KAEP1D,EAAKqI,IAAIe,OAAOnC,EAAI2F,EAAG7E,EAAI8E,GAC3B7M,EAAKqI,IAAIoC,YAAcsa,EACvB/kB,EAAKqI,IAAIiB,SAmxFL4b,CAxBO,IAOF,IAiBgBhB,EAAIC,EAAIU,EAASC,EAAUxI,EAAKyI,EAAOC,GAC5DhlB,EAAKqI,IAAIuC,UAAYma,EACrBtb,EAAS,EAAIya,EAAIC,EAAK,EAAe,GAAXzc,EAAe,EAAG,GAC5C1H,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM6iB,wBAChC7d,OAAiBJ,IAAb4d,EAAyBD,EAAQ,GAAGC,GAAYD,EAAQ,GAC5D3X,EACEhI,EAAO,KAAO/B,MAAMmE,GAAK,EAAIA,GAAG2a,QAAQ,GACxC,GAAKiC,EACLC,EAAK,GAAgB,GAAXzc,IA0LhB0d,GACIplB,EAAKmC,cAAc,YAAa,KAGpCnC,EAAKqI,IAAI4M,mBAvtEAJ,GAAyBlN,qBAE9B0J,GAAsBxC,UACpB,SAACC,iCAAUnH,GAAemH,EAAMC,MAAQpH,GAAemH,EAAME,iBAC1D,WA4KAqW,GACPje,EACAke,EACAC,EACAC,GAEAA,EAAcA,GAAe,CAAEve,EAAG,EAAGc,EAAG,GACxCX,EAAKqe,gBAAkB,IAEpBre,EAAKse,aACN1lB,EAAKua,WAAWnT,EAAKM,UAAY8d,EAAYzd,KAGtC,IAFP/H,EAAKua,WAAWnT,EAAKM,UAAY8d,EAAYzd,GAAG6S,QAC9CxT,EAAKO,aAAe6d,EAAYve,KAI9BjH,EAAKua,WAAWnT,EAAKM,SAAW,EAAK8d,EAAYzd,KAG1C,IAFP/H,EAAKua,WAAWnT,EAAKM,SAAW,EAAK8d,EAAYzd,GAAG6S,QAClDxT,EAAKO,aAAe6d,EAAYve,IAEhB,IAAlBG,EAAKM,UACNN,EAAKue,WAENL,EAAUzhB,KAAK,CAACuD,EAAM,MACtBA,EAAKme,EAAa,cAAe,EACjCne,EAAKme,EAAa,WAAa,KAG9BvlB,EAAKua,WAAWnT,EAAKM,SAAW,GAAK8d,EAAYzd,KAG3C,IAFP/H,EAAKua,WAAWnT,EAAKM,SAAW,GAAK8d,EAAYzd,GAAG6S,QAClDxT,EAAKO,aAAe6d,EAAYve,KAGlCqe,EAAUzhB,KAAK,CAACuD,EAAM,MACtBA,EAAKme,EAAa,iBAAkB,EACpCne,EAAKme,EAAa,WAAa,KAG9BvlB,EAAKua,WAAWnT,EAAKM,UAAY8d,EAAYzd,IACzB,IAArBX,EAAKO,cAGE,IAFP3H,EAAKua,WAAWnT,EAAKM,UAAY8d,EAAYzd,GAAG6S,QAC9CxT,EAAKO,YAAc,EAAK6d,EAAYve,KAGtCqe,EAAUzhB,KAAK,CAACuD,EAAM,MACtBA,EAAKme,EAAa,eAAgB,EAClCne,EAAKme,EAAa,WAAa,KAG9BvlB,EAAKua,WAAWnT,EAAKM,UAAY8d,EAAYzd,IAC9CX,EAAKO,cAAgB9E,EAAOiD,SAGrB,IAFP9F,EAAKua,WAAWnT,EAAKM,UAAY8d,EAAYzd,GAAG6S,QAC9CxT,EAAKO,YAAc,GAAK6d,EAAYve,KAGtCqe,EAAUzhB,KAAK,CAACuD,EAAM,MACtBA,EAAKme,EAAa,gBAAiB,EACnCne,EAAKme,EAAa,WAAa,eAI5BxQ,GAASpF,EAASoE,EAAerM,UACjC,SAAkBkO,EAAQ5B,EAAaF,iBACxC8B,EAAOhH,cACF,MAGPgX,EACAxe,EAoCApF,EAtCE6jB,EAAYjQ,EAAOtT,OAAS,OAG9BqjB,EAAW,aAAariB,KAAKuiB,GAC7BC,EAAW,aAAaxiB,KAAKuiB,GAC7BH,EAAc,kBAAoBG,EAClCE,EAAiB,qBAAuBF,EACxCG,EACEhmB,EAAKimB,WAAW5T,KAAK6T,SAASxe,IAC9B1H,EAAKimB,WAAWnR,QAAQoR,SAASlS,GACnCmS,EAAqC,WAA9BnmB,EAAKsC,MAAM8jB,eAClBC,EACErmB,EAAKua,WAAWxG,KAC8C,IAA9D/T,EAAKua,WAAWxG,GAAe6G,QAAQ9G,GACzC7H,EACEjM,EAAKkM,OAAOxE,WAAaqM,IACM,QAA9B/T,EAAKE,WAAWomB,WACftmB,EAAKkM,OAAOvE,cAAgBmM,GAChCyS,EACEvmB,EAAKwmB,qBAAqB9e,UAAYA,GACtC1H,EAAKwmB,qBAAqB7e,aAAeqM,EAC3ChK,EACEhK,EAAKoV,WAAW1N,WAAaqM,GAC7B/T,EAAKoV,WAAWzN,cAAgBmM,EAClCwD,EAAsC,wBAAduO,EACxBY,EAAW9W,EAAUA,EAAQiG,EAAO1Q,WAAQgC,EAC5Cwf,EAAyB,oBAAhB9Q,EAAO7P,KAChB4gB,GACG3mB,EAAKoS,OAAOC,KAAKrS,EAAKoV,WAAW1N,YAAcqM,GAC9C/T,EAAK2a,aAAaC,QAAQ7G,IAAkB,GAC5C/T,EAAKoS,OAAO0C,QAAQ9U,EAAKoV,WAAWzN,eAClCqM,GACFhU,EAAK+a,gBAAgBH,QAAQ5G,IAAgB,MACxB,IAAtBF,IAA8C,IAAnBC,KACxB2R,EACE,sBACA,0BAGRkB,EAAI5mB,EAAK6mB,WAAWjR,EAAO7P,MAAQ,UACnC+gB,EAAmB,EACnBC,EAAgB,EAChB7Q,EAAYlW,EAAK+W,MAAMjC,QAAQd,IAAgB4B,EAAOzN,MACtD6e,EAAK,CACHC,MAAOR,EACP3H,IAAKnP,EACLiG,OAAQA,MAER0B,IACFpB,EAAYtJ,EAAI3F,QAGAC,IAAdgP,IACFA,EAAYlW,EAAKsC,MAAM4T,WAEzBA,GAAwBlW,EAAKsL,MACzBrE,EAAIiP,EAAYlW,EAAKsC,MAAMkR,gBAAkB,IAC/CvM,GAAKiP,EAAYlW,EAAKsC,MAAMkR,iBAE1BxJ,GAAwB,eAAd6b,IACZA,EAAY,eAE8B,IAAxC7lB,EAAKwS,YAAYoI,QAAQlT,IAAqBie,GAChD3lB,EAAKwS,YAAY3O,KAAK6D,GAExB1F,EAAMhC,EAAKmC,cAAc,kBAAmB6kB,GAC5Crd,EAAK1C,EACL2C,EAAK7B,EACa,eAAd8d,GACFlc,EAAK,EACLC,EAAK,GACI8b,EACT/b,EAAK,EACIgc,IACT/b,EAAK,IAEPxC,EAAO,CACLrB,KAAM2gB,EAAS,uBAAyB9Q,EAAO7P,KAC/CzD,MAAOujB,EACPqB,SAAU,uBACVjgB,EAAG0C,EACH5B,EAAG6B,EACHud,YAAannB,EAAKsC,MAAMujB,EAAY,eAAiB,GAAK7lB,EAAKsL,MAC/D8b,oBAAqBpnB,EAAKsC,MAAMujB,EAAY,uBAC5CwB,kBAAmBrnB,EAAKsC,MAAMujB,EAAY,qBAC1Cha,aACG7L,EAAKsC,MAAMujB,EAAY,gBAAkB,GAAK7lB,EAAKsL,MACtDgc,YAAatnB,EAAKsC,MAAMujB,EAAY,eAAiB,GAAK7lB,EAAKsL,MAC/Dic,cACGvnB,EAAKsC,MAAMujB,EAAY,iBAAmB,GAAK7lB,EAAKsL,MACvDkc,eACGxnB,EAAKsC,MAAMujB,EAAY,kBAAoB,GAAK7lB,EAAKsL,MACxDmc,WAAYznB,EAAKsC,MAAM8jB,eACvBsB,WAAY1nB,EAAKsC,MAAMqlB,eACvBC,YAAa5nB,EAAKsC,MAAMulB,gBACxBjV,UAAW5S,EAAKgI,gBAAkB4B,EAClCiJ,WAAY7S,EAAK8H,iBAAmB6B,EACpCwK,UAAWnU,EAAKqT,UAAUc,UAC1Bb,WAAYtT,EAAKqT,UAAUC,WAC3BtJ,OAAQA,GAAU2c,EAClB1a,QAASA,EACToa,SAAUA,EACVle,MAAO+N,EACPhO,OAAQsJ,GACRsW,YAAa5R,EACb6R,aAAcvW,GACd5L,WAAY5F,EAAKsB,KAAKsE,WACtBoiB,aAAchoB,EAAKsB,KAAKsE,WACxBrD,KAAMoN,EACNmW,SAAUA,EACVH,SAAUA,EACVI,eAAgBA,EAChBzO,sBAAuBA,EACvBoO,YAAaA,EACbM,aAAcA,EACdO,aAAcA,EACd/W,QAASA,EACToG,OAAQA,EAERjO,YAAamM,EACbpM,SAAUqM,EAEVkU,aAAclU,EACdmU,gBAAiBpU,EAEjBqU,cAAenoB,EAAKwW,iCAAiCzC,GACrDqU,iBAAkBpoB,EAAKqoB,uCACrBvU,GAGFkH,gBAAiBhH,EACjB8G,aAAcpT,EAEdgf,OAAQA,EACR4B,UAAW5B,IAAWZ,IAAaH,EACnC4C,QAASvoB,EAAKE,WAAWgF,MAAQ,IAAMwC,EAAW,IAAMsM,EACxD5E,WAAYpP,EAAKsB,KACjB6C,UAAW,GACXwiB,aAAcA,EACdM,MACEtB,IAAaD,EAAc9P,EAAOK,OAASL,EAAO1Q,KAAOuhB,EAC3D+B,UACEzU,GAAiB,GACjBD,GAAoB9T,EAAKwU,SAASiU,iBAClCzoB,EAAKwU,SAASnC,KAAKvM,OAAS,GAC5B9F,EAAKwU,SAASnC,KAAK0B,GAAejI,KACpC4c,aACE5U,GAAoB,GACpB9T,EAAKwU,SAASM,QAAQf,IACtB/T,EAAKwU,SAASM,QAAQf,GAAeD,GAAkBhI,OAEtD6c,qBACHvhB,EAAK+f,WAAa/f,EAAKsgB,WAAatgB,EAAKwgB,YAC3CxgB,EAAKwhB,YAAcxhB,EAAKe,MAAQf,EAAKmgB,aAAengB,EAAKyE,YACzDzE,EAAKyhB,aAAezhB,EAAKc,OAASd,EAAKkgB,WAAalgB,EAAKogB,cACzDR,EAAG5f,KAAOA,EACVA,EAAK0hB,WAAa1hB,EAAKue,SAAW3lB,EAAK+W,MAAM1E,MAAM,GAAK5C,EACxDrI,EAAK2hB,UAAY3hB,EAAKue,SAClB3lB,EAAK+W,MAAMjC,QAAQpF,WACnB1P,EAAK+W,MAAMjC,QAAQd,GACvBhU,EAAKyS,aAAa6F,QAAQlR,YAnaCA,OACzB+O,EAAQ/O,EAAK+gB,iBACbhS,IAAU,GAAM,EAClB,CAAA,IAAuB,IAAnB/O,EAAKM,SACJ,OADqByO,GAAS,EAEjCjF,GAAkBiF,KACtBjF,GAAkBiF,GAAS,CAAEpO,EAAGX,EAAKW,EAAG8E,EAAGzF,EAAKc,SA8Z9C8gB,CAAsB5hB,YA5ZQA,OAC1B+O,EAAQ/O,EAAKO,YACfyJ,GAAqB+E,KACzB/E,GAAqB+E,GAAS,CAAElP,EAAGG,EAAKH,EAAG2F,EAAGxF,EAAKe,QA0ZjD8gB,CAAyB7hB,IACrBpH,EAAKmC,cAAc,mBAAoB6kB,OAG3ChnB,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMujB,EAAY,mBAC5C7lB,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMujB,EAAY,eAC9C7lB,EAAKqI,IAAIsC,UAAY3K,EAAKsC,MAAMujB,EAAY,eACxC5Z,IACFjM,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMujB,EAAY,wBAC5C7lB,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMujB,EAAY,qBAE5CQ,IACFrmB,EAAKqI,IAAIuC,UACP5K,EAAKsC,MAAMujB,EAAY,2BACzB7lB,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMujB,EAAY,wBAE5Cc,IACF3mB,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMqkB,EAAe,oBAEjD3mB,EAAKmC,cAAc,aAAc6kB,GAC7B5f,EAAKsf,SACHtf,EAAKc,SAAWuH,IAClBrI,EAAKc,OAASuH,GAAazP,EAAKsC,MAAM4mB,wBACtC5Z,GAAoB,GAEtBlI,EAAKe,MACHnI,EAAK+W,MAAMjC,QAAQd,IACnBhU,EAAKsC,MAAM6mB,wBAEX3Z,IAAYpI,EAAKse,cACnBte,EAAKc,OAASlI,EAAK+W,MAAM1E,KAAK3K,IAAa1H,EAAKsC,MAAMkP,YAEnDpK,EAAKsf,SACRjd,EAASE,EAAIC,EAAIxC,EAAKe,MAAOf,EAAKc,QAClCwB,EAAWC,EAAIC,EAAIxC,EAAKe,MAAOf,EAAKc,SAEtClI,EAAKqI,IAAIkK,OACT5F,EAAWvF,EAAKH,EAAGG,EAAKW,EAAGX,EAAKe,MAAOf,EAAKc,OAAQ,GACpDlI,EAAKqI,IAAImF,OACTxN,EAAKmC,cAAc,kBAAmB6kB,GAClC5f,EAAKc,SAAWsJ,IAAgBhC,IAAYpI,EAAKse,cACnD1lB,EAAK+W,MAAM1E,KAAKsT,GAAY,EAAIje,GAAYN,EAAKc,OACjDoH,GAAoB,GAElBlI,EAAKe,QAAU+N,IACjBlW,EAAK+W,MAAMjC,QAAQd,GAAe5M,EAAKe,MACvCmH,GAAoB,GAElBoW,GAAe1lB,EAAKE,WAAW+K,OAC5BjL,EAAKmC,cAAc,kBAAmB6kB,KACzCD,WA/gCa3f,EAAMH,EAAGc,OAC1BqhB,EAAKppB,EAAKsC,MAAM+mB,mBAAqBrpB,EAAKsL,MAC5Cge,EAAKtpB,EAAKsC,MAAMinB,qBAAuBvpB,EAAKsL,MAC5Cke,EAAKxpB,EAAKsC,MAAMmnB,oBAAsBzpB,EAAKsL,MAC3Coe,EAAK1pB,EAAKsC,MAAMqnB,eAAiB3pB,EAAKsL,MACtCse,EAAK5pB,EAAKsC,MAAMunB,gBAAkB7pB,EAAKsL,aACzCrE,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMwnB,eAChC9pB,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMynB,qBAClC/pB,EAAKqI,IAAIc,YACTlC,GAAQuiB,EACRzhB,GAAQqhB,EACJppB,EAAKgX,aAAa5P,EAAKM,WACzB1H,EAAKqI,IAAIe,OAAOnC,EAAGc,GACnB/H,EAAKqI,IAAIgB,OAAOpC,EAAIyiB,EAAI3hB,GACxB/H,EAAKqI,IAAIgB,OAAOpC,EAAS,GAALyiB,EAAU3hB,EAAI6hB,GAClC5pB,EAAKqI,IAAIe,OAAOnC,EAAGc,KAEnB/H,EAAKqI,IAAIgB,OAAOpC,EAAGc,GACnB/H,EAAKqI,IAAIgB,OAAOpC,EAAI2iB,EAAI7hB,EAAS,GAAL2hB,GAC5B1pB,EAAKqI,IAAIgB,OAAOpC,EAAGc,EAAI2hB,GACvB1pB,EAAKqI,IAAIgB,OAAOpC,EAAGc,IAErB/H,EAAKqI,IAAIiB,SACTtJ,EAAKqI,IAAIa,OACFsgB,EAAKE,EAAKJ,EAq/BOU,CACd5iB,EACApH,EAAKsC,MAAMujB,EAAY,eACvBjc,KAKD5J,EAAKE,WAAW+pB,gBAAkBvE,IAAiBA,KAClDte,EAAKsf,SAAW1mB,EAAKmC,cAAc,uBAAwB6kB,GAAK,KAC7DhnB,EAAKkqB,WAAW9iB,EAAKmhB,QAAS,KAIjC3C,EAAqB5lB,EAAK4lB,oBACP1gB,KAAOlF,EAAKE,WAAWiqB,eACtC/iB,EAAKmhB,YACLrhB,EACJ0e,EAAmBvlB,WAAY,EAC/BulB,EAAmBhgB,WAAawB,EAChCwe,EAAmBrjB,KAAOkkB,EAC1BO,EAAGpB,mBAAqBA,EACpB5lB,EAAKmC,cAAc,uBAAwB6kB,UAG/ChnB,EAAKkqB,WAAW9iB,EAAKmhB,QAAUvoB,EAAKoqB,WAClCxE,GAEF5lB,EAAK+W,MAAM1E,KAAK3K,GACd1H,EAAK+W,MAAM1E,KAAK3K,IAAa1H,EAAKsC,MAAM+nB,eAC1C/a,GAAoB,EAEtBlI,EAAKkjB,KAAOtqB,EAAKkqB,WAAW9iB,EAAKmhB,QACjCnhB,EAAKkjB,KAAK1kB,WAAawB,EACvBA,EAAKkjB,KAAKjb,SAAU,EACpBjI,EAAKkjB,KAAKzhB,OACV7I,EAAKmC,cAAc,iBAAkB6kB,QAChC,IAAK5f,EAAKsf,SACX1mB,EAAKkqB,WAAW9iB,EAAKmhB,UACvBvoB,EAAKkqB,WAAW9iB,EAAKmhB,QAAQ3iB,WAAWmiB,aAAe,GAErDpC,GAAY3lB,EAAKuqB,UAAY3U,EAAO1Q,OACjClF,EAAKmC,cAAc,qBAAsB6kB,KAC5CF,WAtlCY7f,EAAGc,OACvBqhB,EAAKppB,EAAKsC,MAAMkoB,kCAAoCxqB,EAAKsL,MAC3Dke,EAAKxpB,EAAKsC,MAAMmoB,mCAAqCzqB,EAAKsL,MAC1Dge,EAAKtpB,EAAKsC,MAAMooB,oCAAsC1qB,EAAKsL,MAC3Doe,EAAK1pB,EAAKsC,MAAMqoB,8BAAgC3qB,EAAKsL,MACrDse,EAAK5pB,EAAKsC,MAAMsoB,+BAAiC5qB,EAAKsL,aACxDrE,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMuoB,8BAChC7qB,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMwoB,oCAClC9qB,EAAKqI,IAAIc,YACTlC,GAAQuiB,EACRzhB,GAAQqhB,EACoB,QAAxBppB,EAAK+qB,gBACP/qB,EAAKqI,IAAIgB,OAAOpC,EAAGc,EAAI6hB,GACvB5pB,EAAKqI,IAAIgB,OAAOpC,EAAIyiB,EAAI3hB,EAAI6hB,GAC5B5pB,EAAKqI,IAAIgB,OAAOpC,EAAS,GAALyiB,EAAU3hB,GAC9B/H,EAAKqI,IAAIgB,OAAOpC,EAAGc,EAAI6hB,KAEvB5pB,EAAKqI,IAAIe,OAAOnC,EAAGc,GACnB/H,EAAKqI,IAAIgB,OAAOpC,EAAIyiB,EAAI3hB,GACxB/H,EAAKqI,IAAIgB,OAAOpC,EAAS,GAALyiB,EAAU3hB,EAAI6hB,GAClC5pB,EAAKqI,IAAIe,OAAOnC,EAAGc,IAErB/H,EAAKqI,IAAIiB,SACTtJ,EAAKqI,IAAIa,OACFsgB,EAAKE,EAAKJ,EA4jCc0B,CACjBrhB,EAAK3J,EAAKsC,MAAMujB,EAAY,eAC5B,KAIN7lB,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMujB,EAAY,SACxC5Z,IACFjM,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMujB,EAAY,eAE1CQ,IACFrmB,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMujB,EAAY,kBAE1Cc,IACF3mB,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMqkB,EAAe,UAEjDvf,EAAKuiB,eAAiB5C,EACtB3f,EAAK6jB,kBAAoBnE,OAGb5f,KADZlF,OAAckF,IAARlF,EAAoBA,EAAM4kB,EAAIA,EAAEI,GAAM,KAClBJ,IACxB5kB,EAAM,GACNkpB,QAAQC,KACN,mCACEvV,EAAO7P,KACP,wBAGNqB,EAAKG,gBAAkBvF,MAAAA,EACnBA,EACA,IACFyF,WAEAzH,EAAKorB,oBACuBlkB,IAA5BlH,EAAKorB,cAAcppB,IACnB2jB,IAEAve,EAAKG,eAAiBvH,EAAKE,WAAWmrB,iBAAmBrpB,GAE3DhC,EAAKqI,IAAIwZ,KACP7hB,EAAKsC,MAAMujB,EAAY,cAAgB7lB,EAAKsL,MAC5C,MACAtL,EAAKsC,MAAMujB,EAAY,YACpB7lB,EAAKmC,cAAc,aAAc6kB,KACpC5f,EAAK+F,cA11BC/F,EAAMkkB,kBACjBlkB,EAAKG,qBACD,CACLgkB,MAAO,CAAC,CAAEpjB,MAAO,EAAG8e,MAAO,KAC3B9e,MAAO,EACPD,OAAQd,EAAKuhB,0BAKf1hB,EACAukB,EAOAC,EAGAC,EACAC,EAEAC,EAZAC,EAAQzkB,EAAKG,eAAeukB,MAAMR,GAClCS,EAAa3kB,EAAKuhB,qBAClB4C,EAAQ,GAERpF,EAAqC,WAA9BnmB,EAAKsC,MAAM8jB,eAClB4F,EAAahsB,EAAKE,WAAW+rB,gBAAkB9F,EAE/C+F,EAAKlsB,EAAKE,WAAWisB,aAMrBC,EAAO,CACLjkB,MAAO,EACP8e,MAAO,IAEToF,EAAUlG,EAAO/e,EAAKyhB,aAAezhB,EAAKuhB,yBAC5C4C,EAAM1nB,KAAKuoB,GACXX,EAAUzrB,EAAKqI,IAAIikB,YAAY,IAAMJ,GAAI/jB,MACpClB,EAAI,EAAGA,EAAI4kB,EAAM/lB,OAAQmB,GAAK,EAAG,KAEhCslB,EAAyC,OAD7Cf,EAAOK,EAAM5kB,IACWukB,EAAK1lB,OAAS,GAAa,GAAKwlB,EACpDkB,EAAUxsB,EAAKqI,IAAIikB,YAAYd,EAAOe,MACtCH,EAAKjkB,MAAQqkB,EAAQrkB,MAAQsjB,EAAUrkB,EAAKwhB,YAC9CwD,EAAKnF,OAASuE,EAAOe,EACrBH,EAAKjkB,OAASqkB,EAAQrkB,cAOpB,QAAQ7E,KAAKkoB,IAASpkB,EAAKwhB,YAAc4D,EAAQrkB,WAC/CskB,EAAMjB,EAAKM,MAAM,KACrBW,EAAMA,EAAI7a,IAAI,SAAC9M,EAAMqR,iCACZA,IAAUsW,EAAI3mB,OAAS,EAAIhB,EAAOA,EAAO,iBAElD+mB,EAAMa,aAANb,GAAa5kB,EAAG,6BAAMwlB,KACtBxlB,GAAK,UAGPmlB,EAAO,CACLjkB,MAAOqkB,EAAQrkB,MACf8e,MAAOuE,EAAOe,GAEN,IAANtlB,IACFskB,EAAQ,IACF1nB,KAAKuoB,IAEbL,GAAc3kB,EAAKuhB,sBACF0D,IAAYL,EAAY,IAClB,IAAjBT,EAAMzlB,iBAIV8lB,EAAeL,EAAMA,EAAMzlB,OAAS,IACnBqC,MAAQf,EAAKwhB,aAAgC,IAAjBiD,EAAM/lB,iBAK/C6mB,EAFJhB,EAAaC,EAAa3E,MAAQuE,MAClCE,EAAU1rB,EAAKqI,IAAIikB,YAAYX,EAAaO,GAAI/jB,OAElCf,EAAKwhB,oBACbgE,EAAa1pB,SAASyoB,EAAW7lB,OAAS,GAC1CsW,GAAa,EACVwQ,EAAa,GAClBjB,EAAagB,EAAWE,OACtB,EACAD,EAAaxQ,EAAYuP,EAAW7lB,QAGtCsW,GADAsP,EAAU1rB,EAAKqI,IAAIikB,YAAYX,EAAaO,GAAI/jB,OAC1Bf,EAAKwhB,aAAe,EAAI,EAC9CgE,EAAa1pB,SAAS0pB,EAAa,GAGvCjB,GACgBgB,EAAW7mB,QAAU6lB,EAAW7lB,OAASomB,EAAK,GAC9DN,EAAa3E,MAAQ0E,EACrBC,EAAazjB,MAAQujB,QAGnBzkB,EAAI,GACNskB,EAAM1nB,KAAKuoB,UAGR,CACLb,MAAOA,EACPpjB,MA5FQ,EA6FRD,OAAQd,EAAKuhB,qBAAuB4C,EAAMzlB,QAqvBtBgnB,CAAS1lB,EAAM,OAExBpH,EAAKmC,cAAc,aAAc6kB,IAAK,IACrC5f,EAAKjD,WAA6B,SAAhByR,EAAO7P,KAC3BoB,EAASC,OACJ,KACD2lB,EAAkB,EACpBC,GAAa,KAEb5lB,EAAKO,aAAe3H,EAAKwU,SAASiU,kBACjCrhB,EAAK2e,gBACN/lB,EAAKwU,SAASnC,KAAKvM,OAAS,GAC5B4C,OAAOC,KAAK3I,EAAKwU,SAASnC,KAAKjL,EAAKM,WAAW5B,OAAS,IAExDinB,EAAkB/hB,EAChB5D,EACApH,EAAKwU,SAASnC,KAAKjL,EAAKM,WACxB,KAIDN,EAAKse,aACNte,EAAKM,SAAW,GAChB1H,EAAKwU,SAASM,QAAQ1N,EAAKM,SAAW,IACtC1H,EAAKwU,SAASM,QAAQ1N,EAAKM,SAAW,GAAGN,EAAKO,aAC3CmE,SAEE,IAAIiB,GAAI3F,EAAKM,SAAW,EAAGqF,IAAK,GAC9B/M,EAAKwU,SAASM,QAAQ/H,KACtB/M,EAAKwU,SAASM,QAAQ/H,IAAG3F,EAAKO,aAAamE,KAFViB,SAGjC/M,EAAKwU,SAASM,QAAQ/H,IAAG3F,EAAKO,aAAa6E,OAAQ,CACtDwgB,GAAa,QAMjBA,IACC5lB,EAAKse,aACN1lB,EAAKwU,SAASM,QAAQ1N,EAAKM,WAC3B1H,EAAKwU,SAASM,QAAQ1N,EAAKM,UAAUN,EAAKO,aAAamE,MAGrD9L,EAAKiQ,SAASnK,OAAS,GACvB9F,EAAKiQ,SAAS7I,EAAKM,UAAUN,EAAKO,aAAa7B,OAAS,IAExDinB,EAAkB/hB,EAChB5D,EACApH,EAAKwU,SAASM,QAAQ1N,EAAKM,UAAUN,EAAKO,cAC1C,IAGFqlB,YAtyBA5lB,OAGdH,EACAmlB,EAJoBW,yDAAkB,EAEtClgB,GADOzF,EAAK+F,KAAKoe,MAAMzlB,OACnBsB,EAAK+f,WAAa/f,EAAKsgB,YAG3BvB,EAAqC,WAA9BnmB,EAAKsC,MAAM8jB,eAClB2F,EAAa,MACV9kB,EAAI,EAAGA,EAAIG,EAAK+F,KAAKoe,MAAMzlB,OAAQmB,GAAK,EAAG,CAC9CmlB,EAAOhlB,EAAK+F,KAAKoe,MAAMtkB,OACnBgmB,EACArlB,KAAK0U,IAGD,IAFDlV,EAAKc,QACHie,EAAO/e,EAAK+F,KAAKjF,OAASd,EAAKuhB,uBAElC,GACE9b,EACNqgB,EACE9lB,EAAKyE,YACLkhB,EACA3lB,EAAKuiB,eACLviB,EAAK6jB,kBACwB,UAA7B7jB,EAAKggB,oBACP8F,EACE9lB,EAAKyE,YAAckhB,EAAkB3lB,EAAKwhB,YAAcwD,EAAKjkB,MACzB,WAA7Bf,EAAKggB,sBACd8F,EACE9lB,EAAKyE,YACLkhB,GACC3lB,EAAKwhB,YAAcxhB,EAAKmgB,cAAgB,EACzC6E,EAAKjkB,MAAQ,GAEc,QAA3Bf,EAAKigB,kBACP4F,EAAO7lB,EAAKuhB,qBACwB,WAA3BvhB,EAAKigB,oBACd4F,EAAO7lB,EAAKc,OAASd,EAAKogB,cAAgBpgB,EAAK+F,KAAKjF,QAEtDkkB,EAAKlkB,OAAS2E,EAAIzF,EAAKwgB,YACvBwE,EAAKvZ,WAAaqa,EAClBd,EAAKxZ,UAAYqa,EACjBb,EAAKnlB,EAAIG,EAAKH,EAAIimB,EAClBd,EAAKrkB,EAAIX,EAAKW,EAAIgkB,EAAakB,EAC/BlB,GAAcK,EAAKlkB,OACnBgF,EAASkf,EAAKnF,MAAOmF,EAAKnlB,EAAGmlB,EAAKrkB,GAEhC/H,EAAKE,WAAWyhB,OAASva,EAAK4C,QAChC5H,uBAAsB,WACpBpC,EAAKqI,IAAIwZ,KAAO7hB,EAAKsC,MAAMwf,UAC3B9hB,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM2hB,WAChC/W,EACEzK,KAAK0qB,UACH,CACElmB,EAAGG,EAAKH,EACRc,EAAGX,EAAKW,EACR8E,EAAGzF,EAAKc,OACR0E,EAAGxF,EAAKe,MACRilB,GAAIhmB,EAAKwhB,YACTyE,IAAKjmB,EAAKO,YACV2lB,QAASlmB,EAAK4T,iBAEhB,KACA,MAEF5T,EAAKH,EAAI,GACTG,EAAKW,EAAI,IAEXmF,EACEzK,KAAK0qB,UACH/lB,EAAK+F,KAAKoe,MAAM3Z,KAAI,SAAUxD,SACrB,CAAExB,EAAGwB,EAAEjG,MAAOb,EAAG8G,EAAE6Y,MAAMnhB,WAElC,KACA,MAEFsB,EAAKH,EAAI,GACTG,EAAKW,EAAI,OA4tBawlB,CAASnmB,EAAM2lB,GAG7B5G,GAAQ/e,EAAK+F,MAAQ/F,EAAK+F,KAAKjF,OAASuH,IAC1CzP,EAAK+W,MAAM1E,KAAKsT,GAAY,EAAIje,GAAYN,EAAK+F,KAAKjF,OACtDoH,GAAoB,GAKxBtF,IACF4F,EAAQxI,GAEVie,GAAyBje,EAAMgJ,EAAkB,sBAtelBhJ,IAC7BpH,EAAKE,WAAW+Y,sBAAwBjZ,EAAKgZ,UAE7C5R,EAAKomB,oBACLpmB,EAAKqmB,sBACLztB,EAAKgZ,SAEL1I,EAAiBzM,KAAK,CAACuD,EAAM,OAC7BA,EAAKsmB,gBAAkB,MAErBtmB,EAAKomB,oBAAsBpmB,EAAKumB,sBAC9B3tB,EAAKgZ,SACP1I,EAAiBzM,KAAK,CAACuD,EAAM,OAC7BA,EAAKsmB,gBAAkB,MAErB1tB,EAAK0b,YAAYC,SACnB3b,EAAK0b,YAAYI,OAAS,CACxB7U,EAAGG,EAAKH,EACRc,EAAGX,EAAKW,KAKZX,EAAKwmB,uBACLxmB,EAAKumB,qBACL3tB,EAAKgZ,SAEL1I,EAAiBzM,KAAK,CAACuD,EAAM,OAC7BA,EAAKsmB,gBAAkB,MAGvBtmB,EAAKwmB,uBACLxmB,EAAKqmB,uBACwC,SAA5CztB,EAAKE,WAAW2tB,yBAAsC7tB,EAAKgZ,UAE5D1I,EAAiBzM,KAAK,CAACuD,EAAM,OAC7BA,EAAKsmB,gBAAkB,KAEnB1tB,EAAK0b,YAAYC,SACnB3b,EAAK0b,YAAYC,OAAO1U,EAAIG,EAAKH,EAAIG,EAAKe,MAC1CnI,EAAK0b,YAAYC,OAAO5T,EAAIX,EAAKW,EAAIX,EAAKc,SAI1ClI,EAAK0b,YAAYC,UAGgB,IAA/B3b,EAAK0b,YAAYI,OAAO7U,GAAYG,EAAKumB,sBAC3C3tB,EAAK0b,YAAYI,OAAO7U,EAAIG,EAAKH,IAEA,IAA/BjH,EAAK0b,YAAYI,OAAO/T,GAAYX,EAAKomB,qBAC3CxtB,EAAK0b,YAAYI,OAAO/T,EAAIX,EAAKW,KAqbrC+lB,CAA0B1mB,GACtBpH,EAAKkb,iBACPmK,GAAyBje,EAAMiJ,EAAa,OAAQrQ,EAAK+tB,YAE3D/tB,EAAKqI,IAAI4M,UAEL+Q,YAqMkB5e,EAAM4f,OAC1BvO,EAAOrR,EAAKH,EAAIG,EAAKe,MAAQnI,EAAKsC,MAAM0rB,kBAAoB,EAC5DlV,EAAO1R,EAAKW,EAAIX,EAAKc,OAASlI,EAAKsC,MAAM2rB,mBAAqB,KAC9DjuB,EAAKmC,cAAc,2BAA4B6kB,UAGnDhnB,EAAKqI,IAAIkK,OACTvS,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAM4rB,wBAClCluB,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM6rB,4BAC5B/mB,EAAKmf,aACPvmB,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAM8rB,kCACvBhnB,EAAK6E,SAAWjM,EAAKkM,OAAOmiB,iBACrCruB,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMgsB,kCAElC3hB,EACE8L,EACAK,EACA9Y,EAAKsC,MAAM0rB,kBACXhuB,EAAKsC,MAAM2rB,mBACXjuB,EAAKsC,MAAMisB,0BAEbvuB,EAAKqI,IAAIiB,SACTtJ,EAAKqI,IAAIa,gBA9zCkBjC,EAAGc,OAC5BqhB,GACEppB,EAAKsC,MAAM2rB,mBAAqBjuB,EAAKsC,MAAMksB,yBAC3C,EACFxuB,EAAKsL,MACPke,GACIxpB,EAAKsC,MAAM0rB,kBAAoBhuB,EAAKsC,MAAMmsB,wBAC1C,EACFzuB,EAAKsL,MACPoe,EAAK1pB,EAAKsC,MAAMmsB,uBAAyBzuB,EAAKsL,MAC9Cse,EAAK5pB,EAAKsC,MAAMksB,wBAA0BxuB,EAAKsL,MACjDrE,GAAKjH,EAAK8H,iBACVC,GAAK/H,EAAKgI,gBACVhI,EAAKqI,IAAIuC,UAAY5K,EAAKsC,MAAMosB,uBAChC1uB,EAAKqI,IAAIoC,YAAczK,EAAKsC,MAAMqsB,6BAClC3uB,EAAKqI,IAAIc,YACTlC,GAAQuiB,EACRzhB,GAAQqhB,EAERppB,EAAKqI,IAAIe,OAAOnC,EAAGc,GACnB/H,EAAKqI,IAAIgB,OAAOpC,EAAIyiB,EAAI3hB,GACxB/H,EAAKqI,IAAIgB,OAAOpC,EAAS,GAALyiB,EAAU3hB,EAAI6hB,GAClC5pB,EAAKqI,IAAIe,OAAOnC,EAAGc,GAEnB/H,EAAKqI,IAAIiB,SACTtJ,EAAKqI,IAAIa,OAsyCP0lB,CAAsBnW,EAAMK,GAC5B9Y,EAAKqI,IAAImF,OACTxN,EAAKmC,cAAc,0BAA2B6kB,GAC9ChnB,EAAKqI,IAAI4M,UA9NL4Z,CAAiBznB,OAQb0nB,GACJ9uB,EAAK+uB,UAAUja,SAAW9U,EAAK+uB,UAAUja,QAAQhP,OAAS,KAG1D4f,GACA1lB,EAAKE,WAAW+pB,gBAChBjqB,EAAKE,WAAW8uB,oBACF,IAAdF,GACA,KACMG,GAAoBjvB,EAAKwW,iCAC7BzC,EAAgB,GAEdmb,QACoBhoB,IAAtB+nB,IACA7nB,EAAK+gB,cAAgB,GACrB/gB,EAAK+gB,cAAgB8G,GAAoB,KACvCC,IAAa5d,GAAmBxL,OAAS,IAC3CopB,GACE5d,GAAmB6d,KACjB,SAACrgB,iCACCA,EAAMC,OAASkgB,IACfngB,EAAME,KAAO5H,EAAK+gB,4BACjB,GAGL+G,IAAalvB,EAAK2R,gBAAgB7L,OAAS,MACxC,IAAIpC,GAAI,EAAGA,GAAI1D,EAAK2R,gBAAgB7L,OAAQpC,KAAK,uBACf1D,EAAK2R,gBAAgBjO,OAAnD0rB,SAAeC,YAEpBjoB,EAAK+gB,gBAAkBkH,GAAc,GACrCJ,KAAsBG,GAAgB,EACtC,CACAF,IAAY,YAMdA,GAAW,KACPI,GAAYtvB,EAAKsC,MAAMitB,gCACvBC,GAAWxvB,EAAKsC,MAAMmtB,+BAE5BzvB,EAAKqI,IAAIkK,OAETvS,EAAKqI,IAAIuC,UAAY4kB,GAErB/lB,EAASrC,EAAKH,EAAGG,EAAKW,EAAIunB,GAAY,EAAGloB,EAAKe,MAAOmnB,IAErDtvB,EAAKqI,IAAI4M,cAKT8Q,GAAkB/lB,EAAKE,WAAWwvB,2BAA4B,KAgB5DC,GAAaC,GAfX3jB,GAAUjM,EAAKkM,OAAO2jB,gBACtB/lB,GAAO9J,EAAKsC,MAAMwtB,oBAClBC,GAAQ9oB,EACRoY,GAAOjY,EAAKW,EAAIH,KAAK0U,IAAI,IAAOlV,EAAKc,OAAS4B,IAAO,GAErDkmB,GAAW,SAACC,iCAChBhkB,KACiB,MAAhBA,GAAQlC,KAA+B,MAAhBkC,GAAQlC,MAChCkmB,GAAchkB,GAAQ0jB,aACtBM,GAAchkB,GAAQ2jB,wBAClBM,GAAiB,SAACvoB,iCACtBA,GAAe,GACf9E,EAAO8E,IACP9E,EAAO8E,GAAaiH,mBAGhBuhB,GAAgB,SAACxQ,EAAO5V,EAAKC,6BACjChK,EAAK2S,wBAAwB9O,KAAK,CAChCoD,EAAG0Y,EAAQ,EACX5X,EAAGsX,GAAO,EACVQ,GAAIF,EAAQ7V,GAAO,EACnBgW,GAAIT,GAAOvV,GAAO,EAClB6lB,YAAAA,GACAC,YAAAA,GACA7lB,IAAAA,KAEGC,EAAQ,KACLoiB,EAAOhlB,EAAK+F,MAAQ/F,EAAK+F,KAAKoe,OAASnkB,EAAK+F,KAAKoe,MAAM,MACzDa,EAAM,KACFgE,EAAatJ,EAAmBC,EAChCsJ,EAASD,EAAa,EAAIA,EAAahE,EAAKnlB,EAC5CqpB,EAASlE,EAAKnlB,EAAImlB,EAAKjkB,SACzBwX,EAAQ7V,IAAQumB,GAAU1Q,GAAS2Q,EAAQ,QAGnDzmB,EAAoB8V,EAAON,GAAMvV,GAAMC,EAAKC,eAG1CumB,GAAgBzc,EAAmB,EACjC0c,GAAkBxwB,EAAKoS,OAAO0C,QAAQyb,OACxCL,GAAeM,IAAkB,KAC7BxmB,GAASgmB,GAASQ,QACxBb,GAAcY,GACdX,GAAcW,KACLA,IAAiB,GACpBL,GAAelwB,EAAKoS,OAAO0C,QAAQyb,MACrCZ,GAAcY,GAGlBJ,GAAcJ,GAAO,IAAK/lB,IAG5BumB,GAAgBzc,EAAmB,MAC7B2c,GAAkBzwB,EAAKoS,OAAO0C,QAAQyb,OACxCL,GAAeO,IAAkB,KAC7BzmB,GAASgmB,GAASS,QACxBd,GAAcY,GACdX,GAAcW,KACLA,GAAgBvwB,EAAKoS,OAAO0C,QAAQhP,QACvCoqB,GAAelwB,EAAKoS,OAAO0C,QAAQyb,MACrCX,GAAcW,GAIlBJ,GADmBlpB,EAAIG,EAAKe,MAAQ2B,GACV,IAAKE,QAOjC0b,GACA1lB,EAAKE,WAAWwwB,yBAChB1wB,EAAK2R,gBAAgB7L,OAAS,EAC9B,KASMmG,GAAUjM,EAAKkM,OAAO2jB,gBACtB/lB,GAAO9J,EAAKsC,MAAMwtB,oBAClBnQ,GAAQvY,EAAKH,EAAIG,EAAKe,MAAQ2B,GAAO,EACrC6mB,GAAQ5oB,EACR6oB,GAAgB,GAChBC,GAAmB,GACzB7wB,EAAK2R,gBAAgB9Q,QAAQ,SAACiwB,0BAC5BF,GAAcE,EAAG,GAAK,GAAKA,EAC3BD,GAAiBC,EAAG,GAAK,GAAKA,mBAU5BnB,GAAaC,GAPXloB,GAAWN,EAAKM,SAAW+J,GAC3Bue,GAAW,yCACf/jB,KACiB,MAAhBA,GAAQlC,KAA+B,MAAhBkC,GAAQlC,MAChCrC,IAAYuE,GAAQ0jB,YAAc,GAClCjoB,IAAYuE,GAAQ2jB,YAAc,cAG9BO,GAAgB,SAAC9Q,EAAMtV,EAAKC,0BAChChK,EAAK2S,wBAAwB9O,KAAK,CAChCoD,EAAG0Y,GAAQ,EACX5X,EAAGsX,EAAO,EACVQ,GAAIF,GAAQ7V,GAAO,EACnBgW,GAAIT,EAAOvV,GAAO,EAClB6lB,YAAAA,GACAC,YAAAA,GACA7lB,IAAAA,IAEFF,EAAoB8V,GAAON,EAAMvV,GAAMC,EAAKC,eAG1C+mB,GAAUH,GAAclpB,OACxBqpB,GAAS,KACLC,GAAaL,GAAQvpB,EAAKc,OAAS4B,qBACZinB,MAA5BpB,SAAaC,SACdO,GAAca,GAAY,IAAKhB,SAEjCe,GAAUF,GAAiBnpB,IACd,KACLspB,GAAaL,qBACUI,MAA5BpB,SAAaC,SACdO,GAAca,GAAY,IAAKhB,cAKnC/oB,GAAKG,EAAKe,OAAS+H,EAAK,EAAIlQ,EAAKsC,MAAMkR,iBAChCpM,EAAKe,iBAgLPsL,GAAQM,EAAerM,OAC1BsM,EACFid,EACAC,EACApd,EACAG,EAAIpR,EAAOiD,UACTiC,EAAiB,EAAbyJ,GAAiB3E,SAChB,KAET8C,EAAUM,EAAS8D,GACnBvE,EAAUxP,EAAKgX,aAAajD,GAC5Bmd,GACGlxB,EAAK+W,MAAM1E,KAAK0B,IAAkB/T,EAAKsC,MAAMkP,YAAcxR,EAAKsL,MACnE2lB,GAAczhB,EAAUxP,EAAK+W,MAAMoa,MAAMpd,GAAiB,GAAK/T,EAAKsL,MAEhEvD,IADJ0H,EAAYyhB,EAAoBD,UAEvB,MAELjxB,EAAKE,WAAWyU,iBAClB1N,GAAK2J,IAEPY,GAAa/B,EAGXqE,EAAmB9T,EAAK4U,gBACxBd,EAAmBG,EACnBH,GAAoB,KAEfe,GAAyBf,KAC5BE,EAAchU,EAAKoS,OAAO0C,QAAQhB,GAClC7M,GAAK8N,GAASpF,EAASoE,EAAerM,EAAjCqN,CACHlS,EAAOmR,GACPA,EACAF,IAGA7M,EAAIjH,EAAKmI,MAAO,CAClBnI,EAAKoxB,iBAAmBtd,EACxB9T,EAAKqxB,iBAAmBpqB,YAK5BA,EAAI,EACAjH,EAAKE,WAAWyU,iBAClB1N,GAAK2J,IAGLkD,EAAmB,EACnBA,EAAmB9T,EAAKyO,eAGnBoG,GAAyBf,KAC5BE,EAAchU,EAAKoS,OAAO0C,QAAQhB,GAClC7M,GAAK8N,GAASpF,EAASoE,EAAerM,EAAjCqN,CACHlS,EAAOmR,GACPA,EACAF,MAGA7M,EAAIjH,EAAKmI,QAVb2L,GAAoB,MActB9T,EAAKsN,sBAAwBrG,EAE7BuK,GAAa/B,EACbxI,GACGjH,EAAKqT,UAAUC,WAChBtT,EAAKuT,gBACLvT,EAAKsC,MAAMkR,gBAEbjE,EAAWvP,EAAKkqB,WAAWnW,GACvBA,IAAkB9D,EAASnK,QAAU0J,EAAS,IAChDD,EAASF,SAAU,EACnBE,EAAS3J,WAAa,CACpBgN,UAAW7K,EAAImpB,EAAoBlxB,EAAKgI,gBACxC6K,WAAYjC,GAAqB,EAAI5Q,EAAK8H,iBAC1CigB,aAAckJ,EACdnJ,YACE9nB,EAAKmI,MAAQyI,GAAqB5Q,EAAKsC,MAAM8U,eAAiB,EAChE4Q,aAAchoB,EAAKsB,KAAKsE,WACxBA,WAAY5F,EAAKsB,KAAKsE,WACtBtD,MAAOtC,EAAKsC,MACZ4kB,SAAU,uBACV/S,UAAWnU,EAAKqT,UAAUc,UAC1Bb,WAAYtT,EAAKqT,UAAUC,WAC3B5L,SAAUqM,EACV/C,uBAAwBA,GACxBF,mBAAoBA,IAElB9Q,EAAKsB,KAAKsE,WAAY,OAIpB5F,EAAKsB,KAAKsE,WAFZoL,IAAAA,uBACAF,IAAAA,mBAEFvB,EAAS3J,WAAWoL,wBAClBA,GAA0B,EAC5BzB,EAAS3J,WAAWkL,oBAAsBA,GAAsB,EAElE9Q,EAAKyS,aAAa6F,QAAQ,CACxB5Q,SAAUqM,EACVpM,YAAa,EACbI,EAAGwH,EAAS3J,WAAWgN,UACvB3L,EAAGsI,EAAS3J,WAAWiN,WACvB3K,OAAQqH,EAASrH,OACjBC,MAAOoH,EAASpH,MAChB7F,MAAO,YACPyD,KAAMwJ,EAAS3J,WAAWshB,WAE5B3X,EAAS1G,YACA0G,IACTA,EAAS3J,WAAWmiB,aAAe,SAC5B/nB,EAAK+W,MAAMoa,MAAMpd,WAE1BxD,EAAW1M,KAAK,CAAC8L,EAASoE,EAAerM,EAAUK,EAAG0H,IACtDzP,EAAKmS,kBAAkB4B,GAAiBtE,EACxC1H,GAAKyJ,IAActB,EAAK,EAAIlQ,EAAKsC,MAAMkR,kBAChC,0bC73Db8d,UAAe,SAAS3uB,OAAO+S,EAAE,YAAY1D,EAAE7D,MAAMuH,EAAEvH,GAAG,OAAOuH,EAAEvH,GAAGojB,YAAYxkB,EAAE2I,EAAEvH,GAAG,CAACzK,EAAEyK,EAAEC,GAAE,EAAGmjB,QAAQ,WAAW5uB,EAAEwL,GAAGrN,KAAKiM,EAAEwkB,QAAQxkB,EAAEA,EAAEwkB,QAAQvf,GAAGjF,EAAEqB,GAAE,EAAGrB,EAAEwkB,eAAevf,EAAEjC,EAAEpN,EAAEqP,EAAE/D,EAAEyH,EAAE1D,EAAEhC,EAAE,SAASrN,EAAE+S,EAAEvH,GAAG6D,EAAE0D,EAAE/S,EAAE+S,IAAIhN,OAAO8oB,eAAe7uB,EAAE+S,EAAE,CAAC+b,YAAW,EAAGC,IAAIvjB,KAAK6D,EAAEjF,EAAE,SAASpK,uBAAuBgvB,QAAQA,OAAOC,aAAalpB,OAAO8oB,eAAe7uB,EAAEgvB,OAAOC,YAAY,CAAC3K,MAAM,WAAWve,OAAO8oB,eAAe7uB,EAAE,aAAa,CAACskB,OAAM,KAAMjV,EAAE7D,EAAE,SAASxL,EAAE+S,MAAM,EAAEA,IAAI/S,EAAEqP,EAAErP,IAAI,EAAE+S,EAAE,OAAO/S,KAAK,EAAE+S,GAAG,kBAAiB/S,IAAGA,GAAGA,EAAEkvB,WAAW,OAAOlvB,MAAMwL,EAAEzF,OAAOopB,OAAO,SAAS9f,EAAEjF,EAAEoB,GAAGzF,OAAO8oB,eAAerjB,EAAE,UAAU,CAACsjB,YAAW,EAAGxK,MAAMtkB,IAAI,EAAE+S,GAAG,iBAAiB/S,EAAE,IAAI,IAAIoK,KAAKpK,EAAEqP,EAAEhC,EAAE7B,EAAEpB,EAAE,SAAS2I,UAAU/S,EAAE+S,IAAIqc,KAAK,KAAKhlB,WAAWoB,GAAG6D,EAAE/O,EAAE,SAASN,OAAO+S,EAAE/S,GAAGA,EAAEkvB,WAAW,kBAAkBlvB,EAAEqvB,SAAS,kBAAkBrvB,UAAUqP,EAAEhC,EAAE0F,EAAE,IAAIA,GAAGA,GAAG1D,EAAE0D,EAAE,SAAS/S,EAAE+S,UAAUhN,OAAO9H,UAAUqxB,eAAenxB,KAAK6B,EAAE+S,IAAI1D,EAAEtR,EAAE,GAAGsR,EAAEA,EAAE1D,EAAE,GAAj5B,CAAq5B,CAAC,SAAS3L,EAAE+S,EAAE1D,GAAgBtJ,OAAO8oB,eAAe9b,EAAE,aAAa,CAACuR,OAAM,QAAS9Y,EAAE6D,EAAE,GAAGjF,EAAErE,OAAOC,KAAKwF,EAAE6jB,SAAShQ,QAAQ,SAASrf,EAAE+S,UAAU/S,EAAEuvB,OAAO/jB,EAAE6jB,QAAQtc,MAAM,IAAIA,EAAEsc,QAAQ,SAASrvB,UAAU,IAAIoK,EAAE6N,QAAQjY,EAAEqhB,OAAO,SAASrhB,EAAE+S,EAAE1D,GAAgBtJ,OAAO8oB,eAAe9b,EAAE,aAAa,CAACuR,OAAM,IAAKvR,EAAEsc,QAAQ,CAACG,SAAS,CAAC,MAAM,WAAW,WAAW,UAAU,KAAK,SAAS,OAAO,UAAU,aAAa,QAAQ,SAAS,cAAcC,eAAe,CAAC,QAAQ,SAAS3K,WAAW,CAAC,QAAQ,OAAO4K,WAAW,CAAC,YAAY,YAAY,aAAa,UAAU,MAAM,OAAO,WAAW,UAAUC,QAAQ,CAAC,YAAY,QAAQ,OAAO,QAAQ,MAAM,SAAS,WAAW,QAAQ,SAAS,QAAQ,OAAO,QAAQC,GAAG,CAAC,SAAS,QAAQ,OAAO,SAAS,cAAc,SAAS,UAAU,OAAO,OAAO,QAAQ,OAAO,QAAQ,SAAS,SAAS,WAAWC,OAAO,CAAC,iBAAiB,eAAe,QAAQ,SAAS,QAAQ,WAAW,cAAc,YAAY,UAAU,UAAUC,mBAAmB,CAAC,gBAAgB,eAAe,YAAY,UAAU,UAAU,OAAO,YAAY,aAAa,YAAY,YAAY,gBAAgB,aAAa,gBAAgB,aAAa,oBAAoB,UAAU,mBAAmBC,eAAe,CAAC,aAAa,YAAY,aAAaC,iBAAiB,CAAC,OAAO,UAAU,WAAW,mBAAmB,WAAW,YAAY,WAAW,SAAS,UAAU,kBAAkBC,eAAe,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,QAAQ,QAAQ,QAAQ,SAASC,WAAW,CAAC,cAAc,YAAY,QAAQ,cAAc,YAAY,WAAW,aAAa,mBAAmB,aAAa,YAAY,iBAAiB,cAAc,cAAc,YAAY,iBAAiB,qBAAqB,MAAM,OAAO,QAAQ,OAAO,cAAcC,iBAAiB,CAAC,QAAQ,SAASC,MAAM,CAAC,mBAAmB,oBAAoB,qBAAqB,uBAAuB,mBAAmB,kBAAkB,iBAAiB,wBAAwB,kBAAkB,gBAAgB,kBAAkB,gBAAgB,kBAAkB,mBAAmB,uBAAuB,qBAAqB,wBAAwBC,OAAO,CAAC,uBAAuB,qBAAqBC,YAAY,CAAC,qBAAqB,qBAAqB,iBAAiB,iBAAiB,aAAa,oBAAoB,oBAAoB,cAAc,oBAAoB,oBAAoB,mBAAmB,eAAe,uBAAuBC,QAAQ,CAAC,cAAc,mBAAmB,iBAAiB,cAAc,iBAAiB,gBAAgB,eAAeC,YAAY,CAAC,YAAY,OAAO,SAAS,cAAc,UAAU,SAAS,SAAS,cAAc,mBAAmB,eAAe,aAAa,aAAaC,GAAG,CAAC,KAAK,WAAW,iBAAiB,qBAAqB,4BAA4B,0BAA0B,iBAAiB,gBAAgB,UAAU,oBAAoB,oBAAoB,oBAAoB,oBAAoB,eAAe,eAAe,eAAe,eAAe,cAAc,iBAAiB,YAAY,gBAAgB,UAAU,iBAAiB,cAAc,gBAAgB,gBAAgB,oBAAoB,sBAAsB,uBAAuB,WAAWC,cAAc,CAAC,WAAW,WAAW,aAAa,eAAe,gBAAgB,cAAc,cAAc,eAAe,sBAAsB,SAAS,cAAc,MAAM,OAAO,iBAAiB,iBAAiB,iBAAiB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,iBAAiB,iBAAiB,iBAAiB,QAAQ,eAAe,mBAAmB,OAAO,gBAAgB,OAAO,cAAc,cAAc,OAAO,YAAY,kBAAkB,YAAY,oBAAoB,mBAAmB,oBAAoB,mBAAmB,eAAe,aAAa,eAAe,cAAc,mBAAmB,sBAAsB,kBAAkB,WAAW,UAAU,WAAW,WAAW,aAAa,SAAS,gBAAgB,iBAAiB,cAAc,eAAe,eAAe,kBAAkB,WAAW,qBAAqB,iBAAiB,WAAW,oBAAoB,WAAW,WAAW,WAAW,WAAW,gBAAgB,OAAO,kBAAkBrB,6DCE7mKsB,gBAAkB,SAAUC,oBAUzB,CANY,uCAEE,yCADD,wCAED,2CACG,4CAQpBC,KAAK,SAACC,iCAAeA,EAAWnwB,KAAKiwB,iBAInCG,iBAAmB,CAAC,EAAG,GAEvBC,YAAc,SAAUJ,SACrB,gCAAgCjwB,KAAKiwB,IAGxCK,oBAAsB,SAAUC,OAEhCC,EAAmC,IAArBD,EAAQ3M,SAAiB2M,EAAQE,UAAYF,EAAQtxB,YAEhEyxB,OAAOF,GAAatzB,QAAQ,OAAQ,KAAKyzB,QAG5CC,cAAgB,SAAU3xB,cACxB4xB,GAAM,IAAIC,WAAYC,gBAAgB9xB,EAAM,aAC5CsxB,EAAUM,EAAIG,cAAc,QAAUH,EAAIG,cAAc,eAC1CV,oBAAoBC,GAGrC/H,MAAM,MACNla,IAAI,SAAC9M,4CAASA,EAAKgnB,MAAM,MAAMla,IAAI,SAACqV,iCAAW,CAAEA,MAAO,CAAC,CAAEA,MAAAA,gCAG1DsN,eAAiB,SAAUhyB,SAGzB8P,EAAO,iCAFD,IAAI+hB,WAAYC,gBAAgB9xB,EAAM,aAClC6D,iBAAiB,4CAGX,OAAXoT,UACHsF,EAAM,gCAEYtF,EAAGgb,2CAAY,KAA5BC,cACLf,iBAAiBxN,SAASuO,EAAUvN,eAElChH,EAAM,CAAE+G,MAAO,IACfA,EAAQ2M,oBAAoBa,GAE9BxN,GAAO/G,EAAI+G,MAAMpjB,KAAK,CAAEojB,MAAAA,IAE5BnI,EAAIjb,KAAKqc,mCAGX7N,EAAKxO,KAAKib,yCAGLzM,GAGHqiB,UAAY,SAAUnyB,qBACnBA,EACJupB,MAAM,MACNla,IAAI,SAAC9M,4CAASA,EAAKgnB,MAAM,MAAMla,IAAI,SAACqV,iCAAW,CAAEA,MAAO,CAAC,CAAEA,MAAAA,gCAG1D0N,UAAY,SAAUpyB,EAAMqyB,SACf,cAAbA,GAA4BjB,YAAYpxB,GACnCgyB,eAAehyB,GACA,cAAbqyB,EACFV,cAAc3xB,GAKhBmyB,UAAUnyB,IAGbsyB,SAAW,SAAU5N,SACJ,iBAAVA,EAA2BA,EAE/BA,EAAMzmB,QAAQ,KAAM,QAAQA,QAAQ,KAAM,SAG7Cs0B,iBAAmB,SAAUC,EAAcC,qBAG1CA,EAIED,EAAanjB,IAAI,SAACkN,iCAAQpW,OAAOusB,OAAOnW,GAAKoW,KAAK,mBAAOA,KAAK,MAH5DH,EAAanjB,IAAI,SAACkN,iCAAQpW,OAAOusB,OAAOnW,GAAKoW,KAAK,iBAAKA,KAAK,KAMjEC,iBAAmB,SAAUJ,EAAcC,kBAC1CA,EAAQ,OAAOF,iBAAiBC,EAAcC,OAG/CI,EAAa,iBACjBA,GAAcL,EACXnjB,IACC,SAACkN,4CACC,OACApW,OAAOusB,OAAOnW,GACXlN,IAAI,SAACqV,iCAAU,CAAC,OAAQ4N,SAAS5N,GAAQ,SAASiO,KAAK,iBACvDA,KAAK,IACR,qBAEHA,KAAK,IACRE,GAAc,YChHD,gBAAUp1B,OACnBq1B,EACJr1B,EAAKs1B,gBAAkB,SAAU3yB,GAC/BA,EAAE2yB,mBAUJt1B,EAAKgF,iBAAmB,SAAUgiB,EAAIuO,GACpCv1B,EAAKw1B,OAAOxO,GAAMhnB,EAAKw1B,OAAOxO,IAAO,GACrChnB,EAAKw1B,OAAOxO,GAAI1O,QAAQid,IAU1Bv1B,EAAKy1B,oBAAsB,SAAUzO,EAAIuO,IACtCv1B,EAAKw1B,OAAOxO,IAAO,IAAInmB,SAAQ,SAA4B60B,EAAKrI,GAC3DkI,IAAOG,GACT11B,EAAKw1B,OAAOxO,GAAI0F,OAAOW,EAAK,OAYlCrtB,EAAKmC,cAAgB,SAAU6kB,EAAIrkB,OAG7BgzB,WACKC,IACPD,GAAmB,KAJrBhzB,EAAIqkB,EAAGjhB,KAAOihB,EAAKrkB,GAAK,GACxBqkB,EAAKA,EAAGjhB,MAAQihB,EAKXhnB,EAAKw1B,OAAOxO,UAGjBhnB,EAAKw1B,OAAOxO,GAAInmB,SAAQ,SAA2B00B,GACjD5yB,EAAE0F,IAAMrI,EAAKqI,IACb1F,EAAEizB,eAAiBA,EACnBL,EAAG3Q,MAAM5kB,EAAKsB,KAAM,CAACqB,OAEhBgzB,GAET31B,EAAK61B,SAAW,kBACPjuB,KAAK4G,IACVxO,EAAKE,WAAW41B,eACfr0B,OAAOs0B,kBAAoB,IACzB/1B,EAAKqI,IAAI2tB,8BACRh2B,EAAKqI,IAAI4tB,2BACTj2B,EAAKqI,IAAI6tB,0BACTl2B,EAAKqI,IAAI8tB,yBACTn2B,EAAKqI,IAAI+tB,wBACT,KAMRp2B,EAAKq2B,oBAAsB,sBACnB/nB,EAAItO,EAAKuO,YACfvO,EAAKkd,YAAYjW,EAAI,OAGjBqvB,EAAc,EAEZjlB,EAAwBrR,EAAK2O,2BAC7B4nB,EAAoB,SAAC5uB,4CACzB0J,EAAsBxC,UACpB,SAACC,iCAAUnH,GAAemH,EAAMC,MAAQpH,GAAemH,EAAME,iBAC1D,qBAGLV,EAAE0T,QAAO,SAAsBwU,EAAaC,EAAQ9uB,OAE5C+uB,EAAc12B,EAAKoS,OAAO0C,QAAQnN,GAClCgvB,EAAc32B,EAAKiP,eAAeynB,UAC/BpoB,EAAEooB,GACC9nB,QAAW2nB,EAAkB5uB,KACvC6uB,GAAeG,GACbhvB,EAAc3H,EAAKyO,cACrBzO,EAAKkd,YAAYjW,EAAEU,GAAe6uB,EAClCF,EAAcE,GAEdx2B,EAAKkd,YAAYjW,EAAEU,GAAeC,KAAK0U,IACrCga,EAAcK,EACdH,GAGGA,IACN,IAAM,GAGbx2B,EAAKqC,OAAS,SAAUu0B,MACjB52B,EAAK4B,YAGNqF,EAgDF4vB,EA/CAvvB,EAAI,CACFL,EAAG,EACHc,EAAG,EACHG,OAAQ,EACRC,MAAO,EACP7F,MAAO,uBAETW,EAAI,CACFgE,EAAG,EACHc,EAAG,EACHG,OAAQ,EACRC,MAAO,EACP7F,MAAO,yBAETw0B,EAAK,CACH7vB,EAAG,EACHc,EAAG,EACHG,OAAQ,EACRC,MAAO,EACP7F,MAAO,uBAETy0B,EAAK,CACH9vB,EAAG,EACHc,EAAG,EACHG,OAAQ,EACRC,MAAO,EACP7F,MAAO,yBAET00B,EAAK,CACH/vB,EAAG,EACHc,EAAG,EACHG,OAAQ,EACRC,MAAO,EACP2d,UAAU,EACVmR,mBAAmB,EACnB30B,MAAO,qBAETyN,EAAoC,EAAhC/P,EAAKsC,MAAMwa,mBACf9P,EAAsC,EAAlChN,EAAKsC,MAAM0a,qBACfhN,EAAoC,GAAhChQ,EAAKsC,MAAMwa,mBACfoa,EAAMl3B,EAAKsC,MAAM8U,eAAmD,EAAlCpX,EAAKsC,MAAM0a,qBAC7Cma,EAAQn3B,EAAK61B,WACbuB,EAAuC,aAAlCp3B,EAAKsC,MAAM6N,mBAAoC,EAAI,EACxDknB,EAAar3B,EAAKsC,MAAMkR,gBAAkB4jB,EAC1CE,EAAyBt3B,EAAKsC,MAAM6U,4BAA8BigB,EAClEG,EAAa,EACbC,EAAY,EAEZppB,GAAKpO,EAAKiQ,UAAY,IAAInK,OAC1B4K,EAAyB1Q,EAAK2Q,4BAC9BC,EAAqB5Q,EAAK6Q,wBAC1B4mB,EAAqBz3B,EAAKiR,2BAC1BymB,EAAqB13B,EAAK+Q,uBAC1B4mB,EAAK33B,EAAKsC,MAAMkP,eAsDlBgmB,EAAYx3B,EAAKq2B,sBACjBr2B,EAAKkd,YAAYnV,EAAI,GAChBd,EAAI,EAAGA,EAAImH,EAAGnH,GAAK,EACtBjH,EAAKkd,YAAYnV,EAAEd,GAAKswB,EACxBA,KACIv3B,EAAK+W,MAAM1E,KAAKpL,IAAM0wB,IAAO33B,EAAK+W,MAAMoa,MAAMlqB,IAAM,IAAMjH,EAAKsL,OAEhEtL,EAAKoT,UAAYnM,GAAIjH,EAAK+W,MAAMoa,MAAMlqB,IAAU,MAEjDmH,EAAI,IACNpO,EAAKkd,YAAYnV,EAAEd,GAAKswB,GAEtBv3B,EAAKE,WAAWwU,aAClB6iB,GAAcI,GAEZ33B,EAAKE,WAAWgU,YAClBqjB,GAAcv3B,EAAKsC,MAAMkP,YAE3BomB,IACI53B,EAAKmP,aACPnP,EAAKmI,MAAQnI,EAAK4F,WAAWkiB,YAC7B9nB,EAAKkI,OAASlI,EAAK4F,WAAWmiB,cAE9B/nB,EAAKkI,SAAWlI,EAAK4B,OAAOmmB,cAC5B/nB,EAAKmI,QAAUnI,EAAK4B,OAAOkmB,cAE3B9nB,EAAKkI,OAASlI,EAAK4B,OAAOmmB,aAC1B/nB,EAAKmI,MAAQnI,EAAK4B,OAAOkmB,YACzB9nB,EAAK8H,iBAAmB9H,EAAK63B,KAAK/vB,kBAAoB,EACtD9H,EAAKgI,gBAAkBhI,EAAK63B,KAAK7vB,iBAAmB,GAItDhI,EAAKqT,UAAU+N,IACb1Q,EAAyB+mB,EAAqBH,EAChDt3B,EAAKqT,UAAUiN,KAAO1P,EAAqB8mB,EAE3CI,IAEAC,IAGI/3B,EAAKqT,UAAUqK,uBACS,SAAtB1d,EAAKsC,MAAM4F,QAAsBlI,EAAKmP,cACxCnP,EAAKkI,QAAUgvB,GAEjBK,GAAcL,EACdU,IACAE,IACAC,KAEE/3B,EAAKqT,UAAU4K,qBACQ,SAArBje,EAAKsC,MAAM6F,OAAqBnI,EAAKmP,cACvCnP,EAAKmI,OAAS+uB,GAEhBM,GAAaN,EACbU,IACAE,IACAC,KAGFD,IACA93B,EAAKqT,UAAUgK,YAAcma,EAAYx3B,EAAKqT,UAAUlL,MACxDnI,EAAKqT,UAAUoK,aAAe8Z,EAAav3B,EAAKqT,UAAUnL,OACtDlI,EAAKyO,aAAe,EACtBzO,EAAKqT,UAAU2kB,eACZh4B,EAAKqT,UAAUlL,MAAQnI,EAAKkd,YAAYjW,EAAEjH,EAAKyO,aAAe,IAC/D+oB,EAEFx3B,EAAKqT,UAAU2kB,cAAgBh4B,EAAKqT,UAAUlL,MAAQqvB,EAExDx3B,EAAKqT,UAAU+J,eACbpd,EAAKqT,UAAUlL,MAAQnI,EAAKqT,UAAU2kB,cACtCh4B,EAAKsC,MAAM8U,eACXpK,EACAgD,EAMFhQ,EAAKqT,UAAU4kB,gBACZj4B,EAAKqT,UAAUnL,OACdwI,EACA+mB,EACAz3B,EAAKkd,YAAYnV,EAAE/H,EAAKoT,YAC1BmkB,EACFv3B,EAAKqT,UAAUmK,gBACbxd,EAAKqT,UAAUnL,OAASlI,EAAKqT,UAAU4kB,eACvCj4B,EAAKsC,MAAM8U,eACXpK,EACAgD,EACFhQ,EAAKqT,UAAU+J,eAAiBxV,KAAK0U,IACnCtc,EAAKqT,UAAU+J,eACfpd,EAAKsC,MAAM41B,qBAEbl4B,EAAKqT,UAAUmK,gBAAkB5V,KAAK0U,IACpCtc,EAAKqT,UAAUmK,gBACfxd,EAAKsC,MAAM41B,qBAGbj1B,EAAEgE,GAAK2J,EACP3N,EAAE8E,GAAK/H,EAAKkI,OAASlI,EAAKsC,MAAM8U,eAAiBpH,EAAIynB,EACrDx0B,EAAEkF,MACAnI,EAAKmI,MACLnI,EAAKsC,MAAM8U,eACXxG,EACA8mB,EACA1nB,EACAD,EACF9M,EAAEiF,OAASlI,EAAKsC,MAAM8U,eAAiBpX,EAAKsC,MAAM0a,qBAAuBhN,EAEzE+mB,EAAGhvB,EAAI9E,EAAE8E,EAAI/H,EAAKsC,MAAMwa,mBACxBia,EAAG5uB,MAAQnI,EAAKqT,UAAU+J,eAC1B2Z,EAAG7uB,OAASlI,EAAKsC,MAAM61B,kBAEvB7wB,EAAEL,GACAjH,EAAKmI,MACLuvB,EACA13B,EAAKsC,MAAM8U,eACXpX,EAAKsC,MAAM0a,qBACXhN,EACF1I,EAAES,GAAK2I,EAAyB1Q,EAAKkd,YAAYnV,EAAE/H,EAAKoT,WACxD9L,EAAEa,MAAQnI,EAAKsC,MAAM8U,eAAiBpX,EAAKsC,MAAM0a,qBAAuBhN,EACxE1I,EAAEY,OACAlI,EAAKkI,OACLwI,EACA+mB,EACAz3B,EAAKsC,MAAM8U,eACXpH,EACAD,EAEF+mB,EAAG7vB,EAAIK,EAAEL,EAAIjH,EAAKsC,MAAMwa,mBACxBga,EAAG/uB,GAAK/H,EAAKkd,YAAYnV,EAAE/H,EAAKoT,WAChC0jB,EAAG3uB,MAAQnI,EAAKsC,MAAM61B,kBACtBrB,EAAG5uB,OAASlI,EAAKqT,UAAUmK,gBAE3BwZ,EAAG/vB,EAAIhE,EAAEgE,EAAIhE,EAAEkF,MAAQ4H,EACvBinB,EAAGjvB,EAAIT,EAAES,EAAIT,EAAEY,OAAS6H,EACxBinB,EAAG7uB,MAAQnI,EAAKsC,MAAM8U,eAAiBpX,EAAKsC,MAAM0a,qBAClDga,EAAG9uB,OAASlI,EAAKsC,MAAM8U,eAAiBpX,EAAKsC,MAAM0a,qBACnDhd,EAAKqT,UAAUwJ,SAAW,CACxBM,cAAela,EACfga,cAAe8Z,EACfxZ,YAAajW,EACbgW,YAAawZ,EACbzY,OAAQ2Y,GAEVh3B,EAAKqT,UAAU+kB,IAAM,CACnB9wB,EAAGA,EACHuF,EAAG5J,GAELjD,EAAKqT,UAAUglB,IAAM,CACnB/wB,EAAGwvB,EACHjqB,EAAGkqB,GAGL/2B,EAAKs4B,KAAO1wB,KAAK0U,IACf,EACAtc,EAAKwS,YAAY1M,OAAS,EAAI9F,EAAKE,WAAWq4B,oBAG3Cv4B,EAAKmP,YAAa,KACfqpB,EAAWx4B,EAAKmI,MAAQgvB,EACxBsB,EAAYz4B,EAAKkI,OAASivB,EAK5Bn3B,EAAK4B,OAAOuG,QAAUqwB,GAAYx4B,EAAK4B,OAAOsG,SAAWuwB,IAC3Dz4B,EAAK4B,OAAOuG,MAAQqwB,EACpBx4B,EAAK4B,OAAOsG,OAASuwB,EACrBz4B,EAAKqI,IAAIiD,MAAM6rB,EAAOA,WAI1Bn3B,EAAK04B,kBACL14B,EAAK24B,QAAO,GACR/B,GACF52B,EAAK6I,MAAK,GAEZ7I,EAAKmC,cAAc,SAAU,KACtB,WA1OE41B,IACP/3B,EAAKqT,UAAUqK,qBACS,SAArB1d,EAAKsC,MAAM6F,OACVqvB,EAAYx3B,EAAKqT,UAAUlL,OACF,WAAzBnI,EAAKsC,MAAMs2B,WACY,WAAzB54B,EAAKsC,MAAMs2B,UACb54B,EAAKqT,UAAUwK,qBAAuB2Z,EAAYx3B,EAAKqT,UAAUlL,MACjEnI,EAAKqT,UAAU4K,mBACU,SAAtBje,EAAKsC,MAAM4F,QACVqvB,EAAav3B,EAAKqT,UAAUnL,QACH,WAAzBlI,EAAKsC,MAAMu2B,WACY,WAAzB74B,EAAKsC,MAAMu2B,UACb74B,EAAKqT,UAAU6K,mBAAqBqZ,EAAav3B,EAAKqT,UAAUnL,gBAEzD4vB,IACP93B,EAAKqT,UAAUlL,MACbnI,EAAKmI,MAAQyI,EAAqB8mB,EACpC13B,EAAKqT,UAAUnL,OACblI,EAAKkI,OAASwI,EAAyB+mB,WAElCG,IACH53B,EAAKmP,cAGT0nB,EAAO,CAEL3uB,OACEwI,EACA+mB,EACAF,EACAF,EACA,EACFlvB,MAAOqvB,EAAY5mB,EAAqBymB,EAAaK,IAEtD,QAAS,UAAU72B,SAAQ,SAAUi4B,IAGgB,IAAlD,CAAC,YAAQ5xB,GAAW0T,QAAQ5a,EAAKsC,MAAMw2B,MACyB,IAAhE,CAAC,YAAQ5xB,GAAW0T,QAAQ5a,EAAK+4B,oBAAoBD,IAErD94B,EAAKg5B,gBAAgBF,GAAOjC,EAAKiC,GAAO,MAES,GAAjD,CAAC,YAAQ5xB,GAAW0T,QAAQ5a,EAAKsC,MAAMw2B,MACwB,GAA/D,CAAC,YAAQ5xB,GAAW0T,QAAQ5a,EAAK+4B,oBAAoBD,MAErD94B,EAAKg5B,gBAAgBF,GAAO94B,EAAKsC,MAAMw2B,GACnC94B,EAAKuB,cACPvB,EAAK4B,OAAOU,MAAMw2B,GAAO94B,EAAKsC,MAAMw2B,WA6L9C94B,EAAK24B,OAAS,SAAUM,OAClB3qB,EAAItO,EAAKuO,YACXH,GAAKpO,EAAKiQ,UAAY,IAAInK,OAC1B6xB,EAAK33B,EAAKsC,MAAMkP,eAElBxR,EAAKqU,eAAiBzM,KAAKsxB,MACzB9qB,GAAKpO,EAAKqT,UAAUc,UAAYnU,EAAKqT,UAAUoK,cAAgB,KAEjEzd,EAAKqU,eAAiBzM,KAAK0U,IAAItc,EAAKqU,eAAgB,GACpDrU,EAAKoU,eAAiBpU,EAAKkd,YAAYnV,EAAE/H,EAAKqU,gBAEV,IAAhCrU,EAAKqT,UAAUoK,eACjBzd,EAAKqU,eAAiB,GAExBrU,EAAKoU,eAAiB,EACtBpU,EAAK4U,gBAAkB5U,EAAKyO,aAC5BzO,EAAKuT,gBAAkB,EAErBvT,EAAKoU,eAAiBpU,EAAKqT,UAAUc,WACrCnU,EAAKqU,eAAiBrU,EAAKiQ,SAASnK,QAGpC9F,EAAKqU,gBAAkB,EACvBrU,EAAKoU,eAAiBpU,EAAKkd,YAAYnV,EAAE/H,EAAKqU,qBAG9CrU,EAAKuT,gBAAkBvT,EAAKqT,UAAUC,WAAa,GACnDtT,EAAK4U,gBAAkBtG,EAAExI,QAEzB9F,EAAKuT,gBAAkBvT,EAAKkd,YAAYjW,EAAEjH,EAAK4U,iBAC/C5U,EAAK4U,iBAAmB,EAEtBtG,EAAExI,OAAS,IACb9F,EAAK4U,gBAAkBhN,KAAK0U,IAAItc,EAAK4U,gBAAkB,EAAG,GAC1D5U,EAAKuT,iBAAmBvT,EAAKiP,eAC3BjP,EAAKoS,OAAO0C,QAAQ9U,EAAK4U,oBAGxB5U,EAAKiQ,UAAY,IAAInK,OAAS,IACjC9F,EAAKqU,eAAiBzM,KAAK0U,IAAItc,EAAKqU,eAAiB,EAAG,GACxDrU,EAAKoU,eAAiBxM,KAAK0U,IACzBtc,EAAKoU,gBACFpU,EAAKiQ,SAASjQ,EAAKqU,iBACfrU,EAAK+W,MAAM1E,KAAKrS,EAAKqU,iBAAmBsjB,IACxC33B,EAAK+W,MAAMoa,MAAMnxB,EAAKqU,iBAAmB,GAC1CsjB,GACF33B,EAAKsL,MACT,IAGJtL,EAAKm5B,cAAgB,GAChBF,GACHj5B,EAAK6I,MAAK,GAIZzG,sBAAsBpC,EAAK04B,iBAC3B14B,EAAKmC,cAAc,SAAU,CAC3Bif,IAAKphB,EAAKqT,UAAUc,UACpBmM,KAAMtgB,EAAKqT,UAAUC,cAGzBtT,EAAKo5B,UAAY,SAAUz2B,EAAG02B,OACxBr5B,EAAKs5B,cAAet5B,EAAKu5B,UAKzBv5B,EAAKw5B,cAA4B,IAAZ72B,EAAE82B,aACzBz5B,EAAK05B,eAAe/2B,QACpB3C,EAAK25B,QAAQh3B,GAIf3C,EAAKyjB,MAAQ4V,GAAer5B,EAAK45B,YAAYj3B,OAI3Ce,EAEAm2B,EACAC,EAIAC,EAVEC,GACCr3B,EAAEs3B,SAAWt3B,EAAEu3B,SAAWl6B,EAAKE,WAAWi6B,2BAC1Cn6B,EAAKE,WAAWk6B,oBAEnB9rB,EAAItO,EAAKuO,YAGTtH,EAAIjH,EAAKyjB,MAAMxc,EACfc,EAAI/H,EAAKyjB,MAAM1b,EACfX,EAAOpH,EAAK2Y,UAAU1R,EAAGc,GAEzBsyB,GAA6B,EAC7BC,GAA+B,EAC/BtT,EAAK,CAAEuT,YAAa53B,EAAGyE,KAAMA,EAAMH,EAAGA,EAAGc,EAAGA,GAC5CyyB,EAAex6B,EAAKyQ,eACtBgqB,aAAaz6B,EAAK06B,aACb16B,EAAK26B,SAAS,CAAE1zB,EAAGA,EAAGc,EAAGA,MAC5B/H,EAAK4jB,UAAW,IAEd5jB,EAAKmC,cAAc,YAAa6kB,OAGhC5f,GAAQpH,EAAKyQ,cACfzQ,EAAK46B,mBAAqB56B,EAAKyQ,YAAY/I,WAAaN,EAAKM,SAC7D1H,EAAK66B,sBACH76B,EAAKyQ,YAAY9I,cAAgBP,EAAKO,YACxC3H,EAAK86B,oBACH96B,EAAK46B,oBAAsB56B,EAAK66B,uBACjC,MAAO,SAAU,QAAQh6B,SAAQ,SAAUk6B,GACtC/6B,EAAK+6B,EAAS,qBAChB/T,EAAG5f,KAAOozB,EACVx6B,EAAKmC,cAAc44B,EAAS,WAAY/T,GACxCA,EAAG5f,KAAOA,EACVpH,EAAKmC,cAAc44B,EAAS,YAAa/T,QAI/ChnB,EAAKyQ,YAAcrJ,GAGhBpH,EAAKw5B,cACNpyB,IACkB,SAAjBA,EAAK0W,SAAsB1W,EAAK0W,UAAY9d,EAAKg7B,YAClD,KACMC,EAAYj7B,EAAKk7B,mBAAmBl7B,EAAKyjB,MAAMxc,EAAGjH,EAAKyjB,MAAM1b,MAC/DkzB,SACFj7B,EAAKm7B,OAAS,UACdn7B,EAAKkM,OAAS,CAAE2jB,gBAAiBoL,QACjCj7B,EAAK6I,UAKT7I,EAAKkM,OAAS,IACTlM,EAAKw5B,cAAgBpyB,EAAM,IAC9BpH,EAAKo7B,SAAWh0B,EAChBpH,EAAK+X,SAAW3Q,EAAKyc,YACrB7jB,EAAKm7B,OAAS/zB,EAAK0W,QACE,SAAjB1W,EAAK0W,UACP9d,EAAKm7B,OAAS,UACdn7B,EAAKkM,OAAS,CACZxE,SAAUN,EAAKM,SACfC,YAAaP,EAAKO,YAClB0mB,gBAAgB,EAChBliB,gBAAgB,GAGhB/E,EAAK4e,cACL/e,EACEG,EAAKH,EACHG,EAAKe,MACLnI,EAAK8H,iBACL9H,EAAKsC,MAAM0rB,mBACf/mB,EAAIG,EAAKH,EAAIG,EAAKe,MAAQnI,EAAK8H,kBAC/BC,EACEX,EAAKW,EACHX,EAAKc,OACLlI,EAAKgI,gBACLhI,EAAKsC,MAAM2rB,oBACflmB,EAAIX,EAAKW,EAAIX,EAAKc,OAASlI,EAAKgI,kBAEhChI,EAAKkM,OAAOmiB,gBAAiB,EAC7BruB,EAAK6I,QAEHzB,EAAKohB,WAAaphB,EAAKshB,cAAc,KACjC2S,EAAKj0B,EAAKohB,UACZxoB,EAAKwU,SAASnC,KAAKjL,EAAKM,UAAUyD,YAClC,EACEmwB,EAAKt7B,EAAKsC,MAAM+I,kBAAoBrL,EAAKsL,MAC7CiwB,EACEn0B,EAAKH,EACLG,EAAKyE,YACL7L,EAAK8H,iBACL9H,EAAKsC,MAAMsJ,uBACXyvB,GAAMC,EAAKl0B,EAAKyE,aAClB2vB,EACEp0B,EAAKW,EACL/H,EAAKgI,gBACLhI,EAAKsC,MAAMkJ,sBAAwBxL,EAAKsL,MACxCrE,GAAKs0B,GAAMt0B,GAAKs0B,EAAKD,GAAMvzB,GAAKyzB,GAAMzzB,EAAIyzB,EAAKF,IACjDt7B,EAAKkM,OAAOC,gBAAiB,EAC7BnM,EAAK6I,WAIP7I,EAAKy7B,WAAaz7B,EAAKia,cAAe,IACxC8f,EAAQ,CACN9yB,EAAGW,KAAKqd,IAAIjlB,EAAK07B,UAAUz0B,EAAIA,GAC/Bc,EAAGH,KAAKqd,IAAIjlB,EAAK07B,UAAU3zB,EAAIA,KAES,IAAtC/H,EAAKqY,gBAAgB1Q,aAAsBhF,EAAEg5B,WAC/C37B,EAAKqY,gBAAkB,CACrB3Q,SAAU1H,EAAKoV,WAAW1N,SAC1BC,YAAa3H,EAAKoV,WAAWzN,cAGjCkyB,EAAa,CACXzY,IAAKxZ,KAAK4G,IAAIxO,EAAKqY,gBAAgB3Q,SAAUN,EAAKM,UAClD4Y,KAAM1Y,KAAK4G,IAAIxO,EAAKqY,gBAAgB1Q,YAAaP,EAAKO,aACtD0Z,OAAQzZ,KAAK0U,IAAItc,EAAKqY,gBAAgB3Q,SAAUN,EAAKM,UACrD6Y,MAAO3Y,KAAK0U,IAAItc,EAAKqY,gBAAgB1Q,YAAaP,EAAKO,eAEf,IAAtC3H,EAAKqY,gBAAgB1Q,cACvBmyB,EAAU95B,EAAK47B,qBACf/B,EAAWvZ,MAAQ,EACnBuZ,EAAWtZ,MAAQjS,EAAExI,OAAS,EAC9B+zB,EAAWzY,IAAMxZ,KAAK4G,IAAIsrB,EAAQ1Y,IAAKha,EAAKM,UAC5CmyB,EAAWxY,OAASzZ,KAAK0U,IAAIwd,EAAQzY,OAAQja,EAAKM,UAC9CmyB,EAAWzY,IAAM,IAAGyY,EAAWzY,IAAM,KAGJ,IAAnCphB,EAAKqY,gBAAgB3Q,WACvBoyB,EAAU95B,EAAK47B,qBACf/B,EAAWvZ,UACYpZ,IAArBE,EAAKO,YACDmyB,EAAQxZ,KACR1Y,KAAK4G,IAAIsrB,EAAQxZ,KAAMlZ,EAAKO,aAClCkyB,EAAWtZ,WACYrZ,IAArBE,EAAKO,YACDmyB,EAAQvZ,MACR3Y,KAAK0U,IAAIwd,EAAQvZ,MAAOnZ,EAAKO,aACnCkyB,EAAWzY,KAAO,EAClByY,EAAWxY,OAASrhB,EAAKiQ,SAASnK,OAAS,EACvC+zB,EAAWvZ,KAAO,IAAGuZ,EAAWvZ,KAAO,GACvCuZ,EAAWvZ,MAAQuZ,EAAWtZ,MAChCvgB,EAAK67B,wBAAyB,EAC3B77B,EAAK87B,qBAAsB,GAIhC97B,EAAKqY,gBAAgB3Q,WAAaN,EAAKM,UACvC1H,EAAKqY,gBAAgB1Q,cAAgBP,EAAKO,cAE1C3H,EAAK+7B,iBAAkB,GAGvB/7B,EAAK86B,qBACQ,IAAZf,EAAM9yB,GAAuB,IAAZ8yB,EAAMhyB,GACU,QAAlC/H,EAAKE,WAAWmV,sBAGInO,IAAlBE,EAAKM,UAC8B,QAAlC1H,EAAKE,WAAWmV,gBACuB,IAAtCrV,EAAKqY,gBAAgB1Q,cACvB3H,EAAK46B,mBASA,QACa1zB,IAAlBE,EAAKM,UAC8B,WAAlC1H,EAAKE,WAAWmV,gBACoB,IAAnCrV,EAAKqY,gBAAgB3Q,WACvB1H,EAAK66B,uBASA,GAAsC,QAAlC76B,EAAKE,WAAWmV,cAAyB,IAC9CjO,EAAK6E,SAAWjM,EAAKkM,OAAOmiB,sBAC1BjnB,EAAKmf,cACPnf,EAAKmf,cAAe,EACpBvmB,EAAKwmB,qBAAuB,CAC1B7e,aAAc,EACdD,UAAW,KAGb1H,EAAKwmB,qBAAqB9e,SAAWN,EAAKM,SAC1C1H,EAAKwmB,qBAAqB7e,YAAcP,EAAKO,YAC7C3H,EAAKg8B,iBAAiBr5B,EAAG,CACvBsE,EAAGG,EAAKH,EAAIG,EAAKe,MAAQnI,EAAKsC,MAAM0rB,kBACpCjmB,EAAGX,EAAKW,EAAIX,EAAKc,OACjBqE,KAAM,CAAE+T,KAAM,EAAGc,IAAK,WAG1BphB,EAAK6I,OAEA,GACLzB,EAAK6E,SACLjM,EAAKkM,OAAOC,gBACF,aAAVxJ,EAAEoD,iBAEF/F,EAAKi8B,mBAAmB70B,EAAKM,SAAUN,EAAKO,gBAG5C3H,EAAKwmB,qBAAuB,CAC1B7e,aAAc,EACdD,UAAW,GAET1H,EAAKkM,OAAOmiB,eAAgB,UAC5BruB,EAAKkM,OAAOC,eAAgB,UAC3BnM,EAAKk8B,yBAAwCh1B,IAAlBE,EAAKM,aAYnC1H,EAAKua,WAAWnT,EAAKM,UACnB1H,EAAKua,WAAWnT,EAAKM,WAAa,IAGjC,IADD1H,EAAKua,WAAWnT,EAAKM,UAAUkT,QAAQxT,EAAKO,aAE5C,CACA3H,EAAKua,WAAWnT,EAAKM,UAAU7D,KAAKuD,EAAKO,iBACrCw0B,EAAQ,CACV5hB,WAAYva,EAAKua,WACjBwa,aAAc/0B,EAAKo8B,kBACnBC,cAAer8B,EAAKs8B,mBACpBC,gBAAiBv8B,EAAK47B,sBAExB57B,EAAKmC,cAAc,mBAAoBg6B,SAvBvCn8B,EAAKua,WAAWnT,EAAKM,YAElB,IADH1H,EAAKua,WAAWnT,EAAKM,UAAUkT,QAAQxT,EAAKO,cAG5C3H,EAAKua,WAAWnT,EAAKM,UAAUglB,OAC7B1sB,EAAKua,WAAWnT,EAAKM,UAAUkT,QAAQxT,EAAKO,aAC5C,SAhDJ3H,EAAKqY,gBAAgB1Q,YAAcP,EAAKO,aAC1CkyB,EAAWvZ,KAAOtgB,EAAKqY,gBAAgB1Q,YACvCkyB,EAAWtZ,MAAQnZ,EAAKO,cAExBkyB,EAAWvZ,KAAOlZ,EAAKO,YACvBkyB,EAAWtZ,MAAQvgB,EAAKqY,gBAAgB1Q,kBAlBtC3H,EAAKqY,gBAAgB3Q,SAAWN,EAAKM,UACvCmyB,EAAWzY,IAAMphB,EAAKqY,gBAAgB3Q,SACtCmyB,EAAWxY,OAASja,EAAKM,WAEzBmyB,EAAWzY,IAAMha,EAAKM,SACtBmyB,EAAWxY,OAASrhB,EAAKqY,gBAAgB3Q,eAgF3C1H,EAAKu8B,iBACL1C,EAAWzY,MAAQphB,EAAKu8B,gBAAgBnb,KACxCyY,EAAWvZ,OAAStgB,EAAKu8B,gBAAgBjc,MACzCuZ,EAAWxY,SAAWrhB,EAAKu8B,gBAAgBlb,QAC3CwY,EAAWtZ,QAAUvgB,EAAKu8B,gBAAgBhc,OAC3CyZ,MAEK5yB,EAAK6E,SAAWjM,EAAKkM,OAAOmiB,iBAChCruB,EAAKua,WAAa,GAClBva,EAAK2a,aAAe,GACpB3a,EAAK+a,gBAAkB,KAED,IAApB8e,EAAWzY,MACbyY,EAAWzY,IAAM,GAEnB0Y,EAAUD,EAC4B,QAAlC75B,EAAKE,WAAWmV,kBACb3R,EAAIo2B,EAAQ1Y,IAAK1d,GAAKo2B,EAAQzY,OAAQ3d,GAAK,EAC9C1D,EAAKw8B,UAAU94B,GAAG,EAAM,MAAM,QAGhC1D,EAAKy8B,WAAW3C,GAAS,GACzB95B,EAAKoV,WAAW1N,SAAWoyB,EAAQ1Y,IACnCphB,EAAKoV,WAAWzN,YAAcmyB,EAAQxZ,MACjB,GAAjBwZ,EAAQxZ,MAAcwZ,EAAQ1Y,MAAQ0Y,EAAQzY,SAChDrhB,EAAKoV,WAAWzN,YAAc,EAC9B3H,EAAK87B,qBAAsB,EAC3B97B,EAAK67B,wBAAyB,QAI3B77B,EAAK08B,wBACd3C,EAAQ,CACN9yB,EAAGW,KAAKqd,IAAIjlB,EAAK07B,UAAUz0B,EAAIA,GAC/Bc,EAAGH,KAAKqd,IAAIjlB,EAAK07B,UAAU3zB,EAAIA,IAKE,MAA/B/H,EAAK0b,YAAYU,UACnBke,GAA+B,EACS,MAA/Bt6B,EAAK0b,YAAYU,YAC1Bie,GAA6B,OAI7BN,KAEA/5B,EAAKE,WAAWy8B,uBAChBtC,GACAC,EACA,KACIsC,GACDvC,GACDN,EAAMhyB,EAAI/H,EAAKE,WAAW28B,iBACxBC,GACDxC,GACDP,EAAM9yB,EAAIjH,EAAKE,WAAW28B,iBAExBD,IAAoBE,EACtB98B,EAAK+8B,eAAep6B,GAAI,EAAGoF,EAAGiyB,GACvB8C,IAAsBF,EAC7B58B,EAAK+8B,eAAep6B,EAAGsE,GAAI,EAAG+yB,GACvB8C,GAAqBF,GAC5B58B,EAAK+8B,eAAep6B,EAAGsE,EAAGc,EAAGiyB,QAE/Bh6B,EAAK+8B,eAAep6B,EAAGsE,EAAGc,EAAGiyB,GAIfh6B,EAAKg9B,iBAAiBh9B,EAAKyjB,MAAMxc,EAAGjH,EAAKyjB,MAAM1b,KAClD/H,EAAKm7B,OAAS,WAEdn7B,EAAKi9B,cAAcj9B,EAAKyjB,MAAMxc,EAAGjH,EAAKyjB,MAAM1b,KAC/C/H,EAAKm7B,OAAS,WAE5Bn7B,EAAK86B,qBAAsB,EAC3B96B,EAAK46B,oBAAqB,EAC1B56B,EAAK66B,uBAAwB,EAC7B76B,EAAK6I,MAAK,MAEZ7I,EAAKk9B,MAAQ,SAAUv6B,EAAG02B,OACpB31B,EACFy5B,EAAiB16B,KAAK0qB,UAAUntB,EAAK47B,sBACrC5B,GACGr3B,EAAEs3B,SAAWt3B,EAAEu3B,SAAWl6B,EAAKE,WAAWi6B,2BAC1Cn6B,EAAKE,WAAWk6B,oBACnBlsB,EAAMmrB,GAAer5B,EAAK45B,YAAYj3B,MACxC3C,EAAKyQ,YAAczQ,EAAK2Y,UAAUzK,EAAIjH,EAAGiH,EAAInG,QACfb,IAA1BlH,EAAKyQ,YAAY6Z,QAsBjBtqB,EAAKu5B,OACPv5B,EAAKo9B,UAEHp9B,EAAK+7B,gBACP/7B,EAAK+7B,iBAAkB,UAGzBr4B,EAAI1D,EAAKyQ,aAEPzQ,EAAKmC,cAAc,QAAS,CAAEo4B,YAAa53B,EAAGyE,KAAMpH,EAAKyQ,mBAKrDof,EAAkB7vB,EAAKk7B,mBAAmBhtB,EAAIjH,EAAGiH,EAAInG,MACvD8nB,OACM9lB,EAAkC8lB,EAAlC9lB,IAAK4lB,EAA6BE,EAA7BF,YAAaC,EAAgBC,EAAhBD,YACd,MAAR7lB,GAAuB,MAARA,EACjB/J,EAAKq9B,cAAc1N,EAAaC,GAC7B5vB,EAAKs9B,WAAW3N,EAAaC,YAIhC9gB,EAAQ9O,EAAKg9B,iBAAiB9uB,EAAIjH,EAAGiH,EAAInG,MACxC+G,IAAOA,EAAQ9O,EAAKi9B,cAAc/uB,EAAIjH,EAAGiH,EAAInG,IAC9C+G,GACE9O,EAAKu9B,YAAYzuB,UACnB9O,EAAKw9B,sBACLx9B,EAAKy9B,aAKJz9B,EAAK4jB,cAIJ8Z,EAAa19B,EAAK+Q,uBAClB4sB,EAAY39B,EAAKiR,2BACjB2sB,EAAU1vB,EAAIjH,EAAIy2B,EAClBG,EAAU3vB,EAAInG,EAAI41B,MAGnB,IADH,CAAC,gBAAiB,oBAAoB/iB,QAAQ5a,EAAKyQ,YAAYnO,QAE9D03B,GAEIh6B,EAAKkM,OAAOmiB,gBACfruB,EAAK89B,cAAcp6B,EAAEiE,YAAajE,EAAEgE,UAGP,SAA7B1H,EAAKyQ,YAAYqN,QAAoB,IACR,eAA3B9d,EAAKyQ,YAAYnO,aACnBtC,EAAK+9B,YACL/9B,EAAK6I,YACLm1B,OAG6B,qBAA3Bh+B,EAAKyQ,YAAYnO,OAC+B,SAA9CtC,EAAKE,WAAW+9B,iCACdj+B,EAAKuqB,UAAY7mB,EAAEkS,OAAO1Q,KAC5BlF,EAAK+qB,eACqB,QAAxB/qB,EAAK+qB,eAA2B,OAAS,MAE3C/qB,EAAK+qB,eAAiB,MAExB/qB,EAAKoW,MAAM1S,EAAEkS,OAAO1Q,KAAMlF,EAAK+qB,qBAC/BiT,OAIJh+B,EAAKua,WAAW7W,EAAEgE,UAAY1H,EAAKua,WAAW7W,EAAEgE,WAAa,IAEzB,QAAlC1H,EAAKE,WAAWmV,eACW,kBAA3BrV,EAAKyQ,YAAYnO,QAGY,kBAA3BtC,EAAKyQ,YAAYnO,OACjBtC,EAAKE,WAAW+K,MAChB2yB,EAAU,GACVA,EAAU59B,EAAKyQ,YAAYxJ,EACzBjH,EAAKsC,MAAMqnB,eACT3pB,EAAKsC,MAAMmnB,oBACXzpB,EAAKsC,MAAMinB,qBACXvpB,EAAKsC,MAAM47B,sBACfL,EAAU79B,EAAKyQ,YAAY1I,EACzB/H,EAAKsC,MAAMunB,gBACT7pB,EAAKsC,MAAM+mB,mBACXrpB,EAAKsC,MAAM47B,sBACfL,EAAU,cAEV79B,EAAKm+B,WAAWz6B,EAAEgE,UAIlB/E,EAAEg5B,WAAa3B,IACjBh6B,EAAKu8B,gBAAkBv8B,EAAK47B,qBAC5B57B,EAAKy8B,gBAAWv1B,GAAW,IAG/B82B,IACAh+B,EAAK6I,MAAK,cAvHDm1B,QACHhX,EACFoX,EAAKp+B,EAAK47B,qBAERuB,IAAmB16B,KAAK0qB,UAAUiR,KAGtCpX,EAAK,CACHzM,WAAYva,EAAKua,WACjBgiB,gBAAiBv8B,EAAK47B,qBACtBS,cAAer8B,EAAKs8B,oBAEtB5zB,OAAO8oB,eAAexK,EAAI,eAAgB,CACxC0K,IAAK,kBACI1xB,EAAKo8B,qBAGhBp8B,EAAKmC,cAAc,mBAAoB6kB,MAwG3ChnB,EAAKq+B,iBAAmB,SAAU17B,OAC5BuL,EAAKjH,EAAGc,SACZmG,EAAMlO,EAAK45B,YAAYj3B,GACvBsE,EAAIjH,EAAKs+B,sBAAwBpwB,EAAIjH,EAAIjH,EAAK07B,UAAUz0B,EACxDc,EAAI/H,EAAKu+B,uBAAyBrwB,EAAInG,EAAI/H,EAAK07B,UAAU3zB,EACrDd,EAAIjH,EAAKsC,MAAMk8B,iBACjBv3B,EAAIjH,EAAKsC,MAAMk8B,gBAEbz2B,EAAI/H,EAAKsC,MAAMm8B,eACjB12B,EAAI/H,EAAKsC,MAAMm8B,eAGfz+B,EAAKmC,cAAc,eAAgB,CACjC8E,EAAGA,EACHc,EAAGA,EACHyxB,aAAcx5B,EAAKw5B,iBAMrBx5B,EAAKqT,UAAUC,WACbtT,EAAKqT,UAAUgK,YAAcrd,EAAKE,WAAWw+B,kBAC7B,cAAlB1+B,EAAK+X,UAEL/X,EAAKqC,QAAO,GAEQ,cAAlBrC,EAAK+X,UACP/X,EAAK+W,MAAMjC,QAC0B,kBAAnC9U,EAAKw5B,aAAa5jB,OAAOtT,MACrB,aACAtC,EAAKw5B,aAAaxe,iBACpB/T,GAIK,IAFP,CAAC,gBAAiB,cAAc2T,QAC9B5a,EAAKw5B,aAAa5jB,OAAOtT,QAG3BtC,EAAKqC,QAAO,QAEdrC,EAAK2+B,oBAGe,cAAlB3+B,EAAK+X,UACH/X,EAAKw5B,aAAahqB,QACpBxP,EAAK+W,MAAMoa,MAAMnxB,EAAKw5B,aAAa9xB,UAAYK,EACtC/H,EAAKE,WAAW0+B,gBACzB5+B,EAAKsC,MAAMkP,WAAazJ,EAExB/H,EAAK+W,MAAM1E,KAAKrS,EAAKw5B,aAAa9xB,UAAYK,EAEhD/H,EAAKmC,cAAc,YAAa,CAAE2c,IAAK/W,SACvC/H,EAAK2+B,yBAGP3+B,EAAKm5B,cAAgB,MAEvBn5B,EAAK6+B,eAAiB,SAAU1C,OACxBjuB,EAAMlO,EAAK45B,YAAYuC,MAEP,cAAlBn8B,EAAK+X,SAA0B,KAC3B+mB,KAAc5wB,EAAIjH,EAAIjH,EAAK07B,UAAUz0B,GAErC83B,EAAqB/+B,EAAKg/B,iBAC9Bh/B,EAAKo7B,SAASzzB,gBAGZm3B,GAAYC,EAAoB,KAC5B52B,EAAQP,KAAK0U,IACjBtc,EAAKs+B,sBAAwBpwB,EAAIjH,EAAIjH,EAAK07B,UAAUz0B,EACpDjH,EAAKsC,MAAMk8B,gBAGbx+B,EAAKi/B,mBAAmB92B,IAI5BnI,EAAKqC,SACLZ,OAAOg0B,oBAAoB,YAAaz1B,EAAKq+B,kBAAkB,GAC/D58B,OAAOg0B,oBAAoB,UAAWz1B,EAAK6+B,gBAAgB,GAC3D7+B,EAAKw9B,iBACLx9B,EAAK6I,MAAK,GACV7I,EAAK+7B,iBAAkB,GAEzB/7B,EAAKk/B,WAAa,SAAUv8B,OACtBuL,EAAMlO,EAAK45B,YAAYj3B,UAEzB3C,EAAKE,WAAWi/B,mBAChBn/B,EAAKwjB,sBAGE,IAFP,CAAC,wBAAyB,uBAAuB5I,QAC/C5a,EAAKo/B,mBAGPp/B,EAAKwjB,oBAAoBvc,GAAKtE,EAAE08B,UAChCr/B,EAAKwjB,oBAAoBzb,GAAKpF,EAAE28B,UAChCt/B,EAAKwjB,oBAAoBvc,EAAIW,KAAK4G,IAChCxO,EAAKmI,MAAQnI,EAAKsC,MAAM8U,eACxBxP,KAAK0U,IAAI,EAAGtc,EAAKwjB,oBAAoBvc,IAEvCjH,EAAKwjB,oBAAoBzb,EAAIH,KAAK4G,IAChCxO,EAAKkI,OAASlI,EAAKsC,MAAM8U,eACzBxP,KAAK0U,IAAI,EAAGtc,EAAKwjB,oBAAoBzb,IAEvCmG,EAAMlO,EAAKwjB,qBAEbxjB,EAAKu/B,WAAav/B,EAAK2Y,UAAUzK,EAAIjH,EAAGiH,EAAInG,GAAG+V,QAEzB,0BAApB9d,EAAKu/B,YACoB,0BAAzBv/B,EAAKo/B,iBAELp/B,EAAKo/B,gBAAkB,wBACvBp/B,EAAK07B,UAAYxtB,EACjBlO,EAAKw/B,YAAYlf,KAAOtgB,EAAKqT,UAAUC,gBACvCmnB,aAAaz6B,EAAK06B,cAIE,wBAApB16B,EAAKu/B,YACoB,wBAAzBv/B,EAAKo/B,iBAELp/B,EAAKo/B,gBAAkB,sBACvBp/B,EAAK07B,UAAYxtB,EACjBlO,EAAKw/B,YAAYpe,IAAMphB,EAAKqT,UAAUc,eACtCsmB,aAAaz6B,EAAK06B,eAIO,wBAAzB16B,EAAKo/B,iBACe,wBAApBp/B,EAAKu/B,aAELv/B,EAAKu/B,WAAa,uBAGO,0BAAzBv/B,EAAKo/B,iBACe,0BAApBp/B,EAAKu/B,aAELv/B,EAAKu/B,WAAa,yBAEpB9E,aAAaz6B,EAAK06B,mBACiC,IAA/C16B,EAAKy/B,YAAY7kB,QAAQ5a,EAAKu/B,cAGV,wBAApBv/B,EAAKu/B,WACPv/B,EAAKqT,UAAUc,UACbnU,EAAKw/B,YAAYpe,KAChBlT,EAAInG,EAAI/H,EAAK07B,UAAU3zB,GAAK/H,EAAKqT,UAAU4kB,eACjB,wBAApBj4B,EAAKu/B,YACdv/B,EAAKqT,UAAUc,WAAanU,EAAKs4B,KAAOt4B,EAAKsC,MAAMkP,WACnDxR,EAAK06B,YAAcgF,WACjB1/B,EAAKk/B,WACLl/B,EAAKE,WAAWy/B,iBAChBh9B,IAE2B,2BAApB3C,EAAKu/B,aACdv/B,EAAKqT,UAAUc,WAAanU,EAAKs4B,KAAOt4B,EAAKsC,MAAMkP,WACnDxR,EAAK06B,YAAcgF,WACjB1/B,EAAKk/B,WACLl/B,EAAKE,WAAWy/B,iBAChBh9B,IAGoB,0BAApB3C,EAAKu/B,WACPv/B,EAAKqT,UAAUC,WACbtT,EAAKw/B,YAAYlf,MAChBpS,EAAIjH,EAAIjH,EAAK07B,UAAUz0B,GAAKjH,EAAKqT,UAAU2kB,cACjB,4BAApBh4B,EAAKu/B,YACdv/B,EAAKqT,UAAUC,YAActT,EAAKE,WAAW0/B,yBAC7C5/B,EAAK06B,YAAcgF,WACjB1/B,EAAKk/B,WACLl/B,EAAKE,WAAWy/B,iBAChBh9B,IAE2B,2BAApB3C,EAAKu/B,aACdv/B,EAAKqT,UAAUC,YAActT,EAAKE,WAAW0/B,yBAC7C5/B,EAAK06B,YAAcgF,WACjB1/B,EAAKk/B,WACLl/B,EAAKE,WAAWy/B,iBAChBh9B,QAIN3C,EAAK6/B,eAAiB,WACpBpF,aAAaz6B,EAAK06B,aACdv0B,SAAS25B,iBACX35B,SAAS25B,kBAEXr+B,OAAOg0B,oBAAoB,YAAaz1B,EAAKk/B,YAAY,IAE3Dl/B,EAAK+/B,YAAc,SAAUp9B,OACvBuL,EACFjH,EACAc,EACAi4B,EAAiC,mBAAlBhgC,EAAK+X,SACpBkoB,EAA+B,gBAAlBjgC,EAAK+X,YAEpB9Q,GADAiH,EAAMlO,EAAK45B,YAAYj3B,IACfsE,EAAIjH,EAAK07B,UAAUz0B,EAC3Bc,EAAImG,EAAInG,EAAI/H,EAAK07B,UAAU3zB,GACtB/H,EAAKE,WAAWggC,wBAAyBF,KAGzChgC,EAAKE,WAAWigC,qBAAsBF,MAGtCt9B,EAAEs3B,SAAWt3B,EAAEu3B,SAAWv3B,EAAEg5B,WAAa37B,EAAKia,gBAC3B,mBAAlBja,EAAK+X,UAAkC/X,EAAK67B,wBAC9C77B,EAAKogC,aAAapgC,EAAKw5B,aAAa5jB,OAAOO,OAAO,GAAO,KAI3DnW,EAAKmC,cAAc,aAAc,CAC/Bo4B,YAAa53B,EACb09B,OAAQrgC,EAAKqY,gBACb3S,OAAQ1F,EAAKyQ,YACbsH,SAAU/X,EAAK+X,aAMjBnQ,KAAKqd,IAAIhe,GAAKjH,EAAKE,WAAWogC,iBAC9B14B,KAAKqd,IAAIld,GAAK/H,EAAKE,WAAWogC,kBAC9B,IACAtgC,EAAKia,cAAgBja,EAAKw5B,aACtBx5B,EAAK87B,sBACP97B,EAAKia,cAAgBja,EAAKugC,uBACvB,EACDvgC,EAAKoV,WAAW1N,WAEhB1H,EAAK67B,yBACP77B,EAAKia,cAAgBja,EAAKugC,sBACxBvgC,EAAKoV,WAAWzN,aACf,KAEA3H,EAAKia,cAAe,OACzBja,EAAK6a,cAAgB7a,EAAKyQ,YAC1BzQ,EAAKia,cAAcC,WAAa,CAC9BjT,EAAGA,EACHc,EAAGA,GAEL/H,EAAK+8B,eACHp6B,EACAq9B,EAAe9xB,EAAIjH,GAAK,EACxBg5B,EAAa/xB,EAAInG,GAAK,GACtB,KAIN/H,EAAKwgC,gBAAkB,SAAU79B,OAC3B89B,EACFC,EACAC,EAAQ,GACRC,EAAK,eACY5gC,EAAKoS,OAAOC,sBACTrS,EAAKoS,OAAO0C,SAEhCpR,EAAI,eACa,4BACG,mBAClB1D,EAAK+X,aACTtW,OAAOg0B,oBAAoB,YAAaz1B,EAAK+/B,aAAa,GAC1Dt+B,OAAOg0B,oBAAoB,UAAWz1B,EAAKwgC,iBAAiB,GAE1DxgC,EAAKia,eACLja,EAAK6a,gBACe,mBAAlB7a,EAAK+X,UACL/X,EAAK6a,cAAcG,iBAAmB,GACtChb,EAAK6a,cAAcG,gBAAkBhb,EAAKuO,YAAYzI,QACnC,gBAAlB9F,EAAK+X,UACJ/X,EAAK6a,cAAcnT,UAAY,GAC/B1H,EAAK6a,cAAcnT,SAAW1H,EAAKiQ,SAASnK,SAChD9F,EAAKia,cAAcvW,KAAO1D,EAAK6a,cAAcnX,KAC5C1D,EAAKmC,cAAc,UAAW,CAC7Bo4B,YAAa53B,EACb09B,OAAQrgC,EAAKia,cACbvU,OAAQ1F,EAAK6a,cACb9C,SAAU/X,EAAK+X,WAEjB,IACA/X,EAAK+7B,iBAAkB,EACvB0E,EAASG,EAAG5gC,EAAK+X,UAAU6C,QAAQ5a,EAAKia,cAAcvW,IACtDg9B,EAASE,EAAG5gC,EAAK+X,UAAU6C,QAAQ5a,EAAK6a,cAAcnX,IAChC,mBAAlB1D,EAAK+X,SAA+B,KAClC8oB,EAAoB,GACpBC,EAAwB,GACxB9gC,EAAKua,WAAW,KAClBkmB,EAASzgC,EAAKua,WAAW,GAAG,GAC5Bva,EAAKua,WAAW,GAAG1Z,SAAQ,SAAUomB,GACnC4Z,EAAkBh9B,KAAK7D,EAAKoS,OAAO0C,QAAQmS,YAG3C8Z,EAAcF,EAAkB/6B,UAElC46B,EAASD,GACRC,EAASD,GAAU74B,KAAKqd,IAAIyb,EAASD,IAAWM,EACjD,CACAH,EAAG5gC,EAAK+X,UAAU2U,OAAO+T,EAAQM,GAC7BL,EAASD,IAAQC,GAAmBK,EAAc,GAEtD/gC,EAAK+a,gBAAkB,OACdrX,EAAI,EAAGA,EAAIm9B,EAAkB/6B,OAAQpC,IAClC,IAANA,IAAS1D,EAAKoV,WAAWzN,YAAc+4B,GAC3CI,EAAsBj9B,KAAK68B,EAASh9B,GACpC1D,EAAK+a,gBAAgBlX,KAAKg9B,EAAkBn9B,IAC5Ck9B,EAAG5gC,EAAK+X,UAAU2U,OAAOgU,EAASh9B,EAAG,EAAGm9B,EAAkBn9B,IAG5D1D,EAAKoS,OAAO0C,QAAU8rB,EAAG5gC,EAAK+X,UAC9B/X,EAAKiQ,SAASpP,SAAQ,SAAUie,EAAKpX,GACnC1H,EAAKua,WAAW7S,GAAYo5B,UAG3B,KACDnmB,EAAe,MACnB3a,EAAKua,WAAW1Z,SAAQ,SAAUie,EAAKpX,GACjCoX,IACFnE,EAAa9W,KAAKib,GAClB6hB,EAAM98B,KAAK7D,EAAKiQ,SAASvI,QAI3Bg5B,EAASD,GACRC,EAASD,GAAU74B,KAAKqd,IAAIyb,EAASD,IAAWE,EAAM76B,OACvD,CACA9F,EAAKiQ,SAASyc,OAAO+T,EAAQE,EAAM76B,QACnC9F,EAAKua,WAAa,GAClBva,EAAK2a,aAAe,GAChB+lB,EAASD,IAAQC,GAAmBC,EAAM76B,OAAS,GACvD9F,EAAKoV,WAAW1N,SAAWg5B,MAElBh9B,EAAI,EAAGA,EAAIi9B,EAAM76B,OAAQpC,IAChC1D,EAAKiQ,SAASyc,OAAOgU,EAASh9B,EAAG,EAAGi9B,EAAMj9B,IAC1C1D,EAAKua,WAAWmmB,EAASh9B,GAAKiX,EAAajX,GAC3C1D,EAAK2a,aAAa9W,KAAK68B,EAASh9B,IAItC1D,EAAKqC,SACLrC,EAAKw9B,iBAEPx9B,EAAKia,mBAAgB/S,EACrBlH,EAAK6a,mBAAgB3T,EACrBlH,EAAK6I,MAAK,IAEZ7I,EAAKghC,SAAW,SAAUr+B,OAEtB3C,EAAKmC,cAAc,SAAU,CAAEo4B,YAAa53B,EAAGyE,KAAMpH,EAAKyQ,mBAIxDvC,EAAMlO,EAAK45B,YAAYj3B,GAC3B3C,EAAK+tB,WAAa,CAChB9mB,EAAGjH,EAAKyQ,YAAY9I,YAAc3H,EAAKqY,gBAAgB1Q,YACvDI,EAAG/H,EAAKyQ,YAAY/I,SAAW1H,EAAKqY,gBAAgB3Q,WAGpDE,KAAKqd,IAAI/W,EAAIjH,GAAKjH,EAAKE,WAAWogC,iBAClC14B,KAAKqd,IAAI/W,EAAInG,GAAK/H,EAAKE,WAAWogC,kBAElCZ,YAAW,WACT1/B,EAAK+8B,eAAep6B,EAAGuL,EAAIjH,EAAGiH,EAAInG,GAAG,KACpC,KAGP/H,EAAKihC,aAAe,SAAUt+B,GAC5BlB,OAAOg0B,oBAAoB,YAAaz1B,EAAKghC,UAAU,GACvDv/B,OAAOg0B,oBAAoB,UAAWz1B,EAAKihC,cAAc,OACrDj0B,EAAIhN,EAAK47B,wBAEX57B,EAAKmC,cAAc,UAAW,CAAEo4B,YAAa53B,EAAGyE,KAAMpH,EAAKyQ,qBAE3DzQ,EAAKkb,qBAAkBhU,EACvBlH,EAAK+tB,gBAAa7mB,OAClBlH,EAAK6I,MAAK,GAGR7I,EAAK+tB,aACP/tB,EAAKoJ,OACHpJ,EAAKkb,gBACLlO,EAAEsT,KAAOtgB,EAAK+tB,WAAW9mB,EACzB+F,EAAEoU,IAAMphB,EAAK+tB,WAAWhmB,GAE1B/H,EAAKkhC,cAAclhC,EAAK+tB,WAAW9mB,EAAGjH,EAAK+tB,WAAWhmB,IAExD/H,EAAKkb,qBAAkBhU,EACvBlH,EAAK+tB,gBAAa7mB,EAClBlH,EAAK6I,MAAK,IAEZ7I,EAAKmhC,WAAa,SAAUx+B,OAExB3C,EAAKmC,cAAc,eAAgB,CACjCo4B,YAAa53B,EACbyE,KAAMpH,EAAKyQ,mBAKXvC,EAAMlO,EAAK45B,YAAYj3B,GAE3B3C,EAAK+7B,iBAAkB,EACvB/7B,EAAK8X,qBAAuB5J,EAC5BA,EAAIjH,GAAKjH,EAAK+Q,uBACd7C,EAAInG,GAAK/H,EAAKiR,4BAEZrJ,KAAKqd,IAAI/W,EAAIjH,GAAKjH,EAAKE,WAAWogC,iBAClC14B,KAAKqd,IAAI/W,EAAInG,GAAK/H,EAAKE,WAAWogC,kBAElCZ,YAAW,WACT1/B,EAAK+8B,eAAep6B,EAAGuL,EAAIjH,EAAGiH,EAAInG,GAAG,KACpC,KAGP/H,EAAK05B,eAAiB,SAAU/2B,OAC1BuL,EAAMlO,EAAK45B,YAAYj3B,GACzBy0B,EAAuC,aAAlCp3B,EAAKsC,MAAM6N,mBAAoC,EAAI,EACxDmnB,EAAyBt3B,EAAKsC,MAAM6U,4BAA8BigB,EAClE1mB,EAAyB1Q,EAAK2Q,4BAC9BC,EAAqB5Q,EAAK6Q,2BAC5B3C,EAAIjH,GAAKjH,EAAK+Q,uBACd7C,EAAInG,GAAK/H,EAAKiR,2BAGZjR,EAAKyQ,kBACyBvJ,IAA9BlH,EAAKyQ,YAAY/I,UACC,sBAAlB1H,EAAK+X,SACL,CACA/X,EAAKqT,UAAUc,UAAY,EAC3BnU,EAAKoT,UAAYpT,EAAKyQ,YAAY/I,SAAW,EAC7C1H,EAAKqT,UAAU+kB,IAAI9wB,EAAES,EACnB2I,EACA4mB,EACAt3B,EAAKkd,YAAYnV,EAAE/H,EAAKoT,WAC1BpT,EAAKqT,UAAUglB,IAAI/wB,EAAES,EACnB2I,EACA4mB,EACAt3B,EAAKkd,YAAYnV,EAAE/H,EAAKoT,eACtBmkB,EAAav3B,EAAKkd,YAAYnV,EAAE/H,EAAKkd,YAAYnV,EAAEjC,OAAS,GAChE9F,EAAKqT,UAAU4kB,gBACZj4B,EAAKqT,UAAUnL,OACdwI,EACA1Q,EAAKkd,YAAYnV,EAAE/H,EAAKoT,YAC1BmkB,EACFv3B,EAAKqT,UAAUmK,gBACbxd,EAAKqT,UAAUnL,OAASlI,EAAKqT,UAAU4kB,eACvCj4B,EAAKsC,MAAM8U,eACbpX,EAAKqT,UAAUmK,gBAAkB5V,KAAK0U,IACpCtc,EAAKqT,UAAUmK,gBACfxd,EAAKsC,MAAM41B,qBAEbl4B,EAAKqT,UAAUglB,IAAI/wB,EAAEY,OAASlI,EAAKqT,UAAUmK,mBAG7Cxd,EAAKyQ,kBAC4BvJ,IAAjClH,EAAKyQ,YAAY9I,aACC,yBAAlB3H,EAAK+X,SACL,KACMyf,EAAYx3B,EAAKq2B,sBACvBr2B,EAAKqT,UAAUC,WAAa,MACxBrM,EACFjH,EAAKyQ,YAAYxJ,EACjBjH,EAAKsC,MAAMqR,kBACX3T,EAAKsC,MAAMsR,wBACT1F,EAAIjH,EAAIA,EAAIjH,EAAKyQ,YAAYtI,MAAQ,EACvCnI,EAAKyO,aAAezO,EAAKyQ,YAAY9I,YAAc,EAC5C3H,EAAKyQ,YAAY9I,aAAe,IACvC3H,EAAKyO,aAAezO,EAAKyQ,YAAY9I,aACvC3H,EAAKqT,UAAU+kB,IAAIvrB,EAAE5F,EACnB2J,EAAqB5Q,EAAKkd,YAAYjW,EAAEjH,EAAKyO,cAC/CzO,EAAKqT,UAAU2kB,eACZh4B,EAAKqT,UAAUlL,MAAQnI,EAAKkd,YAAYjW,EAAEjH,EAAKyO,eAChD+oB,EACFx3B,EAAKqT,UAAU+J,eACbpd,EAAKqT,UAAUlL,MAAQnI,EAAKqT,UAAU2kB,cACtCh4B,EAAKsC,MAAM8U,eACbpX,EAAKqT,UAAU+J,eAAiBxV,KAAK0U,IACnCtc,EAAKqT,UAAU+J,eACfpd,EAAKsC,MAAM41B,qBAEbl4B,EAAKqT,UAAUglB,IAAIxrB,EAAE1E,MAAQnI,EAAKqT,UAAU+J,mBAG5CxV,KAAKqd,IAAI/W,EAAIjH,GAAKjH,EAAKE,WAAWogC,iBAClC14B,KAAKqd,IAAI/W,EAAInG,GAAK/H,EAAKE,WAAWogC,kBAElCZ,YAAW,WACT1/B,EAAK+8B,eAAep6B,EAAGuL,EAAIjH,EAAGiH,EAAInG,GAAG,KACpC,GAGLtG,OAAOg0B,oBAAoB,YAAaz1B,EAAKmhC,YAAY,GACzD1/B,OAAOg0B,oBAAoB,UAAWz1B,EAAK05B,gBAAgB,GAC3D15B,EAAK8X,0BAAuB5Q,EAE1BlH,EAAKmC,cAAc,gBAAiB,CAClCo4B,YAAa53B,EACbyE,KAAMpH,EAAKyQ,qBAGbzQ,EAAKoT,UAAYpT,EAAKohC,gBAAgBn6B,EACtCjH,EAAKyO,aAAezO,EAAKohC,gBAAgBr5B,OACzC/H,EAAK6I,MAAK,GAGZ7I,EAAK6I,MAAK,GACV7I,EAAKqC,UAEPrC,EAAKqhC,UAAY,SAAU1+B,EAAG02B,MAC5Br5B,EAAKshC,oBAAsB3+B,EAAE+C,QAE3B1F,EAAKmC,cAAc,YAAa,CAC9Bo4B,YAAa53B,EACbyE,KAAMpH,EAAKyQ,eAKVzQ,EAAK4jB,UAGO,IAAbjhB,EAAE4+B,SAAgBvhC,EAAKu5B,WAGvBS,EAAOr3B,EAAEs3B,SAAWt3B,EAAEu3B,QACxBsH,EAAO,QAAQl+B,KAAKtD,EAAK+X,UACzB0pB,EAAS,yCAAyCn+B,KAAKtD,EAAK+X,UAC5D1V,EAAS,UAAUiB,KAAKtD,EAAK+X,UAC7B2pB,EAAsB,sBAAsBp+B,KAAKtD,EAAK+X,UAClD4pB,EAAoB3hC,EAAKkM,QAAUlM,EAAKkM,OAAO2jB,mBACrD7vB,EAAK07B,UAAYrC,GAAer5B,EAAK45B,YAAYj3B,GACjD3C,EAAKw/B,YAAc,CACjBlf,KAAMtgB,EAAKqT,UAAUC,WACrB8N,IAAKphB,EAAKqT,UAAUc,WAEtBnU,EAAKqY,gBAAkBrY,EAAK2Y,UAAU3Y,EAAK07B,UAAUz0B,EAAGjH,EAAK07B,UAAU3zB,GACvE/H,EAAKk8B,oBAAsBl8B,EAAKqY,gBAAgBgO,SAE7C2T,GACAr3B,EAAEg5B,UACF,yCAAyCr4B,KACxCtD,EAAKqY,gBAAgByF,WAEvB9d,EAAKyQ,aACJzQ,EAAKyQ,YAAYsV,gBACjByb,GACAC,GACAp/B,GACAq/B,GAGoB,eAAjB1hC,EAAK+X,UAA6B/X,EAAK87B,qBACvC97B,EAAKyQ,YAAYxE,SAAWjM,EAAKkM,OAAOmiB,iBAE1CruB,EAAKua,WAAa,GAClBva,EAAK2a,aAAe,GACpB3a,EAAK+a,gBAAkB,KAGvB/a,EAAKqY,gBAAgBqO,YAIqC,IAA5D1mB,EAAKy/B,YAAY7kB,QAAQ5a,EAAKqY,gBAAgByF,WAC7C6jB,SAED3hC,EAAKu/B,WAAav/B,EAAKqY,gBAAgByF,QACvC9d,EAAKo/B,gBAAkBp/B,EAAKqY,gBAAgByF,QAC5C9d,EAAKk/B,WAAWv8B,GAEd3C,EAAKE,WAAWi/B,oBAGT,IAFP,CAAC,wBAAyB,uBAAuBvkB,QAC/C5a,EAAKo/B,mBAGPp/B,EAAKwjB,oBAAsB,CACzBvc,EAAGjH,EAAK07B,UAAUz0B,EAClBc,EAAG/H,EAAK07B,UAAU3zB,GAEpB/H,EAAK4B,OAAOggC,sBAEdngC,OAAOuD,iBAAiB,YAAahF,EAAKk/B,YAAY,GACtDz9B,OAAOuD,iBAAiB,UAAWhF,EAAK6/B,gBAAgB,QACxD7/B,EAAK+7B,iBAAkB,MAGH,SAAlB/7B,EAAK+X,aAqBL2pB,EAAqB,IACvB1hC,EAAK08B,uBAAwB,EAC7B18B,EAAK0b,YAAc,CACjBC,OAAQ,CACN1U,EAAGjH,EAAKqY,gBAAgBpR,EAAIjH,EAAKqY,gBAAgBlQ,MAAQ,EACzDJ,EAAG/H,EAAKqY,gBAAgBtQ,EAAI/H,EAAKqY,gBAAgBnQ,OAAS,GAE5D4T,OAAQ,CAAE7U,GAAI,EAAGc,GAAI,GACrB85B,UAAW7hC,EAAK47B,sBAEd57B,EAAKmC,cAAc,2BAA4B,CAAEo4B,YAAa53B,kBAGlElB,OAAOuD,iBAAiB,YAAahF,EAAK0hC,qBAAqB,GAC/DjgC,OAAOuD,iBAAiB,UAAWhF,EAAK8hC,yBAAyB,GAC1D9hC,EAAK0hC,oBAAoB/+B,MAE9B6+B,EAAM,IACRxhC,EAAKw5B,aAAex5B,EAAKo7B,SACzBp7B,EAAKkb,gBAAkBlb,EAAKua,WAAW2X,OAAO,IAC9ClyB,EAAK+hC,SAAW/hC,EAAKqY,gBAEnBrY,EAAKmC,cAAc,YAAa,CAC9Bo4B,YAAa53B,EACbyE,KAAMpH,EAAKyQ,4BAKfhP,OAAOuD,iBAAiB,YAAahF,EAAKghC,UAAU,GACpDv/B,OAAOuD,iBAAiB,UAAWhF,EAAKihC,cAAc,GAC/CjhC,EAAKo5B,UAAUz2B,MAEpB8+B,EAAQ,IACVzhC,EAAKw5B,aAAex5B,EAAKo7B,SACzBp7B,EAAKohC,gBAAkB,CACrBn6B,EAAGjH,EAAKoT,UACRrL,EAAG/H,EAAKyO,cAENzO,EAAKmC,cAAc,kBAAmB,CAAEo4B,YAAa53B,kBAIzD3C,EAAK8X,qBAAuB9X,EAAK45B,YAAYj3B,GAC7C3C,EAAK8X,qBAAqBc,QAAS,EAEnCnX,OAAOuD,iBAAiB,YAAahF,EAAKmhC,YAAY,GACtD1/B,OAAOuD,iBAAiB,UAAWhF,EAAK05B,gBAAgB,GACjD15B,EAAKo5B,UAAUz2B,UAEpBN,IAAWs/B,GACb3hC,EAAKw5B,aAAex5B,EAAKo7B,SACrBp7B,EAAKw5B,aAAahqB,QACpBxP,EAAKu+B,uBACHv+B,EAAK+W,MAAMoa,MAAMnxB,EAAKw5B,aAAa9xB,UAErC1H,EAAKu+B,uBACHv+B,EAAK+W,MAAM1E,KAAKrS,EAAKw5B,aAAa9xB,WAAa1H,EAAKsC,MAAMkP,WAE9DxR,EAAKs+B,sBACHt+B,EAAK+W,MAAMjC,QAC0B,kBAAnC9U,EAAKw5B,aAAa5jB,OAAOtT,MACrB,aACAtC,EAAKw5B,aAAaxe,kBACnBhb,EAAKw5B,aAAarxB,MACzB1G,OAAOuD,iBAAiB,YAAahF,EAAKq+B,kBAAkB,QAC5D58B,OAAOuD,iBAAiB,UAAWhF,EAAK6+B,gBAAgB,KAGQ,IAA9D,CAAC,cAAe,kBAAkBjkB,QAAQ5a,EAAK+X,WACjD/X,EAAKw5B,aAAex5B,EAAKqY,gBACH,mBAAlBrY,EAAK+X,UAAkC/X,EAAK67B,uBAEnB,gBAAlB77B,EAAK+X,UAA+B/X,EAAK87B,qBAClD97B,EAAKw8B,UAAUx8B,EAAKqY,gBAAgB3Q,SAAUsyB,EAAM,MAFpDh6B,EAAKogC,aAAapgC,EAAKyQ,YAAYmF,OAAOO,MAAO6jB,EAAMr3B,EAAEg5B,UAI3Dl6B,OAAOuD,iBAAiB,YAAahF,EAAK+/B,aAAa,QACvDt+B,OAAOuD,iBAAiB,UAAWhF,EAAKwgC,iBAAiB,cAjGzDxgC,EAAKy7B,WAAY,GAEoB,QAAlCz7B,EAAKE,WAAWmV,gBACuB,IAAtCrV,EAAKqY,gBAAgB1Q,cACvB3H,EAAKqY,gBAAgB3Q,UAAY,EAEjC1H,EAAKw8B,UAAUx8B,EAAKqY,gBAAgB3Q,SAAUsyB,EAAM,WAC/C,IAC8B,WAAlCh6B,EAAKE,WAAWmV,gBACoB,IAAnCrV,EAAKqY,gBAAgB3Q,WACvB1H,EAAKqY,gBAAgB1Q,aAAe,cAEpC3H,EAAKogC,aAAapgC,EAAKyQ,YAAYmF,OAAOO,MAAO6jB,EAAMr3B,EAAEg5B,UAGrB,QAAlC37B,EAAKE,WAAWmV,eAClBrV,EAAKo5B,UAAUz2B,MAqFrB3C,EAAK25B,QAAU,SAAUh3B,GACvB83B,aAAaz6B,EAAK06B,aAClB16B,EAAK86B,qBAAsB,EAC3B96B,EAAK46B,oBAAqB,EAC1B56B,EAAK66B,uBAAwB,EAC7B76B,EAAKy7B,eAAYv0B,EACjBlH,EAAKw5B,kBAAetyB,EACpBlH,EAAKqY,qBAAkBnR,EAErBlH,EAAKmC,cAAc,UAAW,CAAEo4B,YAAa53B,EAAGyE,KAAMpH,EAAKyQ,gBAIxDzQ,EAAK4jB,UAAYjhB,EAAE+C,SAAW1F,EAAK4B,UAGpC5B,EAAKyQ,kBAAyCvJ,IAA1BlH,EAAKyQ,YAAY6Z,MAGrCtqB,EAAKs5B,aAAet5B,EAAKu5B,QAGzBv5B,EAAK07B,WAAa17B,EAAK26B,SAAS36B,EAAK07B,YACvC17B,EAAKgiC,aAAaC,QAEpBt/B,EAAEizB,oBAGJ51B,EAAKkiC,iBAAmB,eAClBj7B,EAEFqH,EAAItO,EAAKuO,YACTmH,EAAI,OACDzO,EAAI,EAAGA,EAAIqH,EAAExI,OAAQmB,GAAK,EAExBqH,EADDtO,EAAKoS,OAAO0C,QAAQ7N,IACd2H,cACQ1H,IAAZwO,EAAEysB,QACJzsB,EAAEysB,MAAQl7B,EACVyO,EAAE4K,KAAOrZ,GAEXyO,EAAE0sB,KAAOn7B,EACLA,EAAIjH,EAAKoV,WAAWzN,kBAA2BT,IAAZwO,EAAE6K,QACvC7K,EAAE6K,MAAQtZ,GAERA,EAAIjH,EAAKoV,WAAWzN,cACtB+N,EAAE4K,KAAOrZ,gBAICC,IAAZwO,EAAE6K,QACJ7K,EAAE6K,MAAQ7K,EAAE0sB,MAEP1sB,GAET1V,EAAKqiC,QAAU,SAAU1/B,OAErBqkB,SACAsb,EAAgBtiC,EAAKkiC,mBACrBj7B,EAAIW,KAAK0U,IAAItc,EAAKoV,WAAWzN,YAAa,GAC1CI,EAAIH,KAAK0U,IAAItc,EAAKoV,WAAW1N,SAAU,GACvCsyB,EAAOr3B,EAAEs3B,SAAWt3B,EAAEu3B,QACtBkI,EAAOpiC,EAAKiQ,SAASnK,OAAS,EAE9By8B,EADIviC,EAAKuO,YACAzI,OAAS,MAEG9F,EAAKmC,cAAc,UAAW,CACnDo4B,YAAa53B,EACbyE,KAAMpH,EAAKyQ,gBAORzQ,EAAKE,WAAWsiC,qBAAwBxiC,EAAK4jB,cAK9C6e,oBAAoB9/B,KAAOq3B,SACtBh6B,EAAK0iC,YAAYz7B,EAAGc,EAAGpF,GAAG,MAG/B3C,EAAKE,WAAWwU,aAClB0tB,GAAQ,GAGI,QAAVz/B,EAAEqhB,KACJrhB,EAAEizB,iBAGU,WAAVjzB,EAAEqhB,IACJhkB,EAAK2iC,aACI3I,GAAkB,MAAVr3B,EAAEqhB,IACnBhkB,EAAK+9B,YACI,CAAC,YAAa,UAAU7X,SAASvjB,EAAEqhB,KAC5ChkB,EAAK4iC,qBACc,cAAVjgC,EAAEqhB,IACXjc,GAAK,EACc,YAAVpF,EAAEqhB,IACXjc,GAAK,EAEM,cAAVpF,EAAEqhB,MAAwBgW,GAC1Br3B,EAAEg5B,UAAsB,QAAVh5B,EAAEqhB,IAEjB/c,EAAIq7B,EAAchiB,KAEP,eAAV3d,EAAEqhB,MAAyBgW,IAC1Br3B,EAAEg5B,UAAsB,QAAVh5B,EAAEqhB,IAElB/c,EAAIq7B,EAAc/hB,MACC,WAAV5d,EAAEqhB,KACXjc,GAAK/H,EAAKs4B,KACV31B,EAAEizB,kBACiB,aAAVjzB,EAAEqhB,KACXjc,GAAK/H,EAAKs4B,KACV31B,EAAEizB,kBACiB,SAAVjzB,EAAEqhB,KAAmBgW,GAAkB,YAAVr3B,EAAEqhB,IACxCjc,EAAI,EACe,QAAVpF,EAAEqhB,KAAkBgW,GAAkB,cAAVr3B,EAAEqhB,IACvCjc,EAAI/H,EAAKiQ,SAASnK,OAAS,EAClBk0B,GAAkB,eAAVr3B,EAAEqhB,IACnB/c,EAAIq7B,EAAcF,KACTpI,GAAkB,cAAVr3B,EAAEqhB,MACnB/c,EAAIq7B,EAAcH,OAGN,UAAVx/B,EAAEqhB,WACJrhB,EAAEizB,iBACK51B,EAAK0iC,YAAYz7B,EAAGc,EAAGpF,IAE5BsE,EAAI,GAAK47B,OAAO1/B,MAAM8D,MACxBA,EAAIq7B,EAAcH,OAEhBp6B,EAAIq6B,IACNr6B,EAAIq6B,IAEFr6B,EAAI,GAAK86B,OAAO1/B,MAAM4E,MACxBA,EAAI,GAEFd,EAAIs7B,IACNt7B,EAAIq7B,EAAcF,UAKhBU,EAAa,CACf,YACA,UACA,aACA,aACA5c,SAASvjB,EAAEqhB,QAGTrhB,EAAEg5B,UAAYmH,EAAY,KACtBC,EAAwB/iC,EAAKua,WAAW1L,UAAU,SAACxI,mCAASA,eAC5D28B,EAAmBhjC,EAAKua,WAAWwoB,GACnCE,EAA2BD,EAAiB,GAC5CE,EAAqBF,EAAiBA,EAAiBl9B,OAAS,GAChEq9B,EAAe,IAANp7B,EACTq7B,EAAYr7B,IAAMq6B,EAClBiB,EAAgB,IAANp8B,EACVq8B,EAAWr8B,IAAMs7B,EAET,YAAV5/B,EAAEqhB,MACAjc,EAAI,EAAIg7B,IAA0BI,EACpCnjC,EAAKua,WAAWqH,MACP7Z,EAAIg7B,GACb/iC,EAAKua,WAAWxS,GAAK/H,EAAKua,WAAWxS,IAAM,GAC3C/H,EAAKua,WAAWxS,GAAGlE,KAAKoD,IACfk8B,GAAuC,IAA7BnjC,EAAKoV,WAAW1N,UACnC1H,EAAKua,WAAWqH,OAIN,cAAVjf,EAAEqhB,MACAjc,EAAIg7B,GAAyBh7B,IAAM/H,EAAKua,WAAWzU,QACrD9F,EAAKua,WAAWxS,GAAK/H,EAAKua,WAAWxS,IAAM,GAC3C/H,EAAKua,WAAWxS,GAAGlE,KAAKoD,KACfc,GAAKg7B,IAA0BK,GAE/BA,GAAapjC,EAAKoV,WAAW1N,WAAa06B,WAD5CpiC,EAAKua,WAAWxS,EAAI,uCAMP/H,EAAKua,2CAAY,KAA9BsnB,UACK,eAAVl/B,EAAEqhB,KAAwB6d,IACxB56B,EAAIi8B,EACNrB,EAAUh+B,KAAKoD,IACNA,GAAKi8B,IAAuBI,GAE5BA,GAAYtjC,EAAKoV,WAAWzN,cAAgB46B,IADrDV,EAAU9uB,SAMA,cAAVpQ,EAAEqhB,KAAuB6d,IACvB56B,EAAIg8B,EACNpB,EAAUvpB,QAAQrR,IACTA,GAAKg8B,IAA6BI,GAElCA,GAA2C,IAAhCrjC,EAAKoV,WAAWzN,cADpCk6B,EAAUjgB,sCAOhB5hB,EAAKu8B,gBAAkBv8B,EAAK47B,qBAC5B57B,EAAKy8B,gBAAWv1B,EAAW8yB,GAE3Bh6B,EAAK6I,MAAK,GAGR5B,IAAMjH,EAAKoV,WAAWzN,aAAeI,IAAM/H,EAAKoV,WAAW1N,WAC7D1H,EAAKujC,eACHt8B,IAAMjH,EAAKoV,WAAWzN,YAAcV,OAAIC,EACxCa,IAAM/H,EAAKoV,WAAW1N,UAAam7B,OAAO1/B,MAAM4E,QAASb,EAAJa,GAGvD/H,EAAK89B,cAAc72B,EAAGc,IACjBpF,EAAEg5B,UAAY37B,EAAKE,WAAWsjC,6BAC5BxJ,IACHh6B,EAAKua,WAAa,GAClBva,EAAK2a,aAAe,GACpB3a,EAAK+a,gBAAkB,IAEzB/a,EAAKua,WAAWxS,GAAK/H,EAAKua,WAAWxS,IAAM,GAC3C/H,EAAKua,WAAWxS,GAAGlE,KAAKoD,GACxB+f,EAAK,CACH+N,aAAc/0B,EAAKo8B,kBACnB7hB,WAAYva,EAAKua,WACjBgiB,gBAAiBv8B,EAAK47B,qBACtBS,cAAer8B,EAAKs8B,oBAEtB5zB,OAAO8oB,eAAexK,EAAI,eAAgB,CACxC0K,IAAK,kBACI1xB,EAAKo8B,qBAGhBp8B,EAAKmC,cAAc,mBAAoB6kB,IAEzChnB,EAAK6I,MAAK,MAGd7I,EAAKyjC,MAAQ,SAAU9gC,GAEnB3C,EAAKmC,cAAc,QAAS,CAAEo4B,YAAa53B,EAAGyE,KAAMpH,EAAKyQ,eAItDzQ,EAAK4jB,UAIZ5jB,EAAK0jC,SAAW,SAAU/gC,GACnB3C,EAAK4jB,UAIR5jB,EAAKmC,cAAc,WAAY,CAAEo4B,YAAa53B,EAAGyE,KAAMpH,EAAKyQ,eAKhEzQ,EAAK2jC,SAAW,SAAUhhC,GAEtB3C,EAAKmC,cAAc,WAAY,CAAEo4B,YAAa53B,EAAGyE,KAAMpH,EAAKyQ,eAIzDzQ,EAAK4jB,WAIqB,cAA7B5jB,EAAKyQ,YAAYqN,SACU,qBAA3B9d,EAAKyQ,YAAYnO,MAGatC,EAAKg/B,iBACjCh/B,EAAKyQ,YAAY9I,aAKjB3H,EAAKi/B,qBAELj/B,EAAK4jC,kBAAkB5jC,EAAKyQ,YAAYmF,OAAO1Q,MAGpB,cAA7BlF,EAAKyQ,YAAYqN,SACU,eAA3B9d,EAAKyQ,YAAYnO,MAEjBtC,EAAK6jC,YAEL,CAAC,OAAQ,cAAc3d,SAASlmB,EAAKyQ,YAAYnO,QAChDtC,EAAKkM,OAAOmiB,gBACZruB,EAAKkM,OAAOC,iBAETnM,EAAKyQ,YAAY+X,WAAaxoB,EAAKyQ,YAAYiY,cACjD1oB,EAAK8jC,uBACH9jC,EAAKyQ,YAAY/I,SACjB1H,EAAKyQ,YAAY9I,aAEnB3H,EAAK6I,QAEL7I,EAAK0iC,YACH1iC,EAAKyQ,YAAY9I,YACjB3H,EAAKyQ,YAAY/I,aAKzB1H,EAAK+jC,YAAc,SAAUphC,OACvByL,EACFD,EACA6Y,EAAKrkB,EACLqhC,OAAsB98B,IAAbvE,EAAEqhC,OAAuBrhC,EAAE43B,YAAYyJ,OAASrhC,EAAEqhC,OAC3DC,OAAsB/8B,IAAbvE,EAAEshC,OAAuBthC,EAAE43B,YAAY0J,OAASthC,EAAEshC,OAC3DC,OACkBh9B,IAAhBvE,EAAEuhC,UAA0BvhC,EAAE43B,YAAY2J,UAAYvhC,EAAEuhC,UACxDvhC,EAAIA,EAAE43B,aAAe53B,EACrB0yB,EACFrO,EAAG4O,eAAejzB,GAGhB3C,EAAKmC,cAAc,QAAS,CAAEo4B,YAAa53B,MAG/C3C,EAAKmkC,oBAAqB,EAC1B/1B,EAAIpO,EAAKqT,UAAUC,WACnBnF,EAAInO,EAAKqT,UAAUc,UACfnU,EAAK4jB,WAGW,IAAdsgB,IAEFD,GAAkB,KAGjBjkC,EAAKqT,UAAUc,UAAYnU,EAAKqT,UAAUoK,cACzCwmB,EAAS,GACVjkC,EAAKqT,UAAUC,WAAatT,EAAKqT,UAAUgK,aAC1C2mB,EAAS,GACVhkC,EAAKqT,UAAUc,UAAY,GAAK8vB,EAAS,GACzCjkC,EAAKqT,UAAUC,WAAa,GAAK0wB,EAAS,IAE3Chd,EAAG4O,eAAejzB,GAEpB0yB,EAAWqK,YAAW,WACpBrK,OAAWnuB,EACXlH,EAAKqT,UAAU+wB,SAASJ,EAAS51B,EAAG61B,EAAS91B,KAC5C,MAGPnO,EAAKqkC,UAAY,SACf9Q,EACAqB,EACA0P,EACAC,cACAC,yDAAgB,EAChBC,yDAAmB,KAEF,cAAb7P,IAA6BtB,gBAAgBC,UAC/CrI,QAAQC,KACN,4GAEFD,QAAQC,KACN,0FAMJnrB,EAAK2a,aAAe,GACpB3a,EAAK+a,gBAAkB,OAEjB1I,EAAOsiB,UAAUpB,EAAYqB,GAC7B8P,EAAgBryB,EAAK,GAAGvM,UAKZ,IAAhBuM,EAAKvM,QACa,IAAlB4+B,GACAF,GAAiB,GACjBC,GAAoB,EACpB,KACIE,EAAWtyB,EAAK,GAAG,GAAG4U,MAAMrV,IAAI,SAAC9M,iCAASA,EAAKmiB,mBAAOiO,OAE1Dl1B,EAAK4kC,qBAAoB,SAAUriC,EAAMmF,EAAUm9B,GACjDtiC,EAAKmF,GAAUm9B,GAAWF,SAEvB,KACDvoB,EAAY,KAEZooB,EAAgBnyB,EAAKvM,QAAU2+B,EAAmBC,EACpDtoB,EAAY,OACHooB,EAAgBnyB,EAAKvM,OAC9BsW,EAAY,WACHqoB,EAAmBC,IAC5BtoB,EAAY,cAGdpc,EAAK8kC,OAAO,CACVzyB,KAAMA,EACNiyB,cAAeA,EACfS,iBAAkBR,EAClBC,cAAeA,EACfC,iBAAkBA,EAClBO,aAAa,EACbC,gBAAgB,EAChBC,iBAAiB,EACjBC,eAAe,EACf/oB,UAAWA,QAKXgpB,EAAgB,UAEpBplC,EAAKua,WAAW1Z,SAAQ,SAAUie,EAAKpX,QACpBR,IAAbQ,GAEJoX,EAAIje,SAAQ,SAAU8G,GACpBy9B,EAAcvhC,KAAK,CACjB6D,EACAC,EACA3H,EAAKwW,iCAAiC9O,GACtC1H,EAAKqoB,uCAAuC1gB,WAKlD3H,EAAKmC,cAAc,aAAc,CAC/BkjC,MAAOD,IAGF/yB,EAAKvM,QAEd9F,EAAK8kC,OAAS,+BACZzyB,KAAAA,aAAO,SACPiyB,cAAAA,aAAgB,QAChBS,iBAAAA,aAAmB,QACnBP,cAAAA,aAAgB,QAChBC,iBAAAA,aAAmB,QACnBO,YAAAA,oBACAC,eAAAA,oBACAC,gBAAAA,oBACAC,cAAAA,oBACA/oB,UAAAA,aAAY,SAERvZ,EAAS7C,EAAKuO,YACZ+2B,EAAa19B,KAAK0U,IAAIjK,EAAKvM,OAAQ0+B,GACnCe,EAAmBvlC,EAAKulC,iBACxBhrB,EAAa2qB,EAAkB,GAAKllC,EAAKua,WACzCirB,EAAc,GAGdC,EAAa,EAAGC,EAAa,EACjCD,EAAaH,EACbG,IAAcC,IACd,CACIA,GAAcrzB,EAAKvM,SACrB4/B,EAAa,OAGTC,EAAaF,GAAcpzB,EAAKvM,OAChC8/B,EAAcZ,EAChBM,EAAaG,EAAa,EAC1BA,EAGAI,EAAe7lC,EAAKoS,OAAOC,KAAKiyB,EAAgBsB,GAChDP,EAAQhzB,EAAKqzB,GACXI,EAAcl+B,KAAK0U,IAAI+oB,EAAMv/B,OAAQ2+B,GAEvCsB,EAAkB/lC,EAAKiQ,SAAS41B,GAChCG,EAAat9B,OAAOuW,OAAO,GAAI8mB,GAC7BE,EAAWV,EACb,CACElzB,KAAMA,EACN+J,UAAWA,EACXzM,QAASq2B,EACTD,gBAAiBA,EACjBr+B,SAAUm+B,EACVK,UAAWR,EACXL,MAAOA,EACPc,SAAwB,eAAd/pB,EAA6B6oB,EAAiBD,EACxDoB,aAAcT,GAAcR,EAC5BkB,mBAAoBlB,EAChBM,EACAE,EACAF,EAAapzB,EAAKvM,QACjB,EACLwgC,iBAAkBnB,EACdG,EACAK,EACAL,EAAajzB,EAAKvM,QACjB,QAEPoB,EAEJlH,EAAK2a,aAAa9W,KAAKgiC,QAEU3+B,IAA7BqT,EAAWsrB,KACbtrB,EAAWsrB,GAAgB,QAI3B,IAAIU,EAAa,EAAGC,EAAc,EAClCD,EAAaT,EACbS,IAAcC,IACd,CACIA,GAAenB,EAAMv/B,SACvB0gC,EAAc,OAGVC,EAAgBF,GAAclB,EAAMv/B,OAIpC6B,EAAco9B,GAHAE,EAChBa,EAAcS,EAAa,EAC3BA,GAEA9P,EAAS5zB,EAAO8E,MAEf8uB,OAKDiQ,EAAajQ,EAAOvxB,KACpBy/B,EAAWU,EAAMmB,GACjB7B,GAAYA,EAAS1d,QACvB0d,EAAWA,EAAS1d,MAAMrV,IAAI,SAAC9M,iCAASA,EAAKmiB,mBAAOiO,KAAK,SAGrDyR,EAAmBZ,EAAgBW,GAMvCV,EAAWU,GAHXnB,IACCkB,GAAiBd,GAAcR,GAEPI,mCACpBU,OACHxP,OAAQA,EACR9uB,YAAaA,EACbi/B,aAAcJ,EACdK,YAAalC,EACbgC,iBAAkBA,EAClBG,gBAAiBL,GAAiBtB,EAClC4B,sBAAuB5B,EACnBoB,EACAE,EACAF,EAAalB,EAAMv/B,QAClB,EACLkhC,oBAAqB7B,EACjBW,EACAW,EACAX,EAAcT,EAAMv/B,QACnB,KAIL6+B,MAAAA,EACIgC,EACAhC,EAGRpqB,EAAWsrB,GAAchiC,KAAK8D,IAE1Bw9B,GAAiBQ,GAAcc,IACjCjB,EAAY3hC,KAAK,CACfgiC,EACAl+B,EACA3H,EAAKwW,iCAAiCqvB,GACtC7lC,EAAKqoB,uCAAuC1gB,MAIG,IAA/C3H,EAAK+a,gBAAgBH,QAAQjT,IAC/B3H,EAAK+a,gBAAgBlX,KAAK8D,QAtD1BujB,QAAQC,KAAK,8CAyDjBnrB,EAAKyW,aAAazW,EAAKinC,iBAAiBvV,IAAImU,IAAiBG,EAK7DhmC,EAAKiQ,SAAS41B,GAAgBG,EAGhChmC,EAAKua,WAAaA,GAEdirB,EAAY1/B,OAAS,GAAKq/B,IAC5BnlC,EAAKmC,cAAc,YAAa,CAC9BqjC,YAAaA,KAInBxlC,EAAKknC,0BAA4B,SAAUC,OACrClgC,EACFqH,EAAItO,EAAKonC,uBACNngC,EAAI,EAAGA,EAAIqH,EAAExI,OAAQmB,GAAK,KACzBqH,EAAErH,GAAGU,cAAgBw/B,SAChB74B,EAAErH,EAAI,GAAGU,mBAGZ,GAEV3H,EAAKqnC,wBAA0B,SAAU1/B,OACnCV,EACFqH,EAAItO,EAAKonC,uBACNngC,EAAI,EAAGA,EAAIqH,EAAExI,OAAQmB,GAAK,KACzBqH,EAAErH,GAAGU,cAAgBA,SAChBV,SAGH,GAEVjH,EAAKsnC,kBAAoB,eAErB,IAAI5/B,EAAW,EAAG6/B,EAAMvnC,EAAKua,WAAWzU,OACxC4B,EAAW6/B,EACX7/B,IACA,KACMoX,EAAM9e,EAAKua,WAAW7S,MACxBoX,EAAK,SACQ5X,IAAX4X,EAAI,GAAkB,YAEnB,CACLA,IAAKpX,EACL+uB,OAAQ3X,EAAI,GAAK,EAAIA,EAAI,GAAKA,EAAI,GAClC0oB,UAAWD,EAAM7/B,EACjB+/B,aAAc3oB,EAAIhZ,QAAUgZ,EAAI,GAAK,EAAI,EAAI,YAK5C,MAET9e,EAAK0nC,MAAQ,SAAUvL,iBAChBn8B,EAAKE,WAAWgZ,WAIElZ,EAAKmC,cAAc,cAAe,CACvDo4B,YAAa4B,SAOXwL,EAAiB,IAAIC,IACvBjnC,MAAMoO,KAAKotB,EAAM0L,cAAcC,OAAOl2B,IAAI,SAAC9M,iCAAS,CAACA,EAAKiB,KAAMjB,iBAI9DijC,EAAqB,CAAC,YAAa,WAAY,cAM/CC,EAAiBD,EAClBn2B,IAAI,SAACgjB,iCAAa+S,EAAejW,IAAIkD,gBACrC7vB,OAAO,SAACD,mCAAWA,kBAEQ,IAA1BkjC,EAAeliC,YAQbmiC,EAAiBjoC,EAAKsnC,uBACvBW,OAEDC,EAAcF,EAAe,GAI7BG,EAAYD,EAAYniC,KAE5BmiC,EAAYE,aAAY,SAAU7U,GAChCvzB,EAAKqkC,UACH9Q,EACA4U,EACAF,EAAenpB,IACfmpB,EAAexR,OACfwR,EAAeT,UACfS,EAAeR,cAGjBznC,EAAK6I,gBA1BLqiB,QAAQC,KACN,kEACA4c,EAAmB7S,KAAK,SA2B9Bl1B,EAAKqoC,IAAM,SAAUlM,kBACfn8B,EAAKmC,cAAc,MAAO,CAAEo4B,YAAa4B,KAKxCn8B,EAAK4jB,UAAauY,EAAM0L,eAI7B7nC,EAAKsoC,6BAA6BnM,EAAM0L,mBAElCzC,EAAgBplC,EAAKuoC,qBAE3BvoC,EAAKmC,cAAc,WAAY,CAC7BkjC,MAAOD,IAGThjC,sBAAsB,yCAAMpC,EAAK6I,oBACjCszB,EAAMvG,mBAER51B,EAAKwoC,KAAO,SAAUrM,GAChBn8B,EAAKmC,cAAc,OAAQ,CAAEo4B,YAAa4B,KAKzCn8B,EAAK4jB,UAAauY,EAAM0L,gBAI7B7nC,EAAKsoC,6BAA6BnM,EAAM0L,eAExC1L,EAAMvG,mBAER51B,EAAK0hC,oBAAsB,SAAU/+B,MAC9B3C,EAAK08B,2BAIJ+L,EAAezoC,EAAK0oC,gBAAgB/lC,GACpC+E,EAAW1H,EAAKyQ,YAAY/I,SAC5BC,EAAc3H,EAAKyQ,YAAY9I,YAC/BghC,EACJjhC,IAAa,GACbC,IAAgB,GAChB3H,EAAK0b,YAAYmmB,UAAUvhB,MAAQ3Y,GACnC3H,EAAK0b,YAAYmmB,UAAUthB,OAAS5Y,GACpC3H,EAAK0b,YAAYmmB,UAAUzgB,KAAO1Z,GAClC1H,EAAK0b,YAAYmmB,UAAUxgB,QAAU3Z,KAEvC1H,EAAK0b,YAAYa,KAAOksB,EAAaxhC,EACrCjH,EAAK0b,YAAYc,KAAOisB,EAAa1gC,EACrC/H,EAAK0b,YAAYzU,EAAIW,KAAK0U,IAAImsB,EAAaxhC,EAAGtE,EAAEimC,SAChD5oC,EAAK0b,YAAY3T,EAAIH,KAAK0U,IAAImsB,EAAa1gC,EAAGpF,EAAEkmC,SAG5CF,EACF3oC,EAAK0b,YAAYotB,qBAAuB,CACtC7hC,EAAGtE,EAAEimC,QACL7gC,EAAGpF,EAAEkmC,cAEF,GACL7oC,EAAK0b,YAAYotB,uBAChB9oC,EAAK0b,YAAYU,UAClB,KACM0sB,EAAuB9oC,EAAK0b,YAAYotB,qBAC9C9oC,EAAK0b,YAAYotB,0BAAuB5hC,MAElCD,EAAI6hC,EACNA,EAAqB7hC,EACrBjH,EAAK0b,YAAYC,OAAO1U,EACtBc,EAAI+gC,EACNA,EAAqB/gC,EACrB/H,EAAK0b,YAAYC,OAAO5T,EACtBghC,EAAKnhC,KAAKqd,IAAItiB,EAAEimC,QAAU3hC,GAC1B+hC,EAAKphC,KAAKqd,IAAItiB,EAAEkmC,QAAU9gC,IAE5BghC,EAAK,GAAKC,EAAK,KACjBhpC,EAAK0b,YAAYU,UAAY2sB,EAAKC,EAAK,IAAM,KAI7CthC,GAAY,IACd1H,EAAK0b,YAAYhU,SAAWA,GAE1BC,GAAe,IACjB3H,EAAK0b,YAAY/T,YAAcA,GACb,IAAdD,GAAmB1H,EAAKwS,YAAY1M,SACtC9F,EAAK0b,YAAYhU,SAAW1H,EAAKwS,YAAY,KAK/CxS,EAAK0b,YAAYQ,KADfxU,IAAa,GAAKC,IAAgB,EACZ3H,EAAKyQ,iBAELvJ,IAG5BlH,EAAK8hC,wBAA0B,SAAUn/B,OAClC3C,EAAK0b,YAAYC,cACb,EAGT3b,EAAK+7B,iBAAkB,EAEvBt6B,OAAOg0B,oBAAoB,YAAaz1B,EAAK0hC,qBAAqB,GAClEjgC,OAAOg0B,oBAAoB,UAAWz1B,EAAK8hC,yBAAyB,OAE9D/lB,EAAU/b,EAAK0b,YACfusB,EAAiBjoC,EAAKsnC,oBACtB2B,EAASltB,EAAQ8lB,aAClBoG,MAELjoC,EAAK08B,2BAAwBx1B,EAC7BlH,EAAK0b,YAAc,GAEfK,EAAQrU,UAAY,GAAKqU,EAAQpU,aAAe,EAAG,KAKjDuhC,EACF1B,EACA2B,EACA1B,EAPI2B,oBAAiBH,GACjBI,EAAmC,MAAtBttB,EAAQK,UACrBktB,EAAqC,MAAtBvtB,EAAQK,UAM3BmtB,GAAoB,EACpBC,GAAsB,KAEpBH,GACEttB,EAAQrU,SAAWuhC,EAAO7nB,KAC5B6nB,EAAO7nB,IAAMrF,EAAQrU,SACrB6hC,GAAoB,GACXxtB,EAAQrU,SAAWuhC,EAAO5nB,SACnC4nB,EAAO5nB,OAAStF,EAAQrU,UAG1BwhC,EACED,EAAO7nB,IAAMgoB,EAAUhoB,IAAM6nB,EAAO7nB,IAAMgoB,EAAU/nB,OAAS,EAC/DmmB,EACEyB,EAAO7nB,IAAMgoB,EAAUhoB,IACnBgoB,EAAUhoB,IAAM6nB,EAAO7nB,IACvB6nB,EAAO5nB,OAAS+nB,EAAU/nB,OAChC8nB,EAAclB,EAAexR,OAC7BgR,EAAeQ,EAAeR,cACrB6B,IACLvtB,EAAQpU,YAAcshC,EAAO3oB,MAC/B2oB,EAAO3oB,KAAOvE,EAAQpU,YACtB6hC,GAAsB,GACbztB,EAAQpU,YAAcshC,EAAO1oB,QACtC0oB,EAAO1oB,MAAQxE,EAAQpU,aAGzBwhC,EACEF,EAAO3oB,KAAO8oB,EAAU9oB,KAAO2oB,EAAO3oB,KAAO8oB,EAAU7oB,MAAQ,EACjEknB,EACEwB,EAAO3oB,KAAO8oB,EAAU9oB,KACpB8oB,EAAU9oB,KAAO2oB,EAAO3oB,KACxB2oB,EAAO1oB,MAAQ6oB,EAAU7oB,MAC/B2oB,EAAWjB,EAAenpB,IAC1B0oB,EAAYS,EAAeT,WAI3ByB,EAAO3oB,MAAQ2oB,EAAO1oB,OACtB0oB,EAAO7nB,KAAO6nB,EAAO5nB,SACpB4nB,EAAO3oB,KAAO8oB,EAAU9oB,MACvB2oB,EAAO7nB,IAAMgoB,EAAUhoB,KACvB6nB,EAAO1oB,MAAQ6oB,EAAU7oB,OACzB0oB,EAAO5nB,OAAS+nB,EAAU/nB,QAC5B,SACMxe,EAAS7C,EAAKuO,YACd8D,EAAO,GAGP3K,EAAW,EACfA,EAAWE,KAAK4G,IAAIg5B,EAAWS,EAAeT,WAC9C9/B,IACA,KACMiI,EAAU3P,EAAKiQ,SAASg4B,EAAenpB,IAAMpX,GAEnD2K,EAAK3K,GAAY,OAGf,IAAIC,EAAc,EAClBA,EAAcC,KAAK4G,IAAIi5B,EAAcQ,EAAeR,cACpD9/B,IACA,KACM8uB,EAAS5zB,EAAOolC,EAAexR,OAAS9uB,MACzC8uB,OAECkO,EAAWh1B,EAAQ8mB,EAAOvxB,MAEhCmN,EAAK3K,GAAUC,GAAeg9B,IAIlC3kC,EAAK8kC,OAAO,CACVzyB,KAAMA,EACNiyB,cAAe4E,EACfnE,iBAAkBoE,EAClB3E,cAAegD,EACf/C,iBAAkBgD,EAClBzC,YAAauE,EACbtE,eAAgBuE,EAChBtE,iBAAiB,EACjBC,eAAe,EACf/oB,UAAWktB,EAAe,aAAe,aAG3CtpC,EAAK6I,eAIF,IC7+EI,eAAU7I,OAGrBypC,EACAC,EACF1pC,EAAKgjB,gBAAkB,GACvBhjB,EAAK8iB,WAAa,GAClB9iB,EAAK+iB,eAAiB,GACtB/iB,EAAK2pC,gBAAkB,EACvB3pC,EAAK4pC,YAAc,SAAUjnC,EAAGknC,OAG5B37B,EAFEC,EAAI07B,EAAalnC,EAAE6f,QAAQqnB,GAAclnC,EAAE6f,QAAQ,GACrDjW,EAAOvM,EAAK4B,OAAOkoC,2BAEhB37B,SAGLD,EAAM,CACJjH,EAAGkH,EAAEy6B,QAAUr8B,EAAK+T,KACpBvY,EAAGoG,EAAE06B,QAAUt8B,EAAK6U,KAElBphB,EAAKmP,cACPjB,EAAIjH,GAAKjH,EAAK8H,iBACdoG,EAAInG,GAAK/H,EAAKgI,iBAET,CACLf,EAAGiH,EAAIjH,EACPc,EAAGmG,EAAInG,EACPwE,KAAMA,IAIVvM,EAAK+pC,gBAAkB,CACrBC,OAAQ,SAAU77B,UACTA,GAET87B,WAAY,SAAU97B,UACbA,EAAIA,GAEb+7B,YAAa,SAAU/7B,UACdA,GAAK,EAAIA,IAElBg8B,cAAe,SAAUh8B,UAChBA,EAAI,GAAM,EAAIA,EAAIA,GAAU,EAAI,EAAIA,GAAKA,EAAlB,GAEhCi8B,YAAa,SAAUj8B,UACdA,EAAIA,EAAIA,GAEjBk8B,aAAc,SAAUl8B,WACbA,EAAIA,EAAIA,EAAI,GAEvBm8B,eAAgB,SAAUn8B,UACjBA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,GAAKA,EAAI,IAAM,EAAIA,EAAI,IAAM,EAAIA,EAAI,GAAK,GAEzEo8B,YAAa,SAAUp8B,UACdA,EAAIA,EAAIA,EAAIA,GAErBq8B,aAAc,SAAUr8B,UACf,KAAMA,EAAIA,EAAIA,EAAIA,GAE3Bs8B,eAAgB,SAAUt8B,UACjBA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,IAAMA,EAAIA,EAAIA,EAAIA,GAE7Du8B,YAAa,SAAUv8B,UACdA,EAAIA,EAAIA,EAAIA,EAAIA,GAEzBw8B,aAAc,SAAUx8B,UACf,IAAMA,EAAIA,EAAIA,EAAIA,EAAIA,GAE/By8B,eAAgB,SAAUz8B,UACjBA,EAAI,GAAM,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,KAAOA,EAAIA,EAAIA,EAAIA,EAAIA,IAGzEnO,EAAK6qC,OAAS,SAAU18B,EAAGnB,EAAGiB,EAAG+B,UAE7B/B,EAAIjO,EAAK+pC,gBAAgB/pC,EAAKE,WAAW4qC,mBAAmB38B,EAAI6B,GAAKhD,GAGzEhN,EAAK+qC,kBAAoB,WACvB/qC,EAAKqjB,QACFrjB,EAAK8iB,WAAW7b,EAAIjH,EAAKgrC,gBAAgB/jC,IACzCjH,EAAK8iB,WAAW3U,EAAInO,EAAKgrC,gBAAgB78B,GAE5CnO,EAAKsjB,QACFtjB,EAAK8iB,WAAW/a,EAAI/H,EAAKgrC,gBAAgBjjC,IACzC/H,EAAK8iB,WAAW3U,EAAInO,EAAKgrC,gBAAgB78B,GAE5CnO,EAAKgrC,gBAAkB,CACrB/jC,EAAGjH,EAAK8iB,WAAW7b,EACnBc,EAAG/H,EAAK8iB,WAAW/a,EACnBoG,EAAG8D,YAAYC,QAGnBlS,EAAKirC,aAAe,WAClBjrC,EAAKkjB,OACFljB,EAAK8iB,WAAW7b,EAAIjH,EAAKkrC,WAAWjkC,IACpCjH,EAAK8iB,WAAW3U,EAAInO,EAAKkrC,WAAW/8B,GAEvCnO,EAAKmjB,OACFnjB,EAAK8iB,WAAW/a,EAAI/H,EAAKkrC,WAAWnjC,IACpC/H,EAAK8iB,WAAW3U,EAAInO,EAAKkrC,WAAW/8B,GAEvCnO,EAAKkrC,WAAa,CAChBjkC,EAAGjH,EAAK8iB,WAAW7b,EACnBc,EAAG/H,EAAK8iB,WAAW/a,EACnBoG,EAAG8D,YAAYC,QAGnBlS,EAAKmrC,kBAAoB,eAClBnrC,EAAK4B,SAAW5B,EAAKqT,UAAU+wB,gBAC3BhiC,sBAAsBpC,EAAKmrC,uBAIlCh9B,EAFElL,EAAIgP,YAAYC,MAClBlC,EAAIhQ,EAAKE,WAAWkrC,gCAEtBj9B,EAAIlL,EAAIjD,EAAK8iB,WAAW3U,EACxBnO,EAAK2pC,iBAAmB,EACxB3pC,EAAKgjB,gBAAgB/b,EAAIjH,EAAK6qC,OAC5B18B,EACAnO,EAAK8iB,WAAWxP,WAChBtT,EAAK+iB,eAAe9b,EACpB+I,GAEFhQ,EAAKgjB,gBAAgBjb,EAAI/H,EAAK6qC,OAC5B18B,EACAnO,EAAK8iB,WAAW3O,UAChBnU,EAAK+iB,eAAehb,EACpBiI,GAGA7B,EAAI6B,GACHhQ,EAAKgjB,gBAAgBjb,IAAM/H,EAAKqT,UAAUc,WACzCnU,EAAKgjB,gBAAgB/b,IAAMjH,EAAKqT,UAAUC,YAC5CtT,EAAKqrC,gBAIPrrC,EAAKqT,UAAU+wB,SAASpkC,EAAKgjB,gBAAgB/b,EAAGjH,EAAKgjB,gBAAgBjb,GACrE3F,sBAAsBpC,EAAKmrC,qBAE7BnrC,EAAKsrC,cAAgB,SAAUlkC,GAC7BpH,EAAK0iC,YAAYt7B,EAAKO,YAAaP,EAAKM,WAE1C1H,EAAKurC,WAAa,SAAU5oC,MACtBA,EAAE6oC,eAAe,KACnBxrC,EAAK2jB,WAAa3jB,EAAK4pC,YAAYjnC,GACnC3C,EAAKyrC,aAAezrC,EAAK2Y,UACvB3Y,EAAK2jB,WAAW1c,EAChBjH,EAAK2jB,WAAW5b,GAChB,KAIF/H,EAAKmC,cAAc,aAAc,CAC/Bo4B,YAAa53B,EACbyE,KAAMpH,EAAKyrC,mBAKfzrC,EAAK0rC,qBACLC,cAAc3rC,EAAK4rC,mBACnBnR,aAAaz6B,EAAK6rC,qBAClB7rC,EAAK8rC,gBAAkBnpC,EACvB3C,EAAKqrC,eAAgB,EACrBrrC,EAAK2pC,gBAAkB,EACvB3pC,EAAKs1B,gBAAgB3yB,GACI,IAArBA,EAAE6f,QAAQ1c,QAAgBnD,EAAE6oC,eAAe,KAAOxrC,EAAK+rC,YAAa,IACtE/rC,EAAKuiB,YAAc,EACnBviB,EAAK2jB,WAAa3jB,EAAK2jB,YAAc3jB,EAAKgsC,YAC1ChsC,EAAKisC,iBAAmB,CACtBhlC,EAAGjH,EAAKqT,UAAUC,WAClBvL,EAAG/H,EAAKqT,UAAUc,UAClBhG,EAAG8D,YAAYC,OAEjBlS,EAAK8iB,WAAa,CAChB7b,EAAG,EACHc,EAAG,EACHuL,WAAYtT,EAAKqT,UAAUC,WAC3Ba,UAAWnU,EAAKqT,UAAUc,UAC1BhG,EAAGnO,EAAKisC,iBAAiB99B,GAE3BnO,EAAKkrC,WAAa,CAChBjkC,EAAGjH,EAAK8iB,WAAW7b,EACnBc,EAAG/H,EAAK8iB,WAAW/a,EACnBoG,EAAGnO,EAAK8iB,WAAW3U,GAErBnO,EAAKgrC,gBAAkB,CACrB/jC,EAAGjH,EAAK8iB,WAAW7b,EACnBc,EAAG/H,EAAK8iB,WAAW/a,EACnBoG,EAAGnO,EAAK8iB,WAAW3U,GAErBnO,EAAK6rC,oBAAsBnM,YAAW,WACpC1/B,EAAKg8B,iBAAiBr5B,EAAG3C,EAAK2jB,cAC7B3jB,EAAKE,WAAWgsC,wBACnBlsC,EAAK4rC,kBAAoBO,YACvBnsC,EAAK+qC,kBAlMQ,IAsMb/qC,EAAKyrC,eACJzrC,EAAKyrC,aAAa/kB,SAC2C,IAA5D,CAAC,OAAQ,WAAW9L,QAAQ5a,EAAKyrC,aAAa3tB,sBAEhD9d,EAAK4jB,UAAW,MAGlB5jB,EAAK4jB,UAAW,EACZ5jB,EAAKyrC,aAAa9lB,gBAChB3lB,EAAKyrC,aAAa/lB,aACpB1lB,EAAKy8B,WAAW,CACdrb,IAAKphB,EAAKyrC,aAAa/jC,SACvB2Z,OAAQrhB,EAAKyrC,aAAa/jC,SAC1B4Y,KAAM,EACNC,MAAOvgB,EAAKonC,mBAAmBthC,OAAS,IAE1C9F,EAAK6I,MAAK,IACD7I,EAAKyrC,aAAa1lB,iBACuB,SAA9C/lB,EAAKE,WAAW+9B,4BACdj+B,EAAKuqB,UAAYvqB,EAAKyrC,aAAa71B,OAAO1Q,KAC5ClF,EAAK+qB,eACqB,QAAxB/qB,EAAK+qB,eAA2B,OAAS,MAE3C/qB,EAAK+qB,eAAiB,MAExB/qB,EAAKoW,MAAMpW,EAAKyrC,aAAa71B,OAAO1Q,KAAMlF,EAAK+qB,iBAEC,WAA9C/qB,EAAKE,WAAW+9B,4BAClBj+B,EAAKy8B,WAAW,CACdrb,IAAK,EACLC,OAAQrhB,EAAKiQ,SAASnK,OAAS,EAC/Bwa,KAAMtgB,EAAKyrC,aAAa9jC,YACxB4Y,MAAOvgB,EAAKyrC,aAAa9jC,cAE3B3H,EAAK6I,MAAK,UAGd7I,EAAKosC,eAAezpC,GAIpB3C,EAAK+rC,cAGT5lC,SAASkmC,KAAKrnC,iBAAiB,YAAahF,EAAKssC,UAAW,CAC1DC,SAAS,IAEXpmC,SAASkmC,KAAKrnC,iBAAiB,WAAYhF,EAAKwsC,UAAU,GAC1DrmC,SAASkmC,KAAKrnC,iBAAiB,cAAehF,EAAKysC,aAAa,GAChEzsC,EAAK6I,MAAK,MAEZ7I,EAAK0sC,YAAc,SAAUtlC,EAAMulC,WACXzlC,IAAlBE,EAAKM,eAA+CR,IAArBE,EAAKO,aAGxC3H,EAAK4sC,gBAAiB,MAClB3D,EAASjpC,EAAK47B,qBAED,wBAAf+Q,GACAvlC,EAAKM,UAAYuhC,EAAO7nB,KACxBha,EAAKO,aAAeshC,EAAO1oB,OAE3B0oB,EAAO5nB,OAASja,EAAKM,SACrBuhC,EAAO3oB,KAAOlZ,EAAKO,aAEJ,wBAAfglC,GACAvlC,EAAKM,UAAYuhC,EAAO5nB,QACxBja,EAAKO,aAAeshC,EAAO1oB,OAE3B0oB,EAAO7nB,IAAMha,EAAKM,SAClBuhC,EAAO3oB,KAAOlZ,EAAKO,aAEJ,wBAAfglC,GACAvlC,EAAKM,UAAYuhC,EAAO5nB,QACxBja,EAAKO,aAAeshC,EAAO3oB,MAE3B2oB,EAAO7nB,IAAMha,EAAKM,SAClBuhC,EAAO1oB,MAAQnZ,EAAKO,aAEL,wBAAfglC,GACAvlC,EAAKM,UAAYuhC,EAAO7nB,KACxBha,EAAKO,aAAeshC,EAAO3oB,OAE3B2oB,EAAO5nB,OAASja,EAAKM,SACrBuhC,EAAO1oB,MAAQnZ,EAAKO,aAEgB,QAAlC3H,EAAKE,WAAWmV,gBAA8C,IAAnBjO,EAAKM,UAClDuhC,EAAO3oB,KAAO,EACd2oB,EAAO1oB,MAAQvgB,EAAKuO,YAAYzI,OAAS,GAEzCmjC,EAAO3oB,KAAO1Y,KAAK0U,IAAI,EAAG2sB,EAAO3oB,MAEnCtgB,EAAKy8B,WAAWwM,GAChBjpC,EAAK6I,MAAK,KAqHZ7I,EAAKssC,UAAY,SAAU3pC,GACrB8mC,GAGJrnC,uBAAsB,WACpBqnC,GAAc,WAxHC9mC,OACbg1B,EAAIkV,EAAIC,EAAaC,EAAaC,EAAaC,EAAa/V,EAAKgW,EAAIC,MACrEntC,EAAKmC,cAAc,kBAAmB,CAAEo4B,YAAa53B,QAGzD83B,aAAaiP,GACT/mC,EAAE6oC,eAAe,KACnBxrC,EAAKyiB,cAAgBziB,EAAK4pC,YAAYjnC,IAEpCA,EAAE6oC,eAAe,KACnBxrC,EAAK0iB,eAAiB1iB,EAAK4pC,YAAYjnC,EAAG,IAG1CiF,KAAKqd,IAAIjlB,EAAK8iB,WAAW7b,GAAKW,KAAKqd,IAAIjlB,EAAK8iB,WAAW/a,GACvD/H,EAAKE,WAAWktC,eAEhB3S,aAAaz6B,EAAK6rC,qBAEK,IAArBlpC,EAAE6f,QAAQ1c,QAAgB9F,EAAKyiB,eAAiBziB,EAAK0iB,sBACvDwqB,EAAKltC,EAAKyiB,cAAc1a,EACxBolC,EAAKntC,EAAK0iB,eAAe3a,EACpB/H,EAAKsiB,iBACRtiB,EAAKsiB,eAAiB1a,KAAKqd,IAAIioB,EAAKC,GACpCntC,EAAKoiB,WAAapiB,EAAKsL,OAEzBtL,EAAKuiB,YAAc,EACnBviB,EAAKqiB,WAAariB,EAAKsiB,eAAiB1a,KAAKqd,IAAIioB,EAAKC,GACtDntC,EAAKsL,MACHtL,EAAKoiB,WACLpiB,EAAKqiB,WAAariB,EAAKE,WAAWmtC,qBACpCrtC,EAAKsL,MAAQ1D,KAAK4G,IAChB5G,KAAK0U,IAAItc,EAAKsL,MAAOtL,EAAKE,WAAWotC,cACrCttC,EAAKE,WAAWqtC,cAElBvtC,EAAK+rC,aAAc,EACnB/rC,EAAKqC,QAAO,QACZrC,EAAK2+B,mBAGH3+B,EAAK+rC,cAGT/rC,EAAKuiB,YAAc,EACnBviB,EAAKyiB,cAAgBziB,EAAKyiB,eAAiBziB,EAAK0iB,eAChDiV,EAAK33B,EAAK2Q,4BACVk8B,EAAK7sC,EAAK6Q,wBACVi8B,EACE9sC,EAAKmI,MAAQnI,EAAKsC,MAAM8U,eAAiBpX,EAAKyiB,cAAcxb,EAC5DjH,EAAKE,WAAWstC,oBAClBT,EACE/sC,EAAKyiB,cAAcxb,EAAI4lC,EAAK7sC,EAAKE,WAAWstC,oBAC9CR,EACEhtC,EAAKkI,OAASlI,EAAKsC,MAAM8U,eAAiBpX,EAAKyiB,cAAc1a,EAC7D/H,EAAKE,WAAWstC,oBAClBP,EACEjtC,EAAKyiB,cAAc1a,EAAI4vB,EAAK33B,EAAKE,WAAWstC,oBAC9CtW,EAAMl3B,EAAKsC,MAAM8U,eAcjBzU,EAAE2yB,kBACFt1B,EAAK8iB,WAAa,CAChB7b,EAAGjH,EAAKyiB,cAAcxb,EAAIjH,EAAK2jB,WAAW1c,EAC1Cc,EAAG/H,EAAKyiB,cAAc1a,EAAI/H,EAAK2jB,WAAW5b,EAC1CuL,WAAYtT,EAAKqT,UAAUC,WAC3Ba,UAAWnU,EAAKqT,UAAUc,UAC1BhG,EAAG8D,YAAYC,OAEjBlS,EAAKyQ,YAAczQ,EAAK2Y,UACtB3Y,EAAKyiB,cAAcxb,EACnBjH,EAAKyiB,cAAc1a,GAErB/H,EAAKmC,cAAc,YAAa,CAAEo4B,YAAa53B,EAAGyE,KAAMpH,EAAKyQ,cAC7DzQ,EAAKirC,eACLjrC,EAAKujB,cAAgBtR,YAAYC,MAAQlS,EAAKisC,iBAAiB99B,EAC/DnO,EAAKqrC,eAAgB,EACrBrrC,EAAK2pC,gBAAkB,EAErB3pC,EAAK4sC,iBACJE,GAAeC,GAAeE,GAAeD,aAhCvCS,QACHxmC,EAAIjH,EAAKqT,UAAUC,WACrBvL,EAAI/H,EAAKqT,UAAUc,UACrBlN,GAAK6lC,EAAc9sC,EAAKE,WAAW0/B,yBAA2B,EAC9D73B,GAAKilC,EAAchtC,EAAKE,WAAW0/B,yBAA2B,EAC9D73B,GAAKklC,EAAcjtC,EAAKE,WAAW0/B,yBAA2B,EAC9D34B,GAAK8lC,EAAc/sC,EAAKE,WAAW0/B,yBAA2B,EAC9D5/B,EAAKqT,UAAU+wB,SAASn9B,EAAGc,GAC3B2hC,EAAqBhK,WACnB+N,EACAztC,EAAKE,WAAWy/B,kBAwBlB8N,GAEE,mBAAmBnqC,KAAKtD,EAAKyrC,aAAanpC,OAC5CtC,EAAKqT,UAAUc,UACbnU,EAAKqT,UAAUoK,eACbzd,EAAKyiB,cAAc1a,EAAI4vB,EAAKT,IAC3Bl3B,EAAKqT,UAAUnL,OAASgvB,EAAMS,IAGjC,qBAAqBr0B,KAAKtD,EAAKyrC,aAAanpC,OAC9CtC,EAAKqT,UAAUC,WACbtT,EAAKqT,UAAUgK,cACbrd,EAAKyiB,cAAcxb,EAAI4lC,EAAK3V,IAAQl3B,EAAKqT,UAAUlL,MAAQ+uB,EAAM2V,IAGnE,oBAAoBvpC,KAAKtD,EAAKyrC,aAAanpC,OAC7CtC,EAAK0sC,YAAY1sC,EAAKyQ,YAAazQ,EAAKyrC,aAAanpC,OAGvDtC,EAAKqT,UAAU+wB,SACbpkC,EAAKisC,iBAAiBhlC,EAAIjH,EAAK8iB,WAAW7b,EAC1CjH,EAAKisC,iBAAiBlkC,EAAI/H,EAAK8iB,WAAW/a,KAS1C2lC,CAAU/qC,GACV8mC,GAAc,MAGlBzpC,EAAKosC,eAAiB,SAAUzpC,GAC9B3C,EAAKsiB,oBAAiBpb,EACtBlH,EAAK4sC,gBAAiB,EACtBjB,cAAc3rC,EAAK0pC,oBACnBiC,cAAc3rC,EAAK6rC,qBACnBF,cAAc3rC,EAAK4rC,mBACnBjpC,EAAE2yB,kBACFnvB,SAASkmC,KAAK5W,oBAAoB,YAAaz1B,EAAKssC,UAAW,CAC7DC,SAAS,IAEXpmC,SAASkmC,KAAK5W,oBAAoB,WAAYz1B,EAAKwsC,UAAU,GAC7DrmC,SAASkmC,KAAK5W,oBAAoB,cAAez1B,EAAKysC,aAAa,IAErEzsC,EAAKwsC,SAAW,SAAU7pC,OAEtB3C,EAAKmC,cAAc,WAAY,CAAEo4B,YAAa53B,EAAGyE,KAAMpH,EAAKyQ,iBAI9DzQ,EAAKsiB,oBAAiBpb,EAClBvE,EAAE6oC,eAAe,KACnBxrC,EAAKyiB,mBAAgBvb,GAEnBvE,EAAE6oC,eAAe,KACnBxrC,EAAK0iB,oBAAiBxb,GAEpBlH,EAAK+rC,YACkB,IAArBppC,EAAE6f,QAAQ1c,SACZ9F,EAAK+rC,aAAc,YAInB4B,EACF/lC,KAAKqd,IAAIjlB,EAAK8iB,WAAW7b,GAAKW,KAAKqd,IAAIjlB,EAAK8iB,WAAW/a,GACvD/H,EAAKE,WAAWktC,cACdjqC,MAAMnD,EAAKkjB,QACbljB,EAAKkjB,KAAO,GAEV/f,MAAMnD,EAAKmjB,QACbnjB,EAAKmjB,KAAO,GAEVhgB,MAAMnD,EAAKqjB,SACbrjB,EAAKqjB,MAAQ,GAEXlgB,MAAMnD,EAAKsjB,SACbtjB,EAAKsjB,MAAQ,GAEftjB,EAAK+iB,eAAe9b,EAClBjH,EAAKkjB,KAAOljB,EAAKE,WAAW0tC,yBAC9B5tC,EAAK+iB,eAAehb,EAClB/H,EAAKmjB,KAAOnjB,EAAKE,WAAW0tC,yBAC9B5tC,EAAK+qC,oBAEF4C,GACwB,IAAzB3tC,EAAK2pC,mBACJ/hC,KAAKqd,IAAIjlB,EAAKqjB,OAASrjB,EAAKE,WAAW2tC,6BACtCjmC,KAAKqd,IAAIjlB,EAAKsjB,OAAStjB,EAAKE,WAAW2tC,8BACxC,WAAWvqC,KAAKtD,EAAKyrC,aAAanpC,QAClCqrC,IAED3tC,EAAKqrC,eAAgB,EACrBrrC,EAAKmrC,qBAEPnrC,EAAKosC,eAAezpC,KAEtB3C,EAAKysC,YAAc,SAAU9pC,GAEzB3C,EAAKmC,cAAc,cAAe,CAChCo4B,YAAa53B,EACbyE,KAAMpH,EAAKyQ,eAKfzQ,EAAKosC,eAAezpC,IC3eT,cAAU3C,EAAM8tC,YAmjBpBjnC,EAAUC,EAAKC,OAEpBE,EADEvD,EAAI,OAEHuD,EAAIH,EAAKG,GAAKF,EAAME,GAAK,EAC5BvD,EAAEuD,GAAKA,SAEFvD,EAxjBT1D,EAAKsL,MAAQ,EACbtL,EAAKoS,OAAS,CACZC,KAAM,GACNyC,QAAS,IAEX9U,EAAK+4B,oBAAsB,GAC3B/4B,EAAK4lB,mBAAqB,GAC1B5lB,EAAK+tC,mBAAqB,GAC1B/tC,EAAKmS,kBAAoB,GACzBnS,EAAK4jB,UAAW,EAChB5jB,EAAKoV,WAAa,CAChBzN,YAAa,EACbD,SAAU,GAEZ1H,EAAKmE,UAAY,GACjBnE,EAAKguC,YAAc,iBACnBhuC,EAAKiuC,sBAAwB,wCAC7BjuC,EAAKkuC,4BAA8B,qCACnCluC,EAAK4E,SAAW,gCAChB5E,EAAKuqB,QAAU,KACfvqB,EAAK+qB,eAAiB,MACtB/qB,EAAK+uB,UAAY,CACfja,QAAS,GACTq5B,IAAK,SAAU5jB,EAASQ,EAAgBqjB,GACtCpuC,EAAK+uB,UAAUja,QAAU9U,EAAK+uB,UAAUja,QAAQ/P,QAAO,SAAUmb,UACxDA,EAAIqK,UAAYA,KAEzBvqB,EAAK+uB,UAAUja,QAAQjR,KAAK,CAC1B0mB,QAASA,EACTQ,eAAgBA,EAChBqjB,aAAcA,KAGlBr8B,KAAM,WACJmZ,QAAQC,KACN,uEAGFnrB,EAAK+uB,UAAUja,QAAQjU,SAAQ,SAAUqf,GACvClgB,EAAKiQ,SAAS8B,KAAKmO,EAAIkuB,aAAaluB,EAAIqK,QAASrK,EAAI6K,sBAI3D/qB,EAAKorB,cAAgB,GACrBprB,EAAKquC,QAAU,GACfruC,EAAKoT,UAAY,EACjBpT,EAAKyO,aAAe,EACpBzO,EAAKm5B,cAAgB,GACrBn5B,EAAKkd,YAAc,CAAEjW,EAAG,GAAIc,EAAG,IAC/B/H,EAAKqT,UAAY,GACjBrT,EAAKwS,YAAc,GACnBxS,EAAKyS,aAAe,GAOpBzS,EAAK2S,wBAA0B,GAM/B3S,EAAK2R,gBAAkB,GAcvB3R,EAAK0S,cAAgB,GACrB1S,EAAK+W,MAAQ,CACX1E,KAAM,GACNyC,QAAS,GACTqc,MAAO,IAETnxB,EAAKua,WAAa,GAClBva,EAAK2a,aAAe,GACpB3a,EAAK+a,gBAAkB,GACvB/a,EAAK0b,YAAc,GACnB1b,EAAKimB,WAAa,CAChB5T,KAAM,GACNyC,QAAS,IAEX9U,EAAKwmB,qBAAuB,CAC1B7e,aAAc,EACdD,UAAW,GAEb1H,EAAKwU,SAAW,CACdnC,KAAM,GACNyC,QAAS,GACTw5B,WAAY,GACZ7lB,gBAAiB,EACjB8lB,wBAAyB,EACzBC,sBAAuB,EACvBC,OAAQ,CACNp8B,KAAM,GACNyC,QAAS,KAGb9U,EAAKkM,OAAS,GACdlM,EAAKE,WAAa,GAClBF,EAAKsC,MAAQ,GACbtC,EAAK6mB,WAAa,GAClB7mB,EAAK0uC,QAAU,GACf1uC,EAAK2uC,QAAU,GACf3uC,EAAK4uC,aAAe,GACpB5uC,EAAKw1B,OAAS,GACdx1B,EAAK6uC,QAAU,GACf7uC,EAAKqU,eAAiB,EACtBrU,EAAKoU,eAAiB,EACtBpU,EAAK4U,gBAAkB,EACvB5U,EAAKuT,gBAAkB,EACvBvT,EAAKkqB,WAAa,GAClBlqB,EAAKgX,aAAe,GAWpBhX,EAAK6e,eAAiB,GAWtB7e,EAAK8gB,YAAc,GAEnB9gB,EAAKy/B,YAAc,CACjB,sBACA,sBACA,yBACA,wBACA,0BACA,0BAEFz/B,EAAK8uC,kBAAoB,GACzB9uC,EAAK+uC,WAAa,CAChB,YACA,kBACA,0BACA,mBACA,mBACA,kBACA,uBACA,aACA,gBACA,mBACA,uBACA,2BACA,YACA,eACA,gBACA,QACA,eACA,aACA,eACA,cACA,OACA,cACA,WACA,UACA,aACA,kBACA,UACA,WACA,QACA,YACA,YACA,UACA,SACA,cACA,aACA,iBACA,qBACA,aACA,kBACA,UACA,aACA,SACA,eACA,YACA,gBACA,SACA,mBACA,eACA,cACA,WACA,YACA,aACA,SAEF/uC,EAAKyjB,MAAQ,CAAExc,EAAG,EAAGc,EAAG,GACxB/H,EAAKo8B,gBAAkB,SAAU4S,OACzBja,EAAe,GACflyB,EAAS7C,EAAKuO,YACd0gC,EAAiBjvC,EAAKiQ,SAASnK,cAEd,IAAnBmpC,EACK,IAMTjvC,EAAKua,WAAW1Z,SAAQ,SAAUie,EAAKmJ,GAChCnJ,GAIDmJ,IAAiBgnB,IAIF,IAAfnwB,EAAIhZ,QAKRivB,EAAa9M,GAAgB,GAE7BnJ,EAAIje,SAAQ,SAAUqf,OACP,IAATA,GAAerd,EAAOqd,QAIpBgvB,EAAelvC,EAAKoS,OAAO0C,QAAQoL,IAEpC8uB,GAAensC,EAAOqsC,GAActgC,QAIrC5O,EAAKiQ,SAASgY,KAChB8M,EAAa9M,GAAcplB,EAAOqsC,GAAchqC,MAC9ClF,EAAKiQ,SAASgY,GAAcplB,EAAOqsC,GAAchqC,YAnBrD6vB,EAAa9M,GAAgB,SAwB1B8M,IAET/0B,EAAKs8B,iBAAmB,SAAU0S,OAC1B3S,EAAgB,GAChBx5B,EAAS7C,EAAKuO,eAGG,IAFAvO,EAAKiQ,SAASnK,aAG5B,sCAGyB9F,EAAKua,WAAW40B,0CAAW,iCAAjDlnB,OAAcnJ,UACnBA,GAAsB,IAAfA,EAAIhZ,2CAEkBgZ,EAAIqwB,0CAAW,KAAnCjnB,mCACa,IAArBA,GAA2BrlB,EAAOqlB,QAIhCE,EAAmBpoB,EAAKqoB,uCAC5BH,OAGG8mB,IAAensC,EAAOulB,GAAkBxZ,SAIzC5O,EAAKiQ,SAASgY,GAAe,KACzBrS,EAAS/S,EAAOulB,GAMhBhhB,EAAO,CACX6f,MANYjnB,EAAKiQ,SAASgY,GAAcrS,EAAO1Q,MAO/C0Q,OAAAA,EACAuS,cAPoBnoB,EAAKwW,iCACzByR,GAOAG,iBAAAA,EACAH,aAAAA,EACAC,gBAAAA,GAGFmU,EAAcx4B,KAAKuD,4EAKlBi1B,GAETr8B,EAAKsoC,6BAA+B,SAAUT,OAGxCuH,IAFEra,EAAe,GACflyB,EAAS7C,EAAKuO,YAEhBymB,GAAS,+BAEiBh1B,EAAKua,WAAW40B,0CAAW,iCAA7CznC,OAAUoX,UAEfA,OAGCuwB,EAAcvwB,EAAIoW,KAAK,KAAKztB,WAC5B6nC,EAAU,GAEXF,IAAkBA,EAAmBtwB,EAAIoW,KAAK,KAAKztB,YACpDutB,GAAUqa,IAAgBD,IAAkBpa,GAAS,SAEnD7M,EAAgBnoB,EAAKwW,iCAAiC9O,gCAEpCoX,kCAAK,KAApBnX,eAEHA,EAAc,QAKZ++B,EAAa7jC,EAHM7C,EAAKqoB,uCAC5B1gB,IAE0CzC,KAEtC+hB,EAAQjnB,EAAKyW,aAAa0R,GAAeue,GAE/C4I,EAAQ5I,GAAczf,kCAExB8N,EAAalxB,KAAKyrC,sCAGhBva,EAAajvB,OAAS,UAClBypC,EAAaza,iBAAiBC,EAAcC,GAG5Cwa,EAAa,cACHD,cAHGpa,iBAAiBJ,EAAcC,cAKpCua,qBACQ9sC,KAAK0qB,UAAU4H,UAGNrsB,OAAOymC,QAAQK,kBAAa,8BAA/C5a,OAAUryB,OACpBslC,EAAc4H,QAAQ7a,EAAUryB,KAItCvC,EAAKuoC,mBAAqB,iBAClB1lC,EAAS7C,EAAKuO,YACd62B,EAAgB,gCAEQplC,EAAKua,WAAW40B,0CAAW,iCAA7CznC,OAAUoX,UAEfA,SAECqJ,EAAgBnoB,EAAKwW,iCAAiC9O,gCAEpCoX,kCAAK,KAApBnX,eAEHA,EAAc,QAEZygB,EAAmBpoB,EAAKqoB,uCAC5B1gB,GAEI++B,EAAa7jC,EAAOulB,GAAkBljB,KAE5ClF,EAAKiQ,SAASkY,GAAeue,GAAc,GAE3CtB,EAAcvhC,KAAK,CACjB6D,EACAC,EACAwgB,EACAC,4EAKCgd,GAETplC,EAAKwW,iCAAmC,SAAUyR,MAC5CjoB,EAAKinC,kBAAoBjnC,EAAKinC,iBAAiByI,IAAIznB,UAC9CjoB,EAAKinC,iBAAiBvV,IAAIzJ,IAKrCjoB,EAAKqoB,uCAAyC,SAAUH,UAC/CloB,EAAKoS,OAAO0C,QAAQoT,IAK7BloB,EAAKiR,yBAA2B,eACzBjR,EAAKE,WAAWyvC,4BACZ,MAEH5wB,EAAS/e,EAAK6e,eAAe/Y,cACtB9F,EAAKsC,MAAM4c,qBAAuBlf,EAAKsL,MACtCyT,GAKhB/e,EAAK+Q,qBAAuB,eACrB/Q,EAAKE,WAAW0vC,yBACZ,MAEH7wB,EAAS/e,EAAK8gB,YAAYhb,cACnB9F,EAAKsC,MAAM0e,oBAAsBhhB,EAAKsL,MACrCyT,GAEhB/e,EAAK2O,yBAA2B,mBACxBkhC,EAAS,GACNnoC,EAAW,EAAGA,EAAW1H,EAAK6e,eAAe/Y,OAAQ4B,YACtDqX,EAAS/e,EAAK6e,eAAenX,GAC1BooC,EAAa,EAAGA,EAAa/wB,EAAOjZ,OAAQgqC,IAAc,KAC3DhhC,EAAQiQ,EAAO+wB,GACjBhhC,EAAMtF,WAAWqmC,EAAOhsC,KAAKiL,UAG9B+gC,GAET7vC,EAAKuR,sBAAwB,mBACrBs+B,EAAS,GACNnoC,EAAW,EAAGA,EAAW1H,EAAK8gB,YAAYhb,OAAQ4B,YACnDqX,EAAS/e,EAAK8gB,YAAYpZ,GACvBooC,EAAa,EAAGA,EAAa/wB,EAAOjZ,OAAQgqC,IAAc,KAC3DhhC,EAAQiQ,EAAO+wB,GACjBhhC,EAAMtF,WAAWqmC,EAAOhsC,KAAKiL,UAG9B+gC,GAMT7vC,EAAKu9B,YAAc,SAAUzuB,MACR,MAAfA,EAAM/I,KAAc,SAGlBgqC,EAFIhhC,EAAaD,EAAbC,KAAMC,EAAOF,EAAPE,GAIRghC,EAAYhwC,EAAK6e,eACdnb,EAAI,EAAGA,EAAIssC,EAAUlqC,OAAQpC,IAAK,SACnCqb,EAASixB,EAAUtsC,GAChBusC,EAAK,EAAGA,EAAKlxB,EAAOjZ,OAAQmqC,IAAM,KACnCnhC,EAAQiQ,EAAOkxB,MACjBnhC,EAAMC,OAASA,GAAQD,EAAME,KAAOA,EAAI,CAC1C+gC,EAAejhC,YAIfihC,EAAc,UAEfA,EAAc,WACbG,GAAiBH,EAAavmC,iBACpCumC,EAAavmC,UAAY0mC,GAClB,KAEU,MAAfphC,EAAM/I,KAAc,SAGlBgqC,EAFIhhC,EAAaD,EAAbC,KAAMC,EAAOF,EAAPE,GAIRghC,EAAYhwC,EAAK8gB,YACdpd,EAAI,EAAGA,EAAIssC,EAAUlqC,OAAQpC,IAAK,SACnCqb,EAASixB,EAAUtsC,GAChBusC,EAAK,EAAGA,EAAKlxB,EAAOjZ,OAAQmqC,IAAM,KACnCnhC,EAAQiQ,EAAOkxB,MACjBnhC,EAAMC,OAASA,GAAQD,EAAME,KAAOA,EAAI,CAC1C+gC,EAAejhC,YAIfihC,EAAc,UAEfA,EAAc,WACbG,GAAiBH,EAAavmC,iBACpCumC,EAAavmC,UAAY0mC,GAClB,SAEF,GAETlwC,EAAKmwC,qBAAuB,SAAUC,EAAarhC,EAAMC,OAClD,IAAItL,EAAI,EAAGA,EAAI0sC,EAAYtqC,OAAQpC,YAChCqb,EAASqxB,EAAY1sC,GAClB2sC,EAAS,EAAGA,EAAStxB,EAAOjZ,OAAQuqC,IAAU,KAC/CvhC,EAAQiQ,EAAOsxB,MACjBthC,IAASD,EAAME,GAAK,EAAG,OAAO,OAC9BD,EAAOD,EAAME,QAEbD,IAASD,EAAMC,KAAM,IACnBC,IAAOF,EAAME,GAAI,OAAO,KACxBA,EAAKF,EAAME,GAAI,OAAO,WAGxBD,EAAOD,EAAMC,KAAM,IACjBC,EAAKF,EAAME,GAAI,OAAO,gBAGxBA,EAAKF,EAAME,YAIZ,GAEThP,EAAK2Q,0BAA4B,kBAC1B3Q,EAAKE,WAAWgX,mBAIlBlX,EAAK+W,MAAM1E,MAAM,IAAMrS,EAAKsC,MAAMoO,wBAA0B1Q,EAAKsL,MAH3D,GAMXtL,EAAK6Q,sBAAwB,kBACtB7Q,EAAKE,WAAWyU,gBAIlB3U,EAAK+W,MAAMjC,SAAS,IAAM9U,EAAKsC,MAAMsO,oBAAsB5Q,EAAKsL,MAH1D,GAMXtL,EAAKw9B,eAAiB,cACfx9B,EAAKE,WAAWiqB,gBAAmBnqB,EAAKE,WAAWgF,UAGpDorC,EAAa,GACjBtwC,EAAKuO,YAAY1N,SAAQ,SAAU41B,GACjC6Z,EAAW7Z,EAAOvxB,OAASuxB,EAAO7nB,UAEpC2hC,aAAaC,QACXxwC,EAAKguC,YAAc,IAAMhuC,EAAKE,WAAWgF,KACzCzC,KAAK0qB,UAAU,CACbpW,MAAO,CACL1E,KAAMrS,EAAK+W,MAAM1E,KACjByC,QAAS9U,EAAK+W,MAAMjC,SAEtB1C,OAAQ,CACNC,KAAMrS,EAAKoS,OAAOC,KAClByC,QAAS9U,EAAKoS,OAAO0C,SAEvByV,QAASvqB,EAAKuqB,QACdQ,eAAgB/qB,EAAK+qB,eACrBulB,WAAYA,OAIlBtwC,EAAKuO,UAAY,kBACRvO,EAAK6C,QAAU7C,EAAKsuC,YAAc,IAU3CtuC,EAAKywC,mBAAqB,eACpBniC,EAAItO,EAAKuO,YACbvO,EAAKoS,OAAO0C,QAAUjO,EAAU,EAAGyH,EAAExI,OAAS,IAEhD9F,EAAKsS,gBAAkB,WACrBtS,EAAKoS,OAAOC,KAAOxL,EAAU,EAAG7G,EAAKyW,aAAa3Q,OAAS,IAE7D9F,EAAKi/B,mBAAqB,SAAU92B,SAC5B4S,EAAkB/a,EAAKua,WAAW,GAClC1X,EAAS7C,EAAKuO,yCAESwM,kCAAiB,KAAnC21B,aAELA,GAAkB,GAAK1wC,EAAKg/B,iBAAiB0R,MAC3CvtC,MAAMgF,GAAQ,KACVsuB,EAAS5zB,EAAO7C,EAAKoS,OAAO0C,QAAQ47B,IAC1C1wC,EAAK4jC,kBAAkBnN,EAAOvxB,WAE9BlF,EAAK+W,MAAMjC,QAAQ47B,GAAkBvoC,EACrCnI,EAAKmC,cAAc,eAAgB,CACjC8E,EAAGkB,EACHJ,EAAG/H,EAAKu+B,uBACR/E,aAAcx5B,EAAKyQ,+CAM7BzQ,EAAKonC,iBAAmB,kBACfpnC,EAAKuO,YAAYxJ,QAAO,SAAUmb,UAC/BA,EAAItR,WAGhB5O,EAAK2wC,kBAAoB,SAAU7xB,EAAKlJ,EAAQlO,OAC1CsI,EAAI4F,EAAOg7B,cAAgB,GACd,mBAAN5gC,IACTA,EAAIA,EAAE4U,MAAM5kB,EAAKsB,KAAM,CAACsU,EAAQlO,KAElCoX,EAAIlJ,EAAO1Q,MAAQ8K,GAErBhQ,EAAK6wC,iBAAmB,WACtB7wC,EAAKgV,OAAS,GAQdhV,EAAKuO,YAAY1N,SAAQ,SAAuB+U,GAC9C5V,EAAK2wC,kBAAkB3wC,EAAKgV,OAAQY,EAHlB1O,eAMtBlH,EAAK8wC,kBAAoB,SAAU9sB,WAC7B/gB,EAAI,EACDjD,EAAK4uC,aAAa5qB,IAEvBA,GADA/gB,GAAK,SAGA+gB,GAEThkB,EAAK+E,OAAS,SAAUgB,OAClB6gB,EAAI5mB,EAAKquC,QAAQtoC,UAChB6gB,QAAc1f,IAATnB,IACRmlB,QAAQC,KACN,mEACAplB,GAEF6gB,EAAI5mB,EAAKquC,QAAQ9qC,QAEZqjB,GAET5mB,EAAK2W,iBAAmB,kBACf3W,EAAKorB,eAAiB1iB,OAAOC,KAAK3I,EAAKorB,eAAetlB,OAAS,GAExE9F,EAAK4W,qBAAuB,eACrB,IAAIlT,EAAI,EAAGA,EAAI1D,EAAK8gB,YAAYhb,OAAQpC,YACrCqb,EAAS/e,EAAK8gB,YAAYpd,GACvBsb,EAAI,EAAGA,EAAID,EAAOjZ,OAAQkZ,IAAK,IAC5BD,EAAOC,GACXxV,UAAW,OAAO,SAGrB,GAETxJ,EAAK+wC,6BAA+B,SAAUt6B,cAOxCu6B,EAAcv6B,EAAa7E,IAAI,SAACkN,EAAKmyB,iCAAqB,CAC5DnyB,EACAmyB,mBAIEjxC,EAAK2R,gBAAgB7L,OAAS,UAC1BorC,EAASlxC,EAAK2R,gBAAgBI,KAAK,SAACC,EAAGhF,iCAAMA,EAAE,GAAKgF,EAAE,gBACnDtO,EAAI,EAAGA,EAAIwtC,EAAOprC,OAAQpC,IAAK,sBACDwtC,EAAOxtC,MAArC0rB,OACD+hB,OAA4B/hB,EAAgB,EAClD4hB,EAAYtkB,OAAO0C,EAAe+hB,qDAK1BC,OAAYC,OAChBz7B,EAAS5V,EAAKsxC,gBAAgBF,OAE/Bx7B,uBAIC27B,EACJ37B,EAAO7Q,QAAU/E,EAAK+E,OAAO6Q,EAAO7P,MAAQ,UAE9CirC,EAAcA,EAAYjsC,QAAO,sCAAW+Z,OAAKmyB,gBAE7CjxC,EAAKE,WAAWwT,oBACf1T,EAAKE,WAAWsxC,kBACjBP,EAAmBjxC,EAAKoT,YAInBm+B,EAAsBzyB,EAAIsyB,GAAaC,aAlBX3oC,OAAOymC,QAAQnvC,EAAKorB,0CAwBvD1c,EAAkB,GACbhL,EAAI,EAAGA,EAAI1D,EAAK8gB,YAAYhb,OAAQpC,YACrC2O,EAAOrS,EAAK8gB,YAAYpd,GACrBsb,EAAI,EAAGA,EAAI3M,EAAKvM,OAAQkZ,IAAK,KAC9BjS,EAAIsF,EAAK2M,GACVjS,EAAEvD,WACPkF,EAAgB7K,KAAK,CAACkJ,EAAEgC,KAAMhC,EAAEiC,QAGhCN,EAAgB5I,OAAS,EAAG,CAE9B4I,EAAgBqD,KAAK,SAACC,EAAGhF,iCAAMgF,EAAE,GAAKhF,EAAE,wBACpCykC,EAAS,EACPlK,EAAM74B,EAAgB5I,OACnBpC,EAAI,EAAGA,EAAI6jC,EAAK7jC,IAAK,KACtBqJ,EAAI2B,EAAgBhL,MACtBA,IAAM6jC,EAAM,EAAG,CACjB74B,EAAgB+iC,KAAY1kC,YAGxBiC,EAAKjC,EAAE,oBACQ2B,EAAgBhL,EAAI,MAAlCguC,OAAOC,OACVD,EAAQ1iC,EAAK,EACfN,EAAgB+iC,KAAY1kC,GAG9B2B,EAAgBhL,EAAI,GAAKqJ,EACrB4kC,EAAM3iC,IAAIN,EAAgBhL,EAAI,GAAG,GAAKiuC,YAMxC19B,GAJJvF,EAAkBA,EAAgBkjC,MAAM,EAAGH,IAInB1+B,QACfgD,EAAQ,EAAGA,EAAQi7B,EAAYlrC,OAAQiQ,IAAS,MAC5Ci7B,EAAYj7B,GAAO,GACrB9B,EAAE,aACP+B,EAAMD,EAAQ,EACXC,EAAMg7B,EAAYlrC,OAAQkQ,IAAO,IAC1Bg7B,EAAYh7B,GAAK,GACnB/B,EAAE,GAAI,SAElB+8B,EAAYtkB,OAAO3W,EAAOC,EAAMD,KAChC9B,EAAIvF,EAAgBqE,SACZ,MACRgD,yCAOiB/V,EAAK+uB,UAAUja,yCAAzB2hB,UACHob,EAASpb,EAAO2X,aAAa3X,EAAOlM,QAASkM,EAAO1L,gBAE1DimB,EAAYj/B,KAAK,yCAAE+/B,+CAAQC,OAAMC,cAE7BhyC,EAAKE,WAAWwT,oBACf1T,EAAKE,WAAW+xC,gBACjBD,EAAYhyC,EAAKoT,UAEV,EACFy+B,EAAOC,EAAMC,oFAIjB,CACL9hC,SAAU+gC,EAAYp/B,IAAI,8EAC1Bq1B,iBAAkB,IAAIW,IACpBoJ,EAAYp/B,IAAI,WAA2BqW,+DAAiB,CAC1DA,wBAMRjoB,EAAKy9B,QAAU,iBAC0Bz9B,EAAK+wC,6BAC1C/wC,EAAKyW,cADCxG,IAAAA,SAAUg3B,IAAAA,iBAIlBjnC,EAAKiQ,SAAWA,EAChBjQ,EAAKinC,iBAAmBA,EAExBjnC,EAAKqC,SACLrC,EAAK6I,MAAK,IAEZ7I,EAAKkyC,qBAAuB,SAAUxL,EAAYnkC,OAC5C4L,EACFlH,EACAmH,EAAI7L,EAAKuD,WACNmB,EAAI,EAAGA,EAAImH,EAAGnH,GAAK,UAERC,IAAZ3E,EAAK0E,IACO,OAAZ1E,EAAK0E,KAC+C,IAApD,CAAC,UAAMC,GAAW0T,QAAQrY,EAAK0E,GAAGy/B,UAGrB,YADbv4B,UAAW5L,EAAK0E,KACQ,SAAWkH,QAGhC,UAETnO,EAAKmyC,eAAiB,WACpBzpC,OAAOC,KAAK3I,EAAKkqB,YAAYrpB,SAAQ,SAAUuxC,GAC7CpyC,EAAKkqB,WAAWkoB,GAASvpC,WAG7B7I,EAAK2+B,iBAAmB,WACtBj2B,OAAOC,KAAK3I,EAAKkqB,YAAYrpB,SAAQ,SAAUuxC,GAC7CpyC,EAAKkqB,WAAWkoB,GAAS/vC,aAG7BrC,EAAK+8B,eAAiB,SAAUp6B,EAAGsE,EAAGc,EAAGiyB,OACnCqY,EACFzhC,EAAqB5Q,EAAK6Q,wBAC1BH,EAAyB1Q,EAAK2Q,6BACrB,IAAP1J,IACEA,EAAIjH,EAAKmI,MAAQnI,EAAKE,WAAWstC,sBACnCxtC,EAAKqT,UAAUC,YAActT,EAAKE,WAAW0/B,yBAC7CyS,GAAW,GAETprC,EAAIjH,EAAKE,WAAWstC,oBAAsB58B,EAAqB,IACjE5Q,EAAKqT,UAAUC,YAActT,EAAKE,WAAW0/B,yBAC7CyS,GAAW,KAGJ,IAAPtqC,IACEA,EAAI/H,EAAKkI,OAASlI,EAAKE,WAAWstC,sBACpCxtC,EAAKqT,UAAUc,WAAanU,EAAKE,WAAW0/B,yBAC5CyS,GAAW,GAGXtqC,EAAI/H,EAAKE,WAAWstC,oBAAsB98B,EAC1C,IAEA1Q,EAAKqT,UAAUc,WAAanU,EAAKE,WAAW0/B,yBAC5CyS,GAAW,IAIbA,IACCrY,GACDh6B,EAAKyQ,cAC6B,IAAlCzQ,EAAKyQ,YAAY9I,cAEjB3H,EAAK06B,YAAcgF,WACjB1/B,EAAKo5B,UACLp5B,EAAKE,WAAWy/B,iBAChBh9B,KAIN3C,EAAKsyC,eAAiB,SAAUrkC,EAAGK,OAC5BL,EAAE/I,WACC,IAAItC,MAAM,6CAGhB0L,EAAEvJ,QAAO,SAAUrB,UACVA,EAAEwB,OAAS+I,EAAE/I,QACnBY,OAAS,QAEN,IAAIlD,MACR,0BACEqL,EAAE/I,KACF,qDAGC,GAETlF,EAAKuyC,YAAc,SAAUC,EAAMC,EAAMzuB,EAAKjiB,GAC5CywC,EAAKxuB,QAAqB9c,IAAdurC,EAAKzuB,GAAqBjiB,EAAM0wC,EAAKzuB,IAEnDhkB,EAAK0yC,cAAgB,WACnB1yC,EAAKC,SAASC,WAAWW,SAAQ,SAAuB6C,GACtD1D,EAAKuyC,YAAYvyC,EAAKE,WAAYF,EAAK63B,KAAMn0B,EAAE,GAAIA,EAAE,QAGzD1D,EAAK2yC,SAAW,WACd3yC,EAAKC,SAASE,OAAOU,SAAQ,SAAmB6C,GAC9C1D,EAAKuyC,YAAYvyC,EAAKsC,MAAOtC,EAAK63B,KAAKv1B,OAAS,GAAIoB,EAAE,GAAIA,EAAE,QAGhE1D,EAAK6jC,SAAW,SAAUgB,GACxB7kC,EAAKonC,mBAAmBvmC,SAAQ,SAAUqf,EAAKD,GACzCC,EAAIhb,OAAS2/B,QAAuB39B,IAAZ29B,IAC1B7kC,EAAK+W,MAAMjC,QAAQmL,GAAYrY,KAAK0U,IAClCtc,EAAK4yC,wBAAwB1yB,EAAIhb,MACjClF,EAAKsC,MAAMk8B,oBAIjBx+B,EAAK+W,MAAMjC,SAAS,GAAK9U,EAAK4yC,wBAAwB,eAExD5yC,EAAK6yC,QAAU,YACR7yC,EAAKmP,aAAenP,EAAK4B,QAAU5B,EAAK4B,OAAOgE,YAClD5F,EAAK4B,OAAOgE,WAAWktC,YAAY9yC,EAAK4B,QAErC5B,EAAKmP,aACRhJ,SAASkmC,KAAKyG,YAAY9yC,EAAKgiC,cAEjChiC,EAAK+yC,YAAYtd,oBAAoB,YAAaz1B,EAAKqhC,WAAW,GAClErhC,EAAK+yC,YAAYtd,oBAAoB,WAAYz1B,EAAK2jC,UAAU,GAChE3jC,EAAK+yC,YAAYtd,oBAAoB,QAASz1B,EAAKk9B,OAAO,GAC1Dl9B,EAAK+yC,YAAYtd,oBAAoB,YAAaz1B,EAAKo5B,WACvDp5B,EAAK+yC,YAAYtd,oBAAoB,QAASz1B,EAAK+jC,aAAa,GAChE/jC,EAAK4B,OAAO6zB,oBAAoB,cAAez1B,EAAKgzC,aAAa,GACjEhzC,EAAK4B,OAAO6zB,oBAAoB,OAAQz1B,EAAKwoC,MAC7CxoC,EAAKgiC,aAAavM,oBAAoB,OAAQz1B,EAAKwoC,MACnDxoC,EAAKgiC,aAAavM,oBAAoB,MAAOz1B,EAAKqoC,KAClDroC,EAAKgiC,aAAavM,oBAAoB,QAASz1B,EAAK0nC,OACpD1nC,EAAKgiC,aAAavM,oBAAoB,WAAYz1B,EAAK0jC,UAAU,GACjE1jC,EAAKgiC,aAAavM,oBAAoB,QAASz1B,EAAKyjC,OAAO,GAC3DzjC,EAAKgiC,aAAavM,oBAAoB,UAAWz1B,EAAKqiC,SAAS,GAC/D5gC,OAAOg0B,oBAAoB,UAAWz1B,EAAK25B,SAAS,GACpDl4B,OAAOg0B,oBAAoB,YAAaz1B,EAAKo5B,WAC7C33B,OAAOg0B,oBAAoB,SAAUz1B,EAAKqC,QACtCrC,EAAKmF,UAAYnF,EAAKmF,SAAS8tC,YACjCjzC,EAAKmF,SAAS8tC,cAGlBjzC,EAAKkzC,sBAAwB,eACvB5kC,EACJtO,EAAKmzC,qBAEHnzC,EAAKozC,gBACiC,WAAtCC,QAAOrzC,EAAKozC,eAAehhC,SACI,OAA/BpS,EAAKozC,eAAehhC,SAGlBpS,EAAKozC,eAAehhC,OAAOC,KAAKvM,SAAW9F,EAAKiQ,UAAY,IAAInK,SAEhE9F,EAAKoS,OAAOC,KAAOrS,EAAKozC,eAAehhC,OAAOC,MAEhD/D,EAAItO,EAAKuO,YACLvO,EAAKozC,eAAehhC,OAAO0C,QAAQhP,SAAWwI,EAAExI,SAClD9F,EAAKoS,OAAO0C,QAAU9U,EAAKozC,eAAehhC,OAAO0C,SAEnD9U,EAAKuqB,aAC6BrjB,IAAhClH,EAAKozC,eAAe7oB,QAChBjc,EAAE,GAAGpJ,KACLlF,EAAKozC,eAAe7oB,QAC1BvqB,EAAK+qB,oBACoC7jB,IAAvClH,EAAKozC,eAAeroB,eAChB,MACA/qB,EAAKozC,eAAeroB,oBAEQ7jB,IAAhClH,EAAKozC,eAAe7oB,SACpBvqB,EAAKsxC,gBAAgBtxC,EAAKuqB,UAC1BvqB,EAAK+qB,gBAEL/qB,EAAKoW,MAAMpW,EAAKuqB,QAASvqB,EAAK+qB,kBAIpC/qB,EAAKi8B,mBAAqB,SAAUv0B,EAAUC,EAAa5B,cACrDutC,EAAW,GACXC,EAAiB,KAEnB5rC,GAAe3H,EAAKwU,SAASiU,kBAC5B/gB,EAAW,GAAkB,GAAZA,GAAiB1H,EAAKwU,SAASnC,KAAK,GAAGvG,MACzD,KACI0nC,EAAMxzC,EAAKwU,SAASnC,YAChBtM,OACD,SACHytC,EAAI9rC,GAAU8E,QAAS,EACvBxM,EAAKwU,SAASi6B,OAAOp8B,KAAKmhC,EAAI9rC,GAAUyO,OAAO3J,QAAS,YAGrD,WACHgnC,EAAI9rC,GAAU8E,QAAS,EACvBxM,EAAKwU,SAASi6B,OAAOp8B,KAAKmhC,EAAI9rC,GAAUyO,OAAO3J,QAAS,gBAIxDgnC,EAAI9rC,GAAU8E,QAAUgnC,EAAI9rC,GAAU8E,OACtCxM,EAAKwU,SAASi6B,OAAOp8B,KAAKmhC,EAAI9rC,GAAUyO,OAAO3J,OAC7CgnC,EAAI9rC,GAAU8E,WAGlB,IAAIinC,EAAKD,EAAI9rC,GAAUyO,MAAQ,EAC/Bs9B,GAAMD,EAAI9rC,GAAUgsC,UACpBD,IACA,KACIE,EAAS3zC,EAAKwU,SAASi6B,OAAOp8B,KAAKohC,GACnCD,EAAI9rC,GAAU8E,QAChBmnC,EAAOl/B,MAAO,EACVk/B,EAAO7nC,OAAS6nC,EAAOnnC,SAAQinC,EAAKE,EAAOD,YAE/CC,EAAOl/B,MAAO,QAGb,GAAIzU,EAAKwU,SAASM,QAAQpN,GAAW,KACtCksC,EAAM5zC,EAAKwU,SAASM,QAAQpN,UAExB3B,OACD,SACH6tC,EAAIjsC,GAAa6E,QAAS,YAGvB,WACHonC,EAAIjsC,GAAa6E,QAAS,gBAI1BonC,EAAIjsC,GAAa6E,QAAUonC,EAAIjsC,GAAa6E,WAG9C,IAAIqnC,EAAKD,EAAIjsC,GAAawO,MAAQ,EAClC09B,GAAMD,EAAIjsC,GAAa+rC,UACvBG,IAEID,EAAIjsC,GAAa6E,OACnBxM,EAAKwU,SAAS85B,WAAWuF,GAAIjlC,QAAS,EACnC5O,EAAKwU,SAAS85B,WAAWuF,GAAIjlC,QAAS,MAG3CklC,EADExY,EAAK,KAGLsY,EAAIjsC,GAAa6E,YACZ8uB,EAAKsY,EAAIjsC,GAAaosC,OAAO,CAClCD,EAAMpsC,EAAW4zB,EAAK,MAGpB,IAAI0Y,EAAMJ,EAAIjsC,GAAawO,MAC3B69B,GAAOJ,EAAIjsC,GAAa+rC,UACxBM,OAGEh0C,EAAKwU,SAASi6B,OAAO35B,QAAQg/B,IAC7B9zC,EAAKwU,SAASi6B,OAAO35B,QAAQg/B,GAAKE,GAAKloC,OACtC9L,EAAKwU,SAASi6B,OAAO35B,QAAQg/B,GAAKE,GAAKxnC,WAGtC,IAAIynC,EAAKD,EAAM,EACfC,GAAMj0C,EAAKwU,SAASi6B,OAAO35B,QAAQg/B,GAAKE,GAAKN,UAC7CO,IAEAj0C,EAAKwU,SAAS85B,WAAW2F,GAAIrlC,QAAS,EAK5C0sB,WAIF4Y,EAAY,GACZ1qC,EAAY,OAGX,IAAI8Q,KAFTta,EAAKwU,SAASnC,KAAO,GACrBrS,EAAKwU,SAASM,QAAU,GACV9U,EAAKwU,SAASi6B,OAAOp8B,KAAM,KACnC8hC,EAAU,GACVlpC,EAAOjL,EAAKwU,SAASi6B,OAAOp8B,KAAKiI,MAChCrP,EAAKwJ,KAgDH,KACA,IAAIrG,EAAI,EAAGA,EAAIpO,EAAKwU,SAASiU,gBAAiBra,IACjD+lC,EAAQtwC,KAAK7D,EAAKiQ,SAASqK,GAAGlM,IAEhC8lC,EAAU55B,GAAK65B,EACf3qC,EAAU3F,KACRlD,MAAMX,EAAKiQ,SAAS,GAAGnK,QACpBoD,OACA0I,KAAI,iBACI,OAGb2hC,QA5Dc,KACVa,EAAW,GACXC,EAAoB,KACpB/5B,EAAIta,EAAKwU,SAAS+5B,wBACpB+E,EAASzvC,KAAK7D,EAAKyW,aAAa6D,YAE5BA,EAAIta,EAAKwU,SAASg6B,sBACpB0F,EAAU55B,GAAKta,EAAKiQ,SAASqK,GAC7Bi5B,QACK,KACA,IAAInlC,EAAI,EAAGA,EAAIpO,EAAKyW,aAAa6D,GAAGxU,OAAQsI,IAC1CpO,EAAKwU,SAAS85B,WAAWlgC,GAAGQ,OAc1BylC,KAbDjmC,EAAIpO,EAAKwU,SAASiU,kBACf/f,OAAO9H,UAAUqxB,eAAenxB,KAAKozC,EAAW55B,KACnD45B,EAAU55B,GAAK,IACjB45B,EAAU55B,GAAGzW,KAAK7D,EAAKiQ,SAASqK,GAAGlM,KAErC+lC,EAAQtwC,KAAK7D,EAAKyW,aAAa6D,GAAGlM,IAEhC1F,OAAO9H,UAAUqxB,eAAenxB,KAC9Bd,EAAKwU,SAASi6B,OAAO35B,QACrBwF,IAGF85B,EAASvwC,KAAK7D,EAAKwU,SAASi6B,OAAO35B,QAAQwF,GAAGlM,KAGpD+lC,EAAQtwC,WAARswC,qBACKxzC,MAAM0zC,GACNnrC,OACA0I,KAAI,iBACI,QAGTwiC,EAAStuC,SACXsuC,EAASvwC,WAATuwC,qBACKzzC,MAAM0zC,GACNnrC,OACA0I,IAAI,yCACI,kBAGb5R,EAAKwU,SAASM,QAAQwF,GAAK85B,GAE7Bd,EAASzvC,KAAKswC,GAGlBn0C,EAAKwU,SAASnC,KAAKxO,KAAKoH,IAgBxBsoC,OACFvzC,EAAKwU,SAASnC,MAAKxO,gCACdlD,MAAM4yC,GACNrqC,OACA0I,IAAI,SAACpB,EAAG2F,iCACA,CAAEA,MAAOnW,EAAKwU,SAASnC,KAAKvM,OAASqQ,kBAGlDm9B,EAASzvC,WAATyvC,EAAiB9pC,QAEd,IAAI8Q,KAAK45B,KACR55B,EAAIta,EAAKwU,SAASg6B,sBAAuB8E,EAASh5B,GAAK45B,EAAU55B,QAEnE,IAAK,IAAIlM,KAAK8lC,EAAU55B,GACtBg5B,EAASh5B,GAAGlM,GAAK8lC,EAAU55B,GAAGlM,GAGpCpO,EAAKiQ,SAAWqjC,GAElBtzC,EAAK8jC,uBAAyB,SAAUp8B,EAAUC,EAAa5B,MAE3D4B,GAAe3H,EAAKwU,SAASiU,kBAC5B/gB,EAAW,GAAkB,GAAZA,GAAiB1H,EAAKwU,SAASnC,KAAK,GAAGvG,MACzD,KACM0nC,EAAMxzC,EAAKwU,SAASnC,YAClBtM,OACD,SACHytC,EAAI9rC,GAAU8E,QAAS,YAEpB,WACHgnC,EAAI9rC,GAAU8E,QAAS,gBAGvBgnC,EAAI9rC,GAAU8E,QAAUgnC,EAAI9rC,GAAU8E,WAErC,IAAIinC,EAAK/rC,EAAW,EAAG+rC,GAAMD,EAAI9rC,GAAUgsC,UAAWD,IACrDD,EAAI9rC,GAAU8E,QAChBgnC,EAAIC,GAAIh/B,MAAO,EACX++B,EAAIC,GAAI3nC,OAAS0nC,EAAIC,GAAIjnC,SAAQinC,EAAKD,EAAIC,GAAIC,YAElDF,EAAIC,GAAIh/B,MAAO,OAGd,GAAIzU,EAAKwU,SAASM,QAAQpN,GAAW,KACpCksC,EAAM5zC,EAAKwU,SAASM,QAAQpN,UAC1B3B,OACD,SACH6tC,EAAIjsC,GAAa6E,QAAS,YAEvB,WACHonC,EAAIjsC,GAAa6E,QAAS,gBAG1BonC,EAAIjsC,GAAa6E,QAAUonC,EAAIjsC,GAAa6E,WAG3C,IAAIqnC,EAAKlsC,EAAc,EAAGksC,GAAMD,EAAIjsC,GAAa+rC,UAAWG,IAC3DD,EAAIjsC,GAAa6E,OAAQxM,EAAKsuC,WAAWuF,GAAIjlC,QAAS,EACrD5O,EAAKsuC,WAAWuF,GAAIjlC,QAAS,MAIlC6kC,EADEnY,EAAK,KAELsY,EAAIjsC,GAAa6E,YACZ8uB,EAAKsY,EAAIjsC,GAAaosC,OAAO,CAClCN,EAAK/rC,EAAW4zB,EAAK,MAChB,IAAIuY,EAAKlsC,EAAaksC,GAAMD,EAAIjsC,GAAa+rC,UAAWG,OAEzD7zC,EAAKwU,SAASM,QAAQ2+B,IACtBzzC,EAAKwU,SAASM,QAAQ2+B,GAAII,GAAI/nC,OAC7B9L,EAAKwU,SAASM,QAAQ2+B,GAAII,GAAIrnC,WAG7B,IAAIynC,EAAKJ,EAAK,EACdI,GAAMj0C,EAAKwU,SAASM,QAAQ2+B,GAAII,GAAIH,UACpCO,IAEAj0C,EAAKsuC,WAAW2F,GAAIrlC,QAAS,EAGnC0sB,OAMRt7B,EAAKs0C,qBAAuB,8BACJptC,IAAlBlH,EAAKiQ,aACLjQ,EAAKE,WAAWgL,QAAQpF,OAAS,GAAK9F,EAAKiQ,SAASnK,OAAS,EAAG,CAClE9F,EAAKwU,SAASnC,KAAO1R,MAAMX,EAAKiQ,SAASnK,QACtCoD,OACA0I,IAAI,SAACpB,EAAG2F,iCAAW,CAAEA,MAAOA,gBAC/BnW,EAAKwU,SAASiU,gBAAkBzoB,EAAKE,WAAWuoB,sBAC5C8rB,GAAiB,+BACNv0C,EAAKE,WAAWgL,wCAAS,KAA/BspC,aACHx0C,EAAKwU,SAASnC,KAAKvM,QAAU0uC,EAAGx+B,IAAK,CACvCu+B,GAAiB,YAId,IAAId,EAAKe,EAAGC,MAAOhB,GAAMe,EAAGx+B,IAAKy9B,IAChCA,GAAMe,EAAGC,OACXz0C,EAAKwU,SAASnC,KAAKohC,GAAI3nC,MAAO,EAC9B9L,EAAKwU,SAASnC,KAAKohC,GAAIC,UAAYc,EAAGx+B,IACtChW,EAAKwU,SAASnC,KAAKohC,GAAIjnC,QAAS,EAC3BxM,EAAKwU,SAASnC,KAAKohC,GAAItoC,cAC1BnL,EAAKwU,SAASnC,KAAKohC,GAAItoC,YAAc,KAEvCnL,EAAKwU,SAASnC,KAAKohC,GAAIh/B,MAAO,EAC9BzU,EAAKwU,SAASnC,KAAKohC,GAAIiB,YAAcF,EAAGC,MACpCz0C,EAAKwU,SAASnC,KAAKohC,IAAOzzC,EAAKwU,SAASnC,KAAKohC,GAAItoC,YACnDnL,EAAKwU,SAASnC,KAAKohC,GAAItoC,aAAe,EACnCnL,EAAKwU,SAASnC,KAAKohC,GAAItoC,YAAc,kCAI5CopC,IAAgBv0C,EAAKwU,SAASnC,KAAO,OAEvCrS,EAAKE,WAAWy0C,WAAW7uC,OAAS,GAAK9F,EAAKiQ,SAASnK,OAAS,EAAG,CACrE9F,EAAKwU,SAAS+5B,wBACZvuC,EAAKE,WAAWquC,wBAClBvuC,EAAKwU,SAASg6B,sBACZxuC,EAAKE,WAAWsuC,4BACdoG,EAAmBlsC,OAAOC,KAAK3I,EAAKiQ,SAAS,IAAInK,OACjD+uC,GAAoB,+BACT70C,EAAKE,WAAWy0C,2CAAY,KAAlCG,aACHF,GAAoBE,EAAG9+B,IAAK,CAC9B6+B,GAAoB,QAIjB70C,EAAKwU,SAASM,QAAQggC,EAAGh2B,OAC5B9e,EAAKwU,SAASM,QAAQggC,EAAGh2B,KAAOne,MAAMi0C,GACnC1rC,OACA0I,IAAI,SAACpB,EAAG2F,iCAAW,CAAEA,MAAOA,qBAE5B,IAAIzS,EAAIoxC,EAAGL,MAAO/wC,GAAKoxC,EAAG9+B,IAAKtS,IAAK,KACjCkwC,EAAM5zC,EAAKwU,SAASM,QAAQggC,EAAGh2B,KAAKpb,GACtCA,GAAKoxC,EAAGL,QACVb,EAAI9nC,MAAO,EACX8nC,EAAIF,UAAYoB,EAAG9+B,IACnB49B,EAAI9tC,OAASgvC,EAAG9+B,IAAM8+B,EAAGL,MACzBb,EAAIpnC,QAAS,EACTsoC,EAAGf,MAAOH,EAAIG,MAAQe,EAAGf,MACxBH,EAAIG,MAAQ,mCAIvB/zC,EAAKwU,SAAS85B,WAAa3tC,MAAMi0C,GAC9B1rC,OACA0I,KAAI,iBACI,CAAEhD,QAAQ,MAEjBimC,IAAmB70C,EAAKwU,SAASM,QAAU,IAEjD9U,EAAKwU,SAASi6B,OAAS,CACrBp8B,KAAMrS,EAAKwU,SAASnC,KACpByC,QAAS9U,EAAKwU,SAASM,WAI3B9U,EAAK+0C,WAAa,kBACT/0C,EAAKg1C,WAAah1C,EAAKg1C,WAAWC,KAAOj1C,EAAK4F,YAEvD5F,EAAKk1C,YAAc,SAAUC,UACpBA,EAAU30C,QAAQ,cAAe,KAE1CR,EAAKo1C,cAAgB,SAAUD,UACtBE,WAAWF,EAAW,KAE/Bn1C,EAAKs1C,gBAAkB,SAAUtxB,MAC3B,OAAO1gB,KAAK0gB,UACdhkB,EAAKsC,MAAM0hB,EAAM,UAAYhkB,EAAKo1C,cAAcp1C,EAAKsC,MAAM0hB,SAC3DhkB,EAAKsC,MAAM0hB,EAAM,QAAUhkB,EAAKk1C,YAAYl1C,EAAKsC,MAAM0hB,KAK/C,8BAARA,GAC2B,iBAApBhkB,EAAKsC,MAAM0hB,KAElBhkB,EAAKsC,MAAM0hB,GAAOhkB,EAAKsC,MAAM0hB,GAAK8H,MAAM,KAAKla,KAAI,SAAUlO,UAClDR,SAASQ,EAAG,SAIzB1D,EAAKu1C,SAAW,SAAUC,GACnBx1C,EAAK63B,KAAK2d,IAGf9sC,OAAOC,KAAK3I,EAAK63B,KAAK2d,IAAW30C,SAAQ,SAAUmjB,GACjDhkB,EAAKw1C,GAAUxxB,GAAOhkB,EAAK63B,KAAK2d,GAAUxxB,OAG9ChkB,EAAKy1C,iBAAmB,SAAUzxB,UACK,IAAjChkB,EAAK01C,UAAU96B,QAAQoJ,GAClBhkB,EAAKg5B,gBAAgBhV,GAEvBhkB,EAAKsC,MAAM0hB,IAEpBhkB,EAAKkC,iBAAmB,SAAU8hB,EAAKiD,EAAO0uB,OACxCC,GAQkB,IAPpB,CACE,SACA,QACA,YACA,WACA,YACA,YACAh7B,QAAQoJ,IACyB,IAAjChkB,EAAK01C,UAAU96B,QAAQoJ,GACzBhkB,EAAKg5B,gBAAgBhV,GAAOiD,GAExB,IAAI3jB,KAAK0gB,KACXA,EAAMhkB,EAAKM,oBAAoB0jB,IAEjChkB,EAAKsC,MAAM0hB,GAAOiD,EAClBjnB,EAAKs1C,gBAAgBtxB,IAEnB4xB,GACF51C,EAAKqC,SAEFszC,IACH31C,EAAK6I,MAAK,GACV7I,EAAKmC,cAAc,eAAgB,CAAE+C,KAAM,QAAS+hB,MAAOA,MAG/DjnB,EAAKmzC,mBAAqB,cACpBnzC,EAAKE,WAAWgF,MAAQlF,EAAKE,WAAWiqB,eAAgB,KAExDnqB,EAAKozC,eAAiB7C,aAAasF,QACjC71C,EAAKguC,YAAc,IAAMhuC,EAAKE,WAAWgF,MAE3C,MAAOvC,GACPuoB,QAAQC,KAAK,gCAAkCxoB,EAAEmzC,SACjD91C,EAAKozC,oBAAiBlsC,KAEpBlH,EAAKozC,mBAELpzC,EAAKozC,eAAiB3wC,KAAKC,MAAM1C,EAAKozC,gBACtC,MAAOzwC,GACPuoB,QAAQC,KAAK,0CAA2CxoB,GACxD3C,EAAKozC,oBAAiBlsC,EAGtBlH,EAAKozC,iBAEgC,WAArCC,QAAOrzC,EAAKozC,eAAer8B,QACG,OAA9B/W,EAAKozC,eAAer8B,QAEpB/W,EAAK+W,MAAM1E,KAAOrS,EAAKozC,eAAer8B,MAAM1E,KAC5CrS,EAAK+W,MAAMjC,QAAU9U,EAAKozC,eAAer8B,MAAMjC,SAC9C,QAAS,UAAW,QAAQjU,SAAQ,SAAU6C,GACxC1D,EAAK+W,MAAMrT,KACd1D,EAAK+W,MAAMrT,GAAK,QAIwB,WAA1C2vC,QAAOrzC,EAAKozC,eAAe9C,aAC7BtwC,EAAKuO,YAAY1N,SAAQ,SAAU41B,GAE/Bz2B,EAAKozC,eAAe9C,iBAC4BppC,IAAhDlH,EAAKozC,eAAe9C,WAAW7Z,EAAOvxB,QAEtCuxB,EAAO7nB,QAAU5O,EAAKozC,eAAe9C,WAAW7Z,EAAOvxB,aAOnElF,EAAK+1C,KAAO,eACN/1C,EAAKg2C,iBAQLC,EAAqB,UACzBj2C,EAAK0yC,gBACL1yC,EAAK2yC,WACL3yC,EAAKk2C,gBACLl2C,EAAKm2C,SACLn2C,EAAKknB,SAAW,kBAChBlnB,EAAKo2C,GAAK,UAAU9yC,KAAK7B,OAAO40C,UAAUC,WAC1Ct2C,EAAKu2C,KAAO,OAAOjzC,KAAK7B,OAAO40C,UAAUC,WACzCt2C,EAAKw2C,OAAS,SAASlzC,KAAK7B,OAAO40C,UAAUC,WAC7Ct2C,EAAKy2C,IAAM,QAAQnzC,KAAK7B,OAAO40C,UAAUC,WACzCt2C,EAAKgZ,OAAS,UAAU1V,KAAK7B,OAAO40C,UAAUC,WAC9Ct2C,EAAK02C,YAAc,MAACxvC,EAAW,KAAM,IACrClH,EAAKg7B,WAAa,OAClBh7B,EAAK22C,cAAgB,WACrB32C,EAAKg7B,WAAah7B,EAAKw2C,OAAS,eAAiBx2C,EAAKg7B,WACtDh7B,EAAK22C,cAAgB32C,EAAKy2C,IAAM,mBAAqBz2C,EAAK42C,eAC1D52C,EAAKwjB,oBAAsB,CAAEvc,EAAG,EAAGc,EAAG,GACtCW,OAAOC,KAAK3I,EAAKsC,OAAOzB,QAAQb,EAAKs1C,iBACrCt1C,EAAKsB,KAAK4/B,cAAgBlhC,EAAKkhC,cAC/BlhC,EAAKsB,KAAKshC,mBAAqB5iC,EAAK4iC,mBACpC5iC,EAAKsB,KAAK8H,OAASpJ,EAAKoJ,OACxBpJ,EAAKsB,KAAK0D,iBAAmBhF,EAAKgF,iBAClChF,EAAKsB,KAAKm0B,oBAAsBz1B,EAAKy1B,oBACrCz1B,EAAKsB,KAAKa,cAAgBnC,EAAKmC,cAO/BnC,EAAKsB,KAAKuxC,QAAU7yC,EAAK6yC,QAQzB7yC,EAAKsB,KAAKu1C,SAAW72C,EAAK62C,SAC1B72C,EAAKsB,KAAKi/B,sBAAwBvgC,EAAKugC,sBACvCvgC,EAAKsB,KAAK+sC,QAAUruC,EAAKquC,QACzBruC,EAAKsB,KAAKotC,QAAU1uC,EAAK0uC,QACzB1uC,EAAKsB,KAAKuiC,SAAW7jC,EAAK6jC,SAC1B7jC,EAAKsB,KAAKohC,YAAc1iC,EAAK0iC,YAC7B1iC,EAAKsB,KAAK87B,QAAUp9B,EAAKo9B,QACzBp9B,EAAKsB,KAAKw8B,cAAgB99B,EAAK89B,cAC/B99B,EAAKsB,KAAKsjC,oBAAsB5kC,EAAK4kC,oBACrC5kC,EAAKsB,KAAKiiC,eAAiBvjC,EAAKujC,eAChCvjC,EAAKsB,KAAKw1C,eAAiB92C,EAAK82C,eAChC92C,EAAKsB,KAAKy1C,SAAW/2C,EAAK+2C,SAC1B/2C,EAAKsB,KAAK01C,QAAUh3C,EAAKg3C,QACzBh3C,EAAKsB,KAAK21C,UAAYj3C,EAAKi3C,UAC3Bj3C,EAAKsB,KAAK41C,uBAAyBl3C,EAAKk3C,uBACxCl3C,EAAKsB,KAAK61C,uBAAyBn3C,EAAKm3C,uBACxCn3C,EAAKsB,KAAKgwC,gBAAkBtxC,EAAKsxC,gBACjCtxC,EAAKsB,KAAK81C,qBAAuBp3C,EAAKo3C,qBACtCp3C,EAAKsB,KAAK+1C,iBAAmBr3C,EAAKq3C,iBAClCr3C,EAAKsB,KAAKsiC,kBAAoB5jC,EAAK4jC,kBACnC5jC,EAAKsB,KAAKsxC,wBAA0B5yC,EAAK4yC,wBACzC5yC,EAAKsB,KAAKoqC,mBAAqB1rC,EAAK0rC,mBACpC1rC,EAAKsB,KAAKqX,UAAY3Y,EAAK2Y,UAC3B3Y,EAAKsB,KAAKg2C,aAAet3C,EAAKs3C,aAC9Bt3C,EAAKsB,KAAKi2C,UAAYv3C,EAAKu3C,UAC3Bv3C,EAAKsB,KAAKk2C,mBAAqBx3C,EAAKw3C,mBACpCx3C,EAAKsB,KAAKm2C,gBAAkBz3C,EAAKy3C,gBACjCz3C,EAAKsB,KAAKo2C,mBAAqB13C,EAAK03C,mBACpC13C,EAAKsB,KAAKq2C,gBAAkB33C,EAAK23C,gBACjC33C,EAAKsB,KAAKs2C,yBAA2B53C,EAAK43C,yBAC1C53C,EAAKsB,KAAKu2C,sBAAwB73C,EAAK63C,sBACvC73C,EAAKsB,KAAKw2C,cAAgB93C,EAAK83C,cAC/B93C,EAAKsB,KAAKy2C,aAAe/3C,EAAK+3C,aAC9B/3C,EAAKsB,KAAK02C,gBAAkBh4C,EAAKg4C,gBACjCh4C,EAAKsB,KAAK8U,MAAQpW,EAAKoW,MACvBpW,EAAKsB,KAAKuH,KAAO7I,EAAK6I,KACtB7I,EAAKsB,KAAKm8B,QAAUz9B,EAAKy9B,QACzBz9B,EAAKsB,KAAKC,YAAcvB,EAAKuB,YAC7BvB,EAAKsB,KAAKm7B,WAAaz8B,EAAKy8B,WAC5Bz8B,EAAKsB,KAAK22C,YAAcj4C,EAAKi4C,YAC7Bj4C,EAAKsB,KAAK42C,kBAAoBl4C,EAAKk4C,kBACnCl4C,EAAKsB,KAAK62C,UAAYn4C,EAAKm4C,UAC3Bn4C,EAAKsB,KAAKk7B,UAAYx8B,EAAKw8B,UAC3Bx8B,EAAKsB,KAAK8N,WAAapP,EAAKoP,WAC5BpP,EAAKsB,KAAK68B,WAAan+B,EAAKm+B,WAC5Bn+B,EAAKsB,KAAK82C,WAAap4C,EAAKo4C,WAC5Bp4C,EAAKsB,KAAK+2C,aAAer4C,EAAKq4C,aAC9Br4C,EAAKsB,KAAKM,OAAS5B,EAAK4B,OACxB5B,EAAKsB,KAAKwc,QAAU9d,EAAKqI,IACzBrI,EAAKsB,KAAKg3C,UAAYt4C,EAAKs4C,UAC3Bt4C,EAAKsB,KAAKi3C,UAAYv4C,EAAKu4C,UAC3Bv4C,EAAKsB,KAAKk3C,OAASx4C,EAAKw4C,OACxBx4C,EAAKsB,KAAKm3C,aAAez4C,EAAKy4C,aAC9Bz4C,EAAKsB,KAAKo3C,aAAe14C,EAAK04C,aAC9B14C,EAAKsB,KAAKq3C,UAAY34C,EAAK24C,UAC3B34C,EAAKsB,KAAKonC,gBAAkB1oC,EAAK0oC,gBACjC1oC,EAAKsB,KAAKs3C,aAAe54C,EAAK44C,aAC9B54C,EAAKsB,KAAKu3C,eAAiB74C,EAAK64C,eAChC74C,EAAKsB,KAAKw3C,kBAAoB94C,EAAK84C,kBACnC94C,EAAKsB,KAAKy3C,gBAAkB/4C,EAAK+4C,gBACjC/4C,EAAKsB,KAAKe,OAASrC,EAAKqC,OACxBrC,EAAKsB,KAAK8+B,aAAepgC,EAAKogC,aAC9BpgC,EAAKsB,KAAKk7B,UAAYx8B,EAAKw8B,UAC3Bx8B,EAAKsB,KAAKy8B,UAAY/9B,EAAK+9B,UAC3B/9B,EAAKsB,KAAKqhC,WAAa3iC,EAAK2iC,WAC5B3iC,EAAKsB,KAAK6wC,eAAiBnyC,EAAKmyC,eAChCnyC,EAAKsB,KAAK03C,cAAgBh5C,EAAKg5C,cAC/Bh5C,EAAKsB,KAAK23C,uBAAyBj5C,EAAKi5C,uBACxCj5C,EAAKsB,KAAK43C,eAAiBl5C,EAAKk5C,eAChCl5C,EAAKsB,KAAKknC,KAAOxoC,EAAKwoC,KACtBxoC,EAAKsB,KAAK+mC,IAAMroC,EAAKqoC,IACrBroC,EAAKsB,KAAKomC,MAAQ1nC,EAAK0nC,MACvB1nC,EAAKsB,KAAKY,iBAAmBlC,EAAKkC,iBAClClC,EAAKsB,KAAK63C,YAAcn5C,EAAKm5C,YAC7Bn5C,EAAKsB,KAAK+7B,cAAgBr9B,EAAKq9B,cAC/Br9B,EAAKsB,KAAK83C,SAAWp5C,EAAKo5C,SAC1Bp5C,EAAKsB,KAAKg8B,WAAat9B,EAAKs9B,WAC5B50B,OAAO8oB,eAAexxB,EAAKsB,KAAM,WAAY,CAC3CowB,IAAK,iBACI,CACLvxB,OAAQH,EAAKC,SAASE,OAAO6hB,QAAO,SAAUhQ,EAAGtO,UAC/CsO,EAAEtO,EAAE,IAAMA,EAAE,GACLsO,IACN,IACH9R,WAAYF,EAAKC,SAASC,WAAW8hB,QAAO,SAAUhQ,EAAGtO,UACvDsO,EAAEtO,EAAE,IAAMA,EAAE,GACLsO,IACN,QAIThS,EAAK01C,UAAYhtC,OAAOC,KAAK3I,EAAKsB,KAAKrB,SAASE,QAChDH,EAAK01C,UACF9jC,KAAI,SAAUlO,UACN1D,EAAKiB,kBAAkByC,GAAG,MAElC7C,QAAQw4C,GACXr5C,EAAK01C,UACF9jC,KAAI,SAAUlO,UACN1D,EAAKiB,kBAAkByC,GAAG,MAElC7C,QAAQw4C,GACXr5C,EAAKs5C,UAAY73C,OAAOC,iBAAiByE,SAASkmC,KAAM,MACxDrsC,EAAK01C,UAAUxjB,OAAOxpB,OAAOC,KAAK3I,EAAKs5C,YAAYz4C,SAAQ,SAAUmjB,GAEnEiyB,EAAmBjyB,QAAO9c,EAC1BwB,OAAO8oB,eAAeykB,EAAoBjyB,EAAK,CAC7C0N,IAAK,kBACI1xB,EAAKy1C,iBAAiBzxB,IAE/Bu1B,IAAK,SAAUtyB,GACTjnB,EAAKg2C,cACPh2C,EAAK+4B,oBAAoB/U,GAAOiD,GAElCjnB,EAAKkC,iBAAiB8hB,EAAKiD,SAIjCve,OAAO8oB,eAAexxB,EAAKsB,KAAM,aAAc,CAC7CowB,IAAK,kBACI1xB,EAAKg1C,cAGhBtsC,OAAO8oB,eAAexxB,EAAKsB,KAAM,aAAc,CAC7CowB,IAAK,kBACI1xB,EAAKoV,cAGhB1M,OAAO8oB,eAAexxB,EAAKsB,KAAM,WAAY,CAC3CowB,IAAK,kBACI1xB,EAAK4jB,YAGhBlb,OAAO8oB,eAAexxB,EAAKsB,KAAM,mBAAoB,CACnDowB,IAAK,kBACI1xB,EAAK2W,sBAGhBjO,OAAO8oB,eAAexxB,EAAKsB,KAAM,QAAS,CACxCowB,IAAK,kBACIukB,GAETsD,IAAK,SAAUC,GACb9wC,OAAOC,KAAK6wC,GAAa34C,SAAQ,SAAUmjB,GACzChkB,EAAKkC,iBAAiB8hB,EAAKw1B,EAAYx1B,IAAM,MAE/ChkB,EAAK6I,MAAK,GACV7I,EAAKmC,cAAc,eAAgB,CACjC+C,KAAM,QACN+hB,MAAOuyB,OAIb9wC,OAAO8oB,eAAexxB,EAAKsB,KAAM,aAAc,CAAE2lB,MAAO,KACxDve,OAAOC,KAAK3I,EAAKE,YAAYW,SAAQ,SAAUmjB,GAC7Ctb,OAAO8oB,eAAexxB,EAAKsB,KAAKpB,WAAY8jB,EAAK,CAC/C0N,IAAK,kBACI1xB,EAAKE,WAAW8jB,IAEzBu1B,IAAK,SAAUtyB,GACbjnB,EAAKE,WAAW8jB,GAAOiD,EACX,SAARjD,GACFhkB,EAAKkzC,wBAGG,YAARlvB,GACQ,eAARA,GACQ,0BAARA,GAEAhkB,EAAKs0C,uBAEPt0C,EAAK6I,MAAK,GACV7I,EAAKmC,cAAc,mBAAoB,CACrC+C,KAAM8e,EACNiD,MAAOA,EAAMjD,WAKrBhkB,EAAKquC,QAAQ9qC,OAAS,SAAU0jB,EAAOwyB,MACjCA,IAAcz5C,EAAKE,WAAWw5C,kBACzB15C,EAAK02C,YAAYxwB,SACb,MAATe,EAAgBA,EAAQ+M,OAAO/M,GAAOgN,QAI1ChN,EAAQ+M,OAAO/M,OACX0yB,EAEFC,EADS,cACQC,KAAKJ,GACtBK,EAAQF,EAAUA,EAAQ,GAAGG,UAAU,GAAK,GAC5CC,EAAaF,EAAMh0C,UACrB9F,EAAKi6C,wBAAqB/yC,EACQ,MAA9BuyC,EAAUM,UAAU,EAAG,IAAcH,EAAS,KAE9CD,EAAe,IAAIO,OACjBT,EAAUM,UAAU,EAAGN,EAAU3zC,QAAUk0C,EAAa,IACxDF,GAEF,MAAOn3C,eACP3C,EAAKi6C,mBAAqBt3C,UAGrBg3C,EAAar2C,KAAK2jB,WAEpBA,EAAMxf,WAIsC,IAH/Cwf,EACGxf,WACA0yC,oBACAv/B,QAAQ6+B,EAAUU,sBAG3Bn6C,EAAKquC,QAAQtrC,OAAS,SAAUkkB,EAAOwyB,UACjCA,IAAcz5C,EAAKE,WAAWw5C,WACzB15C,EAAK02C,YAAYxwB,SACb,MAATe,EAAgBA,EAAQ+M,OAAO/M,GAAOgN,SAIrCwlB,GAGExyB,IAAUwyB,IAElB,aAAc,UAAW,WAAW54C,QAAQb,EAAKu1C,UAClDv1C,EAAKoB,qBAAoB,EAAOpB,EAAKsB,MACrCtB,EAAKmzC,qBACDnzC,EAAK63B,KAAKt1B,OACZvC,EAAKsB,KAAKiB,KAAOvC,EAAK63B,KAAKt1B,OAEzBvC,EAAKsB,KAAKyyB,WAAa/zB,EAAKsB,KAAK84C,eACR,kCAAvBp6C,EAAKsB,KAAKsD,WACZ5E,EAAKsB,KAAKsD,SAAW,sCAEvB5E,EAAKsB,KAAKiB,KAAOvC,EAAKsB,KAAKyyB,WAAa/zB,EAAKsB,KAAK84C,aAEhDp6C,EAAK63B,KAAKh1B,SACZ7C,EAAKsB,KAAKuB,OAAS7C,EAAK63B,KAAKh1B,QAE3B7C,EAAKmP,cAAgBnP,EAAKuB,YAC5Ba,uBAAsB,WACpBpC,EAAKqC,QAAO,MAGdrC,EAAKqC,QAAO,GAEdrC,EAAKg2C,aAAc,EACZh2C,WAlSEq5C,EAAwBr1B,IACM,IAAjChkB,EAAK01C,UAAU96B,QAAQoJ,IACzBhkB,EAAK01C,UAAU7xC,KAAKmgB,KAwS1BhkB,EAAKsB,KAAK+4C,KAAO,SAAU13C,GACzB3C,EAAK4jB,UAAW,GAQlB5jB,EAAKsB,KAAK2gC,MAAQ,WAChBjiC,EAAK4jB,UAAW,EAChB5jB,EAAKgiC,aAAaC,UAEhBjiC,EAAKg1C,YAAch1C,EAAKmP,eAC1BzG,OAAO8oB,eAAexxB,EAAKsB,KAAM,SAAU,CACzCowB,IAAK,kBACC1xB,EAAKg1C,WACAh1C,EAAKg1C,WAAW9sC,OAElBlI,EAAK4F,WAAWsC,QAEzBqxC,IAAK,SAAUtyB,GACTjnB,EAAKg1C,WACPh1C,EAAKg1C,WAAW9sC,OAAS+e,EAEzBjnB,EAAK4F,WAAWsC,OAAS+e,EAE3BjnB,EAAKqC,QAAO,MAGhBqG,OAAO8oB,eAAexxB,EAAKsB,KAAM,QAAS,CACxCowB,IAAK,kBACC1xB,EAAKg1C,WACAh1C,EAAKg1C,WAAW7sC,MAElBnI,EAAK4F,WAAWuC,OAEzBoxC,IAAK,SAAUtyB,GACTjnB,EAAKg1C,WACPh1C,EAAKg1C,WAAW7sC,MAAQ8e,EAExBjnB,EAAK4F,WAAWuC,MAAQ8e,EAE1BjnB,EAAKqC,QAAO,MAGhBqG,OAAO8oB,eAAexxB,EAAKsB,KAAM,aAAc,CAC7CowB,IAAK,kBACI1xB,EAAK4F,YAEd2zC,IAAK,SAAUtyB,OACRjnB,EAAKmP,kBACF,IAAImrC,UACR,0DAGJt6C,EAAK4F,WAAaqhB,MAIxBve,OAAO8oB,eAAexxB,EAAKsB,KAAM,oBAAqB,CACpDowB,IAAK,kBACI1xB,EAAKmS,qBAGhBzJ,OAAO8oB,eAAexxB,EAAKsB,KAAM,eAAgB,CAC/CowB,IAAK,kBACI1xB,EAAKgX,gBAGhBtO,OAAO8oB,eAAexxB,EAAKsB,KAAM,aAAc,CAC7CowB,IAAK,kBACIhpB,OAAOC,KAAK3I,EAAKkqB,YAAYtY,KAAI,SAAU2W,UACzCvoB,EAAKkqB,WAAW3B,SAI7B7f,OAAO8oB,eAAexxB,EAAKsB,KAAM,cAAe,CAC9CowB,IAAK,kBACI1xB,EAAKmP,eAGhBzG,OAAO8oB,eAAexxB,EAAM,SAAU,CACpC0xB,IAAK,kBACI1xB,EAAKg5B,gBAAgBmC,QAE9Boe,IAAK,SAAUtyB,GACC,SAAVA,IACFA,EAAQ,WAENjnB,EAAKu6C,gBAAkBtzB,IACzBjnB,EAAKg5B,gBAAgBmC,OAASlU,EAC9BjnB,EAAKu6C,cAAgBtzB,MAI3Bve,OAAO8oB,eAAexxB,EAAKsB,KAAM,iBAAkB,CACjDowB,IAAK,kBACI1xB,EAAK+qB,gBAEdwuB,IAAK,SAAUtyB,GACC,SAAVA,IACFA,EAAQ,OAEVjnB,EAAK+qB,eAAiB9D,EACtBjnB,EAAKoW,MAAMpW,EAAKuqB,QAASvqB,EAAK+qB,mBAGlCriB,OAAO8oB,eAAexxB,EAAKsB,KAAM,UAAW,CAC1CowB,IAAK,kBACI1xB,EAAKuqB,SAEdgvB,IAAK,SAAUtyB,WAIJ/f,IAFPlH,EAAKuO,YAAY4gB,MAAK,SAAUjP,UACvBA,EAAIhb,OAAS+hB,WAGhB,IAAIrkB,MAAM,uCAElB5C,EAAKuqB,QAAUtD,EACfjnB,EAAKoW,MAAMpW,EAAKuqB,QAASvqB,EAAK+qB,mBAG9B/qB,EAAKuB,cACPmH,OAAO8oB,eAAexxB,EAAKsB,KAAM,eAAgB,CAC/CowB,IAAK,kBACI1xB,EAAK4B,OAAOmmB,gBAGvBrf,OAAO8oB,eAAexxB,EAAKsB,KAAM,cAAe,CAC9CowB,IAAK,kBACI1xB,EAAK4B,OAAOkmB,gBAIzBpf,OAAO8oB,eAAexxB,EAAKsB,KAAM,eAAgB,CAC/CowB,IAAK,kBACI1xB,EAAKqT,UAAUoK,gBAG1B/U,OAAO8oB,eAAexxB,EAAKsB,KAAM,cAAe,CAC9CowB,IAAK,kBACI1xB,EAAKqT,UAAUgK,eAG1B3U,OAAO8oB,eAAexxB,EAAKsB,KAAM,YAAa,CAC5CowB,IAAK,kBACI1xB,EAAKqT,UAAUc,WAExBolC,IAAK,SAAUtyB,GACbjnB,EAAKqT,UAAUc,UAAY8S,KAG/Bve,OAAO8oB,eAAexxB,EAAKsB,KAAM,aAAc,CAC7CowB,IAAK,kBACI1xB,EAAKqT,UAAUC,YAExBimC,IAAK,SAAUtyB,GACbjnB,EAAKqT,UAAUC,WAAa2T,KAGhCve,OAAO8oB,eAAexxB,EAAKsB,KAAM,QAAS,CACxCowB,IAAK,kBACI1xB,EAAK+W,SAGhBrO,OAAO8oB,eAAexxB,EAAKsB,KAAM,gBAAiB,CAChDowB,IAAK,kBACI1xB,EAAKkE,iBAGhBwE,OAAO8oB,eAAexxB,EAAKsB,KAAM,QAAS,CACxCowB,IAAK,kBACI1xB,EAAKu5B,SAGhB7wB,OAAO8oB,eAAexxB,EAAKsB,KAAM,eAAgB,CAC/CowB,IAAK,kBACI1xB,EAAKgiC,gBAGhBt5B,OAAO8oB,eAAexxB,EAAKsB,KAAM,cAAe,CAC9CowB,IAAK,kBACI1xB,EAAKyQ,eAGhB/H,OAAO8oB,eAAexxB,EAAKsB,KAAM,eAAgB,CAC/CowB,IAAK,kBACI1xB,EAAKyS,gBAGhB/J,OAAO8oB,eAAexxB,EAAKsB,KAAM,cAAe,CAC9CowB,IAAK,kBACI1xB,EAAKwS,eAGhB9J,OAAO8oB,eAAexxB,EAAKsB,KAAM,aAAc,CAC7CowB,IAAK,kBACI1xB,EAAKua,cAGhB7R,OAAO8oB,eAAexxB,EAAKsB,KAAM,WAAY,CAC3CowB,IAAK,kBACI1xB,EAAK+X,YAGhBrP,OAAO8oB,eAAexxB,EAAKsB,KAAM,UAAW,CAC1CowB,IAAK,kBACI1xB,EAAK6uC,WAGhB7uC,EAAKsB,KAAKulB,WAAa7mB,EAAK6mB,WAC5Bne,OAAO8oB,eAAexxB,EAAKsB,KAAM,WAAY,CAC3CowB,IAAK,kBACI1xB,EAAK4E,UAEd20C,IAAK,SAAUtyB,OACRjnB,EAAK2uC,QAAQ1nB,SACV,IAAIrkB,MAAM,2BAA6BqkB,GAE/CjnB,EAAK4E,SAAWqiB,KAGpBjnB,EAAK+uC,WAAWluC,SAAQ,SAAU25C,GAChC9xC,OAAO8oB,eAAexxB,EAAKsB,KAAM,KAAOk5C,EAAW,CACjD9oB,IAAK,kBACI1xB,EAAK8uC,kBAAkB0L,IAEhCjB,IAAK,SAAUtyB,GACbjnB,EAAKw1B,OAAOglB,GAAa,GACzBx6C,EAAK8uC,kBAAkB0L,GAAavzB,EAC/BA,GAGLjnB,EAAKgF,iBAAiBw1C,EAAWvzB,SAIvCve,OAAO8oB,eAAexxB,EAAKsB,KAAM,YAAa,CAC5CowB,IAAK,kBACI1xB,EAAKoT,WAEdmmC,IAAK,SAAUv3C,MACTmB,MAAMnB,SACF,IAAIs4C,UAAU,mDAElBt6C,EAAKwS,YAAY1M,OAAS9D,QACtB,IAAIy4C,WACR,8DAGJz6C,EAAKoT,UAAYpR,KAGrB0G,OAAO8oB,eAAexxB,EAAKsB,KAAM,eAAgB,CAC/CowB,IAAK,kBACI1xB,EAAKyO,cAEd8qC,IAAK,SAAUv3C,MACTmB,MAAMnB,SACF,IAAIs4C,UAAU,mDAElBt6C,EAAKonC,mBAAmBthC,OAAS9D,QAC7B,IAAIy4C,WACR,iEAGJz6C,EAAKyO,aAAezM,KAGxB0G,OAAO8oB,eAAexxB,EAAKsB,KAAM,kBAAmB,CAClDowB,IAAK,iBACI,CACLtQ,IAAKphB,EAAKqU,eACVkM,MAAOvgB,EAAKoxB,iBACZ/P,OAAQrhB,EAAKsU,kBACbgM,KAAMtgB,EAAK4U,oBAIjBlM,OAAO8oB,eAAexxB,EAAKsB,KAAM,kBAAmB,CAClDowB,IAAK,iBACI,CACLtQ,IAAKphB,EAAKoU,eACVmM,MAAOvgB,EAAKqxB,iBACZhQ,OAAQrhB,EAAKuU,kBACb+L,KAAMtgB,EAAKuT,oBAIjB7K,OAAO8oB,eAAexxB,EAAKsB,KAAM,WAAY,CAC3CowB,IAAK,kBACI1xB,EAAKoS,OAAOC,MAErBknC,IAAK,SAAUv3C,OACRrB,MAAM+5C,QAAQ14C,SACX,IAAIs4C,UAAU,+BAEjBt6C,EAAKyW,cAAgBzU,EAAI8D,OAAS9F,EAAKyW,aAAa3Q,aACjD,IAAI20C,WACR,iEAGJz6C,EAAKoS,OAAOC,KAAOrQ,KAGvB0G,OAAO8oB,eAAexxB,EAAKsB,KAAM,cAAe,CAC9CowB,IAAK,kBACI1xB,EAAKoS,OAAO0C,SAErBykC,IAAK,SAAUv3C,OACRrB,MAAM+5C,QAAQ14C,SACX,IAAIs4C,UAAU,8BAElBt4C,EAAI8D,OAAS9F,EAAKuO,YAAYzI,aAC1B,IAAI20C,WACR,oEAGJz6C,EAAKoS,OAAO0C,QAAU9S,KAG1B0G,OAAO8oB,eAAexxB,EAAKsB,KAAM,kBAAmB,CAClDowB,IAAK,kBACI1xB,EAAK47B,wBAGhBlzB,OAAO8oB,eAAexxB,EAAKsB,KAAM,eAAgB,CAC/CowB,IAAK,kBACI1xB,EAAKo8B,iBAAgB,MAGhC1zB,OAAO8oB,eAAexxB,EAAKsB,KAAM,gBAAiB,CAChDowB,IAAK,kBACI1xB,EAAKo8B,qBAGhB1zB,OAAO8oB,eAAexxB,EAAKsB,KAAM,gBAAiB,CAChDowB,IAAK,kBACI1xB,EAAKonC,mBAAmBx1B,KAAI,SAAqBsO,UAC/CA,QAIbxX,OAAO8oB,eAAexxB,EAAKsB,KAAM,qBAAsB,CACrDowB,IAAK,kBACI1xB,EAAK+tC,oBAEdwL,IAAK,SAA+BtyB,GAClCjnB,EAAK+tC,mBAAqB9mB,KAG9Bve,OAAO8oB,eAAexxB,EAAKsB,KAAM,qBAAsB,CACrDowB,IAAK,kBACI1xB,EAAK4lB,oBAEd2zB,IAAK,SAA+BtyB,GAClCjnB,EAAK4lB,mBAAqBqB,KAG9Bve,OAAO8oB,eAAexxB,EAAKsB,KAAM,mBAAoB,CACnDowB,IAAK,kBACI1xB,EAAKulC,kBAEdgU,IAAK,SAA6BtyB,GAChCjnB,EAAKulC,iBAAmBte,KAG5Bve,OAAO8oB,eAAexxB,EAAKsB,KAAM,MAAO,CACtCowB,IAAK,kBACI1xB,EAAKqI,OAGhBK,OAAO8oB,eAAexxB,EAAKsB,KAAM,SAAU,CACzCowB,IAAK,kBACI1xB,EAAKuO,aAEdgrC,IAAK,SAAsBtyB,WACX/f,IAAV+f,SAEFjnB,EAAK6C,YAASqE,EACdlH,EAAKsuC,gBAAapnC,OAClBlH,EAAKmC,cAAc,gBAAiB,CAAEU,YAAQqE,QAG3CvG,MAAM+5C,QAAQzzB,IAA8B,WAApBosB,QAAOpsB,EAAM,UAClC,IAAIrkB,MAAM,+CAEIsE,IAAlB+f,EAAM,GAAG/hB,WACL,IAAItC,MACR,uEAGJ5C,EAAK6C,OAASokB,EAAMrV,KAAI,SAA0B6kB,EAAQtgB,UACxDsgB,EAAOtuB,MAAQsuB,EAAOtuB,OAASnI,EAAKsC,MAAM4T,UAC1CugB,EAAO1xB,OAAS0xB,EAAO1xB,QAAU/E,EAAK+E,OAAO0xB,EAAO1wB,MACpD0wB,EAAO1wB,KAAO0wB,EAAO1wB,MAAQ,SAC7B0wB,EAAOtgB,MAAQA,EACfsgB,EAAO9uB,YAAcwO,EACrBsgB,EAAO/uB,UAAY,EACZ+uB,KAETz2B,EAAKsuC,gBAAapnC,EAClBlH,EAAK6wC,mBACL7wC,EAAKywC,qBACLzwC,EAAKkzC,wBAEHlzC,EAAKozC,gBACqC,WAA1CC,QAAOrzC,EAAKozC,eAAe9C,aAE3BtwC,EAAK6C,OAAOhC,SAAQ,SAA8B41B,EAAQtgB,GAEtDnW,EAAKozC,qBAC2ClsC,IAAhDlH,EAAKozC,eAAe9C,WAAW7Z,EAAOvxB,QAEtCuxB,EAAO7nB,QAAU5O,EAAKozC,eAAe9C,WAAW7Z,EAAOvxB,UAI7DlF,EAAKqC,QAAO,GACZrC,EAAKmC,cAAc,gBAAiB,CAAEU,OAAQ7C,EAAK6C,YASvD7C,EAAKsB,KAAKq5C,SAAW,kBACZjyC,OAAOC,KAAK3I,EAAK2uC,UAE1B3uC,EAAK46C,eAAiB,SAAUr4C,OACzBA,GAAQ,OAAOe,KAAKf,SAChB,OAGPA,EAAOE,KAAKC,MAAMH,GAClB,MAAOI,GACPuoB,QAAQC,KACNvoB,MACE,kEACED,EAAEmzC,QADJ,mIAOCvzC,GAETvC,EAAK2uC,QAAQ,sCAAwC,SACnDpsC,EACAs4C,GAEA76C,EAAK2uC,QAAQ,iCACX3uC,EAAK46C,eAAer4C,IACpB,SAAUA,EAAMM,UACPg4C,EAASt4C,EAAMM,OAI5B7C,EAAK2uC,QAAQ,iCAAmC,SAAUpsC,EAAMs4C,UACvDA,EAASt4C,IAElBvC,EAAKsB,KAAKqtC,QAAU3uC,EAAK2uC,QAGzB3uC,EAAK86C,IAAM,SAAUv4C,EAAMs4C,OACpB76C,EAAKsB,KAAKqtC,QAAQ3uC,EAAK4E,gBACpB,IAAIhC,MAAM,0BAElB5C,EAAKsB,KAAKqtC,QAAQ3uC,EAAK4E,UAAUrC,GAAM,SAAUA,EAAMM,GAErD7C,EAAKyW,aAAelU,EACpBvC,EAAKiQ,SAAWtP,MAAMoO,KAAK/O,EAAKyW,cAE5B9V,MAAM+5C,QAAQ73C,KAChB7C,EAAK6C,OAASA,GAGZ7C,EAAKE,WAAW66C,qBAClB/6C,EAAK6C,OAAS7C,EAAKk4C,kBAAkB31C,IAElCvC,EAAK6C,SACR7C,EAAKsuC,WAAatuC,EAAKk4C,kBAAkB31C,IAEvCvC,EAAKuO,aACPvO,EAAKywC,qBAGPzwC,EAAKy9B,UAEAz9B,EAAK6C,QAA+C,KAApC7C,EAAKyW,cAAgB,IAAI3Q,SAC5C9F,EAAKsuC,WAAa,CAAC,CAAEppC,KAAM,MAE7BlF,EAAK4jC,kBAAkB,cAAc,IAElC5jC,EAAKsuC,aAAetuC,EAAK6C,QAC1B7C,EAAKE,WAAW66C,sBAEhB/6C,EAAKywC,qBACLzwC,EAAKmC,cAAc,gBAAiB,CAAEU,OAAQ7C,EAAKsuC,cAErDuM,QAGJnyC,OAAO8oB,eAAexxB,EAAKsB,KAAM,WAAY,CAC3CowB,IAAK,kBACI1xB,EAAKiQ,YAGhBvH,OAAO8oB,eAAexxB,EAAKsB,KAAM,YAAa,CAC5CowB,IAAK,kBACI1xB,EAAKyW,gBAGhB/N,OAAO8oB,eAAexxB,EAAKsB,KAAM,OAAQ,CACvCowB,IAAK,kBACI1xB,EAAKyW,cAEd8iC,IAAK,SAAoBtyB,GACvBjnB,EAAK86C,IAAI7zB,GAAO,WACdjnB,EAAK6uC,QAAU,GACf7uC,EAAK6wC,mBAEH7wC,EAAKE,WAAW86C,mBAChBh7C,EAAKyW,aAAa3Q,OAAS,QACHoB,IAAxBlH,EAAKozC,gBAELpzC,EAAK6jC,WAGP7jC,EAAK4jC,kBAAkB,cAAc,GACrC5jC,EAAKsS,kBACLtS,EAAKkzC,wBACLlzC,EAAKmC,cAAc,cAAe,CAAEI,KAAMvC,EAAKyW,eAC/CzW,EAAKs0C,uBACLt0C,EAAKqC,QAAO,SAIlBrC,EAAKk2C,cAAgB,eACf+E,EAAU,EACZC,EAAS,EACT/mC,EAAY,EACZb,EAAa,EACbmK,EAAe,EACfJ,EAAc,EACdG,EAAkB,GAClBJ,EAAiB,YACV+9B,EAAal0B,EAAOm0B,MACvBj4C,MAAM8jB,SACF,IAAIrkB,MAAM,oCAEdqkB,EAAQ,IACVA,EAAQ,GAENA,EAAQxJ,IACVwJ,EAAQxJ,GAENA,EAAe,IACjBwJ,EAAQ,GAEV9S,EAAY8S,EACPm0B,GACHp7C,EAAK24B,SAEH34B,EAAKuhC,QACPvhC,EAAKq7C,yBAGAC,EAAcr0B,EAAOm0B,MACxBj4C,MAAM8jB,SACF,IAAIrkB,MAAM,qCAEdqkB,EAAQ,IACVA,EAAQ,GAENA,EAAQ5J,IACV4J,EAAQ5J,GAENA,EAAc,IAChB4J,EAAQ,GAEV3T,EAAa2T,EACRm0B,GACHp7C,EAAK24B,SAEH34B,EAAKuhC,QACPvhC,EAAKq7C,gBAGTr7C,EAAKqT,UAAU5L,SAAW,iBAEtB,aACA4V,EAAY4E,QAAQ,GACpB,eACAxE,EAAawE,QAAQ,GACrB,aACA3O,EAAW2O,QAAQ,GACnB,YACA9N,EAAU8N,QAAQ,GAClB,mBACAjiB,EAAKqT,UAAU2kB,cAAc/V,QAAQ,GACrC,oBACAjiB,EAAKqT,UAAU4kB,eAAehW,QAAQ,GACtC,KAGJjiB,EAAKqT,UAAU+wB,SAAW,SAAUn9B,EAAGc,EAAGwzC,GACxCD,EAAcr0C,GAAG,GACjBk0C,EAAapzC,EAAGwzC,IAElB7yC,OAAO8oB,eAAexxB,EAAKqT,UAAW,kBAAmB,CACvDqe,IAAK,kBACIlU,GAET+7B,IAAK,SAAUtyB,GACbzJ,EAAkByJ,KAGtBve,OAAO8oB,eAAexxB,EAAKqT,UAAW,iBAAkB,CACtDqe,IAAK,kBACItU,GAETm8B,IAAK,SAAUtyB,GACb7J,EAAiB6J,KAGrBve,OAAO8oB,eAAexxB,EAAKqT,UAAW,SAAU,CAC9Cqe,IAAK,kBACIupB,GAET1B,IAAK,SAAUtyB,GACbg0B,EAAUh0B,KAGdve,OAAO8oB,eAAexxB,EAAKqT,UAAW,QAAS,CAC7Cqe,IAAK,kBACIwpB,GAET3B,IAAK,SAAUtyB,GACbi0B,EAASj0B,KAGbve,OAAO8oB,eAAexxB,EAAKqT,UAAW,YAAa,CACjDqe,IAAK,kBACIvd,GAETolC,IAAK4B,IAEPzyC,OAAO8oB,eAAexxB,EAAKqT,UAAW,aAAc,CAClDqe,IAAK,kBACIpe,GAETimC,IAAK+B,IAEP5yC,OAAO8oB,eAAexxB,EAAKqT,UAAW,eAAgB,CACpDqe,IAAK,kBACIjU,GAET87B,IAAK,SAAUtyB,GACT9S,EAAY8S,IACd9S,EAAYvM,KAAK0U,IAAI2K,EAAO,IAE9BxJ,EAAewJ,KAGnBve,OAAO8oB,eAAexxB,EAAKqT,UAAW,cAAe,CACnDqe,IAAK,kBACIrU,GAETk8B,IAAK,SAAUtyB,GACT3T,EAAa2T,IACf3T,EAAa1L,KAAK0U,IAAI2K,EAAO,IAE/B5J,EAAc4J,MCp0EP,qBAAUjnB,OACnBw7C,EAAWC,EAAoBC,WAC1BC,EAAsBC,GAC7B57C,EAAK67C,kBACHD,EACA,qCAAuC57C,EAAKgZ,OAAS,UAAY,KAEnE4iC,EAAqB52C,iBAAiB,aAAa,WACjDhF,EAAK67C,kBACHD,EACA,8CAGJA,EAAqB52C,iBAAiB,YAAY,WAChDhF,EAAK67C,kBACHD,EACA,iDAIGE,EAAkB90B,EAAI9Y,EAAK45B,EAAOiU,OAOvCxvC,EAkMIyvC,EACF1tC,EAzMA2tC,EAAY91C,SAAS+1C,cAAc,OACrCC,EAAUh2C,SAAS+1C,cAAc,OACjCE,EAAYj2C,SAAS+1C,cAAc,OACnCG,EAAW,GACXC,GAAiB,EACjBh7C,EAAO,OAEJX,MAAM+5C,QAAQ5S,SACX,IAAIllC,MAAM,gDAwHT25C,IACHN,EAAU9nC,UAAY,EACxBnU,EAAKkE,cAAcE,YAAY+3C,GACtBA,EAAQv2C,YACjBu2C,EAAQv2C,WAAWktC,YAAYqJ,GAG/BF,EAAU9nC,WACR8nC,EAAUx+B,aAAew+B,EAAUl0B,cACrCq0B,EAAUx2C,WAEVw2C,EAAUx2C,WAAWktC,YAAYsJ,GAEjCH,EAAUx+B,aAAew+B,EAAUl0B,aAAe,KAEhDk0B,EAAU9nC,WACV8nC,EAAUx+B,aAAew+B,EAAUl0B,eAGrC/nB,EAAKkE,cAAcE,YAAYg4C,YA8B1BI,EAAiBz2C,UACjB,SAASoI,QACV6D,EAAIhS,EAAKE,WAAWu8C,yBACX,OAAT12C,GAAyC,IAAxBk2C,EAAU9nC,WAGlB,SAATpO,GAAmBk2C,EAAU9nC,YAAc8nC,EAAUx+B,eAGzDw+B,EAAU9nC,WAAsB,OAATpO,GAAiBiM,EAAIA,EAC5CypC,EAAqB/b,WACnBvxB,EACAnO,EAAKE,WAAWw8C,yBAChB32C,cAIG42C,EAAe52C,UACf,WACL00B,aAAaghB,WAsGjBn6C,EAAK8N,WAAapP,EAAKsB,KACvBA,EAAKy6C,kBAAoBA,EACzBz6C,EAAK26C,UAAYA,EApGXD,EAAM,GACR1tC,EAAItO,EAAK48C,aAAa58C,EAAK4B,aACXsF,IAAds0C,IACFA,EAAYx7C,EAAKsC,MAAMu6C,mBAhMzB/U,EAAMjnC,SAAQ,SAAUiE,OAEpBg4C,EADElB,EAAuBz1C,SAAS+1C,cAAc,gBAEzCa,EAAmBp6C,GAExBA,EAAEq6C,gBAAkBf,GACpBn3C,EAAKw0B,YAAY2iB,YAAct5C,EAAEq6C,eACjCF,IAAmBn6C,EAAEq6C,eACrBpB,IAAyBj5C,EAAEq6C,eAC3Bl4C,EAAKw0B,YAAY2iB,UAAUgB,SAASt6C,EAAEq6C,iBAIxCl4C,EAAKw0B,YAAYuZ,UACjBwJ,EAAS3vB,OAAO2vB,EAASzhC,QAAQ9V,EAAKw0B,aAAc,GACpDx0B,EAAKw0B,iBAAcpyB,EACnB00C,EAAqBnmB,oBACnB,WACAsnB,GAEFd,EAAUxmB,oBAAoB,WAAYsnB,GAC1CnB,EAAqBsB,aAAa,cAAe,KACjDtB,EAAqBsB,aAAa,UAAW,eAEtCC,EAAmBrV,MAGyB,MAAjD8T,EAAqBwB,aAAa,YACmB,MAArDxB,EAAqBwB,aAAa,oBAIhCC,EAAOzB,EAAqB9R,wBAChCuT,EAAO,CACL/8B,KACE+8B,EAAK/8B,KACLtgB,EAAKsC,MAAMg7C,2BACXrB,EAAUn0B,YACZ1G,IAAKi8B,EAAKj8B,IAAMphB,EAAKsC,MAAMi7C,0BAC3Bl8B,OAAQg8B,EAAKh8B,OACbd,MAAO88B,EAAK98B,OAEdzb,EAAKw0B,YAAcwiB,EAAkB90B,EAAIq2B,EAAMvV,EAAOxmC,GACtDs6C,EAAqBsB,aAAa,cAAe,KACjDtB,EAAqB52C,iBAAiB,WAAY+3C,GAClDd,EAAUj3C,iBAAiB,WAAY+3C,GACvCV,EAASx4C,KAAKiB,EAAKw0B,uBAEZkkB,QACH95C,EACqD,MAArDk4C,EAAqBwB,aAAa,iBAGtCxB,EAAqBsB,aAAa,UAAW,KACnB,mBAAfp4C,EAAKgjC,MAWhBqV,EAAmBr4C,EAAKgjC,YALZ5gC,KALVxD,EAAIoB,EAAKgjC,MAAMljB,MAAMtjB,EAAM,CACzB,SAAUwmC,GACRqV,EAAmBrV,QAGAnnC,MAAM+5C,QAAQh3C,IACnCy5C,EAAmBz5C,cAMRoB,aACN24C,EAAWC,MACF,OAAZA,QAGmB,mBAAZA,EACFD,EAAWC,EAAQ12B,SAEL,WAAnBqsB,QAAOqK,IAIX/B,EAAsBC,GACtBA,EAAqBz3C,UAAYu5C,GAJ/B9B,EAAqBx3C,YAAYs5C,IAOrCD,CAAW34C,EAAKmR,OAChBnR,EAAK82C,qBAAuBA,GAEzB92C,EAAKgjC,OAAShjC,EAAKgjC,MAAMhiC,OAAS,GACb,mBAAfhB,EAAKgjC,SAEZgV,EAAiB32C,SAAS+1C,cAAc,OACxCl8C,EAAK67C,kBACHiB,EACA,uCAEFA,EAAe34C,UAAYnE,EAAKsC,MAAMq7C,0BACtC/B,EAAqBx3C,YAAY04C,GACjClB,EAAqB52C,iBACnB,YACAw4C,GAEF5B,EAAqB52C,iBAAiB,YAAY,WAChD42C,EAAqBsB,aAAa,UAAW,SAG7Cp4C,EAAKo4B,OACP0e,EAAqB52C,iBAAiB,SAAS,SAAUgiB,GACvDliB,EAAKo4B,MAAMtY,MAAM5kB,EAAM,CAACgnB,OAI9B42B,CAAQ94C,GACRm3C,EAAU73C,YAAYw3C,MAoFxB57C,EAAK67C,kBACHI,EACA,gCAAkCj8C,EAAKgZ,OAAS,UAAY,KAE9DgjC,EAAI/0C,EAAIiH,EAAIoS,KAAOhS,EAAEgS,KACrB07B,EAAIj0C,EAAImG,EAAIkT,IAAM9S,EAAE8S,IACpB46B,EAAI9zC,OAAS,EACbszC,GAAa,EACbS,EAAU35C,MAAMu7C,QAAU,EAC1B5B,EAAU35C,MAAMw7C,SAAW,WAC3B3B,EAAQ75C,MAAMyiB,MAAQ/kB,EAAKsC,MAAMy7C,sBACjC3B,EAAU95C,MAAMyiB,MAAQ/kB,EAAKsC,MAAMy7C,uBAClC5B,EAASC,GAAWv7C,SAAQ,SAAUwF,GACrCA,EAAG/D,MAAMwhB,UAAY,SACrBzd,EAAG/D,MAAMw7C,SAAW,WACpBz3C,EAAG/D,MAAM07C,OAASxC,EAAY,KAEhCS,EAAU35C,MAAM07C,OAASxC,EACrBO,GAAqBA,EAAkBkC,gBACzChC,EAAU35C,MAAM47C,UACdz8C,OAAO08C,YACPnC,EAAIj0C,EACJ/H,EAAKsC,MAAM87C,yBACX,KACFnC,EAAU35C,MAAM+7C,SAAWnwC,EAAI/F,MAAQ,KACvC6zC,EAAIj0C,GAAKmG,EAAIhG,QAEXlI,EAAKgZ,SACPijC,EAAU35C,MAAM6F,MAAQ+F,EAAI/F,MAAQ,MAEtC8zC,EAAU35C,MAAMge,KAAO07B,EAAI/0C,EAAI,KAC/Bg1C,EAAU35C,MAAM8e,IAAM46B,EAAIj0C,EAAI,KAC9Bk0C,EAAUj3C,iBAAiB,SAAUu3C,GACrCN,EAAUj3C,iBAAiB,SAAS,SAAUrC,GACxC3C,EAAK4jB,WACPq4B,EAAU9nC,WAAaxR,EAAEshC,OACzBgY,EAAU3oC,YAAc3Q,EAAEqhC,QAE5BuY,OAEFJ,EAAQh4C,UAAYnE,EAAKsC,MAAMg8C,uBAC/BlC,EAAUj4C,UAAYnE,EAAKsC,MAAMi8C,yBACjCtC,EAAU73C,YAAY+3C,GACtBh2C,SAASkmC,KAAKjoC,YAAYg4C,GAC1Bj2C,SAASkmC,KAAKjoC,YAAY63C,YArFZpoB,OACVgqB,EAAU,GACdhqB,EAAQvxB,MAAMk8C,QAAU,YACpBC,EAAQtS,aAAY,WAClB0R,GAAW,GACblS,cAAc8S,GAEhB5qB,EAAQvxB,MAAMu7C,QAAUA,EACxBhqB,EAAQvxB,MAAMyC,OAAS,iBAA6B,IAAV84C,EAAgB,IAC1DA,GAAqB,GAAVA,IACyC,GAAnD79C,EAAKE,WAAWw+C,kCA4EnBC,CAAO1C,IACP1vC,EAAO0vC,EAAUnS,yBAERzoB,OAAS5f,OAAO08C,cACjBpC,GAAqBA,EAAkBkC,gBAC3CjC,EAAIj0C,GACFwE,EAAK8U,OACLrhB,EAAKsC,MAAMs8C,wBACXn9C,OAAO08C,aAEPnC,EAAIj0C,EAAI,IACVi0C,EAAIj0C,EAAI/H,EAAKsC,MAAMs8C,yBAGnB3C,EAAUl0B,aACVtmB,OAAO08C,YAAcn+C,EAAKsC,MAAMs8C,0BAEhC3C,EAAU35C,MAAM4F,OACdzG,OAAO08C,YAAmD,EAArCn+C,EAAKsC,MAAMs8C,wBAA8B,OAGhEryC,EAAKgU,MAAQ9e,OAAOo9C,aACtB7C,EAAI/0C,GACFsF,EAAKgU,MAAQ9e,OAAOo9C,WAAa7+C,EAAKsC,MAAMs8C,yBAE5C5C,EAAI/0C,EAAI,IACV+0C,EAAI/0C,EAAIjH,EAAKsC,MAAMs8C,yBAEjB5C,EAAIj0C,EAAI,IACVi0C,EAAIj0C,EAAI/H,EAAKsC,MAAMs8C,yBAErB3C,EAAU35C,MAAMge,KAAO07B,EAAI/0C,EAAI,KAC/Bg1C,EAAU35C,MAAM8e,IAAM46B,EAAIj0C,EAAI,KAC9BwE,EAAO0vC,EAAUnS,wBACjBqS,EAAQ75C,MAAM8e,IAAM7U,EAAK6U,IAAM,KAC/Bg7B,EAAU95C,MAAM8e,IACd7U,EAAK6U,IAAM7U,EAAKrE,OAASk0C,EAAUr0B,aAAe,KACpDo0B,EAAQ75C,MAAMge,KAAO/T,EAAK+T,KAAO,KACjC87B,EAAU95C,MAAMge,KAAO/T,EAAK+T,KAAO,KACnC87B,EAAU95C,MAAM6F,MAAQ8zC,EAAUn0B,YAAc,KAChDq0B,EAAQ75C,MAAM6F,MAAQ8zC,EAAUn0B,YAAc,KAC9Cs0B,EAAUp3C,iBAAiB,YAAaw3C,EAAiB,SACzDJ,EAAUp3C,iBAAiB,WAAY23C,KACvCR,EAAQn3C,iBAAiB,YAAaw3C,EAAiB,OACvDL,EAAQn3C,iBAAiB,WAAY23C,KACrCJ,IAMFj7C,EAAKw9C,oBAjLezxB,GAClBya,EAAMza,GAAKuuB,qBAAqBz5C,cAAc,IAAI48C,MAAM,WAiL1Dz9C,EAAKiL,KAAOA,EACZjL,EAAKwmC,MAAQA,EACbxmC,EAAK66C,QAAUA,EACf76C,EAAK86C,UAAYA,EACjB96C,EAAKuxC,QAAU,WACbpY,aAAaghB,GACbY,EAASx7C,SAAQ,SAAUoN,GACzBA,EAAE4kC,cAEHuJ,EAAWD,EAASF,GAAWp7C,SAAQ,SAAUwF,OAlKtCwtB,EACRgqB,EACAY,EAFQ5qB,EAmKLxtB,EAlKHw3C,EAAU,EACVY,EAAQtS,aAAY,WAClB0R,GAAW,KACblS,cAAc8S,GACd5qB,EAAQvxB,MAAMk8C,QAAU,OACpB3qB,EAAQjuB,YACViuB,EAAQjuB,WAAWktC,YAAYjf,IAGnCA,EAAQvxB,MAAMu7C,QAAUA,EACxBhqB,EAAQvxB,MAAMyC,OAAS,iBAA6B,IAAV84C,EAAgB,IAC1DA,GAAqB,GAAVA,IACyC,GAAnD79C,EAAKE,WAAW8+C,sCAyJrBt2C,OAAO8oB,eAAelwB,EAAM,gBAAiB,CAC3CowB,IAAK,kBACI4qB,GAET/C,IAAK,SAAUtyB,MACQ,iBAAVA,GAAsB9jB,MAAM8jB,IAAUg4B,SAASh4B,UAClD,IAAIrkB,MAAM,uDAElB05C,EAAgBr1B,GACI6gB,EAAMhiC,OAAS,IACjCw2C,EAAgBxU,EAAMhiC,OAAS,GAE7Bw2C,EAAgB,IAClBA,EAAgB,GAElBxU,EAAMjnC,SAAQ,SAAUiE,EAAMqR,MACxBA,IAAUmmC,SACLt8C,EAAK67C,kBACV/2C,EAAK82C,qBACL,2CAGJ57C,EAAK67C,kBACH/2C,EAAK82C,qBACL,2CAKDt6C,WAEA49C,EAA6Bv8C,OASlCw8C,EAREC,EAAkBj5C,SAAS+1C,cAAc,OAC3CmD,EAAcl5C,SAAS+1C,cAAc,OACrCoD,EAA2Bn5C,SAAS+1C,cAAc,UAClDqD,EAAcp5C,SAAS+1C,cAAc,SACrCj5C,EACEN,EAAEyE,MAAQzE,EAAEyE,KAAKwO,OACbjT,EAAEyE,KAAKwO,OAAOK,OAAStT,EAAEyE,KAAKwO,OAAO1Q,KACrC,YAECs6C,IACPD,EAAYj9C,MAAMm9C,WAAaz/C,EAAKsC,MAAMo9C,6BAC1CH,EAAYj9C,MAAMyiB,MAAQ/kB,EAAKsC,MAAMq9C,wBACjC3/C,EAAKi6C,qBACPsF,EAAYj9C,MAAMm9C,WAChBz/C,EAAKsC,MAAMs9C,qCACbL,EAAYj9C,MAAMyiB,MAAQ/kB,EAAKsC,MAAMu9C,0CA+ChCC,EAA0B94B,OAC7BA,IAAM,CAAC,YAAa,UAAW,QAAS,OAAOd,SAASc,EAAGhD,UA5C3D+7B,EACAjY,EACAkY,EA8CAC,GAhDAF,EAAQ,EACRjY,EAAQ,GACRkY,EAAa,GAEjBhgD,EAAKiQ,SAASpP,SAAQ,SAAUie,OAC1BohC,EACyB,MAA3BphC,EAAInc,EAAEyE,KAAKwO,OAAO1Q,MACd4Z,EAAInc,EAAEyE,KAAKwO,OAAO1Q,MAClB8uB,OAAOlV,EAAInc,EAAEyE,KAAKwO,OAAO1Q,OAAO+uB,OAClChN,EAAQjnB,EAAK02C,YAAYxwB,SAASg6B,GAClClgD,EAAKE,WAAWw5C,WAChBwG,EAEApY,EAAM7gB,IAAU84B,EAAQ//C,EAAKE,WAAWigD,uBAG5CJ,GAAS,EACTjY,EAAM7gB,GAAS,CACbhR,MAAOjW,EAAK6mB,WAAWlkB,EAAEyE,KAAKwO,OAAO7P,MAAQ,UAAU,CACrDqB,KAAM,CAAE6f,MAAOA,KAEjBiW,MAAO,SAAUv6B,GACf48C,EAAYt4B,MAAQA,EACpBtkB,EAAE2yB,kBACFiqB,EAAYp9C,cAAc,IAAI48C,MAAM,UACpC/+C,EAAKogD,6BAMqD,IAA5D13C,OAAOC,KAAKm/B,GAAOltB,QAAQ5a,EAAKE,WAAWw5C,cAC7CsG,EAAWn8C,KAAKikC,EAAM9nC,EAAKE,WAAWw5C,oBAC/B5R,EAAM9nC,EAAKE,WAAWw5C,aAGxBsG,EAAW9tB,OAChBxpB,OAAOC,KAAKm/B,GAAOl2B,KAAI,SAAUoS,UACxB8jB,EAAM9jB,QAYjBm7B,EAAQI,EAAYzV,wBAChB4R,IACFA,EAAoB7I,UACpB6I,OAAsBx0C,IAExBw0C,EAAsBI,EACpBn5C,EACA,CACE2d,KAAM6+B,EAAM7+B,KACZc,IAAK+9B,EAAM/9B,IACXb,MAAO4+B,EAAM5+B,MACbc,OAAQ89B,EAAM99B,OACdnZ,OAAQi3C,EAAMj3C,OACdC,MAAOg3C,EAAMh3C,OAEf83C,EACA,CAAEhC,eAAe,KAEC3B,cAAgB,GAEtCt8C,EAAK67C,kBAAkBwD,EAAa,sCACpCr/C,EAAK67C,kBACHyD,EACA,8CAEFt/C,EAAK67C,kBACH0D,EACA,6CAEFC,IACAD,EAAYc,QAAUrgD,EAAKogD,oBAC3Bb,EAAYv6C,iBAAiB,WAAW,SAAUrC,GAClC,cAAVA,EAAEqhB,MACJ03B,EAAoBY,eAAiB,GAGzB,YAAV35C,EAAEqhB,MACJ03B,EAAoBY,eAAiB,GAGzB,UAAV35C,EAAEqhB,MACJ03B,EAAoBoD,WAAWpD,EAAoBY,eACnDt8C,EAAK0rC,sBAGO,QAAV/oC,EAAEqhB,MACJ03B,EAAoBoD,WAAWpD,EAAoBY,eACnD35C,EAAEizB,kBAGU,WAAVjzB,EAAEqhB,KACJhkB,EAAK0rC,wBAGT6T,EAAYv6C,iBAAiB,SAAS,WACpChF,EAAKm4C,UAAUx1C,EAAEyE,KAAKwO,OAAO1Q,KAAMq6C,EAAYt4B,UAEjDs4B,EAAYv6C,iBAAiB,QAAS86C,IACrC,QAAS,OAAQ,UAAW,QAAS,UAAUj/C,SAAQ,SAAUiP,GAChEyvC,EAAYv6C,iBAAiB8K,EAAI0vC,MAEnCD,EAAYt4B,MAAQtkB,EAAEyE,KAAKwO,QACvB5V,EAAKorB,cAAczoB,EAAEyE,KAAKwO,OAAO1Q,OACjC,GACJm6C,EAAYl7C,UAAYnE,EAAKE,WAAWogD,iBAAiB9/C,QAAQ,MAAOyC,GACxEq8C,EAAyBe,QAAU,cAC7B3E,SACK17C,EAAKogD,sBAEdN,KAEFR,EAAyBn7C,UAAYnE,EAAKsC,MAAMi+C,wBAChDnB,EAAgBp6C,iBAAiB,SAAS,SAAUrC,UAC3CA,EAAE2yB,qBAEX8pB,EAAgBh7C,YAAYi7C,GAC5BD,EAAgBh7C,YAAYm7C,GAC5BH,EAAgBh7C,YAAYk7C,GAC5B38C,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOmpC,IAEL12C,OAAOC,KAAK3I,EAAKorB,eAAetlB,QAClC4C,OAAOC,KAAK3I,EAAKorB,eAAevqB,SAAQ,SAAU2/C,OAC5C3zC,EAAI7M,EAAKsxC,gBAAgBkP,GAC7B79C,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWugD,uBAAuBjgD,QAC5C,MACAqM,EAAEoJ,OAASpJ,EAAE3H,MAEfg4B,MAAO,SAA2Bv6B,GAChCA,EAAEizB,iBACF51B,EAAKm4C,UAAUqI,EAAI,IACnBxgD,EAAKgiC,aAAaC,uBA2EnBye,EAA0BC,OAC7B9uC,EAAQ,GACR+uC,GAAQ,EACRC,GAAK,KACT7gD,EAAKua,WAAW1Z,SAAQ,SAAUie,EAAK3I,MAChC0qC,SACDD,GAAQ,GACVA,EAAOzqC,OACPtE,EAAM,GAAKsE,SAGTA,IAAUyqC,EAAO,GAAM9hC,GAAsB,IAAfA,EAAIhZ,QAItC86C,EAAOzqC,EACPtE,EAAM,GAAKsE,GAJT0qC,GAAK,MAMLA,SACmB,IAAjBhvC,EAAM/L,OAAqB66C,EAAkB9uC,EAAQ,KAClDA,WAGFivC,EAA0Bn+C,OAM7BmS,SALEjS,EAAS7C,EAAKuO,YAMdwyC,EAAgB,oDACfjsC,IACHA,EAAU,IAAI8yB,IAAI/kC,EAAO+O,IAAI,SAACovC,iCAAS,CAACA,EAAKr5C,YAAaq5C,kBACrDlsC,cAEHga,EACJ9uB,EAAK+uB,UAAUja,SAAW9U,EAAK+uB,UAAUja,QAAQhP,OAAS,EAEtDm7C,IAEFt+C,EAAEyE,KAAK85C,cACPv+C,EAAEyE,KAAKkQ,uBACP3U,EAAEyE,KAAK+5C,aACPx+C,EAAEyE,KAAK0e,UACPnjB,EAAEyE,KAAKse,cACJ/iB,EAAEyE,KAAKwO,UACV5V,EAAKE,WAAWkhD,YAAcH,GAChC/B,EAA6Bv8C,GAG7B3C,EAAKE,WAAWmhD,UAChBrhD,EAAKua,WAAWyH,QAAO,SAAUthB,EAAGqM,UAC3BrM,EAAIqM,EAAEjH,SACZ,GAAK,GAERnD,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWohD,SACvBpkB,MAAO,WACL/2B,SAASo7C,YAAY,QACrBvhD,EAAK0rC,qBACL1rC,EAAKgiC,aAAaC,WAIpBjiC,EAAKE,WAAWshD,WAAaxhD,EAAKyhD,eACpC9+C,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWwhD,UACvBxkB,MAAO,WACLl9B,EAAK0nC,MAAM1nC,EAAKyhD,cAAe9+C,EAAEyE,KAAKO,YAAahF,EAAEyE,KAAKM,UAC1D1H,EAAK6I,UAIP7I,EAAKE,WAAWyhD,qBAClBh/C,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAW0hD,mBACvB9Z,MAAO,eACD93B,EAAI,UACRhQ,EAAKuO,YAAY1N,SAAQ,SAAU41B,YACxBorB,EAAuBl/C,GAC9B8zB,EAAO7nB,QAAU6nB,EAAO7nB,OACxB5O,EAAKmC,cAAc,eAAgB,CACjCs0B,OAAQA,EACR7nB,OAAQ6nB,EAAO7nB,SAEjBjM,EAAEizB,iBACF51B,EAAKs1B,gBAAgB3yB,GACrB3C,EAAK0rC,qBACL1rC,EAAKqC,QAAO,GACZrC,EAAKw9B,qBAEHn3B,EAAKF,SAAS+1C,cAAc,OAChCP,EAAsBt1C,GACtBA,EAAGrB,iBAAiB,aAAc68C,GAClCx7C,EAAGrB,iBAAiB,QAAS68C,GAC7Bx7C,EAAGlC,WACAsyB,EAAO7nB,OACJ5O,EAAKE,WAAW4hD,yBAChB9hD,EAAKE,WAAW6hD,4BACnBtrB,EAAOxgB,OAASwgB,EAAOvxB,MAC1B8K,EAAEnM,KAAK,CACLoS,MAAO5P,OAGJ2J,KAGPrN,EAAEyE,MAAQzE,EAAEyE,KAAKwO,QAAUjT,EAAEyE,KAAKO,aAAe,GAAG,KAGhDmM,EAAmBnR,EAAEyE,KAAKO,YAC1BA,EAAc3H,EAAKoS,OAAO0C,QAAQhB,GAElCkuC,WA7K0Bh7B,EAAInkB,cAClCo/C,EAAU,yBACZthD,MAAM+5C,QAAQ1zB,EAAGi7B,KAA6B,OAAhBj7B,EAAGi7B,GAAmB,OAAOj7B,EAAGi7B,MAClEj7B,EAAGi7B,GAAW,KAETthD,MAAM+5C,QAAQ16C,EAAKua,aAA0C,IAA3Bva,EAAKua,WAAWzU,YACjD+7B,EAAY7hC,EAAKua,WAAW,MAC7BsnB,GAAkC,IAArBA,EAAU/7B,YACvB,IAAI4B,EAAW,EAAGA,EAAW1H,EAAKiQ,SAASnK,OAAQ4B,OAC1C1H,EAAKiQ,SAASvI,QAEpBw6C,EAAUliD,EAAKua,WAAW7S,OAC3Bw6C,EAAS,UACVA,EAAQp8C,SAAW+7B,EAAU/7B,OAAQ,WACpC,IAAIpC,EAAI,EAAGA,EAAIm+B,EAAU/7B,OAAQpC,OAChCm+B,EAAUn+B,KAAOw+C,EAAQx+C,GAAI,OAErCm+B,EAAU9vB,KAAK,SAACC,EAAGhF,iCAAMgF,EAAIhF,uBAGvBkkC,EAAS,GACXuD,EAAQ5S,EAAU,GAClB7rB,EAAM6rB,EAAU,GACXn+B,EAAI,EAAGA,EAAIm+B,EAAU/7B,OAAQpC,IAAK,KACnCusB,EAAa4R,EAAUn+B,GACzBusB,IAAeja,EAAM,GAIzBk7B,EAAOrtC,KAAK,CAAC4wC,EAAOz+B,IACpBy+B,EAAQxkB,EACRja,EAAMia,GALJja,EAAMia,EAOVihB,EAAOrtC,KAAK,CAAC4wC,EAAOz+B,QAEdmsC,EAAoBn7B,EAAG5f,KAAKO,YAC5By6C,EAAelR,EAAO/hB,KAC1B,SAACtd,iCACCswC,GAAqBtwC,EAAM,IAC3BswC,GAAqBtwC,EAAM,IAC3BA,EAAM,KAAOA,EAAM,mBAElBuwC,OAGChwC,EAASpS,EAAKoS,OAAO0C,WACtBnU,MAAM+5C,QAAQtoC,QAEbiwC,EAAgBD,EAAaxwC,IAAI,SAACqe,8BAChCyG,EAActkB,EAAO6d,GACrBqyB,EAAaz/C,EAAO6zB,UACnBhuB,OAAOuW,OAAO,GAAIqjC,EAAY,CAAEryB,WAAAA,sBAErCoyB,EAAcxzC,UAAU,SAACiiB,kCAAQA,gBAAO,UACpC9J,EAAGi7B,GAAWI,MAuHQE,CAA6B5/C,EAAGE,GACtDoT,EAAQ,MACR+rC,EACF/rC,EAAQ+rC,EACLpwC,IAAI,SAACsO,iCAAQA,EAAIjK,OAASiK,EAAIhb,kBAC9BgwB,KAAK,SACH,KACCuB,EAAS5zB,EAAO8E,GAClB8uB,IAAQxgB,EAAQwgB,EAAOxgB,OAASwgB,EAAOvxB,MAE7CvC,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWsiD,eAAehiD,QAAQ,OAAQyV,GACtDinB,MAAO,SAAUlW,GACfA,EAAG4O,iBACH51B,EAAKs1B,gBAAgBtO,GACrBhnB,EAAK0rC,qBACDsW,EACFhiD,EAAKm5C,YACH6I,EAAkB,GAAG/xB,WACrB+xB,EAAkB,GAAG/xB,YAGvBjwB,EAAKm5C,YAAYrlC,SAOzB9T,EAAKE,WAAWiqB,gBAChBnqB,EAAKE,WAAWuiD,0BACf/5C,OAAOC,KAAK3I,EAAK+W,MAAM1E,MAAMvM,OAAS,GACrC4C,OAAOC,KAAK3I,EAAK+W,MAAMjC,SAAShP,OAAS,IAE3CnD,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWwiD,wBACvBxlB,MAAO,SAAUv6B,GACfA,EAAEizB,iBACF51B,EAAK+W,MAAM1E,KAAO,GAClBrS,EAAK+W,MAAMjC,QAAU,GACrB9U,EAAKsS,kBACLtS,EAAKywC,qBACLzwC,EAAKozC,oBAAiBlsC,EACtBlH,EAAKmC,cAAc,eAAgB,CACjCw0B,YAAa32B,EAAKsC,MAAM4T,YAE1BlW,EAAKmC,cAAc,YAAa,CAC9BqP,WAAYxR,EAAKsC,MAAMkP,aAEzBxR,EAAKw9B,iBACLx9B,EAAKqC,QAAO,GACZrC,EAAK0rC,qBACL1rC,EAAKgiC,aAAaC,WAKtBjiC,EAAKE,WAAWyiD,cAChB3iD,EAAKE,WAAW0iD,mBAChB3B,IAEAt+C,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAW2iD,yBAAyBriD,QAC9C,KACAmC,EAAEyE,KAAKwO,OAAOK,OAAStT,EAAEyE,KAAKwO,OAAO1Q,MAEvCg4B,MAAO,SAAUlW,GACfA,EAAG4O,iBACH51B,EAAKoW,MAAMzT,EAAEyE,KAAKwO,OAAO1Q,KAAM,OAC/BlF,EAAKgiC,aAAaC,WAGtBt/B,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAW4iD,0BAA0BtiD,QAC/C,KACAmC,EAAEyE,KAAKwO,OAAOK,OAAStT,EAAEyE,KAAKwO,OAAO1Q,MAEvCg4B,MAAO,SAAUlW,GACfA,EAAG4O,iBACH51B,EAAKoW,MAAMzT,EAAEyE,KAAKwO,OAAO1Q,KAAM,QAC/BlF,EAAK0rC,qBACL1rC,EAAKgiC,aAAaC,aAMHnT,GAAansB,EAAEyE,KAAKse,aAAe/iB,EAAEyE,KAAKwO,OAC9C,KACT/D,EAAQ6uC,GAA0B,MACpC7uC,EAAO,KAILoE,EAHE8sC,EAAkBlxC,EAAMD,IAAI,SAACqW,iCACjCjoB,EAAKwW,iCAAiCyR,gBAGT,IAA3B86B,EAAgBj9C,QAEhBmQ,EADgC,iBAAvB8sC,EAAgB,GACjBA,EAAgB,GAAK,EAClBlxC,EAAM,GAAK,EAExBoE,EAAQjW,EAAKE,WAAW8iD,YAAYxiD,QAAQ,KAAMyV,GAElDtT,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAAA,EACAinB,MAAO,SAAUlW,GACfA,EAAG4O,iBACH51B,EAAKo5C,SAAS2J,EAAgB,GAAIA,EAAgB,QAG7CA,EAAgB,IAAMA,EAAgB,KAC/C9sC,EAAQ8sC,EACLnxC,IAAI,SAACkf,EAAI3a,iCACU,iBAAP2a,EAAwBA,EAAK,EACjCjf,EAAMsE,GAAS,eAEvB+e,KAAK,KACRjf,EAAQjW,EAAKE,WAAW+iD,aAAaziD,QAAQ,KAAMyV,GAEnDtT,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAAA,EACAinB,MAAO,SAAUlW,GACfA,EAAG4O,iBACH51B,EAAKo5C,SAAS2J,EAAgB,GAAIA,EAAgB,aAStDG,EAAkBljD,EAAKiR,2BACvBkyC,EAAiBnjD,EAAK+Q,uBACtBqyC,EAA+B,SAACpT,EAAWxmC,6BACtB,IAArBwmC,EAAUlqC,YACT,IAAIpC,EAAI,EAAGA,EAAIssC,EAAUlqC,OAAQpC,YAC9Bqb,EAASixB,EAAUtsC,GAChBsb,EAAI,EAAGA,EAAID,EAAOjZ,OAAQkZ,IAAK,CACxBD,EAAOC,GACfxV,UAAYA,EAGtBxJ,EAAKy9B,uBAEH96B,EAAEuL,KAAOvL,EAAEuL,IAAInG,EAAIm7C,IACrBvgD,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWmjD,0BACvBnmB,MAAO,SAAUlW,GACfA,EAAG4O,iBACH51B,EAAK6e,eAAiB,GACtB7e,EAAKy9B,aAGT96B,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWojD,0BACvBpmB,MAAO,SAAUlW,GACfA,EAAG4O,iBACHwtB,EAA6BpjD,EAAK6e,gBAAgB,MAGtDlc,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWqjD,4BACvBrmB,MAAO,SAAUlW,GACfA,EAAG4O,iBACHwtB,EAA6BpjD,EAAK6e,gBAAgB,OAIpDlc,EAAEuL,KAAOvL,EAAEuL,IAAIjH,EAAIk8C,IACrBxgD,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWsjD,uBACvBtmB,MAAO,SAAUlW,GACfA,EAAG4O,iBACH51B,EAAK8gB,YAAc,GACnB9gB,EAAKy9B,aAGT96B,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWujD,uBACvBvmB,MAAO,SAAUlW,GACfA,EAAG4O,iBACHwtB,EAA6BpjD,EAAK8gB,aAAa,MAGnDne,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWwjD,yBACvBxmB,MAAO,SAAUlW,GACfA,EAAG4O,iBACHwtB,EAA6BpjD,EAAK8gB,aAAa,WAK/C6iC,EACJ3jD,EAAKE,WAAWyvC,sBAChBhtC,EAAEyE,KAAK2e,gBACPpjB,EAAEyE,KAAKwO,QACPjT,EAAEyE,KAAKwO,OAAOO,MAAQ,EAClBytC,EACJ5jD,EAAKE,WAAWyvC,sBAAwBhtC,EAAEyE,KAAK2e,eAC3C89B,GACH/0B,GACD9uB,EAAKE,WAAW0vC,mBAChBjtC,EAAEyE,KAAKse,aACP/iB,EAAEyE,KAAKwO,OACHkuC,EACJ9jD,EAAKE,WAAW0vC,mBAAqBjtC,EAAEyE,KAAKse,eAE1Ci+B,EAAmB,SAEfI,EAAe,GAEf/vC,EAAcrR,EAAEyE,KAAKwO,OAAOO,MAC9B+J,EAAMlM,EACHkM,GAAO,GACPlgB,EAAKg/B,iBAAiB9e,GADZA,IAEf6jC,EAAa,GAAK7jC,MAEfA,EAAMlM,EACJhU,EAAKg/B,iBAAiB9e,GADHA,IAExB6jC,EAAa,GAAK7jC,KAGlBA,IAAQlM,GACgB,IAAxB+vC,EAAaj+C,QACbi+C,EAAa,GAAKA,EAAa,IAC/B/jD,EAAKmwC,qBACHnwC,EAAK6e,eACLklC,EAAa,GACbA,EAAa,IAEf,SACMjvC,EAAUisC,IACViD,EAAc,GACdC,EAAa,GACVvgD,EAAI,EAAGA,EAAIqgD,EAAaj+C,OAAQpC,IAAK,KACtCiE,EAAco8C,EAAargD,GAC3B+yB,EAAS3hB,EAAQ4c,IAAI/pB,GACvB8uB,IACFwtB,EAAWpgD,KAAK4yB,EAAOvxB,MACvB8+C,EAAYngD,KAAK4yB,EAAOxgB,OAASwgB,EAAOvxB,MAAQuxB,EAAOtgB,QAGvD8tC,EAAW,IAAMA,EAAW,IAE9BthD,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWgkD,iBAAiB1jD,QACtC,KACAwjD,EAAY,GAAK,IAAMA,EAAY,IAErC9mB,MAAO,SAAUlW,GACfA,EAAG4O,iBACH51B,EAAKs3C,aAAa2M,EAAW,GAAIA,EAAW,IAC5CjkD,EAAKgiC,aAAaC,eAMxB2hB,UACIj8C,EAAchF,EAAEyE,KAAKO,YACrBoX,EAAS/e,EAAK43C,yBAAyBjwC,GACvCmN,EAAUisC,eACPr9C,SACcqb,EAAOrb,GAApBqL,IAAAA,KAAMC,IAAAA,GACRm1C,EAAQrvC,EAAQ4c,IAAI3iB,GACpBq1C,EAAQtvC,EAAQ4c,IAAI1iB,MACtBm1C,GAASC,EAAO,KACZC,GACHF,EAAMluC,OAASkuC,EAAMj/C,MAAQi/C,EAAMhuC,OACpC,KACCiuC,EAAMnuC,OAASmuC,EAAMl/C,MAAQk/C,EAAMjuC,OACtCxT,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWokD,uBAAuB9jD,QAC5C,KACA6jD,GAEFnnB,MAAO,SAAUlW,GACfA,EAAG4O,iBACH51B,EAAKw3C,mBAAmB2M,EAAMj/C,KAAMk/C,EAAMl/C,MAC1ClF,EAAKgiC,aAAaC,gBAItB/W,QAAQC,kCAA2Bpc,wBAAkBC,KArBhDtL,EAAI,EAAGA,EAAIqb,EAAOjZ,OAAQpC,MAA1BA,MAyBPmgD,EAAgB,KACZhyC,EAAQ6uC,GAA0B,IAAU,GAC5C6D,EAAa1yC,EAChBD,IAAI,SAAClK,8BACEyO,EAAQnW,EAAKwW,iCAAiC9O,SAC/B,iBAAVyO,EAA2BA,EAAQ,EACvCzO,EAAW,eAEnBwtB,KAAK,KAEW,IAAjBrjB,EAAM/L,QACN9F,EAAKmwC,qBAAqBnwC,EAAK8gB,YAAajP,EAAM,GAAIA,EAAM,KAE5DlP,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWskD,cAAchkD,QAAQ,KAAM+jD,GACnDrnB,MAAO,SAAUlW,GACfA,EAAG4O,iBACH51B,EAAKu3C,UAAU1lC,EAAM,GAAIA,EAAM,UAKnCiyC,UACIp8C,EAAW/E,EAAEyE,KAAKM,SAClBqX,EAAS/e,EAAK63C,sBAAsBnwC,cACjChE,gBACcqb,EAAOrb,GAApBqL,IAAAA,KAAMC,IAAAA,GACRu1C,EAAa,CAACx1C,EAAMC,GACvB4C,IAAI,SAAClK,8BACEyO,EAAQnW,EAAKwW,iCAAiC9O,SAC/B,iBAAVyO,EAA2BA,EAAQ,EACvCzO,EAAW,eAEnBwtB,KAAK,KACRvyB,EAAEmlC,MAAMjkC,KAAK,CACXoS,MAAOjW,EAAKE,WAAWukD,oBAAoBjkD,QAAQ,KAAM+jD,GACzDrnB,MAAO,SAAUlW,GACfA,EAAG4O,iBACH51B,EAAKy3C,gBAAgB1oC,EAAMC,GAC3BhP,EAAKgiC,aAAaC,YAdfv+B,EAAI,EAAGA,EAAIqb,EAAOjZ,OAAQpC,MAA1BA,GAqBb1D,EAAKogD,oBAAsB,WACrB1E,IACFA,EAAoB7I,UACpB6I,OAAsBx0C,IAG1BlH,EAAK0rC,mBAAqB,SAAUvP,GAClCh2B,SAASsvB,oBAAoB,QAASz1B,EAAK0rC,oBAC3C8P,EAAYx7C,EAAKsC,MAAMu6C,kBACvB78C,EAAKogD,sBACDpgD,EAAKs5B,aACPt5B,EAAKs5B,YAAYuZ,UAEnB7yC,EAAKs5B,iBAAcpyB,EACfi1B,IACFn8B,EAAK4B,OAAOqgC,QACZjiC,EAAKqhC,UAAUlF,GACfn8B,EAAK25B,QAAQwC,KAGjBn8B,EAAKg8B,iBAAmB,SAAUr5B,EAAG02B,iBAC9Br5B,EAAK4jB,UAAYjhB,EAAE+C,SAAW1F,EAAK4B,gBAIlCy6C,EAAW3zC,OAAOC,KAAK3I,EAAKkqB,YACzBxmB,EAAI,EAAGA,EAAI24C,EAASv2C,OAAQpC,IAAK,KAClCghD,EAAY1kD,EAAKkqB,WAAWmyB,EAAS34C,IACrCkC,EAAa8+C,GAAaA,EAAU9+C,cACrCA,OACGiN,EAAqDjN,EAArDiN,WAAYiV,EAAyCliB,EAAzCkiB,YAAalV,EAA4BhN,EAA5BgN,UAAWmV,EAAiBniB,EAAjBmiB,iBACmB,IAA1DplB,EAAEsE,GAAK4L,GAAclQ,EAAEsE,GAAK4L,EAAaiV,KAEgB,IAAzDnlB,EAAEoF,GAAK6K,GAAajQ,EAAEoF,GAAK6K,EAAYmV,cAK1C/nB,EAAKmP,aAAenP,EAAK4F,WAAY,KAEjC++C,EAAqB3kD,EAAKoP,YAAcpP,EAAKoP,WAAW8a,eACzDy6B,IAAuBhkD,MAAM+5C,QAAQiK,GAAqB,WAC7CA,EAAmBx1B,KAAK,SAAC7E,8BACnCs6B,EAAQt6B,EAAK1kB,WACbi/C,EAAQ7kD,EAAK4F,kBAEjBg/C,EAAMhyC,WAAaiyC,EAAMjyC,WACzBgyC,EAAM/xC,aAAegyC,EAAMhyC,wBAGf,eAGZ5I,EAAKjK,EAAK4F,WAAWiN,WACrBiyC,EAAK9kD,EAAK4F,WAAWiN,WAAa7S,EAAK4F,WAAWkiB,YAClD5d,EAAKlK,EAAK4F,WAAWgN,UACrBmyC,EAAK/kD,EAAK4F,WAAWgN,UAAY5S,EAAK4F,WAAWmiB,aACjDi9B,EAAOhlD,EAAK4F,WAAWA,WACpBo/C,GAAM,OACkDA,EAArDnyC,IAAAA,WAAYiV,IAAAA,YAAalV,IAAAA,UAC7BC,EAAa5I,IAAIA,EAAK4I,GACtBD,EAAY1I,IAAIA,EAAK0I,OACnBqyC,EAAQpyC,EAAaiV,EACrBo9B,EAAQtyC,IAJ8BmV,gBAKxCk9B,EAAQH,IAAIA,EAAKG,GACjBC,EAAQH,IAAIA,EAAKG,GACC,yBAAlBF,EAAK99B,SAAqC,MAC9C89B,EAAOA,EAAKp/C,eAE6C,IAAtDjD,EAAEsE,GAAKgD,GAAMtH,EAAEsE,GAAK69C,GAAMniD,EAAEoF,GAAKmC,GAAMvH,EAAEoF,GAAKg9C,GAAe,WAQhEI,EACFrd,EAAQ,GACR55B,EAAMmrB,GAAer5B,EAAK45B,YAAYj3B,GACtCqkB,EAAK,CACHuT,YAAa53B,EACbyE,KAAMpH,EAAK2Y,UAAUzK,EAAIjH,EAAGiH,EAAInG,GAChCmG,IAAAA,EACA45B,MAAOA,GAEN9gB,EAAG5f,KAAKsf,QACXo6B,EAA0B95B,GAEb,cAAXrkB,EAAEoD,MAAwB/F,EAAKmC,cAAc,cAAe6kB,IAG3DA,EAAG5f,KAAKsf,SACP1mB,EAAKs5B,aACPt5B,EAAK0rC,qBAEPyZ,EAAkB,CAChB7kC,KACEpS,EAAIjH,EACJiH,EAAI3B,KAAK+T,KACTtgB,EAAKsC,MAAM8iD,sBACXplD,EAAK8H,iBACPsZ,IACElT,EAAInG,EACJmG,EAAI3B,KAAK6U,IACTphB,EAAKsC,MAAM+iD,qBACXrlD,EAAKgI,gBACPuY,MAAOyG,EAAG5f,KAAKe,MAAQ6e,EAAG5f,KAAKH,EAAIiH,EAAI3B,KAAK+T,KAC5Ce,OAAQ2F,EAAG5f,KAAKc,OAAS8e,EAAG5f,KAAKW,EAAImG,EAAI3B,KAAK6U,IAC9ClZ,OAAQ8e,EAAG5f,KAAKc,OAChBC,MAAO6e,EAAG5f,KAAKe,OAEbnI,EAAKgZ,SACPmsC,EAAgB7kC,KAAOtgB,EAAKsC,MAAMgjD,wBAA0B,KAC5DH,EAAgBh9C,MACdnI,EAAKmI,MAA6C,EAArCnI,EAAKsC,MAAMgjD,wBAA8B,MAE5C,aAAV3iD,EAAEoD,OACJo/C,EAAgB/jC,KAAOphB,EAAKsC,MAAMijD,2BAEpCvlD,EAAKs5B,YAAcwiB,EAAkB90B,EAAIm+B,EAAiBrd,GAC5C,aAAVnlC,EAAEoD,KACJtE,OAAOuD,iBAAiB,UAAWwgD,GAEnCA,IAEF7iD,EAAEizB,2BAvDK4vB,IACPpjD,uBAAsB,WACpB+D,SAASnB,iBAAiB,QAAShF,EAAK0rC,oBACxCjqC,OAAOg0B,oBAAoB,UAAW+vB,QCtmC/B,gBAAUxlD,OACnBw7C,WAmCKiK,EAAav3C,EAAK45B,EAAO4d,OAC5BC,EAAUx/C,SAAS+1C,cAAc,OACnC0J,EAAcz/C,SAAS+1C,cAAc,OACrC2J,EAAa1/C,SAAS+1C,cAAc,OACpC56C,EAAO,OAEJX,MAAM+5C,QAAQ5S,SACX,IAAIllC,MAAM,yCAuClBtB,EAAKqkD,QAAUA,EACfrkD,EAAKwmC,MAAQA,iBApCPkU,EAAM,GACR1tC,EAAItO,EAAK48C,aAAa58C,EAAK4B,gBAEXsF,IAAds0C,IACFA,EAAYx7C,EAAKsC,MAAMwjD,uBA7BHvkB,GACxBvhC,EAAK67C,kBAAkBta,EAAQ,kCAC/BA,EAAOv8B,iBAAiB,aAAa,WAC9BhF,EAAK+lD,YACR/lD,EAAK67C,kBAAkBta,EAAQ,2CAGnCA,EAAOv8B,iBAAiB,YAAY,WAC7BhF,EAAK+lD,YACR/lD,EAAK67C,kBAAkBta,EAAQ,qCAuBjCykB,CAAiBL,GACjB3lD,EAAK67C,kBAAkBgK,EAAY,+BACnC7lD,EAAK67C,kBAAkB+J,EAAa,gCAEpC5J,EAAI/0C,EAAIiH,EAAIoS,KAAOhS,EAAEgS,KACrB07B,EAAIj0C,EAAImG,EAAIkT,IAAM9S,EAAE8S,IACpB46B,EAAI9zC,OAAS,EACbszC,GAAa,EACbmK,EAAQrjD,MAAMw7C,SAAW,WACzB6H,EAAQrjD,MAAM07C,OAASxC,EACvBmK,EAAQrjD,MAAMge,KAAO07B,EAAI/0C,EAAI,KAC7B0+C,EAAQrjD,MAAM8e,IAAM46B,EAAIj0C,EAAI,KAC5B49C,EAAQrlC,KAAOpS,EAAIoS,KAAOtgB,EAAKqT,UAAUC,WACzCqyC,EAAQvkC,IAAMlT,EAAIkT,IAAMphB,EAAKqT,UAAUc,UACvCyxC,EAAYzhD,UAAYnE,EAAKsC,MAAM2jD,oBAC/BP,EAAQ,KACNr+C,EAAMlB,SAAS+1C,cAAc,OACjC70C,EAAI61C,aAAa,MAAOwI,GACxBr+C,EAAI/E,MAAM4jD,SAAW,OACrB7+C,EAAI/E,MAAM4F,OAAS,OACnB29C,EAAWzhD,YAAYiD,GAEzBs+C,EAAQvhD,YAAYyhD,GACpBF,EAAQvhD,YAAYwhD,GACpBz/C,SAASkmC,KAAKjoC,YAAYuhD,GAC1BA,EAAQ3gD,iBAAiB,QAASmhD,GAKpCpQ,GAEAz0C,EAAKuxC,QAAU,WACT8S,EAAQ//C,YACV+/C,EAAQ//C,WAAWktC,YAAY6S,IAG5BrkD,WAGA6kD,OAMHnmD,EAAK+lD,WACP/lD,EAAKomD,wBACA,KACDl4C,EAAM,CACRoS,KAAMtgB,EAAKuhC,OAAOokB,QAAQrlC,KAAOtgB,EAAKqT,UAAUC,WAChD8N,IACEphB,EAAKuhC,OAAOokB,QAAQvkC,IACpBphB,EAAKuhC,OAAOokB,QAAQ59B,aACpB/nB,EAAKqT,UAAUc,WAEnBnU,EAAK+lD,oBASiB73C,EAAK45B,OAI3Bv7B,EAHEw5C,EAAa5/C,SAAS+1C,cAAc,OACtCI,GAAiB,EACjBh7C,EAAO,YAGA+kD,aACEzI,EAAQ94C,EAAMwhD,YACZ7I,EAAWC,GACF,OAAZA,IAImB,WAAnBrK,QAAOqK,cAjIe6I,GAChCvmD,EAAK67C,kBACH0K,EACA,oCAAsCvmD,EAAKgZ,OAAS,UAAY,KAElEutC,EAAwBvhD,iBAAiB,aAAa,WACpDhF,EAAK67C,kBACH0K,EACA,6CAGJA,EAAwBvhD,iBAAiB,YAAY,WACnDhF,EAAK67C,kBACH0K,EACA,uCAwHEC,CAAyBF,GACzBA,EAAkBniD,UAAYu5C,GAL5B4I,EAAkBliD,YAAYs5C,IASlCD,EAAW34C,EAAKmR,OAChBnR,EAAKyhD,wBAA0BD,EAE3BxhD,EAAKo4B,OACPopB,EAAkBthD,iBAAiB,SAAS,SAAUgiB,GACpDliB,EAAKo4B,MAAMtY,MAAM5kB,EAAM,CAACgnB,IACxBhnB,EAAKymD,sDAKM3e,kCAAO,KAAfhjC,UACHyhD,EAA0BpgD,SAAS+1C,cAAc,OACrD0B,EAAQ94C,EAAMyhD,GACdR,EAAW3hD,YAAYmiD,4CAIlBzH,EAAWzxB,GAClBya,EAAMza,GAAKk5B,wBAAwBpkD,cAAc,IAAI48C,MAAM,mBAGpDhJ,QACHiG,EAAM,GACR1tC,EAAItO,EAAK48C,aAAa58C,EAAK4B,aAEXsF,IAAds0C,IACFA,EAAYx7C,EAAKsC,MAAMwjD,cAGzBO,IACArmD,EAAK67C,kBACHkK,EACA,+BAAiC/lD,EAAKgZ,OAAS,UAAY,KAG7DgjC,EAAI/0C,EAAIiH,EAAIoS,KAAOhS,EAAEgS,KACrB07B,EAAIj0C,EAAImG,EAAIkT,IAAM9S,EAAE8S,IACpB46B,EAAI9zC,OAAS,EACbszC,GAAa,EACbuK,EAAWzjD,MAAMw7C,SAAW,WAC5BiI,EAAWzjD,MAAM07C,OAASxC,EAC1BuK,EAAWzjD,MAAMge,KAAO07B,EAAI/0C,EAAI,KAChC8+C,EAAWzjD,MAAM8e,IAAM46B,EAAIj0C,EAAI,KAC/B5B,SAASkmC,KAAKjoC,YAAY2hD,IAC1Bx5C,EAAOw5C,EAAWjc,yBAETzoB,OAAS5f,OAAO08C,cACvBnC,EAAIj0C,EACF/H,EAAKuhC,OAAOokB,QAAQvkC,IACpB2kC,EAAWh+B,aACX/nB,EAAKqT,UAAUc,UACb6nC,EAAIj0C,EAAI,IACVi0C,EAAIj0C,EAAI/H,EAAKsC,MAAMokD,wBAInBX,EAAWh+B,aACXtmB,OAAO08C,YAAcn+C,EAAKsC,MAAMokD,yBAEhCX,EAAWzjD,MAAM4F,OACfzG,OAAO08C,YAAkD,EAApCn+C,EAAKsC,MAAMokD,uBAA6B,OAI/Dn6C,EAAKgU,MAAQ9e,OAAOo9C,aACtB7C,EAAI/0C,GACFsF,EAAKgU,MAAQ9e,OAAOo9C,WAAa7+C,EAAKsC,MAAMokD,wBAG5C1K,EAAI/0C,EAAI,IACV+0C,EAAI/0C,EAAIjH,EAAKsC,MAAMokD,wBAGjB1K,EAAIj0C,EAAI,IACVi0C,EAAIj0C,EAAI/H,EAAKsC,MAAMokD,wBAGrBX,EAAWzjD,MAAMge,KAAO07B,EAAI/0C,EAAI,KAChC8+C,EAAWzjD,MAAM8e,IAAM46B,EAAIj0C,EAAI,YAGjCzG,EAAKykD,WAAaA,EAClBhQ,IACAz0C,EAAKw9C,WAAaA,EAClBx9C,EAAKiL,KAAOA,EACZjL,EAAKwmC,MAAQA,EAEbxmC,EAAKuxC,QAAU,WACTkT,EAAWngD,YACbmgD,EAAWngD,WAAWktC,YAAYiT,IAItCr9C,OAAO8oB,eAAelwB,EAAM,gBAAiB,CAC3CowB,IAAK,kBACI4qB,GAET/C,IAAK,SAAatyB,MACK,iBAAVA,GAAsB9jB,MAAM8jB,KAAWg4B,SAASh4B,SACnD,IAAIrkB,MAAM,sDAGlB05C,EAAgBr1B,GAEI6gB,EAAMhiC,OAAS,IACjCw2C,EAAgBxU,EAAMhiC,OAAS,GAG7Bw2C,EAAgB,IAClBA,EAAgB,GAGlBxU,EAAMjnC,SAAQ,SAAUiE,EAAMqR,MACxBA,IAAUmmC,SACLt8C,EAAK67C,kBACV/2C,EAAKyhD,wBACL,0CAIJvmD,EAAK67C,kBACH/2C,EAAKyhD,wBACL,0CAKDjlD,EAhKaqlD,CAAiBz4C,EAAKlO,EAAKuhC,OAAOuG,OACpD9nC,EAAK67C,kBACH77C,EAAKuhC,OAAOokB,QACZ,yCAjBFvjD,uBAAsB,WACpB+D,SAASnB,iBAAiB,QAAShF,EAAKomD,uBAgL9CpmD,EAAKomD,kBAAoB,WACnBpmD,EAAK+lD,aACP5/C,SAASsvB,oBAAoB,QAASz1B,EAAKomD,mBAC3CpmD,EAAK+lD,WAAWlT,UAChB7yC,EAAK+lD,gBAAa7+C,EAClBlH,EAAK67C,kBACH77C,EAAKuhC,OAAOokB,QACZ,0CAKN3lD,EAAKymD,cAAgB,SAAU9jD,GACzBA,GAAmB,KAAdA,EAAEikD,UACXzgD,SAASsvB,oBAAoB,UAAWz1B,EAAKymD,eAC7CjL,EAAYx7C,EAAKsC,MAAMwjD,aACvB9lD,EAAKomD,oBAEDpmD,EAAKuhC,QACPvhC,EAAKuhC,OAAOsR,UAGd7yC,EAAKuhC,YAASr6B,IAGhBlH,EAAKq7C,cAAgB,WACnBr7C,EAAKuhC,OAAOokB,QAAQrjD,MAAMge,KACxBtgB,EAAKuhC,OAAOokB,QAAQrlC,KAAOtgB,EAAKqT,UAAUC,WAAa,KACzDtT,EAAKuhC,OAAOokB,QAAQrjD,MAAM8e,IACxBphB,EAAKuhC,OAAOokB,QAAQvkC,IAAMphB,EAAKqT,UAAUc,UAAY,KACvDnU,EAAKomD,qBAGPpmD,EAAK6mD,aAAe,SAAU34C,EAAK45B,EAAO4d,GAOpC1lD,EAAKuhC,QACPvhC,EAAKymD,gBAGPzmD,EAAKuhC,OAASkkB,EAAav3C,EAAK45B,EAAO4d,GATrCtjD,uBAAsB,WACpB+D,SAASnB,iBAAiB,UAAWhF,EAAKymD,mBCrTnC,aAAUzmD,GACvBA,EAAK0oC,gBAAkB,SAAUoe,OAC3BC,EAAe/mD,EAAK89C,SAAS99C,EAAK4F,YACpCohD,EAAUhnD,EAAK89C,SAASgJ,GACxBx4C,EAAItO,EAAK48C,aAAa58C,EAAK4B,QAC3BqlD,EAAW,CACThgD,EAAG,EACHc,EAAG,EACH8E,EAAG,EACHD,EAAG,GAELs6C,EAAa,CACXjgD,GAAIkgD,EAAAA,EACJp/C,GAAIo/C,EAAAA,EACJt6C,EAAGs6C,EAAAA,EACHv6C,EAAGu6C,EAAAA,GAELz2C,EAAyB1Q,EAAK2Q,4BAC9BC,EAAqB5Q,EAAK6Q,+BAC5Bk2C,EAAa3lC,KAAO9S,EAAE8S,IACtB2lC,EAAazmC,MAAQhS,EAAEgS,KACvB0mC,EAAQ5lC,KAAO9S,EAAE8S,IACjB4lC,EAAQ1mC,MAAQhS,EAAEgS,KAClB2mC,EAASp6C,EACPk6C,EAAa3lC,IACb2lC,EAAa7+C,OACb4+C,EAAIl0C,UACJ5S,EAAKsC,MAAM8U,eACb6vC,EAASr6C,EACPm6C,EAAazmC,KACbymC,EAAa5+C,MACb2+C,EAAIj0C,WACJ7S,EAAKsC,MAAM8U,eACb6vC,EAAShgD,EAAI8/C,EAAazmC,MAAuB,EAAhB0mC,EAAQ1mC,KAAY1P,EACrDq2C,EAASl/C,EAAIg/C,EAAa3lC,KAAqB,EAAf4lC,EAAQ5lC,IAAW1Q,EAC5C,CACLzJ,EAAGggD,EAAShgD,EAAIigD,EAAWjgD,EAAIggD,EAAShgD,EAAIigD,EAAWjgD,EACvDc,EAAGk/C,EAASl/C,EAAIm/C,EAAWn/C,EAAIk/C,EAASl/C,EAAIm/C,EAAWn/C,EACvD8E,EAAGo6C,EAASp6C,EAAIq6C,EAAWr6C,EAAIo6C,EAASp6C,EAAIq6C,EAAWr6C,EACvDD,EAAGq6C,EAASr6C,EAAIs6C,EAAWt6C,EAAIq6C,EAASr6C,EAAIs6C,EAAWt6C,IAG3D5M,EAAKi4C,YAAc,SAAU6O,OACvBG,EAAWjnD,EAAK0oC,gBAAgBoe,GAChCG,EAASr6C,EAAI,IACfq6C,EAASr6C,EAAI,GAEXq6C,EAASp6C,EAAI,IACfo6C,EAASp6C,EAAI,GAEfi6C,EAAIxkD,MAAMkL,KACR,QACAy5C,EAASl/C,EACT,MACAk/C,EAASr6C,EACT,MACAq6C,EAASp6C,EACT,MACAo6C,EAAShgD,EAPT,OAsBJjH,EAAK48C,aAAe,SAAUj6C,WACxBsE,EAAI,EACNc,EAAI,EACJq/C,EAAmBjhD,SAASihD,kBAAoB,CAC9C9zC,WAAY,EACZa,UAAW,GAGbxR,EAAEiD,YACa,oBAAfjD,EAAEgD,UACFhD,IAAM3C,EAAKsB,MAGM,yBAAfqB,EAAEukB,UACa,yBAAfvkB,EAAEukB,WAEFjgB,GAAKtE,EAAE2Q,WACPvL,GAAKpF,EAAEwR,WAETxR,EAAIA,EAAEiD,iBAED,CACL0a,KAAMrZ,EAAImgD,EAAiB9zC,WAC3B8N,IAAKrZ,EAAIq/C,EAAiBjzC,YAG9BnU,EAAK04B,gBAAkB,cACjB14B,EAAKu5B,OAASv5B,EAAKu5B,MAAM8tB,SAAU,KACjCn5C,EAAMlO,EAAK4B,OAAOkoC,wBACpBx7B,EAAItO,EAAK48C,aAAa58C,EAAKsB,MAC3B81B,EAAuC,aAAlCp3B,EAAKsC,MAAM6N,mBAAoC,EAAI,EACxDm3C,EAActnD,EAAKsC,MAAMkR,gBAAkB4jB,EAC3ChwB,EAAOpH,EAAKugC,sBACVvgC,EAAKu5B,MAAM8tB,SAAS1/C,YACpB3H,EAAKu5B,MAAM8tB,SAAS3/C,WACjB,CAAET,GAAI,IAAKc,GAAI,IAAKG,OAAQ,EAAGC,MAAO,MACzCnI,EAAKgZ,cACPhZ,EAAKu5B,MAAMj3B,MAAMge,KAAO,IACxBtgB,EAAKu5B,MAAMj3B,MAAM8e,IACfphB,EAAKkI,OACLlI,EAAKsC,MAAMilD,sBACXD,EACA,EACA,KACFtnD,EAAKu5B,MAAMj3B,MAAM4F,OAASlI,EAAKsC,MAAMilD,sBAAwB,UAC7DvnD,EAAKu5B,MAAMj3B,MAAM6F,MAAQnI,EAAKmI,MAAQm/C,EAAc,EAAI,UAGtDE,EAAmBxnD,EAAKiR,2BACxBw2C,EAAmBznD,EAAK+Q,0BACxB/Q,EAAK4F,WAAY,OACoC5F,EAAK4F,WAApDoL,IAAAA,uBAAwBF,IAAAA,mBAC5BE,IAAwBw2C,GAAoBx2C,GAC5CF,IAAoB22C,GAAoB32C,GAE9C9Q,EAAKu5B,MAAMj3B,MAAMge,KACfpS,EAAIoS,KACJlZ,EAAKH,EACLjH,EAAK8H,iBACLwG,EAAEgS,KACFmnC,EACA,KACFznD,EAAKu5B,MAAMj3B,MAAM8e,IACflT,EAAIkT,IACJha,EAAKW,EACL/H,EAAKsC,MAAMkR,gBACXxT,EAAKgI,gBACLsG,EAAE8S,IACFomC,EACA,KACFxnD,EAAKu5B,MAAMj3B,MAAM4F,OAASd,EAAKc,OAASo/C,EAAc,KACtDtnD,EAAKu5B,MAAMj3B,MAAM6F,MAAQf,EAAKe,MAAQnI,EAAKsC,MAAMolD,gBAAkB,KACnE1nD,EAAKi4C,YAAYj4C,EAAKu5B,SAG1Bv5B,EAAK89C,SAAW,SAAUn7C,EAAGglD,WAIzB96C,EACAD,EAJE3F,EAAI,EACNc,EAAI,EACJuG,EAAI3L,EAGFilD,GAAiB,EACdjlD,EAAEqlB,cAA+B,oBAAfrlB,EAAEgD,UAAgC,KACnDkiD,EAAwB,yBAAfllD,EAAEukB,SACZ2gC,GAAWD,IACd3gD,GAAKtE,EAAEkQ,WACP9K,GAAKpF,EAAEiQ,UACP/F,EAAIlK,EAAEolB,aACNnb,EAAIjK,EAAEmlB,aAEJ+/B,IAAQD,GAAiB,GAC7BjlD,EAAIA,EAAEqlB,oBAEJ2/B,EACK,CAAErnC,KAAMrZ,EAAGma,IAAKrZ,EAAGG,OAAQ2E,EAAG1E,MAAOyE,IAE9CjK,EAAI2L,EAEG,CAAEgS,KAAMrZ,GADfqH,EAAItO,EAAK48C,aAAaj6C,IACD2d,KAAMc,IAAKrZ,EAAIuG,EAAE8S,IAAKlZ,OAAQ2E,EAAG1E,MAAOyE,KAE/D5M,EAAK45B,YAAc,SAAUj3B,OACvB4J,EAAOvM,EAAK4B,OAAOkoC,wBACrB57B,EAAM,CACJjH,EAAGtE,EAAEimC,QAAUr8B,EAAK+T,KACpBvY,EAAGpF,EAAEkmC,QAAUt8B,EAAK6U,YAEpBphB,EAAKmP,cACPjB,EAAIjH,GAAKjH,EAAK8H,iBACdoG,EAAInG,GAAK/H,EAAKgI,gBACVhI,EAAK4F,WAAWkL,qBAClB5C,EAAIjH,GAAKjH,EAAK4F,WAAWkL,oBACvB9Q,EAAK4F,WAAWoL,yBAClB9C,EAAInG,GAAK/H,EAAK4F,WAAWoL,yBAEtB,CACL/J,EAAGiH,EAAIjH,EACPc,EAAGmG,EAAInG,EACPwE,KAAMA,IAUVvM,EAAKo9B,QAAU,SAAU0qB,OACnB1gD,EAAOpH,EAAKu5B,MAAM8tB,SACpBt/C,EAAIX,EAAKM,YAKT1H,EAAKmC,cAAc,gBAAiB,CAClCiF,KAAMA,EACN2gD,SAAU/nD,EAAKu5B,MAAMtS,MACrB+gC,SAAU5gD,EAAK6f,MACf6gC,iBAPFA,GAAQ,GAQNvuB,MAAOv5B,EAAKu5B,eAGP,KAELv5B,EAAKu5B,MAAMtS,QAAU7f,EAAK6f,QAAU6gC,EAAO,IAC7C9nD,EAAK6uC,QAAQ9mC,GAAK/H,EAAK6uC,QAAQ9mC,IAAM,GACrC/H,EAAK6uC,QAAQ9mC,GAAGX,EAAKwO,OAAO1Q,MAAQlF,EAAKu5B,MAAMtS,MAC1C7f,EAAK7E,OACRvC,EAAKyW,aAAarP,EAAK+gB,eAAiB,GACxC/gB,EAAK7E,KAAOvC,EAAKyW,aAAarP,EAAK+gB,gBAErC/gB,EAAK7E,KAAK6E,EAAKwO,OAAO1Q,MAAQlF,EAAKu5B,MAAMtS,MACrClf,IAAM/H,EAAKiQ,SAASnK,OAAQ,IAE5B9F,EAAKmC,cAAc,SAAU,CAC3B8kB,MAAOjnB,EAAKu5B,MAAMtS,MAClB2pB,aAAcxpC,EAAK6f,MACnBghC,QAASH,EACT1gD,KAAMA,EACNmyB,MAAOv5B,EAAKu5B,eAGP,EAETv5B,EAAKw4C,OAAOpxC,EAAK7E,MACjBvC,EAAK6wC,mBAEP7wC,EAAK6I,MAAK,UAER7I,EAAKu5B,MAAM3zB,YACb5F,EAAKu5B,MAAM3zB,WAAWktC,YAAY9yC,EAAKu5B,OAEzCv5B,EAAKsB,KAAK2gC,QACVjiC,EAAKmC,cAAc,UAAW,CAC5BiF,KAAMA,EACN6f,MAAOjnB,EAAKu5B,MAAMtS,MAClBghC,QAASH,EACTvuB,MAAOv5B,EAAKu5B,QAEdv5B,EAAKu5B,WAAQryB,GACN,GAcTlH,EAAK0iC,YAAc,SAAUz7B,EAAGc,EAAGwyB,OAAa2tB,6DACzCloD,EAAKE,WAAWgZ,UAGjBlZ,EAAKu5B,OACPv5B,EAAKo9B,cAILkF,EACA6lB,EACAC,EACAC,EACAC,EANElhD,EAAOpH,EAAKugC,sBAAsBt5B,EAAGc,GACnC/H,EAAKuO,eAMLnH,GAAQA,EAAKwO,WAInBwyC,EAAMhhD,EAAKwO,OAAL,KAEJ5V,EAAKmC,cAAc,kBAAmB,CACpCiF,KAAMA,EACNmzB,YAAaA,WAGR,KAETv6B,EAAKujC,eAAet8B,EAAGc,GACvB/H,EAAK89B,cAAc72B,EAAGc,GACtBu6B,EAAgBtiC,EAAKkiC,mBAEnBliC,EAAKu5B,MADH6uB,EACWjiD,SAAS+1C,cAAc,UAEvB/1C,SAAS+1C,cACpBl8C,EAAKE,WAAWqoD,UAAY,WAAa,SAG7CnhD,EAAOpH,EAAKugC,sBAAsBt5B,EAAGc,IAKjCqgD,IAEiB,mBAARA,EACTD,EAAYC,EAAIxjC,MAAM5kB,EAAKsB,KAAM,CAAC,CAAE8F,KAAMA,KACjCzG,MAAM+5C,QAAQ0N,KACvBD,EAAYC,GAEdD,EAAUtnD,SAAQ,SAAU8B,OAExBX,EACAiU,EAFEvS,EAAIyC,SAAS+1C,cAAc,UAG3Bv7C,MAAM+5C,QAAQ/3C,IAChBX,EAAMW,EAAE,GACRsT,EAAQtT,EAAE,KAEVX,EAAMW,EACNsT,EAAQtT,GAENX,IAAQoF,EAAK6f,QACfqhC,GAAc,GAEhB5kD,EAAEujB,MAAQjlB,EACV0B,EAAES,UAAY8R,EACdjW,EAAKu5B,MAAMn1B,YAAYV,MAEpB4kD,KACHD,EAASliD,SAAS+1C,cAAc,WACzBj1B,MAAQ7f,EAAK6f,MACpBohC,EAAOlkD,UAAYiD,EAAK6f,MACxBjnB,EAAKu5B,MAAMn1B,YAAYikD,IAEzBroD,EAAKu5B,MAAMv0B,iBAAiB,UAAU,WACpChF,EAAKo9B,UACLp9B,EAAK6I,MAAK,OAKX7I,EAAKmC,cAAc,kBAAmB,CAAEiF,KAAMA,EAAMmyB,MAAOv5B,EAAKu5B,SAEjEpzB,SAASkmC,KAAKjoC,YAAYpE,EAAKu5B,OAEjCv5B,EAAK67C,kBACH77C,EAAKu5B,MACLv5B,EAAKgZ,OACD,oCACA,8BAENhZ,EAAKu5B,MAAMj3B,MAAMw7C,SAAW,WAC5B99C,EAAKu5B,MAAM8tB,SAAWjgD,EACtBpH,EAAK04B,kBACL14B,EAAKu5B,MAAMj3B,MAAM07C,OAASh+C,EAAKsC,MAAMkmD,eACrCxoD,EAAKu5B,MAAMj3B,MAAMmmD,SACfvlD,SAASlD,EAAKsC,MAAMomD,iBAAkB,IAAM1oD,EAAKsL,MAAQ,SAEvDq9C,GAA8D,IAA3C,CAAC,UAAMzhD,GAAW0T,QAAQxT,EAAK6f,OAClD2hC,EAAuBD,GAAoBT,EAE/CloD,EAAKu5B,MAAMtS,MAAQ2hC,EAAuB,GAAKxhD,EAAK6f,UAChD9e,EAAQP,KAAKC,MACf7H,EAAKu5B,MAAMtS,MAAMnhB,OACf5C,SAASlD,EAAKsC,MAAMomD,iBAAkB,IACtC,GACA1oD,EAAKsL,OAELnD,EAAQnI,EAAKsC,MAAMolD,gBAAkBtgD,EAAKe,MAC5CA,EAAQf,EAAKe,MAAQnI,EAAKsC,MAAMolD,gBACvBv/C,EAAQnI,EAAKmI,MAAQf,EAAKH,EAAIjH,EAAKsC,MAAM8U,iBAClDjP,EAAQnI,EAAKmI,MAAQf,EAAKH,EAAIjH,EAAKsC,MAAM8U,eACzCpX,EAAKu5B,MAAMj3B,MAAM4F,OAAS,QAE5BlI,EAAKu5B,MAAMj3B,MAAM6F,MAAQA,EAAQ,KACjCnI,EAAKu5B,MAAM0I,QACXjiC,EAAKu5B,MAAMv0B,iBAAiB,QAAShF,EAAKs1B,iBAC1Ct1B,EAAKu5B,MAAMv0B,iBAAiB,WAAYhF,EAAKs1B,iBAC7Ct1B,EAAKu5B,MAAMv0B,iBAAiB,UAAWhF,EAAKs1B,iBAC5Ct1B,EAAKu5B,MAAMv0B,iBAAiB,YAAahF,EAAKs1B,iBAC9Ct1B,EAAKu5B,MAAMv0B,iBAAiB,WAAW,SAAUrC,OAC3CkmD,EAAKzhD,EAAKO,YACZmhD,EAAK1hD,EAAKM,YAEE,WAAV/E,EAAEqhB,IACJhkB,EAAKo9B,SAAQ,GACbp9B,EAAK6I,MAAK,QACL,GAAc,UAAVlG,EAAEqhB,KAAmBhkB,EAAKE,WAAWqoD,WAAa5lD,EAAEomD,OAC7D/oD,EAAKu5B,MAAMtS,MAAQjnB,EAAKu5B,MAAMtS,MAAQ,KACtCjnB,EAAKu5B,MAAMplB,UAAYnU,EAAKu5B,MAAM9b,kBAC7B,GAAc,UAAV9a,EAAEqhB,IAAiB,CAC5BhkB,EAAKo9B,cAGD4rB,EAAermD,EAAEg5B,SACjB/zB,KAAK0U,IAAI,EAAGwsC,EAAK,GACjBlhD,KAAK4G,IAAIs6C,EAAK,EAAG9oD,EAAKiQ,SAASnK,OAAS,GAExCkjD,IAAiBF,IACnB9oD,EAAKujC,eAAeslB,EAAIG,GACxBhpD,EAAK89B,cAAc+qB,EAAIG,IAGzBhpD,EAAK6I,MAAK,QACL,GACL,CAAC,UAAW,YAAa,YAAa,cAAcqd,SAASvjB,EAAEqhB,MAC/DkkC,EACA,QACQvlD,EAAEqhB,SACH,UACH8kC,EAAKlhD,KAAK0U,IAAI,EAAGwsC,EAAK,aAEnB,YACHA,EAAKlhD,KAAK4G,IAAIs6C,EAAK,EAAG9oD,EAAKiQ,SAASnK,OAAS,aAE1C,YACH+iD,EAAKjhD,KAAK0U,IAAIusC,EAAK,EAAG,aAEnB,aACHA,EAAKvmB,EAAc/hB,MAIvBvgB,EAAKo9B,UAELp9B,EAAKujC,eAAeslB,EAAIC,GACxB9oD,EAAK89B,cAAc+qB,EAAIC,GAEvB9oD,EAAK6I,MAAK,QACL,GAAc,QAAVlG,EAAEqhB,IAAe,IAC1BrhB,EAAEizB,kBACG51B,EAAKo9B,iBAIRyrB,EADElmD,EAAEg5B,SACC2G,EAAchiB,KAEdgiB,EAAc/hB,MAEjB+hB,EAAchiB,OAASrZ,GAAKtE,EAAEg5B,WAChCktB,EAAKvmB,EAAcF,KACnB0mB,GAAM,GAEJxmB,EAAc/hB,QAAUtZ,GAAMtE,EAAEg5B,WAClCktB,EAAKvmB,EAAcH,MACnB2mB,GAAM,GAEJA,EAAK,IACPA,EAAK9oD,EAAKiQ,SAASnK,OAAS,GAE1BgjD,EAAK9oD,EAAKiQ,SAASnK,OAAS,IAC9BgjD,EAAK,GAEP9oD,EAAKujC,eAAeslB,EAAIC,GACxB9oD,EAAK0iC,YAAYmmB,EAAIC,EAAInmD,OACpB,KACDwF,EAAQP,KAAKC,MACf7H,EAAKu5B,MAAMtS,MAAMnhB,OACf5C,SAASlD,EAAKsC,MAAMomD,iBAAkB,IACtC,GACA1oD,EAAKsL,OAELnD,EAAQnI,EAAKsC,MAAMolD,gBAAkBtgD,EAAKe,MAC5CA,EAAQf,EAAKe,MAAQnI,EAAKsC,MAAMolD,gBACvBv/C,EAAQnI,EAAKmI,MAAQf,EAAKH,EAAIjH,EAAKsC,MAAM8U,iBAClDjP,EAAQnI,EAAKmI,MAAQf,EAAKH,EAAIjH,EAAKsC,MAAM8U,eACzCpX,EAAKu5B,MAAMj3B,MAAM4F,OAAS,QAE5BlI,EAAKu5B,MAAMj3B,MAAM6F,MAAQA,EAAQ,SAIrCnI,EAAKmC,cAAc,YAAa,CAAEiF,KAAMA,EAAMmyB,MAAOv5B,EAAKu5B,YAE5Dv5B,EAAK67C,kBAAoB,SAAUx1C,EAAI4iD,OACjCC,EAAM,kCAC0B,CAChC1K,QAAS,eACT2K,QAASnpD,EAAKsC,MAAM8mD,cACpB9B,YAAa,MACb+B,YAAa,QACbC,YAAatpD,EAAKsC,MAAMinD,kBACxBpuB,OAAQ,UACRskB,WAAYz/C,EAAKsC,MAAMknD,sBACvBC,WAAY,+CAE0B,CACtCH,YAAatpD,EAAKsC,MAAMinD,kBACxB9J,WAAYz/C,EAAKsC,MAAMonD,oEAEgB,CACvCJ,YAAatpD,EAAKsC,MAAMqnD,wBACxBlK,WAAYz/C,EAAKsC,MAAMsnD,2DAEM,CAC7BzhD,MAAO,OACPD,OAAQ,OACRs2C,QAAS,eACTqL,cAAe,yCAEe,CAC9BrL,QAAS,eACTz5B,MAAO/kB,EAAKsC,MAAMwnD,iBAClBrB,SAAU,iDAE+B,CACzC/gC,WAAY,SACZqiC,WAAY,SACZC,WAAYhqD,EAAKsC,MAAM2nD,sBACvBxB,SAAUzoD,EAAKsC,MAAM4nD,oBACrBnlC,MAAO,UACP06B,WAAY,UACZ0K,OAAQnqD,EAAKsC,MAAM8nD,sBACnBC,aAAcrqD,EAAKsC,MAAMgoD,4BACzBT,cAAe,6CAEmB,CAClCniC,WAAY,SACZqiC,WAAY,SACZC,WAAYhqD,EAAKsC,MAAM2nD,sBACvBxB,SAAUzoD,EAAKsC,MAAM4nD,oBACrBnlC,MAAO,UACP06B,WAAY,UACZ0K,OAAQnqD,EAAKsC,MAAM8nD,sBACnBC,aAAcrqD,EAAKsC,MAAMgoD,4BACzBT,cAAe,mDAEyB,CACxCpK,WAAYz/C,EAAKsC,MAAMioD,2BACvBxlC,MAAO/kB,EAAKsC,MAAMkoD,2DAEiB,CACnCL,OAAQnqD,EAAKsC,MAAMmoD,uBACnBjM,QAASx+C,EAAKsC,MAAMooD,wBACpBrM,SAAUr+C,EAAKsC,MAAMqoD,yBACrBzE,SAAUlmD,EAAKsC,MAAMsoD,+DAEe,CACpCljC,WAAY,SACZqiC,WAAY,SACZC,WAAYhqD,EAAKsC,MAAM2nD,sBACvBxB,SAAUzoD,EAAKsC,MAAM4nD,oBACrBzK,WAAYz/C,EAAKsC,MAAMuoD,sBACvB9lC,MAAO/kB,EAAKsC,MAAMwoD,iBAClBC,OAAQ/qD,EAAKsC,MAAM0oD,kBACnB7B,QAASnpD,EAAKsC,MAAM2oD,mBACpBZ,aAAcrqD,EAAKsC,MAAM4oD,wBACzBrN,QAAS79C,EAAKsC,MAAM6oD,mBACpBC,SAAU,SACV3jC,WAAY,wCAEiB,CAC7BC,WAAY,SACZqiC,WAAY,SACZC,WAAYhqD,EAAKsC,MAAM2nD,sBACvBxB,SAAUzoD,EAAKsC,MAAM4nD,oBACrBzK,WAAYz/C,EAAKsC,MAAMuoD,sBACvB9lC,MAAO/kB,EAAKsC,MAAMwoD,iBAClBC,OAAQ/qD,EAAKsC,MAAM0oD,kBACnB7B,QAASnpD,EAAKsC,MAAM2oD,mBACpBZ,aAAcrqD,EAAKsC,MAAM4oD,wBACzBrN,QAAS79C,EAAKsC,MAAM6oD,mBACpBC,SAAU,SACV3jC,WAAY,SACZ0T,OAAQn7B,EAAKsC,MAAM+oD,+DAEwB,CAC3CnjD,OAAQ,OACR2hD,cAAe,SACfl+C,WAAY,MACZw9C,QAAS,IACT1J,WAAYz/C,EAAKsC,MAAMo9C,6BACvB36B,MAAO/kB,EAAKsC,MAAMq9C,wBAClBoL,OAAQ/qD,EAAKsC,MAAMgpD,yBACnBjB,aAAcrqD,EAAKsC,MAAMipD,+BACzB7jC,WAAY,SACZqiC,WAAY,SACZC,WAAYhqD,EAAKsC,MAAMkpD,6BACvB/C,SAAUzoD,EAAKsC,MAAMmpD,yEAEuB,CAC5CvjD,OAAQ,OACR2hD,cAAe,SACfl+C,WAAY,MACZw9C,QAAS,IACT1J,WAAYz/C,EAAKsC,MAAMuoD,sBACvB9lC,MAAO/kB,EAAKsC,MAAMwoD,iBAClBC,OAAQ/qD,EAAKsC,MAAMopD,0BACnBrB,aAAcrqD,EAAKsC,MAAMqpD,gCACzBjkC,WAAY,SACZqiC,WAAY,SACZC,WAAYhqD,EAAKsC,MAAMspD,kCACvBnD,SAAUzoD,EAAKsC,MAAMupD,uEAEgB,CACrCC,SAAU,QACV/mC,MAAO/kB,EAAKsC,MAAMypD,2BAClBtD,SAAUzoD,EAAKsC,MAAM0pD,8BACrBhC,WAAYhqD,EAAKsC,MAAM2nD,sBACvBJ,cAAe,yCAEe,CAC9BG,WAAYhqD,EAAKsC,MAAM2nD,sBACvBxB,SAAUzoD,EAAKsC,MAAM4nD,oBACrBzK,WAAYz/C,EAAKsC,MAAMuoD,sBACvB9lC,MAAO/kB,EAAKsC,MAAMwoD,iBAClBC,OAAQ/qD,EAAKsC,MAAM0oD,kBACnB7B,QAASnpD,EAAKsC,MAAM2oD,mBACpBZ,aAAcrqD,EAAKsC,MAAM4oD,wBACzBrN,QAAS79C,EAAKsC,MAAM6oD,mBACpBrN,SAAU,WACVE,OAAQ,KACRoN,SAAU,8CAEyB,CACnC3L,WAAYz/C,EAAKsC,MAAMuoD,sBACvB9lC,MAAO/kB,EAAKsC,MAAMwoD,4DAEuB,CACzCrL,WAAYz/C,EAAKsC,MAAMioD,2BACvBxlC,MAAO/kB,EAAKsC,MAAMkoD,gDAEM,CACxB1M,SAAU,WACVE,OAAQ,wBAES,CACjBQ,QAAS,yCAEsB,CAC/BV,SAAU,QACV18B,IAAK,OACLd,KAAM,OACNyqC,OAAQ,OACRlN,QAAS,IACT1iB,OAAQ,UACRhzB,MAAO,MACPD,OAAQ,MACRwf,WAAY,SACZqiC,WAAY,SACZC,WAAYhqD,EAAKsC,MAAM2nD,sBACvBxB,SAAUzoD,EAAKsC,MAAM4nD,yDAEc,CACnC+B,UAAW,cACXC,QAAS,OACT/B,OAAQ,IACRhB,QAAS,UACTzhC,WAAY,SACZqiC,WAAY,SACZC,WAAYhqD,EAAKsC,MAAM6pD,qBACvB1D,SAAUzoD,EAAKsC,MAAM8pD,mBACrBrB,OAAQ/qD,EAAKsC,MAAM+pD,eACnBtnC,MAAO/kB,EAAKsC,MAAMgqD,cAClB7M,WAAYz/C,EAAKsC,MAAMiqD,wBACvBC,WAAY,OACZC,iBAAkB,OAClBC,cAAe,OACfrC,aAAc,kCAEc,CAC5B4B,UAAW,cACXC,QAAS,OACT/B,OAAQ,IACRhB,QAAS,SAAWnpD,EAAKsC,MAAMqqD,oBAAsB,KACrDjlC,WAAY,SACZqiC,WAAY,SACZC,WAAYhqD,EAAKsC,MAAMsqD,mBACvBnE,SAAUzoD,EAAKsC,MAAMomD,iBACrBmE,UAAW7sD,EAAKsC,MAAMwqD,kBACtB/B,OAAQ/qD,EAAKsC,MAAM+pD,eACnBtnC,MAAO/kB,EAAKsC,MAAMgqD,cAClB7M,WAAYz/C,EAAKsC,MAAMiqD,wBACvBC,WAAY,OACZC,iBAAkB,OAClBC,cAAe,OACfrC,aAAc,gDAE4B,CAC1C3iC,WAAY,SACZqiC,WAAY,SACZC,WAAYhqD,EAAKsC,MAAM2nD,sBACvBxB,SAAUzoD,EAAKsC,MAAM4nD,oBACrBnlC,MAAO,UACP06B,WAAY,UACZ0K,OAAQnqD,EAAKsC,MAAM8nD,sBACnBC,aAAcrqD,EAAKsC,MAAMgoD,4BACzBT,cAAe,8CAEoB,CACnCniC,WAAY,SACZqiC,WAAY,SACZC,WAAYhqD,EAAKsC,MAAM2nD,sBACvBxB,SAAUzoD,EAAKsC,MAAM4nD,oBACrBnlC,MAAO,UACP06B,WAAY,UACZ0K,OAAQnqD,EAAKsC,MAAM8nD,sBACnBC,aAAcrqD,EAAKsC,MAAMgoD,4BACzBT,cAAe,oDAE0B,CACzCpK,WAAYz/C,EAAKsC,MAAMioD,2BACvBxlC,MAAO/kB,EAAKsC,MAAMkoD,4DAEkB,CACpCL,OAAQnqD,EAAKsC,MAAMmoD,uBACnBjM,QAASx+C,EAAKsC,MAAMooD,wBACpBrM,SAAUr+C,EAAKsC,MAAMqoD,yBACrBzE,SAAUlmD,EAAKsC,MAAMsoD,gEAEgB,CACrCljC,WAAY,SACZqiC,WAAY,SACZC,WAAYhqD,EAAKsC,MAAM2nD,sBACvBxB,SAAUzoD,EAAKsC,MAAM4nD,oBACrBzK,WAAYz/C,EAAKsC,MAAMuoD,sBACvB9lC,MAAO/kB,EAAKsC,MAAMwoD,iBAClBC,OAAQ/qD,EAAKsC,MAAM0oD,kBACnB7B,QAASnpD,EAAKsC,MAAM2oD,mBACpBZ,aAAcrqD,EAAKsC,MAAM4oD,wBACzBrN,QAAS79C,EAAKsC,MAAM6oD,mBACpBC,SAAU,SACV3jC,WAAY,yCAEkB,CAC9BC,WAAY,SACZqiC,WAAY,SACZC,WAAYhqD,EAAKsC,MAAM2nD,sBACvBxB,SAAUzoD,EAAKsC,MAAM4nD,oBACrBzK,WAAYz/C,EAAKsC,MAAMuoD,sBACvB9lC,MAAO/kB,EAAKsC,MAAMwoD,iBAClBC,OAAQ/qD,EAAKsC,MAAM0oD,kBACnB7B,QAASnpD,EAAKsC,MAAM2oD,mBACpBZ,aAAcrqD,EAAKsC,MAAM4oD,wBACzBrN,QAAS79C,EAAKsC,MAAM6oD,mBACpBC,SAAU,SACV3jC,WAAY,SACZ0T,OAAQn7B,EAAKsC,MAAM+oD,2DAEoB,CACvC5L,WAAYz/C,EAAKsC,MAAMyqD,oCAGvB7D,EAAID,IACNvgD,OAAOC,KAAKugD,EAAID,IAAYr3C,KAAI,SAAUrR,GACxC8F,EAAG/D,MAAM/B,GAAQ2oD,EAAID,GAAW1oD,OAKtCP,EAAK62C,SAAW,SAAUl0C,GACxB3C,EAAK4F,WAAajD,EAClB3C,EAAKm2C,UAEPn2C,EAAKm2C,OAAS,WACRn2C,EAAKmP,aACPnP,EAAKoP,WAAapP,EAAK4F,WAAWwJ,WAClCpP,EAAKqI,IAAMrI,EAAKoP,WAAW0O,QAC3B9d,EAAK4B,OAAS5B,EAAKoP,WAAWxN,OAC9B5B,EAAKgiC,aAAehiC,EAAKoP,WAAW4yB,aACpChiC,EAAK+yC,YAAc/yC,EAAK4B,SAExB5B,EAAKgiC,aAAehiC,EAAKgiC,cAAgB77B,SAAS+1C,cAAc,SAChEl8C,EAAKgiC,aAAagrB,OAAShtD,EAAKsB,KAAK+4C,KACrCr6C,EAAK67C,kBACH77C,EAAKgiC,aACL,iCAEFhiC,EAAKmP,aAAc,EACnBnP,EAAKkE,cAAgBlE,EAAK4F,WAC1B5F,EAAKitD,eAAiB,YAAY3pD,KAAKtD,EAAKkE,cAAcvC,SACtD3B,EAAKitD,eACPjtD,EAAK4B,OAAS5B,EAAKkE,eAEnBlE,EAAK4B,OAASuE,SAAS+1C,cAAc,UACrCl8C,EAAKkE,cAAcE,YAAYpE,EAAK4B,SAEtCuE,SAASkmC,KAAKjoC,YAAYpE,EAAKgiC,cAC/BhiC,EAAK67C,kBAAkB77C,EAAK4B,OAAQ,mBACpC5B,EAAKqI,IAAMrI,EAAK4B,OAAOsrD,WAAW,MAClCltD,EAAKqI,IAAI8kD,aAAe,aACxBntD,EAAK+yC,YAAc/yC,EAAK4B,QAE1B5B,EAAKg5B,gBAAkBh5B,EAAK4B,OAAOU,MACnCtC,EAAKgiC,aAAakb,aAAa,YAAY,GAC3Cl9C,EAAKgiC,aAAah9B,iBAAiB,QAAQ,SAAUrC,GAC/CA,EAAE+C,SAAW1F,EAAK4B,SACpB5B,EAAK4jB,UAAW,MAGpB5jB,EAAK+yC,YAAY/tC,iBAAiB,SAAUhF,EAAKqC,QAAQ,GACzDrC,EAAK+yC,YAAY/tC,iBAAiB,aAAchF,EAAKurC,YAAY,GACjEvrC,EAAK+yC,YAAY/tC,iBAAiB,YAAahF,EAAKqhC,WAAW,GAC/DrhC,EAAK+yC,YAAY/tC,iBAAiB,WAAYhF,EAAK2jC,UAAU,GAC7D3jC,EAAK+yC,YAAY/tC,iBAAiB,QAAShF,EAAKk9B,OAAO,GACvDz7B,OAAOuD,iBAAiB,UAAWhF,EAAK25B,SAAS,GACjDl4B,OAAOuD,iBAAiB,YAAahF,EAAKo5B,WAC1Cp5B,EAAKA,EAAKmP,YAAc,aAAe,eAAenK,iBACpD,QACAhF,EAAK+jC,aACL,GAEF/jC,EAAK4B,OAAOoD,iBAAiB,cAAehF,EAAKg8B,kBAAkB,GACnEh8B,EAAKgiC,aAAah9B,iBAAiB,OAAQhF,EAAKwoC,MAChDxoC,EAAKgiC,aAAah9B,iBAAiB,MAAOhF,EAAKqoC,KAC/CroC,EAAKgiC,aAAah9B,iBAAiB,QAAShF,EAAK0nC,OACjD1nC,EAAKgiC,aAAah9B,iBAAiB,WAAYhF,EAAK0jC,UAAU,GAC9D1jC,EAAKgiC,aAAah9B,iBAAiB,QAAShF,EAAKyjC,OAAO,GACxDzjC,EAAKgiC,aAAah9B,iBAAiB,UAAWhF,EAAKqiC,SAAS,GAC5D5gC,OAAOuD,iBAAiB,SAAUhF,EAAKqC,SC3yB3C,IAAM+qD,qBAAuB,SAAUz7C,EAAiB07C,+BACjBA,KAA9Bj+B,OAAeC,UAClBA,EAAcD,EAAe,OAAO,UACpCk+B,GAAW,EACN5pD,EAAI,EAAGA,EAAIiO,EAAgB7L,OAAQpC,IAAK,KACzCmO,EAAQF,EAAgBjO,QAC1B0rB,EAAgBvd,EAAM,GAAK,OAC3Bud,GAAiBvd,EAAM,IAAMwd,GAAexd,EAAM,GAAI,CACxDF,EAAgBjO,GAAK,CAAC0rB,EAAexnB,KAAK0U,IAAI+S,EAAaxd,EAAM,KACjEy7C,GAAW,WAGTl+B,GAAiBvd,EAAM,GAAI,CAC7BF,EAAgBjO,GAAK,CAACmO,EAAM,GAAIjK,KAAK0U,IAAI+S,EAAaxd,EAAM,KAC5Dy7C,GAAW,UAIVA,GAAU37C,EAAgB9N,KAAK,CAACurB,EAAeC,IAEpD1d,EAAgBI,KAAK,SAACC,EAAGhF,iCAAMgF,EAAE,GAAKhF,EAAE,oBACnC,IAAItJ,EAAI,EAAGA,EAAIiO,EAAgB7L,OAAS,EAAGpC,IAAK,KAC7CmO,EAAQF,EAAgBjO,GACxB6pD,EAAY57C,EAAgBjO,EAAI,GAClC6pD,EAAU,IAAM17C,EAAM,GAAK,IAC7BF,EAAgBjO,GAAK,CAACmO,EAAM,GAAIjK,KAAK0U,IAAIzK,EAAM,GAAI07C,EAAU,KAC7D57C,EAAgB+a,OAAOhpB,EAAI,EAAG,GAC9BA,YAGG,GChCM,uBAAU1D,YAw+BdwtD,EAASC,EAAU1+C,EAAMC,WAC5BgG,GAAS,EACPg7B,EACS,SAAbyd,EAAsBztD,EAAK8gB,YAAc9gB,EAAK6e,eACvCnb,EAAIssC,EAAUlqC,OAAS,EAAGpC,GAAK,EAAGA,IAAK,KACxCqb,EAASixB,EAAUtsC,GACnB8K,EAAMuQ,EAAO,GAAGhQ,KACpBuN,EAAMyC,EAAOA,EAAOjZ,OAAS,GAAGkJ,MAC9BD,GAAQP,GAAOQ,GAAMsN,MACnBvN,IAASP,GAAOQ,IAAOsN,GAAyB,IAAlByC,EAAOjZ,OAAc,gBAIpD,IAAImqC,EAAK,EAAGA,EAAKlxB,EAAOjZ,OAAQmqC,IAAM,KACnCh8B,EAAI8K,EAAOkxB,QACblhC,EAAOkF,EAAEjF,QACTD,GAAQkF,EAAElF,KAAM,IACdC,EAAKiF,EAAEjF,GAAI,IACTD,IAASkF,EAAElF,YACbihC,EAAUtjB,OAAOhpB,EAAG,EAAG,CAAC,CAAEqL,KAAAA,EAAMC,GAAAA,EAAIxF,WAAW,UAC/CxJ,EAAKy9B,gBAGD,IAAI76B,kCAA2B6qD,OAEnCz+C,IAAOiF,EAAEjF,IACPD,IAASkF,EAAElF,KAAM,OAEvBiG,GAAS,WAGPhG,GAAMiF,EAAElF,KAAM,IACZC,EAAKiF,EAAEjF,GAAI,MAAM,IAAIpM,kCAA2B6qD,IACpDzd,EAAUtjB,OAAOhpB,EAAG,EAAG,CAAC,CAAEqL,KAAAA,EAAMC,GAAAA,EAAIxF,WAAW,UAE/CuV,EAAO2N,OAAOujB,EAAI,EAAG,CAAElhC,KAAAA,EAAMC,GAAAA,EAAIxF,WAAW,gBAE9CxJ,EAAKy9B,eAGHzoB,SACJ+J,EAAOlb,KAAK,CAAEkL,KAAAA,EAAMC,GAAAA,EAAIxF,WAAW,SACnCxJ,EAAKy9B,WAGHzoB,EAAQg7B,EAAUnsC,KAAK,CAAC,CAAEkL,KAAAA,EAAMC,GAAAA,EAAIxF,WAAW,KAC9CwmC,EAAU13B,QAAQ,CAAC,CAAEvJ,KAAAA,EAAMC,GAAAA,EAAIxF,WAAW,KAC/CxJ,EAAKy9B,mBASEiwB,EAAY1d,EAAWjhC,EAAMC,OAC/B,IAAItL,EAAI,EAAGA,EAAIssC,EAAUlqC,OAAQpC,YAC9Bqb,EAASixB,EAAUtsC,GAChBusC,EAAK,EAAGA,EAAKlxB,EAAOjZ,OAAQmqC,IAAM,KACnCnhC,EAAQiQ,EAAOkxB,MACjBnhC,EAAMC,OAASA,GAAQD,EAAME,KAAOA,SAClC+P,EAAOjZ,QAAU,EAAGkqC,EAAUtjB,OAAOhpB,EAAG,GACvCqb,EAAO2N,OAAOujB,EAAI,QACvBjwC,EAAKy9B,WAhiCbz9B,EAAKk5C,eAAiB,SAAUj2C,WAC1B0qD,EAAO,IAAIC,WAAW,GAExBrmB,EADO,IAAIqmB,WAAW,GACTD,EAAO,EACpBr/C,EAAI,GACCrL,GAAK,GACVqL,EAAI0lB,OAAO65B,aAAc5qD,EAAIskC,EAAOomB,GAAQr/C,EAC5CrL,EAAI2E,KAAKsxB,MAAMj2B,EAAIskC,GAAO,SAErBj5B,GAWTtO,EAAKy4C,aAAe,SAAUxqC,EAAGkI,OAC3B7H,EAAItO,EAAKuO,eACTD,EAAExI,OAASqQ,QACP,IAAIvT,MAAM,6CAElB5C,EAAKsyC,eAAerkC,EAAGK,GACvBA,EAAEoe,OAAOvW,EAAO,EAAGlI,GAEnBjO,EAAKyW,aAAa5V,SAAQ,SAAUie,EAAKpX,GACvC1H,EAAK2wC,kBAAkB7xB,EAAK7Q,EAAGvG,MAEjC1H,EAAKsB,KAAKuB,OAASyL,EAEnBtO,EAAKy9B,WAUPz9B,EAAK04C,aAAe,SAAUviC,OACxBtT,EAAS7C,EAAKuO,YAGlBvO,EAAKyW,aAAa5V,SAAQ,SAAUie,UAC3BA,EAAIjc,EAAOsT,GAAOjR,SAG3BrC,EAAO6pB,OAAOvW,EAAO,GACrBnW,EAAKsB,KAAKuB,OAASA,EAEnB7C,EAAKy9B,WAUPz9B,EAAK24C,UAAY,SAAU1qC,OACrBK,EAAItO,EAAKuO,YACbvO,EAAKsyC,eAAerkC,EAAGK,GACvBA,EAAEzK,KAAKoK,GACPjO,EAAKyW,aAAa5V,SAAQ,SAAUie,EAAKpX,GACvC1H,EAAK2wC,kBAAkB7xB,EAAK7Q,EAAGvG,MAEjC1H,EAAKsB,KAAKuB,OAASyL,EAEnBtO,EAAKy9B,WASPz9B,EAAKu4C,UAAY,SAAUpiC,GACzBnW,EAAKyW,aAAaiW,OAAOvW,EAAO,GAChCnW,EAAKm4C,YACLn4C,EAAKqC,QAAO,IAUdrC,EAAKs4C,UAAY,SAAUtoC,EAAGmG,MACxBnW,EAAKyW,aAAa3Q,OAASqQ,QACvB,IAAIvT,MAAM,8CAElB5C,EAAKyW,aAAaiW,OAAOvW,EAAO,EAAGnG,GACnChQ,EAAKuO,YAAY1N,SAAQ,SAAUoN,QACf/G,IAAd8I,EAAE/B,EAAE/I,OACNlF,EAAK2wC,kBAAkB3wC,EAAKyW,aAAaN,GAAQlI,EAAGkI,MAKxDnW,EAAKm4C,YAELn4C,EAAKqC,QAAO,IASdrC,EAAKw4C,OAAS,SAAUxoC,GACtBhQ,EAAKyW,aAAa5S,KAAKmM,GACvBhQ,EAAKuO,YAAY1N,SAAQ,SAAUoN,QACf/G,IAAd8I,EAAE/B,EAAE/I,OACNlF,EAAK2wC,kBACH3wC,EAAKyW,aAAazW,EAAKyW,aAAa3Q,OAAS,GAC7CmI,EACAjO,EAAKyW,aAAa3Q,OAAS,MAMjC9F,EAAKm4C,YAELn4C,EAAKqC,QAAO,IAUdrC,EAAK44C,aAAe,SAAUlxC,EAAUQ,GACtClI,EAAK+W,MAAM1E,KAAK3K,GAAYQ,EAC5BlI,EAAK6I,MAAK,IAUZ7I,EAAK64C,eAAiB,SAAU54B,EAAU9X,GACxCnI,EAAK+W,MAAMjC,QAAQmL,GAAY9X,EAC/BnI,EAAK6I,MAAK,IASZ7I,EAAK84C,kBAAoB,WACvB94C,EAAK+W,MAAMjC,QAAU,GACrB9U,EAAK6I,MAAK,IASZ7I,EAAK+4C,gBAAkB,WACrB/4C,EAAK+W,MAAM1E,KAAO,GAClBrS,EAAK6I,MAAK,IAUZ7I,EAAKm4C,UAAY,SAAU1hB,EAAQxP,QAClB/f,IAAXuvB,QAAkCvvB,IAAV+f,EAC1BjnB,EAAKorB,cAAgB,IACZqL,GAAqB,KAAVxP,QAA0B/f,IAAV+f,GAGpCjnB,EAAKorB,cAAcqL,GAAUxP,EACzBjnB,EAAKE,WAAW4tD,mBAClB9tD,EAAKimB,WAAW5T,KAAKxO,KAAK,GAC1B7D,EAAKoS,OAAO0C,QAAQjU,SAAQ,SAAUomB,EAAO9Q,GAC3CnW,EAAKimB,WAAWnR,QAAQjR,KAAKsS,eAN1BnW,EAAKorB,cAAcqL,GAUvB/tB,OAAOC,KAAK3I,EAAKorB,eAAetlB,SACnC9F,EAAKimB,WAAa,CAChB5T,KAAM,GACNyC,QAAS,KAGb9U,EAAKy9B,WASPz9B,EAAKq3C,iBAAmB,SAAU3vC,WACKR,IAAjClH,EAAKkd,YAAYnV,EAAEL,SACf,IAAI+yC,+BACK/yC,4BAA0B1H,EAAKkd,YAAYnV,EAAEjC,oBAGvD9F,EAAKkd,YAAYnV,EAAEL,IAS5B1H,EAAKo3C,qBAAuB,SAAUzvC,OAChCjE,EAAIkE,KAAK0U,IAAI3U,EAAc,EAAG,WACJT,IAA1BlH,EAAKkd,YAAYjW,EAAEvD,SACf,IAAId,MAAM,qCAGhB5C,EAAKkd,YAAYjW,EAAEvD,GACnB1D,EAAKiP,eAAejP,EAAKoS,OAAO0C,QAAQnN,KAa5C3H,EAAK+2C,SAAW,SAAU9vC,EAAGc,EAAGgmD,EAASC,OAGrC5mD,EAFE6mD,OAAgB/mD,IAAND,OAAkBC,EAAYlH,EAAKo3C,qBAAqBnwC,GACpEinD,OAAgBhnD,IAANa,OAAkBb,EAAYlH,EAAKq3C,iBAAiBtvC,GAE9DmvB,EACEl3B,EAAKqT,UAAUlL,OACdnI,EAAKqT,UAAU4K,mBAAqBje,EAAKsC,MAAM8U,eAAiB,GACnE+2C,EACEnuD,EAAKqT,UAAUnL,QACdlI,EAAKqT,UAAUqK,qBAAuB1d,EAAKsC,MAAM8U,eAAiB,GAGvE62C,GAAW/2B,GAFX62B,OAAsB7mD,IAAZ6mD,EAAwB,EAAIA,GAGtCG,GAAWC,GAFXH,OAAsB9mD,IAAZ8mD,EAAwB,EAAIA,QAG5B9mD,IAAND,QAAyBC,IAANa,GACrB/H,EAAKqT,UAAU+wB,SAAS6pB,EAASC,GACjC9rD,uBAAsB,YACpBgF,EAAOpH,EAAKugC,sBAAsBt5B,EAAGc,MAMrCkmD,GAAW7mD,EAAKe,MAAQ4lD,EACxBG,GAAW9mD,EAAKc,OAAS8lD,EACzBhuD,EAAKqT,UAAU+wB,SAAS6pB,EAASC,aAEpBhnD,IAAND,EACTjH,EAAKqT,UAAUC,WAAa26C,OACb/mD,IAANa,IACT/H,EAAKqT,UAAUc,UAAY+5C,IAU/BluD,EAAKg3C,QAAU,SAAUjvC,GACvB/H,EAAK+2C,SAAS,EAAGhvC,IAanB/H,EAAKi3C,UAAY,SAAUtvC,EAAaD,EAAUoD,EAAQg9B,EAAO4d,OAC3DrgB,EAAQrlC,EAAKyS,aAAa1N,QAAO,SAAUkJ,UACtCA,EAAE+M,kBAAoBrT,GAAesG,EAAE6M,eAAiBpT,KAGjE1H,EAAK6mD,aACH,CACEzlC,IAAKikB,EAAM,GAAGt9B,EAAIs9B,EAAM,GAAGn9B,OAAS4C,EAAO/C,EAC3CuY,KAAM+kB,EAAM,GAAGp+B,EAAIo+B,EAAM,GAAGl9B,MAAQ2C,EAAO7D,GAE7C6gC,EACA4d,IAYJ1lD,EAAKk3C,uBAAyB,SAAUkX,OACjC,IAAIroD,KAAQqoD,EAAU,oCACXA,EAASroD,wCAAdoI,UACHA,EAAErI,OAAS,GAAG9F,EAAKi8B,mBAAmB9tB,EAAE,GAAIA,EAAE,GAAIpI,mCAE1D/F,EAAK6I,QAWP7I,EAAKm3C,uBAAyB,SAAUiX,OACjC,IAAIroD,KAAQqoD,EAAU,oCACXA,EAASroD,wCAAdoI,UACHA,EAAErI,OAAS,GAAG9F,EAAK8jC,uBAAuB31B,EAAE,GAAIA,EAAE,GAAIpI,mCAE9D/F,EAAK6I,QAaP7I,EAAKujC,eAAiB,SAAUt8B,EAAGc,EAAGgmD,EAASC,OACvCj9B,EAAU/wB,EAAKyS,aAAa1N,QAAO,SAAUqC,UAE9CA,EAAKM,WAAaK,QAAWb,IAANa,KACvBX,EAAKO,cAAgBV,QAAWC,IAAND,IAC3BG,EAAKH,EAAI,GACTG,EAAKW,EAAI,GACTX,EAAKH,EAAIG,EAAKe,MAAQnI,EAAKmI,OAC3Bf,EAAKW,EAAIX,EAAKc,OAASlI,EAAKkI,UAGT,IAAnB6oB,EAAQjrB,aAAsBoB,IAAND,QAAyBC,IAANa,IAG3CgpB,EAAQ,GAAG9pB,EAAIjH,EAAK6Q,yBACpBkgB,EAAQ,GAAGhpB,EAAI/H,EAAK2Q,+BAEpBogB,EAAQjrB,OAAS,GAEE,IAAnBirB,EAAQjrB,QACV9F,EAAK+2C,SAAS9vC,EAAGc,EAAGgmD,EAASC,IAWjChuD,EAAK89B,cAAgB,SAAU72B,EAAGc,QACf,IAANd,IACPA,EAAI,IACNA,EAAI,GAEFc,EAAI,IACNA,EAAI,GAEN/H,EAAKoV,WAAa,CAChB1N,SAAUK,EACVJ,YAAaV,KAUjBjH,EAAK2iC,WAAa,SAAU1J,GAC1Bj5B,EAAKua,WAAa,GAClBva,EAAK2a,aAAe,GACpB3a,EAAK+a,gBAAkB,GACvB/a,EAAKmC,cAAc,mBAAoB,CACrC4yB,aAAc/0B,EAAKo8B,kBACnB7hB,WAAYva,EAAKua,WACjBgiB,gBAAiBv8B,EAAKu8B,gBACtBF,cAAer8B,EAAKs8B,qBAElBrD,GAGJj5B,EAAK6I,QASP7I,EAAK+9B,UAAY,SAAU9E,GACzBj5B,EAAKy8B,WAAW,CACdrb,IAAK,EACLd,MAAO,EACPC,MAAOvgB,EAAKuO,YAAYzI,OAAS,EACjCub,OAAQrhB,EAAKiQ,SAASnK,OAAS,IAE7BmzB,GAGJj5B,EAAK6I,QASP7I,EAAKg/B,iBAAmB,SAAUr3B,OAC5B0mD,GAAgB,SACpBruD,EAAKiQ,SAASpP,SAAQ,SAAUie,EAAKpX,GAEhC1H,EAAKua,WAAW7S,KACmC,IAApD1H,EAAKua,WAAW7S,GAAUkT,QAAQjT,KAElC0mD,GAAgB,MAGbA,GAUTruD,EAAKsuD,cAAgB,SAAU5mD,OACxB1H,EAAKua,WAAW7S,GAAW,OAAO,MACnC6mD,GAAgB,SACPvuD,EAAKonC,mBACXvmC,SAAQ,SAAUqf,EAAK/J,GAEzBnW,EAAKua,WAAW7S,KAC6B,IAA9C1H,EAAKua,WAAW7S,GAAUkT,QAAQzE,KAElCo4C,GAAgB,MAGbA,GAWTvuD,EAAK4kC,oBAAsB,SAAUrP,EAAIyZ,OACnCh/B,EAAI,GACN1B,EAAI0gC,EAAchvC,EAAKuO,YAAcvO,EAAKonC,mBAC1Ch5B,EAAIpO,EAAKiQ,SAASnK,OACpB9F,EAAKua,WAAW1Z,SAAQ,SAAUie,EAAK3I,GACjCA,IAAU/H,IAGK,IAAf0Q,EAAIhZ,QAIRkK,EAAEmG,GAAS,GACX2I,EAAIje,SAAQ,SAAUqf,IACP,IAATA,GAAe5R,EAAE4R,IAGrBqV,EAAGv1B,EAAKiQ,SAAUkG,EAAO7H,EAAE4R,GAAKhb,UARhC8K,EAAEmG,GAAS,UAsBjBnW,EAAKogC,aAAe,SAAUz4B,EAAaqyB,EAAMjnB,EAAOy7C,OAClDlgD,EAAG3L,EAAGsE,EAWSvD,WARV+qD,EAAO/qD,GACd1D,EAAKiQ,SAASpP,SAAQ,SAAUie,EAAKpX,GACnC1H,EAAKua,WAAW7S,GAAY1H,EAAKua,WAAW7S,IAAa,IACX,IAA1C1H,EAAKua,WAAW7S,GAAUkT,QAAQlX,IACpC1D,EAAKua,WAAW7S,GAAU7D,KAAKH,SANrC1D,EAAK87B,qBAAsB,EAC3B97B,EAAK67B,wBAAyB,EAoB1B9oB,EAAO,KACJ/S,EAAKoV,sBAGV9G,EAAI1G,KAAK4G,IAAIxO,EAAKoV,WAAWzN,YAAaA,GAC1ChF,EAAIiF,KAAK0U,IAAItc,EAAKoV,WAAWzN,YAAaA,GACrCV,EAAIqH,EAAG3L,EAAIsE,EAAGA,GAAK,EACtBwnD,EAAOxnD,IACkC,IAArCjH,EAAK+a,gBAAgBH,QAAQ3T,IAC/BjH,EAAK+a,gBAAgBlX,KAAKoD,GAE1BqH,GAAK3L,IAAG3C,EAAK67B,wBAAyB,GAEvC7B,GAASjnB,IACZ/S,EAAKua,WAAa,GAClBva,EAAK+a,gBAAkB,GACvB/a,EAAKoV,WAAWzN,YAAcA,EAC9B3H,EAAKoV,WAAW1N,SAAW1H,EAAKqU,gBAE9B2lB,GAAQh6B,EAAKg/B,iBAAiBr3B,IA9BfjE,EA+BPiE,EA9BV3H,EAAKiQ,SAASpP,SAAQ,SAAUie,EAAKpX,GACnC1H,EAAKua,WAAW7S,GAAY1H,EAAKua,WAAW7S,IAAa,IACX,IAA1C1H,EAAKua,WAAW7S,GAAUkT,QAAQlX,IACpC1D,EAAKua,WAAW7S,GAAUglB,OACxB1sB,EAAKua,WAAW7S,GAAUkT,QAAQlX,GAClC,MA0BN1D,EAAK+a,gBAAgB2R,OAAO/kB,EAAa,KAEzC8mD,EAAO9mD,GACP3H,EAAK+a,gBAAgBlX,KAAK8D,IAExB6mD,GAGJxuD,EAAKmC,cAAc,mBAAoB,CACrC4yB,aAAc/0B,EAAKo8B,kBACnB7hB,WAAYva,EAAKua,WACjBgiB,gBAAiBv8B,EAAK47B,qBACtBS,cAAer8B,EAAKs8B,sBAaxBt8B,EAAKw8B,UAAY,SAAU90B,EAAUsyB,EAAMjnB,EAAOy7C,OAC5CvnD,EACFynD,EACA5+C,EACAxB,EAAItO,EAAKonC,4BAEFunB,IACHH,GAGJxuD,EAAKmC,cAAc,mBAAoB,CACrC4yB,aAAc/0B,EAAKo8B,kBACnB7hB,WAAYva,EAAKua,WACjBgiB,gBAAiBv8B,EAAKu8B,gBACtBF,cAAer8B,EAAKs8B,8BAGfkc,EAAO/E,GACdzzC,EAAKua,WAAWk5B,GAAM,GACtBzzC,EAAKua,WAAWk5B,GAAI5vC,MAAM,GAC1ByK,EAAEzN,SAAQ,SAAUqf,EAAK/J,GACvBnW,EAAKua,WAAWk5B,GAAI5vC,KAAK7D,EAAKoS,OAAO0C,QAAQ8F,QAAQsF,EAAI/J,SAExC,IAAf+J,EAAI/J,QAGG,IAFPnW,EAAK+a,gBAAgBH,QACnB5a,EAAKoS,OAAO0C,QAAQ8F,QAAQsF,EAAI/J,SAGlCnW,EAAK+a,gBAAgBlX,KAAK7D,EAAKoS,OAAO0C,QAAQ8F,QAAQsF,EAAI/J,cAvBhEnW,EAAK87B,qBAAsB,IA0BK,IAA5B97B,EAAKk8B,yBAAoDh1B,IAApBlH,EAAK4uD,aAE1C5uD,EAAKua,WAAW7S,IAChB1H,EAAKua,WAAW7S,GAAU5B,OAAS,IAAMwI,EAAExI,QAEvCk0B,SACFh6B,EAAKua,WAAW7S,GAAY,QAC5BinD,QAK0B,IAA5B3uD,EAAKk8B,yBAAmDh1B,IAApBlH,EAAK4uD,cACvC77C,QAA6B7L,IAApBlH,EAAK4uD,WAA0B,KACrC5uD,EAAKoV,sBAGVs5C,EAAK9mD,KAAK4G,IAAIxO,EAAKoV,WAAW1N,SAAUA,GACxCoI,EAAKlI,KAAK0U,IAAItc,EAAKoV,WAAW1N,SAAUA,GACnCT,EAAIynD,EAAI5+C,GAAM7I,EAAGA,GAAK,EACzBuxC,EAAOvxC,GACPjH,EAAK2a,aAAa9W,KAAKoD,QAGzBuxC,EAAO9wC,GACP1H,EAAK2a,aAAe,GACpB3a,EAAK2a,aAAa9W,KAAK6D,GAG3BinD,KASF3uD,EAAKq4C,aAAe,SAAU3wC,GAC5B1H,EAAKmC,cAAc,eAAgB,CACjCuiD,UAAW1kD,EAAKkqB,WAAWxiB,GAC3BnF,KAAMvC,EAAKiQ,SAASvI,GACpBA,SAAUA,IAEZ1H,EAAKgX,aAAatP,GAAU2yC,OAC5Br6C,EAAKgX,aAAatP,GAAUmrC,iBACrB7yC,EAAKgX,aAAatP,UAClB1H,EAAK+W,MAAMoa,MAAMzpB,UACjB1H,EAAKkqB,WAAWxiB,GACvB1H,EAAKmC,cAAc,YAAa,CAC9BqP,WAAYxR,EAAKsC,MAAMkP,aAEzBxR,EAAKqC,QAAO,GACZrC,EAAK6I,MAAK,IASZ7I,EAAKo4C,WAAa,SAAU1wC,OAMxB6H,EALEs/C,EAAS7uD,EAAK63B,KAAKkW,oBAAsB,GAC3Cr9B,EAAyB1Q,EAAK2Q,4BAC9BC,EACE5Q,EAAK+W,MAAMjC,QAAQpF,YAAc1P,EAAKsC,MAAMsO,mBAC9C/D,EAAI7M,EAAK+W,MAAMoa,MAAMzpB,IAAa1H,EAAKsC,MAAMwsD,eAE1C9uD,EAAKkqB,WAAWxiB,KACnBmnD,EAAOltC,MAAQ3hB,EAAKE,WAAWyhB,MAC/BktC,EAAO3pD,KAAOlF,EAAKE,WAAWiqB,eAC1BnqB,EAAKE,WAAWgF,KAAO,OAASwC,OAChCR,EACJ2nD,EAAOvsD,MAAQusD,EAAOvsD,OAAStC,EAAKsC,MACpCusD,EAAOjpD,WAAa,CAClBwJ,WAAYpP,EAAKsB,KACjB4lB,SAAU,uBACVa,aAAclb,EACdib,YAAa9nB,EAAKmI,MAAQyI,EAC1BgF,OAAQ,CAAEzN,MAAOnI,EAAKmI,MAAQyI,GAC9BiC,WAAYjC,EACZgC,UAAWlC,EACXsX,aAAchoB,EAAKsB,KAAKsE,WACxBA,WAAY5F,EAAKsB,KAAKsE,WACtBtD,MAAO,OACPC,KAAMvC,EAAKiQ,SAASvI,IAEtB6H,EAAWvP,EAAKoqB,WAAWykC,GAC3B7uD,EAAKkqB,WAAWxiB,GAAY6H,IAE9BA,EAAWvP,EAAKkqB,WAAWxiB,IAClB2H,SAAU,EACnBrP,EAAKmC,cAAc,aAAc,CAC/BoN,SAAUA,EACVhN,KAAMvC,EAAKiQ,SAASvI,GACpBA,SAAUA,IAEZ1H,EAAKgX,aAAatP,GAAY6H,EAC9BvP,EAAK+W,MAAMoa,MAAMzpB,GAAYmF,EAC7B7M,EAAKmC,cAAc,YAAa,CAAE+F,OAAQlI,EAAKsC,MAAMkP,aACrDxR,EAAKqC,QAAO,IASdrC,EAAKm+B,WAAa,SAAUz2B,MAClB1H,EAAKgX,aAAatP,UAEjB1H,EAAKq4C,aAAa3wC,GAE3B1H,EAAKo4C,WAAW1wC,IAWlB1H,EAAKsxC,gBAAkB,SAAUpsC,OAC3B+B,EACFvD,EAAI1D,EAAKuO,gBACNtH,EAAI,EAAGA,EAAIvD,EAAEoC,OAAQmB,GAAK,KACzBvD,EAAEuD,GAAG/B,OAASA,SACTxB,EAAEuD,IAYfjH,EAAKm5C,YAAc,SAAU4V,EAAuBC,OAC5CnsD,EAAS7C,EAAKuO,YACd6D,EAASpS,EAAKoS,OAAO0C,QACrBm6C,EAAgB,GACa,iBAAxBD,IACTA,EAAsBD,OAEtB,IAAI9+B,EAAa8+B,EACjB9+B,GAAc++B,EACd/+B,IACA,KACMtoB,EAAcyK,EAAO6d,GACvBtoB,GAAe,IAAM9E,EAAO8E,GAAaiH,SAC3CqgD,EAAcprD,KAAK8D,GACnB9E,EAAO8E,GAAaiH,QAAS,EAE7B5O,EAAKmC,cAAc,aAAc,CAC/BwF,YAAAA,KAKFsnD,EAAcnpD,OAAS,IACzB9F,EAAKw9B,iBACLkC,YAAW,WACT1/B,EAAKqC,QAAO,KACX,KAGLrC,EAAKmC,cAAc,cAAe,CAChC8sD,cAAAA,KAWJjvD,EAAKq9B,cAAgB,SAAU0xB,EAAuBC,WAC9C58C,EAASpS,EAAKoS,OAAO0C,QACrBjS,EAAS7C,EAAKuO,YAEX7K,EAAIqrD,EAAuBrrD,GAAKsrD,EAAqBtrD,IAAK,KAC3DiE,EAAcyK,EAAO1O,GACrB4K,EAAIzL,EAAO8E,GAEb2G,GAAKA,EAAEM,SACTN,EAAEM,QAAS,EAEX5O,EAAKmC,cAAc,eAAgB,CACjCwF,YAAAA,KAIN3H,EAAKy9B,WAUPz9B,EAAKo5C,SAAW,SAAUhqB,EAAeC,GAErC+9B,qBAAqBptD,EAAK2R,gBAAiB,CAACyd,EAAeC,KAE3DrvB,EAAKy9B,WAUTz9B,EAAKs9B,WAAa,SAAUlO,EAAeC,cACzCrvB,EAAK2R,gBAAkB3R,EAAK2R,gBAAgB5M,OAC1C,SAAC8M,iCAAUA,EAAM,KAAOud,GAAiBvd,EAAM,KAAOwd,eAExDrvB,EAAKy9B,WAUPz9B,EAAK4jC,kBAAoB,SAAU1+B,EAAMgK,MAClClP,EAAK4B,YAIJ+F,EACK,eAATzC,GAAyB,EAAIlF,EAAKsxC,gBAAgBpsC,GAAMiR,MAEpD+4C,EAAUtnD,KAAK0U,IACnBtc,EAAK4yC,wBAAwB1tC,GAC7BlF,EAAKsC,MAAMk8B,gBAGbx+B,EAAK+W,MAAMjC,QAAQnN,GAAeunD,EAElClvD,EAAKmC,cAAc,eAAgB,CACjC8E,EAAGioD,EACHnnD,EAAG/H,EAAKu+B,uBACR/E,aAAcx5B,EAAKyQ,cAGhBvB,IACHlP,EAAKqC,SACLrC,EAAK6I,MAAK,MAad7I,EAAK83C,cAAgB,SAAU1wC,EAAMM,WAElBR,IAAbQ,SAEA1H,EAAKyS,aAAa1N,QAAO,SAAUkJ,UAC1BA,EAAEtG,cAAgBP,GAAQ6G,EAAEvG,WAAaA,KAC/C5B,OAAS,MAGZmB,EACFmH,EAAIpO,EAAKyS,aAAa3M,WACnBmB,EAAI,EAAGA,EAAImH,EAAGnH,GAAK,KAEpBG,EAAKH,IAAMjH,EAAKyS,aAAaxL,GAAGA,GAChCG,EAAKW,IAAM/H,EAAKyS,aAAaxL,GAAGc,SAEzB,SAGJ,GAYT/H,EAAKoW,MAAQ,SACXswB,EACAtqB,EACAgyB,EACA+gB,OAEIvoC,EACF3Y,EAAIjO,EAAKuO,YAAYxJ,QAAO,SAAUmb,UAC7BA,EAAIhb,OAASwhC,SAGtB1mC,EAAKmC,cAAc,mBAAoB,CACrC+C,KAAMwhC,EACNtqB,UAAWA,MAKfpc,EAAKuqB,QAAUmc,EACf1mC,EAAK+qB,eAAiB3O,EACjBpc,EAAKiQ,UAAqC,IAAzBjQ,EAAKiQ,SAASnK,YAGnB,IAAbmI,EAAEnI,aACE,IAAIlD,MAAM,sCAElBgkB,EAAIwnB,GAAgBngC,EAAE,GAAGmhD,QAAUpvD,EAAK0uC,QAAQzgC,EAAE,GAAGlI,aAC7BmB,IAAd+G,EAAE,GAAGlI,MACbmlB,QAAQC,KACN,qDACAld,EAAE,GAAGlI,MAGT/F,EAAK+uB,UAAUof,IACbzH,EACAtqB,EACa,mBAANwK,EAAmBA,EAAI5mB,EAAK0uC,QAAQnrC,QAE7CvD,EAAKy9B,UACLz9B,EAAKmC,cAAc,aAAc,CAC/B+C,KAAMwhC,EACNtqB,UAAWA,IAGT+yC,GAGJnvD,EAAKw9B,mBAwFPx9B,EAAKs3C,aAAe,SAAU+X,EAAiBC,WAGzCC,EAAUC,EADR3sD,EAAS7C,EAAKuO,YAEX7K,EAAI,EAAGA,EAAIb,EAAOiD,OAAQpC,IAAK,KAChCotB,EAAKjuB,EAAOa,MACd6rD,GAAYC,EAAS,MACrB1+B,EAAG5rB,OAASmqD,EAIZv+B,EAAG5rB,OAASoqD,IACdE,EAAU1+B,GAJVy+B,EAAWz+B,MAQVy+B,EAAU,MAAM,IAAI3sD,kDACpB4sD,EAAS,MAAM,IAAI5sD,gDACpB4sD,EAAQ7nD,YAAc4nD,EAAS5nD,cAAgB,EACjD,MAAM,IAAI/E,uCAENmM,EAAOwgD,EAAS5nD,YAChBqH,EAAKwgD,EAAQ7nD,YACbqf,EAAK,CAAElY,MAAO,CAAE/I,KAAM,UAAWgJ,KAAAA,EAAMC,GAAAA,QAE3Cw+C,EAAS,UAAWz+C,EAAMC,GAC1B,MAAOygD,GACPzoC,EAAGyoC,MAAQA,EAEbzvD,EAAKmC,cAAc,mBAAoB6kB,IAUzChnB,EAAKu3C,UAAY,SAAUmY,EAAcC,OAClC9sB,OAAO+sB,UAAUF,IAAiBA,EAAe,EACpD,MAAM,IAAI9sD,wDAENitD,EAAa7vD,EAAKiQ,SAASnK,WAE9B+8B,OAAO+sB,UAAUF,IAClBC,GAAcD,GACdC,GAAcE,EAEd,MAAM,IAAIjtD,kDACNokB,EAAK,CACTlY,MAAO,CACL/I,KAAM,OACNgJ,KAAM2gD,EACN1gD,GAAI2gD,QAINnC,EAAS,OAAQkC,EAAcC,GAC/B,MAAOF,GACPzoC,EAAGyoC,MAAQA,EAEbzvD,EAAKmC,cAAc,mBAAoB6kB,IAUzChnB,EAAKw3C,mBAAqB,SAAU6X,EAAiBC,WAG/CC,EAAUC,EADR3sD,EAAS7C,EAAKuO,YAEX7K,EAAI,EAAGA,EAAIb,EAAOiD,OAAQpC,IAAK,KAChCotB,EAAKjuB,EAAOa,MACd6rD,GAAYC,EAAS,MACrB1+B,EAAG5rB,OAASmqD,EAIZv+B,EAAG5rB,OAASoqD,IACdE,EAAU1+B,GAJVy+B,EAAWz+B,MAQVy+B,EAAU,MAAM,IAAI3sD,kDACpB4sD,EAAS,MAAM,IAAI5sD,iDAClBmM,EAAOwgD,EAAS5nD,YAChBqH,EAAKwgD,EAAQ7nD,YACnB+lD,EAAY1tD,EAAK6e,eAAgB9P,EAAMC,IAUzChP,EAAKy3C,gBAAkB,SAAUiY,EAAcC,GAC7CjC,EAAY1tD,EAAK8gB,YAAa4uC,EAAcC,IAU9C3vD,EAAK03C,mBAAqB,SAAU2X,EAAiBC,WAG/CC,EAAUC,EADR3sD,EAAS7C,EAAKuO,YAEX7K,EAAI,EAAGA,EAAIb,EAAOiD,OAAQpC,IAAK,KAChCotB,EAAKjuB,EAAOa,MACd6rD,GAAYC,EAAS,MACrB1+B,EAAG5rB,OAASmqD,EAIZv+B,EAAG5rB,OAASoqD,IACdE,EAAU1+B,GAJVy+B,EAAWz+B,KAQVy+B,GAAaC,OACZzgD,EAAOwgD,EAAS5nD,YAChBqH,EAAKwgD,EAAQ7nD,YACf3H,EAAKu9B,YAAY,CAAEx3B,KAAM,IAAKgJ,KAAAA,EAAMC,GAAAA,MACtChP,EAAK0rC,qBACL1rC,EAAKw9B,iBACLx9B,EAAKy9B,aAWTz9B,EAAK23C,gBAAkB,SAAU+X,EAAcC,GACzC3vD,EAAKu9B,YAAY,CAAEx3B,KAAM,IAAKgJ,KAAM2gD,EAAc1gD,GAAI2gD,MACxD3vD,EAAK0rC,qBACL1rC,EAAKw9B,iBACLx9B,EAAKy9B,YAITz9B,EAAK26B,SAAW,SAAUh4B,WACpBA,EAAEsE,EAAI,GAAKtE,EAAEsE,EAAIjH,EAAKmI,OAASxF,EAAEoF,EAAI,GAAKpF,EAAEoF,EAAI/H,EAAKkI,SAa3DlI,EAAKkhC,cAAgB,SAAU6sB,EAASC,OAClC8B,EAAM,GACV9vD,EAAK2a,aAAe,GACpB3a,EAAK+a,gBAAkB,GACvB/a,EAAKua,WAAW1Z,SAAQ,SAAUie,EAAKpX,GACrCooD,EAAIpoD,EAAWsmD,GAAW,GAC1BhuD,EAAK2a,aAAa9W,KAAK6D,EAAWsmD,GAClClvC,EAAIje,SAAQ,SAAUof,GACpB6vC,EAAIpoD,EAAWsmD,GAASnqD,KAAKoc,EAAW8tC,IACkB,IAAtD/tD,EAAK+a,gBAAgBH,QAAQqF,EAAW8tC,IAC1C/tD,EAAK+a,gBAAgBlX,KAAKoc,EAAW8tC,SAG3C/tD,EAAKua,WAAau1C,GASpB9vD,EAAK4iC,mBAAqB,SAAU3J,cAC5BmM,EAAgBplC,EAAKuoC,qBAE3BvoC,EAAKmC,cAAc,cAAe,CAChCkjC,MAAOD,IAGLnM,GAIJ72B,sBAAsB,yCAAMpC,EAAK6I,qBAWnC7I,EAAKoJ,OAAS,SAAU0mD,EAAK7oD,EAAGc,OAI5BgoD,EAHEh7B,EAAe/0B,EAAKo8B,kBACtB4zB,EAAgBhwD,EAAKonC,mBACrB6oB,EAAkBH,EAAIhqD,OAEtBoqD,GAAgB/I,EAAAA,EAChBgJ,EAAQhJ,EAAAA,EACRiJ,EAAKroD,EAAI,EAEX+nD,EAAIjvD,SAAQ,SAAUie,EAAKpX,GACrBA,IAAauoD,GAGE,IAAfnxC,EAAIhZ,SAGRqqD,EAAQvoD,KAAK4G,IAAIxO,EAAKqnC,wBAAwBpgC,GAAIkpD,GAClDD,EAAetoD,KAAK0U,IAAI4zC,EAAcpxC,EAAIhZ,QAC1CgZ,EAAIje,SAAQ,SAAUof,GAEpBA,EAAWjgB,EAAKqnC,wBAAwBpnB,GACnC+vC,EAAc/vC,KAIdjgB,EAAKuC,OACRvC,EAAKuC,KAAO,IAETvC,EAAKuC,KAAKmF,KACb1H,EAAKuC,KAAKmF,GAAY,IAGxB1H,EAAKuC,KAAKmF,GAAUsoD,EAAc/vC,GAAU/a,MAAQ,aAIxD4qD,EAAIjvD,SAAQ,SAAUie,EAAK3I,OACrBk6C,EACJD,GAAM,EACNL,EAAK/vD,EAAKqnC,wBAAwBpgC,GAClC6X,EAAIje,SAAQ,SAAUof,EAAUqwC,GAC9BrwC,EAAWjgB,EAAKqnC,wBAAwBpnB,GACpCqwC,EAAO,IAGTP,GAAM9vC,EAAWowC,GAEnBA,EAAkBpwC,GAEF,IAAdA,IACC+vC,EAAcD,KACdC,EAAc/vC,IAEfjgB,EAAKuC,KAAKuD,OAAS,EAAIsqD,GACvBA,EAAK,IAKFpwD,EAAKuC,KAAK6tD,KACbpwD,EAAKuC,KAAK6tD,GAAM,IAGlBpwD,EAAKuC,KAAK6tD,GAAIJ,EAAcD,GAAI7qD,MAC9B6vB,EAAa5e,GAAO65C,EAAc/vC,GAAU/a,cAYpDlF,EAAK43C,yBAA2B,SAAUjwC,OACnC3H,EAAKE,WAAWyvC,qBAAsB,MAAO,WAC5CE,EAAS,GACNnsC,EAAI,EAAGA,EAAI1D,EAAK6e,eAAe/Y,OAAQpC,YACxCqb,EAAS/e,EAAK6e,eAAenb,GAC1Bsb,EAAI,EAAGA,EAAID,EAAOjZ,OAAQkZ,IAAK,KAChClQ,EAAQiQ,EAAOC,MACjBrX,GAAemH,EAAMC,MAAQpH,GAAemH,EAAME,GAAI,CACxD6gC,EAAOhsC,KAAKiL,iBAKX+gC,GAUT7vC,EAAK63C,sBAAwB,SAAUnwC,OAChC1H,EAAKE,WAAW0vC,kBAAmB,MAAO,WACzCC,EAAS,GACNnsC,EAAI,EAAGA,EAAI1D,EAAK8gB,YAAYhb,OAAQpC,YACrCqb,EAAS/e,EAAK8gB,YAAYpd,GACvBsb,EAAI,EAAGA,EAAID,EAAOjZ,OAAQkZ,IAAK,KAChClQ,EAAQiQ,EAAOC,MACjBtX,GAAYoH,EAAMC,MAAQrH,GAAYoH,EAAME,GAAI,CAClD6gC,EAAOhsC,KAAKiL,iBAKX+gC,GAWT7vC,EAAKg4C,gBAAkB,SAAUrwC,UAE7B3H,EAAKyS,aAAa1N,QAAO,SAAUkJ,UAC1BA,EAAEtG,cAAgBA,KACxB7B,OAAS,GAWhB9F,EAAK+3C,aAAe,SAAUrwC,UAE1B1H,EAAKyS,aAAa1N,QAAO,SAAUkJ,UAC1BA,EAAEvG,WAAaA,KACrB5B,OAAS,GAYhB9F,EAAKugC,sBAAwB,SAAUt5B,EAAGc,UACjC/H,EAAKyS,aAAa1N,QAAO,SAAUkJ,UACjCA,EAAEtG,cAAgBV,GAAKgH,EAAEvG,WAAaK,KAC5C,IAUL/H,EAAKk7B,mBAAqB,SAAUj0B,EAAGc,OAC/BwoD,EAAavwD,EAAK2S,6BACpB49C,EAAWzqD,QAAU,OACpB,IAAIpC,EAAI,EAAGA,EAAI6sD,EAAWzqD,OAAQpC,IAAK,KACpCu3B,EAAYs1B,EAAW7sD,MAE3BuD,GAAKg0B,EAAUh0B,GACfc,GAAKkzB,EAAUlzB,GACfd,GAAKg0B,EAAUpb,IACf9X,GAAKkzB,EAAUnb,GAEf,OAAOmb,IAWbj7B,EAAKg9B,iBAAmB,SAAU/1B,EAAGc,QACpB/H,EAAK6e,eAAe/Y,QACrB,MAEViC,GADU/H,EAAKiR,gCAEd,IAAIvN,EAAI,EAAGA,EAAI1D,EAAK0S,cAAc5M,OAAQpC,IAAK,KAC5CuQ,EAAIjU,EAAK0S,cAAchP,MACd,MAAXuQ,EAAElO,OACFkB,GAAKgN,EAAEhN,GAAKc,GAAKkM,EAAElM,GAAKd,GAAKgN,EAAE4L,IAAM9X,GAAKkM,EAAE6L,IAAI,OAAO7L,IAW/DjU,EAAKi9B,cAAgB,SAAUh2B,EAAGc,QACjB/H,EAAK8gB,YAAYhb,QAClB,MAEVmB,GADUjH,EAAK+Q,4BAEd,IAAIrN,EAAI,EAAGA,EAAI1D,EAAK0S,cAAc5M,OAAQpC,IAAK,KAC5CuQ,EAAIjU,EAAK0S,cAAchP,MACd,MAAXuQ,EAAElO,OACFkB,GAAKgN,EAAEhN,GAAKc,GAAKkM,EAAElM,GAAKd,GAAKgN,EAAE4L,IAAM9X,GAAKkM,EAAE6L,IAAI,OAAO7L,IAY/DjU,EAAK2Y,UAAY,SAAU1R,EAAGc,EAAGyoD,YACtBC,EAAUC,UAEfA,EAAQzpD,EAAIypD,EAAQvoD,MAA2C,GAAnCnI,EAAKE,WAAWywD,iBAC1C1pD,GACFypD,EAAQzpD,EAAIypD,EAAQvoD,MAA2C,GAAnCnI,EAAKE,WAAWywD,iBAAyB1pD,EAE9D,IAGPypD,EAAQzpD,EAAuC,GAAnCjH,EAAKE,WAAWywD,iBAAyB1pD,GACrDypD,EAAQzpD,EAAuC,GAAnCjH,EAAKE,WAAWywD,iBAAyB1pD,EAE9C,IAGPypD,EAAQ3oD,EAAI2oD,EAAQxoD,OAA4C,GAAnClI,EAAKE,WAAWywD,iBAC3C5oD,GACF2oD,EAAQ3oD,EAAI2oD,EAAQxoD,OAA4C,GAAnClI,EAAKE,WAAWywD,iBAAyB5oD,EAE/D,IAGP2oD,EAAQ3oD,EAAuC,GAAnC/H,EAAKE,WAAWywD,iBAAyB5oD,GACrD2oD,EAAQ3oD,EAAuC,GAAnC/H,EAAKE,WAAWywD,iBAAyB5oD,EAE9C,cAGN/H,EAAKyS,cAGVxL,GAAKjH,EAAK+Q,uBACVhJ,GAAK/H,EAAKiR,gCAEmB/J,IAAzBlH,EAAKqY,kBACHpR,GAAK,IAAGA,EAAI,GACZA,GAAKjH,EAAKmI,QAAOlB,EAAIjH,EAAKmI,MAAQ,GAClCJ,GAAK,IAAGA,EAAI,GACZA,GAAK/H,EAAKkI,SAAQH,EAAI/H,EAAKkI,OAAS,QAGtC6iD,EAGFrnD,EAEAktD,EAGAxpD,EACAspD,EARAG,EAAML,EAAsBxwD,EAAKE,WAAW4wD,gBAAkB,EAC9DC,EAAkD,SAAvC/wD,EAAKE,WAAW8wD,mBAE3B5iD,EAAIpO,EAAKyS,aAAa3M,OAEtBmrD,EAAkBF,EAAW/wD,EAAKg7B,WAAa,YAC/Ck2B,EAAkBH,EAAW/wD,EAAKg7B,WAAa,eAG5Ch7B,EAAKyS,cAAiBzS,EAAKyS,aAAa3M,WAG7C9F,EAAK4jB,UAAW,IACV7b,EAAI/H,EAAKkI,QAAUH,EAAI,GAAKd,EAAIjH,EAAKmI,OAASlB,EAAI,UACtDjH,EAAK4jB,UAAW,EACT,CACLC,YAAa,UACb/F,QAAS,eAGRpa,EAAI,EAAGA,EAAI0K,EAAG1K,GAAK,KAGtBgtD,EAAU,CACRzpD,GAHFG,EAAOpH,EAAKyS,aAAa/O,IAGfuD,EACRc,EAAGX,EAAKW,EACRG,OAAQd,EAAKc,OACbC,MAAOf,EAAKe,OAGZqoD,GACA,gCAAgCltD,KAAK8D,EAAK9E,SAE1CouD,EAAQzpD,GAAK4pD,EACbH,EAAQ3oD,GAAK8oD,EACbH,EAAQxoD,QAAU2oD,EAClBH,EAAQvoD,OAAS0oD,GAGjBH,EAAQzpD,EAAIjH,EAAKsC,MAAMkR,gBAAkBvM,GACzCypD,EAAQzpD,EAAIypD,EAAQvoD,MAAQnI,EAAKsC,MAAMkR,gBAAkBvM,GACzDypD,EAAQ3oD,EAAI/H,EAAKsC,MAAMkR,gBAAkBzL,GACzC2oD,EAAQ3oD,EAAI2oD,EAAQxoD,OAASlI,EAAKsC,MAAMkR,gBAAkBzL,EAC1D,IACI,oBAAoBzE,KAAK8D,EAAK9E,OAAQ,IAClB,yBAAlBtC,EAAK+X,SAAqC,gBAC9C3Q,EAAKyc,YAAczc,EAAK9E,MACxB8E,EAAK0W,QAAU,OACR1W,KAEL,uBAAuB9D,KAAK8D,EAAK9E,OAAQ,IACrB,sBAAlBtC,EAAK+X,SAAkC,gBAC3C3Q,EAAKyc,YAAczc,EAAK9E,MACxB8E,EAAK0W,QAAU,OACR1W,KAEL,oBAAoB9D,KAAK8D,EAAK9E,cAChC8E,EAAKyc,YAAczc,EAAK9E,MACxB8E,EAAK0W,QAAU,YACR1W,KAEL,4BAA4B9D,KAAK8D,EAAK9E,cACxC8E,EAAKyc,YAAc,sBACnBzc,EAAK0W,QAAU,sBACf1W,EAAK+5C,aAAc,EACnB/5C,EAAK+pD,qBAAsB,EACvBppD,EAAI/H,EAAKqT,UAAUglB,IAAI/wB,EAAES,EAAI/H,EAAKqT,UAAUmK,iBAC9CpW,EAAKyc,YAAc,yBACnBzc,EAAK0W,QAAU,0BACN/V,EAAI/H,EAAKqT,UAAUglB,IAAI/wB,EAAES,IAClCX,EAAKyc,YAAc,sBACnBzc,EAAK0W,QAAU,uBAEjB9d,EAAKm7B,OAAS,UACP/zB,KAEL,8BAA8B9D,KAAK8D,EAAK9E,cAC1C8E,EAAKyc,YAAc,wBACnBzc,EAAK0W,QAAU,wBACf1W,EAAK+5C,aAAc,EACnB/5C,EAAKgqD,uBAAwB,EACzBnqD,EAAIjH,EAAKqT,UAAUglB,IAAIxrB,EAAE5F,EAAIjH,EAAKqT,UAAU+J,gBAC9ChW,EAAKyc,YAAc,0BACnBzc,EAAK0W,QAAU,2BACN7W,EAAIjH,EAAKqT,UAAUglB,IAAIxrB,EAAE5F,IAClCG,EAAKyc,YAAc,yBACnBzc,EAAK0W,QAAU,0BAEjB9d,EAAKm7B,OAAS,UACP/zB,KAET2jD,EAAS0F,EAAUC,GAEnBE,EACEG,GACA3pD,EAAKqe,kBACqC,IAA1Cre,EAAKqe,gBAAgB7K,QAAQmwC,IAEG,IAAhC,CAAC,IAAK,KAAKnwC,QAAQmwC,KAClB/qD,EAAKE,WAAWmxD,mBAAqBT,KACpC5wD,EAAKE,WAAWoxD,2BAA6BlqD,EAAKkhB,WACjDlhB,EAAKkhB,UACNsoC,KACA5wD,EAAKE,WAAWqxD,uBACfnqD,EAAKse,aAAete,EAAK0e,YACxB1e,EAAKse,cAAete,EAAK0e,UAC7B,KAEG1e,EAAK2e,gBACJ3e,EAAK0e,UACJ9lB,EAAKE,WAAWoxD,2BAA6BlqD,EAAKkhB,WAC1C,MAAXyiC,SAEA3jD,EAAK0W,QAAU,YACf1W,EAAKyc,YAAc,YACZzc,MAEHA,EAAK2e,iBAAkB3e,EAAK0e,UAAa8qC,SAC7CxpD,EAAK0W,QAAUmzC,EACf7pD,EAAKyc,YAAcknC,EAAS,QACrB3jD,MAIuB,IAAhC,CAAC,IAAK,KAAKwT,QAAQmwC,IACnB3jD,EAAKM,UAAY,IAChB1H,EAAKE,WAAWsxD,gBAAkBZ,KACjC5wD,EAAKE,WAAWuxD,wBAA0BrqD,EAAKkhB,WAC9ClhB,EAAKkhB,UACNsoC,KACDxpD,EAAK2e,eACN,KAEG3e,EAAKse,aACJte,EAAK0e,UACJ9lB,EAAKE,WAAWuxD,wBAA0BrqD,EAAKkhB,WACvC,MAAXyiC,SAEA3jD,EAAK0W,QAAU,YACf1W,EAAKyc,YAAc,YACZzc,MAEHA,EAAKse,cAAete,EAAK0e,UAAa8qC,SAC1CxpD,EAAK0W,QAAUozC,EACf9pD,EAAKyc,YAAcknC,EAAS,QACrB3jD,QAGQ,qBAAfA,EAAK9E,QAEHtC,EAAKg/B,iBAAiB53B,EAAKO,cAC3BP,EAAKH,EACHG,EAAKe,MACLnI,EAAKE,WAAWwxD,mBAChB1xD,EAAKsC,MAAMkR,gBACXvM,IACHjH,EAAKE,WAAWigC,oBAEjB/4B,EAAKyc,YAAc,OACnBzc,EAAK0W,QAAU,SAEf1W,EAAK0W,QAAU9d,EAAKg7B,WACpB5zB,EAAKyc,YAAc,kBAEdzc,GAEU,kBAAfA,EAAK9E,QAEHtC,EAAKsuD,cAAclnD,EAAKM,WACxB1H,EAAKE,WAAWyxD,iBACbvqD,EAAKW,EAAI/H,EAAKsC,MAAMkR,iBACrBzL,IACH/H,EAAKE,WAAWigC,oBAEjB/4B,EAAKyc,YAAc,OACnBzc,EAAK0W,QAAU,SAEf1W,EAAK0W,QAAU9d,EAAKg7B,WACpB5zB,EAAKyc,YAAc,eAEdzc,GAELA,EAAKsf,QACP1mB,EAAK4jB,UAAW,EAChBxc,EAAKyc,YAAc,YACnBzc,EAAK0W,QAAU,YACR1W,GAEU,cAAfA,EAAK9E,OACPtC,EAAK4jB,UAAW,EAChBxc,EAAKyc,YAAc,OACnBzc,EAAK0W,QAAU,OACR1W,IAETA,EAAKyc,YAAc,OACnBzc,EAAK0W,QAAU,OACR1W,UAGXpH,EAAK4jB,UAAW,EAChB5jB,EAAKm7B,OAAS,UACP,CACLtX,YAAa,aACb/F,QAAS,aACTxb,MAAO,aACP4+C,cAAc,MAUlBlhD,EAAK47B,mBAAqB,eACpB90B,EAAM,CAAEG,EAAGkgD,EAAAA,EAAUp/C,EAAGo/C,EAAAA,GAC1BpgD,EAAO,CAAEE,GAAIkgD,EAAAA,EAAUp/C,GAAIo/C,EAAAA,UAC7BnnD,EAAKua,WAAW1Z,SAAQ,SAAUie,EAAKpX,OACjCkqD,EAAQC,EACZ/qD,EAAIiB,EAAIL,EAAWZ,EAAIiB,EAAIL,EAAWZ,EAAIiB,EAC1ChB,EAAKgB,EAAIL,EAAWX,EAAKgB,EAAIL,EAAWX,EAAKgB,EAC7C6pD,EAAShqD,KAAK0U,IAAIsI,MAAM,KAAM9F,GAC9B+yC,EAASjqD,KAAK4G,IAAIoW,MAAM,KAAM9F,GAC9BhY,EAAIG,EAAI4qD,EAAS/qD,EAAIG,EAAI4qD,EAAS/qD,EAAIG,EACtCF,EAAKE,EAAI2qD,EAAS7qD,EAAKE,EAAI2qD,EAAS7qD,EAAKE,KAEpC,CACLma,IAAKta,EAAIiB,EACTuY,KAAMxZ,EAAIG,EACVoa,OAAQta,EAAKgB,EACbwY,MAAOxZ,EAAKE,IAWhBjH,EAAKk4C,kBAAoB,SAAUloC,UACjCA,EAAIA,GAAKhQ,EAAKyW,aACP/N,OAAOC,KAAKqH,EAAE,IAAM,KAAO,KAAM4B,KAAI,SAC1CoS,EACA7N,OAEIpQ,EAAO/F,EAAKkyC,qBAAqBluB,EAAKhU,GACxCtM,EAAI,CACFwB,KAAM8e,EACN/N,MAAO9S,MAAMD,SAAS8gB,EAAK,KACvBA,EACAhkB,EAAKk5C,eAAel1B,GAAKhjB,cAC7BmV,MAAOA,EACPxO,YAAawO,EACbpQ,KAAMA,EACNhB,OAAQ/E,EAAK+E,OAAOgB,WAGtB/F,EAAKozC,gBACLpzC,EAAKozC,eAAe9C,iBACuBppC,IAA3ClH,EAAKozC,eAAe9C,WAAW5sC,EAAEwB,QAEjCxB,EAAEkL,QAAU5O,EAAKozC,eAAe9C,WAAW5sC,EAAEwB,OAExCxB,MAWX1D,EAAK82C,eAAiB,WACpB92C,EAAK6uC,QAAU,IASjB7uC,EAAKy8B,WAAa,SAAUwM,EAAQjP,GAClCh6B,EAAKu8B,gBAAkB0M,GAAUjpC,EAAKu8B,oBAClCvV,EACF/f,EACAc,EACAuG,EAAItO,EAAKuO,eACNyrB,IACHh6B,EAAKua,WAAa,GAClBva,EAAK2a,aAAe,GACpB3a,EAAK+a,gBAAkB,IAGvB/a,EAAKu8B,gBAAgBnb,KAAO,GAC5BphB,EAAKu8B,gBAAgBlb,OAASrhB,EAAKiQ,SAASnK,QAC5C9F,EAAKu8B,gBAAgBjc,MAAQ,GAC7BtgB,EAAKu8B,gBAAgBhc,MAAQjS,EAAExI,aAEzB,IAAIlD,MAAM,iCAGhBqE,EAAIjH,EAAKu8B,gBAAgBnb,IACzBna,GAAKjH,EAAKu8B,gBAAgBlb,OAC1Bpa,GAAK,MAELjH,EAAKua,WAAWtT,GAAK,GACrBjH,EAAK2a,aAAa9W,KAAKoD,GAErBc,EAAI/H,EAAKu8B,gBAAgBjc,KACzBvY,GAAK/H,EAAKu8B,gBAAgBhc,MAC1BxY,GAAK,GAEkC,IAAnC/H,EAAKua,WAAWtT,GAAG2T,QAAQ7S,IAC7B/H,EAAKua,WAAWtT,GAAGpD,KAAKkE,IAEf,IAAPA,IAAiD,IAArC/H,EAAK+a,gBAAgBH,QAAQ7S,IAC3C/H,EAAK+a,gBAAgBlX,KAAKkE,GAIhCif,EAAK,CACHzM,WAAYva,EAAKua,WACjBgiB,gBAAiBv8B,EAAKu8B,gBACtBF,cAAer8B,EAAKs8B,oBAEtB5zB,OAAO8oB,eAAexK,EAAI,eAAgB,CACxC0K,IAAK,kBACI1xB,EAAKo8B,qBAGhBp8B,EAAKmC,cAAc,mBAAoB6kB,IAUzChnB,EAAK4yC,wBAA0B,SAAU1tC,OACnC6K,GAAKo3C,EAAAA,KACI,eAATjiD,SACFlF,EAAKqI,IAAIwZ,KAAO7hB,EAAKsC,MAAMwvD,kBAEzB9xD,EAAKqI,IAAIikB,aAELtsB,EAAKiQ,SAASnK,QAAU9F,EAAKE,WAAWwU,WAAa,EAAI,IACzDjN,YACFU,MACFnI,EAAKsC,MAAMyvD,gBACX/xD,EAAKsC,MAAM0vD,0BACXhyD,EAAKsC,MAAM2vD,0BACXjyD,EAAKsC,MAAM4vD,0BACVlyD,EAAKE,WAAW+K,KACbjL,EAAKsC,MAAMqnB,eACX3pB,EAAKsC,MAAMmnB,oBACXzpB,EAAKsC,MAAMinB,qBACX,OAGJ4oC,EAAY,YAChBnyD,EAAKuO,YAAY1N,SAAQ,SAAUqf,MAC7BA,EAAIhb,OAASA,GAGjBlF,EAAKqI,IAAIwZ,KAAO7hB,EAAKsC,MAAM8vD,yBACvBjkD,EACFnO,EAAKqI,IAAIikB,YAAYpM,EAAIjK,OAASiK,EAAIhb,MAAMiD,MAC5CnI,EAAKsC,MAAM+vD,6BACXryD,EAAKsC,MAAMgwD,4BACXtyD,EAAKsC,MAAMiwD,sBACbxiD,EAAI5B,EAAI4B,EAAI5B,EAAI4B,EAChBoiD,EAAYnyD,EAAK6mB,WAAW3G,EAAIna,UAElC/F,EAAKiQ,SAASpP,SAAQ,SAAUie,OAC1B3R,EAAO2R,EAAI5Z,GACXitD,IACFhlD,EAAOglD,EAAU,CAAE/qD,KAAM,CAAE6f,MAAO9Z,MAEpCnN,EAAKqI,IAAIwZ,KAAO7hB,EAAKsC,MAAMkwD,aACvBrkD,EACFnO,EAAKqI,IAAIikB,YAAYnf,GAAMhF,MAC3BnI,EAAKsC,MAAMmwD,iBACXzyD,EAAKsC,MAAMolD,gBACX1nD,EAAKsC,MAAMiwD,sBACbxiD,EAAI5B,EAAI4B,EAAI5B,EAAI4B,KAEXA,GAQT/P,EAAKwV,eAAiB,kBACbxV,EAAKonC,mBAAmBplB,QAAO,SAAU0wC,EAAO98C,UAC9C88C,EAAQxvD,SAAS0S,EAAOzN,OAASnI,EAAKsC,MAAM4T,UAAW,MAC7D,IASLlW,EAAKwa,aAAe,SAAU9S,UACpB1H,EAAK+W,MAAM1E,KAAK3K,IAAa1H,EAAKsC,MAAMkP,YAAcxR,EAAKsL,OASrEtL,EAAKiP,eAAiB,SAAUtH,UAE3B3H,EAAK+W,MAAMjC,QAAQnN,IAClB3H,EAAKuO,YAAY5G,GAAaQ,OAC9BnI,EAAKsC,MAAM4T,WAAalW,EAAKsL,OAGnCtL,EAAK6mB,WAAWtjB,OAAS,SAA6BZ,eAC5BuE,IAAjBvE,EAAEyE,KAAK6f,MAAsBtkB,EAAEyE,KAAK6f,MAAQ,IAErDjnB,EAAK6mB,WAAWhQ,cAAgB7W,EAAK6mB,WAAWtjB,OAChDvD,EAAK6mB,WAAW8rC,WAAa3yD,EAAK6mB,WAAWtjB,OAC7CvD,EAAK6mB,WAAW9jB,OAAS/C,EAAK6mB,WAAWtjB,OACzCvD,EAAK6mB,WAAW+rC,IAAM5yD,EAAK6mB,WAAWtjB,OACtCvD,EAAK6mB,WAAWje,KAAO5I,EAAK6mB,WAAWtjB,OACvCvD,EAAK0uC,QAAQnrC,OAAS,SAAUmjC,EAAYtqB,OACtCy2C,EAAoB,QAAdz2C,SACH,SAAUpK,EAAGhF,OACZ8lD,EAAS9gD,EAAE00B,IAAe,GAC1BqsB,EAAS/lD,EAAE05B,IAAe,UAC5BmsB,EACGC,EAAOE,cAGLF,EAAOE,cAAcD,GAFnB,EAINA,EAAOC,cAGLD,EAAOC,cAAcF,GAFnB,IAKb9yD,EAAK0uC,QAAQ3rC,OAAS,SAAU2jC,EAAYtqB,OACtCy2C,EAAoB,QAAdz2C,SACH,SAAUpK,EAAGhF,UACd6lD,EACK7gD,EAAE00B,GAAc15B,EAAE05B,GAEpB15B,EAAE05B,GAAc10B,EAAE00B,KAG7B1mC,EAAK0uC,QAAQukB,KAAO,SAAUvsB,EAAYtqB,OACpCy2C,EAAoB,QAAdz2C,SACH,SAAUpK,EAAGhF,UACd6lD,EAEA,IAAIK,KAAKlhD,EAAE00B,IAAaysB,UAAY,IAAID,KAAKlmD,EAAE05B,IAAaysB,UAI9D,IAAID,KAAKlmD,EAAE05B,IAAaysB,UAAY,IAAID,KAAKlhD,EAAE00B,IAAaysB,YC1+DpE,IAAIC,aAAe/yD,YAEfgzD,QAAU,CACZpzD,SACA4I,KACA2sB,OACA9R,MACApiB,KACAg4B,YACAiI,OACA+xB,IACAC,eAGF,SAASC,KAAK37B,MACZA,KAAOA,MAAQ,OACX73B,KAAO,UACXA,KAAKuB,iBAAiC2F,IAAnB2wB,KAAKx3B,UACxBL,KAAKmP,YACH0oB,KAAKjyB,YACL,8BAA8BtC,KAAKu0B,KAAKjyB,WAAWshB,UACjDlnB,KAAKmP,YACPnP,KAAKsB,KAAO,GAEZtB,KAAKsB,KAAOtB,KAAKuB,YACbkyD,KAAK,kDACLttD,SAAS+1C,cAAc,UAE7Bl8C,KAAK63B,KAAOA,KACZ73B,KAAKsB,KAAKu2B,KAAOA,KACjB73B,KAAKoB,oBAAsBgyD,aAAahyD,oBACxCpB,KAAKiB,kBAAoBmyD,aAAanyD,kBACtCjB,KAAKM,oBAAsB8yD,aAAa9yD,oBACxCN,KAAKoqB,WAAa,SAAcyN,UAC9BA,EAAKx3B,WAAY,EACV,IAAImzD,KAAK37B,IAGlBw7B,QAAQxyD,SAAQ,SAAUywB,GACxBA,EAAOtxB,SAGLA,KAAKmP,aACPnP,KAAKg1C,WAAand,KAAKjyB,WAAWovC,WAClCh1C,KAAK4F,WAAaiyB,KAAKjyB,aAEvB5F,KAAKg1C,WAAah1C,KAAKsB,KAAKoyD,aAAa,CAAErmD,KAAM,SACjDrN,KAAK4F,WAAa5F,KAAKg1C,YAEzBh1C,KAAK+1C,OACE/1C,KAAKsB,KA8BC,SAASqyD,eAAe97B,GACrCA,EAAOA,GAAQ,OACXn0B,EACFkwD,EAAQ,CACN,QACA,aACA,UACA,UACA,qBACA,qBACA,mBACA,OACA,iBAEAnyD,OAAOoyD,gBACTnwD,EAAIyC,SAAS+1C,cAAc,mBAC3BxzC,OAAOC,KAAKkvB,GAAMh3B,SAAQ,SAAUizD,GAEnB,SAAXA,GAGW,eAAXA,KAI2B,IAA3BF,EAAMh5C,QAAQk5C,GAkBlBpwD,EAAExD,WAAW4zD,GAAUj8B,EAAKi8B,GAjB1BF,EAAM/yD,SAAQ,SAAUkzD,QACH7sD,IAAf2wB,EAAKk8B,IAAuBA,IAASD,KAGqB,IAA1D,CAAC,aAAc,UAAW,WAAWl5C,QAAQk5C,GACrB,WAAtBzgB,QAAOxb,EAAKk8B,KAAqC,OAAfl8B,EAAKk8B,IACzCrrD,OAAOC,KAAKkvB,EAAKk8B,IAAOlzD,SAAQ,SAAUmzD,GACxCtwD,EAAEqwD,GAAMC,GAAQn8B,EAAKk8B,GAAMC,MAI/BtwD,EAAEqwD,GAAQl8B,EAAKk8B,WAQnBl8B,EAAKt1B,OACPmB,EAAEnB,KAAOs1B,EAAKt1B,MAGZs1B,EAAKjyB,YACPiyB,EAAKjyB,WAAWxB,YAAYV,GAEvBA,IAETm0B,EAAKx3B,WAAY,EACjBqD,EAAI,IAAI8vD,KAAK37B,GACTA,EAAKjyB,YAAciyB,EAAKjyB,WAAWxB,aACrCyzB,EAAKjyB,WAAWxB,YAAYV,GAEvBA,GAvFLjC,OAAOwyD,cACTT,KAAK5yD,UAAY8H,OAAOopB,OAAOrwB,OAAOwyD,YAAYrzD,YAGhDa,OAAOoyD,iBACTL,KAAKU,mBAAqBd,aAAa3vD,0BACvC+vD,KAAK5yD,UAAUkD,qBAAuBsvD,aAAatvD,qBACnD0vD,KAAK5yD,UAAU2D,yBACb6uD,aAAa7uD,yBACfivD,KAAK5yD,UAAUoD,kBAAoBovD,aAAapvD,kBAChDwvD,KAAK5yD,UAAU0D,gBAAkB8uD,aAAa9uD,gBAC9C7C,OAAOoyD,eAAeM,OAAO,kBAAmBX,OAKhD/xD,SACCA,OAAOkyD,gBACPlyD,OAAO2yD"}