schummar-table 0.6.0 → 0.7.0
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.
- package/dist/cjs/index.js +251 -224
- package/dist/cjs/index.js.map +1 -1
- package/dist/es/index.js +253 -226
- package/dist/es/index.js.map +1 -1
- package/dist/types/components/row.d.ts +2 -2
- package/dist/types/hooks/useFilter.d.ts +1 -0
- package/dist/types/hooks/useMemoMap.d.ts +2 -0
- package/dist/types/hooks/useTableMemo.d.ts +6 -0
- package/dist/types/hooks/useTheme.d.ts +2 -2
- package/dist/types/misc/throttle.d.ts +1 -0
- package/dist/types/types.d.ts +28 -19
- package/package.json +1 -1
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/misc/queue.ts","../../src/internalState/tableStateStorage.ts","../../src/misc/helpers.ts","../../src/internalState/calcItems.ts","../../src/internalState/calcProps.ts","../../src/internalState/cleanupState.ts","../../src/internalState/filterColumns.ts","../../src/internalState/syncSelections.ts","../../src/internalState/useTableState.ts","../../src/theme/useCssVariables.ts","../../src/components/columnHeader.tsx","../../src/components/formControlLabel.tsx","../../src/components/columnSelection.tsx","../../src/misc/csvExport.ts","../../src/components/export.tsx","../../src/components/filterControl.tsx","../../src/components/resizeHandle.tsx","../../src/components/cell.tsx","../../src/components/expandControl.tsx","../../src/components/selectComponent.tsx","../../src/components/row.tsx","../../src/components/sortComponent.tsx","../../src/misc/throttle.ts","../../src/components/virtualized.tsx","../../src/components/table.tsx","../../src/theme/defaultTheme/defaultColors.ts","../../src/components/spinnner.tsx","../../src/theme/defaultTheme/badge.tsx","../../src/theme/defaultTheme/button.tsx","../../src/theme/defaultTheme/checkbox.tsx","../../src/theme/defaultTheme/iconButton.tsx","../../src/theme/defaultTheme/textField.tsx","../../src/theme/defaultTheme/defaultComponents.ts","../../src/theme/defaultTheme/defaultIcons.tsx","../../src/theme/defaultTheme/defaultTexts.tsx","../../src/theme/defaultTheme/index.tsx","../../src/hooks/useTheme.ts","../../src/components/autoFocusTextField.tsx","../../src/components/dateInput.tsx","../../src/components/datePicker.tsx","../../src/components/dateFilter.tsx","../../src/components/selectFilter.tsx","../../src/misc/debounce.ts","../../src/hooks/useFilter.ts","../../src/misc/textMatch.ts","../../src/components/textFilter.tsx"],"sourcesContent":["export class Queue {\n private q = new Array<{ job: () => Promise<any>; resolve: (value: any) => void; reject: (reason?: any) => void }>();\n private isRunning = false;\n\n run<T>(job: () => Promise<T>, replace?: boolean) {\n return new Promise<T>((resolve, reject) => {\n if (replace) {\n this.q = [];\n }\n this.q.push({ job, resolve, reject });\n\n if (!this.isRunning) this.start();\n });\n }\n\n private async start() {\n this.isRunning = true;\n\n let next;\n while ((next = this.q.shift())) {\n try {\n const result = await next.job();\n next.resolve(result);\n } catch (e) {\n next.reject(e);\n }\n }\n\n this.isRunning = false;\n }\n}\n","import { useEffect, useState } from 'react';\nimport { useTableContext } from '..';\nimport { Queue } from '../misc/queue';\nimport { SerializableValue } from '../types';\n\nconst KEYS = ['sort', 'selection', 'expanded', 'hiddenColumns', 'filterValues', 'columnWidths', 'columnOrder'] as const;\n\nconst storageName = (id: string) => `schummar-table_state-v1_${id}`;\n\nexport type TableStateStorage = {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | Promise<unknown>;\n} & (\n | {\n keys: () => string[] | Promise<string[]>;\n }\n | {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n }\n);\n\nfunction stringify(value: SerializableValue) {\n function prepare(value: SerializableValue): any {\n if (value instanceof Date) {\n return { __date: value.toJSON() };\n }\n\n if (value instanceof Set) {\n return { __set: Array.from(value).map(prepare) };\n }\n\n if (value instanceof Map) {\n return { __map: Array.from(value.entries()).map((entry) => entry.map(prepare)) };\n }\n\n if (value instanceof Array) {\n return value.map(prepare);\n }\n\n if (value instanceof Object) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, prepare(v)]));\n }\n\n return value;\n }\n\n return JSON.stringify(prepare(value));\n}\n\nfunction parse(value: string) {\n return JSON.parse(value, (_key, value) => {\n if (value instanceof Object && '__date' in value) {\n return new Date(value.__date);\n }\n\n if (value instanceof Object && '__set' in value) {\n return new Set(value.__set);\n }\n\n if (value instanceof Object && '__map' in value) {\n return new Map(value.__map);\n }\n\n return value;\n });\n}\n\nexport function useTableStateStorage() {\n const table = useTableContext();\n const [isHydrated, setIsHydrated] = useState(false);\n\n // On mount: load\n useEffect(() => {\n const { persist } = table.getState().props;\n if (!persist) {\n setIsHydrated(true);\n return;\n }\n\n let isCanceled = false;\n\n (async () => {\n try {\n const { storage, id, include, exclude } = persist;\n const json = await storage.getItem(storageName(id));\n if (isCanceled || !json) return;\n\n const data = parse(json);\n table.getState().props.debug?.('load', json, data);\n\n table.update((state) => {\n for (const key of KEYS) {\n if (\n //\n (!include || include.includes(key)) &&\n !exclude?.includes(key) &&\n key in data\n ) {\n if (key === 'filterValues') {\n for (const [id, value] of data[key]) {\n if (state.filters.get(id)?.persist ?? true) {\n state.filterValues.set(id, value);\n }\n }\n } else {\n state[key] = data[key];\n\n if (key === 'expanded' || key === 'hiddenColumns' || key === 'selection' || key === 'sort') {\n state.props[`on${(key.slice(0, 1).toUpperCase() + key.slice(1)) as Capitalize<typeof key>}Change`]?.(data[key]);\n }\n }\n }\n }\n });\n } catch (e) {\n console.error('Failed to load table state:', e);\n } finally {\n setIsHydrated(true);\n }\n })();\n\n return () => {\n isCanceled = true;\n };\n }, []);\n\n // After isHydrated, watch and save state\n useEffect(() => {\n if (!isHydrated) return;\n\n const q = new Queue();\n\n return table.subscribe(\n (state) => {\n if (!state.props.persist) return;\n\n const { storage, id, include, exclude } = state.props.persist;\n const data: any = {};\n\n for (const key of KEYS) {\n if (\n //\n (!include || include.includes(key)) &&\n !exclude?.includes(key)\n ) {\n if (key === 'filterValues') {\n data[key] = new Map();\n for (const [id, value] of state.filterValues) {\n if (state.filters.get(id)?.persist ?? true) {\n data.filterValues.set(id, value);\n }\n }\n } else {\n data[key] = state[key];\n }\n }\n }\n\n return { storage, id, data };\n },\n (props) => {\n if (!props) return;\n const { storage, id, data } = props;\n\n table.getState().props.debug?.('save', data, stringify(data));\n q.run(async () => {\n await storage.setItem(storageName(id), stringify(data));\n }, true);\n },\n { throttle: 1000 },\n );\n }, [isHydrated]);\n\n return isHydrated;\n}\n","import { Id, TableItem } from '../types';\n\nexport const flatMap = <T, S>(arr: Iterable<T>, flatMap: (t: T) => S[]): S[] => {\n return [...arr].reduce<S[]>((out, cur) => out.concat(flatMap(cur)), []);\n};\n\nexport const orderBy = <T>(arr: T[], selectors: ((t: T) => any)[] = [], direction: ('desc' | 'asc')[] = []): T[] => {\n if (selectors.length === 0) selectors = [(t) => t];\n\n return [...arr].sort((a, b) => {\n for (let i = 0; i < selectors.length; i++) {\n const _a = selectors[i]?.(a);\n const _b = selectors[i]?.(b);\n const dir = direction[i] === 'desc' ? -1 : 1;\n if (_a > _b) return dir;\n if (_a < _b) return -dir;\n }\n return 0;\n });\n};\n\nexport const uniq = <T>(arr: T[]): T[] => {\n const set = new Set<T>();\n for (const t of arr) set.add(t);\n return Array.from(set);\n};\n\nexport const intersect = <T>(a: Iterable<T>, b: { has(t: T): boolean }): Set<T> => {\n const result = new Set<T>();\n for (const x of a) if (b.has(x)) result.add(x);\n return result;\n};\n\nexport const getAncestors = <T>(activeItemsById: Map<Id, TableItem<T>>, ...items: TableItem<T>[]): Set<Id> => {\n const result = new Set<Id>();\n\n const find = ({ parentId }: TableItem<T>): void => {\n const parent = parentId ? activeItemsById.get(parentId) : undefined;\n if (parent && !result.has(parent.id)) {\n result.add(parent.id);\n find(parent);\n }\n };\n items.forEach(find);\n return result;\n};\n\nexport const getDescendants = <T>(...items: TableItem<T>[]): Set<Id> => {\n const result = new Set<Id>();\n\n const find = (item: TableItem<T>): void => {\n for (const child of item.children) {\n if (!result.has(child.id)) {\n result.add(child.id);\n find(child);\n }\n }\n };\n items.forEach(find);\n return result;\n};\n\nexport const identity = (x: unknown): any => x;\n\nexport const asString = (x: unknown): string => {\n if (x instanceof Array) return x.map(asString).join(', ');\n if (x instanceof Object) return JSON.stringify(x);\n return String(x ?? '');\n};\n\nexport const asStringOrArray = (x: unknown): string | string[] => {\n if (x instanceof Array) return x.map(asString);\n return asString(x);\n};\n\nexport const defaultEquals = (a: unknown, b: unknown): boolean => a === b;\n\nexport const subStringMatch = (a: string, b: string): boolean => a.toLowerCase().includes(b.toLowerCase());\n\nexport const castArray = <T>(a: T | T[]) => (a instanceof Array ? a : [a]);\n\nexport const cx = (...classNames: (string | false | undefined | null | Record<string, boolean>)[]) =>\n classNames\n .flatMap((entry) => {\n if (!entry) return [];\n if (typeof entry === 'string') return [entry];\n return Object.entries(entry)\n .filter(([, predicate]) => predicate)\n .map(([className]) => className);\n })\n .join(' ');\n","import { castDraft } from 'immer';\nimport { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { castArray, flatMap, orderBy } from '../misc/helpers';\nimport { Id, InternalTableState, TableItem } from '../types';\n\nexport function calcItems<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) =>\n [\n state.props.items,\n state.props.id,\n state.props.parentId,\n state.props.revealFiltered,\n state.sort,\n state.filters,\n state.filterValues,\n state.activeColumns,\n state.expanded,\n ] as const,\n ([items = [], id, parentId, revealFiltered, sort, filters, filterValues, activeColumns], draft) => {\n const tableItems = items.map<TableItem<T>>((item) => ({\n ...item,\n id: id(item),\n parentId: parentId?.(item),\n children: [],\n }));\n\n let sorted;\n if (sort.length === 0) {\n sorted = tableItems;\n } else {\n const selectors = flatMap(sort, (sort) => {\n const column = activeColumns.find((column) => column.id === sort.columnId);\n if (!column) return [];\n const sortBy = column.sortBy instanceof Array ? column.sortBy : [column.sortBy];\n return sortBy.map((sortBy) => ({ selector: (item: T) => sortBy(column.value(item), item), direction: sort.direction }));\n }).filter(Boolean);\n\n sorted = orderBy(\n tableItems,\n selectors.map((x) => x.selector),\n selectors.map((x) => x.direction),\n );\n }\n\n const lookup = new Map<Id, TableItem<T>>();\n for (const item of sorted) {\n lookup.set(item.id, item);\n }\n\n for (const item of sorted) {\n const parent = item.parentId !== undefined ? lookup.get(item.parentId) : undefined;\n parent?.children.push(item);\n }\n\n const allItems = new Array<TableItem<T>>();\n const allItemsById = new Map<Id, TableItem<T>>();\n\n const traverse = (items: TableItem<T>[]): void => {\n for (const item of items) {\n allItems.push(item);\n allItemsById.set(item.id, item);\n traverse(item.children);\n }\n };\n traverse(sorted.filter((item) => item.parentId === undefined));\n\n let expandedChanged = false;\n const activeItemsById = new Map<Id, TableItem<T>>();\n const activeSet = new Set<Id>();\n const activeItems = [...allItems]\n .reverse()\n .filter((item) => {\n let isActive = activeSet.has(item.id);\n\n isActive ||= activeColumns.every((column) => {\n const filter = filters.get(column.id);\n if (!filter) return true;\n\n const filterValue = filterValues.get(column.id);\n if (filterValue === undefined || !filter.isActive(filterValue)) return true;\n\n const filterBy = filter.filterBy ?? ((x) => x);\n const value = filterBy(column.value(item), item);\n return castArray(value).some((value) => filter.test(filterValue, value));\n });\n\n if (isActive && item.parentId !== undefined) {\n if (\n revealFiltered &&\n Array.from(filters.entries()).some(([id, filter]) => {\n const filterValue = filterValues.get(id);\n return !!filter && filterValue !== undefined && filter.isActive(filterValue);\n })\n ) {\n expandedChanged ||= !draft.expanded.has(item.parentId);\n draft.expanded.add(item.parentId);\n } else if (!draft.expanded.has(item.parentId)) {\n isActive = false;\n }\n }\n\n if (isActive && item.parentId !== undefined) {\n activeSet.add(item.parentId);\n }\n if (isActive) {\n activeItemsById.set(item.id, item);\n }\n\n return isActive;\n })\n .reverse();\n\n draft.items = castDraft(allItems);\n draft.itemsById = castDraft(allItemsById);\n draft.activeItems = castDraft(activeItems);\n draft.activeItemsById = castDraft(activeItemsById);\n\n if (expandedChanged) {\n setTimeout(() => {\n state.getState().props.onExpandedChange?.(state.getState().expanded);\n });\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useMemo, useRef } from 'react';\nimport { asString } from '../misc/helpers';\nimport { Column, Id, InternalColumn, InternalTableProps, TableProps } from '../types';\n\nconst noopParentId = () => undefined;\n\nexport function calcProps<T>(props: TableProps<T>): InternalTableProps<T> {\n const columnCache = useRef(new Map<string | number, [any[], InternalColumn<T, any>]>());\n\n return useMemo(() => {\n let id;\n if (props.id instanceof Function) {\n id = props.id;\n } else {\n id = (item: T) => item[props.id as keyof T] as unknown as Id;\n }\n\n let parentId;\n if (props.parentId instanceof Function) {\n parentId = props.parentId;\n } else if (typeof props.parentId === 'string') {\n parentId = (item: T) => item[props.parentId as keyof T] as unknown as Id | undefined;\n } else {\n parentId = noopParentId;\n }\n\n let inputColumns;\n if (props.columns instanceof Function) {\n inputColumns = props.columns((value, column) => ({ ...column, value }));\n } else {\n inputColumns = props.columns.map((column) => ({ ...column, dependecies: undefined }));\n }\n\n const newColumnCache = new Map<string | number, [any[], InternalColumn<T, any>]>();\n\n const columns = inputColumns.map<InternalColumn<T, any>>(function <V>(\n {\n id,\n header = null,\n renderCell = asString,\n exportCell = asString,\n sortBy = (v) => (typeof v === 'number' || v instanceof Date ? v : String(v)),\n dependencies = [],\n ...props\n }: Column<T, V>,\n index: number,\n ) {\n const [depsInCache, columnInCache] = columnCache.current.get(id ?? index) ?? [];\n\n let column;\n if (\n depsInCache &&\n columnInCache &&\n depsInCache.length === dependencies.length &&\n depsInCache.every((x, i) => dependencies[i] === x)\n ) {\n column = columnInCache;\n } else {\n column = {\n id: id ?? index,\n header,\n renderCell,\n exportCell,\n sortBy,\n dependencies,\n ...props,\n };\n }\n\n newColumnCache.set(id ?? index, [dependencies, column]);\n return column;\n });\n\n columnCache.current = newColumnCache;\n\n let copy;\n if (props.enableExport === true || (props.enableExport instanceof Object && props.enableExport.copy === true)) {\n copy = { separator: '\\t' };\n } else if (props.enableExport && props.enableExport.copy instanceof Object) {\n copy = props.enableExport.copy;\n }\n\n let download;\n if (props.enableExport === true || (props.enableExport instanceof Object && props.enableExport.download === true)) {\n download = { sepPrefix: true };\n } else if (props.enableExport && props.enableExport.download instanceof Object) {\n download = props.enableExport.download;\n }\n\n const enableExport = { copy, download };\n\n return {\n ...props,\n id,\n parentId,\n columns,\n enableSelection: props.enableSelection ?? true,\n selectSyncChildren: props.selectSyncChildren ?? true,\n stickyHeader: props.stickyHeader ?? true,\n enableExport,\n enableColumnSelection: props.enableColumnSelection ?? true,\n enableColumnResize: props.enableColumnResize ?? true,\n enableColumnReorder: props.enableColumnReorder ?? true,\n };\n }, [props]);\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { intersect } from '../misc/helpers';\nimport { InternalTableState } from '../types';\n\nexport function cleanupState<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.columns, state.itemsById, state.activeItemsById, state.activeColumns] as const,\n ([columns, itemsById, activeItemsById, activeColumns], draft) => {\n const columnIds = new Set(columns.map((column) => column.id));\n const activeColumnIds = new Set(activeColumns.map((column) => column.id));\n\n // Remove sort entries for non active columns\n const newSort = draft.sort.filter((s) => activeColumnIds.has(s.columnId));\n if (newSort.length < draft.sort.length) {\n draft.sort = newSort;\n setTimeout(() => {\n state.getState().props.onSortChange?.(newSort);\n });\n }\n\n // Remove filters for non active columns\n for (const id of draft.filters.keys()) {\n if (!activeColumnIds.has(id)) draft.filters.delete(id);\n }\n\n // Remove filterValues for non active columns\n for (const id of draft.filterValues.keys()) {\n if (!activeColumnIds.has(id)) draft.filterValues.delete(id);\n }\n\n // Remove hiddenColumns for non existing columns\n for (const id of draft.hiddenColumns.keys()) {\n if (!columnIds.has(id)) draft.hiddenColumns.delete(id);\n }\n\n // Remove columnWidth for non existing columns\n for (const id of draft.columnWidths.keys()) {\n if (!columnIds.has(id)) draft.columnWidths.delete(id);\n }\n\n // Remove non existing columns from columnOrder\n for (const id of draft.columnOrder) {\n if (!columnIds.has(id)) draft.columnOrder = draft.columnOrder.filter((x) => x !== id);\n }\n\n if (draft.props.items) {\n // Remove selection for non active items\n const newSelection = intersect(draft.selection, activeItemsById);\n if (newSelection.size !== draft.selection.size) {\n draft.selection = newSelection;\n setTimeout(() => {\n state.getState().props.onSelectionChange?.(newSelection);\n });\n }\n\n // Remove expanded for non existing items\n const newExpanded = intersect(draft.expanded, itemsById);\n if (newExpanded.size < draft.expanded.size) {\n draft.expanded = newExpanded;\n setTimeout(() => {\n state.getState().props.onExpandedChange?.(newExpanded);\n });\n }\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { orderBy } from '../misc/helpers';\nimport { InternalTableState } from '../types';\n\nexport function filterColumns<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.columns, state.hiddenColumns, state.columnOrder] as const,\n ([columns, hiddenColumns, columnOrder], draft) => {\n draft.activeColumns = orderBy(\n columns.filter((column) => !hiddenColumns.has(column.id)),\n [(column) => columnOrder.indexOf(column.id)],\n );\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { InternalTableState } from '../types';\n\nexport function syncSelections<T>(table: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n table.addReaction(\n (state) => [state.props.selectSyncChildren, state.selection, state.activeItems] as const,\n ([selectSyncChildren, selection, activeItems], state) => {\n if (!selectSyncChildren) return;\n\n const newSelection = new Set(selection);\n for (const item of activeItems) {\n if (item.parentId !== undefined && newSelection.has(item.parentId)) {\n newSelection.add(item.id);\n }\n }\n\n if (newSelection.size !== selection.size) {\n state.selection = newSelection;\n setTimeout(() => {\n table.getState().props.onSelectionChange?.(newSelection);\n });\n }\n },\n { runNow: true },\n ),\n [table],\n );\n}\n","import { castDraft } from 'immer';\nimport { useEffect, useMemo } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { InternalTableState, TableProps } from '../types';\nimport { calcItems } from './calcItems';\nimport { calcProps } from './calcProps';\nimport { cleanupState } from './cleanupState';\nimport { filterColumns } from './filterColumns';\nimport { syncSelections } from './syncSelections';\n\nexport function useTableState<T>(_props: TableProps<T>): Store<InternalTableState<T>> {\n const props = calcProps(_props);\n\n const state = useMemo(\n () =>\n new Store<InternalTableState<T>>({\n props,\n\n sort: props.defaultSort ?? [],\n selection: props.defaultSelection ?? new Set(),\n expanded: props.defaultExpanded ?? new Set(),\n rowHeights: new Map(),\n filters: new Map(),\n filterValues: new Map(),\n hiddenColumns: props.defaultHiddenColumns ?? new Set(),\n columnWidths: new Map(),\n columnOrder: props.columns.map((column) => column.id),\n columnStyleOverride: new Map(),\n\n activeColumns: [],\n items: [],\n itemsById: new Map(),\n activeItems: [],\n activeItemsById: new Map(),\n lastSelectedId: undefined,\n }),\n [],\n );\n\n filterColumns(state);\n calcItems(state);\n syncSelections(state);\n cleanupState(state);\n\n useEffect(() => {\n state.update((state) => {\n state.props = castDraft(props);\n if (props.sort) state.sort = props.sort;\n if (props.selection) state.selection = props.selection;\n if (props.expanded) state.expanded = props.expanded;\n if (props.hiddenColumns) state.hiddenColumns = props.hiddenColumns;\n for (const column of props.columns) {\n if (!state.columnOrder.includes(column.id)) {\n const index = props.columns.indexOf(column);\n state.columnOrder.splice(index, 0, column.id);\n }\n }\n });\n }, [state, props]);\n\n return state;\n}\n","import { useTheme } from '../hooks/useTheme';\n\nexport function useCssVariables() {\n const theme = useTheme();\n\n return {\n '--spacing': theme.spacing,\n '--primaryMain': theme.colors.primary.main,\n '--primaryLight': theme.colors.primary.light,\n '--primaryContrastText': theme.colors.primary.contrastText,\n '--secondaryMain': theme.colors.secondary.main,\n '--secondaryLight': theme.colors.secondary.light,\n '--secondaryContrastText': theme.colors.secondary.contrastText,\n };\n}\n","import { castDraft } from 'immer';\nimport React, { HTMLProps, useEffect, useRef } from 'react';\nimport { StoreScope } from 'schummar-state/react';\nimport { Id, useColumnContext, useTableContext } from '..';\n\nexport const ColumnHeaderContext = new StoreScope({\n items: new Map<Id, HTMLDivElement>(),\n});\n\nexport function ColumnHeader(props: HTMLProps<HTMLDivElement>) {\n const ref = useRef<HTMLDivElement>(null);\n const columnId = useColumnContext();\n const table = useTableContext();\n const enabled = table.useState('props.enableColumnReorder');\n\n const store = ColumnHeaderContext.useStore();\n const draggingStart = useRef<{ mouseX: number; bounds: DOMRect }>();\n const clone = useRef<HTMLDivElement>();\n\n // Track each headers div in a store\n useEffect(() => {\n const div = ref.current;\n if (!div) return;\n\n store.update((state) => {\n state.items.set(columnId, castDraft(div));\n });\n\n return () => {\n store.update((state) => {\n state.items.delete(columnId);\n });\n };\n }, [ref.current, store, columnId]);\n\n // Calculate which index the current header would get, given the current offset\n function calcTargetIndex(offsetLeft: number) {\n const cols = table.getState().columnOrder.map((id) => ({ id, div: store.getState().items.get(id) }));\n\n const otherCols = cols.filter((col) => col.id !== columnId);\n\n const firstOffsetleft = cols.find((col) => col.div)?.div?.offsetLeft ?? 0;\n\n let sum = 0;\n const targetIndex = otherCols.findIndex((col) => {\n const width = col.div?.offsetWidth ?? 0;\n if (sum + width / 2 > offsetLeft - firstOffsetleft) return true;\n sum += width;\n return false;\n });\n\n return targetIndex === -1 ? otherCols.length : targetIndex;\n }\n\n // When starting clicking: Record initial mouse and div's bounds\n function onPointerDown(e: React.PointerEvent) {\n const div = ref.current;\n if (!div) return;\n draggingStart.current = { mouseX: e.clientX, bounds: div.getBoundingClientRect() };\n }\n\n // When mouse moves while clicked: Calculate transforms\n function onPointerMove(e: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (!div || draggingStart.current === undefined || Math.abs(e.clientX - draggingStart.current.mouseX) < 5) return;\n\n e.stopPropagation();\n div.setPointerCapture(e.pointerId);\n\n // Create clone of header div to move around with mouse\n if (!clone.current) {\n clone.current = div.cloneNode(true) as HTMLDivElement;\n document.body.append(clone.current);\n\n for (const [key, value] of Object.entries(getComputedStyle(div))) {\n try {\n clone.current.style[key as any] = value;\n } catch {\n // ignore\n }\n }\n\n Object.assign(clone.current.style, {\n pointerEvents: 'none',\n position: 'fixed',\n boxShadow: '0px 5px 5px -3px rgb(0 0 0 / 20%), 0px 8px 10px 1px rgb(0 0 0 / 14%), 0px 3px 14px 2px rgb(0 0 0 / 12%)',\n left: `${draggingStart.current.bounds.left}px`,\n top: `${draggingStart.current.bounds.top}px`,\n });\n\n div.style.color = 'rgba(0, 0, 0, 0.2)';\n }\n\n // Update clone's position each time\n clone.current.style.left = `${draggingStart.current.bounds.left + e.clientX - draggingStart.current.mouseX}px`;\n\n // Calculate target index\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(div.offsetLeft + e.clientX - draggingStart.current.mouseX);\n\n // Apply transforms to each column\n const columns = table\n .getState()\n .columnOrder.map((id, index) => ({ id, index, width: store.getState().items.get(id)?.offsetWidth ?? 0 }));\n\n state.columnOrder.forEach((id, i) => {\n let offset = 0;\n if (i === index) {\n // Current column: Move to target pos\n if (targetIndex > index) {\n offset = columns.slice(index + 1, targetIndex + 1).reduce((sum, col) => sum + col.width, 0);\n } else if (targetIndex < index) {\n offset = -columns.slice(targetIndex, index).reduce((sum, col) => sum + col.width, 0);\n }\n } else if (i >= targetIndex && i < index) {\n // Left columns: Move right to make room if needed\n offset = div.offsetWidth;\n } else if (i > index && i <= targetIndex) {\n // Right columns: Move left to make room if needed\n offset = -div.offsetWidth;\n }\n\n state.columnStyleOverride.set(id, {\n transition: 'transform 500ms',\n transform: `translate3d(${offset}px, 0, 0)`,\n zIndex: i === index ? 1 : undefined,\n });\n });\n });\n }\n\n // When releasing mouse: Reset draggin state and apply column move\n function onPointerUp(e: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (!div || draggingStart.current === undefined) return;\n\n // Apply column move\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(div.offsetLeft + e.clientX - draggingStart.current.mouseX);\n\n state.columnOrder.splice(index, 1);\n state.columnOrder.splice(targetIndex, 0, columnId);\n\n // Cleanup\n clone.current?.remove();\n div.style.color = '';\n state.columnStyleOverride.clear();\n draggingStart.current = undefined;\n clone.current = undefined;\n });\n }\n\n return (\n <div\n {...props}\n css={{\n position: 'relative',\n userSelect: 'none',\n }}\n ref={ref}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n >\n {props.children}\n </div>\n );\n}\n","import { ReactNode } from 'react';\n\nexport function FormControlLabel({ control, label, disabled }: { control: ReactNode; label: ReactNode; disabled?: boolean }) {\n return (\n <label\n css={[\n {\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n userSelect: 'none',\n\n '& > *': {\n cursor: 'pointer',\n },\n },\n disabled && { color: 'rgba(0, 0, 0, 0.26)' },\n ]}\n >\n {control}\n <span css={{ marginLeft: 'var(--spacing)' }}>{label}</span>\n </label>\n );\n}\n","import React, { useState } from 'react';\nimport { useTheme } from '..';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { InternalColumn } from '../types';\nimport { FormControlLabel } from './formControlLabel';\nimport { useTableContext } from './table';\n\nexport function ColumnSelection<T>(): JSX.Element {\n const {\n components: { IconButton, Popover, Checkbox },\n icons: { Settings },\n text,\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const table = useTableContext<T>();\n const columns = table.useState('props.columns');\n const hiddenColumns = table.useState('hiddenColumns');\n\n const [anchorEl, setAnchorEl] = useState<Element | null>(null);\n\n const toggle = (column: InternalColumn<T, unknown>) => {\n const {\n props: { hiddenColumns: controlledHiddenColumns, onHiddenColumnsChange },\n } = table.getState();\n\n const newValue = new Set(hiddenColumns);\n if (hiddenColumns.has(column.id)) newValue.delete(column.id);\n else newValue.add(column.id);\n\n if (!controlledHiddenColumns) {\n table.update((state) => {\n state.hiddenColumns = newValue;\n });\n }\n\n onHiddenColumnsChange?.(newValue);\n };\n\n return (\n <>\n <IconButton onClick={(e) => setAnchorEl(anchorEl ? null : e.currentTarget)}>\n <Settings />\n </IconButton>\n\n <Popover anchorEl={anchorEl} open={!!anchorEl} onClose={() => setAnchorEl(null)} css={cssVariables}>\n <div css={{ padding: `calc(var(--spacing) * 2)`, display: 'grid' }}>\n <div css={{ marginBottom: 'var(--spacing)' }}>{text.selectColumns}</div>\n\n {columns.map((column) => (\n <FormControlLabel\n key={column.id}\n control={<Checkbox checked={!hiddenColumns.has(column.id)} onChange={() => toggle(column)} disabled={column.cannotHide} />}\n label={column.header}\n ></FormControlLabel>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","export type CsvExportOptions = { sepPrefix?: boolean; separator?: string; quote?: string; eol?: string };\n\nexport function csvExport(\n data: (string | number)[][],\n { sepPrefix, separator = ',', quote = '\"', eol = '\\n' }: CsvExportOptions = {},\n): string {\n const cells = data.map((line) =>\n line.map((value) => {\n if (typeof value === 'number') return String(value);\n if (![separator, quote, eol].some((c) => value.includes(c))) return value;\n\n const clean = value.replace(new RegExp(quote, 'g'), `${quote}${quote}`);\n return `${quote}${clean}${quote}`;\n }),\n );\n\n return (sepPrefix ? `SEP=${separator}\\n` : '') + cells.map((line) => line.join(separator)).join(eol);\n}\n","import React, { useState } from 'react';\nimport { useTheme } from '..';\nimport { csvExport, CsvExportOptions } from '../misc/csvExport';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useTableContext } from './table';\n\nexport function Export<T>(): JSX.Element {\n const table = useTableContext<T>();\n const {\n components: { Button, IconButton, Popover },\n icons: { Export, Clipboard },\n text,\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n\n const generate = (options?: CsvExportOptions) => {\n const { activeColumns, activeItems } = table.getState();\n\n const data = [\n activeColumns.map((column) => String(column.id)),\n ...activeItems.map((item) => activeColumns.map((column) => column.exportCell(column.value(item), item))),\n ];\n return csvExport(data, options);\n };\n\n const copy = () => {\n navigator.clipboard.writeText(generate(table.getState().props.enableExport.copy));\n };\n\n const download = () => {\n const a = document.createElement('a');\n a.href = 'data:text/csv;charset=utf-8,' + encodeURIComponent(generate(table.getState().props.enableExport.download));\n a.download = 'export.csv';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n\n return (\n <>\n <IconButton onClick={(e) => setAnchor(anchor ? null : e.currentTarget)}>\n <Export css={!!anchor && { color: 'var(--primaryMain)' }} />\n </IconButton>\n\n <Popover open={!!anchor} onClose={() => setAnchor(null)} anchorEl={anchor} css={cssVariables}>\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n justifyItems: 'stretch',\n gap: 'var(--spacing)',\n\n '& > *': {\n justifyContent: 'start',\n },\n }}\n >\n <div css={{ marginBottom: 'var(--spacing)' }}>{text.exportTitle}</div>\n <Button startIcon={<Clipboard />} onClick={copy}>\n {text.exportCopy}\n </Button>\n <Button startIcon={<Export />} onClick={download}>\n {text.exportDownload}\n </Button>\n </div>\n </Popover>\n </>\n );\n}\n","import React, { createContext, useCallback, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useColumnContext, useTableContext } from './table';\n\nexport const FilterControlContext = createContext((): void => void 0);\n\nexport function FilterControl<T>(): JSX.Element | null {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const {\n components: { IconButton, Popover },\n icons: { FilterList, ArrowDropDown },\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n const isActive = table.useState((state) => {\n const filter = state.filters.get(columnId);\n const filterValue = state.filterValues.get(columnId);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n const filter = table.useState((state) => state.activeColumns.find((column) => column.id === columnId)?.filter);\n\n function reset() {\n table.update((state) => {\n state.filterValues.delete(columnId);\n });\n }\n\n const close = useCallback(function () {\n setAnchor(null);\n }, []);\n\n if (!filter) return null;\n\n return (\n <FilterControlContext.Provider value={close}>\n <div\n onClick={(e) => setAnchor(e.currentTarget)}\n onContextMenu={(e) => {\n reset();\n e.preventDefault();\n return false;\n }}\n >\n <IconButton\n css={[\n { color: '#b0bac9' },\n isActive && {\n color: 'var(--primaryMain) !important',\n },\n ]}\n >\n {isActive ? <FilterList /> : <ArrowDropDown />}\n </IconButton>\n </div>\n\n <div\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onPointerMove={(e) => {\n e.stopPropagation();\n }}\n >\n <Popover open hidden={!anchor} onClose={() => setAnchor(null)} anchorEl={anchor ?? document.body} css={cssVariables}>\n {filter}\n </Popover>\n </div>\n </FilterControlContext.Provider>\n );\n}\n","import React, { HTMLProps } from 'react';\nimport { useColumnContext, useTableContext } from '..';\n\nexport function ResizeHandle() {\n const table = useTableContext();\n const columnId = useColumnContext();\n const enabled = table.useState('props.enableColumnResize');\n\n function onPointerDown(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n div.setPointerCapture(e.pointerId);\n }\n\n function onPointerMove(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n if (!div.hasPointerCapture(e.pointerId)) return;\n\n const parent = div.parentElement as HTMLDivElement;\n const width = Math.max(e.clientX - parent.getBoundingClientRect().left + 5, 50);\n\n table.update((state) => {\n state.columnWidths.set(columnId, `${width}px`);\n });\n }\n\n function onPointerUp(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n div.releasePointerCapture(e.pointerId);\n }\n\n function onDoubleClick(e: React.MouseEvent) {\n table.update((state) => {\n if (e.getModifierState('Control')) {\n state.columnWidths.delete(columnId);\n } else {\n state.columnWidths.set(columnId, 'max-content');\n }\n });\n }\n\n return (\n <ResizeHandleView\n enabled={enabled}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n onDoubleClick={enabled ? onDoubleClick : undefined}\n />\n );\n}\n\nexport function ResizeHandleView({ enabled, ...props }: HTMLProps<HTMLDivElement> & { enabled?: boolean }) {\n return (\n <div\n css={{\n alignSelf: 'stretch',\n padding: '0 5px',\n cursor: enabled ? 'col-resize' : 'initial',\n display: 'flex',\n alignItems: 'center',\n\n '&:after': {\n content: '\"\"',\n width: 1,\n height: '1.5em',\n background: '#c9cfda',\n transition: 'transform 300ms',\n },\n }}\n {...props}\n />\n );\n}\n","import React, { memo } from 'react';\nimport { Id, useColumnContext, useTableContext, useTheme } from '..';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { calcClassNames } from './row';\n\nexport const Cell = memo(function Cell<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }) {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const { classes } = useTheme();\n\n const column = table.useState((state) => state.activeColumns.find((column) => column.id === columnId));\n const item = table.useState((state) => state.activeItemsById.get(itemId));\n const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), { throttle: 16 });\n\n if (!column || !item) return null;\n table.getState().props.debugRender?.('render cell', itemId, columnId);\n\n const classNames = [...calcClassNames(classes, item, rowIndex), ...calcClassNames(column?.classes, item, rowIndex)];\n const content = column.renderCell(column.value(item), item);\n\n return (\n <div className={cx(...classNames)} css={[defaultClasses.cell, classNames, columnStyleOverride]}>\n {typeof content === 'string' ? (\n <span css={defaultClasses.text} title={content}>\n {content}\n </span>\n ) : (\n content\n )}\n </div>\n );\n});\n","import React from 'react';\nimport { useTheme } from '..';\nimport { getAncestors } from '../misc/helpers';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\n\nexport function ExpandControl<T>({ itemId, hasDeferredChildren }: { itemId: Id; hasDeferredChildren?: boolean }): JSX.Element {\n const {\n components: { IconButton, Spinner },\n icons: { ChevronRight },\n } = useTheme();\n\n const table = useTableContext<T>();\n const isExpanded = table.useState((state) => state.expanded.has(itemId));\n const hasChildren = table.useState((state) => !!state.activeItemsById.get(itemId)?.children.length);\n\n function toggle() {\n const {\n props: { expanded: controlledExpanded, expandOnlyOne, onExpandedChange },\n expanded,\n activeItemsById,\n } = table.getState();\n\n const newExpanded = new Set(expanded);\n if (expandOnlyOne) newExpanded.clear();\n if (isExpanded) newExpanded.delete(itemId);\n else {\n newExpanded.add(itemId);\n\n const item = activeItemsById.get(itemId);\n for (const ancestor of item ? getAncestors(activeItemsById, item) : []) {\n newExpanded.add(ancestor);\n }\n }\n\n onExpandedChange?.(newExpanded);\n\n if (!controlledExpanded) {\n table.update((state) => {\n state.expanded = newExpanded;\n });\n }\n }\n\n if (isExpanded && hasDeferredChildren && !hasChildren) {\n return <Spinner css={{ margin: '0 var(--spacing)' }} />;\n }\n\n return (\n <IconButton onClick={toggle}>\n <span\n css={{\n display: 'inline-flex',\n transition: 'all 300ms',\n transform: isExpanded ? 'rotate3d(0, 0, 1, 90deg)' : 'rotate3d(0, 0, 1, 0deg)',\n }}\n >\n <ChevronRight />\n </span>\n </IconButton>\n );\n}\n","import React from 'react';\nimport { useTheme } from '..';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\n\nexport function SelectComponent<T>({ itemId }: { itemId?: Id }): JSX.Element {\n const table = useTableContext<T>();\n const {\n components: { Checkbox },\n } = useTheme();\n\n const isSelected = table.useState((state) => {\n const itemIds = itemId ? [itemId] : Array.from(state.activeItemsById.keys());\n return state.activeItemsById.size > 0 && itemIds.every((itemId) => state.selection.has(itemId));\n });\n\n function toggle(e: React.ChangeEvent) {\n const mouseEvent = e.nativeEvent as MouseEvent;\n\n const {\n activeItems,\n activeItemsById,\n lastSelectedId,\n selection,\n props: { selectSyncChildren, selection: controlledSelection, onSelectionChange },\n } = table.getState();\n\n let range;\n if (mouseEvent.shiftKey && itemId) {\n const a = lastSelectedId ? activeItems.findIndex((i) => lastSelectedId === i.id) : 0;\n const b = activeItems.findIndex((item) => item.id === itemId);\n range = activeItems.slice(Math.min(a, b), Math.max(a, b) + 1);\n } else {\n const item = itemId ? activeItemsById.get(itemId) : undefined;\n range = item ? [item] : activeItems;\n }\n\n const newSelection = new Set(selection);\n for (const item of range) {\n if (isSelected) newSelection.delete(item.id);\n else newSelection.add(item.id);\n }\n\n if (selectSyncChildren && isSelected) {\n for (const ancestor of getAncestors(activeItemsById, ...range)) {\n newSelection.delete(ancestor);\n }\n for (const descendant of getDescendants(...range)) {\n newSelection.delete(descendant);\n }\n }\n\n onSelectionChange?.(newSelection);\n\n if (!controlledSelection) {\n table.update((state) => {\n state.selection = newSelection;\n });\n }\n\n table.update((state) => {\n state.lastSelectedId = itemId;\n });\n }\n\n return (\n <Checkbox\n css={{\n justifySelf: 'start',\n color: '#c9cfda',\n }}\n checked={isSelected}\n onChange={toggle}\n />\n );\n}\n","import React, { memo, useEffect, useRef } from 'react';\nimport { cx, getAncestors } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { Id, InternalColumn } from '../types';\nimport { Cell } from './cell';\nimport { ExpandControl } from './expandControl';\nimport { SelectComponent } from './selectComponent';\nimport { ColumnContext, useTableContext } from './table';\n\nexport function calcClassNames<T>(classes: InternalColumn<any, any>['classes'] | undefined, item: T, index: number) {\n return [\n classes?.cell instanceof Function ? classes.cell(item, index) : classes?.cell,\n index % 2 === 0 && classes?.evenCell,\n index % 2 === 1 && classes?.oddCell,\n ];\n}\n\nexport const Row = memo(function Row<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }): JSX.Element | null {\n const table = useTableContext<T>();\n const divRef = useRef<HTMLDivElement>(null);\n\n const { className, indent, hasChildren, hasDeferredChildren, columnIds, enableSelection, rowAction } = table.useState((state) => {\n const item = state.activeItemsById.get(itemId);\n const index = !item ? -1 : state.activeItems.indexOf(item);\n\n return {\n className: cx(...calcClassNames(state.props.classes, item, index)),\n indent: item ? getAncestors(state.activeItemsById, item).size : 0,\n hasChildren: !!item?.children.length,\n hasDeferredChildren: item && state.props.hasDeferredChildren?.(item),\n columnIds: state.activeColumns.map((column) => column.id),\n enableSelection: state.props.enableSelection,\n rowAction: state.props.rowAction instanceof Function ? (item ? state.props.rowAction(item, index) : null) : state.props.rowAction,\n };\n });\n\n useEffect(() => {\n const div = divRef.current;\n if (!div) return;\n\n const o = new ResizeObserver(() => {\n if (!document.contains(div)) return;\n table.update((state) => {\n state.rowHeights.set(itemId, div.offsetHeight);\n });\n });\n o.observe(div);\n\n return () => o.disconnect();\n }, [divRef.current]);\n\n table.getState().props.debugRender?.('render row', itemId);\n\n return (\n <>\n <div className={className} css={[defaultClasses.cellFill]} ref={divRef} />\n\n <div className={className} css={[defaultClasses.cell, defaultClasses.firstCell]}>\n <div css={{ width: indent * 20 }} />\n\n {enableSelection && <SelectComponent itemId={itemId} />}\n\n {(hasChildren || hasDeferredChildren) && <ExpandControl itemId={itemId} hasDeferredChildren={hasDeferredChildren} />}\n\n {rowAction}\n </div>\n\n {columnIds.map((columnId) => (\n <ColumnContext.Provider key={columnId} value={columnId}>\n <Cell itemId={itemId} rowIndex={rowIndex} />\n </ColumnContext.Provider>\n ))}\n\n <div className={className} css={[defaultClasses.cellFill]} />\n </>\n );\n});\n","import React, { ReactNode } from 'react';\nimport { useTheme } from '..';\nimport { useColumnContext, useTableContext } from './table';\n\nexport function SortComponent<T>({ children }: { children: ReactNode }): JSX.Element {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const {\n components: { Badge },\n icons: { ArrowUpward },\n } = useTheme();\n\n const { direction, index } = table.useState((state) => {\n const index = state.sort.findIndex((s) => s.columnId === columnId) ?? -1;\n return {\n direction: state.sort[index]?.direction,\n index: index >= 0 && state.sort.length > 1 ? index + 1 : undefined,\n };\n });\n\n function toggle(e: React.MouseEvent, off?: boolean) {\n const {\n props: { sort: controlledSort, onSortChange },\n } = table.getState();\n\n const newDirection = direction === 'asc' ? 'desc' : 'asc';\n const newSort = e.getModifierState('Control') || off ? table.getState().sort.filter((s) => s.columnId !== columnId) : [];\n if (!off) {\n newSort.push({\n columnId,\n direction: newDirection,\n });\n }\n\n onSortChange?.(newSort);\n\n if (!controlledSort) {\n table.update((state) => {\n state.sort = newSort;\n });\n }\n\n e.preventDefault();\n return false;\n }\n\n return (\n <div\n css={{\n userSelect: 'none',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) max-content',\n alignItems: 'center',\n cursor: 'pointer',\n\n '& > div': {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n }}\n onClick={(e) => toggle(e)}\n onContextMenu={(e) => toggle(e, true)}\n >\n <div>{children}</div>\n\n <Badge badgeContent={index}>\n <span\n css={[\n { transition: 'all 300ms', fontSize: '0.8em' },\n !direction && { opacity: 0 },\n direction === 'desc' && { transform: 'rotate3d(0, 0, 1, 180deg)' },\n ]}\n >\n <ArrowUpward />\n </span>\n </Badge>\n </div>\n );\n}\n","export function throttle<Args extends any[]>(fn: (...args: Args) => void, ms: number): { (...args: Args): void; flush(): void } {\n let last = 0;\n let lastArgs: Args | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n function run() {\n const args = lastArgs;\n\n last = Date.now();\n lastArgs = undefined;\n timeout = undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n fn(...args!);\n }\n\n return Object.assign(\n function (...args: Args) {\n const now = Date.now();\n lastArgs = args;\n\n if (timeout) {\n // do nothing\n } else if (now < last + ms) {\n timeout = setTimeout(run, last + ms - now);\n } else {\n run();\n }\n },\n {\n flush() {\n if (lastArgs) {\n run();\n }\n },\n },\n );\n}\n","import React, { HTMLProps, ReactNode, useEffect, useMemo, useRef, useState } from 'react';\nimport { throttle } from '../misc/throttle';\nimport { useTableContext } from './table';\nimport { Id } from '../types';\n\nconst findScrollRoot = (x: HTMLElement): HTMLElement => {\n const parent = x.parentElement;\n if (!parent) return document.documentElement;\n if (parent.scrollHeight > parent.clientHeight && getComputedStyle(parent).overflowY !== 'visible') return parent;\n return findScrollRoot(parent);\n};\n\nconst relativeOffset = (x: HTMLElement, y: HTMLElement): number => {\n if (x.offsetParent === y.offsetParent || !x.offsetParent) return x.offsetTop - y.offsetTop;\n if (x.offsetParent instanceof HTMLElement) return relativeOffset(x.offsetParent, y) + x.offsetTop;\n return 0;\n};\n\nexport function Virtualized<T>({\n header,\n children,\n ...props\n}: { header: ReactNode; children: (itemIds: Id[], startIndex: number) => ReactNode } & HTMLProps<HTMLDivElement>): JSX.Element {\n const table = useTableContext<T>();\n const virtual = table.useState('props.virtual');\n const probeRef = useRef<HTMLDivElement>(null);\n const [, setCounter] = useState(0);\n\n const {\n itemIds = [],\n from = 0,\n to,\n before = 0,\n after = 0,\n } = table.useState(\n (state) => {\n const itemIds = state.activeItems.map((item) => item.id);\n const root = probeRef.current && findScrollRoot(probeRef.current);\n if (!state.props.virtual) return { itemIds };\n if (!probeRef.current || !root || !document.contains(root)) return {};\n\n const {\n rowHeight,\n initalRowHeight,\n overscan = 100,\n overscanTop,\n overscanBottom,\n } = (state.props.virtual instanceof Object ? state.props.virtual : undefined) ?? {};\n\n let totalHeight = 0;\n const rowHeights = itemIds.map((itemId, index) => {\n const h = rowHeight ?? state.rowHeights.get(itemId) ?? initalRowHeight ?? (index === 0 ? 100 : totalHeight / index);\n totalHeight += h;\n return h;\n });\n\n const probeOffset = relativeOffset(probeRef.current, root);\n const headerHeight = probeRef.current.offsetTop;\n const topOfTable = root.scrollTop - probeOffset + headerHeight;\n const bottomOfTable = topOfTable + root.clientHeight - headerHeight;\n\n let from = 0,\n to = itemIds.length,\n before = 0,\n after = 0;\n for (const h of rowHeights) {\n if (before + h > topOfTable - (overscanTop ?? overscan)) break;\n from++;\n before += h;\n }\n\n for (const h of rowHeights.reverse()) {\n if (after + h > totalHeight - bottomOfTable - (overscanBottom ?? overscan)) break;\n to--;\n after += h;\n }\n\n return { itemIds: itemIds.slice(from, to), from, to, before, after };\n },\n { throttle: 16 },\n );\n\n const throttleScroll = (typeof virtual === 'boolean' ? undefined : virtual)?.throttleScroll ?? 16;\n const incCounter = useMemo(() => throttle(() => setCounter((c) => c + 1), throttleScroll), [throttleScroll]);\n\n useEffect(() => {\n if (!virtual || !probeRef.current) return;\n\n window.addEventListener('scroll', incCounter, true);\n window.addEventListener('resize', incCounter, true);\n return () => {\n window.removeEventListener('scroll', incCounter, true);\n window.removeEventListener('resize', incCounter, true);\n };\n }, [probeRef.current, incCounter]);\n\n table.getState().props.debugRender?.(`Virtualalized render ${from} to ${to}`);\n\n return (\n <div {...props}>\n {header}\n\n {virtual && <div style={{ gridColumn: '1 / -1', height: before }} ref={probeRef} />}\n\n {children(itemIds, from)}\n\n {virtual && <div style={{ gridColumn: '1 / -1', height: after }} />}\n </div>\n );\n}\n","import React, { createContext, memo, useContext, useEffect, useState } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { useTheme } from '..';\nimport { useTableStateStorage } from '../internalState/tableStateStorage';\nimport { useTableState } from '../internalState/useTableState';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { Id, InternalTableState, TableProps } from '../types';\nimport { ColumnHeader, ColumnHeaderContext } from './columnHeader';\nimport { ColumnSelection } from './columnSelection';\nimport { Export } from './export';\nimport { FilterControl } from './filterControl';\nimport { ResizeHandle, ResizeHandleView } from './resizeHandle';\nimport { Row } from './row';\nimport { SelectComponent } from './selectComponent';\nimport { SortComponent } from './sortComponent';\nimport { Virtualized } from './virtualized';\n\nexport const TableContext = createContext<Store<InternalTableState<any>> | null>(null);\nexport const ColumnContext = createContext<Id | null>(null);\nexport function useTableContext<T>(): Store<InternalTableState<T>> {\n const value = useContext(TableContext);\n if (!value) throw Error('No table context available');\n return value as Store<InternalTableState<T>>;\n}\nexport function useColumnContext(): Id {\n const value = useContext(ColumnContext);\n if (value === null) throw Error('No column context available');\n return value;\n}\n\nexport function Table<T>(props: TableProps<T>): JSX.Element {\n const table = useTableState(props);\n\n table.getState().props.debugRender?.('render table');\n\n return (\n <TableContext.Provider value={table}>\n <TableLoadingState />\n </TableContext.Provider>\n );\n}\n\nfunction TableLoadingState() {\n const { text } = useTheme();\n const isHydrated = useTableStateStorage();\n const [showLoading, setShowLoading] = useState(false);\n\n useEffect(() => {\n const handle = setTimeout(() => setShowLoading(true), 500);\n return () => clearTimeout(handle);\n });\n\n return (\n <>\n {!isHydrated && showLoading && <div>{text.loading}</div>}\n <TableInner hidden={!isHydrated} />\n </>\n );\n}\n\nconst TableInner = memo(function TableInner<T>({ hidden }: { hidden: boolean }) {\n const table = useTableContext<T>();\n const fullWidth = table.useState('props.fullWidth');\n const activeColumns = table.useState((state) =>\n state.activeColumns.map((column) => ({\n id: column.id,\n width: column.width,\n classes: column.classes,\n header: column.header,\n })),\n );\n const columnWidths = table.useState('columnWidths', { throttle: 16 });\n const columnStyleOverride = table.useState('columnStyleOverride', { throttle: 16 });\n const defaultWidth = table.useState('props.defaultWidth');\n const classes = table.useState('props.classes');\n const stickyHeader = table.useState('props.stickyHeader');\n const enableSelection = table.useState('props.enableSelection');\n const enableColumnSelection = table.useState('props.enableColumnSelection');\n const enableExport = table.useState((state) => !!state.props.enableExport.copy || !!state.props.enableExport.download);\n const cssVariables = useCssVariables();\n\n table.getState().props.debugRender?.('render table inner');\n\n return (\n <Virtualized\n className={classes?.table}\n css={[\n cssVariables,\n defaultClasses.table,\n {\n gridTemplateColumns: [\n //\n fullWidth === 'right' || fullWidth === true ? 'auto' : '0',\n 'max-content',\n ...activeColumns.map((column) => columnWidths.get(column.id) ?? column.width ?? defaultWidth ?? 'max-content'),\n fullWidth === 'left' || fullWidth === true ? 'auto' : '0',\n ].join(' '),\n },\n hidden && { visibility: 'hidden' },\n ]}\n header={\n <>\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerFill, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n />\n\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerCell, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n >\n {enableSelection && <SelectComponent />}\n\n {enableColumnSelection && <ColumnSelection />}\n\n {enableExport && <Export />}\n <ResizeHandleView />\n </div>\n\n <ColumnHeaderContext.Provider>\n {activeColumns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnHeader\n className={cx(classes?.headerCell, column.classes?.headerCell)}\n css={[\n defaultClasses.headerCell,\n columnStyleOverride.get(column.id),\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n ]}\n key={column.id}\n >\n <SortComponent>{column.header}</SortComponent>\n <div css={{ flex: 1 }} />\n <FilterControl />\n <ResizeHandle />\n </ColumnHeader>\n </ColumnContext.Provider>\n ))}\n </ColumnHeaderContext.Provider>\n\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerFill, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n />\n </>\n }\n >\n {(itemIds, startIndex) => itemIds.map((itemId, index) => <Row key={itemId} itemId={itemId} rowIndex={startIndex + index} />)}\n </Virtualized>\n );\n});\n","import { TableTheme } from '../../types';\n\nexport const defaultColors: TableTheme['colors'] = {\n primary: { main: '#1976d2', light: '#42a5f5', contrastText: '#fff' },\n secondary: { main: '#9c27b0', light: '#ba68c8', contrastText: '#fff' },\n};\n","import { css } from '@emotion/react';\n\nexport function Spinner({ className }: { className?: string }) {\n return (\n <div\n className={className}\n css={css`\n display: inline-block;\n position: relative;\n width: 1em;\n height: 1em;\n\n div {\n box-sizing: border-box;\n display: block;\n position: absolute;\n width: 0.8em;\n height: 0.8em;\n margin: 0.1em;\n border: 0.1em solid #fff;\n border-radius: 50%;\n animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n border-color: currentColor transparent transparent transparent;\n }\n div:nth-of-type(1) {\n animation-delay: -0.45s;\n }\n div:nth-of-type(2) {\n animation-delay: -0.3s;\n }\n div:nth-of-type(3) {\n animation-delay: -0.15s;\n }\n @keyframes lds-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n `}\n >\n <div />\n <div />\n <div />\n </div>\n );\n}\n","import { TableTheme } from '../../types';\n\nexport const Badge: TableTheme['components']['Badge'] = ({ badgeContent, children }) => {\n if (!open) return null;\n\n return (\n <span\n css={{\n display: 'inline-flex',\n position: 'relative',\n flexShrink: 0,\n verticalAlign: 'middle',\n }}\n >\n {children}\n\n <span\n css={[\n {\n top: 0,\n right: 0,\n transform: 'scale(1) translate(50%, -50%)',\n transformOrigin: '100% 0%',\n height: 20,\n display: 'flex',\n padding: '0 6px',\n zIndex: 1,\n position: 'absolute',\n flexWrap: 'wrap',\n minWidth: 20,\n transition: 'transform 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',\n alignItems: 'center',\n lineHeight: 1,\n alignContent: 'center',\n borderRadius: 10,\n justifyContent: 'center',\n fontSize: '0.8em',\n },\n !badgeContent && {\n transform: 'scale(0) translate(50%, -50%)',\n transition: 'transform 195ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',\n },\n ]}\n >\n {badgeContent}\n </span>\n </span>\n );\n};\n","import { TableTheme } from '../../types';\nimport { darkGray, lightGray } from './defaultClasses';\n\nexport const Button: TableTheme['components']['Button'] = ({ startIcon, children, variant = 'text', ...props }) => {\n return (\n <button\n css={[\n {\n padding: `var(--spacing) calc(var(--spacing) * 2)`,\n display: 'inline-flex',\n alignItems: 'center',\n transition: 'background-color 150ms',\n border: 'none',\n cursor: 'pointer',\n background: 'transparent',\n borderRadius: 4,\n\n '&:active:not(:disabled)': {\n transform: 'scale3d(0.95, 0.95, 1)',\n },\n },\n variant === 'text' && {\n '&:hover': {\n background: 'rgba(0, 0, 0, 0.1)',\n },\n },\n variant === 'outlined' && {\n border: `1px solid ${darkGray}`,\n\n '&:disabled': {\n borderColor: lightGray,\n },\n },\n variant === 'contained' && {\n color: 'var(--primaryContrastText)',\n backgroundColor: 'var(--primaryMain)',\n boxShadow: '0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%)',\n\n '&:hover': {\n filter: 'brightness(0.9)',\n },\n\n '&:disabled': {\n filter: 'grayscale()',\n opacity: 0.5,\n },\n },\n ]}\n {...props}\n >\n {startIcon && <span css={{ marginRight: `calc(var(--spacing) * 2)` }}>{startIcon}</span>}\n <span>{children}</span>\n </button>\n );\n};\n","import { TableTheme } from '../../types';\n\nexport const Checkbox: TableTheme['components']['Checkbox'] = ({ className, ...props }) => {\n return (\n <label\n css={[\n {\n padding: 'calc(var(--spacing) * 1.8)',\n display: 'flex',\n color: 'currentcolor',\n userSelect: 'none',\n\n '& input': {\n appearance: 'none',\n margin: 0,\n },\n },\n props.disabled && { color: 'rgba(0, 0, 0, 0.26)' },\n ]}\n className={className}\n >\n <input type=\"checkbox\" {...props} />\n\n {props.checked ? (\n <svg\n css={{ fontSize: '1.25rem', width: '1em', height: '1em', fill: 'var(--primaryMain)' }}\n focusable=\"false\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"></path>\n </svg>\n ) : (\n <svg\n css={{ fontSize: '1.25rem', width: '1em', height: '1em', fill: 'currentColor' }}\n focusable=\"false\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"></path>\n </svg>\n )}\n </label>\n );\n};\n","import { TableTheme } from '../../types';\n\nexport const IconButton: TableTheme['components']['IconButton'] = (props) => {\n return (\n <button\n css={{\n padding: 'var(--spacing)',\n borderRadius: '50%',\n display: 'inline-flex',\n justifyContent: 'center',\n alignItems: 'center',\n transition: 'background-color 150ms',\n border: 'none',\n cursor: 'pointer',\n color: 'inherit',\n background: 'transparent',\n\n '&:hover': {\n backgroundColor: 'rgba(0, 0, 0, 0.04)',\n },\n\n '&:active': {\n transformColor: 'scale3d(0.95, 0.95, 1)',\n },\n }}\n {...props}\n />\n );\n};\n","import { useState } from 'react';\nimport { TableTheme } from '../../types';\nimport { darkGray } from './defaultClasses';\n\nexport const TextField: TableTheme['components']['TextField'] = ({ endIcon, className, inputRef, ...props }) => {\n const [focus, setFocus] = useState(false);\n\n return (\n <div className={className} css={{ display: 'flex' }}>\n <span\n css={[\n {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n border: `1px solid ${darkGray}`,\n borderRadius: 4,\n },\n focus && { border: '2px solid var(--primaryMain)', margin: -1 },\n ]}\n >\n <input\n ref={inputRef}\n {...props}\n value={props.value ?? ''}\n onFocus={() => setFocus(true)}\n onBlur={() => setFocus(false)}\n css={{\n flex: 1,\n border: 'none',\n outline: 'none',\n borderRadius: 4,\n padding: 'calc(var(--spacing) * 2)',\n paddingRight: 0,\n transition: 'outline 500ms',\n }}\n />\n\n {endIcon}\n </span>\n </div>\n );\n};\n","import { Spinner } from '../../components/spinnner';\nimport { TableTheme } from '../../types';\nimport { Badge } from './badge';\nimport { Button } from './button';\nimport { Checkbox } from './checkbox';\nimport { IconButton } from './iconButton';\nimport { Popover } from './popover';\nimport { TextField } from './textField';\n\nexport const defaultComponents: TableTheme['components'] = {\n IconButton,\n Checkbox,\n Popover,\n Button,\n Badge,\n TextField,\n Spinner,\n};\n","import { ClassNames, css } from '@emotion/react';\nimport { cloneElement, HTMLProps } from 'react';\nimport { TableTheme } from '../../types';\n\nconst IconDefaultStyle = css({\n width: '1.5em',\n height: '1.5em',\n color: 'inherit',\n});\n\nfunction Icon(svg: JSX.Element) {\n return (props: HTMLProps<Element>) => (\n <ClassNames>\n {({ css }) =>\n cloneElement(svg, {\n ...props,\n className: css(IconDefaultStyle, props.className),\n })\n }\n </ClassNames>\n );\n}\n\nconst Settings = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z\" />\n </svg>,\n);\n\nconst Export = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n enableBackground=\"new 0 0 24 24\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <g>\n <rect fill=\"none\" height=\"24\" width=\"24\" />\n </g>\n <g>\n <path d=\"M18,15v3H6v-3H4v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3H18z M17,11l-1.41-1.41L13,12.17V4h-2v8.17L8.41,9.59L7,11l5,5 L17,11z\" />\n </g>\n </svg>,\n);\n\nconst Clipboard = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M19 2h-4.18C14.4.84 13.3 0 12 0S9.6.84 9.18 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z\" />\n </svg>,\n);\n\nconst ChevronRight = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6-6-6z\" />\n </svg>,\n);\n\nconst Search = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n </svg>,\n);\n\nconst Clear = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n </svg>,\n);\n\nconst ArrowDropDown = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M7 10l5 5 5-5H7z\" />\n </svg>,\n);\n\nconst FilterList = Icon(\n <svg viewBox=\"0 0 24 24\">\n <path\n fill=\"currentColor\"\n d=\"M14,12V19.88C14.04,20.18 13.94,20.5 13.71,20.71C13.32,21.1 12.69,21.1 12.3,20.71L10.29,18.7C10.06,18.47 9.96,18.16 10,17.87V12H9.97L4.21,4.62C3.87,4.19 3.95,3.56 4.38,3.22C4.57,3.08 4.78,3 5,3V3H19V3C19.22,3 19.43,3.08 19.62,3.22C20.05,3.56 20.13,4.19 19.79,4.62L14.03,12H14Z\"\n />\n </svg>,\n);\n\nconst ArrowUpward = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\" />\n </svg>,\n);\n\nexport const defaultIcons: TableTheme['icons'] = {\n Settings,\n Export,\n Clipboard,\n ChevronRight,\n Search,\n Clear,\n ArrowDropDown,\n FilterList,\n ArrowUpward,\n};\n","import { TableTheme } from '../../types';\n\nexport const defaultTexts: TableTheme['text'] = {\n selectColumns: 'Select visible columns',\n noResults: 'No results',\n exportTitle: 'Export',\n exportCopy: 'To clipboard',\n exportDownload: 'Download',\n today: 'Today',\n thisWeek: 'This week',\n reset: 'Reset',\n loading: 'Loading',\n selected: (count) => `${count} selected`,\n};\n","import { TableTheme } from '../../types';\nimport { defaultColors } from './defaultColors';\nimport { defaultComponents } from './defaultComponents';\nimport { defaultIcons } from './defaultIcons';\nimport { defaultTexts } from './defaultTexts';\n\nexport const defaultTableTheme: TableTheme = {\n text: defaultTexts,\n components: defaultComponents,\n icons: defaultIcons,\n colors: defaultColors,\n spacing: '5px',\n};\n","import { useContext } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { TableContext } from '../components/table';\nimport { defaultTableTheme } from '../theme/defaultTheme';\nimport { globalTableTheme, mergeThemes, TableThemeContext } from '../theme/tableTheme';\nimport { TableTheme } from '../types';\n\nconst emptyStore = new Store(undefined);\n\nexport function useTheme<T>() {\n const table = useContext(TableContext);\n const localTheme =\n table?.useState((state) => ({\n text: state.props.text,\n classes: state.props.classes,\n components: state.props.components,\n icons: state.props.icons,\n colors: state.props.colors,\n spacing: state.props.spacing,\n })) ??\n emptyStore.useState() ??\n {};\n\n const contextTableTheme = useContext(TableThemeContext);\n\n return mergeThemes<T>(defaultTableTheme, globalTableTheme, contextTableTheme, localTheme) as TableTheme<T>;\n}\n","import { ComponentType, useContext, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { PopoverContext } from '../theme/defaultTheme/popover';\nimport { TableTheme } from '../types';\n\ntype Props = TableTheme['components']['TextField'] extends ComponentType<infer T> ? T : never;\n\nexport function AutoFocusTextField(props: Omit<Props, 'inputRef'>) {\n const {\n components: { TextField },\n } = useTheme();\n\n const ref = useRef<HTMLInputElement>(null);\n const { visible } = useContext(PopoverContext);\n\n useLayoutEffect(() => {\n if (visible && ref.current) {\n ref.current.focus();\n }\n }, [visible]);\n\n return <TextField {...props} inputRef={ref} />;\n}\n","import { Fragment, useMemo, useState } from 'react';\n\nconst className = 'schummar-table-date-input';\n\nconst defaultDate = new Date(1970, 0, 1);\n\nconst isIncludedType = (type: Intl.DateTimeFormatPartTypes): type is 'day' | 'month' | 'year' =>\n type === 'day' || type === 'month' || type === 'year';\n\nconst defaultLengths = {\n day: 2,\n month: 2,\n year: 4,\n};\n\nconst maxLengths = {\n day: 2,\n month: 2,\n year: Infinity,\n};\n\nconst length = (type: 'day' | 'month' | 'year', value: string) => Math.max(value.length, defaultLengths[type]);\n\nconst tabNext = (e: Element) => {\n const all = Array.from(document.querySelectorAll(`.${className}`));\n const index = all.indexOf(e);\n const next = all[(index + 1) % all.length];\n\n if (next instanceof HTMLElement) {\n next.focus();\n }\n};\n\nexport function DateInput({ value, onChange, locale }: { value: Date | null; onChange: (date: Date | null) => void; locale?: string }) {\n const [override, setOverride] = useState<{ type: string; value: string }>();\n\n const commit = () => {\n if (!override) {\n return;\n }\n\n setOverride(undefined);\n\n if (!override.value) {\n onChange(null);\n return;\n }\n\n const newValue = value ? new Date(value) : new Date();\n if (override.type === 'day') {\n newValue.setDate(Number(override.value));\n } else if (override.type === 'month') {\n newValue.setMonth(Number(override.value) - 1);\n } else if (override.type === 'year') {\n newValue.setFullYear(Number(override.value));\n }\n\n onChange(newValue);\n };\n\n const format = useMemo(\n () =>\n new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n }),\n [locale],\n );\n const parts = format.formatToParts(value ?? defaultDate);\n const isEmpty = !value;\n\n return (\n <div\n css={{\n display: 'flex',\n alignItems: 'baseline',\n }}\n >\n {parts.map(({ type, value }, index) => (\n <Fragment key={index}>\n {isIncludedType(type) ? (\n <input\n className={className}\n css={{\n width: `${length(type, value)}ch`,\n boxSizing: 'content-box',\n overflow: 'visible',\n border: 'none',\n borderBottom: '2px solid transparent',\n outline: 'none',\n fontSize: 'inherit',\n\n '&:focus': {\n borderBottom: '2px solid var(--primaryMain)',\n },\n }}\n placeholder={''.padEnd(length(type, value), '0')}\n value={override?.type === type ? override.value : !isEmpty ? value : ''}\n onChange={(e) => {\n setOverride({ type, value: e.target.value });\n if (e.target.value.length >= maxLengths[type]) {\n setTimeout(() => tabNext(e.target));\n }\n }}\n onFocus={(e) => e.target.select()}\n onBlur={commit}\n />\n ) : type === 'literal' ? (\n <span>{value}</span>\n ) : null}\n </Fragment>\n ))}\n </div>\n );\n}\n","import { useDayzed } from 'dayzed';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { useTheme } from '..';\nimport { gray } from '../theme/defaultTheme/defaultClasses';\nimport { DateInput } from './dateInput';\n\nexport type DateRange = { min: Date; max: Date };\n\nexport type DatePickerProps = {\n /** Currently selected day or range of days. */\n value: Date | DateRange | null;\n /** Callback for when the day (range) changes. */\n onChange: (value: Date | DateRange | null) => void;\n /** If enabled, ranges can be selected. */\n rangeSelect?: boolean;\n /** Which locale to use to render the calendar. */\n locale?: string;\n /** Which day of the week should be in the first column. */\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n};\n\nconst weekDays = [0, 1, 2, 3, 4, 5, 6] as const;\n\n/** Rounds a date down to the start of the day. */\nexport const startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\n/** Rounds a date up to the end of the day. */\nexport const endOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1, 0, 0, 0, -1);\n\nexport const today = (): DateRange => {\n const today = startOfDay(new Date());\n return { min: today, max: today };\n};\n\nexport const thisWeek = (firstDayOfWeek = 0): DateRange => {\n const now = new Date();\n const min = new Date(now);\n\n let diff = min.getDay() - firstDayOfWeek;\n if (diff < 0) {\n diff += 7;\n }\n min.setDate(min.getDate() - diff);\n\n const max = new Date(min);\n max.setDate(max.getDate() + 6);\n\n return { min: startOfDay(min), max: endOfDay(max) };\n};\n\n/** Returns whether two dates and/or date ranges intersect. Intersection is considered per day. */\nexport function dateIntersect(a: Date | null | DateRange, b: Date | null | DateRange) {\n if (a instanceof Date) {\n a = { min: a, max: a };\n }\n if (b instanceof Date) {\n b = { min: b, max: b };\n }\n\n if (!a?.min || !a.max || !b?.min || !b.max) {\n return false;\n }\n\n return !(endOfDay(a.max) < startOfDay(b.min) || startOfDay(a.min) > endOfDay(b.max));\n}\n\nexport function DatePicker({ value, onChange, rangeSelect, locale, firstDayOfWeek = 0 }: DatePickerProps) {\n const {\n components: { Button, IconButton },\n icons: { ChevronRight },\n text,\n } = useTheme();\n\n const [baseDate] = useState(new Date());\n const [dateInView, setDateInView] = useState<Date>(baseDate);\n const [dirty, setDirty] = useState<Partial<DateRange>>();\n const [hovered, setHovered] = useState<Date>();\n\n const min = dirty ? dirty.min : value instanceof Date ? value : value?.min;\n const max = dirty ? dirty.max : value instanceof Date ? value : value?.max;\n\n const { calendars, getBackProps, getForwardProps, getDateProps } = useDayzed({\n onDateSelected: () => undefined,\n firstDayOfWeek,\n showOutsideDays: true,\n date: dateInView,\n onOffsetChanged: (offset) => setDateInView(new Date(dateInView.getFullYear(), dateInView.getMonth() + offset)),\n offset: 0,\n });\n\n const formatWeekday = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n return (weekDay: number) => format(new Date(Date.UTC(2021, 5, weekDay)));\n }, [locale]);\n\n useEffect(() => setDateInView(value === null ? new Date() : value instanceof Date ? value : value.max), [value]);\n\n useEffect(() => {\n if (!rangeSelect) {\n setDirty(undefined);\n }\n }, [rangeSelect]);\n\n function set(min?: Date, max?: Date, edit?: 'min' | 'max') {\n if (!rangeSelect) {\n onChange(min ?? null);\n return;\n }\n\n if (min && max && min > max) {\n if (edit === 'min') {\n max = min;\n } else if (edit === 'max') {\n min = max;\n } else {\n [min, max] = [max, min];\n }\n }\n\n if (!min === !max) {\n setDirty(undefined);\n onChange(min && max ? { min, max } : null);\n } else {\n setDirty({ min, max });\n }\n }\n\n const formatMonth = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { month: 'long' });\n return (month: number) => format(new Date(2021, month));\n }, [locale]);\n\n const formatYear = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { year: 'numeric' });\n return (year: number) => format(new Date(year, 0, 1));\n }, [locale]);\n\n return (\n <div>\n <div css={{ display: 'grid', gridAutoFlow: 'column', justifyContent: 'center', alignItems: 'baseline', gap: 'var(--spacing)' }}>\n <DateInput value={min ?? null} onChange={(date) => set(date ?? undefined, max, 'min')} locale={locale} />\n\n {rangeSelect && (\n <>\n {' - '}\n <DateInput value={max ?? null} onChange={(date) => set(min, date ?? undefined, 'max')} locale={locale} />\n </>\n )}\n </div>\n\n {calendars.map(({ month, year, weeks }) => (\n <div key={`${month}${year}`} css={{ display: 'grid' }}>\n <div\n css={{\n margin: 'calc(var(--spacing) * 4) 0',\n display: 'grid',\n gridAutoFlow: 'column',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <IconButton {...getBackProps({ calendars })}>\n <ChevronRight css={{ transform: 'rotate3d(0, 0, 1, 180deg)' }} />\n </IconButton>\n\n <div css={{ display: 'flex' }}>\n {formatMonth(month)} {formatYear(year)}\n </div>\n\n <IconButton {...getForwardProps({ calendars })}>\n <ChevronRight />\n </IconButton>\n </div>\n\n <div\n css={{\n justifySelf: 'center',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, max-content)',\n fontWeight: 'bold',\n }}\n >\n {weekDays.map((_v, weekDay) => (\n <div key={weekDay} css={{ justifySelf: 'center', marginBottom: 'var(--spacing)' }}>\n {formatWeekday(weekDay)}\n </div>\n ))}\n\n {weeks.map((week, index) =>\n week.map((dateObj, dayIndex) => {\n if (!dateObj) {\n return <div />;\n }\n\n const { prevMonth, nextMonth, date, today } = dateObj;\n\n const selected = date.getTime() === min?.getTime() || (min && max && dateIntersect(date, { min, max }));\n const preSelected =\n !selected &&\n (date.getTime() === hovered?.getTime() ||\n (min && !max && hovered && dateIntersect(date, min <= hovered ? { min, max: hovered } : { min: hovered, max: min })));\n\n return (\n <button\n key={`${index}-${dayIndex}`}\n css={[\n {\n padding: 10,\n border: '1px solid transparent',\n background: 'transparent',\n cursor: 'pointer',\n },\n (prevMonth || nextMonth) && {\n color: gray,\n },\n today && {\n border: '1px solid var(--secondaryMain)',\n },\n selected && {\n background: 'var(--primaryMain)',\n color: 'var(--primaryContrastText)',\n },\n preSelected && {\n background: 'var(--primaryLight)',\n color: 'var(--primaryContrastText)',\n },\n ]}\n {...getDateProps({ dateObj })}\n onClick={() => {\n if (dirty) {\n if (min) set(min, date);\n else set(date, max);\n } else {\n set(date);\n }\n }}\n onPointerOver={() => setHovered(date)}\n onPointerOut={() => setHovered(undefined)}\n >\n {date.getDate()}\n </button>\n );\n }),\n )}\n </div>\n </div>\n ))}\n\n <div css={{ marginTop: 'var(--spacing)', display: 'grid', gridAutoFlow: 'column', justifyContent: 'center' }}>\n <Button\n variant=\"text\"\n onClick={() => {\n setDirty(undefined);\n onChange(today());\n }}\n >\n {text.today}\n </Button>\n\n <Button\n variant=\"text\"\n onClick={() => {\n setDirty(undefined);\n onChange(thisWeek(firstDayOfWeek));\n }}\n >\n {text.thisWeek}\n </Button>\n\n <Button\n variant=\"text\"\n onClick={() => {\n setDirty(undefined);\n onChange(null);\n }}\n >\n {text.reset}\n </Button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useFilter } from '..';\nimport { CommonFilterProps } from '../types';\nimport { dateIntersect, DatePicker, DatePickerProps, DateRange } from './datePicker';\n\nfunction convertDate(x: unknown): Date | null {\n if (x instanceof Date) return x;\n if (typeof x === 'number' || typeof x === 'string') return new Date(x);\n return null;\n}\n\nfunction convertDateOrRange(x: unknown): Date | DateRange | null {\n if (x instanceof Object && 'min' in x && 'max' in x) {\n const range = {\n min: convertDate((x as any).min),\n max: convertDate((x as any).max),\n };\n return range.min && range.max ? (range as DateRange) : null;\n }\n return convertDate(x);\n}\n\nfunction convertDateOrArray(x: unknown): Date | DateRange | (Date | DateRange)[] | null {\n if (x instanceof Array) return x.map(convertDateOrRange).filter(Boolean) as (Date | DateRange)[];\n return convertDateOrRange(x);\n}\n\nexport function DateFilter<T, V>({\n locale,\n firstDayOfWeek,\n singleSelect,\n filterBy = convertDateOrArray,\n ...props\n}: {\n /** Which locale to use to render the calendar. */\n locale?: string;\n /** Which day of the week should be in the first column. */\n firstDayOfWeek?: DatePickerProps['firstDayOfWeek'];\n /** If enabled, only single days can be selected. Ranges otherwise. */\n singleSelect?: boolean;\n} & CommonFilterProps<T, V, Date | DateRange | null, Date | DateRange | null>): JSX.Element {\n const { value = null, onChange } = useFilter({\n ...props,\n filterBy,\n\n id: 'dateFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n return dateIntersect(filterValue, value);\n },\n });\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n }}\n >\n <DatePicker rangeSelect={!singleSelect} value={value} onChange={onChange} locale={locale} firstDayOfWeek={firstDayOfWeek} />\n </div>\n );\n}\n","import React, { ReactNode, useState } from 'react';\nimport { useColumnContext, useFilter, useTheme } from '..';\nimport { asString, castArray, flatMap, uniq } from '../misc/helpers';\nimport { CommonFilterProps, InternalColumn, SerializableValue } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\nimport { FormControlLabel } from './formControlLabel';\nimport { useTableContext } from './table';\n\nfunction toggle<T>(set: Set<T>, value: T, singleSelect?: boolean) {\n const newSet = new Set(singleSelect ? [] : set);\n if (set.has(value)) {\n newSet.delete(value);\n } else {\n newSet.add(value);\n }\n\n return newSet;\n}\n\nexport function SelectFilter<T, V, F extends SerializableValue>({\n options: providedOptions,\n stringValue = asString,\n render = stringValue,\n singleSelect,\n ...props\n}: {\n /** Which options are provided to select. By default all unique item values are used. */\n options?: F[];\n /** String representation of a value. Used to filter options via the text field. */\n stringValue?: (value: F) => string;\n /** Render values. By default a string representation of the value is used. */\n render?: (value: F) => ReactNode;\n /** If enabled, only one option can be selected at a time. */\n singleSelect?: boolean;\n} & CommonFilterProps<T, V, F, Set<F>>): JSX.Element {\n const {\n components: { IconButton, Checkbox },\n icons: { Search, Clear },\n text,\n } = useTheme();\n\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n\n const options = table.useState((state) => {\n if (providedOptions) return uniq(providedOptions);\n\n const column = state.activeColumns.find((column) => column.id === columnId) as InternalColumn<T, V> | undefined;\n if (!column) return [];\n\n const filterBy = props.filterBy ?? ((x) => x as unknown as F | F[]);\n\n return uniq(flatMap(state.items, (item) => castArray(filterBy(column.value(item), item))));\n });\n\n const [query, setQuery] = useState('');\n const filtered = options.filter((option) => !query || stringValue(option).toLowerCase().includes(query.toLowerCase()));\n\n const { value = new Set<F>(), onChange } = useFilter({\n ...props,\n\n id: 'selectFilter',\n\n isActive(filterValue) {\n return filterValue.size > 0;\n },\n\n test(filterValue, value) {\n return filterValue.has(value);\n },\n });\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n gap: 'var(--spacing)',\n }}\n >\n <AutoFocusTextField\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n endIcon={<IconButton onClick={() => setQuery('')}>{!query ? <Search /> : <Clear />}</IconButton>}\n css={{ marginBottom: 'var(--spacing)' }}\n />\n\n <div css={{ maxHeight: '20em', overflowY: 'auto' }}>\n <FormControlLabel\n disabled={value.size === 0}\n control={<Checkbox disabled={value.size === 0} checked={value.size > 0} onChange={() => onChange(new Set())} />}\n label={<><{text.selected(value.size)}></>}\n ></FormControlLabel>\n\n {filtered.map((option, index) => (\n <FormControlLabel\n key={index}\n control={<Checkbox checked={value.has(option)} onChange={() => onChange(toggle(value, option, singleSelect))} />}\n label={render(option)}\n ></FormControlLabel>\n ))}\n </div>\n\n {filtered.length === 0 && <span css={{ textAlign: 'center' }}>{text.noResults}</span>}\n </div>\n );\n}\n","export function debounce<Args extends any[]>(fn: (...args: Args) => void, ms: number): { (...args: Args): void; flush(): void } {\n let lastArgs: Args | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n function run() {\n const args = lastArgs;\n\n lastArgs = undefined;\n timeout = undefined;\n\n fn(...(args as Args));\n }\n\n return Object.assign(\n function (...args: Args) {\n lastArgs = args;\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(run, ms);\n },\n {\n flush() {\n if (timeout) {\n clearTimeout(timeout);\n run();\n }\n },\n },\n );\n}\n","import { castDraft } from 'immer';\nimport { useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useColumnContext, useTableContext } from '..';\nimport { FilterControlContext } from '../components/filterControl';\nimport { debounce } from '../misc/debounce';\nimport { FilterImplementation, SerializableValue } from '../types';\n\nexport function useFilter<T, V, F, S extends SerializableValue>(impl: FilterImplementation<T, V, F, S>) {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n\n // Update implementation\n useEffect(() => {\n table.update((state) => {\n if (impl.defaultValue !== undefined) {\n state.filterValues.set(columnId, impl.defaultValue);\n }\n });\n }, []);\n\n useEffect(() => {\n table.update((state) => {\n state.filters.set(columnId, castDraft(impl));\n\n if (impl.value !== undefined) {\n state.filterValues.set(columnId, impl.value);\n }\n });\n\n return () => {\n table.update((state) => {\n state.filters.delete(columnId);\n });\n };\n }, [table, columnId, impl]);\n\n // Track local value and update it globally after delay\n const value = table.useState((state) => state.filterValues.get(columnId) as S | undefined);\n const [dirtyValue, setDirtyValue] = useState<S>();\n const implRef = useRef(impl);\n\n useLayoutEffect(() => {\n implRef.current = impl;\n });\n\n const delayedUpdate = useMemo(\n () =>\n debounce((value?: S) => {\n const { value: controlledValue, onChange } = implRef.current;\n\n if (controlledValue === undefined) {\n table.update((state) => {\n state.filterValues.set(columnId, value);\n });\n }\n\n onChange?.(value);\n setDirtyValue(undefined);\n }, 500),\n [table],\n );\n\n function onChange(value?: S) {\n setDirtyValue(value);\n delayedUpdate(value);\n }\n\n useEffect(() => delayedUpdate.flush(), [delayedUpdate]);\n\n return {\n value: dirtyValue ?? value,\n onChange,\n close: useContext(FilterControlContext),\n };\n}\n","export const textMatch = (text: string, query: string): boolean => {\n text = text.toLowerCase();\n query = query.toLowerCase();\n return query.split(/\\s+/).every((part) => termMatch(text, part));\n};\n\nexport const termMatch = (text: string, query: string): boolean => {\n let i = 0;\n outer: for (const char of query) {\n for (; i < text.length; i++) {\n if (text[i] === char) {\n i++;\n continue outer;\n }\n }\n return false;\n }\n return true;\n};\n","import React from 'react';\nimport { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asStringOrArray } from '../misc/helpers';\nimport { textMatch } from '../misc/textMatch';\nimport { CommonFilterProps } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\n\nexport function TextFilter<T, V>({\n compare = textMatch,\n filterBy = asStringOrArray,\n ...props\n}: {\n /** Custom comparison function. Should return true if an item value matches the current filter value.\n * By default a fuzzy text comparison is used.\n */\n compare?: (itemValue: string, filterValue: string) => boolean;\n} & CommonFilterProps<T, V, string, string>): JSX.Element {\n const {\n components: { IconButton },\n icons: { Search, Clear },\n } = useTheme();\n\n const { value = '', onChange } = useFilter({\n ...props,\n filterBy,\n\n id: 'textFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n return compare(value, filterValue);\n },\n });\n\n return (\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n }}\n >\n <AutoFocusTextField\n value={value}\n onChange={(e) => onChange(e.target.value)}\n endIcon={<IconButton onClick={() => onChange('')}>{!value ? <Search /> : <Clear />}</IconButton>}\n />\n </div>\n );\n}\n"],"names":["useState","castDraft","useRef","useMemo","Store","ColumnHeaderContext","StoreScope","items","Map","props","ref","columnId","useColumnContext","table","useTableContext","enabled","store","useStore","draggingStart","clone","div","current","update","state","set","delete","offsetLeft","cols","getState","columnOrder","map","id","get","otherCols","filter","col","firstOffsetleft","find","sum","targetIndex","findIndex","width","offsetWidth","length","e","mouseX","clientX","bounds","getBoundingClientRect","undefined","Math","abs","stopPropagation","setPointerCapture","pointerId","cloneNode","body","append","key","value","Object","entries","getComputedStyle","style","assign","pointerEvents","position","boxShadow","left","top","color","index","indexOf","calcTargetIndex","columns","forEach","i","offset","slice","reduce","columnStyleOverride","transition","transform","zIndex","splice","remove","clear","_jsx","userSelect","onPointerDown","onPointerMove","onPointerUp","children","control","label","disabled","_jsxs","display","alignItems","cursor","marginLeft","components","IconButton","Popover","Checkbox","icons","Settings","text","useTheme","cssVariables","useCssVariables","hiddenColumns","anchorEl","setAnchorEl","toggle","column","controlledHiddenColumns","onHiddenColumnsChange","newValue","Set","has","add","currentTarget","padding","marginBottom","selectColumns","cannotHide","header","Button","Export","Clipboard","anchor","setAnchor","generate","options","activeColumns","activeItems","data","String","item","exportCell","csvExport","copy","clipboard","writeText","enableExport","download","a","document","createElement","href","encodeURIComponent","appendChild","click","removeChild","justifyItems","gap","justifyContent","exportTitle","exportCopy","exportDownload","FilterControlContext","createContext","FilterList","ArrowDropDown","isActive","filters","filterValue","filterValues","close","useCallback","preventDefault","target","hasPointerCapture","parent","parentElement","max","columnWidths","releasePointerCapture","getModifierState","onDoubleClick","alignSelf","content","height","background","Cell","memo","itemId","rowIndex","classes","activeItemsById","throttle","debugRender","classNames","calcClassNames","renderCell","cx","defaultClasses","cell","hasDeferredChildren","Spinner","ChevronRight","isExpanded","expanded","hasChildren","controlledExpanded","expandOnlyOne","onExpandedChange","newExpanded","ancestor","getAncestors","margin","isSelected","itemIds","Array","from","keys","size","every","selection","mouseEvent","nativeEvent","lastSelectedId","selectSyncChildren","controlledSelection","onSelectionChange","range","shiftKey","b","min","newSelection","descendant","getDescendants","justifySelf","Function","evenCell","oddCell","Row","divRef","className","indent","columnIds","enableSelection","rowAction","o","ResizeObserver","contains","rowHeights","offsetHeight","observe","disconnect","cellFill","firstCell","Badge","ArrowUpward","direction","sort","s","off","controlledSort","onSortChange","newDirection","newSort","push","gridTemplateColumns","overflow","textOverflow","fontSize","opacity","findScrollRoot","x","documentElement","scrollHeight","clientHeight","overflowY","relativeOffset","y","offsetParent","offsetTop","HTMLElement","virtual","probeRef","setCounter","to","before","after","root","rowHeight","initalRowHeight","overscan","overscanTop","overscanBottom","totalHeight","h","probeOffset","headerHeight","topOfTable","scrollTop","bottomOfTable","reverse","throttleScroll","incCounter","c","addEventListener","removeEventListener","gridColumn","TableContext","ColumnContext","useContext","Error","useTableState","isHydrated","useTableStateStorage","showLoading","setShowLoading","handle","setTimeout","clearTimeout","loading","TableInner","hidden","fullWidth","defaultWidth","stickyHeader","enableColumnSelection","join","visibility","headerCell","headerFill","sticky","flex","startIndex","css","badgeContent","open","flexShrink","verticalAlign","right","transformOrigin","flexWrap","minWidth","lineHeight","alignContent","borderRadius","startIcon","variant","border","darkGray","borderColor","lightGray","backgroundColor","marginRight","appearance","checked","fill","transformColor","TextField","endIcon","inputRef","focus","setFocus","outline","paddingRight","IconDefaultStyle","svg","ClassNames","cloneElement","Icon","Search","Clear","defaultIcons","defaultTexts","noResults","today","thisWeek","reset","selected","count","defaultTableTheme","defaultComponents","colors","defaultColors","spacing","TableThemeContext","mergeThemes","globalTableTheme","visible","PopoverContext","defaultDate","Date","isIncludedType","type","defaultLengths","day","month","year","maxLengths","Infinity","tabNext","all","querySelectorAll","next","onChange","locale","override","setOverride","commit","setDate","Number","setMonth","setFullYear","format","Intl","DateTimeFormat","parts","formatToParts","isEmpty","Fragment","boxSizing","borderBottom","padEnd","select","weekDays","startOfDay","d","getFullYear","getMonth","getDate","endOfDay","firstDayOfWeek","now","diff","getDay","rangeSelect","baseDate","dateInView","setDateInView","dirty","setDirty","hovered","setHovered","calendars","getBackProps","getForwardProps","getDateProps","useDayzed","onDateSelected","showOutsideDays","date","onOffsetChanged","formatWeekday","weekday","weekDay","UTC","edit","formatMonth","formatYear","gridAutoFlow","weeks","fontWeight","_v","week","dateObj","dayIndex","prevMonth","nextMonth","getTime","dateIntersect","preSelected","gray","marginTop","convertDate","convertDateOrRange","Boolean","singleSelect","filterBy","convertDateOrArray","useFilter","test","newSet","providedOptions","stringValue","asString","render","uniq","flatMap","castArray","query","setQuery","filtered","option","toLowerCase","includes","maxHeight","textAlign","compare","textMatch","asStringOrArray"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/hooks/useTableMemo.tsx","../../src/misc/queue.ts","../../src/internalState/tableStateStorage.ts","../../src/misc/helpers.ts","../../src/internalState/calcItems.ts","../../src/internalState/calcProps.ts","../../src/internalState/cleanupState.ts","../../src/internalState/filterColumns.ts","../../src/internalState/syncSelections.ts","../../src/internalState/useTableState.ts","../../src/theme/useCssVariables.ts","../../src/components/columnHeader.tsx","../../src/components/formControlLabel.tsx","../../src/components/columnSelection.tsx","../../src/misc/csvExport.ts","../../src/components/export.tsx","../../src/components/filterControl.tsx","../../src/components/resizeHandle.tsx","../../src/components/cell.tsx","../../src/components/expandControl.tsx","../../src/components/selectComponent.tsx","../../src/components/row.tsx","../../src/components/sortComponent.tsx","../../src/misc/throttle.ts","../../src/components/virtualized.tsx","../../src/components/table.tsx","../../src/theme/defaultTheme/defaultColors.ts","../../src/components/spinnner.tsx","../../src/theme/defaultTheme/badge.tsx","../../src/theme/defaultTheme/button.tsx","../../src/theme/defaultTheme/checkbox.tsx","../../src/theme/defaultTheme/iconButton.tsx","../../src/theme/defaultTheme/textField.tsx","../../src/theme/defaultTheme/defaultComponents.ts","../../src/theme/defaultTheme/defaultIcons.tsx","../../src/theme/defaultTheme/defaultTexts.tsx","../../src/theme/defaultTheme/index.tsx","../../src/hooks/useTheme.ts","../../src/components/autoFocusTextField.tsx","../../src/components/dateInput.tsx","../../src/components/datePicker.tsx","../../src/components/dateFilter.tsx","../../src/components/selectFilter.tsx","../../src/misc/debounce.ts","../../src/hooks/useFilter.ts","../../src/misc/textMatch.ts","../../src/components/textFilter.tsx"],"sourcesContent":["import { createContext, DependencyList, ReactNode, useContext, useMemo } from 'react';\nimport { FunctionWithDeps } from '../types';\n\nconst TableMemoContext = createContext(new Map<string, [value: any, deps: DependencyList]>());\n\nexport function TableMemoContextProvider({ children }: { children: ReactNode }) {\n return <TableMemoContext.Provider value={useMemo(() => new Map(), [])}>{children}</TableMemoContext.Provider>;\n}\n\nexport function useTableMemo() {\n const memoCache = useContext(TableMemoContext);\n\n return <Fn extends (...args: any[]) => any>(key: string, fn: FunctionWithDeps<Fn>): Fn => {\n let deps: DependencyList;\n if (Array.isArray(fn)) {\n deps = fn.slice(1);\n fn = fn[0];\n } else {\n deps = [fn.toString()];\n }\n\n let cachedValue = memoCache.get(key);\n const hit = cachedValue && cachedValue[1].length === deps.length && cachedValue[1].every((x, i) => x === deps[i]);\n if (!cachedValue || !hit) {\n cachedValue = [fn, deps];\n memoCache.set(key, cachedValue);\n }\n return cachedValue[0];\n };\n}\n","export class Queue {\n private q = new Array<{ job: () => Promise<any>; resolve: (value: any) => void; reject: (reason?: any) => void }>();\n private isRunning = false;\n\n run<T>(job: () => Promise<T>, replace?: boolean) {\n return new Promise<T>((resolve, reject) => {\n if (replace) {\n this.q = [];\n }\n this.q.push({ job, resolve, reject });\n\n if (!this.isRunning) this.start();\n });\n }\n\n private async start() {\n this.isRunning = true;\n\n let next;\n while ((next = this.q.shift())) {\n try {\n const result = await next.job();\n next.resolve(result);\n } catch (e) {\n next.reject(e);\n }\n }\n\n this.isRunning = false;\n }\n}\n","import { useEffect, useState } from 'react';\nimport { useTableContext } from '..';\nimport { Queue } from '../misc/queue';\nimport { SerializableValue } from '../types';\n\nconst KEYS = ['sort', 'selection', 'expanded', 'hiddenColumns', 'filterValues', 'columnWidths', 'columnOrder'] as const;\n\nconst storageName = (id: string) => `schummar-table_state-v1_${id}`;\n\nexport type TableStateStorage = {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | Promise<unknown>;\n} & (\n | {\n keys: () => string[] | Promise<string[]>;\n }\n | {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n }\n);\n\nfunction stringify(value: SerializableValue) {\n function prepare(value: SerializableValue): any {\n if (value instanceof Date) {\n return { __date: value.toJSON() };\n }\n\n if (value instanceof Set) {\n return { __set: Array.from(value).map(prepare) };\n }\n\n if (value instanceof Map) {\n return { __map: Array.from(value.entries()).map((entry) => entry.map(prepare)) };\n }\n\n if (value instanceof Array) {\n return value.map(prepare);\n }\n\n if (value instanceof Object) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, prepare(v)]));\n }\n\n return value;\n }\n\n return JSON.stringify(prepare(value));\n}\n\nfunction parse(value: string) {\n return JSON.parse(value, (_key, value) => {\n if (value instanceof Object && '__date' in value) {\n return new Date(value.__date);\n }\n\n if (value instanceof Object && '__set' in value) {\n return new Set(value.__set);\n }\n\n if (value instanceof Object && '__map' in value) {\n return new Map(value.__map);\n }\n\n return value;\n });\n}\n\nexport function useTableStateStorage() {\n const table = useTableContext();\n const [isHydrated, setIsHydrated] = useState(false);\n\n // On mount: load\n useEffect(() => {\n const { persist } = table.getState().props;\n if (!persist) {\n setIsHydrated(true);\n return;\n }\n\n let isCanceled = false;\n\n (async () => {\n try {\n const { storage, id, include, exclude } = persist;\n const json = await storage.getItem(storageName(id));\n if (isCanceled || !json) return;\n\n const data = parse(json);\n table.getState().props.debug?.('load', json, data);\n\n table.update((state) => {\n for (const key of KEYS) {\n if (\n //\n (!include || include.includes(key)) &&\n !exclude?.includes(key) &&\n key in data\n ) {\n if (key === 'filterValues') {\n for (const [id, value] of data[key]) {\n if (state.filters.get(id)?.persist ?? true) {\n state.filterValues.set(id, value);\n }\n }\n } else {\n state[key] = data[key];\n\n if (key === 'expanded' || key === 'hiddenColumns' || key === 'selection' || key === 'sort') {\n state.props[`on${(key.slice(0, 1).toUpperCase() + key.slice(1)) as Capitalize<typeof key>}Change`]?.(data[key]);\n }\n }\n }\n }\n });\n } catch (e) {\n console.error('Failed to load table state:', e);\n } finally {\n setIsHydrated(true);\n }\n })();\n\n return () => {\n isCanceled = true;\n };\n }, []);\n\n // After isHydrated, watch and save state\n useEffect(() => {\n if (!isHydrated) return;\n\n const q = new Queue();\n\n return table.subscribe(\n (state) => {\n if (!state.props.persist) return;\n\n const { storage, id, include, exclude } = state.props.persist;\n const data: any = {};\n\n for (const key of KEYS) {\n if (\n //\n (!include || include.includes(key)) &&\n !exclude?.includes(key)\n ) {\n if (key === 'filterValues') {\n data[key] = new Map();\n for (const [id, value] of state.filterValues) {\n if (state.filters.get(id)?.persist ?? true) {\n data.filterValues.set(id, value);\n }\n }\n } else {\n data[key] = state[key];\n }\n }\n }\n\n return { storage, id, data };\n },\n (props) => {\n if (!props) return;\n const { storage, id, data } = props;\n\n table.getState().props.debug?.('save', data, stringify(data));\n q.run(async () => {\n await storage.setItem(storageName(id), stringify(data));\n }, true);\n },\n { throttle: 1000 },\n );\n }, [isHydrated]);\n\n return isHydrated;\n}\n","import { Id, TableItem } from '../types';\n\nexport const flatMap = <T, S>(arr: Iterable<T>, flatMap: (t: T) => S[]): S[] => {\n return [...arr].reduce<S[]>((out, cur) => out.concat(flatMap(cur)), []);\n};\n\nexport const orderBy = <T>(arr: T[], selectors: ((t: T) => any)[] = [], direction: ('desc' | 'asc')[] = []): T[] => {\n if (selectors.length === 0) selectors = [(t) => t];\n\n return [...arr].sort((a, b) => {\n for (let i = 0; i < selectors.length; i++) {\n const _a = selectors[i]?.(a);\n const _b = selectors[i]?.(b);\n const dir = direction[i] === 'desc' ? -1 : 1;\n if (_a > _b) return dir;\n if (_a < _b) return -dir;\n }\n return 0;\n });\n};\n\nexport const uniq = <T>(arr: T[]): T[] => {\n const set = new Set<T>();\n for (const t of arr) set.add(t);\n return Array.from(set);\n};\n\nexport const intersect = <T>(a: Iterable<T>, b: { has(t: T): boolean }): Set<T> => {\n const result = new Set<T>();\n for (const x of a) if (b.has(x)) result.add(x);\n return result;\n};\n\nexport const getAncestors = <T>(activeItemsById: Map<Id, TableItem<T>>, ...items: TableItem<T>[]): Set<Id> => {\n const result = new Set<Id>();\n\n const find = ({ parentId }: TableItem<T>): void => {\n const parent = parentId ? activeItemsById.get(parentId) : undefined;\n if (parent && !result.has(parent.id)) {\n result.add(parent.id);\n find(parent);\n }\n };\n items.forEach(find);\n return result;\n};\n\nexport const getDescendants = <T>(...items: TableItem<T>[]): Set<Id> => {\n const result = new Set<Id>();\n\n const find = (item: TableItem<T>): void => {\n for (const child of item.children) {\n if (!result.has(child.id)) {\n result.add(child.id);\n find(child);\n }\n }\n };\n items.forEach(find);\n return result;\n};\n\nexport const identity = (x: unknown): any => x;\n\nexport const asString = (x: unknown): string => {\n if (x instanceof Array) return x.map(asString).join(', ');\n if (x instanceof Object) return JSON.stringify(x);\n return String(x ?? '');\n};\n\nexport const asStringOrArray = (x: unknown): string | string[] => {\n if (x instanceof Array) return x.map(asString);\n return asString(x);\n};\n\nexport const defaultEquals = (a: unknown, b: unknown): boolean => a === b;\n\nexport const subStringMatch = (a: string, b: string): boolean => a.toLowerCase().includes(b.toLowerCase());\n\nexport const castArray = <T>(a: T | T[]) => (a instanceof Array ? a : [a]);\n\nexport const cx = (...classNames: (string | false | undefined | null | Record<string, boolean>)[]) =>\n classNames\n .flatMap((entry) => {\n if (!entry) return [];\n if (typeof entry === 'string') return [entry];\n return Object.entries(entry)\n .filter(([, predicate]) => predicate)\n .map(([className]) => className);\n })\n .join(' ');\n","import { castDraft } from 'immer';\nimport { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { castArray, flatMap, orderBy } from '../misc/helpers';\nimport { Id, InternalTableState, TableItem } from '../types';\n\nexport function calcItems<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) =>\n [\n state.props.items,\n state.props.id,\n state.props.parentId,\n state.props.revealFiltered,\n state.sort,\n state.filters,\n state.filterValues,\n state.activeColumns,\n state.expanded,\n ] as const,\n ([items = [], id, parentId, revealFiltered, sort, filters, filterValues, activeColumns], draft) => {\n const tableItems = items.map<TableItem<T>>((item) => ({\n ...item,\n id: id(item),\n parentId: parentId?.(item),\n children: [],\n }));\n\n let sorted;\n if (sort.length === 0) {\n sorted = tableItems;\n } else {\n const selectors = flatMap(sort, (sort) => {\n const column = activeColumns.find((column) => column.id === sort.columnId);\n if (!column) return [];\n return column.sortBy.map((sortBy) => ({\n selector: (item: T) => sortBy(column.value(item), item),\n direction: sort.direction,\n }));\n }).filter(Boolean);\n\n sorted = orderBy(\n tableItems,\n selectors.map((x) => x.selector),\n selectors.map((x) => x.direction),\n );\n }\n\n const lookup = new Map<Id, TableItem<T>>();\n for (const item of sorted) {\n lookup.set(item.id, item);\n }\n\n for (const item of sorted) {\n const parent = item.parentId !== undefined ? lookup.get(item.parentId) : undefined;\n parent?.children.push(item);\n }\n\n const allItems = new Array<TableItem<T>>();\n const allItemsById = new Map<Id, TableItem<T>>();\n\n const traverse = (items: TableItem<T>[]): void => {\n for (const item of items) {\n allItems.push(item);\n allItemsById.set(item.id, item);\n traverse(item.children);\n }\n };\n traverse(sorted.filter((item) => item.parentId === undefined));\n\n let expandedChanged = false;\n const activeItemsById = new Map<Id, TableItem<T>>();\n const activeSet = new Set<Id>();\n const activeItems = [...allItems]\n .reverse()\n .filter((item) => {\n let isActive = activeSet.has(item.id);\n\n isActive ||= activeColumns.every((column) => {\n const filter = filters.get(column.id);\n if (!filter) return true;\n\n const filterValue = filterValues.get(column.id);\n if (filterValue === undefined || !filter.isActive(filterValue)) return true;\n\n const filterBy = filter.filterBy ?? ((x) => x);\n const value = filterBy(column.value(item), item);\n return castArray(value).some((value) => filter.test(filterValue, value));\n });\n\n if (isActive && item.parentId !== undefined) {\n if (\n revealFiltered &&\n Array.from(filters.entries()).some(([id, filter]) => {\n const filterValue = filterValues.get(id);\n return !!filter && filterValue !== undefined && filter.isActive(filterValue);\n })\n ) {\n expandedChanged ||= !draft.expanded.has(item.parentId);\n draft.expanded.add(item.parentId);\n } else if (!draft.expanded.has(item.parentId)) {\n isActive = false;\n }\n }\n\n if (isActive && item.parentId !== undefined) {\n activeSet.add(item.parentId);\n }\n if (isActive) {\n activeItemsById.set(item.id, item);\n }\n\n return isActive;\n })\n .reverse();\n\n draft.items = castDraft(allItems);\n draft.itemsById = castDraft(allItemsById);\n draft.activeItems = castDraft(activeItems);\n draft.activeItemsById = castDraft(activeItemsById);\n\n if (expandedChanged) {\n setTimeout(() => {\n state.getState().props.onExpandedChange?.(state.getState().expanded);\n });\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useMemo } from 'react';\nimport { useTableMemo } from '../hooks/useTableMemo';\nimport { asString } from '../misc/helpers';\nimport { Column, Id, InternalColumn, InternalTableProps, TableProps } from '../types';\n\nconst noopParentId = () => undefined;\n\nexport function calcProps<T>(props: TableProps<T>): InternalTableProps<T> {\n const cache = useTableMemo();\n\n return useMemo(() => {\n let id;\n if (props.id instanceof Function || Array.isArray(props.id)) {\n id = cache('id', props.id);\n } else {\n id = cache('id', [(item: T) => item[props.id as keyof T] as unknown as Id, props.id]);\n }\n\n let parentId;\n if (props.parentId instanceof Function || Array.isArray(props.parentId)) {\n parentId = cache('parentId', props.parentId);\n } else if (props.parentId !== undefined) {\n parentId = cache('parentId', [(item: T) => item[props.parentId as keyof T] as unknown as Id | undefined, props.parentId]);\n } else {\n parentId = noopParentId;\n }\n\n let inputColumns;\n if (props.columns instanceof Function) {\n inputColumns = props.columns((value, column) => ({ ...column, value }));\n } else {\n inputColumns = props.columns.map((column) => ({ ...column, dependecies: undefined }));\n }\n\n const defCol = props.defaultColumnProps;\n const mapColumn = <V>(\n {\n id: _id,\n header = defCol?.header ?? null,\n value,\n renderCell = defCol?.renderCell ?? asString,\n exportCell = defCol?.exportCell ?? asString,\n sortBy = defCol?.sortBy ?? [(v) => (typeof v === 'number' || v instanceof Date ? v : String(v))],\n cannotHide = defCol?.cannotHide,\n classes = defCol?.classes,\n filter = defCol?.filter,\n width = defCol?.width,\n }: Column<T, V>,\n index: number,\n ): InternalColumn<T, V> => {\n const id = _id ?? index;\n const cacheKey = typeof id === 'string' ? `s${id}` : `n${id}`;\n\n return {\n id,\n header,\n value: cache(`columns.${cacheKey}.value`, value),\n renderCell: cache(`columns.${cacheKey}.renderCell`, renderCell),\n exportCell,\n sortBy: sortBy.map((fn, i) => cache(`columns.${cacheKey}.sortBy.${i}`, fn)),\n cannotHide,\n classes,\n filter,\n width,\n };\n };\n\n const columns = inputColumns.map(mapColumn);\n\n const wrapCell = props.wrapCell && cache('wrapCell', props.wrapCell);\n\n const rowAction =\n props.rowAction instanceof Function || Array.isArray(props.rowAction) ? cache('rowAction', props.rowAction) : props.rowAction;\n\n let copy;\n if (props.enableExport === true || (props.enableExport instanceof Object && props.enableExport.copy === true)) {\n copy = { separator: '\\t' };\n } else if (props.enableExport && props.enableExport.copy instanceof Object) {\n copy = props.enableExport.copy;\n }\n\n let download;\n if (props.enableExport === true || (props.enableExport instanceof Object && props.enableExport.download === true)) {\n download = { sepPrefix: true };\n } else if (props.enableExport && props.enableExport.download instanceof Object) {\n download = props.enableExport.download;\n }\n\n const enableExport = { copy, download };\n\n return {\n ...props,\n id,\n parentId,\n columns,\n wrapCell,\n rowAction,\n enableSelection: props.enableSelection ?? true,\n selectSyncChildren: props.selectSyncChildren ?? true,\n stickyHeader: props.stickyHeader ?? true,\n enableExport,\n enableColumnSelection: props.enableColumnSelection ?? true,\n enableColumnResize: props.enableColumnResize ?? true,\n enableColumnReorder: props.enableColumnReorder ?? true,\n };\n }, [props]);\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { intersect } from '../misc/helpers';\nimport { InternalTableState } from '../types';\n\nexport function cleanupState<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.columns, state.itemsById, state.activeItemsById, state.activeColumns] as const,\n ([columns, itemsById, activeItemsById, activeColumns], draft) => {\n const columnIds = new Set(columns.map((column) => column.id));\n const activeColumnIds = new Set(activeColumns.map((column) => column.id));\n\n // Remove sort entries for non active columns\n const newSort = draft.sort.filter((s) => activeColumnIds.has(s.columnId));\n if (newSort.length < draft.sort.length) {\n draft.sort = newSort;\n setTimeout(() => {\n state.getState().props.onSortChange?.(newSort);\n });\n }\n\n // Remove filters for non active columns\n for (const id of draft.filters.keys()) {\n if (!activeColumnIds.has(id)) draft.filters.delete(id);\n }\n\n // Remove filterValues for non active columns\n for (const id of draft.filterValues.keys()) {\n if (!activeColumnIds.has(id)) draft.filterValues.delete(id);\n }\n\n // Remove hiddenColumns for non existing columns\n for (const id of draft.hiddenColumns.keys()) {\n if (!columnIds.has(id)) draft.hiddenColumns.delete(id);\n }\n\n // Remove columnWidth for non existing columns\n for (const id of draft.columnWidths.keys()) {\n if (!columnIds.has(id)) draft.columnWidths.delete(id);\n }\n\n // Remove non existing columns from columnOrder\n for (const id of draft.columnOrder) {\n if (!columnIds.has(id)) draft.columnOrder = draft.columnOrder.filter((x) => x !== id);\n }\n\n if (draft.props.items) {\n // Remove selection for non active items\n const newSelection = intersect(draft.selection, activeItemsById);\n if (newSelection.size !== draft.selection.size) {\n draft.selection = newSelection;\n setTimeout(() => {\n state.getState().props.onSelectionChange?.(newSelection);\n });\n }\n\n // Remove expanded for non existing items\n const newExpanded = intersect(draft.expanded, itemsById);\n if (newExpanded.size < draft.expanded.size) {\n draft.expanded = newExpanded;\n setTimeout(() => {\n state.getState().props.onExpandedChange?.(newExpanded);\n });\n }\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { orderBy } from '../misc/helpers';\nimport { InternalTableState } from '../types';\n\nexport function filterColumns<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.columns, state.hiddenColumns, state.columnOrder] as const,\n ([columns, hiddenColumns, columnOrder], draft) => {\n draft.activeColumns = orderBy(\n columns.filter((column) => !hiddenColumns.has(column.id)),\n [(column) => columnOrder.indexOf(column.id)],\n );\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { InternalTableState } from '../types';\n\nexport function syncSelections<T>(table: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n table.addReaction(\n (state) => [state.props.selectSyncChildren, state.selection, state.activeItems] as const,\n ([selectSyncChildren, selection, activeItems], state) => {\n if (!selectSyncChildren) return;\n\n const newSelection = new Set(selection);\n for (const item of activeItems) {\n if (item.parentId !== undefined && newSelection.has(item.parentId)) {\n newSelection.add(item.id);\n }\n }\n\n if (newSelection.size !== selection.size) {\n state.selection = newSelection;\n setTimeout(() => {\n table.getState().props.onSelectionChange?.(newSelection);\n });\n }\n },\n { runNow: true },\n ),\n [table],\n );\n}\n","import { castDraft } from 'immer';\nimport { useEffect, useMemo } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { InternalTableState, TableProps } from '../types';\nimport { calcItems } from './calcItems';\nimport { calcProps } from './calcProps';\nimport { cleanupState } from './cleanupState';\nimport { filterColumns } from './filterColumns';\nimport { syncSelections } from './syncSelections';\n\nexport function useTableState<T>(_props: TableProps<T>): Store<InternalTableState<T>> {\n const props = calcProps(_props);\n\n const state = useMemo(\n () =>\n new Store<InternalTableState<T>>({\n props,\n\n sort: props.defaultSort ?? [],\n selection: props.defaultSelection ?? new Set(),\n expanded: props.defaultExpanded ?? new Set(),\n rowHeights: new Map(),\n filters: new Map(),\n filterValues: new Map(),\n hiddenColumns: props.defaultHiddenColumns ?? new Set(),\n columnWidths: new Map(),\n columnOrder: props.columns.map((column) => column.id),\n columnStyleOverride: new Map(),\n\n activeColumns: [],\n items: [],\n itemsById: new Map(),\n activeItems: [],\n activeItemsById: new Map(),\n lastSelectedId: undefined,\n }),\n [],\n );\n\n filterColumns(state);\n calcItems(state);\n syncSelections(state);\n cleanupState(state);\n\n useEffect(() => {\n state.update((state) => {\n state.props = castDraft(props);\n if (props.sort) state.sort = props.sort;\n if (props.selection) state.selection = props.selection;\n if (props.expanded) state.expanded = props.expanded;\n if (props.hiddenColumns) state.hiddenColumns = props.hiddenColumns;\n for (const column of props.columns) {\n if (!state.columnOrder.includes(column.id)) {\n const index = props.columns.indexOf(column);\n state.columnOrder.splice(index, 0, column.id);\n }\n }\n });\n }, [state, props]);\n\n return state;\n}\n","import { useTheme } from '../hooks/useTheme';\n\nexport function useCssVariables() {\n return useTheme(({ spacing, colors }) => ({\n '--spacing': spacing,\n '--primaryMain': colors.primary.main,\n '--primaryLight': colors.primary.light,\n '--primaryContrastText': colors.primary.contrastText,\n '--secondaryMain': colors.secondary.main,\n '--secondaryLight': colors.secondary.light,\n '--secondaryContrastText': colors.secondary.contrastText,\n }));\n}\n","import { castDraft } from 'immer';\nimport React, { HTMLProps, useEffect, useRef } from 'react';\nimport { StoreScope } from 'schummar-state/react';\nimport { Id, useColumnContext, useTableContext } from '..';\n\nexport const ColumnHeaderContext = new StoreScope({\n items: new Map<Id, HTMLDivElement>(),\n});\n\nexport function ColumnHeader(props: HTMLProps<HTMLDivElement>) {\n const ref = useRef<HTMLDivElement>(null);\n const columnId = useColumnContext();\n const table = useTableContext();\n const enabled = table.useState('props.enableColumnReorder');\n\n const store = ColumnHeaderContext.useStore();\n const draggingStart = useRef<{ mouseX: number; bounds: DOMRect }>();\n const clone = useRef<HTMLDivElement>();\n\n // Track each headers div in a store\n useEffect(() => {\n const div = ref.current;\n if (!div) return;\n\n store.update((state) => {\n state.items.set(columnId, castDraft(div));\n });\n\n return () => {\n store.update((state) => {\n state.items.delete(columnId);\n });\n };\n }, [ref.current, store, columnId]);\n\n // Calculate which index the current header would get, given the current offset\n function calcTargetIndex(offsetLeft: number) {\n const cols = table.getState().columnOrder.map((id) => ({ id, div: store.getState().items.get(id) }));\n\n const otherCols = cols.filter((col) => col.id !== columnId);\n\n const firstOffsetleft = cols.find((col) => col.div)?.div?.offsetLeft ?? 0;\n\n let sum = 0;\n const targetIndex = otherCols.findIndex((col) => {\n const width = col.div?.offsetWidth ?? 0;\n if (sum + width / 2 > offsetLeft - firstOffsetleft) return true;\n sum += width;\n return false;\n });\n\n return targetIndex === -1 ? otherCols.length : targetIndex;\n }\n\n // When starting clicking: Record initial mouse and div's bounds\n function onPointerDown(e: React.PointerEvent) {\n const div = ref.current;\n if (!div) return;\n draggingStart.current = { mouseX: e.clientX, bounds: div.getBoundingClientRect() };\n }\n\n // When mouse moves while clicked: Calculate transforms\n function onPointerMove(e: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (!div || draggingStart.current === undefined || Math.abs(e.clientX - draggingStart.current.mouseX) < 5) return;\n\n e.stopPropagation();\n div.setPointerCapture(e.pointerId);\n\n // Create clone of header div to move around with mouse\n if (!clone.current) {\n clone.current = div.cloneNode(true) as HTMLDivElement;\n document.body.append(clone.current);\n\n for (const [key, value] of Object.entries(getComputedStyle(div))) {\n try {\n clone.current.style[key as any] = value;\n } catch {\n // ignore\n }\n }\n\n Object.assign(clone.current.style, {\n pointerEvents: 'none',\n position: 'fixed',\n boxShadow: '0px 5px 5px -3px rgb(0 0 0 / 20%), 0px 8px 10px 1px rgb(0 0 0 / 14%), 0px 3px 14px 2px rgb(0 0 0 / 12%)',\n left: `${draggingStart.current.bounds.left}px`,\n top: `${draggingStart.current.bounds.top}px`,\n });\n\n div.style.color = 'rgba(0, 0, 0, 0.2)';\n }\n\n // Update clone's position each time\n clone.current.style.left = `${draggingStart.current.bounds.left + e.clientX - draggingStart.current.mouseX}px`;\n\n // Calculate target index\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(div.offsetLeft + e.clientX - draggingStart.current.mouseX);\n\n // Apply transforms to each column\n const columns = table\n .getState()\n .columnOrder.map((id, index) => ({ id, index, width: store.getState().items.get(id)?.offsetWidth ?? 0 }));\n\n state.columnOrder.forEach((id, i) => {\n let offset = 0;\n if (i === index) {\n // Current column: Move to target pos\n if (targetIndex > index) {\n offset = columns.slice(index + 1, targetIndex + 1).reduce((sum, col) => sum + col.width, 0);\n } else if (targetIndex < index) {\n offset = -columns.slice(targetIndex, index).reduce((sum, col) => sum + col.width, 0);\n }\n } else if (i >= targetIndex && i < index) {\n // Left columns: Move right to make room if needed\n offset = div.offsetWidth;\n } else if (i > index && i <= targetIndex) {\n // Right columns: Move left to make room if needed\n offset = -div.offsetWidth;\n }\n\n state.columnStyleOverride.set(id, {\n transition: 'transform 500ms',\n transform: `translate3d(${offset}px, 0, 0)`,\n zIndex: i === index ? 1 : undefined,\n });\n });\n });\n }\n\n // When releasing mouse: Reset draggin state and apply column move\n function onPointerUp(e: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (!div || draggingStart.current === undefined) return;\n\n // Apply column move\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(div.offsetLeft + e.clientX - draggingStart.current.mouseX);\n\n state.columnOrder.splice(index, 1);\n state.columnOrder.splice(targetIndex, 0, columnId);\n\n // Cleanup\n clone.current?.remove();\n div.style.color = '';\n state.columnStyleOverride.clear();\n draggingStart.current = undefined;\n clone.current = undefined;\n });\n }\n\n return (\n <div\n {...props}\n css={{\n position: 'relative',\n userSelect: 'none',\n }}\n ref={ref}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n >\n {props.children}\n </div>\n );\n}\n","import { ReactNode } from 'react';\n\nexport function FormControlLabel({ control, label, disabled }: { control: ReactNode; label: ReactNode; disabled?: boolean }) {\n return (\n <label\n css={[\n {\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n userSelect: 'none',\n\n '& > *': {\n cursor: 'pointer',\n },\n },\n disabled && { color: 'rgba(0, 0, 0, 0.26)' },\n ]}\n >\n {control}\n <span css={{ marginLeft: 'var(--spacing)' }}>{label}</span>\n </label>\n );\n}\n","import React, { useState } from 'react';\nimport { useTheme } from '..';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { InternalColumn } from '../types';\nimport { FormControlLabel } from './formControlLabel';\nimport { useTableContext } from './table';\n\nexport function ColumnSelection<T>(): JSX.Element {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Popover = useTheme((t) => t.components.Popover);\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const Settings = useTheme((t) => t.icons.Settings);\n const selectColumns = useTheme((t) => t.text.selectColumns);\n const cssVariables = useCssVariables();\n\n const table = useTableContext<T>();\n const columns = table.useState('props.columns');\n const hiddenColumns = table.useState('hiddenColumns');\n\n const [anchorEl, setAnchorEl] = useState<Element | null>(null);\n\n const toggle = (column: InternalColumn<T, unknown>) => {\n const {\n props: { hiddenColumns: controlledHiddenColumns, onHiddenColumnsChange },\n } = table.getState();\n\n const newValue = new Set(hiddenColumns);\n if (hiddenColumns.has(column.id)) newValue.delete(column.id);\n else newValue.add(column.id);\n\n if (!controlledHiddenColumns) {\n table.update((state) => {\n state.hiddenColumns = newValue;\n });\n }\n\n onHiddenColumnsChange?.(newValue);\n };\n\n return (\n <>\n <IconButton onClick={(e) => setAnchorEl(anchorEl ? null : e.currentTarget)}>\n <Settings />\n </IconButton>\n\n <Popover anchorEl={anchorEl} open={!!anchorEl} onClose={() => setAnchorEl(null)} css={cssVariables}>\n <div css={{ padding: `calc(var(--spacing) * 2)`, display: 'grid' }}>\n <div css={{ marginBottom: 'var(--spacing)' }}>{selectColumns}</div>\n\n {columns.map((column) => (\n <FormControlLabel\n key={column.id}\n control={<Checkbox checked={!hiddenColumns.has(column.id)} onChange={() => toggle(column)} disabled={column.cannotHide} />}\n label={column.header}\n ></FormControlLabel>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","export type CsvExportOptions = { sepPrefix?: boolean; separator?: string; quote?: string; eol?: string };\n\nexport function csvExport(\n data: (string | number)[][],\n { sepPrefix, separator = ',', quote = '\"', eol = '\\n' }: CsvExportOptions = {},\n): string {\n const cells = data.map((line) =>\n line.map((value) => {\n if (typeof value === 'number') return String(value);\n if (![separator, quote, eol].some((c) => value.includes(c))) return value;\n\n const clean = value.replace(new RegExp(quote, 'g'), `${quote}${quote}`);\n return `${quote}${clean}${quote}`;\n }),\n );\n\n return (sepPrefix ? `SEP=${separator}\\n` : '') + cells.map((line) => line.join(separator)).join(eol);\n}\n","import React, { useState } from 'react';\nimport { useTheme } from '..';\nimport { csvExport, CsvExportOptions } from '../misc/csvExport';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useTableContext } from './table';\n\nexport function Export<T>(): JSX.Element {\n const table = useTableContext<T>();\n const Button = useTheme((t) => t.components.Button);\n const IconButton = useTheme((t) => t.components.IconButton);\n const Popover = useTheme((t) => t.components.Popover);\n const Export = useTheme((t) => t.icons.Export);\n const Clipboard = useTheme((t) => t.icons.Clipboard);\n const exportTitle = useTheme((t) => t.text.exportTitle);\n const exportCopy = useTheme((t) => t.text.exportCopy);\n const exportDownload = useTheme((t) => t.text.exportDownload);\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n\n const generate = (options?: CsvExportOptions) => {\n const { activeColumns, activeItems } = table.getState();\n\n const data = [\n activeColumns.map((column) => String(column.id)),\n ...activeItems.map((item) => activeColumns.map((column) => column.exportCell(column.value(item), item))),\n ];\n return csvExport(data, options);\n };\n\n const copy = () => {\n navigator.clipboard.writeText(generate(table.getState().props.enableExport.copy));\n };\n\n const download = () => {\n const a = document.createElement('a');\n a.href = 'data:text/csv;charset=utf-8,' + encodeURIComponent(generate(table.getState().props.enableExport.download));\n a.download = 'export.csv';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n\n return (\n <>\n <IconButton onClick={(e) => setAnchor(anchor ? null : e.currentTarget)}>\n <Export css={!!anchor && { color: 'var(--primaryMain)' }} />\n </IconButton>\n\n <Popover open={!!anchor} onClose={() => setAnchor(null)} anchorEl={anchor} css={cssVariables}>\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n justifyItems: 'stretch',\n gap: 'var(--spacing)',\n\n '& > *': {\n justifyContent: 'start',\n },\n }}\n >\n <div css={{ marginBottom: 'var(--spacing)' }}>{exportTitle}</div>\n <Button startIcon={<Clipboard />} onClick={copy}>\n {exportCopy}\n </Button>\n <Button startIcon={<Export />} onClick={download}>\n {exportDownload}\n </Button>\n </div>\n </Popover>\n </>\n );\n}\n","import React, { createContext, useCallback, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useColumnContext, useTableContext } from './table';\n\nexport const FilterControlContext = createContext((): void => void 0);\n\nexport function FilterControl<T>(): JSX.Element | null {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const IconButton = useTheme((t) => t.components.IconButton);\n const Popover = useTheme((t) => t.components.Popover);\n const FilterList = useTheme((t) => t.icons.FilterList);\n const ArrowDropDown = useTheme((t) => t.icons.ArrowDropDown);\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n const isActive = table.useState((state) => {\n const filter = state.filters.get(columnId);\n const filterValue = state.filterValues.get(columnId);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n const filter = table.useState((state) => state.activeColumns.find((column) => column.id === columnId)?.filter);\n\n function reset() {\n table.update((state) => {\n state.filterValues.delete(columnId);\n });\n }\n\n const close = useCallback(function () {\n setAnchor(null);\n }, []);\n\n if (!filter) return null;\n\n return (\n <FilterControlContext.Provider value={close}>\n <div\n onClick={(e) => setAnchor(e.currentTarget)}\n onContextMenu={(e) => {\n reset();\n e.preventDefault();\n return false;\n }}\n >\n <IconButton\n css={[\n { color: '#b0bac9' },\n isActive && {\n color: 'var(--primaryMain) !important',\n },\n ]}\n >\n {isActive ? <FilterList /> : <ArrowDropDown />}\n </IconButton>\n </div>\n\n <div\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onPointerMove={(e) => {\n e.stopPropagation();\n }}\n >\n <Popover open hidden={!anchor} onClose={() => setAnchor(null)} anchorEl={anchor ?? document.body} css={cssVariables}>\n {filter}\n </Popover>\n </div>\n </FilterControlContext.Provider>\n );\n}\n","import React, { HTMLProps } from 'react';\nimport { useColumnContext, useTableContext } from '..';\n\nexport function ResizeHandle() {\n const table = useTableContext();\n const columnId = useColumnContext();\n const enabled = table.useState('props.enableColumnResize');\n\n function onPointerDown(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n div.setPointerCapture(e.pointerId);\n }\n\n function onPointerMove(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n if (!div.hasPointerCapture(e.pointerId)) return;\n\n const parent = div.parentElement as HTMLDivElement;\n const width = Math.max(e.clientX - parent.getBoundingClientRect().left + 5, 50);\n\n table.update((state) => {\n state.columnWidths.set(columnId, `${width}px`);\n });\n }\n\n function onPointerUp(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n div.releasePointerCapture(e.pointerId);\n }\n\n function onDoubleClick(e: React.MouseEvent) {\n table.update((state) => {\n if (e.getModifierState('Control')) {\n state.columnWidths.delete(columnId);\n } else {\n state.columnWidths.set(columnId, 'max-content');\n }\n });\n }\n\n return (\n <ResizeHandleView\n enabled={enabled}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n onDoubleClick={enabled ? onDoubleClick : undefined}\n />\n );\n}\n\nexport function ResizeHandleView({ enabled, ...props }: HTMLProps<HTMLDivElement> & { enabled?: boolean }) {\n return (\n <div\n css={{\n alignSelf: 'stretch',\n padding: '0 5px',\n cursor: enabled ? 'col-resize' : 'initial',\n display: 'flex',\n alignItems: 'center',\n\n '&:after': {\n content: '\"\"',\n width: 1,\n height: '1.5em',\n background: '#c9cfda',\n transition: 'transform 300ms',\n },\n }}\n {...props}\n />\n );\n}\n","import React, { memo, ReactNode, useLayoutEffect } from 'react';\nimport { Id, useColumnContext, useTableContext, useTheme } from '..';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { calcClassNames } from './row';\n\nconst defaultWrapCell = (content: ReactNode) => {\n if (typeof content === 'string') {\n return (\n <span css={defaultClasses.text} title={content}>\n {content}\n </span>\n );\n }\n return content;\n};\n\nexport const Cell = memo(function Cell<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }) {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n\n const column = table.useState((state) => {\n const col = state.activeColumns.find((column) => column.id === columnId);\n return (\n col && {\n value: col.value,\n renderCell: col.renderCell,\n }\n );\n });\n const wrapCell = table.useState((state) => state.props.wrapCell) ?? defaultWrapCell;\n const item = table.useState((state) => state.activeItemsById.get(itemId));\n const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), { throttle: 16 });\n\n useLayoutEffect(() => table.getState().props.debugRender?.('render cell', itemId, columnId));\n const className = useTheme((t) => cx(...calcClassNames(t.classes, item, rowIndex)));\n\n if (!column || !item) return null;\n\n const content = column.renderCell(column.value(item), item);\n\n return (\n <div className={className} css={[defaultClasses.cell, columnStyleOverride]}>\n {wrapCell(content, column.value(item), item, rowIndex)}\n </div>\n );\n});\n","import React from 'react';\nimport { useTheme } from '..';\nimport { getAncestors } from '../misc/helpers';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\n\nexport function ExpandControl<T>({ itemId, hasDeferredChildren }: { itemId: Id; hasDeferredChildren?: boolean }): JSX.Element {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Spinner = useTheme((t) => t.components.Spinner);\n const ChevronRight = useTheme((t) => t.icons.ChevronRight);\n\n const table = useTableContext<T>();\n const isExpanded = table.useState((state) => state.expanded.has(itemId));\n const hasChildren = table.useState((state) => !!state.activeItemsById.get(itemId)?.children.length);\n\n function toggle() {\n const {\n props: { expanded: controlledExpanded, expandOnlyOne, onExpandedChange },\n expanded,\n activeItemsById,\n } = table.getState();\n\n const newExpanded = new Set(expanded);\n if (expandOnlyOne) newExpanded.clear();\n if (isExpanded) newExpanded.delete(itemId);\n else {\n newExpanded.add(itemId);\n\n const item = activeItemsById.get(itemId);\n for (const ancestor of item ? getAncestors(activeItemsById, item) : []) {\n newExpanded.add(ancestor);\n }\n }\n\n onExpandedChange?.(newExpanded);\n\n if (!controlledExpanded) {\n table.update((state) => {\n state.expanded = newExpanded;\n });\n }\n }\n\n if (isExpanded && hasDeferredChildren && !hasChildren) {\n return <Spinner css={{ margin: '0 var(--spacing)' }} />;\n }\n\n return (\n <IconButton onClick={toggle}>\n <span\n css={{\n display: 'inline-flex',\n transition: 'all 300ms',\n transform: isExpanded ? 'rotate3d(0, 0, 1, 90deg)' : 'rotate3d(0, 0, 1, 0deg)',\n }}\n >\n <ChevronRight />\n </span>\n </IconButton>\n );\n}\n","import React from 'react';\nimport { useTheme } from '..';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\n\nexport function SelectComponent<T>({ itemId }: { itemId?: Id }): JSX.Element {\n const table = useTableContext<T>();\n const Checkbox = useTheme((t) => t.components.Checkbox);\n\n const isSelected = table.useState((state) => {\n const itemIds = itemId ? [itemId] : Array.from(state.activeItemsById.keys());\n return state.activeItemsById.size > 0 && itemIds.every((itemId) => state.selection.has(itemId));\n });\n\n function toggle(e: React.ChangeEvent) {\n const mouseEvent = e.nativeEvent as MouseEvent;\n\n const {\n activeItems,\n activeItemsById,\n lastSelectedId,\n selection,\n props: { selectSyncChildren, selection: controlledSelection, onSelectionChange },\n } = table.getState();\n\n let range;\n if (mouseEvent.shiftKey && itemId) {\n const a = lastSelectedId ? activeItems.findIndex((i) => lastSelectedId === i.id) : 0;\n const b = activeItems.findIndex((item) => item.id === itemId);\n range = activeItems.slice(Math.min(a, b), Math.max(a, b) + 1);\n } else {\n const item = itemId ? activeItemsById.get(itemId) : undefined;\n range = item ? [item] : activeItems;\n }\n\n const newSelection = new Set(selection);\n for (const item of range) {\n if (isSelected) newSelection.delete(item.id);\n else newSelection.add(item.id);\n }\n\n if (selectSyncChildren && isSelected) {\n for (const ancestor of getAncestors(activeItemsById, ...range)) {\n newSelection.delete(ancestor);\n }\n for (const descendant of getDescendants(...range)) {\n newSelection.delete(descendant);\n }\n }\n\n onSelectionChange?.(newSelection);\n\n if (!controlledSelection) {\n table.update((state) => {\n state.selection = newSelection;\n });\n }\n\n table.update((state) => {\n state.lastSelectedId = itemId;\n });\n }\n\n return (\n <Checkbox\n css={{\n justifySelf: 'start',\n color: '#c9cfda',\n }}\n checked={isSelected}\n onChange={toggle}\n />\n );\n}\n","import React, { memo, useEffect, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { cx, getAncestors } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { Id, MemoizedTableTheme } from '../types';\nimport { Cell } from './cell';\nimport { ExpandControl } from './expandControl';\nimport { SelectComponent } from './selectComponent';\nimport { ColumnContext, useTableContext } from './table';\n\nexport function calcClassNames<T>(classes: MemoizedTableTheme<any>['classes'] | undefined, item: T, index: number) {\n return [\n classes?.cell instanceof Function ? classes.cell(item, index) : classes?.cell,\n index % 2 === 0 && classes?.evenCell,\n index % 2 === 1 && classes?.oddCell,\n ];\n}\n\nexport const Row = memo(function Row<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }): JSX.Element | null {\n const table = useTableContext<T>();\n const divRef = useRef<HTMLDivElement>(null);\n\n const classes = useTheme((t) => t.classes);\n\n const { className, indent, hasChildren, hasDeferredChildren, columnIds, enableSelection, rowAction } = table.useState((state) => {\n const item = state.activeItemsById.get(itemId);\n\n return {\n className: cx(...calcClassNames(classes, item, rowIndex)),\n indent: item ? getAncestors(state.activeItemsById, item).size : 0,\n hasChildren: !!item?.children.length,\n hasDeferredChildren: item && state.props.hasDeferredChildren?.(item),\n columnIds: state.activeColumns.map((column) => column.id),\n enableSelection: state.props.enableSelection,\n rowAction: state.props.rowAction instanceof Function ? (item ? state.props.rowAction(item, rowIndex) : null) : state.props.rowAction,\n };\n });\n\n useEffect(() => {\n const div = divRef.current;\n if (!div) return;\n\n const o = new ResizeObserver(() => {\n if (!document.contains(div)) return;\n table.update((state) => {\n state.rowHeights.set(itemId, div.offsetHeight);\n });\n });\n o.observe(div);\n\n return () => o.disconnect();\n }, [divRef.current]);\n\n useLayoutEffect(() => table.getState().props.debugRender?.('render row', itemId));\n\n return (\n <>\n <div className={className} css={[defaultClasses.cellFill]} ref={divRef} />\n\n <div className={className} css={[defaultClasses.cell, defaultClasses.firstCell]}>\n <div css={{ width: indent * 20 }} />\n\n {enableSelection && <SelectComponent itemId={itemId} />}\n\n {(hasChildren || hasDeferredChildren) && <ExpandControl itemId={itemId} hasDeferredChildren={hasDeferredChildren} />}\n\n {rowAction}\n </div>\n\n {columnIds.map((columnId) => (\n <ColumnContext.Provider key={columnId} value={columnId}>\n <Cell itemId={itemId} rowIndex={rowIndex} />\n </ColumnContext.Provider>\n ))}\n\n <div className={className} css={[defaultClasses.cellFill]} />\n </>\n );\n});\n","import React, { ReactNode } from 'react';\nimport { useTheme } from '..';\nimport { useColumnContext, useTableContext } from './table';\n\nexport function SortComponent<T>({ children }: { children: ReactNode }): JSX.Element {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const Badge = useTheme((t) => t.components.Badge);\n const ArrowUpward = useTheme((t) => t.icons.ArrowUpward);\n\n const { direction, index } = table.useState((state) => {\n const index = state.sort.findIndex((s) => s.columnId === columnId) ?? -1;\n return {\n direction: state.sort[index]?.direction,\n index: index >= 0 && state.sort.length > 1 ? index + 1 : undefined,\n };\n });\n\n function toggle(e: React.MouseEvent, off?: boolean) {\n const {\n props: { sort: controlledSort, onSortChange },\n } = table.getState();\n\n const newDirection = direction === 'asc' ? 'desc' : 'asc';\n const newSort = e.getModifierState('Control') || off ? table.getState().sort.filter((s) => s.columnId !== columnId) : [];\n if (!off) {\n newSort.push({\n columnId,\n direction: newDirection,\n });\n }\n\n onSortChange?.(newSort);\n\n if (!controlledSort) {\n table.update((state) => {\n state.sort = newSort;\n });\n }\n\n e.preventDefault();\n return false;\n }\n\n return (\n <div\n css={{\n userSelect: 'none',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) max-content',\n alignItems: 'center',\n cursor: 'pointer',\n\n '& > div': {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n }}\n onClick={(e) => toggle(e)}\n onContextMenu={(e) => toggle(e, true)}\n >\n <div>{children}</div>\n\n <Badge badgeContent={index}>\n <span\n css={[\n { transition: 'all 300ms', fontSize: '0.8em' },\n !direction && { opacity: 0 },\n direction === 'desc' && { transform: 'rotate3d(0, 0, 1, 180deg)' },\n ]}\n >\n <ArrowUpward />\n </span>\n </Badge>\n </div>\n );\n}\n","export function throttle<Args extends any[]>(\n fn: (...args: Args) => void,\n ms: number,\n): { (...args: Args): void; flush(): void; cancel(): void } {\n let last = 0;\n let lastArgs: Args | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n function run() {\n const args = lastArgs;\n\n last = Date.now();\n lastArgs = undefined;\n timeout = undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n fn(...args!);\n }\n\n return Object.assign(\n function (...args: Args) {\n const now = Date.now();\n lastArgs = args;\n\n if (timeout) {\n // do nothing\n } else if (now < last + ms) {\n timeout = setTimeout(run, last + ms - now);\n } else {\n run();\n }\n },\n {\n flush() {\n if (lastArgs) {\n run();\n }\n },\n\n cancel() {\n if (timeout) {\n clearTimeout(timeout);\n }\n },\n },\n );\n}\n","import React, { HTMLProps, ReactNode, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { throttle } from '../misc/throttle';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\n\nconst findScrollRoot = (x: HTMLElement): HTMLElement => {\n const parent = x.parentElement;\n if (!parent) return document.documentElement;\n if (parent.scrollHeight > parent.clientHeight && getComputedStyle(parent).overflowY !== 'visible') return parent;\n return findScrollRoot(parent);\n};\n\nconst relativeOffset = (x: HTMLElement, y: HTMLElement): number => {\n if (x.offsetParent === y.offsetParent || !x.offsetParent) return x.offsetTop - y.offsetTop;\n if (x.offsetParent instanceof HTMLElement) return relativeOffset(x.offsetParent, y) + x.offsetTop;\n return 0;\n};\n\nexport function Virtualized<T>({\n header,\n children,\n ...props\n}: { header: ReactNode; children: (itemIds: Id[], startIndex: number) => ReactNode } & HTMLProps<HTMLDivElement>): JSX.Element {\n const table = useTableContext<T>();\n const virtual = table.useState('props.virtual');\n const probeRef = useRef<HTMLDivElement>(null);\n const [, setCounter] = useState(0);\n\n const {\n itemIds = [],\n from = 0,\n to,\n before = 0,\n after = 0,\n } = table.useState(\n (state) => {\n const itemIds = state.activeItems.map((item) => item.id);\n const root = probeRef.current && findScrollRoot(probeRef.current);\n if (!state.props.virtual) return { itemIds };\n if (!probeRef.current || !root || !document.contains(root)) return {};\n\n const {\n rowHeight,\n initalRowHeight,\n overscan = 100,\n overscanTop,\n overscanBottom,\n } = (state.props.virtual instanceof Object ? state.props.virtual : undefined) ?? {};\n\n let totalHeight = 0;\n const rowHeights = itemIds.map((itemId, index) => {\n const h = rowHeight ?? state.rowHeights.get(itemId) ?? initalRowHeight ?? (index === 0 ? 100 : totalHeight / index);\n totalHeight += h;\n return h;\n });\n\n const probeOffset = relativeOffset(probeRef.current, root);\n const headerHeight = probeRef.current.offsetTop;\n const topOfTable = root.scrollTop - probeOffset + headerHeight;\n const bottomOfTable = topOfTable + root.clientHeight - headerHeight;\n\n let from = 0,\n to = itemIds.length,\n before = 0,\n after = 0;\n for (const h of rowHeights) {\n if (before + h > topOfTable - (overscanTop ?? overscan)) break;\n from++;\n before += h;\n }\n\n for (const h of rowHeights.reverse()) {\n if (after + h > totalHeight - bottomOfTable - (overscanBottom ?? overscan)) break;\n to--;\n after += h;\n }\n\n return { itemIds: itemIds.slice(from, to), from, to, before, after };\n },\n { throttle: 16 },\n );\n\n const throttleScroll = (typeof virtual === 'boolean' ? undefined : virtual)?.throttleScroll ?? 16;\n const incCounter = useMemo(() => throttle(() => setCounter((c) => c + 1), throttleScroll), [throttleScroll]);\n\n useEffect(() => {\n if (!virtual || !probeRef.current) return;\n\n window.addEventListener('scroll', incCounter, true);\n window.addEventListener('resize', incCounter, true);\n return () => {\n window.removeEventListener('scroll', incCounter, true);\n window.removeEventListener('resize', incCounter, true);\n };\n }, [probeRef.current, incCounter]);\n\n useEffect(() => incCounter.cancel, [incCounter]);\n\n useLayoutEffect(() => table.getState().props.debugRender?.(`Virtualalized render ${from} to ${to}`));\n\n return (\n <div {...props}>\n {header}\n\n {virtual && <div style={{ gridColumn: '1 / -1', height: before }} ref={probeRef} />}\n\n {children(itemIds, from)}\n\n {virtual && <div style={{ gridColumn: '1 / -1', height: after }} />}\n </div>\n );\n}\n","import React, { createContext, memo, useContext, useEffect, useLayoutEffect, useState } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { useTheme } from '..';\nimport { TableMemoContextProvider } from '../hooks/useTableMemo';\nimport { useTableStateStorage } from '../internalState/tableStateStorage';\nimport { useTableState } from '../internalState/useTableState';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { Id, InternalTableState, TableProps } from '../types';\nimport { ColumnHeader, ColumnHeaderContext } from './columnHeader';\nimport { ColumnSelection } from './columnSelection';\nimport { Export } from './export';\nimport { FilterControl } from './filterControl';\nimport { ResizeHandle, ResizeHandleView } from './resizeHandle';\nimport { Row } from './row';\nimport { SelectComponent } from './selectComponent';\nimport { SortComponent } from './sortComponent';\nimport { Virtualized } from './virtualized';\n\nexport const TableContext = createContext<Store<InternalTableState<any>> | null>(null);\nexport const ColumnContext = createContext<Id | null>(null);\nexport function useTableContext<T>(): Store<InternalTableState<T>> {\n const value = useContext(TableContext);\n if (!value) throw Error('No table context available');\n return value as Store<InternalTableState<T>>;\n}\nexport function useColumnContext(): Id {\n const value = useContext(ColumnContext);\n if (value === null) throw Error('No column context available');\n return value;\n}\n\nexport function Table<T>(props: TableProps<T>): JSX.Element {\n const table = useTableState(props);\n\n useLayoutEffect(() => table.getState().props.debugRender?.('render table'));\n\n return (\n <TableContext.Provider value={table}>\n <TableMemoContextProvider>\n <TableLoadingState />\n </TableMemoContextProvider>\n </TableContext.Provider>\n );\n}\n\nfunction TableLoadingState() {\n const loadingText = useTheme((t) => t.text.loading);\n const isHydrated = useTableStateStorage();\n const [showLoading, setShowLoading] = useState(false);\n\n useEffect(() => {\n const handle = setTimeout(() => setShowLoading(true), 500);\n return () => clearTimeout(handle);\n });\n\n return (\n <>\n {!isHydrated && showLoading && <div>{loadingText}</div>}\n <TableInner hidden={!isHydrated} />\n </>\n );\n}\n\nconst TableInner = memo(function TableInner<T>({ hidden }: { hidden: boolean }) {\n const table = useTableContext<T>();\n const fullWidth = table.useState('props.fullWidth');\n const activeColumns = table.useState((state) =>\n state.activeColumns.map((column) => ({\n id: column.id,\n width: column.width,\n classes: column.classes,\n header: column.header,\n })),\n );\n const columnWidths = table.useState('columnWidths', { throttle: 16 });\n const columnStyleOverride = table.useState('columnStyleOverride', { throttle: 16 });\n\n const classes = table.useState('props.classes');\n const stickyHeader = table.useState('props.stickyHeader');\n const enableSelection = table.useState('props.enableSelection');\n const enableColumnSelection = table.useState('props.enableColumnSelection');\n const enableExport = table.useState((state) => !!state.props.enableExport.copy || !!state.props.enableExport.download);\n const cssVariables = useCssVariables();\n\n useLayoutEffect(() => table.getState().props.debugRender?.('render table inner'));\n\n return (\n <Virtualized\n className={classes?.table}\n css={[\n cssVariables,\n defaultClasses.table,\n {\n gridTemplateColumns: [\n //\n fullWidth === 'right' || fullWidth === true ? 'auto' : '0',\n 'max-content',\n ...activeColumns.map((column) => columnWidths.get(column.id) ?? column.width ?? 'max-content'),\n fullWidth === 'left' || fullWidth === true ? 'auto' : '0',\n ].join(' '),\n },\n hidden && { visibility: 'hidden' },\n ]}\n header={\n <>\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerFill, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n />\n\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerCell, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n >\n {enableSelection && <SelectComponent />}\n\n {enableColumnSelection && <ColumnSelection />}\n\n {enableExport && <Export />}\n <ResizeHandleView />\n </div>\n\n <ColumnHeaderContext.Provider>\n {activeColumns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnHeader\n className={cx(classes?.headerCell, column.classes?.headerCell)}\n css={[\n defaultClasses.headerCell,\n columnStyleOverride.get(column.id),\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n ]}\n key={column.id}\n >\n <SortComponent>{column.header}</SortComponent>\n <div css={{ flex: 1 }} />\n <FilterControl />\n <ResizeHandle />\n </ColumnHeader>\n </ColumnContext.Provider>\n ))}\n </ColumnHeaderContext.Provider>\n\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerFill, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n />\n </>\n }\n >\n {(itemIds, startIndex) => itemIds.map((itemId, index) => <Row key={itemId} itemId={itemId} rowIndex={startIndex + index} />)}\n </Virtualized>\n );\n});\n","import { TableTheme } from '../../types';\n\nexport const defaultColors: TableTheme['colors'] = {\n primary: { main: '#1976d2', light: '#42a5f5', contrastText: '#fff' },\n secondary: { main: '#9c27b0', light: '#ba68c8', contrastText: '#fff' },\n};\n","import { css } from '@emotion/react';\n\nexport function Spinner({ className }: { className?: string }) {\n return (\n <div\n className={className}\n css={css`\n display: inline-block;\n position: relative;\n width: 1em;\n height: 1em;\n\n div {\n box-sizing: border-box;\n display: block;\n position: absolute;\n width: 0.8em;\n height: 0.8em;\n margin: 0.1em;\n border: 0.1em solid #fff;\n border-radius: 50%;\n animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n border-color: currentColor transparent transparent transparent;\n }\n div:nth-of-type(1) {\n animation-delay: -0.45s;\n }\n div:nth-of-type(2) {\n animation-delay: -0.3s;\n }\n div:nth-of-type(3) {\n animation-delay: -0.15s;\n }\n @keyframes lds-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n `}\n >\n <div />\n <div />\n <div />\n </div>\n );\n}\n","import { TableTheme } from '../../types';\n\nexport const Badge: TableTheme['components']['Badge'] = ({ badgeContent, children }) => {\n if (!open) return null;\n\n return (\n <span\n css={{\n display: 'inline-flex',\n position: 'relative',\n flexShrink: 0,\n verticalAlign: 'middle',\n }}\n >\n {children}\n\n <span\n css={[\n {\n top: 0,\n right: 0,\n transform: 'scale(1) translate(50%, -50%)',\n transformOrigin: '100% 0%',\n height: 20,\n display: 'flex',\n padding: '0 6px',\n zIndex: 1,\n position: 'absolute',\n flexWrap: 'wrap',\n minWidth: 20,\n transition: 'transform 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',\n alignItems: 'center',\n lineHeight: 1,\n alignContent: 'center',\n borderRadius: 10,\n justifyContent: 'center',\n fontSize: '0.8em',\n },\n !badgeContent && {\n transform: 'scale(0) translate(50%, -50%)',\n transition: 'transform 195ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',\n },\n ]}\n >\n {badgeContent}\n </span>\n </span>\n );\n};\n","import { TableTheme } from '../../types';\nimport { darkGray, lightGray } from './defaultClasses';\n\nexport const Button: TableTheme['components']['Button'] = ({ startIcon, children, variant = 'text', ...props }) => {\n return (\n <button\n css={[\n {\n padding: `var(--spacing) calc(var(--spacing) * 2)`,\n display: 'inline-flex',\n alignItems: 'center',\n transition: 'background-color 150ms',\n border: 'none',\n cursor: 'pointer',\n background: 'transparent',\n borderRadius: 4,\n\n '&:active:not(:disabled)': {\n transform: 'scale3d(0.95, 0.95, 1)',\n },\n },\n variant === 'text' && {\n '&:hover': {\n background: 'rgba(0, 0, 0, 0.1)',\n },\n },\n variant === 'outlined' && {\n border: `1px solid ${darkGray}`,\n\n '&:disabled': {\n borderColor: lightGray,\n },\n },\n variant === 'contained' && {\n color: 'var(--primaryContrastText)',\n backgroundColor: 'var(--primaryMain)',\n boxShadow: '0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%)',\n\n '&:hover': {\n filter: 'brightness(0.9)',\n },\n\n '&:disabled': {\n filter: 'grayscale()',\n opacity: 0.5,\n },\n },\n ]}\n {...props}\n >\n {startIcon && <span css={{ marginRight: `calc(var(--spacing) * 2)` }}>{startIcon}</span>}\n <span>{children}</span>\n </button>\n );\n};\n","import { TableTheme } from '../../types';\n\nexport const Checkbox: TableTheme['components']['Checkbox'] = ({ className, ...props }) => {\n return (\n <label\n css={[\n {\n padding: 'calc(var(--spacing) * 1.8)',\n display: 'flex',\n color: 'currentcolor',\n userSelect: 'none',\n\n '& input': {\n appearance: 'none',\n margin: 0,\n },\n },\n props.disabled && { color: 'rgba(0, 0, 0, 0.26)' },\n ]}\n className={className}\n >\n <input type=\"checkbox\" {...props} />\n\n {props.checked ? (\n <svg\n css={{ fontSize: '1.25rem', width: '1em', height: '1em', fill: 'var(--primaryMain)' }}\n focusable=\"false\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"></path>\n </svg>\n ) : (\n <svg\n css={{ fontSize: '1.25rem', width: '1em', height: '1em', fill: 'currentColor' }}\n focusable=\"false\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"></path>\n </svg>\n )}\n </label>\n );\n};\n","import { TableTheme } from '../../types';\n\nexport const IconButton: TableTheme['components']['IconButton'] = (props) => {\n return (\n <button\n css={{\n padding: 'var(--spacing)',\n borderRadius: '50%',\n display: 'inline-flex',\n justifyContent: 'center',\n alignItems: 'center',\n transition: 'background-color 150ms',\n border: 'none',\n cursor: 'pointer',\n color: 'inherit',\n background: 'transparent',\n\n '&:hover': {\n backgroundColor: 'rgba(0, 0, 0, 0.04)',\n },\n\n '&:active': {\n transformColor: 'scale3d(0.95, 0.95, 1)',\n },\n }}\n {...props}\n />\n );\n};\n","import { useState } from 'react';\nimport { TableTheme } from '../../types';\nimport { darkGray } from './defaultClasses';\n\nexport const TextField: TableTheme['components']['TextField'] = ({ endIcon, className, inputRef, ...props }) => {\n const [focus, setFocus] = useState(false);\n\n return (\n <div className={className} css={{ display: 'flex' }}>\n <span\n css={[\n {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n border: `1px solid ${darkGray}`,\n borderRadius: 4,\n },\n focus && { border: '2px solid var(--primaryMain)', margin: -1 },\n ]}\n >\n <input\n ref={inputRef}\n {...props}\n value={props.value ?? ''}\n onFocus={() => setFocus(true)}\n onBlur={() => setFocus(false)}\n css={{\n flex: 1,\n border: 'none',\n outline: 'none',\n borderRadius: 4,\n padding: 'calc(var(--spacing) * 2)',\n paddingRight: 0,\n transition: 'outline 500ms',\n }}\n />\n\n {endIcon}\n </span>\n </div>\n );\n};\n","import { Spinner } from '../../components/spinnner';\nimport { TableTheme } from '../../types';\nimport { Badge } from './badge';\nimport { Button } from './button';\nimport { Checkbox } from './checkbox';\nimport { IconButton } from './iconButton';\nimport { Popover } from './popover';\nimport { TextField } from './textField';\n\nexport const defaultComponents: TableTheme['components'] = {\n IconButton,\n Checkbox,\n Popover,\n Button,\n Badge,\n TextField,\n Spinner,\n};\n","import { ClassNames, css } from '@emotion/react';\nimport { cloneElement, HTMLProps } from 'react';\nimport { TableTheme } from '../../types';\n\nconst IconDefaultStyle = css({\n width: '1.5em',\n height: '1.5em',\n color: 'inherit',\n});\n\nfunction Icon(svg: JSX.Element) {\n return (props: HTMLProps<Element>) => (\n <ClassNames>\n {({ css }) =>\n cloneElement(svg, {\n ...props,\n className: css(IconDefaultStyle, props.className),\n })\n }\n </ClassNames>\n );\n}\n\nconst Settings = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z\" />\n </svg>,\n);\n\nconst Export = Icon(\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n enableBackground=\"new 0 0 24 24\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"currentColor\"\n >\n <g>\n <rect fill=\"none\" height=\"24\" width=\"24\" />\n </g>\n <g>\n <path d=\"M18,15v3H6v-3H4v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3H18z M17,11l-1.41-1.41L13,12.17V4h-2v8.17L8.41,9.59L7,11l5,5 L17,11z\" />\n </g>\n </svg>,\n);\n\nconst Clipboard = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M19 2h-4.18C14.4.84 13.3 0 12 0S9.6.84 9.18 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z\" />\n </svg>,\n);\n\nconst ChevronRight = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6-6-6z\" />\n </svg>,\n);\n\nconst Search = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n </svg>,\n);\n\nconst Clear = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n </svg>,\n);\n\nconst ArrowDropDown = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M7 10l5 5 5-5H7z\" />\n </svg>,\n);\n\nconst FilterList = Icon(\n <svg viewBox=\"0 0 24 24\">\n <path\n fill=\"currentColor\"\n d=\"M14,12V19.88C14.04,20.18 13.94,20.5 13.71,20.71C13.32,21.1 12.69,21.1 12.3,20.71L10.29,18.7C10.06,18.47 9.96,18.16 10,17.87V12H9.97L4.21,4.62C3.87,4.19 3.95,3.56 4.38,3.22C4.57,3.08 4.78,3 5,3V3H19V3C19.22,3 19.43,3.08 19.62,3.22C20.05,3.56 20.13,4.19 19.79,4.62L14.03,12H14Z\"\n />\n </svg>,\n);\n\nconst ArrowUpward = Icon(\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\" />\n </svg>,\n);\n\nexport const defaultIcons: TableTheme['icons'] = {\n Settings,\n Export,\n Clipboard,\n ChevronRight,\n Search,\n Clear,\n ArrowDropDown,\n FilterList,\n ArrowUpward,\n};\n","import { TableTheme } from '../../types';\n\nexport const defaultTexts: TableTheme['text'] = {\n selectColumns: 'Select visible columns',\n noResults: 'No results',\n exportTitle: 'Export',\n exportCopy: 'To clipboard',\n exportDownload: 'Download',\n today: 'Today',\n thisWeek: 'This week',\n reset: 'Reset',\n loading: 'Loading',\n selected: (count) => `${count} selected`,\n};\n","import { TableTheme } from '../../types';\nimport { defaultColors } from './defaultColors';\nimport { defaultComponents } from './defaultComponents';\nimport { defaultIcons } from './defaultIcons';\nimport { defaultTexts } from './defaultTexts';\n\nexport const defaultTableTheme: TableTheme = {\n text: defaultTexts,\n components: defaultComponents,\n icons: defaultIcons,\n colors: defaultColors,\n spacing: '5px',\n};\n","import { useContext } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { ColumnContext, TableContext } from '../components/table';\nimport { defaultTableTheme } from '../theme/defaultTheme';\nimport { globalTableTheme, mergeThemes, TableThemeContext } from '../theme/tableTheme';\nimport { MemoizedTableTheme, TableTheme } from '../types';\nimport { useTableMemo } from './useTableMemo';\n\nconst emptyStore = new Store(undefined);\n\nexport function useTheme<T, S>(selector: (theme: MemoizedTableTheme<T>) => S): S {\n const contextTableTheme = useContext(TableThemeContext);\n const table = useContext(TableContext);\n const columnId = useContext(ColumnContext);\n const memo = useTableMemo();\n\n const process = (t: TableTheme<T>): MemoizedTableTheme<T> => {\n const cell = t.classes?.cell;\n const selected = t.text.selected;\n\n return {\n ...t,\n classes: {\n ...t.classes,\n cell: cell instanceof Function || Array.isArray(cell) ? memo('theme.classes.cell', cell) : cell,\n },\n text: {\n ...t.text,\n selected: selected instanceof Function || Array.isArray(selected) ? memo('theme.text.selected', selected) : selected,\n },\n };\n };\n\n const theme =\n table?.useState((state) => {\n const localTheme = {\n text: state.props.text,\n classes: state.props.classes,\n components: state.props.components,\n icons: state.props.icons,\n colors: state.props.colors,\n spacing: state.props.spacing,\n };\n\n const column = state.activeColumns.find((column) => column.id === columnId);\n const columnsTheme = {\n classes: column?.classes,\n };\n\n const theme = mergeThemes(defaultTableTheme, globalTableTheme, contextTableTheme, localTheme, columnsTheme) as TableTheme<T>;\n\n return selector(process(theme));\n }) ??\n emptyStore.useState() ??\n selector(process(mergeThemes(defaultTableTheme, globalTableTheme, contextTableTheme) as TableTheme<T>));\n\n return theme;\n}\n","import { ComponentType, useContext, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { PopoverContext } from '../theme/defaultTheme/popover';\nimport { TableTheme } from '../types';\n\ntype Props = TableTheme['components']['TextField'] extends ComponentType<infer T> ? T : never;\n\nexport function AutoFocusTextField(props: Omit<Props, 'inputRef'>) {\n const TextField = useTheme((t) => t.components.TextField);\n\n const ref = useRef<HTMLInputElement>(null);\n const { visible } = useContext(PopoverContext);\n\n useLayoutEffect(() => {\n if (visible && ref.current) {\n ref.current.focus();\n }\n }, [visible]);\n\n return <TextField {...props} inputRef={ref} />;\n}\n","import { Fragment, useMemo, useState } from 'react';\n\nconst className = 'schummar-table-date-input';\n\nconst defaultDate = new Date(1970, 0, 1);\n\nconst isIncludedType = (type: Intl.DateTimeFormatPartTypes): type is 'day' | 'month' | 'year' =>\n type === 'day' || type === 'month' || type === 'year';\n\nconst defaultLengths = {\n day: 2,\n month: 2,\n year: 4,\n};\n\nconst maxLengths = {\n day: 2,\n month: 2,\n year: Infinity,\n};\n\nconst length = (type: 'day' | 'month' | 'year', value: string) => Math.max(value.length, defaultLengths[type]);\n\nconst tabNext = (e: Element) => {\n const all = Array.from(document.querySelectorAll(`.${className}`));\n const index = all.indexOf(e);\n const next = all[(index + 1) % all.length];\n\n if (next instanceof HTMLElement) {\n next.focus();\n }\n};\n\nexport function DateInput({ value, onChange, locale }: { value: Date | null; onChange: (date: Date | null) => void; locale?: string }) {\n const [override, setOverride] = useState<{ type: string; value: string }>();\n\n const commit = () => {\n if (!override) {\n return;\n }\n\n setOverride(undefined);\n\n if (!override.value) {\n onChange(null);\n return;\n }\n\n const newValue = value ? new Date(value) : new Date();\n if (override.type === 'day') {\n newValue.setDate(Number(override.value));\n } else if (override.type === 'month') {\n newValue.setMonth(Number(override.value) - 1);\n } else if (override.type === 'year') {\n newValue.setFullYear(Number(override.value));\n }\n\n onChange(newValue);\n };\n\n const format = useMemo(\n () =>\n new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n }),\n [locale],\n );\n const parts = format.formatToParts(value ?? defaultDate);\n const isEmpty = !value;\n\n return (\n <div\n css={{\n display: 'flex',\n alignItems: 'baseline',\n }}\n >\n {parts.map(({ type, value }, index) => (\n <Fragment key={index}>\n {isIncludedType(type) ? (\n <input\n className={className}\n css={{\n width: `${length(type, value)}ch`,\n boxSizing: 'content-box',\n overflow: 'visible',\n border: 'none',\n borderBottom: '2px solid transparent',\n outline: 'none',\n fontSize: 'inherit',\n\n '&:focus': {\n borderBottom: '2px solid var(--primaryMain)',\n },\n }}\n placeholder={''.padEnd(length(type, value), '0')}\n value={override?.type === type ? override.value : !isEmpty ? value : ''}\n onChange={(e) => {\n setOverride({ type, value: e.target.value });\n if (e.target.value.length >= maxLengths[type]) {\n setTimeout(() => tabNext(e.target));\n }\n }}\n onFocus={(e) => e.target.select()}\n onBlur={commit}\n />\n ) : type === 'literal' ? (\n <span>{value}</span>\n ) : null}\n </Fragment>\n ))}\n </div>\n );\n}\n","import { useDayzed } from 'dayzed';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { useTheme } from '..';\nimport { gray } from '../theme/defaultTheme/defaultClasses';\nimport { DateInput } from './dateInput';\n\nexport type DateRange = { min: Date; max: Date };\n\nexport type DatePickerProps = {\n /** Currently selected day or range of days. */\n value: Date | DateRange | null;\n /** Callback for when the day (range) changes. */\n onChange: (value: Date | DateRange | null) => void;\n /** If enabled, ranges can be selected. */\n rangeSelect?: boolean;\n /** Which locale to use to render the calendar. */\n locale?: string;\n /** Which day of the week should be in the first column. */\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n};\n\nconst weekDays = [0, 1, 2, 3, 4, 5, 6] as const;\n\n/** Rounds a date down to the start of the day. */\nexport const startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\n/** Rounds a date up to the end of the day. */\nexport const endOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1, 0, 0, 0, -1);\n\nexport const today = (): DateRange => {\n const today = startOfDay(new Date());\n return { min: today, max: today };\n};\n\nexport const thisWeek = (firstDayOfWeek = 0): DateRange => {\n const now = new Date();\n const min = new Date(now);\n\n let diff = min.getDay() - firstDayOfWeek;\n if (diff < 0) {\n diff += 7;\n }\n min.setDate(min.getDate() - diff);\n\n const max = new Date(min);\n max.setDate(max.getDate() + 6);\n\n return { min: startOfDay(min), max: endOfDay(max) };\n};\n\n/** Returns whether two dates and/or date ranges intersect. Intersection is considered per day. */\nexport function dateIntersect(a: Date | null | DateRange, b: Date | null | DateRange) {\n if (a instanceof Date) {\n a = { min: a, max: a };\n }\n if (b instanceof Date) {\n b = { min: b, max: b };\n }\n\n if (!a?.min || !a.max || !b?.min || !b.max) {\n return false;\n }\n\n return !(endOfDay(a.max) < startOfDay(b.min) || startOfDay(a.min) > endOfDay(b.max));\n}\n\nexport function DatePicker({ value, onChange, rangeSelect, locale, firstDayOfWeek = 0 }: DatePickerProps) {\n const Button = useTheme((t) => t.components.Button);\n const IconButton = useTheme((t) => t.components.IconButton);\n const ChevronRight = useTheme((t) => t.icons.ChevronRight);\n const textToday = useTheme((t) => t.text.today);\n const textThisWeek = useTheme((t) => t.text.thisWeek);\n const textReset = useTheme((t) => t.text.reset);\n\n const [baseDate] = useState(new Date());\n const [dateInView, setDateInView] = useState<Date>(baseDate);\n const [dirty, setDirty] = useState<Partial<DateRange>>();\n const [hovered, setHovered] = useState<Date>();\n\n const min = dirty ? dirty.min : value instanceof Date ? value : value?.min;\n const max = dirty ? dirty.max : value instanceof Date ? value : value?.max;\n\n const { calendars, getBackProps, getForwardProps, getDateProps } = useDayzed({\n onDateSelected: () => undefined,\n firstDayOfWeek,\n showOutsideDays: true,\n date: dateInView,\n onOffsetChanged: (offset) => setDateInView(new Date(dateInView.getFullYear(), dateInView.getMonth() + offset)),\n offset: 0,\n });\n\n const formatWeekday = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n return (weekDay: number) => format(new Date(Date.UTC(2021, 5, weekDay)));\n }, [locale]);\n\n useEffect(() => setDateInView(value === null ? new Date() : value instanceof Date ? value : value.max), [value]);\n\n useEffect(() => {\n if (!rangeSelect) {\n setDirty(undefined);\n }\n }, [rangeSelect]);\n\n function set(min?: Date, max?: Date, edit?: 'min' | 'max') {\n if (!rangeSelect) {\n onChange(min ?? null);\n return;\n }\n\n if (min && max && min > max) {\n if (edit === 'min') {\n max = min;\n } else if (edit === 'max') {\n min = max;\n } else {\n [min, max] = [max, min];\n }\n }\n\n if (!min === !max) {\n setDirty(undefined);\n onChange(min && max ? { min, max } : null);\n } else {\n setDirty({ min, max });\n }\n }\n\n const formatMonth = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { month: 'long' });\n return (month: number) => format(new Date(2021, month));\n }, [locale]);\n\n const formatYear = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { year: 'numeric' });\n return (year: number) => format(new Date(year, 0, 1));\n }, [locale]);\n\n return (\n <div>\n <div css={{ display: 'grid', gridAutoFlow: 'column', justifyContent: 'center', alignItems: 'baseline', gap: 'var(--spacing)' }}>\n <DateInput value={min ?? null} onChange={(date) => set(date ?? undefined, max, 'min')} locale={locale} />\n\n {rangeSelect && (\n <>\n {' - '}\n <DateInput value={max ?? null} onChange={(date) => set(min, date ?? undefined, 'max')} locale={locale} />\n </>\n )}\n </div>\n\n {calendars.map(({ month, year, weeks }) => (\n <div key={`${month}${year}`} css={{ display: 'grid' }}>\n <div\n css={{\n margin: 'calc(var(--spacing) * 4) 0',\n display: 'grid',\n gridAutoFlow: 'column',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <IconButton {...getBackProps({ calendars })}>\n <ChevronRight css={{ transform: 'rotate3d(0, 0, 1, 180deg)' }} />\n </IconButton>\n\n <div css={{ display: 'flex' }}>\n {formatMonth(month)} {formatYear(year)}\n </div>\n\n <IconButton {...getForwardProps({ calendars })}>\n <ChevronRight />\n </IconButton>\n </div>\n\n <div\n css={{\n justifySelf: 'center',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, max-content)',\n fontWeight: 'bold',\n }}\n >\n {weekDays.map((_v, weekDay) => (\n <div key={weekDay} css={{ justifySelf: 'center', marginBottom: 'var(--spacing)' }}>\n {formatWeekday(weekDay)}\n </div>\n ))}\n\n {weeks.map((week, index) =>\n week.map((dateObj, dayIndex) => {\n if (!dateObj) {\n return <div />;\n }\n\n const { prevMonth, nextMonth, date, today } = dateObj;\n\n const selected = date.getTime() === min?.getTime() || (min && max && dateIntersect(date, { min, max }));\n const preSelected =\n !selected &&\n (date.getTime() === hovered?.getTime() ||\n (min && !max && hovered && dateIntersect(date, min <= hovered ? { min, max: hovered } : { min: hovered, max: min })));\n\n return (\n <button\n key={`${index}-${dayIndex}`}\n css={[\n {\n padding: 10,\n border: '1px solid transparent',\n background: 'transparent',\n cursor: 'pointer',\n },\n (prevMonth || nextMonth) && {\n color: gray,\n },\n today && {\n border: '1px solid var(--secondaryMain)',\n },\n selected && {\n background: 'var(--primaryMain)',\n color: 'var(--primaryContrastText)',\n },\n preSelected && {\n background: 'var(--primaryLight)',\n color: 'var(--primaryContrastText)',\n },\n ]}\n {...getDateProps({ dateObj })}\n onClick={() => {\n if (dirty) {\n if (min) set(min, date);\n else set(date, max);\n } else {\n set(date);\n }\n }}\n onPointerOver={() => setHovered(date)}\n onPointerOut={() => setHovered(undefined)}\n >\n {date.getDate()}\n </button>\n );\n }),\n )}\n </div>\n </div>\n ))}\n\n <div css={{ marginTop: 'var(--spacing)', display: 'grid', gridAutoFlow: 'column', justifyContent: 'center' }}>\n <Button\n variant=\"text\"\n onClick={() => {\n setDirty(undefined);\n onChange(today());\n }}\n >\n {textToday}\n </Button>\n\n <Button\n variant=\"text\"\n onClick={() => {\n setDirty(undefined);\n onChange(thisWeek(firstDayOfWeek));\n }}\n >\n {textThisWeek}\n </Button>\n\n <Button\n variant=\"text\"\n onClick={() => {\n setDirty(undefined);\n onChange(null);\n }}\n >\n {textReset}\n </Button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useFilter } from '..';\nimport { CommonFilterProps } from '../types';\nimport { dateIntersect, DatePicker, DatePickerProps, DateRange } from './datePicker';\n\nfunction convertDate(x: unknown): Date | null {\n if (x instanceof Date) return x;\n if (typeof x === 'number' || typeof x === 'string') return new Date(x);\n return null;\n}\n\nfunction convertDateOrRange(x: unknown): Date | DateRange | null {\n if (x instanceof Object && 'min' in x && 'max' in x) {\n const range = {\n min: convertDate((x as any).min),\n max: convertDate((x as any).max),\n };\n return range.min && range.max ? (range as DateRange) : null;\n }\n return convertDate(x);\n}\n\nfunction convertDateOrArray(x: unknown): Date | DateRange | (Date | DateRange)[] | null {\n if (x instanceof Array) return x.map(convertDateOrRange).filter(Boolean) as (Date | DateRange)[];\n return convertDateOrRange(x);\n}\n\nexport function DateFilter<T, V>({\n locale,\n firstDayOfWeek,\n singleSelect,\n filterBy = convertDateOrArray,\n ...props\n}: {\n /** Which locale to use to render the calendar. */\n locale?: string;\n /** Which day of the week should be in the first column. */\n firstDayOfWeek?: DatePickerProps['firstDayOfWeek'];\n /** If enabled, only single days can be selected. Ranges otherwise. */\n singleSelect?: boolean;\n} & CommonFilterProps<T, V, Date | DateRange | null, Date | DateRange | null>): JSX.Element {\n const { value = null, onChange } = useFilter({\n ...props,\n filterBy,\n\n id: 'dateFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n return dateIntersect(filterValue, value);\n },\n });\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n }}\n >\n <DatePicker rangeSelect={!singleSelect} value={value} onChange={onChange} locale={locale} firstDayOfWeek={firstDayOfWeek} />\n </div>\n );\n}\n","import React, { ReactNode, useState } from 'react';\nimport { useColumnContext, useFilter, useTheme } from '..';\nimport { asString, castArray, flatMap, uniq } from '../misc/helpers';\nimport { CommonFilterProps, InternalColumn, SerializableValue } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\nimport { FormControlLabel } from './formControlLabel';\nimport { useTableContext } from './table';\n\nfunction toggle<T>(set: Set<T>, value: T, singleSelect?: boolean) {\n const newSet = new Set(singleSelect ? [] : set);\n if (set.has(value)) {\n newSet.delete(value);\n } else {\n newSet.add(value);\n }\n\n return newSet;\n}\n\nexport function SelectFilter<T, V, F extends SerializableValue>({\n options: providedOptions,\n stringValue = asString,\n render = stringValue,\n singleSelect,\n ...props\n}: {\n /** Which options are provided to select. By default all unique item values are used. */\n options?: F[];\n /** String representation of a value. Used to filter options via the text field. */\n stringValue?: (value: F) => string;\n /** Render values. By default a string representation of the value is used. */\n render?: (value: F) => ReactNode;\n /** If enabled, only one option can be selected at a time. */\n singleSelect?: boolean;\n} & CommonFilterProps<T, V, F, Set<F>>): JSX.Element {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const Search = useTheme((t) => t.icons.Search);\n const Clear = useTheme((t) => t.icons.Clear);\n const selected = useTheme((t) => t.text.selected);\n const noResults = useTheme((t) => t.text.noResults);\n\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n\n const {\n value = new Set<F>(),\n onChange,\n filterBy,\n } = useFilter({\n ...props,\n\n id: 'selectFilter',\n\n isActive(filterValue) {\n return filterValue.size > 0;\n },\n\n test(filterValue, value) {\n return filterValue.has(value);\n },\n });\n\n const options = table.useState((state) => {\n if (providedOptions) return uniq(providedOptions);\n\n const column = state.activeColumns.find((column) => column.id === columnId) as InternalColumn<T, V> | undefined;\n if (!column) return [];\n\n return uniq(flatMap(state.items, (item) => castArray(filterBy(column.value(item), item))));\n });\n\n const [query, setQuery] = useState('');\n const filtered = options.filter((option) => !query || stringValue(option).toLowerCase().includes(query.toLowerCase()));\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n gap: 'var(--spacing)',\n }}\n >\n <AutoFocusTextField\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n endIcon={<IconButton onClick={() => setQuery('')}>{!query ? <Search /> : <Clear />}</IconButton>}\n css={{ marginBottom: 'var(--spacing)' }}\n />\n\n <div css={{ maxHeight: '20em', overflowY: 'auto' }}>\n <FormControlLabel\n disabled={value.size === 0}\n control={<Checkbox disabled={value.size === 0} checked={value.size > 0} onChange={() => onChange(new Set())} />}\n label={<><{selected(value.size)}></>}\n ></FormControlLabel>\n\n {filtered.map((option, index) => (\n <FormControlLabel\n key={index}\n control={<Checkbox checked={value.has(option)} onChange={() => onChange(toggle(value, option, singleSelect))} />}\n label={render(option)}\n ></FormControlLabel>\n ))}\n </div>\n\n {filtered.length === 0 && <span css={{ textAlign: 'center' }}>{noResults}</span>}\n </div>\n );\n}\n","export function debounce<Args extends any[]>(fn: (...args: Args) => void, ms: number): { (...args: Args): void; flush(): void } {\n let lastArgs: Args | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n function run() {\n const args = lastArgs;\n\n lastArgs = undefined;\n timeout = undefined;\n\n fn(...(args as Args));\n }\n\n return Object.assign(\n function (...args: Args) {\n lastArgs = args;\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(run, ms);\n },\n {\n flush() {\n if (timeout) {\n clearTimeout(timeout);\n run();\n }\n },\n },\n );\n}\n","import { castDraft } from 'immer';\nimport { useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useColumnContext, useTableContext } from '..';\nimport { FilterControlContext } from '../components/filterControl';\nimport { debounce } from '../misc/debounce';\nimport { FilterImplementation, SerializableValue } from '../types';\nimport { useTableMemo } from './useTableMemo';\n\nexport function useFilter<T, V, F, S extends SerializableValue>(impl: FilterImplementation<T, V, F, S>) {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const cache = useTableMemo();\n const filterBy = impl.filterBy && cache('', impl.filterBy);\n\n // Update implementation\n useEffect(() => {\n table.update((state) => {\n if (impl.defaultValue !== undefined) {\n state.filterValues.set(columnId, impl.defaultValue);\n }\n });\n }, []);\n\n useEffect(() => {\n table.update((state) => {\n state.filters.set(columnId, castDraft({ ...impl, filterBy }));\n\n if (impl.value !== undefined) {\n state.filterValues.set(columnId, impl.value);\n }\n });\n\n return () => {\n table.update((state) => {\n state.filters.delete(columnId);\n });\n };\n }, [table, columnId, impl]);\n\n // Track local value and update it globally after delay\n const value = table.useState((state) => state.filterValues.get(columnId) as S | undefined);\n const [dirtyValue, setDirtyValue] = useState<S>();\n const implRef = useRef(impl);\n\n useLayoutEffect(() => {\n implRef.current = impl;\n });\n\n const delayedUpdate = useMemo(\n () =>\n debounce((value?: S) => {\n const { value: controlledValue, onChange } = implRef.current;\n\n if (controlledValue === undefined) {\n table.update((state) => {\n state.filterValues.set(columnId, value);\n });\n }\n\n onChange?.(value);\n setDirtyValue(undefined);\n }, 500),\n [table],\n );\n\n function onChange(value?: S) {\n setDirtyValue(value);\n delayedUpdate(value);\n }\n\n useEffect(() => delayedUpdate.flush(), [delayedUpdate]);\n\n return {\n value: dirtyValue ?? value,\n onChange,\n close: useContext(FilterControlContext),\n filterBy: filterBy ?? ((x) => x as unknown as F | F[]),\n };\n}\n","export const textMatch = (text: string, query: string): boolean => {\n text = text.toLowerCase();\n query = query.toLowerCase();\n return query.split(/\\s+/).every((part) => termMatch(text, part));\n};\n\nexport const termMatch = (text: string, query: string): boolean => {\n let i = 0;\n outer: for (const char of query) {\n for (; i < text.length; i++) {\n if (text[i] === char) {\n i++;\n continue outer;\n }\n }\n return false;\n }\n return true;\n};\n","import React from 'react';\nimport { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asStringOrArray } from '../misc/helpers';\nimport { textMatch } from '../misc/textMatch';\nimport { CommonFilterProps } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\n\nexport function TextFilter<T, V>({\n compare = textMatch,\n filterBy = asStringOrArray,\n ...props\n}: {\n /** Custom comparison function. Should return true if an item value matches the current filter value.\n * By default a fuzzy text comparison is used.\n */\n compare?: (itemValue: string, filterValue: string) => boolean;\n} & CommonFilterProps<T, V, string, string>): JSX.Element {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Search = useTheme((t) => t.icons.Search);\n const Clear = useTheme((t) => t.icons.Clear);\n\n const { value = '', onChange } = useFilter({\n ...props,\n filterBy,\n\n id: 'textFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n return compare(value, filterValue);\n },\n });\n\n return (\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n }}\n >\n <AutoFocusTextField\n value={value}\n onChange={(e) => onChange(e.target.value)}\n endIcon={<IconButton onClick={() => onChange('')}>{!value ? <Search /> : <Clear />}</IconButton>}\n />\n </div>\n );\n}\n"],"names":["TableMemoContext","createContext","Map","children","_jsx","useMemo","memoCache","useContext","key","fn","deps","Array","isArray","slice","toString","cachedValue","get","hit","length","every","x","i","set","useState","castDraft","Store","ColumnHeaderContext","StoreScope","items","props","ref","useRef","columnId","useColumnContext","table","useTableContext","enabled","store","useStore","draggingStart","clone","div","current","update","state","delete","offsetLeft","cols","getState","columnOrder","map","id","otherCols","filter","col","firstOffsetleft","find","sum","targetIndex","findIndex","width","offsetWidth","e","mouseX","clientX","bounds","getBoundingClientRect","undefined","Math","abs","stopPropagation","setPointerCapture","pointerId","cloneNode","body","append","value","Object","entries","getComputedStyle","style","assign","pointerEvents","position","boxShadow","left","top","color","index","indexOf","calcTargetIndex","columns","forEach","offset","reduce","columnStyleOverride","transition","transform","zIndex","splice","remove","clear","userSelect","onPointerDown","onPointerMove","onPointerUp","control","label","disabled","_jsxs","display","alignItems","cursor","marginLeft","IconButton","useTheme","t","components","Popover","Checkbox","Settings","icons","selectColumns","text","cssVariables","useCssVariables","hiddenColumns","anchorEl","setAnchorEl","toggle","column","controlledHiddenColumns","onHiddenColumnsChange","newValue","Set","has","add","currentTarget","padding","marginBottom","cannotHide","header","Button","Export","Clipboard","exportTitle","exportCopy","exportDownload","anchor","setAnchor","generate","options","activeColumns","activeItems","data","String","item","exportCell","csvExport","copy","clipboard","writeText","enableExport","download","a","document","createElement","href","encodeURIComponent","appendChild","click","removeChild","justifyItems","gap","justifyContent","FilterControlContext","FilterList","ArrowDropDown","isActive","filters","filterValue","filterValues","close","useCallback","preventDefault","target","hasPointerCapture","parent","parentElement","max","columnWidths","releasePointerCapture","getModifierState","onDoubleClick","alignSelf","content","height","background","defaultWrapCell","defaultClasses","Cell","memo","itemId","rowIndex","renderCell","wrapCell","activeItemsById","throttle","debugRender","className","cx","calcClassNames","classes","cell","hasDeferredChildren","Spinner","ChevronRight","isExpanded","expanded","hasChildren","controlledExpanded","expandOnlyOne","onExpandedChange","newExpanded","ancestor","getAncestors","margin","isSelected","itemIds","from","keys","size","selection","mouseEvent","nativeEvent","lastSelectedId","selectSyncChildren","controlledSelection","onSelectionChange","range","shiftKey","b","min","newSelection","descendant","getDescendants","justifySelf","Function","evenCell","oddCell","Row","divRef","indent","columnIds","enableSelection","rowAction","o","ResizeObserver","contains","rowHeights","offsetHeight","observe","disconnect","cellFill","firstCell","Badge","ArrowUpward","direction","sort","s","off","controlledSort","onSortChange","newDirection","newSort","push","gridTemplateColumns","overflow","textOverflow","fontSize","opacity","findScrollRoot","documentElement","scrollHeight","clientHeight","overflowY","relativeOffset","y","offsetParent","offsetTop","HTMLElement","virtual","probeRef","setCounter","to","before","after","root","rowHeight","initalRowHeight","overscan","overscanTop","overscanBottom","totalHeight","h","probeOffset","headerHeight","topOfTable","scrollTop","bottomOfTable","reverse","throttleScroll","incCounter","c","addEventListener","removeEventListener","cancel","gridColumn","TableContext","ColumnContext","Error","useTableState","loadingText","loading","isHydrated","useTableStateStorage","showLoading","setShowLoading","handle","setTimeout","clearTimeout","TableInner","hidden","fullWidth","stickyHeader","enableColumnSelection","join","visibility","headerCell","headerFill","sticky","flex","startIndex","css","badgeContent","open","flexShrink","verticalAlign","right","transformOrigin","flexWrap","minWidth","lineHeight","alignContent","borderRadius","startIcon","variant","border","darkGray","borderColor","lightGray","backgroundColor","marginRight","appearance","checked","fill","transformColor","TextField","endIcon","inputRef","focus","setFocus","outline","paddingRight","IconDefaultStyle","svg","ClassNames","cloneElement","Icon","Search","Clear","defaultIcons","defaultTexts","noResults","today","thisWeek","reset","selected","count","defaultTableTheme","defaultComponents","colors","defaultColors","spacing","TableThemeContext","mergeThemes","globalTableTheme","visible","PopoverContext","defaultDate","Date","isIncludedType","type","defaultLengths","day","month","year","maxLengths","Infinity","tabNext","all","querySelectorAll","next","onChange","locale","override","setOverride","commit","setDate","Number","setMonth","setFullYear","format","Intl","DateTimeFormat","parts","formatToParts","isEmpty","Fragment","boxSizing","borderBottom","padEnd","select","weekDays","startOfDay","d","getFullYear","getMonth","getDate","endOfDay","firstDayOfWeek","now","diff","getDay","rangeSelect","textToday","textThisWeek","textReset","baseDate","dateInView","setDateInView","dirty","setDirty","hovered","setHovered","calendars","getBackProps","getForwardProps","getDateProps","useDayzed","onDateSelected","showOutsideDays","date","onOffsetChanged","formatWeekday","weekday","weekDay","UTC","edit","formatMonth","formatYear","gridAutoFlow","weeks","fontWeight","_v","week","dateObj","dayIndex","prevMonth","nextMonth","getTime","dateIntersect","preSelected","gray","marginTop","convertDate","convertDateOrRange","Boolean","singleSelect","filterBy","convertDateOrArray","useFilter","test","newSet","providedOptions","stringValue","asString","render","uniq","flatMap","castArray","query","setQuery","filtered","option","toLowerCase","includes","maxHeight","textAlign","compare","textMatch","asStringOrArray"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,MAAMA,mBAAmBC,wCAAkBC;kCAEF;AAAA,EAAEC;AAAAA,GAAqC;SACvEC,eAAC,iBAAiB;IAAS,OAAOC,cAAQ,0BAAUH,OAAO;AAAA;;;wBAGrC;QACvBI,YAAYC,iBAAWP;SAEtB,CAAqCQ,KAAaC,OAAiC;QACpFC;QACAC,MAAMC,QAAQH,KAAK;aACdA,GAAGI,MAAM;WACXJ,GAAG;AAAA,WACH;aACE,CAACA,GAAGK;AAAAA;QAGTC,cAAcT,UAAUU,IAAIR;UAC1BS,MAAMF,eAAeA,YAAY,GAAGG,WAAWR,KAAKQ,UAAUH,YAAY,GAAGI,MAAM,CAACC,GAAGC,MAAMD,MAAMV,KAAKW;QAC1G,CAACN,eAAe,CAACE,KAAK;oBACV,CAACR,IAAIC;gBACTY,IAAId,KAAKO;AAAAA;WAEdA,YAAY;AAAA;AAAA;YC3BJ;AAAA,EAAZ,cAAP;aACc,IAAI;qBACI;AAAA;AAAA,EAEpB,IAAO,KAAuB,SAAmB;WACxC,IAAI,QAAW,CAAC,SAAS,WAAW;UACrC,SAAS;aACN,IAAI;AAAA;WAEN,EAAE,KAAK,EAAE,KAAK,SAAS;UAExB,CAAC,KAAK;aAAgB;AAAA;AAAA;AAAA,QAIhB,QAAQ;SACf,YAAY;QAEb;WACI,OAAO,KAAK,EAAE,SAAU;UAC1B;cACI,SAAS,MAAM,KAAK;aACrB,QAAQ;AAAA,eACN;aACF,OAAO;AAAA;AAAA;SAIX,YAAY;AAAA;AAAA;ACvBrB,MAAM,OAAO,CAAC,QAAQ,aAAa,YAAY,iBAAiB,gBAAgB,gBAAgB;AAEhG,MAAM,cAAc,CAAC,OAAe,2BAA2B;AAgB/D,mBAAmB,OAA0B;mBAC1B,QAA+B;QAC1C,kBAAiB,MAAM;aAClB,EAAE,QAAQ,OAAM;AAAA;QAGrB,kBAAiB,KAAK;aACjB,EAAE,OAAO,MAAM,KAAK,QAAO,IAAI;AAAA;QAGpC,kBAAiB,KAAK;aACjB,EAAE,OAAO,MAAM,KAAK,OAAM,WAAW,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA;QAGnE,kBAAiB,OAAO;aACnB,OAAM,IAAI;AAAA;QAGf,kBAAiB,QAAQ;aACpB,OAAO,YAAY,OAAO,QAAQ,QAAO,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,QAAQ;AAAA;WAGvE;AAAA;SAGF,KAAK,UAAU,QAAQ;AAAA;AAGhC,eAAe,OAAe;SACrB,KAAK,MAAM,OAAO,CAAC,MAAM,WAAU;QACpC,kBAAiB,UAAU,YAAY,QAAO;aACzC,IAAI,KAAK,OAAM;AAAA;QAGpB,kBAAiB,UAAU,WAAW,QAAO;aACxC,IAAI,IAAI,OAAM;AAAA;QAGnB,kBAAiB,UAAU,WAAW,QAAO;aACxC,IAAI,IAAI,OAAM;AAAA;WAGhB;AAAA;AAAA;gCAI4B;QAC/B,QAAQ;QACR,CAAC,YAAY,iBAAiBQ,eAAS;kBAGnC,MAAM;UACR,EAAE,YAAY,MAAM,WAAW;QACjC,CAAC,SAAS;oBACE;;;QAIZ,aAAa;AAEhB,iBAAY;;UACP;cACI,EAAE,SAAS,IAAI,SAAS,YAAY;cACpC,OAAO,MAAM,QAAQ,QAAQ,YAAY;YAC3C,cAAc,CAAC;;cAEb,OAAO,MAAM;0BACb,WAAW,OAAM,sCAAQ,QAAQ,MAAM;cAEvC,OAAO,CAAC,UAAU;;qBACX,OAAO,MAAM;kBAGlB,WAAW,QAAQ,SAAS,SAC9B,CAAC,oCAAS,SAAS,SACnB,OAAO,MACP;kBACI,QAAQ,gBAAgB;2BACf,CAAC,KAAI,UAAU,KAAK,MAAM;sBAC/B,oBAAM,QAAQ,IAAI,SAAlB,oBAAuB,YAAvB,aAAkC,MAAM;0BACpC,aAAa,IAAI,KAAI;AAAA;AAAA;AAAA,qBAG1B;sBACC,OAAO,KAAK;oBAEd,QAAQ,cAAc,QAAQ,mBAAmB,QAAQ,eAAe,QAAQ,QAAQ;oCACpF,OAAM,KAAM,IAAI,MAAM,GAAG,GAAG,gBAAgB,IAAI,MAAM,4CAAyC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAM7G;gBACC,MAAM,+BAA+B;AAAA;sBAE/B;AAAA;AAAA;WAIX,MAAM;mBACE;AAAA;AAAA,KAEd;kBAGO,MAAM;QACV,CAAC;;UAEC,IAAI,IAAI;WAEP,MAAM,UACX,CAAC,UAAU;;UACL,CAAC,MAAM,MAAM;;YAEX,EAAE,SAAS,IAAI,SAAS,YAAY,MAAM,MAAM;YAChD,OAAY;iBAEP,OAAO,MAAM;cAGlB,WAAW,QAAQ,SAAS,SAC9B,CAAC,oCAAS,SAAS,OACnB;cACI,QAAQ,gBAAgB;iBACrB,2BAAW;uBACL,CAAC,KAAI,UAAU,MAAM,cAAc;kBACxC,kBAAM,QAAQ,IAAI,SAAlB,mBAAuB,YAAvB,YAAkC,MAAM;qBACrC,aAAa,IAAI,KAAI;AAAA;AAAA;AAAA,iBAGzB;iBACA,OAAO,MAAM;AAAA;AAAA;AAAA;aAKjB,EAAE,SAAS,IAAI;AAAA,OAExB,CAAC,UAAU;;UACL,CAAC;;YACC,EAAE,SAAS,IAAI,SAAS;wBAExB,WAAW,OAAM,sCAAQ,QAAQ,MAAM,UAAU;QACrD,IAAI,YAAY;cACV,QAAQ,QAAQ,YAAY,KAAK,UAAU;AAAA,SAChD;AAAA,OAEL,EAAE,UAAU;AAAA,KAEb,CAAC;SAEG;AAAA;MC7KI,UAAU,CAAO,KAAkB,aAAgC;SACvE,CAAC,GAAG,KAAK,OAAY,CAAC,KAAK,QAAQ,IAAI,OAAO,SAAQ,OAAO;AAAA;MAGzD,UAAU,CAAI,KAAU,YAA+B,IAAI,YAAgC,OAAY;MAC9G,UAAU,WAAW;gBAAe,CAAC,CAAC,MAAM;SAEzC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,MAAM;;aACpB,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;YACnC,MAAK,gBAAU,OAAV,mCAAe;YACpB,MAAK,gBAAU,OAAV,mCAAe;YACpB,MAAM,UAAU,OAAO,SAAS,KAAK;UACvC,MAAK;eAAW;UAChB,MAAK;eAAW,CAAC;AAAA;WAEhB;AAAA;AAAA;MAIE,OAAO,CAAI,QAAkB;QAClC,0BAAU;aACL,KAAK;QAAS,IAAI;SACtB,MAAM,KAAK;AAAA;MAGP,YAAY,CAAI,GAAgB,MAAsC;QAC3E,6BAAa;aACR,KAAK;QAAO,EAAE,IAAI;aAAW,IAAI;SACrC;AAAA;MAGI,eAAe,CAAI,oBAA2C,UAAmC;QACtG,6BAAa;QAEb,OAAO,CAAC,EAAE,eAAmC;UAC3C,SAAS,WAAW,gBAAgB,IAAI,YAAY;QACtD,UAAU,CAAC,OAAO,IAAI,OAAO,KAAK;aAC7B,IAAI,OAAO;WACb;AAAA;AAAA;QAGH,QAAQ;SACP;AAAA;MAGI,iBAAiB,IAAO,UAAmC;QAChE,6BAAa;QAEb,OAAO,CAAC,SAA6B;eAC9B,SAAS,KAAK,UAAU;UAC7B,CAAC,OAAO,IAAI,MAAM,KAAK;eAClB,IAAI,MAAM;aACZ;AAAA;AAAA;AAAA;QAIL,QAAQ;SACP;AAAA;MAKI,WAAW,CAAC,MAAuB;MAC1C,aAAa;WAAc,EAAE,IAAI,UAAU,KAAK;MAChD,aAAa;WAAe,KAAK,UAAU;SACxC,OAAO,gBAAK;AAAA;MAGR,kBAAkB,CAAC,MAAkC;MAC5D,aAAa;WAAc,EAAE,IAAI;SAC9B,SAAS;AAAA;MAOL,YAAY,CAAI,MAAgB,aAAa,QAAQ,IAAI,CAAC;MAE1D,KAAK,IAAI,eACpB,WACG,QAAQ,CAAC,UAAU;MACd,CAAC;WAAc;MACf,OAAO,UAAU;WAAiB,CAAC;SAChC,OAAO,QAAQ,OACnB,OAAO,CAAC,GAAG,eAAe,WAC1B,IAAI,CAAC,CAAC,gBAAe;AAAA,GAEzB,KAAK;mBCpFmB,OAA2C;kBAEpE,MACE,MAAM,YACJ,CAAC,WACC;AAAA,IACE,OAAM,MAAM;AAAA,IACZ,OAAM,MAAM;AAAA,IACZ,OAAM,MAAM;AAAA,IACZ,OAAM,MAAM;AAAA,IACZ,OAAM;AAAA,IACN,OAAM;AAAA,IACN,OAAM;AAAA,IACN,OAAM;AAAA,IACN,OAAM;AAAA,KAEV,CAAC,CAAC,QAAQ,IAAI,IAAI,UAAU,gBAAgB,MAAM,SAAS,cAAc,gBAAgB,UAAU;UAC3F,aAAa,MAAM,IAAkB,CAAC,0CACvC;MACH,IAAI,GAAG;AAAA,MACP,UAAU,qCAAW;AAAA,MACrB,UAAU;AAAA;QAGR;QACA,KAAK,WAAW,GAAG;eACZ;AAAA,WACJ;YACC,YAAY,QAAQ,MAAM,CAAC,UAAS;cAClC,SAAS,cAAc,KAAK,CAAC,YAAW,QAAO,OAAO,MAAK;YAC7D,CAAC;iBAAe;eACb,OAAO,OAAO,IAAI,CAAC;UACxB,UAAU,CAAC,SAAY,OAAO,OAAO,MAAM,OAAO;AAAA,UAClD,WAAW,MAAK;AAAA;AAAA,SAEjB,OAAO;eAED,QACP,YACA,UAAU,IAAI,CAAC,MAAM,EAAE,WACvB,UAAU,IAAI,CAAC,MAAM,EAAE;AAAA;UAIrB,6BAAa;eACR,QAAQ,QAAQ;aAClB,IAAI,KAAK,IAAI;AAAA;eAGX,QAAQ,QAAQ;YACnB,SAAS,KAAK,aAAa,SAAY,OAAO,IAAI,KAAK,YAAY;uCACjE,SAAS,KAAK;AAAA;UAGlB,WAAW,IAAI;UACf,mCAAmB;UAEnB,WAAW,CAAC,WAAgC;iBACrC,QAAQ,QAAO;iBACf,KAAK;qBACD,IAAI,KAAK,IAAI;iBACjB,KAAK;AAAA;AAAA;aAGT,OAAO,OAAO,CAAC,SAAS,KAAK,aAAa;QAE/C,kBAAkB;UAChB,sCAAsB;UACtB,gCAAgB;UAChB,cAAc,CAAC,GAAG,UACrB,UACA,OAAO,CAAC,SAAS;UACZ,WAAW,UAAU,IAAI,KAAK;8BAErB,cAAc,MAAM,CAAC,WAAW;;cACrC,SAAS,QAAQ,IAAI,OAAO;YAC9B,CAAC;iBAAe;cAEd,cAAc,aAAa,IAAI,OAAO;YACxC,gBAAgB,UAAa,CAAC,OAAO,SAAS;iBAAqB;cAEjE,WAAW,aAAO,aAAP,aAAqB,MAAM;cACtC,QAAQ,SAAS,OAAO,MAAM,OAAO;eACpC,UAAU,OAAO,KAAK,CAAC,WAAU,OAAO,KAAK,aAAa;AAAA;UAG/D,YAAY,KAAK,aAAa,QAAW;YAEzC,kBACA,MAAM,KAAK,QAAQ,WAAW,KAAK,CAAC,CAAC,KAAI,YAAY;gBAC7C,cAAc,aAAa,IAAI;iBAC9B,CAAC,CAAC,UAAU,gBAAgB,UAAa,OAAO,SAAS;AAAA,YAElE;gDACoB,CAAC,MAAM,SAAS,IAAI,KAAK;gBACvC,SAAS,IAAI,KAAK;AAAA,mBACf,CAAC,MAAM,SAAS,IAAI,KAAK,WAAW;qBAClC;AAAA;AAAA;UAIX,YAAY,KAAK,aAAa,QAAW;kBACjC,IAAI,KAAK;AAAA;UAEjB,UAAU;wBACI,IAAI,KAAK,IAAI;AAAA;aAGxB;AAAA,OAER;UAEG,QAAQC,gBAAU;UAClB,YAAYA,gBAAU;UACtB,cAAcA,gBAAU;UACxB,kBAAkBA,gBAAU;QAE9B,iBAAiB;iBACR,MAAM;;0BACT,WAAW,OAAM,iDAAmB,MAAM,WAAW;AAAA;AAAA;AAAA,KAIjE,EAAE,QAAQ,SAEd,CAAC;AAAA;AC9HL,MAAM,eAAe,MAAM;mBAEE,OAA6C;QAClE,QAAQ;SAEPnB,cAAQ,MAAM;;QACf;QACA,MAAM,cAAc,YAAY,MAAM,QAAQ,MAAM,KAAK;WACtD,MAAM,MAAM,MAAM;AAAA,WAClB;WACA,MAAM,MAAM,CAAC,CAAC,SAAY,KAAK,MAAM,KAAiC,MAAM;AAAA;QAG/E;QACA,MAAM,oBAAoB,YAAY,MAAM,QAAQ,MAAM,WAAW;iBAC5D,MAAM,YAAY,MAAM;AAAA,eAC1B,MAAM,aAAa,QAAW;iBAC5B,MAAM,YAAY,CAAC,CAAC,SAAY,KAAK,MAAM,WAAmD,MAAM;AAAA,WAC1G;iBACM;AAAA;QAGT;QACA,MAAM,mBAAmB,UAAU;qBACtB,MAAM,QAAQ,CAAC,OAAO,4CAAiB,WAAQ;AAAA,WACzD;qBACU,MAAM,QAAQ,IAAI,CAAC,4CAAiB,WAAQ,aAAa;AAAA;UAGpE,SAAS,MAAM;UACf,YAAY,CAChB;AAAA,MACE,IAAI;AAAA,MACJ,SAAS,gDAAQ,WAAR,YAAkB;AAAA,MAC3B;AAAA,MACA,aAAa,gDAAQ,eAAR,YAAsB;AAAA,MACnC,aAAa,gDAAQ,eAAR,YAAsB;AAAA,MACnC,SAAS,gDAAQ,WAAR,YAAkB,CAAC,CAAC,MAAO,OAAO,MAAM,YAAY,aAAa,OAAO,IAAI,OAAO;AAAA,MAC5F,aAAa,iCAAQ;AAAA,MACrB,UAAU,iCAAQ;AAAA,MAClB,SAAS,iCAAQ;AAAA,MACjB,QAAQ,iCAAQ;AAAA,OAElB,UACyB;YACnB,MAAK,oBAAO;YACZ,WAAW,OAAO,QAAO,WAAW,IAAI,QAAO,IAAI;aAElD;AAAA,QACL;QACA;AAAA,QACA,OAAO,MAAM,WAAW,kBAAkB;AAAA,QAC1C,YAAY,MAAM,WAAW,uBAAuB;AAAA,QACpD;AAAA,QACA,QAAQ,OAAO,IAAI,CAAC,IAAI,MAAM,MAAM,WAAW,mBAAmB,KAAK;AAAA,QACvE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA;UAIE,UAAU,aAAa,IAAI;UAE3B,WAAW,MAAM,YAAY,MAAM,YAAY,MAAM;UAErD,YACJ,MAAM,qBAAqB,YAAY,MAAM,QAAQ,MAAM,aAAa,MAAM,aAAa,MAAM,aAAa,MAAM;QAElH;QACA,MAAM,iBAAiB,QAAS,MAAM,wBAAwB,UAAU,MAAM,aAAa,SAAS,MAAO;aACtG,EAAE,WAAW;AAAA,eACX,MAAM,gBAAgB,MAAM,aAAa,gBAAgB,QAAQ;aACnE,MAAM,aAAa;AAAA;QAGxB;QACA,MAAM,iBAAiB,QAAS,MAAM,wBAAwB,UAAU,MAAM,aAAa,aAAa,MAAO;iBACtG,EAAE,WAAW;AAAA,eACf,MAAM,gBAAgB,MAAM,aAAa,oBAAoB,QAAQ;iBACnE,MAAM,aAAa;AAAA;UAG1B,eAAe,EAAE,MAAM;WAEtB,iCACF,QADE;AAAA,MAEL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,YAAM,oBAAN,YAAyB;AAAA,MAC1C,oBAAoB,YAAM,uBAAN,YAA4B;AAAA,MAChD,cAAc,YAAM,iBAAN,YAAsB;AAAA,MACpC;AAAA,MACA,uBAAuB,YAAM,0BAAN,YAA+B;AAAA,MACtD,oBAAoB,YAAM,uBAAN,YAA4B;AAAA,MAChD,qBAAqB,YAAM,wBAAN,YAA6B;AAAA;AAAA,KAEnD,CAAC;AAAA;sBCpG0B,OAA2C;kBAEvE,MACE,MAAM,YACJ,CAAC,WAAU,CAAC,OAAM,MAAM,SAAS,OAAM,WAAW,OAAM,iBAAiB,OAAM,gBAC/E,CAAC,CAAC,SAAS,WAAW,iBAAiB,gBAAgB,UAAU;UACzD,YAAY,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,OAAO;UACnD,kBAAkB,IAAI,IAAI,cAAc,IAAI,CAAC,WAAW,OAAO;UAG/D,UAAU,MAAM,KAAK,OAAO,CAAC,MAAM,gBAAgB,IAAI,EAAE;QAC3D,QAAQ,SAAS,MAAM,KAAK,QAAQ;YAChC,OAAO;iBACF,MAAM;;0BACT,WAAW,OAAM,6CAAe;AAAA;AAAA;eAK/B,MAAM,MAAM,QAAQ,QAAQ;UACjC,CAAC,gBAAgB,IAAI;cAAW,QAAQ,OAAO;AAAA;eAI1C,MAAM,MAAM,aAAa,QAAQ;UACtC,CAAC,gBAAgB,IAAI;cAAW,aAAa,OAAO;AAAA;eAI/C,MAAM,MAAM,cAAc,QAAQ;UACvC,CAAC,UAAU,IAAI;cAAW,cAAc,OAAO;AAAA;eAI1C,MAAM,MAAM,aAAa,QAAQ;UACtC,CAAC,UAAU,IAAI;cAAW,aAAa,OAAO;AAAA;eAIzC,MAAM,MAAM,aAAa;UAC9B,CAAC,UAAU,IAAI;cAAW,cAAc,MAAM,YAAY,OAAO,CAAC,MAAM,MAAM;AAAA;QAGhF,MAAM,MAAM,OAAO;YAEf,eAAe,UAAU,MAAM,WAAW;UAC5C,aAAa,SAAS,MAAM,UAAU,MAAM;cACxC,YAAY;mBACP,MAAM;;4BACT,WAAW,OAAM,kDAAoB;AAAA;AAAA;YAKzC,cAAc,UAAU,MAAM,UAAU;UAC1C,YAAY,OAAO,MAAM,SAAS,MAAM;cACpC,WAAW;mBACN,MAAM;;4BACT,WAAW,OAAM,iDAAmB;AAAA;AAAA;AAAA;AAAA,KAKlD,EAAE,QAAQ,SAEd,CAAC;AAAA;uBCjE4B,OAA2C;kBAExE,MACE,MAAM,YACJ,CAAC,WAAU,CAAC,OAAM,MAAM,SAAS,OAAM,eAAe,OAAM,cAC5D,CAAC,CAAC,SAAS,eAAe,cAAc,UAAU;UAC1C,gBAAgB,QACpB,QAAQ,OAAO,CAAC,WAAW,CAAC,cAAc,IAAI,OAAO,MACrD,CAAC,CAAC,WAAW,YAAY,QAAQ,OAAO;AAAA,KAG5C,EAAE,QAAQ,SAEd,CAAC;AAAA;wBCd6B,OAA2C;kBAEzE,MACE,MAAM,YACJ,CAAC,UAAU,CAAC,MAAM,MAAM,oBAAoB,MAAM,WAAW,MAAM,cACnE,CAAC,CAAC,oBAAoB,WAAW,cAAc,UAAU;QACnD,CAAC;;UAEC,eAAe,IAAI,IAAI;eAClB,QAAQ,aAAa;UAC1B,KAAK,aAAa,UAAa,aAAa,IAAI,KAAK,WAAW;qBACrD,IAAI,KAAK;AAAA;AAAA;QAItB,aAAa,SAAS,UAAU,MAAM;YAClC,YAAY;iBACP,MAAM;;0BACT,WAAW,OAAM,kDAAoB;AAAA;AAAA;AAAA,KAIjD,EAAE,QAAQ,SAEd,CAAC;AAAA;uBClB4B,QAAqD;QAC9E,QAAQ,UAAU;QAElB,QAAQA,cACZ;;AACE,eAAIoB,cAA6B;AAAA,MAC/B;AAAA,MAEA,MAAM,YAAM,gBAAN,YAAqB;AAAA,MAC3B,WAAW,YAAM,qBAAN,gCAA8B;AAAA,MACzC,UAAU,YAAM,oBAAN,gCAA6B;AAAA,MACvC,gCAAgB;AAAA,MAChB,6BAAa;AAAA,MACb,kCAAkB;AAAA,MAClB,eAAe,YAAM,yBAAN,gCAAkC;AAAA,MACjD,kCAAkB;AAAA,MAClB,aAAa,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO;AAAA,MAClD,yCAAyB;AAAA,MAEzB,eAAe;AAAA,MACf,OAAO;AAAA,MACP,+BAAe;AAAA,MACf,aAAa;AAAA,MACb,qCAAqB;AAAA,MACrB,gBAAgB;AAAA;AAAA,KAEpB;gBAGY;YACJ;iBACK;eACF;kBAEH,MAAM;UACR,OAAO,CAAC,WAAU;aAChB,QAAQD,gBAAU;UACpB,MAAM;eAAY,OAAO,MAAM;UAC/B,MAAM;eAAiB,YAAY,MAAM;UACzC,MAAM;eAAgB,WAAW,MAAM;UACvC,MAAM;eAAqB,gBAAgB,MAAM;iBAC1C,UAAU,MAAM,SAAS;YAC9B,CAAC,OAAM,YAAY,SAAS,OAAO,KAAK;gBACpC,QAAQ,MAAM,QAAQ,QAAQ;iBAC9B,YAAY,OAAO,OAAO,GAAG,OAAO;AAAA;AAAA;AAAA;AAAA,KAI/C,CAAC,OAAO;SAEJ;AAAA;2BC1DyB;SACzB,SAAS,CAAC,EAAE,SAAS;IAC1B,aAAa;AAAA,IACb,iBAAiB,OAAO,QAAQ;AAAA,IAChC,kBAAkB,OAAO,QAAQ;AAAA,IACjC,yBAAyB,OAAO,QAAQ;AAAA,IACxC,mBAAmB,OAAO,UAAU;AAAA,IACpC,oBAAoB,OAAO,UAAU;AAAA,IACrC,2BAA2B,OAAO,UAAU;AAAA;AAAA;MCLnCE,sBAAsB,IAAIC,mBAAW;AAAA,EAChDC,2BAAW1B;AAAAA;sBAGgB2B,OAAkC;QACvDC,MAAMC,aAAuB;QAC7BC,WAAWC;QACXC,QAAQC;QACRC,UAAUF,MAAMX,SAAS;QAEzBc,QAAQX,oBAAoBY;QAC5BC,gBAAgBR;QAChBS,QAAQT;kBAGJ,MAAM;UACRU,MAAMX,IAAIY;QACZ,CAACD;;UAECE,OAAQC,WAAU;YAChBhB,MAAMN,IAAIU,UAAUR,gBAAUiB;AAAAA;WAG/B,MAAM;YACLE,OAAQC,WAAU;cAChBhB,MAAMiB,OAAOb;AAAAA;AAAAA;AAAAA,KAGtB,CAACF,IAAIY,SAASL,OAAOL;2BAGCc,YAAoB;;UACrCC,OAAOb,MAAMc,WAAWC,YAAYC,IAAKC;MAAUA;AAAAA,MAAIV,KAAKJ,MAAMW,WAAWpB,MAAMZ,IAAImC;AAAAA;UAEvFC,YAAYL,KAAKM,OAAQC,SAAQA,IAAIH,OAAOnB;UAE5CuB,kBAAkBR,uBAAKS,KAAMF,SAAQA,IAAIb,SAAvBM,mBAA6BN,QAA7BM,mBAAkCD,eAAlCC,YAAgD;QAEpEU,MAAM;UACJC,cAAcN,UAAUO,UAAWL,SAAQ;;YACzCM,QAAQN,kBAAIb,QAAJa,oBAASO,gBAATP,aAAwB;UAClCG,MAAMG,QAAQ,IAAId,aAAaS;eAAwB;aACpDK;aACA;AAAA;WAGFF,gBAAgB,KAAKN,UAAUlC,SAASwC;AAAAA;yBAI1BI,GAAuB;UACtCrB,MAAMX,IAAIY;QACZ,CAACD;;kBACSC,UAAU;AAAA,MAAEqB,QAAQD,EAAEE;AAAAA,MAASC,QAAQxB,IAAIyB;AAAAA;AAAAA;yBAIpCJ,GAAuB;UACtCnB,OAAQC,WAAU;YAChBH,MAAMX,IAAIY;UACZ,CAACD,OAAOF,cAAcG,YAAYyB,UAAaC,KAAKC,IAAIP,EAAEE,UAAUzB,cAAcG,QAAQqB,UAAU;;QAEtGO;UACEC,kBAAkBT,EAAEU;UAGpB,CAAChC,MAAME,SAAS;cACZA,UAAUD,IAAIgC,UAAU;iBACrBC,KAAKC,OAAOnC,MAAME;mBAEhB,CAAClC,KAAKoE,UAAUC,OAAOC,QAAQC,iBAAiBtC,OAAO;cAC5D;kBACIC,QAAQsC,MAAMxE,OAAcoE;AAAAA;;;eAM/BK,OAAOzC,MAAME,QAAQsC,OAAO;AAAA,UACjCE,eAAe;AAAA,UACfC,UAAU;AAAA,UACVC,WAAW;AAAA,UACXC,MAAO,GAAE9C,cAAcG,QAAQuB,OAAOoB;AAAAA,UACtCC,KAAM,GAAE/C,cAAcG,QAAQuB,OAAOqB;AAAAA;YAGnCN,MAAMO,QAAQ;AAAA;YAId7C,QAAQsC,MAAMK,OAAQ,GAAE9C,cAAcG,QAAQuB,OAAOoB,OAAOvB,EAAEE,UAAUzB,cAAcG,QAAQqB;YAG9FyB,QAAQ5C,MAAMK,YAAYwC,QAAQzD;YAClC0B,cAAcgC,gBAAgBjD,IAAIK,aAAagB,EAAEE,UAAUzB,cAAcG,QAAQqB;YAGjF4B,UAAUzD,MACbc,WACAC,YAAYC,IAAI,CAACC,IAAIqC;;;UAAarC;AAAAA,UAAIqC;UAAO5B,OAAOvB,kBAAMW,WAAWpB,MAAMZ,IAAImC,QAA3Bd,mBAAgCwB,gBAAhCxB,YAA+C;AAAA;AAAA;YAEhGY,YAAY2C,QAAQ,CAACzC,IAAI9B,MAAM;YAC/BwE,SAAS;YACTxE,MAAMmE,OAAO;cAEX9B,cAAc8B,OAAO;qBACdG,QAAQ9E,MAAM2E,QAAQ,GAAG9B,cAAc,GAAGoC,OAAO,CAACrC,KAAKH,QAAQG,MAAMH,IAAIM,OAAO;AAAA,qBAChFF,cAAc8B,OAAO;qBACrB,CAACG,QAAQ9E,MAAM6C,aAAa8B,OAAOM,OAAO,CAACrC,KAAKH,QAAQG,MAAMH,IAAIM,OAAO;AAAA;AAAA,mBAE3EvC,KAAKqC,eAAerC,IAAImE,OAAO;mBAE/B/C,IAAIoB;AAAAA,mBACJxC,IAAImE,SAASnE,KAAKqC,aAAa;mBAE/B,CAACjB,IAAIoB;AAAAA;cAGVkC,oBAAoBzE,IAAI6B,IAAI;AAAA,UAChC6C,YAAY;AAAA,UACZC,WAAY,eAAcJ;AAAAA,UAC1BK,QAAQ7E,MAAMmE,QAAQ,IAAIrB;AAAAA;AAAAA;AAAAA;AAAAA;uBAObL,GAAuB;UACpCnB,OAAQC,WAAU;;YAChBH,MAAMX,IAAIY;UACZ,CAACD,OAAOF,cAAcG,YAAYyB;;YAGhCqB,QAAQ5C,MAAMK,YAAYwC,QAAQzD;YAClC0B,cAAcgC,gBAAgBjD,IAAIK,aAAagB,EAAEE,UAAUzB,cAAcG,QAAQqB;YAEjFd,YAAYkD,OAAOX,OAAO;YAC1BvC,YAAYkD,OAAOzC,aAAa,GAAG1B;kBAGnCU,+BAAS0D;UACXpB,MAAMO,QAAQ;YACZQ,oBAAoBM;oBACZ3D,UAAUyB;YAClBzB,UAAUyB;AAAAA;AAAAA;SAKlB/D,uDACMyB;IACJ,KAAK;AAAA,MACHsD,UAAU;AAAA,MACVmB,YAAY;AAAA;AAAA,IAEd;AAAA,IACA,eAAelE,UAAUmE,gBAAgBpC;AAAAA,IACzC,eAAe/B,UAAUoE,gBAAgBrC;AAAAA,IACzC,aAAa/B,UAAUqE,cAActC;AAAAA,cAEpCtC,MAAM1B;AAAAA;AAAAA;0BCpKoB;AAAA,EAAEuG;AAAAA,EAASC;AAAAA,EAAOC;AAAAA,GAA0E;SAEzHC;IACE,KAAK,CACH;AAAA,MACEC,SAAS;AAAA,MACTC,YAAY;AAAA,MACZC,QAAQ;AAAA,MACRV,YAAY;AAAA,eAEH;AAAA,QACPU,QAAQ;AAAA;AAAA,OAGZJ,YAAY;AAAA,MAAErB,OAAO;AAAA;AAAA,eAGtBmB,SACDtG;MAAM,KAAK;AAAA,QAAE6G,YAAY;AAAA;AAAA,gBAAqBN;AAAAA;AAAAA;AAAAA;2BCbF;QAC1CO,cAAaC,SAAUC,OAAMA,EAAEC,WAAWH;QAC1CI,UAAUH,SAAUC,OAAMA,EAAEC,WAAWC;QACvCC,YAAWJ,SAAUC,OAAMA,EAAEC,WAAWE;QACxCC,YAAWL,SAAUC,OAAMA,EAAEK,MAAMD;QACnCE,gBAAgBP,SAAUC,OAAMA,EAAEO,KAAKD;QACvCE,eAAeC;QAEf3F,QAAQC;QACRwD,UAAUzD,MAAMX,SAAS;QACzBuG,gBAAgB5F,MAAMX,SAAS;QAE/B,CAACwG,UAAUC,eAAezG,eAAyB;QAEnD0G,UAAS,CAACC,WAAuC;UAC/C;AAAA,MACJrG,OAAO;AAAA,QAAEiG,eAAeK;AAAAA,QAAyBC;AAAAA;AAAAA,QAC/ClG,MAAMc;UAEJqF,WAAW,IAAIC,IAAIR;QACrBA,cAAcS,IAAIL,OAAO/E;eAAcN,OAAOqF,OAAO/E;AAAAA;eAC3CqF,IAAIN,OAAO/E;QAErB,CAACgF,yBAAyB;YACtBxF,OAAQC,WAAU;cAChBkF,gBAAgBO;AAAAA;AAAAA;mEAIFA;AAAAA;SAIxBxB;eACEzG,eAAC;MAAW,SAAU0D,OAAMkE,YAAYD,WAAW,OAAOjE,EAAE2E;AAAAA,gBAC1DrI,eAAC;QAGHA,eAAC;MAAQ;AAAA,MAAoB,MAAM,CAAC,CAAC2H;AAAAA,MAAU,SAAS,MAAMC,YAAY;AAAA,MAAO,KAAKJ;AAAAA,gBACpFf;QAAK,KAAK;AAAA,UAAE6B,SAAU;AAAA,UAA2B5B,SAAS;AAAA;AAAA,mBACxD1G;UAAK,KAAK;AAAA,YAAEuI,cAAc;AAAA;AAAA,oBAAqBjB;AAAAA,YAE9C/B,QAAQzC,IAAKgF,YACZ9H,eAAC;UAEC,SAASA,eAAC;YAAS,SAAS,CAAC0H,cAAcS,IAAIL,OAAO/E;AAAAA,YAAK,UAAU,MAAM8E,QAAOC;AAAAA,YAAS,UAAUA,OAAOU;AAAAA;AAAAA,UAC5G,OAAOV,OAAOW;AAAAA,WAFTX,OAAO/E;AAAAA;AAAAA;AAAAA;AAAAA;mBChDxB,MACA,EAAE,WAAW,YAAY,KAAK,QAAQ,KAAK,MAAM,SAA2B,IACpE;QACF,QAAQ,KAAK,IAAI,CAAC,SACtB,KAAK,IAAI,CAAC,UAAU;QACd,OAAO,UAAU;aAAiB,OAAO;QACzC,CAAC,CAAC,WAAW,OAAO,KAAK,KAAK,CAAC,MAAM,MAAM,SAAS;aAAY;UAE9D,QAAQ,MAAM,QAAQ,IAAI,OAAO,OAAO,MAAM,GAAG,QAAQ;WACxD,GAAG,QAAQ,QAAQ;AAAA;sBAIV,OAAO;AAAA,IAAgB,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,YAAY,KAAK;AAAA;oBCVzD;QACjCjB,QAAQC;QACR2G,UAAS3B,SAAUC,OAAMA,EAAEC,WAAWyB;QACtC5B,cAAaC,SAAUC,OAAMA,EAAEC,WAAWH;QAC1CI,UAAUH,SAAUC,OAAMA,EAAEC,WAAWC;QACvCyB,UAAS5B,SAAUC,OAAMA,EAAEK,MAAMsB;QACjCC,aAAY7B,SAAUC,OAAMA,EAAEK,MAAMuB;QACpCC,cAAc9B,SAAUC,OAAMA,EAAEO,KAAKsB;QACrCC,aAAa/B,SAAUC,OAAMA,EAAEO,KAAKuB;QACpCC,iBAAiBhC,SAAUC,OAAMA,EAAEO,KAAKwB;QACxCvB,eAAeC;QAEf,CAACuB,QAAQC,aAAa9H,eAAyB;QAE/C+H,WAAW,CAACC,YAA+B;UACzC;AAAA,MAAEC;AAAAA,MAAeC;AAAAA,QAAgBvH,MAAMc;UAEvC0G,OAAO,CACXF,cAActG,IAAKgF,YAAWyB,OAAOzB,OAAO/E,MAC5C,GAAGsG,YAAYvG,IAAK0G,UAASJ,cAActG,IAAKgF,YAAWA,OAAO2B,WAAW3B,OAAOtD,MAAMgF,OAAOA;WAE5FE,UAAUJ,MAAMH;AAAAA;QAGnBQ,OAAO,MAAM;cACPC,UAAUC,UAAUX,SAASpH,MAAMc,WAAWnB,MAAMqI,aAAaH;AAAAA;QAGvEI,WAAW,MAAM;UACfC,IAAIC,SAASC,cAAc;MAC/BC,OAAO,iCAAiCC,mBAAmBlB,SAASpH,MAAMc,WAAWnB,MAAMqI,aAAaC;MACxGA,WAAW;aACJzF,KAAK+F,YAAYL;MACxBM;aACOhG,KAAKiG,YAAYP;AAAAA;SAI1BvD;eACEzG,eAAC;MAAW,SAAU0D,OAAMuF,UAAUD,SAAS,OAAOtF,EAAE2E;AAAAA,gBACtDrI,eAAC;QAAO,KAAK,CAAC,CAACgJ,UAAU;AAAA,UAAE7D,OAAO;AAAA;AAAA;AAAA,QAGpCnF,eAAC;MAAQ,MAAM,CAAC,CAACgJ;AAAAA,MAAQ,SAAS,MAAMC,UAAU;AAAA,MAAO,UAAUD;AAAAA,MAAQ,KAAKxB;AAAAA,gBAC9Ef;QACE,KAAK;AAAA,UACH6B,SAAU;AAAA,UACV5B,SAAS;AAAA,UACT8D,cAAc;AAAA,UACdC,KAAK;AAAA,mBAEI;AAAA,YACPC,gBAAgB;AAAA;AAAA;AAAA,mBAIpB1K;UAAK,KAAK;AAAA,YAAEuI,cAAc;AAAA;AAAA,oBAAqBM;AAAAA,YAC/C7I,eAAC;UAAO,WAAWA,eAAC;UAAc,SAAS2J;AAAAA,oBACxCb;AAAAA,YAEH9I,eAAC;UAAO,WAAWA,eAAC;UAAW,SAAS+J;AAAAA,oBACrChB;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;MC9DA4B,uBAAuB9K,oBAAc,MAAY;yBAEP;QAC/CiC,QAAQC;QACRH,WAAWC;QACXiF,cAAaC,SAAUC,OAAMA,EAAEC,WAAWH;QAC1CI,UAAUH,SAAUC,OAAMA,EAAEC,WAAWC;QACvC0D,cAAa7D,SAAUC,OAAMA,EAAEK,MAAMuD;QACrCC,iBAAgB9D,SAAUC,OAAMA,EAAEK,MAAMwD;QACxCrD,eAAeC;QAEf,CAACuB,QAAQC,aAAa9H,eAAyB;QAC/C2J,WAAWhJ,MAAMX,SAAUqB,WAAU;UACnCS,UAAST,MAAMuI,QAAQnK,IAAIgB;UAC3BoJ,cAAcxI,MAAMyI,aAAarK,IAAIgB;WACpCqB,YAAWc,UAAaiH,gBAAgBjH,UAAad,QAAO6H,SAASE;AAAAA;QAExE/H,SAASnB,MAAMX,SAAUqB;;AAAUA,uBAAM4G,cAAchG,KAAM0E,YAAWA,OAAO/E,OAAOnB,cAAnDY,mBAA8DS;AAAAA;mBAEtF;UACTV,OAAQC,WAAU;YAChByI,aAAaxI,OAAOb;AAAAA;AAAAA;QAIxBsJ,QAAQC,kBAAY,WAAY;cAC1B;AAAA,KACT;MAEC,CAAClI;WAAe;SAGlBwD,gBAAC,qBAAqB;IAAS,OAAOyE;AAAAA,eACpClL;MACE,SAAU0D,OAAMuF,UAAUvF,EAAE2E;AAAAA,MAC5B,eAAgB3E,OAAM;;UAElB0H;eACK;AAAA;AAAA,gBAGTpL,eAAC;QACC,KAAK,CACH;AAAA,UAAEmF,OAAO;AAAA,WACT2F,YAAY;AAAA,UACV3F,OAAO;AAAA;AAAA,kBAIV2F,WAAW9K,eAAC,mBAAgBA,eAAC;;QAIlCA;MACE,eAAgB0D,OAAM;UAClBQ;AAAAA;AAAAA,MAEJ,eAAgBR,OAAM;UAClBQ;AAAAA;AAAAA,gBAGJlE,eAAC;QAAQ;QAAK,QAAQ,CAACgJ;AAAAA,QAAQ,SAAS,MAAMC,UAAU;AAAA,QAAO,UAAUD,0BAAUiB,SAAS3F;AAAAA,QAAM,KAAKkD;AAAAA,kBACpGvE;AAAAA;AAAAA;AAAAA;AAAAA;wBChEoB;QACvBnB,QAAQC;QACRH,WAAWC;QACXG,UAAUF,MAAMX,SAAS;yBAERuC,GAAuB;MAC1CQ;UAEI7B,MAAMqB,EAAE2H;QACVlH,kBAAkBT,EAAEU;AAAAA;yBAGHV,GAAuB;MAC1CQ;UAEI7B,MAAMqB,EAAE2H;QACV,CAAChJ,IAAIiJ,kBAAkB5H,EAAEU;;UAEvBmH,SAASlJ,IAAImJ;UACbhI,QAAQQ,KAAKyH,IAAI/H,EAAEE,UAAU2H,OAAOzH,wBAAwBmB,OAAO,GAAG;UAEtE1C,OAAQC,WAAU;YAChBkJ,aAAaxK,IAAIU,UAAW,GAAE4B;AAAAA;AAAAA;uBAInBE,GAAuB;MACxCQ;UAEI7B,MAAMqB,EAAE2H;QACVM,sBAAsBjI,EAAEU;AAAAA;yBAGPV,GAAqB;UACpCnB,OAAQC,WAAU;UAClBkB,EAAEkI,iBAAiB,YAAY;cAC3BF,aAAajJ,OAAOb;AAAAA,aACrB;cACC8J,aAAaxK,IAAIU,UAAU;AAAA;AAAA;AAAA;SAMrC5B,eAAC;IACC;AAAA,IACA,eAAegC,UAAUmE,gBAAgBpC;AAAAA,IACzC,eAAe/B,UAAUoE,gBAAgBrC;AAAAA,IACzC,aAAa/B,UAAUqE,cAActC;AAAAA,IACrC,eAAe/B,UAAU6J,gBAAgB9H;AAAAA;AAAAA;0BAKd,IAA0E;AAA1E,eAAE/B;AAAAA;AAAAA,MAAF,IAAcP,kBAAd,IAAcA;AAAAA,IAAZO;AAAAA;SAE/BhC;IACE,KAAK;AAAA,MACH8L,WAAW;AAAA,MACXxD,SAAS;AAAA,MACT1B,QAAQ5E,UAAU,eAAe;AAAA,MACjC0E,SAAS;AAAA,MACTC,YAAY;AAAA,iBAED;AAAA,QACToF,SAAS;AAAA,QACTvI,OAAO;AAAA,QACPwI,QAAQ;AAAA,QACRC,YAAY;AAAA,QACZrG,YAAY;AAAA;AAAA;AAAA,KAGZnE;AAAAA;ACrEV,MAAMyK,kBAAkB,CAACH,YAAuB;MAC1C,OAAOA,YAAY,UAAU;WAE7B/L;MAAM,KAAKmM,0BAAe5E;AAAAA,MAAM,OAAOwE;AAAAA,gBACpCA;AAAAA;AAAAA;SAIAA;AAAAA;MAGIK,OAAOC,WAAK,eAAiB;AAAA,EAAEC;AAAAA,EAAQC;AAAAA,GAA8C;;QAC1FzK,QAAQC;QACRH,WAAWC;QAEXiG,SAAShG,MAAMX,SAAUqB,WAAU;UACjCU,MAAMV,MAAM4G,cAAchG,KAAM0E,aAAWA,QAAO/E,OAAOnB;WAE7DsB,OAAO;AAAA,MACLsB,OAAOtB,IAAIsB;AAAAA,MACXgI,YAAYtJ,IAAIsJ;AAAAA;AAAAA;QAIhBC,WAAW3K,YAAMX,SAAUqB,WAAUA,MAAMf,MAAMgL,cAAtC3K,YAAmDoK;QAC9D1C,OAAO1H,MAAMX,SAAUqB,WAAUA,MAAMkK,gBAAgB9L,IAAI0L;QAC3D3G,sBAAsB7D,MAAMX,SAAUqB,WAAUA,MAAMmD,oBAAoB/E,IAAIgB,WAAW;AAAA,IAAE+K,UAAU;AAAA;wBAE3F;;AAAM7K,8BAAMc,WAAWnB,OAAMmL,gBAAvB9K,6BAAqC,eAAewK,QAAQ1K;AAAAA;QAC5EiL,aAAY9F,SAAUC,OAAM8F,GAAG,GAAGC,eAAe/F,EAAEgG,SAASxD,MAAM+C;MAEpE,CAACzE,UAAU,CAAC0B;WAAa;QAEvBuC,UAAUjE,OAAO0E,WAAW1E,OAAOtD,MAAMgF,OAAOA;SAGpDxJ;IAAK;AAAA,IAAsB,KAAK,CAACmM,0BAAec,MAAMtH;AAAAA,cACnD8G,SAASV,SAASjE,OAAOtD,MAAMgF,OAAOA,MAAM+C;AAAAA;AAAAA;uBCrClB;AAAA,EAAED;AAAAA,EAAQY;AAAAA,GAAmF;QACtHpG,cAAaC,SAAUC,OAAMA,EAAEC,WAAWH;QAC1CqG,WAAUpG,SAAUC,OAAMA,EAAEC,WAAWkG;QACvCC,gBAAerG,SAAUC,OAAMA,EAAEK,MAAM+F;QAEvCtL,QAAQC;QACRsL,aAAavL,MAAMX,SAAUqB,WAAUA,MAAM8K,SAASnF,IAAImE;QAC1DiB,cAAczL,MAAMX,SAAUqB;;AAAU,YAAC,CAACA,aAAMkK,gBAAgB9L,IAAI0L,YAA1B9J,mBAAmCzC,SAASe;AAAAA;qBAE1E;UACV;AAAA,MACJW,OAAO;AAAA,QAAE6L,UAAUE;AAAAA,QAAoBC;AAAAA,QAAeC;AAAAA;AAAAA,MACtDJ;AAAAA,MACAZ;AAAAA,QACE5K,MAAMc;UAEJ+K,cAAc,IAAIzF,IAAIoF;QACxBG;kBAA2BxH;QAC3BoH;kBAAwB5K,OAAO6J;AAAAA,SAC9B;kBACSlE,IAAIkE;YAEV9C,OAAOkD,gBAAgB9L,IAAI0L;iBACtBsB,YAAYpE,OAAOqE,aAAanB,iBAAiBlD,QAAQ,IAAI;oBAC1DpB,IAAIwF;AAAAA;AAAAA;yDAIDD;QAEf,CAACH,oBAAoB;YACjBjL,OAAQC,WAAU;cAChB8K,WAAWK;AAAAA;AAAAA;AAAAA;MAKnBN,cAAcH,uBAAuB,CAACK,aAAa;WAC9CvN,eAAC;MAAQ,KAAK;AAAA,QAAE8N,QAAQ;AAAA;AAAA;AAAA;SAI/B9N,eAAC;IAAW,SAAS6H;AAAAA,cACnB7H;MACE,KAAK;AAAA,QACH0G,SAAS;AAAA,QACTd,YAAY;AAAA,QACZC,WAAWwH,aAAa,6BAA6B;AAAA;AAAA,gBAGvDrN,eAAC;;;;yBClD0B;AAAA,EAAEsM;AAAAA,GAAwC;QACrExK,QAAQC;QACRoF,YAAWJ,SAAUC,OAAMA,EAAEC,WAAWE;QAExC4G,aAAajM,MAAMX,SAAUqB,WAAU;UACrCwL,UAAU1B,SAAS,CAACA,UAAU/L,MAAM0N,KAAKzL,MAAMkK,gBAAgBwB;WAC9D1L,MAAMkK,gBAAgByB,OAAO,KAAKH,QAAQjN,MAAOuL,aAAW9J,MAAM4L,UAAUjG,IAAImE;AAAAA;mBAGzE5I,GAAsB;UAC9B2K,aAAa3K,EAAE4K;UAEf;AAAA,MACJjF;AAAAA,MACAqD;AAAAA,MACA6B;AAAAA,MACAH;AAAAA,MACA3M,OAAO;AAAA,QAAE+M;AAAAA,QAAoBJ,WAAWK;AAAAA,QAAqBC;AAAAA;AAAAA,QAC3D5M,MAAMc;QAEN+L;QACAN,WAAWO,YAAYtC,QAAQ;YAC3BtC,IAAIuE,iBAAiBlF,YAAY9F,UAAWtC,OAAMsN,mBAAmBtN,EAAE8B,MAAM;YAC7E8L,IAAIxF,YAAY9F,UAAWiG,UAASA,KAAKzG,OAAOuJ;cAC9CjD,YAAY5I,MAAMuD,KAAK8K,IAAI9E,GAAG6E,IAAI7K,KAAKyH,IAAIzB,GAAG6E,KAAK;AAAA,WACtD;YACCrF,OAAO8C,SAASI,gBAAgB9L,IAAI0L,UAAUvI;cAC5CyF,OAAO,CAACA,QAAQH;AAAAA;UAGpB0F,eAAe,IAAI7G,IAAIkG;eAClB5E,QAAQmF,OAAO;UACpBZ;qBAAyBtL,OAAO+G,KAAKzG;AAAAA;qBACvBqF,IAAIoB,KAAKzG;AAAAA;QAGzByL,sBAAsBT,YAAY;iBACzBH,YAAYC,aAAanB,iBAAiB,GAAGiC,QAAQ;qBACjDlM,OAAOmL;AAAAA;iBAEXoB,cAAcC,eAAe,GAAGN,QAAQ;qBACpClM,OAAOuM;AAAAA;AAAAA;2DAIJD;QAEhB,CAACN,qBAAqB;YAClBlM,OAAQC,WAAU;cAChB4L,YAAYW;AAAAA;AAAAA;UAIhBxM,OAAQC,WAAU;YAChB+L,iBAAiBjC;AAAAA;AAAAA;SAKzBtM,eAAC;IACC,KAAK;AAAA,MACHkP,aAAa;AAAA,MACb/J,OAAO;AAAA;AAAA,IAET,SAAS4I;AAAAA,IACT,UAAUlG;AAAAA;AAAAA;wBC7DkBmF,SAAyDxD,MAASpE,OAAe;SAC1G,CACL4H,oCAASC,iBAAgBkC,WAAWnC,QAAQC,KAAKzD,MAAMpE,SAAS4H,mCAASC,MACzE7H,QAAQ,MAAM,KAAK4H,oCAASoC,WAC5BhK,QAAQ,MAAM,KAAK4H,oCAASqC;AAAAA;MAInBC,MAAMjD,WAAK,cAAgB;AAAA,EAAEC;AAAAA,EAAQC;AAAAA,GAAkE;QAC5GzK,QAAQC;QACRwN,SAAS5N,aAAuB;QAEhCqL,UAAUjG,SAAUC,OAAMA,EAAEgG;QAE5B;AAAA,IAAEH;AAAAA,IAAW2C;AAAAA,IAAQjC;AAAAA,IAAaL;AAAAA,IAAqBuC;AAAAA,IAAWC;AAAAA,IAAiBC;AAAAA,MAAc7N,MAAMX,SAAUqB,WAAU;;UACzHgH,OAAOhH,MAAMkK,gBAAgB9L,IAAI0L;WAEhC;AAAA,MACLO,WAAWC,GAAG,GAAGC,eAAeC,SAASxD,MAAM+C;AAAAA,MAC/CiD,QAAQhG,OAAOqE,aAAarL,MAAMkK,iBAAiBlD,MAAM2E,OAAO;AAAA,MAChEZ,aAAa,CAAC,CAAC/D,8BAAMzJ,SAASe;AAAAA,MAC9BoM,qBAAqB1D,QAAQhH,mBAAMf,OAAMyL,wBAAZ1K,4BAAkCgH;AAAAA,MAC/DiG,WAAWjN,MAAM4G,cAActG,IAAKgF,YAAWA,OAAO/E;AAAAA,MACtD2M,iBAAiBlN,MAAMf,MAAMiO;AAAAA,MAC7BC,WAAWnN,MAAMf,MAAMkO,qBAAqBR,WAAY3F,OAAOhH,MAAMf,MAAMkO,UAAUnG,MAAM+C,YAAY,OAAQ/J,MAAMf,MAAMkO;AAAAA;AAAAA;kBAIrH,MAAM;UACRtN,MAAMkN,OAAOjN;QACf,CAACD;;UAECuN,IAAI,IAAIC,eAAe,MAAM;UAC7B,CAAC5F,SAAS6F,SAASzN;;YACjBE,OAAQC,WAAU;cAChBuN,WAAW7O,IAAIoL,QAAQjK,IAAI2N;AAAAA;AAAAA;MAGnCC,QAAQ5N;WAEH,MAAMuN,EAAEM;AAAAA,KACd,CAACX,OAAOjN;wBAEK;;AAAMR,6BAAMc,WAAWnB,OAAMmL,gBAAvB9K,4BAAqC,cAAcwK;AAAAA;SAGvE7F;eACEzG;MAAK;AAAA,MAAsB,KAAK,CAACmM,0BAAegE;AAAAA,MAAW,KAAKZ;AAAAA,QAEhE9I;MAAK;AAAA,MAAsB,KAAK,CAAC0F,0BAAec,MAAMd,0BAAeiE;AAAAA,iBACnEpQ;QAAK,KAAK;AAAA,UAAEwD,OAAOgM,SAAS;AAAA;AAAA,UAE3BE,mBAAmB1P,eAAC;QAAgB;AAAA,0BAEpBkN,wBAAwBlN,eAAC;QAAc;AAAA,QAAgB;AAAA,UAEvE2P;AAAAA,QAGFF,UAAU3M,IAAKlB,cACd5B,eAAC,cAAc;MAAwB,OAAO4B;AAAAA,gBAC5C5B,eAAC;QAAK;AAAA,QAAgB;AAAA;AAAA,OADK4B,YAK/B5B;MAAK;AAAA,MAAsB,KAAK,CAACmM,0BAAegE;AAAAA;AAAAA;AAAAA;uBCvErB;AAAA,EAAEpQ;AAAAA,GAAkD;QAC7E+B,QAAQC;QACRH,WAAWC;QACXwO,SAAQtJ,SAAUC,OAAMA,EAAEC,WAAWoJ;QACrCC,eAAcvJ,SAAUC,OAAMA,EAAEK,MAAMiJ;QAEtC;AAAA,IAAEC;AAAAA,IAAWnL;AAAAA,MAAUtD,MAAMX,SAAUqB,WAAU;;UAC/C4C,SAAQ5C,YAAMgO,KAAKjN,UAAWkN,OAAMA,EAAE7O,aAAaA,cAA3CY,YAAwD;WAC/D;AAAA,MACL+N,WAAW/N,YAAMgO,KAAKpL,YAAX5C,mBAAmB+N;AAAAA,MAC9BnL,OAAOA,UAAS,KAAK5C,MAAMgO,KAAK1P,SAAS,IAAIsE,SAAQ,IAAIrB;AAAAA;AAAAA;mBAI7CL,GAAqBgN,KAAe;UAC5C;AAAA,MACJjP,OAAO;AAAA,QAAE+O,MAAMG;AAAAA,QAAgBC;AAAAA;AAAAA,QAC7B9O,MAAMc;UAEJiO,eAAeN,cAAc,QAAQ,SAAS;UAC9CO,UAAUpN,EAAEkI,iBAAiB,cAAc8E,MAAM5O,MAAMc,WAAW4N,KAAKvN,OAAQwN,OAAMA,EAAE7O,aAAaA,YAAY;QAClH,CAAC8O,KAAK;cACAK,KAAK;AAAA,QACXnP;AAAAA,QACA2O,WAAWM;AAAAA;AAAAA;iDAIAC;QAEX,CAACH,gBAAgB;YACbpO,OAAQC,WAAU;cAChBgO,OAAOM;AAAAA;AAAAA;MAIf1F;WACK;AAAA;SAIP3E;IACE,KAAK;AAAA,MACHP,YAAY;AAAA,MACZQ,SAAS;AAAA,MACTsK,qBAAqB;AAAA,MACrBrK,YAAY;AAAA,MACZC,QAAQ;AAAA,iBAEG;AAAA,QACTqK,UAAU;AAAA,QACVC,cAAc;AAAA;AAAA;AAAA,IAGlB,SAAUxN,OAAMmE,QAAOnE;AAAAA,IACvB,eAAgBA,OAAMmE,QAAOnE,GAAG;AAAA,eAEhC1D;;QAEAA,eAAC;MAAM,cAAcoF;AAAAA,gBACnBpF;QACE,KAAK,CACH;AAAA,UAAE4F,YAAY;AAAA,UAAauL,UAAU;AAAA,WACrC,CAACZ,aAAa;AAAA,UAAEa,SAAS;AAAA,WACzBb,cAAc,UAAU;AAAA,UAAE1K,WAAW;AAAA;AAAA,kBAGvC7F,eAAC;;;;;kBCtET,IACA,IAC0D;MACtD,OAAO;MACP;MACA;iBAEW;UACP,OAAO;WAEN,KAAK;eACD;cACD;OAGP,GAAG;AAAA;SAGD,OAAO,OACZ,YAAa,MAAY;UACjB,MAAM,KAAK;eACN;QAEP;AAAS;AAAA,aAEF,MAAM,OAAO,IAAI;gBAChB,WAAW,KAAK,OAAO,KAAK;AAAA,WACjC;;;KAIT;AAAA,IACE,QAAQ;UACF,UAAU;;;;IAKhB,SAAS;UACH,SAAS;qBACE;AAAA;AAAA;AAAA;AAAA;ACpCvB,MAAMqR,iBAAiB,CAACrQ,MAAgC;QAChDuK,SAASvK,EAAEwK;MACb,CAACD;WAAetB,SAASqH;MACzB/F,OAAOgG,eAAehG,OAAOiG,gBAAgB7M,iBAAiB4G,QAAQkG,cAAc;WAAkBlG;SACnG8F,eAAe9F;AAAAA;AAGxB,MAAMmG,iBAAiB,CAAC1Q,GAAgB2Q,MAA2B;MAC7D3Q,EAAE4Q,iBAAiBD,EAAEC,gBAAgB,CAAC5Q,EAAE4Q;WAAqB5Q,EAAE6Q,YAAYF,EAAEE;MAC7E7Q,EAAE4Q,wBAAwBE;WAAoBJ,eAAe1Q,EAAE4Q,cAAcD,KAAK3Q,EAAE6Q;SACjF;AAAA;qBAGsB,IAIgG;AAJhG,eAC7BpJ;AAAAA;AAAAA,IACA1I;AAAAA,MAF6B,IAG1B0B,kBAH0B,IAG1BA;AAAAA,IAFHgH;AAAAA,IACA1I;AAAAA;;QAGM+B,QAAQC;QACRgQ,UAAUjQ,MAAMX,SAAS;QACzB6Q,WAAWrQ,aAAuB;QAClC,GAAGsQ,cAAc9Q,eAAS;QAE1B;AAAA,IACJ6M,UAAU;AAAA,IACVC,OAAO;AAAA,IACPiE;AAAAA,IACAC,SAAS;AAAA,IACTC,QAAQ;AAAA,MACNtQ,MAAMX,SACPqB,WAAU;;UACHwL,WAAUxL,MAAM6G,YAAYvG,IAAK0G,UAASA,KAAKzG;UAC/CsP,OAAOL,SAAS1P,WAAW+O,eAAeW,SAAS1P;QACrD,CAACE,MAAMf,MAAMsQ;aAAgB;AAAA,QAAE/D;;QAC/B,CAACgE,SAAS1P,WAAW,CAAC+P,QAAQ,CAACpI,SAAS6F,SAASuC;aAAc;UAE7D;AAAA,MACJC;AAAAA,MACAC;AAAAA,MACAC,WAAW;AAAA,MACXC;AAAAA,MACAC;AAAAA,qBACSjR,MAAMsQ,mBAAmBtN,SAASjC,MAAMf,MAAMsQ,UAAUhO,wBAAc;QAE7E4O,cAAc;UACZ5C,aAAa/B,SAAQlL,IAAI,CAACwJ,QAAQlH,UAAU;;YAC1CwN,IAAIN,8CAAa9P,MAAMuN,WAAWnP,IAAI0L,YAAlCgG,aAA6CC,oBAA7CD,uBAA2E,IAAI,MAAMK,cAAcvN;qBAC9FwN;aACRA;AAAAA;UAGHC,cAAcnB,eAAeM,SAAS1P,SAAS+P;UAC/CS,eAAed,SAAS1P,QAAQuP;UAChCkB,aAAaV,KAAKW,YAAYH,cAAcC;UAC5CG,gBAAgBF,aAAaV,KAAKb,eAAesB;QAEnD7E,QAAO,GACTiE,MAAKlE,SAAQlN,QACbqR,UAAS,GACTC,SAAQ;eACCQ,KAAK7C,YAAY;UACtBoC,UAASS,IAAIG,kDAA6BP;;;iBAEpCI;AAAAA;eAGDA,KAAK7C,WAAWmD,WAAW;UAChCd,SAAQQ,IAAID,cAAcM,2DAAmCT;;;gBAExDI;AAAAA;WAGJ;AAAA,MAAE5E,SAASA,SAAQvN,MAAMwN,OAAMiE;AAAAA,MAAKjE;MAAMiE;MAAIC;MAAQC;;KAE/D;AAAA,IAAEzF,UAAU;AAAA;QAGRwG,oCAAyBpB,YAAY,YAAYhO,SAAYgO,+BAAUoB,+BAAkB;QACzFC,aAAanT,cAAQ,MAAM0M,SAAS,MAAMsF,WAAYoB,OAAMA,IAAI,IAAIF,iBAAiB,CAACA;kBAElF,MAAM;QACV,CAACpB,WAAW,CAACC,SAAS1P;;WAEnBgR,iBAAiB,UAAUF,YAAY;WACvCE,iBAAiB,UAAUF,YAAY;WACvC,MAAM;aACJG,oBAAoB,UAAUH,YAAY;aAC1CG,oBAAoB,UAAUH,YAAY;AAAA;AAAA,KAElD,CAACpB,SAAS1P,SAAS8Q;kBAEZ,MAAMA,WAAWI,QAAQ,CAACJ;wBAEpB;;AAAMtR,+BAAMc,WAAWnB,OAAMmL,gBAAvB9K,8BAAsC,wBAAuBmM,WAAWiE;AAAAA;SAG5FzL,wDAAShF;eACNgH,QAEAsJ,WAAW/R;MAAK,OAAO;AAAA,QAAEyT,YAAY;AAAA,QAAUzH,QAAQmG;AAAAA;AAAAA,MAAU,KAAKH;AAAAA,QAEtEjS,SAASiO,SAASC,OAElB8D,WAAW/R;MAAK,OAAO;AAAA,QAAEyT,YAAY;AAAA,QAAUzH,QAAQoG;AAAAA;AAAAA;AAAAA;AAAAA;MCxFjDsB,eAAe7T,oBAAqD;MACpE8T,gBAAgB9T,oBAAyB;2BACa;QAC3D2E,QAAQrE,iBAAWuT;MACrB,CAAClP;UAAaoP,MAAM;SACjBpP;AAAAA;4BAE8B;QAC/BA,QAAQrE,iBAAWwT;MACrBnP,UAAU;UAAYoP,MAAM;SACzBpP;AAAAA;eAGgB/C,OAAmC;QACpDK,QAAQ+R,cAAcpS;wBAEZ;;AAAMK,6BAAMc,WAAWnB,OAAMmL,gBAAvB9K,4BAAqC;AAAA;SAGzD9B,eAAC,aAAa;IAAS,OAAO8B;AAAAA,cAC5B9B,eAAC;gBACCA,eAAC;;;;AAMT,6BAA6B;QACrB8T,cAAc/M,SAAUC,OAAMA,EAAEO,KAAKwM;QACrCC,aAAaC;QACb,CAACC,aAAaC,kBAAkBhT,eAAS;kBAErC,MAAM;UACRiT,SAASC,WAAW,MAAMF,eAAe,OAAO;WAC/C,MAAMG,aAAaF;AAAAA;SAI1B3N;eACG,CAACuN,cAAcE,eAAelU;gBAAM8T;AAAAA,QACrC9T,eAAC;MAAW,QAAQ,CAACgU;AAAAA;AAAAA;AAAAA;AAK3B,MAAMO,aAAalI,WAAK,qBAAuB;AAAA,EAAEmI;AAAAA,GAA+B;QACxE1S,QAAQC;QACR0S,YAAY3S,MAAMX,SAAS;QAC3BiI,gBAAgBtH,MAAMX,SAAUqB,WACpCA,MAAM4G,cAActG,IAAKgF;IACvB/E,IAAI+E,OAAO/E;AAAAA,IACXS,OAAOsE,OAAOtE;AAAAA,IACdwJ,SAASlF,OAAOkF;AAAAA,IAChBvE,QAAQX,OAAOW;AAAAA;QAGbiD,eAAe5J,MAAMX,SAAS,gBAAgB;AAAA,IAAEwL,UAAU;AAAA;QAC1DhH,sBAAsB7D,MAAMX,SAAS,uBAAuB;AAAA,IAAEwL,UAAU;AAAA;QAExEK,UAAUlL,MAAMX,SAAS;QACzBuT,eAAe5S,MAAMX,SAAS;QAC9BuO,kBAAkB5N,MAAMX,SAAS;QACjCwT,wBAAwB7S,MAAMX,SAAS;QACvC2I,eAAehI,MAAMX,SAAUqB,WAAU,CAAC,CAACA,MAAMf,MAAMqI,aAAaH,QAAQ,CAAC,CAACnH,MAAMf,MAAMqI,aAAaC;QACvGvC,eAAeC;wBAEL;;AAAM3F,6BAAMc,WAAWnB,OAAMmL,gBAAvB9K,4BAAqC;AAAA;SAGzD9B,eAAC;IACC,WAAWgN,mCAASlL;AAAAA,IACpB,KAAK,CACH0F,cACA2E,0BAAerK,OACf;AAAA,MACEkP,qBAAqB;AAAA,QAEnByD,cAAc,WAAWA,cAAc,OAAO,SAAS;AAAA,QACvD;AAAA,QACA,GAAGrL,cAActG,IAAKgF;;AAAW4D,0CAAa9K,IAAIkH,OAAO/E,QAAxB2I,YAA+B5D,OAAOtE,UAAtCkI,YAA+C;AAAA;AAAA,QAChF+I,cAAc,UAAUA,cAAc,OAAO,SAAS;AAAA,QACtDG,KAAK;AAAA,OAETJ,UAAU;AAAA,MAAEK,YAAY;AAAA;AAAA,IAE1B,QACEpO;iBACEzG;QACE,WAAWgN,mCAAS8H;AAAAA,QACpB,KAAK,CAAC3I,0BAAe4I,YAAYL,gBAAgBvI,0BAAe6I,QAAQN,wBAAwBjQ,UAAUiQ;AAAAA,UAG5GjO;QACE,WAAWuG,mCAAS8H;AAAAA,QACpB,KAAK,CAAC3I,0BAAe2I,YAAYJ,gBAAgBvI,0BAAe6I,QAAQN,wBAAwBjQ,UAAUiQ;AAAAA,mBAEzGhF,mBAAmB1P,eAAC,sBAEpB2U,yBAAyB3U,eAAC,sBAE1B8J,gBAAgB9J,eAAC2I,eAClB3I,eAAC;UAGHA,eAAC,oBAAoB;kBAClBoJ,cAActG,IAAKgF;;AAClB9H,gCAAC,cAAc;YAAyB,OAAO8H,OAAO/E;AAAAA,sBACpD0D,gBAAC;cACC,WAAWqG,GAAGE,mCAAS8H,YAAYhN,aAAOkF,YAAPlF,mBAAgBgN;AAAAA,cACnD,KAAK,CACH3I,0BAAe2I,YACfnP,oBAAoB/E,IAAIkH,OAAO/E,KAC/B2R,gBAAgBvI,0BAAe6I,QAC/BN,wBAAwBjQ,UAAUiQ;AAAAA,yBAIpC1U,eAAC;0BAAe8H,OAAOW;AAAAA,kBACvBzI;gBAAK,KAAK;AAAA,kBAAEiV,MAAM;AAAA;AAAA,kBAClBjV,eAAC,oBACDA,eAAC;eALI8H,OAAO/E;AAAAA,aATa+E,OAAO/E;AAAAA;AAAAA,UAoBxC/C;QACE,WAAWgN,mCAAS8H;AAAAA,QACpB,KAAK,CAAC3I,0BAAe4I,YAAYL,gBAAgBvI,0BAAe6I,QAAQN,wBAAwBjQ,UAAUiQ;AAAAA;AAAAA;AAAAA,cAK/G,CAAC1G,SAASkH,eAAelH,QAAQlL,IAAI,CAACwJ,QAAQlH,UAAUpF,eAAC;MAAiB;AAAA,MAAgB,UAAUkV,aAAa9P;AAAAA,OAA/CkH;AAAAA;AAAAA;MCvJ5D,gBAAsC;AAAA,EACjD,SAAS,EAAE,MAAM,WAAW,OAAO,WAAW,cAAc;AAAA,EAC5D,WAAW,EAAE,MAAM,WAAW,OAAO,WAAW,cAAc;AAAA;iBCFxC;AAAA,EAAEO;AAAAA,GAAqC;SAE3DpG;IACE;AAAA,IACA,KAAK0O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAqCLnV,2BACAA,2BACAA;;;MC3COqQ,QAA2C,CAAC;AAAA,EAAE+E;AAAAA,EAAcrV;AAAAA,MAAe;MAClF,CAACsV;WAAa;SAGhB5O;IACE,KAAK;AAAA,MACHC,SAAS;AAAA,MACT3B,UAAU;AAAA,MACVuQ,YAAY;AAAA,MACZC,eAAe;AAAA;AAAA,eAGhBxV,UAEDC;MACE,KAAK,CACH;AAAA,QACEkF,KAAK;AAAA,QACLsQ,OAAO;AAAA,QACP3P,WAAW;AAAA,QACX4P,iBAAiB;AAAA,QACjBzJ,QAAQ;AAAA,QACRtF,SAAS;AAAA,QACT4B,SAAS;AAAA,QACTxC,QAAQ;AAAA,QACRf,UAAU;AAAA,QACV2Q,UAAU;AAAA,QACVC,UAAU;AAAA,QACV/P,YAAY;AAAA,QACZe,YAAY;AAAA,QACZiP,YAAY;AAAA,QACZC,cAAc;AAAA,QACdC,cAAc;AAAA,QACdpL,gBAAgB;AAAA,QAChByG,UAAU;AAAA,SAEZ,CAACiE,gBAAgB;AAAA,QACfvP,WAAW;AAAA,QACXD,YAAY;AAAA;AAAA,gBAIfwP;AAAAA;AAAAA;AAAAA;MCzCI1M,SAA6C,CAAC,OAAwD;AAAxD,eAAEqN;AAAAA;AAAAA,IAAWhW;AAAAA,IAAUiW,UAAU;AAAA,MAAjC,IAA4CvU,kBAA5C,IAA4CA;AAAAA,IAA1CsU;AAAAA,IAAWhW;AAAAA,IAAUiW;AAAAA;SAE9EvP;IACE,KAAK,CACH;AAAA,MACE6B,SAAU;AAAA,MACV5B,SAAS;AAAA,MACTC,YAAY;AAAA,MACZf,YAAY;AAAA,MACZqQ,QAAQ;AAAA,MACRrP,QAAQ;AAAA,MACRqF,YAAY;AAAA,MACZ6J,cAAc;AAAA,iCAEa;AAAA,QACzBjQ,WAAW;AAAA;AAAA,OAGfmQ,YAAY,UAAU;AAAA,iBACT;AAAA,QACT/J,YAAY;AAAA;AAAA,OAGhB+J,YAAY,cAAc;AAAA,MACxBC,QAAS,aAAYC;oBAEP;AAAA,QACZC,aAAaC;;OAGjBJ,YAAY,eAAe;AAAA,MACzB7Q,OAAO;AAAA,MACPkR,iBAAiB;AAAA,MACjBrR,WAAW;AAAA,iBAEA;AAAA,QACT/B,QAAQ;AAAA;AAAA,oBAGI;AAAA,QACZA,QAAQ;AAAA,QACRmO,SAAS;AAAA;AAAA;AAAA,KAIX3P;eAEHsU,aAAa/V;MAAM,KAAK;AAAA,QAAEsW,aAAc;AAAA;AAAA,gBAA8BP;AAAAA,QACvE/V;;;;;MCjDOmH,WAAiD,CAAC,OAA4B;AAA5B,eAAE0F;AAAAA;AAAAA,MAAF,IAAgBpL,kBAAhB,IAAgBA;AAAAA,IAAdoL;AAAAA;SAE7DpG;IACE,KAAK,CACH;AAAA,MACE6B,SAAS;AAAA,MACT5B,SAAS;AAAA,MACTvB,OAAO;AAAA,MACPe,YAAY;AAAA,iBAED;AAAA,QACTqQ,YAAY;AAAA,QACZzI,QAAQ;AAAA;AAAA,OAGZrM,MAAM+E,YAAY;AAAA,MAAErB,OAAO;AAAA;AAAA,IAE7B;AAAA,eAEAnF;MAAO,MAAK;AAAA,OAAeyB,SAE1BA,MAAM+U,UACLxW;MACE,KAAK;AAAA,QAAEmR,UAAU;AAAA,QAAW3N,OAAO;AAAA,QAAOwI,QAAQ;AAAA,QAAOyK,MAAM;AAAA;AAAA,MAC/D,WAAU;AAAA,MACV,SAAQ;AAAA,qBACI;AAAA,gBAEZzW;QAAM,GAAE;AAAA;AAAA,SAGVA;MACE,KAAK;AAAA,QAAEmR,UAAU;AAAA,QAAW3N,OAAO;AAAA,QAAOwI,QAAQ;AAAA,QAAOyK,MAAM;AAAA;AAAA,MAC/D,WAAU;AAAA,MACV,SAAQ;AAAA,qBACI;AAAA,gBAEZzW;QAAM,GAAE;AAAA;AAAA;AAAA;AAAA;MCrCL8G,aAAsDrF,WAAU;SAEzEzB;IACE,KAAK;AAAA,MACHsI,SAAS;AAAA,MACTwN,cAAc;AAAA,MACdpP,SAAS;AAAA,MACTgE,gBAAgB;AAAA,MAChB/D,YAAY;AAAA,MACZf,YAAY;AAAA,MACZqQ,QAAQ;AAAA,MACRrP,QAAQ;AAAA,MACRzB,OAAO;AAAA,MACP8G,YAAY;AAAA,iBAED;AAAA,QACToK,iBAAiB;AAAA;AAAA,kBAGP;AAAA,QACVK,gBAAgB;AAAA;AAAA;AAAA,KAGhBjV;AAAAA;MCrBGkV,YAAmD,CAAC,OAA+C;AAA/C,eAAEC;AAAAA;AAAAA,IAAS/J;AAAAA,IAAWgK;AAAAA,MAAtB,IAAmCpV,kBAAnC,IAAmCA;AAAAA,IAAjCmV;AAAAA,IAAS/J;AAAAA,IAAWgK;AAAAA;;QAC/E,CAACC,OAAOC,YAAY5V,eAAS;SAGjCnB;IAAK;AAAA,IAAsB,KAAK;AAAA,MAAE0G,SAAS;AAAA;AAAA,cACzCD;MACE,KAAK,CACH;AAAA,QACEwO,MAAM;AAAA,QACNvO,SAAS;AAAA,QACTC,YAAY;AAAA,QACZsP,QAAS,aAAYC;QACrBJ,cAAc;AAAA,SAEhBgB,SAAS;AAAA,QAAEb,QAAQ;AAAA,QAAgCnI,QAAQ;AAAA;AAAA,iBAG7D9N;QACE,KAAK6W;AAAAA,SACDpV;QACJ,OAAOA,YAAM+C,UAAN/C,YAAe;AAAA,QACtB,SAAS,MAAMsV,SAAS;AAAA,QACxB,QAAQ,MAAMA,SAAS;AAAA,QACvB,KAAK;AAAA,UACH9B,MAAM;AAAA,UACNgB,QAAQ;AAAA,UACRe,SAAS;AAAA,UACTlB,cAAc;AAAA,UACdxN,SAAS;AAAA,UACT2O,cAAc;AAAA,UACdrR,YAAY;AAAA;AAAA,WAIfgR;AAAAA;AAAAA;AAAAA;MC7BI,oBAA8C;AAAA,EACzD;AAAA,EACA;AAAA,WACA1P;EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;ACZF,MAAMgQ,mBAAmB/B,YAAI;AAAA,EAC3B3R,OAAO;AAAA,EACPwI,QAAQ;AAAA,EACR7G,OAAO;AAAA;AAGT,cAAcgS,KAAkB;SACvB,CAAC1V,UACNzB,eAACoX;cACE,CAAC;AAAA,MAAEjC;UACFkC,mBAAaF,KAAK,iCACb1V,QADa;AAAA,MAEhBoL,WAAWsI,KAAI+B,kBAAkBzV,MAAMoL;AAAAA;AAAAA;AAAAA;AAOjD,MAAMzF,WAAWkQ,KACf7Q;EAAK,OAAM;AAAA,EAA6B,QAAO;AAAA,EAAO,SAAQ;AAAA,EAAY,OAAM;AAAA,EAAO,MAAK;AAAA,aAC1FzG;IAAM,GAAE;AAAA,IAAkB,MAAK;AAAA,MAC/BA;IAAM,GAAE;AAAA;AAAA;AAIZ,MAAM2I,SAAS2O,KACb7Q;EACE,OAAM;AAAA,EACN,kBAAiB;AAAA,EACjB,QAAO;AAAA,EACP,SAAQ;AAAA,EACR,OAAM;AAAA,EACN,MAAK;AAAA,aAELzG;cACEA;MAAM,MAAK;AAAA,MAAO,QAAO;AAAA,MAAK,OAAM;AAAA;AAAA,MAEtCA;cACEA;MAAM,GAAE;AAAA;AAAA;AAAA;AAKd,MAAM4I,YAAY0O,KAChB7Q;EAAK,OAAM;AAAA,EAA6B,QAAO;AAAA,EAAO,SAAQ;AAAA,EAAY,OAAM;AAAA,EAAO,MAAK;AAAA,aAC1FzG;IAAM,GAAE;AAAA,IAAkB,MAAK;AAAA,MAC/BA;IAAM,GAAE;AAAA;AAAA;AAIZ,MAAMoN,eAAekK,KACnB7Q;EAAK,OAAM;AAAA,EAA6B,QAAO;AAAA,EAAO,SAAQ;AAAA,EAAY,OAAM;AAAA,EAAO,MAAK;AAAA,aAC1FzG;IAAM,GAAE;AAAA,IAAkB,MAAK;AAAA,MAC/BA;IAAM,GAAE;AAAA;AAAA;AAIZ,MAAMuX,SAASD,KACb7Q;EAAK,OAAM;AAAA,EAA6B,QAAO;AAAA,EAAO,SAAQ;AAAA,EAAY,OAAM;AAAA,EAAO,MAAK;AAAA,aAC1FzG;IAAM,GAAE;AAAA,IAAkB,MAAK;AAAA,MAC/BA;IAAM,GAAE;AAAA;AAAA;AAIZ,MAAMwX,QAAQF,KACZ7Q;EAAK,OAAM;AAAA,EAA6B,QAAO;AAAA,EAAO,SAAQ;AAAA,EAAY,OAAM;AAAA,EAAO,MAAK;AAAA,aAC1FzG;IAAM,GAAE;AAAA,IAAkB,MAAK;AAAA,MAC/BA;IAAM,GAAE;AAAA;AAAA;AAIZ,MAAM6K,gBAAgByM,KACpB7Q;EAAK,OAAM;AAAA,EAA6B,QAAO;AAAA,EAAO,SAAQ;AAAA,EAAY,OAAM;AAAA,EAAO,MAAK;AAAA,aAC1FzG;IAAM,GAAE;AAAA,IAAkB,MAAK;AAAA,MAC/BA;IAAM,GAAE;AAAA;AAAA;AAIZ,MAAM4K,aAAa0M,KACjBtX;EAAK,SAAQ;AAAA,YACXA;IACE,MAAK;AAAA,IACL,GAAE;AAAA;AAAA;AAKR,MAAMsQ,cAAcgH,KAClB7Q;EAAK,OAAM;AAAA,EAA6B,QAAO;AAAA,EAAO,SAAQ;AAAA,EAAY,OAAM;AAAA,EAAO,MAAK;AAAA,aAC1FzG;IAAM,GAAE;AAAA,IAAkB,MAAK;AAAA,MAC/BA;IAAM,GAAE;AAAA;AAAA;MAICyX,eAAoC;AAAA,EAC/CrQ;AAAAA,EACAuB;AAAAA,EACAC;AAAAA,EACAwE;AAAAA,EACAmK;AAAAA,EACAC;AAAAA,EACA3M;AAAAA,EACAD;AAAAA,EACA0F;AAAAA;MC1GWoH,eAAmC;AAAA,EAC9CpQ,eAAe;AAAA,EACfqQ,WAAW;AAAA,EACX9O,aAAa;AAAA,EACbC,YAAY;AAAA,EACZC,gBAAgB;AAAA,EAChB6O,OAAO;AAAA,EACPC,UAAU;AAAA,EACVC,OAAO;AAAA,EACP/D,SAAS;AAAA,EACTgE,UAAWC,WAAW,GAAEA;AAAAA;MCNbC,oBAAgC;AAAA,EAC3C1Q,MAAMmQ;AAAAA,EACNzQ,YAAYiR;AAAAA,EACZ7Q,OAAOoQ;AAAAA,EACPU,QAAQC;AAAAA,EACRC,SAAS;AAAA;ACHX,MAAM,aAAa,IAAIhX,cAAM;kBAEE,UAAkD;;QACzE,oBAAoBlB,iBAAWmY;QAC/B,QAAQnY,iBAAW;QACnB,WAAWA,iBAAW;QACtB,OAAO;QAEP,UAAU,CAAC,MAA4C;;UACrD,OAAO,SAAE,YAAF,oBAAW;UAClB,WAAW,EAAE,KAAK;WAEjB,iCACF,IADE;AAAA,MAEL,SAAS,iCACJ,EAAE,UADE;AAAA,QAEP,MAAM,gBAAgB,YAAY,MAAM,QAAQ,QAAQ,KAAK,sBAAsB,QAAQ;AAAA;AAAA,MAE7F,MAAM,iCACD,EAAE,OADD;AAAA,QAEJ,UAAU,oBAAoB,YAAY,MAAM,QAAQ,YAAY,KAAK,uBAAuB,YAAY;AAAA;AAAA;AAAA;QAK5G,QACJ,2CAAO,SAAS,CAAC,UAAU;UACnB,aAAa;AAAA,MACjB,MAAM,MAAM,MAAM;AAAA,MAClB,SAAS,MAAM,MAAM;AAAA,MACrB,YAAY,MAAM,MAAM;AAAA,MACxB,OAAO,MAAM,MAAM;AAAA,MACnB,QAAQ,MAAM,MAAM;AAAA,MACpB,SAAS,MAAM,MAAM;AAAA;UAGjB,SAAS,MAAM,cAAc,KAAK,CAAC,YAAW,QAAO,OAAO;UAC5D,eAAe;AAAA,MACnB,SAAS,iCAAQ;AAAA;UAGb,SAAQoY,uBAAY,mBAAmBC,6BAAkB,mBAAmB,YAAY;WAEvF,SAAS,QAAQ;AAAA,SAjB1B,YAmBA,WAAW,eAnBX,YAoBA,SAAS,QAAQD,uBAAY,mBAAmBC,6BAAkB;SAE7D;AAAA;4BCjD0B/W,OAAgC;QAC3DkV,aAAY5P,SAAUC,OAAMA,EAAEC,WAAW0P;QAEzCjV,MAAMC,aAAyB;QAC/B;AAAA,IAAE8W;AAAAA,MAAYtY,iBAAWuY;wBAEf,MAAM;QAChBD,WAAW/W,IAAIY,SAAS;UACtBA,QAAQwU;AAAAA;AAAAA,KAEb,CAAC2B;SAEGzY,eAAC,6CAAcyB;IAAO,UAAUC;AAAAA;AAAAA;ACjBzC,MAAMmL,YAAY;AAElB,MAAM8L,cAAc,IAAIC,KAAK,MAAM,GAAG;AAEtC,MAAMC,iBAAiB,CAACC,SACtBA,SAAS,SAASA,SAAS,WAAWA,SAAS;AAEjD,MAAMC,iBAAiB;AAAA,EACrBC,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,MAAM;AAAA;AAGR,MAAMC,aAAa;AAAA,EACjBH,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,MAAME;AAAAA;AAGR,MAAMtY,SAAS,CAACgY,MAAgCtU,UAAkBR,KAAKyH,IAAIjH,MAAM1D,QAAQiY,eAAeD;AAExG,MAAMO,UAAU,CAAC3V,MAAe;QACxB4V,MAAM/Y,MAAM0N,KAAKhE,SAASsP,iBAAkB,IAAG1M;QAC/CzH,QAAQkU,IAAIjU,QAAQ3B;QACpB8V,OAAOF,aAAa,KAAKA,IAAIxY;MAE/B0Y,gBAAgB1H,aAAa;SAC1BgF;AAAAA;AAAAA;mBAIiB;AAAA,EAAEtS;AAAAA,EAAOiV;AAAAA,EAAUC;AAAAA,GAA0F;QAC/H,CAACC,UAAUC,eAAezY;QAE1B0Y,SAAS,MAAM;QACf,CAACF,UAAU;;;gBAIH5V;QAER,CAAC4V,SAASnV,OAAO;eACV;;;UAILyD,WAAWzD,QAAQ,IAAIoU,KAAKpU,SAAS,IAAIoU;QAC3Ce,SAASb,SAAS,OAAO;eAClBgB,QAAQC,OAAOJ,SAASnV;AAAAA,eACxBmV,SAASb,SAAS,SAAS;eAC3BkB,SAASD,OAAOJ,SAASnV,SAAS;AAAA,eAClCmV,SAASb,SAAS,QAAQ;eAC1BmB,YAAYF,OAAOJ,SAASnV;AAAAA;aAG9ByD;AAAAA;QAGLiS,SAASja,cACb,MACE,IAAIka,KAAKC,eAAeV,QAAQ;AAAA,IAC9BV,KAAK;AAAA,IACLC,OAAO;AAAA,IACPC,MAAM;AAAA,MAEV,CAACQ;QAEGW,QAAQH,OAAOI,cAAc9V,wBAASmU;QACtC4B,UAAU,CAAC/V;SAGfxE;IACE,KAAK;AAAA,MACH0G,SAAS;AAAA,MACTC,YAAY;AAAA;AAAA,cAGb0T,MAAMvX,IAAI,CAAC;AAAA,MAAEgW;AAAAA,MAAMtU;OAASY,UAC3BpF,eAACwa;gBACE3B,eAAeC,QACd9Y;QACE;AAAA,QACA,KAAK;AAAA,UACHwD,OAAQ,GAAE1C,OAAOgY,MAAMtU;AAAAA,UACvBiW,WAAW;AAAA,UACXxJ,UAAU;AAAA,UACVgF,QAAQ;AAAA,UACRyE,cAAc;AAAA,UACd1D,SAAS;AAAA,UACT7F,UAAU;AAAA,qBAEC;AAAA,YACTuJ,cAAc;AAAA;AAAA;AAAA,QAGlB,aAAa,GAAGC,OAAO7Z,OAAOgY,MAAMtU,SAAQ;AAAA,QAC5C,OAAOmV,sCAAUb,UAASA,OAAOa,SAASnV,QAAQ,CAAC+V,UAAU/V,SAAQ;AAAA,QACrE,UAAWd,OAAM;sBACH;AAAA,YAAEoV;AAAAA,YAAMtU,OAAOd,EAAE2H,OAAO7G;AAAAA;cAChCd,EAAE2H,OAAO7G,MAAM1D,UAAUqY,WAAWL,OAAO;uBAClC,MAAMO,QAAQ3V,EAAE2H;AAAAA;AAAAA;AAAAA,QAG/B,SAAU3H,OAAMA,EAAE2H,OAAOuP;AAAAA,QACzB,QAAQf;AAAAA,WAERf,SAAS,YACX9Y;kBAAOwE;AAAAA,WACL;AAAA,OA9BSY;AAAAA;AAAAA;AC3DvB,MAAMyV,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;MAGvBC,aAAa,CAACC,MAAY,IAAInC,KAAKmC,EAAEC,eAAeD,EAAEE,YAAYF,EAAEG;MAGpEC,WAAW,CAACJ,MAAY,IAAInC,KAAKmC,EAAEC,eAAeD,EAAEE,YAAYF,EAAEG,YAAY,GAAG,GAAG,GAAG,GAAG;MAE1FtD,QAAQ,MAAiB;QAC9BA,SAAQkD,WAAW,IAAIlC;SACtB;AAAA,IAAE9J,KAAK8I;AAAAA,IAAOnM,KAAKmM;AAAAA;AAAAA;MAGfC,WAAW,CAACuD,iBAAiB,MAAiB;QACnDC,MAAM,IAAIzC;QACV9J,MAAM,IAAI8J,KAAKyC;MAEjBC,OAAOxM,IAAIyM,WAAWH;MACtBE,OAAO,GAAG;YACJ;AAAA;MAENxB,QAAQhL,IAAIoM,YAAYI;QAEtB7P,MAAM,IAAImN,KAAK9J;MACjBgL,QAAQrO,IAAIyP,YAAY;SAErB;AAAA,IAAEpM,KAAKgM,WAAWhM;AAAAA,IAAMrD,KAAK0P,SAAS1P;AAAAA;AAAAA;uBAIjBzB,GAA4B6E,GAA4B;MAChF7E,aAAa4O,MAAM;QACjB;AAAA,MAAE9J,KAAK9E;AAAAA,MAAGyB,KAAKzB;AAAAA;AAAAA;MAEjB6E,aAAa+J,MAAM;QACjB;AAAA,MAAE9J,KAAKD;AAAAA,MAAGpD,KAAKoD;AAAAA;AAAAA;MAGjB,CAAC7E,wBAAG8E,QAAO,CAAC9E,EAAEyB,OAAO,CAACoD,wBAAGC,QAAO,CAACD,EAAEpD,KAAK;WACnC;AAAA;SAGF,WAAWzB,EAAEyB,OAAOqP,WAAWjM,EAAEC,QAAQgM,WAAW9Q,EAAE8E,OAAOqM,SAAStM,EAAEpD;AAAAA;oBAGtD;AAAA,EAAEjH;AAAAA,EAAOiV;AAAAA,EAAU+B;AAAAA,EAAa9B;AAAAA,EAAQ0B,iBAAiB;AAAA,GAAsB;QAClG1S,UAAS3B,SAAUC,OAAMA,EAAEC,WAAWyB;QACtC5B,cAAaC,SAAUC,OAAMA,EAAEC,WAAWH;QAC1CsG,gBAAerG,SAAUC,OAAMA,EAAEK,MAAM+F;QACvCqO,YAAY1U,SAAUC,OAAMA,EAAEO,KAAKqQ;QACnC8D,eAAe3U,SAAUC,OAAMA,EAAEO,KAAKsQ;QACtC8D,YAAY5U,SAAUC,OAAMA,EAAEO,KAAKuQ;QAEnC,CAAC8D,YAAYza,eAAS,IAAIyX;QAC1B,CAACiD,YAAYC,iBAAiB3a,eAAeya;QAC7C,CAACG,OAAOC,YAAY7a;QACpB,CAAC8a,SAASC,cAAc/a;QAExB2N,MAAMiN,QAAQA,MAAMjN,MAAMtK,iBAAiBoU,OAAOpU,QAAQA,+BAAOsK;QACjErD,MAAMsQ,QAAQA,MAAMtQ,MAAMjH,iBAAiBoU,OAAOpU,QAAQA,+BAAOiH;QAEjE;AAAA,IAAE0Q;AAAAA,IAAWC;AAAAA,IAAcC;AAAAA,IAAiBC;AAAAA,MAAiBC,iBAAU;AAAA,IAC3EC,gBAAgB,MAAMzY;AAAAA,IACtBqX;AAAAA,IACAqB,iBAAiB;AAAA,IACjBC,MAAMb;AAAAA,IACNc,iBAAkBlX,YAAWqW,cAAc,IAAIlD,KAAKiD,WAAWb,eAAea,WAAWZ,aAAaxV;AAAAA,IACtGA,QAAQ;AAAA;QAGJmX,gBAAgB3c,cAAQ,MAAM;UAC5B;AAAA,MAAEia;AAAAA,QAAW,IAAIC,KAAKC,eAAeV,QAAQ;AAAA,MAAEmD,SAAS;AAAA;WACvD,CAACC,YAAoB5C,OAAO,IAAItB,KAAKA,KAAKmE,IAAI,MAAM,GAAGD;AAAAA,KAC7D,CAACpD;kBAEM,MAAMoC,cAActX,UAAU,OAAO,IAAIoU,SAASpU,iBAAiBoU,OAAOpU,QAAQA,MAAMiH,MAAM,CAACjH;kBAE/F,MAAM;QACV,CAACgX,aAAa;eACPzX;AAAAA;AAAAA,KAEV,CAACyX;eAES1M,MAAYrD,MAAYuR,MAAsB;QACrD,CAACxB,aAAa;eACP1M,sBAAO;;;QAIdA,QAAOrD,QAAOqD,OAAMrD,MAAK;UACvBuR,SAAS,OAAO;eACZlO;AAAAA,iBACGkO,SAAS,OAAO;eACnBvR;AAAAA,aACD;SACJqD,MAAKrD,QAAO,CAACA,MAAKqD;AAAAA;AAAAA;QAInB,CAACA,SAAQ,CAACrD,MAAK;eACR1H;eACA+K,QAAOrD,OAAM;AAAA,QAAEqD;QAAKrD;UAAQ;AAAA,WAChC;eACI;AAAA,QAAEqD;QAAKrD;;;;QAIdwR,cAAchd,cAAQ,MAAM;UAC1B;AAAA,MAAEia;AAAAA,QAAW,IAAIC,KAAKC,eAAeV,QAAQ;AAAA,MAAET,OAAO;AAAA;WACrD,CAACA,UAAkBiB,OAAO,IAAItB,KAAK,MAAMK;AAAAA,KAC/C,CAACS;QAEEwD,aAAajd,cAAQ,MAAM;UACzB;AAAA,MAAEia;AAAAA,QAAW,IAAIC,KAAKC,eAAeV,QAAQ;AAAA,MAAER,MAAM;AAAA;WACpD,CAACA,SAAiBgB,OAAO,IAAItB,KAAKM,MAAM,GAAG;AAAA,KACjD,CAACQ;SAGFjT;eACEA;MAAK,KAAK;AAAA,QAAEC,SAAS;AAAA,QAAQyW,cAAc;AAAA,QAAUzS,gBAAgB;AAAA,QAAU/D,YAAY;AAAA,QAAY8D,KAAK;AAAA;AAAA,iBAC1GzK,eAAC;QAAU,OAAO8O,oBAAO;AAAA,QAAM,UAAW4N,UAASxb,IAAIwb,sBAAQ3Y,QAAW0H,KAAK;AAAA,QAAQ;AAAA,UAEtF+P,eACC/U;mBACG,OACDzG,eAAC;UAAU,OAAOyL,oBAAO;AAAA,UAAM,UAAWiR,UAASxb,IAAI4N,KAAK4N,sBAAQ3Y,QAAW;AAAA,UAAQ;AAAA;AAAA;AAAA,QAK5FoY,UAAUrZ,IAAI,CAAC;AAAA,MAAEmW;AAAAA,MAAOC;AAAAA,MAAMkE;AAAAA,UAC7B3W;MAA6B,KAAK;AAAA,QAAEC,SAAS;AAAA;AAAA,iBAC3CD;QACE,KAAK;AAAA,UACHqH,QAAQ;AAAA,UACRpH,SAAS;AAAA,UACTyW,cAAc;AAAA,UACdzS,gBAAgB;AAAA,UAChB/D,YAAY;AAAA;AAAA,mBAGd3G,eAAC,8CAAeoc,aAAa;AAAA,UAAED;AAAAA;oBAC7Bnc,eAAC;YAAa,KAAK;AAAA,cAAE6F,WAAW;AAAA;AAAA;AAAA,aAGlCY;UAAK,KAAK;AAAA,YAAEC,SAAS;AAAA;AAAA,qBAClBuW,YAAYhE,aAASiE,WAAWhE;AAAAA,YAGnClZ,eAAC,8CAAeqc,gBAAgB;AAAA,UAAEF;AAAAA;oBAChCnc,eAAC;;UAILyG;QACE,KAAK;AAAA,UACHyI,aAAa;AAAA,UACbxI,SAAS;AAAA,UACTsK,qBAAqB;AAAA,UACrBqM,YAAY;AAAA;AAAA,mBAGbxC,SAAS/X,IAAI,CAACwa,IAAIR,YACjB9c;UAAmB,KAAK;AAAA,YAAEkP,aAAa;AAAA,YAAU3G,cAAc;AAAA;AAAA,oBAC5DqU,cAAcE;AAAAA,WADPA,WAKXM,MAAMta,IAAI,CAACya,MAAMnY,UAChBmY,KAAKza,IAAI,CAAC0a,SAASC,aAAa;cAC1B,CAACD,SAAS;mBACLxd;;gBAGH;AAAA,YAAE0d;AAAAA,YAAWC;AAAAA,YAAWjB;AAAAA,YAAM9E;cAAU4F;gBAExCzF,WAAW2E,KAAKkB,cAAc9O,4BAAK8O,cAAc9O,OAAOrD,OAAOoS,cAAcnB,MAAM;AAAA,YAAE5N;AAAAA,YAAKrD;AAAAA;gBAC1FqS,cACJ,CAAC/F,kBACK6F,cAAc3B,oCAAS2B,cAC1B9O,OAAO,CAACrD,OAAOwQ,WAAW4B,cAAcnB,MAAM5N,OAAOmN,UAAU;AAAA,YAAEnN;AAAAA,YAAKrD,KAAKwQ;AAAAA,cAAY;AAAA,YAAEnN,KAAKmN;AAAAA,YAASxQ,KAAKqD;AAAAA;iBAG/G9O;YAEE,KAAK,CACH;AAAA,cACEsI,SAAS;AAAA,cACT2N,QAAQ;AAAA,cACRhK,YAAY;AAAA,cACZrF,QAAQ;AAAA,6BAEI+W,cAAc;AAAA,cAC1BxY,OAAO4Y;eAETnG,UAAS;AAAA,cACP3B,QAAQ;AAAA,eAEV8B,YAAY;AAAA,cACV9L,YAAY;AAAA,cACZ9G,OAAO;AAAA,eAET2Y,eAAe;AAAA,cACb7R,YAAY;AAAA,cACZ9G,OAAO;AAAA;AAAA,aAGPmX,aAAa;AAAA,YAAEkB;AAAAA;YACnB,SAAS,MAAM;kBACTzB,OAAO;oBACLjN;sBAASA,KAAK4N;AAAAA;sBACTA,MAAMjR;AAAAA,qBACV;oBACDiR;AAAAA;AAAAA;AAAAA,YAGR,eAAe,MAAMR,WAAWQ;AAAAA,YAChC,cAAc,MAAMR,WAAWnY;AAAAA,sBAE9B2Y,KAAKxB;AAAAA,cAnCA,GAAE9V,SAASqY;AAAAA;AAAAA;AAAAA,OArDlB,GAAExE,QAAQC,UAiGvBzS;MAAK,KAAK;AAAA,QAAEuX,WAAW;AAAA,QAAkBtX,SAAS;AAAA,QAAQyW,cAAc;AAAA,QAAUzS,gBAAgB;AAAA;AAAA,iBAChG1K,eAAC;QACC,SAAQ;AAAA,QACR,SAAS,MAAM;mBACJ+D;mBACA6T;AAAAA;AAAAA,kBAGV6D;AAAAA,UAGHzb,eAAC;QACC,SAAQ;AAAA,QACR,SAAS,MAAM;mBACJ+D;mBACA8T,SAASuD;AAAAA;AAAAA,kBAGnBM;AAAAA,UAGH1b,eAAC;QACC,SAAQ;AAAA,QACR,SAAS,MAAM;mBACJ+D;mBACA;AAAA;AAAA,kBAGV4X;AAAAA;AAAAA;AAAAA;AAAAA;AChRX,qBAAqB3a,GAAyB;MACxCA,aAAa4X;WAAa5X;MAC1B,OAAOA,MAAM,YAAY,OAAOA,MAAM;WAAiB,IAAI4X,KAAK5X;SAC7D;AAAA;AAGT,4BAA4BA,GAAqC;MAC3DA,aAAayD,UAAU,SAASzD,KAAK,SAASA,GAAG;UAC7C2N,QAAQ;AAAA,MACZG,KAAKmP,YAAajd,EAAU8N;AAAAA,MAC5BrD,KAAKwS,YAAajd,EAAUyK;AAAAA;WAEvBkD,MAAMG,OAAOH,MAAMlD,MAAOkD,QAAsB;AAAA;SAElDsP,YAAYjd;AAAAA;AAGrB,4BAA4BA,GAA4D;MAClFA,aAAaT;WAAcS,EAAE8B,IAAIob,oBAAoBjb,OAAOkb;SACzDD,mBAAmBld;AAAAA;oBAGK,IAa2D;AAb3D,eAC/B0Y;AAAAA;AAAAA,IACA0B;AAAAA,IACAgD;AAAAA,IACAC,WAAWC;AAAAA,MAJoB,IAK5B7c,kBAL4B,IAK5BA;AAAAA,IAJHiY;AAAAA,IACA0B;AAAAA,IACAgD;AAAAA,IACAC;AAAAA;QAUM;AAAA,IAAE7Z,QAAQ;AAAA,IAAMiV;AAAAA,MAAa8E,UAAU,iCACxC9c,QADwC;AAAA,IAE3C4c;AAAAA,IAEAtb,IAAI;AAAA,IAEJ+H,SAASE,aAAa;aACb,CAAC,CAACA;AAAAA;AAAAA,IAGXwT,KAAKxT,aAAaxG,QAAO;aAChBqZ,cAAc7S,aAAaxG;AAAAA;AAAAA;SAKpCxE;IACE,KAAK;AAAA,MACHsI,SAAS;AAAA,MACT5B,SAAS;AAAA;AAAA,cAGX1G,eAAC;MAAW,aAAa,CAACoe;AAAAA,MAAc;AAAA,MAAc;AAAA,MAAoB;AAAA,MAAgB;AAAA;AAAA;AAAA;ACvDhG,gBAAmBld,KAAasD,OAAU4Z,cAAwB;QAC1DK,SAAS,IAAIvW,IAAIkW,eAAe,KAAKld;MACvCA,IAAIiH,IAAI3D,QAAQ;WACX/B,OAAO+B;AAAAA,SACT;WACE4D,IAAI5D;AAAAA;SAGNia;AAAAA;sBAGuD,IAeX;AAfW,eAC9DtV;AAAAA,aAASuV;AAAAA,IACTC,cAAcC;AAAAA,IACdC,SAASF;AAAAA,IACTP;AAAAA,MAJ8D,IAK3D3c,kBAL2D,IAK3DA;AAAAA,IAJH0H;AAAAA,IACAwV;AAAAA,IACAE;AAAAA,IACAT;AAAAA;QAYMtX,cAAaC,SAAUC,OAAMA,EAAEC,WAAWH;QAC1CK,YAAWJ,SAAUC,OAAMA,EAAEC,WAAWE;QACxCoQ,UAASxQ,SAAUC,OAAMA,EAAEK,MAAMkQ;QACjCC,SAAQzQ,SAAUC,OAAMA,EAAEK,MAAMmQ;QAChCO,WAAWhR,SAAUC,OAAMA,EAAEO,KAAKwQ;QAClCJ,YAAY5Q,SAAUC,OAAMA,EAAEO,KAAKoQ;QAEnC7V,QAAQC;QACRH,WAAWC;QAEX;AAAA,IACJ2C,4BAAY0D;AAAAA,IACZuR;AAAAA,IACA4E;AAAAA,MACEE,UAAU,iCACT9c,QADS;AAAA,IAGZsB,IAAI;AAAA,IAEJ+H,SAASE,aAAa;aACbA,YAAYmD,OAAO;AAAA;AAAA,IAG5BqQ,KAAKxT,aAAaxG,QAAO;aAChBwG,YAAY7C,IAAI3D;AAAAA;AAAAA;QAIrB2E,UAAUrH,MAAMX,SAAUqB,WAAU;QACpCkc;aAAwBI,KAAKJ;UAE3B5W,SAAStF,MAAM4G,cAAchG,KAAM0E,aAAWA,QAAO/E,OAAOnB;QAC9D,CAACkG;aAAe;WAEbgX,KAAKC,QAAQvc,MAAMhB,OAAQgI,UAASwV,UAAUX,SAASvW,OAAOtD,MAAMgF,OAAOA;AAAAA;QAG9E,CAACyV,OAAOC,YAAY/d,eAAS;QAC7Bge,WAAWhW,QAAQlG,OAAQmc,YAAW,CAACH,SAASN,YAAYS,QAAQC,cAAcC,SAASL,MAAMI;SAGrG5Y;IACE,KAAK;AAAA,MACH6B,SAAS;AAAA,MACT5B,SAAS;AAAA,MACT+D,KAAK;AAAA;AAAA,eAGPzK,eAAC;MACC,OAAOif;AAAAA,MACP,UAAWvb,OAAMwb,SAASxb,EAAE2H,OAAO7G;AAAAA,MACnC,SAASxE,eAAC;QAAW,SAAS,MAAMkf,SAAS;AAAA,kBAAM,CAACD,QAAQjf,eAAC,eAAYA,eAAC;;MAC1E,KAAK;AAAA,QAAEuI,cAAc;AAAA;AAAA,QAGvB9B;MAAK,KAAK;AAAA,QAAE8Y,WAAW;AAAA,QAAQ9N,WAAW;AAAA;AAAA,iBACxCzR,eAAC;QACC,UAAUwE,MAAM2J,SAAS;AAAA,QACzB,SAASnO,eAAC;UAAS,UAAUwE,MAAM2J,SAAS;AAAA,UAAG,SAAS3J,MAAM2J,OAAO;AAAA,UAAG,UAAU,MAAMsL,6BAAavR;AAAAA;AAAAA,QACrG,OAAOzB;0BAAOsR,SAASvT,MAAM2J;;UAG9BgR,SAASrc,IAAI,CAACsc,QAAQha,UACrBpF,eAAC;QAEC,SAASA,eAAC;UAAS,SAASwE,MAAM2D,IAAIiX;AAAAA,UAAS,UAAU,MAAM3F,SAAS5R,OAAOrD,OAAO4a,QAAQhB;AAAAA;AAAAA,QAC9F,OAAOS,OAAOO;AAAAA,SAFTha;AAAAA,QAOV+Z,SAASre,WAAW,KAAKd;MAAM,KAAK;AAAA,QAAEwf,WAAW;AAAA;AAAA,gBAAa7H;AAAAA;AAAAA;AAAAA;kBC1GxB,IAA6B,IAAsD;MAC1H;MACA;iBAEW;UACP,OAAO;eAEF;cACD;OAEP,GAAI;AAAA;SAGF,OAAO,OACZ,YAAa,MAAY;eACZ;QAEP,SAAS;mBACE;AAAA;cAGL,WAAW,KAAK;AAAA,KAE5B;AAAA,IACE,QAAQ;UACF,SAAS;qBACE;;;;;;mBClByC,MAAwC;QAChG,QAAQ;QACR,WAAW;QACX,QAAQ;QACR,WAAW,KAAK,YAAY,MAAM,IAAI,KAAK;kBAGvC,MAAM;UACR,OAAO,CAAC,UAAU;UAClB,KAAK,iBAAiB,QAAW;cAC7B,aAAa,IAAI,UAAU,KAAK;AAAA;AAAA;AAAA,KAGzC;kBAEO,MAAM;UACR,OAAO,CAAC,UAAU;YAChB,QAAQ,IAAI,UAAUvW,gBAAU,iCAAK,OAAL,EAAW;UAE7C,KAAK,UAAU,QAAW;cACtB,aAAa,IAAI,UAAU,KAAK;AAAA;AAAA;WAInC,MAAM;YACL,OAAO,CAAC,UAAU;cAChB,QAAQ,OAAO;AAAA;AAAA;AAAA,KAGxB,CAAC,OAAO,UAAU;QAGf,QAAQ,MAAM,SAAS,CAAC,UAAU,MAAM,aAAa,IAAI;QACzD,CAAC,YAAY,iBAAiBD;QAC9B,UAAUQ,aAAO;wBAEP,MAAM;YACZ,UAAU;AAAA;QAGd,gBAAgB1B,cACpB,MACE,SAAS,CAAC,WAAc;UAChB,EAAE,OAAO,iBAAiB,wBAAa,QAAQ;QAEjD,oBAAoB,QAAW;YAC3B,OAAO,CAAC,UAAU;cAChB,aAAa,IAAI,UAAU;AAAA;AAAA;2CAI1B;kBACG;AAAA,KACb,MACL,CAAC;oBAGe,QAAW;kBACb;kBACA;AAAA;kBAGN,MAAM,cAAc,SAAS,CAAC;SAEjC;AAAA,IACL,OAAO,kCAAc;AAAA,IACrB;AAAA,IACA,OAAOE,iBAAW;AAAA,IAClB,UAAU,+BAAc,MAAM;AAAA;AAAA;MC5ErB,YAAY,CAAC,MAAc,UAA2B;SAC1D,KAAK;UACJ,MAAM;SACP,MAAM,MAAM,OAAO,MAAM,CAAC,SAAS,UAAU,MAAM;AAAA;MAG/C,YAAY,CAAC,MAAc,UAA2B;MAC7D,IAAI;;eACU,QAAQ,OAAO;aACxB,IAAI,KAAK,QAAQ,KAAK;YACvB,KAAK,OAAO,MAAM;;;;;aAKjB;AAAA;SAEF;AAAA;oBCTwB,IASyB;AATzB,eAC/Bsf;AAAAA,cAAUC;AAAAA,IACVrB,WAAWsB;AAAAA,MAFoB,IAG5Ble,kBAH4B,IAG5BA;AAAAA,IAFHge;AAAAA,IACApB;AAAAA;QAQMvX,cAAaC,SAAUC,OAAMA,EAAEC,WAAWH;QAC1CyQ,UAASxQ,SAAUC,OAAMA,EAAEK,MAAMkQ;QACjCC,SAAQzQ,SAAUC,OAAMA,EAAEK,MAAMmQ;QAEhC;AAAA,IAAEhT,QAAQ;AAAA,IAAIiV;AAAAA,MAAa8E,UAAU,iCACtC9c,QADsC;AAAA,IAEzC4c;AAAAA,IAEAtb,IAAI;AAAA,IAEJ+H,SAASE,aAAa;aACb,CAAC,CAACA;AAAAA;AAAAA,IAGXwT,KAAKxT,aAAaxG,QAAO;aAChBib,QAAQjb,QAAOwG;AAAAA;AAAAA;SAKxBhL;IACE,KAAK;AAAA,MACHsI,SAAU;AAAA,MACV5B,SAAS;AAAA;AAAA,cAGX1G,eAAC;MACC;AAAA,MACA,UAAW0D,OAAM+V,SAAS/V,EAAE2H,OAAO7G;AAAAA,MACnC,SAASxE,eAAC;QAAW,SAAS,MAAMyZ,SAAS;AAAA,kBAAM,CAACjV,QAAQxE,eAAC,eAAYA,eAAC;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|