@weng-lab/genomebrowser-ui 0.1.5 → 0.1.6
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.
|
@@ -1941,48 +1941,58 @@ function ei(s) {
|
|
|
1941
1941
|
};
|
|
1942
1942
|
return Ze(() => {
|
|
1943
1943
|
R();
|
|
1944
|
-
}, [r, Ue, He, R]), /* @__PURE__ */ C.jsx(Qe, { sx: { width: "100%" }, children: /* @__PURE__ */ C.jsx(
|
|
1945
|
-
|
|
1946
|
-
width: "100%",
|
|
1947
|
-
overflow: "auto"
|
|
1948
|
-
}, children: /* @__PURE__ */ C.jsx(
|
|
1949
|
-
Os,
|
|
1944
|
+
}, [r, Ue, He, R]), /* @__PURE__ */ C.jsx(Qe, { sx: { width: "100%" }, children: /* @__PURE__ */ C.jsx(
|
|
1945
|
+
L,
|
|
1950
1946
|
{
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
autosizeOptions: Ve,
|
|
1956
|
-
rowGroupingModel: m,
|
|
1957
|
-
groupingColDef: { leafField: "displayname", display: "flex" },
|
|
1958
|
-
columnVisibilityModel: { displayname: !1 },
|
|
1959
|
-
onRowSelectionModelChange: t,
|
|
1960
|
-
rowSelectionPropagation: { descendants: !0 },
|
|
1961
|
-
rowSelectionModel: { type: "include", ids: new Set(F.keys()) },
|
|
1962
|
-
slots: {
|
|
1963
|
-
toolbar: E
|
|
1947
|
+
sx: {
|
|
1948
|
+
height: 500,
|
|
1949
|
+
width: "100%",
|
|
1950
|
+
overflow: "auto"
|
|
1964
1951
|
},
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1952
|
+
children: /* @__PURE__ */ C.jsx(
|
|
1953
|
+
Os,
|
|
1954
|
+
{
|
|
1955
|
+
apiRef: p,
|
|
1956
|
+
rows: r,
|
|
1957
|
+
columns: y,
|
|
1958
|
+
getRowId: (g) => g.experimentAccession,
|
|
1959
|
+
autosizeOptions: Ve,
|
|
1960
|
+
rowGroupingModel: m,
|
|
1961
|
+
groupingColDef: { leafField: "displayname", display: "flex" },
|
|
1962
|
+
columnVisibilityModel: { displayname: !1 },
|
|
1963
|
+
onRowSelectionModelChange: t,
|
|
1964
|
+
rowSelectionPropagation: { descendants: !0 },
|
|
1965
|
+
disableRowGrouping: !1,
|
|
1966
|
+
rowSelectionModel: {
|
|
1967
|
+
type: "include",
|
|
1968
|
+
ids: new Set(F.keys())
|
|
1969
|
+
},
|
|
1970
|
+
slots: {
|
|
1971
|
+
toolbar: E
|
|
1972
|
+
},
|
|
1973
|
+
slotProps: {
|
|
1974
|
+
filterPanel: {
|
|
1975
|
+
filterFormProps: {
|
|
1976
|
+
filterColumns: w
|
|
1977
|
+
}
|
|
1978
|
+
},
|
|
1979
|
+
columnsManagement: {
|
|
1980
|
+
getTogglableColumns: u
|
|
1981
|
+
}
|
|
1982
|
+
},
|
|
1983
|
+
keepNonExistentRowsSelected: !0,
|
|
1984
|
+
showToolbar: !0,
|
|
1985
|
+
disableAggregation: !0,
|
|
1986
|
+
disableRowSelectionExcludeModel: !0,
|
|
1987
|
+
disablePivoting: !0,
|
|
1988
|
+
checkboxSelection: !0,
|
|
1989
|
+
autosizeOnMount: !0,
|
|
1990
|
+
pagination: !0,
|
|
1991
|
+
hideFooterSelectedRowCount: !0
|
|
1973
1992
|
}
|
|
1974
|
-
|
|
1975
|
-
keepNonExistentRowsSelected: !0,
|
|
1976
|
-
showToolbar: !0,
|
|
1977
|
-
disableAggregation: !0,
|
|
1978
|
-
disableRowSelectionExcludeModel: !0,
|
|
1979
|
-
disablePivoting: !0,
|
|
1980
|
-
checkboxSelection: !0,
|
|
1981
|
-
autosizeOnMount: !0,
|
|
1982
|
-
pagination: !0,
|
|
1983
|
-
hideFooterSelectedRowCount: !0
|
|
1993
|
+
)
|
|
1984
1994
|
}
|
|
1985
|
-
) })
|
|
1995
|
+
) });
|
|
1986
1996
|
}
|
|
1987
1997
|
function si({
|
|
1988
1998
|
store: s,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"genomebrowser-ui.es.js","sources":["../../../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-runtime.js","../src/TrackSelect/DataGrid/CustomToolbar.tsx","../../../node_modules/.pnpm/fuse.js@7.1.0/node_modules/fuse.js/dist/fuse.mjs","../src/TrackSelect/DataGrid/dataGridHelpers.tsx","../src/TrackSelect/consts.ts","../src/TrackSelect/TreeView/treeViewHelpers.tsx","../src/TrackSelect/DataGrid/columns.tsx","../src/TrackSelect/DataGrid/DataGridWrapper.tsx","../src/TrackSelect/TreeView/TreeViewWrapper.tsx","../src/TrackSelect/TrackSelect.tsx","../../../node_modules/.pnpm/zustand@5.0.9_@types+react@19.2.7_react@19.2.3_use-sync-external-store@1.6.0_react@19.2.3_/node_modules/zustand/esm/vanilla.mjs","../../../node_modules/.pnpm/zustand@5.0.9_@types+react@19.2.7_react@19.2.3_use-sync-external-store@1.6.0_react@19.2.3_/node_modules/zustand/esm/react.mjs","../src/TrackSelect/store.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import * as React from \"react\";\nimport {\n Toolbar,\n ToolbarButton,\n ColumnsPanelTrigger,\n FilterPanelTrigger,\n ExportCsv,\n ExportPrint,\n GridToolbarProps,\n ToolbarPropsOverrides,\n ExportExcel,\n} from \"@mui/x-data-grid-premium\";\nimport Tooltip from \"@mui/material/Tooltip\";\nimport Menu from \"@mui/material/Menu\";\nimport Badge from \"@mui/material/Badge\";\nimport ViewColumnIcon from \"@mui/icons-material/ViewColumn\";\nimport FilterListIcon from \"@mui/icons-material/FilterList\";\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport Divider from \"@mui/material/Divider\";\nimport Typography from \"@mui/material/Typography\";\nimport { DataGridProps } from \"../types\";\nimport { InfoOutline } from \"@mui/icons-material\";\n\ntype CustomToolbarProps = {\n label: DataGridProps[\"label\"];\n downloadFileName: DataGridProps[\"downloadFileName\"];\n labelTooltip: DataGridProps[\"labelTooltip\"];\n toolbarSlot?: DataGridProps[\"toolbarSlot\"];\n toolbarStyle?: DataGridProps[\"toolbarStyle\"];\n toolbarIconColor?: DataGridProps[\"toolbarIconColor\"];\n} & GridToolbarProps &\n ToolbarPropsOverrides;\n\nexport function CustomToolbar({\n label,\n downloadFileName,\n labelTooltip,\n toolbarSlot,\n toolbarStyle,\n toolbarIconColor,\n ...restToolbarProps\n}: CustomToolbarProps) {\n const [exportMenuOpen, setExportMenuOpen] = React.useState(false);\n const exportMenuTriggerRef = React.useRef<HTMLButtonElement>(null);\n\n const iconColor = toolbarIconColor ?? \"inherit\";\n\n return (\n <Toolbar style={{ ...toolbarStyle }}>\n {typeof label !== \"string\" && label}\n <Typography\n fontWeight=\"medium\"\n sx={{ flex: 1, mx: 0.5, display: \"flex\", alignItems: \"center\", gap: 1 }}\n >\n {typeof label === \"string\" && label}\n {/* ReactNode can be more than just an element, string, or number but not accounting for that for simplicity */}\n {labelTooltip &&\n (typeof labelTooltip === \"string\" ||\n typeof labelTooltip === \"number\") ? (\n <Tooltip title={labelTooltip}>\n <InfoOutline fontSize=\"inherit\" color=\"primary\" />\n </Tooltip>\n ) : (\n labelTooltip\n )}\n </Typography>\n {toolbarSlot && (\n <>\n {toolbarSlot}\n <Divider\n orientation=\"vertical\"\n variant=\"middle\"\n flexItem\n sx={{ mx: 0.5 }}\n />\n </>\n )}\n\n <Tooltip title=\"Columns\">\n <ColumnsPanelTrigger render={<ToolbarButton />}>\n <ViewColumnIcon fontSize=\"small\" htmlColor={iconColor} />\n </ColumnsPanelTrigger>\n </Tooltip>\n\n <Tooltip title=\"Filters\">\n <FilterPanelTrigger\n render={(props, state) => (\n <ToolbarButton {...props} color=\"default\">\n <Badge\n badgeContent={state.filterCount}\n color=\"primary\"\n variant=\"dot\"\n >\n <FilterListIcon fontSize=\"small\" htmlColor={iconColor} />\n </Badge>\n </ToolbarButton>\n )}\n />\n </Tooltip>\n <Divider\n orientation=\"vertical\"\n variant=\"middle\"\n flexItem\n sx={{ mx: 0.5 }}\n />\n <Tooltip title=\"Export\">\n <ToolbarButton\n ref={exportMenuTriggerRef}\n id=\"export-menu-trigger\"\n aria-controls=\"export-menu\"\n aria-haspopup=\"true\"\n aria-expanded={exportMenuOpen ? \"true\" : undefined}\n onClick={() => setExportMenuOpen(true)}\n >\n <FileDownloadIcon fontSize=\"small\" htmlColor={iconColor} />\n </ToolbarButton>\n </Tooltip>\n\n <Menu\n id=\"export-menu\"\n anchorEl={exportMenuTriggerRef.current}\n open={exportMenuOpen}\n onClose={() => setExportMenuOpen(false)}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n transformOrigin={{ vertical: \"top\", horizontal: \"right\" }}\n slotProps={{\n list: {\n \"aria-labelledby\": \"export-menu-trigger\",\n },\n }}\n >\n <ExportPrint\n options={{ ...restToolbarProps.printOptions }}\n render={<MenuItem />}\n onClick={() => setExportMenuOpen(false)}\n >\n Print\n </ExportPrint>\n <ExportCsv\n options={{\n fileName: typeof label === \"string\" ? label : downloadFileName,\n ...restToolbarProps.csvOptions,\n }}\n render={<MenuItem />}\n onClick={() => setExportMenuOpen(false)}\n >\n Download as CSV\n </ExportCsv>\n <ExportExcel\n options={{ ...restToolbarProps.excelOptions }}\n render={<MenuItem />}\n onClick={() => setExportMenuOpen(false)}\n >\n Download as Excel\n </ExportExcel>\n </Menu>\n </Toolbar>\n );\n}\n","/**\n * Fuse.js v7.1.0 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2025 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n return !Array.isArray\n ? getTag(value) === '[object Array]'\n : Array.isArray(value)\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js\nconst INFINITY = 1 / 0;\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value\n }\n let result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result\n}\n\nfunction toString(value) {\n return value == null ? '' : baseToString(value)\n}\n\nfunction isString(value) {\n return typeof value === 'string'\n}\n\nfunction isNumber(value) {\n return typeof value === 'number'\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n return (\n value === true ||\n value === false ||\n (isObjectLike(value) && getTag(value) == '[object Boolean]')\n )\n}\n\nfunction isObject(value) {\n return typeof value === 'object'\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n return isObject(value) && value !== null\n}\n\nfunction isDefined(value) {\n return value !== undefined && value !== null\n}\n\nfunction isBlank(value) {\n return !value.trim().length\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n return value == null\n ? value === undefined\n ? '[object Undefined]'\n : '[object Null]'\n : Object.prototype.toString.call(value)\n}\n\nconst EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available';\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\n\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) =>\n `Invalid value for key ${key}`;\n\nconst PATTERN_LENGTH_TOO_LARGE = (max) =>\n `Pattern length exceeds max of ${max}.`;\n\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\n\nconst INVALID_KEY_WEIGHT_VALUE = (key) =>\n `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nclass KeyStore {\n constructor(keys) {\n this._keys = [];\n this._keyMap = {};\n\n let totalWeight = 0;\n\n keys.forEach((key) => {\n let obj = createKey(key);\n\n this._keys.push(obj);\n this._keyMap[obj.id] = obj;\n\n totalWeight += obj.weight;\n });\n\n // Normalize weights so that their sum is equal to 1\n this._keys.forEach((key) => {\n key.weight /= totalWeight;\n });\n }\n get(keyId) {\n return this._keyMap[keyId]\n }\n keys() {\n return this._keys\n }\n toJSON() {\n return JSON.stringify(this._keys)\n }\n}\n\nfunction createKey(key) {\n let path = null;\n let id = null;\n let src = null;\n let weight = 1;\n let getFn = null;\n\n if (isString(key) || isArray(key)) {\n src = key;\n path = createKeyPath(key);\n id = createKeyId(key);\n } else {\n if (!hasOwn.call(key, 'name')) {\n throw new Error(MISSING_KEY_PROPERTY('name'))\n }\n\n const name = key.name;\n src = name;\n\n if (hasOwn.call(key, 'weight')) {\n weight = key.weight;\n\n if (weight <= 0) {\n throw new Error(INVALID_KEY_WEIGHT_VALUE(name))\n }\n }\n\n path = createKeyPath(name);\n id = createKeyId(name);\n getFn = key.getFn;\n }\n\n return { path, id, weight, src, getFn }\n}\n\nfunction createKeyPath(key) {\n return isArray(key) ? key : key.split('.')\n}\n\nfunction createKeyId(key) {\n return isArray(key) ? key.join('.') : key\n}\n\nfunction get(obj, path) {\n let list = [];\n let arr = false;\n\n const deepGet = (obj, path, index) => {\n if (!isDefined(obj)) {\n return\n }\n if (!path[index]) {\n // If there's no path left, we've arrived at the object we care about.\n list.push(obj);\n } else {\n let key = path[index];\n\n const value = obj[key];\n\n if (!isDefined(value)) {\n return\n }\n\n // If we're at the last value in the path, and if it's a string/number/bool,\n // add it to the list\n if (\n index === path.length - 1 &&\n (isString(value) || isNumber(value) || isBoolean(value))\n ) {\n list.push(toString(value));\n } else if (isArray(value)) {\n arr = true;\n // Search each item in the array.\n for (let i = 0, len = value.length; i < len; i += 1) {\n deepGet(value[i], path, index + 1);\n }\n } else if (path.length) {\n // An object. Recurse further.\n deepGet(value, path, index + 1);\n }\n }\n };\n\n // Backwards compatibility (since path used to be a string)\n deepGet(obj, isString(path) ? path.split('.') : path, 0);\n\n return arr ? list : list[0]\n}\n\nconst MatchOptions = {\n // Whether the matches should be included in the result set. When `true`, each record in the result\n // set will include the indices of the matched characters.\n // These can consequently be used for highlighting purposes.\n includeMatches: false,\n // When `true`, the matching function will continue to the end of a search pattern even if\n // a perfect match has already been located in the string.\n findAllMatches: false,\n // Minimum number of characters that must be matched before a result is considered a match\n minMatchCharLength: 1\n};\n\nconst BasicOptions = {\n // When `true`, the algorithm continues searching to the end of the input even if a perfect\n // match is found before the end of the same input.\n isCaseSensitive: false,\n // When `true`, the algorithm will ignore diacritics (accents) in comparisons\n ignoreDiacritics: false,\n // When true, the matching function will continue to the end of a search pattern even if\n includeScore: false,\n // List of properties that will be searched. This also supports nested properties.\n keys: [],\n // Whether to sort the result list, by score\n shouldSort: true,\n // Default sort function: sort by ascending score, ascending index\n sortFn: (a, b) =>\n a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1\n};\n\nconst FuzzyOptions = {\n // Approximately where in the text is the pattern expected to be found?\n location: 0,\n // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n // (of both letters and location), a threshold of '1.0' would match anything.\n threshold: 0.6,\n // Determines how close the match must be to the fuzzy location (specified above).\n // An exact letter match which is 'distance' characters away from the fuzzy location\n // would score as a complete mismatch. A distance of '0' requires the match be at\n // the exact location specified, a threshold of '1000' would require a perfect match\n // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n distance: 100\n};\n\nconst AdvancedOptions = {\n // When `true`, it enables the use of unix-like search commands\n useExtendedSearch: false,\n // The get function to use when fetching an object's properties.\n // The default will search nested paths *ie foo.bar.baz*\n getFn: get,\n // When `true`, search will ignore `location` and `distance`, so it won't matter\n // where in the string the pattern appears.\n // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score\n ignoreLocation: false,\n // When `true`, the calculation for the relevance score (used for sorting) will\n // ignore the field-length norm.\n // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm\n ignoreFieldNorm: false,\n // The weight to determine how much field length norm effects scoring.\n fieldNormWeight: 1\n};\n\nvar Config = {\n ...BasicOptions,\n ...MatchOptions,\n ...FuzzyOptions,\n ...AdvancedOptions\n};\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n const cache = new Map();\n const m = Math.pow(10, mantissa);\n\n return {\n get(value) {\n const numTokens = value.match(SPACE).length;\n\n if (cache.has(numTokens)) {\n return cache.get(numTokens)\n }\n\n // Default function is 1/sqrt(x), weight makes that variable\n const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n // In place of `toFixed(mantissa)`, for faster computation\n const n = parseFloat(Math.round(norm * m) / m);\n\n cache.set(numTokens, n);\n\n return n\n },\n clear() {\n cache.clear();\n }\n }\n}\n\nclass FuseIndex {\n constructor({\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n } = {}) {\n this.norm = norm(fieldNormWeight, 3);\n this.getFn = getFn;\n this.isCreated = false;\n\n this.setIndexRecords();\n }\n setSources(docs = []) {\n this.docs = docs;\n }\n setIndexRecords(records = []) {\n this.records = records;\n }\n setKeys(keys = []) {\n this.keys = keys;\n this._keysMap = {};\n keys.forEach((key, idx) => {\n this._keysMap[key.id] = idx;\n });\n }\n create() {\n if (this.isCreated || !this.docs.length) {\n return\n }\n\n this.isCreated = true;\n\n // List is Array<String>\n if (isString(this.docs[0])) {\n this.docs.forEach((doc, docIndex) => {\n this._addString(doc, docIndex);\n });\n } else {\n // List is Array<Object>\n this.docs.forEach((doc, docIndex) => {\n this._addObject(doc, docIndex);\n });\n }\n\n this.norm.clear();\n }\n // Adds a doc to the end of the index\n add(doc) {\n const idx = this.size();\n\n if (isString(doc)) {\n this._addString(doc, idx);\n } else {\n this._addObject(doc, idx);\n }\n }\n // Removes the doc at the specified index of the index\n removeAt(idx) {\n this.records.splice(idx, 1);\n\n // Change ref index of every subsquent doc\n for (let i = idx, len = this.size(); i < len; i += 1) {\n this.records[i].i -= 1;\n }\n }\n getValueForItemAtKeyId(item, keyId) {\n return item[this._keysMap[keyId]]\n }\n size() {\n return this.records.length\n }\n _addString(doc, docIndex) {\n if (!isDefined(doc) || isBlank(doc)) {\n return\n }\n\n let record = {\n v: doc,\n i: docIndex,\n n: this.norm.get(doc)\n };\n\n this.records.push(record);\n }\n _addObject(doc, docIndex) {\n let record = { i: docIndex, $: {} };\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n this.keys.forEach((key, keyIndex) => {\n let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\n if (!isDefined(value)) {\n return\n }\n\n if (isArray(value)) {\n let subRecords = [];\n const stack = [{ nestedArrIndex: -1, value }];\n\n while (stack.length) {\n const { nestedArrIndex, value } = stack.pop();\n\n if (!isDefined(value)) {\n continue\n }\n\n if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n i: nestedArrIndex,\n n: this.norm.get(value)\n };\n\n subRecords.push(subRecord);\n } else if (isArray(value)) {\n value.forEach((item, k) => {\n stack.push({\n nestedArrIndex: k,\n value: item\n });\n });\n } else ;\n }\n record.$[keyIndex] = subRecords;\n } else if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n n: this.norm.get(value)\n };\n\n record.$[keyIndex] = subRecord;\n }\n });\n\n this.records.push(record);\n }\n toJSON() {\n return {\n keys: this.keys,\n records: this.records\n }\n }\n}\n\nfunction createIndex(\n keys,\n docs,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys.map(createKey));\n myIndex.setSources(docs);\n myIndex.create();\n return myIndex\n}\n\nfunction parseIndex(\n data,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const { keys, records } = data;\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys);\n myIndex.setIndexRecords(records);\n return myIndex\n}\n\nfunction computeScore$1(\n pattern,\n {\n errors = 0,\n currentLocation = 0,\n expectedLocation = 0,\n distance = Config.distance,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n const accuracy = errors / pattern.length;\n\n if (ignoreLocation) {\n return accuracy\n }\n\n const proximity = Math.abs(expectedLocation - currentLocation);\n\n if (!distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy\n }\n\n return accuracy + proximity / distance\n}\n\nfunction convertMaskToIndices(\n matchmask = [],\n minMatchCharLength = Config.minMatchCharLength\n) {\n let indices = [];\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (let len = matchmask.length; i < len; i += 1) {\n let match = matchmask[i];\n if (match && start === -1) {\n start = i;\n } else if (!match && start !== -1) {\n end = i - 1;\n if (end - start + 1 >= minMatchCharLength) {\n indices.push([start, end]);\n }\n start = -1;\n }\n }\n\n // (i-1 - start) + 1 => i - start\n if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n indices.push([start, i - 1]);\n }\n\n return indices\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(\n text,\n pattern,\n patternAlphabet,\n {\n location = Config.location,\n distance = Config.distance,\n threshold = Config.threshold,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n includeMatches = Config.includeMatches,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n if (pattern.length > MAX_BITS) {\n throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS))\n }\n\n const patternLen = pattern.length;\n // Set starting location at beginning text and initialize the alphabet.\n const textLen = text.length;\n // Handle the case when location > text.length\n const expectedLocation = Math.max(0, Math.min(location, textLen));\n // Highest score beyond which we give up.\n let currentThreshold = threshold;\n // Is there a nearby exact match? (speedup)\n let bestLocation = expectedLocation;\n\n // Performance: only computer matches when the minMatchCharLength > 1\n // OR if `includeMatches` is true.\n const computeMatches = minMatchCharLength > 1 || includeMatches;\n // A mask of the matches, used for building the indices\n const matchMask = computeMatches ? Array(textLen) : [];\n\n let index;\n\n // Get all exact matches, here for speed up\n while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n let score = computeScore$1(pattern, {\n currentLocation: index,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n currentThreshold = Math.min(score, currentThreshold);\n bestLocation = index + patternLen;\n\n if (computeMatches) {\n let i = 0;\n while (i < patternLen) {\n matchMask[index + i] = 1;\n i += 1;\n }\n }\n }\n\n // Reset the best location\n bestLocation = -1;\n\n let lastBitArr = [];\n let finalScore = 1;\n let binMax = patternLen + textLen;\n\n const mask = 1 << (patternLen - 1);\n\n for (let i = 0; i < patternLen; i += 1) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from the match location we can stray\n // at this error level.\n let binMin = 0;\n let binMid = binMax;\n\n while (binMin < binMid) {\n const score = computeScore$1(pattern, {\n errors: i,\n currentLocation: expectedLocation + binMid,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score <= currentThreshold) {\n binMin = binMid;\n } else {\n binMax = binMid;\n }\n\n binMid = Math.floor((binMax - binMin) / 2 + binMin);\n }\n\n // Use the result from this iteration as the maximum for the next.\n binMax = binMid;\n\n let start = Math.max(1, expectedLocation - binMid + 1);\n let finish = findAllMatches\n ? textLen\n : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n // Initialize the bit array\n let bitArr = Array(finish + 2);\n\n bitArr[finish + 1] = (1 << i) - 1;\n\n for (let j = finish; j >= start; j -= 1) {\n let currentLocation = j - 1;\n let charMatch = patternAlphabet[text.charAt(currentLocation)];\n\n if (computeMatches) {\n // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n matchMask[currentLocation] = +!!charMatch;\n }\n\n // First pass: exact match\n bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch;\n\n // Subsequent passes: fuzzy match\n if (i) {\n bitArr[j] |=\n ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1];\n }\n\n if (bitArr[j] & mask) {\n finalScore = computeScore$1(pattern, {\n errors: i,\n currentLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (finalScore <= currentThreshold) {\n // Indeed it is\n currentThreshold = finalScore;\n bestLocation = currentLocation;\n\n // Already passed `loc`, downhill from here on in.\n if (bestLocation <= expectedLocation) {\n break\n }\n\n // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n start = Math.max(1, 2 * expectedLocation - bestLocation);\n }\n }\n }\n\n // No hope for a (better) match at greater error levels.\n const score = computeScore$1(pattern, {\n errors: i + 1,\n currentLocation: expectedLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score > currentThreshold) {\n break\n }\n\n lastBitArr = bitArr;\n }\n\n const result = {\n isMatch: bestLocation >= 0,\n // Count exact matches (those with a score of 0) to be \"almost\" exact\n score: Math.max(0.001, finalScore)\n };\n\n if (computeMatches) {\n const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n if (!indices.length) {\n result.isMatch = false;\n } else if (includeMatches) {\n result.indices = indices;\n }\n }\n\n return result\n}\n\nfunction createPatternAlphabet(pattern) {\n let mask = {};\n\n for (let i = 0, len = pattern.length; i < len; i += 1) {\n const char = pattern.charAt(i);\n mask[char] = (mask[char] || 0) | (1 << (len - i - 1));\n }\n\n return mask\n}\n\nconst stripDiacritics = String.prototype.normalize\n ? ((str) => str.normalize('NFD').replace(/[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C04\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00-\\u0D03\\u0D3B\\u0D3C\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF7-\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F]/g, ''))\n : ((str) => str);\n\nclass BitapSearch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n this.options = {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n };\n\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n\n this.chunks = [];\n\n if (!this.pattern.length) {\n return\n }\n\n const addChunk = (pattern, startIndex) => {\n this.chunks.push({\n pattern,\n alphabet: createPatternAlphabet(pattern),\n startIndex\n });\n };\n\n const len = this.pattern.length;\n\n if (len > MAX_BITS) {\n let i = 0;\n const remainder = len % MAX_BITS;\n const end = len - remainder;\n\n while (i < end) {\n addChunk(this.pattern.substr(i, MAX_BITS), i);\n i += MAX_BITS;\n }\n\n if (remainder) {\n const startIndex = len - MAX_BITS;\n addChunk(this.pattern.substr(startIndex), startIndex);\n }\n } else {\n addChunk(this.pattern, 0);\n }\n }\n\n searchIn(text) {\n const { isCaseSensitive, ignoreDiacritics, includeMatches } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n // Exact match\n if (this.pattern === text) {\n let result = {\n isMatch: true,\n score: 0\n };\n\n if (includeMatches) {\n result.indices = [[0, text.length - 1]];\n }\n\n return result\n }\n\n // Otherwise, use Bitap algorithm\n const {\n location,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n ignoreLocation\n } = this.options;\n\n let allIndices = [];\n let totalScore = 0;\n let hasMatches = false;\n\n this.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n const { isMatch, score, indices } = search(text, pattern, alphabet, {\n location: location + startIndex,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n includeMatches,\n ignoreLocation\n });\n\n if (isMatch) {\n hasMatches = true;\n }\n\n totalScore += score;\n\n if (isMatch && indices) {\n allIndices = [...allIndices, ...indices];\n }\n });\n\n let result = {\n isMatch: hasMatches,\n score: hasMatches ? totalScore / this.chunks.length : 1\n };\n\n if (hasMatches && includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n}\n\nclass BaseMatch {\n constructor(pattern) {\n this.pattern = pattern;\n }\n static isMultiMatch(pattern) {\n return getMatch(pattern, this.multiRegex)\n }\n static isSingleMatch(pattern) {\n return getMatch(pattern, this.singleRegex)\n }\n search(/*text*/) {}\n}\n\nfunction getMatch(pattern, exp) {\n const matches = pattern.match(exp);\n return matches ? matches[1] : null\n}\n\n// Token: 'file\n\nclass ExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'exact'\n }\n static get multiRegex() {\n return /^=\"(.*)\"$/\n }\n static get singleRegex() {\n return /^=(.*)$/\n }\n search(text) {\n const isMatch = text === this.pattern;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !fire\n\nclass InverseExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!(.*)$/\n }\n search(text) {\n const index = text.indexOf(this.pattern);\n const isMatch = index === -1;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: ^file\n\nclass PrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'prefix-exact'\n }\n static get multiRegex() {\n return /^\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^\\^(.*)$/\n }\n search(text) {\n const isMatch = text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !^fire\n\nclass InversePrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-prefix-exact'\n }\n static get multiRegex() {\n return /^!\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!\\^(.*)$/\n }\n search(text) {\n const isMatch = !text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: .file$\n\nclass SuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'suffix-exact'\n }\n static get multiRegex() {\n return /^\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^(.*)\\$$/\n }\n search(text) {\n const isMatch = text.endsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [text.length - this.pattern.length, text.length - 1]\n }\n }\n}\n\n// Token: !.file$\n\nclass InverseSuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-suffix-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^!(.*)\\$$/\n }\n search(text) {\n const isMatch = !text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\nclass FuzzyMatch extends BaseMatch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n super(pattern);\n this._bitapSearch = new BitapSearch(pattern, {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n });\n }\n static get type() {\n return 'fuzzy'\n }\n static get multiRegex() {\n return /^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^(.*)$/\n }\n search(text) {\n return this._bitapSearch.searchIn(text)\n }\n}\n\n// Token: 'file\n\nclass IncludeMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'include'\n }\n static get multiRegex() {\n return /^'\"(.*)\"$/\n }\n static get singleRegex() {\n return /^'(.*)$/\n }\n search(text) {\n let location = 0;\n let index;\n\n const indices = [];\n const patternLen = this.pattern.length;\n\n // Get all exact matches\n while ((index = text.indexOf(this.pattern, location)) > -1) {\n location = index + patternLen;\n indices.push([index, location - 1]);\n }\n\n const isMatch = !!indices.length;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices\n }\n }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [\n ExactMatch,\n IncludeMatch,\n PrefixExactMatch,\n InversePrefixExactMatch,\n InverseSuffixExactMatch,\n SuffixExactMatch,\n InverseExactMatch,\n FuzzyMatch\n];\n\nconst searchersLen = searchers.length;\n\n// Regex to split by spaces, but keep anything in quotes together\nconst SPACE_RE = / +(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/;\nconst OR_TOKEN = '|';\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n return pattern.split(OR_TOKEN).map((item) => {\n let query = item\n .trim()\n .split(SPACE_RE)\n .filter((item) => item && !!item.trim());\n\n let results = [];\n for (let i = 0, len = query.length; i < len; i += 1) {\n const queryItem = query[i];\n\n // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n let found = false;\n let idx = -1;\n while (!found && ++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isMultiMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n found = true;\n }\n }\n\n if (found) {\n continue\n }\n\n // 2. Handle single query matches (i.e, once that are *not* quoted)\n idx = -1;\n while (++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isSingleMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n break\n }\n }\n }\n\n return results\n })\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\n\n/**\n * Command-like searching\n * ======================\n *\n * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,\n * search in a given text.\n *\n * Search syntax:\n *\n * | Token | Match type | Description |\n * | ----------- | -------------------------- | -------------------------------------- |\n * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` |\n * | `=scheme` | exact-match | Items that are `scheme` |\n * | `'python` | include-match | Items that include `python` |\n * | `!ruby` | inverse-exact-match | Items that do not include `ruby` |\n * | `^java` | prefix-exact-match | Items that start with `java` |\n * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |\n * | `.js$` | suffix-exact-match | Items that end with `.js` |\n * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` |\n *\n * A single pipe character acts as an OR operator. For example, the following\n * query matches entries that start with `core` and end with either`go`, `rb`,\n * or`py`.\n *\n * ```\n * ^core go$ | rb$ | py$\n * ```\n */\nclass ExtendedSearch {\n constructor(\n pattern,\n {\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n includeMatches = Config.includeMatches,\n minMatchCharLength = Config.minMatchCharLength,\n ignoreLocation = Config.ignoreLocation,\n findAllMatches = Config.findAllMatches,\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance\n } = {}\n ) {\n this.query = null;\n this.options = {\n isCaseSensitive,\n ignoreDiacritics,\n includeMatches,\n minMatchCharLength,\n findAllMatches,\n ignoreLocation,\n location,\n threshold,\n distance\n };\n\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n this.query = parseQuery(this.pattern, this.options);\n }\n\n static condition(_, options) {\n return options.useExtendedSearch\n }\n\n searchIn(text) {\n const query = this.query;\n\n if (!query) {\n return {\n isMatch: false,\n score: 1\n }\n }\n\n const { includeMatches, isCaseSensitive, ignoreDiacritics } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n let numMatches = 0;\n let allIndices = [];\n let totalScore = 0;\n\n // ORs\n for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n const searchers = query[i];\n\n // Reset indices\n allIndices.length = 0;\n numMatches = 0;\n\n // ANDs\n for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n const searcher = searchers[j];\n const { isMatch, indices, score } = searcher.search(text);\n\n if (isMatch) {\n numMatches += 1;\n totalScore += score;\n if (includeMatches) {\n const type = searcher.constructor.type;\n if (MultiMatchSet.has(type)) {\n allIndices = [...allIndices, ...indices];\n } else {\n allIndices.push(indices);\n }\n }\n } else {\n totalScore = 0;\n numMatches = 0;\n allIndices.length = 0;\n break\n }\n }\n\n // OR condition, so if TRUE, return\n if (numMatches) {\n let result = {\n isMatch: true,\n score: totalScore / numMatches\n };\n\n if (includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n }\n\n // Nothing was matched\n return {\n isMatch: false,\n score: 1\n }\n }\n}\n\nconst registeredSearchers = [];\n\nfunction register(...args) {\n registeredSearchers.push(...args);\n}\n\nfunction createSearcher(pattern, options) {\n for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n let searcherClass = registeredSearchers[i];\n if (searcherClass.condition(pattern, options)) {\n return new searcherClass(pattern, options)\n }\n }\n\n return new BitapSearch(pattern, options)\n}\n\nconst LogicalOperator = {\n AND: '$and',\n OR: '$or'\n};\n\nconst KeyType = {\n PATH: '$path',\n PATTERN: '$val'\n};\n\nconst isExpression = (query) =>\n !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\n\nconst isPath = (query) => !!query[KeyType.PATH];\n\nconst isLeaf = (query) =>\n !isArray(query) && isObject(query) && !isExpression(query);\n\nconst convertToExplicit = (query) => ({\n [LogicalOperator.AND]: Object.keys(query).map((key) => ({\n [key]: query[key]\n }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, { auto = true } = {}) {\n const next = (query) => {\n let keys = Object.keys(query);\n\n const isQueryPath = isPath(query);\n\n if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n return next(convertToExplicit(query))\n }\n\n if (isLeaf(query)) {\n const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\n const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\n if (!isString(pattern)) {\n throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))\n }\n\n const obj = {\n keyId: createKeyId(key),\n pattern\n };\n\n if (auto) {\n obj.searcher = createSearcher(pattern, options);\n }\n\n return obj\n }\n\n let node = {\n children: [],\n operator: keys[0]\n };\n\n keys.forEach((key) => {\n const value = query[key];\n\n if (isArray(value)) {\n value.forEach((item) => {\n node.children.push(next(item));\n });\n }\n });\n\n return node\n };\n\n if (!isExpression(query)) {\n query = convertToExplicit(query);\n }\n\n return next(query)\n}\n\n// Practical scoring function\nfunction computeScore(\n results,\n { ignoreFieldNorm = Config.ignoreFieldNorm }\n) {\n results.forEach((result) => {\n let totalScore = 1;\n\n result.matches.forEach(({ key, norm, score }) => {\n const weight = key ? key.weight : null;\n\n totalScore *= Math.pow(\n score === 0 && weight ? Number.EPSILON : score,\n (weight || 1) * (ignoreFieldNorm ? 1 : norm)\n );\n });\n\n result.score = totalScore;\n });\n}\n\nfunction transformMatches(result, data) {\n const matches = result.matches;\n data.matches = [];\n\n if (!isDefined(matches)) {\n return\n }\n\n matches.forEach((match) => {\n if (!isDefined(match.indices) || !match.indices.length) {\n return\n }\n\n const { indices, value } = match;\n\n let obj = {\n indices,\n value\n };\n\n if (match.key) {\n obj.key = match.key.src;\n }\n\n if (match.idx > -1) {\n obj.refIndex = match.idx;\n }\n\n data.matches.push(obj);\n });\n}\n\nfunction transformScore(result, data) {\n data.score = result.score;\n}\n\nfunction format(\n results,\n docs,\n {\n includeMatches = Config.includeMatches,\n includeScore = Config.includeScore\n } = {}\n) {\n const transformers = [];\n\n if (includeMatches) transformers.push(transformMatches);\n if (includeScore) transformers.push(transformScore);\n\n return results.map((result) => {\n const { idx } = result;\n\n const data = {\n item: docs[idx],\n refIndex: idx\n };\n\n if (transformers.length) {\n transformers.forEach((transformer) => {\n transformer(result, data);\n });\n }\n\n return data\n })\n}\n\nclass Fuse {\n constructor(docs, options = {}, index) {\n this.options = { ...Config, ...options };\n\n if (\n this.options.useExtendedSearch &&\n !true\n ) {\n throw new Error(EXTENDED_SEARCH_UNAVAILABLE)\n }\n\n this._keyStore = new KeyStore(this.options.keys);\n\n this.setCollection(docs, index);\n }\n\n setCollection(docs, index) {\n this._docs = docs;\n\n if (index && !(index instanceof FuseIndex)) {\n throw new Error(INCORRECT_INDEX_TYPE)\n }\n\n this._myIndex =\n index ||\n createIndex(this.options.keys, this._docs, {\n getFn: this.options.getFn,\n fieldNormWeight: this.options.fieldNormWeight\n });\n }\n\n add(doc) {\n if (!isDefined(doc)) {\n return\n }\n\n this._docs.push(doc);\n this._myIndex.add(doc);\n }\n\n remove(predicate = (/* doc, idx */) => false) {\n const results = [];\n\n for (let i = 0, len = this._docs.length; i < len; i += 1) {\n const doc = this._docs[i];\n if (predicate(doc, i)) {\n this.removeAt(i);\n i -= 1;\n len -= 1;\n\n results.push(doc);\n }\n }\n\n return results\n }\n\n removeAt(idx) {\n this._docs.splice(idx, 1);\n this._myIndex.removeAt(idx);\n }\n\n getIndex() {\n return this._myIndex\n }\n\n search(query, { limit = -1 } = {}) {\n const {\n includeMatches,\n includeScore,\n shouldSort,\n sortFn,\n ignoreFieldNorm\n } = this.options;\n\n let results = isString(query)\n ? isString(this._docs[0])\n ? this._searchStringList(query)\n : this._searchObjectList(query)\n : this._searchLogical(query);\n\n computeScore(results, { ignoreFieldNorm });\n\n if (shouldSort) {\n results.sort(sortFn);\n }\n\n if (isNumber(limit) && limit > -1) {\n results = results.slice(0, limit);\n }\n\n return format(results, this._docs, {\n includeMatches,\n includeScore\n })\n }\n\n _searchStringList(query) {\n const searcher = createSearcher(query, this.options);\n const { records } = this._myIndex;\n const results = [];\n\n // Iterate over every string in the index\n records.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n results.push({\n item: text,\n idx,\n matches: [{ score, value: text, norm, indices }]\n });\n }\n });\n\n return results\n }\n\n _searchLogical(query) {\n\n const expression = parse(query, this.options);\n\n const evaluate = (node, item, idx) => {\n if (!node.children) {\n const { keyId, searcher } = node;\n\n const matches = this._findMatches({\n key: this._keyStore.get(keyId),\n value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n searcher\n });\n\n if (matches && matches.length) {\n return [\n {\n idx,\n item,\n matches\n }\n ]\n }\n\n return []\n }\n\n const res = [];\n for (let i = 0, len = node.children.length; i < len; i += 1) {\n const child = node.children[i];\n const result = evaluate(child, item, idx);\n if (result.length) {\n res.push(...result);\n } else if (node.operator === LogicalOperator.AND) {\n return []\n }\n }\n return res\n };\n\n const records = this._myIndex.records;\n const resultMap = {};\n const results = [];\n\n records.forEach(({ $: item, i: idx }) => {\n if (isDefined(item)) {\n let expResults = evaluate(expression, item, idx);\n\n if (expResults.length) {\n // Dedupe when adding\n if (!resultMap[idx]) {\n resultMap[idx] = { idx, item, matches: [] };\n results.push(resultMap[idx]);\n }\n expResults.forEach(({ matches }) => {\n resultMap[idx].matches.push(...matches);\n });\n }\n }\n });\n\n return results\n }\n\n _searchObjectList(query) {\n const searcher = createSearcher(query, this.options);\n const { keys, records } = this._myIndex;\n const results = [];\n\n // List is Array<Object>\n records.forEach(({ $: item, i: idx }) => {\n if (!isDefined(item)) {\n return\n }\n\n let matches = [];\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n keys.forEach((key, keyIndex) => {\n matches.push(\n ...this._findMatches({\n key,\n value: item[keyIndex],\n searcher\n })\n );\n });\n\n if (matches.length) {\n results.push({\n idx,\n item,\n matches\n });\n }\n });\n\n return results\n }\n _findMatches({ key, value, searcher }) {\n if (!isDefined(value)) {\n return []\n }\n\n let matches = [];\n\n if (isArray(value)) {\n value.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n idx,\n norm,\n indices\n });\n }\n });\n } else {\n const { v: text, n: norm } = value;\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({ score, key, value: text, norm, indices });\n }\n }\n\n return matches\n }\n}\n\nFuse.version = '7.1.0';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\n\n{\n Fuse.parseQuery = parse;\n}\n\n{\n register(ExtendedSearch);\n}\n\nexport { Fuse as default };\n","import { capitalize } from \"@mui/material\";\nimport Fuse, { FuseResult } from \"fuse.js\";\nimport tracksData from \"../Data/modifiedHumanTracks.json\";\nimport { AssayInfo, RowInfo, SearchTracksProps, TrackInfo } from \"../types\";\n\nfunction formatAssayType(assay: string): string {\n switch (assay) {\n case \"dnase\":\n return \"DNase\";\n case \"atac\":\n return \"ATAC\";\n case \"h3k4me3\":\n return \"H3K4me3\";\n case \"h3k27ac\":\n return \"H3K27ac\";\n case \"ctcf\":\n return \"CTCF\";\n case \"chromhmm\":\n return \"ChromHMM\";\n default:\n return assay;\n }\n}\n\n// use to get nested data in JSON file\nfunction getNestedValue(obj: any, path: string): any {\n return path.split(\".\").reduce((acc, key) => acc && acc[key], obj);\n}\n\nexport function getTracksByAssayAndOntology(\n assay: string,\n ontology: string,\n): TrackInfo[] {\n let res: TrackInfo[] = [];\n const data = getNestedValue(tracksData, \"tracks\");\n\n data.forEach((track: TrackInfo) => {\n const filteredAssays =\n track.assays?.filter((e: AssayInfo) => e.assay === assay.toLowerCase()) ||\n [];\n if (\n filteredAssays.length > 0 &&\n track.ontology === ontology.toLowerCase()\n ) {\n res.push({\n ...track,\n assays: filteredAssays,\n });\n }\n });\n return res;\n}\n\n/** Flatten TrackInfo or FuseResult into RowInfo for DataGrid display.\n * @param track TrackInfo object or FuseResult containing information from JSON file\n * @returns Flattened RowInfo object\n */\nexport function flattenIntoRow(track: TrackInfo): RowInfo {\n const { ontology, lifeStage, sampleType, displayname } = track;\n const { assay, experimentAccession, fileAccession, url } = track.assays[0];\n\n return {\n ontology: capitalize(ontology),\n lifeStage: capitalize(lifeStage),\n sampleType: capitalize(sampleType),\n displayname: capitalize(displayname),\n assay: formatAssayType(assay),\n experimentAccession,\n fileAccession,\n url,\n };\n}\n\n/**\n * Fuzzy search in tracks stored in a JSON file.\n *\n * @param jsonStructure - Dot-separated path to the data array in the JSON structure.\n * @param query - The search query string.\n * @param keyWeightMap - Array of keys to search within each track object.\n * Can look like [\"name\", \"author\"] or if weighted, [\n {\n name: 'title',\n weight: 0.3\n },\n {\n name: 'author',\n weight: 0.7\n }\n ].\n * @param threshold - (Optional) Threshold for the fuzzy search (default is 0.5).\n * Smaller = stricter match, larger = fuzzier since 0 is perfect match and 1 is worst match.\n * @param limit - (Optional) Maximum number of results to return (default is 10).\n * @returns FuseResult object containing the search results.\n */\nexport function searchTracks({\n jsonStructure,\n query,\n keyWeightMap,\n threshold = 0.75,\n}: SearchTracksProps): FuseResult<TrackInfo>[] {\n const data = getNestedValue(tracksData, jsonStructure ?? \"\");\n\n const fuse = new Fuse(data, {\n includeScore: true,\n shouldSort: true,\n threshold: threshold,\n keys: keyWeightMap,\n });\n return fuse.search(query);\n}\n","import {\n getTracksByAssayAndOntology,\n flattenIntoRow,\n} from \"./DataGrid/dataGridHelpers\";\nimport { RowInfo, TrackInfo } from \"./types\";\n\nexport const assayTypes = [\n \"DNase\",\n \"H3K4me3\",\n \"H3K27ac\",\n \"ATAC\",\n \"CTCF\",\n \"ChromHMM\",\n];\n\nexport const ontologyTypes = [\n \"Adipose\",\n \"Adrenal gland\",\n \"Blood\",\n \"Blood vessel\",\n \"Bone\",\n \"Bone marrow\",\n \"Brain\",\n \"Breast\",\n \"Connective tissue\",\n \"Embryo\",\n \"Epithelium\",\n \"Esophagus\",\n \"Eye\",\n \"Fallopian Tube\",\n \"Gallbladder\",\n \"Heart\",\n \"Kidney\",\n \"Large Intestine\",\n \"Limb\",\n \"Liver\",\n \"Lung\",\n \"Lymphoid Tissue\",\n \"Muscle\",\n \"Mouth\",\n \"Nerve\",\n \"Nose\",\n \"Pancreas\",\n \"Parathyroid Gland\",\n \"Ovary\",\n \"Penis\",\n \"Placenta\",\n \"Prostate\",\n \"Skin\",\n \"Small Intestine\",\n \"Spinal Cord\",\n \"Spleen\",\n \"Stomach\",\n \"Testis\",\n \"Thymus\",\n \"Thyroid\",\n \"Urinary Bladder\",\n \"Uterus\",\n \"Vagina\",\n];\n\nexport const rows = ontologyTypes.flatMap((ontology) =>\n assayTypes.flatMap((assay) =>\n getTracksByAssayAndOntology(\n assay.toLowerCase(),\n ontology.toLowerCase(),\n ).map((r: TrackInfo) => {\n const flat = flattenIntoRow(r);\n return {\n ...flat,\n assay,\n ontology,\n };\n }),\n ),\n);\n\n// map of experimentAccession -> rowInfo for faster row lookup\nexport const rowById = new Map<string, RowInfo>(\n rows.map((r) => [r.experimentAccession, r]),\n);\n\n/**\n * Check if an ID is a real track (exists in rowById) vs an auto-generated group ID\n */\nexport const isTrackId = (id: string): boolean => rowById.has(id);\n\n/**\n * Filter a set of IDs to return only real track IDs (no auto-generated group IDs)\n */\nexport const getActiveTracks = (selectedIds: Set<string>): Set<string> =>\n new Set(Array.from(selectedIds).filter(isTrackId));\n","import Folder from \"@mui/icons-material/Folder\";\nimport IndeterminateCheckBoxRoundedIcon from \"@mui/icons-material/IndeterminateCheckBoxRounded\";\nimport { Box, Typography, Stack } from \"@mui/material\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { alpha, styled } from \"@mui/material/styles\";\nimport { TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport {\n TreeItemCheckbox,\n TreeItemIconContainer,\n TreeItemLabel,\n} from \"@mui/x-tree-view/TreeItem\";\nimport { TreeItemIcon } from \"@mui/x-tree-view/TreeItemIcon\";\nimport { TreeItemProvider } from \"@mui/x-tree-view/TreeItemProvider\";\nimport { useTreeItemModel } from \"@mui/x-tree-view/hooks\";\nimport { useTreeItem } from \"@mui/x-tree-view/useTreeItem\";\nimport React from \"react\";\nimport {\n CustomLabelProps,\n CustomTreeItemProps,\n ExtendedTreeItemProps,\n RowInfo,\n} from \"../types\";\nimport Fuse, { FuseResult } from \"fuse.js\";\nimport { SearchTracksProps } from \"../types\";\nimport { assayTypes, ontologyTypes } from \"../consts\";\n\n\n/**\n * Builds tree in the sorted by assay view\n * @param selectedIds: list of ids (from useSelectionStore)\n * @param root: Root TreeViewBaseItem\n * @param rowById: Mapping between an id (experimentAccession) and its RowInfo object\n * @returns all of the items for the RichTreeView in TreeViewWrapper\n */\nexport function buildSortedAssayTreeView(\n selectedIds: string[],\n root: TreeViewBaseItem<ExtendedTreeItemProps>,\n rowById: Map<string, RowInfo>,\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n const assayMap = new Map<string, TreeViewBaseItem<ExtendedTreeItemProps>>(); // keep track of top level nodes\n const ontologyMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n const sampleAssayMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n let idx = 1;\n\n const selectedRows = selectedIds.reduce<RowInfo[]>((acc, id) => {\n const row = rowById.get(id);\n if (row) acc.push(row);\n return acc;\n }, []);\n\n selectedRows.forEach((row) => {\n let assayNode = assayMap.get(row.assay);\n if (!assayNode) {\n assayNode = {\n id: row.assay,\n isAssayItem: true,\n label: row.assay,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n assayMap.set(row.assay, assayNode);\n root.children!.push(assayNode);\n }\n\n let ontologyNode = ontologyMap.get(row.ontology + row.assay);\n if (!ontologyNode) {\n ontologyNode = {\n id: row.ontology + \"_\" + idx++,\n isAssayItem: false,\n label: row.ontology,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n assayNode.children!.push(ontologyNode);\n ontologyMap.set(row.ontology + row.assay, ontologyNode);\n }\n\n const displayNameNode: TreeViewBaseItem<ExtendedTreeItemProps> = {\n id: row.displayname + \"_\" + idx++,\n isAssayItem: false,\n label: row.displayname,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyNode.children!.push(displayNameNode);\n\n let expNode = sampleAssayMap.get(row.displayname + row.experimentAccession);\n if (!expNode) {\n expNode = {\n id: row.experimentAccession,\n isAssayItem: false,\n label: row.experimentAccession,\n icon: row.assay,\n children: [],\n };\n sampleAssayMap.set(row.displayname + row.assay, expNode);\n displayNameNode.children!.push(expNode);\n }\n assayNode.allExpAccessions!.push(row.experimentAccession);\n ontologyNode.allExpAccessions!.push(row.experimentAccession);\n displayNameNode.allExpAccessions!.push(row.experimentAccession);\n root.allRowInfo!.push(row);\n });\n // standardize the order of the assay folders everytime one is added\n root.children!.sort((a, b): number => {\n return assayTypes.indexOf(a.id) - assayTypes.indexOf(b.id);\n });\n return [root];\n}\n\n/**\n * Builds tree in the sorted by assay view\n * @param selectedIds: list of ids (from useSelectionStore)\n * @param root: Root TreeViewBaseItem\n * @param rowById: Mapping between an id (experimentAccession) and its RowInfo object\n * @returns all of the items for the RichTreeView in TreeViewWrapper\n */\nexport function buildTreeView(\n selectedIds: string[],\n root: TreeViewBaseItem<ExtendedTreeItemProps>,\n rowById: Map<string, RowInfo>,\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n const ontologyMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >(); // keep track of top level nodes\n const displayNameMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n const sampleAssayMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n\n const selectedRows = selectedIds.reduce<RowInfo[]>((acc, id) => {\n const row = rowById.get(id);\n if (row) acc.push(row);\n return acc;\n }, []);\n\n selectedRows.forEach((row) => {\n if (!row) {\n return;\n }\n let ontologyNode = ontologyMap.get(row.ontology);\n if (!ontologyNode) {\n ontologyNode = {\n id: row.ontology,\n label: row.ontology,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyMap.set(row.ontology, ontologyNode);\n root.children!.push(ontologyNode);\n }\n\n let displayNameNode = displayNameMap.get(row.displayname);\n if (!displayNameNode) {\n displayNameNode = {\n id: row.displayname,\n label: row.displayname,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyNode.children!.push(displayNameNode);\n displayNameMap.set(row.displayname, displayNameNode);\n }\n\n let expNode = sampleAssayMap.get(row.displayname + row.assay);\n if (!expNode) {\n expNode = {\n id: row.experimentAccession,\n label: row.experimentAccession,\n icon: row.assay,\n children: [],\n };\n sampleAssayMap.set(row.displayname + row.assay, expNode);\n displayNameNode.children!.push(expNode);\n }\n ontologyNode.allExpAccessions!.push(row.experimentAccession);\n displayNameNode.allExpAccessions!.push(row.experimentAccession);\n root.allRowInfo!.push(row);\n });\n // standardize the order of the assay folders everytime one is added\n root.children!.sort((a, b): number => {\n return ontologyTypes.indexOf(a.id) - ontologyTypes.indexOf(b.id);\n });\n return [root];\n}\n\n/**\n * Fuzzy search of active tracks.\n *\n * @param treeItems - TreeBaseViewItems from the tree.\n * @param query - The search query string.\n * @param keyWeightMap - Array of keys to search within each track object.\n * Can look like [\"name\", \"author\"] or if weighted, [\n {\n name: 'title',\n weight: 0.3\n },\n {\n name: 'author',\n weight: 0.7\n }\n ].\n * @param threshold - (Optional) Threshold for the fuzzy search (default is 0.5).\n * Smaller = stricter match, larger = fuzzier since 0 is perfect match and 1 is worst match.\n * @param limit - (Optional) Maximum number of results to return (default is 10).\n * @returns FuseResult object containing the search results.\n */\nexport function searchTreeItems({\n treeItems,\n query,\n keyWeightMap,\n threshold,\n limit = 10\n}: SearchTracksProps): FuseResult<RowInfo>[] {\n const data = treeItems![0].allRowInfo ?? [];\n const fuse = new Fuse(data, {\n includeScore: true,\n shouldSort: true,\n threshold: threshold,\n keys: keyWeightMap,\n });\n return fuse.search(query, { limit: limit });\n}\n\n/**\n * Creates the assay icon for DataGrid and RichTreeView\n * @param type: assay type\n * @returns an icon of the assay's respective color\n */\nexport function AssayIcon(type: string) {\n const colorMap: { [key: string]: string } = {\n DNase: \"#06da93\",\n ATAC: \"#02c7b9\",\n H3K4me3: \"#ff2020\",\n ChromHMM: \"#0097a7\",\n H3K27ac: \"#fdc401\",\n CTCF: \"#01a6f1\",\n };\n const color = colorMap[type];\n return (\n <Box\n sx={{\n width: 12,\n height: 12,\n borderRadius: \"20%\",\n bgcolor: color,\n }}\n />\n );\n}\n\n// Everything below is styling for the custom directory look of the tree view\nconst TreeItemRoot = styled(\"li\")(({ theme }) => ({\n listStyle: \"none\",\n margin: 0,\n padding: 0,\n outline: 4,\n color: theme.palette.grey[400],\n ...theme.applyStyles(\"light\", {\n color: theme.palette.grey[600], // controls colors of the MUI icons\n }),\n}));\n\nconst TreeItemLabelText = styled(Typography)({\n color: \"black\",\n fontFamily: \"inherit\",\n});\n\nfunction CustomLabel({ icon: Icon, children, isAssayItem, ...other }: CustomLabelProps) {\n const variant = isAssayItem ? \"subtitle2\" : \"body2\";\n const fontWeight = isAssayItem ? \"bold\" : 500;\n return (\n <TreeItemLabel\n {...other}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {Icon && React.isValidElement(Icon) ? (\n <Box className=\"labelIcon\" sx={{ mr: 1 }}>\n {Icon}\n </Box>\n ) : (\n <Box\n component={Icon as React.ElementType}\n className=\"labelIcon\"\n color=\"inherit\"\n sx={{ mr: 1, fontSize: \"1.2rem\" }}\n />\n )}\n <Stack direction=\"row\" spacing={2} alignItems=\"center\">\n { isAssayItem && AssayIcon(other.id) }\n <TreeItemLabelText fontWeight={fontWeight} variant={variant}>{children}</TreeItemLabelText>\n </Stack>\n </TreeItemLabel>\n );\n}\n\nconst TreeItemContent = styled(\"div\")(({ theme }) => ({\n padding: theme.spacing(0.5),\n paddingRight: theme.spacing(2),\n paddingLeft: `calc(${theme.spacing(1)} + var(--TreeView-itemChildrenIndentation) * var(--TreeView-itemDepth))`,\n width: \"100%\",\n boxSizing: \"border-box\", // prevent width + padding to overflow\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n gap: theme.spacing(1),\n cursor: \"pointer\",\n WebkitTapHighlightColor: \"transparent\",\n flexDirection: \"row-reverse\",\n borderRadius: theme.spacing(0.7),\n marginBottom: theme.spacing(0.5),\n marginTop: theme.spacing(0.5),\n fontWeight: 500,\n [`&[data-focused], &[data-selected]`]: {\n backgroundColor: theme.palette.primary.dark,\n color: theme.palette.primary.contrastText,\n ...theme.applyStyles(\"light\", {\n backgroundColor: theme.palette.primary.main,\n }),\n },\n \"&:not([data-focused], [data-selected]):hover\": {\n backgroundColor: alpha(theme.palette.primary.main, 0.1),\n color: \"white\",\n ...theme.applyStyles(\"light\", {\n color: theme.palette.primary.main,\n }),\n },\n}));\n\nconst getIconFromTreeItemType = (itemType: string) => {\n switch (itemType) {\n case \"folder\":\n return Folder;\n case \"removeable\":\n return IndeterminateCheckBoxRoundedIcon;\n default:\n return AssayIcon(itemType);\n }\n};\n\nexport const CustomTreeItem = React.forwardRef(function CustomTreeItem(\n props: CustomTreeItemProps,\n ref: React.Ref<HTMLLIElement>,\n) {\n const { id, itemId, label, disabled, children, onRemove, ...other } = props;\n\n const {\n getContextProviderProps,\n getRootProps,\n getContentProps,\n getIconContainerProps,\n getCheckboxProps,\n getLabelProps,\n getGroupTransitionProps,\n status,\n } = useTreeItem({ id, itemId, children, label, disabled, rootRef: ref });\n\n const item = useTreeItemModel<ExtendedTreeItemProps>(itemId)!;\n const icon = getIconFromTreeItemType(item.icon);\n\n const handleRemoveIconClick = (e: React.MouseEvent) => {\n e.stopPropagation(); // prevent item expand/select\n onRemove?.(item);\n };\n\n return (\n <TreeItemProvider {...getContextProviderProps()}>\n <TreeItemRoot {...getRootProps(other)}>\n <TreeItemContent {...getContentProps()}>\n <TreeItemIconContainer {...getIconContainerProps()}>\n <TreeItemIcon status={status} />\n </TreeItemIconContainer>\n <TreeItemCheckbox {...getCheckboxProps()} />\n <CustomLabel\n {...getLabelProps({\n icon:\n item.icon === \"removeable\" ? (\n <Box\n onClick={handleRemoveIconClick}\n sx={{\n width: 20,\n height: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n mr: 1,\n \"&:hover\": {\n backgroundColor: \"rgba(0,0,0,0.1)\",\n },\n }}\n >\n <IndeterminateCheckBoxRoundedIcon fontSize=\"small\" />\n </Box>\n ) : (\n icon\n ),\n expandable: (status.expandable && status.expanded).toString(),\n isAssayItem: item.isAssayItem,\n id: item.id\n })}\n />\n </TreeItemContent>\n {children && <Collapse {...getGroupTransitionProps()} />}\n </TreeItemRoot>\n </TreeItemProvider>\n );\n});","import { GridColDef } from \"@mui/x-data-grid-premium\";\nimport { RowInfo } from \"../types\";\nimport { Stack, capitalize } from \"@mui/material\";\nimport { AssayIcon } from \"../TreeView/treeViewHelpers\";\nimport { ontologyTypes, assayTypes } from \"../consts\";\n\nconst displayNameCol: GridColDef<RowInfo> = {\n field: \"displayname\",\n headerName: \"Name\",\n valueFormatter: (value) => value && capitalize(value),\n maxWidth: 300,\n};\n\nconst sortedByAssayOntologyCol: GridColDef<RowInfo> = {\n field: \"ontology\",\n headerName: \"Ontology\",\n type: \"singleSelect\",\n valueOptions: ontologyTypes,\n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <div><b>{val}</b></div>\n )\n }\n },\n};\n\nconst sortedByAssayAssayCol : GridColDef<RowInfo> = { \n field: \"assay\", \n headerName: \"Assay\",\n valueOptions: assayTypes, \n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <Stack direction=\"row\" spacing={2} alignItems=\"center\">\n {AssayIcon(val)}\n <div><b>{val}</b></div>\n </Stack>\n )\n }\n }\n}\n\nconst defaultOntologyCol: GridColDef<RowInfo> = {\n field: \"ontology\",\n headerName: \"Ontology\",\n type: \"singleSelect\",\n valueOptions: ontologyTypes,\n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <div><b>{val}</b></div>\n )\n }\n }\n};\n\nconst defaultAssayCol: GridColDef<RowInfo> = { \n field: \"assay\", \n headerName: \"Assay\",\n valueOptions: assayTypes,\n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <Stack direction=\"row\" spacing={2} alignItems=\"center\">\n {AssayIcon(val)}\n <div>{val}</div>\n </Stack>\n )\n }\n }\n}\n\nconst sampleTypeCol: GridColDef<RowInfo> = {\n field: \"sampleType\",\n headerName: \"Sample Type\",\n type: \"singleSelect\",\n valueOptions: [\"tissue\", \"primary cell\", \"cell line\", \"in vitro differentiated cells\", \"organoid\"],\n valueFormatter: (value) => value && capitalize(value),\n};\n\nconst lifeStageCol: GridColDef<RowInfo> = {\n field: \"lifeStage\",\n headerName: \"Life Stage\",\n type: \"singleSelect\",\n valueOptions: [\"adult\", \"embryonic\"],\n valueFormatter: (value) => value && capitalize(value),\n};\n\nconst experimentCol: GridColDef<RowInfo> = { \n field: \"experimentAccession\", \n headerName: \"Experiment Accession\" \n}\n\nconst fileCol: GridColDef<RowInfo> = {\n field: \"fileAccession\", \n headerName: \"File Accession\"\n}\n\nexport const sortedByAssayColumns: GridColDef<RowInfo>[] = [\n displayNameCol,\n sortedByAssayOntologyCol,\n sampleTypeCol,\n lifeStageCol,\n sortedByAssayAssayCol,\n experimentCol,\n fileCol\n]\n\nexport const defaultColumns: GridColDef<RowInfo>[] = [\n displayNameCol,\n sampleTypeCol,\n lifeStageCol,\n defaultOntologyCol,\n defaultAssayCol,\n experimentCol,\n fileCol\n]","import { Box, Paper } from \"@mui/material\";\nimport {\n DataGridPremium,\n GridToolbarProps,\n ToolbarPropsOverrides,\n GridAutosizeOptions,\n useGridApiRef,\n GridColDef,\n FilterColumnsArgs\n} from \"@mui/x-data-grid-premium\";\nimport { DataGridProps } from \"../types\";\nimport { CustomToolbar } from \"./CustomToolbar\";\nimport { useEffect, useMemo } from \"react\";\nimport { sortedByAssayColumns, defaultColumns } from \"./columns\";\n\nconst autosizeOptions: GridAutosizeOptions = {\n expand: true,\n includeHeaders: true,\n outliersFactor: 1.5,\n};\n\n// TODO: figure out where mui stores the number of rows in a row grouping so that can be bolded too\nexport function DataGridWrapper(props: DataGridProps) {\n const {\n label,\n labelTooltip,\n downloadFileName,\n toolbarSlot,\n toolbarStyle,\n toolbarIconColor,\n sortedAssay,\n handleSelection,\n rows,\n selectedTracks\n } = props;\n\n const CustomToolbarWrapper = useMemo(() => {\n const customToolbarProps = {\n label,\n downloadFileName,\n labelTooltip,\n toolbarSlot,\n toolbarStyle,\n toolbarIconColor,\n };\n return (props: GridToolbarProps & ToolbarPropsOverrides) => <CustomToolbar {...props} {...customToolbarProps} />;\n }, [label, labelTooltip, toolbarSlot]);\n\n const apiRef = useGridApiRef();\n const groupingModel = sortedAssay ? [\"assay\", \"ontology\"] : [\"ontology\", \"assay\"];\n const columnModel = sortedAssay ? sortedByAssayColumns : defaultColumns;\n\n // functions to customize the column and filter panel in the toolbar \n const filterColumns = ({ columns }: FilterColumnsArgs) => {\n return columns.filter((column) => column.type !== 'custom').map((column) => column.field);\n };\n\n const getTogglableColumns = (columns: GridColDef[]) => {\n return columns.filter((column) => column.type !== 'custom').map((column) => column.field);\n };\n\n const handleResizeCols = () => {\n // need to check .autosizeColumns since the current was being set with an empty object\n if (!apiRef.current?.autosizeColumns) return;\n apiRef.current.autosizeColumns(autosizeOptions);\n };\n\n // trigger resize when rows or columns change so that rows/columns don't need to be memoized outisde of this component\n // otherwise sometimes would snap back to default widths when rows/columns change\n useEffect(() => {\n handleResizeCols();\n }, [rows, defaultColumns, sortedByAssayColumns, handleResizeCols]);\n\n return (\n <Paper sx={{ width: \"100%\" }}>\n <Box sx={{\n height: 500,\n width: \"100%\",\n overflow: \"auto\",\n }}>\n <DataGridPremium\n apiRef={apiRef}\n rows={rows}\n columns={columnModel}\n getRowId={(row) => row.experimentAccession}\n autosizeOptions={autosizeOptions}\n rowGroupingModel={groupingModel}\n groupingColDef={{ leafField: \"displayname\", display: \"flex\" }}\n columnVisibilityModel={{ displayname: false }} // so you don't see a second name column\n onRowSelectionModelChange={handleSelection}\n rowSelectionPropagation={{ descendants: true }}\n rowSelectionModel={{ type: \"include\", ids: new Set(selectedTracks.keys()) }}\n slots={{\n toolbar: CustomToolbarWrapper,\n }}\n slotProps={{\n filterPanel: {\n filterFormProps: {\n filterColumns,\n },\n },\n columnsManagement: {\n getTogglableColumns,\n },\n }}\n keepNonExistentRowsSelected\n showToolbar\n disableAggregation\n disableRowSelectionExcludeModel\n disablePivoting\n checkboxSelection\n autosizeOnMount\n pagination\n hideFooterSelectedRowCount\n />\n </Box>\n </Paper>\n );\n}\n","import { Box, Paper, Typography } from \"@mui/material\";\nimport { RichTreeView, TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport { rowById } from \"../consts\";\nimport {\n CustomTreeItemProps,\n ExtendedTreeItemProps,\n TreeViewWrapperProps,\n} from \"../types\";\nimport { CustomTreeItem } from \"./treeViewHelpers\";\nimport { Avatar } from \"@mui/material\";\n\nexport function TreeViewWrapper({\n store,\n items,\n activeTracks,\n isSearchResult,\n}: TreeViewWrapperProps) {\n const removeIds = store((s) => s.removeIds);\n\n const handleRemoveTreeItem = (\n item: TreeViewBaseItem<ExtendedTreeItemProps>,\n ) => {\n const removedIds = item.allExpAccessions;\n if (removedIds && removedIds.length) {\n const idsToRemove = new Set(removedIds);\n\n // Also remove any auto-generated group IDs that contain these tracks\n removedIds.forEach((id) => {\n const row = rowById.get(id);\n if (row) {\n // Add the auto-generated group IDs for this track's ontology and assay\n idsToRemove.add(`auto-generated-row-ontology/${row.ontology}`);\n idsToRemove.add(\n `auto-generated-row-ontology/${row.ontology}-assay/${row.assay}`,\n );\n idsToRemove.add(`auto-generated-row-assay/${row.assay}`);\n idsToRemove.add(\n `auto-generated-row-assay/${row.assay}-ontology/${row.ontology}`,\n );\n }\n });\n removeIds(idsToRemove);\n }\n };\n\n return (\n <Paper\n sx={{\n height: 500,\n width: \"100%\",\n border: \"10px solid\",\n borderColor: \"grey.200\",\n boxSizing: \"border-box\",\n borderRadius: 2,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n py: 1,\n backgroundColor: \"grey.200\",\n flexShrink: 0,\n }}\n >\n <Avatar\n sx={{\n width: 30,\n height: 30,\n fontSize: 14,\n fontWeight: \"bold\",\n bgcolor: \"white\",\n color: \"text.primary\",\n }}\n >\n {activeTracks.size}\n </Avatar>\n <Typography fontWeight=\"bold\">\n Active Tracks\n {isSearchResult && (\n <Typography component=\"span\" color=\"text.secondary\" sx={{ ml: 1 }}>\n ({items[0].allRowInfo!.length} search results)\n </Typography>\n )}\n </Typography>\n </Box>\n <Box\n sx={{\n flex: 1,\n overflow: \"auto\",\n }}\n >\n <RichTreeView\n items={items}\n defaultExpandedItems={[\"1\"]}\n slots={{ item: CustomTreeItem }}\n slotProps={{\n item: {\n onRemove: handleRemoveTreeItem,\n } as Partial<CustomTreeItemProps>,\n }}\n sx={{\n ml: 1,\n mr: 1,\n height: \"100%\",\n }}\n itemChildrenIndentation={0}\n />\n </Box>\n </Paper>\n );\n}\n","import {\n Box,\n Stack,\n TextField,\n FormControlLabel,\n Switch,\n Button,\n} from \"@mui/material\";\nimport { DataGridWrapper } from \"./DataGrid/DataGridWrapper\";\nimport { searchTracks, flattenIntoRow } from \"./DataGrid/dataGridHelpers\";\nimport { TreeViewWrapper } from \"./TreeView/TreeViewWrapper\";\nimport {\n buildSortedAssayTreeView,\n buildTreeView,\n searchTreeItems,\n} from \"./TreeView/treeViewHelpers\";\nimport { SearchTracksProps, ExtendedTreeItemProps, RowInfo } from \"./types\";\nimport { rows, rowById } from \"./consts\";\nimport React, { useState, useMemo, useEffect } from \"react\";\nimport { TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport { GridRowSelectionModel } from \"@mui/x-data-grid\";\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n} from \"@mui/material\";\nimport { SelectionStoreInstance } from \"./store\";\n\nexport interface TrackSelectProps {\n store: SelectionStoreInstance;\n}\n\nexport default function TrackSelect({ store }: TrackSelectProps) {\n const [limitDialogOpen, setLimitDialogOpen] = useState(false);\n const [sortedAssay, setSortedAssay] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isSearchResult, setIsSearchResult] = useState(false);\n const selectedTracks = store((s) => s.selectedTracks);\n const setSelected = store((s) => s.setSelected);\n const clear = store((s) => s.clear);\n const MAX_ACTIVE = store((s) => s.maxTracks);\n\n // Derive active tracks from selectedTracks (all keys are real track IDs)\n const activeTracks = useMemo(\n () => new Set(selectedTracks.keys()),\n [selectedTracks],\n );\n\n const treeItems = useMemo(() => {\n return sortedAssay\n ? buildSortedAssayTreeView(\n Array.from(selectedTracks.keys()),\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n )\n : buildTreeView(\n Array.from(selectedTracks.keys()),\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n );\n }, [selectedTracks, sortedAssay]);\n\n const [filteredRows, setFilteredRows] = useState(rows);\n const [filteredTreeItems, setFilteredTreeItems] = useState([\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n ] as TreeViewBaseItem<ExtendedTreeItemProps>[]);\n\n useEffect(() => {\n if (searchQuery === \"\") {\n setFilteredTreeItems(treeItems);\n setFilteredRows(rows);\n setIsSearchResult(false);\n }\n }, [treeItems, searchQuery]);\n\n const handleToggle = () => {\n setSortedAssay(!sortedAssay);\n };\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.target.value);\n\n const dataGridSearchProps: SearchTracksProps = {\n jsonStructure: \"tracks\",\n query: e.target.value,\n keyWeightMap: [\n \"displayname\",\n \"ontology\",\n \"lifeStage\",\n \"sampleType\",\n \"type\",\n \"experimentAccession\",\n \"fileAccession\",\n ],\n };\n\n const treeSearchProps: SearchTracksProps = {\n treeItems: treeItems,\n query: e.target.value,\n keyWeightMap: [\n \"displayname\",\n \"ontology\",\n \"lifeStage\",\n \"sampleType\",\n \"type\",\n \"experimentAccession\",\n \"fileAccession\",\n ],\n };\n const newDataGridRows = searchTracks(dataGridSearchProps)\n .map((t) => t.item)\n .map(flattenIntoRow);\n\n // we only want the intersection of filtered tracks displayed on the DataGrid and user-selected tracks to be displayed on the tree\n const newDataGridIds = newDataGridRows.map((r) => r.experimentAccession);\n const retIds = searchTreeItems(treeSearchProps).map(\n (r) => r.item.experimentAccession,\n );\n const newTreeIds = retIds.filter((i) => newDataGridIds.includes(i));\n\n // build new tree from the newTreeIds...maybe it would be faster to prune the current tree instead of rebuilding it?\n const newTreeItems = sortedAssay\n ? buildSortedAssayTreeView(\n newTreeIds,\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n )\n : buildTreeView(\n newTreeIds,\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n );\n\n setFilteredRows(newDataGridRows);\n setIsSearchResult(true);\n setFilteredTreeItems(newTreeItems);\n };\n\n const handleSelection = (newSelection: GridRowSelectionModel) => {\n const idsSet =\n (newSelection && (newSelection as any).ids) ?? new Set<string>();\n\n // Build a Map of only real track IDs (filter out auto-generated group IDs)\n const newTracks = new Map<string, RowInfo>();\n idsSet.forEach((id: string) => {\n const row = rowById.get(id);\n if (row) {\n newTracks.set(id, row);\n }\n });\n\n // Block only if the new selection would exceed the limit\n if (newTracks.size > MAX_ACTIVE) {\n setLimitDialogOpen(true);\n return;\n }\n\n setSelected(newTracks);\n };\n\n return (\n <Box sx={{ flex: 1 }}>\n <Box display=\"flex\" justifyContent=\"space-between\" sx={{ mb: 3 }}>\n <TextField\n id=\"outlined-suffix-shrink\"\n label=\"Search tracks\"\n variant=\"outlined\"\n onChange={handleSearch}\n sx={{ width: \"400px\" }}\n />\n <FormControlLabel\n sx={{ display: \"flex\", justifyContent: \"flex-end\", mb: 1 }}\n value=\"Sort by assay\"\n control={<Switch color=\"primary\" onChange={handleToggle} />}\n label=\"Sort by assay\"\n labelPlacement=\"end\"\n />\n </Box>\n <Stack direction=\"row\" spacing={2} sx={{ width: \"100%\" }}>\n <Box sx={{ flex: 3, minWidth: 0 }}>\n <DataGridWrapper\n rows={filteredRows}\n label={\n isSearchResult\n ? `${filteredRows.length} Search Results`\n : `${rows.length} Available Tracks`\n }\n selectedTracks={selectedTracks}\n handleSelection={handleSelection}\n sortedAssay={sortedAssay}\n />\n </Box>\n <Box sx={{ flex: 2, minWidth: 0 }}>\n <TreeViewWrapper\n store={store}\n items={filteredTreeItems}\n selectedTracks={selectedTracks}\n activeTracks={activeTracks}\n isSearchResult={isSearchResult}\n />\n </Box>\n </Stack>\n <Box sx={{ justifyContent: \"flex-end\" }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={clear}\n sx={{ mt: 2, justifyContent: \"flex-end\" }}\n >\n Clear Selection\n </Button>\n </Box>\n <Dialog open={limitDialogOpen} onClose={() => setLimitDialogOpen(false)}>\n <DialogTitle>Track Limit Reached</DialogTitle>\n <DialogContent>\n <DialogContentText>\n You can select up to {MAX_ACTIVE} tracks at a time. Please remove a\n track before adding another.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setLimitDialogOpen(false)} autoFocus>\n OK\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n}\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n","import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createState ? createImpl(createState) : createImpl);\n\nexport { create, useStore };\n","import { create, StoreApi, UseBoundStore } from \"zustand\";\nimport { SelectionState, SelectionAction, RowInfo } from \"./types\";\n\nexport type SelectionStoreInstance = UseBoundStore<\n StoreApi<SelectionState & SelectionAction>\n>;\n\nexport function createSelectionStore(initialTracks?: Map<string, RowInfo>) {\n return create<SelectionState & SelectionAction>((set, get) => ({\n maxTracks: 30,\n selectedTracks: initialTracks ? new Map(initialTracks) : new Map<string, RowInfo>(),\n selectedIds: () => new Set(get().selectedTracks.keys()),\n setSelected: (tracks: Map<string, RowInfo>) =>\n set(() => ({\n selectedTracks: new Map(tracks),\n })),\n removeIds: (removedIds: Set<string>) =>\n set((state) => {\n const next = new Map(state.selectedTracks);\n removedIds.forEach((id) => {\n next.delete(id);\n });\n return { selectedTracks: next };\n }),\n clear: () => set(() => ({ selectedTracks: new Map<string, RowInfo>() })),\n }));\n}\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","CustomToolbar","label","downloadFileName","labelTooltip","toolbarSlot","toolbarStyle","toolbarIconColor","restToolbarProps","exportMenuOpen","setExportMenuOpen","exportMenuTriggerRef","iconColor","Toolbar","jsxs","Typography","jsx","Tooltip","InfoOutline","Fragment","Divider","ColumnsPanelTrigger","ToolbarButton","ViewColumnIcon","FilterPanelTrigger","state","Badge","FilterListIcon","FileDownloadIcon","Menu","ExportPrint","MenuItem","ExportCsv","ExportExcel","isArray","getTag","baseToString","result","toString","isString","isNumber","isBoolean","isObjectLike","isObject","isDefined","isBlank","INCORRECT_INDEX_TYPE","LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY","PATTERN_LENGTH_TOO_LARGE","max","MISSING_KEY_PROPERTY","INVALID_KEY_WEIGHT_VALUE","hasOwn","KeyStore","totalWeight","obj","createKey","keyId","path","id","src","weight","getFn","createKeyPath","createKeyId","get","list","arr","deepGet","index","i","len","MatchOptions","BasicOptions","a","b","FuzzyOptions","AdvancedOptions","Config","SPACE","norm","mantissa","cache","m","numTokens","FuseIndex","fieldNormWeight","docs","records","idx","doc","docIndex","item","record","keyIndex","subRecords","stack","nestedArrIndex","subRecord","createIndex","myIndex","parseIndex","data","computeScore$1","pattern","errors","currentLocation","expectedLocation","distance","ignoreLocation","accuracy","proximity","convertMaskToIndices","matchmask","minMatchCharLength","indices","start","end","match","MAX_BITS","search","text","patternAlphabet","location","threshold","findAllMatches","includeMatches","patternLen","textLen","currentThreshold","bestLocation","computeMatches","matchMask","score","lastBitArr","finalScore","binMax","mask","binMin","binMid","finish","bitArr","j","charMatch","createPatternAlphabet","char","stripDiacritics","str","BitapSearch","isCaseSensitive","ignoreDiacritics","addChunk","startIndex","remainder","allIndices","totalScore","hasMatches","alphabet","isMatch","BaseMatch","getMatch","exp","matches","ExactMatch","InverseExactMatch","PrefixExactMatch","InversePrefixExactMatch","SuffixExactMatch","InverseSuffixExactMatch","FuzzyMatch","IncludeMatch","searchers","searchersLen","SPACE_RE","OR_TOKEN","parseQuery","options","query","results","queryItem","found","searcher","token","MultiMatchSet","ExtendedSearch","_","numMatches","qLen","pLen","registeredSearchers","register","args","createSearcher","searcherClass","LogicalOperator","KeyType","isExpression","isPath","isLeaf","convertToExplicit","parse","auto","next","isQueryPath","computeScore","ignoreFieldNorm","transformMatches","transformScore","format","includeScore","transformers","transformer","Fuse","predicate","limit","shouldSort","sortFn","expression","evaluate","res","child","resultMap","expResults","formatAssayType","assay","getNestedValue","acc","getTracksByAssayAndOntology","ontology","tracksData","track","filteredAssays","_a","e","flattenIntoRow","lifeStage","sampleType","displayname","experimentAccession","fileAccession","url","capitalize","searchTracks","jsonStructure","keyWeightMap","assayTypes","ontologyTypes","rows","r","rowById","buildSortedAssayTreeView","selectedIds","root","assayMap","ontologyMap","sampleAssayMap","row","assayNode","ontologyNode","displayNameNode","expNode","buildTreeView","displayNameMap","searchTreeItems","treeItems","AssayIcon","color","Box","TreeItemRoot","styled","theme","TreeItemLabelText","CustomLabel","Icon","isAssayItem","other","variant","fontWeight","TreeItemLabel","Stack","TreeItemContent","alpha","getIconFromTreeItemType","itemType","Folder","IndeterminateCheckBoxRoundedIcon","CustomTreeItem","ref","itemId","disabled","onRemove","getContextProviderProps","getRootProps","getContentProps","getIconContainerProps","getCheckboxProps","getLabelProps","getGroupTransitionProps","status","useTreeItem","useTreeItemModel","icon","handleRemoveIconClick","TreeItemProvider","TreeItemIconContainer","TreeItemIcon","TreeItemCheckbox","Collapse","displayNameCol","sortedByAssayOntologyCol","params","val","sortedByAssayAssayCol","defaultOntologyCol","defaultAssayCol","sampleTypeCol","lifeStageCol","experimentCol","fileCol","sortedByAssayColumns","defaultColumns","autosizeOptions","DataGridWrapper","sortedAssay","handleSelection","selectedTracks","CustomToolbarWrapper","useMemo","customToolbarProps","apiRef","useGridApiRef","groupingModel","columnModel","filterColumns","columns","column","getTogglableColumns","handleResizeCols","useEffect","Paper","DataGridPremium","TreeViewWrapper","store","items","activeTracks","isSearchResult","removeIds","s","handleRemoveTreeItem","removedIds","idsToRemove","Avatar","RichTreeView","TrackSelect","limitDialogOpen","setLimitDialogOpen","useState","setSortedAssay","searchQuery","setSearchQuery","setIsSearchResult","setSelected","clear","MAX_ACTIVE","filteredRows","setFilteredRows","filteredTreeItems","setFilteredTreeItems","handleToggle","handleSearch","dataGridSearchProps","treeSearchProps","newDataGridRows","t","newDataGridIds","newTreeIds","newTreeItems","newSelection","idsSet","newTracks","TextField","FormControlLabel","Switch","Button","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","createStoreImpl","createState","listeners","setState","partial","replace","nextState","previousState","listener","getState","api","initialState","createStore","identity","arg","useStore","selector","slice","createImpl","useBoundStore","create","createSelectionStore","initialTracks","set","tracks"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,MAAIA,IAAqB,OAAO,IAAI,4BAA4B,GAC9DC,IAAsB,OAAO,IAAI,gBAAgB;AACnD,WAASC,EAAQC,GAAMC,GAAQC,GAAU;AACvC,QAAIC,IAAM;AAGV,QAFWD,MAAX,WAAwBC,IAAM,KAAKD,IACxBD,EAAO,QAAlB,WAA0BE,IAAM,KAAKF,EAAO,MACxC,SAASA,GAAQ;AACnB,MAAAC,IAAW,CAAA;AACX,eAASE,KAAYH;AACnB,QAAUG,MAAV,UAAuBF,EAASE,CAAQ,IAAIH,EAAOG,CAAQ;AAAA,IACjE,MAAS,CAAAF,IAAWD;AAClB,WAAAA,IAASC,EAAS,KACX;AAAA,MACL,UAAUL;AAAA,MACV,MAAMG;AAAA,MACN,KAAKG;AAAA,MACL,KAAgBF,MAAX,SAAoBA,IAAS;AAAA,MAClC,OAAOC;AAAA;EAEX;AACA,SAAAG,EAAA,WAAmBP,GACnBO,EAAA,MAAcN,GACdM,EAAA,OAAeN;;;;;;;;;;;;;;wBCtBE,QAAQ,IAAI,aAA7B,iBACG,WAAY;AACX,aAASO,EAAyBN,GAAM;AACtC,UAAYA,KAAR,KAAc,QAAO;AACzB,UAAmB,OAAOA,KAAtB;AACF,eAAOA,EAAK,aAAaO,IACrB,OACAP,EAAK,eAAeA,EAAK,QAAQ;AACvC,UAAiB,OAAOA,KAApB,SAA0B,QAAOA;AACrC,cAAQA,GAAI;AAAA,QACV,KAAKF;AACH,iBAAO;AAAA,QACT,KAAKU;AACH,iBAAO;AAAA,QACT,KAAKC;AACH,iBAAO;AAAA,QACT,KAAKC;AACH,iBAAO;AAAA,QACT,KAAKC;AACH,iBAAO;AAAA,QACT,KAAKC;AACH,iBAAO;AAAA,MACjB;AACM,UAAiB,OAAOZ,KAApB;AACF,gBACgB,OAAOA,EAAK,OAAzB,YACC,QAAQ;AAAA,UACN;AAAA,WAEJA,EAAK,UACf;AAAA,UACU,KAAKa;AACH,mBAAO;AAAA,UACT,KAAKC;AACH,mBAAOd,EAAK,eAAe;AAAA,UAC7B,KAAKe;AACH,oBAAQf,EAAK,SAAS,eAAe,aAAa;AAAA,UACpD,KAAKgB;AACH,gBAAIC,IAAYjB,EAAK;AACrB,mBAAAA,IAAOA,EAAK,aACZA,MACIA,IAAOiB,EAAU,eAAeA,EAAU,QAAQ,IACnDjB,IAAcA,MAAP,KAAc,gBAAgBA,IAAO,MAAM,eAC9CA;AAAA,UACT,KAAKkB;AACH,mBACGD,IAAYjB,EAAK,eAAe,MACxBiB,MAAT,OACIA,IACAX,EAAyBN,EAAK,IAAI,KAAK;AAAA,UAE/C,KAAKmB;AACH,YAAAF,IAAYjB,EAAK,UACjBA,IAAOA,EAAK;AACZ,gBAAI;AACF,qBAAOM,EAAyBN,EAAKiB,CAAS,CAAC;AAAA,YAC7D,QAAwB;AAAA,YAAA;AAAA,QACxB;AACM,aAAO;AAAA,IACb;AACI,aAASG,EAAmBC,GAAO;AACjC,aAAO,KAAKA;AAAA,IAClB;AACI,aAASC,EAAuBD,GAAO;AACrC,UAAI;AACF,QAAAD,EAAmBC,CAAK;AACxB,YAAIE,IAA2B;AAAA,MACvC,QAAkB;AACV,QAAAA,IAA2B;AAAA,MACnC;AACM,UAAIA,GAA0B;AAC5B,QAAAA,IAA2B;AAC3B,YAAIC,IAAwBD,EAAyB,OACjDE,IACc,OAAO,UAAtB,cACC,OAAO,eACPJ,EAAM,OAAO,WAAW,KAC1BA,EAAM,YAAY,QAClB;AACF,eAAAG,EAAsB;AAAA,UACpBD;AAAA,UACA;AAAA,UACAE;AAAA,WAEKL,EAAmBC,CAAK;AAAA,MACvC;AAAA,IACA;AACI,aAASK,EAAY1B,GAAM;AACzB,UAAIA,MAASF,EAAqB,QAAO;AACzC,UACe,OAAOE,KAApB,YACSA,MAAT,QACAA,EAAK,aAAamB;AAElB,eAAO;AACT,UAAI;AACF,YAAIQ,IAAOrB,EAAyBN,CAAI;AACxC,eAAO2B,IAAO,MAAMA,IAAO,MAAM;AAAA,MACzC,QAAkB;AACV,eAAO;AAAA,MACf;AAAA,IACA;AACI,aAASC,IAAW;AAClB,UAAIC,IAAaC,EAAqB;AACtC,aAAgBD,MAAT,OAAsB,OAAOA,EAAW,SAAQ;AAAA,IAC7D;AACI,aAASE,IAAe;AACtB,aAAO,MAAM,uBAAuB;AAAA,IAC1C;AACI,aAASC,EAAY/B,GAAQ;AAC3B,UAAIgC,EAAe,KAAKhC,GAAQ,KAAK,GAAG;AACtC,YAAIiC,IAAS,OAAO,yBAAyBjC,GAAQ,KAAK,EAAE;AAC5D,YAAIiC,KAAUA,EAAO,eAAgB,QAAO;AAAA,MACpD;AACM,aAAkBjC,EAAO,QAAlB;AAAA,IACb;AACI,aAASkC,EAA2BC,GAAOC,GAAa;AACtD,eAASC,IAAwB;AAC/B,QAAAC,MACIA,IAA6B,IAC/B,QAAQ;AAAA,UACN;AAAA,UACAF;AAAA,QACZ;AAAA,MACA;AACM,MAAAC,EAAsB,iBAAiB,IACvC,OAAO,eAAeF,GAAO,OAAO;AAAA,QAClC,KAAKE;AAAA,QACL,cAAc;AAAA,MACtB,CAAO;AAAA,IACP;AACI,aAASE,IAAyC;AAChD,UAAIC,IAAgBnC,EAAyB,KAAK,IAAI;AACtD,aAAAoC,GAAuBD,CAAa,MAChCC,GAAuBD,CAAa,IAAI,IAC1C,QAAQ;AAAA,QACN;AAAA,MACV,IACMA,IAAgB,KAAK,MAAM,KACTA,MAAX,SAA2BA,IAAgB;AAAA,IACxD;AACI,aAASE,EAAa3C,GAAMG,GAAKiC,GAAOQ,GAAOC,IAAYC,IAAW;AACpE,UAAIC,IAAUX,EAAM;AACpB,aAAApC,IAAO;AAAA,QACL,UAAUH;AAAA,QACV,MAAMG;AAAA,QACN,KAAKG;AAAA,QACL,OAAOiC;AAAA,QACP,QAAQQ;AAAA,UAEWG,MAAX,SAAqBA,IAAU,UAAzC,OACI,OAAO,eAAe/C,GAAM,OAAO;AAAA,QACjC,YAAY;AAAA,QACZ,KAAKwC;AAAA,OACN,IACD,OAAO,eAAexC,GAAM,OAAO,EAAE,YAAY,IAAI,OAAO,MAAM,GACtEA,EAAK,SAAS,CAAA,GACd,OAAO,eAAeA,EAAK,QAAQ,aAAa;AAAA,QAC9C,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,MACf,CAAO,GACD,OAAO,eAAeA,GAAM,cAAc;AAAA,QACxC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,MACf,CAAO,GACD,OAAO,eAAeA,GAAM,eAAe;AAAA,QACzC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO6C;AAAA,MACf,CAAO,GACD,OAAO,eAAe7C,GAAM,cAAc;AAAA,QACxC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO8C;AAAA,MACf,CAAO,GACD,OAAO,WAAW,OAAO,OAAO9C,EAAK,KAAK,GAAG,OAAO,OAAOA,CAAI,IACxDA;AAAA,IACb;AACI,aAASgD,EACPhD,GACAC,GACAC,GACA+C,GACAJ,IACAC,IACA;AACA,UAAII,IAAWjD,EAAO;AACtB,UAAeiD,MAAX;AACF,YAAID;AACF,cAAIE,EAAYD,CAAQ,GAAG;AACzB,iBACED,IAAmB,GACnBA,IAAmBC,EAAS,QAC5BD;AAEA,cAAAG,EAAkBF,EAASD,CAAgB,CAAC;AAC9C,mBAAO,UAAU,OAAO,OAAOC,CAAQ;AAAA,UACnD;AACY,oBAAQ;AAAA,cACN;AAAA;YAED,CAAAE,EAAkBF,CAAQ;AACjC,UAAIjB,EAAe,KAAKhC,GAAQ,KAAK,GAAG;AACtC,QAAAiD,IAAW5C,EAAyBN,CAAI;AACxC,YAAIqD,IAAO,OAAO,KAAKpD,CAAM,EAAE,OAAO,SAAUqD,IAAG;AACjD,iBAAiBA,OAAV;AAAA,QACjB,CAAS;AACD,QAAAL,IACE,IAAII,EAAK,SACL,oBAAoBA,EAAK,KAAK,SAAS,IAAI,WAC3C,kBACNE,GAAsBL,IAAWD,CAAgB,MAC7CI,IACA,IAAIA,EAAK,SAAS,MAAMA,EAAK,KAAK,SAAS,IAAI,WAAW,MAC5D,QAAQ;AAAA,UACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UACAJ;AAAA,UACAC;AAAA,UACAG;AAAA,UACAH;AAAA,WAEDK,GAAsBL,IAAWD,CAAgB,IAAI;AAAA,MAChE;AAMM,UALAC,IAAW,MACAhD,MAAX,WACGoB,EAAuBpB,CAAQ,GAAIgD,IAAW,KAAKhD,IACtD8B,EAAY/B,CAAM,MACfqB,EAAuBrB,EAAO,GAAG,GAAIiD,IAAW,KAAKjD,EAAO,MAC3D,SAASA,GAAQ;AACnB,QAAAC,IAAW,CAAA;AACX,iBAASE,MAAYH;AACnB,UAAUG,OAAV,UAAuBF,EAASE,EAAQ,IAAIH,EAAOG,EAAQ;AAAA,MACrE,MAAa,CAAAF,IAAWD;AAClB,aAAAiD,KACEf;AAAA,QACEjC;AAAA,QACe,OAAOF,KAAtB,aACIA,EAAK,eAAeA,EAAK,QAAQ,YACjCA;AAAA,SAED2C;AAAA,QACL3C;AAAA,QACAkD;AAAA,QACAhD;AAAA,QACA0B,EAAQ;AAAA,QACRiB;AAAA,QACAC;AAAA;IAER;AACI,aAASM,EAAkBI,GAAM;AAC/B,MAAAC,EAAeD,CAAI,IACfA,EAAK,WAAWA,EAAK,OAAO,YAAY,KAC3B,OAAOA,KAApB,YACSA,MAAT,QACAA,EAAK,aAAarC,MACDqC,EAAK,SAAS,WAA9B,cACGC,EAAeD,EAAK,SAAS,KAAK,KAClCA,EAAK,SAAS,MAAM,WACnBA,EAAK,SAAS,MAAM,OAAO,YAAY,KACxCA,EAAK,WAAWA,EAAK,OAAO,YAAY;AAAA,IACtD;AACI,aAASC,EAAeC,GAAQ;AAC9B,aACe,OAAOA,KAApB,YACSA,MAAT,QACAA,EAAO,aAAa7D;AAAA,IAE5B;AACI,QAAI8D,IAAQC,GACV/D,IAAqB,OAAO,IAAI,4BAA4B,GAC5DgB,IAAoB,OAAO,IAAI,cAAc,GAC7Cf,IAAsB,OAAO,IAAI,gBAAgB,GACjDW,IAAyB,OAAO,IAAI,mBAAmB,GACvDD,IAAsB,OAAO,IAAI,gBAAgB,GACjDO,IAAsB,OAAO,IAAI,gBAAgB,GACjDD,IAAqB,OAAO,IAAI,eAAe,GAC/CE,IAAyB,OAAO,IAAI,mBAAmB,GACvDN,IAAsB,OAAO,IAAI,gBAAgB,GACjDC,IAA2B,OAAO,IAAI,qBAAqB,GAC3DO,IAAkB,OAAO,IAAI,YAAY,GACzCC,IAAkB,OAAO,IAAI,YAAY,GACzCP,IAAsB,OAAO,IAAI,gBAAgB,GACjDL,IAAyB,OAAO,IAAI,wBAAwB,GAC5DuB,IACE6B,EAAM,iEACR1B,IAAiB,OAAO,UAAU,gBAClCkB,IAAc,MAAM,SACpBU,IAAa,QAAQ,aACjB,QAAQ,aACR,WAAY;AACV,aAAO;AAAA,IACnB;AACI,IAAAF,IAAQ;AAAA,MACN,0BAA0B,SAAUG,GAAmB;AACrD,eAAOA,EAAiB;AAAA,MAChC;AAAA;AAEI,QAAIvB,GACAG,KAAyB,CAAA,GACzBqB,KAAyBJ,EAAM,yBAAyB;AAAA,MAC1DA;AAAA,MACA5B;AAAA,IACN,EAAK,GACGiC,KAAwBH,EAAWnC,EAAYK,CAAY,CAAC,GAC5DwB,KAAwB,CAAA;AAC5B,IAAAU,EAAA,WAAmBnE,GACnBmE,EAAA,MAAc,SAAUjE,GAAMC,GAAQC,GAAU;AAC9C,UAAIgE,IACF,MAAMpC,EAAqB;AAC7B,aAAOkB;AAAA,QACLhD;AAAA,QACAC;AAAA,QACAC;AAAA,QACA;AAAA,QACAgE,IACI,MAAM,uBAAuB,IAC7BH;AAAA,QACJG,IAAmBL,EAAWnC,EAAY1B,CAAI,CAAC,IAAIgE;AAAA;IAE3D,GACIC,EAAA,OAAe,SAAUjE,GAAMC,GAAQC,GAAU;AAC/C,UAAIgE,IACF,MAAMpC,EAAqB;AAC7B,aAAOkB;AAAA,QACLhD;AAAA,QACAC;AAAA,QACAC;AAAA,QACA;AAAA,QACAgE,IACI,MAAM,uBAAuB,IAC7BH;AAAA,QACJG,IAAmBL,EAAWnC,EAAY1B,CAAI,CAAC,IAAIgE;AAAA;IAE3D;AAAA,EACA,GAAG;;;;wBC7VC,QAAQ,IAAI,aAAa,eAC3BG,GAAA,UAAiBP,GAAA,IAEjBO,GAAA,UAAiBC,GAAA;;;AC6BZ,SAASC,GAAc;AAAA,EAC5B,OAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,GAAGC;AACL,GAAuB;AACrB,QAAM,CAACC,GAAgBC,CAAiB,IAAInB,GAAM,SAAS,EAAK,GAC1DoB,IAAuBpB,GAAM,OAA0B,IAAI,GAE3DqB,IAAYL,KAAoB;AAEtC,gCACGM,IAAA,EAAQ,OAAO,EAAE,GAAGP,KAClB,UAAA;AAAA,IAAA,OAAOJ,KAAU,YAAYA;AAAA,IAC9BY,gBAAAA,EAAAA;AAAAA,MAACC;AAAA,MAAA;AAAA,QACC,YAAW;AAAA,QACX,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAA;AAAA,QAEnE,UAAA;AAAA,UAAA,OAAOb,KAAU,YAAYA;AAAA,UAE7BE,MACA,OAAOA,KAAiB,YACvB,OAAOA,KAAiB,YACxBY,gBAAAA,EAAAA,IAACC,IAAA,EAAQ,OAAOb,GACd,gCAACc,IAAA,EAAY,UAAS,WAAU,OAAM,WAAU,GAClD,IAEAd;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGHC,KACCS,gBAAAA,EAAAA,KAAAK,YAAA,EACG,UAAA;AAAA,MAAAd;AAAA,MACDW,gBAAAA,EAAAA;AAAAA,QAACI;AAAA,QAAA;AAAA,UACC,aAAY;AAAA,UACZ,SAAQ;AAAA,UACR,UAAQ;AAAA,UACR,IAAI,EAAE,IAAI,IAAA;AAAA,QAAI;AAAA,MAAA;AAAA,IAChB,GACF;AAAA,0BAGDH,IAAA,EAAQ,OAAM,WACb,UAAAD,gBAAAA,EAAAA,IAACK,MAAoB,QAAQL,gBAAAA,EAAAA,IAACM,IAAA,EAAc,GAC1C,gCAACC,IAAA,EAAe,UAAS,SAAQ,WAAWX,EAAA,CAAW,GACzD,GACF;AAAA,IAEAI,gBAAAA,EAAAA,IAACC,IAAA,EAAQ,OAAM,WACb,UAAAD,gBAAAA,EAAAA;AAAAA,MAACQ;AAAA,MAAA;AAAA,QACC,QAAQ,CAACxD,GAAOyD,4BACbH,IAAA,EAAe,GAAGtD,GAAO,OAAM,WAC9B,UAAAgD,gBAAAA,EAAAA;AAAAA,UAACU;AAAA,UAAA;AAAA,YACC,cAAcD,EAAM;AAAA,YACpB,OAAM;AAAA,YACN,SAAQ;AAAA,YAER,UAAAT,gBAAAA,EAAAA,IAACW,IAAA,EAAe,UAAS,SAAQ,WAAWf,EAAA,CAAW;AAAA,UAAA;AAAA,QAAA,EACzD,CACF;AAAA,MAAA;AAAA,IAAA,GAGN;AAAA,IACAI,gBAAAA,EAAAA;AAAAA,MAACI;AAAA,MAAA;AAAA,QACC,aAAY;AAAA,QACZ,SAAQ;AAAA,QACR,UAAQ;AAAA,QACR,IAAI,EAAE,IAAI,IAAA;AAAA,MAAI;AAAA,IAAA;AAAA,IAEhBJ,gBAAAA,EAAAA,IAACC,IAAA,EAAQ,OAAM,UACb,UAAAD,gBAAAA,EAAAA;AAAAA,MAACM;AAAA,MAAA;AAAA,QACC,KAAKX;AAAA,QACL,IAAG;AAAA,QACH,iBAAc;AAAA,QACd,iBAAc;AAAA,QACd,iBAAeF,IAAiB,SAAS;AAAA,QACzC,SAAS,MAAMC,EAAkB,EAAI;AAAA,QAErC,UAAAM,gBAAAA,EAAAA,IAACY,IAAA,EAAiB,UAAS,SAAQ,WAAWhB,EAAA,CAAW;AAAA,MAAA;AAAA,IAAA,GAE7D;AAAA,IAEAE,gBAAAA,EAAAA;AAAAA,MAACe;AAAA,MAAA;AAAA,QACC,IAAG;AAAA,QACH,UAAUlB,EAAqB;AAAA,QAC/B,MAAMF;AAAA,QACN,SAAS,MAAMC,EAAkB,EAAK;AAAA,QACtC,cAAc,EAAE,UAAU,UAAU,YAAY,QAAA;AAAA,QAChD,iBAAiB,EAAE,UAAU,OAAO,YAAY,QAAA;AAAA,QAChD,WAAW;AAAA,UACT,MAAM;AAAA,YACJ,mBAAmB;AAAA,UAAA;AAAA,QACrB;AAAA,QAGF,UAAA;AAAA,UAAAM,gBAAAA,EAAAA;AAAAA,YAACc;AAAA,YAAA;AAAA,cACC,SAAS,EAAE,GAAGtB,EAAiB,aAAA;AAAA,cAC/B,8BAASuB,IAAA,EAAS;AAAA,cAClB,SAAS,MAAMrB,EAAkB,EAAK;AAAA,cACvC,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGDM,gBAAAA,EAAAA;AAAAA,YAACgB;AAAA,YAAA;AAAA,cACC,SAAS;AAAA,gBACP,UAAU,OAAO9B,KAAU,WAAWA,IAAQC;AAAA,gBAC9C,GAAGK,EAAiB;AAAA,cAAA;AAAA,cAEtB,8BAASuB,IAAA,EAAS;AAAA,cAClB,SAAS,MAAMrB,EAAkB,EAAK;AAAA,cACvC,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGDM,gBAAAA,EAAAA;AAAAA,YAACiB;AAAA,YAAA;AAAA,cACC,SAAS,EAAE,GAAGzB,EAAiB,aAAA;AAAA,cAC/B,8BAASuB,IAAA,EAAS;AAAA,cAClB,SAAS,MAAMrB,EAAkB,EAAK;AAAA,cACvC,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;ACtJA,SAASwB,EAAQjF,GAAO;AACtB,SAAQ,MAAM,UAEV,MAAM,QAAQA,CAAK,IADnBkF,GAAOlF,CAAK,MAAM;AAExB;AAIA,SAASmF,GAAanF,GAAO;AAE3B,MAAI,OAAOA,KAAS;AAClB,WAAOA;AAET,MAAIoF,IAASpF,IAAQ;AACrB,SAAOoF,KAAU,OAAO,IAAIpF,KAAS,SAAY,OAAOoF;AAC1D;AAEA,SAASC,GAASrF,GAAO;AACvB,SAAOA,KAAS,OAAO,KAAKmF,GAAanF,CAAK;AAChD;AAEA,SAASsF,EAAStF,GAAO;AACvB,SAAO,OAAOA,KAAU;AAC1B;AAEA,SAASuF,GAASvF,GAAO;AACvB,SAAO,OAAOA,KAAU;AAC1B;AAGA,SAASwF,GAAUxF,GAAO;AACxB,SACEA,MAAU,MACVA,MAAU,MACTyF,GAAazF,CAAK,KAAKkF,GAAOlF,CAAK,KAAK;AAE7C;AAEA,SAAS0F,GAAS1F,GAAO;AACvB,SAAO,OAAOA,KAAU;AAC1B;AAGA,SAASyF,GAAazF,GAAO;AAC3B,SAAO0F,GAAS1F,CAAK,KAAKA,MAAU;AACtC;AAEA,SAAS2F,EAAU3F,GAAO;AACxB,SAA8BA,KAAU;AAC1C;AAEA,SAAS4F,GAAQ5F,GAAO;AACtB,SAAO,CAACA,EAAM,OAAO;AACvB;AAIA,SAASkF,GAAOlF,GAAO;AACrB,SAAOA,KAAS,OACZA,MAAU,SACR,uBACA,kBACF,OAAO,UAAU,SAAS,KAAKA,CAAK;AAC1C;AAIA,MAAM6F,KAAuB,0BAEvBC,KAAuC,CAAChH,MAC5C,yBAAyBA,CAAG,IAExBiH,KAA2B,CAACC,MAChC,iCAAiCA,CAAG,KAEhCC,KAAuB,CAAC3F,MAAS,WAAWA,CAAI,oBAEhD4F,KAA2B,CAACpH,MAChC,6BAA6BA,CAAG,gCAE5BqH,KAAS,OAAO,UAAU;AAEhC,MAAMC,GAAS;AAAA,EACb,YAAYpE,GAAM;AAChB,SAAK,QAAQ,CAAA,GACb,KAAK,UAAU,CAAA;AAEf,QAAIqE,IAAc;AAElB,IAAArE,EAAK,QAAQ,CAAClD,MAAQ;AACpB,UAAIwH,IAAMC,GAAUzH,CAAG;AAEvB,WAAK,MAAM,KAAKwH,CAAG,GACnB,KAAK,QAAQA,EAAI,EAAE,IAAIA,GAEvBD,KAAeC,EAAI;AAAA,IACrB,CAAC,GAGD,KAAK,MAAM,QAAQ,CAACxH,MAAQ;AAC1B,MAAAA,EAAI,UAAUuH;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EACA,IAAIG,GAAO;AACT,WAAO,KAAK,QAAQA,CAAK;AAAA,EAC3B;AAAA,EACA,OAAO;AACL,WAAO,KAAK;AAAA,EACd;AAAA,EACA,SAAS;AACP,WAAO,KAAK,UAAU,KAAK,KAAK;AAAA,EAClC;AACF;AAEA,SAASD,GAAUzH,GAAK;AACtB,MAAI2H,IAAO,MACPC,IAAK,MACLC,IAAM,MACNC,IAAS,GACTC,IAAQ;AAEZ,MAAIvB,EAASxG,CAAG,KAAKmG,EAAQnG,CAAG;AAC9B,IAAA6H,IAAM7H,GACN2H,IAAOK,GAAchI,CAAG,GACxB4H,IAAKK,GAAYjI,CAAG;AAAA,OACf;AACL,QAAI,CAACqH,GAAO,KAAKrH,GAAK,MAAM;AAC1B,YAAM,IAAI,MAAMmH,GAAqB,MAAM,CAAC;AAG9C,UAAM3F,IAAOxB,EAAI;AAGjB,QAFA6H,IAAMrG,GAEF6F,GAAO,KAAKrH,GAAK,QAAQ,MAC3B8H,IAAS9H,EAAI,QAET8H,KAAU;AACZ,YAAM,IAAI,MAAMV,GAAyB5F,CAAI,CAAC;AAIlD,IAAAmG,IAAOK,GAAcxG,CAAI,GACzBoG,IAAKK,GAAYzG,CAAI,GACrBuG,IAAQ/H,EAAI;AAAA,EACd;AAEA,SAAO,EAAE,MAAA2H,GAAM,IAAAC,GAAI,QAAAE,GAAQ,KAAAD,GAAK,OAAAE,EAAK;AACvC;AAEA,SAASC,GAAchI,GAAK;AAC1B,SAAOmG,EAAQnG,CAAG,IAAIA,IAAMA,EAAI,MAAM,GAAG;AAC3C;AAEA,SAASiI,GAAYjI,GAAK;AACxB,SAAOmG,EAAQnG,CAAG,IAAIA,EAAI,KAAK,GAAG,IAAIA;AACxC;AAEA,SAASkI,GAAIV,GAAKG,GAAM;AACtB,MAAIQ,IAAO,CAAA,GACPC,IAAM;AAEV,QAAMC,IAAU,CAACb,GAAKG,GAAMW,MAAU;AACpC,QAAKzB,EAAUW,CAAG;AAGlB,UAAI,CAACG,EAAKW,CAAK;AAEb,QAAAH,EAAK,KAAKX,CAAG;AAAA,WACR;AACL,YAAIxH,IAAM2H,EAAKW,CAAK;AAEpB,cAAMpH,IAAQsG,EAAIxH,CAAG;AAErB,YAAI,CAAC6G,EAAU3F,CAAK;AAClB;AAKF,YACEoH,MAAUX,EAAK,SAAS,MACvBnB,EAAStF,CAAK,KAAKuF,GAASvF,CAAK,KAAKwF,GAAUxF,CAAK;AAEtD,UAAAiH,EAAK,KAAK5B,GAASrF,CAAK,CAAC;AAAA,iBAChBiF,EAAQjF,CAAK,GAAG;AACzB,UAAAkH,IAAM;AAEN,mBAASG,IAAI,GAAGC,IAAMtH,EAAM,QAAQqH,IAAIC,GAAKD,KAAK;AAChD,YAAAF,EAAQnH,EAAMqH,CAAC,GAAGZ,GAAMW,IAAQ,CAAC;AAAA,QAErC,MAAO,CAAIX,EAAK,UAEdU,EAAQnH,GAAOyG,GAAMW,IAAQ,CAAC;AAAA,MAElC;AAAA,EACF;AAGA,SAAAD,EAAQb,GAAKhB,EAASmB,CAAI,IAAIA,EAAK,MAAM,GAAG,IAAIA,GAAM,CAAC,GAEhDS,IAAMD,IAAOA,EAAK,CAAC;AAC5B;AAEA,MAAMM,KAAe;AAAA;AAAA;AAAA;AAAA,EAInB,gBAAgB;AAAA;AAAA;AAAA,EAGhB,gBAAgB;AAAA;AAAA,EAEhB,oBAAoB;AACtB,GAEMC,KAAe;AAAA;AAAA;AAAA,EAGnB,iBAAiB;AAAA;AAAA,EAEjB,kBAAkB;AAAA;AAAA,EAElB,cAAc;AAAA;AAAA,EAEd,MAAM,CAAA;AAAA;AAAA,EAEN,YAAY;AAAA;AAAA,EAEZ,QAAQ,CAACC,GAAGC,MACVD,EAAE,UAAUC,EAAE,QAASD,EAAE,MAAMC,EAAE,MAAM,KAAK,IAAKD,EAAE,QAAQC,EAAE,QAAQ,KAAK;AAC9E,GAEMC,KAAe;AAAA;AAAA,EAEnB,UAAU;AAAA;AAAA;AAAA,EAGV,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,UAAU;AACZ,GAEMC,KAAkB;AAAA;AAAA,EAEtB,mBAAmB;AAAA;AAAA;AAAA,EAGnB,OAAOZ;AAAA;AAAA;AAAA;AAAA,EAIP,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIhB,iBAAiB;AAAA;AAAA,EAEjB,iBAAiB;AACnB;AAEA,IAAIa,IAAS;AAAA,EACX,GAAGL;AAAA,EACH,GAAGD;AAAA,EACH,GAAGI;AAAA,EACH,GAAGC;AACL;AAEA,MAAME,KAAQ;AAId,SAASC,GAAKnB,IAAS,GAAGoB,IAAW,GAAG;AACtC,QAAMC,IAAQ,oBAAI,IAAG,GACfC,IAAI,KAAK,IAAI,IAAIF,CAAQ;AAE/B,SAAO;AAAA,IACL,IAAIhI,GAAO;AACT,YAAMmI,IAAYnI,EAAM,MAAM8H,EAAK,EAAE;AAErC,UAAIG,EAAM,IAAIE,CAAS;AACrB,eAAOF,EAAM,IAAIE,CAAS;AAI5B,YAAMJ,IAAO,IAAI,KAAK,IAAII,GAAW,MAAMvB,CAAM,GAG3C,IAAI,WAAW,KAAK,MAAMmB,IAAOG,CAAC,IAAIA,CAAC;AAE7C,aAAAD,EAAM,IAAIE,GAAW,CAAC,GAEf;AAAA,IACT;AAAA,IACA,QAAQ;AACN,MAAAF,EAAM,MAAK;AAAA,IACb;AAAA,EACJ;AACA;AAEA,MAAMG,GAAU;AAAA,EACd,YAAY;AAAA,IACV,OAAAvB,IAAQgB,EAAO;AAAA,IACf,iBAAAQ,IAAkBR,EAAO;AAAA,EAC7B,IAAM,IAAI;AACN,SAAK,OAAOE,GAAKM,GAAiB,CAAC,GACnC,KAAK,QAAQxB,GACb,KAAK,YAAY,IAEjB,KAAK,gBAAe;AAAA,EACtB;AAAA,EACA,WAAWyB,IAAO,IAAI;AACpB,SAAK,OAAOA;AAAA,EACd;AAAA,EACA,gBAAgBC,IAAU,IAAI;AAC5B,SAAK,UAAUA;AAAA,EACjB;AAAA,EACA,QAAQvG,IAAO,IAAI;AACjB,SAAK,OAAOA,GACZ,KAAK,WAAW,CAAA,GAChBA,EAAK,QAAQ,CAAClD,GAAK0J,MAAQ;AACzB,WAAK,SAAS1J,EAAI,EAAE,IAAI0J;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EACA,SAAS;AACP,IAAI,KAAK,aAAa,CAAC,KAAK,KAAK,WAIjC,KAAK,YAAY,IAGblD,EAAS,KAAK,KAAK,CAAC,CAAC,IACvB,KAAK,KAAK,QAAQ,CAACmD,GAAKC,MAAa;AACnC,WAAK,WAAWD,GAAKC,CAAQ;AAAA,IAC/B,CAAC,IAGD,KAAK,KAAK,QAAQ,CAACD,GAAKC,MAAa;AACnC,WAAK,WAAWD,GAAKC,CAAQ;AAAA,IAC/B,CAAC,GAGH,KAAK,KAAK,MAAK;AAAA,EACjB;AAAA;AAAA,EAEA,IAAID,GAAK;AACP,UAAMD,IAAM,KAAK,KAAI;AAErB,IAAIlD,EAASmD,CAAG,IACd,KAAK,WAAWA,GAAKD,CAAG,IAExB,KAAK,WAAWC,GAAKD,CAAG;AAAA,EAE5B;AAAA;AAAA,EAEA,SAASA,GAAK;AACZ,SAAK,QAAQ,OAAOA,GAAK,CAAC;AAG1B,aAASnB,IAAImB,GAAKlB,IAAM,KAAK,KAAI,GAAID,IAAIC,GAAKD,KAAK;AACjD,WAAK,QAAQA,CAAC,EAAE,KAAK;AAAA,EAEzB;AAAA,EACA,uBAAuBsB,GAAMnC,GAAO;AAClC,WAAOmC,EAAK,KAAK,SAASnC,CAAK,CAAC;AAAA,EAClC;AAAA,EACA,OAAO;AACL,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EACA,WAAWiC,GAAKC,GAAU;AACxB,QAAI,CAAC/C,EAAU8C,CAAG,KAAK7C,GAAQ6C,CAAG;AAChC;AAGF,QAAIG,IAAS;AAAA,MACX,GAAGH;AAAA,MACH,GAAGC;AAAA,MACH,GAAG,KAAK,KAAK,IAAID,CAAG;AAAA,IAC1B;AAEI,SAAK,QAAQ,KAAKG,CAAM;AAAA,EAC1B;AAAA,EACA,WAAWH,GAAKC,GAAU;AACxB,QAAIE,IAAS,EAAE,GAAGF,GAAU,GAAG,CAAA,EAAE;AAGjC,SAAK,KAAK,QAAQ,CAAC5J,GAAK+J,MAAa;AACnC,UAAI7I,IAAQlB,EAAI,QAAQA,EAAI,MAAM2J,CAAG,IAAI,KAAK,MAAMA,GAAK3J,EAAI,IAAI;AAEjE,UAAK6G,EAAU3F,CAAK;AAIpB,YAAIiF,EAAQjF,CAAK,GAAG;AAClB,cAAI8I,IAAa,CAAA;AACjB,gBAAMC,IAAQ,CAAC,EAAE,gBAAgB,IAAI,OAAA/I,EAAK,CAAE;AAE5C,iBAAO+I,EAAM,UAAQ;AACnB,kBAAM,EAAE,gBAAAC,GAAgB,OAAAhJ,MAAU+I,EAAM,IAAG;AAE3C,gBAAKpD,EAAU3F,CAAK;AAIpB,kBAAIsF,EAAStF,CAAK,KAAK,CAAC4F,GAAQ5F,CAAK,GAAG;AACtC,oBAAIiJ,IAAY;AAAA,kBACd,GAAGjJ;AAAA,kBACH,GAAGgJ;AAAA,kBACH,GAAG,KAAK,KAAK,IAAIhJ,CAAK;AAAA,gBACpC;AAEY,gBAAA8I,EAAW,KAAKG,CAAS;AAAA,cAC3B,MAAO,CAAIhE,EAAQjF,CAAK,KACtBA,EAAM,QAAQ,CAAC2I,GAAM1G,MAAM;AACzB,gBAAA8G,EAAM,KAAK;AAAA,kBACT,gBAAgB9G;AAAA,kBAChB,OAAO0G;AAAA,gBACvB,CAAe;AAAA,cACH,CAAC;AAAA,UAEL;AACA,UAAAC,EAAO,EAAEC,CAAQ,IAAIC;AAAA,QACvB,WAAWxD,EAAStF,CAAK,KAAK,CAAC4F,GAAQ5F,CAAK,GAAG;AAC7C,cAAIiJ,IAAY;AAAA,YACd,GAAGjJ;AAAA,YACH,GAAG,KAAK,KAAK,IAAIA,CAAK;AAAA,UAChC;AAEQ,UAAA4I,EAAO,EAAEC,CAAQ,IAAII;AAAA,QACvB;AAAA;AAAA,IACF,CAAC,GAED,KAAK,QAAQ,KAAKL,CAAM;AAAA,EAC1B;AAAA,EACA,SAAS;AACP,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,IACpB;AAAA,EACE;AACF;AAEA,SAASM,GACPlH,GACAsG,GACA,EAAE,OAAAzB,IAAQgB,EAAO,OAAO,iBAAAQ,IAAkBR,EAAO,oBAAoB,CAAA,GACrE;AACA,QAAMsB,IAAU,IAAIf,GAAU,EAAE,OAAAvB,GAAO,iBAAAwB,EAAe,CAAE;AACxD,SAAAc,EAAQ,QAAQnH,EAAK,IAAIuE,EAAS,CAAC,GACnC4C,EAAQ,WAAWb,CAAI,GACvBa,EAAQ,OAAM,GACPA;AACT;AAEA,SAASC,GACPC,GACA,EAAE,OAAAxC,IAAQgB,EAAO,OAAO,iBAAAQ,IAAkBR,EAAO,oBAAoB,CAAA,GACrE;AACA,QAAM,EAAE,MAAA7F,GAAM,SAAAuG,EAAO,IAAKc,GACpBF,IAAU,IAAIf,GAAU,EAAE,OAAAvB,GAAO,iBAAAwB,EAAe,CAAE;AACxD,SAAAc,EAAQ,QAAQnH,CAAI,GACpBmH,EAAQ,gBAAgBZ,CAAO,GACxBY;AACT;AAEA,SAASG,GACPC,GACA;AAAA,EACE,QAAAC,IAAS;AAAA,EACT,iBAAAC,IAAkB;AAAA,EAClB,kBAAAC,IAAmB;AAAA,EACnB,UAAAC,IAAW9B,EAAO;AAAA,EAClB,gBAAA+B,IAAiB/B,EAAO;AAC5B,IAAM,CAAA,GACJ;AACA,QAAMgC,IAAWL,IAASD,EAAQ;AAElC,MAAIK;AACF,WAAOC;AAGT,QAAMC,IAAY,KAAK,IAAIJ,IAAmBD,CAAe;AAE7D,SAAKE,IAKEE,IAAWC,IAAYH,IAHrBG,IAAY,IAAMD;AAI7B;AAEA,SAASE,GACPC,IAAY,CAAA,GACZC,IAAqBpC,EAAO,oBAC5B;AACA,MAAIqC,IAAU,CAAA,GACVC,IAAQ,IACRC,IAAM,IACN/C,IAAI;AAER,WAASC,IAAM0C,EAAU,QAAQ3C,IAAIC,GAAKD,KAAK,GAAG;AAChD,QAAIgD,IAAQL,EAAU3C,CAAC;AACvB,IAAIgD,KAASF,MAAU,KACrBA,IAAQ9C,IACC,CAACgD,KAASF,MAAU,OAC7BC,IAAM/C,IAAI,GACN+C,IAAMD,IAAQ,KAAKF,KACrBC,EAAQ,KAAK,CAACC,GAAOC,CAAG,CAAC,GAE3BD,IAAQ;AAAA,EAEZ;AAGA,SAAIH,EAAU3C,IAAI,CAAC,KAAKA,IAAI8C,KAASF,KACnCC,EAAQ,KAAK,CAACC,GAAO9C,IAAI,CAAC,CAAC,GAGtB6C;AACT;AAGA,MAAMI,IAAW;AAEjB,SAASC,GACPC,GACAjB,GACAkB,GACA;AAAA,EACE,UAAAC,IAAW7C,EAAO;AAAA,EAClB,UAAA8B,IAAW9B,EAAO;AAAA,EAClB,WAAA8C,IAAY9C,EAAO;AAAA,EACnB,gBAAA+C,IAAiB/C,EAAO;AAAA,EACxB,oBAAAoC,IAAqBpC,EAAO;AAAA,EAC5B,gBAAAgD,IAAiBhD,EAAO;AAAA,EACxB,gBAAA+B,IAAiB/B,EAAO;AAC5B,IAAM,CAAA,GACJ;AACA,MAAI0B,EAAQ,SAASe;AACnB,UAAM,IAAI,MAAMvE,GAAyBuE,CAAQ,CAAC;AAGpD,QAAMQ,IAAavB,EAAQ,QAErBwB,IAAUP,EAAK,QAEfd,IAAmB,KAAK,IAAI,GAAG,KAAK,IAAIgB,GAAUK,CAAO,CAAC;AAEhE,MAAIC,IAAmBL,GAEnBM,IAAevB;AAInB,QAAMwB,IAAiBjB,IAAqB,KAAKY,GAE3CM,IAAYD,IAAiB,MAAMH,CAAO,IAAI,CAAA;AAEpD,MAAI3D;AAGJ,UAAQA,IAAQoD,EAAK,QAAQjB,GAAS0B,CAAY,KAAK,MAAI;AACzD,QAAIG,IAAQ9B,GAAeC,GAAS;AAAA,MAClC,iBAAiBnC;AAAA,MACjB,kBAAAsC;AAAA,MACA,UAAAC;AAAA,MACA,gBAAAC;AAAA,IACN,CAAK;AAKD,QAHAoB,IAAmB,KAAK,IAAII,GAAOJ,CAAgB,GACnDC,IAAe7D,IAAQ0D,GAEnBI,GAAgB;AAClB,UAAI7D,IAAI;AACR,aAAOA,IAAIyD;AACT,QAAAK,EAAU/D,IAAQC,CAAC,IAAI,GACvBA,KAAK;AAAA,IAET;AAAA,EACF;AAGA,EAAA4D,IAAe;AAEf,MAAII,IAAa,CAAA,GACbC,IAAa,GACbC,IAAST,IAAaC;AAE1B,QAAMS,IAAO,KAAMV,IAAa;AAEhC,WAASzD,IAAI,GAAGA,IAAIyD,GAAYzD,KAAK,GAAG;AAItC,QAAIoE,IAAS,GACTC,IAASH;AAEb,WAAOE,IAASC;AASd,MARcpC,GAAeC,GAAS;AAAA,QACpC,QAAQlC;AAAA,QACR,iBAAiBqC,IAAmBgC;AAAA,QACpC,kBAAAhC;AAAA,QACA,UAAAC;AAAA,QACA,gBAAAC;AAAA,MACR,CAAO,KAEYoB,IACXS,IAASC,IAETH,IAASG,GAGXA,IAAS,KAAK,OAAOH,IAASE,KAAU,IAAIA,CAAM;AAIpD,IAAAF,IAASG;AAET,QAAIvB,IAAQ,KAAK,IAAI,GAAGT,IAAmBgC,IAAS,CAAC,GACjDC,IAASf,IACTG,IACA,KAAK,IAAIrB,IAAmBgC,GAAQX,CAAO,IAAID,GAG/Cc,IAAS,MAAMD,IAAS,CAAC;AAE7B,IAAAC,EAAOD,IAAS,CAAC,KAAK,KAAKtE,KAAK;AAEhC,aAASwE,IAAIF,GAAQE,KAAK1B,GAAO0B,KAAK,GAAG;AACvC,UAAIpC,IAAkBoC,IAAI,GACtBC,IAAYrB,EAAgBD,EAAK,OAAOf,CAAe,CAAC;AAgB5D,UAdIyB,MAEFC,EAAU1B,CAAe,IAAI,CAAC,CAAC,CAACqC,IAIlCF,EAAOC,CAAC,KAAMD,EAAOC,IAAI,CAAC,KAAK,IAAK,KAAKC,GAGrCzE,MACFuE,EAAOC,CAAC,MACJR,EAAWQ,IAAI,CAAC,IAAIR,EAAWQ,CAAC,MAAM,IAAK,IAAIR,EAAWQ,IAAI,CAAC,IAGjED,EAAOC,CAAC,IAAIL,MACdF,IAAahC,GAAeC,GAAS;AAAA,QACnC,QAAQlC;AAAA,QACR,iBAAAoC;AAAA,QACA,kBAAAC;AAAA,QACA,UAAAC;AAAA,QACA,gBAAAC;AAAA,MACV,CAAS,GAIG0B,KAAcN,IAAkB;AAMlC,YAJAA,IAAmBM,GACnBL,IAAexB,GAGXwB,KAAgBvB;AAClB;AAIF,QAAAS,IAAQ,KAAK,IAAI,GAAG,IAAIT,IAAmBuB,CAAY;AAAA,MACzD;AAAA,IAEJ;AAWA,QARc3B,GAAeC,GAAS;AAAA,MACpC,QAAQlC,IAAI;AAAA,MACZ,iBAAiBqC;AAAA,MACjB,kBAAAA;AAAA,MACA,UAAAC;AAAA,MACA,gBAAAC;AAAA,IACN,CAAK,IAEWoB;AACV;AAGF,IAAAK,IAAaO;AAAA,EACf;AAEA,QAAMxG,IAAS;AAAA,IACb,SAAS6F,KAAgB;AAAA;AAAA,IAEzB,OAAO,KAAK,IAAI,MAAOK,CAAU;AAAA,EACrC;AAEE,MAAIJ,GAAgB;AAClB,UAAMhB,IAAUH,GAAqBoB,GAAWlB,CAAkB;AAClE,IAAKC,EAAQ,SAEFW,MACTzF,EAAO,UAAU8E,KAFjB9E,EAAO,UAAU;AAAA,EAIrB;AAEA,SAAOA;AACT;AAEA,SAAS2G,GAAsBxC,GAAS;AACtC,MAAIiC,IAAO,CAAA;AAEX,WAASnE,IAAI,GAAGC,IAAMiC,EAAQ,QAAQlC,IAAIC,GAAKD,KAAK,GAAG;AACrD,UAAM2E,IAAOzC,EAAQ,OAAOlC,CAAC;AAC7B,IAAAmE,EAAKQ,CAAI,KAAKR,EAAKQ,CAAI,KAAK,KAAM,KAAM1E,IAAMD,IAAI;AAAA,EACpD;AAEA,SAAOmE;AACT;AAEA,MAAMS,KAAkB,OAAO,UAAU,aAClC,CAACC,MAAQA,EAAI,UAAU,KAAK,EAAE,QAAQ,0kEAA0kE,EAAE,MAClnE,CAACA,MAAQA;AAEhB,MAAMC,GAAY;AAAA,EAChB,YACE5C,GACA;AAAA,IACE,UAAAmB,IAAW7C,EAAO;AAAA,IAClB,WAAA8C,IAAY9C,EAAO;AAAA,IACnB,UAAA8B,IAAW9B,EAAO;AAAA,IAClB,gBAAAgD,IAAiBhD,EAAO;AAAA,IACxB,gBAAA+C,IAAiB/C,EAAO;AAAA,IACxB,oBAAAoC,IAAqBpC,EAAO;AAAA,IAC5B,iBAAAuE,IAAkBvE,EAAO;AAAA,IACzB,kBAAAwE,IAAmBxE,EAAO;AAAA,IAC1B,gBAAA+B,IAAiB/B,EAAO;AAAA,EAC9B,IAAQ,CAAA,GACJ;AAmBA,QAlBA,KAAK,UAAU;AAAA,MACb,UAAA6C;AAAA,MACA,WAAAC;AAAA,MACA,UAAAhB;AAAA,MACA,gBAAAkB;AAAA,MACA,gBAAAD;AAAA,MACA,oBAAAX;AAAA,MACA,iBAAAmC;AAAA,MACA,kBAAAC;AAAA,MACA,gBAAAzC;AAAA,IACN,GAEIL,IAAU6C,IAAkB7C,IAAUA,EAAQ,YAAW,GACzDA,IAAU8C,IAAmBJ,GAAgB1C,CAAO,IAAIA,GACxD,KAAK,UAAUA,GAEf,KAAK,SAAS,CAAA,GAEV,CAAC,KAAK,QAAQ;AAChB;AAGF,UAAM+C,IAAW,CAAC/C,GAASgD,MAAe;AACxC,WAAK,OAAO,KAAK;AAAA,QACf,SAAAhD;AAAA,QACA,UAAUwC,GAAsBxC,CAAO;AAAA,QACvC,YAAAgD;AAAA,MACR,CAAO;AAAA,IACH,GAEMjF,IAAM,KAAK,QAAQ;AAEzB,QAAIA,IAAMgD,GAAU;AAClB,UAAIjD,IAAI;AACR,YAAMmF,IAAYlF,IAAMgD,GAClBF,IAAM9C,IAAMkF;AAElB,aAAOnF,IAAI+C;AACT,QAAAkC,EAAS,KAAK,QAAQ,OAAOjF,GAAGiD,CAAQ,GAAGjD,CAAC,GAC5CA,KAAKiD;AAGP,UAAIkC,GAAW;AACb,cAAMD,IAAajF,IAAMgD;AACzB,QAAAgC,EAAS,KAAK,QAAQ,OAAOC,CAAU,GAAGA,CAAU;AAAA,MACtD;AAAA,IACF;AACE,MAAAD,EAAS,KAAK,SAAS,CAAC;AAAA,EAE5B;AAAA,EAEA,SAAS9B,GAAM;AACb,UAAM,EAAE,iBAAA4B,GAAiB,kBAAAC,GAAkB,gBAAAxB,EAAc,IAAK,KAAK;AAMnE,QAJAL,IAAO4B,IAAkB5B,IAAOA,EAAK,YAAW,GAChDA,IAAO6B,IAAmBJ,GAAgBzB,CAAI,IAAIA,GAG9C,KAAK,YAAYA,GAAM;AACzB,UAAIpF,IAAS;AAAA,QACX,SAAS;AAAA,QACT,OAAO;AAAA,MACf;AAEM,aAAIyF,MACFzF,EAAO,UAAU,CAAC,CAAC,GAAGoF,EAAK,SAAS,CAAC,CAAC,IAGjCpF;AAAA,IACT;AAGA,UAAM;AAAA,MACJ,UAAAsF;AAAA,MACA,UAAAf;AAAA,MACA,WAAAgB;AAAA,MACA,gBAAAC;AAAA,MACA,oBAAAX;AAAA,MACA,gBAAAL;AAAA,IACN,IAAQ,KAAK;AAET,QAAI6C,IAAa,CAAA,GACbC,IAAa,GACbC,IAAa;AAEjB,SAAK,OAAO,QAAQ,CAAC,EAAE,SAAApD,GAAS,UAAAqD,GAAU,YAAAL,QAAiB;AACzD,YAAM,EAAE,SAAAM,GAAS,OAAAzB,GAAO,SAAAlB,EAAO,IAAKK,GAAOC,GAAMjB,GAASqD,GAAU;AAAA,QAClE,UAAUlC,IAAW6B;AAAA,QACrB,UAAA5C;AAAA,QACA,WAAAgB;AAAA,QACA,gBAAAC;AAAA,QACA,oBAAAX;AAAA,QACA,gBAAAY;AAAA,QACA,gBAAAjB;AAAA,MACR,CAAO;AAED,MAAIiD,MACFF,IAAa,KAGfD,KAActB,GAEVyB,KAAW3C,MACbuC,IAAa,CAAC,GAAGA,GAAY,GAAGvC,CAAO;AAAA,IAE3C,CAAC;AAED,QAAI9E,IAAS;AAAA,MACX,SAASuH;AAAA,MACT,OAAOA,IAAaD,IAAa,KAAK,OAAO,SAAS;AAAA,IAC5D;AAEI,WAAIC,KAAc9B,MAChBzF,EAAO,UAAUqH,IAGZrH;AAAA,EACT;AACF;AAEA,MAAM0H,EAAU;AAAA,EACd,YAAYvD,GAAS;AACnB,SAAK,UAAUA;AAAA,EACjB;AAAA,EACA,OAAO,aAAaA,GAAS;AAC3B,WAAOwD,GAASxD,GAAS,KAAK,UAAU;AAAA,EAC1C;AAAA,EACA,OAAO,cAAcA,GAAS;AAC5B,WAAOwD,GAASxD,GAAS,KAAK,WAAW;AAAA,EAC3C;AAAA,EACA,SAAiB;AAAA,EAAC;AACpB;AAEA,SAASwD,GAASxD,GAASyD,GAAK;AAC9B,QAAMC,IAAU1D,EAAQ,MAAMyD,CAAG;AACjC,SAAOC,IAAUA,EAAQ,CAAC,IAAI;AAChC;AAIA,MAAMC,WAAmBJ,EAAU;AAAA,EACjC,YAAYvD,GAAS;AACnB,UAAMA,CAAO;AAAA,EACf;AAAA,EACA,WAAW,OAAO;AAChB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,aAAa;AACtB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AAAA,EACA,OAAOiB,GAAM;AACX,UAAMqC,IAAUrC,MAAS,KAAK;AAE9B,WAAO;AAAA,MACL,SAAAqC;AAAA,MACA,OAAOA,IAAU,IAAI;AAAA,MACrB,SAAS,CAAC,GAAG,KAAK,QAAQ,SAAS,CAAC;AAAA,IAC1C;AAAA,EACE;AACF;AAIA,MAAMM,WAA0BL,EAAU;AAAA,EACxC,YAAYvD,GAAS;AACnB,UAAMA,CAAO;AAAA,EACf;AAAA,EACA,WAAW,OAAO;AAChB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,aAAa;AACtB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AAAA,EACA,OAAOiB,GAAM;AAEX,UAAMqC,IADQrC,EAAK,QAAQ,KAAK,OAAO,MACb;AAE1B,WAAO;AAAA,MACL,SAAAqC;AAAA,MACA,OAAOA,IAAU,IAAI;AAAA,MACrB,SAAS,CAAC,GAAGrC,EAAK,SAAS,CAAC;AAAA,IAClC;AAAA,EACE;AACF;AAIA,MAAM4C,WAAyBN,EAAU;AAAA,EACvC,YAAYvD,GAAS;AACnB,UAAMA,CAAO;AAAA,EACf;AAAA,EACA,WAAW,OAAO;AAChB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,aAAa;AACtB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AAAA,EACA,OAAOiB,GAAM;AACX,UAAMqC,IAAUrC,EAAK,WAAW,KAAK,OAAO;AAE5C,WAAO;AAAA,MACL,SAAAqC;AAAA,MACA,OAAOA,IAAU,IAAI;AAAA,MACrB,SAAS,CAAC,GAAG,KAAK,QAAQ,SAAS,CAAC;AAAA,IAC1C;AAAA,EACE;AACF;AAIA,MAAMQ,WAAgCP,EAAU;AAAA,EAC9C,YAAYvD,GAAS;AACnB,UAAMA,CAAO;AAAA,EACf;AAAA,EACA,WAAW,OAAO;AAChB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,aAAa;AACtB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AAAA,EACA,OAAOiB,GAAM;AACX,UAAMqC,IAAU,CAACrC,EAAK,WAAW,KAAK,OAAO;AAE7C,WAAO;AAAA,MACL,SAAAqC;AAAA,MACA,OAAOA,IAAU,IAAI;AAAA,MACrB,SAAS,CAAC,GAAGrC,EAAK,SAAS,CAAC;AAAA,IAClC;AAAA,EACE;AACF;AAIA,MAAM8C,WAAyBR,EAAU;AAAA,EACvC,YAAYvD,GAAS;AACnB,UAAMA,CAAO;AAAA,EACf;AAAA,EACA,WAAW,OAAO;AAChB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,aAAa;AACtB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AAAA,EACA,OAAOiB,GAAM;AACX,UAAMqC,IAAUrC,EAAK,SAAS,KAAK,OAAO;AAE1C,WAAO;AAAA,MACL,SAAAqC;AAAA,MACA,OAAOA,IAAU,IAAI;AAAA,MACrB,SAAS,CAACrC,EAAK,SAAS,KAAK,QAAQ,QAAQA,EAAK,SAAS,CAAC;AAAA,IAClE;AAAA,EACE;AACF;AAIA,MAAM+C,WAAgCT,EAAU;AAAA,EAC9C,YAAYvD,GAAS;AACnB,UAAMA,CAAO;AAAA,EACf;AAAA,EACA,WAAW,OAAO;AAChB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,aAAa;AACtB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AAAA,EACA,OAAOiB,GAAM;AACX,UAAMqC,IAAU,CAACrC,EAAK,SAAS,KAAK,OAAO;AAC3C,WAAO;AAAA,MACL,SAAAqC;AAAA,MACA,OAAOA,IAAU,IAAI;AAAA,MACrB,SAAS,CAAC,GAAGrC,EAAK,SAAS,CAAC;AAAA,IAClC;AAAA,EACE;AACF;AAEA,MAAMgD,WAAmBV,EAAU;AAAA,EACjC,YACEvD,GACA;AAAA,IACE,UAAAmB,IAAW7C,EAAO;AAAA,IAClB,WAAA8C,IAAY9C,EAAO;AAAA,IACnB,UAAA8B,IAAW9B,EAAO;AAAA,IAClB,gBAAAgD,IAAiBhD,EAAO;AAAA,IACxB,gBAAA+C,IAAiB/C,EAAO;AAAA,IACxB,oBAAAoC,IAAqBpC,EAAO;AAAA,IAC5B,iBAAAuE,IAAkBvE,EAAO;AAAA,IACzB,kBAAAwE,IAAmBxE,EAAO;AAAA,IAC1B,gBAAA+B,IAAiB/B,EAAO;AAAA,EAC9B,IAAQ,CAAA,GACJ;AACA,UAAM0B,CAAO,GACb,KAAK,eAAe,IAAI4C,GAAY5C,GAAS;AAAA,MAC3C,UAAAmB;AAAA,MACA,WAAAC;AAAA,MACA,UAAAhB;AAAA,MACA,gBAAAkB;AAAA,MACA,gBAAAD;AAAA,MACA,oBAAAX;AAAA,MACA,iBAAAmC;AAAA,MACA,kBAAAC;AAAA,MACA,gBAAAzC;AAAA,IACN,CAAK;AAAA,EACH;AAAA,EACA,WAAW,OAAO;AAChB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,aAAa;AACtB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AAAA,EACA,OAAOY,GAAM;AACX,WAAO,KAAK,aAAa,SAASA,CAAI;AAAA,EACxC;AACF;AAIA,MAAMiD,WAAqBX,EAAU;AAAA,EACnC,YAAYvD,GAAS;AACnB,UAAMA,CAAO;AAAA,EACf;AAAA,EACA,WAAW,OAAO;AAChB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,aAAa;AACtB,WAAO;AAAA,EACT;AAAA,EACA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AAAA,EACA,OAAOiB,GAAM;AACX,QAAIE,IAAW,GACXtD;AAEJ,UAAM8C,IAAU,CAAA,GACVY,IAAa,KAAK,QAAQ;AAGhC,YAAQ1D,IAAQoD,EAAK,QAAQ,KAAK,SAASE,CAAQ,KAAK;AACtD,MAAAA,IAAWtD,IAAQ0D,GACnBZ,EAAQ,KAAK,CAAC9C,GAAOsD,IAAW,CAAC,CAAC;AAGpC,UAAMmC,IAAU,CAAC,CAAC3C,EAAQ;AAE1B,WAAO;AAAA,MACL,SAAA2C;AAAA,MACA,OAAOA,IAAU,IAAI;AAAA,MACrB,SAAA3C;AAAA,IACN;AAAA,EACE;AACF;AAGA,MAAMwD,KAAY;AAAA,EAChBR;AAAA,EACAO;AAAA,EACAL;AAAA,EACAC;AAAA,EACAE;AAAA,EACAD;AAAA,EACAH;AAAA,EACAK;AACF,GAEMG,KAAeD,GAAU,QAGzBE,KAAW,sCACXC,KAAW;AAKjB,SAASC,GAAWvE,GAASwE,IAAU,IAAI;AACzC,SAAOxE,EAAQ,MAAMsE,EAAQ,EAAE,IAAI,CAAClF,MAAS;AAC3C,QAAIqF,IAAQrF,EACT,KAAI,EACJ,MAAMiF,EAAQ,EACd,OAAO,CAACjF,MAASA,KAAQ,CAAC,CAACA,EAAK,MAAM,GAErCsF,IAAU,CAAA;AACd,aAAS5G,IAAI,GAAGC,IAAM0G,EAAM,QAAQ3G,IAAIC,GAAKD,KAAK,GAAG;AACnD,YAAM6G,IAAYF,EAAM3G,CAAC;AAGzB,UAAI8G,IAAQ,IACR3F,IAAM;AACV,aAAO,CAAC2F,KAAS,EAAE3F,IAAMmF,MAAc;AACrC,cAAMS,IAAWV,GAAUlF,CAAG;AAC9B,YAAI6F,IAAQD,EAAS,aAAaF,CAAS;AAC3C,QAAIG,MACFJ,EAAQ,KAAK,IAAIG,EAASC,GAAON,CAAO,CAAC,GACzCI,IAAQ;AAAA,MAEZ;AAEA,UAAI,CAAAA;AAMJ,aADA3F,IAAM,IACC,EAAEA,IAAMmF,MAAc;AAC3B,gBAAMS,IAAWV,GAAUlF,CAAG;AAC9B,cAAI6F,IAAQD,EAAS,cAAcF,CAAS;AAC5C,cAAIG,GAAO;AACT,YAAAJ,EAAQ,KAAK,IAAIG,EAASC,GAAON,CAAO,CAAC;AACzC;AAAA,UACF;AAAA,QACF;AAAA,IACF;AAEA,WAAOE;AAAA,EACT,CAAC;AACH;AAIA,MAAMK,KAAgB,oBAAI,IAAI,CAACd,GAAW,MAAMC,GAAa,IAAI,CAAC;AA8BlE,MAAMc,GAAe;AAAA,EACnB,YACEhF,GACA;AAAA,IACE,iBAAA6C,IAAkBvE,EAAO;AAAA,IACzB,kBAAAwE,IAAmBxE,EAAO;AAAA,IAC1B,gBAAAgD,IAAiBhD,EAAO;AAAA,IACxB,oBAAAoC,IAAqBpC,EAAO;AAAA,IAC5B,gBAAA+B,IAAiB/B,EAAO;AAAA,IACxB,gBAAA+C,IAAiB/C,EAAO;AAAA,IACxB,UAAA6C,IAAW7C,EAAO;AAAA,IAClB,WAAA8C,IAAY9C,EAAO;AAAA,IACnB,UAAA8B,IAAW9B,EAAO;AAAA,EACxB,IAAQ,CAAA,GACJ;AACA,SAAK,QAAQ,MACb,KAAK,UAAU;AAAA,MACb,iBAAAuE;AAAA,MACA,kBAAAC;AAAA,MACA,gBAAAxB;AAAA,MACA,oBAAAZ;AAAA,MACA,gBAAAW;AAAA,MACA,gBAAAhB;AAAA,MACA,UAAAc;AAAA,MACA,WAAAC;AAAA,MACA,UAAAhB;AAAA,IACN,GAEIJ,IAAU6C,IAAkB7C,IAAUA,EAAQ,YAAW,GACzDA,IAAU8C,IAAmBJ,GAAgB1C,CAAO,IAAIA,GACxD,KAAK,UAAUA,GACf,KAAK,QAAQuE,GAAW,KAAK,SAAS,KAAK,OAAO;AAAA,EACpD;AAAA,EAEA,OAAO,UAAUU,GAAGT,GAAS;AAC3B,WAAOA,EAAQ;AAAA,EACjB;AAAA,EAEA,SAASvD,GAAM;AACb,UAAMwD,IAAQ,KAAK;AAEnB,QAAI,CAACA;AACH,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,MACf;AAGI,UAAM,EAAE,gBAAAnD,GAAgB,iBAAAuB,GAAiB,kBAAAC,EAAgB,IAAK,KAAK;AAEnE,IAAA7B,IAAO4B,IAAkB5B,IAAOA,EAAK,YAAW,GAChDA,IAAO6B,IAAmBJ,GAAgBzB,CAAI,IAAIA;AAElD,QAAIiE,IAAa,GACbhC,IAAa,CAAA,GACbC,IAAa;AAGjB,aAASrF,IAAI,GAAGqH,IAAOV,EAAM,QAAQ3G,IAAIqH,GAAMrH,KAAK,GAAG;AACrD,YAAMqG,IAAYM,EAAM3G,CAAC;AAGzB,MAAAoF,EAAW,SAAS,GACpBgC,IAAa;AAGb,eAAS5C,IAAI,GAAG8C,IAAOjB,EAAU,QAAQ7B,IAAI8C,GAAM9C,KAAK,GAAG;AACzD,cAAMuC,IAAWV,EAAU7B,CAAC,GACtB,EAAE,SAAAgB,GAAS,SAAA3C,GAAS,OAAAkB,EAAK,IAAKgD,EAAS,OAAO5D,CAAI;AAExD,YAAIqC;AAGF,cAFA4B,KAAc,GACd/B,KAActB,GACVP,GAAgB;AAClB,kBAAMlM,IAAOyP,EAAS,YAAY;AAClC,YAAIE,GAAc,IAAI3P,CAAI,IACxB8N,IAAa,CAAC,GAAGA,GAAY,GAAGvC,CAAO,IAEvCuC,EAAW,KAAKvC,CAAO;AAAA,UAE3B;AAAA,eACK;AACL,UAAAwC,IAAa,GACb+B,IAAa,GACbhC,EAAW,SAAS;AACpB;AAAA,QACF;AAAA,MACF;AAGA,UAAIgC,GAAY;AACd,YAAIrJ,IAAS;AAAA,UACX,SAAS;AAAA,UACT,OAAOsH,IAAa+B;AAAA,QAC9B;AAEQ,eAAI5D,MACFzF,EAAO,UAAUqH,IAGZrH;AAAA,MACT;AAAA,IACF;AAGA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,IACb;AAAA,EACE;AACF;AAEA,MAAMwJ,KAAsB,CAAA;AAE5B,SAASC,MAAYC,GAAM;AACzB,EAAAF,GAAoB,KAAK,GAAGE,CAAI;AAClC;AAEA,SAASC,GAAexF,GAASwE,GAAS;AACxC,WAAS1G,IAAI,GAAGC,IAAMsH,GAAoB,QAAQvH,IAAIC,GAAKD,KAAK,GAAG;AACjE,QAAI2H,IAAgBJ,GAAoBvH,CAAC;AACzC,QAAI2H,EAAc,UAAUzF,GAASwE,CAAO;AAC1C,aAAO,IAAIiB,EAAczF,GAASwE,CAAO;AAAA,EAE7C;AAEA,SAAO,IAAI5B,GAAY5C,GAASwE,CAAO;AACzC;AAEA,MAAMkB,KAAkB;AAAA,EACtB,KAAK;AAAA,EACL,IAAI;AACN,GAEMC,KAAU;AAAA,EACd,MAAM;AAAA,EACN,SAAS;AACX,GAEMC,KAAe,CAACnB,MACpB,CAAC,EAAEA,EAAMiB,GAAgB,GAAG,KAAKjB,EAAMiB,GAAgB,EAAE,IAErDG,KAAS,CAACpB,MAAU,CAAC,CAACA,EAAMkB,GAAQ,IAAI,GAExCG,KAAS,CAACrB,MACd,CAAC/I,EAAQ+I,CAAK,KAAKtI,GAASsI,CAAK,KAAK,CAACmB,GAAanB,CAAK,GAErDsB,KAAoB,CAACtB,OAAW;AAAA,EACpC,CAACiB,GAAgB,GAAG,GAAG,OAAO,KAAKjB,CAAK,EAAE,IAAI,CAAClP,OAAS;AAAA,IACtD,CAACA,CAAG,GAAGkP,EAAMlP,CAAG;AAAA,EACpB,EAAI;AACJ;AAIA,SAASyQ,GAAMvB,GAAOD,GAAS,EAAE,MAAAyB,IAAO,GAAI,IAAK,IAAI;AACnD,QAAMC,IAAO,CAACzB,MAAU;AACtB,QAAIhM,IAAO,OAAO,KAAKgM,CAAK;AAE5B,UAAM0B,IAAcN,GAAOpB,CAAK;AAEhC,QAAI,CAAC0B,KAAe1N,EAAK,SAAS,KAAK,CAACmN,GAAanB,CAAK;AACxD,aAAOyB,EAAKH,GAAkBtB,CAAK,CAAC;AAGtC,QAAIqB,GAAOrB,CAAK,GAAG;AACjB,YAAMlP,IAAM4Q,IAAc1B,EAAMkB,GAAQ,IAAI,IAAIlN,EAAK,CAAC,GAEhDuH,IAAUmG,IAAc1B,EAAMkB,GAAQ,OAAO,IAAIlB,EAAMlP,CAAG;AAEhE,UAAI,CAACwG,EAASiE,CAAO;AACnB,cAAM,IAAI,MAAMzD,GAAqChH,CAAG,CAAC;AAG3D,YAAMwH,IAAM;AAAA,QACV,OAAOS,GAAYjI,CAAG;AAAA,QACtB,SAAAyK;AAAA,MACR;AAEM,aAAIiG,MACFlJ,EAAI,WAAWyI,GAAexF,GAASwE,CAAO,IAGzCzH;AAAA,IACT;AAEA,QAAInE,IAAO;AAAA,MACT,UAAU,CAAA;AAAA,MACV,UAAUH,EAAK,CAAC;AAAA,IACtB;AAEI,WAAAA,EAAK,QAAQ,CAAClD,MAAQ;AACpB,YAAMkB,IAAQgO,EAAMlP,CAAG;AAEvB,MAAImG,EAAQjF,CAAK,KACfA,EAAM,QAAQ,CAAC2I,MAAS;AACtB,QAAAxG,EAAK,SAAS,KAAKsN,EAAK9G,CAAI,CAAC;AAAA,MAC/B,CAAC;AAAA,IAEL,CAAC,GAEMxG;AAAA,EACT;AAEA,SAAKgN,GAAanB,CAAK,MACrBA,IAAQsB,GAAkBtB,CAAK,IAG1ByB,EAAKzB,CAAK;AACnB;AAGA,SAAS2B,GACP1B,GACA,EAAE,iBAAA2B,IAAkB/H,EAAO,gBAAe,GAC1C;AACA,EAAAoG,EAAQ,QAAQ,CAAC7I,MAAW;AAC1B,QAAIsH,IAAa;AAEjB,IAAAtH,EAAO,QAAQ,QAAQ,CAAC,EAAE,KAAAtG,GAAK,MAAAiJ,GAAM,OAAAqD,QAAY;AAC/C,YAAMxE,IAAS9H,IAAMA,EAAI,SAAS;AAElC,MAAA4N,KAAc,KAAK;AAAA,QACjBtB,MAAU,KAAKxE,IAAS,OAAO,UAAUwE;AAAA,SACxCxE,KAAU,MAAMgJ,IAAkB,IAAI7H;AAAA,MAC/C;AAAA,IACI,CAAC,GAED3C,EAAO,QAAQsH;AAAA,EACjB,CAAC;AACH;AAEA,SAASmD,GAAiBzK,GAAQiE,GAAM;AACtC,QAAM4D,IAAU7H,EAAO;AAGvB,EAFAiE,EAAK,UAAU,CAAA,GAEV1D,EAAUsH,CAAO,KAItBA,EAAQ,QAAQ,CAAC5C,MAAU;AACzB,QAAI,CAAC1E,EAAU0E,EAAM,OAAO,KAAK,CAACA,EAAM,QAAQ;AAC9C;AAGF,UAAM,EAAE,SAAAH,GAAS,OAAAlK,EAAK,IAAKqK;AAE3B,QAAI/D,IAAM;AAAA,MACR,SAAA4D;AAAA,MACA,OAAAlK;AAAA,IACN;AAEI,IAAIqK,EAAM,QACR/D,EAAI,MAAM+D,EAAM,IAAI,MAGlBA,EAAM,MAAM,OACd/D,EAAI,WAAW+D,EAAM,MAGvBhB,EAAK,QAAQ,KAAK/C,CAAG;AAAA,EACvB,CAAC;AACH;AAEA,SAASwJ,GAAe1K,GAAQiE,GAAM;AACpC,EAAAA,EAAK,QAAQjE,EAAO;AACtB;AAEA,SAAS2K,GACP9B,GACA3F,GACA;AAAA,EACE,gBAAAuC,IAAiBhD,EAAO;AAAA,EACxB,cAAAmI,IAAenI,EAAO;AAC1B,IAAM,CAAA,GACJ;AACA,QAAMoI,IAAe,CAAA;AAErB,SAAIpF,KAAgBoF,EAAa,KAAKJ,EAAgB,GAClDG,KAAcC,EAAa,KAAKH,EAAc,GAE3C7B,EAAQ,IAAI,CAAC7I,MAAW;AAC7B,UAAM,EAAE,KAAAoD,EAAG,IAAKpD,GAEViE,IAAO;AAAA,MACX,MAAMf,EAAKE,CAAG;AAAA,MACd,UAAUA;AAAA,IAChB;AAEI,WAAIyH,EAAa,UACfA,EAAa,QAAQ,CAACC,MAAgB;AACpC,MAAAA,EAAY9K,GAAQiE,CAAI;AAAA,IAC1B,CAAC,GAGIA;AAAA,EACT,CAAC;AACH;AAEA,MAAM8G,EAAK;AAAA,EACT,YAAY7H,GAAMyF,IAAU,CAAA,GAAI3G,GAAO;AACrC,SAAK,UAAU,EAAE,GAAGS,GAAQ,GAAGkG,EAAO,GAGpC,KAAK,QAAQ,mBAMf,KAAK,YAAY,IAAI3H,GAAS,KAAK,QAAQ,IAAI,GAE/C,KAAK,cAAckC,GAAMlB,CAAK;AAAA,EAChC;AAAA,EAEA,cAAckB,GAAMlB,GAAO;AAGzB,QAFA,KAAK,QAAQkB,GAETlB,KAAS,EAAEA,aAAiBgB;AAC9B,YAAM,IAAI,MAAMvC,EAAoB;AAGtC,SAAK,WACHuB,KACA8B,GAAY,KAAK,QAAQ,MAAM,KAAK,OAAO;AAAA,MACzC,OAAO,KAAK,QAAQ;AAAA,MACpB,iBAAiB,KAAK,QAAQ;AAAA,IACtC,CAAO;AAAA,EACL;AAAA,EAEA,IAAIT,GAAK;AACP,IAAK9C,EAAU8C,CAAG,MAIlB,KAAK,MAAM,KAAKA,CAAG,GACnB,KAAK,SAAS,IAAIA,CAAG;AAAA,EACvB;AAAA,EAEA,OAAO2H,IAAY,MAAoB,IAAO;AAC5C,UAAMnC,IAAU,CAAA;AAEhB,aAAS,IAAI,GAAG3G,IAAM,KAAK,MAAM,QAAQ,IAAIA,GAAK,KAAK,GAAG;AACxD,YAAMmB,IAAM,KAAK,MAAM,CAAC;AACxB,MAAI2H,EAAU3H,GAAK,CAAC,MAClB,KAAK,SAAS,CAAC,GACf,KAAK,GACLnB,KAAO,GAEP2G,EAAQ,KAAKxF,CAAG;AAAA,IAEpB;AAEA,WAAOwF;AAAA,EACT;AAAA,EAEA,SAASzF,GAAK;AACZ,SAAK,MAAM,OAAOA,GAAK,CAAC,GACxB,KAAK,SAAS,SAASA,CAAG;AAAA,EAC5B;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAOwF,GAAO,EAAE,OAAAqC,IAAQ,GAAE,IAAK,CAAA,GAAI;AACjC,UAAM;AAAA,MACJ,gBAAAxF;AAAA,MACA,cAAAmF;AAAA,MACA,YAAAM;AAAA,MACA,QAAAC;AAAA,MACA,iBAAAX;AAAA,IACN,IAAQ,KAAK;AAET,QAAI3B,IAAU3I,EAAS0I,CAAK,IACxB1I,EAAS,KAAK,MAAM,CAAC,CAAC,IACpB,KAAK,kBAAkB0I,CAAK,IAC5B,KAAK,kBAAkBA,CAAK,IAC9B,KAAK,eAAeA,CAAK;AAE7B,WAAA2B,GAAa1B,GAAS,EAAE,iBAAA2B,GAAiB,GAErCU,KACFrC,EAAQ,KAAKsC,CAAM,GAGjBhL,GAAS8K,CAAK,KAAKA,IAAQ,OAC7BpC,IAAUA,EAAQ,MAAM,GAAGoC,CAAK,IAG3BN,GAAO9B,GAAS,KAAK,OAAO;AAAA,MACjC,gBAAApD;AAAA,MACA,cAAAmF;AAAA,IACN,CAAK;AAAA,EACH;AAAA,EAEA,kBAAkBhC,GAAO;AACvB,UAAMI,IAAWW,GAAef,GAAO,KAAK,OAAO,GAC7C,EAAE,SAAAzF,MAAY,KAAK,UACnB0F,IAAU,CAAA;AAGhB,WAAA1F,EAAQ,QAAQ,CAAC,EAAE,GAAGiC,GAAM,GAAGhC,GAAKT,QAAc;AAChD,UAAI,CAACpC,EAAU6E,CAAI;AACjB;AAGF,YAAM,EAAE,SAAAqC,GAAS,OAAAzB,GAAO,SAAAlB,EAAO,IAAKkE,EAAS,SAAS5D,CAAI;AAE1D,MAAIqC,KACFoB,EAAQ,KAAK;AAAA,QACX,MAAMzD;AAAA,QACN,KAAAhC;AAAA,QACA,SAAS,CAAC,EAAE,OAAA4C,GAAO,OAAOZ,GAAM,MAAAzC,GAAM,SAAAmC,EAAO,CAAE;AAAA,MACzD,CAAS;AAAA,IAEL,CAAC,GAEM+D;AAAA,EACT;AAAA,EAEA,eAAeD,GAAO;AAEpB,UAAMwC,IAAajB,GAAMvB,GAAO,KAAK,OAAO,GAEtCyC,IAAW,CAACtO,GAAMwG,GAAMH,MAAQ;AACpC,UAAI,CAACrG,EAAK,UAAU;AAClB,cAAM,EAAE,OAAAqE,GAAO,UAAA4H,EAAQ,IAAKjM,GAEtB8K,IAAU,KAAK,aAAa;AAAA,UAChC,KAAK,KAAK,UAAU,IAAIzG,CAAK;AAAA,UAC7B,OAAO,KAAK,SAAS,uBAAuBmC,GAAMnC,CAAK;AAAA,UACvD,UAAA4H;AAAA,QACV,CAAS;AAED,eAAInB,KAAWA,EAAQ,SACd;AAAA,UACL;AAAA,YACE,KAAAzE;AAAA,YACA,MAAAG;AAAA,YACA,SAAAsE;AAAA,UACd;AAAA,QACA,IAGe,CAAA;AAAA,MACT;AAEA,YAAMyD,IAAM,CAAA;AACZ,eAASrJ,IAAI,GAAGC,IAAMnF,EAAK,SAAS,QAAQkF,IAAIC,GAAKD,KAAK,GAAG;AAC3D,cAAMsJ,IAAQxO,EAAK,SAASkF,CAAC,GACvBjC,IAASqL,EAASE,GAAOhI,GAAMH,CAAG;AACxC,YAAIpD,EAAO;AACT,UAAAsL,EAAI,KAAK,GAAGtL,CAAM;AAAA,iBACTjD,EAAK,aAAa8M,GAAgB;AAC3C,iBAAO,CAAA;AAAA,MAEX;AACA,aAAOyB;AAAA,IACT,GAEMnI,IAAU,KAAK,SAAS,SACxBqI,IAAY,CAAA,GACZ3C,IAAU,CAAA;AAEhB,WAAA1F,EAAQ,QAAQ,CAAC,EAAE,GAAGI,GAAM,GAAGH,QAAU;AACvC,UAAI7C,EAAUgD,CAAI,GAAG;AACnB,YAAIkI,IAAaJ,EAASD,GAAY7H,GAAMH,CAAG;AAE/C,QAAIqI,EAAW,WAERD,EAAUpI,CAAG,MAChBoI,EAAUpI,CAAG,IAAI,EAAE,KAAAA,GAAK,MAAAG,GAAM,SAAS,GAAE,GACzCsF,EAAQ,KAAK2C,EAAUpI,CAAG,CAAC,IAE7BqI,EAAW,QAAQ,CAAC,EAAE,SAAA5D,QAAc;AAClC,UAAA2D,EAAUpI,CAAG,EAAE,QAAQ,KAAK,GAAGyE,CAAO;AAAA,QACxC,CAAC;AAAA,MAEL;AAAA,IACF,CAAC,GAEMgB;AAAA,EACT;AAAA,EAEA,kBAAkBD,GAAO;AACvB,UAAMI,IAAWW,GAAef,GAAO,KAAK,OAAO,GAC7C,EAAE,MAAAhM,GAAM,SAAAuG,EAAO,IAAK,KAAK,UACzB0F,IAAU,CAAA;AAGhB,WAAA1F,EAAQ,QAAQ,CAAC,EAAE,GAAGI,GAAM,GAAGH,QAAU;AACvC,UAAI,CAAC7C,EAAUgD,CAAI;AACjB;AAGF,UAAIsE,IAAU,CAAA;AAGd,MAAAjL,EAAK,QAAQ,CAAClD,GAAK+J,MAAa;AAC9B,QAAAoE,EAAQ;AAAA,UACN,GAAG,KAAK,aAAa;AAAA,YACnB,KAAAnO;AAAA,YACA,OAAO6J,EAAKE,CAAQ;AAAA,YACpB,UAAAuF;AAAA,UACZ,CAAW;AAAA,QACX;AAAA,MACM,CAAC,GAEGnB,EAAQ,UACVgB,EAAQ,KAAK;AAAA,QACX,KAAAzF;AAAA,QACA,MAAAG;AAAA,QACA,SAAAsE;AAAA,MACV,CAAS;AAAA,IAEL,CAAC,GAEMgB;AAAA,EACT;AAAA,EACA,aAAa,EAAE,KAAAnP,GAAK,OAAAkB,GAAO,UAAAoO,EAAQ,GAAI;AACrC,QAAI,CAACzI,EAAU3F,CAAK;AAClB,aAAO,CAAA;AAGT,QAAIiN,IAAU,CAAA;AAEd,QAAIhI,EAAQjF,CAAK;AACf,MAAAA,EAAM,QAAQ,CAAC,EAAE,GAAGwK,GAAM,GAAGhC,GAAKT,QAAc;AAC9C,YAAI,CAACpC,EAAU6E,CAAI;AACjB;AAGF,cAAM,EAAE,SAAAqC,GAAS,OAAAzB,GAAO,SAAAlB,EAAO,IAAKkE,EAAS,SAAS5D,CAAI;AAE1D,QAAIqC,KACFI,EAAQ,KAAK;AAAA,UACX,OAAA7B;AAAA,UACA,KAAAtM;AAAA,UACA,OAAO0L;AAAA,UACP,KAAAhC;AAAA,UACA,MAAAT;AAAA,UACA,SAAAmC;AAAA,QACZ,CAAW;AAAA,MAEL,CAAC;AAAA,SACI;AACL,YAAM,EAAE,GAAGM,GAAM,GAAGzC,EAAI,IAAK/H,GAEvB,EAAE,SAAA6M,GAAS,OAAAzB,GAAO,SAAAlB,EAAO,IAAKkE,EAAS,SAAS5D,CAAI;AAE1D,MAAIqC,KACFI,EAAQ,KAAK,EAAE,OAAA7B,GAAO,KAAAtM,GAAK,OAAO0L,GAAM,MAAAzC,GAAM,SAAAmC,GAAS;AAAA,IAE3D;AAEA,WAAO+C;AAAA,EACT;AACF;AAEAkD,EAAK,UAAU;AACfA,EAAK,cAAcjH;AACnBiH,EAAK,aAAa/G;AAClB+G,EAAK,SAAStI;AAGZsI,EAAK,aAAaZ;AAIlBV,GAASN,EAAc;;;;ACzvDzB,SAASuC,GAAgBC,GAAuB;AAC9C,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAOA;AAAA,EAAA;AAEb;AAGA,SAASC,GAAe1K,GAAUG,GAAmB;AACnD,SAAOA,EAAK,MAAM,GAAG,EAAE,OAAO,CAACwK,GAAKnS,MAAQmS,KAAOA,EAAInS,CAAG,GAAGwH,CAAG;AAClE;AAEO,SAAS4K,GACdH,GACAI,GACa;AACb,MAAIT,IAAmB,CAAA;AAGvB,SAFaM,GAAeI,IAAY,QAAQ,EAE3C,QAAQ,CAACC,MAAqB;;AACjC,UAAMC,MACJC,IAAAF,EAAM,WAAN,gBAAAE,EAAc,OAAO,CAACC,MAAiBA,EAAE,UAAUT,EAAM,YAAA,OACzD,CAAA;AACF,IACEO,EAAe,SAAS,KACxBD,EAAM,aAAaF,EAAS,iBAE5BT,EAAI,KAAK;AAAA,MACP,GAAGW;AAAA,MACH,QAAQC;AAAA,IAAA,CACT;AAAA,EAEL,CAAC,GACMZ;AACT;AAMO,SAASe,GAAeJ,GAA2B;AACxD,QAAM,EAAE,UAAAF,GAAU,WAAAO,GAAW,YAAAC,GAAY,aAAAC,MAAgBP,GACnD,EAAE,OAAAN,GAAO,qBAAAc,GAAqB,eAAAC,GAAe,KAAAC,MAAQV,EAAM,OAAO,CAAC;AAEzE,SAAO;AAAA,IACL,UAAUW,EAAWb,CAAQ;AAAA,IAC7B,WAAWa,EAAWN,CAAS;AAAA,IAC/B,YAAYM,EAAWL,CAAU;AAAA,IACjC,aAAaK,EAAWJ,CAAW;AAAA,IACnC,OAAOd,GAAgBC,CAAK;AAAA,IAC5B,qBAAAc;AAAA,IACA,eAAAC;AAAA,IACA,KAAAC;AAAA,EAAA;AAEJ;AAuBO,SAASE,GAAa;AAAA,EAC3B,eAAAC;AAAA,EACA,OAAAlE;AAAA,EACA,cAAAmE;AAAA,EACA,WAAAxH,IAAY;AACd,GAA+C;AAC7C,QAAMtB,IAAO2H,GAAeI,IAAYc,CAAmB;AAQ3D,SANa,IAAI/B,EAAK9G,GAAM;AAAA,IAC1B,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAAsB;AAAA,IACA,MAAMwH;AAAA,EAAA,CACP,EACW,OAAOnE,CAAK;AAC1B;ACvGO,MAAMoE,KAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEaC,KAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEaC,KAAOD,GAAc;AAAA,EAAQ,CAAClB,MACzCiB,GAAW;AAAA,IAAQ,CAACrB,MAClBG;AAAA,MACEH,EAAM,YAAA;AAAA,MACNI,EAAS,YAAA;AAAA,IAAY,EACrB,IAAI,CAACoB,OAEE;AAAA,MACL,GAFWd,GAAec,CAAC;AAAA,MAG3B,OAAAxB;AAAA,MACA,UAAAI;AAAA,IAAA,EAEH;AAAA,EAAA;AAEL,GAGaqB,IAAU,IAAI;AAAA,EACzBF,GAAK,IAAI,CAACC,MAAM,CAACA,EAAE,qBAAqBA,CAAC,CAAC;AAC5C;AC9CO,SAASE,GACdC,GACAC,GACAH,GAC2C;AAC3C,QAAMI,wBAAe,IAAA,GACfC,wBAAkB,IAAA,GAIlBC,wBAAqB,IAAA;AAI3B,MAAItK,IAAM;AAQV,SANqBkK,EAAY,OAAkB,CAACzB,GAAKvK,MAAO;AAC9D,UAAMqM,IAAMP,EAAQ,IAAI9L,CAAE;AAC1B,WAAIqM,KAAK9B,EAAI,KAAK8B,CAAG,GACd9B;AAAA,EACT,GAAG,CAAA,CAAE,EAEQ,QAAQ,CAAC8B,MAAQ;AAC5B,QAAIC,IAAYJ,EAAS,IAAIG,EAAI,KAAK;AACtC,IAAKC,MACHA,IAAY;AAAA,MACV,IAAID,EAAI;AAAA,MACR,aAAa;AAAA,MACb,OAAOA,EAAI;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAA;AAAA,MACV,kBAAkB,CAAA;AAAA,IAAC,GAErBH,EAAS,IAAIG,EAAI,OAAOC,CAAS,GACjCL,EAAK,SAAU,KAAKK,CAAS;AAG/B,QAAIC,IAAeJ,EAAY,IAAIE,EAAI,WAAWA,EAAI,KAAK;AAC3D,IAAKE,MACHA,IAAe;AAAA,MACb,IAAIF,EAAI,WAAW,MAAMvK;AAAA,MACzB,aAAa;AAAA,MACb,OAAOuK,EAAI;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAA;AAAA,MACV,kBAAkB,CAAA;AAAA,IAAC,GAErBC,EAAU,SAAU,KAAKC,CAAY,GACrCJ,EAAY,IAAIE,EAAI,WAAWA,EAAI,OAAOE,CAAY;AAGxD,UAAMC,IAA2D;AAAA,MAC/D,IAAIH,EAAI,cAAc,MAAMvK;AAAA,MAC5B,aAAa;AAAA,MACb,OAAOuK,EAAI;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAA;AAAA,MACV,kBAAkB,CAAA;AAAA,IAAC;AAErB,IAAAE,EAAa,SAAU,KAAKC,CAAe;AAE3C,QAAIC,IAAUL,EAAe,IAAIC,EAAI,cAAcA,EAAI,mBAAmB;AAC1E,IAAKI,MACHA,IAAU;AAAA,MACR,IAAIJ,EAAI;AAAA,MACR,aAAa;AAAA,MACb,OAAOA,EAAI;AAAA,MACX,MAAMA,EAAI;AAAA,MACV,UAAU,CAAA;AAAA,IAAC,GAEbD,EAAe,IAAIC,EAAI,cAAcA,EAAI,OAAOI,CAAO,GACvDD,EAAgB,SAAU,KAAKC,CAAO,IAExCH,EAAU,iBAAkB,KAAKD,EAAI,mBAAmB,GACxDE,EAAa,iBAAkB,KAAKF,EAAI,mBAAmB,GAC3DG,EAAgB,iBAAkB,KAAKH,EAAI,mBAAmB,GAC9DJ,EAAK,WAAY,KAAKI,CAAG;AAAA,EAC3B,CAAC,GAEDJ,EAAK,SAAU,KAAK,CAAClL,GAAGC,MACf0K,GAAW,QAAQ3K,EAAE,EAAE,IAAI2K,GAAW,QAAQ1K,EAAE,EAAE,CAC1D,GACM,CAACiL,CAAI;AACd;AASO,SAASS,GACdV,GACAC,GACAH,GAC2C;AAC3C,QAAMK,wBAAkB,IAAA,GAIlBQ,wBAAqB,IAAA,GAIrBP,wBAAqB,IAAA;AAW3B,SANqBJ,EAAY,OAAkB,CAACzB,GAAKvK,MAAO;AAC9D,UAAMqM,IAAMP,EAAQ,IAAI9L,CAAE;AAC1B,WAAIqM,KAAK9B,EAAI,KAAK8B,CAAG,GACd9B;AAAA,EACT,GAAG,CAAA,CAAE,EAEQ,QAAQ,CAAC8B,MAAQ;AAC5B,QAAI,CAACA;AACH;AAEF,QAAIE,IAAeJ,EAAY,IAAIE,EAAI,QAAQ;AAC/C,IAAKE,MACHA,IAAe;AAAA,MACb,IAAIF,EAAI;AAAA,MACR,OAAOA,EAAI;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAA;AAAA,MACV,kBAAkB,CAAA;AAAA,IAAC,GAErBF,EAAY,IAAIE,EAAI,UAAUE,CAAY,GAC1CN,EAAK,SAAU,KAAKM,CAAY;AAGlC,QAAIC,IAAkBG,EAAe,IAAIN,EAAI,WAAW;AACxD,IAAKG,MACHA,IAAkB;AAAA,MAChB,IAAIH,EAAI;AAAA,MACR,OAAOA,EAAI;AAAA,MACX,MAAM;AAAA,MACN,UAAU,CAAA;AAAA,MACV,kBAAkB,CAAA;AAAA,IAAC,GAErBE,EAAa,SAAU,KAAKC,CAAe,GAC3CG,EAAe,IAAIN,EAAI,aAAaG,CAAe;AAGrD,QAAIC,IAAUL,EAAe,IAAIC,EAAI,cAAcA,EAAI,KAAK;AAC5D,IAAKI,MACHA,IAAU;AAAA,MACR,IAAIJ,EAAI;AAAA,MACR,OAAOA,EAAI;AAAA,MACX,MAAMA,EAAI;AAAA,MACV,UAAU,CAAA;AAAA,IAAC,GAEbD,EAAe,IAAIC,EAAI,cAAcA,EAAI,OAAOI,CAAO,GACvDD,EAAgB,SAAU,KAAKC,CAAO,IAExCF,EAAa,iBAAkB,KAAKF,EAAI,mBAAmB,GAC3DG,EAAgB,iBAAkB,KAAKH,EAAI,mBAAmB,GAC9DJ,EAAK,WAAY,KAAKI,CAAG;AAAA,EAC3B,CAAC,GAEDJ,EAAK,SAAU,KAAK,CAAClL,GAAGC,MACf2K,GAAc,QAAQ5K,EAAE,EAAE,IAAI4K,GAAc,QAAQ3K,EAAE,EAAE,CAChE,GACM,CAACiL,CAAI;AACd;AAuBO,SAASW,GAAgB;AAAA,EAC9B,WAAAC;AAAA,EACA,OAAAvF;AAAA,EACA,cAAAmE;AAAA,EACA,WAAAxH;AAAA,EACA,OAAA0F,IAAQ;AACV,GAA6C;AAC3C,QAAMhH,IAAOkK,EAAW,CAAC,EAAE,cAAc,CAAA;AAOzC,SANa,IAAIpD,EAAK9G,GAAM;AAAA,IAC1B,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAAsB;AAAA,IACA,MAAMwH;AAAA,EAAA,CACP,EACW,OAAOnE,GAAO,EAAE,OAAAqC,GAAc;AAC5C;AAOO,SAASmD,GAAU7U,GAAc;AAStC,QAAM8U,IARsC;AAAA,IAC1C,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,EAAA,EAEe9U,CAAI;AAC3B,SACEoF,gBAAAA,EAAAA;AAAAA,IAAC2P;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,SAASD;AAAA,MAAA;AAAA,IACX;AAAA,EAAA;AAGN;AAGA,MAAME,KAAeC,GAAO,IAAI,EAAE,CAAC,EAAE,OAAAC,SAAa;AAAA,EAChD,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAOA,EAAM,QAAQ,KAAK,GAAG;AAAA,EAC7B,GAAGA,EAAM,YAAY,SAAS;AAAA,IAC5B,OAAOA,EAAM,QAAQ,KAAK,GAAG;AAAA;AAAA,EAAA,CAC9B;AACH,EAAE,GAEIC,KAAoBF,GAAO9P,EAAU,EAAE;AAAA,EAC3C,OAAO;AAAA,EACP,YAAY;AACd,CAAC;AAED,SAASiQ,GAAY,EAAE,MAAMC,GAAM,UAAAnS,GAAU,aAAAoS,GAAa,GAAGC,KAA2B;AACtF,QAAMC,IAAUF,IAAc,cAAc,SACtCG,IAAaH,IAAc,SAAS;AAC1C,SACEpQ,gBAAAA,EAAAA;AAAAA,IAACwQ;AAAA,IAAA;AAAA,MACE,GAAGH;AAAA,MACJ,IAAI;AAAA,QACF,SAAS;AAAA,QACT,YAAY;AAAA,MAAA;AAAA,MAGb,UAAA;AAAA,QAAAF,KAAQ1R,EAAM,eAAe0R,CAAI,0BAC/BN,GAAA,EAAI,WAAU,aAAY,IAAI,EAAE,IAAI,EAAA,GAClC,aACH,IAEA3P,gBAAAA,EAAAA;AAAAA,UAAC2P;AAAA,UAAA;AAAA,YACC,WAAWM;AAAA,YACX,WAAU;AAAA,YACV,OAAM;AAAA,YACN,IAAI,EAAE,IAAI,GAAG,UAAU,SAAA;AAAA,UAAS;AAAA,QAAA;AAAA,+BAGnCM,IAAA,EAAM,WAAU,OAAM,SAAS,GAAG,YAAW,UAC1C,UAAA;AAAA,UAAAL,KAAeT,GAAUU,EAAM,EAAE;AAAA,UACnCnQ,gBAAAA,EAAAA,IAAC+P,IAAA,EAAkB,YAAAM,GAAwB,SAAAD,GAAmB,UAAAtS,EAAA,CAAS;AAAA,QAAA,EAAA,CACzE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,MAAM0S,KAAkBX,GAAO,KAAK,EAAE,CAAC,EAAE,OAAAC,SAAa;AAAA,EACpD,SAASA,EAAM,QAAQ,GAAG;AAAA,EAC1B,cAAcA,EAAM,QAAQ,CAAC;AAAA,EAC7B,aAAa,QAAQA,EAAM,QAAQ,CAAC,CAAC;AAAA,EACrC,OAAO;AAAA,EACP,WAAW;AAAA;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAKA,EAAM,QAAQ,CAAC;AAAA,EACpB,QAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,eAAe;AAAA,EACf,cAAcA,EAAM,QAAQ,GAAG;AAAA,EAC/B,cAAcA,EAAM,QAAQ,GAAG;AAAA,EAC/B,WAAWA,EAAM,QAAQ,GAAG;AAAA,EAC5B,YAAY;AAAA,EACX,qCAAsC;AAAA,IACrC,iBAAiBA,EAAM,QAAQ,QAAQ;AAAA,IACvC,OAAOA,EAAM,QAAQ,QAAQ;AAAA,IAC7B,GAAGA,EAAM,YAAY,SAAS;AAAA,MAC5B,iBAAiBA,EAAM,QAAQ,QAAQ;AAAA,IAAA,CACxC;AAAA,EAAA;AAAA,EAEH,gDAAgD;AAAA,IAC9C,iBAAiBW,GAAMX,EAAM,QAAQ,QAAQ,MAAM,GAAG;AAAA,IACtD,OAAO;AAAA,IACP,GAAGA,EAAM,YAAY,SAAS;AAAA,MAC5B,OAAOA,EAAM,QAAQ,QAAQ;AAAA,IAAA,CAC9B;AAAA,EAAA;AAEL,EAAE,GAEIY,KAA0B,CAACC,MAAqB;AACpD,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAOC;AAAA,IACT,KAAK;AACH,aAAOC;AAAA,IACT;AACE,aAAOpB,GAAUkB,CAAQ;AAAA,EAAA;AAE/B,GAEaG,KAAiBvS,EAAM,WAAW,SAC7CvB,GACA+T,GACA;AACA,QAAM,EAAE,IAAApO,GAAI,QAAAqO,GAAQ,OAAA9R,GAAO,UAAA+R,GAAU,UAAAnT,GAAU,UAAAoT,GAAU,GAAGf,EAAA,IAAUnT,GAEhE;AAAA,IACJ,yBAAAmU;AAAA,IACA,cAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,yBAAAC;AAAA,IACA,QAAAC;AAAA,EAAA,IACEC,GAAY,EAAE,IAAAhP,GAAI,QAAAqO,GAAQ,UAAAlT,GAAU,OAAAoB,GAAO,UAAA+R,GAAU,SAASF,GAAK,GAEjEnM,IAAOgN,GAAwCZ,CAAM,GACrDa,IAAOnB,GAAwB9L,EAAK,IAAI,GAExCkN,IAAwB,CAACrE,MAAwB;AACrD,IAAAA,EAAE,gBAAA,GACFyD,KAAA,QAAAA,EAAWtM;AAAA,EACb;AAEA,SACE5E,gBAAAA,EAAAA,IAAC+R,IAAA,EAAkB,GAAGZ,EAAA,GACpB,iCAACvB,IAAA,EAAc,GAAGwB,EAAajB,CAAK,GAClC,UAAA;AAAA,IAAArQ,gBAAAA,EAAAA,KAAC0Q,IAAA,EAAiB,GAAGa,EAAA,GACnB,UAAA;AAAA,MAAArR,gBAAAA,EAAAA,IAACgS,MAAuB,GAAGV,KACzB,UAAAtR,gBAAAA,EAAAA,IAACiS,IAAA,EAAa,QAAAP,GAAgB,GAChC;AAAA,MACA1R,gBAAAA,EAAAA,IAACkS,IAAA,EAAkB,GAAGX,EAAA,EAAiB,CAAG;AAAA,MAC1CvR,gBAAAA,EAAAA;AAAAA,QAACgQ;AAAA,QAAA;AAAA,UACE,GAAGwB,EAAc;AAAA,YAChB,MACE5M,EAAK,SAAS,eACZ5E,gBAAAA,EAAAA;AAAAA,cAAC2P;AAAA,cAAA;AAAA,gBACC,SAASmC;AAAA,gBACT,IAAI;AAAA,kBACF,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,cAAc;AAAA,kBACd,QAAQ;AAAA,kBACR,IAAI;AAAA,kBACJ,WAAW;AAAA,oBACT,iBAAiB;AAAA,kBAAA;AAAA,gBACnB;AAAA,gBAGF,UAAA9R,gBAAAA,EAAAA,IAAC6Q,IAAA,EAAiC,UAAS,QAAA,CAAQ;AAAA,cAAA;AAAA,YAAA,IAGrDgB;AAAA,YAEJ,aAAaH,EAAO,cAAcA,EAAO,UAAU,SAAA;AAAA,YACnD,aAAa9M,EAAK;AAAA,YAClB,IAAIA,EAAK;AAAA,UAAA,CACV;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,GACF;AAAA,IACC9G,KAAYkC,gBAAAA,EAAAA,IAACmS,IAAA,EAAU,GAAGV,IAAwB,CAAG;AAAA,EAAA,EAAA,CACxD,EAAA,CACF;AAEJ,CAAC,GCraKW,KAAsC;AAAA,EAC1C,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,gBAAgB,CAACnW,MAAUA,KAASgS,EAAWhS,CAAK;AAAA,EACpD,UAAU;AACZ,GAEMoW,KAAgD;AAAA,EAClD,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,cAAc/D;AAAA,EACd,YAAY,CAACgE,MAAW;AACtB,QAAIA,EAAO,QAAQ,SAAS,SAAS;AACnC,UAAIA,EAAO,UAAU;AACnB,eAAO;AAET,YAAMC,IAAMD,EAAO;AACnB,aACEtS,gBAAAA,EAAAA,IAAC,OAAA,EAAI,UAAAA,gBAAAA,EAAAA,IAAC,KAAA,EAAG,aAAI,GAAI;AAAA,IAErB;AAAA,EACF;AACJ,GAEMwS,KAA8C;AAAA,EAChD,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,cAAcnE;AAAA,EACd,YAAY,CAACiE,MAAW;AACpB,QAAIA,EAAO,QAAQ,SAAS,SAAS;AACjC,UAAIA,EAAO,UAAU;AACjB,eAAO;AAEX,YAAMC,IAAMD,EAAO;AACnB,oCACC/B,IAAA,EAAM,WAAU,OAAM,SAAS,GAAG,YAAW,UACzC,UAAA;AAAA,QAAAd,GAAU8C,CAAG;AAAA,QACdvS,gBAAAA,MAAC,OAAA,EAAI,UAAAA,gBAAAA,EAAAA,IAAC,KAAA,EAAG,aAAI,EAAA,CAAI;AAAA,MAAA,GACrB;AAAA,IAEJ;AAAA,EACJ;AACJ,GAEMyS,KAA0C;AAAA,EAC5C,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,cAAcnE;AAAA,EACd,YAAY,CAACgE,MAAW;AACpB,QAAIA,EAAO,QAAQ,SAAS,SAAS;AACjC,UAAIA,EAAO,UAAU;AACrB,eAAO;AAEP,YAAMC,IAAMD,EAAO;AACnB,aACAtS,gBAAAA,EAAAA,IAAC,OAAA,EAAI,UAAAA,gBAAAA,EAAAA,IAAC,KAAA,EAAG,aAAI,GAAI;AAAA,IAErB;AAAA,EACJ;AACJ,GAEM0S,KAAuC;AAAA,EACzC,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,cAAcrE;AAAA,EACd,YAAY,CAACiE,MAAW;AACpB,QAAIA,EAAO,QAAQ,SAAS,SAAS;AACjC,UAAIA,EAAO,UAAU;AACjB,eAAO;AAEX,YAAMC,IAAMD,EAAO;AACnB,oCACC/B,IAAA,EAAM,WAAU,OAAM,SAAS,GAAG,YAAW,UACzC,UAAA;AAAA,QAAAd,GAAU8C,CAAG;AAAA,QACdvS,gBAAAA,EAAAA,IAAC,SAAK,UAAAuS,EAAA,CAAI;AAAA,MAAA,GACd;AAAA,IAEJ;AAAA,EACJ;AACJ,GAEMI,KAAqC;AAAA,EACvC,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,cAAc,CAAC,UAAU,gBAAgB,aAAa,iCAAiC,UAAU;AAAA,EACjG,gBAAgB,CAAC1W,MAAUA,KAASgS,EAAWhS,CAAK;AACxD,GAEM2W,KAAoC;AAAA,EACtC,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,cAAc,CAAC,SAAS,WAAW;AAAA,EACnC,gBAAgB,CAAC3W,MAAUA,KAASgS,EAAWhS,CAAK;AACxD,GAEM4W,KAAqC;AAAA,EACvC,OAAO;AAAA,EACP,YAAY;AAChB,GAEMC,KAA+B;AAAA,EACjC,OAAO;AAAA,EACP,YAAY;AAChB,GAEaC,KAA8C;AAAA,EACvDX;AAAA,EACAC;AAAA,EACAM;AAAA,EACAC;AAAA,EACAJ;AAAA,EACAK;AAAA,EACAC;AACJ,GAEaE,KAAwC;AAAA,EACjDZ;AAAA,EACAO;AAAA,EACAC;AAAA,EACAH;AAAA,EACAC;AAAA,EACAG;AAAA,EACAC;AACJ,GCtHMG,KAAuC;AAAA,EAC3C,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,gBAAgB;AAClB;AAGO,SAASC,GAAgBlW,GAAsB;AACpD,QAAM;AAAA,IACJ,OAAAkC;AAAA,IACA,cAAAE;AAAA,IACA,kBAAAD;AAAA,IACA,aAAAE;AAAA,IACA,cAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,aAAA4T;AAAA,IACA,iBAAAC;AAAA,IACA,MAAA7E;AAAA,IACA,gBAAA8E;AAAA,EAAA,IACErW,GAEEsW,IAAuBC,GAAQ,MAAM;AACzC,UAAMC,IAAqB;AAAA,MACzB,OAAAtU;AAAA,MACA,kBAAAC;AAAA,MACA,cAAAC;AAAA,MACA,aAAAC;AAAA,MACA,cAAAC;AAAA,MACA,kBAAAC;AAAA,IAAA;AAEF,WAAO,CAACvC,MAAoDgD,gBAAAA,MAACf,MAAe,GAAGjC,GAAQ,GAAGwW,GAAoB;AAAA,EAChH,GAAG,CAACtU,GAAOE,GAAcC,CAAW,CAAC,GAE/BoU,IAASC,GAAA,GACTC,IAAgBR,IAAc,CAAC,SAAS,UAAU,IAAI,CAAC,YAAY,OAAO,GAC1ES,IAAcT,IAAcJ,KAAuBC,IAGnDa,IAAgB,CAAC,EAAE,SAAAC,QAChBA,EAAQ,OAAO,CAACC,MAAWA,EAAO,SAAS,QAAQ,EAAE,IAAI,CAACA,MAAWA,EAAO,KAAK,GAGpFC,IAAsB,CAACF,MACpBA,EAAQ,OAAO,CAACC,MAAWA,EAAO,SAAS,QAAQ,EAAE,IAAI,CAACA,MAAWA,EAAO,KAAK,GAGpFE,IAAmB,MAAM;;AAE7B,KAAKzG,IAAAiG,EAAO,YAAP,QAAAjG,EAAgB,mBACrBiG,EAAO,QAAQ,gBAAgBR,EAAe;AAAA,EAChD;AAIA,SAAAiB,GAAU,MAAM;AACd,IAAAD,EAAA;AAAA,EACF,GAAG,CAAC1F,GAAMyE,IAAgBD,IAAsBkB,CAAgB,CAAC,GAG/DjU,gBAAAA,MAACmU,MAAM,IAAI,EAAE,OAAO,OAAA,GAClB,UAAAnU,gBAAAA,EAAAA,IAAC2P,GAAA,EAAI,IAAI;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,EAAA,GAEV,UAAA3P,gBAAAA,EAAAA;AAAAA,IAACoU;AAAA,IAAA;AAAA,MACC,QAAAX;AAAA,MACA,MAAAlF;AAAA,MACA,SAASqF;AAAA,MACT,UAAU,CAAC5E,MAAQA,EAAI;AAAA,MACvB,iBAAAiE;AAAA,MACA,kBAAkBU;AAAA,MAClB,gBAAgB,EAAE,WAAW,eAAe,SAAS,OAAA;AAAA,MACrD,uBAAuB,EAAE,aAAa,GAAA;AAAA,MACtC,2BAA2BP;AAAA,MAC3B,yBAAyB,EAAE,aAAa,GAAA;AAAA,MACxC,mBAAmB,EAAE,MAAM,WAAW,KAAK,IAAI,IAAIC,EAAe,KAAA,CAAM,EAAA;AAAA,MACxE,OAAO;AAAA,QACL,SAASC;AAAA,MAAA;AAAA,MAEX,WAAW;AAAA,QACT,aAAa;AAAA,UACX,iBAAiB;AAAA,YACf,eAAAO;AAAA,UAAA;AAAA,QACF;AAAA,QAEF,mBAAmB;AAAA,UACjB,qBAAAG;AAAA,QAAA;AAAA,MACF;AAAA,MAEF,6BAA2B;AAAA,MAC3B,aAAW;AAAA,MACX,oBAAkB;AAAA,MAClB,iCAA+B;AAAA,MAC/B,iBAAe;AAAA,MACf,mBAAiB;AAAA,MACjB,iBAAe;AAAA,MACf,YAAU;AAAA,MACV,4BAA0B;AAAA,IAAA;AAAA,EAAA,GAE9B,EAAA,CACF;AAEJ;AC3GO,SAASK,GAAgB;AAAA,EAC9B,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,gBAAAC;AACF,GAAyB;AACvB,QAAMC,IAAYJ,EAAM,CAACK,MAAMA,EAAE,SAAS,GAEpCC,IAAuB,CAC3BhQ,MACG;AACH,UAAMiQ,IAAajQ,EAAK;AACxB,QAAIiQ,KAAcA,EAAW,QAAQ;AACnC,YAAMC,IAAc,IAAI,IAAID,CAAU;AAGtC,MAAAA,EAAW,QAAQ,CAAClS,MAAO;AACzB,cAAMqM,IAAMP,EAAQ,IAAI9L,CAAE;AAC1B,QAAIqM,MAEF8F,EAAY,IAAI,+BAA+B9F,EAAI,QAAQ,EAAE,GAC7D8F,EAAY;AAAA,UACV,+BAA+B9F,EAAI,QAAQ,UAAUA,EAAI,KAAK;AAAA,QAAA,GAEhE8F,EAAY,IAAI,4BAA4B9F,EAAI,KAAK,EAAE,GACvD8F,EAAY;AAAA,UACV,4BAA4B9F,EAAI,KAAK,aAAaA,EAAI,QAAQ;AAAA,QAAA;AAAA,MAGpE,CAAC,GACD0F,EAAUI,CAAW;AAAA,IACvB;AAAA,EACF;AAEA,SACEhV,gBAAAA,EAAAA;AAAAA,IAACqU;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,WAAW;AAAA,QACX,cAAc;AAAA,QACd,SAAS;AAAA,QACT,eAAe;AAAA,MAAA;AAAA,MAGjB,UAAA;AAAA,QAAArU,gBAAAA,EAAAA;AAAAA,UAAC6P;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,IAAI;AAAA,cACJ,iBAAiB;AAAA,cACjB,YAAY;AAAA,YAAA;AAAA,YAGd,UAAA;AAAA,cAAA3P,gBAAAA,EAAAA;AAAAA,gBAAC+U;AAAA,gBAAA;AAAA,kBACC,IAAI;AAAA,oBACF,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,SAAS;AAAA,oBACT,OAAO;AAAA,kBAAA;AAAA,kBAGR,UAAAP,EAAa;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEhB1U,gBAAAA,EAAAA,KAACC,IAAA,EAAW,YAAW,QAAO,UAAA;AAAA,gBAAA;AAAA,gBAE3B0U,KACC3U,gBAAAA,EAAAA,KAACC,IAAA,EAAW,WAAU,QAAO,OAAM,kBAAiB,IAAI,EAAE,IAAI,EAAA,GAAK,UAAA;AAAA,kBAAA;AAAA,kBAC/DwU,EAAM,CAAC,EAAE,WAAY;AAAA,kBAAO;AAAA,gBAAA,EAAA,CAChC;AAAA,cAAA,EAAA,CAEJ;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAEFvU,gBAAAA,EAAAA;AAAAA,UAAC2P;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,MAAM;AAAA,cACN,UAAU;AAAA,YAAA;AAAA,YAGZ,UAAA3P,gBAAAA,EAAAA;AAAAA,cAACgV;AAAA,cAAA;AAAA,gBACC,OAAAT;AAAA,gBACA,sBAAsB,CAAC,GAAG;AAAA,gBAC1B,OAAO,EAAE,MAAMzD,GAAA;AAAA,gBACf,WAAW;AAAA,kBACT,MAAM;AAAA,oBACJ,UAAU8D;AAAA,kBAAA;AAAA,gBACZ;AAAA,gBAEF,IAAI;AAAA,kBACF,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,QAAQ;AAAA,gBAAA;AAAA,gBAEV,yBAAyB;AAAA,cAAA;AAAA,YAAA;AAAA,UAC3B;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;AChFA,SAAwBK,GAAY,EAAE,OAAAX,KAA2B;AAC/D,QAAM,CAACY,GAAiBC,CAAkB,IAAIC,EAAS,EAAK,GACtD,CAACjC,GAAakC,CAAc,IAAID,EAAS,EAAK,GAC9C,CAACE,GAAaC,CAAc,IAAIH,EAAS,EAAE,GAC3C,CAACX,GAAgBe,CAAiB,IAAIJ,EAAS,EAAK,GACpD/B,IAAiBiB,EAAM,CAACK,MAAMA,EAAE,cAAc,GAC9Cc,IAAcnB,EAAM,CAACK,MAAMA,EAAE,WAAW,GACxCe,IAAQpB,EAAM,CAACK,MAAMA,EAAE,KAAK,GAC5BgB,IAAarB,EAAM,CAACK,MAAMA,EAAE,SAAS,GAGrCH,IAAejB;AAAA,IACnB,MAAM,IAAI,IAAIF,EAAe,MAAM;AAAA,IACnC,CAACA,CAAc;AAAA,EAAA,GAGX7D,IAAY+D,GAAQ,MACjBJ,IACHzE;AAAA,IACE,MAAM,KAAK2E,EAAe,MAAM;AAAA,IAChC;AAAA,MACE,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,OAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAU,CAAA;AAAA,MACV,YAAY,CAAA;AAAA,IAAC;AAAA,IAEf5E;AAAA,EAAA,IAEFY;AAAA,IACE,MAAM,KAAKgE,EAAe,MAAM;AAAA,IAChC;AAAA,MACE,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,OAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAU,CAAA;AAAA,MACV,YAAY,CAAA;AAAA,IAAC;AAAA,IAEf5E;AAAA,EAAA,GAEL,CAAC4E,GAAgBF,CAAW,CAAC,GAE1B,CAACyC,GAAcC,CAAe,IAAIT,EAAS7G,EAAI,GAC/C,CAACuH,GAAmBC,CAAoB,IAAIX,EAAS;AAAA,IACzD;AAAA,MACE,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,OAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAU,CAAA;AAAA,MACV,YAAY,CAAA;AAAA,IAAC;AAAA,EACf,CAC4C;AAE9C,EAAAlB,GAAU,MAAM;AACd,IAAIoB,MAAgB,OAClBS,EAAqBvG,CAAS,GAC9BqG,EAAgBtH,EAAI,GACpBiH,EAAkB,EAAK;AAAA,EAE3B,GAAG,CAAChG,GAAW8F,CAAW,CAAC;AAE3B,QAAMU,IAAe,MAAM;AACzB,IAAAX,EAAe,CAAClC,CAAW;AAAA,EAC7B,GAEM8C,IAAe,CAACxI,MAA2C;AAC/D,IAAA8H,EAAe9H,EAAE,OAAO,KAAK;AAE7B,UAAMyI,IAAyC;AAAA,MAC7C,eAAe;AAAA,MACf,OAAOzI,EAAE,OAAO;AAAA,MAChB,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF,GAGI0I,IAAqC;AAAA,MACzC,WAAA3G;AAAA,MACA,OAAO/B,EAAE,OAAO;AAAA,MAChB,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF,GAEI2I,IAAkBlI,GAAagI,CAAmB,EACrD,IAAI,CAACG,MAAMA,EAAE,IAAI,EACjB,IAAI3I,EAAc,GAGf4I,IAAiBF,EAAgB,IAAI,CAAC5H,MAAMA,EAAE,mBAAmB,GAIjE+H,IAHShH,GAAgB4G,CAAe,EAAE;AAAA,MAC9C,CAAC3H,MAAMA,EAAE,KAAK;AAAA,IAAA,EAEU,OAAO,CAAClL,MAAMgT,EAAe,SAAShT,CAAC,CAAC,GAG5DkT,IAAerD,IACjBzE;AAAA,MACE6H;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU,CAAA;AAAA,QACV,YAAY,CAAA;AAAA,MAAC;AAAA,MAEf9H;AAAA,IAAA,IAEFY;AAAA,MACEkH;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU,CAAA;AAAA,QACV,YAAY,CAAA;AAAA,MAAC;AAAA,MAEf9H;AAAA,IAAA;AAGN,IAAAoH,EAAgBO,CAAe,GAC/BZ,EAAkB,EAAI,GACtBO,EAAqBS,CAAY;AAAA,EACnC,GAEMpD,IAAkB,CAACqD,MAAwC;AAC/D,UAAMC,KACHD,KAAiBA,EAAqB,4BAAY,IAAA,GAG/CE,wBAAgB,IAAA;AAStB,QARAD,EAAO,QAAQ,CAAC/T,MAAe;AAC7B,YAAMqM,IAAMP,EAAQ,IAAI9L,CAAE;AAC1B,MAAIqM,KACF2H,EAAU,IAAIhU,GAAIqM,CAAG;AAAA,IAEzB,CAAC,GAGG2H,EAAU,OAAOhB,GAAY;AAC/B,MAAAR,EAAmB,EAAI;AACvB;AAAA,IACF;AAEA,IAAAM,EAAYkB,CAAS;AAAA,EACvB;AAEA,gCACGhH,GAAA,EAAI,IAAI,EAAE,MAAM,KACf,UAAA;AAAA,IAAA7P,gBAAAA,EAAAA,KAAC6P,GAAA,EAAI,SAAQ,QAAO,gBAAe,iBAAgB,IAAI,EAAE,IAAI,EAAA,GAC3D,UAAA;AAAA,MAAA3P,gBAAAA,EAAAA;AAAAA,QAAC4W;AAAA,QAAA;AAAA,UACC,IAAG;AAAA,UACH,OAAM;AAAA,UACN,SAAQ;AAAA,UACR,UAAUX;AAAA,UACV,IAAI,EAAE,OAAO,QAAA;AAAA,QAAQ;AAAA,MAAA;AAAA,MAEvBjW,gBAAAA,EAAAA;AAAAA,QAAC6W;AAAA,QAAA;AAAA,UACC,IAAI,EAAE,SAAS,QAAQ,gBAAgB,YAAY,IAAI,EAAA;AAAA,UACvD,OAAM;AAAA,UACN,SAAS7W,gBAAAA,EAAAA,IAAC8W,IAAA,EAAO,OAAM,WAAU,UAAUd,GAAc;AAAA,UACzD,OAAM;AAAA,UACN,gBAAe;AAAA,QAAA;AAAA,MAAA;AAAA,IACjB,GACF;AAAA,IACAlW,gBAAAA,EAAAA,KAACyQ,IAAA,EAAM,WAAU,OAAM,SAAS,GAAG,IAAI,EAAE,OAAO,OAAA,GAC9C,UAAA;AAAA,MAAAvQ,gBAAAA,MAAC2P,KAAI,IAAI,EAAE,MAAM,GAAG,UAAU,KAC5B,UAAA3P,gBAAAA,EAAAA;AAAAA,QAACkT;AAAA,QAAA;AAAA,UACC,MAAM0C;AAAA,UACN,OACEnB,IACI,GAAGmB,EAAa,MAAM,oBACtB,GAAGrH,GAAK,MAAM;AAAA,UAEpB,gBAAA8E;AAAA,UACA,iBAAAD;AAAA,UACA,aAAAD;AAAA,QAAA;AAAA,MAAA,GAEJ;AAAA,MACAnT,gBAAAA,MAAC2P,KAAI,IAAI,EAAE,MAAM,GAAG,UAAU,KAC5B,UAAA3P,gBAAAA,EAAAA;AAAAA,QAACqU;AAAA,QAAA;AAAA,UACC,OAAAC;AAAA,UACA,OAAOwB;AAAA,UACP,gBAAAzC;AAAA,UACA,cAAAmB;AAAA,UACA,gBAAAC;AAAA,QAAA;AAAA,MAAA,EACF,CACF;AAAA,IAAA,GACF;AAAA,0BACC9E,GAAA,EAAI,IAAI,EAAE,gBAAgB,cACzB,UAAA3P,gBAAAA,EAAAA;AAAAA,MAAC+W;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,OAAM;AAAA,QACN,SAASrB;AAAA,QACT,IAAI,EAAE,IAAI,GAAG,gBAAgB,WAAA;AAAA,QAC9B,UAAA;AAAA,MAAA;AAAA,IAAA,GAGH;AAAA,IACA5V,gBAAAA,OAACkX,MAAO,MAAM9B,GAAiB,SAAS,MAAMC,EAAmB,EAAK,GACpE,UAAA;AAAA,MAAAnV,gBAAAA,EAAAA,IAACiX,MAAY,UAAA,sBAAA,CAAmB;AAAA,MAChCjX,gBAAAA,EAAAA,IAACkX,IAAA,EACC,UAAApX,gBAAAA,EAAAA,KAACqX,IAAA,EAAkB,UAAA;AAAA,QAAA;AAAA,QACKxB;AAAA,QAAW;AAAA,MAAA,EAAA,CAEnC,EAAA,CACF;AAAA,MACA3V,gBAAAA,EAAAA,IAACoX,IAAA,EACC,UAAApX,gBAAAA,EAAAA,IAAC+W,IAAA,EAAO,SAAS,MAAM5B,EAAmB,EAAK,GAAG,WAAS,IAAC,UAAA,KAAA,CAE5D,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;ACzQA,MAAMkC,KAAkB,CAACC,MAAgB;AACvC,MAAI7W;AACJ,QAAM8W,IAA4B,oBAAI,IAAG,GACnCC,IAAW,CAACC,GAASC,MAAY;AACrC,UAAMC,IAAY,OAAOF,KAAY,aAAaA,EAAQhX,CAAK,IAAIgX;AACnE,QAAI,CAAC,OAAO,GAAGE,GAAWlX,CAAK,GAAG;AAChC,YAAMmX,IAAgBnX;AACtB,MAAAA,IAASiX,MAA4B,OAAOC,KAAc,YAAYA,MAAc,QAAQA,IAAY,OAAO,OAAO,CAAA,GAAIlX,GAAOkX,CAAS,GAC1IJ,EAAU,QAAQ,CAACM,MAAaA,EAASpX,GAAOmX,CAAa,CAAC;AAAA,IAChE;AAAA,EACF,GACME,IAAW,MAAMrX,GAMjBsX,IAAM,EAAE,UAAAP,GAAU,UAAAM,GAAU,iBALV,MAAME,GAKqB,WAJjC,CAACH,OACjBN,EAAU,IAAIM,CAAQ,GACf,MAAMN,EAAU,OAAOM,CAAQ,GAEoB,GACtDG,IAAevX,IAAQ6W,EAAYE,GAAUM,GAAUC,CAAG;AAChE,SAAOA;AACT,GACME,MAAe,CAACX,MAAgBA,IAAcD,GAAgBC,CAAW,IAAID,KClB7Ea,KAAW,CAACC,MAAQA;AAC1B,SAASC,GAASL,GAAKM,IAAWH,IAAU;AAC1C,QAAMI,IAAQ/Z,EAAM;AAAA,IAClBwZ,EAAI;AAAA,IACJxZ,EAAM,YAAY,MAAM8Z,EAASN,EAAI,SAAQ,CAAE,GAAG,CAACA,GAAKM,CAAQ,CAAC;AAAA,IACjE9Z,EAAM,YAAY,MAAM8Z,EAASN,EAAI,iBAAiB,GAAG,CAACA,GAAKM,CAAQ,CAAC;AAAA,EAC5E;AACE9Z,SAAAA,EAAM,cAAc+Z,CAAK,GAClBA;AACT;AACA,MAAMC,KAAa,CAACjB,MAAgB;AAClC,QAAMS,IAAME,GAAYX,CAAW,GAC7BkB,IAAgB,CAACH,MAAaD,GAASL,GAAKM,CAAQ;AAC1D,gBAAO,OAAOG,GAAeT,CAAG,GACzBS;AACT,GACMC,MAAU,CAACnB,MAAgBA,IAAciB,GAAWjB,CAAW,IAAIiB;ACZlE,SAASG,GAAqBC,GAAsC;AACzE,SAAOF,GAAyC,CAACG,GAAK3V,OAAS;AAAA,IAC7D,WAAW;AAAA,IACX,gBAAgB0V,IAAgB,IAAI,IAAIA,CAAa,wBAAQ,IAAA;AAAA,IAC7D,aAAa,MAAM,IAAI,IAAI1V,IAAM,eAAe,MAAM;AAAA,IACtD,aAAa,CAAC4V,MACZD,EAAI,OAAO;AAAA,MACT,gBAAgB,IAAI,IAAIC,CAAM;AAAA,IAAA,EAC9B;AAAA,IACJ,WAAW,CAAChE,MACV+D,EAAI,CAACnY,MAAU;AACb,YAAMiL,IAAO,IAAI,IAAIjL,EAAM,cAAc;AACzC,aAAAoU,EAAW,QAAQ,CAAClS,MAAO;AACzB,QAAA+I,EAAK,OAAO/I,CAAE;AAAA,MAChB,CAAC,GACM,EAAE,gBAAgB+I,EAAA;AAAA,IAC3B,CAAC;AAAA,IACH,OAAO,MAAMkN,EAAI,OAAO,EAAE,gBAAgB,oBAAI,IAAA,IAAyB;AAAA,EAAA,EACvE;AACJ;","x_google_ignoreList":[0,1,2,4,12,13]}
|
|
1
|
+
{"version":3,"file":"genomebrowser-ui.es.js","sources":["../../../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-runtime.js","../src/TrackSelect/DataGrid/CustomToolbar.tsx","../../../node_modules/.pnpm/fuse.js@7.1.0/node_modules/fuse.js/dist/fuse.mjs","../src/TrackSelect/DataGrid/dataGridHelpers.tsx","../src/TrackSelect/consts.ts","../src/TrackSelect/TreeView/treeViewHelpers.tsx","../src/TrackSelect/DataGrid/columns.tsx","../src/TrackSelect/DataGrid/DataGridWrapper.tsx","../src/TrackSelect/TreeView/TreeViewWrapper.tsx","../src/TrackSelect/TrackSelect.tsx","../../../node_modules/.pnpm/zustand@5.0.9_@types+react@19.2.7_react@19.2.3_use-sync-external-store@1.6.0_react@19.2.3_/node_modules/zustand/esm/vanilla.mjs","../../../node_modules/.pnpm/zustand@5.0.9_@types+react@19.2.7_react@19.2.3_use-sync-external-store@1.6.0_react@19.2.3_/node_modules/zustand/esm/react.mjs","../src/TrackSelect/store.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import * as React from \"react\";\nimport {\n Toolbar,\n ToolbarButton,\n ColumnsPanelTrigger,\n FilterPanelTrigger,\n ExportCsv,\n ExportPrint,\n GridToolbarProps,\n ToolbarPropsOverrides,\n ExportExcel,\n} from \"@mui/x-data-grid-premium\";\nimport Tooltip from \"@mui/material/Tooltip\";\nimport Menu from \"@mui/material/Menu\";\nimport Badge from \"@mui/material/Badge\";\nimport ViewColumnIcon from \"@mui/icons-material/ViewColumn\";\nimport FilterListIcon from \"@mui/icons-material/FilterList\";\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport Divider from \"@mui/material/Divider\";\nimport Typography from \"@mui/material/Typography\";\nimport { DataGridProps } from \"../types\";\nimport { InfoOutline } from \"@mui/icons-material\";\n\ntype CustomToolbarProps = {\n label: DataGridProps[\"label\"];\n downloadFileName: DataGridProps[\"downloadFileName\"];\n labelTooltip: DataGridProps[\"labelTooltip\"];\n toolbarSlot?: DataGridProps[\"toolbarSlot\"];\n toolbarStyle?: DataGridProps[\"toolbarStyle\"];\n toolbarIconColor?: DataGridProps[\"toolbarIconColor\"];\n} & GridToolbarProps &\n ToolbarPropsOverrides;\n\nexport function CustomToolbar({\n label,\n downloadFileName,\n labelTooltip,\n toolbarSlot,\n toolbarStyle,\n toolbarIconColor,\n ...restToolbarProps\n}: CustomToolbarProps) {\n const [exportMenuOpen, setExportMenuOpen] = React.useState(false);\n const exportMenuTriggerRef = React.useRef<HTMLButtonElement>(null);\n\n const iconColor = toolbarIconColor ?? \"inherit\";\n\n return (\n <Toolbar style={{ ...toolbarStyle }}>\n {typeof label !== \"string\" && label}\n <Typography\n fontWeight=\"medium\"\n sx={{ flex: 1, mx: 0.5, display: \"flex\", alignItems: \"center\", gap: 1 }}\n >\n {typeof label === \"string\" && label}\n {/* ReactNode can be more than just an element, string, or number but not accounting for that for simplicity */}\n {labelTooltip &&\n (typeof labelTooltip === \"string\" ||\n typeof labelTooltip === \"number\") ? (\n <Tooltip title={labelTooltip}>\n <InfoOutline fontSize=\"inherit\" color=\"primary\" />\n </Tooltip>\n ) : (\n labelTooltip\n )}\n </Typography>\n {toolbarSlot && (\n <>\n {toolbarSlot}\n <Divider\n orientation=\"vertical\"\n variant=\"middle\"\n flexItem\n sx={{ mx: 0.5 }}\n />\n </>\n )}\n\n <Tooltip title=\"Columns\">\n <ColumnsPanelTrigger render={<ToolbarButton />}>\n <ViewColumnIcon fontSize=\"small\" htmlColor={iconColor} />\n </ColumnsPanelTrigger>\n </Tooltip>\n\n <Tooltip title=\"Filters\">\n <FilterPanelTrigger\n render={(props, state) => (\n <ToolbarButton {...props} color=\"default\">\n <Badge\n badgeContent={state.filterCount}\n color=\"primary\"\n variant=\"dot\"\n >\n <FilterListIcon fontSize=\"small\" htmlColor={iconColor} />\n </Badge>\n </ToolbarButton>\n )}\n />\n </Tooltip>\n <Divider\n orientation=\"vertical\"\n variant=\"middle\"\n flexItem\n sx={{ mx: 0.5 }}\n />\n <Tooltip title=\"Export\">\n <ToolbarButton\n ref={exportMenuTriggerRef}\n id=\"export-menu-trigger\"\n aria-controls=\"export-menu\"\n aria-haspopup=\"true\"\n aria-expanded={exportMenuOpen ? \"true\" : undefined}\n onClick={() => setExportMenuOpen(true)}\n >\n <FileDownloadIcon fontSize=\"small\" htmlColor={iconColor} />\n </ToolbarButton>\n </Tooltip>\n\n <Menu\n id=\"export-menu\"\n anchorEl={exportMenuTriggerRef.current}\n open={exportMenuOpen}\n onClose={() => setExportMenuOpen(false)}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n transformOrigin={{ vertical: \"top\", horizontal: \"right\" }}\n slotProps={{\n list: {\n \"aria-labelledby\": \"export-menu-trigger\",\n },\n }}\n >\n <ExportPrint\n options={{ ...restToolbarProps.printOptions }}\n render={<MenuItem />}\n onClick={() => setExportMenuOpen(false)}\n >\n Print\n </ExportPrint>\n <ExportCsv\n options={{\n fileName: typeof label === \"string\" ? label : downloadFileName,\n ...restToolbarProps.csvOptions,\n }}\n render={<MenuItem />}\n onClick={() => setExportMenuOpen(false)}\n >\n Download as CSV\n </ExportCsv>\n <ExportExcel\n options={{ ...restToolbarProps.excelOptions }}\n render={<MenuItem />}\n onClick={() => setExportMenuOpen(false)}\n >\n Download as Excel\n </ExportExcel>\n </Menu>\n </Toolbar>\n );\n}\n","/**\n * Fuse.js v7.1.0 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2025 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n return !Array.isArray\n ? getTag(value) === '[object Array]'\n : Array.isArray(value)\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js\nconst INFINITY = 1 / 0;\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value\n }\n let result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result\n}\n\nfunction toString(value) {\n return value == null ? '' : baseToString(value)\n}\n\nfunction isString(value) {\n return typeof value === 'string'\n}\n\nfunction isNumber(value) {\n return typeof value === 'number'\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n return (\n value === true ||\n value === false ||\n (isObjectLike(value) && getTag(value) == '[object Boolean]')\n )\n}\n\nfunction isObject(value) {\n return typeof value === 'object'\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n return isObject(value) && value !== null\n}\n\nfunction isDefined(value) {\n return value !== undefined && value !== null\n}\n\nfunction isBlank(value) {\n return !value.trim().length\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n return value == null\n ? value === undefined\n ? '[object Undefined]'\n : '[object Null]'\n : Object.prototype.toString.call(value)\n}\n\nconst EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available';\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\n\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) =>\n `Invalid value for key ${key}`;\n\nconst PATTERN_LENGTH_TOO_LARGE = (max) =>\n `Pattern length exceeds max of ${max}.`;\n\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\n\nconst INVALID_KEY_WEIGHT_VALUE = (key) =>\n `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nclass KeyStore {\n constructor(keys) {\n this._keys = [];\n this._keyMap = {};\n\n let totalWeight = 0;\n\n keys.forEach((key) => {\n let obj = createKey(key);\n\n this._keys.push(obj);\n this._keyMap[obj.id] = obj;\n\n totalWeight += obj.weight;\n });\n\n // Normalize weights so that their sum is equal to 1\n this._keys.forEach((key) => {\n key.weight /= totalWeight;\n });\n }\n get(keyId) {\n return this._keyMap[keyId]\n }\n keys() {\n return this._keys\n }\n toJSON() {\n return JSON.stringify(this._keys)\n }\n}\n\nfunction createKey(key) {\n let path = null;\n let id = null;\n let src = null;\n let weight = 1;\n let getFn = null;\n\n if (isString(key) || isArray(key)) {\n src = key;\n path = createKeyPath(key);\n id = createKeyId(key);\n } else {\n if (!hasOwn.call(key, 'name')) {\n throw new Error(MISSING_KEY_PROPERTY('name'))\n }\n\n const name = key.name;\n src = name;\n\n if (hasOwn.call(key, 'weight')) {\n weight = key.weight;\n\n if (weight <= 0) {\n throw new Error(INVALID_KEY_WEIGHT_VALUE(name))\n }\n }\n\n path = createKeyPath(name);\n id = createKeyId(name);\n getFn = key.getFn;\n }\n\n return { path, id, weight, src, getFn }\n}\n\nfunction createKeyPath(key) {\n return isArray(key) ? key : key.split('.')\n}\n\nfunction createKeyId(key) {\n return isArray(key) ? key.join('.') : key\n}\n\nfunction get(obj, path) {\n let list = [];\n let arr = false;\n\n const deepGet = (obj, path, index) => {\n if (!isDefined(obj)) {\n return\n }\n if (!path[index]) {\n // If there's no path left, we've arrived at the object we care about.\n list.push(obj);\n } else {\n let key = path[index];\n\n const value = obj[key];\n\n if (!isDefined(value)) {\n return\n }\n\n // If we're at the last value in the path, and if it's a string/number/bool,\n // add it to the list\n if (\n index === path.length - 1 &&\n (isString(value) || isNumber(value) || isBoolean(value))\n ) {\n list.push(toString(value));\n } else if (isArray(value)) {\n arr = true;\n // Search each item in the array.\n for (let i = 0, len = value.length; i < len; i += 1) {\n deepGet(value[i], path, index + 1);\n }\n } else if (path.length) {\n // An object. Recurse further.\n deepGet(value, path, index + 1);\n }\n }\n };\n\n // Backwards compatibility (since path used to be a string)\n deepGet(obj, isString(path) ? path.split('.') : path, 0);\n\n return arr ? list : list[0]\n}\n\nconst MatchOptions = {\n // Whether the matches should be included in the result set. When `true`, each record in the result\n // set will include the indices of the matched characters.\n // These can consequently be used for highlighting purposes.\n includeMatches: false,\n // When `true`, the matching function will continue to the end of a search pattern even if\n // a perfect match has already been located in the string.\n findAllMatches: false,\n // Minimum number of characters that must be matched before a result is considered a match\n minMatchCharLength: 1\n};\n\nconst BasicOptions = {\n // When `true`, the algorithm continues searching to the end of the input even if a perfect\n // match is found before the end of the same input.\n isCaseSensitive: false,\n // When `true`, the algorithm will ignore diacritics (accents) in comparisons\n ignoreDiacritics: false,\n // When true, the matching function will continue to the end of a search pattern even if\n includeScore: false,\n // List of properties that will be searched. This also supports nested properties.\n keys: [],\n // Whether to sort the result list, by score\n shouldSort: true,\n // Default sort function: sort by ascending score, ascending index\n sortFn: (a, b) =>\n a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1\n};\n\nconst FuzzyOptions = {\n // Approximately where in the text is the pattern expected to be found?\n location: 0,\n // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n // (of both letters and location), a threshold of '1.0' would match anything.\n threshold: 0.6,\n // Determines how close the match must be to the fuzzy location (specified above).\n // An exact letter match which is 'distance' characters away from the fuzzy location\n // would score as a complete mismatch. A distance of '0' requires the match be at\n // the exact location specified, a threshold of '1000' would require a perfect match\n // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n distance: 100\n};\n\nconst AdvancedOptions = {\n // When `true`, it enables the use of unix-like search commands\n useExtendedSearch: false,\n // The get function to use when fetching an object's properties.\n // The default will search nested paths *ie foo.bar.baz*\n getFn: get,\n // When `true`, search will ignore `location` and `distance`, so it won't matter\n // where in the string the pattern appears.\n // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score\n ignoreLocation: false,\n // When `true`, the calculation for the relevance score (used for sorting) will\n // ignore the field-length norm.\n // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm\n ignoreFieldNorm: false,\n // The weight to determine how much field length norm effects scoring.\n fieldNormWeight: 1\n};\n\nvar Config = {\n ...BasicOptions,\n ...MatchOptions,\n ...FuzzyOptions,\n ...AdvancedOptions\n};\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n const cache = new Map();\n const m = Math.pow(10, mantissa);\n\n return {\n get(value) {\n const numTokens = value.match(SPACE).length;\n\n if (cache.has(numTokens)) {\n return cache.get(numTokens)\n }\n\n // Default function is 1/sqrt(x), weight makes that variable\n const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n // In place of `toFixed(mantissa)`, for faster computation\n const n = parseFloat(Math.round(norm * m) / m);\n\n cache.set(numTokens, n);\n\n return n\n },\n clear() {\n cache.clear();\n }\n }\n}\n\nclass FuseIndex {\n constructor({\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n } = {}) {\n this.norm = norm(fieldNormWeight, 3);\n this.getFn = getFn;\n this.isCreated = false;\n\n this.setIndexRecords();\n }\n setSources(docs = []) {\n this.docs = docs;\n }\n setIndexRecords(records = []) {\n this.records = records;\n }\n setKeys(keys = []) {\n this.keys = keys;\n this._keysMap = {};\n keys.forEach((key, idx) => {\n this._keysMap[key.id] = idx;\n });\n }\n create() {\n if (this.isCreated || !this.docs.length) {\n return\n }\n\n this.isCreated = true;\n\n // List is Array<String>\n if (isString(this.docs[0])) {\n this.docs.forEach((doc, docIndex) => {\n this._addString(doc, docIndex);\n });\n } else {\n // List is Array<Object>\n this.docs.forEach((doc, docIndex) => {\n this._addObject(doc, docIndex);\n });\n }\n\n this.norm.clear();\n }\n // Adds a doc to the end of the index\n add(doc) {\n const idx = this.size();\n\n if (isString(doc)) {\n this._addString(doc, idx);\n } else {\n this._addObject(doc, idx);\n }\n }\n // Removes the doc at the specified index of the index\n removeAt(idx) {\n this.records.splice(idx, 1);\n\n // Change ref index of every subsquent doc\n for (let i = idx, len = this.size(); i < len; i += 1) {\n this.records[i].i -= 1;\n }\n }\n getValueForItemAtKeyId(item, keyId) {\n return item[this._keysMap[keyId]]\n }\n size() {\n return this.records.length\n }\n _addString(doc, docIndex) {\n if (!isDefined(doc) || isBlank(doc)) {\n return\n }\n\n let record = {\n v: doc,\n i: docIndex,\n n: this.norm.get(doc)\n };\n\n this.records.push(record);\n }\n _addObject(doc, docIndex) {\n let record = { i: docIndex, $: {} };\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n this.keys.forEach((key, keyIndex) => {\n let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\n if (!isDefined(value)) {\n return\n }\n\n if (isArray(value)) {\n let subRecords = [];\n const stack = [{ nestedArrIndex: -1, value }];\n\n while (stack.length) {\n const { nestedArrIndex, value } = stack.pop();\n\n if (!isDefined(value)) {\n continue\n }\n\n if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n i: nestedArrIndex,\n n: this.norm.get(value)\n };\n\n subRecords.push(subRecord);\n } else if (isArray(value)) {\n value.forEach((item, k) => {\n stack.push({\n nestedArrIndex: k,\n value: item\n });\n });\n } else ;\n }\n record.$[keyIndex] = subRecords;\n } else if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n n: this.norm.get(value)\n };\n\n record.$[keyIndex] = subRecord;\n }\n });\n\n this.records.push(record);\n }\n toJSON() {\n return {\n keys: this.keys,\n records: this.records\n }\n }\n}\n\nfunction createIndex(\n keys,\n docs,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys.map(createKey));\n myIndex.setSources(docs);\n myIndex.create();\n return myIndex\n}\n\nfunction parseIndex(\n data,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const { keys, records } = data;\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys);\n myIndex.setIndexRecords(records);\n return myIndex\n}\n\nfunction computeScore$1(\n pattern,\n {\n errors = 0,\n currentLocation = 0,\n expectedLocation = 0,\n distance = Config.distance,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n const accuracy = errors / pattern.length;\n\n if (ignoreLocation) {\n return accuracy\n }\n\n const proximity = Math.abs(expectedLocation - currentLocation);\n\n if (!distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy\n }\n\n return accuracy + proximity / distance\n}\n\nfunction convertMaskToIndices(\n matchmask = [],\n minMatchCharLength = Config.minMatchCharLength\n) {\n let indices = [];\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (let len = matchmask.length; i < len; i += 1) {\n let match = matchmask[i];\n if (match && start === -1) {\n start = i;\n } else if (!match && start !== -1) {\n end = i - 1;\n if (end - start + 1 >= minMatchCharLength) {\n indices.push([start, end]);\n }\n start = -1;\n }\n }\n\n // (i-1 - start) + 1 => i - start\n if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n indices.push([start, i - 1]);\n }\n\n return indices\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(\n text,\n pattern,\n patternAlphabet,\n {\n location = Config.location,\n distance = Config.distance,\n threshold = Config.threshold,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n includeMatches = Config.includeMatches,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n if (pattern.length > MAX_BITS) {\n throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS))\n }\n\n const patternLen = pattern.length;\n // Set starting location at beginning text and initialize the alphabet.\n const textLen = text.length;\n // Handle the case when location > text.length\n const expectedLocation = Math.max(0, Math.min(location, textLen));\n // Highest score beyond which we give up.\n let currentThreshold = threshold;\n // Is there a nearby exact match? (speedup)\n let bestLocation = expectedLocation;\n\n // Performance: only computer matches when the minMatchCharLength > 1\n // OR if `includeMatches` is true.\n const computeMatches = minMatchCharLength > 1 || includeMatches;\n // A mask of the matches, used for building the indices\n const matchMask = computeMatches ? Array(textLen) : [];\n\n let index;\n\n // Get all exact matches, here for speed up\n while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n let score = computeScore$1(pattern, {\n currentLocation: index,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n currentThreshold = Math.min(score, currentThreshold);\n bestLocation = index + patternLen;\n\n if (computeMatches) {\n let i = 0;\n while (i < patternLen) {\n matchMask[index + i] = 1;\n i += 1;\n }\n }\n }\n\n // Reset the best location\n bestLocation = -1;\n\n let lastBitArr = [];\n let finalScore = 1;\n let binMax = patternLen + textLen;\n\n const mask = 1 << (patternLen - 1);\n\n for (let i = 0; i < patternLen; i += 1) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from the match location we can stray\n // at this error level.\n let binMin = 0;\n let binMid = binMax;\n\n while (binMin < binMid) {\n const score = computeScore$1(pattern, {\n errors: i,\n currentLocation: expectedLocation + binMid,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score <= currentThreshold) {\n binMin = binMid;\n } else {\n binMax = binMid;\n }\n\n binMid = Math.floor((binMax - binMin) / 2 + binMin);\n }\n\n // Use the result from this iteration as the maximum for the next.\n binMax = binMid;\n\n let start = Math.max(1, expectedLocation - binMid + 1);\n let finish = findAllMatches\n ? textLen\n : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n // Initialize the bit array\n let bitArr = Array(finish + 2);\n\n bitArr[finish + 1] = (1 << i) - 1;\n\n for (let j = finish; j >= start; j -= 1) {\n let currentLocation = j - 1;\n let charMatch = patternAlphabet[text.charAt(currentLocation)];\n\n if (computeMatches) {\n // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n matchMask[currentLocation] = +!!charMatch;\n }\n\n // First pass: exact match\n bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch;\n\n // Subsequent passes: fuzzy match\n if (i) {\n bitArr[j] |=\n ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1];\n }\n\n if (bitArr[j] & mask) {\n finalScore = computeScore$1(pattern, {\n errors: i,\n currentLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (finalScore <= currentThreshold) {\n // Indeed it is\n currentThreshold = finalScore;\n bestLocation = currentLocation;\n\n // Already passed `loc`, downhill from here on in.\n if (bestLocation <= expectedLocation) {\n break\n }\n\n // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n start = Math.max(1, 2 * expectedLocation - bestLocation);\n }\n }\n }\n\n // No hope for a (better) match at greater error levels.\n const score = computeScore$1(pattern, {\n errors: i + 1,\n currentLocation: expectedLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score > currentThreshold) {\n break\n }\n\n lastBitArr = bitArr;\n }\n\n const result = {\n isMatch: bestLocation >= 0,\n // Count exact matches (those with a score of 0) to be \"almost\" exact\n score: Math.max(0.001, finalScore)\n };\n\n if (computeMatches) {\n const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n if (!indices.length) {\n result.isMatch = false;\n } else if (includeMatches) {\n result.indices = indices;\n }\n }\n\n return result\n}\n\nfunction createPatternAlphabet(pattern) {\n let mask = {};\n\n for (let i = 0, len = pattern.length; i < len; i += 1) {\n const char = pattern.charAt(i);\n mask[char] = (mask[char] || 0) | (1 << (len - i - 1));\n }\n\n return mask\n}\n\nconst stripDiacritics = String.prototype.normalize\n ? ((str) => str.normalize('NFD').replace(/[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C04\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00-\\u0D03\\u0D3B\\u0D3C\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF7-\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F]/g, ''))\n : ((str) => str);\n\nclass BitapSearch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n this.options = {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n };\n\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n\n this.chunks = [];\n\n if (!this.pattern.length) {\n return\n }\n\n const addChunk = (pattern, startIndex) => {\n this.chunks.push({\n pattern,\n alphabet: createPatternAlphabet(pattern),\n startIndex\n });\n };\n\n const len = this.pattern.length;\n\n if (len > MAX_BITS) {\n let i = 0;\n const remainder = len % MAX_BITS;\n const end = len - remainder;\n\n while (i < end) {\n addChunk(this.pattern.substr(i, MAX_BITS), i);\n i += MAX_BITS;\n }\n\n if (remainder) {\n const startIndex = len - MAX_BITS;\n addChunk(this.pattern.substr(startIndex), startIndex);\n }\n } else {\n addChunk(this.pattern, 0);\n }\n }\n\n searchIn(text) {\n const { isCaseSensitive, ignoreDiacritics, includeMatches } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n // Exact match\n if (this.pattern === text) {\n let result = {\n isMatch: true,\n score: 0\n };\n\n if (includeMatches) {\n result.indices = [[0, text.length - 1]];\n }\n\n return result\n }\n\n // Otherwise, use Bitap algorithm\n const {\n location,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n ignoreLocation\n } = this.options;\n\n let allIndices = [];\n let totalScore = 0;\n let hasMatches = false;\n\n this.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n const { isMatch, score, indices } = search(text, pattern, alphabet, {\n location: location + startIndex,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n includeMatches,\n ignoreLocation\n });\n\n if (isMatch) {\n hasMatches = true;\n }\n\n totalScore += score;\n\n if (isMatch && indices) {\n allIndices = [...allIndices, ...indices];\n }\n });\n\n let result = {\n isMatch: hasMatches,\n score: hasMatches ? totalScore / this.chunks.length : 1\n };\n\n if (hasMatches && includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n}\n\nclass BaseMatch {\n constructor(pattern) {\n this.pattern = pattern;\n }\n static isMultiMatch(pattern) {\n return getMatch(pattern, this.multiRegex)\n }\n static isSingleMatch(pattern) {\n return getMatch(pattern, this.singleRegex)\n }\n search(/*text*/) {}\n}\n\nfunction getMatch(pattern, exp) {\n const matches = pattern.match(exp);\n return matches ? matches[1] : null\n}\n\n// Token: 'file\n\nclass ExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'exact'\n }\n static get multiRegex() {\n return /^=\"(.*)\"$/\n }\n static get singleRegex() {\n return /^=(.*)$/\n }\n search(text) {\n const isMatch = text === this.pattern;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !fire\n\nclass InverseExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!(.*)$/\n }\n search(text) {\n const index = text.indexOf(this.pattern);\n const isMatch = index === -1;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: ^file\n\nclass PrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'prefix-exact'\n }\n static get multiRegex() {\n return /^\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^\\^(.*)$/\n }\n search(text) {\n const isMatch = text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !^fire\n\nclass InversePrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-prefix-exact'\n }\n static get multiRegex() {\n return /^!\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!\\^(.*)$/\n }\n search(text) {\n const isMatch = !text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: .file$\n\nclass SuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'suffix-exact'\n }\n static get multiRegex() {\n return /^\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^(.*)\\$$/\n }\n search(text) {\n const isMatch = text.endsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [text.length - this.pattern.length, text.length - 1]\n }\n }\n}\n\n// Token: !.file$\n\nclass InverseSuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-suffix-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^!(.*)\\$$/\n }\n search(text) {\n const isMatch = !text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\nclass FuzzyMatch extends BaseMatch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n super(pattern);\n this._bitapSearch = new BitapSearch(pattern, {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n });\n }\n static get type() {\n return 'fuzzy'\n }\n static get multiRegex() {\n return /^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^(.*)$/\n }\n search(text) {\n return this._bitapSearch.searchIn(text)\n }\n}\n\n// Token: 'file\n\nclass IncludeMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'include'\n }\n static get multiRegex() {\n return /^'\"(.*)\"$/\n }\n static get singleRegex() {\n return /^'(.*)$/\n }\n search(text) {\n let location = 0;\n let index;\n\n const indices = [];\n const patternLen = this.pattern.length;\n\n // Get all exact matches\n while ((index = text.indexOf(this.pattern, location)) > -1) {\n location = index + patternLen;\n indices.push([index, location - 1]);\n }\n\n const isMatch = !!indices.length;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices\n }\n }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [\n ExactMatch,\n IncludeMatch,\n PrefixExactMatch,\n InversePrefixExactMatch,\n InverseSuffixExactMatch,\n SuffixExactMatch,\n InverseExactMatch,\n FuzzyMatch\n];\n\nconst searchersLen = searchers.length;\n\n// Regex to split by spaces, but keep anything in quotes together\nconst SPACE_RE = / +(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/;\nconst OR_TOKEN = '|';\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n return pattern.split(OR_TOKEN).map((item) => {\n let query = item\n .trim()\n .split(SPACE_RE)\n .filter((item) => item && !!item.trim());\n\n let results = [];\n for (let i = 0, len = query.length; i < len; i += 1) {\n const queryItem = query[i];\n\n // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n let found = false;\n let idx = -1;\n while (!found && ++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isMultiMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n found = true;\n }\n }\n\n if (found) {\n continue\n }\n\n // 2. Handle single query matches (i.e, once that are *not* quoted)\n idx = -1;\n while (++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isSingleMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n break\n }\n }\n }\n\n return results\n })\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\n\n/**\n * Command-like searching\n * ======================\n *\n * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,\n * search in a given text.\n *\n * Search syntax:\n *\n * | Token | Match type | Description |\n * | ----------- | -------------------------- | -------------------------------------- |\n * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` |\n * | `=scheme` | exact-match | Items that are `scheme` |\n * | `'python` | include-match | Items that include `python` |\n * | `!ruby` | inverse-exact-match | Items that do not include `ruby` |\n * | `^java` | prefix-exact-match | Items that start with `java` |\n * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |\n * | `.js$` | suffix-exact-match | Items that end with `.js` |\n * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` |\n *\n * A single pipe character acts as an OR operator. For example, the following\n * query matches entries that start with `core` and end with either`go`, `rb`,\n * or`py`.\n *\n * ```\n * ^core go$ | rb$ | py$\n * ```\n */\nclass ExtendedSearch {\n constructor(\n pattern,\n {\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n includeMatches = Config.includeMatches,\n minMatchCharLength = Config.minMatchCharLength,\n ignoreLocation = Config.ignoreLocation,\n findAllMatches = Config.findAllMatches,\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance\n } = {}\n ) {\n this.query = null;\n this.options = {\n isCaseSensitive,\n ignoreDiacritics,\n includeMatches,\n minMatchCharLength,\n findAllMatches,\n ignoreLocation,\n location,\n threshold,\n distance\n };\n\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n this.query = parseQuery(this.pattern, this.options);\n }\n\n static condition(_, options) {\n return options.useExtendedSearch\n }\n\n searchIn(text) {\n const query = this.query;\n\n if (!query) {\n return {\n isMatch: false,\n score: 1\n }\n }\n\n const { includeMatches, isCaseSensitive, ignoreDiacritics } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n let numMatches = 0;\n let allIndices = [];\n let totalScore = 0;\n\n // ORs\n for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n const searchers = query[i];\n\n // Reset indices\n allIndices.length = 0;\n numMatches = 0;\n\n // ANDs\n for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n const searcher = searchers[j];\n const { isMatch, indices, score } = searcher.search(text);\n\n if (isMatch) {\n numMatches += 1;\n totalScore += score;\n if (includeMatches) {\n const type = searcher.constructor.type;\n if (MultiMatchSet.has(type)) {\n allIndices = [...allIndices, ...indices];\n } else {\n allIndices.push(indices);\n }\n }\n } else {\n totalScore = 0;\n numMatches = 0;\n allIndices.length = 0;\n break\n }\n }\n\n // OR condition, so if TRUE, return\n if (numMatches) {\n let result = {\n isMatch: true,\n score: totalScore / numMatches\n };\n\n if (includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n }\n\n // Nothing was matched\n return {\n isMatch: false,\n score: 1\n }\n }\n}\n\nconst registeredSearchers = [];\n\nfunction register(...args) {\n registeredSearchers.push(...args);\n}\n\nfunction createSearcher(pattern, options) {\n for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n let searcherClass = registeredSearchers[i];\n if (searcherClass.condition(pattern, options)) {\n return new searcherClass(pattern, options)\n }\n }\n\n return new BitapSearch(pattern, options)\n}\n\nconst LogicalOperator = {\n AND: '$and',\n OR: '$or'\n};\n\nconst KeyType = {\n PATH: '$path',\n PATTERN: '$val'\n};\n\nconst isExpression = (query) =>\n !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\n\nconst isPath = (query) => !!query[KeyType.PATH];\n\nconst isLeaf = (query) =>\n !isArray(query) && isObject(query) && !isExpression(query);\n\nconst convertToExplicit = (query) => ({\n [LogicalOperator.AND]: Object.keys(query).map((key) => ({\n [key]: query[key]\n }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, { auto = true } = {}) {\n const next = (query) => {\n let keys = Object.keys(query);\n\n const isQueryPath = isPath(query);\n\n if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n return next(convertToExplicit(query))\n }\n\n if (isLeaf(query)) {\n const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\n const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\n if (!isString(pattern)) {\n throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))\n }\n\n const obj = {\n keyId: createKeyId(key),\n pattern\n };\n\n if (auto) {\n obj.searcher = createSearcher(pattern, options);\n }\n\n return obj\n }\n\n let node = {\n children: [],\n operator: keys[0]\n };\n\n keys.forEach((key) => {\n const value = query[key];\n\n if (isArray(value)) {\n value.forEach((item) => {\n node.children.push(next(item));\n });\n }\n });\n\n return node\n };\n\n if (!isExpression(query)) {\n query = convertToExplicit(query);\n }\n\n return next(query)\n}\n\n// Practical scoring function\nfunction computeScore(\n results,\n { ignoreFieldNorm = Config.ignoreFieldNorm }\n) {\n results.forEach((result) => {\n let totalScore = 1;\n\n result.matches.forEach(({ key, norm, score }) => {\n const weight = key ? key.weight : null;\n\n totalScore *= Math.pow(\n score === 0 && weight ? Number.EPSILON : score,\n (weight || 1) * (ignoreFieldNorm ? 1 : norm)\n );\n });\n\n result.score = totalScore;\n });\n}\n\nfunction transformMatches(result, data) {\n const matches = result.matches;\n data.matches = [];\n\n if (!isDefined(matches)) {\n return\n }\n\n matches.forEach((match) => {\n if (!isDefined(match.indices) || !match.indices.length) {\n return\n }\n\n const { indices, value } = match;\n\n let obj = {\n indices,\n value\n };\n\n if (match.key) {\n obj.key = match.key.src;\n }\n\n if (match.idx > -1) {\n obj.refIndex = match.idx;\n }\n\n data.matches.push(obj);\n });\n}\n\nfunction transformScore(result, data) {\n data.score = result.score;\n}\n\nfunction format(\n results,\n docs,\n {\n includeMatches = Config.includeMatches,\n includeScore = Config.includeScore\n } = {}\n) {\n const transformers = [];\n\n if (includeMatches) transformers.push(transformMatches);\n if (includeScore) transformers.push(transformScore);\n\n return results.map((result) => {\n const { idx } = result;\n\n const data = {\n item: docs[idx],\n refIndex: idx\n };\n\n if (transformers.length) {\n transformers.forEach((transformer) => {\n transformer(result, data);\n });\n }\n\n return data\n })\n}\n\nclass Fuse {\n constructor(docs, options = {}, index) {\n this.options = { ...Config, ...options };\n\n if (\n this.options.useExtendedSearch &&\n !true\n ) {\n throw new Error(EXTENDED_SEARCH_UNAVAILABLE)\n }\n\n this._keyStore = new KeyStore(this.options.keys);\n\n this.setCollection(docs, index);\n }\n\n setCollection(docs, index) {\n this._docs = docs;\n\n if (index && !(index instanceof FuseIndex)) {\n throw new Error(INCORRECT_INDEX_TYPE)\n }\n\n this._myIndex =\n index ||\n createIndex(this.options.keys, this._docs, {\n getFn: this.options.getFn,\n fieldNormWeight: this.options.fieldNormWeight\n });\n }\n\n add(doc) {\n if (!isDefined(doc)) {\n return\n }\n\n this._docs.push(doc);\n this._myIndex.add(doc);\n }\n\n remove(predicate = (/* doc, idx */) => false) {\n const results = [];\n\n for (let i = 0, len = this._docs.length; i < len; i += 1) {\n const doc = this._docs[i];\n if (predicate(doc, i)) {\n this.removeAt(i);\n i -= 1;\n len -= 1;\n\n results.push(doc);\n }\n }\n\n return results\n }\n\n removeAt(idx) {\n this._docs.splice(idx, 1);\n this._myIndex.removeAt(idx);\n }\n\n getIndex() {\n return this._myIndex\n }\n\n search(query, { limit = -1 } = {}) {\n const {\n includeMatches,\n includeScore,\n shouldSort,\n sortFn,\n ignoreFieldNorm\n } = this.options;\n\n let results = isString(query)\n ? isString(this._docs[0])\n ? this._searchStringList(query)\n : this._searchObjectList(query)\n : this._searchLogical(query);\n\n computeScore(results, { ignoreFieldNorm });\n\n if (shouldSort) {\n results.sort(sortFn);\n }\n\n if (isNumber(limit) && limit > -1) {\n results = results.slice(0, limit);\n }\n\n return format(results, this._docs, {\n includeMatches,\n includeScore\n })\n }\n\n _searchStringList(query) {\n const searcher = createSearcher(query, this.options);\n const { records } = this._myIndex;\n const results = [];\n\n // Iterate over every string in the index\n records.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n results.push({\n item: text,\n idx,\n matches: [{ score, value: text, norm, indices }]\n });\n }\n });\n\n return results\n }\n\n _searchLogical(query) {\n\n const expression = parse(query, this.options);\n\n const evaluate = (node, item, idx) => {\n if (!node.children) {\n const { keyId, searcher } = node;\n\n const matches = this._findMatches({\n key: this._keyStore.get(keyId),\n value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n searcher\n });\n\n if (matches && matches.length) {\n return [\n {\n idx,\n item,\n matches\n }\n ]\n }\n\n return []\n }\n\n const res = [];\n for (let i = 0, len = node.children.length; i < len; i += 1) {\n const child = node.children[i];\n const result = evaluate(child, item, idx);\n if (result.length) {\n res.push(...result);\n } else if (node.operator === LogicalOperator.AND) {\n return []\n }\n }\n return res\n };\n\n const records = this._myIndex.records;\n const resultMap = {};\n const results = [];\n\n records.forEach(({ $: item, i: idx }) => {\n if (isDefined(item)) {\n let expResults = evaluate(expression, item, idx);\n\n if (expResults.length) {\n // Dedupe when adding\n if (!resultMap[idx]) {\n resultMap[idx] = { idx, item, matches: [] };\n results.push(resultMap[idx]);\n }\n expResults.forEach(({ matches }) => {\n resultMap[idx].matches.push(...matches);\n });\n }\n }\n });\n\n return results\n }\n\n _searchObjectList(query) {\n const searcher = createSearcher(query, this.options);\n const { keys, records } = this._myIndex;\n const results = [];\n\n // List is Array<Object>\n records.forEach(({ $: item, i: idx }) => {\n if (!isDefined(item)) {\n return\n }\n\n let matches = [];\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n keys.forEach((key, keyIndex) => {\n matches.push(\n ...this._findMatches({\n key,\n value: item[keyIndex],\n searcher\n })\n );\n });\n\n if (matches.length) {\n results.push({\n idx,\n item,\n matches\n });\n }\n });\n\n return results\n }\n _findMatches({ key, value, searcher }) {\n if (!isDefined(value)) {\n return []\n }\n\n let matches = [];\n\n if (isArray(value)) {\n value.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n idx,\n norm,\n indices\n });\n }\n });\n } else {\n const { v: text, n: norm } = value;\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({ score, key, value: text, norm, indices });\n }\n }\n\n return matches\n }\n}\n\nFuse.version = '7.1.0';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\n\n{\n Fuse.parseQuery = parse;\n}\n\n{\n register(ExtendedSearch);\n}\n\nexport { Fuse as default };\n","import { capitalize } from \"@mui/material\";\nimport Fuse, { FuseResult } from \"fuse.js\";\nimport tracksData from \"../Data/modifiedHumanTracks.json\";\nimport { AssayInfo, RowInfo, SearchTracksProps, TrackInfo } from \"../types\";\n\nfunction formatAssayType(assay: string): string {\n switch (assay) {\n case \"dnase\":\n return \"DNase\";\n case \"atac\":\n return \"ATAC\";\n case \"h3k4me3\":\n return \"H3K4me3\";\n case \"h3k27ac\":\n return \"H3K27ac\";\n case \"ctcf\":\n return \"CTCF\";\n case \"chromhmm\":\n return \"ChromHMM\";\n default:\n return assay;\n }\n}\n\n// use to get nested data in JSON file\nfunction getNestedValue(obj: any, path: string): any {\n return path.split(\".\").reduce((acc, key) => acc && acc[key], obj);\n}\n\nexport function getTracksByAssayAndOntology(\n assay: string,\n ontology: string,\n): TrackInfo[] {\n let res: TrackInfo[] = [];\n const data = getNestedValue(tracksData, \"tracks\");\n\n data.forEach((track: TrackInfo) => {\n const filteredAssays =\n track.assays?.filter((e: AssayInfo) => e.assay === assay.toLowerCase()) ||\n [];\n if (\n filteredAssays.length > 0 &&\n track.ontology === ontology.toLowerCase()\n ) {\n res.push({\n ...track,\n assays: filteredAssays,\n });\n }\n });\n return res;\n}\n\n/** Flatten TrackInfo or FuseResult into RowInfo for DataGrid display.\n * @param track TrackInfo object or FuseResult containing information from JSON file\n * @returns Flattened RowInfo object\n */\nexport function flattenIntoRow(track: TrackInfo): RowInfo {\n const { ontology, lifeStage, sampleType, displayname } = track;\n const { assay, experimentAccession, fileAccession, url } = track.assays[0];\n\n return {\n ontology: capitalize(ontology),\n lifeStage: capitalize(lifeStage),\n sampleType: capitalize(sampleType),\n displayname: capitalize(displayname),\n assay: formatAssayType(assay),\n experimentAccession,\n fileAccession,\n url,\n };\n}\n\n/**\n * Fuzzy search in tracks stored in a JSON file.\n *\n * @param jsonStructure - Dot-separated path to the data array in the JSON structure.\n * @param query - The search query string.\n * @param keyWeightMap - Array of keys to search within each track object.\n * Can look like [\"name\", \"author\"] or if weighted, [\n {\n name: 'title',\n weight: 0.3\n },\n {\n name: 'author',\n weight: 0.7\n }\n ].\n * @param threshold - (Optional) Threshold for the fuzzy search (default is 0.5).\n * Smaller = stricter match, larger = fuzzier since 0 is perfect match and 1 is worst match.\n * @param limit - (Optional) Maximum number of results to return (default is 10).\n * @returns FuseResult object containing the search results.\n */\nexport function searchTracks({\n jsonStructure,\n query,\n keyWeightMap,\n threshold = 0.75,\n}: SearchTracksProps): FuseResult<TrackInfo>[] {\n const data = getNestedValue(tracksData, jsonStructure ?? \"\");\n\n const fuse = new Fuse(data, {\n includeScore: true,\n shouldSort: true,\n threshold: threshold,\n keys: keyWeightMap,\n });\n return fuse.search(query);\n}\n","import {\n getTracksByAssayAndOntology,\n flattenIntoRow,\n} from \"./DataGrid/dataGridHelpers\";\nimport { RowInfo, TrackInfo } from \"./types\";\n\nexport const assayTypes = [\n \"DNase\",\n \"H3K4me3\",\n \"H3K27ac\",\n \"ATAC\",\n \"CTCF\",\n \"ChromHMM\",\n];\n\nexport const ontologyTypes = [\n \"Adipose\",\n \"Adrenal gland\",\n \"Blood\",\n \"Blood vessel\",\n \"Bone\",\n \"Bone marrow\",\n \"Brain\",\n \"Breast\",\n \"Connective tissue\",\n \"Embryo\",\n \"Epithelium\",\n \"Esophagus\",\n \"Eye\",\n \"Fallopian Tube\",\n \"Gallbladder\",\n \"Heart\",\n \"Kidney\",\n \"Large Intestine\",\n \"Limb\",\n \"Liver\",\n \"Lung\",\n \"Lymphoid Tissue\",\n \"Muscle\",\n \"Mouth\",\n \"Nerve\",\n \"Nose\",\n \"Pancreas\",\n \"Parathyroid Gland\",\n \"Ovary\",\n \"Penis\",\n \"Placenta\",\n \"Prostate\",\n \"Skin\",\n \"Small Intestine\",\n \"Spinal Cord\",\n \"Spleen\",\n \"Stomach\",\n \"Testis\",\n \"Thymus\",\n \"Thyroid\",\n \"Urinary Bladder\",\n \"Uterus\",\n \"Vagina\",\n];\n\nexport const rows = ontologyTypes.flatMap((ontology) =>\n assayTypes.flatMap((assay) =>\n getTracksByAssayAndOntology(\n assay.toLowerCase(),\n ontology.toLowerCase(),\n ).map((r: TrackInfo) => {\n const flat = flattenIntoRow(r);\n return {\n ...flat,\n assay,\n ontology,\n };\n }),\n ),\n);\n\n// map of experimentAccession -> rowInfo for faster row lookup\nexport const rowById = new Map<string, RowInfo>(\n rows.map((r) => [r.experimentAccession, r]),\n);\n\n/**\n * Check if an ID is a real track (exists in rowById) vs an auto-generated group ID\n */\nexport const isTrackId = (id: string): boolean => rowById.has(id);\n\n/**\n * Filter a set of IDs to return only real track IDs (no auto-generated group IDs)\n */\nexport const getActiveTracks = (selectedIds: Set<string>): Set<string> =>\n new Set(Array.from(selectedIds).filter(isTrackId));\n","import Folder from \"@mui/icons-material/Folder\";\nimport IndeterminateCheckBoxRoundedIcon from \"@mui/icons-material/IndeterminateCheckBoxRounded\";\nimport { Box, Typography, Stack } from \"@mui/material\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { alpha, styled } from \"@mui/material/styles\";\nimport { TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport {\n TreeItemCheckbox,\n TreeItemIconContainer,\n TreeItemLabel,\n} from \"@mui/x-tree-view/TreeItem\";\nimport { TreeItemIcon } from \"@mui/x-tree-view/TreeItemIcon\";\nimport { TreeItemProvider } from \"@mui/x-tree-view/TreeItemProvider\";\nimport { useTreeItemModel } from \"@mui/x-tree-view/hooks\";\nimport { useTreeItem } from \"@mui/x-tree-view/useTreeItem\";\nimport React from \"react\";\nimport {\n CustomLabelProps,\n CustomTreeItemProps,\n ExtendedTreeItemProps,\n RowInfo,\n} from \"../types\";\nimport Fuse, { FuseResult } from \"fuse.js\";\nimport { SearchTracksProps } from \"../types\";\nimport { assayTypes, ontologyTypes } from \"../consts\";\n\n\n/**\n * Builds tree in the sorted by assay view\n * @param selectedIds: list of ids (from useSelectionStore)\n * @param root: Root TreeViewBaseItem\n * @param rowById: Mapping between an id (experimentAccession) and its RowInfo object\n * @returns all of the items for the RichTreeView in TreeViewWrapper\n */\nexport function buildSortedAssayTreeView(\n selectedIds: string[],\n root: TreeViewBaseItem<ExtendedTreeItemProps>,\n rowById: Map<string, RowInfo>,\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n const assayMap = new Map<string, TreeViewBaseItem<ExtendedTreeItemProps>>(); // keep track of top level nodes\n const ontologyMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n const sampleAssayMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n let idx = 1;\n\n const selectedRows = selectedIds.reduce<RowInfo[]>((acc, id) => {\n const row = rowById.get(id);\n if (row) acc.push(row);\n return acc;\n }, []);\n\n selectedRows.forEach((row) => {\n let assayNode = assayMap.get(row.assay);\n if (!assayNode) {\n assayNode = {\n id: row.assay,\n isAssayItem: true,\n label: row.assay,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n assayMap.set(row.assay, assayNode);\n root.children!.push(assayNode);\n }\n\n let ontologyNode = ontologyMap.get(row.ontology + row.assay);\n if (!ontologyNode) {\n ontologyNode = {\n id: row.ontology + \"_\" + idx++,\n isAssayItem: false,\n label: row.ontology,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n assayNode.children!.push(ontologyNode);\n ontologyMap.set(row.ontology + row.assay, ontologyNode);\n }\n\n const displayNameNode: TreeViewBaseItem<ExtendedTreeItemProps> = {\n id: row.displayname + \"_\" + idx++,\n isAssayItem: false,\n label: row.displayname,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyNode.children!.push(displayNameNode);\n\n let expNode = sampleAssayMap.get(row.displayname + row.experimentAccession);\n if (!expNode) {\n expNode = {\n id: row.experimentAccession,\n isAssayItem: false,\n label: row.experimentAccession,\n icon: row.assay,\n children: [],\n };\n sampleAssayMap.set(row.displayname + row.assay, expNode);\n displayNameNode.children!.push(expNode);\n }\n assayNode.allExpAccessions!.push(row.experimentAccession);\n ontologyNode.allExpAccessions!.push(row.experimentAccession);\n displayNameNode.allExpAccessions!.push(row.experimentAccession);\n root.allRowInfo!.push(row);\n });\n // standardize the order of the assay folders everytime one is added\n root.children!.sort((a, b): number => {\n return assayTypes.indexOf(a.id) - assayTypes.indexOf(b.id);\n });\n return [root];\n}\n\n/**\n * Builds tree in the sorted by assay view\n * @param selectedIds: list of ids (from useSelectionStore)\n * @param root: Root TreeViewBaseItem\n * @param rowById: Mapping between an id (experimentAccession) and its RowInfo object\n * @returns all of the items for the RichTreeView in TreeViewWrapper\n */\nexport function buildTreeView(\n selectedIds: string[],\n root: TreeViewBaseItem<ExtendedTreeItemProps>,\n rowById: Map<string, RowInfo>,\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n const ontologyMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >(); // keep track of top level nodes\n const displayNameMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n const sampleAssayMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n\n const selectedRows = selectedIds.reduce<RowInfo[]>((acc, id) => {\n const row = rowById.get(id);\n if (row) acc.push(row);\n return acc;\n }, []);\n\n selectedRows.forEach((row) => {\n if (!row) {\n return;\n }\n let ontologyNode = ontologyMap.get(row.ontology);\n if (!ontologyNode) {\n ontologyNode = {\n id: row.ontology,\n label: row.ontology,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyMap.set(row.ontology, ontologyNode);\n root.children!.push(ontologyNode);\n }\n\n let displayNameNode = displayNameMap.get(row.displayname);\n if (!displayNameNode) {\n displayNameNode = {\n id: row.displayname,\n label: row.displayname,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyNode.children!.push(displayNameNode);\n displayNameMap.set(row.displayname, displayNameNode);\n }\n\n let expNode = sampleAssayMap.get(row.displayname + row.assay);\n if (!expNode) {\n expNode = {\n id: row.experimentAccession,\n label: row.experimentAccession,\n icon: row.assay,\n children: [],\n };\n sampleAssayMap.set(row.displayname + row.assay, expNode);\n displayNameNode.children!.push(expNode);\n }\n ontologyNode.allExpAccessions!.push(row.experimentAccession);\n displayNameNode.allExpAccessions!.push(row.experimentAccession);\n root.allRowInfo!.push(row);\n });\n // standardize the order of the assay folders everytime one is added\n root.children!.sort((a, b): number => {\n return ontologyTypes.indexOf(a.id) - ontologyTypes.indexOf(b.id);\n });\n return [root];\n}\n\n/**\n * Fuzzy search of active tracks.\n *\n * @param treeItems - TreeBaseViewItems from the tree.\n * @param query - The search query string.\n * @param keyWeightMap - Array of keys to search within each track object.\n * Can look like [\"name\", \"author\"] or if weighted, [\n {\n name: 'title',\n weight: 0.3\n },\n {\n name: 'author',\n weight: 0.7\n }\n ].\n * @param threshold - (Optional) Threshold for the fuzzy search (default is 0.5).\n * Smaller = stricter match, larger = fuzzier since 0 is perfect match and 1 is worst match.\n * @param limit - (Optional) Maximum number of results to return (default is 10).\n * @returns FuseResult object containing the search results.\n */\nexport function searchTreeItems({\n treeItems,\n query,\n keyWeightMap,\n threshold,\n limit = 10\n}: SearchTracksProps): FuseResult<RowInfo>[] {\n const data = treeItems![0].allRowInfo ?? [];\n const fuse = new Fuse(data, {\n includeScore: true,\n shouldSort: true,\n threshold: threshold,\n keys: keyWeightMap,\n });\n return fuse.search(query, { limit: limit });\n}\n\n/**\n * Creates the assay icon for DataGrid and RichTreeView\n * @param type: assay type\n * @returns an icon of the assay's respective color\n */\nexport function AssayIcon(type: string) {\n const colorMap: { [key: string]: string } = {\n DNase: \"#06da93\",\n ATAC: \"#02c7b9\",\n H3K4me3: \"#ff2020\",\n ChromHMM: \"#0097a7\",\n H3K27ac: \"#fdc401\",\n CTCF: \"#01a6f1\",\n };\n const color = colorMap[type];\n return (\n <Box\n sx={{\n width: 12,\n height: 12,\n borderRadius: \"20%\",\n bgcolor: color,\n }}\n />\n );\n}\n\n// Everything below is styling for the custom directory look of the tree view\nconst TreeItemRoot = styled(\"li\")(({ theme }) => ({\n listStyle: \"none\",\n margin: 0,\n padding: 0,\n outline: 4,\n color: theme.palette.grey[400],\n ...theme.applyStyles(\"light\", {\n color: theme.palette.grey[600], // controls colors of the MUI icons\n }),\n}));\n\nconst TreeItemLabelText = styled(Typography)({\n color: \"black\",\n fontFamily: \"inherit\",\n});\n\nfunction CustomLabel({ icon: Icon, children, isAssayItem, ...other }: CustomLabelProps) {\n const variant = isAssayItem ? \"subtitle2\" : \"body2\";\n const fontWeight = isAssayItem ? \"bold\" : 500;\n return (\n <TreeItemLabel\n {...other}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {Icon && React.isValidElement(Icon) ? (\n <Box className=\"labelIcon\" sx={{ mr: 1 }}>\n {Icon}\n </Box>\n ) : (\n <Box\n component={Icon as React.ElementType}\n className=\"labelIcon\"\n color=\"inherit\"\n sx={{ mr: 1, fontSize: \"1.2rem\" }}\n />\n )}\n <Stack direction=\"row\" spacing={2} alignItems=\"center\">\n { isAssayItem && AssayIcon(other.id) }\n <TreeItemLabelText fontWeight={fontWeight} variant={variant}>{children}</TreeItemLabelText>\n </Stack>\n </TreeItemLabel>\n );\n}\n\nconst TreeItemContent = styled(\"div\")(({ theme }) => ({\n padding: theme.spacing(0.5),\n paddingRight: theme.spacing(2),\n paddingLeft: `calc(${theme.spacing(1)} + var(--TreeView-itemChildrenIndentation) * var(--TreeView-itemDepth))`,\n width: \"100%\",\n boxSizing: \"border-box\", // prevent width + padding to overflow\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n gap: theme.spacing(1),\n cursor: \"pointer\",\n WebkitTapHighlightColor: \"transparent\",\n flexDirection: \"row-reverse\",\n borderRadius: theme.spacing(0.7),\n marginBottom: theme.spacing(0.5),\n marginTop: theme.spacing(0.5),\n fontWeight: 500,\n [`&[data-focused], &[data-selected]`]: {\n backgroundColor: theme.palette.primary.dark,\n color: theme.palette.primary.contrastText,\n ...theme.applyStyles(\"light\", {\n backgroundColor: theme.palette.primary.main,\n }),\n },\n \"&:not([data-focused], [data-selected]):hover\": {\n backgroundColor: alpha(theme.palette.primary.main, 0.1),\n color: \"white\",\n ...theme.applyStyles(\"light\", {\n color: theme.palette.primary.main,\n }),\n },\n}));\n\nconst getIconFromTreeItemType = (itemType: string) => {\n switch (itemType) {\n case \"folder\":\n return Folder;\n case \"removeable\":\n return IndeterminateCheckBoxRoundedIcon;\n default:\n return AssayIcon(itemType);\n }\n};\n\nexport const CustomTreeItem = React.forwardRef(function CustomTreeItem(\n props: CustomTreeItemProps,\n ref: React.Ref<HTMLLIElement>,\n) {\n const { id, itemId, label, disabled, children, onRemove, ...other } = props;\n\n const {\n getContextProviderProps,\n getRootProps,\n getContentProps,\n getIconContainerProps,\n getCheckboxProps,\n getLabelProps,\n getGroupTransitionProps,\n status,\n } = useTreeItem({ id, itemId, children, label, disabled, rootRef: ref });\n\n const item = useTreeItemModel<ExtendedTreeItemProps>(itemId)!;\n const icon = getIconFromTreeItemType(item.icon);\n\n const handleRemoveIconClick = (e: React.MouseEvent) => {\n e.stopPropagation(); // prevent item expand/select\n onRemove?.(item);\n };\n\n return (\n <TreeItemProvider {...getContextProviderProps()}>\n <TreeItemRoot {...getRootProps(other)}>\n <TreeItemContent {...getContentProps()}>\n <TreeItemIconContainer {...getIconContainerProps()}>\n <TreeItemIcon status={status} />\n </TreeItemIconContainer>\n <TreeItemCheckbox {...getCheckboxProps()} />\n <CustomLabel\n {...getLabelProps({\n icon:\n item.icon === \"removeable\" ? (\n <Box\n onClick={handleRemoveIconClick}\n sx={{\n width: 20,\n height: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n mr: 1,\n \"&:hover\": {\n backgroundColor: \"rgba(0,0,0,0.1)\",\n },\n }}\n >\n <IndeterminateCheckBoxRoundedIcon fontSize=\"small\" />\n </Box>\n ) : (\n icon\n ),\n expandable: (status.expandable && status.expanded).toString(),\n isAssayItem: item.isAssayItem,\n id: item.id\n })}\n />\n </TreeItemContent>\n {children && <Collapse {...getGroupTransitionProps()} />}\n </TreeItemRoot>\n </TreeItemProvider>\n );\n});","import { GridColDef } from \"@mui/x-data-grid-premium\";\nimport { RowInfo } from \"../types\";\nimport { Stack, capitalize } from \"@mui/material\";\nimport { AssayIcon } from \"../TreeView/treeViewHelpers\";\nimport { ontologyTypes, assayTypes } from \"../consts\";\n\nconst displayNameCol: GridColDef<RowInfo> = {\n field: \"displayname\",\n headerName: \"Name\",\n valueFormatter: (value) => value && capitalize(value),\n maxWidth: 300,\n};\n\nconst sortedByAssayOntologyCol: GridColDef<RowInfo> = {\n field: \"ontology\",\n headerName: \"Ontology\",\n type: \"singleSelect\",\n valueOptions: ontologyTypes,\n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <div><b>{val}</b></div>\n )\n }\n },\n};\n\nconst sortedByAssayAssayCol : GridColDef<RowInfo> = { \n field: \"assay\", \n headerName: \"Assay\",\n valueOptions: assayTypes, \n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <Stack direction=\"row\" spacing={2} alignItems=\"center\">\n {AssayIcon(val)}\n <div><b>{val}</b></div>\n </Stack>\n )\n }\n }\n}\n\nconst defaultOntologyCol: GridColDef<RowInfo> = {\n field: \"ontology\",\n headerName: \"Ontology\",\n type: \"singleSelect\",\n valueOptions: ontologyTypes,\n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <div><b>{val}</b></div>\n )\n }\n }\n};\n\nconst defaultAssayCol: GridColDef<RowInfo> = { \n field: \"assay\", \n headerName: \"Assay\",\n valueOptions: assayTypes,\n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <Stack direction=\"row\" spacing={2} alignItems=\"center\">\n {AssayIcon(val)}\n <div>{val}</div>\n </Stack>\n )\n }\n }\n}\n\nconst sampleTypeCol: GridColDef<RowInfo> = {\n field: \"sampleType\",\n headerName: \"Sample Type\",\n type: \"singleSelect\",\n valueOptions: [\"tissue\", \"primary cell\", \"cell line\", \"in vitro differentiated cells\", \"organoid\"],\n valueFormatter: (value) => value && capitalize(value),\n};\n\nconst lifeStageCol: GridColDef<RowInfo> = {\n field: \"lifeStage\",\n headerName: \"Life Stage\",\n type: \"singleSelect\",\n valueOptions: [\"adult\", \"embryonic\"],\n valueFormatter: (value) => value && capitalize(value),\n};\n\nconst experimentCol: GridColDef<RowInfo> = { \n field: \"experimentAccession\", \n headerName: \"Experiment Accession\" \n}\n\nconst fileCol: GridColDef<RowInfo> = {\n field: \"fileAccession\", \n headerName: \"File Accession\"\n}\n\nexport const sortedByAssayColumns: GridColDef<RowInfo>[] = [\n displayNameCol,\n sortedByAssayOntologyCol,\n sampleTypeCol,\n lifeStageCol,\n sortedByAssayAssayCol,\n experimentCol,\n fileCol\n]\n\nexport const defaultColumns: GridColDef<RowInfo>[] = [\n displayNameCol,\n sampleTypeCol,\n lifeStageCol,\n defaultOntologyCol,\n defaultAssayCol,\n experimentCol,\n fileCol\n]","import { Box, Paper } from \"@mui/material\";\nimport {\n DataGridPremium,\n GridToolbarProps,\n ToolbarPropsOverrides,\n GridAutosizeOptions,\n useGridApiRef,\n GridColDef,\n FilterColumnsArgs,\n} from \"@mui/x-data-grid-premium\";\nimport { DataGridProps } from \"../types\";\nimport { CustomToolbar } from \"./CustomToolbar\";\nimport { useEffect, useMemo } from \"react\";\nimport { sortedByAssayColumns, defaultColumns } from \"./columns\";\n\nconst autosizeOptions: GridAutosizeOptions = {\n expand: true,\n includeHeaders: true,\n outliersFactor: 1.5,\n};\n\n// TODO: figure out where mui stores the number of rows in a row grouping so that can be bolded too\nexport function DataGridWrapper(props: DataGridProps) {\n const {\n label,\n labelTooltip,\n downloadFileName,\n toolbarSlot,\n toolbarStyle,\n toolbarIconColor,\n sortedAssay,\n handleSelection,\n rows,\n selectedTracks,\n } = props;\n\n const CustomToolbarWrapper = useMemo(() => {\n const customToolbarProps = {\n label,\n downloadFileName,\n labelTooltip,\n toolbarSlot,\n toolbarStyle,\n toolbarIconColor,\n };\n return (props: GridToolbarProps & ToolbarPropsOverrides) => (\n <CustomToolbar {...props} {...customToolbarProps} />\n );\n }, [label, labelTooltip, toolbarSlot]);\n\n const apiRef = useGridApiRef();\n const groupingModel = sortedAssay\n ? [\"assay\", \"ontology\"]\n : [\"ontology\", \"assay\"];\n const columnModel = sortedAssay ? sortedByAssayColumns : defaultColumns;\n\n // functions to customize the column and filter panel in the toolbar\n const filterColumns = ({ columns }: FilterColumnsArgs) => {\n return columns\n .filter((column) => column.type !== \"custom\")\n .map((column) => column.field);\n };\n\n const getTogglableColumns = (columns: GridColDef[]) => {\n return columns\n .filter((column) => column.type !== \"custom\")\n .map((column) => column.field);\n };\n\n const handleResizeCols = () => {\n // need to check .autosizeColumns since the current was being set with an empty object\n if (!apiRef.current?.autosizeColumns) return;\n apiRef.current.autosizeColumns(autosizeOptions);\n };\n\n // trigger resize when rows or columns change so that rows/columns don't need to be memoized outisde of this component\n // otherwise sometimes would snap back to default widths when rows/columns change\n useEffect(() => {\n handleResizeCols();\n }, [rows, defaultColumns, sortedByAssayColumns, handleResizeCols]);\n\n return (\n <Paper sx={{ width: \"100%\" }}>\n <Box\n sx={{\n height: 500,\n width: \"100%\",\n overflow: \"auto\",\n }}\n >\n <DataGridPremium\n apiRef={apiRef}\n rows={rows}\n columns={columnModel}\n getRowId={(row) => row.experimentAccession}\n autosizeOptions={autosizeOptions}\n rowGroupingModel={groupingModel}\n groupingColDef={{ leafField: \"displayname\", display: \"flex\" }}\n columnVisibilityModel={{ displayname: false }} // so you don't see a second name column\n onRowSelectionModelChange={handleSelection}\n rowSelectionPropagation={{ descendants: true }}\n disableRowGrouping={false}\n rowSelectionModel={{\n type: \"include\",\n ids: new Set(selectedTracks.keys()),\n }}\n slots={{\n toolbar: CustomToolbarWrapper,\n }}\n slotProps={{\n filterPanel: {\n filterFormProps: {\n filterColumns,\n },\n },\n columnsManagement: {\n getTogglableColumns,\n },\n }}\n keepNonExistentRowsSelected\n showToolbar\n disableAggregation\n disableRowSelectionExcludeModel\n disablePivoting\n checkboxSelection\n autosizeOnMount\n pagination\n hideFooterSelectedRowCount\n />\n </Box>\n </Paper>\n );\n}\n","import { Box, Paper, Typography } from \"@mui/material\";\nimport { RichTreeView, TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport { rowById } from \"../consts\";\nimport {\n CustomTreeItemProps,\n ExtendedTreeItemProps,\n TreeViewWrapperProps,\n} from \"../types\";\nimport { CustomTreeItem } from \"./treeViewHelpers\";\nimport { Avatar } from \"@mui/material\";\n\nexport function TreeViewWrapper({\n store,\n items,\n activeTracks,\n isSearchResult,\n}: TreeViewWrapperProps) {\n const removeIds = store((s) => s.removeIds);\n\n const handleRemoveTreeItem = (\n item: TreeViewBaseItem<ExtendedTreeItemProps>,\n ) => {\n const removedIds = item.allExpAccessions;\n if (removedIds && removedIds.length) {\n const idsToRemove = new Set(removedIds);\n\n // Also remove any auto-generated group IDs that contain these tracks\n removedIds.forEach((id) => {\n const row = rowById.get(id);\n if (row) {\n // Add the auto-generated group IDs for this track's ontology and assay\n idsToRemove.add(`auto-generated-row-ontology/${row.ontology}`);\n idsToRemove.add(\n `auto-generated-row-ontology/${row.ontology}-assay/${row.assay}`,\n );\n idsToRemove.add(`auto-generated-row-assay/${row.assay}`);\n idsToRemove.add(\n `auto-generated-row-assay/${row.assay}-ontology/${row.ontology}`,\n );\n }\n });\n removeIds(idsToRemove);\n }\n };\n\n return (\n <Paper\n sx={{\n height: 500,\n width: \"100%\",\n border: \"10px solid\",\n borderColor: \"grey.200\",\n boxSizing: \"border-box\",\n borderRadius: 2,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n py: 1,\n backgroundColor: \"grey.200\",\n flexShrink: 0,\n }}\n >\n <Avatar\n sx={{\n width: 30,\n height: 30,\n fontSize: 14,\n fontWeight: \"bold\",\n bgcolor: \"white\",\n color: \"text.primary\",\n }}\n >\n {activeTracks.size}\n </Avatar>\n <Typography fontWeight=\"bold\">\n Active Tracks\n {isSearchResult && (\n <Typography component=\"span\" color=\"text.secondary\" sx={{ ml: 1 }}>\n ({items[0].allRowInfo!.length} search results)\n </Typography>\n )}\n </Typography>\n </Box>\n <Box\n sx={{\n flex: 1,\n overflow: \"auto\",\n }}\n >\n <RichTreeView\n items={items}\n defaultExpandedItems={[\"1\"]}\n slots={{ item: CustomTreeItem }}\n slotProps={{\n item: {\n onRemove: handleRemoveTreeItem,\n } as Partial<CustomTreeItemProps>,\n }}\n sx={{\n ml: 1,\n mr: 1,\n height: \"100%\",\n }}\n itemChildrenIndentation={0}\n />\n </Box>\n </Paper>\n );\n}\n","import {\n Box,\n Stack,\n TextField,\n FormControlLabel,\n Switch,\n Button,\n} from \"@mui/material\";\nimport { DataGridWrapper } from \"./DataGrid/DataGridWrapper\";\nimport { searchTracks, flattenIntoRow } from \"./DataGrid/dataGridHelpers\";\nimport { TreeViewWrapper } from \"./TreeView/TreeViewWrapper\";\nimport {\n buildSortedAssayTreeView,\n buildTreeView,\n searchTreeItems,\n} from \"./TreeView/treeViewHelpers\";\nimport { SearchTracksProps, ExtendedTreeItemProps, RowInfo } from \"./types\";\nimport { rows, rowById } from \"./consts\";\nimport React, { useState, useMemo, useEffect } from \"react\";\nimport { TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport { GridRowSelectionModel } from \"@mui/x-data-grid\";\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n} from \"@mui/material\";\nimport { SelectionStoreInstance } from \"./store\";\n\nexport interface TrackSelectProps {\n store: SelectionStoreInstance;\n}\n\nexport default function TrackSelect({ store }: TrackSelectProps) {\n const [limitDialogOpen, setLimitDialogOpen] = useState(false);\n const [sortedAssay, setSortedAssay] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isSearchResult, setIsSearchResult] = useState(false);\n const selectedTracks = store((s) => s.selectedTracks);\n const setSelected = store((s) => s.setSelected);\n const clear = store((s) => s.clear);\n const MAX_ACTIVE = store((s) => s.maxTracks);\n\n // Derive active tracks from selectedTracks (all keys are real track IDs)\n const activeTracks = useMemo(\n () => new Set(selectedTracks.keys()),\n [selectedTracks],\n );\n\n const treeItems = useMemo(() => {\n return sortedAssay\n ? buildSortedAssayTreeView(\n Array.from(selectedTracks.keys()),\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n )\n : buildTreeView(\n Array.from(selectedTracks.keys()),\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n );\n }, [selectedTracks, sortedAssay]);\n\n const [filteredRows, setFilteredRows] = useState(rows);\n const [filteredTreeItems, setFilteredTreeItems] = useState([\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n ] as TreeViewBaseItem<ExtendedTreeItemProps>[]);\n\n useEffect(() => {\n if (searchQuery === \"\") {\n setFilteredTreeItems(treeItems);\n setFilteredRows(rows);\n setIsSearchResult(false);\n }\n }, [treeItems, searchQuery]);\n\n const handleToggle = () => {\n setSortedAssay(!sortedAssay);\n };\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.target.value);\n\n const dataGridSearchProps: SearchTracksProps = {\n jsonStructure: \"tracks\",\n query: e.target.value,\n keyWeightMap: [\n \"displayname\",\n \"ontology\",\n \"lifeStage\",\n \"sampleType\",\n \"type\",\n \"experimentAccession\",\n \"fileAccession\",\n ],\n };\n\n const treeSearchProps: SearchTracksProps = {\n treeItems: treeItems,\n query: e.target.value,\n keyWeightMap: [\n \"displayname\",\n \"ontology\",\n \"lifeStage\",\n \"sampleType\",\n \"type\",\n \"experimentAccession\",\n \"fileAccession\",\n ],\n };\n const newDataGridRows = searchTracks(dataGridSearchProps)\n .map((t) => t.item)\n .map(flattenIntoRow);\n\n // we only want the intersection of filtered tracks displayed on the DataGrid and user-selected tracks to be displayed on the tree\n const newDataGridIds = newDataGridRows.map((r) => r.experimentAccession);\n const retIds = searchTreeItems(treeSearchProps).map(\n (r) => r.item.experimentAccession,\n );\n const newTreeIds = retIds.filter((i) => newDataGridIds.includes(i));\n\n // build new tree from the newTreeIds...maybe it would be faster to prune the current tree instead of rebuilding it?\n const newTreeItems = sortedAssay\n ? buildSortedAssayTreeView(\n newTreeIds,\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n )\n : buildTreeView(\n newTreeIds,\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n );\n\n setFilteredRows(newDataGridRows);\n setIsSearchResult(true);\n setFilteredTreeItems(newTreeItems);\n };\n\n const handleSelection = (newSelection: GridRowSelectionModel) => {\n const idsSet =\n (newSelection && (newSelection as any).ids) ?? new Set<string>();\n\n // Build a Map of only real track IDs (filter out auto-generated group IDs)\n const newTracks = new Map<string, RowInfo>();\n idsSet.forEach((id: string) => {\n const row = rowById.get(id);\n if (row) {\n newTracks.set(id, row);\n }\n });\n\n // Block only if the new selection would exceed the limit\n if (newTracks.size > MAX_ACTIVE) {\n setLimitDialogOpen(true);\n return;\n }\n\n setSelected(newTracks);\n };\n\n return (\n <Box sx={{ flex: 1 }}>\n <Box display=\"flex\" justifyContent=\"space-between\" sx={{ mb: 3 }}>\n <TextField\n id=\"outlined-suffix-shrink\"\n label=\"Search tracks\"\n variant=\"outlined\"\n onChange={handleSearch}\n sx={{ width: \"400px\" }}\n />\n <FormControlLabel\n sx={{ display: \"flex\", justifyContent: \"flex-end\", mb: 1 }}\n value=\"Sort by assay\"\n control={<Switch color=\"primary\" onChange={handleToggle} />}\n label=\"Sort by assay\"\n labelPlacement=\"end\"\n />\n </Box>\n <Stack direction=\"row\" spacing={2} sx={{ width: \"100%\" }}>\n <Box sx={{ flex: 3, minWidth: 0 }}>\n <DataGridWrapper\n rows={filteredRows}\n label={\n isSearchResult\n ? `${filteredRows.length} Search Results`\n : `${rows.length} Available Tracks`\n }\n selectedTracks={selectedTracks}\n handleSelection={handleSelection}\n sortedAssay={sortedAssay}\n />\n </Box>\n <Box sx={{ flex: 2, minWidth: 0 }}>\n <TreeViewWrapper\n store={store}\n items={filteredTreeItems}\n selectedTracks={selectedTracks}\n activeTracks={activeTracks}\n isSearchResult={isSearchResult}\n />\n </Box>\n </Stack>\n <Box sx={{ justifyContent: \"flex-end\" }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={clear}\n sx={{ mt: 2, justifyContent: \"flex-end\" }}\n >\n Clear Selection\n </Button>\n </Box>\n <Dialog open={limitDialogOpen} onClose={() => setLimitDialogOpen(false)}>\n <DialogTitle>Track Limit Reached</DialogTitle>\n <DialogContent>\n <DialogContentText>\n You can select up to {MAX_ACTIVE} tracks at a time. Please remove a\n track before adding another.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setLimitDialogOpen(false)} autoFocus>\n OK\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n}\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n","import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createState ? createImpl(createState) : createImpl);\n\nexport { create, useStore };\n","import { create, StoreApi, UseBoundStore } from \"zustand\";\nimport { SelectionState, SelectionAction, RowInfo } from \"./types\";\n\nexport type SelectionStoreInstance = UseBoundStore<\n StoreApi<SelectionState & SelectionAction>\n>;\n\nexport function createSelectionStore(initialTracks?: Map<string, RowInfo>) {\n return create<SelectionState & SelectionAction>((set, get) => ({\n maxTracks: 30,\n selectedTracks: initialTracks ? new Map(initialTracks) : new Map<string, RowInfo>(),\n selectedIds: () => new Set(get().selectedTracks.keys()),\n setSelected: (tracks: Map<string, RowInfo>) =>\n set(() => ({\n selectedTracks: new Map(tracks),\n })),\n removeIds: (removedIds: Set<string>) =>\n set((state) => {\n const next = new Map(state.selectedTracks);\n removedIds.forEach((id) => {\n next.delete(id);\n });\n return { selectedTracks: next };\n }),\n clear: () => set(() => ({ selectedTracks: new Map<string, RowInfo>() })),\n }));\n}\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","CustomToolbar","label","downloadFileName","labelTooltip","toolbarSlot","toolbarStyle","toolbarIconColor","restToolbarProps","exportMenuOpen","setExportMenuOpen","exportMenuTriggerRef","iconColor","Toolbar","jsxs","Typography","jsx","Tooltip","InfoOutline","Fragment","Divider","ColumnsPanelTrigger","ToolbarButton","ViewColumnIcon","FilterPanelTrigger","state","Badge","FilterListIcon","FileDownloadIcon","Menu","ExportPrint","MenuItem","ExportCsv","ExportExcel","isArray","getTag","baseToString","result","toString","isString","isNumber","isBoolean","isObjectLike","isObject","isDefined","isBlank","INCORRECT_INDEX_TYPE","LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY","PATTERN_LENGTH_TOO_LARGE","max","MISSING_KEY_PROPERTY","INVALID_KEY_WEIGHT_VALUE","hasOwn","KeyStore","totalWeight","obj","createKey","keyId","path","id","src","weight","getFn","createKeyPath","createKeyId","get","list","arr","deepGet","index","i","len","MatchOptions","BasicOptions","a","b","FuzzyOptions","AdvancedOptions","Config","SPACE","norm","mantissa","cache","m","numTokens","FuseIndex","fieldNormWeight","docs","records","idx","doc","docIndex","item","record","keyIndex","subRecords","stack","nestedArrIndex","subRecord","createIndex","myIndex","parseIndex","data","computeScore$1","pattern","errors","currentLocation","expectedLocation","distance","ignoreLocation","accuracy","proximity","convertMaskToIndices","matchmask","minMatchCharLength","indices","start","end","match","MAX_BITS","search","text","patternAlphabet","location","threshold","findAllMatches","includeMatches","patternLen","textLen","currentThreshold","bestLocation","computeMatches","matchMask","score","lastBitArr","finalScore","binMax","mask","binMin","binMid","finish","bitArr","j","charMatch","createPatternAlphabet","char","stripDiacritics","str","BitapSearch","isCaseSensitive","ignoreDiacritics","addChunk","startIndex","remainder","allIndices","totalScore","hasMatches","alphabet","isMatch","BaseMatch","getMatch","exp","matches","ExactMatch","InverseExactMatch","PrefixExactMatch","InversePrefixExactMatch","SuffixExactMatch","InverseSuffixExactMatch","FuzzyMatch","IncludeMatch","searchers","searchersLen","SPACE_RE","OR_TOKEN","parseQuery","options","query","results","queryItem","found","searcher","token","MultiMatchSet","ExtendedSearch","_","numMatches","qLen","pLen","registeredSearchers","register","args","createSearcher","searcherClass","LogicalOperator","KeyType","isExpression","isPath","isLeaf","convertToExplicit","parse","auto","next","isQueryPath","computeScore","ignoreFieldNorm","transformMatches","transformScore","format","includeScore","transformers","transformer","Fuse","predicate","limit","shouldSort","sortFn","expression","evaluate","res","child","resultMap","expResults","formatAssayType","assay","getNestedValue","acc","getTracksByAssayAndOntology","ontology","tracksData","track","filteredAssays","_a","e","flattenIntoRow","lifeStage","sampleType","displayname","experimentAccession","fileAccession","url","capitalize","searchTracks","jsonStructure","keyWeightMap","assayTypes","ontologyTypes","rows","r","rowById","buildSortedAssayTreeView","selectedIds","root","assayMap","ontologyMap","sampleAssayMap","row","assayNode","ontologyNode","displayNameNode","expNode","buildTreeView","displayNameMap","searchTreeItems","treeItems","AssayIcon","color","Box","TreeItemRoot","styled","theme","TreeItemLabelText","CustomLabel","Icon","isAssayItem","other","variant","fontWeight","TreeItemLabel","Stack","TreeItemContent","alpha","getIconFromTreeItemType","itemType","Folder","IndeterminateCheckBoxRoundedIcon","CustomTreeItem","ref","itemId","disabled","onRemove","getContextProviderProps","getRootProps","getContentProps","getIconContainerProps","getCheckboxProps","getLabelProps","getGroupTransitionProps","status","useTreeItem","useTreeItemModel","icon","handleRemoveIconClick","TreeItemProvider","TreeItemIconContainer","TreeItemIcon","TreeItemCheckbox","Collapse","displayNameCol","sortedByAssayOntologyCol","params","val","sortedByAssayAssayCol","defaultOntologyCol","defaultAssayCol","sampleTypeCol","lifeStageCol","experimentCol","fileCol","sortedByAssayColumns","defaultColumns","autosizeOptions","DataGridWrapper","sortedAssay","handleSelection","selectedTracks","CustomToolbarWrapper","useMemo","customToolbarProps","apiRef","useGridApiRef","groupingModel","columnModel","filterColumns","columns","column","getTogglableColumns","handleResizeCols","useEffect","Paper","DataGridPremium","TreeViewWrapper","store","items","activeTracks","isSearchResult","removeIds","s","handleRemoveTreeItem","removedIds","idsToRemove","Avatar","RichTreeView","TrackSelect","limitDialogOpen","setLimitDialogOpen","useState","setSortedAssay","searchQuery","setSearchQuery","setIsSearchResult","setSelected","clear","MAX_ACTIVE","filteredRows","setFilteredRows","filteredTreeItems","setFilteredTreeItems","handleToggle","handleSearch","dataGridSearchProps","treeSearchProps","newDataGridRows","t","newDataGridIds","newTreeIds","newTreeItems","newSelection","idsSet","newTracks","TextField","FormControlLabel","Switch","Button","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","createStoreImpl","createState","listeners","setState","partial","replace","nextState","previousState","listener","getState","api","initialState","createStore","identity","arg","useStore","selector","slice","createImpl","useBoundStore","create","createSelectionStore","initialTracks","set","tracks"],"mappings":"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","x_google_ignoreList":[0,1,2,4,12,13]}
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
GridAutosizeOptions,
|
|
7
7
|
useGridApiRef,
|
|
8
8
|
GridColDef,
|
|
9
|
-
FilterColumnsArgs
|
|
9
|
+
FilterColumnsArgs,
|
|
10
10
|
} from "@mui/x-data-grid-premium";
|
|
11
11
|
import { DataGridProps } from "../types";
|
|
12
12
|
import { CustomToolbar } from "./CustomToolbar";
|
|
@@ -31,7 +31,7 @@ export function DataGridWrapper(props: DataGridProps) {
|
|
|
31
31
|
sortedAssay,
|
|
32
32
|
handleSelection,
|
|
33
33
|
rows,
|
|
34
|
-
selectedTracks
|
|
34
|
+
selectedTracks,
|
|
35
35
|
} = props;
|
|
36
36
|
|
|
37
37
|
const CustomToolbarWrapper = useMemo(() => {
|
|
@@ -43,20 +43,28 @@ export function DataGridWrapper(props: DataGridProps) {
|
|
|
43
43
|
toolbarStyle,
|
|
44
44
|
toolbarIconColor,
|
|
45
45
|
};
|
|
46
|
-
return (props: GridToolbarProps & ToolbarPropsOverrides) =>
|
|
46
|
+
return (props: GridToolbarProps & ToolbarPropsOverrides) => (
|
|
47
|
+
<CustomToolbar {...props} {...customToolbarProps} />
|
|
48
|
+
);
|
|
47
49
|
}, [label, labelTooltip, toolbarSlot]);
|
|
48
50
|
|
|
49
51
|
const apiRef = useGridApiRef();
|
|
50
|
-
const groupingModel = sortedAssay
|
|
52
|
+
const groupingModel = sortedAssay
|
|
53
|
+
? ["assay", "ontology"]
|
|
54
|
+
: ["ontology", "assay"];
|
|
51
55
|
const columnModel = sortedAssay ? sortedByAssayColumns : defaultColumns;
|
|
52
56
|
|
|
53
|
-
// functions to customize the column and filter panel in the toolbar
|
|
57
|
+
// functions to customize the column and filter panel in the toolbar
|
|
54
58
|
const filterColumns = ({ columns }: FilterColumnsArgs) => {
|
|
55
|
-
return columns
|
|
59
|
+
return columns
|
|
60
|
+
.filter((column) => column.type !== "custom")
|
|
61
|
+
.map((column) => column.field);
|
|
56
62
|
};
|
|
57
63
|
|
|
58
64
|
const getTogglableColumns = (columns: GridColDef[]) => {
|
|
59
|
-
return columns
|
|
65
|
+
return columns
|
|
66
|
+
.filter((column) => column.type !== "custom")
|
|
67
|
+
.map((column) => column.field);
|
|
60
68
|
};
|
|
61
69
|
|
|
62
70
|
const handleResizeCols = () => {
|
|
@@ -73,11 +81,13 @@ export function DataGridWrapper(props: DataGridProps) {
|
|
|
73
81
|
|
|
74
82
|
return (
|
|
75
83
|
<Paper sx={{ width: "100%" }}>
|
|
76
|
-
<Box
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
84
|
+
<Box
|
|
85
|
+
sx={{
|
|
86
|
+
height: 500,
|
|
87
|
+
width: "100%",
|
|
88
|
+
overflow: "auto",
|
|
89
|
+
}}
|
|
90
|
+
>
|
|
81
91
|
<DataGridPremium
|
|
82
92
|
apiRef={apiRef}
|
|
83
93
|
rows={rows}
|
|
@@ -89,7 +99,11 @@ export function DataGridWrapper(props: DataGridProps) {
|
|
|
89
99
|
columnVisibilityModel={{ displayname: false }} // so you don't see a second name column
|
|
90
100
|
onRowSelectionModelChange={handleSelection}
|
|
91
101
|
rowSelectionPropagation={{ descendants: true }}
|
|
92
|
-
|
|
102
|
+
disableRowGrouping={false}
|
|
103
|
+
rowSelectionModel={{
|
|
104
|
+
type: "include",
|
|
105
|
+
ids: new Set(selectedTracks.keys()),
|
|
106
|
+
}}
|
|
93
107
|
slots={{
|
|
94
108
|
toolbar: CustomToolbarWrapper,
|
|
95
109
|
}}
|