@luokuiai/lumen-ui 1.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/index.js +4572 -0
  2. package/dist/index.js.map +1 -0
  3. package/dist/lumen-ui.css +1 -0
  4. package/dist/theme-contract.js +74 -0
  5. package/dist/theme-contract.js.map +1 -0
  6. package/dist/types/components/Avatar.d.ts +14 -0
  7. package/dist/types/components/Avatar.d.ts.map +1 -0
  8. package/dist/types/components/Badge.d.ts +14 -0
  9. package/dist/types/components/Badge.d.ts.map +1 -0
  10. package/dist/types/components/Button.d.ts +11 -0
  11. package/dist/types/components/Button.d.ts.map +1 -0
  12. package/dist/types/components/Checkbox.d.ts +13 -0
  13. package/dist/types/components/Checkbox.d.ts.map +1 -0
  14. package/dist/types/components/ConfirmDialog.d.ts +19 -0
  15. package/dist/types/components/ConfirmDialog.d.ts.map +1 -0
  16. package/dist/types/components/DatePicker.d.ts +35 -0
  17. package/dist/types/components/DatePicker.d.ts.map +1 -0
  18. package/dist/types/components/DateTimePicker.d.ts +16 -0
  19. package/dist/types/components/DateTimePicker.d.ts.map +1 -0
  20. package/dist/types/components/Drawer.d.ts +17 -0
  21. package/dist/types/components/Drawer.d.ts.map +1 -0
  22. package/dist/types/components/DropdownMenu.d.ts +24 -0
  23. package/dist/types/components/DropdownMenu.d.ts.map +1 -0
  24. package/dist/types/components/FileUpload.d.ts +27 -0
  25. package/dist/types/components/FileUpload.d.ts.map +1 -0
  26. package/dist/types/components/FormField.d.ts +23 -0
  27. package/dist/types/components/FormField.d.ts.map +1 -0
  28. package/dist/types/components/Input.d.ts +11 -0
  29. package/dist/types/components/Input.d.ts.map +1 -0
  30. package/dist/types/components/Modal.d.ts +15 -0
  31. package/dist/types/components/Modal.d.ts.map +1 -0
  32. package/dist/types/components/Pagination.d.ts +18 -0
  33. package/dist/types/components/Pagination.d.ts.map +1 -0
  34. package/dist/types/components/Radio.d.ts +12 -0
  35. package/dist/types/components/Radio.d.ts.map +1 -0
  36. package/dist/types/components/SegmentedControl.d.ts +16 -0
  37. package/dist/types/components/SegmentedControl.d.ts.map +1 -0
  38. package/dist/types/components/Select.d.ts +87 -0
  39. package/dist/types/components/Select.d.ts.map +1 -0
  40. package/dist/types/components/Switch.d.ts +12 -0
  41. package/dist/types/components/Switch.d.ts.map +1 -0
  42. package/dist/types/components/Tabs.d.ts +23 -0
  43. package/dist/types/components/Tabs.d.ts.map +1 -0
  44. package/dist/types/components/Textarea.d.ts +10 -0
  45. package/dist/types/components/Textarea.d.ts.map +1 -0
  46. package/dist/types/components/TimePicker.d.ts +14 -0
  47. package/dist/types/components/TimePicker.d.ts.map +1 -0
  48. package/dist/types/components/TimeSelector.d.ts +18 -0
  49. package/dist/types/components/TimeSelector.d.ts.map +1 -0
  50. package/dist/types/components/Timeline.d.ts +23 -0
  51. package/dist/types/components/Timeline.d.ts.map +1 -0
  52. package/dist/types/components/Toast.d.ts +14 -0
  53. package/dist/types/components/Toast.d.ts.map +1 -0
  54. package/dist/types/components/Tooltip.d.ts +31 -0
  55. package/dist/types/components/Tooltip.d.ts.map +1 -0
  56. package/dist/types/components/TreeSelect.d.ts +30 -0
  57. package/dist/types/components/TreeSelect.d.ts.map +1 -0
  58. package/dist/types/components/classNames.d.ts +2 -0
  59. package/dist/types/components/classNames.d.ts.map +1 -0
  60. package/dist/types/components/designTokens.d.ts +165 -0
  61. package/dist/types/components/designTokens.d.ts.map +1 -0
  62. package/dist/types/components/dropdownMotion.d.ts +2 -0
  63. package/dist/types/components/dropdownMotion.d.ts.map +1 -0
  64. package/dist/types/components/tooltip-positions.d.ts +33 -0
  65. package/dist/types/components/tooltip-positions.d.ts.map +1 -0
  66. package/dist/types/index.d.ts +28 -0
  67. package/dist/types/index.d.ts.map +1 -0
  68. package/dist/types/theme-contract.d.ts +9 -0
  69. package/dist/types/theme-contract.d.ts.map +1 -0
  70. package/package.json +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../node_modules/.bun/react@19.2.8/node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/.bun/react@19.2.8/node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/.bun/react@19.2.8/node_modules/react/jsx-runtime.js","../src/components/classNames.ts","../src/components/designTokens.ts","../src/components/Avatar.tsx","../src/components/Badge.tsx","../src/components/Button.tsx","../src/components/Checkbox.tsx","../src/components/Modal.tsx","../src/components/ConfirmDialog.tsx","../src/components/DatePicker.tsx","../src/components/TimeSelector.tsx","../src/components/DateTimePicker.tsx","../src/components/Drawer.tsx","../src/components/DropdownMenu.tsx","../src/components/FileUpload.tsx","../src/components/FormField.tsx","../src/components/Input.tsx","../src/components/dropdownMotion.ts","../src/components/Select.tsx","../src/components/Pagination.tsx","../src/components/Radio.tsx","../src/components/SegmentedControl.tsx","../src/components/Switch.tsx","../src/components/Tabs.tsx","../src/components/Textarea.tsx","../src/components/TimePicker.tsx","../src/components/Timeline.tsx","../src/components/Toast.tsx","../src/components/tooltip-positions.ts","../src/components/Tooltip.tsx","../src/components/TreeSelect.tsx"],"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","export const cn = (...classes: Array<string | false | null | undefined>) =>\n classes.filter(Boolean).join(' ');\n","import { cn } from './classNames';\n\nexport const radiusTokens = {\n tag: 'rounded-[var(--lumen-radius-tag)]',\n control: 'rounded-[var(--lumen-radius-control)]',\n button: 'rounded-[var(--lumen-radius-control)]',\n icon: 'rounded-[var(--lumen-radius-icon)]',\n card: 'rounded-[var(--lumen-radius-card)]',\n modal: 'rounded-[var(--lumen-radius-modal)]',\n pill: 'rounded-[var(--lumen-radius-pill)]',\n} as const;\n\nexport const radiusNormalizationMap = {\n 'rounded-[2px]': radiusTokens.tag,\n 'rounded-[3px]': radiusTokens.tag,\n 'rounded-[10px]': radiusTokens.card,\n 'rounded-[11px]': radiusTokens.icon,\n 'rounded-[14px]': radiusTokens.card,\n 'rounded-[16px]': radiusTokens.card,\n 'rounded-[20px]': radiusTokens.modal,\n 'rounded-[22px]': radiusTokens.modal,\n 'rounded-[24px]': radiusTokens.modal,\n 'rounded-xl': radiusTokens.card,\n 'rounded-2xl': radiusTokens.modal,\n} as const;\n\nexport const buttonSizeTokens = {\n sm: 'h-[var(--lumen-control-height-sm)] px-3 text-[12px]',\n md: 'h-[var(--lumen-control-height-md)] px-4 text-[13px]',\n lg: 'h-[var(--lumen-control-height-lg)] px-5 text-[14px]',\n} as const;\n\nexport const buttonIconSizeTokens = {\n sm: 'h-8 w-8',\n md: 'h-9 w-9',\n lg: 'h-10 w-10',\n} as const;\n\nexport const buttonVariantTokens = {\n primary: 'border border-transparent bg-[var(--lumen-color-primary)] text-[var(--lumen-color-on-primary)] shadow-sm shadow-[var(--lumen-color-primary)]/20 hover:bg-[var(--lumen-color-primary-hover)]',\n secondary: 'border border-transparent bg-[var(--lumen-color-primary-soft)] text-[var(--lumen-color-primary)] hover:bg-[var(--lumen-color-primary-soft-hover)]',\n accent: 'border border-[var(--lumen-color-info-border)] bg-[var(--lumen-color-primary-soft)] text-[var(--lumen-color-primary-hover)] hover:border-[var(--lumen-color-info-border)] hover:bg-[var(--lumen-color-primary-soft-hover)]',\n outline: 'border border-[var(--lumen-color-border-strong)] bg-[var(--lumen-color-surface)] text-[var(--lumen-color-text-secondary)] hover:border-[var(--lumen-color-info-border)] hover:bg-[var(--lumen-color-surface-hover)] hover:text-[var(--lumen-color-primary)]',\n ghost: 'border border-transparent bg-transparent text-[var(--lumen-color-text-muted)] hover:bg-[var(--lumen-color-surface-muted)] hover:text-[var(--lumen-color-text)]',\n destructive: 'border border-transparent bg-[var(--lumen-color-danger)] text-[var(--lumen-color-on-primary)] shadow-sm shadow-[var(--lumen-color-danger)]/20 hover:bg-[var(--lumen-color-danger-hover)]',\n} as const;\n\nexport type ButtonVariant = keyof typeof buttonVariantTokens;\nexport type ButtonSize = keyof typeof buttonSizeTokens;\n\nconst buttonBase =\n 'inline-flex shrink-0 items-center justify-center gap-1.5 font-medium transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--lumen-color-primary)]/20 disabled:cursor-not-allowed disabled:opacity-50';\n\nexport const getButtonClassNames = ({\n variant = 'primary',\n size = 'md',\n iconOnly = false,\n className,\n}: {\n variant?: ButtonVariant;\n size?: ButtonSize;\n iconOnly?: boolean;\n className?: string;\n}) =>\n cn(\n buttonBase,\n radiusTokens.button,\n buttonVariantTokens[variant],\n iconOnly ? buttonIconSizeTokens[size] : buttonSizeTokens[size],\n className,\n );\n\nexport const rawButtonPresets = {\n iconSm: getButtonClassNames({ variant: 'ghost', size: 'sm', iconOnly: true }),\n iconMd: getButtonClassNames({ variant: 'ghost', size: 'md', iconOnly: true }),\n outlineSm: getButtonClassNames({ variant: 'outline', size: 'sm' }),\n outlineMd: getButtonClassNames({ variant: 'outline', size: 'md' }),\n subtleSm: getButtonClassNames({ variant: 'secondary', size: 'sm' }),\n dangerSm: getButtonClassNames({ variant: 'destructive', size: 'sm' }),\n segment:\n 'inline-flex items-center justify-center h-[32px] px-3 text-[12px] font-medium transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--lumen-color-primary)]/20 disabled:cursor-not-allowed disabled:opacity-50 rounded-[6px] border border-transparent text-[var(--lumen-color-text-muted)] hover:bg-[var(--lumen-color-surface)] hover:text-[var(--lumen-color-text)]',\n pagination:\n 'inline-flex items-center justify-center h-8 min-w-8 px-2 text-[12px] font-medium transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--lumen-color-primary)]/20 disabled:cursor-not-allowed disabled:opacity-50 rounded-[6px] text-[var(--lumen-color-text-muted)] hover:bg-[var(--lumen-color-primary-soft)] hover:text-[var(--lumen-color-primary)]',\n dashedUpload:\n 'inline-flex items-center justify-center gap-1.5 h-[36px] px-4 text-[12px] font-medium transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--lumen-color-primary)]/20 disabled:cursor-not-allowed disabled:opacity-50 rounded-[6px] border border-dashed border-[var(--lumen-color-border-hover)] bg-[var(--lumen-color-surface)] text-[var(--lumen-color-text-muted)] hover:border-[var(--lumen-color-info-border)] hover:bg-[var(--lumen-color-surface-hover)] hover:text-[var(--lumen-color-primary)]',\n} as const;\n\nexport const headerActionButtonClassNames = {\n primary:\n 'group relative isolate inline-flex h-[38px] items-center justify-center gap-1.5 overflow-hidden rounded-[8px] border border-[var(--lumen-color-primary-hover)] bg-[var(--lumen-color-primary)] px-4 text-[13px] font-medium tracking-[0.01em] text-[var(--lumen-color-on-primary)] shadow-[0_8px_18px_var(--lumen-color-focus-ring)] transition-all duration-200 hover:-translate-y-[1px] hover:border-[var(--lumen-color-primary-active)] hover:bg-[var(--lumen-color-primary-hover)] hover:shadow-[0_12px_24px_var(--lumen-color-focus-ring)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--lumen-color-primary)]/20 disabled:cursor-not-allowed disabled:opacity-50',\n outline:\n 'group relative isolate inline-flex h-[38px] items-center justify-center gap-1.5 overflow-hidden rounded-[8px] border border-[var(--lumen-color-border-strong)] bg-[var(--lumen-color-surface-glass)] px-4 text-[13px] font-medium tracking-[0.01em] text-[var(--lumen-color-text-secondary)] shadow-[0_6px_14px_var(--lumen-color-shadow)] transition-all duration-200 hover:-translate-y-[1px] hover:border-[var(--lumen-color-border-hover)] hover:bg-[var(--lumen-color-surface-glass)] hover:text-[var(--lumen-color-primary-active)] hover:shadow-[0_10px_20px_var(--lumen-color-shadow)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--lumen-color-primary)]/20 disabled:cursor-not-allowed disabled:opacity-50',\n} as const;\n\nexport const headerActionButtonSurfaceClassNames = {\n primary:\n 'pointer-events-none absolute inset-[1px] rounded-[7px] bg-[radial-gradient(circle_at_50%_0%,var(--lumen-color-surface-glass),transparent_52%),linear-gradient(180deg,var(--lumen-color-surface-glass),transparent_54%)]',\n outline:\n 'pointer-events-none absolute inset-[1px] rounded-[7px] bg-[linear-gradient(180deg,var(--lumen-color-surface-glass),var(--lumen-color-surface-glass))]',\n} as const;\n\nexport const tabContainerClassNames =\n 'rounded-[18px] border border-[var(--lumen-color-surface)]/70 bg-[var(--lumen-color-surface)]/92 p-4 shadow-[0_12px_36px_var(--lumen-color-shadow)]';\n\nexport const tabVariantClassNames = {\n default: {\n container: 'bg-[var(--lumen-color-surface)] px-1',\n base:\n 'group relative inline-flex min-h-[44px] items-center justify-center gap-2 whitespace-nowrap px-3 py-3 text-[13px] font-medium transition-colors duration-200 after:absolute after:bottom-[-1px] after:left-2 after:right-2 after:h-[2px] after:origin-center after:scale-x-0 after:rounded-full after:bg-[var(--lumen-color-primary)] after:opacity-0 after:transition-all after:duration-150 after:ease-out',\n active:\n 'text-[var(--lumen-color-primary)] after:scale-x-100 after:opacity-100',\n inactive:\n 'text-[var(--lumen-color-text-muted)] hover:text-[var(--lumen-color-primary)]',\n iconBase: '',\n iconActive: 'text-[var(--lumen-color-primary)]',\n iconInactive: 'text-[var(--lumen-color-text-placeholder)] group-hover:text-[var(--lumen-color-primary)]',\n badgeBase:\n 'inline-flex min-w-[24px] items-center justify-center rounded-full px-1.5 py-0.5 text-[11px] font-semibold transition-all',\n badgeActive: 'bg-[var(--lumen-color-primary-soft-hover)] text-[var(--lumen-color-primary)]',\n badgeInactive: 'bg-[var(--lumen-color-surface-muted)] text-[var(--lumen-color-text-muted)]',\n },\n pill: {\n container:\n 'rounded-[16px] border border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface-subtle)] px-5 py-4 shadow-[0_6px_18px_var(--lumen-color-shadow)]',\n base:\n 'group inline-flex items-center gap-2 rounded-full border px-4 py-2 text-[13px] transition-all',\n active:\n 'border-[var(--lumen-color-primary)] bg-[var(--lumen-color-primary-soft)] text-[var(--lumen-color-primary)]',\n inactive:\n 'border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] text-[var(--lumen-color-text-muted)] hover:border-[var(--lumen-color-border-hover)] hover:text-[var(--lumen-color-primary)]',\n iconBase: '',\n iconActive: '',\n iconInactive: '',\n badgeBase:\n 'inline-flex min-w-[28px] items-center justify-center rounded-full px-2 py-0.5 text-[11px] font-semibold transition-all',\n badgeActive: 'bg-[var(--lumen-color-surface)] text-[var(--lumen-color-primary)]',\n badgeInactive: 'bg-[var(--lumen-color-surface-muted)] text-[var(--lumen-color-text-muted)]',\n },\n card: {\n container:\n 'rounded-[12px] border border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] px-4 py-4 shadow-sm',\n base:\n 'group inline-flex min-h-[46px] items-center gap-2.5 rounded-[8px] border px-4 py-2 text-[14px] font-medium tracking-[0.01em] transition-all duration-200',\n active:\n 'border-[var(--lumen-color-info-border)] bg-[linear-gradient(180deg,var(--lumen-color-info-soft)_0%,var(--lumen-color-surface)_100%)] text-[var(--lumen-color-primary-active)] shadow-[0_8px_18px_var(--lumen-color-focus-ring)]',\n inactive:\n 'border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface-subtle)] text-[var(--lumen-color-text-muted)] hover:border-[var(--lumen-color-info-border)] hover:bg-[var(--lumen-color-surface)] hover:text-[var(--lumen-color-primary-active)]',\n iconBase:\n 'inline-flex h-7 w-7 items-center justify-center rounded-[6px] border transition-colors duration-200',\n iconActive:\n 'border-[var(--lumen-color-info-border)] bg-[var(--lumen-color-primary-soft-hover)] text-[var(--lumen-color-primary)]',\n iconInactive:\n 'border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] text-[var(--lumen-color-text-placeholder)] group-hover:border-[var(--lumen-color-info-border)] group-hover:text-[var(--lumen-color-primary)]',\n badgeBase:\n 'inline-flex min-w-[30px] items-center justify-center rounded-[6px] px-2 py-0.5 text-[12px] font-semibold transition-all duration-200',\n badgeActive:\n 'bg-[var(--lumen-color-primary)] text-[var(--lumen-color-on-primary)] shadow-[0_6px_12px_var(--lumen-color-focus-ring)]',\n badgeInactive:\n 'bg-[var(--lumen-color-surface-muted)] text-[var(--lumen-color-text-muted)]',\n },\n} as const;\n\nexport const tabClassNames = {\n base:\n 'inline-flex items-center justify-center gap-2 rounded-[10px] px-4 py-2.5 text-[13px] font-medium transition-all duration-200',\n active:\n 'bg-[var(--lumen-color-primary)] text-[var(--lumen-color-on-primary)] shadow-[0_10px_20px_var(--lumen-color-focus-ring)]',\n inactive:\n 'bg-[var(--lumen-color-surface-muted)] text-[var(--lumen-color-text-muted)] hover:bg-[var(--lumen-color-info-soft)] hover:text-[var(--lumen-color-primary)]',\n} as const;\n\nexport const tabBadgeClassNames = {\n base: 'rounded-full px-2 py-0.5 text-[11px] font-semibold',\n active: 'bg-[var(--lumen-color-surface)]/20 text-[var(--lumen-color-on-primary)]',\n inactive: 'bg-[var(--lumen-color-surface)] text-[var(--lumen-color-primary)]',\n} as const;\n\nexport const statCardToneClassNames = {\n blue: 'border-[var(--lumen-color-info-border)] bg-[linear-gradient(180deg,var(--lumen-color-surface)_0%,var(--lumen-color-info-soft)_100%)]',\n emerald: 'border-[var(--lumen-color-success-border)] bg-[linear-gradient(180deg,var(--lumen-color-surface)_0%,var(--lumen-color-success-soft)_100%)]',\n amber: 'border-[var(--lumen-color-warning-border)] bg-[linear-gradient(180deg,var(--lumen-color-surface)_0%,var(--lumen-color-warning-soft)_100%)]',\n slate: 'border-[var(--lumen-color-border)] bg-[linear-gradient(180deg,var(--lumen-color-surface)_0%,var(--lumen-color-surface-muted)_100%)]',\n} as const;\n\nexport const semanticBadgeToneClassNames = {\n neutral: 'bg-[var(--lumen-color-surface-muted)] text-[var(--lumen-color-text-secondary)]',\n info: 'bg-[var(--lumen-color-primary-soft-hover)] text-[var(--lumen-color-primary-hover)]',\n success: 'bg-[var(--lumen-color-success-soft)] text-[var(--lumen-color-success-text)]',\n warning: 'bg-[var(--lumen-color-warning-soft)] text-[var(--lumen-color-warning-text)]',\n danger: 'bg-[var(--lumen-color-danger-soft)] text-[var(--lumen-color-danger-text)]',\n} as const;\n\nexport const semanticSurfaceToneClassNames = {\n neutral: 'border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface-muted)] text-[var(--lumen-color-text-secondary)]',\n info: 'border-[var(--lumen-color-info-border)] bg-[var(--lumen-color-info-soft)] text-[var(--lumen-color-primary-hover)]',\n success: 'border-[var(--lumen-color-success-border)] bg-[var(--lumen-color-success-soft)] text-[var(--lumen-color-success-text)]',\n warning: 'border-[var(--lumen-color-warning-border)] bg-[var(--lumen-color-warning-soft)] text-[var(--lumen-color-warning-text)]',\n danger: 'border-[var(--lumen-color-danger-border)] bg-[var(--lumen-color-danger-soft)] text-[var(--lumen-color-danger-text)]',\n} as const;\n\nexport const selectionPickerClassNames = {\n summary: 'rounded-[8px] border border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] p-3',\n summaryTrail: 'text-[12px] text-[var(--lumen-color-text-muted)]',\n summaryTitle: 'text-[13px] font-medium leading-5 text-[var(--lumen-color-text)]',\n summaryHint: 'text-[12px] text-[var(--lumen-color-text-placeholder)]',\n neutralBadge: 'border-[var(--lumen-color-info-border)] bg-[var(--lumen-color-surface)] text-[var(--lumen-color-primary-hover)]',\n infoBadge: 'border-[var(--lumen-color-info-border)] bg-[var(--lumen-color-primary-soft-hover)] text-[var(--lumen-color-primary-hover)]',\n modalPanel:\n 'flex max-h-[calc(100dvh-1.5rem)] w-full max-w-[980px] flex-col overflow-hidden rounded-[12px] bg-[var(--lumen-color-surface)] shadow-[0_18px_60px_var(--lumen-color-shadow)] pad:max-h-[86vh] pad:rounded-[16px] l:rounded-[18px]',\n modalHeader: 'border-[var(--lumen-color-border)]',\n modalTitle: 'text-[16px] font-semibold text-[var(--lumen-color-text-strong)]',\n modalDescription: 'text-[12px] text-[var(--lumen-color-text-muted)]',\n navigation:\n 'border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)]',\n navigationTitle: 'text-[12px] font-semibold text-[var(--lumen-color-text-muted)]',\n categoryActive: 'bg-[var(--lumen-color-primary-soft)] text-[var(--lumen-color-primary-hover)]',\n categoryInactive: 'text-[var(--lumen-color-text-secondary)] hover:!bg-[var(--lumen-color-info-soft)]',\n subCategoryActive: 'bg-[var(--lumen-color-primary-soft-hover)] text-[var(--lumen-color-primary-hover)]',\n subCategoryInactive: 'text-[var(--lumen-color-text-muted)] hover:!bg-[var(--lumen-color-info-soft)] hover:text-[var(--lumen-color-primary-hover)]',\n mutedText: 'text-[12px] text-[var(--lumen-color-text-placeholder)]',\n loadingIcon: 'text-[var(--lumen-color-primary)]',\n contentTitle: 'text-[14px] font-semibold text-[var(--lumen-color-text)]',\n emptyState:\n 'rounded-[8px] border border-dashed border-[var(--lumen-color-info-border)] bg-[var(--lumen-color-surface)] px-4 py-12 text-center text-[13px] text-[var(--lumen-color-text-placeholder)]',\n itemBase:\n '!h-auto w-full items-start justify-start gap-3 rounded-[8px] px-3 py-3 text-left',\n itemActive: 'border-[var(--lumen-color-primary)] bg-[var(--lumen-color-info-soft)] hover:bg-[var(--lumen-color-info-soft)]',\n itemInactive:\n 'border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] hover:border-[var(--lumen-color-info-border)] hover:bg-[var(--lumen-color-surface-hover)]',\n itemSequence: 'bg-[var(--lumen-color-primary-soft)] text-[var(--lumen-color-primary-hover)]',\n itemText: 'text-[13px] font-normal leading-5 text-[var(--lumen-color-text-secondary)]',\n selectedIcon: 'text-[var(--lumen-color-primary)]',\n} as const;\n","import React, { useState } from 'react';\nimport { User } from 'lucide-react';\nimport { cn } from './classNames';\nimport { radiusTokens } from './designTokens';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg';\nexport type AvatarShape = 'circle' | 'rounded';\n\nexport interface AvatarProps\n extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {\n src?: string;\n alt?: string;\n name?: string;\n fallback?: React.ReactNode;\n size?: AvatarSize;\n shape?: AvatarShape;\n imageProps?: Omit<React.ImgHTMLAttributes<HTMLImageElement>, 'alt' | 'src'>;\n}\n\nconst sizeClasses: Record<AvatarSize, string> = {\n sm: 'h-8 w-8 text-[11px]',\n md: 'h-10 w-10 text-[13px]',\n lg: 'h-12 w-12 text-[16px]',\n};\n\nconst iconSizes: Record<AvatarSize, number> = {\n sm: 14,\n md: 17,\n lg: 20,\n};\n\nconst getInitials = (name: string) => {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '';\n if (parts.length === 1) return parts[0]!.slice(0, 2).toUpperCase();\n return `${parts[0]![0]}${parts.at(-1)![0]}`.toUpperCase();\n};\n\nexport const Avatar = React.forwardRef<HTMLSpanElement, AvatarProps>(\n (\n {\n src,\n alt,\n name,\n fallback,\n size = 'md',\n shape = 'circle',\n imageProps,\n className,\n role = 'img',\n 'aria-label': ariaLabel,\n ...props\n },\n ref,\n ) => {\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\n const showImage = Boolean(src && failedSrc !== src);\n const {\n className: imageClassName,\n onError: onImageError,\n ...restImageProps\n } = imageProps ?? {};\n const initials = name ? getInitials(name) : '';\n\n return (\n <span\n ref={ref}\n role={role}\n aria-label={ariaLabel ?? alt ?? name ?? 'Avatar'}\n className={cn(\n 'relative inline-flex shrink-0 select-none items-center justify-center overflow-hidden border border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface-muted)] font-medium text-[var(--lumen-color-text-muted)]',\n sizeClasses[size],\n shape === 'circle' ? 'rounded-full' : radiusTokens.icon,\n className,\n )}\n {...props}\n >\n {showImage ? (\n <img\n {...restImageProps}\n src={src}\n alt=\"\"\n aria-hidden=\"true\"\n draggable={false}\n className={cn('h-full w-full object-cover', imageClassName)}\n onError={(event) => {\n setFailedSrc(src ?? null);\n onImageError?.(event);\n }}\n />\n ) : (\n fallback ??\n (initials || <User size={iconSizes[size]} aria-hidden=\"true\" />)\n )}\n </span>\n );\n },\n);\n\nAvatar.displayName = 'Avatar';\n","import { type ReactNode } from 'react';\nimport { cn } from './classNames';\n\ntype BadgeSize = 'sm' | 'md' | 'lg';\ntype BadgeVariant = 'default' | 'outline';\ntype BadgeShape = 'pill' | 'square';\n\ninterface BadgeProps {\n children: ReactNode;\n variant?: BadgeVariant;\n size?: BadgeSize;\n shape?: BadgeShape;\n className?: string;\n}\n\nconst sizeClasses: Record<BadgeSize, string> = {\n sm: 'px-2 py-0.5 text-[11px]',\n md: 'px-2.5 py-1 text-[12px]',\n lg: 'px-3 py-1.5 text-[13px]',\n};\n\nconst shapeClasses: Record<BadgeShape, string> = {\n pill: 'rounded-full',\n square: 'rounded-[4px]',\n};\n\nexport function Badge({\n children,\n variant = 'default',\n size = 'md',\n shape = 'pill',\n className,\n}: BadgeProps) {\n return (\n <span\n className={cn(\n 'app-badge inline-flex items-center whitespace-nowrap',\n sizeClasses[size],\n shapeClasses[shape],\n variant === 'outline' && 'border',\n className,\n )}\n >\n {children}\n </span>\n );\n}\n\nexport type { BadgeProps, BadgeShape, BadgeSize, BadgeVariant };\n","import React from 'react';\nimport { getButtonClassNames, type ButtonSize, type ButtonVariant } from './designTokens';\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n icon?: React.ReactNode;\n iconOnly?: boolean;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n children,\n variant = 'primary' as ButtonVariant,\n size = 'md' as ButtonSize,\n icon,\n iconOnly = false,\n className = '',\n ...props\n}) => {\n return (\n <button \n className={getButtonClassNames({ variant, size, iconOnly, className })}\n {...props}\n >\n {icon && <span className=\"shrink-0\">{icon}</span>}\n {!iconOnly && children}\n </button>\n );\n};\n","import React, { useEffect, useId, useRef, useState } from 'react';\nimport { Check, Minus } from 'lucide-react';\nimport { cn } from './classNames';\n\nexport interface CheckboxProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'onChange'> {\n size?: 'sm' | 'md';\n checked?: boolean;\n defaultChecked?: boolean;\n disabled?: boolean;\n indeterminate?: boolean;\n label?: React.ReactNode;\n description?: React.ReactNode;\n onChange?: (checked: boolean) => void;\n}\n\nexport const Checkbox: React.FC<CheckboxProps> = ({\n size = 'sm',\n checked,\n defaultChecked = false,\n disabled = false,\n indeterminate = false,\n label,\n description,\n onChange,\n className,\n id,\n ...props\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const labelId = `${inputId}-label`;\n const descriptionId = `${inputId}-description`;\n const isControlled = typeof checked === 'boolean';\n const [internalChecked, setInternalChecked] = useState(defaultChecked);\n const currentChecked = isControlled ? checked : internalChecked;\n const isSmall = size === 'sm';\n const hasDescription = Boolean(description);\n const explicitAriaLabel = props['aria-label'];\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate, currentChecked]);\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n const nextChecked = event.target.checked;\n if (!isControlled) {\n setInternalChecked(nextChecked);\n }\n onChange?.(nextChecked);\n };\n\n const indicatorVisible = indeterminate || currentChecked;\n\n return (\n <label\n htmlFor={inputId}\n className={cn(\n 'inline-flex gap-3',\n hasDescription ? 'items-start' : 'items-center',\n isSmall && 'gap-2',\n disabled ? 'cursor-not-allowed opacity-55' : 'cursor-pointer',\n className,\n )}\n >\n <span\n className={cn(\n 'relative inline-flex shrink-0 items-center justify-center',\n hasDescription && 'mt-0.5',\n isSmall ? 'h-4 w-4' : 'h-5 w-5',\n )}\n >\n <input\n {...props}\n ref={inputRef}\n id={inputId}\n type=\"checkbox\"\n checked={currentChecked}\n disabled={disabled}\n aria-labelledby={!explicitAriaLabel && label ? labelId : undefined}\n aria-describedby={description ? descriptionId : undefined}\n aria-label={explicitAriaLabel ?? (typeof label === 'string' ? label : undefined)}\n aria-checked={indeterminate ? 'mixed' : currentChecked}\n className=\"peer sr-only\"\n onChange={handleChange}\n />\n <span\n aria-hidden=\"true\"\n className={cn(\n 'flex items-center justify-center border transition-all',\n isSmall ? 'h-4 w-4 rounded-[4px]' : 'h-5 w-5 rounded-[5px]',\n indicatorVisible\n ? 'border-[var(--lumen-color-primary)] bg-[var(--lumen-color-primary)] text-[var(--lumen-color-on-primary)] shadow-[0_8px_18px_var(--lumen-color-focus-ring)]'\n : 'border-[var(--lumen-color-border-hover)] bg-[var(--lumen-color-surface)] text-transparent',\n !disabled && 'peer-focus-visible:ring-2 peer-focus-visible:ring-[var(--lumen-color-info-border)]/70 peer-focus-visible:ring-offset-2',\n !disabled && !indicatorVisible && 'hover:border-[var(--lumen-color-info-border)] hover:bg-[var(--lumen-color-surface-hover)]',\n )}\n >\n {indeterminate ? (\n <Minus size={isSmall ? 11 : 13} strokeWidth={3} />\n ) : (\n <Check size={isSmall ? 11 : 13} strokeWidth={3} />\n )}\n </span>\n </span>\n {(label || description) && (\n <span className=\"min-w-0\">\n {label ? (\n <span\n id={labelId}\n className={cn(\n 'block font-normal',\n indicatorVisible ? 'text-[var(--lumen-color-text)]' : 'text-[var(--lumen-color-text-muted)]',\n isSmall ? 'text-[13px] leading-5' : 'text-[13px] leading-5',\n )}\n >\n {label}\n </span>\n ) : null}\n {description ? (\n <span\n id={descriptionId}\n className={cn(\n 'mt-0.5 block text-[var(--lumen-color-text-muted)]',\n isSmall ? 'text-[11px] leading-4.5' : 'text-[12px] leading-5',\n )}\n >\n {description}\n </span>\n ) : null}\n </span>\n )}\n </label>\n );\n};\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface ModalProps {\n open: boolean;\n onRequestClose: () => void;\n onExited?: () => void;\n children: React.ReactNode;\n modalId?: string;\n overlayId?: string;\n overlayClassName?: string;\n panelClassName?: string;\n closeOnOverlayClick?: boolean;\n}\n\nconst overlayBaseClassName =\n 'fixed inset-0 z-[100] flex items-center justify-center overflow-y-auto overscroll-contain bg-[var(--lumen-color-overlay)] p-3 backdrop-blur-sm mobile:items-end pad:p-4 l:p-5 xl:p-6';\n\nexport const Modal: React.FC<ModalProps> = ({\n open,\n onRequestClose,\n onExited,\n children,\n modalId,\n overlayId,\n overlayClassName = '',\n panelClassName = '',\n closeOnOverlayClick = true,\n}) => {\n const [mounted, setMounted] = useState(open);\n const [closing, setClosing] = useState(false);\n const [cachedChildren, setCachedChildren] = useState<React.ReactNode>(children);\n const isClosing = closing || (mounted && !open);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n setClosing(false);\n setCachedChildren(children);\n } else if (mounted) {\n setClosing(true);\n }\n }, [children, mounted, open]);\n\n useEffect(() => {\n if (open && children != null) {\n setCachedChildren(children);\n }\n }, [children, open]);\n\n const handleAnimationEnd = useCallback(\n (event: React.AnimationEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget || !closing) return;\n\n setMounted(false);\n setClosing(false);\n setCachedChildren(null);\n onExited?.();\n },\n [closing, onExited],\n );\n\n if (!mounted || typeof document === 'undefined') return null;\n\n const displayChildren = isClosing ? cachedChildren : children;\n\n return createPortal(\n <div\n data-modal-overlay={overlayId || modalId}\n data-lumen-motion\n className={`${overlayBaseClassName} ${isClosing ? 'animate-[lumen-page-fade-out_150ms_ease-in_forwards]' : 'animate-[lumen-page-fade-in_200ms_ease-out]'} ${overlayClassName}`.trim()}\n onClick={closeOnOverlayClick ? onRequestClose : undefined}\n onAnimationEnd={handleAnimationEnd}\n >\n <div\n data-modal={modalId}\n data-lumen-motion\n className={`max-h-[calc(100dvh-1.5rem)] max-w-full ${isClosing ? 'animate-[lumen-modal-out_150ms_ease-in_forwards]' : 'animate-[lumen-modal-in_200ms_ease-out]'} ${panelClassName}`.trim()}\n onClick={(event) => event.stopPropagation()}\n >\n {displayChildren}\n </div>\n </div>,\n document.body,\n );\n};\n","import React from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { Modal } from './Modal';\nimport { Button } from './Button';\nimport type { ButtonVariant } from './designTokens';\n\ninterface ConfirmDialogProps {\n open: boolean;\n title: string;\n message: string;\n confirmText?: string;\n confirmVariant?: ButtonVariant;\n cancelText?: string;\n confirmDisabled?: boolean;\n confirmLoading?: boolean;\n cancelDisabled?: boolean;\n closeOnOverlayClick?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport const ConfirmDialog: React.FC<ConfirmDialogProps> = ({\n open,\n title,\n message,\n confirmText = '确认',\n confirmVariant = 'primary',\n cancelText = '取消',\n confirmDisabled = false,\n confirmLoading = false,\n cancelDisabled = false,\n closeOnOverlayClick = true,\n onConfirm,\n onCancel,\n}) => {\n return (\n <Modal\n open={open}\n onRequestClose={onCancel}\n modalId=\"confirm-dialog\"\n overlayId=\"confirm-dialog-overlay\"\n closeOnOverlayClick={closeOnOverlayClick}\n panelClassName=\"w-full max-w-[420px] rounded-[12px] border border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] p-4 shadow-[0_24px_70px_var(--lumen-color-shadow)] pad:p-5 l:p-6\"\n >\n <div role=\"dialog\" aria-label={title}>\n <div className=\"text-[18px] font-semibold text-[var(--lumen-color-text)]\">{title}</div>\n <div className=\"mt-3 text-[14px] leading-6 text-[var(--lumen-color-text-secondary)]\">\n {message}\n </div>\n <div className=\"mt-5 flex flex-col-reverse gap-2.5 pad:mt-6 pad:flex-row pad:items-center pad:justify-end\">\n <Button\n disabled={cancelDisabled}\n variant=\"outline\"\n type=\"button\"\n onClick={onCancel}\n >\n {cancelText}\n </Button>\n <Button\n aria-busy={confirmLoading}\n disabled={confirmDisabled || confirmLoading}\n type=\"button\"\n variant={confirmVariant}\n onClick={onConfirm}\n >\n {confirmLoading && (\n <Loader2 aria-hidden=\"true\" className=\"animate-spin\" size={14} />\n )}\n {confirmText}\n </Button>\n </div>\n </div>\n </Modal>\n );\n};\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { Calendar, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from './classNames';\nimport { radiusTokens } from './designTokens';\n\n// ─── 类型定义 ────────────────────────────────────────────\n\nexport type DatePickerMode = 'year-month' | 'year-month-day';\nexport type DatePickerSize = 'sm' | 'md' | 'lg';\n\nexport interface DatePickerProps {\n /** 当前值,year-month-day 模式 \"YYYY-MM-DD\",year-month 模式 \"YYYY-MM\" */\n value: string;\n /** 值变化回调 */\n onChange: (value: string) => void;\n /** 输入框占位提示 */\n placeholder?: string;\n /** 触发按钮无障碍标签 */\n triggerAriaLabel?: string;\n /** 根元素额外 class */\n className?: string;\n /** 选择模式,默认 'year-month-day' */\n mode?: DatePickerMode;\n /** 组件尺寸,默认 'md' */\n size?: DatePickerSize;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示清除按钮,默认 true */\n clearable?: boolean;\n /** 是否显示\"今天\"快捷按钮,默认 true */\n showToday?: boolean;\n /** 自定义显示格式,如 \"YYYY/MM/DD\"、\"YYYY年M月\" */\n format?: string;\n /** 可选最小日期(含),YYYY-MM-DD 或 YYYY-MM */\n minDate?: string;\n /** 可选最大日期(含),YYYY-MM-DD 或 YYYY-MM */\n maxDate?: string;\n}\n\n// ─── 常量 ──────────────────────────────────────────────\n\nconst WEEKDAYS = ['日', '一', '二', '三', '四', '五', '六'];\nconst MONTHS = [\n '1月',\n '2月',\n '3月',\n '4月',\n '5月',\n '6月',\n '7月',\n '8月',\n '9月',\n '10月',\n '11月',\n '12月',\n];\nconst YEAR_PAGE_SIZE = 20;\nconst DEFAULT_YEAR_RANGE_PREV_PAGES = 2;\nconst DEFAULT_YEAR_RANGE_NEXT_PAGES = 1;\nconst DROPDOWN_WIDTH = 320;\nconst DROPDOWN_VIEWPORT_MARGIN = 8;\n\n// ─── 工具函数 ──────────────────────────────────────────\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\nconst getDaysInMonth = (year: number, month: number) =>\n new Date(year, month + 1, 0).getDate();\nconst getFirstDayOfWeek = (year: number, month: number) =>\n new Date(year, month, 1).getDay();\n\n/** 格式化显示值 */\nexport const formatValue = (\n value: string,\n mode: DatePickerMode,\n fmt?: string,\n): string => {\n if (!value) return '';\n const parts = value.split('-').map(Number);\n if (!fmt) {\n if (mode === 'year-month') {\n return `${parts[0]}年${parts[1]}月`;\n }\n return `${parts[0]}年${parts[1]}月${parts[2]}日`;\n }\n // 自定义格式(注意 replace 顺序 — MM 必须在 M 之前替换,否则 MM 会被 M 替换破坏)\n return fmt\n .replace('YYYY', String(parts[0]))\n .replace('MM', String(parts[1]).padStart(2, '0'))\n .replace('M', String(parts[1]))\n .replace('DD', parts[2] ? String(parts[2]).padStart(2, '0') : '')\n .replace('D', parts[2] ? String(parts[2]) : '');\n};\n\n/** 解析 YYYY-MM-DD 或 YYYY-MM */\nconst parseDate = (value: string) => {\n if (!value) return null;\n const parts = value.split('-').map(Number);\n const year = parts[0];\n const month = parts[1];\n if (year === undefined || month === undefined) return null;\n return {\n year,\n month: month - 1,\n day: parts[2] ?? null,\n };\n};\n\n/** 比较两个 YYYY-MM 或 YYYY-MM-DD 字符串,返回 -1/0/1 */\nconst compareDateStr = (a: string, b: string): number => {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n};\n\nconst getYearPageStart = (year: number) =>\n Math.floor(year / YEAR_PAGE_SIZE) * YEAR_PAGE_SIZE;\n\n// ─── Size Tokens ───────────────────────────────────────\n\nconst sizeTokens = {\n sm: {\n trigger: 'h-[32px] px-2.5 text-[12px]',\n cell: 'h-8 w-8 text-[12px]',\n header: 'text-[13px]',\n footer: 'text-[12px]',\n dropdown: 'p-3',\n icon: 14,\n },\n md: {\n trigger: 'h-[36px] px-3 text-[13px]',\n cell: 'h-9 w-9 text-[13px]',\n header: 'text-[15px]',\n footer: 'text-[13px]',\n dropdown: 'p-4',\n icon: 16,\n },\n lg: {\n trigger: 'h-[40px] px-3.5 text-[14px]',\n cell: 'h-10 w-10 text-[14px]',\n header: 'text-[16px]',\n footer: 'text-[14px]',\n dropdown: 'p-5',\n icon: 18,\n },\n} as const;\n\ntype SizeToken = (typeof sizeTokens)[DatePickerSize];\n\n// ─── 组件 ──────────────────────────────────────────────\n\nexport const DatePicker: React.FC<DatePickerProps> = ({\n value,\n onChange,\n placeholder = '请选择日期',\n triggerAriaLabel,\n className,\n mode = 'year-month-day' as DatePickerMode,\n size = 'md' as DatePickerSize,\n disabled = false,\n clearable = true,\n showToday = true,\n format,\n minDate,\n maxDate,\n}) => {\n const [open, setOpen] = useState(false);\n const [isAnimatingOut, setIsAnimatingOut] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n const closeTimeoutRef = useRef<ReturnType<typeof setTimeout>>(null);\n const tokens = sizeTokens[size];\n\n // 动画状态\n const [slideDirection, setSlideDirection] = useState<'left' | 'right' | null>(\n null,\n );\n const [isAnimating, setIsAnimating] = useState(false);\n\n // 年月选择模式的视图状态\n const [showYearPicker, setShowYearPicker] = useState(false);\n const [yearPickerStart, setYearPickerStart] = useState(0);\n\n // 年月日模式下的子视图\n const [dayView, setDayView] = useState<'day' | 'month' | 'year'>('day');\n const [dayYearPickerStart, setDayYearPickerStart] = useState(0);\n\n // 下拉面板定位(portal 模式)\n const [dropdownStyle, setDropdownStyle] = useState<React.CSSProperties>({\n position: 'fixed',\n zIndex: 9999,\n });\n const [dropDirection, setDropDirection] = useState<'up' | 'down'>('down');\n const triggerRef = useRef<HTMLButtonElement>(null);\n const portalRef = useRef<HTMLDivElement>(null);\n\n const updateDropdownPosition = useCallback(() => {\n if (!triggerRef.current) return;\n const rect = triggerRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const dropdownWidth = Math.min(\n DROPDOWN_WIDTH,\n Math.max(0, viewportWidth - DROPDOWN_VIEWPORT_MARGIN * 2),\n );\n const estimatedDropdownHeight = mode === 'year-month-day' ? 392 : 304;\n const dropdownHeight =\n portalRef.current?.offsetHeight || estimatedDropdownHeight;\n const gap = 6;\n const spaceBelow = window.innerHeight - rect.bottom;\n const shouldDropUp = spaceBelow < dropdownHeight;\n const top = shouldDropUp\n ? Math.max(DROPDOWN_VIEWPORT_MARGIN, rect.top - dropdownHeight - gap)\n : rect.bottom + gap;\n const preferredLeft =\n rect.left + dropdownWidth > viewportWidth - DROPDOWN_VIEWPORT_MARGIN\n ? rect.right - dropdownWidth\n : rect.left;\n const maxLeft = Math.max(\n DROPDOWN_VIEWPORT_MARGIN,\n viewportWidth - dropdownWidth - DROPDOWN_VIEWPORT_MARGIN,\n );\n const left = Math.min(\n Math.max(DROPDOWN_VIEWPORT_MARGIN, preferredLeft),\n maxLeft,\n );\n setDropDirection(shouldDropUp ? 'up' : 'down');\n setDropdownStyle({\n position: 'fixed',\n left,\n top,\n width: dropdownWidth,\n zIndex: 9999,\n });\n }, [mode]);\n\n // 解析当前值\n const parsed = useMemo(() => parseDate(value), [value]);\n\n // 今天\n const todayDate = useMemo(() => {\n const d = new Date();\n return { year: d.getFullYear(), month: d.getMonth(), day: d.getDate() };\n }, []);\n\n const todayStr = useMemo(() => {\n return `${todayDate.year}-${pad(todayDate.month + 1)}-${pad(todayDate.day)}`;\n }, [todayDate]);\n\n const currentYearPageStart = useMemo(\n () => getYearPageStart(todayDate.year),\n [todayDate.year],\n );\n const defaultMinYearPageStart = useMemo(\n () => currentYearPageStart - YEAR_PAGE_SIZE * DEFAULT_YEAR_RANGE_PREV_PAGES,\n [currentYearPageStart],\n );\n const defaultMaxYearPageStart = useMemo(\n () => currentYearPageStart + YEAR_PAGE_SIZE * DEFAULT_YEAR_RANGE_NEXT_PAGES,\n [currentYearPageStart],\n );\n\n const resolvedMinYearPageStart = useMemo(() => {\n if (!minDate) return defaultMinYearPageStart;\n return Math.min(\n defaultMinYearPageStart,\n getYearPageStart(Number(minDate.substring(0, 4))),\n );\n }, [defaultMinYearPageStart, minDate]);\n\n const resolvedMaxYearPageStart = useMemo(() => {\n if (!maxDate) return defaultMaxYearPageStart;\n return Math.max(\n defaultMaxYearPageStart,\n getYearPageStart(Number(maxDate.substring(0, 4))),\n );\n }, [defaultMaxYearPageStart, maxDate]);\n\n // 视图年月\n const [viewYear, setViewYear] = useState(parsed?.year ?? todayDate.year);\n const [viewMonth, setViewMonth] = useState(parsed?.month ?? todayDate.month);\n\n // 从 value 同步视图\n useEffect(() => {\n if (parsed) {\n setViewYear(parsed.year);\n setViewMonth(parsed.month);\n }\n }, [parsed]);\n\n // 关闭下拉(带动画)\n const closeDropdown = useCallback(() => {\n if (closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);\n setIsAnimatingOut(true);\n closeTimeoutRef.current = setTimeout(() => {\n setOpen(false);\n setIsAnimatingOut(false);\n }, 120);\n }, []);\n\n // 立即关闭(无动画,用于选择日期后)\n const closeDropdownImmediate = useCallback(() => {\n if (closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);\n setOpen(false);\n setIsAnimatingOut(false);\n }, []);\n\n // 打开弹窗时初始化:有 value 定位到 value 的年月,否则定位到当月\n useEffect(() => {\n if (open) {\n setDayView('day');\n setShowYearPicker(false);\n if (parsed) {\n setViewYear(parsed.year);\n setViewMonth(parsed.month);\n } else {\n setViewYear(todayDate.year);\n setViewMonth(todayDate.month);\n }\n const initialYearPageStart = getYearPageStart(\n parsed?.year ?? todayDate.year,\n );\n setDayYearPickerStart(initialYearPageStart);\n setYearPickerStart(initialYearPageStart);\n updateDropdownPosition();\n }\n }, [open]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // 下拉打开时监听滚动和 resize 更新位置\n useEffect(() => {\n if (!open) return;\n updateDropdownPosition();\n window.addEventListener('scroll', updateDropdownPosition, true);\n window.addEventListener('resize', updateDropdownPosition);\n return () => {\n window.removeEventListener('scroll', updateDropdownPosition, true);\n window.removeEventListener('resize', updateDropdownPosition);\n };\n }, [open, updateDropdownPosition]);\n\n useEffect(() => {\n if (!open) return;\n\n const frameId = window.requestAnimationFrame(() => {\n updateDropdownPosition();\n });\n\n if (!portalRef.current || typeof ResizeObserver === 'undefined') {\n return () => {\n window.cancelAnimationFrame(frameId);\n };\n }\n\n const observer = new ResizeObserver(() => {\n updateDropdownPosition();\n });\n observer.observe(portalRef.current);\n\n return () => {\n window.cancelAnimationFrame(frameId);\n observer.disconnect();\n };\n }, [open, updateDropdownPosition, dayView, showYearPicker]);\n\n // 清理定时器\n useEffect(() => {\n return () => {\n if (closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);\n };\n }, []);\n\n // 外部点击关闭\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n // 忽略触发器和 portal 下拉面板内的点击\n if (ref.current?.contains(target)) return;\n const portal = document.querySelector('[data-date-picker-portal]');\n if (portal?.contains(target)) return;\n closeDropdown();\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open, closeDropdown]);\n\n // ─── 范围限制工具 ──────────────────────────────────\n\n const isDateDisabled = useCallback(\n (dateStr: string) => {\n if (!minDate && !maxDate) return false;\n const d = dateStr.length > 7 ? dateStr : dateStr + '-01';\n const min = minDate\n ? minDate.length === 7\n ? minDate + '-01'\n : minDate\n : null;\n const max = maxDate\n ? maxDate.length === 7\n ? maxDate + '-31'\n : maxDate\n : null;\n if (min && d < min) return true;\n if (max && d > max) return true;\n return false;\n },\n [minDate, maxDate],\n );\n\n const isMonthDisabled = useCallback(\n (year: number, month: number) => {\n const str = `${year}-${pad(month + 1)}`;\n if (minDate && str < minDate.substring(0, 7)) return true;\n if (maxDate && str > maxDate.substring(0, 7)) return true;\n return false;\n },\n [minDate, maxDate],\n );\n\n const isYearDisabled = useCallback(\n (year: number) => {\n if (minDate && year < Number(minDate.substring(0, 4))) return true;\n if (maxDate && year > Number(maxDate.substring(0, 4))) return true;\n return false;\n },\n [minDate, maxDate],\n );\n\n // ─── 导航处理 ──────────────────────────────────────\n\n const animateSlide = useCallback((direction: 'left' | 'right') => {\n setSlideDirection(direction);\n setIsAnimating(true);\n }, []);\n\n const handleAnimationEnd = useCallback(() => {\n setSlideDirection(null);\n setIsAnimating(false);\n }, []);\n\n const canGoPrevMonth = useMemo(() => {\n if (!minDate) return true;\n const prevMonth = viewMonth === 0 ? 11 : viewMonth - 1;\n const prevYear = viewMonth === 0 ? viewYear - 1 : viewYear;\n return (\n !isMonthDisabled(prevYear, prevMonth) ||\n compareDateStr(\n `${prevYear}-${pad(prevMonth + 1)}`,\n minDate.substring(0, 7),\n ) >= 0\n );\n }, [viewYear, viewMonth, minDate, isMonthDisabled]);\n\n const canGoNextMonth = useMemo(() => {\n if (!maxDate) return true;\n const nextMonth = viewMonth === 11 ? 0 : viewMonth + 1;\n const nextYear = viewMonth === 11 ? viewYear + 1 : viewYear;\n return (\n !isMonthDisabled(nextYear, nextMonth) ||\n compareDateStr(\n `${nextYear}-${pad(nextMonth + 1)}`,\n maxDate.substring(0, 7),\n ) <= 0\n );\n }, [viewYear, viewMonth, maxDate, isMonthDisabled]);\n\n const canGoPrevYearRange = yearPickerStart > resolvedMinYearPageStart;\n const canGoNextYearRange = yearPickerStart < resolvedMaxYearPageStart;\n const canGoPrevDayYearRange = dayYearPickerStart > resolvedMinYearPageStart;\n const canGoNextDayYearRange = dayYearPickerStart < resolvedMaxYearPageStart;\n\n // year-month-day 模式导航\n const prevMonth = useCallback(() => {\n if (isAnimating) return;\n if (viewMonth === 0) {\n setViewMonth(11);\n setViewYear((y) => y - 1);\n } else {\n setViewMonth((m) => m - 1);\n }\n animateSlide('right');\n }, [viewMonth, isAnimating, animateSlide]);\n\n const nextMonth = useCallback(() => {\n if (isAnimating) return;\n if (viewMonth === 11) {\n setViewMonth(0);\n setViewYear((y) => y + 1);\n } else {\n setViewMonth((m) => m + 1);\n }\n animateSlide('left');\n }, [viewMonth, isAnimating, animateSlide]);\n\n // year-month 模式导航\n const prevYear = useCallback(() => {\n setViewYear((y) => y - 1);\n animateSlide('right');\n }, [animateSlide]);\n\n const nextYear = useCallback(() => {\n setViewYear((y) => y + 1);\n animateSlide('left');\n }, [animateSlide]);\n\n const prevYearRange = useCallback(() => {\n setYearPickerStart((s) =>\n Math.max(resolvedMinYearPageStart, s - YEAR_PAGE_SIZE),\n );\n }, [resolvedMinYearPageStart]);\n\n const nextYearRange = useCallback(() => {\n setYearPickerStart((s) =>\n Math.min(resolvedMaxYearPageStart, s + YEAR_PAGE_SIZE),\n );\n }, [resolvedMaxYearPageStart]);\n\n const prevDayYearRange = useCallback(() => {\n setDayYearPickerStart((s) =>\n Math.max(resolvedMinYearPageStart, s - YEAR_PAGE_SIZE),\n );\n }, [resolvedMinYearPageStart]);\n\n const nextDayYearRange = useCallback(() => {\n setDayYearPickerStart((s) =>\n Math.min(resolvedMaxYearPageStart, s + YEAR_PAGE_SIZE),\n );\n }, [resolvedMaxYearPageStart]);\n\n // ─── 选择处理 ──────────────────────────────────────\n\n const selectDate = useCallback(\n (dateStr: string) => {\n if (isDateDisabled(dateStr)) return;\n onChange(dateStr);\n closeDropdownImmediate();\n },\n [onChange, isDateDisabled, closeDropdownImmediate],\n );\n\n const selectMonth = useCallback(\n (year: number, month: number) => {\n const str = `${year}-${pad(month + 1)}`;\n if (minDate && str < minDate.substring(0, 7)) return;\n if (maxDate && str > maxDate.substring(0, 7)) return;\n onChange(str);\n closeDropdownImmediate();\n },\n [onChange, minDate, maxDate, closeDropdownImmediate],\n );\n\n const selectYear = useCallback(\n (year: number) => {\n if (isYearDisabled(year)) return;\n setViewYear(year);\n setYearPickerStart(getYearPageStart(year));\n setShowYearPicker(false);\n },\n [isYearDisabled],\n );\n\n // 年月日模式下选年份后回到月份选择\n const selectYearInDayMode = useCallback(\n (year: number) => {\n if (isYearDisabled(year)) return;\n setViewYear(year);\n setDayYearPickerStart(getYearPageStart(year));\n setDayView('month');\n },\n [isYearDisabled],\n );\n\n // 年月日模式下选月份后回到日历\n const selectMonthInDayMode = useCallback((month: number) => {\n setViewMonth(month);\n setDayView('day');\n }, []);\n\n // ─── 显示值 ────────────────────────────────────────\n\n const displayValue = useMemo(() => {\n return formatValue(value, mode, format);\n }, [value, mode, format]);\n\n // ─── 日历数据 ──────────────────────────────────────\n\n const days = useMemo(() => {\n const total = getDaysInMonth(viewYear, viewMonth);\n const firstDay = getFirstDayOfWeek(viewYear, viewMonth);\n const prevTotal =\n viewMonth === 0\n ? getDaysInMonth(viewYear - 1, 11)\n : getDaysInMonth(viewYear, viewMonth - 1);\n\n const cells: Array<{ day: number; current: boolean; dateStr: string }> = [];\n\n for (let i = firstDay - 1; i >= 0; i--) {\n const d = prevTotal - i;\n const m = viewMonth === 0 ? 11 : viewMonth - 1;\n const y = viewMonth === 0 ? viewYear - 1 : viewYear;\n cells.push({\n day: d,\n current: false,\n dateStr: `${y}-${pad(m + 1)}-${pad(d)}`,\n });\n }\n\n for (let d = 1; d <= total; d++) {\n cells.push({\n day: d,\n current: true,\n dateStr: `${viewYear}-${pad(viewMonth + 1)}-${pad(d)}`,\n });\n }\n\n const remaining = 42 - cells.length;\n for (let d = 1; d <= remaining; d++) {\n const m = viewMonth === 11 ? 0 : viewMonth + 1;\n const y = viewMonth === 11 ? viewYear + 1 : viewYear;\n cells.push({\n day: d,\n current: false,\n dateStr: `${y}-${pad(m + 1)}-${pad(d)}`,\n });\n }\n\n return cells;\n }, [viewYear, viewMonth]);\n\n // 选中值解析(year-month 模式)\n const selectedMonth = useMemo(() => {\n if (mode !== 'year-month' || !value) return null;\n const p = parseDate(value);\n return p ? { year: p.year, month: p.month } : null;\n }, [value, mode]);\n\n // ─── 渲染 ──────────────────────────────────────────\n\n return (\n <div ref={ref} className={cn('relative', className)}>\n {/* 触发按钮 */}\n <button\n ref={triggerRef}\n type=\"button\"\n aria-label={triggerAriaLabel}\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n if (open) closeDropdown();\n else {\n setOpen(true);\n setIsAnimatingOut(false);\n }\n }}\n className={cn(\n `flex w-full items-center border border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] outline-none transition-all ${radiusTokens.control}`,\n 'hover:border-[var(--lumen-color-border-hover)] focus:border-[var(--lumen-color-primary)]',\n open &&\n !isAnimatingOut &&\n 'border-[var(--lumen-color-primary)] ring-1 ring-[var(--lumen-color-primary)]/10',\n tokens.trigger,\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n {displayValue ? (\n <span className=\"text-[var(--lumen-color-text)]\">{displayValue}</span>\n ) : (\n <span className=\"text-[var(--lumen-color-text-placeholder)]\">{placeholder}</span>\n )}\n <Calendar\n size={tokens.icon}\n className=\"ml-auto shrink-0 text-[var(--lumen-color-text-placeholder)]\"\n />\n </button>\n\n {/* 下拉面板(portal 到 body) */}\n {open &&\n createPortal(\n <div\n ref={portalRef}\n data-date-picker-portal\n className=\"rounded-[12px] border border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] shadow-xl\"\n style={{\n ...dropdownStyle,\n animation: isAnimatingOut\n ? dropDirection === 'up'\n ? 'lumen-dropdown-out-up 0.12s ease-in forwards'\n : 'lumen-dropdown-out 0.12s ease-in forwards'\n : dropDirection === 'up'\n ? 'lumen-dropdown-in-up 0.12s ease-out'\n : 'lumen-dropdown-in 0.12s ease-out',\n transformOrigin: dropDirection === 'up' ? 'bottom' : 'top',\n }}\n >\n {mode === 'year-month-day' ? (\n <DayModeContent\n tokens={tokens}\n viewYear={viewYear}\n viewMonth={viewMonth}\n days={days}\n value={value}\n todayStr={todayStr}\n todayDate={todayDate}\n slideDirection={slideDirection}\n dayView={dayView}\n dayYearPickerStart={dayYearPickerStart}\n canGoPrevDayYearRange={canGoPrevDayYearRange}\n canGoNextDayYearRange={canGoNextDayYearRange}\n selectDate={selectDate}\n prevDayYearRange={prevDayYearRange}\n nextDayYearRange={nextDayYearRange}\n prevMonth={prevMonth}\n nextMonth={nextMonth}\n onAnimationEnd={handleAnimationEnd}\n showToday={showToday}\n clearable={clearable}\n onClear={() => {\n onChange('');\n closeDropdown();\n }}\n onSelectToday={() => selectDate(todayStr)}\n isDateDisabled={isDateDisabled}\n canGoPrevMonth={canGoPrevMonth}\n canGoNextMonth={canGoNextMonth}\n setDayView={setDayView}\n selectYearInDayMode={selectYearInDayMode}\n selectMonthInDayMode={selectMonthInDayMode}\n prevYear={prevYear}\n nextYear={nextYear}\n isYearDisabled={isYearDisabled}\n isMonthDisabled={isMonthDisabled}\n />\n ) : (\n <MonthModeContent\n tokens={tokens}\n viewYear={viewYear}\n showYearPicker={showYearPicker}\n yearPickerStart={yearPickerStart}\n canGoPrevYearRange={canGoPrevYearRange}\n canGoNextYearRange={canGoNextYearRange}\n selectedMonth={selectedMonth}\n todayDate={todayDate}\n slideDirection={slideDirection}\n selectMonth={selectMonth}\n selectYear={selectYear}\n prevYear={prevYear}\n nextYear={nextYear}\n prevYearRange={prevYearRange}\n nextYearRange={nextYearRange}\n setShowYearPicker={setShowYearPicker}\n onAnimationEnd={handleAnimationEnd}\n showToday={showToday}\n clearable={clearable}\n onClear={() => {\n onChange('');\n closeDropdown();\n }}\n onSelectToday={() =>\n selectMonth(todayDate.year, todayDate.month)\n }\n isMonthDisabled={isMonthDisabled}\n isYearDisabled={isYearDisabled}\n />\n )}\n </div>,\n document.body,\n )}\n </div>\n );\n};\n\n// ─── 年月日模式内容 ────────────────────────────────────\n\ninterface DayModeContentProps {\n tokens: SizeToken;\n viewYear: number;\n viewMonth: number;\n days: Array<{ day: number; current: boolean; dateStr: string }>;\n value: string;\n todayStr: string;\n todayDate: { year: number; month: number; day: number };\n slideDirection: 'left' | 'right' | null;\n dayView: 'day' | 'month' | 'year';\n dayYearPickerStart: number;\n canGoPrevDayYearRange: boolean;\n canGoNextDayYearRange: boolean;\n selectDate: (dateStr: string) => void;\n prevDayYearRange: () => void;\n nextDayYearRange: () => void;\n prevMonth: () => void;\n nextMonth: () => void;\n onAnimationEnd: () => void;\n showToday: boolean;\n clearable: boolean;\n onClear: () => void;\n onSelectToday: () => void;\n isDateDisabled: (dateStr: string) => boolean;\n canGoPrevMonth: boolean;\n canGoNextMonth: boolean;\n setDayView: (v: 'day' | 'month' | 'year') => void;\n selectYearInDayMode: (year: number) => void;\n selectMonthInDayMode: (month: number) => void;\n prevYear: () => void;\n nextYear: () => void;\n isYearDisabled: (year: number) => boolean;\n isMonthDisabled: (year: number, month: number) => boolean;\n}\n\nconst DayModeContent: React.FC<DayModeContentProps> = ({\n tokens,\n viewYear,\n viewMonth,\n days,\n value,\n todayStr,\n todayDate,\n slideDirection,\n dayView,\n dayYearPickerStart,\n canGoPrevDayYearRange,\n canGoNextDayYearRange,\n selectDate,\n prevDayYearRange,\n nextDayYearRange,\n prevMonth,\n nextMonth,\n onAnimationEnd,\n showToday,\n clearable,\n onClear,\n onSelectToday,\n isDateDisabled,\n canGoPrevMonth,\n canGoNextMonth,\n setDayView,\n selectYearInDayMode,\n selectMonthInDayMode,\n prevYear,\n nextYear,\n isYearDisabled,\n isMonthDisabled,\n}) => (\n <>\n <div className={cn(tokens.dropdown, 'pb-0')}>\n {dayView === 'year' ? (\n /* ─── 年份选择器 ────────────────────────── */\n <>\n <div className=\"mb-3 flex items-center justify-between\">\n <button\n type=\"button\"\n disabled={!canGoPrevDayYearRange}\n onClick={prevDayYearRange}\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] transition-colors',\n canGoPrevDayYearRange\n ? 'hover:bg-[var(--lumen-color-surface-muted)]'\n : 'cursor-not-allowed opacity-40',\n )}\n >\n <ChevronLeft size={18} />\n </button>\n <span className={cn(tokens.header, 'font-semibold text-[var(--lumen-color-text)]')}>\n {dayYearPickerStart} - {dayYearPickerStart + 19}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNextDayYearRange}\n onClick={nextDayYearRange}\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] transition-colors',\n canGoNextDayYearRange\n ? 'hover:bg-[var(--lumen-color-surface-muted)]'\n : 'cursor-not-allowed opacity-40',\n )}\n >\n <ChevronRight size={18} />\n </button>\n </div>\n <div className=\"grid grid-cols-5 gap-1 text-center\">\n {Array.from({ length: 20 }, (_, i) => dayYearPickerStart + i).map(\n (y) => {\n const disabled = isYearDisabled(y);\n const isCurrent = y === todayDate.year;\n const isSelected = y === viewYear;\n return (\n <button\n key={y}\n type=\"button\"\n disabled={disabled}\n onClick={() => selectYearInDayMode(y)}\n className={cn(\n 'mx-auto flex h-10 w-full items-center justify-center rounded-full text-[13px] transition-all',\n isSelected &&\n 'bg-[var(--lumen-color-primary)] font-medium text-[var(--lumen-color-on-primary)] shadow-sm',\n !isSelected &&\n isCurrent &&\n 'font-semibold text-[var(--lumen-color-primary)]',\n !isSelected &&\n !isCurrent &&\n !disabled &&\n 'text-[var(--lumen-color-text-secondary)] hover:bg-[var(--lumen-color-primary-soft)]',\n disabled && 'cursor-not-allowed text-[var(--lumen-color-border-hover)]',\n )}\n >\n {y}\n </button>\n );\n },\n )}\n </div>\n </>\n ) : dayView === 'month' ? (\n /* ─── 月份选择器 ────────────────────────── */\n <>\n <div className=\"mb-3 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={prevYear}\n className=\"flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] transition-colors hover:bg-[var(--lumen-color-surface-muted)]\"\n >\n <ChevronLeft size={18} />\n </button>\n <button\n type=\"button\"\n onClick={() => setDayView('year')}\n className={cn(\n tokens.header,\n 'font-semibold text-[var(--lumen-color-text)] hover:text-[var(--lumen-color-primary)] transition-colors',\n )}\n >\n {viewYear}年\n </button>\n <button\n type=\"button\"\n onClick={nextYear}\n className=\"flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] transition-colors hover:bg-[var(--lumen-color-surface-muted)]\"\n >\n <ChevronRight size={18} />\n </button>\n </div>\n <div className=\"grid grid-cols-4 gap-2\">\n {MONTHS.map((label, idx) => {\n const isCurrent =\n viewYear === todayDate.year && idx === todayDate.month;\n const isSelected =\n viewYear === todayDate.year && idx === viewMonth;\n const disabled = isMonthDisabled(viewYear, idx);\n return (\n <button\n key={idx}\n type=\"button\"\n disabled={disabled}\n onClick={() => selectMonthInDayMode(idx)}\n className={cn(\n 'relative flex h-10 items-center justify-center rounded-full text-[13px] transition-all',\n isSelected &&\n 'bg-[var(--lumen-color-primary)] font-medium text-[var(--lumen-color-on-primary)] shadow-sm',\n !isSelected && isCurrent && 'font-semibold text-[var(--lumen-color-primary)]',\n !isSelected &&\n !isCurrent &&\n !disabled &&\n 'text-[var(--lumen-color-text-secondary)] hover:bg-[var(--lumen-color-primary-soft)] hover:text-[var(--lumen-color-primary)]',\n disabled && 'cursor-not-allowed text-[var(--lumen-color-border-hover)]',\n )}\n >\n {label}\n {isCurrent && !isSelected && (\n <span className=\"absolute bottom-1 left-1/2 h-1 w-1 -translate-x-1/2 rounded-full bg-[var(--lumen-color-primary)]\" />\n )}\n </button>\n );\n })}\n </div>\n </>\n ) : (\n /* ─── 日期选择器(默认视图) ────────────── */\n <>\n <div className=\"mb-3 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={prevMonth}\n disabled={!canGoPrevMonth}\n className=\"flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] transition-colors hover:bg-[var(--lumen-color-surface-muted)] disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <ChevronLeft size={18} />\n </button>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => setDayView('year')}\n className={cn(\n tokens.header,\n 'font-semibold text-[var(--lumen-color-text)] hover:text-[var(--lumen-color-primary)] transition-colors',\n )}\n >\n {viewYear}年\n </button>\n <button\n type=\"button\"\n onClick={() => setDayView('month')}\n className={cn(\n tokens.header,\n 'font-semibold text-[var(--lumen-color-text)] hover:text-[var(--lumen-color-primary)] transition-colors',\n )}\n >\n {MONTHS[viewMonth]}\n </button>\n </div>\n <button\n type=\"button\"\n onClick={nextMonth}\n disabled={!canGoNextMonth}\n className=\"flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] transition-colors hover:bg-[var(--lumen-color-surface-muted)] disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <ChevronRight size={18} />\n </button>\n </div>\n\n {/* 星期标题 + 日期网格(含翻页动画) */}\n <div className=\"overflow-hidden\">\n <div\n onAnimationEnd={onAnimationEnd}\n style={\n slideDirection === 'left'\n ? { animation: 'calendarSlideLeft 0.2s ease-out' }\n : slideDirection === 'right'\n ? { animation: 'calendarSlideRight 0.2s ease-out' }\n : undefined\n }\n >\n {/* 星期标题 */}\n <div className=\"mb-1 grid grid-cols-7 text-center\">\n {WEEKDAYS.map((w) => (\n <div\n key={w}\n className=\"py-1.5 text-[12px] font-medium text-[var(--lumen-color-text-placeholder)]\"\n >\n {w}\n </div>\n ))}\n </div>\n\n {/* 日期网格 */}\n <div className=\"grid grid-cols-7 text-center\">\n {days.map((cell, i) => {\n const isSelected = cell.dateStr === value;\n const isToday = cell.dateStr === todayStr;\n const isDisabled =\n cell.current && isDateDisabled(cell.dateStr);\n return (\n <button\n key={i}\n type=\"button\"\n onClick={() => selectDate(cell.dateStr)}\n className={cn(\n 'relative mx-auto flex items-center justify-center rounded-full transition-all',\n tokens.cell,\n !cell.current && 'text-[var(--lumen-color-border-hover)]',\n isDisabled && 'pointer-events-none text-[var(--lumen-color-border-hover)]',\n cell.current &&\n !isSelected &&\n !isDisabled &&\n 'text-[var(--lumen-color-text-secondary)] hover:bg-[var(--lumen-color-primary-soft)] hover:text-[var(--lumen-color-primary)]',\n isSelected &&\n 'bg-[var(--lumen-color-primary)] text-[var(--lumen-color-on-primary)] font-medium shadow-sm',\n isToday &&\n !isSelected &&\n !isDisabled &&\n 'font-semibold text-[var(--lumen-color-primary)]',\n )}\n >\n {cell.day}\n {isToday && !isSelected && (\n <span className=\"absolute bottom-0.5 left-1/2 h-1 w-1 -translate-x-1/2 rounded-full bg-[var(--lumen-color-primary)]\" />\n )}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n </>\n )}\n </div>\n\n {/* 底部操作 */}\n {(showToday || (clearable && value)) && (\n <div className=\"flex items-center justify-between border-t border-[var(--lumen-color-surface-muted)] px-4 py-3\">\n {showToday && (\n <button\n type=\"button\"\n onClick={onSelectToday}\n className={cn(\n tokens.footer,\n 'font-medium text-[var(--lumen-color-primary)] hover:text-[var(--lumen-color-primary-active)] transition-colors',\n )}\n >\n 今天\n </button>\n )}\n {clearable && value && (\n <button\n type=\"button\"\n onClick={onClear}\n className={cn(\n tokens.footer,\n 'text-[var(--lumen-color-text-placeholder)] hover:text-[var(--lumen-color-text-muted)] transition-colors ml-auto',\n )}\n >\n 清除\n </button>\n )}\n </div>\n )}\n </>\n);\n\n// ─── 年月模式内容 ──────────────────────────────────────\n\ninterface MonthModeContentProps {\n tokens: SizeToken;\n viewYear: number;\n showYearPicker: boolean;\n yearPickerStart: number;\n canGoPrevYearRange: boolean;\n canGoNextYearRange: boolean;\n selectedMonth: { year: number; month: number } | null;\n todayDate: { year: number; month: number; day: number };\n slideDirection: 'left' | 'right' | null;\n selectMonth: (year: number, month: number) => void;\n selectYear: (year: number) => void;\n prevYear: () => void;\n nextYear: () => void;\n setShowYearPicker: (v: boolean) => void;\n onAnimationEnd: () => void;\n prevYearRange: () => void;\n nextYearRange: () => void;\n showToday: boolean;\n clearable: boolean;\n onClear: () => void;\n onSelectToday: () => void;\n isMonthDisabled: (year: number, month: number) => boolean;\n isYearDisabled: (year: number) => boolean;\n}\n\nconst MonthModeContent: React.FC<MonthModeContentProps> = ({\n tokens,\n viewYear,\n showYearPicker,\n yearPickerStart,\n canGoPrevYearRange,\n canGoNextYearRange,\n selectedMonth,\n todayDate,\n slideDirection,\n selectMonth,\n selectYear,\n prevYear,\n nextYear,\n prevYearRange,\n nextYearRange,\n setShowYearPicker,\n onAnimationEnd,\n showToday,\n clearable,\n onClear,\n onSelectToday,\n isMonthDisabled,\n isYearDisabled,\n}) => (\n <>\n <div className={cn(tokens.dropdown, 'pb-0')}>\n {showYearPicker ? (\n // ─── 年份选择器 ──────────────────────────\n <>\n <div className=\"mb-3 flex items-center justify-between\">\n <button\n type=\"button\"\n disabled={!canGoPrevYearRange}\n onClick={prevYearRange}\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] transition-colors',\n canGoPrevYearRange\n ? 'hover:bg-[var(--lumen-color-surface-muted)]'\n : 'cursor-not-allowed opacity-40',\n )}\n >\n <ChevronLeft size={18} />\n </button>\n <span className={cn(tokens.header, 'font-semibold text-[var(--lumen-color-text)]')}>\n {yearPickerStart} - {yearPickerStart + 19}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNextYearRange}\n onClick={nextYearRange}\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] transition-colors',\n canGoNextYearRange\n ? 'hover:bg-[var(--lumen-color-surface-muted)]'\n : 'cursor-not-allowed opacity-40',\n )}\n >\n <ChevronRight size={18} />\n </button>\n </div>\n <div className=\"grid grid-cols-5 gap-1 text-center\">\n {Array.from({ length: 20 }, (_, i) => yearPickerStart + i).map(\n (y) => {\n const disabled = isYearDisabled(y);\n const isCurrent = y === todayDate.year;\n const isSelected = y === viewYear;\n return (\n <button\n key={y}\n type=\"button\"\n disabled={disabled}\n onClick={() => selectYear(y)}\n className={cn(\n 'mx-auto flex h-10 w-full items-center justify-center rounded-full text-[13px] transition-all',\n isSelected &&\n 'bg-[var(--lumen-color-primary)] font-medium text-[var(--lumen-color-on-primary)] shadow-sm',\n !isSelected &&\n isCurrent &&\n 'font-semibold text-[var(--lumen-color-primary)]',\n !isSelected &&\n !isCurrent &&\n !disabled &&\n 'text-[var(--lumen-color-text-secondary)] hover:bg-[var(--lumen-color-primary-soft)]',\n disabled && 'cursor-not-allowed text-[var(--lumen-color-border-hover)]',\n )}\n >\n {y}\n </button>\n );\n },\n )}\n </div>\n </>\n ) : (\n // ─── 月份选择器 ──────────────────────────\n <>\n <div className=\"mb-3 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={prevYear}\n className=\"flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] transition-colors hover:bg-[var(--lumen-color-surface-muted)]\"\n >\n <ChevronLeft size={18} />\n </button>\n <button\n type=\"button\"\n onClick={() => setShowYearPicker(true)}\n className={cn(\n tokens.header,\n 'font-semibold text-[var(--lumen-color-text)] hover:text-[var(--lumen-color-primary)] transition-colors',\n )}\n >\n {viewYear}年\n </button>\n <button\n type=\"button\"\n onClick={nextYear}\n className=\"flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] transition-colors hover:bg-[var(--lumen-color-surface-muted)]\"\n >\n <ChevronRight size={18} />\n </button>\n </div>\n <div className=\"overflow-hidden\">\n <div\n onAnimationEnd={onAnimationEnd}\n style={\n slideDirection === 'left'\n ? { animation: 'calendarSlideLeft 0.2s ease-out' }\n : slideDirection === 'right'\n ? { animation: 'calendarSlideRight 0.2s ease-out' }\n : undefined\n }\n >\n <div className=\"grid grid-cols-4 gap-2\">\n {MONTHS.map((label, idx) => {\n const isSelected =\n selectedMonth?.year === viewYear &&\n selectedMonth?.month === idx;\n const isCurrent =\n viewYear === todayDate.year && idx === todayDate.month;\n const disabled = isMonthDisabled(viewYear, idx);\n return (\n <button\n key={idx}\n type=\"button\"\n disabled={disabled}\n onClick={() => selectMonth(viewYear, idx)}\n className={cn(\n 'relative flex h-10 items-center justify-center rounded-full text-[13px] transition-all',\n isSelected &&\n 'bg-[var(--lumen-color-primary)] font-medium text-[var(--lumen-color-on-primary)] shadow-sm',\n !isSelected &&\n isCurrent &&\n 'font-semibold text-[var(--lumen-color-primary)]',\n !isSelected &&\n !isCurrent &&\n !disabled &&\n 'text-[var(--lumen-color-text-secondary)] hover:bg-[var(--lumen-color-primary-soft)] hover:text-[var(--lumen-color-primary)]',\n disabled && 'cursor-not-allowed text-[var(--lumen-color-border-hover)]',\n )}\n >\n {label}\n {isCurrent && !isSelected && (\n <span className=\"absolute bottom-1 left-1/2 h-1 w-1 -translate-x-1/2 rounded-full bg-[var(--lumen-color-primary)]\" />\n )}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n </>\n )}\n </div>\n\n {/* 底部操作 */}\n {(showToday || (clearable && selectedMonth)) && (\n <div className=\"flex items-center justify-between border-t border-[var(--lumen-color-surface-muted)] px-4 py-3\">\n {showToday && (\n <button\n type=\"button\"\n onClick={onSelectToday}\n className={cn(\n tokens.footer,\n 'font-medium text-[var(--lumen-color-primary)] hover:text-[var(--lumen-color-primary-active)] transition-colors',\n )}\n >\n 今天\n </button>\n )}\n {clearable && selectedMonth && (\n <button\n type=\"button\"\n onClick={onClear}\n className={cn(\n tokens.footer,\n 'text-[var(--lumen-color-text-placeholder)] hover:text-[var(--lumen-color-text-muted)] transition-colors ml-auto',\n )}\n >\n 清除\n </button>\n )}\n </div>\n )}\n </>\n);\n","import React, { useEffect, useMemo, useRef } from 'react';\nimport { cn } from './classNames';\n\nexport type TimePrecision = 'minute' | 'second';\n\nexport interface TimeSelectorProps {\n hour: string;\n minute: string;\n second?: string;\n onHourChange: (value: string) => void;\n onMinuteChange: (value: string) => void;\n onSecondChange?: (value: string) => void;\n precision?: TimePrecision;\n minuteStep?: number;\n isHourDisabled?: (value: string) => boolean;\n isMinuteDisabled?: (value: string) => boolean;\n isSecondDisabled?: (value: string) => boolean;\n className?: string;\n}\n\nconst pad = (value: number) => String(value).padStart(2, '0');\n\nconst buildOptions = (count: number, step = 1) => {\n const values: string[] = [];\n for (let value = 0; value < count; value += step) {\n values.push(pad(value));\n }\n return values;\n};\n\ninterface TimeColumnProps {\n title: string;\n values: string[];\n selected: string;\n onSelect: (value: string) => void;\n isDisabled?: (value: string) => boolean;\n}\n\nconst TimeColumn: React.FC<TimeColumnProps> = ({\n title,\n values,\n selected,\n onSelect,\n isDisabled,\n}) => (\n <div className=\"min-w-0 flex-1 border-l border-[var(--lumen-color-surface-muted)] first:border-l-0\">\n <div className=\"border-b border-[var(--lumen-color-surface-muted)] px-2 py-2 text-center text-[12px] font-medium text-[var(--lumen-color-text-muted)]\">\n {title}\n </div>\n <div\n data-time-selector-column\n data-date-time-picker-time-column\n className=\"date-time-picker-time-column time-selector-column max-h-[266px] overflow-y-auto p-1\"\n >\n {values.map((item) => {\n const disabled = isDisabled?.(item) ?? false;\n return (\n <button\n key={item}\n type=\"button\"\n aria-label={`${title}${item}`}\n aria-current={selected === item ? 'time' : undefined}\n data-selected={selected === item ? 'true' : undefined}\n disabled={disabled}\n onClick={() => onSelect(item)}\n className={cn(\n 'block w-full rounded-[6px] px-2 py-1.5 text-center text-[13px] transition-colors',\n selected === item\n ? 'bg-[var(--lumen-color-primary)] font-medium text-[var(--lumen-color-on-primary)]'\n : 'text-[var(--lumen-color-text-secondary)] hover:bg-[var(--lumen-color-primary-soft)] hover:text-[var(--lumen-color-primary)]',\n disabled &&\n 'cursor-not-allowed text-[var(--lumen-color-border-hover)] hover:bg-transparent hover:text-[var(--lumen-color-border-hover)]',\n )}\n >\n {item}\n </button>\n );\n })}\n </div>\n </div>\n);\n\nexport const TimeSelector: React.FC<TimeSelectorProps> = ({\n hour,\n minute,\n second = '00',\n onHourChange,\n onMinuteChange,\n onSecondChange,\n precision = 'minute',\n minuteStep = 1,\n isHourDisabled,\n isMinuteDisabled,\n isSecondDisabled,\n className,\n}) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const hours = useMemo(() => buildOptions(24), []);\n const minutes = useMemo(() => buildOptions(60, minuteStep), [minuteStep]);\n const seconds = useMemo(() => buildOptions(60), []);\n\n useEffect(() => {\n const frame = window.requestAnimationFrame(() => {\n rootRef.current\n ?.querySelectorAll<HTMLElement>('[data-time-selector-column]')\n .forEach((column) => {\n const selected = column.querySelector<HTMLElement>(\n '[data-selected=\"true\"]',\n );\n if (!selected) return;\n const top = Math.max(\n 0,\n selected.offsetTop -\n column.clientHeight / 2 +\n selected.offsetHeight / 2,\n );\n if (typeof column.scrollTo === 'function') {\n column.scrollTo({ top });\n } else {\n column.scrollTop = top;\n }\n });\n });\n return () => window.cancelAnimationFrame(frame);\n }, []);\n\n return (\n <>\n <style>{`\n .time-selector-column { scrollbar-width: none; }\n .time-selector-column::-webkit-scrollbar { width: 0; }\n .time-selector-column:hover,\n .time-selector-column:focus-within {\n scrollbar-width: thin;\n scrollbar-color: var(--lumen-color-border-hover) transparent;\n }\n .time-selector-column:hover::-webkit-scrollbar,\n .time-selector-column:focus-within::-webkit-scrollbar { width: 6px; }\n .time-selector-column::-webkit-scrollbar-thumb {\n border-radius: 999px;\n background: var(--lumen-color-border-hover);\n }\n .time-selector-column::-webkit-scrollbar-track { background: transparent; }\n `}</style>\n <div\n ref={rootRef}\n className={cn(\n 'grid',\n precision === 'minute' ? 'grid-cols-2' : 'grid-cols-3',\n className,\n )}\n >\n <TimeColumn\n title=\"时\"\n values={hours}\n selected={hour}\n onSelect={onHourChange}\n isDisabled={isHourDisabled}\n />\n <TimeColumn\n title=\"分\"\n values={minutes}\n selected={minute}\n onSelect={onMinuteChange}\n isDisabled={isMinuteDisabled}\n />\n {precision === 'second' ? (\n <TimeColumn\n title=\"秒\"\n values={seconds}\n selected={second}\n onSelect={onSecondChange ?? (() => undefined)}\n isDisabled={isSecondDisabled}\n />\n ) : null}\n </div>\n </>\n );\n};\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { Calendar, ChevronLeft, ChevronRight, Clock } from 'lucide-react';\nimport { Button } from './Button';\nimport { cn } from './classNames';\nimport { radiusTokens } from './designTokens';\nimport { TimeSelector } from './TimeSelector';\n\nexport interface DateTimePickerProps {\n value: string;\n onChange: (value: string) => void;\n label: string;\n disabled?: boolean;\n className?: string;\n minuteStep?: number;\n placeholder?: string;\n precision?: 'minute' | 'second';\n minDate?: string;\n minDateTime?: string;\n defaultToNow?: boolean;\n}\n\nconst WEEKDAYS = ['日', '一', '二', '三', '四', '五', '六'];\nconst MONTHS = [\n '1月',\n '2月',\n '3月',\n '4月',\n '5月',\n '6月',\n '7月',\n '8月',\n '9月',\n '10月',\n '11月',\n '12月',\n];\n\nconst pad = (value: number) => String(value).padStart(2, '0');\n\nconst formatDate = (date: Date) =>\n `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n\nconst formatDateTime = (\n date: string,\n hour: string,\n minute: string,\n second: string,\n) => `${date} ${hour}:${minute}:${second}`;\n\nconst formatDisplayDateTime = (\n date: string,\n hour: string,\n minute: string,\n second: string,\n precision: 'minute' | 'second',\n) =>\n precision === 'minute'\n ? `${date} ${hour}:${minute}`\n : formatDateTime(date, hour, minute, second);\n\nconst parseDateTime = (value: string) => {\n const matched = value\n .trim()\n .replace('T', ' ')\n .match(/^(\\d{4}-\\d{2}-\\d{2})(?:\\s+(\\d{2}):(\\d{2})(?::(\\d{2}))?)?$/);\n if (!matched) {\n return null;\n }\n return {\n date: matched[1]!,\n hour: matched[2] ?? '09',\n minute: matched[3] ?? '00',\n second: matched[4] ?? '00',\n };\n};\n\nconst getDateTimeTimestamp = (\n date: string,\n hour: string,\n minute: string,\n second: string,\n) => {\n const matched = date.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!matched) {\n return null;\n }\n const timestamp = new Date(\n Number(matched[1]),\n Number(matched[2]) - 1,\n Number(matched[3]),\n Number(hour),\n Number(minute),\n Number(second),\n ).getTime();\n return Number.isNaN(timestamp) ? null : timestamp;\n};\n\nconst getParsedTimestamp = (value?: string) => {\n if (!value) {\n return null;\n }\n const parsed = parseDateTime(value);\n return parsed\n ? getDateTimeTimestamp(\n parsed.date,\n parsed.hour,\n parsed.minute,\n parsed.second,\n )\n : null;\n};\n\nconst getDaysInMonth = (year: number, month: number) =>\n new Date(year, month + 1, 0).getDate();\n\nconst getCalendarCells = (year: number, month: number) => {\n const firstDay = new Date(year, month, 1).getDay();\n const currentDays = getDaysInMonth(year, month);\n const previousMonth = month === 0 ? 11 : month - 1;\n const previousYear = month === 0 ? year - 1 : year;\n const previousDays = getDaysInMonth(previousYear, previousMonth);\n const cells: Array<{ date: string; day: number; current: boolean }> = [];\n\n for (let index = firstDay - 1; index >= 0; index -= 1) {\n const day = previousDays - index;\n cells.push({\n date: `${previousYear}-${pad(previousMonth + 1)}-${pad(day)}`,\n day,\n current: false,\n });\n }\n\n for (let day = 1; day <= currentDays; day += 1) {\n cells.push({\n date: `${year}-${pad(month + 1)}-${pad(day)}`,\n day,\n current: true,\n });\n }\n\n const nextMonth = month === 11 ? 0 : month + 1;\n const nextYear = month === 11 ? year + 1 : year;\n while (cells.length < 42) {\n const day = cells.length - firstDay - currentDays + 1;\n cells.push({\n date: `${nextYear}-${pad(nextMonth + 1)}-${pad(day)}`,\n day,\n current: false,\n });\n }\n\n return cells;\n};\n\nconst PANEL_WIDTH = 560;\nconst ESTIMATED_PANEL_HEIGHT = 374;\nconst PANEL_GAP = 6;\nconst CLOSE_ANIMATION_DURATION = 120;\n\nexport const DateTimePicker: React.FC<DateTimePickerProps> = ({\n value,\n onChange,\n label,\n disabled = false,\n className,\n minuteStep = 1,\n placeholder = '请选择日期时间',\n precision = 'second',\n minDate,\n minDateTime,\n defaultToNow = false,\n}) => {\n const parsed = useMemo(() => parseDateTime(value), [value]);\n const today = useMemo(() => new Date(), []);\n const initialDate = parsed?.date ?? formatDate(today);\n const initialYear = Number(initialDate.slice(0, 4));\n const initialMonth = Number(initialDate.slice(5, 7)) - 1;\n\n const [open, setOpen] = useState(false);\n const [viewYear, setViewYear] = useState(initialYear);\n const [viewMonth, setViewMonth] = useState(initialMonth);\n const [draftDate, setDraftDate] = useState(initialDate);\n const [draftHour, setDraftHour] = useState(\n parsed?.hour ?? (defaultToNow ? pad(today.getHours()) : '09'),\n );\n const [draftMinute, setDraftMinute] = useState(\n parsed?.minute ?? (defaultToNow ? pad(today.getMinutes()) : '00'),\n );\n const [draftSecond, setDraftSecond] = useState(\n parsed?.second ?? (defaultToNow ? pad(today.getSeconds()) : '00'),\n );\n const [dropDirection, setDropDirection] = useState<'up' | 'down'>('down');\n const [isAnimatingOut, setIsAnimatingOut] = useState(false);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const closeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const syncedValueRef = useRef(value);\n const [panelStyle, setPanelStyle] = useState<React.CSSProperties>({\n position: 'fixed',\n zIndex: 9999,\n });\n\n const cells = useMemo(\n () => getCalendarCells(viewYear, viewMonth),\n [viewMonth, viewYear],\n );\n const minDateText = minDate ?? parseDateTime(minDateTime ?? '')?.date ?? null;\n const minDateTimeValue = getParsedTimestamp(minDateTime);\n const displayValue = parsed\n ? formatDisplayDateTime(\n parsed.date,\n parsed.hour,\n parsed.minute,\n parsed.second,\n precision,\n )\n : '';\n\n const syncDraftFromValue = useCallback(() => {\n const next = parseDateTime(value);\n const fallback = defaultToNow ? new Date() : today;\n const nextDate = next?.date ?? formatDate(fallback);\n setDraftDate(nextDate);\n setDraftHour(\n next?.hour ?? (defaultToNow ? pad(fallback.getHours()) : '09'),\n );\n setDraftMinute(\n next?.minute ?? (defaultToNow ? pad(fallback.getMinutes()) : '00'),\n );\n setDraftSecond(\n next?.second ?? (defaultToNow ? pad(fallback.getSeconds()) : '00'),\n );\n setViewYear(Number(nextDate.slice(0, 4)));\n setViewMonth(Number(nextDate.slice(5, 7)) - 1);\n syncedValueRef.current = value;\n }, [defaultToNow, today, value]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n if (syncedValueRef.current === value) {\n return;\n }\n syncDraftFromValue();\n }, [open, syncDraftFromValue, value]);\n\n const updatePosition = useCallback(() => {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (!rect) {\n return;\n }\n const panelHeight =\n panelRef.current?.offsetHeight || ESTIMATED_PANEL_HEIGHT;\n const panelWidth = Math.min(PANEL_WIDTH, Math.max(0, window.innerWidth - 16));\n const spaceBelow = window.innerHeight - rect.bottom;\n const shouldDropUp = spaceBelow < panelHeight + PANEL_GAP;\n const top = shouldDropUp\n ? Math.max(8, rect.top - panelHeight - PANEL_GAP)\n : rect.bottom + PANEL_GAP;\n const left = Math.min(\n Math.max(8, rect.left),\n Math.max(8, window.innerWidth - panelWidth - 8),\n );\n setDropDirection(shouldDropUp ? 'up' : 'down');\n setPanelStyle({\n position: 'fixed',\n left,\n top,\n width: panelWidth,\n maxHeight: 'calc(100dvh - 16px)',\n zIndex: 9999,\n });\n }, []);\n\n const openPanel = () => {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n setIsAnimatingOut(false);\n syncDraftFromValue();\n updatePosition();\n setOpen(true);\n };\n\n const closePanel = useCallback(() => {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n setIsAnimatingOut(true);\n closeTimeoutRef.current = setTimeout(() => {\n setOpen(false);\n setIsAnimatingOut(false);\n }, CLOSE_ANIMATION_DURATION);\n }, []);\n\n const closePanelImmediate = useCallback(() => {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n setOpen(false);\n setIsAnimatingOut(false);\n }, []);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n updatePosition();\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n }, [open, updatePosition]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const frame = window.requestAnimationFrame(updatePosition);\n if (!panelRef.current || typeof ResizeObserver === 'undefined') {\n return () => window.cancelAnimationFrame(frame);\n }\n const observer = new ResizeObserver(updatePosition);\n observer.observe(panelRef.current);\n return () => {\n window.cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [open, precision, updatePosition]);\n\n useEffect(() => {\n return () => {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n };\n }, []);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const handleDocumentMouseDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n wrapperRef.current?.contains(target) ||\n panelRef.current?.contains(target)\n ) {\n return;\n }\n closePanel();\n };\n document.addEventListener('mousedown', handleDocumentMouseDown);\n return () =>\n document.removeEventListener('mousedown', handleDocumentMouseDown);\n }, [closePanel, open]);\n\n const changeMonth = (offset: number) => {\n const next = new Date(viewYear, viewMonth + offset, 1);\n setViewYear(next.getFullYear());\n setViewMonth(next.getMonth());\n };\n\n const isDateDisabled = (date: string) =>\n minDateText != null && date < minDateText;\n\n const isTimeDisabled = (date: string, hour: string, minute: string) => {\n if (minDateTimeValue == null) {\n return false;\n }\n const timestamp = getDateTimeTimestamp(date, hour, minute, '00');\n return timestamp != null && timestamp < minDateTimeValue;\n };\n\n const confirm = () => {\n const draftTimestamp = getDateTimeTimestamp(\n draftDate,\n draftHour,\n draftMinute,\n precision === 'minute' ? '00' : draftSecond,\n );\n if (minDateTimeValue != null && draftTimestamp != null) {\n if (draftTimestamp < minDateTimeValue) {\n return;\n }\n }\n onChange(\n formatDateTime(\n draftDate,\n draftHour,\n draftMinute,\n precision === 'minute' ? '00' : draftSecond,\n ),\n );\n closePanelImmediate();\n };\n\n const selectToday = () => {\n const now = new Date();\n setDraftDate(formatDate(now));\n const nextHour = pad(now.getHours());\n const nextMinute = pad(now.getMinutes());\n const nextSecond = pad(now.getSeconds());\n setDraftHour(nextHour);\n setDraftMinute(nextMinute);\n setDraftSecond(nextSecond);\n setViewYear(now.getFullYear());\n setViewMonth(now.getMonth());\n };\n\n return (\n <div ref={wrapperRef} className={cn('relative', className)}>\n <input\n aria-label={`${label}值`}\n className=\"sr-only\"\n value={value}\n onChange={(event) => onChange(event.target.value)}\n disabled={disabled}\n tabIndex={-1}\n />\n <button\n type=\"button\"\n ref={triggerRef}\n aria-label={label}\n disabled={disabled}\n onClick={() => {\n if (disabled) {\n return;\n }\n if (open) {\n closePanel();\n } else {\n openPanel();\n }\n }}\n className={cn(\n 'flex h-[40px] w-full items-center gap-2 border bg-[var(--lumen-color-surface)] px-3.5 text-left text-[13px] outline-none transition-all',\n radiusTokens.control,\n disabled\n ? 'cursor-not-allowed border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface-muted)] text-[var(--lumen-color-text-placeholder)]'\n : open\n ? 'border-[var(--lumen-color-primary)] ring-1 ring-[var(--lumen-color-primary)]/10'\n : 'border-[var(--lumen-color-border)] hover:border-[var(--lumen-color-border-hover)]',\n )}\n >\n <Calendar size={16} className=\"shrink-0 text-[var(--lumen-color-text-placeholder)]\" />\n <span\n className={cn(\n 'min-w-0 flex-1 truncate',\n displayValue ? 'text-[var(--lumen-color-text)]' : 'text-[var(--lumen-color-text-placeholder)]',\n )}\n >\n {displayValue || placeholder}\n </span>\n <Clock size={16} className=\"shrink-0 text-[var(--lumen-color-text-placeholder)]\" />\n </button>\n\n {open\n ? createPortal(\n <div\n ref={panelRef}\n data-date-time-picker-panel\n className=\"overflow-x-hidden overflow-y-auto rounded-[8px] border border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] shadow-[0_18px_46px_var(--lumen-color-shadow)]\"\n style={{\n ...panelStyle,\n animation: isAnimatingOut\n ? dropDirection === 'up'\n ? 'lumen-dropdown-out-up 0.12s ease-in forwards'\n : 'lumen-dropdown-out 0.12s ease-in forwards'\n : dropDirection === 'up'\n ? 'lumen-dropdown-in-up 0.12s ease-out'\n : 'lumen-dropdown-in 0.12s ease-out',\n transformOrigin: dropDirection === 'up' ? 'bottom' : 'top',\n }}\n >\n <div\n className={cn(\n 'grid grid-cols-1',\n precision === 'minute'\n ? 'pad:grid-cols-[minmax(0,1fr)_148px]'\n : 'pad:grid-cols-[minmax(0,1fr)_210px]',\n )}\n >\n <div className=\"p-4\">\n <div className=\"mb-3 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={() => changeMonth(-1)}\n className=\"flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] hover:bg-[var(--lumen-color-surface-muted)]\"\n >\n <ChevronLeft size={18} />\n </button>\n <div className=\"text-[14px] font-semibold text-[var(--lumen-color-text)]\">\n {viewYear}年{MONTHS[viewMonth]}\n </div>\n <button\n type=\"button\"\n onClick={() => changeMonth(1)}\n className=\"flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] hover:bg-[var(--lumen-color-surface-muted)]\"\n >\n <ChevronRight size={18} />\n </button>\n </div>\n <div className=\"grid grid-cols-7 text-center text-[12px] font-medium text-[var(--lumen-color-text-placeholder)]\">\n {WEEKDAYS.map((weekday) => (\n <div key={weekday} className=\"py-1.5\">\n {weekday}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7 text-center\">\n {cells.map((cell) => {\n const selected = cell.date === draftDate;\n const dateDisabled = isDateDisabled(cell.date);\n return (\n <button\n key={cell.date}\n type=\"button\"\n aria-label={`选择日期 ${cell.date}`}\n disabled={dateDisabled}\n onClick={() => setDraftDate(cell.date)}\n className={cn(\n 'mx-auto my-0.5 flex h-8 w-8 items-center justify-center rounded-full text-[13px] transition-all',\n !cell.current && 'text-[var(--lumen-color-border-hover)]',\n dateDisabled &&\n 'cursor-not-allowed text-[var(--lumen-color-border-hover)] hover:bg-transparent hover:text-[var(--lumen-color-border-hover)]',\n cell.current &&\n !selected &&\n !dateDisabled &&\n 'text-[var(--lumen-color-text-secondary)] hover:bg-[var(--lumen-color-primary-soft)] hover:text-[var(--lumen-color-primary)]',\n selected &&\n 'bg-[var(--lumen-color-primary)] font-medium text-[var(--lumen-color-on-primary)] shadow-sm',\n )}\n >\n {cell.day}\n </button>\n );\n })}\n </div>\n </div>\n\n <TimeSelector\n hour={draftHour}\n minute={draftMinute}\n second={draftSecond}\n onHourChange={setDraftHour}\n onMinuteChange={setDraftMinute}\n onSecondChange={setDraftSecond}\n precision={precision}\n minuteStep={minuteStep}\n isHourDisabled={(hour) =>\n isTimeDisabled(draftDate, hour, '59')\n }\n isMinuteDisabled={(minute) =>\n isTimeDisabled(draftDate, draftHour, minute)\n }\n className=\"border-t border-[var(--lumen-color-surface-muted)] pad:border-l pad:border-t-0\"\n />\n </div>\n\n <div className=\"flex flex-wrap items-center justify-between gap-2 border-t border-[var(--lumen-color-surface-muted)] px-3 py-3 pad:px-4\">\n <button\n type=\"button\"\n onClick={() => {\n onChange('');\n closePanel();\n }}\n className=\"text-[13px] text-[var(--lumen-color-text-placeholder)] transition-colors hover:text-[var(--lumen-color-text-muted)]\"\n >\n 清除\n </button>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={selectToday}\n className=\"text-[13px] font-medium text-[var(--lumen-color-primary)] transition-colors hover:text-[var(--lumen-color-primary-active)]\"\n >\n 此刻\n </button>\n <Button type=\"button\" size=\"sm\" onClick={confirm}>\n 确定\n </Button>\n </div>\n </div>\n </div>,\n document.body,\n )\n : null}\n </div>\n );\n};\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface DrawerProps {\n open: boolean;\n onRequestClose: () => void;\n onExited?: () => void;\n children: React.ReactNode;\n drawerId?: string;\n overlayId?: string;\n overlayClassName?: string;\n panelClassName?: string;\n closeOnOverlayClick?: boolean;\n overlayDataAttributes?: Record<string, string | boolean>;\n panelDataAttributes?: Record<string, string | boolean>;\n}\n\nconst overlayBaseClassName =\n 'fixed inset-0 z-[100] flex items-stretch justify-end overflow-hidden bg-[var(--lumen-color-overlay)] backdrop-blur-[2px]';\n\nconst buildDataAttributes = (attributes?: Record<string, string | boolean>) =>\n Object.fromEntries(\n Object.entries(attributes ?? {}).map(([key, value]) => [`data-${key}`, value]),\n );\n\nexport const Drawer: React.FC<DrawerProps> = ({\n open,\n onRequestClose,\n onExited,\n children,\n drawerId,\n overlayId,\n overlayClassName = '',\n panelClassName = '',\n closeOnOverlayClick = true,\n overlayDataAttributes,\n panelDataAttributes,\n}) => {\n const [mounted, setMounted] = useState(open);\n const [closing, setClosing] = useState(false);\n const [cachedChildren, setCachedChildren] = useState<React.ReactNode>(children);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n setClosing(false);\n setCachedChildren(children);\n } else if (mounted) {\n setClosing(true);\n }\n }, [children, mounted, open]);\n\n useEffect(() => {\n if (open && children != null) {\n setCachedChildren(children);\n }\n }, [children, open]);\n\n const handleAnimationEnd = useCallback(\n (event: React.AnimationEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget || !closing) return;\n\n setMounted(false);\n setClosing(false);\n setCachedChildren(null);\n onExited?.();\n },\n [closing, onExited],\n );\n\n if (!mounted || typeof document === 'undefined') return null;\n\n const displayChildren = closing ? cachedChildren : children;\n\n return createPortal(\n <div\n data-drawer-overlay={overlayId || drawerId}\n data-lumen-motion\n className={`${overlayBaseClassName} ${closing ? 'animate-[lumen-page-fade-out_150ms_ease-in_forwards]' : 'animate-[lumen-page-fade-in_200ms_ease-out]'} ${overlayClassName}`.trim()}\n onClick={closeOnOverlayClick ? onRequestClose : undefined}\n onAnimationEnd={handleAnimationEnd}\n {...buildDataAttributes(overlayDataAttributes)}\n >\n <aside\n data-drawer={drawerId}\n data-lumen-motion\n className={`h-full max-w-full overflow-y-auto ${closing ? 'animate-[lumen-drawer-out_250ms_ease-in_forwards]' : 'animate-[lumen-drawer-in_300ms_ease-out]'} ${panelClassName}`.trim()}\n onClick={(event) => event.stopPropagation()}\n {...buildDataAttributes(panelDataAttributes)}\n >\n {displayChildren}\n </aside>\n </div>,\n document.body,\n );\n};\n","import React, {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from './classNames';\n\ninterface DropdownMenuRenderState {\n open: boolean;\n menuId: string;\n close: () => void;\n toggle: () => void;\n}\n\ninterface DropdownMenuContentState {\n open: boolean;\n close: () => void;\n}\n\ninterface DropdownMenuProps {\n trigger: (state: DropdownMenuRenderState) => React.ReactNode;\n children:\n | React.ReactNode\n | ((state: DropdownMenuContentState) => React.ReactNode);\n className?: string;\n menuClassName?: string;\n align?: 'left' | 'right';\n closeDelayMs?: number;\n menuMode?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nconst DEFAULT_CLOSE_DELAY_MS = 120;\nconst OPEN_ANIMATION_DELAY_MS = 16;\nconst DROPDOWN_OPEN_EVENT = 'intelliconf-dropdown-menu-open';\ntype DropdownMenuPhase = 'closed' | 'opening' | 'open' | 'closing';\n\nexport const DropdownMenu: React.FC<DropdownMenuProps> = ({\n trigger,\n children,\n className,\n menuClassName,\n align = 'right',\n closeDelayMs = DEFAULT_CLOSE_DELAY_MS,\n menuMode = false,\n onOpenChange,\n}) => {\n const menuId = useId();\n const [phase, setPhase] = useState<DropdownMenuPhase>('closed');\n const [menuStyle, setMenuStyle] = useState<React.CSSProperties>({\n left: -9999,\n position: 'fixed',\n right: 'auto',\n top: -9999,\n });\n const closeTimerRef = useRef<ReturnType<typeof setTimeout>>(null);\n const openTimerRef = useRef<ReturnType<typeof setTimeout>>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const triggerElementRef = useRef<HTMLElement | null>(null);\n const mounted = phase !== 'closed';\n const triggerOpen = phase === 'opening' || phase === 'open';\n\n const clearCloseTimer = useCallback(() => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n const clearOpenTimer = useCallback(() => {\n if (openTimerRef.current) {\n clearTimeout(openTimerRef.current);\n openTimerRef.current = null;\n }\n }, []);\n\n const openMenu = useCallback(() => {\n clearCloseTimer();\n clearOpenTimer();\n if (menuMode) {\n const activeElement = document.activeElement;\n triggerElementRef.current =\n activeElement instanceof HTMLElement &&\n containerRef.current?.contains(activeElement)\n ? activeElement\n : (containerRef.current?.querySelector<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n ) ?? null);\n }\n setPhase('opening');\n onOpenChange?.(true);\n window.dispatchEvent(new CustomEvent(DROPDOWN_OPEN_EVENT, { detail: menuId }));\n }, [clearCloseTimer, clearOpenTimer, menuId, menuMode, onOpenChange]);\n\n const closeMenuImmediately = useCallback(() => {\n clearCloseTimer();\n clearOpenTimer();\n setPhase('closed');\n onOpenChange?.(false);\n }, [clearCloseTimer, clearOpenTimer, onOpenChange]);\n\n const closeMenu = useCallback(() => {\n clearCloseTimer();\n clearOpenTimer();\n setPhase('closing');\n onOpenChange?.(false);\n if (menuMode) {\n triggerElementRef.current?.focus();\n }\n closeTimerRef.current = setTimeout(() => {\n setPhase('closed');\n closeTimerRef.current = null;\n }, closeDelayMs);\n }, [\n clearCloseTimer,\n clearOpenTimer,\n closeDelayMs,\n menuMode,\n onOpenChange,\n ]);\n\n const toggleMenu = useCallback(() => {\n if (triggerOpen) {\n closeMenu();\n return;\n }\n openMenu();\n }, [closeMenu, triggerOpen, openMenu]);\n\n const getMenuItems = useCallback(\n () =>\n Array.from(\n menuRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ??\n [],\n ).filter(\n (item) =>\n !item.hasAttribute('disabled') &&\n item.getAttribute('aria-disabled') !== 'true',\n ),\n [],\n );\n\n const handleMenuKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!menuMode) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n closeMenu();\n return;\n }\n\n const menuItems = getMenuItems();\n if (menuItems.length === 0) return;\n\n const currentIndex = menuItems.indexOf(\n document.activeElement as HTMLElement,\n );\n let nextIndex: number | null = null;\n switch (event.key) {\n case 'ArrowDown':\n nextIndex = currentIndex < 0 ? 0 : (currentIndex + 1) % menuItems.length;\n break;\n case 'ArrowUp':\n nextIndex =\n currentIndex < 0\n ? menuItems.length - 1\n : (currentIndex - 1 + menuItems.length) % menuItems.length;\n break;\n case 'Home':\n nextIndex = 0;\n break;\n case 'End':\n nextIndex = menuItems.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n menuItems[nextIndex]?.focus();\n },\n [closeMenu, getMenuItems, menuMode],\n );\n\n const updateMenuPosition = useCallback(() => {\n if (!containerRef.current) return;\n\n const triggerRect = containerRef.current.getBoundingClientRect();\n const measuredMenuWidth = menuRef.current?.offsetWidth ?? 200;\n const menuHeight = menuRef.current?.offsetHeight ?? 200;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const viewportPadding = 8;\n const verticalGap = 8;\n const menuWidth = Math.min(\n measuredMenuWidth,\n Math.max(0, viewportWidth - viewportPadding * 2),\n );\n\n const preferredLeft =\n align === 'right' ? triggerRect.right - menuWidth : triggerRect.left;\n const maxLeft = Math.max(\n viewportPadding,\n viewportWidth - menuWidth - viewportPadding,\n );\n const left = Math.min(\n Math.max(viewportPadding, preferredLeft),\n maxLeft,\n );\n\n let top = triggerRect.bottom + verticalGap;\n if (top + menuHeight > viewportHeight - viewportPadding) {\n const topPlacement = triggerRect.top - verticalGap - menuHeight;\n top =\n topPlacement >= viewportPadding\n ? topPlacement\n : Math.max(viewportPadding, viewportHeight - menuHeight - viewportPadding);\n }\n\n setMenuStyle({\n left,\n position: 'fixed',\n right: 'auto',\n top,\n maxWidth: `calc(100vw - ${viewportPadding * 2}px)`,\n });\n }, [align]);\n\n useEffect(() => {\n const handleAnotherMenuOpen = (event: Event) => {\n const openedMenuId = (event as CustomEvent<string>).detail;\n if (openedMenuId && openedMenuId !== menuId) {\n closeMenuImmediately();\n }\n };\n window.addEventListener(DROPDOWN_OPEN_EVENT, handleAnotherMenuOpen);\n return () => {\n window.removeEventListener(DROPDOWN_OPEN_EVENT, handleAnotherMenuOpen);\n };\n }, [closeMenuImmediately, menuId]);\n\n useEffect(() => {\n if (!mounted) return;\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && menuRef.current.contains(event.target as Node)) {\n return;\n }\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n closeMenu();\n }\n };\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n closeMenu();\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [closeMenu, mounted]);\n\n useLayoutEffect(() => {\n if (!mounted) return;\n updateMenuPosition();\n if (menuMode && phase === 'opening') {\n getMenuItems()[0]?.focus();\n }\n }, [getMenuItems, menuMode, mounted, phase, updateMenuPosition]);\n\n useEffect(() => {\n if (!mounted || phase !== 'opening') return;\n openTimerRef.current = setTimeout(() => {\n setPhase('open');\n openTimerRef.current = null;\n }, OPEN_ANIMATION_DELAY_MS);\n return () => {\n clearOpenTimer();\n };\n }, [mounted, phase, clearOpenTimer]);\n\n useEffect(() => {\n if (!mounted) return;\n window.addEventListener('scroll', updateMenuPosition, true);\n window.addEventListener('resize', updateMenuPosition);\n\n return () => {\n window.removeEventListener('scroll', updateMenuPosition, true);\n window.removeEventListener('resize', updateMenuPosition);\n };\n }, [mounted, updateMenuPosition]);\n\n useEffect(() => {\n return () => {\n clearCloseTimer();\n clearOpenTimer();\n };\n }, [clearCloseTimer, clearOpenTimer]);\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n {trigger({\n open: triggerOpen,\n menuId,\n close: closeMenu,\n toggle: toggleMenu,\n })}\n\n {mounted &&\n createPortal(\n <div\n id={menuId}\n role={menuMode ? 'menu' : undefined}\n aria-orientation={menuMode ? 'vertical' : undefined}\n data-testid=\"dropdown-menu\"\n data-state={phase}\n ref={menuRef}\n onKeyDown={menuMode ? handleMenuKeyDown : undefined}\n style={menuStyle}\n className=\"z-50\"\n >\n <div\n className={cn(\n 'rounded-[var(--lumen-radius-icon)] border border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] py-1 shadow-[0_4px_16px_var(--lumen-color-shadow)]',\n align === 'right' ? 'origin-top-right' : 'origin-top-left',\n menuMode && 'min-w-max whitespace-nowrap [&_svg]:shrink-0',\n menuClassName,\n )}\n style={{\n animation:\n phase === 'closing'\n ? 'dropdownMenuOutUp 0.12s ease-in forwards'\n : 'dropdownMenuInDown 0.12s ease-out',\n }}\n >\n {typeof children === 'function'\n ? children({ open: triggerOpen, close: closeMenu })\n : children}\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n};\n","import React, { useRef, useState } from 'react';\nimport { FileText, LoaderCircle, UploadCloud, X } from 'lucide-react';\nimport { cn } from './classNames';\nimport { radiusTokens } from './designTokens';\n\nexport type FileUploadDensity = 'default' | 'compact';\nexport type FileRejectionReason = 'type' | 'size' | 'limit' | 'custom';\n\nexport interface FileRejection {\n file: File;\n reason: FileRejectionReason;\n message: string;\n}\n\nexport interface FileUploadProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n value: File[];\n onChange: (files: File[]) => void;\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n validateFile?: (file: File) => string | null;\n onReject?: (rejections: FileRejection[]) => void;\n disabled?: boolean;\n density?: FileUploadDensity;\n hint?: React.ReactNode;\n showFileList?: boolean;\n uploading?: boolean;\n progress?: number;\n inputAriaLabel?: string;\n}\n\nconst formatBytes = (value: number) => {\n if (value < 1024) return `${value} B`;\n if (value < 1024 * 1024) return `${(value / 1024).toFixed(1)} KB`;\n if (value < 1024 * 1024 * 1024) {\n return `${(value / 1024 / 1024).toFixed(1)} MB`;\n }\n return `${(value / 1024 / 1024 / 1024).toFixed(1)} GB`;\n};\n\nconst getFileKey = (file: File) =>\n `${file.name}:${file.size}:${file.lastModified}`;\n\nconst acceptsFile = (file: File, accept?: string) => {\n if (!accept) return true;\n const fileName = file.name.toLowerCase();\n const fileType = file.type.toLowerCase();\n return accept\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean)\n .some((rule) => {\n if (rule.startsWith('.')) return fileName.endsWith(rule);\n if (rule.endsWith('/*')) return fileType.startsWith(rule.slice(0, -1));\n return fileType === rule;\n });\n};\n\nexport const FileUpload = React.forwardRef<HTMLDivElement, FileUploadProps>(\n (\n {\n value,\n onChange,\n accept,\n multiple = false,\n maxFiles,\n maxSize,\n validateFile,\n onReject,\n disabled = false,\n density = 'default',\n hint,\n showFileList = true,\n uploading = false,\n progress,\n inputAriaLabel = '文件上传',\n className,\n ...props\n },\n ref,\n ) => {\n const [isDragOver, setIsDragOver] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const compact = density === 'compact';\n const effectiveMaxFiles = multiple ? (maxFiles ?? Number.POSITIVE_INFINITY) : 1;\n\n const addFiles = (incoming: File[]) => {\n if (disabled || uploading || incoming.length === 0) return;\n\n const existingKeys = new Set(value.map(getFileKey));\n const accepted: File[] = [];\n const rejections: FileRejection[] = [];\n\n for (const file of incoming) {\n if (!acceptsFile(file, accept)) {\n rejections.push({ file, reason: 'type', message: '文件格式不受支持' });\n continue;\n }\n if (maxSize !== undefined && file.size > maxSize) {\n rejections.push({\n file,\n reason: 'size',\n message: `文件大小不能超过 ${formatBytes(maxSize)}`,\n });\n continue;\n }\n const customMessage = validateFile?.(file);\n if (customMessage) {\n rejections.push({ file, reason: 'custom', message: customMessage });\n continue;\n }\n const key = getFileKey(file);\n if (existingKeys.has(key)) continue;\n if ((multiple ? value.length : 0) + accepted.length >= effectiveMaxFiles) {\n rejections.push({\n file,\n reason: 'limit',\n message: `最多选择 ${effectiveMaxFiles} 个文件`,\n });\n continue;\n }\n existingKeys.add(key);\n accepted.push(file);\n }\n\n if (accepted.length > 0) {\n onChange(multiple ? [...value, ...accepted] : accepted.slice(0, 1));\n }\n if (rejections.length > 0) onReject?.(rejections);\n };\n\n const removeFile = (file: File) => {\n const key = getFileKey(file);\n onChange(value.filter((item) => getFileKey(item) !== key));\n };\n\n const normalizedProgress =\n progress === undefined ? undefined : Math.min(100, Math.max(0, progress));\n\n return (\n <div\n ref={ref}\n className={cn('flex w-full min-w-0 flex-col', compact ? 'gap-2' : 'gap-4', className)}\n {...props}\n >\n <button\n type=\"button\"\n disabled={disabled || uploading}\n aria-label={inputAriaLabel}\n onClick={() => inputRef.current?.click()}\n onDragEnter={(event) => {\n event.preventDefault();\n if (!disabled && !uploading) setIsDragOver(true);\n }}\n onDragOver={(event) => event.preventDefault()}\n onDragLeave={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n setIsDragOver(false);\n }\n }}\n onDrop={(event) => {\n event.preventDefault();\n setIsDragOver(false);\n addFiles(Array.from(event.dataTransfer.files));\n }}\n className={cn(\n 'relative w-full min-w-0 border-dashed text-[var(--lumen-color-text-muted)] transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--lumen-color-primary)]/20 disabled:cursor-not-allowed disabled:opacity-60',\n compact\n ? 'min-h-11 rounded-[7px] border px-3'\n : 'rounded-[var(--lumen-radius-card)] border-2 px-6 py-6',\n isDragOver\n ? 'border-[var(--lumen-color-primary)] bg-[var(--lumen-color-primary-soft)] text-[var(--lumen-color-primary)]'\n : 'border-[var(--lumen-color-border-hover)] bg-[var(--lumen-color-surface-muted)] hover:border-[var(--lumen-color-info-border)] hover:bg-[var(--lumen-color-surface-hover)] hover:text-[var(--lumen-color-primary)]',\n )}\n >\n {compact ? (\n <span className=\"flex min-h-11 items-center justify-center gap-2 text-[12px]\">\n {uploading ? (\n <LoaderCircle size={16} className=\"shrink-0 animate-spin\" />\n ) : (\n <UploadCloud size={16} className=\"shrink-0\" />\n )}\n <span className=\"min-w-0 text-left\">\n <span className=\"block truncate\">\n {uploading\n ? '正在上传文件'\n : isDragOver\n ? '释放文件以上传'\n : '拖拽文件到此处,或点击上传'}\n </span>\n {hint ? (\n <span className=\"mt-0.5 block text-[11px] font-normal text-[var(--lumen-color-text-placeholder)]\">\n {hint}\n </span>\n ) : null}\n </span>\n </span>\n ) : (\n <span className=\"flex flex-col items-center\">\n <span\n className={cn(\n 'flex h-11 w-11 items-center justify-center rounded-full bg-[var(--lumen-color-surface)] text-[var(--lumen-color-text-placeholder)] transition-all duration-200',\n isDragOver && 'scale-110 bg-[var(--lumen-color-primary-soft)] text-[var(--lumen-color-primary)]',\n )}\n >\n {uploading ? (\n <LoaderCircle size={20} className=\"animate-spin\" />\n ) : (\n <UploadCloud size={20} />\n )}\n </span>\n <span className=\"mt-3 text-[14px] font-medium text-[var(--lumen-color-text-secondary)]\">\n {uploading\n ? '正在上传文件'\n : isDragOver\n ? '释放文件以上传'\n : '拖拽文件到此处,或点击选择文件'}\n </span>\n {hint ? (\n <span className=\"mt-1.5 text-[12px] text-[var(--lumen-color-text-placeholder)]\">\n {hint}\n </span>\n ) : null}\n </span>\n )}\n </button>\n <input\n ref={inputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled || uploading}\n className=\"hidden\"\n aria-hidden=\"true\"\n tabIndex={-1}\n onChange={(event) => {\n addFiles(Array.from(event.target.files ?? []));\n event.target.value = '';\n }}\n />\n\n {uploading && normalizedProgress !== undefined ? (\n <div\n className=\"h-1.5 w-full overflow-hidden rounded-full bg-[var(--lumen-color-border)]\"\n role=\"progressbar\"\n aria-label=\"上传进度\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(normalizedProgress)}\n >\n <div\n className=\"h-full rounded-full bg-[var(--lumen-color-primary)] transition-[width] duration-200\"\n style={{ width: `${normalizedProgress}%` }}\n />\n </div>\n ) : null}\n\n {showFileList && value.length > 0 ? (\n <div className={cn('border-t border-[var(--lumen-color-border)] pt-2', compact ? 'space-y-1.5' : 'space-y-2')}>\n {value.map((file) => (\n <div\n key={getFileKey(file)}\n className={cn(\n 'flex min-w-0 items-center gap-3 border border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] px-3',\n compact ? 'min-h-10 rounded-[7px] py-1.5' : `${radiusTokens.icon} min-h-12 py-2`,\n )}\n >\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-[6px] bg-[var(--lumen-color-primary-soft)] text-[var(--lumen-color-primary)]\">\n <FileText size={16} />\n </span>\n <span className=\"min-w-0 flex-1 text-left\">\n <span className=\"block truncate text-[13px] font-medium text-[var(--lumen-color-text)]\">\n {file.name}\n </span>\n <span className=\"mt-0.5 block text-[11px] text-[var(--lumen-color-text-placeholder)]\">\n {formatBytes(file.size)}\n </span>\n </span>\n <button\n type=\"button\"\n disabled={disabled || uploading}\n aria-label={`移除 ${file.name}`}\n onClick={() => removeFile(file)}\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full text-[var(--lumen-color-text-placeholder)] transition-colors hover:bg-[var(--lumen-color-surface-muted)] hover:text-[var(--lumen-color-danger)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--lumen-color-primary)]/20 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n <X size={14} />\n </button>\n </div>\n ))}\n </div>\n ) : null}\n </div>\n );\n },\n);\n\nFileUpload.displayName = 'FileUpload';\n","import React, { useId } from 'react';\nimport { cn } from './classNames';\n\nexport interface FormFieldRenderProps {\n id?: string;\n required?: boolean;\n invalid: boolean;\n 'aria-invalid': boolean | undefined;\n 'aria-describedby': string | undefined;\n}\n\nexport type FormFieldSize = 'sm' | 'md' | 'lg';\n\nexport interface FormFieldProps {\n label: React.ReactNode;\n required?: boolean;\n error?: React.ReactNode;\n children: React.ReactNode | ((props: FormFieldRenderProps) => React.ReactNode);\n size?: FormFieldSize;\n className?: string;\n labelClassName?: string;\n contentClassName?: string;\n errorClassName?: string;\n inputId?: string;\n}\n\nconst formFieldSizeTokens: Record<FormFieldSize, {\n root: string;\n label: string;\n error: string;\n}> = {\n sm: {\n root: 'space-y-1',\n label: 'text-[12px]',\n error: 'text-[11px]',\n },\n md: {\n root: 'space-y-1.5',\n label: 'text-[13px]',\n error: 'text-[12px]',\n },\n lg: {\n root: 'space-y-2',\n label: 'text-[14px]',\n error: 'text-[12px]',\n },\n};\n\nexport const FormField: React.FC<FormFieldProps> = ({\n label,\n required = false,\n error,\n children,\n size = 'md',\n className,\n labelClassName,\n contentClassName,\n errorClassName,\n inputId,\n}) => {\n const generatedId = useId();\n const errorId = error ? `${generatedId}-error` : undefined;\n const invalid = Boolean(error);\n const fieldProps: FormFieldRenderProps = {\n id: inputId,\n required,\n invalid,\n 'aria-invalid': invalid || undefined,\n 'aria-describedby': errorId,\n };\n const sizeTokens = formFieldSizeTokens[size];\n\n return (\n <div className={cn(sizeTokens.root, className)}>\n <label\n htmlFor={inputId}\n className={cn(\n 'block font-medium text-[var(--lumen-color-text-secondary)]',\n sizeTokens.label,\n labelClassName,\n )}\n >\n <span>{label}</span>\n <span\n aria-hidden={!required}\n className={cn(\n 'ml-1 inline-block w-[0.5em] align-middle text-[var(--lumen-color-danger)]',\n required ? 'opacity-100' : 'opacity-0',\n )}\n >\n {required ? '*' : ''}\n </span>\n </label>\n <div className={contentClassName}>\n {typeof children === 'function' ? children(fieldProps) : children}\n </div>\n {error && (\n <p id={errorId} className={cn('text-[var(--lumen-color-danger)]', sizeTokens.error, errorClassName)}>\n {error}\n </p>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { cn } from './classNames';\nimport { radiusTokens } from './designTokens';\n\nexport type InputSize = 'sm' | 'md' | 'lg';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'prefix' | 'size'> {\n size?: InputSize;\n invalid?: boolean;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n inputClassName?: string;\n}\n\nconst inputSizeTokens: Record<InputSize, string> = {\n sm: 'h-[32px] px-2.5 text-[12px]',\n md: 'h-[36px] px-3 text-[13px]',\n lg: 'h-[40px] px-3.5 text-[14px]',\n};\n\nconst affixSizeTokens: Record<InputSize, string> = {\n sm: 'h-[32px] px-2.5 text-[12px]',\n md: 'h-[36px] px-3 text-[13px]',\n lg: 'h-[40px] px-3.5 text-[14px]',\n};\n\nconst baseControlClassName =\n 'w-full border bg-[var(--lumen-color-surface)] text-[var(--lumen-color-text)] outline-none transition-all placeholder:text-[var(--lumen-color-text-placeholder)] disabled:cursor-not-allowed disabled:bg-[var(--lumen-color-surface-muted)] disabled:text-[var(--lumen-color-text-placeholder)] disabled:opacity-100';\n\nconst getStateClassName = (invalid?: boolean) =>\n invalid\n ? 'border-[var(--lumen-color-danger)] focus:border-[var(--lumen-color-danger)] focus:ring-2 focus:ring-[var(--lumen-color-danger)]/10'\n : 'border-[var(--lumen-color-border-strong)] hover:border-[var(--lumen-color-border-hover)] focus:border-[var(--lumen-color-primary)] focus:ring-2 focus:ring-[var(--lumen-color-primary)]/10';\n\nconst getAffixStateClassName = (invalid?: boolean) =>\n invalid\n ? 'border-[var(--lumen-color-danger)] focus-within:border-[var(--lumen-color-danger)] focus-within:ring-2 focus-within:ring-[var(--lumen-color-danger)]/10'\n : 'border-[var(--lumen-color-border-strong)] hover:border-[var(--lumen-color-border-hover)] focus-within:border-[var(--lumen-color-primary)] focus-within:ring-2 focus-within:ring-[var(--lumen-color-primary)]/10';\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = 'lg',\n invalid = false,\n prefix,\n suffix,\n className,\n inputClassName,\n disabled,\n ...props\n },\n ref,\n ) => {\n if (prefix || suffix) {\n return (\n <div\n className={cn(\n 'flex w-full items-center gap-2 border bg-[var(--lumen-color-surface)] text-[var(--lumen-color-text)] outline-none transition-all',\n radiusTokens.control,\n affixSizeTokens[size],\n disabled\n ? 'cursor-not-allowed border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface-muted)] text-[var(--lumen-color-text-placeholder)]'\n : getAffixStateClassName(invalid),\n className,\n )}\n >\n {prefix && (\n <span className=\"flex shrink-0 items-center text-[var(--lumen-color-text-placeholder)]\">\n {prefix}\n </span>\n )}\n <input\n ref={ref}\n disabled={disabled}\n className={cn(\n 'min-w-0 flex-1 border-0 bg-transparent p-0 text-inherit outline-none placeholder:text-[var(--lumen-color-text-placeholder)] disabled:cursor-not-allowed',\n inputClassName,\n )}\n {...props}\n autoComplete=\"off\"\n />\n {suffix && (\n <span className=\"flex shrink-0 items-center text-[var(--lumen-color-text-placeholder)]\">\n {suffix}\n </span>\n )}\n </div>\n );\n }\n\n return (\n <input\n ref={ref}\n disabled={disabled}\n className={cn(\n baseControlClassName,\n radiusTokens.control,\n inputSizeTokens[size],\n getStateClassName(invalid),\n className,\n )}\n {...props}\n autoComplete=\"off\"\n />\n );\n },\n);\n\nInput.displayName = 'Input';\n","export function dropdownTransformOrigin(\n shouldDropUp: boolean,\n horizontalAlign: 'left' | 'right' = 'left',\n): string {\n const vertical = shouldDropUp ? 'bottom' : 'top';\n const horizontal = horizontalAlign === 'right' ? 'right' : 'left';\n return `${horizontal} ${vertical}`;\n}\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { Check, ChevronDown, LoaderCircle, Search, X } from 'lucide-react';\nimport { cn } from './classNames';\nimport { radiusTokens } from './designTokens';\nimport { dropdownTransformOrigin } from './dropdownMotion';\n\nconst DROPDOWN_CLOSE_ANIMATION_MS = 120;\nconst SHOULD_SKIP_CLOSE_ANIMATION_IN_TEST = import.meta.env.MODE === 'test';\n\n/** 选项定义 */\nexport interface SelectOption<T extends string | number = string> {\n /** 显示文本 */\n label: string;\n /** 选项值 */\n value: T;\n /** 分组标题 */\n group?: string;\n /** 是否禁用 */\n disabled?: boolean;\n /** 选项图标 */\n icon?: React.ReactNode;\n /** 附加描述文本 */\n description?: string;\n}\n\n/** 选择器模式 */\nexport type SelectMode = 'single' | 'multiple';\n\n/** 选择器尺寸 */\nexport type SelectSize = 'sm' | 'md' | 'lg';\n\nexport interface SelectOptionRenderState {\n /** 是否已选中 */\n selected: boolean;\n /** 是否键盘或鼠标高亮 */\n highlighted: boolean;\n /** 是否禁用 */\n disabled: boolean;\n /** 选项索引 */\n index: number;\n}\n\n/** 选择器 Props */\nexport interface SelectProps<T extends string | number = string> {\n /** 选项列表 */\n options: SelectOption<T>[];\n /** 选择器模式: 单选 / 多选 */\n mode?: SelectMode;\n /** 是否启用搜索过滤 */\n searchable?: boolean;\n /** 占位提示文本 */\n placeholder?: string;\n /** 是否禁用整个组件 */\n disabled?: boolean;\n /** 当前选中值 (单选模式为 T | null, 多选模式为 T[]) */\n value: T | null | T[];\n /** 多选触发器展示方式 */\n multipleTriggerDisplay?: 'chips' | 'count' | 'placeholder';\n /** 多选计数文案 */\n multipleCountLabel?: (count: number) => string;\n /** 选中值变更回调 */\n onChange: (value: T | null | T[]) => void;\n /** 选择器尺寸 */\n size?: SelectSize;\n /** 额外 className */\n className?: string;\n /** 自定义触发器 className */\n triggerClassName?: string;\n /** 自定义触发器圆角,默认 rounded-[6px] */\n radius?: string;\n /** 打开前执行,可用于预加载选项 */\n onBeforeOpen?: () => Promise<void> | void;\n /** 搜索输入框占位文本 */\n searchPlaceholder?: string;\n /** 空状态文本 */\n emptyText?: string;\n /** 是否按搜索词本地过滤选项 */\n filterOptions?: boolean;\n /** 加载状态文本 */\n loadingText?: string;\n /** 是否正在加载选项 */\n loading?: boolean;\n /** 外部受控搜索值 */\n searchValue?: string;\n /** 搜索值变化回调 */\n onSearchChange?: (value: string) => void;\n /** 开合状态变化回调 */\n onOpenChange?: (open: boolean) => void;\n /** 自定义触发器内容 */\n renderTrigger?: (selectedOptions: SelectOption<T>[]) => React.ReactNode;\n /** 自定义选项内容 */\n renderOption?: (\n option: SelectOption<T>,\n state: SelectOptionRenderState,\n ) => React.ReactNode;\n /** 自定义选项按钮样式 */\n optionClassName?: (\n option: SelectOption<T>,\n state: SelectOptionRenderState,\n ) => string | undefined;\n /** 可访问名称 */\n 'aria-label'?: string;\n}\n\nconst selectSizeTokens: Record<SelectSize, string> = {\n sm: 'min-h-[32px] px-3 text-[12px]',\n md: 'min-h-[36px] px-3 text-[13px]',\n lg: 'min-h-[40px] px-3.5 text-[14px]',\n};\n\nexport const Select = <T extends string | number = string>({\n options,\n mode = 'single',\n searchable = false,\n placeholder = '请选择',\n disabled = false,\n value,\n multipleTriggerDisplay = 'chips',\n multipleCountLabel = (count) => `已选择 ${count} 项`,\n onChange,\n size = 'md',\n className,\n triggerClassName,\n radius,\n onBeforeOpen,\n searchPlaceholder = '搜索...',\n emptyText = '无匹配选项',\n filterOptions = true,\n loadingText = '加载中...',\n loading = false,\n searchValue,\n onSearchChange,\n onOpenChange,\n renderTrigger,\n renderOption,\n optionClassName,\n 'aria-label': ariaLabel,\n}: SelectProps<T>) => {\n const [isOpen, setIsOpen] = useState(false);\n const [isAnimatingOut, setIsAnimatingOut] = useState(false);\n const [isPreparingOpen, setIsPreparingOpen] = useState(false);\n const [shouldDropUp, setShouldDropUp] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const [dropdownStyle, setDropdownStyle] = useState<React.CSSProperties>({\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex: 9999,\n });\n const containerRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const portalRef = useRef<HTMLDivElement>(null);\n const closeTimeoutRef = useRef<ReturnType<typeof setTimeout>>(null);\n const effectiveSearchQuery = searchValue ?? searchQuery;\n\n // 将 value 标准化为数组\n const selectedValues = useMemo<T[]>(() => {\n if (mode === 'multiple') return Array.isArray(value) ? value : [];\n if (value == null) return [];\n return [value as T];\n }, [mode, value]);\n\n // 按搜索词过滤选项\n const filteredOptions = useMemo(() => {\n if (!filterOptions || !effectiveSearchQuery) return options;\n const q = effectiveSearchQuery.toLowerCase();\n return options.filter((opt) => opt.label.toLowerCase().includes(q));\n }, [filterOptions, options, effectiveSearchQuery]);\n\n const updateSearchQuery = useCallback(\n (value: string) => {\n if (searchValue === undefined) {\n setSearchQuery(value);\n }\n onSearchChange?.(value);\n },\n [onSearchChange, searchValue],\n );\n\n const updateDropdownPosition = useCallback(() => {\n if (!containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const estimatedDropdownHeight =\n 240 +\n (searchable ? 58 : 0) +\n (mode === 'multiple' && selectedValues.length > 0 ? 46 : 0) +\n 12;\n const dropdownHeight =\n portalRef.current?.offsetHeight || estimatedDropdownHeight;\n const gap = 6;\n const viewportPadding = 8;\n const spaceBelow = window.innerHeight - rect.bottom;\n const nextShouldDropUp = spaceBelow < dropdownHeight;\n const top = nextShouldDropUp\n ? Math.max(viewportPadding, rect.top - dropdownHeight - gap)\n : Math.min(window.innerHeight - viewportPadding, rect.bottom + gap);\n const availableWidth = Math.max(0, window.innerWidth - viewportPadding * 2);\n const triggerWidth = Math.min(rect.width, availableWidth);\n const maxWidth = Math.max(\n triggerWidth,\n Math.min(availableWidth, 480),\n );\n const measuredWidth = Math.min(\n maxWidth,\n Math.max(triggerWidth, portalRef.current?.offsetWidth || triggerWidth),\n );\n const left = Math.min(\n Math.max(viewportPadding, rect.left),\n Math.max(viewportPadding, window.innerWidth - measuredWidth - viewportPadding),\n );\n\n setShouldDropUp(nextShouldDropUp);\n setDropdownStyle({\n position: 'fixed',\n top,\n left,\n width: 'max-content',\n minWidth: triggerWidth,\n maxWidth,\n zIndex: 9999,\n });\n }, [mode, searchable, selectedValues.length]);\n\n // 关闭下拉(带动画)\n const closeDropdown = useCallback(() => {\n if (closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);\n if (SHOULD_SKIP_CLOSE_ANIMATION_IN_TEST) {\n setIsOpen(false);\n setIsAnimatingOut(false);\n updateSearchQuery('');\n setHighlightedIndex(-1);\n onOpenChange?.(false);\n return;\n }\n setIsAnimatingOut(true);\n closeTimeoutRef.current = setTimeout(() => {\n setIsOpen(false);\n setIsAnimatingOut(false);\n updateSearchQuery('');\n setHighlightedIndex(-1);\n onOpenChange?.(false);\n }, DROPDOWN_CLOSE_ANIMATION_MS);\n }, [onOpenChange, updateSearchQuery]);\n\n // 立即关闭下拉(无动画)\n const closeDropdownImmediate = useCallback(() => {\n if (closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);\n setIsOpen(false);\n setIsAnimatingOut(false);\n updateSearchQuery('');\n setHighlightedIndex(-1);\n onOpenChange?.(false);\n }, [onOpenChange, updateSearchQuery]);\n\n // 打开下拉\n const openDropdown = useCallback(async () => {\n if (closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);\n if (onBeforeOpen) {\n setIsPreparingOpen(true);\n try {\n await onBeforeOpen();\n } finally {\n setIsPreparingOpen(false);\n }\n }\n setIsOpen(true);\n setIsAnimatingOut(false);\n updateSearchQuery('');\n setHighlightedIndex(-1);\n onOpenChange?.(true);\n }, [onBeforeOpen, onOpenChange, updateSearchQuery]);\n\n // 选择处理\n const handleSelect = useCallback(\n (optionValue: T) => {\n if (mode === 'single') {\n onChange(optionValue);\n closeDropdownImmediate();\n } else {\n const isSelected = selectedValues.includes(optionValue);\n if (isSelected) {\n onChange(selectedValues.filter((v) => v !== optionValue));\n } else {\n onChange([...selectedValues, optionValue]);\n }\n }\n },\n [mode, onChange, selectedValues, closeDropdownImmediate],\n );\n\n // 移除 chip(多选)\n const handleRemoveChip = useCallback(\n (optionValue: T, e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(selectedValues.filter((v) => v !== optionValue));\n },\n [onChange, selectedValues],\n );\n\n // 清空全部(多选)\n const handleClearAll = useCallback(() => {\n onChange([]);\n setSearchQuery('');\n }, [onChange]);\n\n // 点击外部关闭\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (containerRef.current?.contains(target)) return;\n if (portalRef.current?.contains(target)) return;\n closeDropdown();\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isOpen, closeDropdown]);\n\n // 搜索框自动聚焦\n useEffect(() => {\n if (isOpen && searchable && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen, searchable]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n updateDropdownPosition();\n window.addEventListener('scroll', updateDropdownPosition, true);\n window.addEventListener('resize', updateDropdownPosition);\n\n return () => {\n window.removeEventListener('scroll', updateDropdownPosition, true);\n window.removeEventListener('resize', updateDropdownPosition);\n };\n }, [isOpen, updateDropdownPosition]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const frameId = window.requestAnimationFrame(() => {\n updateDropdownPosition();\n });\n\n if (!portalRef.current || typeof ResizeObserver === 'undefined') {\n return () => {\n window.cancelAnimationFrame(frameId);\n };\n }\n\n const observer = new ResizeObserver(() => {\n updateDropdownPosition();\n });\n observer.observe(portalRef.current);\n\n return () => {\n window.cancelAnimationFrame(frameId);\n observer.disconnect();\n };\n }, [\n isOpen,\n updateDropdownPosition,\n filteredOptions.length,\n searchable,\n selectedValues.length,\n ]);\n\n // 过滤选项变化时重置高亮索引\n useEffect(() => {\n setHighlightedIndex(-1);\n }, [filteredOptions]);\n\n // 清理定时器\n useEffect(() => {\n return () => {\n if (closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);\n };\n }, []);\n\n // 键盘导航\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!isOpen) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openDropdown();\n }\n return;\n }\n\n switch (e.key) {\n case 'Escape':\n closeDropdownImmediate();\n break;\n case 'Enter':\n e.preventDefault();\n if (\n highlightedIndex >= 0 &&\n highlightedIndex < filteredOptions.length\n ) {\n const opt = filteredOptions[highlightedIndex];\n if (opt && !opt.disabled) handleSelect(opt.value);\n }\n break;\n case 'ArrowDown':\n e.preventDefault();\n setHighlightedIndex((prev) => {\n let next = prev + 1;\n while (\n next < filteredOptions.length &&\n filteredOptions[next]?.disabled\n )\n next++;\n return next >= filteredOptions.length ? prev : next;\n });\n break;\n case 'ArrowUp':\n e.preventDefault();\n setHighlightedIndex((prev) => {\n let next = prev - 1;\n while (next >= 0 && filteredOptions[next]?.disabled) next--;\n return next < 0 ? prev : next;\n });\n break;\n }\n },\n [\n isOpen,\n highlightedIndex,\n filteredOptions,\n handleSelect,\n closeDropdownImmediate,\n openDropdown,\n ],\n );\n\n // 查找选项\n const findOption = useCallback(\n (val: T) => options.find((o) => o.value === val),\n [options],\n );\n\n // 渲染单选触发器\n const renderSingleTrigger = () => {\n if (renderTrigger) {\n return renderTrigger(\n selectedValues\n .map((val) => findOption(val))\n .filter(Boolean) as SelectOption<T>[],\n );\n }\n if (selectedValues.length === 0) {\n return (\n <span className=\"min-w-0 flex-1 truncate text-[var(--lumen-color-text-placeholder)]\">\n {placeholder}\n </span>\n );\n }\n const selectedValue = selectedValues[0];\n const selected =\n selectedValue === undefined ? undefined : findOption(selectedValue);\n return (\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n {selected?.icon && <span className=\"shrink-0\">{selected.icon}</span>}\n <span className=\"truncate text-[var(--lumen-color-text)]\">{selected?.label}</span>\n </div>\n );\n };\n\n // 渲染多选触发器(chips)\n const renderMultiTrigger = () => {\n if (multipleTriggerDisplay === 'placeholder') {\n return (\n <div className=\"flex min-w-0 flex-1 py-1\">\n <span className=\"truncate text-[var(--lumen-color-text-placeholder)]\">{placeholder}</span>\n </div>\n );\n }\n if (multipleTriggerDisplay === 'count') {\n return (\n <div className=\"flex min-w-0 flex-1 py-1\">\n {selectedValues.length > 0 ? (\n <span className=\"truncate text-[var(--lumen-color-text)]\">\n {multipleCountLabel(selectedValues.length)}\n </span>\n ) : (\n <span className=\"text-[var(--lumen-color-text-placeholder)]\">{placeholder}</span>\n )}\n </div>\n );\n }\n return (\n <div className=\"flex min-w-0 flex-1 flex-wrap gap-1.5 py-1\">\n {selectedValues.length > 0 ? (\n selectedValues.map((val) => {\n const opt = findOption(val);\n return (\n <span\n key={String(val)}\n className=\"inline-flex items-center gap-1 rounded-[6px] bg-[var(--lumen-color-primary-soft)] px-2 py-0.5 text-[13px] text-[var(--lumen-color-primary)]\"\n >\n {opt?.label ?? String(val)}\n <X\n size={12}\n className=\"cursor-pointer text-[var(--lumen-color-primary)]/60 hover:text-[var(--lumen-color-primary)]\"\n onClick={(e) => handleRemoveChip(val, e)}\n />\n </span>\n );\n })\n ) : (\n <span className=\"text-[var(--lumen-color-text-placeholder)]\">{placeholder}</span>\n )}\n </div>\n );\n };\n\n // 渲染搜索区\n const renderSearchSection = () => (\n <div className=\"border-b border-[var(--lumen-color-surface-muted)] p-2.5\">\n <div className=\"flex items-center gap-2 rounded-[8px] bg-[var(--lumen-color-surface-muted)] px-3 py-2\">\n <Search size={14} className=\"shrink-0 text-[var(--lumen-color-text-placeholder)]\" />\n <input\n ref={searchInputRef}\n className=\"w-full bg-transparent text-[13px] text-[var(--lumen-color-text)] outline-none placeholder:text-[var(--lumen-color-text-placeholder)]\"\n placeholder={searchPlaceholder}\n value={effectiveSearchQuery}\n onChange={(e) => updateSearchQuery(e.target.value)}\n />\n </div>\n </div>\n );\n\n // 渲染选项\n const renderOptionNode = (option: SelectOption<T>, index: number) => {\n const isSelected = selectedValues.includes(option.value);\n const isHighlighted = index === highlightedIndex;\n const state: SelectOptionRenderState = {\n selected: isSelected,\n highlighted: isHighlighted,\n disabled: Boolean(option.disabled),\n index,\n };\n\n if (mode === 'multiple') {\n return (\n <button\n key={String(option.value)}\n type=\"button\"\n disabled={option.disabled}\n onClick={() => !option.disabled && handleSelect(option.value)}\n onMouseEnter={() => !option.disabled && setHighlightedIndex(index)}\n className={cn(\n renderOption\n ? 'block w-full text-left transition-all'\n : 'flex w-full items-center gap-2.5 rounded-[8px] px-3 py-2.5 text-left text-[13px] transition-colors',\n option.disabled && 'cursor-not-allowed opacity-40',\n !renderOption &&\n (isSelected\n ? 'bg-[var(--lumen-color-primary-soft)] text-[var(--lumen-color-primary)]'\n : 'text-[var(--lumen-color-text-secondary)] hover:bg-[var(--lumen-color-surface-muted)]'),\n !renderOption &&\n isHighlighted &&\n !option.disabled &&\n !isSelected &&\n 'bg-[var(--lumen-color-surface-muted)]',\n optionClassName?.(option, state),\n )}\n >\n {renderOption ? (\n renderOption(option, state)\n ) : (\n <>\n <div\n className={cn(\n 'flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-[4px] border transition-colors',\n isSelected\n ? 'border-[var(--lumen-color-primary)] bg-[var(--lumen-color-primary)]'\n : 'border-[var(--lumen-color-border-strong)]',\n )}\n >\n {isSelected && <Check size={12} className=\"text-[var(--lumen-color-on-primary)]\" />}\n </div>\n {option.icon && <span className=\"shrink-0\">{option.icon}</span>}\n <div className=\"min-w-0 flex-1\">\n <div className=\"leading-5\">{option.label}</div>\n {option.description && (\n <div className=\"text-[12px] text-[var(--lumen-color-text-placeholder)]\">\n {option.description}\n </div>\n )}\n </div>\n </>\n )}\n </button>\n );\n }\n\n return (\n <button\n key={String(option.value)}\n type=\"button\"\n disabled={option.disabled}\n onClick={() => !option.disabled && handleSelect(option.value)}\n onMouseEnter={() => !option.disabled && setHighlightedIndex(index)}\n className={cn(\n renderOption\n ? 'block w-full text-left transition-all'\n : 'flex w-full items-center gap-2 rounded-[8px] pl-3 pr-2 py-2.5 text-left text-[13px] transition-colors',\n option.disabled && 'cursor-not-allowed opacity-40',\n !renderOption &&\n (isSelected\n ? 'bg-[var(--lumen-color-primary-soft)] font-medium text-[var(--lumen-color-primary)]'\n : 'text-[var(--lumen-color-text-secondary)] hover:bg-[var(--lumen-color-surface-muted)]'),\n !renderOption &&\n isHighlighted &&\n !option.disabled &&\n !isSelected &&\n 'bg-[var(--lumen-color-surface-muted)]',\n optionClassName?.(option, state),\n )}\n >\n {renderOption ? (\n renderOption(option, state)\n ) : (\n <>\n {option.icon && <span className=\"shrink-0\">{option.icon}</span>}\n <div className=\"min-w-0 flex-1\">\n <div className=\"leading-5\">{option.label}</div>\n {option.description && (\n <div className=\"text-[12px] text-[var(--lumen-color-text-placeholder)]\">\n {option.description}\n </div>\n )}\n </div>\n </>\n )}\n </button>\n );\n };\n\n // 渲染空状态\n const renderEmptyState = () => (\n <div className=\"px-3 py-4 text-center text-[13px] text-[var(--lumen-color-text-placeholder)]\">\n {emptyText}\n </div>\n );\n\n // 渲染底部栏(多选)\n const renderFooter = () => (\n <div className=\"flex items-center justify-between border-t border-[var(--lumen-color-surface-muted)] px-3 py-2.5\">\n <span className=\"text-[12px] text-[var(--lumen-color-text-placeholder)]\">\n 已选 {selectedValues.length} 项\n </span>\n <button\n type=\"button\"\n onClick={handleClearAll}\n className=\"text-[12px] text-[var(--lumen-color-text-placeholder)] transition-colors hover:text-[var(--lumen-color-text-muted)]\"\n >\n 清空\n </button>\n </div>\n );\n\n return (\n <div\n ref={containerRef}\n className={cn('relative', className)}\n onKeyDown={handleKeyDown}\n >\n {/* 触发器 */}\n <button\n type=\"button\"\n data-testid=\"select-trigger\"\n aria-label={ariaLabel}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n disabled={disabled}\n onClick={() => {\n if (disabled || isPreparingOpen) return;\n if (isOpen) closeDropdown();\n else openDropdown();\n }}\n className={cn(\n 'flex w-full items-center gap-2 border bg-[var(--lumen-color-surface)] text-left outline-none transition-all',\n radius ?? radiusTokens.control,\n selectSizeTokens[size],\n disabled || isPreparingOpen\n ? 'cursor-not-allowed border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface-muted)] opacity-50'\n : isOpen\n ? 'border-[var(--lumen-color-primary)] ring-1 ring-[var(--lumen-color-primary)]/10'\n : 'border-[var(--lumen-color-border)] hover:border-[var(--lumen-color-border-hover)]',\n triggerClassName,\n )}\n >\n {mode === 'multiple' ? renderMultiTrigger() : renderSingleTrigger()}\n {loading || isPreparingOpen ? (\n <LoaderCircle\n size={16}\n className=\"shrink-0 animate-spin text-[var(--lumen-color-text-placeholder)]\"\n />\n ) : (\n <ChevronDown\n size={16}\n className={cn(\n 'shrink-0 text-[var(--lumen-color-text-placeholder)] transition-transform duration-200',\n isOpen && 'rotate-180',\n )}\n />\n )}\n </button>\n\n {/* 下拉面板 */}\n {isOpen &&\n createPortal(\n <div\n ref={portalRef}\n data-testid=\"select-dropdown\"\n className={cn(\n radiusTokens.card,\n 'border border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] shadow-[0_8px_30px_var(--lumen-color-shadow)]',\n )}\n style={{\n ...dropdownStyle,\n animation: isAnimatingOut\n ? shouldDropUp\n ? 'lumen-dropdown-out-up 0.12s ease-in forwards'\n : 'lumen-dropdown-out 0.12s ease-in forwards'\n : shouldDropUp\n ? 'lumen-dropdown-in-up 0.12s ease-out'\n : 'lumen-dropdown-in 0.12s ease-out',\n transformOrigin: dropdownTransformOrigin(shouldDropUp),\n }}\n >\n {searchable && renderSearchSection()}\n\n <div className=\"max-h-[252px] overflow-y-auto p-1.5\">\n {loading ? (\n <div className=\"px-3 py-4 text-center text-[13px] text-[var(--lumen-color-text-placeholder)]\">\n {loadingText}\n </div>\n ) : filteredOptions.length === 0 ? (\n renderEmptyState()\n ) : (\n filteredOptions.map((option, index) => {\n const previousGroup = filteredOptions[index - 1]?.group;\n const shouldRenderGroup = option.group && option.group !== previousGroup;\n return (\n <React.Fragment key={String(option.value)}>\n {shouldRenderGroup && (\n <div className=\"px-3 pb-1 pt-2 text-[11px] font-medium text-[var(--lumen-color-text-placeholder)]\">\n {option.group}\n </div>\n )}\n {renderOptionNode(option, index)}\n </React.Fragment>\n );\n })\n )}\n </div>\n\n {mode === 'multiple' && selectedValues.length > 0 && renderFooter()}\n </div>,\n document.body,\n )}\n </div>\n );\n};\n","import React, { useMemo } from 'react';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Button } from './Button';\nimport { cn } from './classNames';\nimport { Select } from './Select';\n\ntype PaginationItem = number | 'ellipsis-left' | 'ellipsis-right';\n\nexport type PaginationVariant = 'default' | 'compact';\n\nexport interface PaginationProps {\n currentPage: number;\n totalPages: number;\n totalItems: number;\n onPageChange: (page: number) => void;\n variant?: PaginationVariant;\n loading?: boolean;\n itemLabel?: string;\n hideOnSinglePage?: boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n onPageSizeChange?: (pageSize: number) => void;\n className?: string;\n}\n\nconst buildPaginationItems = (\n currentPage: number,\n totalPages: number,\n): PaginationItem[] => {\n if (totalPages <= 5) {\n return Array.from({ length: totalPages }, (_, index) => index + 1);\n }\n\n const items: PaginationItem[] = [1];\n const start = Math.max(2, currentPage - 1);\n const end = Math.min(totalPages - 1, currentPage + 1);\n\n if (start > 2) {\n items.push('ellipsis-left');\n }\n\n for (let page = start; page <= end; page += 1) {\n items.push(page);\n }\n\n if (end < totalPages - 1) {\n items.push('ellipsis-right');\n }\n\n items.push(totalPages);\n return items;\n};\n\nexport const Pagination = ({\n currentPage,\n totalPages,\n totalItems,\n onPageChange,\n variant = 'default',\n loading = false,\n itemLabel = '条',\n hideOnSinglePage,\n pageSize,\n pageSizeOptions,\n onPageSizeChange,\n className = '',\n}: PaginationProps) => {\n const safeTotalPages = Math.max(1, totalPages);\n const safeCurrentPage = Math.min(Math.max(1, currentPage), safeTotalPages);\n const normalizedPageSizeOptions = useMemo(\n () =>\n Array.from(new Set((pageSizeOptions ?? []).filter((option) => option > 0))).sort(\n (left, right) => left - right,\n ),\n [pageSizeOptions],\n );\n const shouldShowPageSizeSelector =\n typeof pageSize === 'number'\n && typeof onPageSizeChange === 'function'\n && normalizedPageSizeOptions.length > 0;\n\n const paginationItems = useMemo(\n () => buildPaginationItems(safeCurrentPage, safeTotalPages),\n [safeCurrentPage, safeTotalPages],\n );\n const shouldHideOnSinglePage =\n hideOnSinglePage ?? variant === 'compact';\n\n if (shouldHideOnSinglePage && totalPages <= 1) return null;\n\n if (variant === 'compact') {\n return (\n <div\n className={cn(\n 'flex shrink-0 flex-col gap-2 border-t border-[var(--lumen-color-border)] px-3 py-2 text-xs text-[var(--lumen-color-text-muted)] pad:flex-row pad:items-center pad:justify-between pad:py-1.5',\n className,\n )}\n >\n <span>\n 共 {totalItems} {itemLabel} · 第 {safeCurrentPage} / {safeTotalPages} 页\n </span>\n <div className=\"flex gap-2\">\n <Button\n disabled={safeCurrentPage <= 1 || loading}\n onClick={() => onPageChange(safeCurrentPage - 1)}\n size=\"sm\"\n type=\"button\"\n variant=\"secondary\"\n >\n 上一页\n </Button>\n <Button\n disabled={safeCurrentPage >= safeTotalPages || loading}\n onClick={() => onPageChange(safeCurrentPage + 1)}\n size=\"sm\"\n type=\"button\"\n variant=\"secondary\"\n >\n 下一页\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 border-t border-[var(--lumen-color-surface-muted)] bg-[var(--lumen-color-surface-subtle)] px-3 py-3 pad:px-4 l:flex-row l:items-center l:justify-between xl:px-5 xl:py-4',\n className,\n )}\n >\n <div className=\"flex flex-wrap items-center gap-3\">\n <span className=\"text-[12px] text-[var(--lumen-color-text-muted)]\">共 {totalItems} 条</span>\n <span className=\"text-[12px] text-[var(--lumen-color-text-muted)]\">\n 第 {safeCurrentPage} / {safeTotalPages} 页\n </span>\n {shouldShowPageSizeSelector ? (\n <div className=\"w-[108px]\">\n <Select<number>\n options={normalizedPageSizeOptions.map((option) => ({\n label: `${option}条/页`,\n value: option,\n }))}\n value={pageSize}\n onChange={(value) => onPageSizeChange(Number(value))}\n disabled={loading}\n size=\"sm\"\n className=\"w-full\"\n radius=\"rounded-[8px]\"\n />\n </div>\n ) : null}\n </div>\n <div className=\"flex max-w-full flex-wrap items-center gap-0.5 overflow-x-auto\">\n <button\n type=\"button\"\n aria-label=\"上一页\"\n onClick={() => onPageChange(safeCurrentPage - 1)}\n disabled={safeCurrentPage <= 1 || loading}\n className=\"flex h-[28px] w-[28px] items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] transition-colors hover:bg-[var(--lumen-color-primary-soft)] disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <ChevronLeft size={14} />\n </button>\n {paginationItems.map((item) =>\n typeof item === 'number' ? (\n <button\n key={item}\n type=\"button\"\n onClick={() => onPageChange(item)}\n disabled={loading}\n aria-current={item === safeCurrentPage ? 'page' : undefined}\n className={cn(\n 'h-[28px] w-[28px] rounded-[6px] text-[12px] transition-colors',\n item === safeCurrentPage\n ? 'bg-[var(--lumen-color-primary)] font-medium text-[var(--lumen-color-on-primary)]'\n : 'text-[var(--lumen-color-text-muted)] hover:bg-[var(--lumen-color-primary-soft)]',\n )}\n >\n {item}\n </button>\n ) : (\n <span\n key={item}\n className=\"flex h-[28px] w-[28px] items-center justify-center text-[12px] text-[var(--lumen-color-text-placeholder)]\"\n >\n ...\n </span>\n ),\n )}\n <button\n type=\"button\"\n aria-label=\"下一页\"\n onClick={() => onPageChange(safeCurrentPage + 1)}\n disabled={safeCurrentPage >= safeTotalPages || loading}\n className=\"flex h-[28px] w-[28px] items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] transition-colors hover:bg-[var(--lumen-color-primary-soft)] disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <ChevronRight size={14} />\n </button>\n </div>\n </div>\n );\n};\n","import React, { useId, useState } from 'react';\nimport { Circle } from 'lucide-react';\nimport { cn } from './classNames';\n\nexport interface RadioProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'onChange'> {\n size?: 'sm' | 'md';\n checked?: boolean;\n defaultChecked?: boolean;\n disabled?: boolean;\n label?: React.ReactNode;\n description?: React.ReactNode;\n onChange?: (checked: boolean) => void;\n}\n\nexport const Radio: React.FC<RadioProps> = ({\n size = 'sm',\n checked,\n defaultChecked = false,\n disabled = false,\n label,\n description,\n onChange,\n className,\n id,\n ...props\n}) => {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const labelId = `${inputId}-label`;\n const descriptionId = `${inputId}-description`;\n const isControlled = typeof checked === 'boolean';\n const [internalChecked, setInternalChecked] = useState(defaultChecked);\n const currentChecked = isControlled ? checked : internalChecked;\n const isSmall = size === 'sm';\n const hasDescription = Boolean(description);\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n const nextChecked = event.target.checked;\n if (!isControlled) {\n setInternalChecked(nextChecked);\n }\n onChange?.(nextChecked);\n };\n\n return (\n <label\n htmlFor={inputId}\n className={cn(\n 'inline-flex gap-3',\n hasDescription ? 'items-start' : 'items-center',\n isSmall && 'gap-2',\n disabled ? 'cursor-not-allowed opacity-55' : 'cursor-pointer',\n className,\n )}\n >\n <span\n className={cn(\n 'relative inline-flex shrink-0 items-center justify-center',\n hasDescription && 'mt-0.5',\n isSmall ? 'h-4 w-4' : 'h-5 w-5',\n )}\n >\n <input\n {...props}\n id={inputId}\n type=\"radio\"\n checked={currentChecked}\n disabled={disabled}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={description ? descriptionId : undefined}\n aria-label={typeof label === 'string' ? label : props['aria-label']}\n className=\"peer sr-only\"\n onChange={handleChange}\n />\n <span\n aria-hidden=\"true\"\n className={cn(\n 'flex items-center justify-center rounded-full border transition-all',\n isSmall ? 'h-4 w-4' : 'h-5 w-5',\n currentChecked\n ? 'border-[var(--lumen-color-primary)] bg-[var(--lumen-color-surface)] text-[var(--lumen-color-primary)] shadow-[0_8px_18px_var(--lumen-color-focus-ring)]'\n : 'border-[var(--lumen-color-border-hover)] bg-[var(--lumen-color-surface)] text-transparent',\n !disabled && 'peer-focus-visible:ring-2 peer-focus-visible:ring-[var(--lumen-color-info-border)]/70 peer-focus-visible:ring-offset-2',\n !disabled && !currentChecked && 'hover:border-[var(--lumen-color-info-border)] hover:bg-[var(--lumen-color-surface-hover)]',\n )}\n >\n <Circle\n size={isSmall ? 8 : 10}\n className={currentChecked ? 'fill-current text-current' : 'text-transparent'}\n />\n </span>\n </span>\n {(label || description) && (\n <span className=\"min-w-0\">\n {label ? (\n <span\n id={labelId}\n className={cn(\n 'block font-normal',\n currentChecked ? 'text-[var(--lumen-color-text)]' : 'text-[var(--lumen-color-text-muted)]',\n isSmall ? 'text-[13px] leading-5' : 'text-[13px] leading-5',\n )}\n >\n {label}\n </span>\n ) : null}\n {description ? (\n <span\n id={descriptionId}\n className={cn(\n 'mt-0.5 block text-[var(--lumen-color-text-muted)]',\n isSmall ? 'text-[11px] leading-4.5' : 'text-[12px] leading-5',\n )}\n >\n {description}\n </span>\n ) : null}\n </span>\n )}\n </label>\n );\n};\n","import React from 'react';\nimport { cn } from './classNames';\nimport { radiusTokens } from './designTokens';\n\nexport type SegmentedControlSize = 'sm' | 'md';\n\nexport interface SegmentedControlOption<T extends string> {\n label: React.ReactNode;\n value: T;\n disabled?: boolean;\n}\n\nexport interface SegmentedControlProps<T extends string>\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n value: T;\n options: Array<SegmentedControlOption<T>>;\n onChange: (value: T) => void;\n size?: SegmentedControlSize;\n fullWidth?: boolean;\n}\n\nconst itemSizeClasses: Record<SegmentedControlSize, string> = {\n sm: 'h-7 px-3 text-[12px]',\n md: 'h-8 px-3.5 text-[13px]',\n};\n\nexport const SegmentedControl = <T extends string>({\n value,\n options,\n onChange,\n size = 'sm',\n fullWidth = false,\n className,\n role = 'group',\n ...props\n}: SegmentedControlProps<T>) => (\n <div\n role={role}\n className={cn(\n 'inline-flex max-w-full gap-1 border border-[var(--lumen-color-border)]/80 bg-[var(--lumen-color-surface-glass)] p-1 backdrop-blur-[5px]',\n radiusTokens.control,\n fullWidth && 'flex w-full',\n className,\n )}\n {...props}\n >\n {options.map((option) => {\n const active = option.value === value;\n return (\n <button\n key={option.value}\n type=\"button\"\n aria-pressed={active}\n disabled={option.disabled}\n onClick={() => onChange(option.value)}\n className={cn(\n 'inline-flex min-w-0 items-center justify-center whitespace-nowrap rounded-[5px] font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--lumen-color-primary)]/20 disabled:cursor-not-allowed disabled:opacity-45',\n itemSizeClasses[size],\n fullWidth && 'flex-1',\n active\n ? 'bg-[var(--lumen-color-primary)] text-[var(--lumen-color-on-primary)]'\n : 'text-[var(--lumen-color-text-muted)] hover:bg-[var(--lumen-color-surface-muted)] hover:text-[var(--lumen-color-text)]',\n )}\n >\n {option.label}\n </button>\n );\n })}\n </div>\n);\n","import React, { useId, useState } from 'react';\nimport { cn } from './classNames';\n\nexport interface SwitchProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'onChange'> {\n size?: 'sm' | 'md';\n checked?: boolean;\n defaultChecked?: boolean;\n disabled?: boolean;\n label?: React.ReactNode;\n description?: React.ReactNode;\n onChange?: (checked: boolean) => void;\n}\n\nexport const Switch: React.FC<SwitchProps> = ({\n size = 'md',\n checked,\n defaultChecked = false,\n disabled = false,\n label,\n description,\n onChange,\n className,\n id,\n ...props\n}) => {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const labelId = `${inputId}-label`;\n const descriptionId = `${inputId}-description`;\n const isControlled = typeof checked === 'boolean';\n const [internalChecked, setInternalChecked] = useState(defaultChecked);\n const currentChecked = isControlled ? checked : internalChecked;\n const isSmall = size === 'sm';\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n const nextChecked = event.target.checked;\n if (!isControlled) {\n setInternalChecked(nextChecked);\n }\n onChange?.(nextChecked);\n };\n\n return (\n <label\n htmlFor={inputId}\n className={cn(\n 'inline-flex items-center gap-3',\n disabled ? 'cursor-not-allowed opacity-55' : 'cursor-pointer',\n className,\n )}\n >\n {(label || description) && (\n <span className=\"min-w-0\">\n {label ? (\n <span id={labelId} className=\"block text-[14px] font-medium text-[var(--lumen-color-text)]\">\n {label}\n </span>\n ) : null}\n {description ? (\n <span id={descriptionId} className=\"mt-0.5 block text-[12px] leading-5 text-[var(--lumen-color-text-muted)]\">\n {description}\n </span>\n ) : null}\n </span>\n )}\n <span\n className={cn(\n 'relative inline-flex shrink-0 items-center',\n isSmall ? 'h-4 w-7' : 'h-6 w-11',\n )}\n data-switch-track\n data-checked={currentChecked ? 'true' : 'false'}\n >\n <input\n {...props}\n id={inputId}\n type=\"checkbox\"\n role=\"switch\"\n checked={currentChecked}\n disabled={disabled}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={description ? descriptionId : undefined}\n aria-label={typeof label === 'string' ? label : props['aria-label']}\n className=\"peer sr-only\"\n onChange={handleChange}\n />\n <span\n aria-hidden=\"true\"\n className={cn(\n 'absolute inset-0 rounded-full transition-colors duration-200 ease-out',\n currentChecked ? 'bg-[var(--lumen-color-primary)] shadow-[0_10px_24px_var(--lumen-color-focus-ring)]' : 'bg-[var(--lumen-color-border-hover)]',\n !disabled && 'peer-focus-visible:ring-2 peer-focus-visible:ring-[var(--lumen-color-info-border)]/70 peer-focus-visible:ring-offset-2',\n )}\n />\n <span\n aria-hidden=\"true\"\n data-switch-knob\n className={cn(\n 'absolute top-1/2 -translate-y-1/2 rounded-full border border-[var(--lumen-color-surface)]/80 bg-[var(--lumen-color-surface)] shadow-[0_2px_8px_var(--lumen-color-shadow)] transition-transform duration-200 ease-out',\n isSmall ? 'left-[2px] h-3 w-3' : 'left-[2px] h-5 w-5',\n currentChecked ? (isSmall ? 'translate-x-3' : 'translate-x-5') : 'translate-x-0',\n )}\n />\n </span>\n </label>\n );\n};\n","import React from 'react';\nimport { cn } from './classNames';\nimport {\n tabVariantClassNames,\n} from './designTokens';\nimport type { LucideIcon } from 'lucide-react';\n\nexport interface TabOption<T extends string> {\n value: T;\n label: string;\n count?: number | string;\n description?: string;\n icon?: LucideIcon;\n disabled?: boolean;\n}\n\nexport interface TabsProps<T extends string> {\n value: T;\n options: TabOption<T>[];\n onChange: (value: T) => void;\n variant?: keyof typeof tabVariantClassNames;\n className?: string;\n gridClassName?: string;\n itemClassName?: string;\n aside?: React.ReactNode;\n}\n\nexport const Tabs = <T extends string>({\n value,\n options,\n onChange,\n variant = 'default',\n className = '',\n gridClassName,\n itemClassName = '',\n aside,\n}: TabsProps<T>) => {\n const styles = tabVariantClassNames[variant];\n const resolvedGridClassName =\n gridClassName ??\n (variant === 'card'\n ? 'grid grid-cols-1 gap-2 pad:grid-cols-2 l:grid-cols-3 xl:grid-cols-4 xxl:grid-cols-5 xxxl:grid-cols-6'\n : 'flex items-center gap-2 overflow-x-auto');\n\n return (\n <div data-ui=\"tabs-surface\" className={cn(styles.container, className)}>\n <div className={cn('flex flex-col gap-3 pad:gap-4 l:flex-row l:items-center l:justify-between')}>\n <div\n role=\"tablist\"\n data-testid=\"tabs-grid\"\n className={cn(resolvedGridClassName, aside ? 'min-w-0 flex-1' : '')}\n >\n {options.map((option) => {\n const active = option.value === value;\n const Icon = option.icon;\n return (\n <button\n key={option.value}\n role=\"tab\"\n type=\"button\"\n aria-selected={active}\n aria-disabled={option.disabled || undefined}\n disabled={option.disabled}\n onClick={() => {\n if (!option.disabled) {\n onChange(option.value);\n }\n }}\n className={cn(\n styles.base,\n active ? styles.active : styles.inactive,\n option.disabled ? 'cursor-not-allowed opacity-45 hover:translate-y-0' : '',\n itemClassName,\n )}\n >\n {Icon ? (\n styles.iconBase ? (\n <span className={cn(styles.iconBase, active ? styles.iconActive : styles.iconInactive)}>\n <Icon size={16} className=\"shrink-0\" strokeWidth={2.2} />\n </span>\n ) : (\n <Icon size={14} className=\"shrink-0\" />\n )\n ) : null}\n <span className={styles.iconBase ? 'leading-none' : undefined}>{option.label}</span>\n {option.count !== undefined && option.count !== null ? (\n <span\n className={cn(\n styles.badgeBase,\n active ? styles.badgeActive : styles.badgeInactive,\n )}\n >\n {option.count}\n </span>\n ) : null}\n </button>\n );\n })}\n </div>\n {aside ? <div className=\"min-w-0 l:shrink-0\">{aside}</div> : null}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { cn } from './classNames';\nimport { radiusTokens } from './designTokens';\n\nexport type TextareaSize = 'sm' | 'md' | 'lg';\nexport type TextareaResize = 'none' | 'vertical';\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n size?: TextareaSize;\n resize?: TextareaResize;\n invalid?: boolean;\n}\n\nconst textareaSizeTokens: Record<TextareaSize, string> = {\n sm: 'px-2.5 py-2 text-[12px] leading-5',\n md: 'px-3 py-2.5 text-[13px] leading-5',\n lg: 'px-3.5 py-3 text-[14px] leading-6',\n};\n\nconst resizeTokens: Record<TextareaResize, string> = {\n none: 'resize-none',\n vertical: 'resize-y',\n};\n\nconst getStateClassName = (invalid?: boolean) =>\n invalid\n ? 'border-[var(--lumen-color-danger)] focus:border-[var(--lumen-color-danger)] focus:ring-2 focus:ring-[var(--lumen-color-danger)]/10'\n : 'border-[var(--lumen-color-border-strong)] hover:border-[var(--lumen-color-border-hover)] focus:border-[var(--lumen-color-primary)] focus:ring-2 focus:ring-[var(--lumen-color-primary)]/10';\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n size = 'lg',\n resize = 'vertical',\n invalid = false,\n className,\n disabled,\n ...props\n },\n ref,\n ) => (\n <textarea\n ref={ref}\n disabled={disabled}\n className={cn(\n 'w-full border bg-[var(--lumen-color-surface)] text-[var(--lumen-color-text)] outline-none transition-all placeholder:text-[var(--lumen-color-text-placeholder)] disabled:cursor-not-allowed disabled:bg-[var(--lumen-color-surface-muted)] disabled:text-[var(--lumen-color-text-placeholder)] disabled:opacity-100',\n radiusTokens.control,\n textareaSizeTokens[size],\n resizeTokens[resize],\n getStateClassName(invalid),\n className,\n )}\n {...props}\n autoComplete=\"off\"\n />\n ),\n);\n\nTextarea.displayName = 'Textarea';\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ChevronDown, Clock } from 'lucide-react';\nimport { Button } from './Button';\nimport { cn } from './classNames';\nimport { radiusTokens } from './designTokens';\nimport { TimeSelector } from './TimeSelector';\n\nexport interface TimePickerProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n className?: string;\n size?: 'md' | 'lg';\n precision?: 'minute' | 'second';\n minuteStep?: number;\n minExclusiveTime?: string;\n disabled?: boolean;\n}\n\nconst TIME_PATTERN = /^((?:[01]\\d|2[0-3])):([0-5]\\d)(?::([0-5]\\d))?$/;\nconst PANEL_WIDTH = 220;\nconst ESTIMATED_PANEL_HEIGHT = 326;\nconst PANEL_GAP = 6;\nconst CLOSE_ANIMATION_DURATION = 120;\n\nconst pad = (value: number) => String(value).padStart(2, '0');\n\nconst parseTime = (value: string) => {\n const matched = value.match(TIME_PATTERN);\n return matched\n ? { hour: matched[1]!, minute: matched[2]!, second: matched[3] ?? '00' }\n : null;\n};\n\nconst resolveInitialTime = (value: string) =>\n parseTime(value) ?? { hour: '09', minute: '00', second: '00' };\n\nconst getTimeInSeconds = (value?: string) => {\n const parsed = value ? parseTime(value) : null;\n return parsed\n ? Number(parsed.hour) * 3600 + Number(parsed.minute) * 60 + Number(parsed.second)\n : null;\n};\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n value,\n onChange,\n placeholder = '请选择时间',\n className,\n size = 'md',\n precision = 'minute',\n minuteStep = 1,\n minExclusiveTime,\n disabled = false,\n}) => {\n const initialTime = resolveInitialTime(value);\n const [draftHour, setDraftHour] = useState(initialTime.hour);\n const [draftMinute, setDraftMinute] = useState(initialTime.minute);\n const [draftSecond, setDraftSecond] = useState(initialTime.second);\n const [open, setOpen] = useState(false);\n const [isAnimatingOut, setIsAnimatingOut] = useState(false);\n const [dropDirection, setDropDirection] = useState<'up' | 'down'>('down');\n const wrapperRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const closeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [panelStyle, setPanelStyle] = useState<React.CSSProperties>({\n position: 'fixed',\n zIndex: 9999,\n });\n const draftTime =\n precision === 'second'\n ? `${draftHour}:${draftMinute}:${draftSecond}`\n : `${draftHour}:${draftMinute}`;\n const minimumTime = getTimeInSeconds(minExclusiveTime);\n const draftTimeInSeconds = getTimeInSeconds(draftTime);\n const draftDisabled = Boolean(\n minimumTime !== null &&\n draftTimeInSeconds !== null &&\n draftTimeInSeconds <= minimumTime,\n );\n\n const updatePosition = useCallback(() => {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (!rect) return;\n const panelHeight =\n panelRef.current?.offsetHeight || ESTIMATED_PANEL_HEIGHT;\n const panelWidth = Math.min(PANEL_WIDTH, Math.max(0, window.innerWidth - 16));\n const shouldDropUp =\n window.innerHeight - rect.bottom < panelHeight + PANEL_GAP;\n setDropDirection(shouldDropUp ? 'up' : 'down');\n setPanelStyle({\n position: 'fixed',\n left: Math.min(\n Math.max(8, rect.left),\n Math.max(8, window.innerWidth - panelWidth - 8),\n ),\n top: shouldDropUp\n ? Math.max(8, rect.top - panelHeight - PANEL_GAP)\n : rect.bottom + PANEL_GAP,\n width: panelWidth,\n maxHeight: 'calc(100dvh - 16px)',\n zIndex: 9999,\n });\n }, []);\n\n const closeImmediate = useCallback(() => {\n if (closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);\n setOpen(false);\n setIsAnimatingOut(false);\n }, []);\n\n const close = useCallback(() => {\n if (closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);\n setIsAnimatingOut(true);\n closeTimeoutRef.current = setTimeout(\n closeImmediate,\n CLOSE_ANIMATION_DURATION,\n );\n }, [closeImmediate]);\n\n const openPanel = () => {\n const next = resolveInitialTime(value);\n setDraftHour(next.hour);\n setDraftMinute(next.minute);\n setDraftSecond(next.second);\n setIsAnimatingOut(false);\n updatePosition();\n setOpen(true);\n };\n\n useEffect(() => {\n if (!open) return;\n updatePosition();\n const handleOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n wrapperRef.current?.contains(target) ||\n panelRef.current?.contains(target)\n ) {\n return;\n }\n close();\n };\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n document.addEventListener('mousedown', handleOutside);\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n document.removeEventListener('mousedown', handleOutside);\n };\n }, [close, open, updatePosition]);\n\n useEffect(\n () => () => {\n if (closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);\n },\n [],\n );\n\n const selectNow = () => {\n const now = new Date();\n setDraftHour(pad(now.getHours()));\n setDraftMinute(pad(now.getMinutes()));\n setDraftSecond(pad(now.getSeconds()));\n };\n\n const parsedValue = parseTime(value);\n const displayValue = parsedValue\n ? precision === 'second'\n ? `${parsedValue.hour}:${parsedValue.minute}:${parsedValue.second}`\n : `${parsedValue.hour}:${parsedValue.minute}`\n : '';\n\n return (\n <div ref={wrapperRef} className={cn('relative', className)}>\n <button\n ref={triggerRef}\n type=\"button\"\n disabled={disabled}\n aria-label={placeholder}\n onClick={() => (open ? close() : openPanel())}\n className={cn(\n 'flex w-full items-center border border-[var(--lumen-color-border-strong)] bg-[var(--lumen-color-surface)] outline-none transition-all hover:border-[var(--lumen-color-border-hover)] focus:border-[var(--lumen-color-primary)] focus:ring-2 focus:ring-[var(--lumen-color-primary)]/10',\n radiusTokens.control,\n size === 'md'\n ? 'h-[36px] px-3 text-[13px]'\n : 'h-[40px] px-3.5 text-[14px]',\n disabled && 'cursor-not-allowed bg-[var(--lumen-color-surface-muted)] opacity-60',\n )}\n >\n <Clock size={15} className=\"mr-2 shrink-0 text-[var(--lumen-color-text-placeholder)]\" />\n <span\n className={cn(\n 'min-w-0 flex-1 truncate whitespace-nowrap text-left',\n displayValue ? 'text-[var(--lumen-color-text)]' : 'text-[var(--lumen-color-text-placeholder)]',\n )}\n >\n {displayValue || placeholder}\n </span>\n <ChevronDown\n size={15}\n className={cn(\n 'ml-auto shrink-0 text-[var(--lumen-color-text-placeholder)] transition-transform',\n open && !isAnimatingOut && 'rotate-180',\n )}\n />\n </button>\n\n {open\n ? createPortal(\n <div\n ref={panelRef}\n data-time-picker-panel\n className=\"overflow-x-hidden overflow-y-auto rounded-[8px] border border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] shadow-[0_18px_46px_var(--lumen-color-shadow)]\"\n style={{\n ...panelStyle,\n animation: isAnimatingOut\n ? dropDirection === 'up'\n ? 'lumen-dropdown-out-up 0.12s ease-in forwards'\n : 'lumen-dropdown-out 0.12s ease-in forwards'\n : dropDirection === 'up'\n ? 'lumen-dropdown-in-up 0.12s ease-out'\n : 'lumen-dropdown-in 0.12s ease-out',\n transformOrigin: dropDirection === 'up' ? 'bottom' : 'top',\n }}\n >\n <TimeSelector\n hour={draftHour}\n minute={draftMinute}\n second={draftSecond}\n onHourChange={setDraftHour}\n onMinuteChange={setDraftMinute}\n onSecondChange={setDraftSecond}\n precision={precision}\n minuteStep={minuteStep}\n />\n <div className=\"flex items-center justify-between border-t border-[var(--lumen-color-surface-muted)] px-3 py-2.5\">\n <button\n type=\"button\"\n onClick={() => {\n onChange('');\n closeImmediate();\n }}\n className=\"text-[12px] text-[var(--lumen-color-text-placeholder)] hover:text-[var(--lumen-color-text-muted)]\"\n >\n 清除\n </button>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={selectNow}\n className=\"text-[12px] font-medium text-[var(--lumen-color-primary)]\"\n >\n 此刻\n </button>\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={draftDisabled}\n onClick={() => {\n onChange(draftTime);\n closeImmediate();\n }}\n >\n 确定\n </Button>\n </div>\n </div>\n </div>,\n document.body,\n )\n : null}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { ChevronDown, ChevronRight } from 'lucide-react';\n\nexport interface TimelineItem {\n id: string;\n date: string;\n title: string;\n description?: string;\n meta?: { label: string; value: string }[];\n type?: 'default' | 'success' | 'warning' | 'error';\n beforeValue?: string;\n afterValue?: string;\n}\n\ntype TimelineType = NonNullable<TimelineItem['type']>;\n\ninterface TimelineProps {\n items: TimelineItem[];\n onItemClick?: (id: string) => void;\n emptyText?: string;\n maxItems?: number;\n}\n\nconst typeStyles: Record<TimelineType, { dot: string; line: string; badge: string }> = {\n success: {\n dot: 'border-[var(--lumen-color-success)] bg-[var(--lumen-color-surface)]',\n line: 'bg-[var(--lumen-color-success-border)]',\n badge: 'bg-[var(--lumen-color-success-soft)] text-[var(--lumen-color-success-text)]',\n },\n warning: {\n dot: 'border-[var(--lumen-color-warning)] bg-[var(--lumen-color-surface)]',\n line: 'bg-[var(--lumen-color-warning-border)]',\n badge: 'bg-[var(--lumen-color-warning-soft)] text-[var(--lumen-color-warning-text)]',\n },\n error: {\n dot: 'border-[var(--lumen-color-danger)] bg-[var(--lumen-color-surface)]',\n line: 'bg-[var(--lumen-color-danger-border)]',\n badge: 'bg-[var(--lumen-color-danger-soft)] text-[var(--lumen-color-danger-text)]',\n },\n default: {\n dot: 'border-[var(--lumen-color-primary)] bg-[var(--lumen-color-surface)]',\n line: 'bg-[var(--lumen-color-info-border)]',\n badge: 'bg-[var(--lumen-color-info-soft)] text-[var(--lumen-color-info-text)]',\n },\n};\n\nexport const Timeline: React.FC<TimelineProps> = ({\n items,\n onItemClick,\n emptyText = '暂无记录',\n maxItems,\n}) => {\n const [expandedItems, setExpandedItems] = useState<Set<string>>(new Set());\n const displayItems = maxItems ? items.slice(0, maxItems) : items;\n\n const toggleExpand = (id: string) => {\n setExpandedItems((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n if (items.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"rounded-full bg-[var(--lumen-color-surface-muted)] p-4\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--lumen-color-text-placeholder)\" strokeWidth=\"1.5\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M12 1v4M12 19v4M4.22 4.22l2.83 2.83M16.95 16.95l2.83 2.83M1 12h4M19 12h4M4.22 19.78l2.83-2.83M16.95 7.05l2.83-2.83\" />\n </svg>\n </div>\n <p className=\"mt-3 text-[13px] text-[var(--lumen-color-text-placeholder)]\">{emptyText}</p>\n </div>\n );\n }\n\n return (\n <div className=\"relative\">\n {displayItems.map((item, idx) => {\n const style = typeStyles[item.type || 'default'];\n const isExpanded = expandedItems.has(item.id);\n const hasDetails = item.beforeValue || item.afterValue || item.description;\n\n return (\n <div\n key={item.id}\n className={`relative flex gap-3 pb-4 pad:gap-4 ${idx === displayItems.length - 1 ? '' : ''}`}\n >\n <div className=\"relative flex flex-col items-center\">\n <div className={`relative z-10 mt-1 h-[14px] w-[14px] rounded-full border-2 ${style.dot} shrink-0`} />\n {idx < displayItems.length - 1 && (\n <div className={`absolute top-[18px] bottom-[-16px] w-px ${style.line}`} />\n )}\n </div>\n\n <div\n className={`min-w-0 flex-1 rounded-[12px] border border-[var(--lumen-color-surface-muted)] bg-[var(--lumen-color-surface)] p-3 transition-shadow hover:shadow-sm pad:p-4 ${\n onItemClick ? 'cursor-pointer' : ''\n }`}\n onClick={() => onItemClick?.(item.id)}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className={`inline-flex rounded-full px-2 py-0.5 text-[11px] font-medium ${style.badge}`}>\n {item.title}\n </span>\n {hasDetails && (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n toggleExpand(item.id);\n }}\n className=\"inline-flex items-center gap-0.5 text-[11px] text-[var(--lumen-color-text-placeholder)] hover:text-[var(--lumen-color-text-muted)]\"\n >\n {isExpanded ? <ChevronDown size={12} /> : <ChevronRight size={12} />}\n 详情\n </button>\n )}\n </div>\n <p className=\"mt-2 text-[12px] text-[var(--lumen-color-text-muted)]\">{item.date}</p>\n </div>\n </div>\n\n {item.meta && item.meta.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-3 border-t border-[var(--lumen-color-surface-muted)] pt-3\">\n {item.meta.map((metaItem) => (\n <div key={metaItem.label}>\n <span className=\"text-[11px] text-[var(--lumen-color-text-placeholder)]\">{metaItem.label}</span>\n <span className=\"ml-1.5 text-[12px] font-medium text-[var(--lumen-color-text-secondary)]\">{metaItem.value}</span>\n </div>\n ))}\n </div>\n )}\n\n {isExpanded && hasDetails && (\n <div className=\"mt-3 space-y-2 border-t border-[var(--lumen-color-surface-muted)] pt-3\">\n {item.description && (\n <p className=\"text-[12px] leading-6 text-[var(--lumen-color-text-muted)]\">{item.description}</p>\n )}\n {item.beforeValue && item.afterValue && (\n <div className=\"grid grid-cols-1 gap-2 pad:grid-cols-2 pad:gap-3\">\n <div className=\"rounded-[6px] bg-[var(--lumen-color-danger-soft)] px-3 py-2\">\n <div className=\"text-[10px] text-[var(--lumen-color-danger)]\">变更前</div>\n <div className=\"mt-0.5 text-[12px] text-[var(--lumen-color-danger-text)] line-through\">{item.beforeValue}</div>\n </div>\n <div className=\"rounded-[6px] bg-[var(--lumen-color-success-soft)] px-3 py-2\">\n <div className=\"text-[10px] text-[var(--lumen-color-success)]\">变更后</div>\n <div className=\"mt-0.5 text-[12px] text-[var(--lumen-color-success-text)]\">{item.afterValue}</div>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n })}\n {maxItems && items.length > maxItems && (\n <p className=\"pl-[30px] text-[12px] text-[var(--lumen-color-text-placeholder)]\">\n 还有 {items.length - maxItems} 条记录\n </p>\n )}\n </div>\n );\n};\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport { AlertCircle, CheckCircle2, Info, X } from 'lucide-react';\n\nexport type ToastType = 'success' | 'info' | 'warning' | 'error';\n\nexport interface ToastOptions {\n duration?: number;\n}\n\ninterface ToastItem {\n id: string;\n message: string;\n type: ToastType;\n duration: number;\n}\n\ninterface ToastViewItem extends ToastItem {\n closing: boolean;\n}\n\ninterface ToastTimer {\n timeoutId: number | null;\n remaining: number;\n startedAt: number;\n}\n\ntype ToastListener = (item: ToastItem | null) => void;\n\nconst DEFAULT_DURATION = 2600;\nconst TOAST_ROOT_ID = 'global-toast-root';\n\nconst TONE_MAP = {\n success: {\n icon: CheckCircle2,\n iconWrap: 'bg-[var(--lumen-color-success-soft)] text-[var(--lumen-color-success)]',\n title: '操作成功',\n },\n info: {\n icon: Info,\n iconWrap: 'bg-[var(--lumen-color-info-soft)] text-[var(--lumen-color-primary)]',\n title: '提示',\n },\n warning: {\n icon: AlertCircle,\n iconWrap: 'bg-[var(--lumen-color-warning-soft)] text-[var(--lumen-color-warning)]',\n title: '请注意',\n },\n error: {\n icon: AlertCircle,\n iconWrap: 'bg-[var(--lumen-color-danger-soft)] text-[var(--lumen-color-danger-hover)]',\n title: '操作失败',\n },\n} as const;\n\nlet toastRoot: Root | null = null;\nlet toastContainer: HTMLDivElement | null = null;\nconst listeners = new Set<ToastListener>();\nconst pendingItems: ToastItem[] = [];\nconst activeToastKeys = new Set<string>();\n\nconst createToastId = () => `toast-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\nconst getToastKey = (item: Pick<ToastItem, 'message' | 'type'>) =>\n `${item.type}:${item.message}`;\n\nconst notify = (item: ToastItem | null) => {\n if (listeners.size === 0 && item) {\n pendingItems.push(item);\n return;\n }\n\n listeners.forEach((listener) => listener(item));\n};\n\nconst ensureToastHost = () => {\n if (typeof document === 'undefined') return;\n if (toastContainer && !document.body.contains(toastContainer)) {\n toastRoot?.unmount();\n toastRoot = null;\n toastContainer = null;\n listeners.clear();\n }\n if (toastRoot && toastContainer) return;\n\n const existing = document.getElementById(TOAST_ROOT_ID) as HTMLDivElement | null;\n toastContainer = existing || document.createElement('div');\n toastContainer.id = TOAST_ROOT_ID;\n\n if (!existing) {\n document.body.appendChild(toastContainer);\n }\n\n toastRoot = createRoot(toastContainer);\n toastRoot.render(<ToastViewport />);\n};\n\nconst subscribe = (listener: ToastListener) => {\n listeners.add(listener);\n pendingItems.splice(0).forEach((item) => listener(item));\n return () => {\n listeners.delete(listener);\n };\n};\n\nconst ToastViewport: React.FC = () => {\n const [items, setItems] = useState<ToastViewItem[]>([]);\n const timersRef = useRef<Map<string, ToastTimer>>(new Map());\n\n const clearTimer = useCallback((id: string) => {\n const timer = timersRef.current.get(id);\n if (timer?.timeoutId != null && typeof window !== 'undefined') {\n window.clearTimeout(timer.timeoutId);\n }\n timersRef.current.delete(id);\n }, []);\n\n const startClose = useCallback((id: string) => {\n if (typeof window === 'undefined') return;\n clearTimer(id);\n setItems((prev) =>\n prev.map((item) => (item.id === id ? { ...item, closing: true } : item)),\n );\n }, [clearTimer]);\n\n const startTimer = useCallback((id: string, duration: number) => {\n if (typeof window === 'undefined') return;\n const timeoutId = window.setTimeout(() => startClose(id), duration);\n timersRef.current.set(id, {\n timeoutId,\n remaining: duration,\n startedAt: Date.now(),\n });\n }, [startClose]);\n\n const pauseTimer = useCallback((id: string) => {\n const timer = timersRef.current.get(id);\n if (!timer || timer.timeoutId == null || typeof window === 'undefined') return;\n window.clearTimeout(timer.timeoutId);\n timer.remaining = Math.max(0, timer.remaining - (Date.now() - timer.startedAt));\n timer.timeoutId = null;\n }, []);\n\n const resumeTimer = useCallback((id: string) => {\n const timer = timersRef.current.get(id);\n if (!timer || timer.timeoutId != null) return;\n startTimer(id, timer.remaining);\n }, [startTimer]);\n\n const removeToast = useCallback((id: string) => {\n clearTimer(id);\n setItems((prev) => {\n const removed = prev.find((item) => item.id === id);\n if (removed) {\n activeToastKeys.delete(getToastKey(removed));\n }\n return prev.filter((item) => item.id !== id);\n });\n }, [clearTimer]);\n\n useEffect(() => {\n const timers = timersRef.current;\n const unsubscribe = subscribe((item) => {\n if (!item) {\n timers.forEach((timer) => {\n if (timer.timeoutId != null) window.clearTimeout(timer.timeoutId);\n });\n timers.clear();\n activeToastKeys.clear();\n setItems([]);\n return;\n }\n\n setItems((prev) => [...prev, { ...item, closing: false }]);\n startTimer(item.id, item.duration);\n });\n\n return () => {\n unsubscribe();\n timers.forEach((timer) => {\n if (timer.timeoutId != null) window.clearTimeout(timer.timeoutId);\n });\n timers.clear();\n };\n }, [startTimer]);\n\n if (items.length === 0) return null;\n\n return (\n <div\n className=\"pointer-events-none fixed inset-x-3 top-3 z-[120] flex flex-col items-stretch gap-2 pad:inset-x-auto pad:right-4 pad:top-4 pad:w-[min(420px,calc(100vw-2rem))] pad:items-end pad:gap-3 xl:right-6 xl:top-6\"\n data-toast-container\n >\n {items.map((item) => (\n <ToastCard\n key={item.id}\n item={item}\n onClose={() => startClose(item.id)}\n onExited={() => removeToast(item.id)}\n onPause={() => pauseTimer(item.id)}\n onResume={() => resumeTimer(item.id)}\n />\n ))}\n </div>\n );\n};\n\nconst ToastCard: React.FC<{\n item: ToastViewItem;\n onClose: () => void;\n onExited: () => void;\n onPause: () => void;\n onResume: () => void;\n}> = ({ item, onClose, onExited, onPause, onResume }) => {\n const tone = TONE_MAP[item.type];\n const Icon = tone.icon;\n\n return (\n <div\n className={`pointer-events-auto relative flex w-full min-w-0 max-w-[420px] items-start gap-2.5 overflow-hidden rounded-[10px] bg-[var(--lumen-color-surface-glass)] px-3 py-3 shadow-[0_14px_32px_var(--lumen-color-shadow),0_4px_10px_var(--lumen-color-shadow)] ring-1 ring-white/70 backdrop-blur-[5px] backdrop-saturate-125 pad:gap-3 pad:px-4 ${\n item.closing\n ? 'animate-[lumen-toast-out_160ms_ease-in_forwards]'\n : 'animate-[lumen-toast-in_180ms_ease-out]'\n }`}\n data-toast-id={item.id}\n onAnimationEnd={() => {\n if (item.closing) onExited();\n }}\n onMouseEnter={onPause}\n onMouseLeave={onResume}\n role=\"status\"\n aria-live=\"polite\"\n >\n <div className={`mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full ring-1 ring-white/70 ${tone.iconWrap}`}>\n <Icon size={16} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-[14px] font-medium text-[var(--lumen-color-text-strong)]\">{tone.title}</div>\n <div className=\"mt-1 text-[14px] leading-6 text-[var(--lumen-color-text-muted)]\">{item.message}</div>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"relative isolate flex h-7 w-7 shrink-0 items-center justify-center overflow-hidden rounded-full text-[var(--lumen-color-text-placeholder)] transition-colors after:pointer-events-none after:absolute after:inset-0 after:rounded-full after:bg-current after:opacity-0 after:transition-opacity hover:text-[var(--lumen-color-text-secondary)] hover:after:opacity-[0.08] active:after:opacity-[0.14] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--lumen-color-primary)]/20\"\n aria-label=\"关闭消息提示\"\n >\n <X size={14} />\n </button>\n </div>\n );\n};\n\nexport class Toast {\n static show(message: string, type: ToastType = 'info', options: ToastOptions = {}) {\n const key = getToastKey({ message, type });\n if (activeToastKeys.has(key)) {\n return;\n }\n activeToastKeys.add(key);\n ensureToastHost();\n notify({\n id: createToastId(),\n message,\n type,\n duration: options.duration ?? DEFAULT_DURATION,\n });\n }\n\n static success(message: string, options?: ToastOptions) {\n Toast.show(message, 'success', options);\n }\n\n static info(message: string, options?: ToastOptions) {\n Toast.show(message, 'info', options);\n }\n\n static warning(message: string, options?: ToastOptions) {\n Toast.show(message, 'warning', options);\n }\n\n static error(message: string, options?: ToastOptions) {\n Toast.show(message, 'error', options);\n }\n\n static clear() {\n pendingItems.splice(0);\n activeToastKeys.clear();\n notify(null);\n }\n\n static resetForTests() {\n Toast.clear();\n listeners.clear();\n toastRoot?.unmount();\n if (toastContainer?.parentNode) {\n toastContainer.parentNode.removeChild(toastContainer);\n }\n toastRoot = null;\n toastContainer = null;\n }\n}\n","import type React from 'react';\n\n/** 提示框放置方向 */\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\n/** 位置计算结果 */\nexport interface PositionResult {\n /** 提示框 left 坐标(相对视口) */\n x: number;\n /** 提示框 top 坐标(相对视口) */\n y: number;\n /** 实际放置方向(可能因视口翻转而改变) */\n actualPlacement: TooltipPlacement;\n /** 箭头内联样式 */\n arrowStyle: React.CSSProperties;\n}\n\n/** 视口尺寸 */\nexport interface ViewportSize {\n width: number;\n height: number;\n}\n\nconst ARROW_SIZE = 6;\nconst TOOLTIP_BG = 'var(--lumen-color-tooltip)';\n\n/** 方向对应的反方向 */\nconst OPPOSITE: Record<TooltipPlacement, TooltipPlacement> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\n/** 计算指定方向所需的空间 */\nfunction getAvailableSpace(\n triggerRect: DOMRect,\n placement: TooltipPlacement,\n viewportPadding: number,\n viewport: ViewportSize,\n): number {\n switch (placement) {\n case 'top':\n return triggerRect.top - viewportPadding;\n case 'bottom':\n return viewport.height - triggerRect.bottom - viewportPadding;\n case 'left':\n return triggerRect.left - viewportPadding;\n case 'right':\n return viewport.width - triggerRect.right - viewportPadding;\n }\n}\n\n/** 判断该方向上是否有足够空间(tooltip 尺寸 + offset) */\nfunction fitsInDirection(\n triggerRect: DOMRect,\n tooltipSize: { width: number; height: number },\n placement: TooltipPlacement,\n offset: number,\n viewportPadding: number,\n viewport: ViewportSize,\n): boolean {\n const needed =\n (placement === 'top' || placement === 'bottom')\n ? tooltipSize.height + offset\n : tooltipSize.width + offset;\n return getAvailableSpace(triggerRect, placement, viewportPadding, viewport) >= needed;\n}\n\n/** 生成箭头的 CSS border trick 样式 */\nfunction buildArrowStyle(\n placement: TooltipPlacement,\n arrowOffset: number,\n): React.CSSProperties {\n const border = `${ARROW_SIZE}px solid transparent`;\n const borderColored = `${ARROW_SIZE}px solid ${TOOLTIP_BG}`;\n\n switch (placement) {\n case 'top':\n return {\n position: 'absolute',\n bottom: -ARROW_SIZE,\n left: arrowOffset,\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: border,\n borderRight: border,\n borderTop: borderColored,\n };\n case 'bottom':\n return {\n position: 'absolute',\n top: -ARROW_SIZE,\n left: arrowOffset,\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: border,\n borderRight: border,\n borderBottom: borderColored,\n };\n case 'left':\n return {\n position: 'absolute',\n right: -ARROW_SIZE,\n top: arrowOffset,\n transform: 'translateY(-50%)',\n width: 0,\n height: 0,\n borderTop: border,\n borderBottom: border,\n borderLeft: borderColored,\n };\n case 'right':\n return {\n position: 'absolute',\n left: -ARROW_SIZE,\n top: arrowOffset,\n transform: 'translateY(-50%)',\n width: 0,\n height: 0,\n borderTop: border,\n borderBottom: border,\n borderRight: borderColored,\n };\n }\n}\n\n/**\n * 计算提示框位置(纯函数,无副作用)\n * @param triggerRect 触发元素的 getBoundingClientRect()\n * @param tooltipSize 提示框的 { width, height }\n * @param placement 期望的放置方向\n * @param offset 与触发元素的间距\n * @param viewportPadding 距视口边缘的安全边距,默认 8\n * @param viewport 视口尺寸,默认使用 window.innerWidth/innerHeight\n */\nexport function computePosition(\n triggerRect: DOMRect,\n tooltipSize: { width: number; height: number },\n placement: TooltipPlacement,\n offset: number,\n viewportPadding: number = 8,\n viewport: ViewportSize = typeof window !== 'undefined'\n ? { width: window.innerWidth, height: window.innerHeight }\n : { width: 1024, height: 768 },\n): PositionResult {\n // 翻转逻辑:空间不足时尝试反方向\n let actualPlacement = placement;\n if (!fitsInDirection(triggerRect, tooltipSize, placement, offset, viewportPadding, viewport)) {\n const opposite = OPPOSITE[placement];\n if (fitsInDirection(triggerRect, tooltipSize, opposite, offset, viewportPadding, viewport)) {\n actualPlacement = opposite;\n }\n // 都不够则保持原方向,后续 clamp\n }\n\n const { width: tw, height: th } = tooltipSize;\n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n\n let x: number;\n let y: number;\n let arrowOffset: number;\n\n switch (actualPlacement) {\n case 'top':\n x = triggerCenterX - tw / 2;\n y = triggerRect.top - th - offset;\n arrowOffset = triggerCenterX - x;\n break;\n case 'bottom':\n x = triggerCenterX - tw / 2;\n y = triggerRect.bottom + offset;\n arrowOffset = triggerCenterX - x;\n break;\n case 'left':\n x = triggerRect.left - tw - offset;\n y = triggerCenterY - th / 2;\n arrowOffset = triggerCenterY - y;\n break;\n case 'right':\n x = triggerRect.right + offset;\n y = triggerCenterY - th / 2;\n arrowOffset = triggerCenterY - y;\n break;\n }\n\n // 水平 clamp(top/bottom 方向)\n if (actualPlacement === 'top' || actualPlacement === 'bottom') {\n if (x < viewportPadding) {\n arrowOffset += x - viewportPadding;\n x = viewportPadding;\n } else if (x + tw > viewport.width - viewportPadding) {\n const overflow = x + tw - (viewport.width - viewportPadding);\n arrowOffset -= overflow;\n x -= overflow;\n }\n }\n\n // 垂直 clamp(left/right 方向)\n if (actualPlacement === 'left' || actualPlacement === 'right') {\n if (y < viewportPadding) {\n arrowOffset += y - viewportPadding;\n y = viewportPadding;\n } else if (y + th > viewport.height - viewportPadding) {\n const overflow = y + th - (viewport.height - viewportPadding);\n arrowOffset -= overflow;\n y -= overflow;\n }\n }\n\n const arrowStyle = buildArrowStyle(actualPlacement, arrowOffset);\n\n return { x, y, actualPlacement, arrowStyle };\n}\n","import React, {\n cloneElement,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from './classNames';\nimport { computePosition } from './tooltip-positions';\nimport type { TooltipPlacement } from './tooltip-positions';\n\nexport type { TooltipPlacement };\n\n/** 动画阶段 */\ntype Phase = 'hidden' | 'entering' | 'visible' | 'exiting';\n\nexport interface TooltipProps {\n /** 要显示的提示内容 */\n content: React.ReactNode;\n /** 触发元素(必须是单个 ReactElement) */\n children: React.ReactElement;\n /** 放置位置,默认 'top' */\n placement?: TooltipPlacement;\n /** 显示延迟 (ms),默认 300 */\n showDelay?: number;\n /** 隐藏延迟 (ms),默认 0 */\n hideDelay?: number;\n /** 是否禁用 tooltip */\n disabled?: boolean;\n /** 自定义 className */\n className?: string;\n /** 与触发元素的间距 (px),默认 8 */\n offset?: number;\n /** 是否显示小箭头,默认 true */\n showArrow?: boolean;\n}\n\n/** 合并多个 ref */\nfunction mergeRefs<T>(\n ...refs: Array<React.Ref<T> | undefined | null>\n): (el: T | null) => void {\n return (el: T | null) => {\n refs.forEach((ref) => {\n if (typeof ref === 'function') {\n ref(el);\n } else if (ref && typeof ref === 'object') {\n (ref as React.MutableRefObject<T | null>).current = el;\n }\n });\n };\n}\n\n/** 根据 placement 获取 transform-origin 类名 */\nfunction getOriginClass(placement: TooltipPlacement): string {\n switch (placement) {\n case 'top':\n return 'origin-bottom';\n case 'bottom':\n return 'origin-top';\n case 'left':\n return 'origin-right';\n case 'right':\n return 'origin-left';\n }\n}\n\n/**\n * 通用 Tooltip 组件\n *\n * 支持延迟展示、多种放置方向、视口自动翻转、入场/退场动画和小三角箭头。\n * 使用 Portal 渲染到 document.body,避免被父级 overflow 裁剪。\n */\nexport const Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n placement = 'top',\n showDelay = 350,\n hideDelay = 0,\n disabled = false,\n className,\n offset = 8,\n showArrow = true,\n}) => {\n const [phase, setPhase] = useState<Phase>('hidden');\n const [positionStyle, setPositionStyle] = useState<React.CSSProperties>({\n position: 'fixed',\n pointerEvents: 'none',\n });\n const [actualPlacement, setActualPlacement] = useState<TooltipPlacement>(placement);\n const [arrowStyle, setArrowStyle] = useState<React.CSSProperties>({});\n\n const triggerRef = useRef<HTMLElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const showTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const hideTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const animFrameRef = useRef<number>(undefined);\n\n // 清理所有定时器\n const clearTimers = useCallback(() => {\n clearTimeout(showTimerRef.current);\n clearTimeout(hideTimerRef.current);\n showTimerRef.current = undefined;\n hideTimerRef.current = undefined;\n }, []);\n\n // 计算位置\n const updatePosition = useCallback(() => {\n const triggerEl = triggerRef.current;\n const tooltipEl = tooltipRef.current;\n if (!triggerEl || !tooltipEl) return;\n\n const triggerRect = triggerEl.getBoundingClientRect();\n const tooltipSize = {\n width: tooltipEl.offsetWidth,\n height: tooltipEl.offsetHeight,\n };\n const result = computePosition(triggerRect, tooltipSize, placement, offset);\n setPositionStyle({\n position: 'fixed',\n left: result.x,\n top: result.y,\n zIndex: 1200,\n pointerEvents: 'none',\n });\n setActualPlacement(result.actualPlacement);\n setArrowStyle(result.arrowStyle);\n }, [placement, offset]);\n\n // 触发显示\n const show = useCallback(() => {\n if (disabled) return;\n clearTimers();\n showTimerRef.current = setTimeout(() => {\n setPhase('entering');\n }, showDelay);\n }, [disabled, showDelay, clearTimers]);\n\n // 触发隐藏\n const hide = useCallback(() => {\n clearTimers();\n hideTimerRef.current = setTimeout(() => {\n setPhase('exiting');\n }, hideDelay);\n }, [hideDelay, clearTimers]);\n\n const dismissOnScroll = useCallback(() => {\n clearTimers();\n if (animFrameRef.current !== undefined) {\n cancelAnimationFrame(animFrameRef.current);\n animFrameRef.current = undefined;\n }\n setPhase('hidden');\n }, [clearTimers]);\n\n // 入场:entering → visible(双帧 rAF 保证初始样式先渲染)\n useLayoutEffect(() => {\n if (phase === 'entering') {\n updatePosition();\n animFrameRef.current = requestAnimationFrame(() => {\n animFrameRef.current = requestAnimationFrame(() => {\n setPhase('visible');\n });\n });\n }\n }, [phase, updatePosition]);\n\n // 退场:exiting → hidden(等动画结束)\n useEffect(() => {\n if (phase === 'exiting') {\n const timer = setTimeout(() => setPhase('hidden'), 150);\n return () => clearTimeout(timer);\n }\n }, [phase]);\n\n // 滚动任意容器时立即关闭,并取消等待显示的 tooltip。\n useEffect(() => {\n window.addEventListener('scroll', dismissOnScroll, {\n capture: true,\n passive: true,\n });\n\n return () => {\n window.removeEventListener('scroll', dismissOnScroll, true);\n };\n }, [dismissOnScroll]);\n\n // 展示期间仅在视口尺寸变化时重新计算位置。\n useEffect(() => {\n if (phase !== 'visible' && phase !== 'entering') return;\n\n const handleResize = () => updatePosition();\n window.addEventListener('resize', handleResize, { passive: true });\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, [phase, updatePosition]);\n\n // 组件卸载清理\n useEffect(() => {\n return () => {\n clearTimers();\n if (animFrameRef.current !== undefined) {\n cancelAnimationFrame(animFrameRef.current);\n }\n };\n }, [clearTimers]);\n\n // 事件处理 — 使用 pointer 事件兼容平板触摸板\n const handlePointerEnter = useCallback(() => show(), [show]);\n const handlePointerLeave = useCallback(() => hide(), [hide]);\n\n const tooltipNode = phase !== 'hidden' ? (\n <div\n ref={tooltipRef}\n className={cn(\n 'bg-[var(--lumen-color-tooltip)]/90 text-[var(--lumen-color-on-primary)] text-[12px] px-3 py-1.5 rounded-md shadow-xl whitespace-nowrap',\n getOriginClass(actualPlacement),\n 'transition-[opacity,transform] duration-150 ease-out',\n phase === 'visible' ? 'opacity-100 scale-100' : 'opacity-0 scale-95',\n className,\n )}\n style={positionStyle}\n role=\"tooltip\"\n >\n {content}\n {showArrow && <div style={arrowStyle} />}\n </div>\n ) : null;\n\n return (\n <>\n {cloneElement(children, {\n ref: mergeRefs((children as React.ReactElement & { ref?: React.Ref<HTMLElement> }).ref, triggerRef),\n onPointerEnter: handlePointerEnter,\n onPointerLeave: handlePointerLeave,\n } as React.HTMLAttributes<HTMLElement> & { ref: React.Ref<HTMLElement> })}\n {tooltipNode && createPortal(tooltipNode, document.body)}\n </>\n );\n};\n","import React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n ChevronDown,\n ChevronRight,\n ChevronDown as ExpandChevronDown,\n Search,\n X,\n} from 'lucide-react';\nimport { cn } from './classNames';\nimport { radiusTokens } from './designTokens';\nimport { dropdownTransformOrigin } from './dropdownMotion';\n\nconst DROPDOWN_CLOSE_ANIMATION_MS = 120;\nconst SHOULD_SKIP_CLOSE_ANIMATION_IN_TEST = import.meta.env.MODE === 'test';\n\ntype TreeSelectSize = 'sm' | 'md' | 'lg';\n\nexport interface TreeSelectProps<TNode> {\n nodes: TNode[];\n value: string | null;\n onChange: (value: string | null, node: TNode | null) => void;\n values?: string[];\n lockedValues?: string[];\n onMultiChange?: (values: string[], nodes: TNode[]) => void;\n multiple?: boolean;\n exclusiveHierarchySelection?: boolean;\n searchable?: boolean;\n expandSearchResults?: boolean;\n searchPlaceholder?: string;\n getValue: (node: TNode) => string;\n getLabel: (node: TNode) => string;\n getChildren?: (node: TNode) => TNode[] | undefined;\n isNodeSelectable?: (node: TNode) => boolean;\n renderPrefix?: (node: TNode) => React.ReactNode;\n defaultExpandedDepth?: number;\n placeholder?: string;\n disabled?: boolean;\n loading?: boolean;\n emptyText?: string;\n className?: string;\n size?: TreeSelectSize;\n}\n\nfunction withChildren<TNode>(node: TNode, children: TNode[]): TNode {\n if (typeof node === 'object' && node !== null) {\n return {\n ...(node as Record<string, unknown>),\n children,\n } as TNode;\n }\n return node;\n}\n\nfunction filterTreeNodes<TNode>(\n nodes: TNode[],\n keyword: string,\n getLabel: (node: TNode) => string,\n getChildren?: (node: TNode) => TNode[] | undefined,\n): TNode[] {\n const normalizedKeyword = keyword.trim().toLowerCase();\n if (!normalizedKeyword) {\n return nodes;\n }\n\n return nodes\n .map((node) => {\n const label = getLabel(node).toLowerCase();\n const children = getNodeChildren(node, getChildren);\n const filteredChildren = filterTreeNodes(\n children,\n normalizedKeyword,\n getLabel,\n getChildren,\n );\n const matched = label.includes(normalizedKeyword);\n if (!matched && filteredChildren.length === 0) {\n return null;\n }\n return matched\n ? withChildren(node, children)\n : withChildren(node, filteredChildren);\n })\n .filter((node): node is TNode => node !== null);\n}\n\nconst sizeTokens: Record<TreeSelectSize, string> = {\n sm: 'min-h-[32px] px-3 text-[12px]',\n md: 'min-h-[36px] px-3 text-[13px]',\n lg: 'min-h-[40px] px-3.5 text-[14px]',\n};\n\nfunction getNodeChildren<TNode>(\n node: TNode,\n getChildren?: (node: TNode) => TNode[] | undefined,\n) {\n if (getChildren) {\n return getChildren(node) ?? [];\n }\n if (\n typeof node === 'object' &&\n node !== null &&\n 'children' in (node as Record<string, unknown>) &&\n Array.isArray((node as { children?: unknown[] }).children)\n ) {\n return ((node as { children?: TNode[] }).children ?? []) as TNode[];\n }\n return [];\n}\n\nfunction findNodeByValue<TNode>(\n nodes: TNode[],\n value: string,\n getValue: (node: TNode) => string,\n getLabel: (node: TNode) => string,\n getChildren?: (node: TNode) => TNode[] | undefined,\n): TNode | null {\n for (const node of nodes) {\n if (getValue(node) === value) {\n return node;\n }\n getLabel(node);\n const children = getNodeChildren(node, getChildren);\n if (children.length > 0) {\n const matched = findNodeByValue(\n children,\n value,\n getValue,\n getLabel,\n getChildren,\n );\n if (matched) {\n return matched;\n }\n }\n }\n return null;\n}\n\nfunction findRelatedHierarchyValues<TNode>(\n nodes: TNode[],\n targetValue: string,\n getValue: (node: TNode) => string,\n getChildren?: (node: TNode) => TNode[] | undefined,\n): Set<string> {\n const relatedValues = new Set<string>();\n\n const collectDescendants = (node: TNode) => {\n getNodeChildren(node, getChildren).forEach((child) => {\n relatedValues.add(getValue(child));\n collectDescendants(child);\n });\n };\n\n const visit = (currentNodes: TNode[], ancestors: string[]): boolean => {\n for (const node of currentNodes) {\n const nodeValue = getValue(node);\n if (nodeValue === targetValue) {\n ancestors.forEach((ancestor) => relatedValues.add(ancestor));\n collectDescendants(node);\n return true;\n }\n if (\n visit(getNodeChildren(node, getChildren), [...ancestors, nodeValue])\n ) {\n return true;\n }\n }\n return false;\n };\n\n visit(nodes, []);\n return relatedValues;\n}\n\nfunction getDefaultExpandedKeys<TNode>(\n nodes: TNode[],\n getValue: (node: TNode) => string,\n getChildren?: (node: TNode) => TNode[] | undefined,\n defaultExpandedDepth = 1,\n) {\n const keys: string[] = [];\n const visit = (currentNodes: TNode[], depth: number) => {\n if (depth >= defaultExpandedDepth) {\n return;\n }\n currentNodes.forEach((node) => {\n const children = getNodeChildren(node, getChildren);\n if (children.length === 0) {\n return;\n }\n keys.push(getValue(node));\n visit(children, depth + 1);\n });\n };\n visit(nodes, 0);\n return keys;\n}\n\nexport const TreeSelect = <TNode,>({\n nodes,\n value,\n onChange,\n values,\n lockedValues = [],\n onMultiChange,\n multiple = false,\n exclusiveHierarchySelection = false,\n searchable = false,\n expandSearchResults = false,\n searchPlaceholder = '搜索组织节点',\n getValue,\n getLabel,\n getChildren,\n isNodeSelectable,\n renderPrefix,\n defaultExpandedDepth = 1,\n placeholder = '请选择',\n disabled = false,\n loading = false,\n emptyText = '无可选节点',\n className,\n size = 'md',\n}: TreeSelectProps<TNode>) => {\n const lockedValueSet = useMemo(() => new Set(lockedValues), [lockedValues]);\n const [isOpen, setIsOpen] = useState(false);\n const [isAnimatingOut, setIsAnimatingOut] = useState(false);\n const [isPositioned, setIsPositioned] = useState(false);\n const [shouldDropUp, setShouldDropUp] = useState(false);\n const [expandedKeys, setExpandedKeys] = useState<string[]>(\n getDefaultExpandedKeys(nodes, getValue, getChildren, defaultExpandedDepth),\n );\n const [searchKeyword, setSearchKeyword] = useState('');\n const [dropdownStyle, setDropdownStyle] = useState<React.CSSProperties>({\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex: 9999,\n });\n const containerRef = useRef<HTMLDivElement>(null);\n const portalRef = useRef<HTMLDivElement>(null);\n const closeTimeoutRef = useRef<ReturnType<typeof setTimeout>>(null);\n\n const updateDropdownPosition = useCallback(() => {\n if (!containerRef.current) {\n return;\n }\n const rect = containerRef.current.getBoundingClientRect();\n const estimatedHeight = 280;\n const dropdownHeight = portalRef.current?.offsetHeight || estimatedHeight;\n const gap = 6;\n const viewportPadding = 8;\n const shouldOpenUp = window.innerHeight - rect.bottom < dropdownHeight;\n const top = shouldOpenUp\n ? Math.max(viewportPadding, rect.top - dropdownHeight - gap)\n : Math.min(window.innerHeight - viewportPadding, rect.bottom + gap);\n const availableWidth = Math.max(0, window.innerWidth - viewportPadding * 2);\n const triggerWidth = Math.min(rect.width, availableWidth);\n const maxWidth = Math.min(Math.max(triggerWidth, triggerWidth * 2.8), availableWidth, 480);\n const width = Math.max(\n triggerWidth,\n Math.min(\n maxWidth,\n Math.max(triggerWidth, portalRef.current?.offsetWidth || triggerWidth),\n ),\n );\n const left = Math.min(\n Math.max(viewportPadding, rect.left),\n Math.max(viewportPadding, window.innerWidth - width - viewportPadding),\n );\n\n setShouldDropUp(shouldOpenUp);\n setDropdownStyle({\n position: 'fixed',\n top,\n left,\n width: 'max-content',\n minWidth: triggerWidth,\n maxWidth,\n zIndex: 9999,\n });\n setIsPositioned(true);\n }, []);\n\n const selectedNode =\n value == null ? null : findNodeByValue(nodes, value, getValue, getLabel, getChildren);\n\n const selectedValues = multiple ? (values ?? []) : [];\n const latestSelectedValuesRef = useRef(selectedValues);\n latestSelectedValuesRef.current = selectedValues;\n\n const selectedNodes = selectedValues\n .map((selectedValue) =>\n findNodeByValue(nodes, selectedValue, getValue, getLabel, getChildren),\n )\n .filter((node): node is TNode => node !== null);\n\n const visibleNodes = filterTreeNodes(\n nodes,\n searchable ? searchKeyword : '',\n getLabel,\n getChildren,\n );\n const shouldExpandSearchResults =\n expandSearchResults && searchable && searchKeyword.trim().length > 0;\n\n useEffect(() => {\n setExpandedKeys(\n getDefaultExpandedKeys(\n nodes,\n getValue,\n getChildren,\n defaultExpandedDepth,\n ),\n );\n // Reset expansion only when the tree data/depth changes; callback props may be inline.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [defaultExpandedDepth, nodes]);\n\n useEffect(() => {\n return () => {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n };\n }, []);\n\n useEffect(() => {\n if (!isOpen) {\n setIsPositioned(false);\n return;\n }\n const handleOutsideClick = (event: MouseEvent) => {\n const target = event.target as Node;\n if (containerRef.current?.contains(target)) {\n return;\n }\n if (portalRef.current?.contains(target)) {\n return;\n }\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n setIsAnimatingOut(true);\n closeTimeoutRef.current = setTimeout(() => {\n setIsOpen(false);\n setIsAnimatingOut(false);\n }, 120);\n };\n document.addEventListener('mousedown', handleOutsideClick);\n return () => document.removeEventListener('mousedown', handleOutsideClick);\n }, [isOpen]);\n\n useLayoutEffect(() => {\n if (!isOpen) {\n return;\n }\n\n updateDropdownPosition();\n const frameId = window.requestAnimationFrame(updateDropdownPosition);\n window.addEventListener('scroll', updateDropdownPosition, true);\n window.addEventListener('resize', updateDropdownPosition);\n\n return () => {\n window.cancelAnimationFrame(frameId);\n window.removeEventListener('scroll', updateDropdownPosition, true);\n window.removeEventListener('resize', updateDropdownPosition);\n };\n }, [isOpen, nodes, loading, updateDropdownPosition]);\n\n useEffect(() => {\n if (!isOpen) {\n setSearchKeyword('');\n }\n }, [isOpen]);\n\n const closeDropdown = () => {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n if (SHOULD_SKIP_CLOSE_ANIMATION_IN_TEST) {\n setIsOpen(false);\n setIsAnimatingOut(false);\n return;\n }\n setIsAnimatingOut(true);\n closeTimeoutRef.current = setTimeout(() => {\n setIsOpen(false);\n setIsAnimatingOut(false);\n }, DROPDOWN_CLOSE_ANIMATION_MS);\n };\n\n const closeDropdownImmediate = () => {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n setIsOpen(false);\n setIsAnimatingOut(false);\n };\n\n const openDropdown = () => {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n setIsPositioned(false);\n updateDropdownPosition();\n setIsOpen(true);\n setIsAnimatingOut(false);\n };\n\n const toggleExpand = (nodeValue: string) => {\n setExpandedKeys((current) =>\n current.includes(nodeValue)\n ? current.filter((key) => key !== nodeValue)\n : [...current, nodeValue],\n );\n };\n\n const renderNode = (node: TNode, depth: number): React.ReactNode => {\n const nodeValue = getValue(node);\n const children = getNodeChildren(node, getChildren);\n const hasChildren = children.length > 0;\n const isExpanded =\n shouldExpandSearchResults || expandedKeys.includes(nodeValue);\n const selectable = isNodeSelectable?.(node) ?? true;\n const expandableOnly = !selectable && hasChildren;\n const isSelected = multiple\n ? selectedValues.includes(nodeValue)\n : value === nodeValue;\n\n return (\n <div key={nodeValue} className=\"space-y-1\">\n <div\n className={cn(\n 'flex items-center rounded-[8px] px-2 py-1.5 text-[13px] transition-colors',\n isSelected\n ? 'bg-[var(--lumen-color-primary-soft)] font-medium text-[var(--lumen-color-primary)]'\n : selectable || expandableOnly\n ? 'text-[var(--lumen-color-text-secondary)] hover:bg-[var(--lumen-color-surface-muted)]'\n : 'text-[var(--lumen-color-text-placeholder)]',\n )}\n style={{ paddingLeft: `${depth * 16 + 8}px` }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n data-testid={`tree-select-expand-${nodeValue}`}\n className=\"mr-1 flex h-6 w-6 shrink-0 items-center justify-center rounded-[6px] text-[var(--lumen-color-text-muted)] transition-colors hover:bg-[var(--lumen-color-surface-muted)] hover:text-[var(--lumen-color-text-secondary)]\"\n onClick={(event) => {\n event.stopPropagation();\n toggleExpand(nodeValue);\n }}\n >\n {isExpanded ? (\n <ExpandChevronDown size={14} />\n ) : (\n <ChevronRight size={14} />\n )}\n </button>\n ) : (\n <span className=\"mr-1 w-[18px] shrink-0\" />\n )}\n <button\n type=\"button\"\n data-testid={`tree-select-option-${nodeValue}`}\n aria-disabled={!selectable}\n className={cn(\n 'flex min-w-0 flex-1 items-center gap-2 bg-transparent text-left text-inherit',\n selectable ? 'cursor-pointer' : 'cursor-default',\n )}\n onClick={(event) => {\n if (!selectable) {\n if (hasChildren && !isExpanded) {\n event.stopPropagation();\n toggleExpand(nodeValue);\n }\n return;\n }\n if (multiple) {\n const currentValues = latestSelectedValuesRef.current;\n const exists = currentValues.includes(nodeValue);\n if (exists && lockedValueSet.has(nodeValue)) {\n return;\n }\n let nextValues = currentValues.filter(\n (item) => item !== nodeValue,\n );\n if (!exists) {\n if (exclusiveHierarchySelection) {\n const relatedValues = findRelatedHierarchyValues(\n nodes,\n nodeValue,\n getValue,\n getChildren,\n );\n nextValues = nextValues.filter(\n (item) => !relatedValues.has(item),\n );\n }\n nextValues.push(nodeValue);\n }\n const nextNodes = nextValues\n .map((item) =>\n findNodeByValue(\n nodes,\n item,\n getValue,\n getLabel,\n getChildren,\n ),\n )\n .filter((item): item is TNode => item !== null);\n latestSelectedValuesRef.current = nextValues;\n onMultiChange?.(nextValues, nextNodes);\n return;\n }\n\n onChange(nodeValue, node);\n closeDropdownImmediate();\n }}\n >\n {renderPrefix?.(node)}\n <span className=\"truncate\">{getLabel(node)}</span>\n </button>\n </div>\n {hasChildren && isExpanded && (\n <div className=\"space-y-1\">\n {children.map((child) => renderNode(child, depth + 1))}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={containerRef}\n className={cn('relative', className)}\n onKeyDown={(event) => {\n if (disabled) {\n return;\n }\n if (!isOpen && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n openDropdown();\n return;\n }\n if (isOpen && event.key === 'Escape') {\n event.preventDefault();\n closeDropdownImmediate();\n }\n }}\n >\n <button\n type=\"button\"\n data-testid=\"tree-select-trigger\"\n disabled={disabled}\n onClick={() => {\n if (disabled) {\n return;\n }\n if (isOpen) {\n closeDropdown();\n return;\n }\n openDropdown();\n }}\n className={cn(\n 'flex w-full items-center gap-2 border bg-[var(--lumen-color-surface)] text-left outline-none transition-all',\n radiusTokens.control,\n sizeTokens[size],\n disabled\n ? 'cursor-not-allowed border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface-muted)] opacity-50'\n : isOpen\n ? 'border-[var(--lumen-color-primary)] ring-1 ring-[var(--lumen-color-primary)]/10'\n : 'border-[var(--lumen-color-border)] hover:border-[var(--lumen-color-border-hover)]',\n )}\n >\n {multiple ? (\n <div className=\"flex min-w-0 flex-1 flex-wrap gap-1.5 py-1\">\n {selectedNodes.length > 0 ? selectedNodes.map((node) => {\n const nodeValue = getValue(node);\n return (\n <span\n key={nodeValue}\n className=\"inline-flex items-center gap-1 rounded-[6px] bg-[var(--lumen-color-primary-soft)] px-2 py-0.5 text-[13px] text-[var(--lumen-color-primary)]\"\n >\n {getLabel(node)}\n {!lockedValueSet.has(nodeValue) ? (\n <X\n size={12}\n aria-label={`移除 ${getLabel(node)}`}\n className=\"cursor-pointer text-[var(--lumen-color-primary)]/60 hover:text-[var(--lumen-color-primary)]\"\n onClick={(event) => {\n event.stopPropagation();\n const nextValues = latestSelectedValuesRef.current.filter(\n (item) => item !== nodeValue,\n );\n const nextNodes = nextValues\n .map((item) =>\n findNodeByValue(\n nodes,\n item,\n getValue,\n getLabel,\n getChildren,\n ),\n )\n .filter((item): item is TNode => item !== null);\n latestSelectedValuesRef.current = nextValues;\n onMultiChange?.(nextValues, nextNodes);\n }}\n />\n ) : null}\n </span>\n );\n }) : <span className=\"text-[var(--lumen-color-text-placeholder)]\">{placeholder}</span>}\n </div>\n ) : selectedNode ? (\n <span className=\"min-w-0 flex-1 truncate text-[var(--lumen-color-text)]\">\n {getLabel(selectedNode)}\n </span>\n ) : (\n <span className=\"min-w-0 flex-1 truncate text-[var(--lumen-color-text-placeholder)]\">\n {placeholder}\n </span>\n )}\n <ChevronDown\n size={16}\n className={cn(\n 'shrink-0 text-[var(--lumen-color-text-placeholder)] transition-transform duration-200',\n isOpen && 'rotate-180',\n )}\n />\n </button>\n\n {isOpen &&\n createPortal(\n <div\n ref={portalRef}\n data-testid=\"tree-select-dropdown\"\n className={cn(\n radiusTokens.card,\n 'border border-[var(--lumen-color-border)] bg-[var(--lumen-color-surface)] shadow-[0_8px_30px_var(--lumen-color-shadow)]',\n )}\n style={{\n ...dropdownStyle,\n animation: isAnimatingOut\n ? shouldDropUp\n ? 'lumen-dropdown-out-up 0.12s ease-in forwards'\n : 'lumen-dropdown-out 0.12s ease-in forwards'\n : shouldDropUp\n ? 'lumen-dropdown-in-up 0.12s ease-out'\n : 'lumen-dropdown-in 0.12s ease-out',\n transformOrigin: dropdownTransformOrigin(shouldDropUp),\n visibility: isPositioned ? undefined : 'hidden',\n }}\n >\n {searchable ? (\n <div className=\"border-b border-[var(--lumen-color-surface-muted)] p-2.5\">\n <div className=\"flex items-center gap-2 rounded-[8px] bg-[var(--lumen-color-surface-muted)] px-3 py-2\">\n <Search size={14} className=\"shrink-0 text-[var(--lumen-color-text-placeholder)]\" />\n <input\n className=\"w-full bg-transparent text-[13px] text-[var(--lumen-color-text)] outline-none placeholder:text-[var(--lumen-color-text-placeholder)]\"\n placeholder={searchPlaceholder}\n value={searchKeyword}\n onChange={(event) => setSearchKeyword(event.target.value)}\n autoFocus\n />\n </div>\n </div>\n ) : null}\n <div className=\"max-h-[280px] overflow-y-auto p-1.5\">\n {loading ? (\n <div className=\"px-3 py-4 text-center text-[13px] text-[var(--lumen-color-text-placeholder)]\">\n 加载中...\n </div>\n ) : visibleNodes.length === 0 ? (\n <div className=\"px-3 py-4 text-center text-[13px] text-[var(--lumen-color-text-placeholder)]\">\n {emptyText}\n </div>\n ) : (\n visibleNodes.map((node) => renderNode(node, 0))\n )}\n </div>\n {multiple && selectedValues.some((item) => !lockedValueSet.has(item)) ? (\n <div className=\"flex items-center justify-between border-t border-[var(--lumen-color-surface-muted)] px-3 py-2.5\">\n <span className=\"text-[12px] text-[var(--lumen-color-text-placeholder)]\">已选 {selectedValues.length} 项</span>\n <button\n type=\"button\"\n className=\"text-[12px] text-[var(--lumen-color-text-placeholder)] transition-colors hover:text-[var(--lumen-color-text-muted)]\"\n onClick={() => {\n const nextValues = latestSelectedValuesRef.current.filter((item) =>\n lockedValueSet.has(item));\n const nextNodes = nextValues\n .map((item) =>\n findNodeByValue(nodes, item, getValue, getLabel, getChildren))\n .filter((item): item is TNode => item !== null);\n latestSelectedValuesRef.current = nextValues;\n onMultiChange?.(nextValues, nextNodes);\n }}\n >\n 清空\n </button>\n </div>\n ) : null}\n </div>,\n document.body,\n )}\n </div>\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","cn","classes","radiusTokens","buttonSizeTokens","buttonIconSizeTokens","buttonVariantTokens","buttonBase","getButtonClassNames","variant","size","iconOnly","className","tabVariantClassNames","sizeClasses","iconSizes","getInitials","parts","Avatar","src","alt","fallback","shape","imageProps","role","ariaLabel","ref","failedSrc","setFailedSrc","useState","showImage","imageClassName","onImageError","restImageProps","initials","jsx","event","User","shapeClasses","Badge","Button","icon","jsxs","Checkbox","checked","defaultChecked","disabled","indeterminate","label","description","onChange","id","inputRef","useRef","generatedId","useId","inputId","labelId","descriptionId","isControlled","internalChecked","setInternalChecked","currentChecked","isSmall","hasDescription","explicitAriaLabel","useEffect","handleChange","nextChecked","indicatorVisible","Minus","Check","overlayBaseClassName","Modal","open","onRequestClose","onExited","modalId","overlayId","overlayClassName","panelClassName","closeOnOverlayClick","mounted","setMounted","closing","setClosing","cachedChildren","setCachedChildren","isClosing","handleAnimationEnd","useCallback","displayChildren","createPortal","ConfirmDialog","title","message","confirmText","confirmVariant","cancelText","confirmDisabled","confirmLoading","cancelDisabled","onConfirm","onCancel","Loader2","WEEKDAYS","MONTHS","YEAR_PAGE_SIZE","DEFAULT_YEAR_RANGE_PREV_PAGES","DEFAULT_YEAR_RANGE_NEXT_PAGES","DROPDOWN_WIDTH","DROPDOWN_VIEWPORT_MARGIN","pad","n","getDaysInMonth","year","month","getFirstDayOfWeek","formatValue","mode","fmt","parseDate","compareDateStr","a","b","getYearPageStart","sizeTokens","DatePicker","placeholder","triggerAriaLabel","clearable","showToday","format","minDate","maxDate","setOpen","isAnimatingOut","setIsAnimatingOut","closeTimeoutRef","tokens","slideDirection","setSlideDirection","isAnimating","setIsAnimating","showYearPicker","setShowYearPicker","yearPickerStart","setYearPickerStart","dayView","setDayView","dayYearPickerStart","setDayYearPickerStart","dropdownStyle","setDropdownStyle","dropDirection","setDropDirection","triggerRef","portalRef","updateDropdownPosition","rect","viewportWidth","dropdownWidth","estimatedDropdownHeight","dropdownHeight","_a","gap","shouldDropUp","top","preferredLeft","maxLeft","left","parsed","useMemo","todayDate","d","todayStr","currentYearPageStart","defaultMinYearPageStart","defaultMaxYearPageStart","resolvedMinYearPageStart","resolvedMaxYearPageStart","viewYear","setViewYear","viewMonth","setViewMonth","closeDropdown","closeDropdownImmediate","initialYearPageStart","frameId","observer","handler","e","target","portal","isDateDisabled","dateStr","min","max","isMonthDisabled","str","isYearDisabled","animateSlide","direction","canGoPrevMonth","prevMonth","prevYear","canGoNextMonth","nextMonth","nextYear","canGoPrevYearRange","canGoNextYearRange","canGoPrevDayYearRange","canGoNextDayYearRange","m","prevYearRange","s","nextYearRange","prevDayYearRange","nextDayYearRange","selectDate","selectMonth","selectYear","selectYearInDayMode","selectMonthInDayMode","displayValue","days","total","firstDay","prevTotal","cells","i","y","remaining","selectedMonth","p","Calendar","DayModeContent","MonthModeContent","onAnimationEnd","onClear","onSelectToday","Fragment","ChevronLeft","ChevronRight","_","isCurrent","isSelected","idx","w","cell","isToday","isDisabled","buildOptions","count","step","values","TimeColumn","selected","onSelect","item","TimeSelector","hour","minute","second","onHourChange","onMinuteChange","onSecondChange","precision","minuteStep","isHourDisabled","isMinuteDisabled","isSecondDisabled","rootRef","hours","minutes","seconds","frame","column","formatDate","date","formatDateTime","formatDisplayDateTime","parseDateTime","matched","getDateTimeTimestamp","timestamp","getParsedTimestamp","getCalendarCells","currentDays","previousMonth","previousYear","previousDays","index","day","PANEL_WIDTH","ESTIMATED_PANEL_HEIGHT","PANEL_GAP","CLOSE_ANIMATION_DURATION","DateTimePicker","minDateTime","defaultToNow","today","initialDate","initialYear","initialMonth","draftDate","setDraftDate","draftHour","setDraftHour","draftMinute","setDraftMinute","draftSecond","setDraftSecond","wrapperRef","panelRef","syncedValueRef","panelStyle","setPanelStyle","minDateText","minDateTimeValue","syncDraftFromValue","next","nextDate","updatePosition","panelHeight","_b","panelWidth","openPanel","closePanel","closePanelImmediate","handleDocumentMouseDown","changeMonth","offset","isTimeDisabled","confirm","draftTimestamp","selectToday","now","nextHour","nextMinute","nextSecond","Clock","weekday","dateDisabled","buildDataAttributes","attributes","Drawer","drawerId","overlayDataAttributes","panelDataAttributes","DEFAULT_CLOSE_DELAY_MS","OPEN_ANIMATION_DELAY_MS","DROPDOWN_OPEN_EVENT","DropdownMenu","trigger","menuClassName","align","closeDelayMs","menuMode","onOpenChange","menuId","phase","setPhase","menuStyle","setMenuStyle","closeTimerRef","openTimerRef","containerRef","menuRef","triggerElementRef","triggerOpen","clearCloseTimer","clearOpenTimer","openMenu","activeElement","closeMenuImmediately","closeMenu","toggleMenu","getMenuItems","handleMenuKeyDown","menuItems","currentIndex","nextIndex","updateMenuPosition","triggerRect","measuredMenuWidth","menuHeight","viewportHeight","viewportPadding","verticalGap","menuWidth","topPlacement","handleAnotherMenuOpen","openedMenuId","handleClickOutside","handleEscape","useLayoutEffect","formatBytes","getFileKey","file","acceptsFile","accept","fileName","fileType","rule","FileUpload","multiple","maxFiles","maxSize","validateFile","onReject","density","hint","showFileList","uploading","progress","inputAriaLabel","isDragOver","setIsDragOver","compact","effectiveMaxFiles","addFiles","incoming","existingKeys","accepted","rejections","customMessage","removeFile","normalizedProgress","LoaderCircle","UploadCloud","FileText","X","formFieldSizeTokens","FormField","required","error","labelClassName","contentClassName","errorClassName","errorId","invalid","fieldProps","inputSizeTokens","affixSizeTokens","baseControlClassName","getStateClassName","getAffixStateClassName","Input","prefix","suffix","inputClassName","dropdownTransformOrigin","horizontalAlign","DROPDOWN_CLOSE_ANIMATION_MS","selectSizeTokens","Select","options","searchable","multipleTriggerDisplay","multipleCountLabel","triggerClassName","radius","onBeforeOpen","searchPlaceholder","emptyText","filterOptions","loadingText","loading","searchValue","onSearchChange","renderTrigger","renderOption","optionClassName","isOpen","setIsOpen","isPreparingOpen","setIsPreparingOpen","setShouldDropUp","searchQuery","setSearchQuery","highlightedIndex","setHighlightedIndex","searchInputRef","effectiveSearchQuery","selectedValues","filteredOptions","q","opt","updateSearchQuery","nextShouldDropUp","availableWidth","triggerWidth","maxWidth","measuredWidth","openDropdown","handleSelect","optionValue","v","handleRemoveChip","handleClearAll","handleKeyDown","prev","findOption","val","o","renderSingleTrigger","selectedValue","renderMultiTrigger","renderSearchSection","Search","renderOptionNode","option","isHighlighted","state","renderEmptyState","renderFooter","ChevronDown","previousGroup","shouldRenderGroup","buildPaginationItems","currentPage","totalPages","items","start","end","page","Pagination","totalItems","onPageChange","itemLabel","hideOnSinglePage","pageSize","pageSizeOptions","onPageSizeChange","safeTotalPages","safeCurrentPage","normalizedPageSizeOptions","right","shouldShowPageSizeSelector","paginationItems","Radio","Circle","itemSizeClasses","SegmentedControl","fullWidth","active","Switch","Tabs","gridClassName","itemClassName","aside","styles","resolvedGridClassName","Icon","textareaSizeTokens","resizeTokens","Textarea","resize","TIME_PATTERN","parseTime","resolveInitialTime","getTimeInSeconds","TimePicker","minExclusiveTime","initialTime","draftTime","minimumTime","draftTimeInSeconds","draftDisabled","closeImmediate","close","handleOutside","selectNow","parsedValue","typeStyles","Timeline","onItemClick","maxItems","expandedItems","setExpandedItems","displayItems","toggleExpand","style","isExpanded","hasDetails","metaItem","DEFAULT_DURATION","TOAST_ROOT_ID","TONE_MAP","CheckCircle2","Info","AlertCircle","toastRoot","toastContainer","listeners","pendingItems","activeToastKeys","createToastId","getToastKey","notify","listener","ensureToastHost","existing","createRoot","ToastViewport","subscribe","setItems","timersRef","clearTimer","timer","startClose","startTimer","duration","timeoutId","pauseTimer","resumeTimer","removeToast","removed","timers","unsubscribe","ToastCard","onClose","onPause","onResume","tone","Toast","ARROW_SIZE","TOOLTIP_BG","OPPOSITE","getAvailableSpace","placement","viewport","fitsInDirection","tooltipSize","needed","buildArrowStyle","arrowOffset","border","borderColored","computePosition","actualPlacement","opposite","tw","th","triggerCenterX","triggerCenterY","x","overflow","arrowStyle","mergeRefs","refs","el","getOriginClass","Tooltip","content","showDelay","hideDelay","showArrow","positionStyle","setPositionStyle","setActualPlacement","setArrowStyle","tooltipRef","showTimerRef","hideTimerRef","animFrameRef","clearTimers","triggerEl","tooltipEl","result","show","hide","dismissOnScroll","handleResize","handlePointerEnter","handlePointerLeave","tooltipNode","cloneElement","withChildren","filterTreeNodes","nodes","keyword","getLabel","getChildren","normalizedKeyword","getNodeChildren","filteredChildren","findNodeByValue","getValue","findRelatedHierarchyValues","targetValue","relatedValues","collectDescendants","child","visit","currentNodes","ancestors","nodeValue","ancestor","getDefaultExpandedKeys","defaultExpandedDepth","depth","TreeSelect","lockedValues","onMultiChange","exclusiveHierarchySelection","expandSearchResults","isNodeSelectable","renderPrefix","lockedValueSet","isPositioned","setIsPositioned","expandedKeys","setExpandedKeys","searchKeyword","setSearchKeyword","shouldOpenUp","width","selectedNode","latestSelectedValuesRef","selectedNodes","visibleNodes","shouldExpandSearchResults","handleOutsideClick","current","renderNode","hasChildren","selectable","expandableOnly","ExpandChevronDown","currentValues","exists","nextValues","nextNodes"],"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,GAAA,WAAmBP,GACnBO,GAAA,MAAcN,GACdM,GAAA,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,EAAuBD,CAAa,MAChCC,EAAuBD,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,KAAO,OAAO,KAAKpD,CAAM,EAAE,OAAO,SAAUqD,IAAG;AACjD,iBAAiBA,OAAV;AAAA,QACjB,CAAS;AACD,QAAAL,IACE,IAAII,GAAK,SACL,oBAAoBA,GAAK,KAAK,SAAS,IAAI,WAC3C,kBACNE,GAAsBL,IAAWD,CAAgB,MAC7CI,KACA,IAAIA,GAAK,SAAS,MAAMA,GAAK,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,KAAYH;AACnB,UAAUG,MAAV,UAAuBF,EAASE,CAAQ,IAAIH,EAAOG,CAAQ;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,IACV/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;AACIF,IAAAA,IAAQ;AAAA,MACN,0BAA0B,SAAUG,GAAmB;AACrD,eAAOA,EAAiB;AAAA,MAChC;AAAA;AAEI,QAAIvB,GACAG,IAAyB,CAAA,GACzBqB,IAAyBJ,EAAM,yBAAyB;AAAA,MAC1DA;AAAAA,MACA5B;AAAA,IACN,EAAK,GACGiC,KAAwBH,EAAWnC,EAAYK,CAAY,CAAC,GAC5DwB,KAAwB,CAAA;AAC5B,IAAAU,GAAA,WAAmBnE,GACnBmE,GAAA,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,GAAA,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;;;ACLZ,MAAMC,IAAK,IAAIC,MACpBA,EAAQ,OAAO,OAAO,EAAE,KAAK,GAAG,GCCrBC,KAAe;AAAA,EAE1B,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAGR,GAgBaC,KAAmB;AAAA,EAC9B,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEaC,KAAuB;AAAA,EAClC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEaC,KAAsB;AAAA,EACjC,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,aAAa;AACf,GAKMC,KACJ,+OAEWC,KAAsB,CAAC;AAAA,EAClC,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA,EACX,WAAAC;AACF,MAMEX;AAAA,EACEM;AAAA,EACAJ,GAAa;AAAA,EACbG,GAAoBG,CAAO;AAAA,EAC3BE,IAAWN,GAAqBK,CAAI,IAAIN,GAAiBM,CAAI;AAAA,EAC7DE;AACF;AAGQJ,GAAoB,EAAE,SAAS,SAAS,MAAM,MAAM,UAAU,IAAM,GACpEA,GAAoB,EAAE,SAAS,SAAS,MAAM,MAAM,UAAU,IAAM,GACjEA,GAAoB,EAAE,SAAS,WAAW,MAAM,MAAM,GACtDA,GAAoB,EAAE,SAAS,WAAW,MAAM,MAAM,GACvDA,GAAoB,EAAE,SAAS,aAAa,MAAM,MAAM,GACxDA,GAAoB,EAAE,SAAS,eAAe,MAAM,MAAM;AA0B/D,MAAMK,KAAuB;AAAA,EAClC,SAAS;AAAA,IACP,WAAW;AAAA,IACX,MACE;AAAA,IACF,QACE;AAAA,IACF,UACE;AAAA,IACF,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,WACE;AAAA,IACF,aAAa;AAAA,IACb,eAAe;AAAA,EAAA;AAAA,EAEjB,MAAM;AAAA,IACJ,WACE;AAAA,IACF,MACE;AAAA,IACF,QACE;AAAA,IACF,UACE;AAAA,IACF,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,WACE;AAAA,IACF,aAAa;AAAA,IACb,eAAe;AAAA,EAAA;AAAA,EAEjB,MAAM;AAAA,IACJ,WACE;AAAA,IACF,MACE;AAAA,IACF,QACE;AAAA,IACF,UACE;AAAA,IACF,UACE;AAAA,IACF,YACE;AAAA,IACF,cACE;AAAA,IACF,WACE;AAAA,IACF,aACE;AAAA,IACF,eACE;AAAA,EAAA;AAEN,GC7IMC,KAA0C;AAAA,EAC9C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,KAAwC;AAAA,EAC5C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,KAAc,CAACzD,MAAiB;AACpC,QAAM0D,IAAQ1D,EAAK,KAAA,EAAO,MAAM,KAAK,EAAE,OAAO,OAAO;AACrD,SAAI0D,EAAM,WAAW,IAAU,KAC3BA,EAAM,WAAW,IAAUA,EAAM,CAAC,EAAG,MAAM,GAAG,CAAC,EAAE,YAAA,IAC9C,GAAGA,EAAM,CAAC,EAAG,CAAC,CAAC,GAAGA,EAAM,GAAG,EAAE,EAAG,CAAC,CAAC,GAAG,YAAA;AAC9C,GAEaC,KAAS3B,GAAM;AAAA,EAC1B,CACE;AAAA,IACE,KAAA4B;AAAA,IACA,KAAAC;AAAA,IACA,MAAA7D;AAAA,IACA,UAAA8D;AAAA,IACA,MAAAX,IAAO;AAAA,IACP,OAAAY,IAAQ;AAAA,IACR,YAAAC;AAAA,IACA,WAAAX;AAAA,IACA,MAAAY,IAAO;AAAA,IACP,cAAcC;AAAA,IACd,GAAGzD;AAAA,EAAA,GAEL0D,MACG;AACH,UAAM,CAACC,GAAWC,CAAY,IAAIC,EAAwB,IAAI,GACxDC,IAAY,GAAQX,KAAOQ,MAAcR,IACzC;AAAA,MACJ,WAAWY;AAAA,MACX,SAASC;AAAA,MACT,GAAGC;AAAA,IAAA,IACDV,KAAc,CAAA,GACZW,IAAW3E,IAAOyD,GAAYzD,CAAI,IAAI;AAE5C,WACE4E,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAT;AAAA,QACA,MAAAF;AAAA,QACA,cAAYC,KAAaL,KAAO7D,KAAQ;AAAA,QACxC,WAAW0C;AAAA,UACT;AAAA,UACAa,GAAYJ,CAAI;AAAA,UAChBY,MAAU,WAAW,iBAAiBnB,GAAa;AAAA,UACnDS;AAAA,QAAA;AAAA,QAED,GAAG5C;AAAA,QAEH,UAAA8D,IACCK,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACE,GAAGF;AAAA,YACJ,KAAAd;AAAA,YACA,KAAI;AAAA,YACJ,eAAY;AAAA,YACZ,WAAW;AAAA,YACX,WAAWlB,EAAG,8BAA8B8B,CAAc;AAAA,YAC1D,SAAS,CAACK,MAAU;AAClB,cAAAR,EAAaT,KAAO,IAAI,GACxBa,KAAA,QAAAA,EAAeI;AAAA,YACjB;AAAA,UAAA;AAAA,QAAA,IAGFf,MACCa,KAAYC,gBAAAA,EAAAA,IAACE,IAAA,EAAK,MAAMtB,GAAUL,CAAI,GAAG,eAAY,OAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAIrE;AACF;AAEAQ,GAAO,cAAc;ACpFrB,MAAMJ,KAAyC;AAAA,EAC7C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMwB,KAA2C;AAAA,EAC/C,MAAM;AAAA,EACN,QAAQ;AACV;AAEO,SAASC,GAAM;AAAA,EACpB,UAAAzD;AAAA,EACA,SAAA2B,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,OAAAY,IAAQ;AAAA,EACR,WAAAV;AACF,GAAe;AACb,SACEuB,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWlC;AAAA,QACT;AAAA,QACAa,GAAYJ,CAAI;AAAA,QAChB4B,GAAahB,CAAK;AAAA,QAClBb,MAAY,aAAa;AAAA,QACzBG;AAAA,MAAA;AAAA,MAGD,UAAA9B;AAAA,IAAA;AAAA,EAAA;AAGP;ACpCO,MAAM0D,KAAgC,CAAC;AAAA,EAC5C,UAAA1D;AAAA,EACA,SAAA2B,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,MAAA+B;AAAA,EACA,UAAA9B,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,GAAG5C;AACL,MAEI0E,gBAAAA,EAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWlC,GAAoB,EAAE,SAAAC,GAAS,MAAAC,GAAM,UAAAC,GAAU,WAAAC,GAAW;AAAA,IACpE,GAAG5C;AAAA,IAEH,UAAA;AAAA,MAAAyE,KAAQN,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,YAAY,UAAAM,GAAK;AAAA,MACzC,CAAC9B,KAAY7B;AAAA,IAAA;AAAA,EAAA;AAAA,GCTP6D,KAAoC,CAAC;AAAA,EAChD,MAAAjC,IAAO;AAAA,EACP,SAAAkC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,UAAAC,IAAW;AAAA,EACX,eAAAC,IAAgB;AAAA,EAChB,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAtC;AAAA,EACA,IAAAuC;AAAA,EACA,GAAGnF;AACL,MAAM;AACJ,QAAMoF,IAAWC,GAAyB,IAAI,GACxCC,IAAcC,GAAA,GACdC,IAAUL,KAAMG,GAChBG,IAAU,GAAGD,CAAO,UACpBE,IAAgB,GAAGF,CAAO,gBAC1BG,IAAe,OAAOf,KAAY,WAClC,CAACgB,GAAiBC,CAAkB,IAAIhC,EAASgB,CAAc,GAC/DiB,IAAiBH,IAAef,IAAUgB,GAC1CG,IAAUrD,MAAS,MACnBsD,IAAiB,EAAQf,GACzBgB,IAAoBjG,EAAM,YAAY;AAE5C,EAAAkG,EAAU,MAAM;AACd,IAAId,EAAS,YACXA,EAAS,QAAQ,gBAAgBL;AAAA,EAErC,GAAG,CAACA,GAAee,CAAc,CAAC;AAElC,QAAMK,IAAe,CAAC/B,MAA+C;AACnE,QAAIU,EAAU;AACd,UAAMsB,IAAchC,EAAM,OAAO;AACjC,IAAKuB,KACHE,EAAmBO,CAAW,GAEhClB,KAAA,QAAAA,EAAWkB;AAAA,EACb,GAEMC,IAAmBtB,KAAiBe;AAE1C,SACEpB,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAASc;AAAA,MACT,WAAWvD;AAAA,QACT;AAAA,QACA+D,IAAiB,gBAAgB;AAAA,QACjCD,KAAW;AAAA,QACXjB,IAAW,kCAAkC;AAAA,QAC7ClC;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA8B,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWzC;AAAA,cACT;AAAA,cACA+D,KAAkB;AAAA,cAClBD,IAAU,YAAY;AAAA,YAAA;AAAA,YAGxB,UAAA;AAAA,cAAA5B,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACE,GAAGnE;AAAA,kBACJ,KAAKoF;AAAA,kBACL,IAAII;AAAA,kBACJ,MAAK;AAAA,kBACL,SAASM;AAAA,kBACT,UAAAhB;AAAA,kBACA,mBAAiB,CAACmB,KAAqBjB,IAAQS,IAAU;AAAA,kBACzD,oBAAkBR,IAAcS,IAAgB;AAAA,kBAChD,cAAYO,MAAsB,OAAOjB,KAAU,WAAWA,IAAQ;AAAA,kBACtE,gBAAcD,IAAgB,UAAUe;AAAA,kBACxC,WAAU;AAAA,kBACV,UAAUK;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEZhC,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,WAAWlC;AAAA,oBACT;AAAA,oBACA8D,IAAU,0BAA0B;AAAA,oBACpCM,IACI,+JACA;AAAA,oBACJ,CAACvB,KAAY;AAAA,oBACb,CAACA,KAAY,CAACuB,KAAoB;AAAA,kBAAA;AAAA,kBAGnC,cACClC,gBAAAA,EAAAA,IAACmC,IAAA,EAAM,MAAMP,IAAU,KAAK,IAAI,aAAa,EAAA,CAAG,0BAE/CQ,IAAA,EAAM,MAAMR,IAAU,KAAK,IAAI,aAAa,EAAA,CAAG;AAAA,gBAAA;AAAA,cAAA;AAAA,YAEpD;AAAA,UAAA;AAAA,QAAA;AAAA,SAEAf,KAASC,MACTP,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,WACb,UAAA;AAAA,UAAAM,IACCb,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAIsB;AAAA,cACJ,WAAWxD;AAAA,gBACT;AAAA,gBACAoE,IAAmB,mCAAmC;AAAA,gBAC5C;AAAA,cAA0B;AAAA,cAGrC,UAAArB;AAAA,YAAA;AAAA,UAAA,IAED;AAAA,UACHC,IACCd,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAIuB;AAAA,cACJ,WAAWzD;AAAA,gBACT;AAAA,gBACA8D,IAAU,4BAA4B;AAAA,cAAA;AAAA,cAGvC,UAAAd;AAAA,YAAA;AAAA,UAAA,IAED;AAAA,QAAA,EAAA,CACN;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR,GC3HMuB,KACJ,wLAEWC,KAA8B,CAAC;AAAA,EAC1C,MAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAA9F;AAAA,EACA,SAAA+F;AAAA,EACA,WAAAC;AAAA,EACA,kBAAAC,IAAmB;AAAA,EACnB,gBAAAC,IAAiB;AAAA,EACjB,qBAAAC,IAAsB;AACxB,MAAM;AACJ,QAAM,CAACC,GAASC,CAAU,IAAItD,EAAS6C,CAAI,GACrC,CAACU,GAASC,CAAU,IAAIxD,EAAS,EAAK,GACtC,CAACyD,GAAgBC,CAAiB,IAAI1D,EAA0B/C,CAAQ,GACxE0G,IAAYJ,KAAYF,KAAW,CAACR;AAE1C,EAAAR,EAAU,MAAM;AACd,IAAIQ,KACFS,EAAW,EAAI,GACfE,EAAW,EAAK,GAChBE,EAAkBzG,CAAQ,KACjBoG,KACTG,EAAW,EAAI;AAAA,EAEnB,GAAG,CAACvG,GAAUoG,GAASR,CAAI,CAAC,GAE5BR,EAAU,MAAM;AACd,IAAIQ,KAAQ5F,KAAY,QACtByG,EAAkBzG,CAAQ;AAAA,EAE9B,GAAG,CAACA,GAAU4F,CAAI,CAAC;AAEnB,QAAMe,IAAqBC;AAAA,IACzB,CAACtD,MAAgD;AAC/C,MAAIA,EAAM,WAAWA,EAAM,iBAAiB,CAACgD,MAE7CD,EAAW,EAAK,GAChBE,EAAW,EAAK,GAChBE,EAAkB,IAAI,GACtBX,KAAA,QAAAA;AAAA,IACF;AAAA,IACA,CAACQ,GAASR,CAAQ;AAAA,EAAA;AAGpB,MAAI,CAACM,KAAW,OAAO,WAAa,IAAa,QAAO;AAExD,QAAMS,IAAkBH,IAAYF,IAAiBxG;AAErD,SAAO8G;AAAA,IACLzD,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,sBAAoB2C,KAAaD;AAAA,QACjC,qBAAiB;AAAA,QACjB,WAAW,GAAGL,EAAoB,IAAIgB,IAAY,yDAAyD,6CAA6C,IAAIT,CAAgB,GAAG,KAAA;AAAA,QAC/K,SAASE,IAAsBN,IAAiB;AAAA,QAChD,gBAAgBc;AAAA,QAEhB,UAAAtD,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,cAAY0C;AAAA,YACZ,qBAAiB;AAAA,YACjB,WAAW,0CAA0CW,IAAY,qDAAqD,yCAAyC,IAAIR,CAAc,GAAG,KAAA;AAAA,YACpL,SAAS,CAAC5C,MAAUA,EAAM,gBAAA;AAAA,YAEzB,UAAAuD;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,EAAA;AAEb,GChEaE,KAA8C,CAAC;AAAA,EAC1D,MAAAnB;AAAA,EACA,OAAAoB;AAAA,EACA,SAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,gBAAAC,IAAiB;AAAA,EACjB,YAAAC,IAAa;AAAA,EACb,iBAAAC,IAAkB;AAAA,EAClB,gBAAAC,IAAiB;AAAA,EACjB,gBAAAC,IAAiB;AAAA,EACjB,qBAAApB,IAAsB;AAAA,EACtB,WAAAqB;AAAA,EACA,UAAAC;AACF,MAEIpE,gBAAAA,EAAAA;AAAAA,EAACsC;AAAA,EAAA;AAAA,IACC,MAAAC;AAAA,IACA,gBAAgB6B;AAAA,IAChB,SAAQ;AAAA,IACR,WAAU;AAAA,IACV,qBAAAtB;AAAA,IACA,gBAAe;AAAA,IAEf,UAAAvC,gBAAAA,EAAAA,KAAC,OAAA,EAAI,MAAK,UAAS,cAAYoD,GAC7B,UAAA;AAAA,MAAA3D,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,4DAA4D,UAAA2D,GAAM;AAAA,MACjF3D,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,uEACZ,UAAA4D,GACH;AAAA,MACArD,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,6FACb,UAAA;AAAA,QAAAP,gBAAAA,EAAAA;AAAAA,UAACK;AAAA,UAAA;AAAA,YACC,UAAU6D;AAAA,YACV,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAASE;AAAA,YAER,UAAAL;AAAA,UAAA;AAAA,QAAA;AAAA,QAEHxD,gBAAAA,EAAAA;AAAAA,UAACF;AAAA,UAAA;AAAA,YACC,aAAW4D;AAAA,YACX,UAAUD,KAAmBC;AAAA,YAC7B,MAAK;AAAA,YACL,SAASH;AAAA,YACT,SAASK;AAAA,YAER,UAAA;AAAA,cAAAF,2BACEI,IAAA,EAAQ,eAAY,QAAO,WAAU,gBAAe,MAAM,IAAI;AAAA,cAEhER;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACH,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA;AAAA,GCvBAS,KAAW,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAC7CC,KAAS;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACMC,KAAiB,IACjBC,KAAgC,GAChCC,KAAgC,GAChCC,KAAiB,KACjBC,KAA2B,GAI3BC,KAAM,CAACC,MAAc,OAAOA,CAAC,EAAE,SAAS,GAAG,GAAG,GAE9CC,KAAiB,CAACC,GAAcC,MACpC,IAAI,KAAKD,GAAMC,IAAQ,GAAG,CAAC,EAAE,QAAA,GACzBC,KAAoB,CAACF,GAAcC,MACvC,IAAI,KAAKD,GAAMC,GAAO,CAAC,EAAE,OAAA,GAGdE,KAAc,CACzBrK,GACAsK,GACAC,MACW;AACX,MAAI,CAACvK,EAAO,QAAO;AACnB,QAAMgE,IAAQhE,EAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AACzC,SAAKuK,IAOEA,EACJ,QAAQ,QAAQ,OAAOvG,EAAM,CAAC,CAAC,CAAC,EAChC,QAAQ,MAAM,OAAOA,EAAM,CAAC,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,EAC/C,QAAQ,KAAK,OAAOA,EAAM,CAAC,CAAC,CAAC,EAC7B,QAAQ,MAAMA,EAAM,CAAC,IAAI,OAAOA,EAAM,CAAC,CAAC,EAAE,SAAS,GAAG,GAAG,IAAI,EAAE,EAC/D,QAAQ,KAAKA,EAAM,CAAC,IAAI,OAAOA,EAAM,CAAC,CAAC,IAAI,EAAE,IAX1CsG,MAAS,eACJ,GAAGtG,EAAM,CAAC,CAAC,IAAIA,EAAM,CAAC,CAAC,MAEzB,GAAGA,EAAM,CAAC,CAAC,IAAIA,EAAM,CAAC,CAAC,IAAIA,EAAM,CAAC,CAAC;AAS9C,GAGMwG,KAAY,CAACxK,MAAkB;AACnC,MAAI,CAACA,EAAO,QAAO;AACnB,QAAMgE,IAAQhE,EAAM,MAAM,GAAG,EAAE,IAAI,MAAM,GACnCkK,IAAOlG,EAAM,CAAC,GACdmG,IAAQnG,EAAM,CAAC;AACrB,SAAIkG,MAAS,UAAaC,MAAU,SAAkB,OAC/C;AAAA,IACL,MAAAD;AAAA,IACA,OAAOC,IAAQ;AAAA,IACf,KAAKnG,EAAM,CAAC,KAAK;AAAA,EAAA;AAErB,GAGMyG,KAAiB,CAACC,GAAWC,MAC7BD,IAAIC,IAAU,KACdD,IAAIC,IAAU,IACX,GAGHC,KAAmB,CAACV,MACxB,KAAK,MAAMA,IAAOR,EAAc,IAAIA,IAIhCmB,KAAa;AAAA,EACjB,IAAI;AAAA,IACF,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,EAAA;AAAA,EAER,IAAI;AAAA,IACF,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,EAAA;AAAA,EAER,IAAI;AAAA,IACF,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,EAAA;AAEV,GAMaC,KAAwC,CAAC;AAAA,EACpD,OAAA9K;AAAA,EACA,UAAAiG;AAAA,EACA,aAAA8E,IAAc;AAAA,EACd,kBAAAC;AAAA,EACA,WAAArH;AAAA,EACA,MAAA2G,IAAO;AAAA,EACP,MAAA7G,IAAO;AAAA,EACP,UAAAoC,IAAW;AAAA,EACX,WAAAoF,IAAY;AAAA,EACZ,WAAAC,IAAY;AAAA,EACZ,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AACF,MAAM;AACJ,QAAM,CAAC5D,GAAM6D,CAAO,IAAI1G,EAAS,EAAK,GAChC,CAAC2G,GAAgBC,CAAiB,IAAI5G,EAAS,EAAK,GACpDH,IAAM2B,GAAuB,IAAI,GACjCqF,IAAkBrF,GAAsC,IAAI,GAC5DsF,IAASb,GAAWpH,CAAI,GAGxB,CAACkI,GAAgBC,CAAiB,IAAIhH;AAAA,IAC1C;AAAA,EAAA,GAEI,CAACiH,GAAaC,CAAc,IAAIlH,EAAS,EAAK,GAG9C,CAACmH,GAAgBC,CAAiB,IAAIpH,EAAS,EAAK,GACpD,CAACqH,GAAiBC,CAAkB,IAAItH,EAAS,CAAC,GAGlD,CAACuH,GAASC,CAAU,IAAIxH,EAAmC,KAAK,GAChE,CAACyH,GAAoBC,CAAqB,IAAI1H,EAAS,CAAC,GAGxD,CAAC2H,GAAeC,CAAgB,IAAI5H,EAA8B;AAAA,IACtE,UAAU;AAAA,IACV,QAAQ;AAAA,EAAA,CACT,GACK,CAAC6H,GAAeC,EAAgB,IAAI9H,EAAwB,MAAM,GAClE+H,KAAavG,GAA0B,IAAI,GAC3CwG,IAAYxG,GAAuB,IAAI,GAEvCyG,IAAyBpE,EAAY,MAAM;;AAC/C,QAAI,CAACkE,GAAW,QAAS;AACzB,UAAMG,IAAOH,GAAW,QAAQ,sBAAA,GAC1BI,KAAgB,OAAO,YACvBC,KAAgB,KAAK;AAAA,MACzBnD;AAAA,MACA,KAAK,IAAI,GAAGkD,KAAgBjD,KAA2B,CAAC;AAAA,IAAA,GAEpDmD,KAA0B3C,MAAS,mBAAmB,MAAM,KAC5D4C,OACJC,KAAAP,EAAU,YAAV,gBAAAO,GAAmB,iBAAgBF,IAC/BG,KAAM,GAENC,KADa,OAAO,cAAcP,EAAK,SACXI,IAC5BI,KAAMD,KACR,KAAK,IAAIvD,IAA0BgD,EAAK,MAAMI,KAAiBE,EAAG,IAClEN,EAAK,SAASM,IACZG,KACJT,EAAK,OAAOE,KAAgBD,KAAgBjD,KACxCgD,EAAK,QAAQE,KACbF,EAAK,MACLU,KAAU,KAAK;AAAA,MACnB1D;AAAA,MACAiD,KAAgBC,KAAgBlD;AAAA,IAAA,GAE5B2D,KAAO,KAAK;AAAA,MAChB,KAAK,IAAI3D,IAA0ByD,EAAa;AAAA,MAChDC;AAAA,IAAA;AAEF,IAAAd,GAAiBW,KAAe,OAAO,MAAM,GAC7Cb,EAAiB;AAAA,MACf,UAAU;AAAA,MACV,MAAAiB;AAAA,MACA,KAAAH;AAAA,MACA,OAAON;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AAAA,EACH,GAAG,CAAC1C,CAAI,CAAC,GAGHoD,IAASC,GAAQ,MAAMnD,GAAUxK,CAAK,GAAG,CAACA,CAAK,CAAC,GAGhD4N,IAAYD,GAAQ,MAAM;AAC9B,UAAME,wBAAQ,KAAA;AACd,WAAO,EAAE,MAAMA,EAAE,YAAA,GAAe,OAAOA,EAAE,YAAY,KAAKA,EAAE,QAAA,EAAQ;AAAA,EACtE,GAAG,CAAA,CAAE,GAECC,KAAWH,GAAQ,MAChB,GAAGC,EAAU,IAAI,IAAI7D,GAAI6D,EAAU,QAAQ,CAAC,CAAC,IAAI7D,GAAI6D,EAAU,GAAG,CAAC,IACzE,CAACA,CAAS,CAAC,GAERG,KAAuBJ;AAAA,IAC3B,MAAM/C,GAAiBgD,EAAU,IAAI;AAAA,IACrC,CAACA,EAAU,IAAI;AAAA,EAAA,GAEXI,IAA0BL;AAAA,IAC9B,MAAMI,KAAuBrE,KAAiBC;AAAA,IAC9C,CAACoE,EAAoB;AAAA,EAAA,GAEjBE,KAA0BN;AAAA,IAC9B,MAAMI,KAAuBrE,KAAiBE;AAAA,IAC9C,CAACmE,EAAoB;AAAA,EAAA,GAGjBG,IAA2BP,GAAQ,MAClCvC,IACE,KAAK;AAAA,IACV4C;AAAA,IACApD,GAAiB,OAAOQ,EAAQ,UAAU,GAAG,CAAC,CAAC,CAAC;AAAA,EAAA,IAH7B4C,GAKpB,CAACA,GAAyB5C,CAAO,CAAC,GAE/B+C,KAA2BR,GAAQ,MAClCtC,IACE,KAAK;AAAA,IACV4C;AAAA,IACArD,GAAiB,OAAOS,EAAQ,UAAU,GAAG,CAAC,CAAC,CAAC;AAAA,EAAA,IAH7B4C,IAKpB,CAACA,IAAyB5C,CAAO,CAAC,GAG/B,CAAC+C,IAAUC,EAAW,IAAIzJ,GAAS8I,KAAA,gBAAAA,EAAQ,SAAQE,EAAU,IAAI,GACjE,CAACU,IAAWC,EAAY,IAAI3J,GAAS8I,KAAA,gBAAAA,EAAQ,UAASE,EAAU,KAAK;AAG3E,EAAA3G,EAAU,MAAM;AACd,IAAIyG,MACFW,GAAYX,EAAO,IAAI,GACvBa,GAAab,EAAO,KAAK;AAAA,EAE7B,GAAG,CAACA,CAAM,CAAC;AAGX,QAAMc,KAAgB/F,EAAY,MAAM;AACtC,IAAIgD,EAAgB,WAAS,aAAaA,EAAgB,OAAO,GACjED,EAAkB,EAAI,GACtBC,EAAgB,UAAU,WAAW,MAAM;AACzC,MAAAH,EAAQ,EAAK,GACbE,EAAkB,EAAK;AAAA,IACzB,GAAG,GAAG;AAAA,EACR,GAAG,CAAA,CAAE,GAGCiD,KAAyBhG,EAAY,MAAM;AAC/C,IAAIgD,EAAgB,WAAS,aAAaA,EAAgB,OAAO,GACjEH,EAAQ,EAAK,GACbE,EAAkB,EAAK;AAAA,EACzB,GAAG,CAAA,CAAE;AAGL,EAAAvE,EAAU,MAAM;AACd,QAAIQ,GAAM;AACR,MAAA2E,EAAW,KAAK,GAChBJ,EAAkB,EAAK,GACnB0B,KACFW,GAAYX,EAAO,IAAI,GACvBa,GAAab,EAAO,KAAK,MAEzBW,GAAYT,EAAU,IAAI,GAC1BW,GAAaX,EAAU,KAAK;AAE9B,YAAMc,IAAuB9D;AAAA,SAC3B8C,KAAA,gBAAAA,EAAQ,SAAQE,EAAU;AAAA,MAAA;AAE5B,MAAAtB,EAAsBoC,CAAoB,GAC1CxC,EAAmBwC,CAAoB,GACvC7B,EAAA;AAAA,IACF;AAAA,EACF,GAAG,CAACpF,CAAI,CAAC,GAGTR,EAAU,MAAM;AACd,QAAKQ;AACL,aAAAoF,EAAA,GACA,OAAO,iBAAiB,UAAUA,GAAwB,EAAI,GAC9D,OAAO,iBAAiB,UAAUA,CAAsB,GACjD,MAAM;AACX,eAAO,oBAAoB,UAAUA,GAAwB,EAAI,GACjE,OAAO,oBAAoB,UAAUA,CAAsB;AAAA,MAC7D;AAAA,EACF,GAAG,CAACpF,GAAMoF,CAAsB,CAAC,GAEjC5F,EAAU,MAAM;AACd,QAAI,CAACQ,EAAM;AAEX,UAAMkH,IAAU,OAAO,sBAAsB,MAAM;AACjD,MAAA9B,EAAA;AAAA,IACF,CAAC;AAED,QAAI,CAACD,EAAU,WAAW,OAAO,iBAAmB;AAClD,aAAO,MAAM;AACX,eAAO,qBAAqB+B,CAAO;AAAA,MACrC;AAGF,UAAMC,KAAW,IAAI,eAAe,MAAM;AACxC,MAAA/B,EAAA;AAAA,IACF,CAAC;AACD,WAAA+B,GAAS,QAAQhC,EAAU,OAAO,GAE3B,MAAM;AACX,aAAO,qBAAqB+B,CAAO,GACnCC,GAAS,WAAA;AAAA,IACX;AAAA,EACF,GAAG,CAACnH,GAAMoF,GAAwBV,GAASJ,CAAc,CAAC,GAG1D9E,EAAU,MACD,MAAM;AACX,IAAIwE,EAAgB,WAAS,aAAaA,EAAgB,OAAO;AAAA,EACnE,GACC,CAAA,CAAE,GAGLxE,EAAU,MAAM;AACd,QAAI,CAACQ,EAAM;AACX,UAAMoH,IAAU,CAACC,OAAkB;;AACjC,YAAMC,KAASD,GAAE;AAEjB,WAAI3B,KAAA1I,EAAI,YAAJ,QAAA0I,GAAa,SAAS4B,IAAS;AACnC,YAAMC,KAAS,SAAS,cAAc,2BAA2B;AACjE,MAAIA,MAAA,QAAAA,GAAQ,SAASD,OACrBP,GAAA;AAAA,IACF;AACA,oBAAS,iBAAiB,aAAaK,CAAO,GACvC,MAAM,SAAS,oBAAoB,aAAaA,CAAO;AAAA,EAChE,GAAG,CAACpH,GAAM+G,EAAa,CAAC;AAIxB,QAAMS,IAAiBxG;AAAA,IACrB,CAACyG,MAAoB;AACnB,UAAI,CAAC9D,KAAW,CAACC,EAAS,QAAO;AACjC,YAAMwC,KAAIqB,EAAQ,SAAS,IAAIA,IAAUA,IAAU,OAC7CC,KAAM/D,IACRA,EAAQ,WAAW,IACjBA,IAAU,QACVA,IACF,MACEgE,KAAM/D,IACRA,EAAQ,WAAW,IACjBA,IAAU,QACVA,IACF;AAEJ,aADI,GAAA8D,MAAOtB,KAAIsB,MACXC,MAAOvB,KAAIuB;AAAA,IAEjB;AAAA,IACA,CAAChE,GAASC,CAAO;AAAA,EAAA,GAGbgE,KAAkB5G;AAAA,IACtB,CAACyB,GAAcC,OAAkB;AAC/B,YAAMmF,KAAM,GAAGpF,CAAI,IAAIH,GAAII,KAAQ,CAAC,CAAC;AAErC,aADI,GAAAiB,KAAWkE,KAAMlE,EAAQ,UAAU,GAAG,CAAC,KACvCC,KAAWiE,KAAMjE,EAAQ,UAAU,GAAG,CAAC;AAAA,IAE7C;AAAA,IACA,CAACD,GAASC,CAAO;AAAA,EAAA,GAGbkE,IAAiB9G;AAAA,IACrB,CAACyB,MACK,GAAAkB,KAAWlB,IAAO,OAAOkB,EAAQ,UAAU,GAAG,CAAC,CAAC,KAChDC,KAAWnB,IAAO,OAAOmB,EAAQ,UAAU,GAAG,CAAC,CAAC;AAAA,IAGtD,CAACD,GAASC,CAAO;AAAA,EAAA,GAKbmE,IAAe/G,EAAY,CAACgH,MAAgC;AAChE,IAAA7D,EAAkB6D,CAAS,GAC3B3D,EAAe,EAAI;AAAA,EACrB,GAAG,CAAA,CAAE,GAECtD,IAAqBC,EAAY,MAAM;AAC3C,IAAAmD,EAAkB,IAAI,GACtBE,EAAe,EAAK;AAAA,EACtB,GAAG,CAAA,CAAE,GAEC4D,KAAiB/B,GAAQ,MAAM;AACnC,QAAI,CAACvC,EAAS,QAAO;AACrB,UAAMuE,IAAYrB,OAAc,IAAI,KAAKA,KAAY,GAC/CsB,KAAWtB,OAAc,IAAIF,KAAW,IAAIA;AAClD,WACE,CAACiB,GAAgBO,IAAUD,CAAS,KACpClF;AAAA,MACE,GAAGmF,EAAQ,IAAI7F,GAAI4F,IAAY,CAAC,CAAC;AAAA,MACjCvE,EAAQ,UAAU,GAAG,CAAC;AAAA,IAAA,KACnB;AAAA,EAET,GAAG,CAACgD,IAAUE,IAAWlD,GAASiE,EAAe,CAAC,GAE5CQ,KAAiBlC,GAAQ,MAAM;AACnC,QAAI,CAACtC,EAAS,QAAO;AACrB,UAAMyE,IAAYxB,OAAc,KAAK,IAAIA,KAAY,GAC/CyB,KAAWzB,OAAc,KAAKF,KAAW,IAAIA;AACnD,WACE,CAACiB,GAAgBU,IAAUD,CAAS,KACpCrF;AAAA,MACE,GAAGsF,EAAQ,IAAIhG,GAAI+F,IAAY,CAAC,CAAC;AAAA,MACjCzE,EAAQ,UAAU,GAAG,CAAC;AAAA,IAAA,KACnB;AAAA,EAET,GAAG,CAAC+C,IAAUE,IAAWjD,GAASgE,EAAe,CAAC,GAE5CW,KAAqB/D,IAAkBiC,GACvC+B,KAAqBhE,IAAkBkC,IACvC+B,KAAwB7D,IAAqB6B,GAC7CiC,IAAwB9D,IAAqB8B,IAG7CwB,IAAYlH,EAAY,MAAM;AAClC,IAAIoD,MACAyC,OAAc,KAChBC,GAAa,EAAE,GACfF,GAAY,CAAC,MAAM,IAAI,CAAC,KAExBE,GAAa,CAAC6B,MAAMA,IAAI,CAAC,GAE3BZ,EAAa,OAAO;AAAA,EACtB,GAAG,CAAClB,IAAWzC,GAAa2D,CAAY,CAAC,GAEnCM,IAAYrH,EAAY,MAAM;AAClC,IAAIoD,MACAyC,OAAc,MAChBC,GAAa,CAAC,GACdF,GAAY,CAAC,MAAM,IAAI,CAAC,KAExBE,GAAa,CAAC6B,MAAMA,IAAI,CAAC,GAE3BZ,EAAa,MAAM;AAAA,EACrB,GAAG,CAAClB,IAAWzC,GAAa2D,CAAY,CAAC,GAGnCI,KAAWnH,EAAY,MAAM;AACjC,IAAA4F,GAAY,CAAC,MAAM,IAAI,CAAC,GACxBmB,EAAa,OAAO;AAAA,EACtB,GAAG,CAACA,CAAY,CAAC,GAEXO,KAAWtH,EAAY,MAAM;AACjC,IAAA4F,GAAY,CAAC,MAAM,IAAI,CAAC,GACxBmB,EAAa,MAAM;AAAA,EACrB,GAAG,CAACA,CAAY,CAAC,GAEXa,KAAgB5H,EAAY,MAAM;AACtC,IAAAyD;AAAA,MAAmB,CAACoE,MAClB,KAAK,IAAIpC,GAA0BoC,IAAI5G,EAAc;AAAA,IAAA;AAAA,EAEzD,GAAG,CAACwE,CAAwB,CAAC,GAEvBqC,KAAgB9H,EAAY,MAAM;AACtC,IAAAyD;AAAA,MAAmB,CAACoE,MAClB,KAAK,IAAInC,IAA0BmC,IAAI5G,EAAc;AAAA,IAAA;AAAA,EAEzD,GAAG,CAACyE,EAAwB,CAAC,GAEvBqC,KAAmB/H,EAAY,MAAM;AACzC,IAAA6D;AAAA,MAAsB,CAACgE,MACrB,KAAK,IAAIpC,GAA0BoC,IAAI5G,EAAc;AAAA,IAAA;AAAA,EAEzD,GAAG,CAACwE,CAAwB,CAAC,GAEvBuC,KAAmBhI,EAAY,MAAM;AACzC,IAAA6D;AAAA,MAAsB,CAACgE,MACrB,KAAK,IAAInC,IAA0BmC,IAAI5G,EAAc;AAAA,IAAA;AAAA,EAEzD,GAAG,CAACyE,EAAwB,CAAC,GAIvBuC,KAAajI;AAAA,IACjB,CAACyG,MAAoB;AACnB,MAAID,EAAeC,CAAO,MAC1BjJ,EAASiJ,CAAO,GAChBT,GAAA;AAAA,IACF;AAAA,IACA,CAACxI,GAAUgJ,GAAgBR,EAAsB;AAAA,EAAA,GAG7CkC,KAAclI;AAAA,IAClB,CAACyB,GAAcC,OAAkB;AAC/B,YAAMmF,KAAM,GAAGpF,CAAI,IAAIH,GAAII,KAAQ,CAAC,CAAC;AACrC,MAAIiB,KAAWkE,KAAMlE,EAAQ,UAAU,GAAG,CAAC,KACvCC,KAAWiE,KAAMjE,EAAQ,UAAU,GAAG,CAAC,MAC3CpF,EAASqJ,EAAG,GACZb,GAAA;AAAA,IACF;AAAA,IACA,CAACxI,GAAUmF,GAASC,GAASoD,EAAsB;AAAA,EAAA,GAG/CmC,KAAanI;AAAA,IACjB,CAACyB,MAAiB;AAChB,MAAIqF,EAAerF,CAAI,MACvBmE,GAAYnE,CAAI,GAChBgC,EAAmBtB,GAAiBV,CAAI,CAAC,GACzC8B,EAAkB,EAAK;AAAA,IACzB;AAAA,IACA,CAACuD,CAAc;AAAA,EAAA,GAIXsB,KAAsBpI;AAAA,IAC1B,CAACyB,MAAiB;AAChB,MAAIqF,EAAerF,CAAI,MACvBmE,GAAYnE,CAAI,GAChBoC,EAAsB1B,GAAiBV,CAAI,CAAC,GAC5CkC,EAAW,OAAO;AAAA,IACpB;AAAA,IACA,CAACmD,CAAc;AAAA,EAAA,GAIXuB,KAAuBrI,EAAY,CAAC0B,MAAkB;AAC1D,IAAAoE,GAAapE,CAAK,GAClBiC,EAAW,KAAK;AAAA,EAClB,GAAG,CAAA,CAAE,GAIC2E,KAAepD,GAAQ,MACpBtD,GAAYrK,GAAOsK,GAAMa,CAAM,GACrC,CAACnL,GAAOsK,GAAMa,CAAM,CAAC,GAIlB6F,KAAOrD,GAAQ,MAAM;AACzB,UAAMsD,IAAQhH,GAAemE,IAAUE,EAAS,GAC1C4C,KAAW9G,GAAkBgE,IAAUE,EAAS,GAChD6C,KACJ7C,OAAc,IACVrE,GAAemE,KAAW,GAAG,EAAE,IAC/BnE,GAAemE,IAAUE,KAAY,CAAC,GAEtC8C,KAAmE,CAAA;AAEzE,aAASC,KAAIH,KAAW,GAAGG,MAAK,GAAGA,MAAK;AACtC,YAAMxD,KAAIsD,KAAYE,IAChBjB,KAAI9B,OAAc,IAAI,KAAKA,KAAY,GACvCgD,KAAIhD,OAAc,IAAIF,KAAW,IAAIA;AAC3C,MAAAgD,GAAM,KAAK;AAAA,QACT,KAAKvD;AAAA,QACL,SAAS;AAAA,QACT,SAAS,GAAGyD,EAAC,IAAIvH,GAAIqG,KAAI,CAAC,CAAC,IAAIrG,GAAI8D,EAAC,CAAC;AAAA,MAAA,CACtC;AAAA,IACH;AAEA,aAASA,KAAI,GAAGA,MAAKoD,GAAOpD;AAC1B,MAAAuD,GAAM,KAAK;AAAA,QACT,KAAKvD;AAAA,QACL,SAAS;AAAA,QACT,SAAS,GAAGO,EAAQ,IAAIrE,GAAIuE,KAAY,CAAC,CAAC,IAAIvE,GAAI8D,EAAC,CAAC;AAAA,MAAA,CACrD;AAGH,UAAM0D,KAAY,KAAKH,GAAM;AAC7B,aAASvD,KAAI,GAAGA,MAAK0D,IAAW1D,MAAK;AACnC,YAAMuC,KAAI9B,OAAc,KAAK,IAAIA,KAAY,GACvCgD,KAAIhD,OAAc,KAAKF,KAAW,IAAIA;AAC5C,MAAAgD,GAAM,KAAK;AAAA,QACT,KAAKvD;AAAA,QACL,SAAS;AAAA,QACT,SAAS,GAAGyD,EAAC,IAAIvH,GAAIqG,KAAI,CAAC,CAAC,IAAIrG,GAAI8D,EAAC,CAAC;AAAA,MAAA,CACtC;AAAA,IACH;AAEA,WAAOuD;AAAA,EACT,GAAG,CAAChD,IAAUE,EAAS,CAAC,GAGlBkD,KAAgB7D,GAAQ,MAAM;AAClC,QAAIrD,MAAS,gBAAgB,CAACtK,EAAO,QAAO;AAC5C,UAAMyR,IAAIjH,GAAUxK,CAAK;AACzB,WAAOyR,IAAI,EAAE,MAAMA,EAAE,MAAM,OAAOA,EAAE,UAAU;AAAA,EAChD,GAAG,CAACzR,GAAOsK,CAAI,CAAC;AAIhB,gCACG,OAAA,EAAI,KAAA7F,GAAU,WAAWzB,EAAG,YAAYW,CAAS,GAEhD,UAAA;AAAA,IAAA8B,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKkH;AAAA,QACL,MAAK;AAAA,QACL,cAAY3B;AAAA,QACZ,UAAAnF;AAAA,QACA,SAAS,MAAM;AACb,UAAIA,MACA4B,IAAM+G,GAAA,KAERlD,EAAQ,EAAI,GACZE,EAAkB,EAAK;AAAA,QAE3B;AAAA,QACA,WAAWxI;AAAA,UACT,kIAAkIE,GAAa,OAAO;AAAA,UACtJ;AAAA,UACAuE,KACE,CAAC8D,KACD;AAAA,UACFG,EAAO;AAAA,UACP7F,KAAY;AAAA,QAAA;AAAA,QAGb,UAAA;AAAA,UAAAkL,KACC7L,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,kCAAkC,UAAA6L,GAAA,CAAa,IAE/D7L,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,8CAA8C,UAAA6F,GAAY;AAAA,UAE5E7F,gBAAAA,EAAAA;AAAAA,YAACwM;AAAA,YAAA;AAAA,cACC,MAAMhG,EAAO;AAAA,cACb,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ;AAAA,MAAA;AAAA,IAAA;AAAA,IAIDjE,KACCkB;AAAA,MACEzD,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAK0H;AAAA,UACL,2BAAuB;AAAA,UACvB,WAAU;AAAA,UACV,OAAO;AAAA,YACL,GAAGL;AAAA,YACH,WAAWhB,IACPkB,MAAkB,OAChB,iDACA,8CACFA,MAAkB,OAChB,wCACA;AAAA,YACN,iBAAiBA,MAAkB,OAAO,WAAW;AAAA,UAAA;AAAA,UAGtD,gBAAS,mBACRvH,gBAAAA,EAAAA;AAAAA,YAACyM;AAAA,YAAA;AAAA,cACC,QAAAjG;AAAA,cACA,UAAA0C;AAAA,cACA,WAAAE;AAAA,cACA,MAAA0C;AAAA,cACA,OAAAhR;AAAA,cACA,UAAA8N;AAAA,cACA,WAAAF;AAAA,cACA,gBAAAjC;AAAA,cACA,SAAAQ;AAAA,cACA,oBAAAE;AAAA,cACA,uBAAA6D;AAAA,cACA,uBAAAC;AAAA,cACA,YAAAO;AAAA,cACA,kBAAAF;AAAA,cACA,kBAAAC;AAAA,cACA,WAAAd;AAAA,cACA,WAAAG;AAAA,cACA,gBAAgBtH;AAAA,cAChB,WAAA0C;AAAA,cACA,WAAAD;AAAA,cACA,SAAS,MAAM;AACb,gBAAAhF,EAAS,EAAE,GACXuI,GAAA;AAAA,cACF;AAAA,cACA,eAAe,MAAMkC,GAAW5C,EAAQ;AAAA,cACxC,gBAAAmB;AAAA,cACA,gBAAAS;AAAA,cACA,gBAAAG;AAAA,cACA,YAAAzD;AAAA,cACA,qBAAAyE;AAAA,cACA,sBAAAC;AAAA,cACA,UAAAlB;AAAA,cACA,UAAAG;AAAA,cACA,gBAAAR;AAAA,cACA,iBAAAF;AAAA,YAAA;AAAA,UAAA,IAGFnK,gBAAAA,EAAAA;AAAAA,YAAC0M;AAAA,YAAA;AAAA,cACC,QAAAlG;AAAA,cACA,UAAA0C;AAAA,cACA,gBAAArC;AAAA,cACA,iBAAAE;AAAA,cACA,oBAAA+D;AAAA,cACA,oBAAAC;AAAA,cACA,eAAAuB;AAAA,cACA,WAAA5D;AAAA,cACA,gBAAAjC;AAAA,cACA,aAAAgF;AAAA,cACA,YAAAC;AAAA,cACA,UAAAhB;AAAA,cACA,UAAAG;AAAA,cACA,eAAAM;AAAA,cACA,eAAAE;AAAA,cACA,mBAAAvE;AAAA,cACA,gBAAgBxD;AAAA,cAChB,WAAA0C;AAAA,cACA,WAAAD;AAAA,cACA,SAAS,MAAM;AACb,gBAAAhF,EAAS,EAAE,GACXuI,GAAA;AAAA,cACF;AAAA,cACA,eAAe,MACbmC,GAAY/C,EAAU,MAAMA,EAAU,KAAK;AAAA,cAE7C,iBAAAyB;AAAA,cACA,gBAAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,MAGJ,SAAS;AAAA,IAAA;AAAA,EACX,GACJ;AAEJ,GAuCMoC,KAAgD,CAAC;AAAA,EACrD,QAAAjG;AAAA,EACA,UAAA0C;AAAA,EACA,WAAAE;AAAA,EACA,MAAA0C;AAAA,EACA,OAAAhR;AAAA,EACA,UAAA8N;AAAA,EACA,WAAAF;AAAA,EACA,gBAAAjC;AAAA,EACA,SAAAQ;AAAA,EACA,oBAAAE;AAAA,EACA,uBAAA6D;AAAA,EACA,uBAAAC;AAAA,EACA,YAAAO;AAAA,EACA,kBAAAF;AAAA,EACA,kBAAAC;AAAA,EACA,WAAAd;AAAA,EACA,WAAAG;AAAA,EACA,gBAAA+B;AAAA,EACA,WAAA3G;AAAA,EACA,WAAAD;AAAA,EACA,SAAA6G;AAAA,EACA,eAAAC;AAAA,EACA,gBAAA9C;AAAA,EACA,gBAAAS;AAAA,EACA,gBAAAG;AAAA,EACA,YAAAzD;AAAA,EACA,qBAAAyE;AAAA,EACA,sBAAAC;AAAA,EACA,UAAAlB;AAAA,EACA,UAAAG;AAAA,EACA,gBAAAR;AAAA,EACA,iBAAAF;AACF,MACE5J,gBAAAA,EAAAA,KAAAuM,YAAA,EACE,UAAA;AAAA,EAAA9M,gBAAAA,EAAAA,IAAC,SAAI,WAAWlC,EAAG0I,EAAO,UAAU,MAAM,GACvC,UAAAS,MAAY;AAAA;AAAA,IAEX1G,gBAAAA,OAAAuM,EAAAA,UAAA,EACE,UAAA;AAAA,MAAAvM,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAAP,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU,CAACgL;AAAA,YACX,SAASM;AAAA,YACT,WAAWxN;AAAA,cACT;AAAA,cACAkN,IACI,gDACA;AAAA,YAAA;AAAA,YAGN,UAAAhL,gBAAAA,EAAAA,IAAC+M,IAAA,EAAY,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,+BAExB,QAAA,EAAK,WAAWjP,EAAG0I,EAAO,QAAQ,8CAA8C,GAC9E,UAAA;AAAA,UAAAW;AAAA,UAAmB;AAAA,UAAIA,IAAqB;AAAA,QAAA,GAC/C;AAAA,QACAnH,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU,CAACiL;AAAA,YACX,SAASM;AAAA,YACT,WAAWzN;AAAA,cACT;AAAA,cACAmN,IACI,gDACA;AAAA,YAAA;AAAA,YAGN,UAAAjL,gBAAAA,EAAAA,IAACgN,IAAA,EAAa,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MAC1B,GACF;AAAA,MACAhN,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,sCACZ,gBAAM,KAAK,EAAE,QAAQ,GAAA,GAAM,CAACiN,GAAGd,MAAMhF,IAAqBgF,CAAC,EAAE;AAAA,QAC5D,CAACC,MAAM;AACL,gBAAMzL,IAAW0J,EAAe+B,CAAC,GAC3Bc,IAAYd,MAAM1D,EAAU,MAC5ByE,KAAaf,MAAMlD;AACzB,iBACElJ,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,UAAAW;AAAA,cACA,SAAS,MAAMgL,EAAoBS,CAAC;AAAA,cACpC,WAAWtO;AAAA,gBACT;AAAA,gBACAqP,MACE;AAAA,gBACF,CAACA,MACCD,KACA;AAAA,gBACF,CAACC,MACC,CAACD,KACD,CAACvM,KACD;AAAA,gBACFA,KAAY;AAAA,cAAA;AAAA,cAGb,UAAAyL;AAAA,YAAA;AAAA,YAlBIA;AAAA,UAAA;AAAA,QAqBX;AAAA,MAAA,EACF,CACF;AAAA,IAAA,EAAA,CACF;AAAA,MACEnF,MAAY;AAAA;AAAA,IAEd1G,gBAAAA,OAAAuM,EAAAA,UAAA,EACE,UAAA;AAAA,MAAAvM,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAAP,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS0K;AAAA,YACT,WAAU;AAAA,YAEV,UAAA1K,gBAAAA,EAAAA,IAAC+M,IAAA,EAAY,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QAEzBxM,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM2G,EAAW,MAAM;AAAA,YAChC,WAAWpJ;AAAA,cACT0I,EAAO;AAAA,cACP;AAAA,YAAA;AAAA,YAGD,UAAA;AAAA,cAAA0C;AAAA,cAAS;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAEZlJ,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS6K;AAAA,YACT,WAAU;AAAA,YAEV,UAAA7K,gBAAAA,EAAAA,IAACgN,IAAA,EAAa,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MAC1B,GACF;AAAA,MACAhN,gBAAAA,MAAC,SAAI,WAAU,0BACZ,aAAO,IAAI,CAACa,GAAOuM,MAAQ;AAC1B,cAAMF,IACJhE,MAAaR,EAAU,QAAQ0E,MAAQ1E,EAAU,OAC7CyE,KACJjE,MAAaR,EAAU,QAAQ0E,MAAQhE,GACnCzI,KAAWwJ,EAAgBjB,GAAUkE,CAAG;AAC9C,eACE7M,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,UAAAI;AAAA,YACA,SAAS,MAAMiL,EAAqBwB,CAAG;AAAA,YACvC,WAAWtP;AAAA,cACT;AAAA,cACAqP,MACE;AAAA,cACF,CAACA,MAAcD,KAAa;AAAA,cAC5B,CAACC,MACC,CAACD,KACD,CAACvM,MACD;AAAA,cACFA,MAAY;AAAA,YAAA;AAAA,YAGb,UAAA;AAAA,cAAAE;AAAA,cACAqM,KAAa,CAACC,MACbnN,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,mGAAA,CAAmG;AAAA,YAAA;AAAA,UAAA;AAAA,UAlBhHoN;AAAA,QAAA;AAAA,MAsBX,CAAC,EAAA,CACH;AAAA,IAAA,EAAA,CACF;AAAA;AAAA;AAAA,IAGA7M,gBAAAA,OAAAuM,EAAAA,UAAA,EACE,UAAA;AAAA,MAAAvM,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAAP,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAASyK;AAAA,YACT,UAAU,CAACD;AAAA,YACX,WAAU;AAAA,YAEV,UAAAxK,gBAAAA,EAAAA,IAAC+M,IAAA,EAAY,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QAEzBxM,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAAA,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM2G,EAAW,MAAM;AAAA,cAChC,WAAWpJ;AAAA,gBACT0I,EAAO;AAAA,gBACP;AAAA,cAAA;AAAA,cAGD,UAAA;AAAA,gBAAA0C;AAAA,gBAAS;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZlJ,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAMkH,EAAW,OAAO;AAAA,cACjC,WAAWpJ;AAAA,gBACT0I,EAAO;AAAA,gBACP;AAAA,cAAA;AAAA,cAGD,aAAO4C,CAAS;AAAA,YAAA;AAAA,UAAA;AAAA,QACnB,GACF;AAAA,QACApJ,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS4K;AAAA,YACT,UAAU,CAACD;AAAA,YACX,WAAU;AAAA,YAEV,UAAA3K,gBAAAA,EAAAA,IAACgN,IAAA,EAAa,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MAC1B,GACF;AAAA,MAGAhN,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,mBACb,UAAAO,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,gBAAAoM;AAAA,UACA,OACElG,MAAmB,SACf,EAAE,WAAW,kCAAA,IACbA,MAAmB,UACjB,EAAE,WAAW,mCAAA,IACb;AAAA,UAIR,UAAA;AAAA,YAAAzG,gBAAAA,MAAC,SAAI,WAAU,qCACZ,UAAAsE,GAAS,IAAI,CAAC+I,MACbrN,gBAAAA,EAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBAET,UAAAqN;AAAA,cAAA;AAAA,cAHIA;AAAA,YAAA,CAKR,GACH;AAAA,YAGArN,gBAAAA,MAAC,SAAI,WAAU,gCACZ,YAAK,IAAI,CAACsN,GAAMnB,MAAM;AACrB,oBAAMgB,IAAaG,EAAK,YAAYxS,GAC9ByS,KAAUD,EAAK,YAAY1E,GAC3B4E,KACJF,EAAK,WAAWvD,EAAeuD,EAAK,OAAO;AAC7C,qBACE/M,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,MAAK;AAAA,kBACL,SAAS,MAAMiL,EAAW8B,EAAK,OAAO;AAAA,kBACtC,WAAWxP;AAAA,oBACT;AAAA,oBACA0I,EAAO;AAAA,oBACP,CAAC8G,EAAK,WAAW;AAAA,oBACjBE,MAAc;AAAA,oBACdF,EAAK,WACH,CAACH,KACD,CAACK,MACD;AAAA,oBACFL,KACE;AAAA,oBACFI,MACE,CAACJ,KACD,CAACK,MACD;AAAA,kBAAA;AAAA,kBAGH,UAAA;AAAA,oBAAAF,EAAK;AAAA,oBACLC,MAAW,CAACJ,KACXnN,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,qGAAA,CAAqG;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAtBlHmM;AAAA,cAAA;AAAA,YA0BX,CAAC,EAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,EACF,CACF;AAAA,IAAA,EAAA,CACF;AAAA,KAEJ;AAAA,GAGEnG,KAAcD,KAAajL,MAC3ByF,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,kGACZ,UAAA;AAAA,IAAAyF,KACChG,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS6M;AAAA,QACT,WAAW/O;AAAA,UACT0I,EAAO;AAAA,UACP;AAAA,QAAA;AAAA,QAEH,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAIFT,KAAajL,KACZkF,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS4M;AAAA,QACT,WAAW9O;AAAA,UACT0I,EAAO;AAAA,UACP;AAAA,QAAA;AAAA,QAEH,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,EAAA,CAEJ;AAAA,GAEJ,GA+BIkG,KAAoD,CAAC;AAAA,EACzD,QAAAlG;AAAA,EACA,UAAA0C;AAAA,EACA,gBAAArC;AAAA,EACA,iBAAAE;AAAA,EACA,oBAAA+D;AAAA,EACA,oBAAAC;AAAA,EACA,eAAAuB;AAAA,EACA,WAAA5D;AAAA,EACA,gBAAAjC;AAAA,EACA,aAAAgF;AAAA,EACA,YAAAC;AAAA,EACA,UAAAhB;AAAA,EACA,UAAAG;AAAA,EACA,eAAAM;AAAA,EACA,eAAAE;AAAA,EACA,mBAAAvE;AAAA,EACA,gBAAA6F;AAAA,EACA,WAAA3G;AAAA,EACA,WAAAD;AAAA,EACA,SAAA6G;AAAA,EACA,eAAAC;AAAA,EACA,iBAAA1C;AAAA,EACA,gBAAAE;AACF,MACE9J,gBAAAA,EAAAA,KAAAuM,YAAA,EACE,UAAA;AAAA,EAAA9M,gBAAAA,MAAC,SAAI,WAAWlC,EAAG0I,EAAO,UAAU,MAAM,GACvC,UAAAK;AAAA;AAAA,IAECtG,gBAAAA,OAAAuM,EAAAA,UAAA,EACE,UAAA;AAAA,MAAAvM,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAAP,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU,CAAC8K;AAAA,YACX,SAASK;AAAA,YACT,WAAWrN;AAAA,cACT;AAAA,cACAgN,IACI,gDACA;AAAA,YAAA;AAAA,YAGN,UAAA9K,gBAAAA,EAAAA,IAAC+M,IAAA,EAAY,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,+BAExB,QAAA,EAAK,WAAWjP,EAAG0I,EAAO,QAAQ,8CAA8C,GAC9E,UAAA;AAAA,UAAAO;AAAA,UAAgB;AAAA,UAAIA,IAAkB;AAAA,QAAA,GACzC;AAAA,QACA/G,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU,CAAC+K;AAAA,YACX,SAASM;AAAA,YACT,WAAWvN;AAAA,cACT;AAAA,cACAiN,IACI,gDACA;AAAA,YAAA;AAAA,YAGN,UAAA/K,gBAAAA,EAAAA,IAACgN,IAAA,EAAa,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MAC1B,GACF;AAAA,MACAhN,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,sCACZ,gBAAM,KAAK,EAAE,QAAQ,GAAA,GAAM,CAACiN,GAAGd,MAAMpF,IAAkBoF,CAAC,EAAE;AAAA,QACzD,CAACC,MAAM;AACL,gBAAMzL,IAAW0J,EAAe+B,CAAC,GAC3Bc,IAAYd,MAAM1D,EAAU,MAC5ByE,IAAaf,MAAMlD;AACzB,iBACElJ,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,UAAAW;AAAA,cACA,SAAS,MAAM+K,EAAWU,CAAC;AAAA,cAC3B,WAAWtO;AAAA,gBACT;AAAA,gBACAqP,KACE;AAAA,gBACF,CAACA,KACCD,KACA;AAAA,gBACF,CAACC,KACC,CAACD,KACD,CAACvM,KACD;AAAA,gBACFA,KAAY;AAAA,cAAA;AAAA,cAGb,UAAAyL;AAAA,YAAA;AAAA,YAlBIA;AAAA,UAAA;AAAA,QAqBX;AAAA,MAAA,EACF,CACF;AAAA,IAAA,EAAA,CACF;AAAA;AAAA;AAAA,IAGA7L,gBAAAA,OAAAuM,EAAAA,UAAA,EACE,UAAA;AAAA,MAAAvM,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAAP,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS0K;AAAA,YACT,WAAU;AAAA,YAEV,UAAA1K,gBAAAA,EAAAA,IAAC+M,IAAA,EAAY,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QAEzBxM,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAMuG,EAAkB,EAAI;AAAA,YACrC,WAAWhJ;AAAA,cACT0I,EAAO;AAAA,cACP;AAAA,YAAA;AAAA,YAGD,UAAA;AAAA,cAAA0C;AAAA,cAAS;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAEZlJ,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS6K;AAAA,YACT,WAAU;AAAA,YAEV,UAAA7K,gBAAAA,EAAAA,IAACgN,IAAA,EAAa,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MAC1B,GACF;AAAA,MACAhN,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,mBACb,UAAAA,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,gBAAA2M;AAAA,UACA,OACElG,MAAmB,SACf,EAAE,WAAW,kCAAA,IACbA,MAAmB,UACjB,EAAE,WAAW,mCAAA,IACb;AAAA,UAGR,UAAAzG,gBAAAA,EAAAA,IAAC,SAAI,WAAU,0BACZ,aAAO,IAAI,CAACa,GAAOuM,MAAQ;AAC1B,kBAAMD,KACJb,KAAA,gBAAAA,EAAe,UAASpD,MACxBoD,KAAA,gBAAAA,EAAe,WAAUc,GACrBF,IACJhE,MAAaR,EAAU,QAAQ0E,MAAQ1E,EAAU,OAC7C/H,IAAWwJ,EAAgBjB,GAAUkE,CAAG;AAC9C,mBACE7M,gBAAAA,EAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,UAAAI;AAAA,gBACA,SAAS,MAAM8K,EAAYvC,GAAUkE,CAAG;AAAA,gBACxC,WAAWtP;AAAA,kBACT;AAAA,kBACAqP,KACE;AAAA,kBACF,CAACA,KACCD,KACA;AAAA,kBACF,CAACC,KACC,CAACD,KACD,CAACvM,KACD;AAAA,kBACFA,KAAY;AAAA,gBAAA;AAAA,gBAGb,UAAA;AAAA,kBAAAE;AAAA,kBACAqM,KAAa,CAACC,KACbnN,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,mGAAA,CAAmG;AAAA,gBAAA;AAAA,cAAA;AAAA,cApBhHoN;AAAA,YAAA;AAAA,UAwBX,CAAC,EAAA,CACH;AAAA,QAAA;AAAA,MAAA,EACF,CACF;AAAA,IAAA,EAAA,CACF;AAAA,KAEJ;AAAA,GAGEpH,KAAcD,KAAauG,MAC3B/L,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,kGACZ,UAAA;AAAA,IAAAyF,KACChG,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS6M;AAAA,QACT,WAAW/O;AAAA,UACT0I,EAAO;AAAA,UACP;AAAA,QAAA;AAAA,QAEH,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAIFT,KAAauG,KACZtM,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS4M;AAAA,QACT,WAAW9O;AAAA,UACT0I,EAAO;AAAA,UACP;AAAA,QAAA;AAAA,QAEH,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,EAAA,CAEJ;AAAA,GAEJ,GCvzCI3B,KAAM,CAAC/J,MAAkB,OAAOA,CAAK,EAAE,SAAS,GAAG,GAAG,GAEtD2S,KAAe,CAACC,GAAeC,IAAO,MAAM;AAChD,QAAMC,IAAmB,CAAA;AACzB,WAAS9S,IAAQ,GAAGA,IAAQ4S,GAAO5S,KAAS6S;AAC1C,IAAAC,EAAO,KAAK/I,GAAI/J,CAAK,CAAC;AAExB,SAAO8S;AACT,GAUMC,KAAwC,CAAC;AAAA,EAC7C,OAAAlK;AAAA,EACA,QAAAiK;AAAA,EACA,UAAAE;AAAA,EACA,UAAAC;AAAA,EACA,YAAAP;AACF,MACEjN,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,sFACb,UAAA;AAAA,EAAAP,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,yIACZ,UAAA2D,GACH;AAAA,EACA3D,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,6BAAyB;AAAA,MACzB,qCAAiC;AAAA,MACjC,WAAU;AAAA,MAET,UAAA4N,EAAO,IAAI,CAACI,MAAS;AACpB,cAAMrN,KAAW6M,KAAA,gBAAAA,EAAaQ,OAAS;AACvC,eACEhO,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,cAAY,GAAG2D,CAAK,GAAGqK,CAAI;AAAA,YAC3B,gBAAcF,MAAaE,IAAO,SAAS;AAAA,YAC3C,iBAAeF,MAAaE,IAAO,SAAS;AAAA,YAC5C,UAAArN;AAAA,YACA,SAAS,MAAMoN,EAASC,CAAI;AAAA,YAC5B,WAAWlQ;AAAA,cACT;AAAA,cACAgQ,MAAaE,IACT,qFACA;AAAA,cACJrN,KACE;AAAA,YAAA;AAAA,YAGH,UAAAqN;AAAA,UAAA;AAAA,UAhBIA;AAAA,QAAA;AAAA,MAmBX,CAAC;AAAA,IAAA;AAAA,EAAA;AACH,GACF,GAGWC,KAA4C,CAAC;AAAA,EACxD,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,cAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,YAAAC,IAAa;AAAA,EACb,gBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,WAAAnQ;AACF,MAAM;AACJ,QAAMoQ,IAAU3N,GAAuB,IAAI,GACrC4N,IAAQrG,GAAQ,MAAMgF,GAAa,EAAE,GAAG,CAAA,CAAE,GAC1CsB,IAAUtG,GAAQ,MAAMgF,GAAa,IAAIgB,CAAU,GAAG,CAACA,CAAU,CAAC,GAClEO,IAAUvG,GAAQ,MAAMgF,GAAa,EAAE,GAAG,CAAA,CAAE;AAElD,SAAA1L,EAAU,MAAM;AACd,UAAMkN,IAAQ,OAAO,sBAAsB,MAAM;;AAC/C,OAAAhH,IAAA4G,EAAQ,YAAR,QAAA5G,EACI,iBAA8B,+BAC/B,QAAQ,CAACiH,MAAW;AACnB,cAAMpB,IAAWoB,EAAO;AAAA,UACtB;AAAA,QAAA;AAEF,YAAI,CAACpB,EAAU;AACf,cAAM1F,IAAM,KAAK;AAAA,UACf;AAAA,UACA0F,EAAS,YACPoB,EAAO,eAAe,IACtBpB,EAAS,eAAe;AAAA,QAAA;AAE5B,QAAI,OAAOoB,EAAO,YAAa,aAC7BA,EAAO,SAAS,EAAE,KAAA9G,GAAK,IAEvB8G,EAAO,YAAY9G;AAAA,MAEvB;AAAA,IACJ,CAAC;AACD,WAAO,MAAM,OAAO,qBAAqB6G,CAAK;AAAA,EAChD,GAAG,CAAA,CAAE,GAGH1O,gBAAAA,EAAAA,KAAAuM,YAAA,EACE,UAAA;AAAA,IAAA9M,gBAAAA,MAAC,SAAA,EAAO,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAeN;AAAA,IACFO,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKsO;AAAA,QACL,WAAW/Q;AAAA,UACT;AAAA,UACA0Q,MAAc,WAAW,gBAAgB;AAAA,UACzC/P;AAAA,QAAA;AAAA,QAGF,UAAA;AAAA,UAAAuB,gBAAAA,EAAAA;AAAAA,YAAC6N;AAAA,YAAA;AAAA,cACC,OAAM;AAAA,cACN,QAAQiB;AAAA,cACR,UAAUZ;AAAA,cACV,UAAUG;AAAA,cACV,YAAYK;AAAA,YAAA;AAAA,UAAA;AAAA,UAEd1O,gBAAAA,EAAAA;AAAAA,YAAC6N;AAAA,YAAA;AAAA,cACC,OAAM;AAAA,cACN,QAAQkB;AAAA,cACR,UAAUZ;AAAA,cACV,UAAUG;AAAA,cACV,YAAYK;AAAA,YAAA;AAAA,UAAA;AAAA,UAEbH,MAAc,WACbxO,gBAAAA,EAAAA;AAAAA,YAAC6N;AAAA,YAAA;AAAA,cACC,OAAM;AAAA,cACN,QAAQmB;AAAA,cACR,UAAUZ;AAAA,cACV,UAAUG,MAAmB,MAAA;AAAA;AAAA,cAC7B,YAAYK;AAAA,YAAA;AAAA,UAAA,IAEZ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACN,GACF;AAEJ,GCtJMtK,KAAW,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAC7CC,KAAS;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEMM,KAAM,CAAC/J,MAAkB,OAAOA,CAAK,EAAE,SAAS,GAAG,GAAG,GAEtDqU,KAAa,CAACC,MAClB,GAAGA,EAAK,YAAA,CAAa,IAAIvK,GAAIuK,EAAK,SAAA,IAAa,CAAC,CAAC,IAAIvK,GAAIuK,EAAK,QAAA,CAAS,CAAC,IAEpEC,KAAiB,CACrBD,GACAlB,GACAC,GACAC,MACG,GAAGgB,CAAI,IAAIlB,CAAI,IAAIC,CAAM,IAAIC,CAAM,IAElCkB,KAAwB,CAC5BF,GACAlB,GACAC,GACAC,GACAI,MAEAA,MAAc,WACV,GAAGY,CAAI,IAAIlB,CAAI,IAAIC,CAAM,KACzBkB,GAAeD,GAAMlB,GAAMC,GAAQC,CAAM,GAEzCmB,KAAgB,CAACzU,MAAkB;AACvC,QAAM0U,IAAU1U,EACb,OACA,QAAQ,KAAK,GAAG,EAChB,MAAM,2DAA2D;AACpE,SAAK0U,IAGE;AAAA,IACL,MAAMA,EAAQ,CAAC;AAAA,IACf,MAAMA,EAAQ,CAAC,KAAK;AAAA,IACpB,QAAQA,EAAQ,CAAC,KAAK;AAAA,IACtB,QAAQA,EAAQ,CAAC,KAAK;AAAA,EAAA,IANf;AAQX,GAEMC,KAAuB,CAC3BL,GACAlB,GACAC,GACAC,MACG;AACH,QAAMoB,IAAUJ,EAAK,MAAM,2BAA2B;AACtD,MAAI,CAACI;AACH,WAAO;AAET,QAAME,IAAY,IAAI;AAAA,IACpB,OAAOF,EAAQ,CAAC,CAAC;AAAA,IACjB,OAAOA,EAAQ,CAAC,CAAC,IAAI;AAAA,IACrB,OAAOA,EAAQ,CAAC,CAAC;AAAA,IACjB,OAAOtB,CAAI;AAAA,IACX,OAAOC,CAAM;AAAA,IACb,OAAOC,CAAM;AAAA,EAAA,EACb,QAAA;AACF,SAAO,OAAO,MAAMsB,CAAS,IAAI,OAAOA;AAC1C,GAEMC,KAAqB,CAAC7U,MAAmB;AAC7C,MAAI,CAACA;AACH,WAAO;AAET,QAAM0N,IAAS+G,GAAczU,CAAK;AAClC,SAAO0N,IACHiH;AAAA,IACEjH,EAAO;AAAA,IACPA,EAAO;AAAA,IACPA,EAAO;AAAA,IACPA,EAAO;AAAA,EAAA,IAET;AACN,GAEMzD,KAAiB,CAACC,GAAcC,MACpC,IAAI,KAAKD,GAAMC,IAAQ,GAAG,CAAC,EAAE,QAAA,GAEzB2K,KAAmB,CAAC5K,GAAcC,MAAkB;AACxD,QAAM+G,IAAW,IAAI,KAAKhH,GAAMC,GAAO,CAAC,EAAE,OAAA,GACpC4K,IAAc9K,GAAeC,GAAMC,CAAK,GACxC6K,IAAgB7K,MAAU,IAAI,KAAKA,IAAQ,GAC3C8K,IAAe9K,MAAU,IAAID,IAAO,IAAIA,GACxCgL,IAAejL,GAAegL,GAAcD,CAAa,GACzD5D,IAAgE,CAAA;AAEtE,WAAS+D,IAAQjE,IAAW,GAAGiE,KAAS,GAAGA,KAAS,GAAG;AACrD,UAAMC,IAAMF,IAAeC;AAC3B,IAAA/D,EAAM,KAAK;AAAA,MACT,MAAM,GAAG6D,CAAY,IAAIlL,GAAIiL,IAAgB,CAAC,CAAC,IAAIjL,GAAIqL,CAAG,CAAC;AAAA,MAC3D,KAAAA;AAAA,MACA,SAAS;AAAA,IAAA,CACV;AAAA,EACH;AAEA,WAASA,IAAM,GAAGA,KAAOL,GAAaK,KAAO;AAC3C,IAAAhE,EAAM,KAAK;AAAA,MACT,MAAM,GAAGlH,CAAI,IAAIH,GAAII,IAAQ,CAAC,CAAC,IAAIJ,GAAIqL,CAAG,CAAC;AAAA,MAC3C,KAAAA;AAAA,MACA,SAAS;AAAA,IAAA,CACV;AAGH,QAAMtF,IAAY3F,MAAU,KAAK,IAAIA,IAAQ,GACvC4F,IAAW5F,MAAU,KAAKD,IAAO,IAAIA;AAC3C,SAAOkH,EAAM,SAAS,MAAI;AACxB,UAAMgE,IAAMhE,EAAM,SAASF,IAAW6D,IAAc;AACpD,IAAA3D,EAAM,KAAK;AAAA,MACT,MAAM,GAAGrB,CAAQ,IAAIhG,GAAI+F,IAAY,CAAC,CAAC,IAAI/F,GAAIqL,CAAG,CAAC;AAAA,MACnD,KAAAA;AAAA,MACA,SAAS;AAAA,IAAA,CACV;AAAA,EACH;AAEA,SAAOhE;AACT,GAEMiE,KAAc,KACdC,KAAyB,KACzBC,KAAY,GACZC,KAA2B,KAEpBC,KAAgD,CAAC;AAAA,EAC5D,OAAAzV;AAAA,EACA,UAAAiG;AAAA,EACA,OAAAF;AAAA,EACA,UAAAF,IAAW;AAAA,EACX,WAAAlC;AAAA,EACA,YAAAgQ,IAAa;AAAA,EACb,aAAA5I,IAAc;AAAA,EACd,WAAA2I,IAAY;AAAA,EACZ,SAAAtI;AAAA,EACA,aAAAsK;AAAA,EACA,cAAAC,IAAe;AACjB,MAAM;;AACJ,QAAMjI,IAASC,GAAQ,MAAM8G,GAAczU,CAAK,GAAG,CAACA,CAAK,CAAC,GACpD4V,IAAQjI,GAAQ,0BAAU,KAAA,GAAQ,CAAA,CAAE,GACpCkI,KAAcnI,KAAA,gBAAAA,EAAQ,SAAQ2G,GAAWuB,CAAK,GAC9CE,IAAc,OAAOD,EAAY,MAAM,GAAG,CAAC,CAAC,GAC5CE,IAAe,OAAOF,EAAY,MAAM,GAAG,CAAC,CAAC,IAAI,GAEjD,CAACpO,GAAM6D,CAAO,IAAI1G,EAAS,EAAK,GAChC,CAACwJ,GAAUC,CAAW,IAAIzJ,EAASkR,CAAW,GAC9C,CAACxH,GAAWC,CAAY,IAAI3J,EAASmR,CAAY,GACjD,CAACC,GAAWC,CAAY,IAAIrR,EAASiR,CAAW,GAChD,CAACK,GAAWC,CAAY,IAAIvR;AAAA,KAChC8I,KAAA,gBAAAA,EAAQ,UAASiI,IAAe5L,GAAI6L,EAAM,SAAA,CAAU,IAAI;AAAA,EAAA,GAEpD,CAACQ,GAAaC,CAAc,IAAIzR;AAAA,KACpC8I,KAAA,gBAAAA,EAAQ,YAAWiI,IAAe5L,GAAI6L,EAAM,WAAA,CAAY,IAAI;AAAA,EAAA,GAExD,CAACU,GAAaC,CAAc,IAAI3R;AAAA,KACpC8I,KAAA,gBAAAA,EAAQ,YAAWiI,IAAe5L,GAAI6L,EAAM,WAAA,CAAY,IAAI;AAAA,EAAA,GAExD,CAACnJ,GAAeC,CAAgB,IAAI9H,EAAwB,MAAM,GAClE,CAAC2G,GAAgBC,CAAiB,IAAI5G,EAAS,EAAK,GACpD4R,IAAapQ,GAAuB,IAAI,GACxCuG,KAAavG,GAA0B,IAAI,GAC3CqQ,KAAWrQ,GAAuB,IAAI,GACtCqF,IAAkBrF,GAA6C,IAAI,GACnEsQ,IAAiBtQ,GAAOpG,CAAK,GAC7B,CAAC2W,GAAYC,CAAa,IAAIhS,EAA8B;AAAA,IAChE,UAAU;AAAA,IACV,QAAQ;AAAA,EAAA,CACT,GAEKwM,KAAQzD;AAAA,IACZ,MAAMmH,GAAiB1G,GAAUE,CAAS;AAAA,IAC1C,CAACA,GAAWF,CAAQ;AAAA,EAAA,GAEhByI,KAAczL,OAAW+B,IAAAsH,GAAciB,KAAe,EAAE,MAA/B,gBAAAvI,EAAkC,SAAQ,MACnE2J,IAAmBjC,GAAmBa,CAAW,GACjD3E,KAAerD,IACjB8G;AAAA,IACE9G,EAAO;AAAA,IACPA,EAAO;AAAA,IACPA,EAAO;AAAA,IACPA,EAAO;AAAA,IACPgG;AAAA,EAAA,IAEF,IAEEqD,IAAqBtO,EAAY,MAAM;AAC3C,UAAMuO,IAAOvC,GAAczU,CAAK,GAC1BoE,IAAWuR,IAAe,oBAAI,KAAA,IAASC,GACvCqB,MAAWD,KAAA,gBAAAA,EAAM,SAAQ3C,GAAWjQ,CAAQ;AAClD,IAAA6R,EAAagB,EAAQ,GACrBd;AAAA,OACEa,KAAA,gBAAAA,EAAM,UAASrB,IAAe5L,GAAI3F,EAAS,SAAA,CAAU,IAAI;AAAA,IAAA,GAE3DiS;AAAA,OACEW,KAAA,gBAAAA,EAAM,YAAWrB,IAAe5L,GAAI3F,EAAS,WAAA,CAAY,IAAI;AAAA,IAAA,GAE/DmS;AAAA,OACES,KAAA,gBAAAA,EAAM,YAAWrB,IAAe5L,GAAI3F,EAAS,WAAA,CAAY,IAAI;AAAA,IAAA,GAE/DiK,EAAY,OAAO4I,GAAS,MAAM,GAAG,CAAC,CAAC,CAAC,GACxC1I,EAAa,OAAO0I,GAAS,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,GAC7CP,EAAe,UAAU1W;AAAA,EAC3B,GAAG,CAAC2V,GAAcC,GAAO5V,CAAK,CAAC;AAE/B,EAAAiH,EAAU,MAAM;AACd,IAAKQ,KAGDiP,EAAe,YAAY1W,KAG/B+W,EAAA;AAAA,EACF,GAAG,CAACtP,GAAMsP,GAAoB/W,CAAK,CAAC;AAEpC,QAAMkX,KAAiBzO,EAAY,MAAM;;AACvC,UAAMqE,KAAOK,IAAAR,GAAW,YAAX,gBAAAQ,EAAoB;AACjC,QAAI,CAACL;AACH;AAEF,UAAMqK,MACJC,IAAAX,GAAS,YAAT,gBAAAW,EAAkB,iBAAgB9B,IAC9B+B,KAAa,KAAK,IAAIhC,IAAa,KAAK,IAAI,GAAG,OAAO,aAAa,EAAE,CAAC,GAEtEhI,KADa,OAAO,cAAcP,EAAK,SACXqK,IAAc5B,IAC1CjI,KAAMD,KACR,KAAK,IAAI,GAAGP,EAAK,MAAMqK,IAAc5B,EAAS,IAC9CzI,EAAK,SAASyI,IACZ9H,KAAO,KAAK;AAAA,MAChB,KAAK,IAAI,GAAGX,EAAK,IAAI;AAAA,MACrB,KAAK,IAAI,GAAG,OAAO,aAAauK,KAAa,CAAC;AAAA,IAAA;AAEhD,IAAA3K,EAAiBW,KAAe,OAAO,MAAM,GAC7CuJ,EAAc;AAAA,MACZ,UAAU;AAAA,MACV,MAAAnJ;AAAA,MACA,KAAAH;AAAA,MACA,OAAO+J;AAAA,MACP,WAAW;AAAA,MACX,QAAQ;AAAA,IAAA,CACT;AAAA,EACH,GAAG,CAAA,CAAE,GAECC,KAAY,MAAM;AACtB,IAAI7L,EAAgB,WAClB,aAAaA,EAAgB,OAAO,GAEtCD,EAAkB,EAAK,GACvBuL,EAAA,GACAG,GAAA,GACA5L,EAAQ,EAAI;AAAA,EACd,GAEMiM,KAAa9O,EAAY,MAAM;AACnC,IAAIgD,EAAgB,WAClB,aAAaA,EAAgB,OAAO,GAEtCD,EAAkB,EAAI,GACtBC,EAAgB,UAAU,WAAW,MAAM;AACzC,MAAAH,EAAQ,EAAK,GACbE,EAAkB,EAAK;AAAA,IACzB,GAAGgK,EAAwB;AAAA,EAC7B,GAAG,CAAA,CAAE,GAECgC,KAAsB/O,EAAY,MAAM;AAC5C,IAAIgD,EAAgB,WAClB,aAAaA,EAAgB,OAAO,GAEtCH,EAAQ,EAAK,GACbE,EAAkB,EAAK;AAAA,EACzB,GAAG,CAAA,CAAE;AAEL,EAAAvE,EAAU,MAAM;AACd,QAAKQ;AAGL,aAAAyP,GAAA,GACA,OAAO,iBAAiB,UAAUA,EAAc,GAChD,OAAO,iBAAiB,UAAUA,IAAgB,EAAI,GAC/C,MAAM;AACX,eAAO,oBAAoB,UAAUA,EAAc,GACnD,OAAO,oBAAoB,UAAUA,IAAgB,EAAI;AAAA,MAC3D;AAAA,EACF,GAAG,CAACzP,GAAMyP,EAAc,CAAC,GAEzBjQ,EAAU,MAAM;AACd,QAAI,CAACQ;AACH;AAEF,UAAM0M,IAAQ,OAAO,sBAAsB+C,EAAc;AACzD,QAAI,CAACT,GAAS,WAAW,OAAO,iBAAmB;AACjD,aAAO,MAAM,OAAO,qBAAqBtC,CAAK;AAEhD,UAAMvF,IAAW,IAAI,eAAesI,EAAc;AAClD,WAAAtI,EAAS,QAAQ6H,GAAS,OAAO,GAC1B,MAAM;AACX,aAAO,qBAAqBtC,CAAK,GACjCvF,EAAS,WAAA;AAAA,IACX;AAAA,EACF,GAAG,CAACnH,GAAMiM,GAAWwD,EAAc,CAAC,GAEpCjQ,EAAU,MACD,MAAM;AACX,IAAIwE,EAAgB,WAClB,aAAaA,EAAgB,OAAO;AAAA,EAExC,GACC,CAAA,CAAE,GAELxE,EAAU,MAAM;AACd,QAAI,CAACQ;AACH;AAEF,UAAMgQ,IAA0B,CAACtS,MAAsB;;AACrD,YAAM4J,KAAS5J,EAAM;AACrB,OACEgI,KAAAqJ,EAAW,YAAX,QAAArJ,GAAoB,SAAS4B,QAC7BqI,KAAAX,GAAS,YAAT,QAAAW,GAAkB,SAASrI,OAI7BwI,GAAA;AAAA,IACF;AACA,oBAAS,iBAAiB,aAAaE,CAAuB,GACvD,MACL,SAAS,oBAAoB,aAAaA,CAAuB;AAAA,EACrE,GAAG,CAACF,IAAY9P,CAAI,CAAC;AAErB,QAAMiQ,KAAc,CAACC,MAAmB;AACtC,UAAMX,IAAO,IAAI,KAAK5I,GAAUE,IAAYqJ,GAAQ,CAAC;AACrD,IAAAtJ,EAAY2I,EAAK,aAAa,GAC9BzI,EAAayI,EAAK,UAAU;AAAA,EAC9B,GAEM/H,KAAiB,CAACqF,MACtBuC,MAAe,QAAQvC,IAAOuC,IAE1Be,KAAiB,CAACtD,GAAclB,GAAcC,OAAmB;AACrE,QAAIyD,KAAoB;AACtB,aAAO;AAET,UAAMlC,KAAYD,GAAqBL,GAAMlB,GAAMC,IAAQ,IAAI;AAC/D,WAAOuB,MAAa,QAAQA,KAAYkC;AAAA,EAC1C,GAEMe,IAAU,MAAM;AACpB,UAAMC,IAAiBnD;AAAA,MACrBqB;AAAA,MACAE;AAAA,MACAE;AAAA,MACA1C,MAAc,WAAW,OAAO4C;AAAA,IAAA;AAElC,IAAIQ,KAAoB,QAAQgB,KAAkB,QAC5CA,IAAiBhB,MAIvB7Q;AAAA,MACEsO;AAAA,QACEyB;AAAA,QACAE;AAAA,QACAE;AAAA,QACA1C,MAAc,WAAW,OAAO4C;AAAA,MAAA;AAAA,IAClC,GAEFkB,GAAA;AAAA,EACF,GAEMO,KAAc,MAAM;AACxB,UAAMC,wBAAU,KAAA;AAChB,IAAA/B,EAAa5B,GAAW2D,CAAG,CAAC;AAC5B,UAAMC,IAAWlO,GAAIiO,EAAI,SAAA,CAAU,GAC7BE,KAAanO,GAAIiO,EAAI,WAAA,CAAY,GACjCG,KAAapO,GAAIiO,EAAI,WAAA,CAAY;AACvC,IAAA7B,EAAa8B,CAAQ,GACrB5B,EAAe6B,EAAU,GACzB3B,EAAe4B,EAAU,GACzB9J,EAAY2J,EAAI,aAAa,GAC7BzJ,EAAayJ,EAAI,UAAU;AAAA,EAC7B;AAEA,SACEvS,gBAAAA,OAAC,SAAI,KAAK+Q,GAAY,WAAWxT,EAAG,YAAYW,CAAS,GACvD,UAAA;AAAA,IAAAuB,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,cAAY,GAAGa,CAAK;AAAA,QACpB,WAAU;AAAA,QACV,OAAA/F;AAAA,QACA,UAAU,CAACmF,MAAUc,EAASd,EAAM,OAAO,KAAK;AAAA,QAChD,UAAAU;AAAA,QACA,UAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAEZJ,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,KAAKkH;AAAA,QACL,cAAY5G;AAAA,QACZ,UAAAF;AAAA,QACA,SAAS,MAAM;AACb,UAAIA,MAGA4B,IACF8P,GAAA,IAEAD,GAAA;AAAA,QAEJ;AAAA,QACA,WAAWtU;AAAA,UACT;AAAA,UACAE,GAAa;AAAA,UACb2C,IACI,2IACA4B,IACE,oFACA;AAAA,QAAA;AAAA,QAGR,UAAA;AAAA,UAAAvC,gBAAAA,EAAAA,IAACwM,IAAA,EAAS,MAAM,IAAI,WAAU,uDAAsD;AAAA,UACpFxM,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWlC;AAAA,gBACT;AAAA,gBACA+N,KAAe,mCAAmC;AAAA,cAAA;AAAA,cAGnD,UAAAA,MAAgBhG;AAAA,YAAA;AAAA,UAAA;AAAA,UAEnB7F,gBAAAA,EAAAA,IAACkT,IAAA,EAAM,MAAM,IAAI,WAAU,sDAAA,CAAsD;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGlF3Q,IACGkB;AAAA,MACElD,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAKgR;AAAA,UACL,+BAA2B;AAAA,UAC3B,WAAU;AAAA,UACV,OAAO;AAAA,YACL,GAAGE;AAAA,YACH,WAAWpL,IACPkB,MAAkB,OAChB,iDACA,8CACFA,MAAkB,OAChB,wCACA;AAAA,YACN,iBAAiBA,MAAkB,OAAO,WAAW;AAAA,UAAA;AAAA,UAGvD,UAAA;AAAA,YAAAhH,gBAAAA,EAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAWzC;AAAA,kBACT;AAAA,kBACA0Q,MAAc,WACV,wCACA;AAAA,gBAAA;AAAA,gBAGN,UAAA;AAAA,kBAAAjO,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,OACb,UAAA;AAAA,oBAAAA,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,sBAAAP,gBAAAA,EAAAA;AAAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS,MAAMwS,GAAY,EAAE;AAAA,0BAC7B,WAAU;AAAA,0BAEV,UAAAxS,gBAAAA,EAAAA,IAAC+M,IAAA,EAAY,MAAM,GAAA,CAAI;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEzBxM,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,4DACZ,UAAA;AAAA,wBAAA2I;AAAA,wBAAS;AAAA,wBAAE3E,GAAO6E,CAAS;AAAA,sBAAA,GAC9B;AAAA,sBACApJ,gBAAAA,EAAAA;AAAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS,MAAMwS,GAAY,CAAC;AAAA,0BAC5B,WAAU;AAAA,0BAEV,UAAAxS,gBAAAA,EAAAA,IAACgN,IAAA,EAAa,MAAM,GAAA,CAAI;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAC1B,GACF;AAAA,oBACAhN,gBAAAA,MAAC,OAAA,EAAI,WAAU,mGACZ,aAAS,IAAI,CAACmT,MACbnT,gBAAAA,EAAAA,IAAC,SAAkB,WAAU,UAC1B,UAAAmT,KADOA,CAEV,CACD,GACH;AAAA,0CACC,OAAA,EAAI,WAAU,gCACZ,UAAAjH,GAAM,IAAI,CAACoB,MAAS;AACnB,4BAAMQ,IAAWR,EAAK,SAASwD,GACzBsC,KAAerJ,GAAeuD,EAAK,IAAI;AAC7C,6BACEtN,gBAAAA,EAAAA;AAAAA,wBAAC;AAAA,wBAAA;AAAA,0BAEC,MAAK;AAAA,0BACL,cAAY,QAAQsN,EAAK,IAAI;AAAA,0BAC7B,UAAU8F;AAAA,0BACV,SAAS,MAAMrC,EAAazD,EAAK,IAAI;AAAA,0BACrC,WAAWxP;AAAA,4BACT;AAAA,4BACA,CAACwP,EAAK,WAAW;AAAA,4BACjB8F,MACE;AAAA,4BACF9F,EAAK,WACH,CAACQ,KACD,CAACsF,MACD;AAAA,4BACFtF,KACE;AAAA,0BAAA;AAAA,0BAGH,UAAAR,EAAK;AAAA,wBAAA;AAAA,wBAlBDA,EAAK;AAAA,sBAAA;AAAA,oBAqBhB,CAAC,EAAA,CACH;AAAA,kBAAA,GACF;AAAA,kBAEAtN,gBAAAA,EAAAA;AAAAA,oBAACiO;AAAA,oBAAA;AAAA,sBACC,MAAM+C;AAAA,sBACN,QAAQE;AAAA,sBACR,QAAQE;AAAA,sBACR,cAAcH;AAAA,sBACd,gBAAgBE;AAAA,sBAChB,gBAAgBE;AAAA,sBAChB,WAAA7C;AAAA,sBACA,YAAAC;AAAA,sBACA,gBAAgB,CAACP,MACfwE,GAAe5B,GAAW5C,GAAM,IAAI;AAAA,sBAEtC,kBAAkB,CAACC,MACjBuE,GAAe5B,GAAWE,GAAW7C,CAAM;AAAA,sBAE7C,WAAU;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACZ;AAAA,cAAA;AAAA,YAAA;AAAA,YAGF5N,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2HACb,UAAA;AAAA,cAAAP,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM;AACb,oBAAAe,EAAS,EAAE,GACXsR,GAAA;AAAA,kBACF;AAAA,kBACA,WAAU;AAAA,kBACX,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGD9R,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,gBAAAP,gBAAAA,EAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS6S;AAAA,oBACT,WAAU;AAAA,oBACX,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGD7S,gBAAAA,EAAAA,IAACK,MAAO,MAAK,UAAS,MAAK,MAAK,SAASsS,GAAS,UAAA,KAAA,CAElD;AAAA,cAAA,EAAA,CACF;AAAA,YAAA,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,SAAS;AAAA,IAAA,IAEX;AAAA,EAAA,GACN;AAEJ,GCxkBMtQ,KACJ,4HAEIgR,KAAsB,CAACC,MAC3B,OAAO;AAAA,EACL,OAAO,QAAQA,KAAc,CAAA,CAAE,EAAE,IAAI,CAAC,CAAC1Z,GAAKkB,CAAK,MAAM,CAAC,QAAQlB,CAAG,IAAIkB,CAAK,CAAC;AAC/E,GAEWyY,KAAgC,CAAC;AAAA,EAC5C,MAAAhR;AAAA,EACA,gBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAA9F;AAAA,EACA,UAAA6W;AAAA,EACA,WAAA7Q;AAAA,EACA,kBAAAC,IAAmB;AAAA,EACnB,gBAAAC,IAAiB;AAAA,EACjB,qBAAAC,IAAsB;AAAA,EACtB,uBAAA2Q;AAAA,EACA,qBAAAC;AACF,MAAM;AACJ,QAAM,CAAC3Q,GAASC,CAAU,IAAItD,EAAS6C,CAAI,GACrC,CAACU,GAASC,CAAU,IAAIxD,EAAS,EAAK,GACtC,CAACyD,GAAgBC,CAAiB,IAAI1D,EAA0B/C,CAAQ;AAE9E,EAAAoF,EAAU,MAAM;AACd,IAAIQ,KACFS,EAAW,EAAI,GACfE,EAAW,EAAK,GAChBE,EAAkBzG,CAAQ,KACjBoG,KACTG,EAAW,EAAI;AAAA,EAEnB,GAAG,CAACvG,GAAUoG,GAASR,CAAI,CAAC,GAE5BR,EAAU,MAAM;AACd,IAAIQ,KAAQ5F,KAAY,QACtByG,EAAkBzG,CAAQ;AAAA,EAE9B,GAAG,CAACA,GAAU4F,CAAI,CAAC;AAEnB,QAAMe,IAAqBC;AAAA,IACzB,CAACtD,MAAgD;AAC/C,MAAIA,EAAM,WAAWA,EAAM,iBAAiB,CAACgD,MAE7CD,EAAW,EAAK,GAChBE,EAAW,EAAK,GAChBE,EAAkB,IAAI,GACtBX,KAAA,QAAAA;AAAA,IACF;AAAA,IACA,CAACQ,GAASR,CAAQ;AAAA,EAAA;AAGpB,MAAI,CAACM,KAAW,OAAO,WAAa,IAAa,QAAO;AAExD,QAAMS,IAAkBP,IAAUE,IAAiBxG;AAEnD,SAAO8G;AAAA,IACLzD,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,uBAAqB2C,KAAa6Q;AAAA,QAClC,qBAAiB;AAAA,QACjB,WAAW,GAAGnR,EAAoB,IAAIY,IAAU,yDAAyD,6CAA6C,IAAIL,CAAgB,GAAG,KAAA;AAAA,QAC7K,SAASE,IAAsBN,IAAiB;AAAA,QAChD,gBAAgBc;AAAA,QACf,GAAG+P,GAAoBI,CAAqB;AAAA,QAE7C,UAAAzT,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAawT;AAAA,YACb,qBAAiB;AAAA,YACjB,WAAW,qCAAqCvQ,IAAU,sDAAsD,0CAA0C,IAAIJ,CAAc,GAAG,KAAA;AAAA,YAC/K,SAAS,CAAC5C,MAAUA,EAAM,gBAAA;AAAA,YACzB,GAAGoT,GAAoBK,CAAmB;AAAA,YAE1C,UAAAlQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,EAAA;AAEb,GC3DMmQ,KAAyB,KACzBC,KAA0B,IAC1BC,KAAsB,kCAGfC,KAA4C,CAAC;AAAA,EACxD,SAAAC;AAAA,EACA,UAAApX;AAAA,EACA,WAAA8B;AAAA,EACA,eAAAuV;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,cAAAC,IAAeP;AAAA,EACf,UAAAQ,IAAW;AAAA,EACX,cAAAC;AACF,MAAM;AACJ,QAAMC,IAASjT,GAAA,GACT,CAACkT,GAAOC,CAAQ,IAAI7U,EAA4B,QAAQ,GACxD,CAAC8U,GAAWC,CAAY,IAAI/U,EAA8B;AAAA,IAC9D,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK;AAAA,EAAA,CACN,GACKgV,IAAgBxT,GAAsC,IAAI,GAC1DyT,IAAezT,GAAsC,IAAI,GACzD0T,IAAe1T,GAAuB,IAAI,GAC1C2T,IAAU3T,GAAuB,IAAI,GACrC4T,IAAoB5T,GAA2B,IAAI,GACnD6B,IAAUuR,MAAU,UACpBS,IAAcT,MAAU,aAAaA,MAAU,QAE/CU,IAAkBzR,EAAY,MAAM;AACxC,IAAImR,EAAc,YAChB,aAAaA,EAAc,OAAO,GAClCA,EAAc,UAAU;AAAA,EAE5B,GAAG,CAAA,CAAE,GAECO,IAAiB1R,EAAY,MAAM;AACvC,IAAIoR,EAAa,YACf,aAAaA,EAAa,OAAO,GACjCA,EAAa,UAAU;AAAA,EAE3B,GAAG,CAAA,CAAE,GAECO,IAAW3R,EAAY,MAAM;;AAGjC,QAFAyR,EAAA,GACAC,EAAA,GACId,GAAU;AACZ,YAAMgB,IAAgB,SAAS;AAC/B,MAAAL,EAAkB,UAChBK,aAAyB,iBACzBlN,IAAA2M,EAAa,YAAb,QAAA3M,EAAsB,SAASkN,MAC3BA,MACCjD,IAAA0C,EAAa,YAAb,gBAAA1C,EAAsB;AAAA,QACrB;AAAA,YACG;AAAA,IACb;AACA,IAAAqC,EAAS,SAAS,GAClBH,KAAA,QAAAA,EAAe,KACf,OAAO,cAAc,IAAI,YAAYP,IAAqB,EAAE,QAAQQ,EAAA,CAAQ,CAAC;AAAA,EAC/E,GAAG,CAACW,GAAiBC,GAAgBZ,GAAQF,GAAUC,CAAY,CAAC,GAE9DgB,IAAuB7R,EAAY,MAAM;AAC7C,IAAAyR,EAAA,GACAC,EAAA,GACAV,EAAS,QAAQ,GACjBH,KAAA,QAAAA,EAAe;AAAA,EACjB,GAAG,CAACY,GAAiBC,GAAgBb,CAAY,CAAC,GAE5CiB,IAAY9R,EAAY,MAAM;;AAClC,IAAAyR,EAAA,GACAC,EAAA,GACAV,EAAS,SAAS,GAClBH,KAAA,QAAAA,EAAe,KACXD,OACFlM,IAAA6M,EAAkB,YAAlB,QAAA7M,EAA2B,UAE7ByM,EAAc,UAAU,WAAW,MAAM;AACvC,MAAAH,EAAS,QAAQ,GACjBG,EAAc,UAAU;AAAA,IAC1B,GAAGR,CAAY;AAAA,EACjB,GAAG;AAAA,IACDc;AAAA,IACAC;AAAA,IACAf;AAAA,IACAC;AAAA,IACAC;AAAA,EAAA,CACD,GAEKkB,IAAa/R,EAAY,MAAM;AACnC,QAAIwR,GAAa;AACf,MAAAM,EAAA;AACA;AAAA,IACF;AACA,IAAAH,EAAA;AAAA,EACF,GAAG,CAACG,GAAWN,GAAaG,CAAQ,CAAC,GAE/BK,IAAehS;AAAA,IACnB,MAAA;;AACE,mBAAM;AAAA,UACJ0E,IAAA4M,EAAQ,YAAR,gBAAA5M,EAAiB,iBAA8B,yBAC7C,CAAA;AAAA,MAAC,EACH;AAAA,QACA,CAAC+F,MACC,CAACA,EAAK,aAAa,UAAU,KAC7BA,EAAK,aAAa,eAAe,MAAM;AAAA,MAAA;AAAA;AAAA,IAE7C,CAAA;AAAA,EAAC,GAGGwH,IAAoBjS;AAAA,IACxB,CAACtD,MAA+C;;AAC9C,UAAI,CAACkU,EAAU;AACf,UAAIlU,EAAM,QAAQ,UAAU;AAC1B,QAAAA,EAAM,eAAA,GACNA,EAAM,gBAAA,GACNoV,EAAA;AACA;AAAA,MACF;AAEA,YAAMI,IAAYF,EAAA;AAClB,UAAIE,EAAU,WAAW,EAAG;AAE5B,YAAMC,IAAeD,EAAU;AAAA,QAC7B,SAAS;AAAA,MAAA;AAEX,UAAIE,IAA2B;AAC/B,cAAQ1V,EAAM,KAAA;AAAA,QACZ,KAAK;AACH,UAAA0V,IAAYD,IAAe,IAAI,KAAKA,IAAe,KAAKD,EAAU;AAClE;AAAA,QACF,KAAK;AACH,UAAAE,IACED,IAAe,IACXD,EAAU,SAAS,KAClBC,IAAe,IAAID,EAAU,UAAUA,EAAU;AACxD;AAAA,QACF,KAAK;AACH,UAAAE,IAAY;AACZ;AAAA,QACF,KAAK;AACH,UAAAA,IAAYF,EAAU,SAAS;AAC/B;AAAA,QACF;AACE;AAAA,MAAA;AAEJ,MAAAxV,EAAM,eAAA,IACNgI,IAAAwN,EAAUE,CAAS,MAAnB,QAAA1N,EAAsB;AAAA,IACxB;AAAA,IACA,CAACoN,GAAWE,GAAcpB,CAAQ;AAAA,EAAA,GAG9ByB,IAAqBrS,EAAY,MAAM;;AAC3C,QAAI,CAACqR,EAAa,QAAS;AAE3B,UAAMiB,IAAcjB,EAAa,QAAQ,sBAAA,GACnCkB,MAAoB7N,KAAA4M,EAAQ,YAAR,gBAAA5M,GAAiB,gBAAe,KACpD8N,MAAa7D,KAAA2C,EAAQ,YAAR,gBAAA3C,GAAiB,iBAAgB,KAC9CrK,IAAgB,OAAO,YACvBmO,IAAiB,OAAO,aACxBC,IAAkB,GAClBC,KAAc,GACdC,KAAY,KAAK;AAAA,MACrBL;AAAA,MACA,KAAK,IAAI,GAAGjO,IAAgBoO,IAAkB,CAAC;AAAA,IAAA,GAG3C5N,IACJ4L,MAAU,UAAU4B,EAAY,QAAQM,KAAYN,EAAY,MAC5DvN,IAAU,KAAK;AAAA,MACnB2N;AAAA,MACApO,IAAgBsO,KAAYF;AAAA,IAAA,GAExB1N,IAAO,KAAK;AAAA,MAChB,KAAK,IAAI0N,GAAiB5N,CAAa;AAAA,MACvCC;AAAA,IAAA;AAGF,QAAIF,IAAMyN,EAAY,SAASK;AAC/B,QAAI9N,IAAM2N,IAAaC,IAAiBC,GAAiB;AACvD,YAAMG,IAAeP,EAAY,MAAMK,KAAcH;AACrD,MAAA3N,IACEgO,KAAgBH,IACZG,IACA,KAAK,IAAIH,GAAiBD,IAAiBD,IAAaE,CAAe;AAAA,IAC/E;AAEA,IAAAxB,EAAa;AAAA,MACX,MAAAlM;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAAH;AAAA,MACA,UAAU,gBAAgB6N,IAAkB,CAAC;AAAA,IAAA,CAC9C;AAAA,EACH,GAAG,CAAChC,CAAK,CAAC;AAEV,SAAAlS,EAAU,MAAM;AACd,UAAMsU,IAAwB,CAACpW,MAAiB;AAC9C,YAAMqW,IAAgBrW,EAA8B;AACpD,MAAIqW,KAAgBA,MAAiBjC,KACnCe,EAAA;AAAA,IAEJ;AACA,kBAAO,iBAAiBvB,IAAqBwC,CAAqB,GAC3D,MAAM;AACX,aAAO,oBAAoBxC,IAAqBwC,CAAqB;AAAA,IACvE;AAAA,EACF,GAAG,CAACjB,GAAsBf,CAAM,CAAC,GAEjCtS,EAAU,MAAM;AACd,QAAI,CAACgB,EAAS;AACd,UAAMwT,IAAqB,CAACtW,MAAsB;AAChD,MAAI4U,EAAQ,WAAWA,EAAQ,QAAQ,SAAS5U,EAAM,MAAc,KAIlE2U,EAAa,WACb,CAACA,EAAa,QAAQ,SAAS3U,EAAM,MAAc,KAEnDoV,EAAA;AAAA,IAEJ,GACMmB,IAAe,CAACvW,MAAyB;AAC7C,MAAIA,EAAM,QAAQ,YAChBoV,EAAA;AAAA,IAEJ;AACA,oBAAS,iBAAiB,aAAakB,CAAkB,GACzD,SAAS,iBAAiB,WAAWC,CAAY,GAC1C,MAAM;AACX,eAAS,oBAAoB,aAAaD,CAAkB,GAC5D,SAAS,oBAAoB,WAAWC,CAAY;AAAA,IACtD;AAAA,EACF,GAAG,CAACnB,GAAWtS,CAAO,CAAC,GAEvB0T,GAAgB,MAAM;;AACpB,IAAK1T,MACL6S,EAAA,GACIzB,KAAYG,MAAU,eACxBrM,IAAAsN,EAAA,EAAe,CAAC,MAAhB,QAAAtN,EAAmB;AAAA,EAEvB,GAAG,CAACsN,GAAcpB,GAAUpR,GAASuR,GAAOsB,CAAkB,CAAC,GAE/D7T,EAAU,MAAM;AACd,QAAI,GAACgB,KAAWuR,MAAU;AAC1B,aAAAK,EAAa,UAAU,WAAW,MAAM;AACtC,QAAAJ,EAAS,MAAM,GACfI,EAAa,UAAU;AAAA,MACzB,GAAGf,EAAuB,GACnB,MAAM;AACX,QAAAqB,EAAA;AAAA,MACF;AAAA,EACF,GAAG,CAAClS,GAASuR,GAAOW,CAAc,CAAC,GAEnClT,EAAU,MAAM;AACd,QAAKgB;AACL,oBAAO,iBAAiB,UAAU6S,GAAoB,EAAI,GAC1D,OAAO,iBAAiB,UAAUA,CAAkB,GAE7C,MAAM;AACX,eAAO,oBAAoB,UAAUA,GAAoB,EAAI,GAC7D,OAAO,oBAAoB,UAAUA,CAAkB;AAAA,MACzD;AAAA,EACF,GAAG,CAAC7S,GAAS6S,CAAkB,CAAC,GAEhC7T,EAAU,MACD,MAAM;AACX,IAAAiT,EAAA,GACAC,EAAA;AAAA,EACF,GACC,CAACD,GAAiBC,CAAc,CAAC,GAGlC1U,gBAAAA,OAAC,SAAI,KAAKqU,GAAc,WAAW9W,EAAG,YAAYW,CAAS,GACxD,UAAA;AAAA,IAAAsV,EAAQ;AAAA,MACP,MAAMgB;AAAA,MACN,QAAAV;AAAA,MACA,OAAOgB;AAAA,MACP,QAAQC;AAAA,IAAA,CACT;AAAA,IAEAvS,KACCU;AAAA,MACAzD,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,IAAIqU;AAAA,UACJ,MAAMF,IAAW,SAAS;AAAA,UAC1B,oBAAkBA,IAAW,aAAa;AAAA,UAC1C,eAAY;AAAA,UACZ,cAAYG;AAAA,UACZ,KAAKO;AAAA,UACL,WAAWV,IAAWqB,IAAoB;AAAA,UAC1C,OAAOhB;AAAA,UACP,WAAU;AAAA,UAEV,UAAAxU,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWlC;AAAA,gBACT;AAAA,gBACAmW,MAAU,UAAU,qBAAqB;AAAA,gBACzCE,KAAY;AAAA,gBACZH;AAAA,cAAA;AAAA,cAEF,OAAO;AAAA,gBACL,WACEM,MAAU,YACN,6CACA;AAAA,cAAA;AAAA,cAGP,UAAA,OAAO3X,KAAa,aACjBA,EAAS,EAAE,MAAMoY,GAAa,OAAOM,EAAA,CAAW,IAChD1Y;AAAA,YAAA;AAAA,UAAA;AAAA,QACN;AAAA,MAAA;AAAA,MAEF,SAAS;AAAA,IAAA;AAAA,EACX,GACF;AAEJ,GCjUM+Z,KAAc,CAAC5b,MACfA,IAAQ,OAAa,GAAGA,CAAK,OAC7BA,IAAQ,OAAO,OAAa,IAAIA,IAAQ,MAAM,QAAQ,CAAC,CAAC,QACxDA,IAAQ,OAAO,OAAO,OACjB,IAAIA,IAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC,QAErC,IAAIA,IAAQ,OAAO,OAAO,MAAM,QAAQ,CAAC,CAAC,OAG7C6b,KAAa,CAACC,MAClB,GAAGA,EAAK,IAAI,IAAIA,EAAK,IAAI,IAAIA,EAAK,YAAY,IAE1CC,KAAc,CAACD,GAAYE,MAAoB;AACnD,MAAI,CAACA,EAAQ,QAAO;AACpB,QAAMC,IAAWH,EAAK,KAAK,YAAA,GACrBI,IAAWJ,EAAK,KAAK,YAAA;AAC3B,SAAOE,EACJ,MAAM,GAAG,EACT,IAAI,CAAC9I,MAASA,EAAK,KAAA,EAAO,YAAA,CAAa,EACvC,OAAO,OAAO,EACd,KAAK,CAACiJ,MACDA,EAAK,WAAW,GAAG,IAAUF,EAAS,SAASE,CAAI,IACnDA,EAAK,SAAS,IAAI,IAAUD,EAAS,WAAWC,EAAK,MAAM,GAAG,EAAE,CAAC,IAC9DD,MAAaC,CACrB;AACL,GAEaC,KAAa9Z,GAAM;AAAA,EAC9B,CACE;AAAA,IACE,OAAAtC;AAAA,IACA,UAAAiG;AAAA,IACA,QAAA+V;AAAA,IACA,UAAAK,IAAW;AAAA,IACX,UAAAC;AAAA,IACA,SAAAC;AAAA,IACA,cAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAA5W,IAAW;AAAA,IACX,SAAA6W,IAAU;AAAA,IACV,MAAAC;AAAA,IACA,cAAAC,IAAe;AAAA,IACf,WAAAC,IAAY;AAAA,IACZ,UAAAC;AAAA,IACA,gBAAAC,IAAiB;AAAA,IACjB,WAAApZ;AAAA,IACA,GAAG5C;AAAA,EAAA,GAEL0D,MACG;AACH,UAAM,CAACuY,GAAYC,CAAa,IAAIrY,EAAS,EAAK,GAC5CuB,IAAWC,GAAyB,IAAI,GACxC8W,IAAUR,MAAY,WACtBS,IAAoBd,IAAYC,KAAY,OAAO,oBAAqB,GAExEc,IAAW,CAACC,MAAqB;AACrC,UAAIxX,KAAYgX,KAAaQ,EAAS,WAAW,EAAG;AAEpD,YAAMC,IAAe,IAAI,IAAItd,EAAM,IAAI6b,EAAU,CAAC,GAC5C0B,IAAmB,CAAA,GACnBC,IAA8B,CAAA;AAEpC,iBAAW1B,KAAQuB,GAAU;AAC3B,YAAI,CAACtB,GAAYD,GAAME,CAAM,GAAG;AAC9B,UAAAwB,EAAW,KAAK,EAAE,MAAA1B,GAAM,QAAQ,QAAQ,SAAS,YAAY;AAC7D;AAAA,QACF;AACA,YAAIS,MAAY,UAAaT,EAAK,OAAOS,GAAS;AAChD,UAAAiB,EAAW,KAAK;AAAA,YACd,MAAA1B;AAAA,YACA,QAAQ;AAAA,YACR,SAAS,YAAYF,GAAYW,CAAO,CAAC;AAAA,UAAA,CAC1C;AACD;AAAA,QACF;AACA,cAAMkB,IAAgBjB,KAAA,gBAAAA,EAAeV;AACrC,YAAI2B,GAAe;AACjB,UAAAD,EAAW,KAAK,EAAE,MAAA1B,GAAM,QAAQ,UAAU,SAAS2B,GAAe;AAClE;AAAA,QACF;AACA,cAAM3e,IAAM+c,GAAWC,CAAI;AAC3B,YAAI,CAAAwB,EAAa,IAAIxe,CAAG,GACxB;AAAA,eAAKud,IAAWrc,EAAM,SAAS,KAAKud,EAAS,UAAUJ,GAAmB;AACxE,YAAAK,EAAW,KAAK;AAAA,cACd,MAAA1B;AAAA,cACA,QAAQ;AAAA,cACR,SAAS,QAAQqB,CAAiB;AAAA,YAAA,CACnC;AACD;AAAA,UACF;AACA,UAAAG,EAAa,IAAIxe,CAAG,GACpBye,EAAS,KAAKzB,CAAI;AAAA;AAAA,MACpB;AAEA,MAAIyB,EAAS,SAAS,KACpBtX,EAASoW,IAAW,CAAC,GAAGrc,GAAO,GAAGud,CAAQ,IAAIA,EAAS,MAAM,GAAG,CAAC,CAAC,GAEhEC,EAAW,SAAS,MAAGf,KAAA,QAAAA,EAAWe;AAAA,IACxC,GAEME,IAAa,CAAC5B,MAAe;AACjC,YAAMhd,IAAM+c,GAAWC,CAAI;AAC3B,MAAA7V,EAASjG,EAAM,OAAO,CAACkT,MAAS2I,GAAW3I,CAAI,MAAMpU,CAAG,CAAC;AAAA,IAC3D,GAEM6e,IACJb,MAAa,SAAY,SAAY,KAAK,IAAI,KAAK,KAAK,IAAI,GAAGA,CAAQ,CAAC;AAE1E,WACErX,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAhB;AAAA,QACA,WAAWzB,EAAG,gCAAgCka,IAAU,UAAU,SAASvZ,CAAS;AAAA,QACnF,GAAG5C;AAAA,QAEJ,UAAA;AAAA,UAAAmE,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAUW,KAAYgX;AAAA,cACtB,cAAYE;AAAA,cACZ,SAAS,MAAA;;AAAM,wBAAA5P,IAAAhH,EAAS,YAAT,gBAAAgH,EAAkB;AAAA;AAAA,cACjC,aAAa,CAAChI,MAAU;AACtB,gBAAAA,EAAM,eAAA,GACF,CAACU,KAAY,CAACgX,OAAyB,EAAI;AAAA,cACjD;AAAA,cACA,YAAY,CAAC1X,MAAUA,EAAM,eAAA;AAAA,cAC7B,aAAa,CAACA,MAAU;AACtB,gBAAKA,EAAM,cAAc,SAASA,EAAM,aAA4B,KAClE8X,EAAc,EAAK;AAAA,cAEvB;AAAA,cACA,QAAQ,CAAC9X,MAAU;AACjB,gBAAAA,EAAM,eAAA,GACN8X,EAAc,EAAK,GACnBG,EAAS,MAAM,KAAKjY,EAAM,aAAa,KAAK,CAAC;AAAA,cAC/C;AAAA,cACA,WAAWnC;AAAA,gBACT;AAAA,gBACAka,IACI,uCACA;AAAA,gBACJF,IACI,+GACA;AAAA,cAAA;AAAA,cAGL,UAAAE,IACCzX,gBAAAA,OAAC,QAAA,EAAK,WAAU,+DACb,UAAA;AAAA,gBAAAoX,IACC3X,gBAAAA,EAAAA,IAAC0Y,IAAA,EAAa,MAAM,IAAI,WAAU,wBAAA,CAAwB,IAE1D1Y,gBAAAA,EAAAA,IAAC2Y,IAAA,EAAY,MAAM,IAAI,WAAU,YAAW;AAAA,gBAE9CpY,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,qBACd,UAAA;AAAA,kBAAAP,gBAAAA,EAAAA,IAAC,UAAK,WAAU,kBACb,cACG,WACA8X,IACE,YACA,gBAAA,CACR;AAAA,kBACCL,IACCzX,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,mFACb,aACH,IACE;AAAA,gBAAA,EAAA,CACN;AAAA,cAAA,EAAA,CACF,IAEAO,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,8BACd,UAAA;AAAA,gBAAAP,gBAAAA,EAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAWlC;AAAA,sBACT;AAAA,sBACAga,KAAc;AAAA,oBAAA;AAAA,oBAGf,UAAAH,IACC3X,gBAAAA,EAAAA,IAAC0Y,IAAA,EAAa,MAAM,IAAI,WAAU,eAAA,CAAe,IAEjD1Y,gBAAAA,EAAAA,IAAC2Y,IAAA,EAAY,MAAM,GAAA,CAAI;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAG3B3Y,gBAAAA,EAAAA,IAAC,UAAK,WAAU,yEACb,cACG,WACA8X,IACE,YACA,kBAAA,CACR;AAAA,gBACCL,IACCzX,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,iEACb,aACH,IACE;AAAA,cAAA,EAAA,CACN;AAAA,YAAA;AAAA,UAAA;AAAA,UAGJA,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKiB;AAAA,cACL,MAAK;AAAA,cACL,UAAAkW;AAAA,cACA,QAAAL;AAAA,cACA,UAAUnW,KAAYgX;AAAA,cACtB,WAAU;AAAA,cACV,eAAY;AAAA,cACZ,UAAU;AAAA,cACV,UAAU,CAAC1X,MAAU;AACnB,gBAAAiY,EAAS,MAAM,KAAKjY,EAAM,OAAO,SAAS,CAAA,CAAE,CAAC,GAC7CA,EAAM,OAAO,QAAQ;AAAA,cACvB;AAAA,YAAA;AAAA,UAAA;AAAA,UAGD0X,KAAac,MAAuB,SACnCzY,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAK;AAAA,cACL,cAAW;AAAA,cACX,iBAAe;AAAA,cACf,iBAAe;AAAA,cACf,iBAAe,KAAK,MAAMyY,CAAkB;AAAA,cAE5C,UAAAzY,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,EAAE,OAAO,GAAGyY,CAAkB,IAAA;AAAA,gBAAI;AAAA,cAAA;AAAA,YAC3C;AAAA,UAAA,IAEA;AAAA,UAEHf,KAAgB5c,EAAM,SAAS,IAC9BkF,gBAAAA,EAAAA,IAAC,SAAI,WAAWlC,EAAG,oDAAoDka,IAAU,gBAAgB,WAAW,GACzG,UAAAld,EAAM,IAAI,CAAC8b,MACVrW,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAWzC;AAAA,gBACT;AAAA,gBACAka,IAAU,kCAAkC,GAAGha,GAAa,IAAI;AAAA,cAAA;AAAA,cAGlE,UAAA;AAAA,gBAAAgC,gBAAAA,EAAAA,IAAC,UAAK,WAAU,0IACd,gCAAC4Y,IAAA,EAAS,MAAM,IAAI,EAAA,CACtB;AAAA,gBACArY,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,4BACd,UAAA;AAAA,kBAAAP,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,yEACb,UAAA4W,EAAK,MACR;AAAA,wCACC,QAAA,EAAK,WAAU,uEACb,UAAAF,GAAYE,EAAK,IAAI,EAAA,CACxB;AAAA,gBAAA,GACF;AAAA,gBACA5W,gBAAAA,EAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,UAAUW,KAAYgX;AAAA,oBACtB,cAAY,MAAMf,EAAK,IAAI;AAAA,oBAC3B,SAAS,MAAM4B,EAAW5B,CAAI;AAAA,oBAC9B,WAAU;AAAA,oBAEV,UAAA5W,gBAAAA,EAAAA,IAAC6Y,IAAA,EAAE,MAAM,GAAA,CAAI;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACf;AAAA,YAAA;AAAA,YAzBKlC,GAAWC,CAAI;AAAA,UAAA,CA2BvB,GACH,IACE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AAEAM,GAAW,cAAc;AChRzB,MAAM4B,KAID;AAAA,EACH,IAAI;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,EAAA;AAAA,EAET,IAAI;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,EAAA;AAAA,EAET,IAAI;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,EAAA;AAEX,GAEaC,KAAsC,CAAC;AAAA,EAClD,OAAAlY;AAAA,EACA,UAAAmY,IAAW;AAAA,EACX,OAAAC;AAAA,EACA,UAAAtc;AAAA,EACA,MAAA4B,IAAO;AAAA,EACP,WAAAE;AAAA,EACA,gBAAAya;AAAA,EACA,kBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,SAAA/X;AACF,MAAM;AACJ,QAAMF,IAAcC,GAAA,GACdiY,IAAUJ,IAAQ,GAAG9X,CAAW,WAAW,QAC3CmY,IAAU,EAAQL,GAClBM,IAAmC;AAAA,IACvC,IAAIlY;AAAA,IACJ,UAAA2X;AAAA,IACA,SAAAM;AAAA,IACA,gBAAgBA,KAAW;AAAA,IAC3B,oBAAoBD;AAAA,EAAA,GAEhB1T,IAAamT,GAAoBva,CAAI;AAE3C,gCACG,OAAA,EAAI,WAAWT,EAAG6H,EAAW,MAAMlH,CAAS,GAC3C,UAAA;AAAA,IAAA8B,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAASc;AAAA,QACT,WAAWvD;AAAA,UACT;AAAA,UACA6H,EAAW;AAAA,UACXuT;AAAA,QAAA;AAAA,QAGF,UAAA;AAAA,UAAAlZ,gBAAAA,EAAAA,IAAC,UAAM,UAAAa,EAAA,CAAM;AAAA,UACbb,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,eAAa,CAACgZ;AAAA,cACd,WAAWlb;AAAA,gBACT;AAAA,gBACAkb,IAAW,gBAAgB;AAAA,cAAA;AAAA,cAG5B,cAAW,MAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QACpB;AAAA,MAAA;AAAA,IAAA;AAAA,IAEFhZ,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAWmZ,GACb,UAAA,OAAOxc,KAAa,aAAaA,EAAS4c,CAAU,IAAI5c,EAAA,CAC3D;AAAA,IACCsc,KACCjZ,gBAAAA,EAAAA,IAAC,KAAA,EAAE,IAAIqZ,GAAS,WAAWvb,EAAG,oCAAoC6H,EAAW,OAAOyT,CAAc,GAC/F,UAAAH,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ,GCxFMO,KAA6C;AAAA,EACjD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,KAA6C;AAAA,EACjD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,KACJ,uTAEIC,KAAoB,CAACL,MACzBA,IACI,uIACA,8LAEAM,KAAyB,CAACN,MAC9BA,IACI,4JACA,mNAEOO,KAAQzc,GAAM;AAAA,EACzB,CACE;AAAA,IACE,MAAAmB,IAAO;AAAA,IACP,SAAA+a,IAAU;AAAA,IACV,QAAAQ;AAAA,IACA,QAAAC;AAAA,IACA,WAAAtb;AAAA,IACA,gBAAAub;AAAA,IACA,UAAArZ;AAAA,IACA,GAAG9E;AAAA,EAAA,GAEL0D,MAEIua,KAAUC,IAEVxZ,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWzC;AAAA,QACT;AAAA,QACAE,GAAa;AAAA,QACbyb,GAAgBlb,CAAI;AAAA,QACpBoC,IACI,2IACAiZ,GAAuBN,CAAO;AAAA,QAClC7a;AAAA,MAAA;AAAA,MAGD,UAAA;AAAA,QAAAqb,KACC9Z,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,yEACb,UAAA8Z,GACH;AAAA,QAEF9Z,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAAT;AAAA,YACA,UAAAoB;AAAA,YACA,WAAW7C;AAAA,cACT;AAAA,cACAkc;AAAA,YAAA;AAAA,YAED,GAAGne;AAAA,YACJ,cAAa;AAAA,UAAA;AAAA,QAAA;AAAA,QAEdke,KACC/Z,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,yEACb,UAAA+Z,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IAON/Z,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAT;AAAA,MACA,UAAAoB;AAAA,MACA,WAAW7C;AAAA,QACT4b;AAAA,QACA1b,GAAa;AAAA,QACbwb,GAAgBjb,CAAI;AAAA,QACpBob,GAAkBL,CAAO;AAAA,QACzB7a;AAAA,MAAA;AAAA,MAED,GAAG5C;AAAA,MACJ,cAAa;AAAA,IAAA;AAAA,EAAA;AAIrB;AAEAge,GAAM,cAAc;AC7Gb,SAASI,GACd9R,GACA+R,IAAoC,QAC5B;AAGR,SAAO,GADYA,MAAoB,UAAU,UAAU,MACvC,IAFH/R,IAAe,WAAW,KAEX;AAClC;ACMA,MAAMgS,KAA8B,KAkG9BC,KAA+C;AAAA,EACnD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEaC,KAAS,CAAqC;AAAA,EACzD,SAAAC;AAAA,EACA,MAAAlV,IAAO;AAAA,EACP,YAAAmV,IAAa;AAAA,EACb,aAAA1U,IAAc;AAAA,EACd,UAAAlF,IAAW;AAAA,EACX,OAAA7F;AAAA,EACA,wBAAA0f,IAAyB;AAAA,EACzB,oBAAAC,IAAqB,CAAC/M,MAAU,OAAOA,CAAK;AAAA,EAC5C,UAAA3M;AAAA,EACA,MAAAxC,IAAO;AAAA,EACP,WAAAE;AAAA,EACA,kBAAAic;AAAA,EACA,QAAAC;AAAA,EACA,cAAAC;AAAA,EACA,mBAAAC,IAAoB;AAAA,EACpB,WAAAC,IAAY;AAAA,EACZ,eAAAC,IAAgB;AAAA,EAChB,aAAAC,IAAc;AAAA,EACd,SAAAC,IAAU;AAAA,EACV,aAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,cAAA/G;AAAA,EACA,eAAAgH;AAAA,EACA,cAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,cAAchc;AAChB,MAAsB;AACpB,QAAM,CAACic,GAAQC,CAAS,IAAI9b,EAAS,EAAK,GACpC,CAAC2G,GAAgBC,CAAiB,IAAI5G,EAAS,EAAK,GACpD,CAAC+b,GAAiBC,CAAkB,IAAIhc,EAAS,EAAK,GACtD,CAACyI,GAAcwT,CAAe,IAAIjc,EAAS,EAAK,GAChD,CAACkc,GAAaC,EAAc,IAAInc,EAAS,EAAE,GAC3C,CAACoc,IAAkBC,CAAmB,IAAIrc,EAAS,EAAE,GACrD,CAAC2H,GAAeC,CAAgB,IAAI5H,EAA8B;AAAA,IACtE,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EAAA,CACT,GACKkV,IAAe1T,GAAuB,IAAI,GAC1C8a,KAAiB9a,GAAyB,IAAI,GAC9CwG,KAAYxG,GAAuB,IAAI,GACvCqF,IAAkBrF,GAAsC,IAAI,GAC5D+a,KAAuBf,KAAeU,GAGtCM,IAAiBzT,GAAa,MAC9BrD,MAAS,aAAmB,MAAM,QAAQtK,CAAK,IAAIA,IAAQ,CAAA,IAC3DA,KAAS,OAAa,CAAA,IACnB,CAACA,CAAU,GACjB,CAACsK,GAAMtK,CAAK,CAAC,GAGVqhB,KAAkB1T,GAAQ,MAAM;AACpC,QAAI,CAACsS,KAAiB,CAACkB,GAAsB,QAAO3B;AACpD,UAAM8B,IAAIH,GAAqB,YAAA;AAC/B,WAAO3B,EAAQ,OAAO,CAAC+B,MAAQA,EAAI,MAAM,YAAA,EAAc,SAASD,CAAC,CAAC;AAAA,EACpE,GAAG,CAACrB,GAAeT,GAAS2B,EAAoB,CAAC,GAE3CK,KAAoB/Y;AAAA,IACxB,CAACzI,MAAkB;AACjB,MAAIogB,MAAgB,UAClBW,GAAe/gB,CAAK,GAEtBqgB,KAAA,QAAAA,EAAiBrgB;AAAAA,IACnB;AAAA,IACA,CAACqgB,GAAgBD,CAAW;AAAA,EAAA,GAGxBvT,KAAyBpE,EAAY,MAAM;;AAC/C,QAAI,CAACqR,EAAa,QAAS;AAE3B,UAAMhN,IAAOgN,EAAa,QAAQ,sBAAA,GAC5B7M,IACJ,OACCwS,IAAa,KAAK,MAClBnV,MAAS,cAAc8W,EAAe,SAAS,IAAI,KAAK,KACzD,IACIlU,MACJC,KAAAP,GAAU,YAAV,gBAAAO,GAAmB,iBAAgBF,GAC/BG,KAAM,GACN+N,KAAkB,GAElBsG,KADa,OAAO,cAAc3U,EAAK,SACPI,GAChCI,KAAMmU,KACR,KAAK,IAAItG,IAAiBrO,EAAK,MAAMI,IAAiBE,EAAG,IACzD,KAAK,IAAI,OAAO,cAAc+N,IAAiBrO,EAAK,SAASM,EAAG,GAC9DsU,KAAiB,KAAK,IAAI,GAAG,OAAO,aAAavG,KAAkB,CAAC,GACpEwG,KAAe,KAAK,IAAI7U,EAAK,OAAO4U,EAAc,GAClDE,KAAW,KAAK;AAAA,MACpBD;AAAA,MACA,KAAK,IAAID,IAAgB,GAAG;AAAA,IAAA,GAExBG,KAAgB,KAAK;AAAA,MACzBD;AAAA,MACA,KAAK,IAAID,MAAcvK,KAAAxK,GAAU,YAAV,gBAAAwK,GAAmB,gBAAeuK,EAAY;AAAA,IAAA,GAEjElU,KAAO,KAAK;AAAA,MAChB,KAAK,IAAI0N,IAAiBrO,EAAK,IAAI;AAAA,MACnC,KAAK,IAAIqO,IAAiB,OAAO,aAAa0G,KAAgB1G,EAAe;AAAA,IAAA;AAG/E,IAAA0F,EAAgBY,EAAgB,GAChCjV,EAAiB;AAAA,MACf,UAAU;AAAA,MACV,KAAAc;AAAA,MACA,MAAAG;AAAA,MACA,OAAO;AAAA,MACP,UAAUkU;AAAA,MACV,UAAAC;AAAA,MACA,QAAQ;AAAA,IAAA,CACT;AAAA,EACH,GAAG,CAACtX,GAAMmV,GAAY2B,EAAe,MAAM,CAAC,GAGtC5S,KAAgB/F,EAAY,MAAM;AACtC,IAAIgD,EAAgB,WAAS,aAAaA,EAAgB,OAAO,GASjED,EAAkB,EAAI,GACtBC,EAAgB,UAAU,WAAW,MAAM;AACzC,MAAAiV,EAAU,EAAK,GACflV,EAAkB,EAAK,GACvBgW,GAAkB,EAAE,GACpBP,EAAoB,EAAE,GACtB3H,KAAA,QAAAA,EAAe;AAAA,IACjB,GAAG+F,EAA2B;AAAA,EAChC,GAAG,CAAC/F,GAAckI,EAAiB,CAAC,GAG9B/S,KAAyBhG,EAAY,MAAM;AAC/C,IAAIgD,EAAgB,WAAS,aAAaA,EAAgB,OAAO,GACjEiV,EAAU,EAAK,GACflV,EAAkB,EAAK,GACvBgW,GAAkB,EAAE,GACpBP,EAAoB,EAAE,GACtB3H,KAAA,QAAAA,EAAe;AAAA,EACjB,GAAG,CAACA,GAAckI,EAAiB,CAAC,GAG9BM,KAAerZ,EAAY,YAAY;AAE3C,QADIgD,EAAgB,WAAS,aAAaA,EAAgB,OAAO,GAC7DqU,GAAc;AAChB,MAAAc,EAAmB,EAAI;AACvB,UAAI;AACF,cAAMd,EAAA;AAAA,MACR,UAAA;AACE,QAAAc,EAAmB,EAAK;AAAA,MAC1B;AAAA,IACF;AACA,IAAAF,EAAU,EAAI,GACdlV,EAAkB,EAAK,GACvBgW,GAAkB,EAAE,GACpBP,EAAoB,EAAE,GACtB3H,KAAA,QAAAA,EAAe;AAAA,EACjB,GAAG,CAACwG,GAAcxG,GAAckI,EAAiB,CAAC,GAG5CO,KAAetZ;AAAA,IACnB,CAACuZ,MAAmB;AAClB,UAAI1X,MAAS;AACX,QAAArE,EAAS+b,CAAW,GACpBvT,GAAA;AAAA,WACK;AACL,cAAM4D,IAAa+O,EAAe,SAASY,CAAW;AACtD,QACE/b,EADEoM,IACO+O,EAAe,OAAO,CAACa,MAAMA,MAAMD,CAAW,IAE9C,CAAC,GAAGZ,GAAgBY,CAAW,CAFgB;AAAA,MAI5D;AAAA,IACF;AAAA,IACA,CAAC1X,GAAMrE,GAAUmb,GAAgB3S,EAAsB;AAAA,EAAA,GAInDyT,IAAmBzZ;AAAA,IACvB,CAACuZ,GAAgBlT,MAAwB;AACvC,MAAAA,EAAE,gBAAA,GACF7I,EAASmb,EAAe,OAAO,CAACa,MAAMA,MAAMD,CAAW,CAAC;AAAA,IAC1D;AAAA,IACA,CAAC/b,GAAUmb,CAAc;AAAA,EAAA,GAIrBe,KAAiB1Z,EAAY,MAAM;AACvC,IAAAxC,EAAS,CAAA,CAAE,GACX8a,GAAe,EAAE;AAAA,EACnB,GAAG,CAAC9a,CAAQ,CAAC;AAGb,EAAAgB,EAAU,MAAM;AACd,QAAI,CAACwZ,EAAQ;AACb,UAAM5R,IAAU,CAACC,MAAkB;;AACjC,YAAMC,IAASD,EAAE;AACjB,OAAI3B,KAAA2M,EAAa,YAAb,QAAA3M,GAAsB,SAAS4B,OAC/BqI,KAAAxK,GAAU,YAAV,QAAAwK,GAAmB,SAASrI,MAChCP,GAAA;AAAA,IACF;AACA,oBAAS,iBAAiB,aAAaK,CAAO,GACvC,MAAM,SAAS,oBAAoB,aAAaA,CAAO;AAAA,EAChE,GAAG,CAAC4R,GAAQjS,EAAa,CAAC,GAG1BvH,EAAU,MAAM;AACd,IAAIwZ,KAAUhB,KAAcyB,GAAe,WACzCA,GAAe,QAAQ,MAAA;AAAA,EAE3B,GAAG,CAACT,GAAQhB,CAAU,CAAC,GAEvBxY,EAAU,MAAM;AACd,QAAKwZ;AAEL,aAAA5T,GAAA,GACA,OAAO,iBAAiB,UAAUA,IAAwB,EAAI,GAC9D,OAAO,iBAAiB,UAAUA,EAAsB,GAEjD,MAAM;AACX,eAAO,oBAAoB,UAAUA,IAAwB,EAAI,GACjE,OAAO,oBAAoB,UAAUA,EAAsB;AAAA,MAC7D;AAAA,EACF,GAAG,CAAC4T,GAAQ5T,EAAsB,CAAC,GAEnC5F,EAAU,MAAM;AACd,QAAI,CAACwZ,EAAQ;AAEb,UAAM9R,IAAU,OAAO,sBAAsB,MAAM;AACjD,MAAA9B,GAAA;AAAA,IACF,CAAC;AAED,QAAI,CAACD,GAAU,WAAW,OAAO,iBAAmB;AAClD,aAAO,MAAM;AACX,eAAO,qBAAqB+B,CAAO;AAAA,MACrC;AAGF,UAAMC,IAAW,IAAI,eAAe,MAAM;AACxC,MAAA/B,GAAA;AAAA,IACF,CAAC;AACD,WAAA+B,EAAS,QAAQhC,GAAU,OAAO,GAE3B,MAAM;AACX,aAAO,qBAAqB+B,CAAO,GACnCC,EAAS,WAAA;AAAA,IACX;AAAA,EACF,GAAG;AAAA,IACD6R;AAAA,IACA5T;AAAA,IACAwU,GAAgB;AAAA,IAChB5B;AAAA,IACA2B,EAAe;AAAA,EAAA,CAChB,GAGDna,EAAU,MAAM;AACd,IAAAga,EAAoB,EAAE;AAAA,EACxB,GAAG,CAACI,EAAe,CAAC,GAGpBpa,EAAU,MACD,MAAM;AACX,IAAIwE,EAAgB,WAAS,aAAaA,EAAgB,OAAO;AAAA,EACnE,GACC,CAAA,CAAE;AAGL,QAAM2W,IAAgB3Z;AAAA,IACpB,CAACqG,MAA2B;AAC1B,UAAI,CAAC2R,GAAQ;AACX,SAAI3R,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACFgT,GAAA;AAEF;AAAA,MACF;AAEA,cAAQhT,EAAE,KAAA;AAAA,QACR,KAAK;AACH,UAAAL,GAAA;AACA;AAAA,QACF,KAAK;AAEH,cADAK,EAAE,eAAA,GAEAkS,MAAoB,KACpBA,KAAmBK,GAAgB,QACnC;AACA,kBAAME,IAAMF,GAAgBL,EAAgB;AAC5C,YAAIO,KAAO,CAACA,EAAI,YAAUQ,GAAaR,EAAI,KAAK;AAAA,UAClD;AACA;AAAA,QACF,KAAK;AACH,UAAAzS,EAAE,eAAA,GACFmS,EAAoB,CAACoB,MAAS;;AAC5B,gBAAIrL,IAAOqL,IAAO;AAClB,mBACErL,IAAOqK,GAAgB,YACvBlU,KAAAkU,GAAgBrK,CAAI,MAApB,QAAA7J,GAAuB;AAEvB,cAAA6J;AACF,mBAAOA,KAAQqK,GAAgB,SAASgB,IAAOrL;AAAA,UACjD,CAAC;AACD;AAAA,QACF,KAAK;AACH,UAAAlI,EAAE,eAAA,GACFmS,EAAoB,CAACoB,MAAS;;AAC5B,gBAAIrL,IAAOqL,IAAO;AAClB,mBAAOrL,KAAQ,OAAK7J,KAAAkU,GAAgBrK,CAAI,MAApB,QAAA7J,GAAuB,YAAU,CAAA6J;AACrD,mBAAOA,IAAO,IAAIqL,IAAOrL;AAAA,UAC3B,CAAC;AACD;AAAA,MAAA;AAAA,IAEN;AAAA,IACA;AAAA,MACEyJ;AAAA,MACAO;AAAA,MACAK;AAAA,MACAU;AAAA,MACAtT;AAAA,MACAqT;AAAA,IAAA;AAAA,EACF,GAIIQ,IAAa7Z;AAAA,IACjB,CAAC8Z,MAAW/C,EAAQ,KAAK,CAACgD,MAAMA,EAAE,UAAUD,CAAG;AAAA,IAC/C,CAAC/C,CAAO;AAAA,EAAA,GAIJiD,IAAsB,MAAM;AAChC,QAAInC;AACF,aAAOA;AAAA,QACLc,EACG,IAAI,CAACmB,MAAQD,EAAWC,CAAG,CAAC,EAC5B,OAAO,OAAO;AAAA,MAAA;AAGrB,QAAInB,EAAe,WAAW;AAC5B,mCACG,QAAA,EAAK,WAAU,sEACb,UAAArW,GACH;AAGJ,UAAM2X,IAAgBtB,EAAe,CAAC,GAChCpO,IACJ0P,MAAkB,SAAY,SAAYJ,EAAWI,CAAa;AACpE,WACEjd,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,0CACZ,UAAA;AAAA,OAAAuN,KAAA,gBAAAA,EAAU,SAAQ9N,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,YAAY,YAAS,MAAK;AAAA,MAC7DA,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,2CAA2C,iCAAU,OAAM;AAAA,IAAA,GAC7E;AAAA,EAEJ,GAGMyd,KAAqB,MACrBjD,MAA2B,gBAE3Bxa,gBAAAA,EAAAA,IAAC,SAAI,WAAU,4BACb,gCAAC,QAAA,EAAK,WAAU,uDAAuD,UAAA6F,EAAA,CAAY,GACrF,IAGA2U,MAA2B,UAE3Bxa,gBAAAA,EAAAA,IAAC,SAAI,WAAU,4BACZ,YAAe,SAAS,0BACtB,QAAA,EAAK,WAAU,2CACb,UAAAya,EAAmByB,EAAe,MAAM,EAAA,CAC3C,0BAEC,QAAA,EAAK,WAAU,8CAA8C,UAAArW,EAAA,CAAY,GAE9E,IAIF7F,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,8CACZ,UAAAkc,EAAe,SAAS,IACvBA,EAAe,IAAI,CAACmB,MAAQ;AAC1B,UAAMhB,IAAMe,EAAWC,CAAG;AAC1B,WACE9c,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QAET,UAAA;AAAA,WAAA8b,KAAA,gBAAAA,EAAK,UAAS,OAAOgB,CAAG;AAAA,UACzBrd,gBAAAA,EAAAA;AAAAA,YAAC6Y;AAAA,YAAA;AAAA,cACC,MAAM;AAAA,cACN,WAAU;AAAA,cACV,SAAS,CAACjP,MAAMoT,EAAiBK,GAAKzT,CAAC;AAAA,YAAA;AAAA,UAAA;AAAA,QACzC;AAAA,MAAA;AAAA,MARK,OAAOyT,CAAG;AAAA,IAAA;AAAA,EAWrB,CAAC,IAEDrd,gBAAAA,MAAC,UAAK,WAAU,8CAA8C,aAAY,GAE9E,GAKE0d,KAAsB,MAC1B1d,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,4DACb,UAAAO,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,yFACb,UAAA;AAAA,0BAACod,IAAA,EAAO,MAAM,IAAI,WAAU,uDAAsD;AAAA,IAClF3d,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKgc;AAAA,QACL,WAAU;AAAA,QACV,aAAanB;AAAA,QACb,OAAOoB;AAAA,QACP,UAAU,CAACrS,MAAM0S,GAAkB1S,EAAE,OAAO,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EACnD,EAAA,CACF,EAAA,CACF,GAIIgU,KAAmB,CAACC,GAAyB5N,MAAkB;AACnE,UAAM9C,IAAa+O,EAAe,SAAS2B,EAAO,KAAK,GACjDC,KAAgB7N,MAAU6L,IAC1BiC,KAAiC;AAAA,MACrC,UAAU5Q;AAAA,MACV,aAAa2Q;AAAA,MACb,UAAU,EAAQD,EAAO;AAAA,MACzB,OAAA5N;AAAA,IAAA;AAGF,WAAI7K,MAAS,aAETpF,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,UAAU6d,EAAO;AAAA,QACjB,SAAS,MAAM,CAACA,EAAO,YAAYhB,GAAagB,EAAO,KAAK;AAAA,QAC5D,cAAc,MAAM,CAACA,EAAO,YAAY9B,EAAoB9L,CAAK;AAAA,QACjE,WAAWnS;AAAA,UACTud,IACI,0CACA;AAAA,UACJwC,EAAO,YAAY;AAAA,UACnB,CAACxC,MACElO,IACG,2EACA;AAAA,UACN,CAACkO,KACCyC,MACA,CAACD,EAAO,YACR,CAAC1Q,KACD;AAAA,UACFmO,KAAA,gBAAAA,EAAkBuC,GAAQE;AAAA,QAAK;AAAA,QAGhC,UAAA1C,IACCA,EAAawC,GAAQE,EAAK,IAE1Bxd,gBAAAA,EAAAA,KAAAuM,YAAA,EACE,UAAA;AAAA,UAAA9M,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWlC;AAAA,gBACT;AAAA,gBACAqP,IACI,wEACA;AAAA,cAAA;AAAA,cAGL,eAAcnN,gBAAAA,EAAAA,IAACoC,IAAA,EAAM,MAAM,IAAI,WAAU,uCAAA,CAAuC;AAAA,YAAA;AAAA,UAAA;AAAA,UAElFyb,EAAO,QAAQ7d,gBAAAA,EAAAA,IAAC,UAAK,WAAU,YAAY,YAAO,MAAK;AAAA,UACxDO,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,YAAAP,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,aAAa,UAAA6d,EAAO,OAAM;AAAA,YACxCA,EAAO,eACN7d,gBAAAA,EAAAA,IAAC,SAAI,WAAU,0DACZ,YAAO,YAAA,CACV;AAAA,UAAA,GAEJ;AAAA,QAAA,GACF;AAAA,MAAA;AAAA,MA7CG,OAAO6d,EAAO,KAAK;AAAA,IAAA,IAoD5B7d,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,UAAU6d,EAAO;AAAA,QACjB,SAAS,MAAM,CAACA,EAAO,YAAYhB,GAAagB,EAAO,KAAK;AAAA,QAC5D,cAAc,MAAM,CAACA,EAAO,YAAY9B,EAAoB9L,CAAK;AAAA,QACjE,WAAWnS;AAAA,UACTud,IACI,0CACA;AAAA,UACJwC,EAAO,YAAY;AAAA,UACnB,CAACxC,MACElO,IACG,uFACA;AAAA,UACN,CAACkO,KACCyC,MACA,CAACD,EAAO,YACR,CAAC1Q,KACD;AAAA,UACFmO,KAAA,gBAAAA,EAAkBuC,GAAQE;AAAA,QAAK;AAAA,QAGhC,UAAA1C,IACCA,EAAawC,GAAQE,EAAK,IAE1Bxd,gBAAAA,EAAAA,KAAAuM,YAAA,EACG,UAAA;AAAA,UAAA+Q,EAAO,QAAQ7d,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,YAAY,YAAO,MAAK;AAAA,UACxDO,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,YAAAP,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,aAAa,UAAA6d,EAAO,OAAM;AAAA,YACxCA,EAAO,eACN7d,gBAAAA,EAAAA,IAAC,SAAI,WAAU,0DACZ,YAAO,YAAA,CACV;AAAA,UAAA,GAEJ;AAAA,QAAA,GACF;AAAA,MAAA;AAAA,MAnCG,OAAO6d,EAAO,KAAK;AAAA,IAAA;AAAA,EAuC9B,GAGMG,KAAmB,MACvBhe,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,gFACZ,UAAA8a,GACH,GAIImD,KAAe,MACnB1d,gBAAAA,OAAC,OAAA,EAAI,WAAU,oGACb,UAAA;AAAA,IAAAA,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,0DAAyD,UAAA;AAAA,MAAA;AAAA,MACnE2b,EAAe;AAAA,MAAO;AAAA,IAAA,GAC5B;AAAA,IACAlc,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAASid;AAAA,QACT,WAAU;AAAA,QACX,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GACF;AAGF,SACE1c,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKqU;AAAA,MACL,WAAW9W,EAAG,YAAYW,CAAS;AAAA,MACnC,WAAWye;AAAA,MAGX,UAAA;AAAA,QAAA3c,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,eAAY;AAAA,YACZ,cAAYjB;AAAA,YACZ,iBAAeic;AAAA,YACf,iBAAc;AAAA,YACd,UAAA5a;AAAA,YACA,SAAS,MAAM;AACb,cAAIA,KAAY8a,MACZF,IAAQjS,GAAA,IACPsT,GAAA;AAAA,YACP;AAAA,YACA,WAAW9e;AAAA,cACT;AAAA,cACA6c,KAAU3c,GAAa;AAAA,cACvBoc,GAAiB7b,CAAI;AAAA,cACrBoC,KAAY8a,IACR,2GACAF,IACE,oFACA;AAAA,cACNb;AAAA,YAAA;AAAA,YAGD,UAAA;AAAA,cAAAtV,MAAS,aAAaqY,GAAA,IAAuBF,EAAA;AAAA,cAC7CtC,KAAWQ,IACVzb,gBAAAA,EAAAA;AAAAA,gBAAC0Y;AAAA,gBAAA;AAAA,kBACC,MAAM;AAAA,kBACN,WAAU;AAAA,gBAAA;AAAA,cAAA,IAGZ1Y,gBAAAA,EAAAA;AAAAA,gBAACke;AAAA,gBAAA;AAAA,kBACC,MAAM;AAAA,kBACN,WAAWpgB;AAAA,oBACT;AAAA,oBACAyd,KAAU;AAAA,kBAAA;AAAA,gBACZ;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAKHA,KACC9X;AAAA,UACElD,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKmH;AAAA,cACL,eAAY;AAAA,cACZ,WAAW5J;AAAA,gBACTE,GAAa;AAAA,gBACb;AAAA,cAAA;AAAA,cAEF,OAAO;AAAA,gBACL,GAAGqJ;AAAA,gBACH,WAAWhB,IACP8B,IACE,iDACA,8CACFA,IACE,wCACA;AAAA,gBACN,iBAAiB8R,GAAwB9R,CAAY;AAAA,cAAA;AAAA,cAGtD,UAAA;AAAA,gBAAAoS,KAAcmD,GAAA;AAAA,gBAEf1d,gBAAAA,EAAAA,IAAC,SAAI,WAAU,uCACZ,cACCA,gBAAAA,MAAC,OAAA,EAAI,WAAU,gFACZ,UAAAgb,GACH,IACEmB,GAAgB,WAAW,IAC7B6B,GAAA,IAEA7B,GAAgB,IAAI,CAAC0B,GAAQ5N,MAAU;;AACrC,wBAAMkO,KAAgBlW,KAAAkU,GAAgBlM,IAAQ,CAAC,MAAzB,gBAAAhI,GAA4B,OAC5CmW,KAAoBP,EAAO,SAASA,EAAO,UAAUM;AAC3D,yBACE5d,gBAAAA,OAACnD,GAAM,UAAN,EACE,UAAA;AAAA,oBAAAghB,4BACE,OAAA,EAAI,WAAU,qFACZ,YAAO,OACV;AAAA,oBAEDR,GAAiBC,GAAQ5N,CAAK;AAAA,kBAAA,EAAA,GANZ,OAAO4N,EAAO,KAAK,CAOxC;AAAA,gBAEJ,CAAC,GAEL;AAAA,gBAECzY,MAAS,cAAc8W,EAAe,SAAS,KAAK+B,GAAA;AAAA,cAAa;AAAA,YAAA;AAAA,UAAA;AAAA,UAEpE,SAAS;AAAA,QAAA;AAAA,MACX;AAAA,IAAA;AAAA,EAAA;AAGR,GChvBMI,KAAuB,CAC3BC,GACAC,MACqB;AACrB,MAAIA,KAAc;AAChB,WAAO,MAAM,KAAK,EAAE,QAAQA,KAAc,CAACtR,GAAGgD,MAAUA,IAAQ,CAAC;AAGnE,QAAMuO,IAA0B,CAAC,CAAC,GAC5BC,IAAQ,KAAK,IAAI,GAAGH,IAAc,CAAC,GACnCI,IAAM,KAAK,IAAIH,IAAa,GAAGD,IAAc,CAAC;AAEpD,EAAIG,IAAQ,KACVD,EAAM,KAAK,eAAe;AAG5B,WAASG,IAAOF,GAAOE,KAAQD,GAAKC,KAAQ;AAC1C,IAAAH,EAAM,KAAKG,CAAI;AAGjB,SAAID,IAAMH,IAAa,KACrBC,EAAM,KAAK,gBAAgB,GAG7BA,EAAM,KAAKD,CAAU,GACdC;AACT,GAEaI,KAAa,CAAC;AAAA,EACzB,aAAAN;AAAA,EACA,YAAAC;AAAA,EACA,YAAAM;AAAA,EACA,cAAAC;AAAA,EACA,SAAAxgB,IAAU;AAAA,EACV,SAAA2c,IAAU;AAAA,EACV,WAAA8D,IAAY;AAAA,EACZ,kBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,WAAA1gB,IAAY;AACd,MAAuB;AACrB,QAAM2gB,IAAiB,KAAK,IAAI,GAAGb,CAAU,GACvCc,IAAkB,KAAK,IAAI,KAAK,IAAI,GAAGf,CAAW,GAAGc,CAAc,GACnEE,IAA4B7W;AAAA,IAChC,MACE,MAAM,KAAK,IAAI,KAAKyW,KAAmB,CAAA,GAAI,OAAO,CAACrB,MAAWA,IAAS,CAAC,CAAC,CAAC,EAAE;AAAA,MAC1E,CAACtV,GAAMgX,MAAUhX,IAAOgX;AAAA,IAAA;AAAA,IAE5B,CAACL,CAAe;AAAA,EAAA,GAEZM,IACJ,OAAOP,KAAa,YACjB,OAAOE,KAAqB,cAC5BG,EAA0B,SAAS,GAElCG,IAAkBhX;AAAA,IACtB,MAAM4V,GAAqBgB,GAAiBD,CAAc;AAAA,IAC1D,CAACC,GAAiBD,CAAc;AAAA,EAAA;AAKlC,UAFEJ,KAAoB1gB,MAAY,cAEJigB,KAAc,IAAU,OAElDjgB,MAAY,YAEZiC,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWzC;AAAA,QACT;AAAA,QACAW;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA8B,gBAAAA,OAAC,QAAA,EAAK,UAAA;AAAA,UAAA;AAAA,UACDse;AAAA,UAAW;AAAA,UAAEE;AAAA,UAAU;AAAA,UAAMM;AAAA,UAAgB;AAAA,UAAID;AAAA,UAAe;AAAA,QAAA,GACrE;AAAA,QACA7e,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,UAAAP,gBAAAA,EAAAA;AAAAA,YAACK;AAAA,YAAA;AAAA,cACC,UAAUgf,KAAmB,KAAKpE;AAAA,cAClC,SAAS,MAAM6D,EAAaO,IAAkB,CAAC;AAAA,cAC/C,MAAK;AAAA,cACL,MAAK;AAAA,cACL,SAAQ;AAAA,cACT,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGDrf,gBAAAA,EAAAA;AAAAA,YAACK;AAAA,YAAA;AAAA,cACC,UAAUgf,KAAmBD,KAAkBnE;AAAA,cAC/C,SAAS,MAAM6D,EAAaO,IAAkB,CAAC;AAAA,cAC/C,MAAK;AAAA,cACL,MAAK;AAAA,cACL,SAAQ;AAAA,cACT,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IAMJ9e,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWzC;AAAA,QACT;AAAA,QACAW;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA8B,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,UAAAA,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,oDAAmD,UAAA;AAAA,YAAA;AAAA,YAAGse;AAAA,YAAW;AAAA,UAAA,GAAE;AAAA,UACnFte,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,oDAAmD,UAAA;AAAA,YAAA;AAAA,YAC9D8e;AAAA,YAAgB;AAAA,YAAID;AAAA,YAAe;AAAA,UAAA,GACxC;AAAA,UACCI,IACCxf,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,aACX,UAAAA,gBAAAA,EAAAA;AAAAA,YAACqa;AAAA,YAAA;AAAA,cACC,SAASiF,EAA0B,IAAI,CAACzB,OAAY;AAAA,gBAClD,OAAO,GAAGA,CAAM;AAAA,gBAChB,OAAOA;AAAA,cAAA,EACP;AAAA,cACF,OAAOoB;AAAA,cACP,UAAU,CAACnkB,MAAUqkB,EAAiB,OAAOrkB,CAAK,CAAC;AAAA,cACnD,UAAUmgB;AAAA,cACV,MAAK;AAAA,cACL,WAAU;AAAA,cACV,QAAO;AAAA,YAAA;AAAA,UAAA,GAEb,IACE;AAAA,QAAA,GACN;AAAA,QACA1a,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,kEACb,UAAA;AAAA,UAAAP,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,SAAS,MAAM8e,EAAaO,IAAkB,CAAC;AAAA,cAC/C,UAAUA,KAAmB,KAAKpE;AAAA,cAClC,WAAU;AAAA,cAEV,UAAAjb,gBAAAA,EAAAA,IAAC+M,IAAA,EAAY,MAAM,GAAA,CAAI;AAAA,YAAA;AAAA,UAAA;AAAA,UAExB0S,EAAgB;AAAA,YAAI,CAACzR,MACpB,OAAOA,KAAS,WACdhO,gBAAAA,EAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,SAAS,MAAM8e,EAAa9Q,CAAI;AAAA,gBAChC,UAAUiN;AAAA,gBACV,gBAAcjN,MAASqR,IAAkB,SAAS;AAAA,gBAClD,WAAWvhB;AAAA,kBACT;AAAA,kBACAkQ,MAASqR,IACL,qFACA;AAAA,gBAAA;AAAA,gBAGL,UAAArR;AAAA,cAAA;AAAA,cAZIA;AAAA,YAAA,IAePhO,gBAAAA,EAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBACX,UAAA;AAAA,cAAA;AAAA,cAFMgO;AAAA,YAAA;AAAA,UAIP;AAAA,UAGJhO,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,SAAS,MAAM8e,EAAaO,IAAkB,CAAC;AAAA,cAC/C,UAAUA,KAAmBD,KAAkBnE;AAAA,cAC/C,WAAU;AAAA,cAEV,UAAAjb,gBAAAA,EAAAA,IAACgN,IAAA,EAAa,MAAM,GAAA,CAAI;AAAA,YAAA;AAAA,UAAA;AAAA,QAC1B,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN,GC3La0S,KAA8B,CAAC;AAAA,EAC1C,MAAAnhB,IAAO;AAAA,EACP,SAAAkC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,UAAAC,IAAW;AAAA,EACX,OAAAE;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAtC;AAAA,EACA,IAAAuC;AAAA,EACA,GAAGnF;AACL,MAAM;AACJ,QAAMsF,IAAcC,GAAA,GACdC,IAAUL,KAAMG,GAChBG,IAAU,GAAGD,CAAO,UACpBE,IAAgB,GAAGF,CAAO,gBAC1BG,IAAe,OAAOf,KAAY,WAClC,CAACgB,GAAiBC,CAAkB,IAAIhC,EAASgB,CAAc,GAC/DiB,IAAiBH,IAAef,IAAUgB,GAC1CG,IAAUrD,MAAS,MACnBsD,IAAiB,EAAQf,GAEzBkB,IAAe,CAAC/B,MAA+C;AACnE,QAAIU,EAAU;AACd,UAAMsB,IAAchC,EAAM,OAAO;AACjC,IAAKuB,KACHE,EAAmBO,CAAW,GAEhClB,KAAA,QAAAA,EAAWkB;AAAA,EACb;AAEA,SACE1B,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAASc;AAAA,MACT,WAAWvD;AAAA,QACT;AAAA,QACA+D,IAAiB,gBAAgB;AAAA,QACjCD,KAAW;AAAA,QACXjB,IAAW,kCAAkC;AAAA,QAC7ClC;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA8B,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWzC;AAAA,cACT;AAAA,cACA+D,KAAkB;AAAA,cAClBD,IAAU,YAAY;AAAA,YAAA;AAAA,YAGxB,UAAA;AAAA,cAAA5B,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACE,GAAGnE;AAAA,kBACJ,IAAIwF;AAAA,kBACJ,MAAK;AAAA,kBACL,SAASM;AAAA,kBACT,UAAAhB;AAAA,kBACA,mBAAiBE,IAAQS,IAAU;AAAA,kBACnC,oBAAkBR,IAAcS,IAAgB;AAAA,kBAChD,cAAY,OAAOV,KAAU,WAAWA,IAAQhF,EAAM,YAAY;AAAA,kBAClE,WAAU;AAAA,kBACV,UAAUmG;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEZhC,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,WAAWlC;AAAA,oBACT;AAAA,oBACA8D,IAAU,YAAY;AAAA,oBACtBD,IACI,4JACA;AAAA,oBACJ,CAAChB,KAAY;AAAA,oBACb,CAACA,KAAY,CAACgB,KAAkB;AAAA,kBAAA;AAAA,kBAGlC,UAAA3B,gBAAAA,EAAAA;AAAAA,oBAAC2f;AAAA,oBAAA;AAAA,sBACC,MAAM/d,IAAU,IAAI;AAAA,sBACpB,WAAWD,IAAiB,8BAA8B;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAC5D;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,SAEAd,KAASC,MACTP,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,WACb,UAAA;AAAA,UAAAM,IACCb,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAIsB;AAAA,cACJ,WAAWxD;AAAA,gBACT;AAAA,gBACA6D,IAAiB,mCAAmC;AAAA,gBAC1C;AAAA,cAA0B;AAAA,cAGrC,UAAAd;AAAA,YAAA;AAAA,UAAA,IAED;AAAA,UACHC,IACCd,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAIuB;AAAA,cACJ,WAAWzD;AAAA,gBACT;AAAA,gBACA8D,IAAU,4BAA4B;AAAA,cAAA;AAAA,cAGvC,UAAAd;AAAA,YAAA;AAAA,UAAA,IAED;AAAA,QAAA,EAAA,CACN;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR,GCtGM8e,KAAwD;AAAA,EAC5D,IAAI;AAAA,EACJ,IAAI;AACN,GAEaC,KAAmB,CAAmB;AAAA,EACjD,OAAA/kB;AAAA,EACA,SAAAwf;AAAA,EACA,UAAAvZ;AAAA,EACA,MAAAxC,IAAO;AAAA,EACP,WAAAuhB,IAAY;AAAA,EACZ,WAAArhB;AAAA,EACA,MAAAY,IAAO;AAAA,EACP,GAAGxD;AACL,MACEmE,gBAAAA,EAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAAX;AAAA,IACA,WAAWvB;AAAA,MACT;AAAA,MACAE,GAAa;AAAA,MACb8hB,KAAa;AAAA,MACbrhB;AAAA,IAAA;AAAA,IAED,GAAG5C;AAAA,IAEH,UAAAye,EAAQ,IAAI,CAACuD,MAAW;AACvB,YAAMkC,IAASlC,EAAO,UAAU/iB;AAChC,aACEkF,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,gBAAc+f;AAAA,UACd,UAAUlC,EAAO;AAAA,UACjB,SAAS,MAAM9c,EAAS8c,EAAO,KAAK;AAAA,UACpC,WAAW/f;AAAA,YACT;AAAA,YACA8hB,GAAgBrhB,CAAI;AAAA,YACpBuhB,KAAa;AAAA,YACbC,IACI,yEACA;AAAA,UAAA;AAAA,UAGL,UAAAlC,EAAO;AAAA,QAAA;AAAA,QAdHA,EAAO;AAAA,MAAA;AAAA,IAiBlB,CAAC;AAAA,EAAA;AACH,GCtDWmC,KAAgC,CAAC;AAAA,EAC5C,MAAAzhB,IAAO;AAAA,EACP,SAAAkC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,UAAAC,IAAW;AAAA,EACX,OAAAE;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAtC;AAAA,EACA,IAAAuC;AAAA,EACA,GAAGnF;AACL,MAAM;AACJ,QAAMsF,IAAcC,GAAA,GACdC,IAAUL,KAAMG,GAChBG,IAAU,GAAGD,CAAO,UACpBE,IAAgB,GAAGF,CAAO,gBAC1BG,IAAe,OAAOf,KAAY,WAClC,CAACgB,GAAiBC,CAAkB,IAAIhC,EAASgB,CAAc,GAC/DiB,IAAiBH,IAAef,IAAUgB,GAC1CG,IAAUrD,MAAS,MAEnByD,IAAe,CAAC/B,MAA+C;AACnE,QAAIU,EAAU;AACd,UAAMsB,IAAchC,EAAM,OAAO;AACjC,IAAKuB,KACHE,EAAmBO,CAAW,GAEhClB,KAAA,QAAAA,EAAWkB;AAAA,EACb;AAEA,SACE1B,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAASc;AAAA,MACT,WAAWvD;AAAA,QACT;AAAA,QACA6C,IAAW,kCAAkC;AAAA,QAC7ClC;AAAA,MAAA;AAAA,MAGA,UAAA;AAAA,SAAAoC,KAASC,MACTP,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,WACb,UAAA;AAAA,UAAAM,0BACE,QAAA,EAAK,IAAIS,GAAS,WAAU,gEAC1B,aACH,IACE;AAAA,UACHR,0BACE,QAAA,EAAK,IAAIS,GAAe,WAAU,2EAChC,aACH,IACE;AAAA,QAAA,GACN;AAAA,QAEFhB,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWzC;AAAA,cACT;AAAA,cACA8D,IAAU,YAAY;AAAA,YAAA;AAAA,YAExB,qBAAiB;AAAA,YACjB,gBAAcD,IAAiB,SAAS;AAAA,YAExC,UAAA;AAAA,cAAA3B,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACE,GAAGnE;AAAA,kBACJ,IAAIwF;AAAA,kBACJ,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAASM;AAAA,kBACT,UAAAhB;AAAA,kBACA,mBAAiBE,IAAQS,IAAU;AAAA,kBACnC,oBAAkBR,IAAcS,IAAgB;AAAA,kBAChD,cAAY,OAAOV,KAAU,WAAWA,IAAQhF,EAAM,YAAY;AAAA,kBAClE,WAAU;AAAA,kBACV,UAAUmG;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEZhC,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,WAAWlC;AAAA,oBACT;AAAA,oBACA6D,IAAiB,uFAAuF;AAAA,oBACxG,CAAChB,KAAY;AAAA,kBAAA;AAAA,gBACf;AAAA,cAAA;AAAA,cAEFX,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,oBAAgB;AAAA,kBAChB,WAAWlC;AAAA,oBACT;AAAA,oBACA8D,IAAU,uBAAuB;AAAA,oBACjCD,IAAkBC,IAAU,kBAAkB,kBAAmB;AAAA,kBAAA;AAAA,gBACnE;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN,GCjFaqe,KAAO,CAAmB;AAAA,EACrC,OAAAnlB;AAAA,EACA,SAAAwf;AAAA,EACA,UAAAvZ;AAAA,EACA,SAAAzC,IAAU;AAAA,EACV,WAAAG,IAAY;AAAA,EACZ,eAAAyhB;AAAA,EACA,eAAAC,IAAgB;AAAA,EAChB,OAAAC;AACF,MAAoB;AAClB,QAAMC,IAAS3hB,GAAqBJ,CAAO,GACrCgiB,IACJJ,MACC5hB,MAAY,SACT,yGACA;AAEN,SACE0B,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAQ,gBAAe,WAAWlC,EAAGuiB,EAAO,WAAW5hB,CAAS,GACnE,UAAA8B,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAWzC,EAAG,2EAA2E,GAC5F,UAAA;AAAA,IAAAkC,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,eAAY;AAAA,QACZ,WAAWlC,EAAGwiB,GAAuBF,IAAQ,mBAAmB,EAAE;AAAA,QAEjE,UAAA9F,EAAQ,IAAI,CAACuD,MAAW;AACvB,gBAAMkC,IAASlC,EAAO,UAAU/iB,GAC1BylB,IAAO1C,EAAO;AACpB,iBACEtd,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,iBAAewf;AAAA,cACf,iBAAelC,EAAO,YAAY;AAAA,cAClC,UAAUA,EAAO;AAAA,cACjB,SAAS,MAAM;AACb,gBAAKA,EAAO,YACV9c,EAAS8c,EAAO,KAAK;AAAA,cAEzB;AAAA,cACA,WAAW/f;AAAA,gBACTuiB,EAAO;AAAA,gBACPN,IAASM,EAAO,SAASA,EAAO;AAAA,gBAChCxC,EAAO,WAAW,sDAAsD;AAAA,gBACxEsC;AAAA,cAAA;AAAA,cAGD,UAAA;AAAA,gBAAAI,IACCF,EAAO,WACLrgB,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAWlC,EAAGuiB,EAAO,UAAUN,IAASM,EAAO,aAAaA,EAAO,YAAY,GACnF,UAAArgB,gBAAAA,EAAAA,IAACugB,GAAA,EAAK,MAAM,IAAI,WAAU,YAAW,aAAa,IAAA,CAAK,EAAA,CACzD,IAEAvgB,gBAAAA,EAAAA,IAACugB,GAAA,EAAK,MAAM,IAAI,WAAU,YAAW,IAErC;AAAA,gBACJvgB,gBAAAA,EAAAA,IAAC,UAAK,WAAWqgB,EAAO,WAAW,iBAAiB,QAAY,YAAO,MAAA,CAAM;AAAA,gBAC5ExC,EAAO,UAAU,UAAaA,EAAO,UAAU,OAC9C7d,gBAAAA,EAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAWlC;AAAA,sBACTuiB,EAAO;AAAA,sBACPN,IAASM,EAAO,cAAcA,EAAO;AAAA,oBAAA;AAAA,oBAGtC,UAAAxC,EAAO;AAAA,kBAAA;AAAA,gBAAA,IAER;AAAA,cAAA;AAAA,YAAA;AAAA,YArCCA,EAAO;AAAA,UAAA;AAAA,QAwClB,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,IAEFuC,IAAQpgB,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,sBAAsB,aAAM,IAAS;AAAA,EAAA,EAAA,CAC/D,EAAA,CACF;AAEJ,GC1FMwgB,KAAmD;AAAA,EACvD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,KAA+C;AAAA,EACnD,MAAM;AAAA,EACN,UAAU;AACZ,GAEM9G,KAAoB,CAACL,MACzBA,IACI,uIACA,8LAEOoH,KAAWtjB,GAAM;AAAA,EAC5B,CACE;AAAA,IACE,MAAAmB,IAAO;AAAA,IACP,QAAAoiB,IAAS;AAAA,IACT,SAAArH,IAAU;AAAA,IACV,WAAA7a;AAAA,IACA,UAAAkC;AAAA,IACA,GAAG9E;AAAA,EAAA,GAEL0D,MAEAS,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAT;AAAA,MACA,UAAAoB;AAAA,MACA,WAAW7C;AAAA,QACT;AAAA,QACAE,GAAa;AAAA,QACbwiB,GAAmBjiB,CAAI;AAAA,QACvBkiB,GAAaE,CAAM;AAAA,QACnBhH,GAAkBL,CAAO;AAAA,QACzB7a;AAAA,MAAA;AAAA,MAED,GAAG5C;AAAA,MACJ,cAAa;AAAA,IAAA;AAAA,EAAA;AAGnB;AAEA6kB,GAAS,cAAc;ACtCvB,MAAME,KAAe,kDACfzQ,KAAc,KACdC,KAAyB,KACzBC,KAAY,GACZC,KAA2B,KAE3BzL,KAAM,CAAC/J,MAAkB,OAAOA,CAAK,EAAE,SAAS,GAAG,GAAG,GAEtD+lB,KAAY,CAAC/lB,MAAkB;AACnC,QAAM0U,IAAU1U,EAAM,MAAM8lB,EAAY;AACxC,SAAOpR,IACH,EAAE,MAAMA,EAAQ,CAAC,GAAI,QAAQA,EAAQ,CAAC,GAAI,QAAQA,EAAQ,CAAC,KAAK,SAChE;AACN,GAEMsR,KAAqB,CAAChmB,MAC1B+lB,GAAU/lB,CAAK,KAAK,EAAE,MAAM,MAAM,QAAQ,MAAM,QAAQ,KAAA,GAEpDimB,KAAmB,CAACjmB,MAAmB;AAC3C,QAAM0N,IAAS1N,IAAQ+lB,GAAU/lB,CAAK,IAAI;AAC1C,SAAO0N,IACH,OAAOA,EAAO,IAAI,IAAI,OAAO,OAAOA,EAAO,MAAM,IAAI,KAAK,OAAOA,EAAO,MAAM,IAC9E;AACN,GAEawY,KAAwC,CAAC;AAAA,EACpD,OAAAlmB;AAAA,EACA,UAAAiG;AAAA,EACA,aAAA8E,IAAc;AAAA,EACd,WAAApH;AAAA,EACA,MAAAF,IAAO;AAAA,EACP,WAAAiQ,IAAY;AAAA,EACZ,YAAAC,IAAa;AAAA,EACb,kBAAAwS;AAAA,EACA,UAAAtgB,IAAW;AACb,MAAM;AACJ,QAAMugB,IAAcJ,GAAmBhmB,CAAK,GACtC,CAACkW,GAAWC,CAAY,IAAIvR,EAASwhB,EAAY,IAAI,GACrD,CAAChQ,GAAaC,CAAc,IAAIzR,EAASwhB,EAAY,MAAM,GAC3D,CAAC9P,GAAaC,CAAc,IAAI3R,EAASwhB,EAAY,MAAM,GAC3D,CAAC3e,GAAM6D,CAAO,IAAI1G,EAAS,EAAK,GAChC,CAAC2G,GAAgBC,CAAiB,IAAI5G,EAAS,EAAK,GACpD,CAAC6H,GAAeC,CAAgB,IAAI9H,EAAwB,MAAM,GAClE4R,IAAapQ,GAAuB,IAAI,GACxCuG,IAAavG,GAA0B,IAAI,GAC3CqQ,IAAWrQ,GAAuB,IAAI,GACtCqF,IAAkBrF,GAA6C,IAAI,GACnE,CAACuQ,GAAYC,CAAa,IAAIhS,EAA8B;AAAA,IAChE,UAAU;AAAA,IACV,QAAQ;AAAA,EAAA,CACT,GACKyhB,IACJ3S,MAAc,WACV,GAAGwC,CAAS,IAAIE,CAAW,IAAIE,CAAW,KAC1C,GAAGJ,CAAS,IAAIE,CAAW,IAC3BkQ,IAAcL,GAAiBE,CAAgB,GAC/CI,IAAqBN,GAAiBI,CAAS,GAC/CG,IACJF,MAAgB,QACdC,MAAuB,QACvBA,KAAsBD,GAGpBpP,IAAiBzO,EAAY,MAAM;;AACvC,UAAMqE,KAAOK,IAAAR,EAAW,YAAX,gBAAAQ,EAAoB;AACjC,QAAI,CAACL,EAAM;AACX,UAAMqK,MACJC,KAAAX,EAAS,YAAT,gBAAAW,GAAkB,iBAAgB9B,IAC9B+B,KAAa,KAAK,IAAIhC,IAAa,KAAK,IAAI,GAAG,OAAO,aAAa,EAAE,CAAC,GACtEhI,KACJ,OAAO,cAAcP,EAAK,SAASqK,IAAc5B;AACnD,IAAA7I,EAAiBW,KAAe,OAAO,MAAM,GAC7CuJ,EAAc;AAAA,MACZ,UAAU;AAAA,MACV,MAAM,KAAK;AAAA,QACT,KAAK,IAAI,GAAG9J,EAAK,IAAI;AAAA,QACrB,KAAK,IAAI,GAAG,OAAO,aAAauK,KAAa,CAAC;AAAA,MAAA;AAAA,MAEhD,KAAKhK,KACD,KAAK,IAAI,GAAGP,EAAK,MAAMqK,IAAc5B,EAAS,IAC9CzI,EAAK,SAASyI;AAAA,MAClB,OAAO8B;AAAA,MACP,WAAW;AAAA,MACX,QAAQ;AAAA,IAAA,CACT;AAAA,EACH,GAAG,CAAA,CAAE,GAECoP,IAAiBhe,EAAY,MAAM;AACvC,IAAIgD,EAAgB,WAAS,aAAaA,EAAgB,OAAO,GACjEH,EAAQ,EAAK,GACbE,EAAkB,EAAK;AAAA,EACzB,GAAG,CAAA,CAAE,GAECkb,IAAQje,EAAY,MAAM;AAC9B,IAAIgD,EAAgB,WAAS,aAAaA,EAAgB,OAAO,GACjED,EAAkB,EAAI,GACtBC,EAAgB,UAAU;AAAA,MACxBgb;AAAA,MACAjR;AAAA,IAAA;AAAA,EAEJ,GAAG,CAACiR,CAAc,CAAC,GAEbnP,KAAY,MAAM;AACtB,UAAMN,IAAOgP,GAAmBhmB,CAAK;AACrC,IAAAmW,EAAaa,EAAK,IAAI,GACtBX,EAAeW,EAAK,MAAM,GAC1BT,EAAeS,EAAK,MAAM,GAC1BxL,EAAkB,EAAK,GACvB0L,EAAA,GACA5L,EAAQ,EAAI;AAAA,EACd;AAEA,EAAArE,EAAU,MAAM;AACd,QAAI,CAACQ,EAAM;AACX,IAAAyP,EAAA;AACA,UAAMyP,IAAgB,CAACxhB,MAAsB;;AAC3C,YAAM4J,KAAS5J,EAAM;AACrB,OACEgI,KAAAqJ,EAAW,YAAX,QAAArJ,GAAoB,SAAS4B,QAC7BqI,IAAAX,EAAS,YAAT,QAAAW,EAAkB,SAASrI,OAI7B2X,EAAA;AAAA,IACF;AACA,kBAAO,iBAAiB,UAAUxP,CAAc,GAChD,OAAO,iBAAiB,UAAUA,GAAgB,EAAI,GACtD,SAAS,iBAAiB,aAAayP,CAAa,GAC7C,MAAM;AACX,aAAO,oBAAoB,UAAUzP,CAAc,GACnD,OAAO,oBAAoB,UAAUA,GAAgB,EAAI,GACzD,SAAS,oBAAoB,aAAayP,CAAa;AAAA,IACzD;AAAA,EACF,GAAG,CAACD,GAAOjf,GAAMyP,CAAc,CAAC,GAEhCjQ;AAAA,IACE,MAAM,MAAM;AACV,MAAIwE,EAAgB,WAAS,aAAaA,EAAgB,OAAO;AAAA,IACnE;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,QAAMmb,KAAY,MAAM;AACtB,UAAM5O,wBAAU,KAAA;AAChB,IAAA7B,EAAapM,GAAIiO,EAAI,SAAA,CAAU,CAAC,GAChC3B,EAAetM,GAAIiO,EAAI,WAAA,CAAY,CAAC,GACpCzB,EAAexM,GAAIiO,EAAI,WAAA,CAAY,CAAC;AAAA,EACtC,GAEM6O,IAAcd,GAAU/lB,CAAK,GAC7B+Q,IAAe8V,IACjBnT,MAAc,WACZ,GAAGmT,EAAY,IAAI,IAAIA,EAAY,MAAM,IAAIA,EAAY,MAAM,KAC/D,GAAGA,EAAY,IAAI,IAAIA,EAAY,MAAM,KAC3C;AAEJ,SACEphB,gBAAAA,OAAC,SAAI,KAAK+Q,GAAY,WAAWxT,EAAG,YAAYW,CAAS,GACvD,UAAA;AAAA,IAAA8B,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKkH;AAAA,QACL,MAAK;AAAA,QACL,UAAA9G;AAAA,QACA,cAAYkF;AAAA,QACZ,SAAS,MAAOtD,IAAOif,EAAA,IAAUpP,GAAA;AAAA,QACjC,WAAWtU;AAAA,UACT;AAAA,UACAE,GAAa;AAAA,UACbO,MAAS,OACL,8BACA;AAAA,UACJoC,KAAY;AAAA,QAAA;AAAA,QAGd,UAAA;AAAA,UAAAX,gBAAAA,EAAAA,IAACkT,IAAA,EAAM,MAAM,IAAI,WAAU,4DAA2D;AAAA,UACtFlT,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWlC;AAAA,gBACT;AAAA,gBACA+N,IAAe,mCAAmC;AAAA,cAAA;AAAA,cAGnD,UAAAA,KAAgBhG;AAAA,YAAA;AAAA,UAAA;AAAA,UAEnB7F,gBAAAA,EAAAA;AAAAA,YAACke;AAAA,YAAA;AAAA,cACC,MAAM;AAAA,cACN,WAAWpgB;AAAA,gBACT;AAAA,gBACAyE,KAAQ,CAAC8D,KAAkB;AAAA,cAAA;AAAA,YAC7B;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAGD9D,IACGkB;AAAA,MACElD,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAKgR;AAAA,UACL,0BAAsB;AAAA,UACtB,WAAU;AAAA,UACV,OAAO;AAAA,YACL,GAAGE;AAAA,YACH,WAAWpL,IACPkB,MAAkB,OAChB,iDACA,8CACFA,MAAkB,OAChB,wCACA;AAAA,YACN,iBAAiBA,MAAkB,OAAO,WAAW;AAAA,UAAA;AAAA,UAGvD,UAAA;AAAA,YAAAvH,gBAAAA,EAAAA;AAAAA,cAACiO;AAAA,cAAA;AAAA,gBACC,MAAM+C;AAAA,gBACN,QAAQE;AAAA,gBACR,QAAQE;AAAA,gBACR,cAAcH;AAAA,gBACd,gBAAgBE;AAAA,gBAChB,gBAAgBE;AAAA,gBAChB,WAAA7C;AAAA,gBACA,YAAAC;AAAA,cAAA;AAAA,YAAA;AAAA,YAEFlO,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,oGACb,UAAA;AAAA,cAAAP,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM;AACb,oBAAAe,EAAS,EAAE,GACXwgB,EAAA;AAAA,kBACF;AAAA,kBACA,WAAU;AAAA,kBACX,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGDhhB,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,gBAAAP,gBAAAA,EAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS0hB;AAAA,oBACT,WAAU;AAAA,oBACX,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGD1hB,gBAAAA,EAAAA;AAAAA,kBAACK;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,UAAUihB;AAAA,oBACV,SAAS,MAAM;AACb,sBAAAvgB,EAASogB,CAAS,GAClBI,EAAA;AAAA,oBACF;AAAA,oBACD,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAED,EAAA,CACF;AAAA,YAAA,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEF,SAAS;AAAA,IAAA,IAEX;AAAA,EAAA,GACN;AAEJ,GC9PMK,KAAiF;AAAA,EACrF,SAAS;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,SAAS;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,OAAO;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,SAAS;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAEX,GAEaC,KAAoC,CAAC;AAAA,EAChD,OAAArD;AAAA,EACA,aAAAsD;AAAA,EACA,WAAAhH,IAAY;AAAA,EACZ,UAAAiH;AACF,MAAM;AACJ,QAAM,CAACC,GAAeC,CAAgB,IAAIviB,EAAsB,oBAAI,KAAK,GACnEwiB,IAAeH,IAAWvD,EAAM,MAAM,GAAGuD,CAAQ,IAAIvD,GAErD2D,IAAe,CAACnhB,MAAe;AACnC,IAAAihB,EAAiB,CAAC9E,MAAS;AACzB,YAAMrL,IAAO,IAAI,IAAIqL,CAAI;AACzB,aAAIrL,EAAK,IAAI9Q,CAAE,IAAG8Q,EAAK,OAAO9Q,CAAE,IAC3B8Q,EAAK,IAAI9Q,CAAE,GACT8Q;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAI0M,EAAM,WAAW,IAEjBje,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,+DACb,UAAA;AAAA,IAAAP,gBAAAA,MAAC,SAAI,WAAU,0DACb,UAAAO,gBAAAA,OAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,uCAAsC,aAAY,OACnH,UAAA;AAAA,MAAAP,gBAAAA,MAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,MAC9BA,gBAAAA,EAAAA,IAAC,QAAA,EAAK,GAAE,qHAAA,CAAqH;AAAA,IAAA,EAAA,CAC/H,EAAA,CACF;AAAA,IACAA,gBAAAA,EAAAA,IAAC,KAAA,EAAE,WAAU,+DAA+D,UAAA8a,EAAA,CAAU;AAAA,EAAA,GACxF,IAKFva,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,YACZ,UAAA;AAAA,IAAA2hB,EAAa,IAAI,CAAClU,GAAMZ,MAAQ;AAC/B,YAAMgV,IAAQR,GAAW5T,EAAK,QAAQ,SAAS,GACzCqU,IAAaL,EAAc,IAAIhU,EAAK,EAAE,GACtCsU,IAAatU,EAAK,eAAeA,EAAK,cAAcA,EAAK;AAE/D,aACEzN,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW,sCAAsC6M,MAAQ8U,EAAa,SAAS,GAAI,EAAO;AAAA,UAE1F,UAAA;AAAA,YAAA3hB,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,cAAAP,gBAAAA,MAAC,OAAA,EAAI,WAAW,8DAA8DoiB,EAAM,GAAG,aAAa;AAAA,cACnGhV,IAAM8U,EAAa,SAAS,KAC3BliB,gBAAAA,EAAAA,IAAC,SAAI,WAAW,2CAA2CoiB,EAAM,IAAI,GAAA,CAAI;AAAA,YAAA,GAE7E;AAAA,YAEA7hB,gBAAAA,EAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,gKACTuhB,IAAc,mBAAmB,EACnC;AAAA,gBACA,SAAS,MAAMA,KAAA,gBAAAA,EAAc9T,EAAK;AAAA,gBAElC,UAAA;AAAA,kBAAAhO,gBAAAA,EAAAA,IAAC,SAAI,WAAU,0CACb,UAAAO,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,oBAAAA,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,sBAAAP,gBAAAA,EAAAA,IAAC,UAAK,WAAW,gEAAgEoiB,EAAM,KAAK,IACzF,YAAK,MAAA,CACR;AAAA,sBACCE,KACC/hB,gBAAAA,EAAAA;AAAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS,CAACN,MAAU;AAClB,4BAAAA,EAAM,gBAAA,GACNkiB,EAAanU,EAAK,EAAE;AAAA,0BACtB;AAAA,0BACA,WAAU;AAAA,0BAET,UAAA;AAAA,4BAAAqU,IAAariB,gBAAAA,EAAAA,IAACke,MAAY,MAAM,GAAA,CAAI,IAAKle,gBAAAA,EAAAA,IAACgN,IAAA,EAAa,MAAM,GAAA,CAAI;AAAA,4BAAG;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAEvE,GAEJ;AAAA,oBACAhN,gBAAAA,EAAAA,IAAC,KAAA,EAAE,WAAU,yDAAyD,YAAK,KAAA,CAAK;AAAA,kBAAA,EAAA,CAClF,EAAA,CACF;AAAA,kBAECgO,EAAK,QAAQA,EAAK,KAAK,SAAS,KAC/BhO,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,qFACZ,YAAK,KAAK,IAAI,CAACuiB,6BACb,OAAA,EACC,UAAA;AAAA,oBAAAviB,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,0DAA0D,UAAAuiB,EAAS,OAAM;AAAA,oBACzFviB,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,2EAA2E,YAAS,MAAA,CAAM;AAAA,kBAAA,EAAA,GAFlGuiB,EAAS,KAGnB,CACD,GACH;AAAA,kBAGDF,KAAcC,KACb/hB,gBAAAA,OAAC,OAAA,EAAI,WAAU,0EACZ,UAAA;AAAA,oBAAAyN,EAAK,eACJhO,gBAAAA,EAAAA,IAAC,KAAA,EAAE,WAAU,8DAA8D,YAAK,aAAY;AAAA,oBAE7FgO,EAAK,eAAeA,EAAK,cACxBzN,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,sBAAAA,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,+DACb,UAAA;AAAA,wBAAAP,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,gDAA+C,UAAA,OAAG;AAAA,wBACjEA,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,yEAAyE,YAAK,YAAA,CAAY;AAAA,sBAAA,GAC3G;AAAA,sBACAO,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,gEACb,UAAA;AAAA,wBAAAP,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,iDAAgD,UAAA,OAAG;AAAA,wBAClEA,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,6DAA6D,YAAK,WAAA,CAAW;AAAA,sBAAA,EAAA,CAC9F;AAAA,oBAAA,EAAA,CACF;AAAA,kBAAA,EAAA,CAEJ;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAEJ;AAAA,QAAA;AAAA,QAtEKgO,EAAK;AAAA,MAAA;AAAA,IAyEhB,CAAC;AAAA,IACA+T,KAAYvD,EAAM,SAASuD,KAC1BxhB,gBAAAA,EAAAA,KAAC,KAAA,EAAE,WAAU,oEAAmE,UAAA;AAAA,MAAA;AAAA,MAC1Eie,EAAM,SAASuD;AAAA,MAAS;AAAA,IAAA,EAAA,CAC9B;AAAA,EAAA,GAEJ;AAEJ,GC3IMS,KAAmB,MACnBC,KAAgB,qBAEhBC,KAAW;AAAA,EACf,SAAS;AAAA,IACP,MAAMC;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EAAA;AAAA,EAET,MAAM;AAAA,IACJ,MAAMC;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EAAA;AAAA,EAET,SAAS;AAAA,IACP,MAAMC;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EAAA;AAAA,EAET,OAAO;AAAA,IACL,MAAMA;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EAAA;AAEX;AAEA,IAAIC,KAAyB,MACzBC,KAAwC;AAC5C,MAAMC,yBAAgB,IAAA,GAChBC,KAA4B,CAAA,GAC5BC,yBAAsB,IAAA,GAEtBC,KAAgB,MAAM,SAAS,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,IACnFC,KAAc,CAACpV,MACnB,GAAGA,EAAK,IAAI,IAAIA,EAAK,OAAO,IAExBqV,KAAS,CAACrV,MAA2B;AACzC,MAAIgV,GAAU,SAAS,KAAKhV,GAAM;AAChC,IAAAiV,GAAa,KAAKjV,CAAI;AACtB;AAAA,EACF;AAEA,EAAAgV,GAAU,QAAQ,CAACM,MAAaA,EAAStV,CAAI,CAAC;AAChD,GAEMuV,KAAkB,MAAM;AAQ5B,MAPI,OAAO,WAAa,QACpBR,MAAkB,CAAC,SAAS,KAAK,SAASA,EAAc,MAC1DD,MAAA,QAAAA,GAAW,WACXA,KAAY,MACZC,KAAiB,MACjBC,GAAU,MAAA,IAERF,MAAaC,IAAgB;AAEjC,QAAMS,IAAW,SAAS,eAAef,EAAa;AACtD,EAAAM,KAAiBS,KAAY,SAAS,cAAc,KAAK,GACzDT,GAAe,KAAKN,IAEfe,KACH,SAAS,KAAK,YAAYT,EAAc,GAG1CD,KAAYW,GAAWV,EAAc,GACrCD,GAAU,OAAO9iB,gBAAAA,EAAAA,IAAC0jB,IAAA,CAAA,CAAc,CAAE;AACpC,GAEMC,KAAY,CAACL,OACjBN,GAAU,IAAIM,CAAQ,GACtBL,GAAa,OAAO,CAAC,EAAE,QAAQ,CAACjV,MAASsV,EAAStV,CAAI,CAAC,GAChD,MAAM;AACX,EAAAgV,GAAU,OAAOM,CAAQ;AAC3B,IAGII,KAA0B,MAAM;AACpC,QAAM,CAAClF,GAAOoF,CAAQ,IAAIlkB,EAA0B,CAAA,CAAE,GAChDmkB,IAAY3iB,GAAgC,oBAAI,KAAK,GAErD4iB,IAAavgB,EAAY,CAACvC,MAAe;AAC7C,UAAM+iB,IAAQF,EAAU,QAAQ,IAAI7iB,CAAE;AACtC,KAAI+iB,KAAA,gBAAAA,EAAO,cAAa,QAAQ,OAAO,SAAW,OAChD,OAAO,aAAaA,EAAM,SAAS,GAErCF,EAAU,QAAQ,OAAO7iB,CAAE;AAAA,EAC7B,GAAG,CAAA,CAAE,GAECgjB,IAAazgB,EAAY,CAACvC,MAAe;AAC7C,IAAI,OAAO,SAAW,QACtB8iB,EAAW9iB,CAAE,GACb4iB;AAAA,MAAS,CAACzG,MACRA,EAAK,IAAI,CAACnP,MAAUA,EAAK,OAAOhN,IAAK,EAAE,GAAGgN,GAAM,SAAS,GAAA,IAASA,CAAK;AAAA,IAAA;AAAA,EAE3E,GAAG,CAAC8V,CAAU,CAAC,GAETG,IAAa1gB,EAAY,CAACvC,GAAYkjB,MAAqB;AAC/D,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMC,IAAY,OAAO,WAAW,MAAMH,EAAWhjB,CAAE,GAAGkjB,CAAQ;AAClE,IAAAL,EAAU,QAAQ,IAAI7iB,GAAI;AAAA,MACxB,WAAAmjB;AAAA,MACA,WAAWD;AAAA,MACX,WAAW,KAAK,IAAA;AAAA,IAAI,CACrB;AAAA,EACH,GAAG,CAACF,CAAU,CAAC,GAETI,IAAa7gB,EAAY,CAACvC,MAAe;AAC7C,UAAM+iB,IAAQF,EAAU,QAAQ,IAAI7iB,CAAE;AACtC,IAAI,CAAC+iB,KAASA,EAAM,aAAa,QAAQ,OAAO,SAAW,QAC3D,OAAO,aAAaA,EAAM,SAAS,GACnCA,EAAM,YAAY,KAAK,IAAI,GAAGA,EAAM,aAAa,KAAK,IAAA,IAAQA,EAAM,UAAU,GAC9EA,EAAM,YAAY;AAAA,EACpB,GAAG,CAAA,CAAE,GAECM,IAAc9gB,EAAY,CAACvC,MAAe;AAC9C,UAAM+iB,IAAQF,EAAU,QAAQ,IAAI7iB,CAAE;AACtC,IAAI,CAAC+iB,KAASA,EAAM,aAAa,QACjCE,EAAWjjB,GAAI+iB,EAAM,SAAS;AAAA,EAChC,GAAG,CAACE,CAAU,CAAC,GAETK,IAAc/gB,EAAY,CAACvC,MAAe;AAC9C,IAAA8iB,EAAW9iB,CAAE,GACb4iB,EAAS,CAACzG,MAAS;AACjB,YAAMoH,IAAUpH,EAAK,KAAK,CAACnP,MAASA,EAAK,OAAOhN,CAAE;AAClD,aAAIujB,KACFrB,GAAgB,OAAOE,GAAYmB,CAAO,CAAC,GAEtCpH,EAAK,OAAO,CAACnP,MAASA,EAAK,OAAOhN,CAAE;AAAA,IAC7C,CAAC;AAAA,EACH,GAAG,CAAC8iB,CAAU,CAAC;AA4Bf,SA1BA/hB,EAAU,MAAM;AACd,UAAMyiB,IAASX,EAAU,SACnBY,IAAcd,GAAU,CAAC3V,MAAS;AACtC,UAAI,CAACA,GAAM;AACT,QAAAwW,EAAO,QAAQ,CAACT,MAAU;AACxB,UAAIA,EAAM,aAAa,QAAM,OAAO,aAAaA,EAAM,SAAS;AAAA,QAClE,CAAC,GACDS,EAAO,MAAA,GACPtB,GAAgB,MAAA,GAChBU,EAAS,CAAA,CAAE;AACX;AAAA,MACF;AAEA,MAAAA,EAAS,CAACzG,MAAS,CAAC,GAAGA,GAAM,EAAE,GAAGnP,GAAM,SAAS,GAAA,CAAO,CAAC,GACzDiW,EAAWjW,EAAK,IAAIA,EAAK,QAAQ;AAAA,IACnC,CAAC;AAED,WAAO,MAAM;AACX,MAAAyW,EAAA,GACAD,EAAO,QAAQ,CAACT,MAAU;AACxB,QAAIA,EAAM,aAAa,QAAM,OAAO,aAAaA,EAAM,SAAS;AAAA,MAClE,CAAC,GACDS,EAAO,MAAA;AAAA,IACT;AAAA,EACF,GAAG,CAACP,CAAU,CAAC,GAEXzF,EAAM,WAAW,IAAU,OAG7Bxe,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,wBAAoB;AAAA,MAEnB,UAAAwe,EAAM,IAAI,CAACxQ,MACVhO,gBAAAA,EAAAA;AAAAA,QAAC0kB;AAAA,QAAA;AAAA,UAEC,MAAA1W;AAAA,UACA,SAAS,MAAMgW,EAAWhW,EAAK,EAAE;AAAA,UACjC,UAAU,MAAMsW,EAAYtW,EAAK,EAAE;AAAA,UACnC,SAAS,MAAMoW,EAAWpW,EAAK,EAAE;AAAA,UACjC,UAAU,MAAMqW,EAAYrW,EAAK,EAAE;AAAA,QAAA;AAAA,QAL9BA,EAAK;AAAA,MAAA,CAOb;AAAA,IAAA;AAAA,EAAA;AAGP,GAEM0W,KAMD,CAAC,EAAE,MAAA1W,GAAM,SAAA2W,GAAS,UAAAliB,GAAU,SAAAmiB,GAAS,UAAAC,QAAe;AACvD,QAAMC,IAAOpC,GAAS1U,EAAK,IAAI,GACzBuS,IAAOuE,EAAK;AAElB,SACEvkB,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,2UACTyN,EAAK,UACD,qDACA,yCACN;AAAA,MACA,iBAAeA,EAAK;AAAA,MACpB,gBAAgB,MAAM;AACpB,QAAIA,EAAK,WAASvL,EAAA;AAAA,MACpB;AAAA,MACA,cAAcmiB;AAAA,MACd,cAAcC;AAAA,MACd,MAAK;AAAA,MACL,aAAU;AAAA,MAEV,UAAA;AAAA,QAAA7kB,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAW,8FAA8F8kB,EAAK,QAAQ,IACzH,UAAA9kB,gBAAAA,EAAAA,IAACugB,GAAA,EAAK,MAAM,GAAA,CAAI,GAClB;AAAA,QACAhgB,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,UAAAP,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,iEAAiE,UAAA8kB,EAAK,OAAM;AAAA,UAC3F9kB,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,mEAAmE,YAAK,QAAA,CAAQ;AAAA,QAAA,GACjG;AAAA,QACAA,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS2kB;AAAA,YACT,WAAU;AAAA,YACV,cAAW;AAAA,YAEX,UAAA3kB,gBAAAA,EAAAA,IAAC6Y,IAAA,EAAE,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MACf;AAAA,IAAA;AAAA,EAAA;AAGN;AAEO,MAAMkM,GAAM;AAAA,EACjB,OAAO,KAAKnhB,GAAiBnK,IAAkB,QAAQ6gB,IAAwB,CAAA,GAAI;AACjF,UAAM1gB,IAAMwpB,GAAY,EAAE,SAAAxf,GAAS,MAAAnK,GAAM;AACzC,IAAIypB,GAAgB,IAAItpB,CAAG,MAG3BspB,GAAgB,IAAItpB,CAAG,GACvB2pB,GAAA,GACAF,GAAO;AAAA,MACL,IAAIF,GAAA;AAAA,MACJ,SAAAvf;AAAA,MACA,MAAAnK;AAAA,MACA,UAAU6gB,EAAQ,YAAYkI;AAAA,IAAA,CAC/B;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ5e,GAAiB0W,GAAwB;AACtD,IAAAyK,GAAM,KAAKnhB,GAAS,WAAW0W,CAAO;AAAA,EACxC;AAAA,EAEA,OAAO,KAAK1W,GAAiB0W,GAAwB;AACnD,IAAAyK,GAAM,KAAKnhB,GAAS,QAAQ0W,CAAO;AAAA,EACrC;AAAA,EAEA,OAAO,QAAQ1W,GAAiB0W,GAAwB;AACtD,IAAAyK,GAAM,KAAKnhB,GAAS,WAAW0W,CAAO;AAAA,EACxC;AAAA,EAEA,OAAO,MAAM1W,GAAiB0W,GAAwB;AACpD,IAAAyK,GAAM,KAAKnhB,GAAS,SAAS0W,CAAO;AAAA,EACtC;AAAA,EAEA,OAAO,QAAQ;AACb,IAAA2I,GAAa,OAAO,CAAC,GACrBC,GAAgB,MAAA,GAChBG,GAAO,IAAI;AAAA,EACb;AAAA,EAEA,OAAO,gBAAgB;AACrB,IAAA0B,GAAM,MAAA,GACN/B,GAAU,MAAA,GACVF,MAAA,QAAAA,GAAW,WACPC,MAAA,QAAAA,GAAgB,cAClBA,GAAe,WAAW,YAAYA,EAAc,GAEtDD,KAAY,MACZC,KAAiB;AAAA,EACnB;AACF;ACpRA,MAAMiC,KAAa,GACbC,KAAa,8BAGbC,KAAuD;AAAA,EAC3D,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AACT;AAGA,SAASC,GACPtP,GACAuP,GACAnP,GACAoP,GACQ;AACR,UAAQD,GAAA;AAAA,IACN,KAAK;AACH,aAAOvP,EAAY,MAAMI;AAAA,IAC3B,KAAK;AACH,aAAOoP,EAAS,SAASxP,EAAY,SAASI;AAAA,IAChD,KAAK;AACH,aAAOJ,EAAY,OAAOI;AAAA,IAC5B,KAAK;AACH,aAAOoP,EAAS,QAAQxP,EAAY,QAAQI;AAAA,EAAA;AAElD;AAGA,SAASqP,GACPzP,GACA0P,GACAH,GACA3S,GACAwD,GACAoP,GACS;AACT,QAAMG,IACHJ,MAAc,SAASA,MAAc,WAClCG,EAAY,SAAS9S,IACrB8S,EAAY,QAAQ9S;AAC1B,SAAO0S,GAAkBtP,GAAauP,GAAWnP,GAAiBoP,CAAQ,KAAKG;AACjF;AAGA,SAASC,GACPL,GACAM,GACqB;AACrB,QAAMC,IAAS,GAAGX,EAAU,wBACtBY,IAAgB,GAAGZ,EAAU,YAAYC,EAAU;AAEzD,UAAQG,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,CAACJ;AAAA,QACT,MAAMU;AAAA,QACN,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAYC;AAAA,QACZ,aAAaA;AAAA,QACb,WAAWC;AAAA,MAAA;AAAA,IAEf,KAAK;AACH,aAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK,CAACZ;AAAA,QACN,MAAMU;AAAA,QACN,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAYC;AAAA,QACZ,aAAaA;AAAA,QACb,cAAcC;AAAA,MAAA;AAAA,IAElB,KAAK;AACH,aAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO,CAACZ;AAAA,QACR,KAAKU;AAAA,QACL,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAWC;AAAA,QACX,cAAcA;AAAA,QACd,YAAYC;AAAA,MAAA;AAAA,IAEhB,KAAK;AACH,aAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM,CAACZ;AAAA,QACP,KAAKU;AAAA,QACL,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAWC;AAAA,QACX,cAAcA;AAAA,QACd,aAAaC;AAAA,MAAA;AAAA,EACf;AAEN;AAWO,SAASC,GACdhQ,GACA0P,GACAH,GACA3S,GACAwD,IAA0B,GAC1BoP,IAAyB,OAAO,SAAW,MACvC,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,YAAA,IAC3C,EAAE,OAAO,MAAM,QAAQ,OACX;AAEhB,MAAIS,IAAkBV;AACtB,MAAI,CAACE,GAAgBzP,GAAa0P,GAAaH,GAAW3S,GAAQwD,GAAiBoP,CAAQ,GAAG;AAC5F,UAAMU,IAAWb,GAASE,CAAS;AACnC,IAAIE,GAAgBzP,GAAa0P,GAAaQ,GAAUtT,GAAQwD,GAAiBoP,CAAQ,MACvFS,IAAkBC;AAAA,EAGtB;AAEA,QAAM,EAAE,OAAOC,GAAI,QAAQC,MAAOV,GAC5BW,IAAiBrQ,EAAY,OAAOA,EAAY,QAAQ,GACxDsQ,IAAiBtQ,EAAY,MAAMA,EAAY,SAAS;AAE9D,MAAIuQ,GACAha,GACAsZ;AAEJ,UAAQI,GAAA;AAAA,IACN,KAAK;AACH,MAAAM,IAAIF,IAAiBF,IAAK,GAC1B5Z,IAAIyJ,EAAY,MAAMoQ,IAAKxT,GAC3BiT,IAAcQ,IAAiBE;AAC/B;AAAA,IACF,KAAK;AACH,MAAAA,IAAIF,IAAiBF,IAAK,GAC1B5Z,IAAIyJ,EAAY,SAASpD,GACzBiT,IAAcQ,IAAiBE;AAC/B;AAAA,IACF,KAAK;AACH,MAAAA,IAAIvQ,EAAY,OAAOmQ,IAAKvT,GAC5BrG,IAAI+Z,IAAiBF,IAAK,GAC1BP,IAAcS,IAAiB/Z;AAC/B;AAAA,IACF,KAAK;AACH,MAAAga,IAAIvQ,EAAY,QAAQpD,GACxBrG,IAAI+Z,IAAiBF,IAAK,GAC1BP,IAAcS,IAAiB/Z;AAC/B;AAAA,EAAA;AAIJ,MAAI0Z,MAAoB,SAASA,MAAoB;AACnD,QAAIM,IAAInQ;AACN,MAAAyP,KAAeU,IAAInQ,GACnBmQ,IAAInQ;AAAA,aACKmQ,IAAIJ,IAAKX,EAAS,QAAQpP,GAAiB;AACpD,YAAMoQ,IAAWD,IAAIJ,KAAMX,EAAS,QAAQpP;AAC5C,MAAAyP,KAAeW,GACfD,KAAKC;AAAA,IACP;AAAA;AAIF,MAAIP,MAAoB,UAAUA,MAAoB;AACpD,QAAI1Z,IAAI6J;AACN,MAAAyP,KAAetZ,IAAI6J,GACnB7J,IAAI6J;AAAA,aACK7J,IAAI6Z,IAAKZ,EAAS,SAASpP,GAAiB;AACrD,YAAMoQ,IAAWja,IAAI6Z,KAAMZ,EAAS,SAASpP;AAC7C,MAAAyP,KAAeW,GACfja,KAAKia;AAAA,IACP;AAAA;AAGF,QAAMC,IAAab,GAAgBK,GAAiBJ,CAAW;AAE/D,SAAO,EAAE,GAAAU,GAAG,GAAAha,GAAG,iBAAA0Z,GAAiB,YAAAQ,EAAA;AAClC;AChLA,SAASC,MACJC,GACqB;AACxB,SAAO,CAACC,MAAiB;AACvB,IAAAD,EAAK,QAAQ,CAACjnB,MAAQ;AACpB,MAAI,OAAOA,KAAQ,aACjBA,EAAIknB,CAAE,IACGlnB,KAAO,OAAOA,KAAQ,aAC9BA,EAAyC,UAAUknB;AAAA,IAExD,CAAC;AAAA,EACH;AACF;AAGA,SAASC,GAAetB,GAAqC;AAC3D,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EAAA;AAEb;AAQO,MAAMuB,KAAkC,CAAC;AAAA,EAC9C,SAAAC;AAAA,EACA,UAAAjqB;AAAA,EACA,WAAAyoB,IAAY;AAAA,EACZ,WAAAyB,IAAY;AAAA,EACZ,WAAAC,IAAY;AAAA,EACZ,UAAAnmB,IAAW;AAAA,EACX,WAAAlC;AAAA,EACA,QAAAgU,IAAS;AAAA,EACT,WAAAsU,IAAY;AACd,MAAM;AACJ,QAAM,CAACzS,GAAOC,CAAQ,IAAI7U,EAAgB,QAAQ,GAC5C,CAACsnB,GAAeC,CAAgB,IAAIvnB,EAA8B;AAAA,IACtE,UAAU;AAAA,IACV,eAAe;AAAA,EAAA,CAChB,GACK,CAAComB,GAAiBoB,CAAkB,IAAIxnB,EAA2B0lB,CAAS,GAC5E,CAACkB,GAAYa,CAAa,IAAIznB,EAA8B,CAAA,CAAE,GAE9D+H,IAAavG,GAAoB,IAAI,GACrCkmB,IAAalmB,GAAuB,IAAI,GACxCmmB,IAAenmB,GAAsC,MAAS,GAC9DomB,IAAepmB,GAAsC,MAAS,GAC9DqmB,IAAermB,GAAe,MAAS,GAGvCsmB,IAAcjkB,EAAY,MAAM;AACpC,iBAAa8jB,EAAa,OAAO,GACjC,aAAaC,EAAa,OAAO,GACjCD,EAAa,UAAU,QACvBC,EAAa,UAAU;AAAA,EACzB,GAAG,CAAA,CAAE,GAGCtV,IAAiBzO,EAAY,MAAM;AACvC,UAAMkkB,IAAYhgB,EAAW,SACvBigB,IAAYN,EAAW;AAC7B,QAAI,CAACK,KAAa,CAACC,EAAW;AAE9B,UAAM7R,IAAc4R,EAAU,sBAAA,GACxBlC,IAAc;AAAA,MAClB,OAAOmC,EAAU;AAAA,MACjB,QAAQA,EAAU;AAAA,IAAA,GAEdC,IAAS9B,GAAgBhQ,GAAa0P,GAAaH,GAAW3S,CAAM;AAC1E,IAAAwU,EAAiB;AAAA,MACf,UAAU;AAAA,MACV,MAAMU,EAAO;AAAA,MACb,KAAKA,EAAO;AAAA,MACZ,QAAQ;AAAA,MACR,eAAe;AAAA,IAAA,CAChB,GACDT,EAAmBS,EAAO,eAAe,GACzCR,EAAcQ,EAAO,UAAU;AAAA,EACjC,GAAG,CAACvC,GAAW3S,CAAM,CAAC,GAGhBmV,IAAOrkB,EAAY,MAAM;AAC7B,IAAI5C,MACJ6mB,EAAA,GACAH,EAAa,UAAU,WAAW,MAAM;AACtC,MAAA9S,EAAS,UAAU;AAAA,IACrB,GAAGsS,CAAS;AAAA,EACd,GAAG,CAAClmB,GAAUkmB,GAAWW,CAAW,CAAC,GAG/BK,IAAOtkB,EAAY,MAAM;AAC7B,IAAAikB,EAAA,GACAF,EAAa,UAAU,WAAW,MAAM;AACtC,MAAA/S,EAAS,SAAS;AAAA,IACpB,GAAGuS,CAAS;AAAA,EACd,GAAG,CAACA,GAAWU,CAAW,CAAC,GAErBM,IAAkBvkB,EAAY,MAAM;AACxC,IAAAikB,EAAA,GACID,EAAa,YAAY,WAC3B,qBAAqBA,EAAa,OAAO,GACzCA,EAAa,UAAU,SAEzBhT,EAAS,QAAQ;AAAA,EACnB,GAAG,CAACiT,CAAW,CAAC;AAGhB,EAAA/Q,GAAgB,MAAM;AACpB,IAAInC,MAAU,eACZtC,EAAA,GACAuV,EAAa,UAAU,sBAAsB,MAAM;AACjD,MAAAA,EAAa,UAAU,sBAAsB,MAAM;AACjD,QAAAhT,EAAS,SAAS;AAAA,MACpB,CAAC;AAAA,IACH,CAAC;AAAA,EAEL,GAAG,CAACD,GAAOtC,CAAc,CAAC,GAG1BjQ,EAAU,MAAM;AACd,QAAIuS,MAAU,WAAW;AACvB,YAAMyP,IAAQ,WAAW,MAAMxP,EAAS,QAAQ,GAAG,GAAG;AACtD,aAAO,MAAM,aAAawP,CAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAACzP,CAAK,CAAC,GAGVvS,EAAU,OACR,OAAO,iBAAiB,UAAU+lB,GAAiB;AAAA,IACjD,SAAS;AAAA,IACT,SAAS;AAAA,EAAA,CACV,GAEM,MAAM;AACX,WAAO,oBAAoB,UAAUA,GAAiB,EAAI;AAAA,EAC5D,IACC,CAACA,CAAe,CAAC,GAGpB/lB,EAAU,MAAM;AACd,QAAIuS,MAAU,aAAaA,MAAU,WAAY;AAEjD,UAAMyT,IAAe,MAAM/V,EAAA;AAC3B,kBAAO,iBAAiB,UAAU+V,GAAc,EAAE,SAAS,IAAM,GAE1D,MAAM;AACX,aAAO,oBAAoB,UAAUA,CAAY;AAAA,IACnD;AAAA,EACF,GAAG,CAACzT,GAAOtC,CAAc,CAAC,GAG1BjQ,EAAU,MACD,MAAM;AACX,IAAAylB,EAAA,GACID,EAAa,YAAY,UAC3B,qBAAqBA,EAAa,OAAO;AAAA,EAE7C,GACC,CAACC,CAAW,CAAC;AAGhB,QAAMQ,IAAqBzkB,EAAY,MAAMqkB,KAAQ,CAACA,CAAI,CAAC,GACrDK,IAAqB1kB,EAAY,MAAMskB,KAAQ,CAACA,CAAI,CAAC,GAErDK,IAAc5T,MAAU,WAC5B/T,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK6mB;AAAA,MACL,WAAWtpB;AAAA,QACT;AAAA,QACA4oB,GAAeZ,CAAe;AAAA,QAC9B;AAAA,QACAxR,MAAU,YAAY,0BAA0B;AAAA,QAChD7V;AAAA,MAAA;AAAA,MAEF,OAAOuoB;AAAA,MACP,MAAK;AAAA,MAEJ,UAAA;AAAA,QAAAJ;AAAA,QACAG,KAAa/mB,gBAAAA,EAAAA,IAAC,OAAA,EAAI,OAAOsmB,EAAA,CAAY;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IAEtC;AAEJ,SACE/lB,gBAAAA,EAAAA,KAAAuM,YAAA,EACG,UAAA;AAAA,IAAAqb,GAAaxrB,GAAU;AAAA,MACtB,KAAK4pB,GAAW5pB,EAAmE,KAAK8K,CAAU;AAAA,MAClG,gBAAgBugB;AAAA,MAChB,gBAAgBC;AAAA,IAAA,CACsD;AAAA,IACvEC,KAAezkB,GAAaykB,GAAa,SAAS,IAAI;AAAA,EAAA,GACzD;AAEJ,GC9NM/N,KAA8B;AA+BpC,SAASiO,GAAoBnrB,GAAaN,GAA0B;AAClE,SAAI,OAAOM,KAAS,YAAYA,MAAS,OAChC;AAAA,IACL,GAAIA;AAAA,IACJ,UAAAN;AAAA,EAAA,IAGGM;AACT;AAEA,SAASorB,GACPC,GACAC,GACAC,GACAC,GACS;AACT,QAAMC,IAAoBH,EAAQ,KAAA,EAAO,YAAA;AACzC,SAAKG,IAIEJ,EACJ,IAAI,CAACrrB,MAAS;AACb,UAAM4D,IAAQ2nB,EAASvrB,CAAI,EAAE,YAAA,GACvBN,IAAWgsB,GAAgB1rB,GAAMwrB,CAAW,GAC5CG,IAAmBP;AAAA,MACvB1rB;AAAA,MACA+rB;AAAA,MACAF;AAAA,MACAC;AAAA,IAAA,GAEIjZ,IAAU3O,EAAM,SAAS6nB,CAAiB;AAChD,WAAI,CAAClZ,KAAWoZ,EAAiB,WAAW,IACnC,OAEFpZ,IACH4Y,GAAanrB,GAAMN,CAAQ,IAC3ByrB,GAAanrB,GAAM2rB,CAAgB;AAAA,EACzC,CAAC,EACA,OAAO,CAAC3rB,MAAwBA,MAAS,IAAI,IArBvCqrB;AAsBX;AAEA,MAAM3iB,KAA6C;AAAA,EACjD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,SAASgjB,GACP1rB,GACAwrB,GACA;AACA,SAAIA,IACKA,EAAYxrB,CAAI,KAAK,CAAA,IAG5B,OAAOA,KAAS,YAChBA,MAAS,QACT,cAAeA,KACf,MAAM,QAASA,EAAkC,QAAQ,IAEhDA,EAAgC,YAAY,CAAA,IAEhD,CAAA;AACT;AAEA,SAAS4rB,GACPP,GACAxtB,GACAguB,GACAN,GACAC,GACc;AACd,aAAWxrB,KAAQqrB,GAAO;AACxB,QAAIQ,EAAS7rB,CAAI,MAAMnC;AACrB,aAAOmC;AAET,IAAAurB,EAASvrB,CAAI;AACb,UAAMN,IAAWgsB,GAAgB1rB,GAAMwrB,CAAW;AAClD,QAAI9rB,EAAS,SAAS,GAAG;AACvB,YAAM6S,IAAUqZ;AAAA,QACdlsB;AAAA,QACA7B;AAAA,QACAguB;AAAA,QACAN;AAAA,QACAC;AAAA,MAAA;AAEF,UAAIjZ;AACF,eAAOA;AAAA,IAEX;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASuZ,GACPT,GACAU,GACAF,GACAL,GACa;AACb,QAAMQ,wBAAoB,IAAA,GAEpBC,IAAqB,CAACjsB,MAAgB;AAC1C,IAAA0rB,GAAgB1rB,GAAMwrB,CAAW,EAAE,QAAQ,CAACU,MAAU;AACpD,MAAAF,EAAc,IAAIH,EAASK,CAAK,CAAC,GACjCD,EAAmBC,CAAK;AAAA,IAC1B,CAAC;AAAA,EACH,GAEMC,IAAQ,CAACC,GAAuBC,MAAiC;AACrE,eAAWrsB,KAAQosB,GAAc;AAC/B,YAAME,IAAYT,EAAS7rB,CAAI;AAC/B,UAAIssB,MAAcP;AAChB,eAAAM,EAAU,QAAQ,CAACE,MAAaP,EAAc,IAAIO,CAAQ,CAAC,GAC3DN,EAAmBjsB,CAAI,GAChB;AAET,UACEmsB,EAAMT,GAAgB1rB,GAAMwrB,CAAW,GAAG,CAAC,GAAGa,GAAWC,CAAS,CAAC;AAEnE,eAAO;AAAA,IAEX;AACA,WAAO;AAAA,EACT;AAEA,SAAAH,EAAMd,GAAO,EAAE,GACRW;AACT;AAEA,SAASQ,GACPnB,GACAQ,GACAL,GACAiB,IAAuB,GACvB;AACA,QAAM5sB,IAAiB,CAAA,GACjBssB,IAAQ,CAACC,GAAuBM,MAAkB;AACtD,IAAIA,KAASD,KAGbL,EAAa,QAAQ,CAACpsB,MAAS;AAC7B,YAAMN,IAAWgsB,GAAgB1rB,GAAMwrB,CAAW;AAClD,MAAI9rB,EAAS,WAAW,MAGxBG,EAAK,KAAKgsB,EAAS7rB,CAAI,CAAC,GACxBmsB,EAAMzsB,GAAUgtB,IAAQ,CAAC;AAAA,IAC3B,CAAC;AAAA,EACH;AACA,SAAAP,EAAMd,GAAO,CAAC,GACPxrB;AACT;AAEO,MAAM8sB,KAAa,CAAS;AAAA,EACjC,OAAAtB;AAAA,EACA,OAAAxtB;AAAA,EACA,UAAAiG;AAAA,EACA,QAAA6M;AAAA,EACA,cAAAic,IAAe,CAAA;AAAA,EACf,eAAAC;AAAA,EACA,UAAA3S,IAAW;AAAA,EACX,6BAAA4S,IAA8B;AAAA,EAC9B,YAAAxP,IAAa;AAAA,EACb,qBAAAyP,IAAsB;AAAA,EACtB,mBAAAnP,IAAoB;AAAA,EACpB,UAAAiO;AAAA,EACA,UAAAN;AAAA,EACA,aAAAC;AAAA,EACA,kBAAAwB;AAAA,EACA,cAAAC;AAAA,EACA,sBAAAR,IAAuB;AAAA,EACvB,aAAA7jB,IAAc;AAAA,EACd,UAAAlF,IAAW;AAAA,EACX,SAAAsa,IAAU;AAAA,EACV,WAAAH,IAAY;AAAA,EACZ,WAAArc;AAAA,EACA,MAAAF,IAAO;AACT,MAA8B;AAC5B,QAAM4rB,IAAiB1hB,GAAQ,MAAM,IAAI,IAAIohB,CAAY,GAAG,CAACA,CAAY,CAAC,GACpE,CAACtO,GAAQC,CAAS,IAAI9b,EAAS,EAAK,GACpC,CAAC2G,GAAgBC,CAAiB,IAAI5G,EAAS,EAAK,GACpD,CAAC0qB,GAAcC,CAAe,IAAI3qB,EAAS,EAAK,GAChD,CAACyI,GAAcwT,CAAe,IAAIjc,EAAS,EAAK,GAChD,CAAC4qB,GAAcC,CAAe,IAAI7qB;AAAA,IACtC+pB,GAAuBnB,GAAOQ,GAAUL,GAAaiB,CAAoB;AAAA,EAAA,GAErE,CAACc,GAAeC,EAAgB,IAAI/qB,EAAS,EAAE,GAC/C,CAAC2H,IAAeC,CAAgB,IAAI5H,EAA8B;AAAA,IACtE,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EAAA,CACT,GACKkV,IAAe1T,GAAuB,IAAI,GAC1CwG,IAAYxG,GAAuB,IAAI,GACvCqF,IAAkBrF,GAAsC,IAAI,GAE5DyG,KAAyBpE,EAAY,MAAM;;AAC/C,QAAI,CAACqR,EAAa;AAChB;AAEF,UAAMhN,IAAOgN,EAAa,QAAQ,sBAAA,GAE5B5M,MAAiBC,IAAAP,EAAU,YAAV,gBAAAO,EAAmB,iBADlB,KAElBC,IAAM,GACN+N,IAAkB,GAClByU,KAAe,OAAO,cAAc9iB,EAAK,SAASI,GAClDI,KAAMsiB,KACR,KAAK,IAAIzU,GAAiBrO,EAAK,MAAMI,IAAiBE,CAAG,IACzD,KAAK,IAAI,OAAO,cAAc+N,GAAiBrO,EAAK,SAASM,CAAG,GAC9DsU,KAAiB,KAAK,IAAI,GAAG,OAAO,aAAavG,IAAkB,CAAC,GACpEwG,KAAe,KAAK,IAAI7U,EAAK,OAAO4U,EAAc,GAClDE,KAAW,KAAK,IAAI,KAAK,IAAID,IAAcA,KAAe,GAAG,GAAGD,IAAgB,GAAG,GACnFmO,IAAQ,KAAK;AAAA,MACjBlO;AAAA,MACA,KAAK;AAAA,QACHC;AAAA,QACA,KAAK,IAAID,MAAcvK,KAAAxK,EAAU,YAAV,gBAAAwK,GAAmB,gBAAeuK,EAAY;AAAA,MAAA;AAAA,IACvE,GAEIlU,IAAO,KAAK;AAAA,MAChB,KAAK,IAAI0N,GAAiBrO,EAAK,IAAI;AAAA,MACnC,KAAK,IAAIqO,GAAiB,OAAO,aAAa0U,IAAQ1U,CAAe;AAAA,IAAA;AAGvE,IAAA0F,EAAgB+O,EAAY,GAC5BpjB,EAAiB;AAAA,MACf,UAAU;AAAA,MACV,KAAAc;AAAA,MACA,MAAAG;AAAA,MACA,OAAO;AAAA,MACP,UAAUkU;AAAA,MACV,UAAAC;AAAA,MACA,QAAQ;AAAA,IAAA,CACT,GACD2N,EAAgB,EAAI;AAAA,EACtB,GAAG,CAAA,CAAE,GAECO,KACJ9vB,KAAS,OAAO,OAAO+tB,GAAgBP,GAAOxtB,GAAOguB,GAAUN,GAAUC,CAAW,GAEhFvM,IAAiB/E,IAAYvJ,KAAU,CAAA,IAAM,CAAA,GAC7Cid,KAA0B3pB,GAAOgb,CAAc;AACrD,EAAA2O,GAAwB,UAAU3O;AAElC,QAAM4O,IAAgB5O,EACnB;AAAA,IAAI,CAACsB,MACJqL,GAAgBP,GAAO9K,GAAesL,GAAUN,GAAUC,CAAW;AAAA,EAAA,EAEtE,OAAO,CAACxrB,MAAwBA,MAAS,IAAI,GAE1C8tB,KAAe1C;AAAA,IACnBC;AAAA,IACA/N,IAAaiQ,IAAgB;AAAA,IAC7BhC;AAAA,IACAC;AAAA,EAAA,GAEIuC,KACJhB,KAAuBzP,KAAciQ,EAAc,KAAA,EAAO,SAAS;AAErE,EAAAzoB,EAAU,MAAM;AACd,IAAAwoB;AAAA,MACEd;AAAA,QACEnB;AAAA,QACAQ;AAAA,QACAL;AAAA,QACAiB;AAAA,MAAA;AAAA,IACF;AAAA,EAIJ,GAAG,CAACA,GAAsBpB,CAAK,CAAC,GAEhCvmB,EAAU,MACD,MAAM;AACX,IAAIwE,EAAgB,WAClB,aAAaA,EAAgB,OAAO;AAAA,EAExC,GACC,CAAA,CAAE,GAELxE,EAAU,MAAM;AACd,QAAI,CAACwZ,GAAQ;AACX,MAAA8O,EAAgB,EAAK;AACrB;AAAA,IACF;AACA,UAAMY,IAAqB,CAAChrB,OAAsB;;AAChD,YAAM4J,IAAS5J,GAAM;AACrB,OAAIgI,IAAA2M,EAAa,YAAb,QAAA3M,EAAsB,SAAS4B,OAG/BqI,IAAAxK,EAAU,YAAV,QAAAwK,EAAmB,SAASrI,OAG5BtD,EAAgB,WAClB,aAAaA,EAAgB,OAAO,GAEtCD,EAAkB,EAAI,GACtBC,EAAgB,UAAU,WAAW,MAAM;AACzC,QAAAiV,EAAU,EAAK,GACflV,EAAkB,EAAK;AAAA,MACzB,GAAG,GAAG;AAAA,IACR;AACA,oBAAS,iBAAiB,aAAa2kB,CAAkB,GAClD,MAAM,SAAS,oBAAoB,aAAaA,CAAkB;AAAA,EAC3E,GAAG,CAAC1P,CAAM,CAAC,GAEX9E,GAAgB,MAAM;AACpB,QAAI,CAAC8E;AACH;AAGF,IAAA5T,GAAA;AACA,UAAM8B,IAAU,OAAO,sBAAsB9B,EAAsB;AACnE,kBAAO,iBAAiB,UAAUA,IAAwB,EAAI,GAC9D,OAAO,iBAAiB,UAAUA,EAAsB,GAEjD,MAAM;AACX,aAAO,qBAAqB8B,CAAO,GACnC,OAAO,oBAAoB,UAAU9B,IAAwB,EAAI,GACjE,OAAO,oBAAoB,UAAUA,EAAsB;AAAA,IAC7D;AAAA,EACF,GAAG,CAAC4T,GAAQ+M,GAAOrN,GAAStT,EAAsB,CAAC,GAEnD5F,EAAU,MAAM;AACd,IAAKwZ,KACHkP,GAAiB,EAAE;AAAA,EAEvB,GAAG,CAAClP,CAAM,CAAC;AAEX,QAAMjS,KAAgB,MAAM;AAC1B,IAAI/C,EAAgB,WAClB,aAAaA,EAAgB,OAAO,GAOtCD,EAAkB,EAAI,GACtBC,EAAgB,UAAU,WAAW,MAAM;AACzC,MAAAiV,EAAU,EAAK,GACflV,EAAkB,EAAK;AAAA,IACzB,GAAG6T,EAA2B;AAAA,EAChC,GAEM5Q,KAAyB,MAAM;AACnC,IAAIhD,EAAgB,WAClB,aAAaA,EAAgB,OAAO,GAEtCiV,EAAU,EAAK,GACflV,EAAkB,EAAK;AAAA,EACzB,GAEMsW,KAAe,MAAM;AACzB,IAAIrW,EAAgB,WAClB,aAAaA,EAAgB,OAAO,GAEtC8jB,EAAgB,EAAK,GACrB1iB,GAAA,GACA6T,EAAU,EAAI,GACdlV,EAAkB,EAAK;AAAA,EACzB,GAEM6b,KAAe,CAACoH,MAAsB;AAC1C,IAAAgB;AAAA,MAAgB,CAACW,OACfA,GAAQ,SAAS3B,CAAS,IACtB2B,GAAQ,OAAO,CAACtxB,MAAQA,MAAQ2vB,CAAS,IACzC,CAAC,GAAG2B,IAAS3B,CAAS;AAAA,IAAA;AAAA,EAE9B,GAEM4B,KAAa,CAACluB,GAAa0sB,OAAmC;AAClE,UAAMJ,IAAYT,EAAS7rB,CAAI,GACzBN,IAAWgsB,GAAgB1rB,GAAMwrB,CAAW,GAC5C2C,IAAczuB,EAAS,SAAS,GAChC0lB,KACJ2I,MAA6BV,EAAa,SAASf,CAAS,GACxD8B,MAAapB,KAAA,gBAAAA,EAAmBhtB,OAAS,IACzCquB,KAAiB,CAACD,MAAcD,GAChCje,KAAagK,IACf+E,EAAe,SAASqN,CAAS,IACjCzuB,MAAUyuB;AAEd,WACEhpB,gBAAAA,EAAAA,KAAC,OAAA,EAAoB,WAAU,aAC7B,UAAA;AAAA,MAAAA,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWzC;AAAA,YACT;AAAA,YACAqP,KACI,uFACAke,MAAcC,KACZ,yFACA;AAAA,UAAA;AAAA,UAER,OAAO,EAAE,aAAa,GAAG3B,KAAQ,KAAK,CAAC,KAAA;AAAA,UAEtC,UAAA;AAAA,YAAAyB,IACCprB,gBAAAA,EAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,eAAa,sBAAsBupB,CAAS;AAAA,gBAC5C,WAAU;AAAA,gBACV,SAAS,CAACtpB,OAAU;AAClB,kBAAAA,GAAM,gBAAA,GACNkiB,GAAaoH,CAAS;AAAA,gBACxB;AAAA,gBAEC,UAAAlH,2BACEkJ,IAAA,EAAkB,MAAM,GAAA,CAAI,IAE7BvrB,gBAAAA,EAAAA,IAACgN,IAAA,EAAa,MAAM,IAAI;AAAA,cAAA;AAAA,YAAA,IAI5BhN,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,0BAAyB;AAAA,YAE3CO,gBAAAA,EAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,eAAa,sBAAsBgpB,CAAS;AAAA,gBAC5C,iBAAe,CAAC8B;AAAA,gBAChB,WAAWvtB;AAAA,kBACT;AAAA,kBACAutB,KAAa,mBAAmB;AAAA,gBAAA;AAAA,gBAElC,SAAS,CAACprB,OAAU;AAClB,sBAAI,CAACorB,IAAY;AACf,oBAAID,KAAe,CAAC/I,OAClBpiB,GAAM,gBAAA,GACNkiB,GAAaoH,CAAS;AAExB;AAAA,kBACF;AACA,sBAAIpS,GAAU;AACZ,0BAAMqU,IAAgBX,GAAwB,SACxCY,IAASD,EAAc,SAASjC,CAAS;AAC/C,wBAAIkC,KAAUtB,EAAe,IAAIZ,CAAS;AACxC;AAEF,wBAAImC,IAAaF,EAAc;AAAA,sBAC7B,CAACxd,OAASA,OAASub;AAAA,oBAAA;AAErB,wBAAI,CAACkC,GAAQ;AACX,0BAAI1B,GAA6B;AAC/B,8BAAMd,KAAgBF;AAAA,0BACpBT;AAAA,0BACAiB;AAAA,0BACAT;AAAA,0BACAL;AAAA,wBAAA;AAEF,wBAAAiD,IAAaA,EAAW;AAAA,0BACtB,CAAC1d,OAAS,CAACib,GAAc,IAAIjb,EAAI;AAAA,wBAAA;AAAA,sBAErC;AACA,sBAAA0d,EAAW,KAAKnC,CAAS;AAAA,oBAC3B;AACA,0BAAMoC,KAAYD,EACf;AAAA,sBAAI,CAAC1d,OACJ6a;AAAA,wBACEP;AAAA,wBACAta;AAAA,wBACA8a;AAAA,wBACAN;AAAA,wBACAC;AAAA,sBAAA;AAAA,oBACF,EAED,OAAO,CAACza,OAAwBA,OAAS,IAAI;AAChD,oBAAA6c,GAAwB,UAAUa,GAClC5B,KAAA,QAAAA,EAAgB4B,GAAYC;AAC5B;AAAA,kBACF;AAEA,kBAAA5qB,EAASwoB,GAAWtsB,CAAI,GACxBsM,GAAA;AAAA,gBACF;AAAA,gBAEC,UAAA;AAAA,kBAAA2gB,KAAA,gBAAAA,EAAejtB;AAAA,wCACf,QAAA,EAAK,WAAU,YAAY,UAAAurB,EAASvrB,CAAI,EAAA,CAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAC7C;AAAA,QAAA;AAAA,MAAA;AAAA,MAEDmuB,KAAe/I,MACdriB,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,aACZ,UAAArD,EAAS,IAAI,CAACwsB,OAAUgC,GAAWhC,IAAOQ,KAAQ,CAAC,CAAC,GACvD;AAAA,IAAA,EAAA,GAjGMJ,CAmGV;AAAA,EAEJ;AAEA,SACEhpB,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKqU;AAAA,MACL,WAAW9W,EAAG,YAAYW,CAAS;AAAA,MACnC,WAAW,CAACwB,MAAU;AACpB,YAAI,CAAAU,GAGJ;AAAA,cAAI,CAAC4a,MAAWtb,EAAM,QAAQ,WAAWA,EAAM,QAAQ,MAAM;AAC3D,YAAAA,EAAM,eAAA,GACN2c,GAAA;AACA;AAAA,UACF;AACA,UAAIrB,KAAUtb,EAAM,QAAQ,aAC1BA,EAAM,eAAA,GACNsJ,GAAA;AAAA;AAAA,MAEJ;AAAA,MAEA,UAAA;AAAA,QAAAhJ,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,eAAY;AAAA,YACZ,UAAAI;AAAA,YACA,SAAS,MAAM;AACb,kBAAI,CAAAA,GAGJ;AAAA,oBAAI4a,GAAQ;AACV,kBAAAjS,GAAA;AACA;AAAA,gBACF;AACA,gBAAAsT,GAAA;AAAA;AAAA,YACF;AAAA,YACA,WAAW9e;AAAA,cACT;AAAA,cACAE,GAAa;AAAA,cACb2H,GAAWpH,CAAI;AAAA,cACfoC,IACI,2GACA4a,IACE,oFACA;AAAA,YAAA;AAAA,YAGP,UAAA;AAAA,cAAApE,IACCnX,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,8CACZ,UAAA8qB,EAAc,SAAS,IAAIA,EAAc,IAAI,CAAC7tB,MAAS;AACtD,sBAAMssB,KAAYT,EAAS7rB,CAAI;AAC/B,uBACEsD,gBAAAA,EAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEC,WAAU;AAAA,oBAET,UAAA;AAAA,sBAAAioB,EAASvrB,CAAI;AAAA,sBACZktB,EAAe,IAAIZ,EAAS,IAyB1B,OAxBFvpB,gBAAAA,EAAAA;AAAAA,wBAAC6Y;AAAA,wBAAA;AAAA,0BACC,MAAM;AAAA,0BACN,cAAY,MAAM2P,EAASvrB,CAAI,CAAC;AAAA,0BAChC,WAAU;AAAA,0BACV,SAAS,CAACgD,MAAU;AAClB,4BAAAA,EAAM,gBAAA;AACN,kCAAMyrB,IAAab,GAAwB,QAAQ;AAAA,8BACjD,CAAC7c,OAASA,OAASub;AAAA,4BAAA,GAEfoC,IAAYD,EACf;AAAA,8BAAI,CAAC1d,OACJ6a;AAAA,gCACEP;AAAA,gCACAta;AAAA,gCACA8a;AAAA,gCACAN;AAAA,gCACAC;AAAA,8BAAA;AAAA,4BACF,EAED,OAAO,CAACza,OAAwBA,OAAS,IAAI;AAChD,4BAAA6c,GAAwB,UAAUa,GAClC5B,KAAA,QAAAA,EAAgB4B,GAAYC;AAAA,0BAC9B;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAEA;AAAA,kBAAA;AAAA,kBA7BCpC;AAAA,gBAAA;AAAA,cAgCX,CAAC,IAAIvpB,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,8CAA8C,UAAA6F,EAAA,CAAY,EAAA,CACjF,IACE+kB,KACF5qB,gBAAAA,EAAAA,IAAC,UAAK,WAAU,0DACb,YAAS4qB,EAAY,GACxB,IAEA5qB,gBAAAA,MAAC,QAAA,EAAK,WAAU,sEACb,UAAA6F,GACH;AAAA,cAEF7F,gBAAAA,EAAAA;AAAAA,gBAACke;AAAA,gBAAA;AAAA,kBACC,MAAM;AAAA,kBACN,WAAWpgB;AAAA,oBACT;AAAA,oBACAyd,KAAU;AAAA,kBAAA;AAAA,gBACZ;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAGDA,KACC9X;AAAA,UACElD,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKmH;AAAA,cACL,eAAY;AAAA,cACZ,WAAW5J;AAAA,gBACTE,GAAa;AAAA,gBACb;AAAA,cAAA;AAAA,cAEF,OAAO;AAAA,gBACL,GAAGqJ;AAAA,gBACH,WAAWhB,IACP8B,IACE,iDACA,8CACFA,IACE,wCACA;AAAA,gBACN,iBAAiB8R,GAAwB9R,CAAY;AAAA,gBACrD,YAAYiiB,IAAe,SAAY;AAAA,cAAA;AAAA,cAGxC,UAAA;AAAA,gBAAA7P,0BACE,OAAA,EAAI,WAAU,4DACb,UAAAha,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,yFACb,UAAA;AAAA,wCAACod,IAAA,EAAO,MAAM,IAAI,WAAU,uDAAsD;AAAA,kBAClF3d,gBAAAA,EAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,aAAa6a;AAAA,sBACb,OAAO2P;AAAA,sBACP,UAAU,CAACvqB,MAAUwqB,GAAiBxqB,EAAM,OAAO,KAAK;AAAA,sBACxD,WAAS;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACX,EAAA,CACF,EAAA,CACF,IACE;AAAA,sCACH,OAAA,EAAI,WAAU,uCACZ,UAAAgb,IACCjb,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,gFAA+E,UAAA,SAAA,CAE9F,IACE+qB,GAAa,WAAW,IAC1B/qB,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,gFACZ,UAAA8a,GACH,IAEAiQ,GAAa,IAAI,CAAC9tB,MAASkuB,GAAWluB,GAAM,CAAC,CAAC,GAElD;AAAA,gBACCka,KAAY+E,EAAe,KAAK,CAAClO,MAAS,CAACmc,EAAe,IAAInc,CAAI,CAAC,IAClEzN,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,oGACb,UAAA;AAAA,kBAAAA,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,0DAAyD,UAAA;AAAA,oBAAA;AAAA,oBAAI2b,EAAe;AAAA,oBAAO;AAAA,kBAAA,GAAE;AAAA,kBACrGlc,gBAAAA,EAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS,MAAM;AACb,8BAAM0rB,IAAab,GAAwB,QAAQ,OAAO,CAAC7c,MACzDmc,EAAe,IAAInc,CAAI,CAAC,GACpB2d,KAAYD,EACf,IAAI,CAAC1d,MACJ6a,GAAgBP,GAAOta,GAAM8a,GAAUN,GAAUC,CAAW,CAAC,EAC9D,OAAO,CAACza,MAAwBA,MAAS,IAAI;AAChD,wBAAA6c,GAAwB,UAAUa,GAClC5B,KAAA,QAAAA,EAAgB4B,GAAYC;AAAA,sBAC9B;AAAA,sBACD,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAED,EAAA,CACF,IACE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEN,SAAS;AAAA,QAAA;AAAA,MACX;AAAA,IAAA;AAAA,EAAA;AAGR;","x_google_ignoreList":[0,1,2]}