{"version":3,"file":"FlameGraphCallTreeContainer.cjs","sources":["../../../src/CallTree/FlameGraphCallTreeContainer.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { memo, useMemo, useState, useRef, useEffect, useCallback } from 'react';\nimport { useTable, useSortBy, useExpanded, type Column, type Row, type UseExpandedRowProps } from 'react-table';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport { type GrafanaTheme2 } from '@grafana/data';\nimport { Button, Icon, IconButton, Tooltip, useStyles2, useTheme2 } from '@grafana/ui';\n\nimport { type GetExtraContextMenuButtonsFunction } from '../FlameGraph/FlameGraphContextMenu';\nimport { type FlameGraphDataContainer } from '../FlameGraph/dataTransform';\nimport { ColorScheme, ColorSchemeDiff, type PaneView, type ViewMode } from '../types';\n\nimport { ActionsCell } from './ActionsCell';\nimport { CallTreeTable } from './CallTreeTable';\nimport { ColorBarCell } from './ColorBarCell';\nimport { DiffCell } from './DiffCell';\nimport { FunctionCellWithExpander } from './FunctionCellWithExpander';\nimport { buildAllCallTreeNodes, buildCallersTree, type CallTreeNode, getInitialExpandedState } from './utils';\n\ntype Props = {\n  data: FlameGraphDataContainer;\n  onSymbolClick: (symbol: string) => void;\n  sandwichItem?: string;\n  onSandwich: (str?: string) => void;\n  onTableSort?: (sort: string) => void;\n  search: string;\n  onSearch?: (symbol: string) => void;\n  focusedItemIndexes?: number[];\n  setFocusedItemIndexes?: (itemIndexes: number[] | undefined) => void;\n  getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction;\n  viewMode?: ViewMode;\n  paneView?: PaneView;\n};\n\nfunction findCallTreeNode(nodes: CallTreeNode[], searchKey: string, byLabel: boolean): CallTreeNode | undefined {\n  for (const node of nodes) {\n    if (byLabel ? node.label === searchKey : node.id === searchKey) {\n      return node;\n    }\n    if (node.children) {\n      const found = findCallTreeNode(node.children, searchKey, byLabel);\n      if (found) {\n        return found;\n      }\n    }\n  }\n  return undefined;\n}\n\nconst FlameGraphCallTreeContainer = memo(\n  ({\n    data,\n    onSymbolClick,\n    sandwichItem,\n    onSandwich,\n    search,\n    onSearch,\n    focusedItemIndexes,\n    setFocusedItemIndexes,\n    getExtraContextMenuButtons,\n    viewMode,\n    paneView,\n  }: Props) => {\n    const [isCompact, setIsCompact] = useState(false);\n    const styles = useStyles2(getStyles);\n    const theme = useTheme2();\n\n    const scrollContainerRef = useRef<HTMLDivElement | null>(null);\n    const lastScrolledMatchRef = useRef<string | undefined>(undefined);\n    const tableInstanceRef = useRef<{\n      rows: Array<Row<CallTreeNode>>;\n      toggleRowExpanded: (id: string[], value?: boolean) => void;\n    }>({ rows: [], toggleRowExpanded: () => {} });\n\n    const [focusedNodeId, setFocusedNodeId] = useState<string | undefined>(undefined);\n    const [callersNodeLabel, setCallersNodeLabel] = useState<string | undefined>(undefined);\n\n    useEffect(() => {\n      if (sandwichItem !== undefined) {\n        setCallersNodeLabel(sandwichItem);\n        setFocusedNodeId(undefined);\n      } else {\n        setCallersNodeLabel(undefined);\n      }\n    }, [sandwichItem]);\n\n    const searchQuery = search;\n    const [currentMatchIndex, setCurrentMatchIndex] = useState<number>(0);\n\n    const handleSetFocusMode = useCallback(\n      (nodeIdOrLabel: string | undefined, isLabel = false, itemIndexes?: number[]) => {\n        if (nodeIdOrLabel === undefined) {\n          setFocusedNodeId(undefined);\n          setFocusedItemIndexes?.(undefined);\n        } else if (isLabel) {\n          setFocusedNodeId(`label:${nodeIdOrLabel}`);\n          setFocusedItemIndexes?.(itemIndexes);\n        } else {\n          setFocusedNodeId(nodeIdOrLabel);\n          setFocusedItemIndexes?.(itemIndexes);\n        }\n\n        if (nodeIdOrLabel !== undefined) {\n          setCallersNodeLabel(undefined);\n        }\n      },\n      [setFocusedItemIndexes]\n    );\n\n    const handleSetCallersMode = useCallback(\n      (label: string | undefined) => {\n        setCallersNodeLabel(label);\n        if (label !== undefined) {\n          setFocusedNodeId(undefined);\n        }\n        onSandwich(label);\n      },\n      [onSandwich]\n    );\n\n    const allNodes = useMemo(() => buildAllCallTreeNodes(data), [data]);\n\n    const { nodes, focusedNode, callersNode } = useMemo(() => {\n      let nodesToUse = allNodes;\n      let focusedNode: CallTreeNode | undefined;\n      let callersTargetNode: CallTreeNode | undefined;\n\n      if (focusedNodeId) {\n        const isLabelSearch = focusedNodeId.startsWith('label:');\n        const searchKey = isLabelSearch ? focusedNodeId.substring(6) : focusedNodeId;\n\n        focusedNode = findCallTreeNode(allNodes, searchKey, isLabelSearch);\n        if (focusedNode) {\n          if (focusedNode.parentId) {\n            const parent = findCallTreeNode(allNodes, focusedNode.parentId, false);\n            if (parent) {\n              const modifiedParent: CallTreeNode = {\n                ...parent,\n                children: [focusedNode],\n              };\n              nodesToUse = [modifiedParent];\n            } else {\n              nodesToUse = [focusedNode];\n            }\n          } else {\n            nodesToUse = [focusedNode];\n          }\n        }\n      }\n\n      if (callersNodeLabel) {\n        const [callers] = data.getSandwichLevels(callersNodeLabel);\n\n        if (callers.length > 0) {\n          nodesToUse = buildCallersTree(callers, data);\n          callersTargetNode = nodesToUse.length > 0 ? nodesToUse[0] : undefined;\n        } else {\n          nodesToUse = [];\n          callersTargetNode = undefined;\n        }\n      }\n\n      return { nodes: nodesToUse, focusedNode: focusedNode, callersNode: callersTargetNode };\n    }, [allNodes, data, focusedNodeId, callersNodeLabel]);\n\n    const resolvedFocusNodeId = useMemo(() => {\n      if (!focusedNodeId?.startsWith('label:')) {\n        return undefined;\n      }\n      const searchKey = focusedNodeId.substring(6);\n      return findCallTreeNode(allNodes, searchKey, true)?.id;\n    }, [focusedNodeId, allNodes]);\n\n    useEffect(() => {\n      if (!focusedNodeId?.startsWith('label:') || !resolvedFocusNodeId) {\n        return;\n      }\n      if (resolvedFocusNodeId !== focusedNodeId) {\n        setFocusedNodeId(resolvedFocusNodeId);\n      }\n    }, [resolvedFocusNodeId, focusedNodeId]);\n\n    const depthOffset = useMemo(() => {\n      if (focusedNodeId && nodes.length > 0) {\n        return nodes[0].depth;\n      }\n      return 0;\n    }, [focusedNodeId, nodes]);\n\n    const { searchNodes, searchError } = useMemo(() => {\n      if (!searchQuery.trim()) {\n        return { searchNodes: [], searchError: undefined };\n      }\n\n      const MAX_MATCHES = 50;\n      const matches: Array<{ id: string; total: number }> = [];\n\n      const regexChars = /[.*+?^${}()|[\\]\\\\]/;\n      let isRegexQuery = regexChars.test(searchQuery);\n      let searchRegex: RegExp | null = null;\n      let searchError: string | undefined;\n\n      if (isRegexQuery) {\n        try {\n          searchRegex = new RegExp(searchQuery, 'i');\n        } catch (e) {\n          searchError = 'Invalid regex pattern';\n          return { searchNodes: [], searchError };\n        }\n      }\n\n      const searchFn = (nodesToSearch: CallTreeNode[]) => {\n        for (const node of nodesToSearch) {\n          if (matches.length >= MAX_MATCHES) {\n            break;\n          }\n\n          let isMatch = false;\n          if (searchRegex) {\n            isMatch = searchRegex.test(node.label);\n          } else {\n            isMatch = node.label.toLowerCase().includes(searchQuery.toLowerCase());\n          }\n\n          if (isMatch) {\n            matches.push({ id: node.id, total: node.total });\n          }\n\n          if (node.children && matches.length < MAX_MATCHES) {\n            searchFn(node.children);\n          }\n        }\n      };\n\n      searchFn(nodes);\n      matches.sort((a, b) => b.total - a.total);\n\n      const matchIds = matches.map((m) => m.id);\n\n      return { searchNodes: matchIds, searchError };\n    }, [searchQuery, nodes]);\n\n    useEffect(() => {\n      if (!focusedItemIndexes || focusedItemIndexes.length === 0) {\n        setFocusedNodeId(undefined);\n        return;\n      }\n\n      const itemIndexesMatch = (a: number[], b: number[]): boolean => {\n        if (a.length !== b.length) {\n          return false;\n        }\n        return a.every((val, idx) => val === b[idx]);\n      };\n\n      const findExactMatch = (nodesToSearch: CallTreeNode[]): string | undefined => {\n        for (const node of nodesToSearch) {\n          if (itemIndexesMatch(node.levelItem.itemIndexes, focusedItemIndexes)) {\n            return node.id;\n          }\n          if (node.children) {\n            const found = findExactMatch(node.children);\n            if (found) {\n              return found;\n            }\n          }\n        }\n        return undefined;\n      };\n\n      const matchedNodeId = findExactMatch(allNodes);\n      if (matchedNodeId) {\n        setFocusedNodeId(matchedNodeId);\n      }\n    }, [focusedItemIndexes, allNodes]);\n\n    const searchResultKey = searchNodes.join(',');\n    useEffect(() => {\n      setCurrentMatchIndex(searchNodes.length > 0 ? 0 : -1);\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [searchResultKey]);\n\n    const navigateToNextMatch = () => {\n      if (searchNodes.length > 0) {\n        setCurrentMatchIndex((prev) => (prev + 1) % searchNodes.length);\n      }\n    };\n\n    const navigateToPrevMatch = () => {\n      if (searchNodes.length > 0) {\n        setCurrentMatchIndex((prev) => (prev - 1 + searchNodes.length) % searchNodes.length);\n      }\n    };\n\n    const currentSearchMatchId = useMemo(() => {\n      if (searchNodes.length > 0 && currentMatchIndex >= 0 && currentMatchIndex < searchNodes.length) {\n        return searchNodes[currentMatchIndex];\n      }\n      return undefined;\n    }, [searchNodes, currentMatchIndex]);\n\n    const searchMatchRowRef = useCallback(\n      (node: HTMLTableRowElement | null) => {\n        if (node && currentSearchMatchId && currentSearchMatchId !== lastScrolledMatchRef.current) {\n          lastScrolledMatchRef.current = currentSearchMatchId;\n          const container = scrollContainerRef.current;\n          if (container) {\n            requestAnimationFrame(() => {\n              const rowRect = node.getBoundingClientRect();\n              const containerRect = container.getBoundingClientRect();\n              const rowTopRelativeToContainer = rowRect.top - containerRect.top + container.scrollTop;\n              const targetScrollTop = rowTopRelativeToContainer - container.clientHeight / 2 + rowRect.height / 2;\n              container.scrollTo({\n                top: Math.max(0, targetScrollTop),\n                behavior: 'smooth',\n              });\n            });\n          }\n        }\n      },\n      [currentSearchMatchId]\n    );\n\n    const expandedState = useMemo(() => {\n      const baseExpanded = getInitialExpandedState(nodes, 1);\n\n      const expandPathToNode = (nodes: CallTreeNode[], targetId: string): boolean => {\n        for (const node of nodes) {\n          if (node.id === targetId) {\n            return true;\n          }\n          if (node.children && node.children.length > 0) {\n            const foundInSubtree = expandPathToNode(node.children, targetId);\n            if (foundInSubtree) {\n              baseExpanded[node.id] = true;\n              return true;\n            }\n          }\n        }\n        return false;\n      };\n\n      if (currentSearchMatchId) {\n        expandPathToNode(nodes, currentSearchMatchId);\n      }\n\n      if (focusedNodeId && nodes.length > 0) {\n        const rootNode = nodes[0];\n\n        const isLabelSearch = focusedNodeId.startsWith('label:');\n        const searchLabel = isLabelSearch ? focusedNodeId.substring(6) : undefined;\n\n        if (rootNode.children && rootNode.children.length > 0) {\n          baseExpanded['0'] = true;\n        }\n\n        const isRootTheFocusedNode = isLabelSearch ? rootNode.label === searchLabel : rootNode.id === focusedNodeId;\n\n        if (!isRootTheFocusedNode && rootNode.children && rootNode.children.length > 0) {\n          baseExpanded['0.0'] = true;\n        }\n      }\n\n      if (callersNodeLabel && callersNode && nodes.length > 0) {\n        expandPathToNode(nodes, callersNode.id);\n\n        if (callersNode.children && callersNode.children.length > 0) {\n          baseExpanded[callersNode.id] = true;\n        }\n      }\n\n      return baseExpanded;\n    }, [nodes, focusedNodeId, callersNodeLabel, callersNode, currentSearchMatchId]);\n\n    const ACTIONS_WIDTH = 30;\n    const COLOR_BAR_WIDTH = 200;\n    const SELF_WIDTH = 150;\n    const TOTAL_WIDTH = 150;\n    const BASELINE_WIDTH = 100;\n    const COMPARISON_WIDTH = 100;\n    const DIFF_WIDTH = 100;\n    const FUNCTION_MIN_WIDTH = 100;\n    const FUNCTION_COMPACT_THRESHOLD = 550;\n\n    const getFixedColumnsWidth = (isDiff: boolean, compactMode: boolean): number => {\n      if (compactMode) {\n        return isDiff ? ACTIONS_WIDTH + BASELINE_WIDTH + COMPARISON_WIDTH + DIFF_WIDTH : ACTIONS_WIDTH + TOTAL_WIDTH;\n      }\n      return isDiff\n        ? ACTIONS_WIDTH + COLOR_BAR_WIDTH + BASELINE_WIDTH + COMPARISON_WIDTH + DIFF_WIDTH\n        : ACTIONS_WIDTH + COLOR_BAR_WIDTH + SELF_WIDTH + TOTAL_WIDTH;\n    };\n\n    const isDiff = data.isDiffFlamegraph();\n\n    const compactModeThreshold = getFixedColumnsWidth(isDiff, false) + FUNCTION_COMPACT_THRESHOLD;\n\n    const getFunctionColumnWidth = (availableWidth: number, compactMode: boolean): number | undefined => {\n      if (availableWidth <= 0) {\n        return undefined;\n      }\n      const fixedWidth = getFixedColumnsWidth(isDiff, compactMode);\n      return Math.max(availableWidth - fixedWidth, FUNCTION_MIN_WIDTH);\n    };\n\n    const commonColumns = useMemo<Array<Column<CallTreeNode>>>(() => {\n      return [\n        {\n          Header: '',\n          id: 'actions',\n          Cell: ({ row }: { row: Row<CallTreeNode> }) => (\n            <ActionsCell\n              nodeId={row.original.id}\n              label={row.original.label}\n              itemIndexes={row.original.levelItem.itemIndexes}\n              levelItem={row.original.levelItem}\n              hasChildren={Boolean(row.original.children?.length)}\n              depth={row.original.depth - depthOffset}\n              parentId={row.original.parentId}\n              onFocus={handleSetFocusMode}\n              onShowCallers={handleSetCallersMode}\n              onSearch={onSearch}\n              focusedNodeId={focusedNodeId}\n              callersNodeLabel={callersNodeLabel}\n              isSearchMatch={searchNodes?.includes(row.original.id) ?? false}\n              actionsCellClass={styles.actionsCell}\n              getExtraContextMenuButtons={getExtraContextMenuButtons}\n              data={data}\n              viewMode={viewMode}\n              paneView={paneView}\n              search={search}\n            />\n          ),\n          width: ACTIONS_WIDTH,\n          minWidth: ACTIONS_WIDTH,\n          disableSortBy: true,\n        },\n        {\n          Header: 'Function',\n          accessor: 'label',\n          Cell: ({ row, value, rowIndex }: { row: Row<CallTreeNode>; value: string; rowIndex?: number }) => (\n            <FunctionCellWithExpander\n              // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n              row={row as Row<CallTreeNode> & UseExpandedRowProps<CallTreeNode>}\n              value={value}\n              depth={row.original.depth - depthOffset}\n              hasChildren={Boolean(row.original.children?.length)}\n              rowIndex={rowIndex}\n              rows={tableInstanceRef.current.rows}\n              onSymbolClick={onSymbolClick}\n              compact={isCompact}\n              toggleRowExpanded={tableInstanceRef.current.toggleRowExpanded}\n            />\n          ),\n          minWidth: FUNCTION_MIN_WIDTH,\n        },\n      ];\n    }, [\n      callersNodeLabel,\n      data,\n      depthOffset,\n      focusedNodeId,\n      getExtraContextMenuButtons,\n      handleSetCallersMode,\n      handleSetFocusMode,\n      isCompact,\n      onSearch,\n      onSymbolClick,\n      paneView,\n      search,\n      searchNodes,\n      styles,\n      viewMode,\n    ]);\n\n    const columns = useMemo<Array<Column<CallTreeNode>>>(() => {\n      if (data.isDiffFlamegraph()) {\n        const cols: Array<Column<CallTreeNode>> = [...commonColumns];\n\n        if (!isCompact) {\n          cols.push({\n            Header: '',\n            id: 'colorBar',\n            Cell: ({ row }: { row: Row<CallTreeNode> }) => (\n              <ColorBarCell\n                node={row.original}\n                data={data}\n                colorScheme={ColorSchemeDiff.Default}\n                theme={theme}\n                focusedNode={focusedNode}\n              />\n            ),\n            minWidth: COLOR_BAR_WIDTH,\n            width: COLOR_BAR_WIDTH,\n            disableSortBy: true,\n          });\n        }\n\n        cols.push(\n          {\n            Header: 'Baseline',\n            accessor: 'totalPercent',\n            Cell: ({ value }: { value: number }) => `${value.toFixed(2)}%`,\n            sortType: 'basic',\n            width: BASELINE_WIDTH,\n            minWidth: BASELINE_WIDTH,\n          },\n          {\n            Header: 'Comparison',\n            accessor: 'totalPercentRight',\n            Cell: ({ value }: { value: number | undefined }) => (value !== undefined ? `${value.toFixed(2)}%` : '-'),\n            sortType: 'basic',\n            width: COMPARISON_WIDTH,\n            minWidth: COMPARISON_WIDTH,\n          },\n          {\n            Header: 'Diff %',\n            accessor: 'diffPercent',\n            Cell: ({ value }: { value: number | undefined }) => <DiffCell value={value} theme={theme} />,\n            sortType: 'basic',\n            width: DIFF_WIDTH,\n            minWidth: DIFF_WIDTH,\n          }\n        );\n\n        return cols;\n      } else {\n        const cols: Array<Column<CallTreeNode>> = [...commonColumns];\n\n        if (!isCompact) {\n          cols.push(\n            {\n              Header: '',\n              id: 'colorBar',\n              Cell: ({ row }: { row: Row<CallTreeNode> }) => (\n                <ColorBarCell\n                  node={row.original}\n                  data={data}\n                  colorScheme={ColorScheme.PackageBased}\n                  theme={theme}\n                  focusedNode={focusedNode}\n                />\n              ),\n              minWidth: COLOR_BAR_WIDTH,\n              width: COLOR_BAR_WIDTH,\n              disableSortBy: true,\n            },\n            {\n              Header: 'Self',\n              accessor: 'self',\n              Cell: ({ row }: { row: Row<CallTreeNode> }) => {\n                const displaySelf = data.valueDisplayProcessor(row.original.self);\n                const formattedValue = displaySelf.suffix ? displaySelf.text + displaySelf.suffix : displaySelf.text;\n                return (\n                  <div className={styles.valueCell}>\n                    <span className={styles.valueNumber}>{formattedValue}</span>\n                    <span className={styles.percentNumber}>{row.original.selfPercent.toFixed(2)}%</span>\n                  </div>\n                );\n              },\n              sortType: 'basic',\n              minWidth: SELF_WIDTH,\n              width: SELF_WIDTH,\n            }\n          );\n        }\n\n        cols.push({\n          Header: 'Total',\n          accessor: 'total',\n          Cell: ({ row }: { row: Row<CallTreeNode> }) => {\n            const displayValue = data.valueDisplayProcessor(row.original.total);\n            const formattedValue = displayValue.suffix ? displayValue.text + displayValue.suffix : displayValue.text;\n            return (\n              <div className={styles.valueCell}>\n                <span className={styles.valueNumber}>{formattedValue}</span>\n                <span className={styles.percentNumber}>{row.original.totalPercent.toFixed(2)}%</span>\n              </div>\n            );\n          },\n          sortType: 'basic',\n          minWidth: TOTAL_WIDTH,\n          width: TOTAL_WIDTH,\n        });\n\n        return cols;\n      }\n    }, [commonColumns, data, isCompact, theme, styles, focusedNode]);\n\n    // currentSearchMatchId is intentionally in the deps despite not being used in the body.\n    // Creating a new array identity forces react-table (with autoResetExpanded: true) to\n    // recalculate the expanded state from initialState, which includes the path to the\n    // current search match.\n    const tableNodes = useMemo(() => {\n      return [...nodes];\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [nodes, currentSearchMatchId]);\n\n    const tableInstance = useTable<CallTreeNode>(\n      {\n        columns,\n        data: tableNodes,\n        getSubRows: (row) => row.children || [],\n        initialState: {\n          sortBy: [{ id: 'total', desc: true }],\n          expanded: expandedState,\n        },\n        autoResetExpanded: true,\n        autoResetSortBy: false,\n      },\n      useSortBy,\n      useExpanded\n    );\n\n    tableInstanceRef.current = tableInstance;\n    const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } = tableInstance;\n\n    return (\n      <div className={styles.container} data-testid=\"callTree\">\n        <div className={styles.toolbar}>\n          <div className={styles.toolbarLeft}>\n            {searchQuery && (\n              <div className={styles.searchContainer}>\n                {searchNodes.length > 0 && (\n                  <div className={styles.searchNavigation}>\n                    <span className={styles.searchCounter}>\n                      {currentMatchIndex + 1} of {searchNodes.length}\n                      {searchNodes.length >= 50 && '+'}\n                    </span>\n                    <Button\n                      icon=\"angle-up\"\n                      fill=\"text\"\n                      size=\"sm\"\n                      onClick={navigateToPrevMatch}\n                      tooltip=\"Previous match\"\n                      aria-label=\"Previous match\"\n                    />\n                    <Button\n                      icon=\"angle-down\"\n                      fill=\"text\"\n                      size=\"sm\"\n                      onClick={navigateToNextMatch}\n                      tooltip=\"Next match\"\n                      aria-label=\"Next match\"\n                    />\n                  </div>\n                )}\n                {searchQuery && searchNodes.length === 0 && !searchError && (\n                  <span className={styles.searchNoResults}>No matches found</span>\n                )}\n                {searchError && <span className={styles.searchError}>{searchError}</span>}\n              </div>\n            )}\n\n            {focusedNode && (\n              <Tooltip content={focusedNode.label} placement=\"top\">\n                <div className={styles.focusedItem}>\n                  <Icon size=\"sm\" name=\"compress-arrows\" />\n                  <span className={styles.focusedItemLabel}>\n                    {focusedNode.label.substring(focusedNode.label.lastIndexOf('/') + 1)}\n                  </span>\n                  <IconButton\n                    className={styles.modePillCloseButton}\n                    name=\"times\"\n                    size=\"sm\"\n                    onClick={() => handleSetFocusMode(undefined)}\n                    tooltip=\"Clear callees view\"\n                    aria-label=\"Clear callees view\"\n                  />\n                </div>\n              </Tooltip>\n            )}\n\n            {callersNode && (\n              <Tooltip content={callersNodeLabel || ''} placement=\"top\">\n                <div className={styles.callersItem}>\n                  <Icon size=\"sm\" name=\"expand-arrows-alt\" />\n                  <span className={styles.callersItemLabel}>\n                    {(callersNodeLabel || '').substring((callersNodeLabel || '').lastIndexOf('/') + 1)}\n                  </span>\n                  <IconButton\n                    className={styles.modePillCloseButton}\n                    name=\"times\"\n                    size=\"sm\"\n                    onClick={() => handleSetCallersMode(undefined)}\n                    tooltip=\"Clear callers view\"\n                    aria-label=\"Clear callers view\"\n                  />\n                </div>\n              </Tooltip>\n            )}\n          </div>\n        </div>\n\n        <div style={{ flex: 1, minHeight: 0, overflow: 'hidden' }}>\n          <AutoSizer>\n            {({ width, height }) => (\n              <CallTreeTable\n                width={width}\n                height={height}\n                compactModeThreshold={compactModeThreshold}\n                isCompact={isCompact}\n                setIsCompact={setIsCompact}\n                getFunctionColumnWidth={getFunctionColumnWidth}\n                getTableProps={getTableProps}\n                getTableBodyProps={getTableBodyProps}\n                headerGroups={headerGroups}\n                rows={rows}\n                prepareRow={prepareRow}\n                currentSearchMatchId={currentSearchMatchId}\n                searchMatchRowRef={searchMatchRowRef}\n                scrollContainerRef={scrollContainerRef}\n                focusedNodeId={focusedNodeId}\n                callersNodeLabel={callersNodeLabel}\n              />\n            )}\n          </AutoSizer>\n        </div>\n      </div>\n    );\n  }\n);\n\nFlameGraphCallTreeContainer.displayName = 'FlameGraphCallTreeContainer';\n\nexport default FlameGraphCallTreeContainer;\n\nfunction getStyles(theme: GrafanaTheme2) {\n  return {\n    container: css({\n      width: '100%',\n      height: '100%',\n      backgroundColor: theme.colors.background.primary,\n      display: 'flex',\n      flexDirection: 'column',\n    }),\n    toolbar: css({\n      display: 'flex',\n      alignItems: 'center',\n      paddingTop: theme.spacing(1),\n      paddingBottom: theme.spacing(1),\n      gap: theme.spacing(1),\n      flexWrap: 'wrap',\n      borderBottom: `1px solid ${theme.colors.border.weak}`,\n      '&:not(:has(> :not(:empty)))': {\n        display: 'none',\n      },\n    }),\n    toolbarLeft: css({\n      display: 'flex',\n      alignItems: 'center',\n      gap: theme.spacing(1),\n    }),\n    searchContainer: css({\n      display: 'flex',\n      alignItems: 'center',\n      gap: theme.spacing(1),\n      flexWrap: 'wrap',\n    }),\n    searchNavigation: css({\n      display: 'flex',\n      alignItems: 'center',\n      gap: theme.spacing(0.5),\n      padding: `0 ${theme.spacing(1)}`,\n    }),\n    searchCounter: css({\n      fontSize: theme.typography.bodySmall.fontSize,\n      color: theme.colors.text.secondary,\n      whiteSpace: 'nowrap',\n    }),\n    searchNoResults: css({\n      fontSize: theme.typography.bodySmall.fontSize,\n      color: theme.colors.text.secondary,\n      fontStyle: 'italic',\n    }),\n    searchError: css({\n      fontSize: theme.typography.bodySmall.fontSize,\n      color: theme.colors.error.text,\n    }),\n    actionsCell: css({\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      height: '20px',\n    }),\n    valueCell: css({\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      gap: '8px',\n      fontVariantNumeric: 'tabular-nums',\n      height: '20px',\n    }),\n    valueNumber: css({\n      flex: '1 1 auto',\n      textAlign: 'right',\n      whiteSpace: 'nowrap',\n      minWidth: '60px',\n    }),\n    percentNumber: css({\n      flex: '0 0 60px',\n      width: '60px',\n      textAlign: 'right',\n      color: theme.colors.text.secondary,\n      whiteSpace: 'nowrap',\n    }),\n    focusedItem: css({\n      display: 'inline-flex',\n      alignItems: 'center',\n      background: theme.colors.background.secondary,\n      borderRadius: theme.shape.radius.default,\n      padding: theme.spacing(0.5, 1),\n      fontSize: theme.typography.bodySmall.fontSize,\n      fontWeight: theme.typography.fontWeightMedium,\n      lineHeight: theme.typography.bodySmall.lineHeight,\n      color: theme.colors.text.secondary,\n    }),\n    focusedItemLabel: css({\n      maxWidth: '200px',\n      overflow: 'hidden',\n      textOverflow: 'ellipsis',\n      whiteSpace: 'nowrap',\n      marginLeft: theme.spacing(0.5),\n    }),\n    callersItem: css({\n      display: 'inline-flex',\n      alignItems: 'center',\n      background: theme.colors.background.secondary,\n      borderRadius: theme.shape.radius.default,\n      padding: theme.spacing(0.5, 1),\n      fontSize: theme.typography.bodySmall.fontSize,\n      fontWeight: theme.typography.fontWeightMedium,\n      lineHeight: theme.typography.bodySmall.lineHeight,\n      color: theme.colors.text.secondary,\n    }),\n    callersItemLabel: css({\n      maxWidth: '200px',\n      overflow: 'hidden',\n      textOverflow: 'ellipsis',\n      whiteSpace: 'nowrap',\n      marginLeft: theme.spacing(0.5),\n    }),\n    modePillCloseButton: css({\n      verticalAlign: 'text-bottom',\n      margin: theme.spacing(0, 0.5),\n    }),\n  };\n}\n"],"names":["memo","useState","useStyles2","useTheme2","useRef","useEffect","useCallback","useMemo","buildAllCallTreeNodes","focusedNode","buildCallersTree","searchError","getInitialExpandedState","nodes","isDiff","jsx","ActionsCell","FunctionCellWithExpander","ColorBarCell","ColorSchemeDiff","DiffCell","ColorScheme","jsxs","useTable","useSortBy","useExpanded","Button","Tooltip","Icon","IconButton","AutoSizer","CallTreeTable","css"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAkCA,SAAS,gBAAA,CAAiB,KAAA,EAAuB,SAAA,EAAmB,OAAA,EAA4C;AAC9G,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,UAAU,IAAA,CAAK,KAAA,KAAU,SAAA,GAAY,IAAA,CAAK,OAAO,SAAA,EAAW;AAC9D,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,QAAA,EAAU,WAAW,OAAO,CAAA;AAChE,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAA;AACT;AAEA,MAAM,2BAAA,GAA8BA,UAAA;AAAA,EAClC,CAAC;AAAA,IACC,IAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,kBAAA;AAAA,IACA,qBAAA;AAAA,IACA,0BAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF,KAAa;AACX,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,eAAS,KAAK,CAAA;AAChD,IAAA,MAAM,MAAA,GAASC,cAAW,SAAS,CAAA;AACnC,IAAA,MAAM,QAAQC,YAAA,EAAU;AAExB,IAAA,MAAM,kBAAA,GAAqBC,aAA8B,IAAI,CAAA;AAC7D,IAAA,MAAM,oBAAA,GAAuBA,aAA2B,KAAA,CAAS,CAAA;AACjE,IAAA,MAAM,mBAAmBA,YAAA,CAGtB,EAAE,MAAM,EAAC,EAAG,mBAAmB,MAAM;AAAA,IAAC,GAAG,CAAA;AAE5C,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIH,eAA6B,KAAA,CAAS,CAAA;AAChF,IAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAA6B,KAAA,CAAS,CAAA;AAEtF,IAAAI,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,iBAAiB,KAAA,CAAA,EAAW;AAC9B,QAAA,mBAAA,CAAoB,YAAY,CAAA;AAChC,QAAA,gBAAA,CAAiB,KAAA,CAAS,CAAA;AAAA,MAC5B,CAAA,MAAO;AACL,QAAA,mBAAA,CAAoB,KAAA,CAAS,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,IAAA,MAAM,WAAA,GAAc,MAAA;AACpB,IAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIJ,eAAiB,CAAC,CAAA;AAEpE,IAAA,MAAM,kBAAA,GAAqBK,iBAAA;AAAA,MACzB,CAAC,aAAA,EAAmC,OAAA,GAAU,KAAA,EAAO,WAAA,KAA2B;AAC9E,QAAA,IAAI,kBAAkB,KAAA,CAAA,EAAW;AAC/B,UAAA,gBAAA,CAAiB,KAAA,CAAS,CAAA;AAC1B,UAAA,qBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAwB,KAAA,CAAA,CAAA;AAAA,QAC1B,WAAW,OAAA,EAAS;AAClB,UAAA,gBAAA,CAAiB,CAAA,MAAA,EAAS,aAAa,CAAA,CAAE,CAAA;AACzC,UAAA,qBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAwB,WAAA,CAAA;AAAA,QAC1B,CAAA,MAAO;AACL,UAAA,gBAAA,CAAiB,aAAa,CAAA;AAC9B,UAAA,qBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAwB,WAAA,CAAA;AAAA,QAC1B;AAEA,QAAA,IAAI,kBAAkB,KAAA,CAAA,EAAW;AAC/B,UAAA,mBAAA,CAAoB,KAAA,CAAS,CAAA;AAAA,QAC/B;AAAA,MACF,CAAA;AAAA,MACA,CAAC,qBAAqB;AAAA,KACxB;AAEA,IAAA,MAAM,oBAAA,GAAuBA,iBAAA;AAAA,MAC3B,CAAC,KAAA,KAA8B;AAC7B,QAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,QAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,UAAA,gBAAA,CAAiB,KAAA,CAAS,CAAA;AAAA,QAC5B;AACA,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB,CAAA;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AAEA,IAAA,MAAM,QAAA,GAAWC,cAAQ,MAAMC,2BAAA,CAAsB,IAAI,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAElE,IAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,WAAA,EAAY,GAAID,cAAQ,MAAM;AACxD,MAAA,IAAI,UAAA,GAAa,QAAA;AACjB,MAAA,IAAIE,YAAAA;AACJ,MAAA,IAAI,iBAAA;AAEJ,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,UAAA,CAAW,QAAQ,CAAA;AACvD,QAAA,MAAM,SAAA,GAAY,aAAA,GAAgB,aAAA,CAAc,SAAA,CAAU,CAAC,CAAA,GAAI,aAAA;AAE/D,QAAAA,YAAAA,GAAc,gBAAA,CAAiB,QAAA,EAAU,SAAA,EAAW,aAAa,CAAA;AACjE,QAAA,IAAIA,YAAAA,EAAa;AACf,UAAA,IAAIA,aAAY,QAAA,EAAU;AACxB,YAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,QAAA,EAAUA,YAAAA,CAAY,UAAU,KAAK,CAAA;AACrE,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,MAAM,cAAA,GAA+B;AAAA,gBACnC,GAAG,MAAA;AAAA,gBACH,QAAA,EAAU,CAACA,YAAW;AAAA,eACxB;AACA,cAAA,UAAA,GAAa,CAAC,cAAc,CAAA;AAAA,YAC9B,CAAA,MAAO;AACL,cAAA,UAAA,GAAa,CAACA,YAAW,CAAA;AAAA,YAC3B;AAAA,UACF,CAAA,MAAO;AACL,YAAA,UAAA,GAAa,CAACA,YAAW,CAAA;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,MAAM,CAAC,OAAO,CAAA,GAAI,IAAA,CAAK,kBAAkB,gBAAgB,CAAA;AAEzD,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,UAAA,GAAaC,sBAAA,CAAiB,SAAS,IAAI,CAAA;AAC3C,UAAA,iBAAA,GAAoB,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,GAAI,KAAA,CAAA;AAAA,QAC9D,CAAA,MAAO;AACL,UAAA,UAAA,GAAa,EAAC;AACd,UAAA,iBAAA,GAAoB,KAAA,CAAA;AAAA,QACtB;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,WAAA,EAAaD,YAAAA,EAAa,aAAa,iBAAA,EAAkB;AAAA,IACvF,GAAG,CAAC,QAAA,EAAU,IAAA,EAAM,aAAA,EAAe,gBAAgB,CAAC,CAAA;AAEpD,IAAA,MAAM,mBAAA,GAAsBF,cAAQ,MAAM;AArK9C,MAAA,IAAA,EAAA;AAsKM,MAAA,IAAI,EAAC,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAe,UAAA,CAAW,QAAA,CAAA,CAAA,EAAW;AACxC,QAAA,OAAO,KAAA,CAAA;AAAA,MACT;AACA,MAAA,MAAM,SAAA,GAAY,aAAA,CAAc,SAAA,CAAU,CAAC,CAAA;AAC3C,MAAA,OAAA,CAAO,EAAA,GAAA,gBAAA,CAAiB,QAAA,EAAU,SAAA,EAAW,IAAI,MAA1C,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA6C,EAAA;AAAA,IACtD,CAAA,EAAG,CAAC,aAAA,EAAe,QAAQ,CAAC,CAAA;AAE5B,IAAAF,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,EAAC,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAe,UAAA,CAAW,QAAA,CAAA,CAAA,IAAa,CAAC,mBAAA,EAAqB;AAChE,QAAA;AAAA,MACF;AACA,MAAA,IAAI,wBAAwB,aAAA,EAAe;AACzC,QAAA,gBAAA,CAAiB,mBAAmB,CAAA;AAAA,MACtC;AAAA,IACF,CAAA,EAAG,CAAC,mBAAA,EAAqB,aAAa,CAAC,CAAA;AAEvC,IAAA,MAAM,WAAA,GAAcE,cAAQ,MAAM;AAChC,MAAA,IAAI,aAAA,IAAiB,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACrC,QAAA,OAAO,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA;AAAA,MAClB;AACA,MAAA,OAAO,CAAA;AAAA,IACT,CAAA,EAAG,CAAC,aAAA,EAAe,KAAK,CAAC,CAAA;AAEzB,IAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAY,GAAIA,cAAQ,MAAM;AACjD,MAAA,IAAI,CAAC,WAAA,CAAY,IAAA,EAAK,EAAG;AACvB,QAAA,OAAO,EAAE,WAAA,EAAa,EAAC,EAAG,aAAa,KAAA,CAAA,EAAU;AAAA,MACnD;AAEA,MAAA,MAAM,WAAA,GAAc,EAAA;AACpB,MAAA,MAAM,UAAgD,EAAC;AAEvD,MAAA,MAAM,UAAA,GAAa,oBAAA;AACnB,MAAA,IAAI,YAAA,GAAe,UAAA,CAAW,IAAA,CAAK,WAAW,CAAA;AAC9C,MAAA,IAAI,WAAA,GAA6B,IAAA;AACjC,MAAA,IAAII,YAAAA;AAEJ,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,IAAI;AACF,UAAA,WAAA,GAAc,IAAI,MAAA,CAAO,WAAA,EAAa,GAAG,CAAA;AAAA,QAC3C,SAAS,CAAA,EAAG;AACV,UAAAA,YAAAA,GAAc,uBAAA;AACd,UAAA,OAAO,EAAE,WAAA,EAAa,EAAC,EAAG,aAAAA,YAAAA,EAAY;AAAA,QACxC;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,CAAC,aAAA,KAAkC;AAClD,QAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,UAAA,IAAI,OAAA,CAAQ,UAAU,WAAA,EAAa;AACjC,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,OAAA,GAAU,KAAA;AACd,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,OAAA,GAAU,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,UACvC,CAAA,MAAO;AACL,YAAA,OAAA,GAAU,KAAK,KAAA,CAAM,WAAA,GAAc,QAAA,CAAS,WAAA,CAAY,aAAa,CAAA;AAAA,UACvE;AAEA,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,CAAK,IAAI,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAAA,UACjD;AAEA,UAAA,IAAI,IAAA,CAAK,QAAA,IAAY,OAAA,CAAQ,MAAA,GAAS,WAAA,EAAa;AACjD,YAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,UACxB;AAAA,QACF;AAAA,MACF,CAAA;AAEA,MAAA,QAAA,CAAS,KAAK,CAAA;AACd,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAExC,MAAA,MAAM,WAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAExC,MAAA,OAAO,EAAE,WAAA,EAAa,QAAA,EAAU,WAAA,EAAAA,YAAAA,EAAY;AAAA,IAC9C,CAAA,EAAG,CAAC,WAAA,EAAa,KAAK,CAAC,CAAA;AAEvB,IAAAN,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,kBAAA,IAAsB,kBAAA,CAAmB,MAAA,KAAW,CAAA,EAAG;AAC1D,QAAA,gBAAA,CAAiB,KAAA,CAAS,CAAA;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,EAAa,CAAA,KAAyB;AAC9D,QAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ;AACzB,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,CAAA,CAAE,MAAM,CAAC,GAAA,EAAK,QAAQ,GAAA,KAAQ,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,MAC7C,CAAA;AAEA,MAAA,MAAM,cAAA,GAAiB,CAAC,aAAA,KAAsD;AAC5E,QAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,UAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,kBAAkB,CAAA,EAAG;AACpE,YAAA,OAAO,IAAA,CAAK,EAAA;AAAA,UACd;AACA,UAAA,IAAI,KAAK,QAAA,EAAU;AACjB,YAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAC1C,YAAA,IAAI,KAAA,EAAO;AACT,cAAA,OAAO,KAAA;AAAA,YACT;AAAA,UACF;AAAA,QACF;AACA,QAAA,OAAO,KAAA,CAAA;AAAA,MACT,CAAA;AAEA,MAAA,MAAM,aAAA,GAAgB,eAAe,QAAQ,CAAA;AAC7C,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,gBAAA,CAAiB,aAAa,CAAA;AAAA,MAChC;AAAA,IACF,CAAA,EAAG,CAAC,kBAAA,EAAoB,QAAQ,CAAC,CAAA;AAEjC,IAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA;AAC5C,IAAAA,eAAA,CAAU,MAAM;AACd,MAAA,oBAAA,CAAqB,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAA;AAAA,IAEtD,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,oBAAA,CAAqB,CAAC,IAAA,KAAA,CAAU,IAAA,GAAO,CAAA,IAAK,YAAY,MAAM,CAAA;AAAA,MAChE;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,oBAAA,CAAqB,CAAC,IAAA,KAAA,CAAU,IAAA,GAAO,IAAI,WAAA,CAAY,MAAA,IAAU,YAAY,MAAM,CAAA;AAAA,MACrF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,oBAAA,GAAuBE,cAAQ,MAAM;AACzC,MAAA,IAAI,YAAY,MAAA,GAAS,CAAA,IAAK,qBAAqB,CAAA,IAAK,iBAAA,GAAoB,YAAY,MAAA,EAAQ;AAC9F,QAAA,OAAO,YAAY,iBAAiB,CAAA;AAAA,MACtC;AACA,MAAA,OAAO,KAAA,CAAA;AAAA,IACT,CAAA,EAAG,CAAC,WAAA,EAAa,iBAAiB,CAAC,CAAA;AAEnC,IAAA,MAAM,iBAAA,GAAoBD,iBAAA;AAAA,MACxB,CAAC,IAAA,KAAqC;AACpC,QAAA,IAAI,IAAA,IAAQ,oBAAA,IAAwB,oBAAA,KAAyB,oBAAA,CAAqB,OAAA,EAAS;AACzF,UAAA,oBAAA,CAAqB,OAAA,GAAU,oBAAA;AAC/B,UAAA,MAAM,YAAY,kBAAA,CAAmB,OAAA;AACrC,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,qBAAA,CAAsB,MAAM;AAC1B,cAAA,MAAM,OAAA,GAAU,KAAK,qBAAA,EAAsB;AAC3C,cAAA,MAAM,aAAA,GAAgB,UAAU,qBAAA,EAAsB;AACtD,cAAA,MAAM,yBAAA,GAA4B,OAAA,CAAQ,GAAA,GAAM,aAAA,CAAc,MAAM,SAAA,CAAU,SAAA;AAC9E,cAAA,MAAM,kBAAkB,yBAAA,GAA4B,SAAA,CAAU,YAAA,GAAe,CAAA,GAAI,QAAQ,MAAA,GAAS,CAAA;AAClG,cAAA,SAAA,CAAU,QAAA,CAAS;AAAA,gBACjB,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,eAAe,CAAA;AAAA,gBAChC,QAAA,EAAU;AAAA,eACX,CAAA;AAAA,YACH,CAAC,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,CAAC,oBAAoB;AAAA,KACvB;AAEA,IAAA,MAAM,aAAA,GAAgBC,cAAQ,MAAM;AAClC,MAAA,MAAM,YAAA,GAAeK,6BAAA,CAAwB,KAAA,EAAO,CAAC,CAAA;AAErD,MAAA,MAAM,gBAAA,GAAmB,CAACC,MAAAA,EAAuB,QAAA,KAA8B;AAC7E,QAAA,KAAA,MAAW,QAAQA,MAAAA,EAAO;AACxB,UAAA,IAAI,IAAA,CAAK,OAAO,QAAA,EAAU;AACxB,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7C,YAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AAC/D,YAAA,IAAI,cAAA,EAAgB;AAClB,cAAA,YAAA,CAAa,IAAA,CAAK,EAAE,CAAA,GAAI,IAAA;AACxB,cAAA,OAAO,IAAA;AAAA,YACT;AAAA,UACF;AAAA,QACF;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAA;AAEA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,gBAAA,CAAiB,OAAO,oBAAoB,CAAA;AAAA,MAC9C;AAEA,MAAA,IAAI,aAAA,IAAiB,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACrC,QAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AAExB,QAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,UAAA,CAAW,QAAQ,CAAA;AACvD,QAAA,MAAM,WAAA,GAAc,aAAA,GAAgB,aAAA,CAAc,SAAA,CAAU,CAAC,CAAA,GAAI,KAAA,CAAA;AAEjE,QAAA,IAAI,QAAA,CAAS,QAAA,IAAY,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AACrD,UAAA,YAAA,CAAa,GAAG,CAAA,GAAI,IAAA;AAAA,QACtB;AAEA,QAAA,MAAM,uBAAuB,aAAA,GAAgB,QAAA,CAAS,KAAA,KAAU,WAAA,GAAc,SAAS,EAAA,KAAO,aAAA;AAE9F,QAAA,IAAI,CAAC,oBAAA,IAAwB,QAAA,CAAS,YAAY,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AAC9E,UAAA,YAAA,CAAa,KAAK,CAAA,GAAI,IAAA;AAAA,QACxB;AAAA,MACF;AAEA,MAAA,IAAI,gBAAA,IAAoB,WAAA,IAAe,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACvD,QAAA,gBAAA,CAAiB,KAAA,EAAO,YAAY,EAAE,CAAA;AAEtC,QAAA,IAAI,WAAA,CAAY,QAAA,IAAY,WAAA,CAAY,QAAA,CAAS,SAAS,CAAA,EAAG;AAC3D,UAAA,YAAA,CAAa,WAAA,CAAY,EAAE,CAAA,GAAI,IAAA;AAAA,QACjC;AAAA,MACF;AAEA,MAAA,OAAO,YAAA;AAAA,IACT,GAAG,CAAC,KAAA,EAAO,eAAe,gBAAA,EAAkB,WAAA,EAAa,oBAAoB,CAAC,CAAA;AAE9E,IAAA,MAAM,aAAA,GAAgB,EAAA;AACtB,IAAA,MAAM,eAAA,GAAkB,GAAA;AACxB,IAAA,MAAM,UAAA,GAAa,GAAA;AACnB,IAAA,MAAM,WAAA,GAAc,GAAA;AACpB,IAAA,MAAM,cAAA,GAAiB,GAAA;AACvB,IAAA,MAAM,gBAAA,GAAmB,GAAA;AACzB,IAAA,MAAM,UAAA,GAAa,GAAA;AACnB,IAAA,MAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAA,MAAM,0BAAA,GAA6B,GAAA;AAEnC,IAAA,MAAM,oBAAA,GAAuB,CAACC,OAAAA,EAAiB,WAAA,KAAiC;AAC9E,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAOA,OAAAA,GAAS,aAAA,GAAgB,cAAA,GAAiB,gBAAA,GAAmB,aAAa,aAAA,GAAgB,WAAA;AAAA,MACnG;AACA,MAAA,OAAOA,OAAAA,GACH,gBAAgB,eAAA,GAAkB,cAAA,GAAiB,mBAAmB,UAAA,GACtE,aAAA,GAAgB,kBAAkB,UAAA,GAAa,WAAA;AAAA,IACrD,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,EAAiB;AAErC,IAAA,MAAM,oBAAA,GAAuB,oBAAA,CAAqB,MAAA,EAAQ,KAAK,CAAA,GAAI,0BAAA;AAEnE,IAAA,MAAM,sBAAA,GAAyB,CAAC,cAAA,EAAwB,WAAA,KAA6C;AACnG,MAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,QAAA,OAAO,KAAA,CAAA;AAAA,MACT;AACA,MAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,MAAA,EAAQ,WAAW,CAAA;AAC3D,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,cAAA,GAAiB,UAAA,EAAY,kBAAkB,CAAA;AAAA,IACjE,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgBP,cAAqC,MAAM;AAC/D,MAAA,OAAO;AAAA,QACL;AAAA,UACE,MAAA,EAAQ,EAAA;AAAA,UACR,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA,EAAM,CAAC,EAAE,GAAA,EAAI,KAA+B;AA1ZtD,YAAA,IAAA,EAAA,EAAA,EAAA;AA2ZY,YAAA,uBAAAQ,cAAA;AAAA,cAACC,uBAAA;AAAA,cAAA;AAAA,gBACC,MAAA,EAAQ,IAAI,QAAA,CAAS,EAAA;AAAA,gBACrB,KAAA,EAAO,IAAI,QAAA,CAAS,KAAA;AAAA,gBACpB,WAAA,EAAa,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,WAAA;AAAA,gBACpC,SAAA,EAAW,IAAI,QAAA,CAAS,SAAA;AAAA,gBACxB,aAAa,OAAA,CAAA,CAAQ,EAAA,GAAA,GAAA,CAAI,QAAA,CAAS,QAAA,KAAb,mBAAuB,MAAM,CAAA;AAAA,gBAClD,KAAA,EAAO,GAAA,CAAI,QAAA,CAAS,KAAA,GAAQ,WAAA;AAAA,gBAC5B,QAAA,EAAU,IAAI,QAAA,CAAS,QAAA;AAAA,gBACvB,OAAA,EAAS,kBAAA;AAAA,gBACT,aAAA,EAAe,oBAAA;AAAA,gBACf,QAAA;AAAA,gBACA,aAAA;AAAA,gBACA,gBAAA;AAAA,gBACA,gBAAe,EAAA,GAAA,WAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,WAAA,CAAa,QAAA,CAAS,GAAA,CAAI,QAAA,CAAS,QAAnC,IAAA,GAAA,EAAA,GAA0C,KAAA;AAAA,gBACzD,kBAAkB,MAAA,CAAO,WAAA;AAAA,gBACzB,0BAAA;AAAA,gBACA,IAAA;AAAA,gBACA,QAAA;AAAA,gBACA,QAAA;AAAA,gBACA;AAAA;AAAA,aACF;AAAA,UAAA,CAAA;AAAA,UAEF,KAAA,EAAO,aAAA;AAAA,UACP,QAAA,EAAU,aAAA;AAAA,UACV,aAAA,EAAe;AAAA,SACjB;AAAA,QACA;AAAA,UACE,MAAA,EAAQ,UAAA;AAAA,UACR,QAAA,EAAU,OAAA;AAAA,UACV,MAAM,CAAC,EAAE,GAAA,EAAK,KAAA,EAAO,UAAS,KAAiE;AAxbzG,YAAA,IAAA,EAAA;AAybY,YAAA,uBAAAD,cAAA;AAAA,cAACE,iDAAA;AAAA,cAAA;AAAA,gBAEC,GAAA;AAAA,gBACA,KAAA;AAAA,gBACA,KAAA,EAAO,GAAA,CAAI,QAAA,CAAS,KAAA,GAAQ,WAAA;AAAA,gBAC5B,aAAa,OAAA,CAAA,CAAQ,EAAA,GAAA,GAAA,CAAI,QAAA,CAAS,QAAA,KAAb,mBAAuB,MAAM,CAAA;AAAA,gBAClD,QAAA;AAAA,gBACA,IAAA,EAAM,iBAAiB,OAAA,CAAQ,IAAA;AAAA,gBAC/B,aAAA;AAAA,gBACA,OAAA,EAAS,SAAA;AAAA,gBACT,iBAAA,EAAmB,iBAAiB,OAAA,CAAQ;AAAA;AAAA,aAC9C;AAAA,UAAA,CAAA;AAAA,UAEF,QAAA,EAAU;AAAA;AACZ,OACF;AAAA,IACF,CAAA,EAAG;AAAA,MACD,gBAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,0BAAA;AAAA,MACA,oBAAA;AAAA,MACA,kBAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,OAAA,GAAUV,cAAqC,MAAM;AACzD,MAAA,IAAI,IAAA,CAAK,kBAAiB,EAAG;AAC3B,QAAA,MAAM,IAAA,GAAoC,CAAC,GAAG,aAAa,CAAA;AAE3D,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,IAAA,CAAK,IAAA,CAAK;AAAA,YACR,MAAA,EAAQ,EAAA;AAAA,YACR,EAAA,EAAI,UAAA;AAAA,YACJ,IAAA,EAAM,CAAC,EAAE,GAAA,EAAI,qBACXQ,cAAA;AAAA,cAACG,yBAAA;AAAA,cAAA;AAAA,gBACC,MAAM,GAAA,CAAI,QAAA;AAAA,gBACV,IAAA;AAAA,gBACA,aAAaC,qBAAA,CAAgB,OAAA;AAAA,gBAC7B,KAAA;AAAA,gBACA;AAAA;AAAA,aACF;AAAA,YAEF,QAAA,EAAU,eAAA;AAAA,YACV,KAAA,EAAO,eAAA;AAAA,YACP,aAAA,EAAe;AAAA,WAChB,CAAA;AAAA,QACH;AAEA,QAAA,IAAA,CAAK,IAAA;AAAA,UACH;AAAA,YACE,MAAA,EAAQ,UAAA;AAAA,YACR,QAAA,EAAU,cAAA;AAAA,YACV,IAAA,EAAM,CAAC,EAAE,KAAA,OAA+B,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,YAC3D,QAAA,EAAU,OAAA;AAAA,YACV,KAAA,EAAO,cAAA;AAAA,YACP,QAAA,EAAU;AAAA,WACZ;AAAA,UACA;AAAA,YACE,MAAA,EAAQ,YAAA;AAAA,YACR,QAAA,EAAU,mBAAA;AAAA,YACV,IAAA,EAAM,CAAC,EAAE,KAAA,EAAM,KAAsC,KAAA,KAAU,KAAA,CAAA,GAAY,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GAAM,GAAA;AAAA,YACpG,QAAA,EAAU,OAAA;AAAA,YACV,KAAA,EAAO,gBAAA;AAAA,YACP,QAAA,EAAU;AAAA,WACZ;AAAA,UACA;AAAA,YACE,MAAA,EAAQ,QAAA;AAAA,YACR,QAAA,EAAU,aAAA;AAAA,YACV,IAAA,EAAM,CAAC,EAAE,KAAA,uBAA2CJ,cAAA,CAACK,iBAAA,EAAA,EAAS,OAAc,KAAA,EAAc,CAAA;AAAA,YAC1F,QAAA,EAAU,OAAA;AAAA,YACV,KAAA,EAAO,UAAA;AAAA,YACP,QAAA,EAAU;AAAA;AACZ,SACF;AAEA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAoC,CAAC,GAAG,aAAa,CAAA;AAE3D,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,IAAA,CAAK,IAAA;AAAA,YACH;AAAA,cACE,MAAA,EAAQ,EAAA;AAAA,cACR,EAAA,EAAI,UAAA;AAAA,cACJ,IAAA,EAAM,CAAC,EAAE,GAAA,EAAI,qBACXL,cAAA;AAAA,gBAACG,yBAAA;AAAA,gBAAA;AAAA,kBACC,MAAM,GAAA,CAAI,QAAA;AAAA,kBACV,IAAA;AAAA,kBACA,aAAaG,iBAAA,CAAY,YAAA;AAAA,kBACzB,KAAA;AAAA,kBACA;AAAA;AAAA,eACF;AAAA,cAEF,QAAA,EAAU,eAAA;AAAA,cACV,KAAA,EAAO,eAAA;AAAA,cACP,aAAA,EAAe;AAAA,aACjB;AAAA,YACA;AAAA,cACE,MAAA,EAAQ,MAAA;AAAA,cACR,QAAA,EAAU,MAAA;AAAA,cACV,IAAA,EAAM,CAAC,EAAE,GAAA,EAAI,KAAkC;AAC7C,gBAAA,MAAM,WAAA,GAAc,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,SAAS,IAAI,CAAA;AAChE,gBAAA,MAAM,iBAAiB,WAAA,CAAY,MAAA,GAAS,YAAY,IAAA,GAAO,WAAA,CAAY,SAAS,WAAA,CAAY,IAAA;AAChG,gBAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,SAAA,EACrB,QAAA,EAAA;AAAA,kCAAAP,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,WAAA,EAAc,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,kCACrDO,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,aAAA,EAAgB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAI,QAAA,CAAS,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA;AAAA,oBAAE;AAAA,mBAAA,EAAC;AAAA,iBAAA,EAC/E,CAAA;AAAA,cAEJ,CAAA;AAAA,cACA,QAAA,EAAU,OAAA;AAAA,cACV,QAAA,EAAU,UAAA;AAAA,cACV,KAAA,EAAO;AAAA;AACT,WACF;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,MAAA,EAAQ,OAAA;AAAA,UACR,QAAA,EAAU,OAAA;AAAA,UACV,IAAA,EAAM,CAAC,EAAE,GAAA,EAAI,KAAkC;AAC7C,YAAA,MAAM,YAAA,GAAe,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,SAAS,KAAK,CAAA;AAClE,YAAA,MAAM,iBAAiB,YAAA,CAAa,MAAA,GAAS,aAAa,IAAA,GAAO,YAAA,CAAa,SAAS,YAAA,CAAa,IAAA;AACpG,YAAA,uBACEA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,SAAA,EACrB,QAAA,EAAA;AAAA,8BAAAP,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,WAAA,EAAc,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,8BACrDO,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,aAAA,EAAgB,QAAA,EAAA;AAAA,gBAAA,GAAA,CAAI,QAAA,CAAS,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAA;AAAA,gBAAE;AAAA,eAAA,EAAC;AAAA,aAAA,EAChF,CAAA;AAAA,UAEJ,CAAA;AAAA,UACA,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO;AAAA,SACR,CAAA;AAED,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,EAAG,CAAC,aAAA,EAAe,IAAA,EAAM,WAAW,KAAA,EAAO,MAAA,EAAQ,WAAW,CAAC,CAAA;AAM/D,IAAA,MAAM,UAAA,GAAaf,cAAQ,MAAM;AAC/B,MAAA,OAAO,CAAC,GAAG,KAAK,CAAA;AAAA,IAElB,CAAA,EAAG,CAAC,KAAA,EAAO,oBAAoB,CAAC,CAAA;AAEhC,IAAA,MAAM,aAAA,GAAgBgB,mBAAA;AAAA,MACpB;AAAA,QACE,OAAA;AAAA,QACA,IAAA,EAAM,UAAA;AAAA,QACN,UAAA,EAAY,CAAC,GAAA,KAAQ,GAAA,CAAI,YAAY,EAAC;AAAA,QACtC,YAAA,EAAc;AAAA,UACZ,QAAQ,CAAC,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,MAAM,CAAA;AAAA,UACpC,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,iBAAA,EAAmB,IAAA;AAAA,QACnB,eAAA,EAAiB;AAAA,OACnB;AAAA,MACAC,oBAAA;AAAA,MACAC;AAAA,KACF;AAEA,IAAA,gBAAA,CAAiB,OAAA,GAAU,aAAA;AAC3B,IAAA,MAAM,EAAE,aAAA,EAAe,iBAAA,EAAmB,YAAA,EAAc,IAAA,EAAM,YAAW,GAAI,aAAA;AAE7E,IAAA,uCACG,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,eAAY,UAAA,EAC5C,QAAA,EAAA;AAAA,sBAAAV,cAAA,CAAC,KAAA,EAAA,EAAI,WAAW,MAAA,CAAO,OAAA,EACrB,0CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAO,WAAA,EACpB,QAAA,EAAA;AAAA,QAAA,WAAA,oBACCO,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,eAAA,EACpB,QAAA,EAAA;AAAA,UAAA,WAAA,CAAY,SAAS,CAAA,oBACpBA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAO,gBAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,aAAA,EACrB,QAAA,EAAA;AAAA,cAAA,iBAAA,GAAoB,CAAA;AAAA,cAAE,MAAA;AAAA,cAAK,WAAA,CAAY,MAAA;AAAA,cACvC,WAAA,CAAY,UAAU,EAAA,IAAM;AAAA,aAAA,EAC/B,CAAA;AAAA,4BACAP,cAAA;AAAA,cAACW,SAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,UAAA;AAAA,gBACL,IAAA,EAAK,MAAA;AAAA,gBACL,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAS,mBAAA;AAAA,gBACT,OAAA,EAAQ,gBAAA;AAAA,gBACR,YAAA,EAAW;AAAA;AAAA,aACb;AAAA,4BACAX,cAAA;AAAA,cAACW,SAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,YAAA;AAAA,gBACL,IAAA,EAAK,MAAA;AAAA,gBACL,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAS,mBAAA;AAAA,gBACT,OAAA,EAAQ,YAAA;AAAA,gBACR,YAAA,EAAW;AAAA;AAAA;AACb,WAAA,EACF,CAAA;AAAA,UAED,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,CAAA,IAAK,CAAC,WAAA,oBAC3CX,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,eAAA,EAAiB,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,UAE1D,+BAAeA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,aAAc,QAAA,EAAA,WAAA,EAAY;AAAA,SAAA,EACpE,CAAA;AAAA,QAGD,WAAA,oBACCA,cAAA,CAACY,UAAA,EAAA,EAAQ,OAAA,EAAS,WAAA,CAAY,KAAA,EAAO,SAAA,EAAU,KAAA,EAC7C,QAAA,kBAAAL,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,WAAA,EACrB,QAAA,EAAA;AAAA,0BAAAP,cAAA,CAACa,OAAA,EAAA,EAAK,IAAA,EAAK,IAAA,EAAK,IAAA,EAAK,iBAAA,EAAkB,CAAA;AAAA,0BACvCb,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,kBACrB,QAAA,EAAA,WAAA,CAAY,KAAA,CAAM,SAAA,CAAU,WAAA,CAAY,KAAA,CAAM,WAAA,CAAY,GAAG,CAAA,GAAI,CAAC,CAAA,EACrE,CAAA;AAAA,0BACAA,cAAA;AAAA,YAACc,aAAA;AAAA,YAAA;AAAA,cACC,WAAW,MAAA,CAAO,mBAAA;AAAA,cAClB,IAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAS,MAAM,kBAAA,CAAmB,KAAA,CAAS,CAAA;AAAA,cAC3C,OAAA,EAAQ,oBAAA;AAAA,cACR,YAAA,EAAW;AAAA;AAAA;AACb,SAAA,EACF,CAAA,EACF,CAAA;AAAA,QAGD,WAAA,oBACCd,cAAA,CAACY,UAAA,EAAA,EAAQ,OAAA,EAAS,gBAAA,IAAoB,EAAA,EAAI,SAAA,EAAU,KAAA,EAClD,QAAA,kBAAAL,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,WAAA,EACrB,QAAA,EAAA;AAAA,0BAAAP,cAAA,CAACa,OAAA,EAAA,EAAK,IAAA,EAAK,IAAA,EAAK,IAAA,EAAK,mBAAA,EAAoB,CAAA;AAAA,0BACzCb,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,kBACpB,QAAA,EAAA,CAAA,gBAAA,IAAoB,EAAA,EAAI,SAAA,CAAA,CAAW,gBAAA,IAAoB,EAAA,EAAI,WAAA,CAAY,GAAG,CAAA,GAAI,CAAC,CAAA,EACnF,CAAA;AAAA,0BACAA,cAAA;AAAA,YAACc,aAAA;AAAA,YAAA;AAAA,cACC,WAAW,MAAA,CAAO,mBAAA;AAAA,cAClB,IAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAS,MAAM,oBAAA,CAAqB,KAAA,CAAS,CAAA;AAAA,cAC7C,OAAA,EAAQ,oBAAA;AAAA,cACR,YAAA,EAAW;AAAA;AAAA;AACb,SAAA,EACF,CAAA,EACF;AAAA,OAAA,EAEJ,CAAA,EACF,CAAA;AAAA,qCAEC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,GAAG,SAAA,EAAW,CAAA,EAAG,QAAA,EAAU,QAAA,IAC7C,QAAA,kBAAAd,cAAA,CAACe,0BAAA,EAAA,EACE,WAAC,EAAE,KAAA,EAAO,QAAO,qBAChBf,cAAA;AAAA,QAACgB,2BAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,MAAA;AAAA,UACA,oBAAA;AAAA,UACA,SAAA;AAAA,UACA,YAAA;AAAA,UACA,sBAAA;AAAA,UACA,aAAA;AAAA,UACA,iBAAA;AAAA,UACA,YAAA;AAAA,UACA,IAAA;AAAA,UACA,UAAA;AAAA,UACA,oBAAA;AAAA,UACA,iBAAA;AAAA,UACA,kBAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA;AAAA,SAGN,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,2BAAA,CAA4B,WAAA,GAAc,6BAAA;AAI1C,SAAS,UAAU,KAAA,EAAsB;AACvC,EAAA,OAAO;AAAA,IACL,WAAWC,OAAA,CAAI;AAAA,MACb,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,eAAA,EAAiB,KAAA,CAAM,MAAA,CAAO,UAAA,CAAW,OAAA;AAAA,MACzC,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe;AAAA,KAChB,CAAA;AAAA,IACD,SAASA,OAAA,CAAI;AAAA,MACX,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC3B,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC9B,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MACpB,QAAA,EAAU,MAAA;AAAA,MACV,YAAA,EAAc,CAAA,UAAA,EAAa,KAAA,CAAM,MAAA,CAAO,OAAO,IAAI,CAAA,CAAA;AAAA,MACnD,6BAAA,EAA+B;AAAA,QAC7B,OAAA,EAAS;AAAA;AACX,KACD,CAAA;AAAA,IACD,aAAaA,OAAA,CAAI;AAAA,MACf,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,KACrB,CAAA;AAAA,IACD,iBAAiBA,OAAA,CAAI;AAAA,MACnB,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MACpB,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,IACD,kBAAkBA,OAAA,CAAI;AAAA,MACpB,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,MACtB,OAAA,EAAS,CAAA,EAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,KAC/B,CAAA;AAAA,IACD,eAAeA,OAAA,CAAI;AAAA,MACjB,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,SAAA,CAAU,QAAA;AAAA,MACrC,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,SAAA;AAAA,MACzB,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,IACD,iBAAiBA,OAAA,CAAI;AAAA,MACnB,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,SAAA,CAAU,QAAA;AAAA,MACrC,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,SAAA;AAAA,MACzB,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,IACD,aAAaA,OAAA,CAAI;AAAA,MACf,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,SAAA,CAAU,QAAA;AAAA,MACrC,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM;AAAA,KAC3B,CAAA;AAAA,IACD,aAAaA,OAAA,CAAI;AAAA,MACf,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,IACD,WAAWA,OAAA,CAAI;AAAA,MACb,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,eAAA;AAAA,MAChB,GAAA,EAAK,KAAA;AAAA,MACL,kBAAA,EAAoB,cAAA;AAAA,MACpB,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,IACD,aAAaA,OAAA,CAAI;AAAA,MACf,IAAA,EAAM,UAAA;AAAA,MACN,SAAA,EAAW,OAAA;AAAA,MACX,UAAA,EAAY,QAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,IACD,eAAeA,OAAA,CAAI;AAAA,MACjB,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO,MAAA;AAAA,MACP,SAAA,EAAW,OAAA;AAAA,MACX,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,SAAA;AAAA,MACzB,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,IACD,aAAaA,OAAA,CAAI;AAAA,MACf,OAAA,EAAS,aAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,UAAA,CAAW,SAAA;AAAA,MACpC,YAAA,EAAc,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,OAAA;AAAA,MACjC,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA;AAAA,MAC7B,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,SAAA,CAAU,QAAA;AAAA,MACrC,UAAA,EAAY,MAAM,UAAA,CAAW,gBAAA;AAAA,MAC7B,UAAA,EAAY,KAAA,CAAM,UAAA,CAAW,SAAA,CAAU,UAAA;AAAA,MACvC,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK;AAAA,KAC1B,CAAA;AAAA,IACD,kBAAkBA,OAAA,CAAI;AAAA,MACpB,QAAA,EAAU,OAAA;AAAA,MACV,QAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAc,UAAA;AAAA,MACd,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,GAAG;AAAA,KAC9B,CAAA;AAAA,IACD,aAAaA,OAAA,CAAI;AAAA,MACf,OAAA,EAAS,aAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,UAAA,CAAW,SAAA;AAAA,MACpC,YAAA,EAAc,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,OAAA;AAAA,MACjC,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA;AAAA,MAC7B,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,SAAA,CAAU,QAAA;AAAA,MACrC,UAAA,EAAY,MAAM,UAAA,CAAW,gBAAA;AAAA,MAC7B,UAAA,EAAY,KAAA,CAAM,UAAA,CAAW,SAAA,CAAU,UAAA;AAAA,MACvC,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK;AAAA,KAC1B,CAAA;AAAA,IACD,kBAAkBA,OAAA,CAAI;AAAA,MACpB,QAAA,EAAU,OAAA;AAAA,MACV,QAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAc,UAAA;AAAA,MACd,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,GAAG;AAAA,KAC9B,CAAA;AAAA,IACD,qBAAqBA,OAAA,CAAI;AAAA,MACvB,aAAA,EAAe,aAAA;AAAA,MACf,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,GAAG;AAAA,KAC7B;AAAA,GACH;AACF;;;;"}