dock-rush 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-2AQ6S3IJ.mjs +2 -0
- package/dist/chunk-2AQ6S3IJ.mjs.map +1 -0
- package/dist/client.cjs +4 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.mts +32 -0
- package/dist/client.d.ts +32 -0
- package/dist/client.mjs +4 -0
- package/dist/client.mjs.map +1 -0
- package/dist/markdown-viewer-2GZNJGML.mjs +2 -0
- package/dist/markdown-viewer-2GZNJGML.mjs.map +1 -0
- package/dist/plugin.cjs +4 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.mts +104 -0
- package/dist/plugin.d.ts +104 -0
- package/dist/plugin.mjs +4 -0
- package/dist/plugin.mjs.map +1 -0
- package/dist/style.css +2 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/utils.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/class-group-utils.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/lru-cache.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/parse-class-name.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/sort-modifiers.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/config-utils.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/merge-classlist.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/tw-join.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/create-tailwind-merge.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/from-theme.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/validators.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/default-config.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/merge-configs.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/extend-tailwind-merge.ts","../node_modules/.pnpm/tailwind-merge@3.4.0/node_modules/tailwind-merge/src/lib/tw-merge.ts","../src/lib/utils.ts","../src/components/ui/skeleton.tsx","../node_modules/.pnpm/@radix-ui+react-compose-ref_ba80fe21e488cb1cb998cc5fbb81f69a/node_modules/@radix-ui/react-compose-refs/src/compose-refs.tsx","../node_modules/.pnpm/@radix-ui+react-slot@1.2.4_@types+react@19.2.4_react@19.2.0/node_modules/@radix-ui/react-slot/src/slot.tsx","../node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.mjs","../src/components/ui/button.tsx","../src/components/doc-page/markdown-viewer.tsx","../src/client.ts","../src/components/doc-page/markdown-viewer.lazy.tsx","../src/components/errors-list/errors-list.tsx","../src/components/language-toggle.tsx","../src/components/ui/select.tsx","../src/components/logo.tsx","../src/components/search-bar.tsx","../src/components/ui/command.tsx","../src/components/ui/dialog.tsx","../src/lib/documentation/helpers/getAvailableLanguages.ts","../src/lib/documentation/helpers/getEntityType.ts","../src/lib/documentation/helpers/types-helper.ts","../src/lib/documentation/helpers/getSortEntities.ts","../src/lib/documentation/helpers/getTitle.ts","../src/lib/documentation/helpers/patternsFiles.ts","../src/components/sidebar/sidebar.tsx","../src/components/ui/sidebar.tsx","../src/components/ui/input.tsx","../src/components/ui/separator.tsx","../src/components/ui/sheet.tsx","../src/components/ui/tooltip.tsx","../src/hooks/use-mobile.tsx","../src/lib/documentation/icon-resolver.ts","../src/components/sidebar/documentation-entity-item.tsx","../src/components/theme-toggle.tsx","../src/hooks/useDocumentationRouter.ts","../src/lib/documentation/frontmatter-parser.ts","../src/lib/errorBuilder/error-builder.ts","../src/lib/documentation/client-parser.ts","../src/components/doc-page/doc-page.tsx"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/**\n * Concatenates two arrays faster than the array spread operator.\n */\nexport const concatArrays = <T, U>(\n array1: readonly T[],\n array2: readonly U[],\n): readonly (T | U)[] => {\n // Pre-allocate for better V8 optimization\n const combinedArray: (T | U)[] = new Array(array1.length + array2.length)\n for (let i = 0; i < array1.length; i++) {\n combinedArray[i] = array1[i]!\n }\n for (let i = 0; i < array2.length; i++) {\n combinedArray[array1.length + i] = array2[i]!\n }\n return combinedArray\n}\n","import {\n AnyClassGroupIds,\n AnyConfig,\n AnyThemeGroupIds,\n ClassGroup,\n ClassValidator,\n Config,\n ThemeGetter,\n ThemeObject,\n} from './types'\nimport { concatArrays } from './utils'\n\nexport interface ClassPartObject {\n nextPart: Map<string, ClassPartObject>\n validators: ClassValidatorObject[] | null\n classGroupId: AnyClassGroupIds | undefined // Always define optional props for consistent shape\n}\n\ninterface ClassValidatorObject {\n classGroupId: AnyClassGroupIds\n validator: ClassValidator\n}\n\n// Factory function ensures consistent object shapes\nconst createClassValidatorObject = (\n classGroupId: AnyClassGroupIds,\n validator: ClassValidator,\n): ClassValidatorObject => ({\n classGroupId,\n validator,\n})\n\n// Factory ensures consistent ClassPartObject shape\nconst createClassPartObject = (\n nextPart: Map<string, ClassPartObject> = new Map(),\n validators: ClassValidatorObject[] | null = null,\n classGroupId?: AnyClassGroupIds,\n): ClassPartObject => ({\n nextPart,\n validators,\n classGroupId,\n})\n\nconst CLASS_PART_SEPARATOR = '-'\n\nconst EMPTY_CONFLICTS: readonly AnyClassGroupIds[] = []\n// I use two dots here because one dot is used as prefix for class groups in plugins\nconst ARBITRARY_PROPERTY_PREFIX = 'arbitrary..'\n\nexport const createClassGroupUtils = (config: AnyConfig) => {\n const classMap = createClassMap(config)\n const { conflictingClassGroups, conflictingClassGroupModifiers } = config\n\n const getClassGroupId = (className: string) => {\n if (className.startsWith('[') && className.endsWith(']')) {\n return getGroupIdForArbitraryProperty(className)\n }\n\n const classParts = className.split(CLASS_PART_SEPARATOR)\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and skip it.\n const startIndex = classParts[0] === '' && classParts.length > 1 ? 1 : 0\n return getGroupRecursive(classParts, startIndex, classMap)\n }\n\n const getConflictingClassGroupIds = (\n classGroupId: AnyClassGroupIds,\n hasPostfixModifier: boolean,\n ): readonly AnyClassGroupIds[] => {\n if (hasPostfixModifier) {\n const modifierConflicts = conflictingClassGroupModifiers[classGroupId]\n const baseConflicts = conflictingClassGroups[classGroupId]\n\n if (modifierConflicts) {\n if (baseConflicts) {\n // Merge base conflicts with modifier conflicts\n return concatArrays(baseConflicts, modifierConflicts)\n }\n // Only modifier conflicts\n return modifierConflicts\n }\n // Fall back to without postfix if no modifier conflicts\n return baseConflicts || EMPTY_CONFLICTS\n }\n\n return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS\n }\n\n return {\n getClassGroupId,\n getConflictingClassGroupIds,\n }\n}\n\nconst getGroupRecursive = (\n classParts: string[],\n startIndex: number,\n classPartObject: ClassPartObject,\n): AnyClassGroupIds | undefined => {\n const classPathsLength = classParts.length - startIndex\n if (classPathsLength === 0) {\n return classPartObject.classGroupId\n }\n\n const currentClassPart = classParts[startIndex]!\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart)\n\n if (nextClassPartObject) {\n const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject)\n if (result) return result\n }\n\n const validators = classPartObject.validators\n if (validators === null) {\n return undefined\n }\n\n // Build classRest string efficiently by joining from startIndex onwards\n const classRest =\n startIndex === 0\n ? classParts.join(CLASS_PART_SEPARATOR)\n : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR)\n const validatorsLength = validators.length\n\n for (let i = 0; i < validatorsLength; i++) {\n const validatorObj = validators[i]!\n if (validatorObj.validator(classRest)) {\n return validatorObj.classGroupId\n }\n }\n\n return undefined\n}\n\n/**\n * Get the class group ID for an arbitrary property.\n *\n * @param className - The class name to get the group ID for. Is expected to be string starting with `[` and ending with `]`.\n */\nconst getGroupIdForArbitraryProperty = (className: string): AnyClassGroupIds | undefined =>\n className.slice(1, -1).indexOf(':') === -1\n ? undefined\n : (() => {\n const content = className.slice(1, -1)\n const colonIndex = content.indexOf(':')\n const property = content.slice(0, colonIndex)\n return property ? ARBITRARY_PROPERTY_PREFIX + property : undefined\n })()\n\n/**\n * Exported for testing only\n */\nexport const createClassMap = (config: Config<AnyClassGroupIds, AnyThemeGroupIds>) => {\n const { theme, classGroups } = config\n return processClassGroups(classGroups, theme)\n}\n\n// Split into separate functions to maintain monomorphic call sites\nconst processClassGroups = (\n classGroups: Record<AnyClassGroupIds, ClassGroup<AnyThemeGroupIds>>,\n theme: ThemeObject<AnyThemeGroupIds>,\n): ClassPartObject => {\n const classMap = createClassPartObject()\n\n for (const classGroupId in classGroups) {\n const group = classGroups[classGroupId]!\n processClassesRecursively(group, classMap, classGroupId, theme)\n }\n\n return classMap\n}\n\nconst processClassesRecursively = (\n classGroup: ClassGroup<AnyThemeGroupIds>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n const len = classGroup.length\n for (let i = 0; i < len; i++) {\n const classDefinition = classGroup[i]!\n processClassDefinition(classDefinition, classPartObject, classGroupId, theme)\n }\n}\n\n// Split into separate functions for each type to maintain monomorphic call sites\nconst processClassDefinition = (\n classDefinition: ClassGroup<AnyThemeGroupIds>[number],\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n if (typeof classDefinition === 'string') {\n processStringDefinition(classDefinition, classPartObject, classGroupId)\n return\n }\n\n if (typeof classDefinition === 'function') {\n processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme)\n return\n }\n\n processObjectDefinition(\n classDefinition as Record<string, ClassGroup<AnyThemeGroupIds>>,\n classPartObject,\n classGroupId,\n theme,\n )\n}\n\nconst processStringDefinition = (\n classDefinition: string,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n) => {\n const classPartObjectToEdit =\n classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition)\n classPartObjectToEdit.classGroupId = classGroupId\n}\n\nconst processFunctionDefinition = (\n classDefinition: Function,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme)\n return\n }\n\n if (classPartObject.validators === null) {\n classPartObject.validators = []\n }\n classPartObject.validators.push(\n createClassValidatorObject(classGroupId, classDefinition as ClassValidator),\n )\n}\n\nconst processObjectDefinition = (\n classDefinition: Record<string, ClassGroup<AnyThemeGroupIds>>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n const entries = Object.entries(classDefinition)\n const len = entries.length\n for (let i = 0; i < len; i++) {\n const [key, value] = entries[i]!\n processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme)\n }\n}\n\nconst getPart = (classPartObject: ClassPartObject, path: string): ClassPartObject => {\n let current = classPartObject\n const parts = path.split(CLASS_PART_SEPARATOR)\n const len = parts.length\n\n for (let i = 0; i < len; i++) {\n const part = parts[i]!\n\n let next = current.nextPart.get(part)\n if (!next) {\n next = createClassPartObject()\n current.nextPart.set(part, next)\n }\n current = next\n }\n\n return current\n}\n\n// Type guard maintains monomorphic check\nconst isThemeGetter = (func: Function): func is ThemeGetter =>\n 'isThemeGetter' in func && (func as ThemeGetter).isThemeGetter === true\n","// Export is needed because TypeScript complains about an error otherwise:\n// Error: …/tailwind-merge/src/config-utils.ts(8,17): semantic error TS4058: Return type of exported function has or is using name 'LruCache' from external module \"…/tailwind-merge/src/lru-cache\" but cannot be named.\nexport interface LruCache<Key extends string, Value> {\n get(key: Key): Value | undefined\n set(key: Key, value: Value): void\n}\n\n// LRU cache implementation using plain objects for simplicity\nexport const createLruCache = <Key extends string, Value>(\n maxCacheSize: number,\n): LruCache<Key, Value> => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {},\n }\n }\n\n let cacheSize = 0\n let cache: Record<Key, Value> = Object.create(null)\n let previousCache: Record<Key, Value> = Object.create(null)\n\n const update = (key: Key, value: Value) => {\n cache[key] = value\n cacheSize++\n\n if (cacheSize > maxCacheSize) {\n cacheSize = 0\n previousCache = cache\n cache = Object.create(null)\n }\n }\n\n return {\n get(key) {\n let value = cache[key]\n\n if (value !== undefined) {\n return value\n }\n if ((value = previousCache[key]) !== undefined) {\n update(key, value)\n return value\n }\n },\n set(key, value) {\n if (key in cache) {\n cache[key] = value\n } else {\n update(key, value)\n }\n },\n }\n}\n","import { AnyConfig, ParsedClassName } from './types'\n\nexport const IMPORTANT_MODIFIER = '!'\n\nconst MODIFIER_SEPARATOR = ':'\nconst EMPTY_MODIFIERS: string[] = []\n\n// Pre-allocated result object shape for consistency\nconst createResultObject = (\n modifiers: string[],\n hasImportantModifier: boolean,\n baseClassName: string,\n maybePostfixModifierPosition?: number,\n isExternal?: boolean,\n): ParsedClassName => ({\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n isExternal,\n})\n\nexport const createParseClassName = (config: AnyConfig) => {\n const { prefix, experimentalParseClassName } = config\n\n /**\n * Parse class name into parts.\n *\n * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n */\n let parseClassName = (className: string): ParsedClassName => {\n // Use simple array with push for better performance\n const modifiers: string[] = []\n\n let bracketDepth = 0\n let parenDepth = 0\n let modifierStart = 0\n let postfixModifierPosition: number | undefined\n\n const len = className.length\n for (let index = 0; index < len; index++) {\n const currentCharacter = className[index]!\n\n if (bracketDepth === 0 && parenDepth === 0) {\n if (currentCharacter === MODIFIER_SEPARATOR) {\n modifiers.push(className.slice(modifierStart, index))\n modifierStart = index + 1\n continue\n }\n\n if (currentCharacter === '/') {\n postfixModifierPosition = index\n continue\n }\n }\n\n if (currentCharacter === '[') bracketDepth++\n else if (currentCharacter === ']') bracketDepth--\n else if (currentCharacter === '(') parenDepth++\n else if (currentCharacter === ')') parenDepth--\n }\n\n const baseClassNameWithImportantModifier =\n modifiers.length === 0 ? className : className.slice(modifierStart)\n\n // Inline important modifier check\n let baseClassName = baseClassNameWithImportantModifier\n let hasImportantModifier = false\n\n if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(0, -1)\n hasImportantModifier = true\n } else if (\n /**\n * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.\n * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864\n */\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)\n ) {\n baseClassName = baseClassNameWithImportantModifier.slice(1)\n hasImportantModifier = true\n }\n\n const maybePostfixModifierPosition =\n postfixModifierPosition && postfixModifierPosition > modifierStart\n ? postfixModifierPosition - modifierStart\n : undefined\n\n return createResultObject(\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n )\n }\n\n if (prefix) {\n const fullPrefix = prefix + MODIFIER_SEPARATOR\n const parseClassNameOriginal = parseClassName\n parseClassName = (className: string) =>\n className.startsWith(fullPrefix)\n ? parseClassNameOriginal(className.slice(fullPrefix.length))\n : createResultObject(EMPTY_MODIFIERS, false, className, undefined, true)\n }\n\n if (experimentalParseClassName) {\n const parseClassNameOriginal = parseClassName\n parseClassName = (className: string) =>\n experimentalParseClassName({ className, parseClassName: parseClassNameOriginal })\n }\n\n return parseClassName\n}\n","import { AnyConfig } from './types'\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nexport const createSortModifiers = (config: AnyConfig) => {\n // Pre-compute weights for all known modifiers for O(1) comparison\n const modifierWeights = new Map<string, number>()\n\n // Assign weights to sensitive modifiers (highest priority, but preserve order)\n config.orderSensitiveModifiers.forEach((mod, index) => {\n modifierWeights.set(mod, 1000000 + index) // High weights for sensitive mods\n })\n\n return (modifiers: readonly string[]): string[] => {\n const result: string[] = []\n let currentSegment: string[] = []\n\n // Process modifiers in one pass\n for (let i = 0; i < modifiers.length; i++) {\n const modifier = modifiers[i]!\n\n // Check if modifier is sensitive (starts with '[' or in orderSensitiveModifiers)\n const isArbitrary = modifier[0] === '['\n const isOrderSensitive = modifierWeights.has(modifier)\n\n if (isArbitrary || isOrderSensitive) {\n // Sort and flush current segment alphabetically\n if (currentSegment.length > 0) {\n currentSegment.sort()\n result.push(...currentSegment)\n currentSegment = []\n }\n result.push(modifier)\n } else {\n // Regular modifier - add to current segment for batch sorting\n currentSegment.push(modifier)\n }\n }\n\n // Sort and add any remaining segment items\n if (currentSegment.length > 0) {\n currentSegment.sort()\n result.push(...currentSegment)\n }\n\n return result\n }\n}\n","import { createClassGroupUtils } from './class-group-utils'\nimport { createLruCache } from './lru-cache'\nimport { createParseClassName } from './parse-class-name'\nimport { createSortModifiers } from './sort-modifiers'\nimport { AnyConfig } from './types'\n\nexport type ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createConfigUtils = (config: AnyConfig) => ({\n cache: createLruCache<string, string>(config.cacheSize),\n parseClassName: createParseClassName(config),\n sortModifiers: createSortModifiers(config),\n ...createClassGroupUtils(config),\n})\n","import { ConfigUtils } from './config-utils'\nimport { IMPORTANT_MODIFIER } from './parse-class-name'\n\nconst SPLIT_CLASSES_REGEX = /\\s+/\n\nexport const mergeClassList = (classList: string, configUtils: ConfigUtils) => {\n const { parseClassName, getClassGroupId, getConflictingClassGroupIds, sortModifiers } =\n configUtils\n\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict: string[] = []\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX)\n\n let result = ''\n\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index]!\n\n const {\n isExternal,\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n } = parseClassName(originalClassName)\n\n if (isExternal) {\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n let hasPostfixModifier = !!maybePostfixModifierPosition\n let classGroupId = getClassGroupId(\n hasPostfixModifier\n ? baseClassName.substring(0, maybePostfixModifierPosition)\n : baseClassName,\n )\n\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n classGroupId = getClassGroupId(baseClassName)\n\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n hasPostfixModifier = false\n }\n\n // Fast path: skip sorting for empty or single modifier\n const variantModifier =\n modifiers.length === 0\n ? ''\n : modifiers.length === 1\n ? modifiers[0]!\n : sortModifiers(modifiers).join(':')\n\n const modifierId = hasImportantModifier\n ? variantModifier + IMPORTANT_MODIFIER\n : variantModifier\n\n const classId = modifierId + classGroupId\n\n if (classGroupsInConflict.indexOf(classId) > -1) {\n // Tailwind class omitted due to conflict\n continue\n }\n\n classGroupsInConflict.push(classId)\n\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier)\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i]!\n classGroupsInConflict.push(modifierId + group)\n }\n\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n }\n\n return result\n}\n","/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\n\nexport type ClassNameValue = ClassNameArray | string | null | undefined | 0 | 0n | false\ntype ClassNameArray = ClassNameValue[]\n\nexport const twJoin = (...classLists: ClassNameValue[]): string => {\n let index = 0\n let argument: ClassNameValue\n let resolvedValue: string\n let string = ''\n\n while (index < classLists.length) {\n if ((argument = classLists[index++])) {\n if ((resolvedValue = toValue(argument))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n return string\n}\n\nconst toValue = (mix: ClassNameArray | string): string => {\n // Fast path for strings\n if (typeof mix === 'string') {\n return mix\n }\n\n let resolvedValue: string\n let string = ''\n\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if ((resolvedValue = toValue(mix[k] as ClassNameArray | string))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n\n return string\n}\n","import { createConfigUtils } from './config-utils'\nimport { mergeClassList } from './merge-classlist'\nimport { ClassNameValue, twJoin } from './tw-join'\nimport { AnyConfig } from './types'\n\ntype CreateConfigFirst = () => AnyConfig\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\ntype TailwindMerge = (...classLists: ClassNameValue[]) => string\ntype ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createTailwindMerge = (\n createConfigFirst: CreateConfigFirst,\n ...createConfigRest: CreateConfigSubsequent[]\n): TailwindMerge => {\n let configUtils: ConfigUtils\n let cacheGet: ConfigUtils['cache']['get']\n let cacheSet: ConfigUtils['cache']['set']\n let functionToCall: (classList: string) => string\n\n const initTailwindMerge = (classList: string) => {\n const config = createConfigRest.reduce(\n (previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig),\n createConfigFirst() as AnyConfig,\n )\n\n configUtils = createConfigUtils(config)\n cacheGet = configUtils.cache.get\n cacheSet = configUtils.cache.set\n functionToCall = tailwindMerge\n\n return tailwindMerge(classList)\n }\n\n const tailwindMerge = (classList: string) => {\n const cachedResult = cacheGet(classList)\n\n if (cachedResult) {\n return cachedResult\n }\n\n const result = mergeClassList(classList, configUtils)\n cacheSet(classList, result)\n\n return result\n }\n\n functionToCall = initTailwindMerge\n\n return (...args: ClassNameValue[]) => functionToCall(twJoin(...args))\n}\n","import { DefaultThemeGroupIds, NoInfer, ThemeGetter, ThemeObject } from './types'\n\nconst fallbackThemeArr: ThemeObject<DefaultThemeGroupIds>[DefaultThemeGroupIds] = []\n\nexport const fromTheme = <\n AdditionalThemeGroupIds extends string = never,\n DefaultThemeGroupIdsInner extends string = DefaultThemeGroupIds,\n>(\n key: NoInfer<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>,\n): ThemeGetter => {\n const themeGetter = (theme: ThemeObject<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>) =>\n theme[key] || fallbackThemeArr\n\n themeGetter.isThemeGetter = true as const\n\n return themeGetter\n}\n","const arbitraryValueRegex = /^\\[(?:(\\w[\\w-]*):)?(.+)\\]$/i\nconst arbitraryVariableRegex = /^\\((?:(\\w[\\w-]*):)?(.+)\\)$/i\nconst fractionRegex = /^\\d+\\/\\d+$/\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/\nconst lengthUnitRegex =\n /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/\nconst imageRegex =\n /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/\n\nexport const isFraction = (value: string) => fractionRegex.test(value)\n\nexport const isNumber = (value: string) => !!value && !Number.isNaN(Number(value))\n\nexport const isInteger = (value: string) => !!value && Number.isInteger(Number(value))\n\nexport const isPercent = (value: string) => value.endsWith('%') && isNumber(value.slice(0, -1))\n\nexport const isTshirtSize = (value: string) => tshirtUnitRegex.test(value)\n\nexport const isAny = () => true\n\nconst isLengthOnly = (value: string) =>\n // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n // For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\n lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)\n\nconst isNever = () => false\n\nconst isShadow = (value: string) => shadowRegex.test(value)\n\nconst isImage = (value: string) => imageRegex.test(value)\n\nexport const isAnyNonArbitrary = (value: string) =>\n !isArbitraryValue(value) && !isArbitraryVariable(value)\n\nexport const isArbitrarySize = (value: string) => getIsArbitraryValue(value, isLabelSize, isNever)\n\nexport const isArbitraryValue = (value: string) => arbitraryValueRegex.test(value)\n\nexport const isArbitraryLength = (value: string) =>\n getIsArbitraryValue(value, isLabelLength, isLengthOnly)\n\nexport const isArbitraryNumber = (value: string) =>\n getIsArbitraryValue(value, isLabelNumber, isNumber)\n\nexport const isArbitraryPosition = (value: string) =>\n getIsArbitraryValue(value, isLabelPosition, isNever)\n\nexport const isArbitraryImage = (value: string) => getIsArbitraryValue(value, isLabelImage, isImage)\n\nexport const isArbitraryShadow = (value: string) =>\n getIsArbitraryValue(value, isLabelShadow, isShadow)\n\nexport const isArbitraryVariable = (value: string) => arbitraryVariableRegex.test(value)\n\nexport const isArbitraryVariableLength = (value: string) =>\n getIsArbitraryVariable(value, isLabelLength)\n\nexport const isArbitraryVariableFamilyName = (value: string) =>\n getIsArbitraryVariable(value, isLabelFamilyName)\n\nexport const isArbitraryVariablePosition = (value: string) =>\n getIsArbitraryVariable(value, isLabelPosition)\n\nexport const isArbitraryVariableSize = (value: string) => getIsArbitraryVariable(value, isLabelSize)\n\nexport const isArbitraryVariableImage = (value: string) =>\n getIsArbitraryVariable(value, isLabelImage)\n\nexport const isArbitraryVariableShadow = (value: string) =>\n getIsArbitraryVariable(value, isLabelShadow, true)\n\n// Helpers\n\nconst getIsArbitraryValue = (\n value: string,\n testLabel: (label: string) => boolean,\n testValue: (value: string) => boolean,\n) => {\n const result = arbitraryValueRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return testLabel(result[1])\n }\n\n return testValue(result[2]!)\n }\n\n return false\n}\n\nconst getIsArbitraryVariable = (\n value: string,\n testLabel: (label: string) => boolean,\n shouldMatchNoLabel = false,\n) => {\n const result = arbitraryVariableRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return testLabel(result[1])\n }\n return shouldMatchNoLabel\n }\n\n return false\n}\n\n// Labels\n\nconst isLabelPosition = (label: string) => label === 'position' || label === 'percentage'\n\nconst isLabelImage = (label: string) => label === 'image' || label === 'url'\n\nconst isLabelSize = (label: string) => label === 'length' || label === 'size' || label === 'bg-size'\n\nconst isLabelLength = (label: string) => label === 'length'\n\nconst isLabelNumber = (label: string) => label === 'number'\n\nconst isLabelFamilyName = (label: string) => label === 'family-name'\n\nconst isLabelShadow = (label: string) => label === 'shadow'\n","import { fromTheme } from './from-theme'\nimport { Config, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\nimport {\n isAny,\n isAnyNonArbitrary,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isArbitraryVariable,\n isArbitraryVariableFamilyName,\n isArbitraryVariableImage,\n isArbitraryVariableLength,\n isArbitraryVariablePosition,\n isArbitraryVariableShadow,\n isArbitraryVariableSize,\n isFraction,\n isInteger,\n isNumber,\n isPercent,\n isTshirtSize,\n} from './validators'\n\nexport const getDefaultConfig = () => {\n /**\n * Theme getters for theme variable namespaces\n * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces\n */\n /***/\n\n const themeColor = fromTheme('color')\n const themeFont = fromTheme('font')\n const themeText = fromTheme('text')\n const themeFontWeight = fromTheme('font-weight')\n const themeTracking = fromTheme('tracking')\n const themeLeading = fromTheme('leading')\n const themeBreakpoint = fromTheme('breakpoint')\n const themeContainer = fromTheme('container')\n const themeSpacing = fromTheme('spacing')\n const themeRadius = fromTheme('radius')\n const themeShadow = fromTheme('shadow')\n const themeInsetShadow = fromTheme('inset-shadow')\n const themeTextShadow = fromTheme('text-shadow')\n const themeDropShadow = fromTheme('drop-shadow')\n const themeBlur = fromTheme('blur')\n const themePerspective = fromTheme('perspective')\n const themeAspect = fromTheme('aspect')\n const themeEase = fromTheme('ease')\n const themeAnimate = fromTheme('animate')\n\n /**\n * Helpers to avoid repeating the same scales\n *\n * We use functions that create a new array every time they're called instead of static arrays.\n * This ensures that users who modify any scale by mutating the array (e.g. with `array.push(element)`) don't accidentally mutate arrays in other parts of the config.\n */\n /***/\n\n const scaleBreak = () =>\n ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'] as const\n const scalePosition = () =>\n [\n 'center',\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'top-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-top',\n 'top-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-top',\n 'bottom-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-bottom',\n 'bottom-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-bottom',\n ] as const\n const scalePositionWithArbitrary = () =>\n [...scalePosition(), isArbitraryVariable, isArbitraryValue] as const\n const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'] as const\n const scaleOverscroll = () => ['auto', 'contain', 'none'] as const\n const scaleUnambiguousSpacing = () =>\n [isArbitraryVariable, isArbitraryValue, themeSpacing] as const\n const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()] as const\n const scaleGridTemplateColsRows = () =>\n [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue] as const\n const scaleGridColRowStartAndEnd = () =>\n [\n 'auto',\n { span: ['full', isInteger, isArbitraryVariable, isArbitraryValue] },\n isInteger,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleGridColRowStartOrEnd = () =>\n [isInteger, 'auto', isArbitraryVariable, isArbitraryValue] as const\n const scaleGridAutoColsRows = () =>\n ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue] as const\n const scaleAlignPrimaryAxis = () =>\n [\n 'start',\n 'end',\n 'center',\n 'between',\n 'around',\n 'evenly',\n 'stretch',\n 'baseline',\n 'center-safe',\n 'end-safe',\n ] as const\n const scaleAlignSecondaryAxis = () =>\n ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'] as const\n const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()] as const\n const scaleSizing = () =>\n [\n isFraction,\n 'auto',\n 'full',\n 'dvw',\n 'dvh',\n 'lvw',\n 'lvh',\n 'svw',\n 'svh',\n 'min',\n 'max',\n 'fit',\n ...scaleUnambiguousSpacing(),\n ] as const\n const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue] as const\n const scaleBgPosition = () =>\n [\n ...scalePosition(),\n isArbitraryVariablePosition,\n isArbitraryPosition,\n { position: [isArbitraryVariable, isArbitraryValue] },\n ] as const\n const scaleBgRepeat = () => ['no-repeat', { repeat: ['', 'x', 'y', 'space', 'round'] }] as const\n const scaleBgSize = () =>\n [\n 'auto',\n 'cover',\n 'contain',\n isArbitraryVariableSize,\n isArbitrarySize,\n { size: [isArbitraryVariable, isArbitraryValue] },\n ] as const\n const scaleGradientStopPosition = () =>\n [isPercent, isArbitraryVariableLength, isArbitraryLength] as const\n const scaleRadius = () =>\n [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n 'full',\n themeRadius,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleBorderWidth = () =>\n ['', isNumber, isArbitraryVariableLength, isArbitraryLength] as const\n const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'] as const\n const scaleBlendMode = () =>\n [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ] as const\n const scaleMaskImagePosition = () =>\n [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition] as const\n const scaleBlur = () =>\n [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeBlur,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()] as const\n\n return {\n cacheSize: 500,\n theme: {\n animate: ['spin', 'ping', 'pulse', 'bounce'],\n aspect: ['video'],\n blur: [isTshirtSize],\n breakpoint: [isTshirtSize],\n color: [isAny],\n container: [isTshirtSize],\n 'drop-shadow': [isTshirtSize],\n ease: ['in', 'out', 'in-out'],\n font: [isAnyNonArbitrary],\n 'font-weight': [\n 'thin',\n 'extralight',\n 'light',\n 'normal',\n 'medium',\n 'semibold',\n 'bold',\n 'extrabold',\n 'black',\n ],\n 'inset-shadow': [isTshirtSize],\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],\n perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],\n radius: [isTshirtSize],\n shadow: [isTshirtSize],\n spacing: ['px', isNumber],\n text: [isTshirtSize],\n 'text-shadow': [isTshirtSize],\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest'],\n },\n classGroups: {\n // --------------\n // --- Layout ---\n // --------------\n\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [\n {\n aspect: [\n 'auto',\n 'square',\n isFraction,\n isArbitraryValue,\n isArbitraryVariable,\n themeAspect,\n ],\n },\n ],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n * @deprecated since Tailwind CSS v4.0.0\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [\n { columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer] },\n ],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{ 'break-after': scaleBreak() }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{ 'break-before': scaleBreak() }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{ 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column'] }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{ 'box-decoration': ['slice', 'clone'] }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{ box: ['border', 'content'] }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: [\n 'block',\n 'inline-block',\n 'inline',\n 'flex',\n 'inline-flex',\n 'table',\n 'inline-table',\n 'table-caption',\n 'table-cell',\n 'table-column',\n 'table-column-group',\n 'table-footer-group',\n 'table-header-group',\n 'table-row-group',\n 'table-row',\n 'flow-root',\n 'grid',\n 'inline-grid',\n 'contents',\n 'list-item',\n 'hidden',\n ],\n /**\n * Screen Reader Only\n * @see https://tailwindcss.com/docs/display#screen-reader-only\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{ float: ['right', 'left', 'none', 'start', 'end'] }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{ clear: ['left', 'right', 'both', 'none', 'start', 'end'] }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{ object: ['contain', 'cover', 'fill', 'none', 'scale-down'] }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{ object: scalePositionWithArbitrary() }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{ overflow: scaleOverflow() }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{ 'overflow-x': scaleOverflow() }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{ 'overflow-y': scaleOverflow() }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{ overscroll: scaleOverscroll() }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{ 'overscroll-x': scaleOverscroll() }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{ 'overscroll-y': scaleOverscroll() }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{ inset: scaleInset() }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{ 'inset-x': scaleInset() }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{ 'inset-y': scaleInset() }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{ start: scaleInset() }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{ end: scaleInset() }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{ top: scaleInset() }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{ right: scaleInset() }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{ bottom: scaleInset() }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{ left: scaleInset() }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{ z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue] }],\n\n // ------------------------\n // --- Flexbox and Grid ---\n // ------------------------\n\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [\n {\n basis: [\n isFraction,\n 'full',\n 'auto',\n themeContainer,\n ...scaleUnambiguousSpacing(),\n ],\n },\n ],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{ flex: ['row', 'row-reverse', 'col', 'col-reverse'] }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{ flex: ['nowrap', 'wrap', 'wrap-reverse'] }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{ flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue] }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{ grow: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{ shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [\n {\n order: [\n isInteger,\n 'first',\n 'last',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{ 'grid-cols': scaleGridTemplateColsRows() }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{ col: scaleGridColRowStartAndEnd() }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{ 'col-start': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{ 'col-end': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{ 'grid-rows': scaleGridTemplateColsRows() }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{ row: scaleGridColRowStartAndEnd() }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{ 'row-start': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{ 'row-end': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{ 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense'] }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{ 'auto-cols': scaleGridAutoColsRows() }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{ 'auto-rows': scaleGridAutoColsRows() }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{ gap: scaleUnambiguousSpacing() }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{ 'gap-x': scaleUnambiguousSpacing() }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{ 'gap-y': scaleUnambiguousSpacing() }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{ justify: [...scaleAlignPrimaryAxis(), 'normal'] }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{ 'justify-items': [...scaleAlignSecondaryAxis(), 'normal'] }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{ 'justify-self': ['auto', ...scaleAlignSecondaryAxis()] }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{ content: ['normal', ...scaleAlignPrimaryAxis()] }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{ items: [...scaleAlignSecondaryAxis(), { baseline: ['', 'last'] }] }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [\n { self: ['auto', ...scaleAlignSecondaryAxis(), { baseline: ['', 'last'] }] },\n ],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{ 'place-content': scaleAlignPrimaryAxis() }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{ 'place-items': [...scaleAlignSecondaryAxis(), 'baseline'] }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{ 'place-self': ['auto', ...scaleAlignSecondaryAxis()] }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{ p: scaleUnambiguousSpacing() }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{ px: scaleUnambiguousSpacing() }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{ py: scaleUnambiguousSpacing() }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{ ps: scaleUnambiguousSpacing() }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{ pe: scaleUnambiguousSpacing() }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{ pt: scaleUnambiguousSpacing() }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{ pr: scaleUnambiguousSpacing() }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{ pb: scaleUnambiguousSpacing() }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{ pl: scaleUnambiguousSpacing() }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{ m: scaleMargin() }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{ mx: scaleMargin() }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{ my: scaleMargin() }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{ ms: scaleMargin() }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{ me: scaleMargin() }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{ mt: scaleMargin() }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{ mr: scaleMargin() }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{ mb: scaleMargin() }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{ ml: scaleMargin() }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x': [{ 'space-x': scaleUnambiguousSpacing() }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y': [{ 'space-y': scaleUnambiguousSpacing() }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y-reverse': ['space-y-reverse'],\n\n // --------------\n // --- Sizing ---\n // --------------\n\n /**\n * Size\n * @see https://tailwindcss.com/docs/width#setting-both-width-and-height\n */\n size: [{ size: scaleSizing() }],\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{ w: [themeContainer, 'screen', ...scaleSizing()] }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [\n {\n 'min-w': [\n themeContainer,\n 'screen',\n /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'none',\n ...scaleSizing(),\n ],\n },\n ],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [\n {\n 'max-w': [\n themeContainer,\n 'screen',\n 'none',\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'prose',\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n { screen: [themeBreakpoint] },\n ...scaleSizing(),\n ],\n },\n ],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{ h: ['screen', 'lh', ...scaleSizing()] }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{ 'min-h': ['screen', 'lh', 'none', ...scaleSizing()] }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{ 'max-h': ['screen', 'lh', ...scaleSizing()] }],\n\n // ------------------\n // --- Typography ---\n // ------------------\n\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [\n { text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength] },\n ],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{ font: [themeFontWeight, isArbitraryVariable, isArbitraryNumber] }],\n /**\n * Font Stretch\n * @see https://tailwindcss.com/docs/font-stretch\n */\n 'font-stretch': [\n {\n 'font-stretch': [\n 'ultra-condensed',\n 'extra-condensed',\n 'condensed',\n 'semi-condensed',\n 'normal',\n 'semi-expanded',\n 'expanded',\n 'extra-expanded',\n 'ultra-expanded',\n isPercent,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{ font: [isArbitraryVariableFamilyName, isArbitraryValue, themeFont] }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{ tracking: [themeTracking, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [\n { 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber] },\n ],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [\n {\n leading: [\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n themeLeading,\n ...scaleUnambiguousSpacing(),\n ],\n },\n ],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{ 'list-image': ['none', isArbitraryVariable, isArbitraryValue] }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{ list: ['inside', 'outside'] }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [\n { list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{ text: ['left', 'center', 'right', 'justify', 'start', 'end'] }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://v3.tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{ placeholder: scaleColor() }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{ text: scaleColor() }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{ decoration: [...scaleLineStyle(), 'wavy'] }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [\n {\n decoration: [\n isNumber,\n 'from-font',\n 'auto',\n isArbitraryVariable,\n isArbitraryLength,\n ],\n },\n ],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{ decoration: scaleColor() }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [\n { 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{ text: ['wrap', 'nowrap', 'balance', 'pretty'] }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{ indent: scaleUnambiguousSpacing() }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [\n {\n align: [\n 'baseline',\n 'top',\n 'middle',\n 'bottom',\n 'text-top',\n 'text-bottom',\n 'sub',\n 'super',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [\n { whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces'] },\n ],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{ break: ['normal', 'words', 'all', 'keep'] }],\n /**\n * Overflow Wrap\n * @see https://tailwindcss.com/docs/overflow-wrap\n */\n wrap: [{ wrap: ['break-word', 'anywhere', 'normal'] }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{ hyphens: ['none', 'manual', 'auto'] }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{ content: ['none', isArbitraryVariable, isArbitraryValue] }],\n\n // -------------------\n // --- Backgrounds ---\n // -------------------\n\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{ bg: ['fixed', 'local', 'scroll'] }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{ 'bg-clip': ['border', 'padding', 'content', 'text'] }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{ 'bg-origin': ['border', 'padding', 'content'] }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{ bg: scaleBgPosition() }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{ bg: scaleBgRepeat() }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{ bg: scaleBgSize() }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [\n {\n bg: [\n 'none',\n {\n linear: [\n { to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl'] },\n isInteger,\n isArbitraryVariable,\n isArbitraryValue,\n ],\n radial: ['', isArbitraryVariable, isArbitraryValue],\n conic: [isInteger, isArbitraryVariable, isArbitraryValue],\n },\n isArbitraryVariableImage,\n isArbitraryImage,\n ],\n },\n ],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{ bg: scaleColor() }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{ from: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{ via: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{ to: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{ from: scaleColor() }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{ via: scaleColor() }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{ to: scaleColor() }],\n\n // ---------------\n // --- Borders ---\n // ---------------\n\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{ rounded: scaleRadius() }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{ 'rounded-s': scaleRadius() }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{ 'rounded-e': scaleRadius() }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{ 'rounded-t': scaleRadius() }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{ 'rounded-r': scaleRadius() }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{ 'rounded-b': scaleRadius() }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{ 'rounded-l': scaleRadius() }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{ 'rounded-ss': scaleRadius() }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{ 'rounded-se': scaleRadius() }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{ 'rounded-ee': scaleRadius() }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{ 'rounded-es': scaleRadius() }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{ 'rounded-tl': scaleRadius() }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{ 'rounded-tr': scaleRadius() }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{ 'rounded-br': scaleRadius() }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{ 'rounded-bl': scaleRadius() }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{ border: scaleBorderWidth() }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{ 'border-x': scaleBorderWidth() }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{ 'border-y': scaleBorderWidth() }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{ 'border-s': scaleBorderWidth() }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{ 'border-e': scaleBorderWidth() }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{ 'border-t': scaleBorderWidth() }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{ 'border-r': scaleBorderWidth() }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{ 'border-b': scaleBorderWidth() }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{ 'border-l': scaleBorderWidth() }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x': [{ 'divide-x': scaleBorderWidth() }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y': [{ 'divide-y': scaleBorderWidth() }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{ border: [...scaleLineStyle(), 'hidden', 'none'] }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style\n */\n 'divide-style': [{ divide: [...scaleLineStyle(), 'hidden', 'none'] }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{ border: scaleColor() }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{ 'border-x': scaleColor() }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{ 'border-y': scaleColor() }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{ 'border-s': scaleColor() }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{ 'border-e': scaleColor() }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{ 'border-t': scaleColor() }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{ 'border-r': scaleColor() }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{ 'border-b': scaleColor() }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{ 'border-l': scaleColor() }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{ divide: scaleColor() }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{ outline: [...scaleLineStyle(), 'none', 'hidden'] }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [\n { 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [\n { outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength] },\n ],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{ outline: scaleColor() }],\n\n // ---------------\n // --- Effects ---\n // ---------------\n\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [\n {\n shadow: [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color\n */\n 'shadow-color': [{ shadow: scaleColor() }],\n /**\n * Inset Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow\n */\n 'inset-shadow': [\n {\n 'inset-shadow': [\n 'none',\n themeInsetShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Inset Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color\n */\n 'inset-shadow-color': [{ 'inset-shadow': scaleColor() }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring\n */\n 'ring-w': [{ ring: scaleBorderWidth() }],\n /**\n * Ring Width Inset\n * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color\n */\n 'ring-color': [{ ring: scaleColor() }],\n /**\n * Ring Offset Width\n * @see https://v3.tailwindcss.com/docs/ring-offset-width\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-w': [{ 'ring-offset': [isNumber, isArbitraryLength] }],\n /**\n * Ring Offset Color\n * @see https://v3.tailwindcss.com/docs/ring-offset-color\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-color': [{ 'ring-offset': scaleColor() }],\n /**\n * Inset Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring\n */\n 'inset-ring-w': [{ 'inset-ring': scaleBorderWidth() }],\n /**\n * Inset Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color\n */\n 'inset-ring-color': [{ 'inset-ring': scaleColor() }],\n /**\n * Text Shadow\n * @see https://tailwindcss.com/docs/text-shadow\n */\n 'text-shadow': [\n {\n 'text-shadow': [\n 'none',\n themeTextShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Text Shadow Color\n * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color\n */\n 'text-shadow-color': [{ 'text-shadow': scaleColor() }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{ opacity: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{ 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter'] }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{ 'bg-blend': scaleBlendMode() }],\n /**\n * Mask Clip\n * @see https://tailwindcss.com/docs/mask-clip\n */\n 'mask-clip': [\n { 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view'] },\n 'mask-no-clip',\n ],\n /**\n * Mask Composite\n * @see https://tailwindcss.com/docs/mask-composite\n */\n 'mask-composite': [{ mask: ['add', 'subtract', 'intersect', 'exclude'] }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image-linear-pos': [{ 'mask-linear': [isNumber] }],\n 'mask-image-linear-from-pos': [{ 'mask-linear-from': scaleMaskImagePosition() }],\n 'mask-image-linear-to-pos': [{ 'mask-linear-to': scaleMaskImagePosition() }],\n 'mask-image-linear-from-color': [{ 'mask-linear-from': scaleColor() }],\n 'mask-image-linear-to-color': [{ 'mask-linear-to': scaleColor() }],\n 'mask-image-t-from-pos': [{ 'mask-t-from': scaleMaskImagePosition() }],\n 'mask-image-t-to-pos': [{ 'mask-t-to': scaleMaskImagePosition() }],\n 'mask-image-t-from-color': [{ 'mask-t-from': scaleColor() }],\n 'mask-image-t-to-color': [{ 'mask-t-to': scaleColor() }],\n 'mask-image-r-from-pos': [{ 'mask-r-from': scaleMaskImagePosition() }],\n 'mask-image-r-to-pos': [{ 'mask-r-to': scaleMaskImagePosition() }],\n 'mask-image-r-from-color': [{ 'mask-r-from': scaleColor() }],\n 'mask-image-r-to-color': [{ 'mask-r-to': scaleColor() }],\n 'mask-image-b-from-pos': [{ 'mask-b-from': scaleMaskImagePosition() }],\n 'mask-image-b-to-pos': [{ 'mask-b-to': scaleMaskImagePosition() }],\n 'mask-image-b-from-color': [{ 'mask-b-from': scaleColor() }],\n 'mask-image-b-to-color': [{ 'mask-b-to': scaleColor() }],\n 'mask-image-l-from-pos': [{ 'mask-l-from': scaleMaskImagePosition() }],\n 'mask-image-l-to-pos': [{ 'mask-l-to': scaleMaskImagePosition() }],\n 'mask-image-l-from-color': [{ 'mask-l-from': scaleColor() }],\n 'mask-image-l-to-color': [{ 'mask-l-to': scaleColor() }],\n 'mask-image-x-from-pos': [{ 'mask-x-from': scaleMaskImagePosition() }],\n 'mask-image-x-to-pos': [{ 'mask-x-to': scaleMaskImagePosition() }],\n 'mask-image-x-from-color': [{ 'mask-x-from': scaleColor() }],\n 'mask-image-x-to-color': [{ 'mask-x-to': scaleColor() }],\n 'mask-image-y-from-pos': [{ 'mask-y-from': scaleMaskImagePosition() }],\n 'mask-image-y-to-pos': [{ 'mask-y-to': scaleMaskImagePosition() }],\n 'mask-image-y-from-color': [{ 'mask-y-from': scaleColor() }],\n 'mask-image-y-to-color': [{ 'mask-y-to': scaleColor() }],\n 'mask-image-radial': [{ 'mask-radial': [isArbitraryVariable, isArbitraryValue] }],\n 'mask-image-radial-from-pos': [{ 'mask-radial-from': scaleMaskImagePosition() }],\n 'mask-image-radial-to-pos': [{ 'mask-radial-to': scaleMaskImagePosition() }],\n 'mask-image-radial-from-color': [{ 'mask-radial-from': scaleColor() }],\n 'mask-image-radial-to-color': [{ 'mask-radial-to': scaleColor() }],\n 'mask-image-radial-shape': [{ 'mask-radial': ['circle', 'ellipse'] }],\n 'mask-image-radial-size': [\n { 'mask-radial': [{ closest: ['side', 'corner'], farthest: ['side', 'corner'] }] },\n ],\n 'mask-image-radial-pos': [{ 'mask-radial-at': scalePosition() }],\n 'mask-image-conic-pos': [{ 'mask-conic': [isNumber] }],\n 'mask-image-conic-from-pos': [{ 'mask-conic-from': scaleMaskImagePosition() }],\n 'mask-image-conic-to-pos': [{ 'mask-conic-to': scaleMaskImagePosition() }],\n 'mask-image-conic-from-color': [{ 'mask-conic-from': scaleColor() }],\n 'mask-image-conic-to-color': [{ 'mask-conic-to': scaleColor() }],\n /**\n * Mask Mode\n * @see https://tailwindcss.com/docs/mask-mode\n */\n 'mask-mode': [{ mask: ['alpha', 'luminance', 'match'] }],\n /**\n * Mask Origin\n * @see https://tailwindcss.com/docs/mask-origin\n */\n 'mask-origin': [\n { 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view'] },\n ],\n /**\n * Mask Position\n * @see https://tailwindcss.com/docs/mask-position\n */\n 'mask-position': [{ mask: scaleBgPosition() }],\n /**\n * Mask Repeat\n * @see https://tailwindcss.com/docs/mask-repeat\n */\n 'mask-repeat': [{ mask: scaleBgRepeat() }],\n /**\n * Mask Size\n * @see https://tailwindcss.com/docs/mask-size\n */\n 'mask-size': [{ mask: scaleBgSize() }],\n /**\n * Mask Type\n * @see https://tailwindcss.com/docs/mask-type\n */\n 'mask-type': [{ 'mask-type': ['alpha', 'luminance'] }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image': [{ mask: ['none', isArbitraryVariable, isArbitraryValue] }],\n\n // ---------------\n // --- Filters ---\n // ---------------\n\n /**\n * Filter\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [\n {\n filter: [\n // Deprecated since Tailwind CSS v3.0.0\n '',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{ blur: scaleBlur() }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{ brightness: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{ contrast: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [\n {\n 'drop-shadow': [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeDropShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Drop Shadow Color\n * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color\n */\n 'drop-shadow-color': [{ 'drop-shadow': scaleColor() }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{ grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{ 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{ invert: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{ saturate: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{ sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Backdrop Filter\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [\n {\n 'backdrop-filter': [\n // Deprecated since Tailwind CSS v3.0.0\n '',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{ 'backdrop-blur': scaleBlur() }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [\n { 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [\n { 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [\n { 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [\n { 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [\n { 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [\n { 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [\n { 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [\n { 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n\n // --------------\n // --- Tables ---\n // --------------\n\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{ border: ['collapse', 'separate'] }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{ 'border-spacing': scaleUnambiguousSpacing() }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{ 'border-spacing-x': scaleUnambiguousSpacing() }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{ 'border-spacing-y': scaleUnambiguousSpacing() }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{ table: ['auto', 'fixed'] }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{ caption: ['top', 'bottom'] }],\n\n // ---------------------------------\n // --- Transitions and Animation ---\n // ---------------------------------\n\n /**\n * Transition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [\n {\n transition: [\n '',\n 'all',\n 'colors',\n 'opacity',\n 'shadow',\n 'transform',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Transition Behavior\n * @see https://tailwindcss.com/docs/transition-behavior\n */\n 'transition-behavior': [{ transition: ['normal', 'discrete'] }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{ duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue] }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [\n { ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{ delay: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{ animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue] }],\n\n // ------------------\n // --- Transforms ---\n // ------------------\n\n /**\n * Backface Visibility\n * @see https://tailwindcss.com/docs/backface-visibility\n */\n backface: [{ backface: ['hidden', 'visible'] }],\n /**\n * Perspective\n * @see https://tailwindcss.com/docs/perspective\n */\n perspective: [\n { perspective: [themePerspective, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Perspective Origin\n * @see https://tailwindcss.com/docs/perspective-origin\n */\n 'perspective-origin': [{ 'perspective-origin': scalePositionWithArbitrary() }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{ rotate: scaleRotate() }],\n /**\n * Rotate X\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-x': [{ 'rotate-x': scaleRotate() }],\n /**\n * Rotate Y\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-y': [{ 'rotate-y': scaleRotate() }],\n /**\n * Rotate Z\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-z': [{ 'rotate-z': scaleRotate() }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{ scale: scaleScale() }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{ 'scale-x': scaleScale() }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{ 'scale-y': scaleScale() }],\n /**\n * Scale Z\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-z': [{ 'scale-z': scaleScale() }],\n /**\n * Scale 3D\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-3d': ['scale-3d'],\n /**\n * Skew\n * @see https://tailwindcss.com/docs/skew\n */\n skew: [{ skew: scaleSkew() }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{ 'skew-x': scaleSkew() }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{ 'skew-y': scaleSkew() }],\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [\n { transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu'] },\n ],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{ origin: scalePositionWithArbitrary() }],\n /**\n * Transform Style\n * @see https://tailwindcss.com/docs/transform-style\n */\n 'transform-style': [{ transform: ['3d', 'flat'] }],\n /**\n * Translate\n * @see https://tailwindcss.com/docs/translate\n */\n translate: [{ translate: scaleTranslate() }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{ 'translate-x': scaleTranslate() }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{ 'translate-y': scaleTranslate() }],\n /**\n * Translate Z\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-z': [{ 'translate-z': scaleTranslate() }],\n /**\n * Translate None\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-none': ['translate-none'],\n\n // ---------------------\n // --- Interactivity ---\n // ---------------------\n\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{ accent: scaleColor() }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{ appearance: ['none', 'auto'] }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{ caret: scaleColor() }],\n /**\n * Color Scheme\n * @see https://tailwindcss.com/docs/color-scheme\n */\n 'color-scheme': [\n { scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light'] },\n ],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [\n {\n cursor: [\n 'auto',\n 'default',\n 'pointer',\n 'wait',\n 'text',\n 'move',\n 'help',\n 'not-allowed',\n 'none',\n 'context-menu',\n 'progress',\n 'cell',\n 'crosshair',\n 'vertical-text',\n 'alias',\n 'copy',\n 'no-drop',\n 'grab',\n 'grabbing',\n 'all-scroll',\n 'col-resize',\n 'row-resize',\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n 'ew-resize',\n 'ns-resize',\n 'nesw-resize',\n 'nwse-resize',\n 'zoom-in',\n 'zoom-out',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Field Sizing\n * @see https://tailwindcss.com/docs/field-sizing\n */\n 'field-sizing': [{ 'field-sizing': ['fixed', 'content'] }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{ 'pointer-events': ['auto', 'none'] }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{ resize: ['none', '', 'y', 'x'] }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{ scroll: ['auto', 'smooth'] }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{ 'scroll-m': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{ 'scroll-mx': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{ 'scroll-my': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{ 'scroll-ms': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{ 'scroll-me': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{ 'scroll-mt': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{ 'scroll-mr': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{ 'scroll-mb': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{ 'scroll-ml': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{ 'scroll-p': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{ 'scroll-px': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{ 'scroll-py': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{ 'scroll-ps': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{ 'scroll-pe': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{ 'scroll-pt': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{ 'scroll-pr': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{ 'scroll-pb': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{ 'scroll-pl': scaleUnambiguousSpacing() }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{ snap: ['start', 'end', 'center', 'align-none'] }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{ snap: ['normal', 'always'] }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{ snap: ['none', 'x', 'y', 'both'] }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{ snap: ['mandatory', 'proximity'] }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{ touch: ['auto', 'none', 'manipulation'] }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{ 'touch-pan': ['x', 'left', 'right'] }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{ 'touch-pan': ['y', 'up', 'down'] }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{ select: ['none', 'text', 'all', 'auto'] }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [\n {\n 'will-change': [\n 'auto',\n 'scroll',\n 'contents',\n 'transform',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n\n // -----------\n // --- SVG ---\n // -----------\n\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{ fill: ['none', ...scaleColor()] }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [\n {\n stroke: [\n isNumber,\n isArbitraryVariableLength,\n isArbitraryLength,\n isArbitraryNumber,\n ],\n },\n ],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{ stroke: ['none', ...scaleColor()] }],\n\n // ---------------------\n // --- Accessibility ---\n // ---------------------\n\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{ 'forced-color-adjust': ['auto', 'none'] }],\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': [\n 'fvn-ordinal',\n 'fvn-slashed-zero',\n 'fvn-figure',\n 'fvn-spacing',\n 'fvn-fraction',\n ],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: [\n 'rounded-s',\n 'rounded-e',\n 'rounded-t',\n 'rounded-r',\n 'rounded-b',\n 'rounded-l',\n 'rounded-ss',\n 'rounded-se',\n 'rounded-ee',\n 'rounded-es',\n 'rounded-tl',\n 'rounded-tr',\n 'rounded-br',\n 'rounded-bl',\n ],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': [\n 'border-w-x',\n 'border-w-y',\n 'border-w-s',\n 'border-w-e',\n 'border-w-t',\n 'border-w-r',\n 'border-w-b',\n 'border-w-l',\n ],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': [\n 'border-color-x',\n 'border-color-y',\n 'border-color-s',\n 'border-color-e',\n 'border-color-t',\n 'border-color-r',\n 'border-color-b',\n 'border-color-l',\n ],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n translate: ['translate-x', 'translate-y', 'translate-none'],\n 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],\n 'scroll-m': [\n 'scroll-mx',\n 'scroll-my',\n 'scroll-ms',\n 'scroll-me',\n 'scroll-mt',\n 'scroll-mr',\n 'scroll-mb',\n 'scroll-ml',\n ],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': [\n 'scroll-px',\n 'scroll-py',\n 'scroll-ps',\n 'scroll-pe',\n 'scroll-pt',\n 'scroll-pr',\n 'scroll-pb',\n 'scroll-pl',\n ],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch'],\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading'],\n },\n orderSensitiveModifiers: [\n '*',\n '**',\n 'after',\n 'backdrop',\n 'before',\n 'details-content',\n 'file',\n 'first-letter',\n 'first-line',\n 'marker',\n 'placeholder',\n 'selection',\n ],\n } as const satisfies Config<DefaultClassGroupIds, DefaultThemeGroupIds>\n}\n","import { AnyConfig, ConfigExtension, NoInfer } from './types'\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nexport const mergeConfigs = <ClassGroupIds extends string, ThemeGroupIds extends string = never>(\n baseConfig: AnyConfig,\n {\n cacheSize,\n prefix,\n experimentalParseClassName,\n extend = {},\n override = {},\n }: ConfigExtension<ClassGroupIds, ThemeGroupIds>,\n) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize)\n overrideProperty(baseConfig, 'prefix', prefix)\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName)\n\n overrideConfigProperties(baseConfig.theme, override.theme)\n overrideConfigProperties(baseConfig.classGroups, override.classGroups)\n overrideConfigProperties(baseConfig.conflictingClassGroups, override.conflictingClassGroups)\n overrideConfigProperties(\n baseConfig.conflictingClassGroupModifiers,\n override.conflictingClassGroupModifiers,\n )\n overrideProperty(baseConfig, 'orderSensitiveModifiers', override.orderSensitiveModifiers)\n\n mergeConfigProperties(baseConfig.theme, extend.theme)\n mergeConfigProperties(baseConfig.classGroups, extend.classGroups)\n mergeConfigProperties(baseConfig.conflictingClassGroups, extend.conflictingClassGroups)\n mergeConfigProperties(\n baseConfig.conflictingClassGroupModifiers,\n extend.conflictingClassGroupModifiers,\n )\n mergeArrayProperties(baseConfig, extend, 'orderSensitiveModifiers')\n\n return baseConfig\n}\n\nconst overrideProperty = <T extends object, K extends keyof T>(\n baseObject: T,\n overrideKey: K,\n overrideValue: T[K] | undefined,\n) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue\n }\n}\n\nconst overrideConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n overrideObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key])\n }\n }\n}\n\nconst mergeConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n mergeObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n mergeArrayProperties(baseObject, mergeObject, key)\n }\n }\n}\n\nconst mergeArrayProperties = <Key extends string>(\n baseObject: Partial<Record<NoInfer<Key>, readonly unknown[]>>,\n mergeObject: Partial<Record<NoInfer<Key>, readonly unknown[]>>,\n key: Key,\n) => {\n const mergeValue = mergeObject[key]\n\n if (mergeValue !== undefined) {\n baseObject[key] = baseObject[key] ? baseObject[key].concat(mergeValue) : mergeValue\n }\n}\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\nimport { mergeConfigs } from './merge-configs'\nimport { AnyConfig, ConfigExtension, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\n\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\n\nexport const extendTailwindMerge = <\n AdditionalClassGroupIds extends string = never,\n AdditionalThemeGroupIds extends string = never,\n>(\n configExtension:\n | ConfigExtension<\n DefaultClassGroupIds | AdditionalClassGroupIds,\n DefaultThemeGroupIds | AdditionalThemeGroupIds\n >\n | CreateConfigSubsequent,\n ...createConfig: CreateConfigSubsequent[]\n) =>\n typeof configExtension === 'function'\n ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig)\n : createTailwindMerge(\n () => mergeConfigs(getDefaultConfig(), configExtension),\n ...createConfig,\n )\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\n\nexport const twMerge = createTailwindMerge(getDefaultConfig)\n","import { clsx } from 'clsx'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nexport function cn(...inputs: any[]) {\r\n\treturn twMerge(clsx(inputs))\r\n}\r\n","import { cn } from \"@/lib/utils\"\r\n\r\nfunction Skeleton({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) {\r\n return (\r\n <div\r\n className={cn(\"animate-pulse rounded-md bg-primary/10\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Skeleton }\r\n","import * as React from 'react';\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\n/**\n * Set a given ref to a given value\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\n if (typeof ref === 'function') {\n return ref(value);\n } else if (ref !== null && ref !== undefined) {\n ref.current = value;\n }\n}\n\n/**\n * A utility to compose multiple refs together\n * Accepts callback refs and RefObject(s)\n */\nfunction composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup == 'function') {\n hasCleanup = true;\n }\n return cleanup;\n });\n\n // React <19 will log an error to the console if a callback ref returns a\n // value. We don't use ref cleanups internally so this will only happen if a\n // user's ref callback returns a value, which we only expect if they are\n // using the cleanup functionality added in React 19.\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup == 'function') {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\n\n/**\n * A custom hook that composes multiple refs\n * Accepts callback refs and RefObject(s)\n */\nfunction useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return React.useCallback(composeRefs(...refs), refs);\n}\n\nexport { composeRefs, useComposedRefs };\n","import * as React from 'react';\nimport { composeRefs } from '@radix-ui/react-compose-refs';\n\ndeclare module 'react' {\n interface ReactElement {\n $$typeof?: symbol | string;\n }\n}\n\nconst REACT_LAZY_TYPE = Symbol.for('react.lazy');\n\ninterface LazyReactElement extends React.ReactElement {\n $$typeof: typeof REACT_LAZY_TYPE;\n _payload: PromiseLike<Exclude<React.ReactNode, PromiseLike<any>>>;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Slot\n * -----------------------------------------------------------------------------------------------*/\n\nexport type Usable<T> = PromiseLike<T> | React.Context<T>;\nconst use: typeof React.use | undefined = (React as any)[' use '.trim().toString()];\n\ninterface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return typeof value === 'object' && value !== null && 'then' in value;\n}\n\nfunction isLazyComponent(element: React.ReactNode): element is LazyReactElement {\n return (\n element != null &&\n typeof element === 'object' &&\n '$$typeof' in element &&\n element.$$typeof === REACT_LAZY_TYPE &&\n '_payload' in element &&\n isPromiseLike(element._payload)\n );\n}\n\n/* @__NO_SIDE_EFFECTS__ */ export function createSlot(ownerName: string) {\n const SlotClone = createSlotClone(ownerName);\n const Slot = React.forwardRef<HTMLElement, SlotProps>((props, forwardedRef) => {\n let { children, ...slotProps } = props;\n if (isLazyComponent(children) && typeof use === 'function') {\n children = use(children._payload);\n }\n const childrenArray = React.Children.toArray(children);\n const slottable = childrenArray.find(isSlottable);\n\n if (slottable) {\n // the new element to render is the one passed as a child of `Slottable`\n const newElement = slottable.props.children;\n\n const newChildren = childrenArray.map((child) => {\n if (child === slottable) {\n // because the new element will be the one rendered, we are only interested\n // in grabbing its children (`newElement.props.children`)\n if (React.Children.count(newElement) > 1) return React.Children.only(null);\n return React.isValidElement(newElement)\n ? (newElement.props as { children: React.ReactNode }).children\n : null;\n } else {\n return child;\n }\n });\n\n return (\n <SlotClone {...slotProps} ref={forwardedRef}>\n {React.isValidElement(newElement)\n ? React.cloneElement(newElement, undefined, newChildren)\n : null}\n </SlotClone>\n );\n }\n\n return (\n <SlotClone {...slotProps} ref={forwardedRef}>\n {children}\n </SlotClone>\n );\n });\n\n Slot.displayName = `${ownerName}.Slot`;\n return Slot;\n}\n\nconst Slot = createSlot('Slot');\n\n/* -------------------------------------------------------------------------------------------------\n * SlotClone\n * -----------------------------------------------------------------------------------------------*/\n\ninterface SlotCloneProps {\n children: React.ReactNode;\n}\n\n/* @__NO_SIDE_EFFECTS__ */ function createSlotClone(ownerName: string) {\n const SlotClone = React.forwardRef<any, SlotCloneProps>((props, forwardedRef) => {\n let { children, ...slotProps } = props;\n if (isLazyComponent(children) && typeof use === 'function') {\n children = use(children._payload);\n }\n\n if (React.isValidElement(children)) {\n const childrenRef = getElementRef(children);\n const props = mergeProps(slotProps, children.props as AnyProps);\n // do not pass ref to React.Fragment for React 19 compatibility\n if (children.type !== React.Fragment) {\n props.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;\n }\n return React.cloneElement(children, props);\n }\n\n return React.Children.count(children) > 1 ? React.Children.only(null) : null;\n });\n\n SlotClone.displayName = `${ownerName}.SlotClone`;\n return SlotClone;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Slottable\n * -----------------------------------------------------------------------------------------------*/\n\nconst SLOTTABLE_IDENTIFIER = Symbol('radix.slottable');\n\ninterface SlottableProps {\n children: React.ReactNode;\n}\n\ninterface SlottableComponent extends React.FC<SlottableProps> {\n __radixId: symbol;\n}\n\n/* @__NO_SIDE_EFFECTS__ */ export function createSlottable(ownerName: string) {\n const Slottable: SlottableComponent = ({ children }) => {\n return <>{children}</>;\n };\n Slottable.displayName = `${ownerName}.Slottable`;\n Slottable.__radixId = SLOTTABLE_IDENTIFIER;\n return Slottable;\n}\n\nconst Slottable = createSlottable('Slottable');\n\n/* ---------------------------------------------------------------------------------------------- */\n\ntype AnyProps = Record<string, any>;\n\nfunction isSlottable(\n child: React.ReactNode,\n): child is React.ReactElement<SlottableProps, typeof Slottable> {\n return (\n React.isValidElement(child) &&\n typeof child.type === 'function' &&\n '__radixId' in child.type &&\n child.type.__radixId === SLOTTABLE_IDENTIFIER\n );\n}\n\nfunction mergeProps(slotProps: AnyProps, childProps: AnyProps) {\n // all child props should override\n const overrideProps = { ...childProps };\n\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n // if the handler exists on both, we compose them\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args: unknown[]) => {\n const result = childPropValue(...args);\n slotPropValue(...args);\n return result;\n };\n }\n // but if it exists only on the slot, we use only this one\n else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n }\n // if it's `style`, we merge them\n else if (propName === 'style') {\n overrideProps[propName] = { ...slotPropValue, ...childPropValue };\n } else if (propName === 'className') {\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(' ');\n }\n }\n\n return { ...slotProps, ...overrideProps };\n}\n\n// Before React 19 accessing `element.props.ref` will throw a warning and suggest using `element.ref`\n// After React 19 accessing `element.ref` does the opposite.\n// https://github.com/facebook/react/pull/28348\n//\n// Access the ref using the method that doesn't yield a warning.\nfunction getElementRef(element: React.ReactElement) {\n // React <=18 in DEV\n let getter = Object.getOwnPropertyDescriptor(element.props, 'ref')?.get;\n let mayWarn = getter && 'isReactWarning' in getter && getter.isReactWarning;\n if (mayWarn) {\n return (element as any).ref;\n }\n\n // React 19 in DEV\n getter = Object.getOwnPropertyDescriptor(element, 'ref')?.get;\n mayWarn = getter && 'isReactWarning' in getter && getter.isReactWarning;\n if (mayWarn) {\n return (element.props as { ref?: React.Ref<unknown> }).ref;\n }\n\n // Not DEV\n return (element.props as { ref?: React.Ref<unknown> }).ref || (element as any).ref;\n}\n\nexport {\n Slot,\n Slottable,\n //\n Slot as Root,\n};\nexport type { SlotProps };\n","/**\n * Copyright 2022 Joe Bell. All rights reserved.\n *\n * This file is licensed to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */ import { clsx } from \"clsx\";\nconst falsyToString = (value)=>typeof value === \"boolean\" ? `${value}` : value === 0 ? \"0\" : value;\nexport const cx = clsx;\nexport const cva = (base, config)=>(props)=>{\n var _config_compoundVariants;\n if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n const { variants, defaultVariants } = config;\n const getVariantClassNames = Object.keys(variants).map((variant)=>{\n const variantProp = props === null || props === void 0 ? void 0 : props[variant];\n const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];\n if (variantProp === null) return null;\n const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);\n return variants[variant][variantKey];\n });\n const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{\n let [key, value] = param;\n if (value === undefined) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{\n let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;\n return Object.entries(compoundVariantOptions).every((param)=>{\n let [key, value] = param;\n return Array.isArray(value) ? value.includes({\n ...defaultVariants,\n ...propsWithoutUndefined\n }[key]) : ({\n ...defaultVariants,\n ...propsWithoutUndefined\n })[key] === value;\n }) ? [\n ...acc,\n cvClass,\n cvClassName\n ] : acc;\n }, []);\n return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n };\n\n","import * as React from \"react\"\r\nimport { Slot } from \"@radix-ui/react-slot\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst buttonVariants = cva(\r\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\r\n destructive:\r\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\r\n outline:\r\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\r\n secondary:\r\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\r\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\r\n link: \"text-primary underline-offset-4 hover:underline\",\r\n },\r\n size: {\r\n default: \"h-9 px-4 py-2\",\r\n sm: \"h-8 rounded-md px-3 text-xs\",\r\n lg: \"h-10 rounded-md px-8\",\r\n icon: \"h-9 w-9\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"default\",\r\n },\r\n }\r\n)\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n asChild?: boolean\r\n}\r\n\r\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant, size, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : \"button\"\r\n return (\r\n <Comp\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nButton.displayName = \"Button\"\r\n\r\nexport { Button, buttonVariants }\r\n","import { Button } from '@/components/ui/button'\r\nimport { Skeleton } from '@/components/ui/skeleton'\r\nimport { Check, Copy } from 'lucide-react'\r\nimport * as React from 'react'\r\nimport ReactMarkdown from 'react-markdown'\r\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'\r\nimport {\r\n\toneDark,\r\n\toneLight,\r\n} from 'react-syntax-highlighter/dist/esm/styles/prism'\r\nimport rehypeRaw from 'rehype-raw'\r\nimport rehypeSanitize from 'rehype-sanitize'\r\nimport remarkGfm from 'remark-gfm'\r\n\r\ninterface MarkdownViewerProps {\r\n\treadonly filePath: string\r\n\treadonly folderPath: string\r\n\treadonly onPageSelect: (p: string) => void\r\n}\r\n\r\n// Функция для создания якорей из текста заголовка\r\nfunction toAnchor(children: React.ReactNode): string {\r\n\tconst regex = /[^\\w\\s-]/g\r\n\tconst spaceRegex = /\\s+/g\r\n\tconst dashRegex = /-+/g\r\n\r\n\tif (typeof children === 'string') {\r\n\t\treturn children\r\n\t\t\t.toLowerCase()\r\n\t\t\t.replace(regex, '')\r\n\t\t\t.replace(spaceRegex, '-')\r\n\t\t\t.replace(dashRegex, '-')\r\n\t\t\t.trim()\r\n\t}\r\n\tif (Array.isArray(children)) {\r\n\t\treturn children\r\n\t\t\t.map(child => {\r\n\t\t\t\tif (typeof child === 'string') return child\r\n\t\t\t\tif (React.isValidElement(child)) {\r\n\t\t\t\t\tconst childProps = child.props as { children?: React.ReactNode }\r\n\t\t\t\t\tif (childProps.children) {\r\n\t\t\t\t\t\treturn toAnchor(childProps.children)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn ''\r\n\t\t\t})\r\n\t\t\t.join('')\r\n\t\t\t.toLowerCase()\r\n\t\t\t.replace(regex, '')\r\n\t\t\t.replace(spaceRegex, '-')\r\n\t\t\t.replace(dashRegex, '-')\r\n\t\t\t.trim()\r\n\t}\r\n\treturn ''\r\n}\r\n\r\n// Компонент для блока кода с кнопкой копирования\r\nfunction CodeBlock({\r\n\tcodeString,\r\n\tlanguage,\r\n\tcopiedCode,\r\n\tsetCopiedCode,\r\n\tcodeTheme,\r\n}: {\r\n\treadonly codeString: string\r\n\treadonly language: string\r\n\treadonly copiedCode: string | null\r\n\treadonly setCopiedCode: (id: string | null) => void\r\n\treadonly codeTheme: any\r\n}) {\r\n\tconst codeId = React.useId()\r\n\tconst isCopied = copiedCode === codeId\r\n\r\n\treturn (\r\n\t\t<div className='my-6 overflow-hidden rounded-lg border border-border bg-card'>\r\n\t\t\t<div className='flex h-12 items-center justify-between border-b border-border bg-muted/50 px-4'>\r\n\t\t\t\t<span className='text-sm font-medium text-foreground'>{language}</span>\r\n\t\t\t\t<Button\r\n\t\t\t\t\tvariant='ghost'\r\n\t\t\t\t\tsize='sm'\r\n\t\t\t\t\tclassName='h-8 w-8 p-0'\r\n\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\tnavigator.clipboard.writeText(codeString)\r\n\t\t\t\t\t\tsetCopiedCode(codeId)\r\n\t\t\t\t\t\tsetTimeout(() => setCopiedCode(null), 2000)\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t{isCopied ? (\r\n\t\t\t\t\t\t<Check className='h-4 w-4' />\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<Copy className='h-4 w-4' />\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t<span className='sr-only'>Copy code</span>\r\n\t\t\t\t</Button>\r\n\t\t\t</div>\r\n\t\t\t<SyntaxHighlighter\r\n\t\t\t\tstyle={codeTheme}\r\n\t\t\t\tlanguage={language}\r\n\t\t\t\tPreTag='div'\r\n\t\t\t\tshowLineNumbers={false}\r\n\t\t\t\tcustomStyle={{\r\n\t\t\t\t\tmargin: 0,\r\n\t\t\t\t\tpadding: '1rem',\r\n\t\t\t\t\tfontSize: '14px',\r\n\t\t\t\t\tlineHeight: '1.5',\r\n\t\t\t\t\tbackground: 'transparent',\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t{codeString}\r\n\t\t\t</SyntaxHighlighter>\r\n\t\t</div>\r\n\t)\r\n}\r\n\r\n// Функция для разрешения путей к изображениям\r\nfunction resolveImagePath(src: string, filePath: string, folderPath: string): string {\r\n\t// Абсолютные пути (http, https, data:) оставляем как есть\r\n\tif (\r\n\t\t!src ||\r\n\t\tsrc.startsWith('http://') ||\r\n\t\tsrc.startsWith('https://') ||\r\n\t\tsrc.startsWith('data:')\r\n\t) {\r\n\t\treturn src\r\n\t}\r\n\r\n\t// Если путь начинается с /, это абсолютный путь от корня сайта\r\n\t// Но нам нужно проверить, не находится ли он в папке документации\r\n\tif (src.startsWith('/')) {\r\n\t\t// Если путь уже начинается с folderPath, оставляем как есть\r\n\t\tconst cleanFolderPath = folderPath.replace(/^\\/+/, '').replace(/\\/+$/, '')\r\n\t\tif (src.startsWith(`/${cleanFolderPath}/`)) {\r\n\t\t\treturn src\r\n\t\t}\r\n\t\t// Иначе добавляем folderPath\r\n\t\tif (cleanFolderPath) {\r\n\t\t\treturn `/${cleanFolderPath}${src}`\r\n\t\t}\r\n\t\treturn src\r\n\t}\r\n\r\n\t// Относительные пути разрешаем относительно текущего файла\r\n\t// filePath имеет формат: \"2.0.2/ru/api/markdown-test.md\" (относительно folderPath)\r\n\tif (!filePath) {\r\n\t\t// Если filePath пустой, просто добавляем folderPath\r\n\t\tconst cleanFolderPath = folderPath.replace(/^\\/+/, '').replace(/\\/+$/, '')\r\n\t\tconst imageName = src.replace(/\\\\/g, '/').replace(/^\\.\\//, '')\r\n\t\tif (cleanFolderPath) {\r\n\t\t\treturn `/${cleanFolderPath}/${imageName}`\r\n\t\t}\r\n\t\treturn `/${imageName}`\r\n\t}\r\n\t\r\n\t// Убираем имя файла из пути, оставляем только директорию\r\n\tconst fileDir = filePath.replace(/[/\\\\][^/\\\\]*\\.md$/, '').replace(/\\\\/g, '/')\r\n\t\r\n\t// Нормализуем путь изображения (убираем начальные ./ если есть)\r\n\tconst imagePath = src.replace(/\\\\/g, '/').replace(/^\\.\\//, '')\r\n\tconst imageParts = imagePath.split('/').filter(Boolean)\r\n\t\r\n\t// Начинаем с директории файла (может быть пустой, если файл в корне)\r\n\tconst dirParts = fileDir ? fileDir.split('/').filter(Boolean) : []\r\n\r\n\t// Обрабатываем относительные пути (.., .)\r\n\tfor (const part of imageParts) {\r\n\t\tif (part === '..') {\r\n\t\t\tif (dirParts.length > 0) {\r\n\t\t\t\tdirParts.pop()\r\n\t\t\t}\r\n\t\t} else if (part !== '.') {\r\n\t\t\tdirParts.push(part)\r\n\t\t}\r\n\t}\r\n\r\n\t// Формируем путь относительно папки документации\r\n\tconst resolvedPath = dirParts.length > 0 ? dirParts.join('/') : ''\r\n\t\r\n\t// Добавляем folderPath в начало пути\r\n\t// В Vite файлы из public доступны по корневому пути\r\n\tconst cleanFolderPath = folderPath.replace(/^\\/+/, '').replace(/\\/+$/, '')\r\n\t\r\n\tif (cleanFolderPath) {\r\n\t\tif (resolvedPath) {\r\n\t\t\treturn `/${cleanFolderPath}/${resolvedPath}`\r\n\t\t}\r\n\t\t// Если resolvedPath пустой, но есть folderPath, возвращаем только folderPath\r\n\t\t// Это может произойти, если изображение указано как \"./\" или \"../\" до корня\r\n\t\treturn `/${cleanFolderPath}`\r\n\t}\r\n\t\r\n\treturn resolvedPath ? `/${resolvedPath}` : '/'\r\n}\r\n\r\nexport function MarkdownViewer({\r\n\tfilePath,\r\n\tfolderPath,\r\n\tonPageSelect,\r\n}: MarkdownViewerProps) {\r\n\tconst [content, setContent] = React.useState<string>('')\r\n\tconst [loading, setLoading] = React.useState(true)\r\n\tconst [error, setError] = React.useState<string | null>(null)\r\n\tconst [isDark, setIsDark] = React.useState(false)\r\n\tconst [copiedCode, setCopiedCode] = React.useState<string | null>(null)\r\n\r\n\tReact.useEffect(() => {\r\n\t\tconst checkTheme = () => {\r\n\t\t\tsetIsDark(document.documentElement.classList.contains('dark'))\r\n\t\t}\r\n\t\tcheckTheme()\r\n\t\tconst observer = new MutationObserver(checkTheme)\r\n\t\tobserver.observe(document.documentElement, {\r\n\t\t\tattributes: true,\r\n\t\t\tattributeFilter: ['class'],\r\n\t\t})\r\n\t\treturn () => observer.disconnect()\r\n\t}, [])\r\n\r\n\tconst codeTheme = isDark ? oneDark : oneLight\r\n\r\n\tReact.useEffect(() => {\r\n\t\tconst loadMarkdown = async () => {\r\n\t\t\tsetLoading(true)\r\n\t\t\tsetError(null)\r\n\t\t\tsetContent('')\r\n\r\n\t\t\t// Минимальная задержка для плавности анимации\r\n\t\t\tconst minDelay = 200\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst startTime = Date.now()\r\n\r\n\t\t\t\t// Загружаем markdown файл через API\r\n\t\t\t\tconst params = new URLSearchParams()\r\n\t\t\t\tparams.set('filePath', filePath)\r\n\t\t\t\tparams.set('folderPath', folderPath)\r\n\r\n\t\t\t\tconst response = await fetch(\r\n\t\t\t\t\t`/api/dock-rush-markdown?${params.toString()}`,\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\theaders: {\r\n\t\t\t\t\t\t\tAccept: 'application/json',\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t}\r\n\t\t\t\t)\r\n\r\n\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\tthrow new Error(`HTTP ${response.status}: ${response.statusText}`)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst data = await response.json()\r\n\r\n\t\t\t\t// Вычисляем оставшееся время для минимальной задержки\r\n\t\t\t\tconst elapsed = Date.now() - startTime\r\n\t\t\t\tconst remainingDelay = Math.max(0, minDelay - elapsed)\r\n\r\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, remainingDelay))\r\n\r\n\t\t\t\tif (data.success) {\r\n\t\t\t\t\tsetContent(data.content)\r\n\t\t\t\t\t// Небольшая задержка перед скрытием loading для плавности\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tsetLoading(false)\r\n\t\t\t\t\t}, 100)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthrow new Error(data.error || 'Failed to load markdown')\r\n\t\t\t\t}\r\n\t\t\t} catch (err) {\r\n\t\t\t\tsetError(err instanceof Error ? err.message : 'Unknown error')\r\n\t\t\t\tsetLoading(false)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (filePath) {\r\n\t\t\tloadMarkdown()\r\n\t\t}\r\n\t}, [filePath, folderPath])\r\n\r\n\tif (error) {\r\n\t\treturn (\r\n\t\t\t<div className='flex flex-col items-center justify-center p-12 animate-in fade-in-0 duration-300'>\r\n\t\t\t\t<p className='text-destructive'>Ошибка загрузки файла: {error}</p>\r\n\t\t\t</div>\r\n\t\t)\r\n\t}\r\n\r\n\treturn (\r\n\t\t<div className='relative mx-auto max-w-4xl px-6 py-8 h-full'>\r\n\t\t\t{/* Скелетон */}\r\n\t\t\t{loading && (\r\n\t\t\t\t<div className='flex flex-col gap-4 p-6 animate-in fade-in-0 duration-200'>\r\n\t\t\t\t\t<Skeleton className='h-8 w-3/4' />\r\n\t\t\t\t\t<Skeleton className='h-4 w-full' />\r\n\t\t\t\t\t<Skeleton className='h-4 w-full' />\r\n\t\t\t\t\t<Skeleton className='h-4 w-2/3' />\r\n\t\t\t\t\t<Skeleton className='h-4 w-full' />\r\n\t\t\t\t\t<Skeleton className='h-4 w-5/6' />\r\n\t\t\t\t\t<Skeleton className='h-4 w-full' />\r\n\t\t\t\t\t<Skeleton className='h-4 w-4/5' />\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\r\n\t\t\t{/* Контент */}\r\n\t\t\t{!loading && content && (\r\n\t\t\t\t<div className='animate-in fade-in-0 duration-300'>\r\n\t\t\t\t\t<ReactMarkdown\r\n\t\t\t\tremarkPlugins={[remarkGfm]}\r\n\t\t\t\trehypePlugins={[rehypeRaw, rehypeSanitize]}\r\n\t\t\t\tcomponents={{\r\n\t\t\t\t\t// Заголовки в стиле shadcn\r\n\t\t\t\t\th1: ({ node, ...props }) => {\r\n\t\t\t\t\t\tconst anchor = toAnchor(props.children)\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t<h1\r\n\t\t\t\t\t\t\t\tid={anchor}\r\n\t\t\t\t\t\t\t\tclassName='mb-6 mt-8 scroll-mt-20 text-4xl font-bold tracking-tight'\r\n\t\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t},\r\n\t\t\t\t\th2: ({ node, ...props }) => {\r\n\t\t\t\t\t\tconst anchor = toAnchor(props.children)\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t<h2\r\n\t\t\t\t\t\t\t\tid={anchor}\r\n\t\t\t\t\t\t\t\tclassName='mb-4 mt-8 scroll-mt-20 text-3xl font-semibold tracking-tight'\r\n\t\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t},\r\n\t\t\t\t\th3: ({ node, ...props }) => {\r\n\t\t\t\t\t\tconst anchor = toAnchor(props.children)\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t<h3\r\n\t\t\t\t\t\t\t\tid={anchor}\r\n\t\t\t\t\t\t\t\tclassName='mb-3 mt-6 scroll-mt-20 text-2xl font-semibold tracking-tight'\r\n\t\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t},\r\n\t\t\t\t\th4: ({ node, ...props }) => {\r\n\t\t\t\t\t\tconst anchor = toAnchor(props.children)\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t<h4\r\n\t\t\t\t\t\t\t\tid={anchor}\r\n\t\t\t\t\t\t\t\tclassName='mb-2 mt-4 scroll-mt-20 text-xl font-semibold tracking-tight'\r\n\t\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t},\r\n\t\t\t\t\th5: ({ node, ...props }) => {\r\n\t\t\t\t\t\tconst anchor = toAnchor(props.children)\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t<h5\r\n\t\t\t\t\t\t\t\tid={anchor}\r\n\t\t\t\t\t\t\t\tclassName='mb-2 mt-4 scroll-mt-20 text-lg font-semibold'\r\n\t\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t},\r\n\t\t\t\t\th6: ({ node, ...props }) => {\r\n\t\t\t\t\t\tconst anchor = toAnchor(props.children)\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t<h6\r\n\t\t\t\t\t\t\t\tid={anchor}\r\n\t\t\t\t\t\t\t\tclassName='mb-2 mt-4 scroll-mt-20 text-base font-semibold'\r\n\t\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t},\r\n\t\t\t\t\t// Параграфы в стиле shadcn\r\n\t\t\t\t\tp: ({ node, children, ...props }: any) => {\r\n\t\t\t\t\t\t// Проверяем, есть ли внутри изображения или другие блочные элементы\r\n\t\t\t\t\t\tconst childrenArray = React.Children.toArray(children)\r\n\t\t\t\t\t\tconst hasBlockElements = childrenArray.some((child: unknown) => {\r\n\t\t\t\t\t\t\tif (React.isValidElement(child)) {\r\n\t\t\t\t\t\t\t\tif (child.type === 'figure' || child.type === 'img') {\r\n\t\t\t\t\t\t\t\t\treturn true\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tconst childProps = child.props as { node?: any }\r\n\t\t\t\t\t\t\t\tif (childProps?.node) {\r\n\t\t\t\t\t\t\t\t\tconst childNode = childProps.node\r\n\t\t\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t\t\tchildNode.type === 'element' &&\r\n\t\t\t\t\t\t\t\t\t\t(childNode.tagName === 'img' ||\r\n\t\t\t\t\t\t\t\t\t\t\tchildNode.tagName === 'figure')\r\n\t\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\t\treturn true\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn false\r\n\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\t\tif (hasBlockElements) {\r\n\t\t\t\t\t\t\tconst { ref, ...divProps } = props as any\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\t\tclassName='mb-6 leading-7 text-muted-foreground'\r\n\t\t\t\t\t\t\t\t\t{...divProps}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{children}\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t<p className='mb-6 leading-7 text-muted-foreground' {...props}>\r\n\t\t\t\t\t\t\t\t{children}\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t},\r\n\t\t\t\t\t// Списки в стиле shadcn\r\n\t\t\t\t\tul: ({ node, ...props }) => (\r\n\t\t\t\t\t\t<ul\r\n\t\t\t\t\t\t\tclassName='my-6 ml-6 list-disc space-y-2 text-muted-foreground'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\tol: ({ node, ...props }) => (\r\n\t\t\t\t\t\t<ol\r\n\t\t\t\t\t\t\tclassName='my-6 ml-6 list-decimal space-y-2 text-muted-foreground'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\tli: ({ node, ...props }) => (\r\n\t\t\t\t\t\t<li className='leading-7 pl-2' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Чекбоксы для task lists\r\n\t\t\t\t\tinput: ({ node, ...props }: any) => {\r\n\t\t\t\t\t\tif (props.type === 'checkbox') {\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\ttype='checkbox'\r\n\t\t\t\t\t\t\t\t\tclassName='mr-2 h-4 w-4 rounded border-border accent-primary'\r\n\t\t\t\t\t\t\t\t\tdisabled\r\n\t\t\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn <input {...props} />\r\n\t\t\t\t\t},\r\n\t\t\t\t\t// Цитаты в стиле shadcn\r\n\t\t\t\t\tblockquote: ({ node, ...props }) => (\r\n\t\t\t\t\t\t<blockquote\r\n\t\t\t\t\t\t\tclassName='my-6 border-l-2 border-border bg-muted/50 pl-6 italic text-muted-foreground'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Подсветка кода в стиле shadcn\r\n\t\t\t\t\tcode: ({ node, inline, className, children, ...props }: any) => {\r\n\t\t\t\t\t\tconst match = /language-(\\w+)/.exec(className || '')\r\n\t\t\t\t\t\tconst codeString = String(children).replace(/\\n$/, '')\r\n\r\n\t\t\t\t\t\tif (!inline && match) {\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<CodeBlock\r\n\t\t\t\t\t\t\t\t\tcodeString={codeString}\r\n\t\t\t\t\t\t\t\t\tlanguage={match[1]}\r\n\t\t\t\t\t\t\t\t\tcopiedCode={copiedCode}\r\n\t\t\t\t\t\t\t\t\tsetCopiedCode={setCopiedCode}\r\n\t\t\t\t\t\t\t\t\tcodeTheme={codeTheme}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t<code\r\n\t\t\t\t\t\t\t\tclassName='relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold'\r\n\t\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{children}\r\n\t\t\t\t\t\t\t</code>\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t},\r\n\t\t\t\t\tpre: ({ node, ...props }: any) => {\r\n\t\t\t\t\t\tconst { ref, ...divProps } = props\r\n\t\t\t\t\t\treturn <div {...divProps} />\r\n\t\t\t\t\t},\r\n\t\t\t\t\t// Изображения в стиле shadcn\r\n\t\t\t\t\timg: ({ src, alt, title }: any) => {\r\n\t\t\t\t\t\t// Разрешаем путь к изображению относительно текущего файла\r\n\t\t\t\t\t\tconst resolvedSrc = resolveImagePath(\r\n\t\t\t\t\t\t\tsrc || '',\r\n\t\t\t\t\t\t\tfilePath || '',\r\n\t\t\t\t\t\t\tfolderPath || 'docs'\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t<figure className='my-8'>\r\n\t\t\t\t\t\t\t\t<img\r\n\t\t\t\t\t\t\t\t\tsrc={resolvedSrc}\r\n\t\t\t\t\t\t\t\t\talt={alt}\r\n\t\t\t\t\t\t\t\t\ttitle={title}\r\n\t\t\t\t\t\t\t\t\tloading='lazy'\r\n\t\t\t\t\t\t\t\t\tclassName='rounded-lg border border-border bg-muted max-w-full h-auto'\r\n\t\t\t\t\t\t\t\t\tonError={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t// Если изображение не загрузилось, показываем placeholder\r\n\t\t\t\t\t\t\t\t\t\tconst target = e.target as HTMLImageElement\r\n\t\t\t\t\t\t\t\t\t\ttarget.style.display = 'none'\r\n\t\t\t\t\t\t\t\t\t\tconst figure = target.closest('figure')\r\n\t\t\t\t\t\t\t\t\t\tif (figure && !figure.querySelector('.image-error')) {\r\n\t\t\t\t\t\t\t\t\t\t\tconst errorDiv = document.createElement('div')\r\n\t\t\t\t\t\t\t\t\t\t\terrorDiv.className = 'image-error p-4 text-center text-sm text-muted-foreground border border-dashed border-border rounded-lg'\r\n\t\t\t\t\t\t\t\t\t\t\terrorDiv.textContent = `Изображение не найдено: ${src} (путь: ${resolvedSrc})`\r\n\t\t\t\t\t\t\t\t\t\t\tfigure.appendChild(errorDiv)\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t{alt && (\r\n\t\t\t\t\t\t\t\t\t<figcaption className='mt-3 text-center text-sm text-muted-foreground'>\r\n\t\t\t\t\t\t\t\t\t\t{alt}\r\n\t\t\t\t\t\t\t\t\t</figcaption>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t</figure>\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t},\r\n\t\t\t\t\t// Ссылки в стиле shadcn\r\n\t\t\t\t\ta: ({ href, children, ...props }: any) => {\r\n\t\t\t\t\t\t/* 1. внешние / якоря – оставляем как есть */\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t!href ||\r\n\t\t\t\t\t\t\thref.startsWith('http') ||\r\n\t\t\t\t\t\t\thref.startsWith('#') ||\r\n\t\t\t\t\t\t\thref.startsWith('mailto:') ||\r\n\t\t\t\t\t\t\thref.startsWith('tel:')\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<a\r\n\t\t\t\t\t\t\t\t\thref={href}\r\n\t\t\t\t\t\t\t\t\tclassName='font-medium text-primary underline underline-offset-4 transition-colors hover:text-primary/80'\r\n\t\t\t\t\t\t\t\t\ttarget='_blank'\r\n\t\t\t\t\t\t\t\t\trel='noopener noreferrer'\r\n\t\t\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{children}\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t/* 2. локальный .md – перехватываем */\r\n\t\t\t\t\t\tif (href.toLowerCase().endsWith('.md')) {\r\n\t\t\t\t\t\t\tconst handle = (e: React.MouseEvent) => {\r\n\t\t\t\t\t\t\t\te.preventDefault()\r\n\r\n\t\t\t\t\t\t\t\t/* 2а. выделяем папку текущего файла (убираем имя.md) */\r\n\t\t\t\t\t\t\t\tconst dir = filePath.replace(/[/\\\\][^/\\\\]*\\.md$/, '') // убирает \\installation.md\r\n\r\n\t\t\t\t\t\t\t\t/* 2b. нормализуем слеши → всегда \"/\" для единообразия */\r\n\t\t\t\t\t\t\t\tconst base = dir.replace(/\\\\/g, '/')\r\n\r\n\t\t\t\t\t\t\t\t/* 2c. резолвим относительную ссылку */\r\n\t\t\t\t\t\t\t\tconst rel = href.replace(/\\\\/g, '/')\r\n\t\t\t\t\t\t\t\tconst relParts = rel.split('/').filter(Boolean)\r\n\t\t\t\t\t\t\t\tconst baseParts = base.split('/').filter(Boolean)\r\n\r\n\t\t\t\t\t\t\t\tfor (const p of relParts) {\r\n\t\t\t\t\t\t\t\t\tif (p === '..') baseParts.pop()\r\n\t\t\t\t\t\t\t\t\telse if (p !== '.') baseParts.push(p)\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tconst absolute = baseParts.join('/')\r\n\t\t\t\t\t\t\t\t// onPageSelect теперь обновляет URL автоматически\r\n\t\t\t\t\t\t\t\tonPageSelect(absolute)\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t<a\r\n\t\t\t\t\t\t\t\t\thref={href}\r\n\t\t\t\t\t\t\t\t\tonClick={handle}\r\n\t\t\t\t\t\t\t\t\tclassName='font-medium text-primary underline underline-offset-4 transition-colors hover:text-primary/80 cursor-pointer'\r\n\t\t\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{children}\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t/* 3. остальные внутренние ссылки – просто отдаём */\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t<a\r\n\t\t\t\t\t\t\t\thref={href}\r\n\t\t\t\t\t\t\t\tclassName='font-medium text-primary underline underline-offset-4 transition-colors hover:text-primary/80'\r\n\t\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t},\r\n\t\t\t\t\t// Таблицы в стиле shadcn\r\n\t\t\t\t\ttable: ({ children }: any) => (\r\n\t\t\t\t\t\t<div className='my-6 w-full overflow-y-auto'>\r\n\t\t\t\t\t\t\t<table className='w-full border-collapse'>{children}</table>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t),\r\n\t\t\t\t\tthead: ({ node, ...props }) => (\r\n\t\t\t\t\t\t<thead className='[&_tr]:border-b' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\tth: ({ node, ...props }) => (\r\n\t\t\t\t\t\t<th\r\n\t\t\t\t\t\t\tclassName='h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\ttd: ({ node, ...props }) => (\r\n\t\t\t\t\t\t<td\r\n\t\t\t\t\t\t\tclassName='p-4 align-middle [&:has([role=checkbox])]:pr-0'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\ttbody: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<tbody className='[&_tr:last-child]:border-0' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\ttr: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<tr\r\n\t\t\t\t\t\t\tclassName='border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Горизонтальная линия в стиле shadcn\r\n\t\t\t\t\thr: ({ node, ...props }) => (\r\n\t\t\t\t\t\t<hr className='my-8 border-t border-border' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Форматирование текста в стиле shadcn\r\n\t\t\t\t\tstrong: ({ node, ...props }) => (\r\n\t\t\t\t\t\t<strong className='font-semibold text-foreground' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\tem: ({ node, ...props }) => (\r\n\t\t\t\t\t\t<em className='italic text-foreground' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\tdel: ({ node, ...props }) => (\r\n\t\t\t\t\t\t<del className='line-through text-muted-foreground' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Дополнительные HTML элементы\r\n\t\t\t\t\t// Поддержка <mark> для выделения\r\n\t\t\t\t\tmark: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<mark\r\n\t\t\t\t\t\t\tclassName='bg-yellow-200 dark:bg-yellow-900/50 px-1 rounded'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <kbd> для клавиатурных сочетаний\r\n\t\t\t\t\tkbd: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<kbd\r\n\t\t\t\t\t\t\tclassName='px-2 py-1 text-xs font-semibold text-foreground bg-muted border border-border rounded shadow-sm'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <abbr> для аббревиатур\r\n\t\t\t\t\tabbr: ({ node, title, ...props }: any) => (\r\n\t\t\t\t\t\t<abbr\r\n\t\t\t\t\t\t\ttitle={title}\r\n\t\t\t\t\t\t\tclassName='underline decoration-dotted cursor-help'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <sub> и <sup>\r\n\t\t\t\t\tsub: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<sub className='text-xs align-sub' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\tsup: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<sup className='text-xs align-super' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <details> и <summary>\r\n\t\t\t\t\tdetails: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<details\r\n\t\t\t\t\t\t\tclassName='my-4 px-4 rounded-lg border border-border bg-muted/30'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\tsummary: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<summary\r\n\t\t\t\t\t\t\tclassName='cursor-pointer px-4 py-2 font-semibold hover:bg-muted/50'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <dl>, <dt>, <dd> для списков определений\r\n\t\t\t\t\tdl: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<dl className='my-4 space-y-2' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\tdt: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<dt className='font-semibold text-foreground' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\tdd: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<dd className='ml-6 text-muted-foreground' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <video>\r\n\t\t\t\t\tvideo: ({ node, src, ...props }: any) => (\r\n\t\t\t\t\t\t<video\r\n\t\t\t\t\t\t\tsrc={src}\r\n\t\t\t\t\t\t\tcontrols\r\n\t\t\t\t\t\t\tclassName='my-4 w-full rounded-lg border border-border'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <iframe>\r\n\t\t\t\t\tiframe: ({ node, src, title, ...props }: any) => (\r\n\t\t\t\t\t\t<iframe\r\n\t\t\t\t\t\t\tsrc={src}\r\n\t\t\t\t\t\t\ttitle={title}\r\n\t\t\t\t\t\t\tclassName='my-4 w-full rounded-lg border border-border'\r\n\t\t\t\t\t\t\tallowFullScreen\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <audio>\r\n\t\t\t\t\taudio: ({ node, src, ...props }: any) => (\r\n\t\t\t\t\t\t<audio src={src} controls className='my-4 w-full' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <br>\r\n\t\t\t\t\tbr: ({ node, ...props }: any) => <br {...props} />,\r\n\t\t\t\t\t// Поддержка <div>\r\n\t\t\t\t\tdiv: ({ node, className, ...props }: any) => {\r\n\t\t\t\t\t\t// Сохраняем классы если они есть, добавляем базовые стили\r\n\t\t\t\t\t\tconst finalClassName = className ? `${className} my-2` : 'my-2'\r\n\t\t\t\t\t\treturn <div className={finalClassName} {...props} />\r\n\t\t\t\t\t},\r\n\t\t\t\t\t// Поддержка <span>\r\n\t\t\t\t\tspan: ({ node, ...props }: any) => <span {...props} />,\r\n\t\t\t\t\t// Поддержка <section>\r\n\t\t\t\t\tsection: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<section className='my-6' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <article>\r\n\t\t\t\t\tarticle: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<article className='my-6' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <aside>\r\n\t\t\t\t\taside: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<aside\r\n\t\t\t\t\t\t\tclassName='my-4 border-l-4 border-primary pl-4 italic text-muted-foreground'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <address>\r\n\t\t\t\t\taddress: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<address className='my-4 not-italic' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <time>\r\n\t\t\t\t\ttime: ({ node, datetime, ...props }: any) => (\r\n\t\t\t\t\t\t<time\r\n\t\t\t\t\t\t\tdateTime={datetime}\r\n\t\t\t\t\t\t\tclassName='text-muted-foreground'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <small>\r\n\t\t\t\t\tsmall: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<small className='text-sm text-muted-foreground' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <ins> (вставленный текст)\r\n\t\t\t\t\tins: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<ins\r\n\t\t\t\t\t\t\tclassName='no-underline bg-green-100 dark:bg-green-900/30 px-1 rounded'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <samp> (пример вывода)\r\n\t\t\t\t\tsamp: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<samp\r\n\t\t\t\t\t\t\tclassName='font-mono bg-muted px-1 py-0.5 rounded text-sm'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <var> (переменные)\r\n\t\t\t\t\tvar: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<var className='italic font-mono text-primary' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <cite> (цитата источника)\r\n\t\t\t\t\tcite: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<cite className='italic text-muted-foreground' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <q> (короткая цитата)\r\n\t\t\t\t\tq: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<q className='italic text-muted-foreground' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <dfn> (определение термина)\r\n\t\t\t\t\tdfn: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<dfn className='italic font-semibold' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <bdi> и <bdo> (двунаправленный текст)\r\n\t\t\t\t\tbdi: ({ node, ...props }: any) => <bdi {...props} />,\r\n\t\t\t\t\tbdo: ({ node, dir, ...props }: any) => <bdo dir={dir} {...props} />,\r\n\t\t\t\t\t// Поддержка <wbr> (возможный перенос строки)\r\n\t\t\t\t\twbr: ({ node, ...props }: any) => <wbr {...props} />,\r\n\t\t\t\t\t// Поддержка <ruby>, <rt>, <rp> (руби-аннотации)\r\n\t\t\t\t\truby: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<ruby className='text-base' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\trt: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<rt className='text-xs text-muted-foreground' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\trp: ({ node, ...props }: any) => (\r\n\t\t\t\t\t\t<rp className='text-xs text-muted-foreground' {...props} />\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <meter> (измеритель)\r\n\t\t\t\t\tmeter: ({ node, value, min, max, ...props }: any) => (\r\n\t\t\t\t\t\t<meter\r\n\t\t\t\t\t\t\tvalue={value}\r\n\t\t\t\t\t\t\tmin={min}\r\n\t\t\t\t\t\t\tmax={max}\r\n\t\t\t\t\t\t\tclassName='w-full h-2 rounded'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t\t// Поддержка <progress> (прогресс-бар)\r\n\t\t\t\t\tprogress: ({ node, value, max, ...props }: any) => (\r\n\t\t\t\t\t\t<progress\r\n\t\t\t\t\t\t\tvalue={value}\r\n\t\t\t\t\t\t\tmax={max}\r\n\t\t\t\t\t\t\tclassName='w-full h-2 rounded'\r\n\t\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t),\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t{content}\r\n\t\t\t</ReactMarkdown>\r\n\t\t\t\t</div>\r\n\t\t\t)}\r\n\t\t</div>\r\n\t)\r\n}\r\n","import './styles/index.css'\r\nexport { Documentation } from './components'\r\n\r\n\r\n","import { Skeleton } from '@/components/ui/skeleton'\r\nimport * as React from 'react'\r\n\r\nconst LazyMarkdownViewer = React.lazy(() =>\r\n\timport('./markdown-viewer').then(m => ({\r\n\t\tdefault: m.MarkdownViewer,\r\n\t}))\r\n)\r\n\r\nexport function MarkdownViewerLazy(props: any) {\r\n\treturn (\r\n\t\t<React.Suspense\r\n\t\t\tfallback={\r\n\t\t\t\t<div className='p-6'>\r\n\t\t\t\t\t<Skeleton className='h-8 w-3/4 mb-4' />\r\n\t\t\t\t\t<Skeleton className='h-4 w-full mb-2' />\r\n\t\t\t\t\t<Skeleton className='h-4 w-full mb-2' />\r\n\t\t\t\t\t<Skeleton className='h-4 w-2/3' />\r\n\t\t\t\t</div>\r\n\t\t\t}\r\n\t\t>\r\n\t\t\t<LazyMarkdownViewer {...props} />\r\n\t\t</React.Suspense>\r\n\t)\r\n}\r\n","import { Button } from '@/components/ui/button'\r\nimport { cn } from '@/lib/utils'\r\nimport {\r\n\tAlertCircle,\r\n\tCheckCircle2,\r\n\tCopy,\r\n\tFileWarning,\r\n\tFileX,\r\n\tFolderTree,\r\n\tFolderX,\r\n} from 'lucide-react'\r\nimport * as React from 'react'\r\n\r\nexport interface DocumentationError {\r\n\ttype:\r\n\t\t| 'ROOT_FILE_ERROR'\r\n\t\t| 'VERSION_FORMAT_ERROR'\r\n\t\t| 'ORPHAN_FILE_ERROR'\r\n\t\t| 'FILE_IN_WRONG_FOLDER'\r\n\t\t| 'NESTED_VERSION_ERROR'\r\n\t\t| 'NESTED_DIRECTORY_ERROR'\r\n\t\t| 'DUPLICATE_FILE_ERROR'\r\n\t\t| 'INVALID_ROOT_MD_FILE'\r\n\t\t| 'NESTED_DIRECTORY_IN_GROUP'\r\n\t\t| 'NESTED_DIRECTORY_IN_DROPDOWN'\r\n\t\t| 'BUTTON_FILE_IN_WRONG_PLACE'\r\n\tfile?: string\r\n\tfolder?: string\r\n\tfiles?: string[]\r\n\tpath: string\r\n\tpaths?: string[]\r\n\treason: string\r\n\tfix: string\r\n\tparentVersion?: string\r\n\tnestedVersion?: string\r\n}\r\n\r\ninterface ErrorCardProps {\r\n\treadonly error: DocumentationError\r\n\treadonly index: number\r\n}\r\n\r\nfunction getErrorIcon(type: DocumentationError['type']) {\r\n\tswitch (type) {\r\n\t\tcase 'ROOT_FILE_ERROR':\r\n\t\tcase 'ORPHAN_FILE_ERROR':\r\n\t\t\treturn FileX\r\n\t\tcase 'VERSION_FORMAT_ERROR':\r\n\t\t\treturn FolderX\r\n\t\tcase 'FILE_IN_WRONG_FOLDER':\r\n\t\t\treturn FileWarning\r\n\t\tcase 'NESTED_VERSION_ERROR':\r\n\t\tcase 'NESTED_DIRECTORY_ERROR':\r\n\t\t\treturn FolderTree\r\n\t\tcase 'DUPLICATE_FILE_ERROR':\r\n\t\t\treturn Copy\r\n\t\tdefault:\r\n\t\t\treturn AlertCircle\r\n\t}\r\n}\r\n\r\nfunction getErrorTypeLabel(type: DocumentationError['type']): string {\r\n\tswitch (type) {\r\n\t\tcase 'ROOT_FILE_ERROR':\r\n\t\t\treturn 'Файл в корне'\r\n\t\tcase 'VERSION_FORMAT_ERROR':\r\n\t\t\treturn 'Неверный формат версии'\r\n\t\tcase 'ORPHAN_FILE_ERROR':\r\n\t\t\treturn 'Файл без версии'\r\n\t\tcase 'FILE_IN_WRONG_FOLDER':\r\n\t\t\treturn 'Файл в неправильной папке'\r\n\t\tcase 'NESTED_VERSION_ERROR':\r\n\t\t\treturn 'Вложенная версия'\r\n\t\tcase 'NESTED_DIRECTORY_ERROR':\r\n\t\t\treturn 'Вложенная директория'\r\n\t\tcase 'DUPLICATE_FILE_ERROR':\r\n\t\t\treturn 'Дубликат файла'\r\n\t\tcase 'INVALID_ROOT_MD_FILE':\r\n\t\t\treturn 'Неверный .md файл в корне версии'\r\n\t\tcase 'NESTED_DIRECTORY_IN_GROUP':\r\n\t\t\treturn 'Вложенная папка в группе'\r\n\t\tcase 'NESTED_DIRECTORY_IN_DROPDOWN':\r\n\t\t\treturn 'Вложенная папка в dropdown'\r\n\t\tcase 'BUTTON_FILE_IN_WRONG_PLACE':\r\n\t\t\treturn 'Кнопка в неправильном месте'\r\n\t\tdefault:\r\n\t\t\treturn 'Ошибка'\r\n\t}\r\n}\r\n\r\nfunction ErrorCard({ error, index }: ErrorCardProps) {\r\n\tconst Icon = getErrorIcon(error.type)\r\n\tconst [copied, setCopied] = React.useState(false)\r\n\r\n\tconst handleCopyPath = () => {\r\n\t\tconst pathToCopy = error.path || error.paths?.join(', ') || ''\r\n\t\tnavigator.clipboard.writeText(pathToCopy)\r\n\t\tsetCopied(true)\r\n\t\tsetTimeout(() => setCopied(false), 2000)\r\n\t}\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'group relative rounded-lg border border-destructive/20 bg-destructive/5 p-4 transition-all hover:border-destructive/40 hover:bg-destructive/10',\r\n\t\t\t\t'flex flex-col gap-3'\r\n\t\t\t)}\r\n\t\t>\r\n\t\t\t<div className='flex items-start gap-3'>\r\n\t\t\t\t<div className='mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-destructive/10 text-destructive'>\r\n\t\t\t\t\t<Icon className='h-4 w-4' />\r\n\t\t\t\t</div>\r\n\t\t\t\t<div className='flex-1 space-y-1'>\r\n\t\t\t\t\t<div className='flex items-center justify-between gap-2'>\r\n\t\t\t\t\t\t<div className='flex items-center gap-2'>\r\n\t\t\t\t\t\t\t<span className='text-xs font-semibold text-muted-foreground'>\r\n\t\t\t\t\t\t\t\t#{index + 1}\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<span className='text-sm font-semibold text-destructive'>\r\n\t\t\t\t\t\t\t\t{getErrorTypeLabel(error.type)}\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant='ghost'\r\n\t\t\t\t\t\t\tsize='sm'\r\n\t\t\t\t\t\t\tclassName='h-7 w-7 p-0'\r\n\t\t\t\t\t\t\tonClick={handleCopyPath}\r\n\t\t\t\t\t\t\ttitle='Копировать путь'\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{copied ? (\r\n\t\t\t\t\t\t\t\t<CheckCircle2 className='h-3.5 w-3.5 text-green-600' />\r\n\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t<Copy className='h-3.5 w-3.5' />\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div className='space-y-2'>\r\n\t\t\t\t\t\t{(error.file || error.folder || error.files) && (\r\n\t\t\t\t\t\t\t<div className='flex flex-wrap items-center gap-2'>\r\n\t\t\t\t\t\t\t\t<span className='text-xs text-muted-foreground'>\r\n\t\t\t\t\t\t\t\t\t{error.file && `Файл:`}\r\n\t\t\t\t\t\t\t\t\t{error.folder && `Папка:`}\r\n\t\t\t\t\t\t\t\t\t{error.files && `Файлы:`}\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t{error.file && (\r\n\t\t\t\t\t\t\t\t\t<code className='rounded bg-muted px-1.5 py-0.5 text-xs font-mono text-foreground'>\r\n\t\t\t\t\t\t\t\t\t\t{error.file}\r\n\t\t\t\t\t\t\t\t\t</code>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t{error.folder && (\r\n\t\t\t\t\t\t\t\t\t<code className='rounded bg-muted px-1.5 py-0.5 text-xs font-mono text-foreground'>\r\n\t\t\t\t\t\t\t\t\t\t{error.folder}\r\n\t\t\t\t\t\t\t\t\t</code>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t{error.files && (\r\n\t\t\t\t\t\t\t\t\t<div className='flex flex-wrap gap-1'>\r\n\t\t\t\t\t\t\t\t\t\t{error.files.map(file => (\r\n\t\t\t\t\t\t\t\t\t\t\t<code\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={file}\r\n\t\t\t\t\t\t\t\t\t\t\t\tclassName='rounded bg-muted px-1.5 py-0.5 text-xs font-mono text-foreground'\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{file}\r\n\t\t\t\t\t\t\t\t\t\t\t</code>\r\n\t\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t<div className='flex items-start gap-2'>\r\n\t\t\t\t\t\t\t<span className='text-xs text-muted-foreground'>Путь:</span>\r\n\t\t\t\t\t\t\t<code className='break-all rounded bg-muted px-1.5 py-0.5 text-xs font-mono text-foreground'>\r\n\t\t\t\t\t\t\t\t{error.path || error.paths?.join(', ')}\r\n\t\t\t\t\t\t\t</code>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div className='ml-11 space-y-2 border-t border-destructive/10 pt-3'>\r\n\t\t\t\t<div>\r\n\t\t\t\t\t<span className='text-xs font-medium text-muted-foreground'>\r\n\t\t\t\t\t\tПричина:\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t<p className='mt-1 text-sm text-foreground'>{error.reason}</p>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div>\r\n\t\t\t\t\t<span className='text-xs font-medium text-green-700 dark:text-green-400'>\r\n\t\t\t\t\t\tРешение:\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t<p className='mt-1 text-sm text-green-800 dark:text-green-300'>\r\n\t\t\t\t\t\t{error.fix}\r\n\t\t\t\t\t</p>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t)\r\n}\r\n\r\ninterface ErrorsListProps {\r\n\treadonly errors: DocumentationError[]\r\n}\r\n\r\nexport function ErrorsList({ errors }: ErrorsListProps) {\r\n\tif (!errors || errors.length === 0) {\r\n\t\treturn (\r\n\t\t\t<div className='flex flex-col items-center justify-center rounded-lg border border-green-200 bg-green-50/50 p-12 dark:border-green-900 dark:bg-green-950/20'>\r\n\t\t\t\t<CheckCircle2 className='mb-4 h-12 w-12 text-green-600 dark:text-green-400' />\r\n\t\t\t\t<h3 className='mb-2 text-lg font-semibold text-green-900 dark:text-green-100'>\r\n\t\t\t\t\tОшибок не найдено\r\n\t\t\t\t</h3>\r\n\t\t\t\t<p className='text-center text-sm text-green-700 dark:text-green-300'>\r\n\t\t\t\t\tСтруктура документации соответствует всем требованиям\r\n\t\t\t\t</p>\r\n\t\t\t</div>\r\n\t\t)\r\n\t}\r\n\r\n\treturn (\r\n\t\t<div className='space-y-4'>\r\n\t\t\t<div className='flex items-center justify-between'>\r\n\t\t\t\t<div>\r\n\t\t\t\t\t<h2 className='text-2xl font-bold tracking-tight'>\r\n\t\t\t\t\t\tОшибки структуры документации\r\n\t\t\t\t\t</h2>\r\n\t\t\t\t\t<p className='mt-1 text-sm text-muted-foreground'>\r\n\t\t\t\t\t\tНайдено {errors.length} {errors.length === 1 ? 'ошибка' : 'ошибок'}{' '}\r\n\t\t\t\t\t\tв структуре документации\r\n\t\t\t\t\t</p>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div className='flex h-10 w-10 items-center justify-center rounded-full bg-destructive/10 text-destructive'>\r\n\t\t\t\t\t<AlertCircle className='h-5 w-5' />\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div className='space-y-3'>\r\n\t\t\t\t{errors.map((error, index) => (\r\n\t\t\t\t\t<ErrorCard\r\n\t\t\t\t\t\tkey={`${error.type}-${error.path}-${index}`}\r\n\t\t\t\t\t\terror={error}\r\n\t\t\t\t\t\tindex={index}\r\n\t\t\t\t\t/>\r\n\t\t\t\t))}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t)\r\n}\r\n","import { Languages } from 'lucide-react'\r\nimport * as React from 'react'\r\nimport {\r\n\tSelect,\r\n\tSelectContent,\r\n\tSelectItem,\r\n\tSelectTrigger,\r\n\tSelectValue,\r\n} from './ui/select'\r\n\r\ninterface LanguageToggleProps {\r\n\treadonly languages: string[]\r\n\treadonly selectedLanguage: string | null\r\n\treadonly onLanguageChange: (language: string | null) => void\r\n}\r\n\r\nexport function LanguageToggle({\r\n\tlanguages,\r\n\tselectedLanguage,\r\n\tonLanguageChange,\r\n}: LanguageToggleProps) {\r\n\tif (languages.length === 0) {\r\n\t\treturn null\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Select\r\n\t\t\tvalue={selectedLanguage || ''}\r\n\t\t\tonValueChange={(value) => {\r\n\t\t\t\tonLanguageChange(value || null)\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t<SelectTrigger className='h-9 w-[120px]'>\r\n\t\t\t\t<Languages className='mr-2 h-4 w-4' />\r\n\t\t\t\t<SelectValue placeholder='Language' />\r\n\t\t\t</SelectTrigger>\r\n\t\t\t<SelectContent>\r\n\t\t\t\t{languages.map(lang => (\r\n\t\t\t\t\t<SelectItem key={lang} value={lang}>\r\n\t\t\t\t\t\t{lang.toUpperCase()}\r\n\t\t\t\t\t</SelectItem>\r\n\t\t\t\t))}\r\n\t\t\t</SelectContent>\r\n\t\t</Select>\r\n\t)\r\n}\r\n\r\n","import * as React from \"react\"\r\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\r\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Select = SelectPrimitive.Root\r\n\r\nconst SelectGroup = SelectPrimitive.Group\r\n\r\nconst SelectValue = SelectPrimitive.Value\r\n\r\nconst SelectTrigger = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Trigger>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\r\n>(({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Trigger\r\n ref={ref}\r\n className={cn(\r\n \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <SelectPrimitive.Icon asChild>\r\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\r\n </SelectPrimitive.Icon>\r\n </SelectPrimitive.Trigger>\r\n))\r\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\r\n\r\nconst SelectScrollUpButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollUpButton\r\n ref={ref}\r\n className={cn(\r\n \"flex cursor-default items-center justify-center py-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronUp className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollUpButton>\r\n))\r\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\r\n\r\nconst SelectScrollDownButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollDownButton\r\n ref={ref}\r\n className={cn(\r\n \"flex cursor-default items-center justify-center py-1\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollDownButton>\r\n))\r\nSelectScrollDownButton.displayName =\r\n SelectPrimitive.ScrollDownButton.displayName\r\n\r\nconst SelectContent = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\r\n>(({ className, children, position = \"popper\", ...props }, ref) => (\r\n <SelectPrimitive.Portal>\r\n <SelectPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]\",\r\n position === \"popper\" &&\r\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\r\n className\r\n )}\r\n position={position}\r\n {...props}\r\n >\r\n <SelectScrollUpButton />\r\n <SelectPrimitive.Viewport\r\n className={cn(\r\n \"p-1\",\r\n position === \"popper\" &&\r\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\r\n )}\r\n >\r\n {children}\r\n </SelectPrimitive.Viewport>\r\n <SelectScrollDownButton />\r\n </SelectPrimitive.Content>\r\n </SelectPrimitive.Portal>\r\n))\r\nSelectContent.displayName = SelectPrimitive.Content.displayName\r\n\r\nconst SelectLabel = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Label\r\n ref={ref}\r\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\r\n {...props}\r\n />\r\n))\r\nSelectLabel.displayName = SelectPrimitive.Label.displayName\r\n\r\nconst SelectItem = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\r\n>(({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <SelectPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </SelectPrimitive.ItemIndicator>\r\n </span>\r\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\r\n </SelectPrimitive.Item>\r\n))\r\nSelectItem.displayName = SelectPrimitive.Item.displayName\r\n\r\nconst SelectSeparator = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Separator\r\n ref={ref}\r\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\r\n {...props}\r\n />\r\n))\r\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\r\n\r\nexport {\r\n Select,\r\n SelectGroup,\r\n SelectValue,\r\n SelectTrigger,\r\n SelectContent,\r\n SelectLabel,\r\n SelectItem,\r\n SelectSeparator,\r\n SelectScrollUpButton,\r\n SelectScrollDownButton,\r\n}\r\n","export function Logo({ className }: Readonly<{ className?: string }>) {\r\n\treturn (\r\n\t\t<svg\r\n\t\t\twidth='653'\r\n\t\t\theight='566'\r\n\t\t\tviewBox='0 0 653 566'\r\n\t\t\tfill='none'\r\n\t\t\txmlns='http://www.w3.org/2000/svg'\r\n\t\t\tclassName={className}\r\n\t\t>\r\n\t\t\t<path\r\n\t\t\t\td='M272.258 0.0970342C274.805 0.091891 277.352 0.0846067 279.9 0.0753515C286.078 0.0587971 292.255 0.065435 298.434 0.0834397C303.457 0.09751 308.48 0.101349 313.504 0.0979975C314.58 0.0972813 314.58 0.0972813 315.677 0.0965507C317.134 0.0955243 318.591 0.0944689 320.048 0.0933849C332.908 0.0848336 345.768 0.101443 358.627 0.131214C371.088 0.16006 383.548 0.167127 396.008 0.151722C409.601 0.134939 423.193 0.130945 436.786 0.148432C438.237 0.150276 439.688 0.152111 441.139 0.153936C442.209 0.155304 442.209 0.155304 443.301 0.1567C448.316 0.162292 453.331 0.159011 458.346 0.152391C465.101 0.143827 471.856 0.156886 478.612 0.18424C481.087 0.191114 483.563 0.191232 486.039 0.184025C489.425 0.175306 492.81 0.191328 496.195 0.213474C497.169 0.205233 498.144 0.196993 499.148 0.188502C507.901 0.293827 515.66 2.53276 522.07 8.7462C522.898 9.53763 523.727 10.3291 524.581 11.1445C525.441 11.9971 526.301 12.8497 527.188 13.7281C528.096 14.6106 529.005 15.493 529.942 16.4021C533.01 19.3908 536.043 22.4141 539.075 25.4391C540.231 26.5885 541.387 27.7378 542.543 28.8869C546.299 32.6221 550.05 36.3625 553.801 40.1031C555.1 41.3985 556.4 42.6938 557.699 43.9891C563.799 50.0696 569.896 56.1526 575.99 62.2384C583.001 69.2395 590.02 76.2321 597.046 83.2178C602.497 88.6387 607.94 94.0672 613.378 99.5015C616.618 102.739 619.86 105.973 623.111 109.199C626.166 112.23 629.211 115.271 632.25 118.319C633.361 119.432 634.477 120.541 635.596 121.646C643.722 129.678 651.502 137.997 652.44 149.949C652.443 151.704 652.443 151.704 652.445 153.495C652.448 154.154 652.452 154.813 652.455 155.491C652.465 157.696 652.46 159.901 652.455 162.106C652.459 163.703 652.463 165.301 652.469 166.899C652.481 171.288 652.481 175.677 652.478 180.066C652.478 184.8 652.489 189.535 652.498 194.269C652.515 203.544 652.52 212.819 652.522 222.095C652.523 229.635 652.527 237.175 652.533 244.716C652.551 266.095 652.56 287.475 652.558 308.855C652.558 310.584 652.558 310.584 652.558 312.348C652.558 313.502 652.558 314.656 652.558 315.845C652.557 334.545 652.576 353.245 652.604 371.945C652.633 391.147 652.647 410.35 652.645 429.552C652.645 440.332 652.65 451.112 652.672 461.892C652.69 471.072 652.694 480.251 652.681 489.431C652.674 494.112 652.674 498.794 652.691 503.476C652.707 507.766 652.704 512.056 652.687 516.347C652.684 517.894 652.687 519.442 652.698 520.99C652.791 534.716 650.361 545.439 640.527 555.412C629.894 565.125 618.211 566.028 604.347 565.982C602.832 565.984 601.317 565.988 599.802 565.992C595.651 566 591.5 565.996 587.349 565.99C582.868 565.985 578.386 565.992 573.905 565.998C565.131 566.006 556.357 566.005 547.583 565.999C540.452 565.994 533.32 565.994 526.189 565.996C525.174 565.996 524.159 565.996 523.113 565.997C521.051 565.997 518.988 565.998 516.926 565.999C497.59 566.004 478.254 565.998 458.918 565.987C442.329 565.978 425.74 565.98 409.151 565.989C389.884 566 370.617 566.004 351.35 565.998C349.295 565.997 347.241 565.996 345.186 565.996C343.669 565.995 343.669 565.995 342.122 565.995C335 565.993 327.878 565.996 320.756 566.001C312.076 566.006 303.395 566.005 294.715 565.994C290.287 565.989 285.859 565.987 281.43 565.993C277.375 565.999 273.32 565.996 269.265 565.986C267.8 565.983 266.334 565.984 264.869 565.989C251.256 566.031 239.211 564.046 228.785 554.533C220.018 544.629 218.021 534.074 218.09 521.298C218.092 519.813 218.092 519.813 218.094 518.297C218.1 515.149 218.112 512.001 218.125 508.853C218.13 506.713 218.135 504.572 218.139 502.431C218.15 497.197 218.166 491.963 218.188 486.728C217.579 486.731 216.97 486.734 216.343 486.737C201.529 486.803 186.714 486.852 171.9 486.884C164.735 486.899 157.571 486.92 150.407 486.954C144.162 486.984 137.918 487.004 131.673 487.01C128.367 487.014 125.061 487.025 121.754 487.045C118.063 487.067 114.371 487.07 110.679 487.069C109.584 487.08 108.489 487.09 107.361 487.101C98.0972 487.064 98.0972 487.064 94.1875 483.728C91.9221 481.165 90.3109 479.227 90.0234 475.736C90.3972 471.02 91.729 468.088 95.1875 464.728C98.2778 462.835 100.586 462.48 104.186 462.488C105.696 462.484 105.696 462.484 107.237 462.479C108.335 462.486 109.434 462.494 110.565 462.501C111.727 462.501 112.888 462.501 114.084 462.5C117.926 462.502 121.768 462.517 125.609 462.533C128.272 462.537 130.934 462.54 133.596 462.541C139.89 462.548 146.183 462.564 152.476 462.584C159.642 462.606 166.807 462.617 173.973 462.628C188.711 462.648 203.449 462.685 218.188 462.728C218.188 446.558 218.188 430.388 218.188 413.728C213.221 413.749 208.254 413.77 203.136 413.792C186.744 413.858 170.351 413.902 153.958 413.935C144.017 413.956 134.077 413.984 124.136 414.03C115.471 414.07 106.807 414.096 98.1425 414.104C93.5546 414.11 88.967 414.122 84.3792 414.151C80.0602 414.178 75.7415 414.187 71.4224 414.181C69.8381 414.182 68.2539 414.19 66.6697 414.205C64.5037 414.225 62.3391 414.22 60.1731 414.209C58.9618 414.213 57.7506 414.217 56.5027 414.22C52.4811 413.623 50.3377 412.256 47.1875 409.728C44.3587 405.485 44.5348 401.711 45.1875 396.728C47.3067 393.095 49.308 391.242 53.1875 389.728C56.2566 389.482 56.2566 389.482 59.9326 389.488C60.9484 389.485 60.9484 389.485 61.9847 389.482C64.2526 389.479 66.5202 389.49 68.7881 389.501C70.4143 389.502 72.0405 389.501 73.6666 389.5C78.0816 389.5 82.4964 389.511 86.9114 389.525C91.5252 389.538 96.1389 389.539 100.753 389.541C109.49 389.548 118.227 389.564 126.964 389.584C136.91 389.606 146.857 389.617 156.804 389.628C177.265 389.648 197.726 389.685 218.188 389.728C218.188 373.558 218.188 357.388 218.188 340.728C214.008 340.749 209.829 340.77 205.523 340.792C191.725 340.858 177.927 340.902 164.128 340.935C155.761 340.956 147.394 340.984 139.027 341.03C131.734 341.07 124.441 341.096 117.148 341.104C113.286 341.11 109.425 341.122 105.564 341.151C101.928 341.178 98.2922 341.187 94.6559 341.181C92.689 341.182 90.722 341.204 88.7551 341.226C77.8936 341.175 77.8936 341.175 73.1875 336.728C70.3587 332.485 70.5348 328.711 71.1875 323.728C73.3119 320.086 75.3184 318.28 79.1875 316.728C81.8505 316.482 81.8505 316.482 84.9455 316.488C86.1206 316.485 87.2956 316.482 88.5063 316.479C89.7917 316.486 91.077 316.494 92.4014 316.501C93.7714 316.502 95.1414 316.501 96.5115 316.5C100.228 316.5 103.945 316.511 107.661 316.525C111.546 316.538 115.431 316.539 119.316 316.541C126.672 316.548 134.028 316.564 141.384 316.584C149.759 316.606 158.133 316.617 166.508 316.628C183.735 316.648 200.961 316.685 218.188 316.728C218.188 300.888 218.188 285.048 218.188 268.728C213.009 268.749 207.83 268.77 202.494 268.792C185.403 268.858 168.312 268.902 151.22 268.935C140.856 268.956 130.491 268.984 120.126 269.03C111.093 269.07 102.059 269.096 93.0257 269.104C88.2422 269.11 83.459 269.122 78.6756 269.151C74.1727 269.178 69.6702 269.187 65.1672 269.181C63.5152 269.182 61.8632 269.19 60.2113 269.205C57.9534 269.225 55.6968 269.22 53.4388 269.209C51.5445 269.215 51.5445 269.215 49.612 269.22C44.614 268.502 41.4647 266.303 38.3125 262.416C36.8553 258.935 36.7863 256.473 37.1875 252.728C39.0115 248.504 41.0912 246.723 45.1875 244.728C48.5202 244.359 48.5202 244.359 52.3945 244.367C53.4667 244.364 53.4667 244.364 54.5606 244.36C56.9499 244.355 59.3385 244.371 61.7278 244.388C63.4428 244.388 65.1578 244.388 66.8728 244.386C71.5253 244.385 76.1776 244.403 80.8301 244.424C85.6935 244.443 90.5568 244.444 95.4202 244.448C104.628 244.457 113.836 244.482 123.044 244.512C133.528 244.546 144.011 244.562 154.495 244.577C176.059 244.609 197.623 244.664 219.188 244.728C219.188 228.228 219.188 211.728 219.188 194.728C209.594 194.76 209.594 194.76 199.806 194.792C178.711 194.858 157.617 194.902 136.522 194.935C123.729 194.956 110.935 194.984 98.1409 195.03C86.9916 195.07 75.8423 195.096 64.6929 195.104C58.7878 195.11 52.8828 195.122 46.9777 195.151C41.4218 195.178 35.8661 195.187 30.3102 195.181C28.2691 195.182 26.2281 195.19 24.1871 195.205C21.4034 195.225 18.6208 195.22 15.8371 195.209C15.0268 195.221 14.2165 195.232 13.3816 195.244C9.60827 195.204 7.43328 194.887 4.22894 192.821C1.62187 190.148 0.321584 188.29 0 184.545C0.495746 178.585 0.495746 178.585 2.52734 176.068C7.53889 171.865 11.1076 171.585 17.4004 171.608C18.2597 171.607 19.1189 171.606 20.0042 171.605C22.9001 171.604 25.796 171.609 28.6919 171.615C30.7611 171.615 32.8304 171.615 34.8996 171.614C40.5315 171.614 46.1635 171.62 51.7954 171.627C57.6758 171.633 63.5561 171.634 69.4365 171.635C80.5783 171.638 91.7201 171.646 102.862 171.656C115.544 171.667 128.225 171.673 140.907 171.678C167.001 171.688 193.094 171.707 219.188 171.728C219.188 155.228 219.188 138.728 219.188 121.728C214.887 121.754 210.587 121.781 206.156 121.807C191.958 121.89 177.761 121.946 163.564 121.987C154.954 122.013 146.345 122.048 137.736 122.105C130.232 122.155 122.728 122.187 115.224 122.199C111.251 122.205 107.278 122.22 103.305 122.257C99.5636 122.291 95.823 122.301 92.0816 122.294C90.0573 122.296 88.0331 122.323 86.009 122.35C76.0882 122.294 76.0882 122.294 72.387 119.318C69.3308 115.72 68.8417 113.591 68.9023 108.83C69.369 105.39 70.9688 103.317 73.1875 100.728C76.4767 98.6001 79.1487 98.4807 83.0214 98.4876C84.2133 98.4849 85.4052 98.4821 86.6332 98.4793C88.5893 98.4901 88.5893 98.4901 90.585 98.5011C91.9747 98.5016 93.3644 98.5013 94.7542 98.5002C98.5245 98.4996 102.295 98.5114 106.065 98.5253C110.006 98.5378 113.947 98.539 117.888 98.5414C125.351 98.5476 132.813 98.564 140.275 98.5841C148.77 98.6065 157.266 98.6174 165.762 98.6275C183.237 98.6484 200.712 98.6836 218.188 98.7281C218.179 97.9154 218.17 97.1027 218.161 96.2653C218.08 88.5578 218.019 80.8505 217.98 73.1427C217.959 69.1813 217.931 65.2202 217.886 61.2589C217.842 57.4269 217.818 53.5951 217.808 49.7629C217.801 48.3102 217.786 46.8575 217.765 45.405C217.581 32.6699 219.25 21.3579 228.188 11.7281C228.689 11.1854 229.19 10.6427 229.707 10.0836C241.674 -1.41723 256.834 0.0179299 272.258 0.0970342Z'\r\n\t\t\t\tfill='#686868'\r\n\t\t\t/>\r\n\t\t\t<path\r\n\t\t\t\td='M494.188 170.728C499.905 173.209 503.988 177.113 508.535 181.318C511.084 183.634 513.696 185.816 516.375 187.978C521.515 192.139 526.511 196.446 531.497 200.788C535.556 204.32 539.637 207.822 543.75 211.291C544.529 211.95 544.529 211.95 545.324 212.623C548.194 215.052 551.076 217.467 553.969 219.869C555.23 220.926 556.49 221.983 557.75 223.041C558.334 223.52 558.918 224 559.52 224.494C563.879 228.17 567.786 231.918 568.625 237.791C567.78 243.466 564.657 246.45 560.25 249.853C556.069 253.17 552.084 256.589 548.188 260.228C544.48 263.681 540.703 266.993 536.75 270.166C532.565 273.532 528.605 277.06 524.688 280.728C519.846 285.261 514.872 289.542 509.692 293.689C507.328 295.614 505.069 297.616 502.813 299.666C498.891 303.103 496.004 304.459 490.813 305.228C485.947 304.557 483.45 302.285 480.188 298.728C478.551 295.455 478.945 291.822 478.871 288.22C478.851 287.38 478.83 286.539 478.808 285.673C478.743 282.983 478.684 280.293 478.625 277.603C478.582 275.782 478.538 273.96 478.494 272.138C478.387 267.668 478.286 263.198 478.188 258.728C465.696 258.635 453.204 258.564 440.712 258.521C434.911 258.5 429.111 258.472 423.31 258.426C417.707 258.383 412.106 258.359 406.503 258.349C404.37 258.341 402.237 258.327 400.103 258.305C397.107 258.276 394.111 258.272 391.114 258.274C390.239 258.26 389.364 258.245 388.463 258.231C379.967 258.287 372.974 261.285 366.692 267.013C362.236 272.094 360.075 278.298 360.027 284.975C360.017 286.047 360.007 287.119 359.998 288.223C359.993 289.382 359.989 290.542 359.985 291.736C359.976 293.529 359.976 293.529 359.967 295.358C359.958 297.891 359.951 300.425 359.948 302.959C359.938 306.817 359.907 310.675 359.875 314.533C359.869 316.996 359.863 319.46 359.86 321.923C359.847 323.071 359.835 324.218 359.822 325.4C359.849 335.302 361.396 342.69 368.285 350.002C373.269 354.524 378.606 356.842 385.333 356.866C386.56 356.874 386.56 356.874 387.813 356.883C389.147 356.884 389.147 356.884 390.508 356.886C391.923 356.894 391.923 356.894 393.367 356.901C395.417 356.912 397.467 356.921 399.517 356.927C402.773 356.939 406.028 356.959 409.283 356.981C418.54 357.042 427.797 357.096 437.054 357.13C442.719 357.151 448.384 357.186 454.049 357.23C456.198 357.244 458.347 357.253 460.495 357.256C481.316 357.291 499.213 359.545 516.188 372.728C516.813 373.188 517.438 373.649 518.082 374.123C530.153 383.578 537.338 398.951 540.188 413.728C540.716 419.168 540.754 424.564 540.719 430.021C540.722 431.544 540.726 433.067 540.731 434.59C540.736 437.756 540.728 440.922 540.709 444.087C540.686 448.115 540.7 452.142 540.724 456.169C540.738 459.305 540.733 462.441 540.723 465.577C540.72 467.061 540.724 468.545 540.733 470.029C540.78 479.457 540.813 489.532 534.204 496.957C527.872 502.901 522.148 504.321 513.551 504.166C507.299 503.352 502.515 500.534 498.496 495.689C495.008 490.382 494.067 486.066 494.046 479.725C494.035 477.908 494.035 477.908 494.025 476.053C494.02 474.746 494.016 473.438 494.012 472.091C494.002 470.729 493.99 469.366 493.978 468.003C493.925 462.228 493.877 456.452 493.862 450.677C493.852 447.138 493.822 443.6 493.781 440.062C493.762 438.074 493.765 436.086 493.768 434.098C493.631 423.891 491.608 415.98 484.188 408.728C478.511 404.964 473.514 404.152 466.813 404.23C465.911 404.224 465.009 404.219 464.079 404.213C462.132 404.204 460.185 404.204 458.237 404.212C455.14 404.224 452.044 404.213 448.947 404.196C443.476 404.169 438.004 404.163 432.533 404.165C423.806 404.167 415.079 404.153 406.352 404.109C403.327 404.1 400.304 404.108 397.28 404.118C370.94 404.089 350.237 397.743 331.25 378.795C320.19 366.919 313.165 350.037 313.011 333.739C312.998 332.553 312.985 331.367 312.972 330.145C312.964 328.868 312.957 327.591 312.949 326.275C312.945 325.617 312.941 324.959 312.937 324.28C312.916 320.785 312.902 317.291 312.893 313.796C312.884 310.939 312.863 308.082 312.831 305.225C312.532 277.898 314.71 253.66 334.73 233.142C353.674 214.769 375.375 211.129 400.528 211.119C402.748 211.104 404.969 211.087 407.189 211.069C412.984 211.025 418.779 211.005 424.574 210.99C430.507 210.97 436.44 210.928 442.373 210.888C453.978 210.813 465.583 210.763 477.188 210.728C477.202 209.42 477.202 209.42 477.216 208.085C477.26 204.821 477.322 201.559 477.395 198.295C477.423 196.888 477.445 195.481 477.459 194.074C477.614 179.521 477.614 179.521 482.188 173.728C486.068 170.477 489.21 170.127 494.188 170.728Z'\r\n\t\t\t\tfill='#F9F9F9'\r\n\t\t\t/>\r\n\t\t\t<path\r\n\t\t\t\td='M507.188 1.72815C518.614 2.3141 526.874 12.9781 534.421 20.5575C535.626 21.7562 536.831 22.9543 538.036 24.1518C541.289 27.3866 544.532 30.6308 547.773 33.8774C550.486 36.5939 553.204 39.3058 555.922 42.0177C562.336 48.4175 568.742 54.8251 575.143 61.2377C581.734 67.8398 588.337 74.429 594.947 81.012C600.636 86.6789 606.317 92.3535 611.992 98.0343C615.376 101.421 618.762 104.805 622.155 108.181C625.346 111.356 628.526 114.54 631.699 117.733C632.861 118.898 634.027 120.06 635.196 121.219C649.032 134.94 649.032 134.941 651.188 144.728C650.528 144.728 649.868 144.728 649.188 144.728C649.188 143.738 649.188 142.748 649.188 141.728C647.876 141.737 646.564 141.746 645.213 141.755C632.811 141.836 620.41 141.896 608.008 141.935C601.633 141.956 595.259 141.984 588.884 142.03C582.724 142.074 576.565 142.097 570.405 142.108C568.062 142.115 565.72 142.129 563.378 142.151C546.158 142.304 531.519 142.101 518.188 129.728C509.005 119.284 507.023 108.101 507.074 94.5919C507.074 93.5864 507.074 92.5809 507.074 91.545C507.074 88.2336 507.082 84.9223 507.09 81.611C507.092 79.3103 507.093 77.0095 507.094 74.7088C507.098 68.6623 507.108 62.6158 507.119 56.5693C507.129 50.3957 507.134 44.2221 507.139 38.0485C507.15 25.9417 507.167 13.8349 507.188 1.72815Z'\r\n\t\t\t\tfill='#4F4F4F'\r\n\t\t\t/>\r\n\t\t</svg>\r\n\t)\r\n}\r\n","import { Button } from '@/components/ui/button'\r\nimport {\r\n\tCommandDialog,\r\n\tCommandEmpty,\r\n\tCommandGroup,\r\n\tCommandInput,\r\n\tCommandItem,\r\n\tCommandList,\r\n} from '@/components/ui/command'\r\nimport { getTitle } from '@/lib/documentation/helpers'\r\nimport type {\r\n\tDocumentationEntity,\r\n\tVersionStructure,\r\n} from '@/lib/documentation/types'\r\nimport { Search } from 'lucide-react'\r\nimport * as React from 'react'\r\n\r\ninterface SearchBarProps {\r\n\tdocumentationStructure: VersionStructure[]\r\n\tselectedVersion: string | undefined\r\n\tselectedLanguage: string | null\r\n\tonPageSelect: (filePath: string | null) => void\r\n\tscannedFiles?: {\r\n\t\tfiles: Array<{\r\n\t\t\trelativePath: string\r\n\t\t\toriginalRelativePath?: string\r\n\t\t\tcontent?: string\r\n\t\t}>\r\n\t}\r\n}\r\n\r\ninterface SearchResult {\r\n\tentity: DocumentationEntity\r\n\tversion: string\r\n\tpath: string\r\n\ttitle: string\r\n\tcontent?: string // Содержимое файла для поиска\r\n\tsnippet?: string // Фрагмент текста с найденным словом\r\n}\r\n\r\nexport function SearchBar({\r\n\tdocumentationStructure,\r\n\tselectedVersion,\r\n\tselectedLanguage,\r\n\tonPageSelect,\r\n\tscannedFiles,\r\n}: SearchBarProps) {\r\n\tconst [open, setOpen] = React.useState(false)\r\n\tconst [query, setQuery] = React.useState('')\r\n\r\n\t// Создаем Map для быстрого доступа к содержимому файлов\r\n\tconst contentMap = React.useMemo(() => {\r\n\t\tconst map = new Map<string, string>()\r\n\t\tif (scannedFiles?.files) {\r\n\t\t\tfor (const file of scannedFiles.files) {\r\n\t\t\t\tconst key = file.originalRelativePath || file.relativePath\r\n\t\t\t\tif (file.content) {\r\n\t\t\t\t\tmap.set(key, file.content)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn map\r\n\t}, [scannedFiles])\r\n\r\n\t// Получаем все страницы для поиска\r\n\tconst searchablePages = React.useMemo(() => {\r\n\t\tconst results: SearchResult[] = []\r\n\r\n\t\tfor (const structure of documentationStructure) {\r\n\t\t\t// Фильтруем по выбранной версии, если она задана\r\n\t\t\tif (selectedVersion && structure.version !== selectedVersion) {\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\r\n\t\t\tconst collectPages = (\r\n\t\t\t\tentities: DocumentationEntity[],\r\n\t\t\t\tversion: string\r\n\t\t\t): void => {\r\n\t\t\t\tfor (const entity of entities) {\r\n\t\t\t\t\tif (entity.type === 'page') {\r\n\t\t\t\t\t\t// Проверяем searchable\r\n\t\t\t\t\t\tif (entity.frontmatter?.searchable === false) {\r\n\t\t\t\t\t\t\tcontinue\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tconst filePath =\r\n\t\t\t\t\t\t\tentity.file.originalRelativePath || entity.file.relativePath\r\n\t\t\t\t\t\tconst title = getTitle(entity)\r\n\r\n\t\t\t\t\t\t// Получаем содержимое файла из Map\r\n\t\t\t\t\t\tconst content = contentMap.get(filePath)\r\n\r\n\t\t\t\t\t\tresults.push({\r\n\t\t\t\t\t\t\tentity,\r\n\t\t\t\t\t\t\tversion,\r\n\t\t\t\t\t\t\tpath: filePath,\r\n\t\t\t\t\t\t\ttitle,\r\n\t\t\t\t\t\t\tcontent,\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t} else if (entity.type === 'dropdown' || entity.type === 'group') {\r\n\t\t\t\t\t\t// Рекурсивно собираем страницы из dropdown и group\r\n\t\t\t\t\t\tcollectPages(entity.pages, version)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tcollectPages(structure.entities, structure.version)\r\n\t\t}\r\n\r\n\t\treturn results\r\n\t}, [documentationStructure, selectedVersion, contentMap])\r\n\r\n\t// Функция для извлечения фрагмента текста с найденным словом\r\n\tconst extractSnippet = (\r\n\t\tcontent: string,\r\n\t\tquery: string,\r\n\t\tmaxLength = 150\r\n\t): string => {\r\n\t\tconst lowerContent = content.toLowerCase()\r\n\t\tconst lowerQuery = query.toLowerCase()\r\n\t\tconst index = lowerContent.indexOf(lowerQuery)\r\n\r\n\t\tif (index === -1) return ''\r\n\r\n\t\t// Находим начало фрагмента (стараемся взять целое предложение)\r\n\t\tlet start = Math.max(0, index - maxLength / 2)\r\n\t\t// Ищем начало предложения или пробел\r\n\t\tconst beforeMatch = content.substring(start, index)\r\n\t\tconst lastSentence = beforeMatch.lastIndexOf('. ')\r\n\t\tconst lastNewline = beforeMatch.lastIndexOf('\\n')\r\n\t\tconst lastSpace = beforeMatch.lastIndexOf(' ')\r\n\r\n\t\tconst bestStart = Math.max(\r\n\t\t\tlastSentence + 2,\r\n\t\t\tlastNewline + 1,\r\n\t\t\tlastSpace + 1,\r\n\t\t\tstart\r\n\t\t)\r\n\r\n\t\t// Находим конец фрагмента\r\n\t\tlet end = Math.min(content.length, index + query.length + maxLength / 2)\r\n\t\t// Ищем конец предложения или пробел\r\n\t\tconst afterMatch = content.substring(index + query.length, end)\r\n\t\tconst nextSentence = afterMatch.indexOf('. ')\r\n\t\tconst nextNewline = afterMatch.indexOf('\\n')\r\n\t\tconst nextSpace = afterMatch.indexOf(' ')\r\n\r\n\t\tlet bestEnd = end\r\n\t\tif (nextSentence !== -1) {\r\n\t\t\tbestEnd = index + query.length + nextSentence + 1\r\n\t\t} else if (nextNewline !== -1) {\r\n\t\t\tbestEnd = index + query.length + nextNewline\r\n\t\t} else if (nextSpace !== -1) {\r\n\t\t\tbestEnd = index + query.length + nextSpace\r\n\t\t}\r\n\r\n\t\tlet snippet = content.substring(bestStart, bestEnd).trim()\r\n\r\n\t\t// Добавляем многоточие если обрезали\r\n\t\tif (bestStart > 0) snippet = '...' + snippet\r\n\t\tif (bestEnd < content.length) snippet = snippet + '...'\r\n\r\n\t\treturn snippet\r\n\t}\r\n\r\n\t// Фильтруем результаты по запросу и извлекаем фрагменты\r\n\tconst filteredResults = React.useMemo(() => {\r\n\t\tif (!query.trim()) return []\r\n\r\n\t\tconst lowerQuery = query.toLowerCase().trim()\r\n\r\n\t\treturn searchablePages\r\n\t\t\t.filter(page => {\r\n\t\t\t\tconst titleMatch = page.title.toLowerCase().includes(lowerQuery)\r\n\t\t\t\tconst pathMatch = page.path.toLowerCase().includes(lowerQuery)\r\n\t\t\t\tconst contentMatch = page.content?.includes(lowerQuery) ?? false\r\n\r\n\t\t\t\treturn titleMatch || pathMatch || contentMatch\r\n\t\t\t})\r\n\t\t\t.map(page => {\r\n\t\t\t\tlet snippet: string | undefined\r\n\r\n\t\t\t\t// Если найдено в содержимом, извлекаем фрагмент\r\n\t\t\t\tif (page.content?.includes(lowerQuery)) {\r\n\t\t\t\t\tsnippet = extractSnippet(page.content, query)\r\n\t\t\t\t} else if (page.title.toLowerCase().includes(lowerQuery)) {\r\n\t\t\t\t\t// Если найдено только в заголовке, используем заголовок как snippet\r\n\t\t\t\t\tsnippet = page.title\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\t...page,\r\n\t\t\t\t\tsnippet,\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t}, [query, searchablePages])\r\n\r\n\t// Обработка выбора страницы\r\n\tconst handleSelect = (path: string) => {\r\n\t\tonPageSelect(path)\r\n\t\tsetOpen(false)\r\n\t\tsetQuery('')\r\n\t}\r\n\r\n\t// Обработка горячих клавиш\r\n\tReact.useEffect(() => {\r\n\t\tconst down = (e: KeyboardEvent) => {\r\n\t\t\tif (e.key === 'k' && (e.metaKey || e.ctrlKey)) {\r\n\t\t\t\te.preventDefault()\r\n\t\t\t\tsetOpen(open => !open)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdocument.addEventListener('keydown', down)\r\n\t\treturn () => document.removeEventListener('keydown', down)\r\n\t}, [])\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Button\r\n\t\t\t\tvariant='outline'\r\n\t\t\t\tclassName='relative h-9 w-full justify-start text-sm text-muted-foreground sm:pr-12 md:w-64 lg:w-80'\r\n\t\t\t\tonClick={() => setOpen(true)}\r\n\t\t\t>\r\n\t\t\t\t<Search className='mr-2 h-4 w-4' />\r\n\t\t\t\t<span className='hidden lg:inline-flex'>Поиск документации...</span>\r\n\t\t\t\t<span className='inline-flex lg:hidden'>Поиск...</span>\r\n\t\t\t\t<kbd className='pointer-events-none absolute right-1.5 top-1.5 hidden h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium opacity-100 sm:flex'>\r\n\t\t\t\t\t<span className='text-xs'>⌘</span>K\r\n\t\t\t\t</kbd>\r\n\t\t\t</Button>\r\n\r\n\t\t\t<CommandDialog open={open} onOpenChange={setOpen}>\r\n\t\t\t\t<CommandInput\r\n\t\t\t\t\tplaceholder='Поиск по документации...'\r\n\t\t\t\t\tvalue={query}\r\n\t\t\t\t\tonValueChange={setQuery}\r\n\t\t\t\t/>\r\n\t\t\t\t<CommandList>\r\n\t\t\t\t\t{filteredResults.length === 0 && query.trim() && (\r\n\t\t\t\t\t\t<CommandEmpty>Ничего не найдено.</CommandEmpty>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{filteredResults.length > 0 && (\r\n\t\t\t\t\t\t<CommandGroup heading='Страницы'>\r\n\t\t\t\t\t\t\t{filteredResults.map((result, index) => {\r\n\t\t\t\t\t\t\t\t// Выделяем найденное слово в snippet\r\n\t\t\t\t\t\t\t\tconst highlightSnippet = (text: string, query: string) => {\r\n\t\t\t\t\t\t\t\t\tif (!text || !query) return text\r\n\t\t\t\t\t\t\t\t\tconst regex = new RegExp(\r\n\t\t\t\t\t\t\t\t\t\t`(${query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})`,\r\n\t\t\t\t\t\t\t\t\t\t'gi'\r\n\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t\tconst parts = text.split(regex)\r\n\t\t\t\t\t\t\t\t\treturn parts.map((part, i) =>\r\n\t\t\t\t\t\t\t\t\t\tpart.toLowerCase() === query.toLowerCase() ? (\r\n\t\t\t\t\t\t\t\t\t\t\t<mark\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={i}\r\n\t\t\t\t\t\t\t\t\t\t\t\tclassName='bg-primary/20 text-primary font-medium px-0.5 rounded'\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{part}\r\n\t\t\t\t\t\t\t\t\t\t\t</mark>\r\n\t\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t\tpart\r\n\t\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t<CommandItem\r\n\t\t\t\t\t\t\t\t\t\tkey={`${result.version}-${result.path}-${index}`}\r\n\t\t\t\t\t\t\t\t\t\tvalue={`${result.title} ${result.path}`}\r\n\t\t\t\t\t\t\t\t\t\tonSelect={() => handleSelect(result.path)}\r\n\t\t\t\t\t\t\t\t\t\tclassName='cursor-pointer'\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<div className='flex flex-col gap-1'>\r\n\t\t\t\t\t\t\t\t\t\t\t<span className='font-medium'>{result.title}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t{result.snippet && (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span className='text-xs text-muted-foreground line-clamp-2'>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{highlightSnippet(result.snippet, query)}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t\t<span className='text-xs text-muted-foreground/70'>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{result.version} • {result.path}\r\n\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</CommandItem>\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t</CommandGroup>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{!query.trim() && (\r\n\t\t\t\t\t\t<CommandEmpty>Введите запрос для поиска...</CommandEmpty>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</CommandList>\r\n\t\t\t</CommandDialog>\r\n\t\t</>\r\n\t)\r\n}\r\n","import * as React from \"react\"\r\nimport { Dialog, DialogContent } from \"@/components/ui/dialog\"\r\nimport { cn } from \"@/lib/utils\"\r\nimport { Search } from \"lucide-react\"\r\n\r\nconst Command = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n\t<div\r\n\t\tref={ref}\r\n\t\tclassName={cn(\r\n\t\t\t\"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\r\n\t\t\tclassName\r\n\t\t)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nCommand.displayName = \"Command\"\r\n\r\nconst CommandInput = React.forwardRef<\r\n\tHTMLInputElement,\r\n\tReact.ComponentProps<\"input\"> & {\r\n\t\tonValueChange?: (value: string) => void\r\n\t}\r\n>(({ className, onValueChange, ...props }, ref) => {\r\n\tconst [value, setValue] = React.useState(props.value || \"\")\r\n\r\n\tReact.useEffect(() => {\r\n\t\tif (props.value !== undefined) {\r\n\t\t\tsetValue(String(props.value))\r\n\t\t}\r\n\t}, [props.value])\r\n\r\n\tconst handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n\t\tconst newValue = e.target.value\r\n\t\tsetValue(newValue)\r\n\t\tonValueChange?.(newValue)\r\n\t\tif (props.onChange) {\r\n\t\t\tprops.onChange(e)\r\n\t\t}\r\n\t}\r\n\r\n\treturn (\r\n\t\t<div className=\"flex items-center border-b px-3\">\r\n\t\t\t<Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\r\n\t\t\t<input\r\n\t\t\t\tref={ref}\r\n\t\t\t\t{...props}\r\n\t\t\t\tvalue={value}\r\n\t\t\t\tonChange={handleChange}\r\n\t\t\t\tclassName={cn(\r\n\t\t\t\t\t\"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\r\n\t\t\t\t\tclassName\r\n\t\t\t\t)}\r\n\t\t\t/>\r\n\t\t</div>\r\n\t)\r\n})\r\nCommandInput.displayName = \"CommandInput\"\r\n\r\nconst CommandList = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n\t<div\r\n\t\tref={ref}\r\n\t\tclassName={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nCommandList.displayName = \"CommandList\"\r\n\r\nconst CommandEmpty = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n\t<div\r\n\t\tref={ref}\r\n\t\tclassName={cn(\"py-6 text-center text-sm\", className)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nCommandEmpty.displayName = \"CommandEmpty\"\r\n\r\nconst CommandGroup = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.HTMLAttributes<HTMLDivElement> & {\r\n\t\theading?: string\r\n\t}\r\n>(({ className, heading, ...props }, ref) => (\r\n\t<div ref={ref} className={cn(\"overflow-hidden p-1 text-foreground\", className)} {...props}>\r\n\t\t{heading && (\r\n\t\t\t<div className=\"px-2 py-1.5 text-xs font-semibold text-muted-foreground\">\r\n\t\t\t\t{heading}\r\n\t\t\t</div>\r\n\t\t)}\r\n\t\t<div>\r\n\t\t\t{props.children}\r\n\t\t</div>\r\n\t</div>\r\n))\r\nCommandGroup.displayName = \"CommandGroup\"\r\n\r\nconst CommandItem = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.HTMLAttributes<HTMLDivElement> & {\r\n\t\tonSelect?: () => void\r\n\t\tvalue?: string\r\n\t}\r\n>(({ className, onSelect, ...props }, ref) => {\r\n\tconst handleClick = () => {\r\n\t\tonSelect?.()\r\n\t}\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={ref}\r\n\t\t\tclassName={cn(\r\n\t\t\t\t\"relative flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\tonClick={handleClick}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nCommandItem.displayName = \"CommandItem\"\r\n\r\nconst CommandDialog = ({\r\n\topen,\r\n\tonOpenChange,\r\n\tchildren,\r\n}: {\r\n\topen: boolean\r\n\tonOpenChange: (open: boolean) => void\r\n\tchildren: React.ReactNode\r\n}) => {\r\n\treturn (\r\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\r\n\t\t\t<DialogContent className=\"overflow-hidden p-0\">\r\n\t\t\t\t<Command>\r\n\t\t\t\t\t{children}\r\n\t\t\t\t</Command>\r\n\t\t\t</DialogContent>\r\n\t\t</Dialog>\r\n\t)\r\n}\r\n\r\nexport {\r\n\tCommand,\r\n\tCommandDialog,\r\n\tCommandEmpty,\r\n\tCommandGroup,\r\n\tCommandInput,\r\n\tCommandItem,\r\n\tCommandList,\r\n}\r\n\r\n","import * as React from \"react\"\r\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\r\nimport { X } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Dialog = DialogPrimitive.Root\r\n\r\nconst DialogTrigger = DialogPrimitive.Trigger\r\n\r\nconst DialogPortal = DialogPrimitive.Portal\r\n\r\nconst DialogClose = DialogPrimitive.Close\r\n\r\nconst DialogOverlay = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Overlay\r\n ref={ref}\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\r\n\r\nconst DialogContent = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\r\n>(({ className, children, ...props }, ref) => (\r\n <DialogPortal>\r\n <DialogOverlay />\r\n <DialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </DialogPrimitive.Close>\r\n </DialogPrimitive.Content>\r\n </DialogPortal>\r\n))\r\nDialogContent.displayName = DialogPrimitive.Content.displayName\r\n\r\nconst DialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogHeader.displayName = \"DialogHeader\"\r\n\r\nconst DialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogFooter.displayName = \"DialogFooter\"\r\n\r\nconst DialogTitle = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Title\r\n ref={ref}\r\n className={cn(\r\n \"text-lg font-semibold leading-none tracking-tight\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogTitle.displayName = DialogPrimitive.Title.displayName\r\n\r\nconst DialogDescription = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nDialogDescription.displayName = DialogPrimitive.Description.displayName\r\n\r\nexport {\r\n Dialog,\r\n DialogPortal,\r\n DialogOverlay,\r\n DialogClose,\r\n DialogTrigger,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n DialogTitle,\r\n DialogDescription,\r\n}\r\n\r\n","import { FileInfo } from '@/plugin'\r\n\r\n/**\r\n * Определяет доступные языки для версии\r\n */\r\nconst LANGUAGE_PATTERN = /^[a-z]{2}$/\r\nexport function getAvailableLanguages(\r\n\tversion: string,\r\n\tfiles: FileInfo[]\r\n): string[] {\r\n\tconst versionFiles = files.filter(file => {\r\n\t\tconst pathParts = file.relativePath.split(/[\\\\/]/)\r\n\t\treturn pathParts[0] === version\r\n\t})\r\n\r\n\t// Ищем папки с языками на уровне версии (depth = 1)\r\n\tconst languageDirs = versionFiles.filter(\r\n\t\tf =>\r\n\t\t\tf.depth === 1 && f.type === 'directory' && LANGUAGE_PATTERN.test(f.name)\r\n\t)\r\n\r\n\tif (languageDirs.length === 0) {\r\n\t\treturn []\r\n\t}\r\n\r\n\treturn languageDirs.map(dir => dir.name).sort()\r\n}\r\n","import { FileInfo } from '@/plugin'\r\n\r\n/**\r\n * Определяет тип сущности по имени файла/папки (клиентская версия)\r\n */\r\nconst GROUP_PATTERN = /^\\(group-.*\\)$/\r\nconst BUTTON_PATTERN = /\\.button\\.md$/\r\n\r\nexport function getEntityType(\r\n\titem: FileInfo,\r\n\tallFiles: FileInfo[]\r\n): 'page' | 'dropdown' | 'group' | 'button' | null {\r\n\tif (item.type === 'file') {\r\n\t\tif (BUTTON_PATTERN.test(item.name)) {\r\n\t\t\treturn 'button'\r\n\t\t}\r\n\t\tif (item.extension === 'md') {\r\n\t\t\treturn 'page'\r\n\t\t}\r\n\t\treturn null\r\n\t}\r\n\r\n\tif (item.type === 'directory') {\r\n\t\tif (GROUP_PATTERN.test(item.name)) {\r\n\t\t\treturn 'group'\r\n\t\t}\r\n\t\t// Проверяем, есть ли внутри файлы\r\n\t\tconst hasFiles = allFiles.some(\r\n\t\t\tf =>\r\n\t\t\t\tf.relativePath.startsWith(item.relativePath + '/') ||\r\n\t\t\t\t(f.relativePath.startsWith(item.relativePath + '\\\\') &&\r\n\t\t\t\t\tf.type === 'file')\r\n\t\t)\r\n\t\tif (hasFiles) {\r\n\t\t\treturn 'dropdown'\r\n\t\t}\r\n\t}\r\n\r\n\treturn null\r\n}\r\n","import { DocumentationEntity, PageFrontmatter } from '../types'\r\n\r\nexport const isPage = (\r\n\te: DocumentationEntity\r\n): e is Extract<DocumentationEntity, { type: 'page' }> => e.type === 'page'\r\n\r\nexport const isButton = (\r\n\te: DocumentationEntity\r\n): e is Extract<DocumentationEntity, { type: 'button' }> => e.type === 'button'\r\n\r\nexport const isDropdown = (\r\n\te: DocumentationEntity\r\n): e is Extract<DocumentationEntity, { type: 'dropdown' }> =>\r\n\te.type === 'dropdown'\r\n\r\nexport const isGroup = (\r\n\te: DocumentationEntity\r\n): e is Extract<DocumentationEntity, { type: 'group' }> => e.type === 'group'\r\n\r\nexport function getFrontmatter(\r\n\te: DocumentationEntity\r\n): PageFrontmatter | undefined {\r\n\treturn isPage(e) ? e.frontmatter : undefined\r\n}\r\n\r\nexport function isHidden(e: DocumentationEntity): boolean {\r\n\tif (isPage(e)) return e.frontmatter?.hidden ?? false\r\n\tif (isButton(e)) return e.settings.hidden ?? false\r\n\tif (isDropdown(e)) return e.settings?.hidden ?? false\r\n\tif (isGroup(e)) return e.settings?.hidden ?? false\r\n\treturn false\r\n}\r\n","import { DocumentationEntity } from '../types'\r\nimport { isButton, isDropdown, isGroup } from './types-helper'\r\n\r\nexport function getSortEntities(\r\n\tlist: DocumentationEntity[]\r\n): DocumentationEntity[] {\r\n\treturn list.sort((a, b) => {\r\n\t\tconst ao = isButton(a)\r\n\t\t\t? a.settings.order\r\n\t\t\t: isGroup(a)\r\n\t\t\t? a.settings.order\r\n\t\t\t: isDropdown(a)\r\n\t\t\t? a.settings.order\r\n\t\t\t: a.frontmatter?.order ?? 100\r\n\r\n\t\tconst bo = isButton(b)\r\n\t\t\t? b.settings.order\r\n\t\t\t: isGroup(b)\r\n\t\t\t? b.settings.order\r\n\t\t\t: isDropdown(b)\r\n\t\t\t? b.settings.order\r\n\t\t\t: b.frontmatter?.order ?? 100\r\n\r\n\t\tif (ao !== bo) return ao - bo\r\n\r\n\t\tconst at = isButton(a)\r\n\t\t\t? a.settings.title\r\n\t\t\t: isGroup(a)\r\n\t\t\t? a.settings.title\r\n\t\t\t: isDropdown(a)\r\n\t\t\t? a.settings.title\r\n\t\t\t: a.frontmatter?.title ?? ''\r\n\r\n\t\tconst bt = isButton(b)\r\n\t\t\t? b.settings.title\r\n\t\t\t: isGroup(b)\r\n\t\t\t? b.settings.title\r\n\t\t\t: isDropdown(b)\r\n\t\t\t? b.settings.title\r\n\t\t\t: b.frontmatter?.title ?? ''\r\n\r\n\t\treturn at.localeCompare(bt)\r\n\t})\r\n}\r\n","import { DocumentationEntity } from '../types'\r\n\r\nexport function getTitle(entity: DocumentationEntity): string {\r\n\tif (entity.type === 'page') {\r\n\t\treturn entity.frontmatter?.title || entity.file.name.replaceAll('.md', '')\r\n\t}\r\n\tif (entity.type === 'button') {\r\n\t\treturn entity.settings.title\r\n\t}\r\n\tif (entity.type === 'dropdown') {\r\n\t\treturn entity.settings?.title || entity.folder.name\r\n\t}\r\n\tif (entity.type === 'group') {\r\n\t\treturn (\r\n\t\t\tentity.settings?.title ||\r\n\t\t\tentity.folder.name.replace(/^\\(group-/, '').replace(/\\)$/, '')\r\n\t\t)\r\n\t}\r\n\treturn ''\r\n}\r\n","export const LANGUAGE_PATTERN = /^[a-z]{2}$/\r\nexport const BUTTON_PATTERN = /\\.button\\.md$/\r\nexport const VERSION_PATTERN = /^\\d+\\.\\d+\\.\\d+/\r\nexport const GROUP_PATTERN = /^\\(group-.*\\)$/\r\n","import { FileText } from 'lucide-react'\r\nimport * as React from 'react'\r\n\r\nimport {\r\n\tSelect,\r\n\tSelectContent,\r\n\tSelectItem,\r\n\tSelectTrigger,\r\n\tSelectValue,\r\n} from '@/components/ui/select'\r\nimport {\r\n\tSidebar,\r\n\tSidebarContent,\r\n\tSidebarGroup,\r\n\tSidebarGroupLabel,\r\n\tSidebarHeader,\r\n\tSidebarMenu,\r\n\tSidebarMenuButton,\r\n\tSidebarMenuItem,\r\n} from '@/components/ui/sidebar'\r\nimport {\r\n\tDocumentationProps,\r\n\tInternalDocumentationProps,\r\n} from '../types/DocumentationProps'\r\nimport { DocumentationEntityItem } from './documentation-entity-item'\r\n\r\nexport function AppSidebar({\r\n\ttitle,\r\n\tlogo,\r\n\tversionSelect,\r\n\tversions = [],\r\n\tdocumentationStructure = [],\r\n\tonPageSelect,\r\n\tversionStorageKey,\r\n\t...props\r\n}: React.ComponentProps<typeof Sidebar> &\r\n\tDocumentationProps &\r\n\tInternalDocumentationProps & {\r\n\t\tversionStorageKey?: string\r\n\t}) {\r\n\t// Восстанавливаем сохраненную версию из localStorage\r\n\tconst [selectedVersion, setSelectedVersion] = React.useState<\r\n\t\tstring | undefined\r\n\t>(() => {\r\n\t\tif (versionStorageKey && typeof window !== 'undefined') {\r\n\t\t\tconst saved = localStorage.getItem(versionStorageKey)\r\n\t\t\tif (saved && versions.includes(saved)) {\r\n\t\t\t\treturn saved\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn versions[0]\r\n\t})\r\n\r\n\tconst [openDropdowns, setOpenDropdowns] = React.useState<Set<string>>(\r\n\t\tnew Set()\r\n\t)\r\n\r\n\t// Обновляем selectedVersion когда versions загружается или меняется\r\n\tReact.useEffect(() => {\r\n\t\tif (versions.length > 0) {\r\n\t\t\t// Проверяем сохраненную версию\r\n\t\t\tif (versionStorageKey && typeof window !== 'undefined') {\r\n\t\t\t\tconst saved = localStorage.getItem(versionStorageKey)\r\n\t\t\t\tif (saved && versions.includes(saved)) {\r\n\t\t\t\t\tsetSelectedVersion(saved)\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// Если сохраненной версии нет или она невалидна, используем первую доступную\r\n\t\t\tif (!selectedVersion || !versions.includes(selectedVersion)) {\r\n\t\t\t\tsetSelectedVersion(versions[0])\r\n\t\t\t}\r\n\t\t}\r\n\t}, [versions, versionStorageKey])\r\n\r\n\t// Сохраняем selectedVersion в localStorage при изменении\r\n\tReact.useEffect(() => {\r\n\t\tif (versionStorageKey && selectedVersion && typeof window !== 'undefined') {\r\n\t\t\tlocalStorage.setItem(versionStorageKey, selectedVersion)\r\n\t\t}\r\n\t}, [selectedVersion, versionStorageKey])\r\n\r\n\t// Получаем структуру для выбранной версии\r\n\tconst currentStructure = React.useMemo(() => {\r\n\t\tif (!selectedVersion) return null\r\n\t\treturn documentationStructure.find(s => s.version === selectedVersion)\r\n\t}, [selectedVersion, documentationStructure])\r\n\r\n\tconst toggleDropdown = (path: string) => {\r\n\t\tsetOpenDropdowns(prev => {\r\n\t\t\tconst next = new Set(prev)\r\n\t\t\tif (next.has(path)) {\r\n\t\t\t\tnext.delete(path)\r\n\t\t\t} else {\r\n\t\t\t\tnext.add(path)\r\n\t\t\t}\r\n\t\t\treturn next\r\n\t\t})\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Sidebar {...props}>\r\n\t\t\t<SidebarHeader>\r\n\t\t\t\t<div className='flex items-center justify-between gap-2 px-2 py-2'>\r\n\t\t\t\t\t<a\r\n\t\t\t\t\t\thref='/'\r\n\t\t\t\t\t\tclassName='flex items-center gap-3 rounded-md px-2 py-1.5 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground transition-colors'\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<div className='flex aspect-square size-8 items-center justify-center text-primary-foreground'>\r\n\t\t\t\t\t\t\t{logo}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<span className='font-semibold'>{title}</span>\r\n\t\t\t\t\t</a>\r\n\t\t\t\t\t{versionSelect ? (\r\n\t\t\t\t\t\t<Select\r\n\t\t\t\t\t\t\tvalue={selectedVersion || ''}\r\n\t\t\t\t\t\t\tonValueChange={value => {\r\n\t\t\t\t\t\t\t\tsetSelectedVersion(value)\r\n\t\t\t\t\t\t\t\t// При смене версии очищаем выбранную страницу,\r\n\t\t\t\t\t\t\t\t// так как она может не существовать в новой версии\r\n\t\t\t\t\t\t\t\tif (onPageSelect) {\r\n\t\t\t\t\t\t\t\t\tonPageSelect(null)\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<SelectTrigger className='h-6 w-auto min-w-16 border border-sidebar-border bg-sidebar-accent/50 hover:bg-sidebar-accent shadow-none focus:ring-0 focus:ring-offset-0 p-0 px-2 text-xs'>\r\n\t\t\t\t\t\t\t\t<SelectValue />\r\n\t\t\t\t\t\t\t</SelectTrigger>\r\n\t\t\t\t\t\t\t<SelectContent>\r\n\t\t\t\t\t\t\t\t{versions.map(version => (\r\n\t\t\t\t\t\t\t\t\t<SelectItem key={version} value={version}>\r\n\t\t\t\t\t\t\t\t\t\t{version}\r\n\t\t\t\t\t\t\t\t\t</SelectItem>\r\n\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t</SelectContent>\r\n\t\t\t\t\t\t</Select>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<div className='h-6 w-auto min-w-16 border border-sidebar-border bg-sidebar-accent/50 shadow-none focus:ring-0 text-center items-center justify-center flex rounded-md focus:ring-offset-0 p-0 px-2 text-xs text-white'>\r\n\t\t\t\t\t\t\t<span className='text-sm text-foreground'>\r\n\t\t\t\t\t\t\t\t{versions[0] || 'N/A'}\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</div>\r\n\t\t\t</SidebarHeader>\r\n\t\t\t<SidebarContent>\r\n\t\t\t\t{currentStructure && currentStructure.entities.length > 0 ? (\r\n\t\t\t\t\t<SidebarGroup>\r\n\t\t\t\t\t\t<SidebarMenu>\r\n\t\t\t\t\t\t\t{currentStructure.entities.map((entity, index) => {\r\n\t\t\t\t\t\t\t\tconst entityKey =\r\n\t\t\t\t\t\t\t\t\tentity.type === 'page' || entity.type === 'button'\r\n\t\t\t\t\t\t\t\t\t\t? entity.file.originalRelativePath ||\r\n\t\t\t\t\t\t\t\t\t\t entity.file.relativePath\r\n\t\t\t\t\t\t\t\t\t\t: entity.folder.originalRelativePath ||\r\n\t\t\t\t\t\t\t\t\t\t entity.folder.relativePath\r\n\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t<DocumentationEntityItem\r\n\t\t\t\t\t\t\t\t\t\tkey={`${entity.type}-${index}-${entityKey}`}\r\n\t\t\t\t\t\t\t\t\t\tentity={entity}\r\n\t\t\t\t\t\t\t\t\t\topenDropdowns={openDropdowns}\r\n\t\t\t\t\t\t\t\t\t\tonToggleDropdown={toggleDropdown}\r\n\t\t\t\t\t\t\t\t\t\tonPageSelect={onPageSelect}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t</SidebarMenu>\r\n\t\t\t\t\t</SidebarGroup>\r\n\t\t\t\t) : (\r\n\t\t\t\t\t<SidebarGroup>\r\n\t\t\t\t\t\t<SidebarGroupLabel>Документация</SidebarGroupLabel>\r\n\t\t\t\t\t\t<SidebarMenu>\r\n\t\t\t\t\t\t\t<SidebarMenuItem>\r\n\t\t\t\t\t\t\t\t<SidebarMenuButton disabled>\r\n\t\t\t\t\t\t\t\t\t<FileText />\r\n\t\t\t\t\t\t\t\t\t<span>Нет документации</span>\r\n\t\t\t\t\t\t\t\t</SidebarMenuButton>\r\n\t\t\t\t\t\t\t</SidebarMenuItem>\r\n\t\t\t\t\t\t</SidebarMenu>\r\n\t\t\t\t\t</SidebarGroup>\r\n\t\t\t\t)}\r\n\t\t\t</SidebarContent>\r\n\t\t</Sidebar>\r\n\t)\r\n}\r\n","import { Slot } from '@radix-ui/react-slot'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { PanelLeft } from 'lucide-react'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '@/components/ui/button'\r\nimport { Input } from '@/components/ui/input'\r\nimport { Separator } from '@/components/ui/separator'\r\nimport {\r\n\tSheet,\r\n\tSheetContent,\r\n\tSheetDescription,\r\n\tSheetHeader,\r\n\tSheetTitle,\r\n} from '@/components/ui/sheet'\r\nimport { Skeleton } from '@/components/ui/skeleton'\r\nimport {\r\n\tTooltip,\r\n\tTooltipContent,\r\n\tTooltipProvider,\r\n\tTooltipTrigger,\r\n} from '@/components/ui/tooltip'\r\nimport { useIsMobile } from '@/hooks/use-mobile'\r\nimport { cn } from '@/lib/utils'\r\n\r\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state'\r\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\r\nconst SIDEBAR_WIDTH = '20rem'\r\nconst SIDEBAR_WIDTH_MOBILE = '18rem'\r\nconst SIDEBAR_WIDTH_ICON = '3rem'\r\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b'\r\n\r\ntype SidebarContextProps = {\r\n\tstate: 'expanded' | 'collapsed'\r\n\topen: boolean\r\n\tsetOpen: (open: boolean) => void\r\n\topenMobile: boolean\r\n\tsetOpenMobile: (open: boolean) => void\r\n\tisMobile: boolean\r\n\ttoggleSidebar: () => void\r\n}\r\n\r\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\r\n\r\nfunction useSidebar() {\r\n\tconst context = React.useContext(SidebarContext)\r\n\tif (!context) {\r\n\t\tthrow new Error('useSidebar must be used within a SidebarProvider.')\r\n\t}\r\n\r\n\treturn context\r\n}\r\n\r\nconst SidebarProvider = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'> & {\r\n\t\tdefaultOpen?: boolean\r\n\t\topen?: boolean\r\n\t\tonOpenChange?: (open: boolean) => void\r\n\t}\r\n>(\r\n\t(\r\n\t\t{\r\n\t\t\tdefaultOpen = true,\r\n\t\t\topen: openProp,\r\n\t\t\tonOpenChange: setOpenProp,\r\n\t\t\tclassName,\r\n\t\t\tstyle,\r\n\t\t\tchildren,\r\n\t\t\t...props\r\n\t\t},\r\n\t\tref\r\n\t) => {\r\n\t\tconst isMobile = useIsMobile()\r\n\t\tconst [openMobile, setOpenMobile] = React.useState(false)\r\n\r\n\t\t// This is the internal state of the sidebar.\r\n\t\t// We use openProp and setOpenProp for control from outside the component.\r\n\t\tconst [_open, _setOpen] = React.useState(defaultOpen)\r\n\t\tconst open = openProp ?? _open\r\n\t\tconst setOpen = React.useCallback(\r\n\t\t\t(value: boolean | ((value: boolean) => boolean)) => {\r\n\t\t\t\tconst openState = typeof value === 'function' ? value(open) : value\r\n\t\t\t\tif (setOpenProp) {\r\n\t\t\t\t\tsetOpenProp(openState)\r\n\t\t\t\t} else {\r\n\t\t\t\t\t_setOpen(openState)\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// This sets the cookie to keep the sidebar state.\r\n\t\t\t\tdocument.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\r\n\t\t\t},\r\n\t\t\t[setOpenProp, open]\r\n\t\t)\r\n\r\n\t\t// Helper to toggle the sidebar.\r\n\t\tconst toggleSidebar = React.useCallback(() => {\r\n\t\t\treturn isMobile ? setOpenMobile(open => !open) : setOpen(open => !open)\r\n\t\t}, [isMobile, setOpen, setOpenMobile])\r\n\r\n\t\t// Adds a keyboard shortcut to toggle the sidebar.\r\n\t\tReact.useEffect(() => {\r\n\t\t\tconst handleKeyDown = (event: KeyboardEvent) => {\r\n\t\t\t\tif (\r\n\t\t\t\t\tevent.key === SIDEBAR_KEYBOARD_SHORTCUT &&\r\n\t\t\t\t\t(event.metaKey || event.ctrlKey)\r\n\t\t\t\t) {\r\n\t\t\t\t\tevent.preventDefault()\r\n\t\t\t\t\ttoggleSidebar()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\twindow.addEventListener('keydown', handleKeyDown)\r\n\t\t\treturn () => window.removeEventListener('keydown', handleKeyDown)\r\n\t\t}, [toggleSidebar])\r\n\r\n\t\t// We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\r\n\t\t// This makes it easier to style the sidebar with Tailwind classes.\r\n\t\tconst state = open ? 'expanded' : 'collapsed'\r\n\r\n\t\tconst contextValue = React.useMemo<SidebarContextProps>(\r\n\t\t\t() => ({\r\n\t\t\t\tstate,\r\n\t\t\t\topen,\r\n\t\t\t\tsetOpen,\r\n\t\t\t\tisMobile,\r\n\t\t\t\topenMobile,\r\n\t\t\t\tsetOpenMobile,\r\n\t\t\t\ttoggleSidebar,\r\n\t\t\t}),\r\n\t\t\t[state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\r\n\t\t)\r\n\r\n\t\treturn (\r\n\t\t\t<SidebarContext.Provider value={contextValue}>\r\n\t\t\t\t<TooltipProvider delayDuration={0}>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tstyle={\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t'--sidebar-width': SIDEBAR_WIDTH,\r\n\t\t\t\t\t\t\t\t'--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\r\n\t\t\t\t\t\t\t\t...style,\r\n\t\t\t\t\t\t\t} as React.CSSProperties\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tclassName={cn(\r\n\t\t\t\t\t\t\t'group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar',\r\n\t\t\t\t\t\t\tclassName\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\tref={ref}\r\n\t\t\t\t\t\t{...props}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{children}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</TooltipProvider>\r\n\t\t\t</SidebarContext.Provider>\r\n\t\t)\r\n\t}\r\n)\r\nSidebarProvider.displayName = 'SidebarProvider'\r\n\r\nconst Sidebar = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'> & {\r\n\t\tside?: 'left' | 'right'\r\n\t\tvariant?: 'sidebar' | 'floating' | 'inset'\r\n\t\tcollapsible?: 'offcanvas' | 'icon' | 'none'\r\n\t}\r\n>(\r\n\t(\r\n\t\t{\r\n\t\t\tside = 'left',\r\n\t\t\tvariant = 'sidebar',\r\n\t\t\tcollapsible = 'offcanvas',\r\n\t\t\tclassName,\r\n\t\t\tchildren,\r\n\t\t\t...props\r\n\t\t},\r\n\t\tref\r\n\t) => {\r\n\t\tconst { isMobile, state, openMobile, setOpenMobile } = useSidebar()\r\n\r\n\t\tif (collapsible === 'none') {\r\n\t\t\treturn (\r\n\t\t\t\t<div\r\n\t\t\t\t\tclassName={cn(\r\n\t\t\t\t\t\t'flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground',\r\n\t\t\t\t\t\tclassName\r\n\t\t\t\t\t)}\r\n\t\t\t\t\tref={ref}\r\n\t\t\t\t\t{...props}\r\n\t\t\t\t>\r\n\t\t\t\t\t{children}\r\n\t\t\t\t</div>\r\n\t\t\t)\r\n\t\t}\r\n\r\n\t\tif (isMobile) {\r\n\t\t\treturn (\r\n\t\t\t\t<Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\r\n\t\t\t\t\t<SheetContent\r\n\t\t\t\t\t\tdata-sidebar='sidebar'\r\n\t\t\t\t\t\tdata-mobile='true'\r\n\t\t\t\t\t\tclassName='w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden'\r\n\t\t\t\t\t\tstyle={\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t'--sidebar-width': SIDEBAR_WIDTH_MOBILE,\r\n\t\t\t\t\t\t\t} as React.CSSProperties\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tside={side}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<SheetHeader className='sr-only'>\r\n\t\t\t\t\t\t\t<SheetTitle>Sidebar</SheetTitle>\r\n\t\t\t\t\t\t\t<SheetDescription>Displays the mobile sidebar.</SheetDescription>\r\n\t\t\t\t\t\t</SheetHeader>\r\n\t\t\t\t\t\t<div className='flex h-full w-full flex-col'>{children}</div>\r\n\t\t\t\t\t</SheetContent>\r\n\t\t\t\t</Sheet>\r\n\t\t\t)\r\n\t\t}\r\n\r\n\t\treturn (\r\n\t\t\t<div\r\n\t\t\t\tref={ref}\r\n\t\t\t\tclassName='group peer hidden text-sidebar-foreground md:block'\r\n\t\t\t\tdata-state={state}\r\n\t\t\t\tdata-collapsible={state === 'collapsed' ? collapsible : ''}\r\n\t\t\t\tdata-variant={variant}\r\n\t\t\t\tdata-side={side}\r\n\t\t\t>\r\n\t\t\t\t<div\r\n\t\t\t\t\tclassName={cn(\r\n\t\t\t\t\t\t'relative hidden h-svh w-[--sidebar-width] transition-[width] duration-200 ease-linear md:flex',\r\n\t\t\t\t\t\t'group-data-[collapsible=offcanvas]:w-0',\r\n\t\t\t\t\t\tvariant === 'floating' || variant === 'inset'\r\n\t\t\t\t\t\t\t? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]'\r\n\t\t\t\t\t\t\t: 'group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l',\r\n\t\t\t\t\t\tclassName\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{...props}\r\n\t\t\t\t>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tdata-sidebar='sidebar'\r\n\t\t\t\t\t\tclassName='flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow'\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{children}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t)\r\n\t}\r\n)\r\nSidebar.displayName = 'Sidebar'\r\n\r\nconst SidebarTrigger = React.forwardRef<\r\n\tReact.ElementRef<typeof Button>,\r\n\tReact.ComponentProps<typeof Button>\r\n>(({ className, onClick, ...props }, ref) => {\r\n\tconst { toggleSidebar } = useSidebar()\r\n\r\n\treturn (\r\n\t\t<Button\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='trigger'\r\n\t\t\tvariant='ghost'\r\n\t\t\tsize='icon'\r\n\t\t\tclassName={cn('h-7 w-7', className)}\r\n\t\t\tonClick={event => {\r\n\t\t\t\tonClick?.(event)\r\n\t\t\t\ttoggleSidebar()\r\n\t\t\t}}\r\n\t\t\t{...props}\r\n\t\t>\r\n\t\t\t<PanelLeft />\r\n\t\t\t<span className='sr-only'>Toggle Sidebar</span>\r\n\t\t</Button>\r\n\t)\r\n})\r\nSidebarTrigger.displayName = 'SidebarTrigger'\r\n\r\nconst SidebarRail = React.forwardRef<\r\n\tHTMLButtonElement,\r\n\tReact.ComponentProps<'button'>\r\n>(({ className, ...props }, ref) => {\r\n\tconst { toggleSidebar } = useSidebar()\r\n\r\n\treturn (\r\n\t\t<button\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='rail'\r\n\t\t\taria-label='Toggle Sidebar'\r\n\t\t\ttabIndex={-1}\r\n\t\t\tonClick={toggleSidebar}\r\n\t\t\ttitle='Toggle Sidebar'\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex',\r\n\t\t\t\t'group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar',\r\n\t\t\t\t'[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\r\n\t\t\t\t'[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarRail.displayName = 'SidebarRail'\r\n\r\nconst SidebarInset = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'main'>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<main\r\n\t\t\tref={ref}\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'relative flex flex-1 flex-col bg-background transition-all duration-200 ease-linear',\r\n\t\t\t\t'md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarInset.displayName = 'SidebarInset'\r\n\r\nconst SidebarInput = React.forwardRef<\r\n\tReact.ElementRef<typeof Input>,\r\n\tReact.ComponentProps<typeof Input>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<Input\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='input'\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarInput.displayName = 'SidebarInput'\r\n\r\nconst SidebarHeader = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='header'\r\n\t\t\tclassName={cn('flex flex-col gap-2 p-2', className)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarHeader.displayName = 'SidebarHeader'\r\n\r\nconst SidebarFooter = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='footer'\r\n\t\t\tclassName={cn('flex flex-col gap-2 p-2', className)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarFooter.displayName = 'SidebarFooter'\r\n\r\nconst SidebarSeparator = React.forwardRef<\r\n\tReact.ElementRef<typeof Separator>,\r\n\tReact.ComponentProps<typeof Separator>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<Separator\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='separator'\r\n\t\t\tclassName={cn('mx-2 w-auto bg-sidebar-border', className)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarSeparator.displayName = 'SidebarSeparator'\r\n\r\nconst SidebarContent = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='content'\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarContent.displayName = 'SidebarContent'\r\n\r\nconst SidebarGroup = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => {\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='group'\r\n\t\t\tclassName={cn('relative flex w-full min-w-0 flex-col p-2', className)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarGroup.displayName = 'SidebarGroup'\r\n\r\nconst SidebarGroupLabel = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n\tconst Comp = asChild ? Slot : 'div'\r\n\r\n\treturn (\r\n\t\t<Comp\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='group-label'\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\r\n\t\t\t\t'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarGroupLabel.displayName = 'SidebarGroupLabel'\r\n\r\nconst SidebarGroupAction = React.forwardRef<\r\n\tHTMLButtonElement,\r\n\tReact.ComponentProps<'button'> & { asChild?: boolean }\r\n>(({ className, asChild = false, ...props }, ref) => {\r\n\tconst Comp = asChild ? Slot : 'button'\r\n\r\n\treturn (\r\n\t\t<Comp\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='group-action'\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\r\n\t\t\t\t// Increases the hit area of the button on mobile.\r\n\t\t\t\t'after:absolute after:-inset-2 after:md:hidden',\r\n\t\t\t\t'group-data-[collapsible=icon]:hidden',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarGroupAction.displayName = 'SidebarGroupAction'\r\n\r\nconst SidebarGroupContent = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => (\r\n\t<div\r\n\t\tref={ref}\r\n\t\tdata-sidebar='group-content'\r\n\t\tclassName={cn('w-full text-sm', className)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nSidebarGroupContent.displayName = 'SidebarGroupContent'\r\n\r\nconst SidebarMenu = React.forwardRef<\r\n\tHTMLUListElement,\r\n\tReact.ComponentProps<'ul'>\r\n>(({ className, ...props }, ref) => (\r\n\t<ul\r\n\t\tref={ref}\r\n\t\tdata-sidebar='menu'\r\n\t\tclassName={cn('flex w-full min-w-0 flex-col gap-1', className)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nSidebarMenu.displayName = 'SidebarMenu'\r\n\r\nconst SidebarMenuItem = React.forwardRef<\r\n\tHTMLLIElement,\r\n\tReact.ComponentProps<'li'>\r\n>(({ className, ...props }, ref) => (\r\n\t<li\r\n\t\tref={ref}\r\n\t\tdata-sidebar='menu-item'\r\n\t\tclassName={cn('group/menu-item relative', className)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nSidebarMenuItem.displayName = 'SidebarMenuItem'\r\n\r\nconst sidebarMenuButtonVariants = cva(\r\n\t'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\r\n\t{\r\n\t\tvariants: {\r\n\t\t\tvariant: {\r\n\t\t\t\tdefault: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\r\n\t\t\t\toutline:\r\n\t\t\t\t\t'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\r\n\t\t\t},\r\n\t\t\tsize: {\r\n\t\t\t\tdefault: 'h-8 text-sm',\r\n\t\t\t\tsm: 'h-7 text-xs',\r\n\t\t\t\tlg: 'h-12 text-sm group-data-[collapsible=icon]:!p-0',\r\n\t\t\t},\r\n\t\t},\r\n\t\tdefaultVariants: {\r\n\t\t\tvariant: 'default',\r\n\t\t\tsize: 'default',\r\n\t\t},\r\n\t}\r\n)\r\n\r\nconst SidebarMenuButton = React.forwardRef<\r\n\tHTMLButtonElement,\r\n\tReact.ComponentProps<'button'> & {\r\n\t\tasChild?: boolean\r\n\t\tisActive?: boolean\r\n\t\ttooltip?: string | React.ComponentProps<typeof TooltipContent>\r\n\t} & VariantProps<typeof sidebarMenuButtonVariants>\r\n>(\r\n\t(\r\n\t\t{\r\n\t\t\tasChild = false,\r\n\t\t\tisActive = false,\r\n\t\t\tvariant = 'default',\r\n\t\t\tsize = 'default',\r\n\t\t\ttooltip,\r\n\t\t\tclassName,\r\n\t\t\t...props\r\n\t\t},\r\n\t\tref\r\n\t) => {\r\n\t\tconst Comp = asChild ? Slot : 'button'\r\n\t\tconst { isMobile, state } = useSidebar()\r\n\r\n\t\tconst button = (\r\n\t\t\t<Comp\r\n\t\t\t\tref={ref}\r\n\t\t\t\tdata-sidebar='menu-button'\r\n\t\t\t\tdata-size={size}\r\n\t\t\t\tdata-active={isActive}\r\n\t\t\t\tclassName={cn(sidebarMenuButtonVariants({ variant, size }), className)}\r\n\t\t\t\t{...props}\r\n\t\t\t/>\r\n\t\t)\r\n\r\n\t\tif (!tooltip) {\r\n\t\t\treturn button\r\n\t\t}\r\n\r\n\t\tif (typeof tooltip === 'string') {\r\n\t\t\ttooltip = {\r\n\t\t\t\tchildren: tooltip,\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn (\r\n\t\t\t<Tooltip>\r\n\t\t\t\t<TooltipTrigger asChild>{button}</TooltipTrigger>\r\n\t\t\t\t<TooltipContent\r\n\t\t\t\t\tside='right'\r\n\t\t\t\t\talign='center'\r\n\t\t\t\t\thidden={state !== 'collapsed' || isMobile}\r\n\t\t\t\t\t{...tooltip}\r\n\t\t\t\t/>\r\n\t\t\t</Tooltip>\r\n\t\t)\r\n\t}\r\n)\r\nSidebarMenuButton.displayName = 'SidebarMenuButton'\r\n\r\nconst SidebarMenuAction = React.forwardRef<\r\n\tHTMLButtonElement,\r\n\tReact.ComponentProps<'button'> & {\r\n\t\tasChild?: boolean\r\n\t\tshowOnHover?: boolean\r\n\t}\r\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\r\n\tconst Comp = asChild ? Slot : 'button'\r\n\r\n\treturn (\r\n\t\t<Comp\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='menu-action'\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0',\r\n\t\t\t\t// Increases the hit area of the button on mobile.\r\n\t\t\t\t'after:absolute after:-inset-2 after:md:hidden',\r\n\t\t\t\t'peer-data-[size=sm]/menu-button:top-1',\r\n\t\t\t\t'peer-data-[size=default]/menu-button:top-1.5',\r\n\t\t\t\t'peer-data-[size=lg]/menu-button:top-2.5',\r\n\t\t\t\t'group-data-[collapsible=icon]:hidden',\r\n\t\t\t\tshowOnHover &&\r\n\t\t\t\t\t'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarMenuAction.displayName = 'SidebarMenuAction'\r\n\r\nconst SidebarMenuBadge = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'>\r\n>(({ className, ...props }, ref) => (\r\n\t<div\r\n\t\tref={ref}\r\n\t\tdata-sidebar='menu-badge'\r\n\t\tclassName={cn(\r\n\t\t\t'pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground',\r\n\t\t\t'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\r\n\t\t\t'peer-data-[size=sm]/menu-button:top-1',\r\n\t\t\t'peer-data-[size=default]/menu-button:top-1.5',\r\n\t\t\t'peer-data-[size=lg]/menu-button:top-2.5',\r\n\t\t\t'group-data-[collapsible=icon]:hidden',\r\n\t\t\tclassName\r\n\t\t)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nSidebarMenuBadge.displayName = 'SidebarMenuBadge'\r\n\r\nconst SidebarMenuSkeleton = React.forwardRef<\r\n\tHTMLDivElement,\r\n\tReact.ComponentProps<'div'> & {\r\n\t\tshowIcon?: boolean\r\n\t}\r\n>(({ className, showIcon = false, ...props }, ref) => {\r\n\t// Random width between 50 to 90%.\r\n\tconst width = React.useMemo(() => {\r\n\t\treturn `${Math.floor(Math.random() * 40) + 50}%`\r\n\t}, [])\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='menu-skeleton'\r\n\t\t\tclassName={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\r\n\t\t\t{...props}\r\n\t\t>\r\n\t\t\t{showIcon && (\r\n\t\t\t\t<Skeleton\r\n\t\t\t\t\tclassName='size-4 rounded-md'\r\n\t\t\t\t\tdata-sidebar='menu-skeleton-icon'\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t\t<Skeleton\r\n\t\t\t\tclassName='h-4 max-w-[--skeleton-width] flex-1'\r\n\t\t\t\tdata-sidebar='menu-skeleton-text'\r\n\t\t\t\tstyle={\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t'--skeleton-width': width,\r\n\t\t\t\t\t} as React.CSSProperties\r\n\t\t\t\t}\r\n\t\t\t/>\r\n\t\t</div>\r\n\t)\r\n})\r\nSidebarMenuSkeleton.displayName = 'SidebarMenuSkeleton'\r\n\r\nconst SidebarMenuSub = React.forwardRef<\r\n\tHTMLUListElement,\r\n\tReact.ComponentProps<'ul'>\r\n>(({ className, ...props }, ref) => (\r\n\t<ul\r\n\t\tref={ref}\r\n\t\tdata-sidebar='menu-sub'\r\n\t\tclassName={cn(\r\n\t\t\t'mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5',\r\n\t\t\t'group-data-[collapsible=icon]:hidden',\r\n\t\t\tclassName\r\n\t\t)}\r\n\t\t{...props}\r\n\t/>\r\n))\r\nSidebarMenuSub.displayName = 'SidebarMenuSub'\r\n\r\nconst SidebarMenuSubItem = React.forwardRef<\r\n\tHTMLLIElement,\r\n\tReact.ComponentProps<'li'>\r\n>(({ ...props }, ref) => <li ref={ref} {...props} />)\r\nSidebarMenuSubItem.displayName = 'SidebarMenuSubItem'\r\n\r\nconst SidebarMenuSubButton = React.forwardRef<\r\n\tHTMLAnchorElement,\r\n\tReact.ComponentProps<'a'> & {\r\n\t\tasChild?: boolean\r\n\t\tsize?: 'sm' | 'md'\r\n\t\tisActive?: boolean\r\n\t}\r\n>(({ asChild = false, size = 'md', isActive, className, ...props }, ref) => {\r\n\tconst Comp = asChild ? Slot : 'a'\r\n\r\n\treturn (\r\n\t\t<Comp\r\n\t\t\tref={ref}\r\n\t\t\tdata-sidebar='menu-sub-button'\r\n\t\t\tdata-size={size}\r\n\t\t\tdata-active={isActive}\r\n\t\t\tclassName={cn(\r\n\t\t\t\t'flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground',\r\n\t\t\t\t'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\r\n\t\t\t\tsize === 'sm' && 'text-xs',\r\n\t\t\t\tsize === 'md' && 'text-sm',\r\n\t\t\t\t'group-data-[collapsible=icon]:hidden',\r\n\t\t\t\tclassName\r\n\t\t\t)}\r\n\t\t\t{...props}\r\n\t\t/>\r\n\t)\r\n})\r\nSidebarMenuSubButton.displayName = 'SidebarMenuSubButton'\r\n\r\nexport {\r\n\tSidebar,\r\n\tSidebarContent,\r\n\tSidebarFooter,\r\n\tSidebarGroup,\r\n\tSidebarGroupAction,\r\n\tSidebarGroupContent,\r\n\tSidebarGroupLabel,\r\n\tSidebarHeader,\r\n\tSidebarInput,\r\n\tSidebarInset,\r\n\tSidebarMenu,\r\n\tSidebarMenuAction,\r\n\tSidebarMenuBadge,\r\n\tSidebarMenuButton,\r\n\tSidebarMenuItem,\r\n\tSidebarMenuSkeleton,\r\n\tSidebarMenuSub,\r\n\tSidebarMenuSubButton,\r\n\tSidebarMenuSubItem,\r\n\tSidebarProvider,\r\n\tSidebarRail,\r\n\tSidebarSeparator,\r\n\tSidebarTrigger,\r\n\tuseSidebar,\r\n}\r\n","import * as React from \"react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\r\n ({ className, type, ...props }, ref) => {\r\n return (\r\n <input\r\n type={type}\r\n className={cn(\r\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\nInput.displayName = \"Input\"\r\n\r\nexport { Input }\r\n","import * as React from \"react\"\r\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Separator = React.forwardRef<\r\n React.ElementRef<typeof SeparatorPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\r\n>(\r\n (\r\n { className, orientation = \"horizontal\", decorative = true, ...props },\r\n ref\r\n ) => (\r\n <SeparatorPrimitive.Root\r\n ref={ref}\r\n decorative={decorative}\r\n orientation={orientation}\r\n className={cn(\r\n \"shrink-0 bg-border\",\r\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n)\r\nSeparator.displayName = SeparatorPrimitive.Root.displayName\r\n\r\nexport { Separator }\r\n","import * as React from \"react\"\r\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\nimport { X } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Sheet = SheetPrimitive.Root\r\n\r\nconst SheetTrigger = SheetPrimitive.Trigger\r\n\r\nconst SheetClose = SheetPrimitive.Close\r\n\r\nconst SheetPortal = SheetPrimitive.Portal\r\n\r\nconst SheetOverlay = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <SheetPrimitive.Overlay\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n ref={ref}\r\n />\r\n))\r\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\r\n\r\nconst sheetVariants = cva(\r\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n {\r\n variants: {\r\n side: {\r\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\r\n bottom:\r\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\r\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\r\n right:\r\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\r\n },\r\n },\r\n defaultVariants: {\r\n side: \"right\",\r\n },\r\n }\r\n)\r\n\r\ninterface SheetContentProps\r\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\r\n VariantProps<typeof sheetVariants> {}\r\n\r\nconst SheetContent = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Content>,\r\n SheetContentProps\r\n>(({ side = \"right\", className, children, ...props }, ref) => (\r\n <SheetPortal>\r\n <SheetOverlay />\r\n <SheetPrimitive.Content\r\n ref={ref}\r\n className={cn(sheetVariants({ side }), className)}\r\n {...props}\r\n >\r\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </SheetPrimitive.Close>\r\n {children}\r\n </SheetPrimitive.Content>\r\n </SheetPortal>\r\n))\r\nSheetContent.displayName = SheetPrimitive.Content.displayName\r\n\r\nconst SheetHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-2 text-center sm:text-left\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nSheetHeader.displayName = \"SheetHeader\"\r\n\r\nconst SheetFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nSheetFooter.displayName = \"SheetFooter\"\r\n\r\nconst SheetTitle = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <SheetPrimitive.Title\r\n ref={ref}\r\n className={cn(\"text-lg font-semibold text-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nSheetTitle.displayName = SheetPrimitive.Title.displayName\r\n\r\nconst SheetDescription = React.forwardRef<\r\n React.ElementRef<typeof SheetPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <SheetPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nSheetDescription.displayName = SheetPrimitive.Description.displayName\r\n\r\nexport {\r\n Sheet,\r\n SheetPortal,\r\n SheetOverlay,\r\n SheetTrigger,\r\n SheetClose,\r\n SheetContent,\r\n SheetHeader,\r\n SheetFooter,\r\n SheetTitle,\r\n SheetDescription,\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst TooltipProvider = TooltipPrimitive.Provider\r\n\r\nconst Tooltip = TooltipPrimitive.Root\r\n\r\nconst TooltipTrigger = TooltipPrimitive.Trigger\r\n\r\nconst TooltipContent = React.forwardRef<\r\n React.ElementRef<typeof TooltipPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <TooltipPrimitive.Portal>\r\n <TooltipPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </TooltipPrimitive.Portal>\r\n))\r\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\r\n","import * as React from \"react\"\r\n\r\nconst MOBILE_BREAKPOINT = 768\r\n\r\nexport function useIsMobile() {\r\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\r\n\r\n React.useEffect(() => {\r\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\r\n const onChange = () => {\r\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\r\n }\r\n mql.addEventListener(\"change\", onChange)\r\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\r\n return () => mql.removeEventListener(\"change\", onChange)\r\n }, [])\r\n\r\n return !!isMobile\r\n}\r\n","import * as LucideIcons from 'lucide-react'\r\n\r\n/**\r\n * Разрешает имя иконки в компонент из lucide-react\r\n */\r\nexport function resolveIcon(iconName?: string): React.ComponentType<{ className?: string }> | null {\r\n\tif (!iconName) return null\r\n\t\r\n\t// Преобразуем имя иконки в формат PascalCase\r\n\tconst pascalCaseName = iconName\r\n\t\t.split(/[-_\\s]/)\r\n\t\t.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\r\n\t\t.join('')\r\n\t\r\n\t// Ищем иконку в lucide-react\r\n\tconst IconComponent = (LucideIcons as Record<string, React.ComponentType<{ className?: string }>>)[pascalCaseName]\r\n\t\r\n\treturn IconComponent || null\r\n}\r\n\r\n","import {\n\tSidebarMenuButton,\n\tSidebarMenuItem,\n\tSidebarMenuSub,\n\tSidebarMenuSubButton,\n\tSidebarMenuSubItem,\n} from '@/components/ui/sidebar'\nimport { resolveIcon } from '@/lib/documentation/icon-resolver'\nimport type { DocumentationEntity } from '@/lib/documentation/types'\nimport { FolderOpen } from 'lucide-react'\nimport * as React from 'react'\n\nfunction getEntityKey(entity: DocumentationEntity): string {\n\tif (entity.type === 'page' || entity.type === 'button') {\n\t\treturn entity.file.originalRelativePath || entity.file.relativePath\n\t}\n\treturn entity.folder.originalRelativePath || entity.folder.relativePath\n}\n\nfunction getEntityTitle(entity: DocumentationEntity): string {\n\tif (entity.type === 'page') {\n\t\treturn entity.frontmatter?.title || entity.file.name.replaceAll('.md', '')\n\t}\n\tif (entity.type === 'button') {\n\t\treturn entity.settings.title\n\t}\n\tif (entity.type === 'dropdown') {\n\t\treturn entity.settings?.title || entity.folder.name\n\t}\n\tif (entity.type === 'group') {\n\t\treturn (\n\t\t\tentity.settings?.title ||\n\t\t\tentity.folder.name.replace(/^\\(group-/, '').replace(/\\)$/, '')\n\t\t)\n\t}\n\treturn ''\n}\n\nfunction getEntityIcon(\n\tentity: DocumentationEntity\n): React.ComponentType<{ className?: string }> | null {\n\tif (entity.type === 'page') {\n\t\treturn resolveIcon(entity.frontmatter?.icon) || null\n\t}\n\tif (entity.type === 'button') {\n\t\treturn resolveIcon(entity.settings.icon)\n\t}\n\tif (entity.type === 'dropdown') {\n\t\treturn resolveIcon(entity.settings?.icon) || null\n\t}\n\tif (entity.type === 'group') {\n\t\treturn resolveIcon(entity.settings?.icon) || null\n\t}\n\treturn null\n}\n\ninterface DocumentationEntityItemProps {\n\treadonly entity: DocumentationEntity\n\treadonly openDropdowns: Set<string>\n\treadonly onToggleDropdown: (path: string) => void\n\treadonly onPageSelect?: (filePath: string | null) => void\n}\n\nexport function DocumentationEntityItem({\n\tentity,\n\topenDropdowns,\n\tonToggleDropdown,\n\tonPageSelect,\n}: DocumentationEntityItemProps) {\n\tconst entityKey = getEntityKey(entity)\n\tconst isOpen = openDropdowns.has(entityKey)\n\tconst Icon = getEntityIcon(entity)\n\n\tif (entity.type === 'page') {\n\t\tconst title = getEntityTitle(entity)\n\t\tconst filePath =\n\t\t\tentity.file.originalRelativePath || entity.file.relativePath\n\n\t\treturn (\n\t\t\t<SidebarMenuItem>\n\t\t\t\t<SidebarMenuButton onClick={() => onPageSelect?.(filePath)} asChild>\n\t\t\t\t\t<button type='button'>\n\t\t\t\t\t\t{Icon && <Icon className='size-4' />}\n\t\t\t\t\t\t<span>{title}</span>\n\t\t\t\t\t</button>\n\t\t\t\t</SidebarMenuButton>\n\t\t\t</SidebarMenuItem>\n\t\t)\n\t}\n\n\tif (entity.type === 'button') {\n\t\tconst title = getEntityTitle(entity)\n\t\t// Если есть URL в метаданных, это ссылка (независимо от variant)\n\t\tconst url = entity.settings.url\n\n\t\tif (url) {\n\t\t\tconst target = entity.settings.target || '_self'\n\n\t\t\t// Останавливаем всплытие события, чтобы не вызывать onPageSelect\n\t\t\tconst handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n\t\t\t\te.stopPropagation()\n\t\t\t\t// Для внешних ссылок открываем в новой вкладке\n\t\t\t\tif (target === '_blank') {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\twindow.open(url, '_blank', 'noopener,noreferrer')\n\t\t\t\t}\n\t\t\t\t// Для внутренних ссылок позволяем браузеру обработать переход естественным образом\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<SidebarMenuItem>\n\t\t\t\t\t<SidebarMenuButton asChild>\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={url}\n\t\t\t\t\t\t\ttarget={target}\n\t\t\t\t\t\t\trel={target === '_blank' ? 'noopener noreferrer' : undefined}\n\t\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\t\tclassName='w-full' // Убеждаемся, что ссылка занимает всю ширину как кнопка\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{Icon && <Icon className='size-4' />}\n\t\t\t\t\t\t\t<span>{title}</span>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</SidebarMenuButton>\n\t\t\t\t</SidebarMenuItem>\n\t\t\t)\n\t\t}\n\n\t\t// Если URL нет, это кнопка, открывающая markdown файл (variant === 'page')\n\t\tconst filePath =\n\t\t\tentity.file.originalRelativePath || entity.file.relativePath\n\n\t\tconst handlePageClick = () => {\n\t\t\tonPageSelect?.(filePath)\n\t\t}\n\n\t\treturn (\n\t\t\t<SidebarMenuItem>\n\t\t\t\t<SidebarMenuButton onClick={handlePageClick} asChild>\n\t\t\t\t\t<button type='button'>\n\t\t\t\t\t\t{Icon && <Icon className='size-4' />}\n\t\t\t\t\t\t<span>{title}</span>\n\t\t\t\t\t</button>\n\t\t\t\t</SidebarMenuButton>\n\t\t\t</SidebarMenuItem>\n\t\t)\n\t}\n\n\tif (entity.type === 'dropdown') {\n\t\tconst title = getEntityTitle(entity)\n\t\tconst dropdownState = entity.settings?.dropdown || 'collapsed'\n\t\tconst shouldBeOpen =\n\t\t\tdropdownState === 'open' ||\n\t\t\tdropdownState === 'always-open' ||\n\t\t\t(dropdownState === 'collapsed' && isOpen)\n\t\tconst isAlwaysOpen = dropdownState === 'always-open'\n\n\t\treturn (\n\t\t\t<SidebarMenuItem>\n\t\t\t\t<SidebarMenuButton\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (!isAlwaysOpen) {\n\t\t\t\t\t\t\tonToggleDropdown(entityKey)\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\tdata-state={shouldBeOpen ? 'open' : 'closed'}\n\t\t\t\t>\n\t\t\t\t\t{shouldBeOpen ? (\n\t\t\t\t\t\t<FolderOpen className='size-4' />\n\t\t\t\t\t) : (\n\t\t\t\t\t\tIcon && <Icon className='size-4' />\n\t\t\t\t\t)}\n\t\t\t\t\t<span>{title}</span>\n\t\t\t\t</SidebarMenuButton>\n\t\t\t\t{shouldBeOpen && entity.pages.length > 0 && (\n\t\t\t\t\t<SidebarMenuSub>\n\t\t\t\t\t\t{entity.pages\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\tp =>\n\t\t\t\t\t\t\t\t\tp.type === 'page' &&\n\t\t\t\t\t\t\t\t\t!p.file.name.endsWith('dropdown-settings.md')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.map((page, idx) => {\n\t\t\t\t\t\t\t\t// Проверяем, что это страница (page)\n\t\t\t\t\t\t\t\tif (page.type !== 'page') return null\n\n\t\t\t\t\t\t\t\tconst pageTitle =\n\t\t\t\t\t\t\t\t\tpage.frontmatter?.title ||\n\t\t\t\t\t\t\t\t\tpage.file.name.replaceAll('.md', '')\n\t\t\t\t\t\t\t\tconst filePath =\n\t\t\t\t\t\t\t\t\tpage.file.originalRelativePath || page.file.relativePath\n\t\t\t\t\t\t\t\tconst PageIcon = resolveIcon(page.frontmatter?.icon)\n\t\t\t\t\t\t\t\tconst pageKey =\n\t\t\t\t\t\t\t\t\tpage.file.originalRelativePath || page.file.relativePath\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<SidebarMenuSubItem key={`${pageKey}-${idx}`}>\n\t\t\t\t\t\t\t\t\t\t<SidebarMenuSubButton\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => onPageSelect?.(filePath)}\n\t\t\t\t\t\t\t\t\t\t\tasChild\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<button type='button'>\n\t\t\t\t\t\t\t\t\t\t\t\t{PageIcon && <PageIcon className='size-4' />}\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{pageTitle}</span>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</SidebarMenuSubButton>\n\t\t\t\t\t\t\t\t\t</SidebarMenuSubItem>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t</SidebarMenuSub>\n\t\t\t\t)}\n\t\t\t</SidebarMenuItem>\n\t\t)\n\t}\n\n\tif (entity.type === 'group') {\n\t\tconst title = getEntityTitle(entity)\n\t\treturn (\n\t\t\t<SidebarMenuItem>\n\t\t\t\t<SidebarMenuButton disabled>\n\t\t\t\t\t{Icon && <Icon className='size-4' />}\n\t\t\t\t\t<span>{title}</span>\n\t\t\t\t</SidebarMenuButton>\n\t\t\t\t{entity.pages.length > 0 && (\n\t\t\t\t\t<SidebarMenuSub>\n\t\t\t\t\t\t{entity.pages\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\tp =>\n\t\t\t\t\t\t\t\t\tp.type === 'page' &&\n\t\t\t\t\t\t\t\t\t!p.file.name.endsWith('group-settings.md')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.map((page, idx) => {\n\t\t\t\t\t\t\t\t// Проверяем, что это страница (page)\n\t\t\t\t\t\t\t\tif (page.type !== 'page') return null\n\n\t\t\t\t\t\t\t\tconst pageTitle =\n\t\t\t\t\t\t\t\t\tpage.frontmatter?.title ||\n\t\t\t\t\t\t\t\t\tpage.file.name.replaceAll('.md', '')\n\t\t\t\t\t\t\t\tconst filePath =\n\t\t\t\t\t\t\t\t\tpage.file.originalRelativePath || page.file.relativePath\n\t\t\t\t\t\t\t\tconst PageIcon = resolveIcon(page.frontmatter?.icon)\n\t\t\t\t\t\t\t\tconst pageKey =\n\t\t\t\t\t\t\t\t\tpage.file.originalRelativePath || page.file.relativePath\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<SidebarMenuSubItem key={`${pageKey}-${idx}`}>\n\t\t\t\t\t\t\t\t\t\t<SidebarMenuSubButton\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => onPageSelect?.(filePath)}\n\t\t\t\t\t\t\t\t\t\t\tasChild\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<button type='button'>\n\t\t\t\t\t\t\t\t\t\t\t\t{PageIcon && <PageIcon className='size-4' />}\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{pageTitle}</span>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</SidebarMenuSubButton>\n\t\t\t\t\t\t\t\t\t</SidebarMenuSubItem>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t</SidebarMenuSub>\n\t\t\t\t)}\n\t\t\t</SidebarMenuItem>\n\t\t)\n\t}\n\n\treturn null\n}\n","import { Moon, Sun } from 'lucide-react'\r\nimport * as React from 'react'\r\nimport { Button } from './ui/button'\r\n\r\nexport function ThemeToggle() {\r\n\tconst [theme, setTheme] = React.useState<'light' | 'dark'>(() => {\r\n\t\tif (globalThis.window === undefined) return 'dark'\r\n\t\tconst stored = globalThis.localStorage.getItem('theme')\r\n\t\tif (stored === 'light' || stored === 'dark') return stored\r\n\t\treturn 'dark'\r\n\t})\r\n\r\n\tReact.useEffect(() => {\r\n\t\tconst root = document.documentElement\r\n\t\tif (theme === 'dark') {\r\n\t\t\troot.classList.add('dark')\r\n\t\t} else {\r\n\t\t\troot.classList.remove('dark')\r\n\t\t}\r\n\t\tif (globalThis.window !== undefined) {\r\n\t\t\tglobalThis.localStorage.setItem('theme', theme)\r\n\t\t}\r\n\t}, [theme])\r\n\r\n\tconst toggleTheme = () => {\r\n\t\tsetTheme(prev => (prev === 'dark' ? 'light' : 'dark'))\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Button\r\n\t\t\tvariant='ghost'\r\n\t\t\tsize='icon'\r\n\t\t\tonClick={toggleTheme}\r\n\t\t\tclassName='h-9 w-9'\r\n\t\t\taria-label='Toggle theme'\r\n\t\t>\r\n\t\t\t<Sun className='h-4 w-4 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0' />\r\n\t\t\t<Moon className='absolute h-4 w-4 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100' />\r\n\t\t\t<span className='sr-only'>Toggle theme</span>\r\n\t\t</Button>\r\n\t)\r\n}\r\n","import { useEffect, useState, useCallback } from 'react'\r\n\r\n/**\r\n * Хук для синхронизации URL с выбранной страницей документации\r\n * Использует hash (#) для хранения пути к файлу в читаемом формате\r\n * Формат: http://localhost:5173/#2.0.2/ru/advanced/advanced-settings.md\r\n */\r\nexport function useDocumentationRouter(\r\n\tfolderPath: string\r\n): [string | null, (page: string | null) => void] {\r\n\t// Получаем текущую страницу из URL hash при инициализации\r\n\tconst getPageFromURL = useCallback((): string | null => {\r\n\t\tif (typeof window === 'undefined') return null\r\n\r\n\t\tconst hash = window.location.hash\r\n\t\tif (!hash || hash.length <= 1) return null\r\n\r\n\t\t// Убираем символ # в начале\r\n\t\tconst pagePath = hash.slice(1)\r\n\t\tif (!pagePath) return null\r\n\r\n\t\t// Декодируем путь (на случай если есть специальные символы)\r\n\t\ttry {\r\n\t\t\treturn decodeURIComponent(pagePath)\r\n\t\t} catch {\r\n\t\t\treturn pagePath\r\n\t\t}\r\n\t}, [])\r\n\r\n\t// Инициализируем состояние из URL\r\n\tconst [currentPage, setCurrentPageState] = useState<string | null>(\r\n\t\tgetPageFromURL\r\n\t)\r\n\r\n\t// Обновляем URL при изменении страницы\r\n\tconst setCurrentPage = useCallback(\r\n\t\t(page: string | null) => {\r\n\t\t\tsetCurrentPageState(page)\r\n\r\n\t\t\tif (typeof window === 'undefined') return\r\n\r\n\t\t\t// Нормализуем путь: заменяем обратные слэши на прямые\r\n\t\t\tconst normalized = page ? page.replace(/\\\\/g, '/') : ''\r\n\r\n\t\t\tif (normalized) {\r\n\t\t\t\t// Кодируем только специальные символы, оставляя путь читаемым\r\n\t\t\t\t// encodeURI не кодирует /, что делает URL более читаемым\r\n\t\t\t\tconst encoded = encodeURI(normalized)\r\n\t\t\t\twindow.location.hash = encoded\r\n\t\t\t} else {\r\n\t\t\t\t// Удаляем hash если страница не выбрана\r\n\t\t\t\twindow.history.pushState(\r\n\t\t\t\t\t'',\r\n\t\t\t\t\tdocument.title,\r\n\t\t\t\t\twindow.location.pathname + window.location.search\r\n\t\t\t\t)\r\n\t\t\t}\r\n\t\t},\r\n\t\t[]\r\n\t)\r\n\r\n\t// Слушаем изменения URL (кнопки назад/вперед и прямые изменения hash)\r\n\tuseEffect(() => {\r\n\t\tif (typeof window === 'undefined') return\r\n\r\n\t\tconst handleHashChange = () => {\r\n\t\t\tconst page = getPageFromURL()\r\n\t\t\tsetCurrentPageState(page)\r\n\t\t}\r\n\r\n\t\t// Слушаем событие hashchange для прямых изменений hash\r\n\t\twindow.addEventListener('hashchange', handleHashChange)\r\n\t\t// Слушаем popstate для кнопок назад/вперед\r\n\t\twindow.addEventListener('popstate', handleHashChange)\r\n\r\n\t\treturn () => {\r\n\t\t\twindow.removeEventListener('hashchange', handleHashChange)\r\n\t\t\twindow.removeEventListener('popstate', handleHashChange)\r\n\t\t}\r\n\t}, [getPageFromURL])\r\n\r\n\treturn [currentPage, setCurrentPage]\r\n}\r\n\r\n","import matter from 'gray-matter'\r\nimport { errorBuilder } from '../errorBuilder/error-builder'\r\nimport type {\r\n\tBaseMeta,\r\n\tButtonSettings,\r\n\tDropdownSettings,\r\n\tGroupSettings,\r\n\tLanguageSettings,\r\n\tPageFrontmatter,\r\n\tVersionSettings,\r\n} from './types'\r\n\r\n/**\r\n * Парсит frontmatter из markdown файла\r\n */\r\nexport function parseFrontmatter(content: string): {\r\n\tfrontmatter: Record<string, unknown>\r\n\tcontent: string\r\n} {\r\n\ttry {\r\n\t\tconst parsed = matter(content)\r\n\t\treturn {\r\n\t\t\tfrontmatter: parsed.data || {},\r\n\t\t\tcontent: parsed.content,\r\n\t\t}\r\n\t} catch (error) {\r\n\t\t// Если frontmatter некорректный, возвращаем весь контент как есть\r\n\t\terrorBuilder([], {\r\n\t\t\ttype: 'VERSION_FORMAT_ERROR',\r\n\t\t\treason: `frontmatter некорректный`,\r\n\t\t\tfix: `1`,\r\n\t\t})\r\n\t\treturn {\r\n\t\t\tfrontmatter: {},\r\n\t\t\tcontent,\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Парсит метаданные страницы из frontmatter\r\n */\r\nexport function parsePageFrontmatter(\r\n\tfrontmatter: Record<string, unknown>\r\n): PageFrontmatter {\r\n\treturn {\r\n\t\ttitle:\r\n\t\t\ttypeof frontmatter.title === 'string' ? frontmatter.title : undefined,\r\n\t\torder:\r\n\t\t\ttypeof frontmatter.order === 'number'\r\n\t\t\t\t? frontmatter.order\r\n\t\t\t\t: typeof frontmatter.order === 'string'\r\n\t\t\t\t? parseInt(frontmatter.order, 10)\r\n\t\t\t\t: undefined,\r\n\t\ticon: typeof frontmatter.icon === 'string' ? frontmatter.icon : undefined,\r\n\t\thidden:\r\n\t\t\ttypeof frontmatter.hidden === 'boolean'\r\n\t\t\t\t? frontmatter.hidden\r\n\t\t\t\t: frontmatter.hidden === 'true'\r\n\t\t\t\t? true\r\n\t\t\t\t: undefined,\r\n\t\tsearchable:\r\n\t\t\ttypeof frontmatter.searchable === 'boolean'\r\n\t\t\t\t? frontmatter.searchable\r\n\t\t\t\t: frontmatter.searchable === 'false'\r\n\t\t\t\t? false\r\n\t\t\t\t: undefined,\r\n\t\tlang: typeof frontmatter.lang === 'string' ? frontmatter.lang : undefined,\r\n\t\ttags: Array.isArray(frontmatter.tags)\r\n\t\t\t? frontmatter.tags.filter((t): t is string => typeof t === 'string')\r\n\t\t\t: undefined,\r\n\t\tlayout:\r\n\t\t\ttypeof frontmatter.layout === 'string' ? frontmatter.layout : undefined,\r\n\t}\r\n}\r\n\r\n/**\r\n * Парсит настройки dropdown из frontmatter\r\n */\r\nexport function parseDropdownSettings(\r\n\tfrontmatter: Record<string, unknown>\r\n): DropdownSettings {\r\n\treturn {\r\n\t\ttitle:\r\n\t\t\ttypeof frontmatter.title === 'string' ? frontmatter.title : undefined,\r\n\t\torder:\r\n\t\t\ttypeof frontmatter.order === 'number'\r\n\t\t\t\t? frontmatter.order\r\n\t\t\t\t: typeof frontmatter.order === 'string'\r\n\t\t\t\t? parseInt(frontmatter.order, 10)\r\n\t\t\t\t: undefined,\r\n\t\ticon: typeof frontmatter.icon === 'string' ? frontmatter.icon : undefined,\r\n\t\thidden:\r\n\t\t\ttypeof frontmatter.hidden === 'boolean'\r\n\t\t\t\t? frontmatter.hidden\r\n\t\t\t\t: frontmatter.hidden === 'true'\r\n\t\t\t\t? true\r\n\t\t\t\t: undefined,\r\n\t\tsearchable:\r\n\t\t\ttypeof frontmatter.searchable === 'boolean'\r\n\t\t\t\t? frontmatter.searchable\r\n\t\t\t\t: frontmatter.searchable === 'false'\r\n\t\t\t\t? false\r\n\t\t\t\t: undefined,\r\n\t\tdropdown:\r\n\t\t\ttypeof frontmatter.dropdown === 'string' &&\r\n\t\t\t['open', 'collapsed', 'always-open'].includes(frontmatter.dropdown)\r\n\t\t\t\t? (frontmatter.dropdown as 'open' | 'collapsed' | 'always-open')\r\n\t\t\t\t: undefined,\r\n\t}\r\n}\r\n\r\n/**\r\n * Парсит настройки group из frontmatter\r\n */\r\nexport function parseGroupSettings(\r\n\tfrontmatter: Record<string, unknown>\r\n): GroupSettings {\r\n\treturn {\r\n\t\ttitle:\r\n\t\t\ttypeof frontmatter.title === 'string' ? frontmatter.title : undefined,\r\n\t\torder:\r\n\t\t\ttypeof frontmatter.order === 'number'\r\n\t\t\t\t? frontmatter.order\r\n\t\t\t\t: typeof frontmatter.order === 'string'\r\n\t\t\t\t? parseInt(frontmatter.order, 10)\r\n\t\t\t\t: undefined,\r\n\t\ticon: typeof frontmatter.icon === 'string' ? frontmatter.icon : undefined,\r\n\t\thidden:\r\n\t\t\ttypeof frontmatter.hidden === 'boolean'\r\n\t\t\t\t? frontmatter.hidden\r\n\t\t\t\t: frontmatter.hidden === 'true'\r\n\t\t\t\t? true\r\n\t\t\t\t: undefined,\r\n\t\tsearchable:\r\n\t\t\ttypeof frontmatter.searchable === 'boolean'\r\n\t\t\t\t? frontmatter.searchable\r\n\t\t\t\t: frontmatter.searchable === 'false'\r\n\t\t\t\t? false\r\n\t\t\t\t: undefined,\r\n\t\tdescription:\r\n\t\t\ttypeof frontmatter.description === 'string'\r\n\t\t\t\t? frontmatter.description\r\n\t\t\t\t: undefined,\r\n\t}\r\n}\r\n\r\n/**\r\n * Парсит настройки кнопки из frontmatter\r\n */\r\nexport function parseButtonSettings(\r\n\tfrontmatter: Record<string, unknown>,\r\n\tdefaultTitle: string\r\n): ButtonSettings {\r\n\treturn {\r\n\t\ttype: 'button',\r\n\t\tvariant:\r\n\t\t\ttypeof frontmatter.variant === 'string' &&\r\n\t\t\t['link', 'page'].includes(frontmatter.variant)\r\n\t\t\t\t? (frontmatter.variant as 'link' | 'page')\r\n\t\t\t\t: 'page',\r\n\t\ttitle:\r\n\t\t\ttypeof frontmatter.title === 'string' ? frontmatter.title : defaultTitle,\r\n\t\torder:\r\n\t\t\ttypeof frontmatter.order === 'number'\r\n\t\t\t\t? frontmatter.order\r\n\t\t\t\t: typeof frontmatter.order === 'string'\r\n\t\t\t\t? parseInt(frontmatter.order, 10)\r\n\t\t\t\t: undefined,\r\n\t\ticon: typeof frontmatter.icon === 'string' ? frontmatter.icon : undefined,\r\n\t\thidden:\r\n\t\t\ttypeof frontmatter.hidden === 'boolean'\r\n\t\t\t\t? frontmatter.hidden\r\n\t\t\t\t: frontmatter.hidden === 'true'\r\n\t\t\t\t? true\r\n\t\t\t\t: undefined,\r\n\t\tsearchable:\r\n\t\t\ttypeof frontmatter.searchable === 'boolean'\r\n\t\t\t\t? frontmatter.searchable === false\r\n\t\t\t\t: frontmatter.searchable === 'false'\r\n\t\t\t\t? false\r\n\t\t\t\t: false, // Кнопки по умолчанию не участвуют в поиске\r\n\t\turl: typeof frontmatter.url === 'string' ? frontmatter.url : undefined,\r\n\t\tstyle:\r\n\t\t\ttypeof frontmatter.style === 'string' &&\r\n\t\t\t['primary', 'secondary', 'ghost'].includes(frontmatter.style)\r\n\t\t\t\t? (frontmatter.style as 'primary' | 'secondary' | 'ghost')\r\n\t\t\t\t: undefined,\r\n\t\ttarget:\r\n\t\t\ttypeof frontmatter.target === 'string' &&\r\n\t\t\t['_blank', '_self'].includes(frontmatter.target)\r\n\t\t\t\t? (frontmatter.target as '_blank' | '_self')\r\n\t\t\t\t: undefined,\r\n\t\tposition:\r\n\t\t\ttypeof frontmatter.position === 'string' &&\r\n\t\t\t['sidebar', 'header'].includes(frontmatter.position)\r\n\t\t\t\t? (frontmatter.position as 'sidebar' | 'header')\r\n\t\t\t\t: 'sidebar',\r\n\t}\r\n}\r\n\r\n/**\r\n * Парсит настройки версии из frontmatter\r\n */\r\nexport function parseVersionSettings(\r\n\tfrontmatter: Record<string, unknown>\r\n): VersionSettings {\r\n\treturn {\r\n\t\ttitle:\r\n\t\t\ttypeof frontmatter.title === 'string' ? frontmatter.title : undefined,\r\n\t\torder:\r\n\t\t\ttypeof frontmatter.order === 'number'\r\n\t\t\t\t? frontmatter.order\r\n\t\t\t\t: typeof frontmatter.order === 'string'\r\n\t\t\t\t? parseInt(frontmatter.order, 10)\r\n\t\t\t\t: undefined,\r\n\t\tdefault:\r\n\t\t\ttypeof frontmatter.default === 'boolean'\r\n\t\t\t\t? frontmatter.default\r\n\t\t\t\t: frontmatter.default === 'true',\r\n\t\tdeprecated:\r\n\t\t\ttypeof frontmatter.deprecated === 'boolean'\r\n\t\t\t\t? frontmatter.deprecated\r\n\t\t\t\t: frontmatter.deprecated === 'true',\r\n\t}\r\n}\r\n\r\n/**\r\n * Парсит настройки языка из frontmatter\r\n */\r\nexport function parseLanguageSettings(\r\n\tfrontmatter: Record<string, unknown>\r\n): LanguageSettings {\r\n\treturn {\r\n\t\tlabel:\r\n\t\t\ttypeof frontmatter.label === 'string' ? frontmatter.label : undefined,\r\n\t\torder:\r\n\t\t\ttypeof frontmatter.order === 'number'\r\n\t\t\t\t? frontmatter.order\r\n\t\t\t\t: typeof frontmatter.order === 'string'\r\n\t\t\t\t? parseInt(frontmatter.order, 10)\r\n\t\t\t\t: undefined,\r\n\t}\r\n}\r\n\r\n/**\r\n * Применяет значения по умолчанию к базовым метаданным\r\n */\r\nexport function applyBaseMetaDefaults(meta: Partial<BaseMeta>): BaseMeta {\r\n\treturn {\r\n\t\torder: meta.order ?? 100,\r\n\t\thidden: meta.hidden ?? false,\r\n\t\tsearchable: meta.searchable ?? true,\r\n\t\t...meta,\r\n\t}\r\n}\r\n\r\n/**\r\n * Наследует метаданные от родителя к дочернему элементу\r\n */\r\nexport function inheritMeta(\r\n\tchildMeta: Partial<BaseMeta>,\r\n\tparentMeta?: Partial<BaseMeta>\r\n): BaseMeta {\r\n\tif (!parentMeta) {\r\n\t\treturn applyBaseMetaDefaults(childMeta)\r\n\t}\r\n\r\n\t// Наследуем значения, если они не заданы в дочернем элементе\r\n\tconst inherited: Partial<BaseMeta> = {\r\n\t\ticon: childMeta.icon ?? parentMeta.icon,\r\n\t\t// hidden не наследуется вверх (если дочерний hidden, он остается hidden)\r\n\t\thidden: childMeta.hidden ?? false,\r\n\t\t// searchable наследуется, но если родитель false, то и дочерний false\r\n\t\tsearchable:\r\n\t\t\tchildMeta.searchable !== undefined\r\n\t\t\t\t? childMeta.searchable\r\n\t\t\t\t: parentMeta.searchable ?? true,\r\n\t}\r\n\r\n\treturn applyBaseMetaDefaults({\r\n\t\t...parentMeta,\r\n\t\t...inherited,\r\n\t\t...childMeta, // Дочерние значения имеют приоритет\r\n\t})\r\n}\r\n","import { FileInfo } from '../scanningFolder'\r\n\r\nexport function errorBuilder(items: Array<FileInfo>, err?: Object) {\r\n\tconst errors = []\r\n\r\n\tif (err) {\r\n\t\terrors.push(err)\r\n\t}\r\n\r\n\t// Паттерны для проверки структуры\r\n\tconst versionPattern = /^\\d+\\.\\d+\\.\\d+/\r\n\tconst groupPattern = /^\\(group-.*\\)$/\r\n\tconst languagePattern = /^[a-z]{2}$/ // Языковые коды (ISO 639-1)\r\n\r\n\t// Получаем корневые элементы (depth = 0)\r\n\tconst rootItems = items.filter(item => item.depth === 0)\r\n\r\n\t// Проверяем каждый корневой элемент\r\n\trootItems.forEach(item => {\r\n\t\t// Проверка 1: В корне должны быть только папки (директории)\r\n\t\tif (item.type !== 'directory') {\r\n\t\t\terrors.push({\r\n\t\t\t\ttype: 'ROOT_FILE_ERROR',\r\n\t\t\t\tfile: item.name,\r\n\t\t\t\tpath: item.relativePath,\r\n\t\t\t\treason: 'В корневой директории docs/ не должно быть файлов',\r\n\t\t\t\tfix: `Переместите файл \"${item.name}\" в соответствующую версионную папку (например, \"1.0.0/\")`,\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\t// Проверка 2: Папки в корне должны соответствовать паттерну версии\r\n\t\tif (item.type === 'directory') {\r\n\t\t\tif (!versionPattern.test(item.name)) {\r\n\t\t\t\terrors.push({\r\n\t\t\t\t\ttype: 'VERSION_FORMAT_ERROR',\r\n\t\t\t\t\tfolder: item.name,\r\n\t\t\t\t\tpath: item.relativePath,\r\n\t\t\t\t\treason: `Папка \"${item.name}\" не соответствует формату версии (должно быть \"x.x.x\")`,\r\n\t\t\t\t\tfix: `Переименуйте папку в формат версии, например: \"1.0.0\"`,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t}\r\n\t})\r\n\r\n\t// 2. Проверяем структуру вложенных файлов\r\n\titems.forEach(item => {\r\n\t\t// Проверка 3: Файлы должны быть внутри версионных папок\r\n\t\tif (item.type === 'file') {\r\n\t\t\tconst pathParts = item.relativePath.split(/[\\\\/]/)\r\n\r\n\t\t\t// Проверяем, находится ли файл внутри папки с версией\r\n\t\t\tif (pathParts.length < 2) {\r\n\t\t\t\terrors.push({\r\n\t\t\t\t\ttype: 'ORPHAN_FILE_ERROR',\r\n\t\t\t\t\tfile: item.name,\r\n\t\t\t\t\tpath: item.relativePath,\r\n\t\t\t\t\treason: `Файл \"${item.name}\" находится в корне, а не внутри версионной папки`,\r\n\t\t\t\t\tfix: `Переместите файл в соответствующую версионную папку (например, \"1.0.0/${item.name}\")`,\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\tconst parentFolder = pathParts[0]\r\n\r\n\t\t\t\t// Проверяем, что родительская папка - это версия\r\n\t\t\t\tif (!versionPattern.test(parentFolder)) {\r\n\t\t\t\t\terrors.push({\r\n\t\t\t\t\t\ttype: 'FILE_IN_WRONG_FOLDER',\r\n\t\t\t\t\t\tfile: item.name,\r\n\t\t\t\t\t\tpath: item.relativePath,\r\n\t\t\t\t\t\treason: `Файл \"${item.name}\" находится в папке \"${parentFolder}\", которая не является версионной папкой`,\r\n\t\t\t\t\t\tfix: `Переместите файл в папку с версией (например, \"1.0.0/\")`,\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Проверка 4: Вложенные директории (не считая версионных)\r\n\t\t// Эта проверка теперь выполняется в разделе 4 для каждой версии отдельно\r\n\t})\r\n\r\n\t// 3. Проверяем структуру внутри версионных папок\r\n\tconst versionFolders = items.filter(\r\n\t\titem =>\r\n\t\t\titem.depth === 0 &&\r\n\t\t\titem.type === 'directory' &&\r\n\t\t\tversionPattern.test(item.name)\r\n\t)\r\n\r\n\tversionFolders.forEach(versionFolder => {\r\n\t\tconst versionFiles = items.filter(item => {\r\n\t\t\tconst pathParts = item.relativePath.split(/[\\\\/]/)\r\n\t\t\treturn pathParts[0] === versionFolder.name\r\n\t\t})\r\n\r\n\t\t// Проверка: .md файлы в корне версии должны быть только .button.md\r\n\t\tconst rootMdFiles = versionFiles.filter(\r\n\t\t\tf => f.depth === 1 && f.type === 'file' && f.extension === 'md'\r\n\t\t)\r\n\r\n\t\trootMdFiles.forEach(file => {\r\n\t\t\tif (!file.name.endsWith('.button.md')) {\r\n\t\t\t\terrors.push({\r\n\t\t\t\t\ttype: 'INVALID_ROOT_MD_FILE',\r\n\t\t\t\t\tfile: file.name,\r\n\t\t\t\t\tpath: file.relativePath,\r\n\t\t\t\t\treason: `В корне версионной папки \"${versionFolder.name}\" обычные .md файлы не допускаются. Используйте .button.md для кнопок или переместите файл в подпапку`,\r\n\t\t\t\t\tfix: `Переименуйте файл в \"${\r\n\t\t\t\t\t\tfile.name.endsWith('.md')\r\n\t\t\t\t\t\t\t? file.name.slice(0, -3) + '.button.md'\r\n\t\t\t\t\t\t\t: file.name + '.button.md'\r\n\t\t\t\t\t}\" или переместите в подпапку`,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// Проверка: папки (group-*) должны содержать только файлы, не вложенные папки\r\n\t\tconst groupFolders = versionFiles.filter(\r\n\t\t\tf => f.depth === 1 && f.type === 'directory' && groupPattern.test(f.name)\r\n\t\t)\r\n\r\n\t\tgroupFolders.forEach(groupFolder => {\r\n\t\t\tconst nestedDirs = versionFiles.filter(\r\n\t\t\t\tf =>\r\n\t\t\t\t\tf.relativePath.startsWith(groupFolder.relativePath) &&\r\n\t\t\t\t\tf.type === 'directory' &&\r\n\t\t\t\t\tf.depth > groupFolder.depth\r\n\t\t\t)\r\n\r\n\t\t\tif (nestedDirs.length > 0) {\r\n\t\t\t\terrors.push({\r\n\t\t\t\t\ttype: 'NESTED_DIRECTORY_IN_GROUP',\r\n\t\t\t\t\tfolder: nestedDirs[0].name,\r\n\t\t\t\t\tpath: nestedDirs[0].relativePath,\r\n\t\t\t\t\treason: `Внутри группы \"${groupFolder.name}\" не допускаются вложенные папки`,\r\n\t\t\t\t\tfix: `Переместите содержимое папки \"${nestedDirs[0].name}\" на уровень группы или удалите вложенную структуру`,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// Проверка: обычные папки (dropdown) не должны содержать другие папки\r\n\t\t// Исключение: языковые папки могут содержать любые вложенные папки\r\n\t\tconst dropdownFolders = versionFiles.filter(\r\n\t\t\tf =>\r\n\t\t\t\tf.depth === 1 &&\r\n\t\t\t\tf.type === 'directory' &&\r\n\t\t\t\t!groupPattern.test(f.name) &&\r\n\t\t\t\t!versionPattern.test(f.name)\r\n\t\t)\r\n\r\n\t\tdropdownFolders.forEach(dropdownFolder => {\r\n\t\t\t// Если dropdown папка - это языковая папка, разрешаем любые вложенные папки\r\n\t\t\tconst isLanguageFolder = languagePattern.test(dropdownFolder.name)\r\n\r\n\t\t\t// Пропускаем проверку для языковых папок\r\n\t\t\tif (isLanguageFolder) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tconst nestedDirs = versionFiles.filter(\r\n\t\t\t\tf =>\r\n\t\t\t\t\tf.relativePath.startsWith(dropdownFolder.relativePath) &&\r\n\t\t\t\t\tf.type === 'directory' &&\r\n\t\t\t\t\tf.depth > dropdownFolder.depth\r\n\t\t\t)\r\n\r\n\t\t\tif (nestedDirs.length > 0) {\r\n\t\t\t\terrors.push({\r\n\t\t\t\t\ttype: 'NESTED_DIRECTORY_IN_DROPDOWN',\r\n\t\t\t\t\tfolder: nestedDirs[0].name,\r\n\t\t\t\t\tpath: nestedDirs[0].relativePath,\r\n\t\t\t\t\treason: `Внутри dropdown папки \"${dropdownFolder.name}\" не допускаются вложенные папки`,\r\n\t\t\t\t\tfix: `Переместите содержимое папки \"${nestedDirs[0].name}\" на уровень dropdown или используйте плоскую структуру`,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// Проверка: .button.md файлы должны быть только в корне версии или в папке языка\r\n\t\tconst buttonFiles = versionFiles.filter(\r\n\t\t\tf => f.type === 'file' && f.name.endsWith('.button.md')\r\n\t\t)\r\n\r\n\t\tbuttonFiles.forEach(buttonFile => {\r\n\t\t\tconst pathParts = buttonFile.relativePath.split(/[\\\\/]/)\r\n\r\n\t\t\t// Разрешаем .button.md в корне версии (depth = 1) или в папке языка (depth = 2, где второй элемент - языковая папка)\r\n\t\t\tconst isInRoot = buttonFile.depth === 1\r\n\t\t\tconst isInLanguageFolder =\r\n\t\t\t\tbuttonFile.depth === 2 &&\r\n\t\t\t\tpathParts.length > 1 &&\r\n\t\t\t\tlanguagePattern.test(pathParts[1])\r\n\r\n\t\t\tif (!isInRoot && !isInLanguageFolder) {\r\n\t\t\t\terrors.push({\r\n\t\t\t\t\ttype: 'BUTTON_FILE_IN_WRONG_PLACE',\r\n\t\t\t\t\tfile: buttonFile.name,\r\n\t\t\t\t\tpath: buttonFile.relativePath,\r\n\t\t\t\t\treason: `Файл .button.md \"${buttonFile.name}\" должен находиться только в корне версионной папки или в папке языка`,\r\n\t\t\t\t\tfix: `Переместите файл \"${buttonFile.name}\" в корень версионной папки \"${versionFolder.name}/\" или в папку языка (например, \"${versionFolder.name}/ru/\")`,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t})\r\n\t})\r\n\r\n\treturn errors\r\n}\r\n","import type { FileInfo } from '../scanningFolder'\r\nimport { inheritMeta } from './frontmatter-parser'\r\nimport { BUTTON_PATTERN, LANGUAGE_PATTERN } from './helpers'\r\nimport { getEntityType } from './helpers/getEntityType'\r\nimport { getSortEntities } from './helpers/getSortEntities'\r\nimport { isHidden } from './helpers/types-helper'\r\nimport {\r\n\ttype ButtonSettings,\r\n\ttype DocumentationEntity,\r\n\ttype DropdownSettings,\r\n\ttype GroupSettings,\r\n\ttype PageFrontmatter,\r\n} from './types'\r\n\r\n/**\r\n * Парсит структуру документации для версии и языка (клиентская версия)\r\n */\r\n\r\ntype FileExtended = FileInfo & { originalRelativePath?: string }\r\nexport function parseVersionStructure(\r\n\tversion: string,\r\n\tfiles: FileInfo[],\r\n\tlanguage?: string | null,\r\n\tmetadata?: Record<\r\n\t\tstring,\r\n\t\tPageFrontmatter | ButtonSettings | DropdownSettings | GroupSettings\r\n\t>\r\n): DocumentationEntity[] {\r\n\t/* 1. отфильтровать и «схлопнуть» языковые папки */\r\n\tconst versionFiles = prepareFilesForVersion(files, version, language)\r\n\r\n\t/* 2. собрать сущности */\r\n\tconst entities = buildEntities(versionFiles, metadata || {})\r\n\r\n\t/* 3. отсортировать один раз */\r\n\treturn getSortEntities(entities)\r\n}\r\n\r\n/* ================================================================== */\r\n/* 1. подготовка файлов (фильтр по версии + язык) */\r\n/* ================================================================== */\r\nfunction prepareFilesForVersion(\r\n\tfiles: FileInfo[],\r\n\tversion: string,\r\n\tlanguage: string | null | undefined\r\n): FileExtended[] {\r\n\t/* оставляем только файлы нужной версии */\r\n\tlet list = files.filter(f => f.relativePath.split(/[/\\\\]/)[0] === version)\r\n\r\n\tconst hasLangFolders = list.some(\r\n\t\tf =>\r\n\t\t\tf.depth === 1 && f.type === 'directory' && LANGUAGE_PATTERN.test(f.name)\r\n\t)\r\n\r\n\t/* если языковых папок нет – просто дополняем поле */\r\n\tif (!hasLangFolders) {\r\n\t\treturn list.map(f => ({ ...f, originalRelativePath: f.relativePath }))\r\n\t}\r\n\r\n\t/* язык задан – берём только его; не задан – выбрасываем языковые папки */\r\n\tconst wantedLang = language || null\r\n\tlist = list.filter(f => {\r\n\t\tconst p = f.relativePath.split(/[/\\\\]/)\r\n\t\tif (p.length < 2) return true /* корень версии */\r\n\t\tconst second = p[1]\r\n\t\tif (!LANGUAGE_PATTERN.test(second)) return true /* не языковая папка */\r\n\t\treturn wantedLang ? second === wantedLang : false\r\n\t})\r\n\r\n\t/* корректируем depth / path для файлов внутри языковых папок */\r\n\treturn list.map(f => {\r\n\t\tconst p = f.relativePath.split(/[/\\\\]/)\r\n\t\tif (p.length >= 2 && LANGUAGE_PATTERN.test(p[1])) {\r\n\t\t\treturn {\r\n\t\t\t\t...f,\r\n\t\t\t\tdepth: f.depth - 1,\r\n\t\t\t\trelativePath: p.slice(2).join('/'),\r\n\t\t\t\toriginalRelativePath: f.relativePath,\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn { ...f, originalRelativePath: f.relativePath }\r\n\t})\r\n}\r\n\r\n/* ================================================================== */\r\n/* 2. сбор сущностей */\r\n/* ================================================================== */\r\n\r\nfunction buildEntities(\r\n\tfiles: FileExtended[],\r\n\tmetadata: Record<string, any>\r\n): DocumentationEntity[] {\r\n\tconst entities: DocumentationEntity[] = []\r\n\r\n\t/* корневые файлы */\r\n\tfiles\r\n\t\t.filter(f => f.depth === 1 && f.type === 'file')\r\n\t\t.forEach(file => {\r\n\t\t\tconst type = getEntityType(file, files)\r\n\t\t\tconst meta =\r\n\t\t\t\tmetadata[file.relativePath] || metadata[file.originalRelativePath!]\r\n\t\t\tif (type === 'page') {\r\n\t\t\t\tconst p = makePage(file, meta)\r\n\t\t\t\tif (!isHidden(p)) entities.push(p)\r\n\t\t\t} else if (type === 'button') {\r\n\t\t\t\tconst b = makeButton(file, meta)\r\n\t\t\t\tif (!isHidden(b)) entities.push(b)\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t/* корневые папки (без языковых) */\r\n\tconst processedDirs = new Set<string>()\r\n\tfiles\r\n\t\t.filter(\r\n\t\t\tf =>\r\n\t\t\t\tf.depth === 1 &&\r\n\t\t\t\tf.type === 'directory' &&\r\n\t\t\t\t!LANGUAGE_PATTERN.test(f.name)\r\n\t\t)\r\n\t\t.forEach(dir => {\r\n\t\t\tif (processedDirs.has(dir.relativePath)) return\r\n\t\t\tprocessedDirs.add(dir.relativePath)\r\n\r\n\t\t\tconst type = getEntityType(dir, files)\r\n\t\t\tconst dirPath = dir.relativePath.replace(/\\\\/g, '/')\r\n\t\t\tconst originalDirPath =\r\n\t\t\t\tdir.originalRelativePath?.replace(/\\\\/g, '/') || dirPath\r\n\t\t\tconst meta = metadata[originalDirPath]\r\n\r\n\t\t\tif (type === 'group') {\r\n\t\t\t\tconst g = makeGroup(dir, files, meta, metadata)\r\n\t\t\t\tif (!isHidden(g)) entities.push(g)\r\n\t\t\t} else if (type === 'dropdown') {\r\n\t\t\t\tconst d = makeDropdown(dir, files, meta, metadata)\r\n\t\t\t\tif (!isHidden(d)) entities.push(d)\r\n\t\t\t}\r\n\t\t})\r\n\r\n\treturn entities\r\n}\r\n\r\n/* ================================================================== */\r\n/* 3. фабрики сущностей */\r\n/* ================================================================== */\r\nfunction makePage(\r\n\tfile: FileExtended,\r\n\tmeta?: PageFrontmatter\r\n): DocumentationEntity {\r\n\tconst frontmatter: PageFrontmatter = {\r\n\t\torder: 100,\r\n\t\thidden: false,\r\n\t\tsearchable: true,\r\n\t\t...meta,\r\n\t\ttitle: meta?.title || file.name.replace(/\\.md$/i, ''),\r\n\t}\r\n\treturn { type: 'page', file, frontmatter }\r\n}\r\n\r\nfunction makeButton(\r\n\tfile: FileExtended,\r\n\tmeta?: ButtonSettings\r\n): Extract<DocumentationEntity, { type: 'button' }> {\r\n\tconst settings: ButtonSettings = {\r\n\t\ttype: 'button',\r\n\t\tvariant: meta?.variant || 'page',\r\n\t\torder: meta?.order ?? 100,\r\n\t\thidden: meta?.hidden ?? false,\r\n\t\tsearchable: meta?.searchable ?? false,\r\n\t\tposition: meta?.position || 'sidebar',\r\n\t\ttitle: meta?.title || file.name.replace(BUTTON_PATTERN, ''),\r\n\t\turl: meta?.url,\r\n\t\ttarget: meta?.target,\r\n\t\tstyle: meta?.style,\r\n\t\ticon: meta?.icon,\r\n\t}\r\n\treturn { type: 'button', file, settings } as const\r\n}\r\n\r\nfunction makeGroup(\r\n\tdir: FileExtended,\r\n\tfiles: FileExtended[],\r\n\tdirMeta?: GroupSettings,\r\n\tallMeta: Record<string, any> = {}\r\n): DocumentationEntity {\r\n\tconst settings: GroupSettings = {\r\n\t\torder: 100,\r\n\t\thidden: false,\r\n\t\tsearchable: true,\r\n\t\t...dirMeta,\r\n\t\ttitle:\r\n\t\t\tdirMeta?.title || dir.name.replace(/^\\(group-/, '').replace(/\\)$/, ''),\r\n\t}\r\n\r\n\tconst pages = collectPagesUnder(dir, files, settings, allMeta)\r\n\treturn { type: 'group', folder: dir, pages, settings }\r\n}\r\n\r\nfunction makeDropdown(\r\n\tdir: FileExtended,\r\n\tfiles: FileExtended[],\r\n\tdirMeta?: DropdownSettings,\r\n\tallMeta: Record<string, any> = {}\r\n): DocumentationEntity {\r\n\tconst settings: DropdownSettings = {\r\n\t\torder: 100,\r\n\t\thidden: false,\r\n\t\tsearchable: true,\r\n\t\tdropdown: 'collapsed',\r\n\t\t...dirMeta,\r\n\t\ttitle: dirMeta?.title || dir.name,\r\n\t}\r\n\r\n\tconst pages = collectPagesUnder(dir, files, settings, allMeta)\r\n\treturn { type: 'dropdown', folder: dir, pages, settings }\r\n}\r\n\r\n/* ---------- вспомогательный сбор страниц внутри папки ------------- */\r\nfunction collectPagesUnder(\r\n\tdir: FileExtended,\r\n\tfiles: FileExtended[],\r\n\tdirSettings: GroupSettings | DropdownSettings,\r\n\tallMeta: Record<string, any>\r\n): DocumentationEntity[] {\r\n\treturn files\r\n\t\t.filter(\r\n\t\t\tf =>\r\n\t\t\t\tf.type === 'file' &&\r\n\t\t\t\tf.extension === 'md' &&\r\n\t\t\t\t!BUTTON_PATTERN.test(f.name) &&\r\n\t\t\t\t(f.relativePath.startsWith(dir.relativePath + '/') ||\r\n\t\t\t\t\tf.relativePath.startsWith(dir.relativePath + '\\\\'))\r\n\t\t)\r\n\t\t.map(file => {\r\n\t\t\tconst metaKey = file.originalRelativePath || file.relativePath\r\n\t\t\tconst pageMeta = allMeta[metaKey] as PageFrontmatter | undefined\r\n\r\n\t\t\t// Наследуем только нужные поля, не трогаем title\r\n\t\t\tconst inherited = inheritMeta(pageMeta || {}, {\r\n\t\t\t\torder: dirSettings.order,\r\n\t\t\t\thidden: dirSettings.hidden,\r\n\t\t\t\tsearchable: dirSettings.searchable,\r\n\t\t\t}) as PageFrontmatter\r\n\r\n\t\t\tconst frontmatter: PageFrontmatter = {\r\n\t\t\t\t...inherited,\r\n\t\t\t\ttitle: pageMeta?.title || file.name.replace(/\\.md$/i, ''),\r\n\t\t\t}\r\n\r\n\t\t\treturn { type: 'page' as const, file, frontmatter }\r\n\t\t})\r\n\t\t.filter(p => !isHidden(p))\r\n}\r\n","import { MarkdownViewerLazy as MarkdownViewer } from '@/components/doc-page/markdown-viewer.lazy'\r\nimport {\r\n\tErrorsList,\r\n\ttype DocumentationError,\r\n} from '@/components/errors-list/errors-list'\r\nimport { LanguageToggle } from '@/components/language-toggle'\r\nimport { Logo } from '@/components/logo'\r\nimport { SearchBar } from '@/components/search-bar'\r\nimport { AppSidebar } from '@/components/sidebar/sidebar'\r\nimport { ThemeToggle } from '@/components/theme-toggle'\r\nimport { Separator } from '@/components/ui/separator'\r\nimport {\r\n\tSidebarInset,\r\n\tSidebarProvider,\r\n\tSidebarTrigger,\r\n} from '@/components/ui/sidebar'\r\nimport { useDocumentationRouter } from '@/hooks/useDocumentationRouter'\r\nimport { parseVersionStructure } from '@/lib/documentation/client-parser'\r\nimport { getAvailableLanguages } from '@/lib/documentation/helpers'\r\nimport type { VersionStructure } from '@/lib/documentation/types'\r\nimport { errorBuilder } from '@/lib/errorBuilder/error-builder'\r\nimport { ScanResult } from '@/plugin'\r\nimport { useEffect, useMemo, useState } from 'react'\r\nimport { DocumentationProps } from '../types/DocumentationProps'\r\nexport function Documentation({\r\n\ttitle = 'Documentation',\r\n\tuseToggleTheme = false,\r\n\tuseToggleLanguage = false,\r\n\tuseSearch = false,\r\n\tlogo = <Logo className='h-10 w-10' />,\r\n\tfolderPath = 'docs',\r\n\tlogTreeFiles = {},\r\n\tversionSelect = false,\r\n}: Readonly<DocumentationProps>) {\r\n\tconst [scannedFiles, setScannedFiles] = useState<ScanResult>()\r\n\tconst [receivedErrors, setReceivedErrors] = useState<DocumentationError[]>([])\r\n\tconst [documentationStructure, setDocumentationStructure] = useState<\r\n\t\tVersionStructure[]\r\n\t>([])\r\n\tconst [selectedVersion, setSelectedVersion] = useState<string | undefined>()\r\n\r\n\t// Ключи для localStorage\r\n\tconst versionStorageKey = `dock-rush-version-${folderPath}`\r\n\tconst languageStorageKey = `dock-rush-language-${folderPath}`\r\n\r\n\t// Используем хук для синхронизации URL с выбранной страницей\r\n\tconst [currentPage, setCurrentPage] = useDocumentationRouter(folderPath)\r\n\r\n\t// Состояние для выбранного языка\r\n\tconst [selectedLanguage, setSelectedLanguage] = useState<string | null>(\r\n\t\t() => {\r\n\t\t\tif (typeof window !== 'undefined') {\r\n\t\t\t\tconst saved = localStorage.getItem(languageStorageKey)\r\n\t\t\t\treturn saved || null\r\n\t\t\t}\r\n\t\t\treturn null\r\n\t\t}\r\n\t)\r\n\r\n\t// Получаем выбранную версию из localStorage или используем первую доступную\r\n\tuseEffect(() => {\r\n\t\tif (scannedFiles?.versions && scannedFiles.versions.length > 0) {\r\n\t\t\tif (versionStorageKey && typeof window !== 'undefined') {\r\n\t\t\t\tconst saved = localStorage.getItem(versionStorageKey)\r\n\t\t\t\tif (saved && scannedFiles.versions.includes(saved)) {\r\n\t\t\t\t\tsetSelectedVersion(saved)\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tsetSelectedVersion(scannedFiles.versions[0])\r\n\t\t}\r\n\t}, [scannedFiles?.versions, versionStorageKey])\r\n\r\n\t// URL теперь синхронизируется автоматически через useDocumentationRouter\r\n\r\n\t// Сохраняем selectedLanguage в localStorage при изменении\r\n\tuseEffect(() => {\r\n\t\tif (typeof window !== 'undefined') {\r\n\t\t\tif (selectedLanguage) {\r\n\t\t\t\tlocalStorage.setItem(languageStorageKey, selectedLanguage)\r\n\t\t\t} else {\r\n\t\t\t\tlocalStorage.removeItem(languageStorageKey)\r\n\t\t\t}\r\n\t\t}\r\n\t}, [selectedLanguage, languageStorageKey])\r\n\r\n\t// Стабилизируем массив ignore, чтобы избежать бесконечных циклов\r\n\tconst ignoreArray = useMemo(\r\n\t\t() => logTreeFiles.ignore || [],\r\n\t\t[JSON.stringify(logTreeFiles.ignore || [])]\r\n\t)\r\n\r\n\tuseEffect(() => {\r\n\t\t// Триггерим нодовый сканер через dev‑сервер (Vite‑плагин в template/vite.config.ts)\r\n\t\tif (!folderPath) return\r\n\t\tconst params = new URLSearchParams()\r\n\t\tparams.set('folderPath', folderPath)\r\n\t\tparams.set('console', String(logTreeFiles.console ?? false))\r\n\t\tif (logTreeFiles.consoleFormat) {\r\n\t\t\tparams.set('consoleFormat', logTreeFiles.consoleFormat)\r\n\t\t}\r\n\t\tlogTreeFiles.ignore?.forEach(pattern => {\r\n\t\t\tparams.append('ignore', pattern)\r\n\t\t})\r\n\r\n\t\t// Получение отсканированных файлов\r\n\t\tconst scanFolder = async () => {\r\n\t\t\ttry {\r\n\t\t\t\tconst response = await fetch(`/api/dock-rush-scan?${params.toString()}`)\r\n\t\t\t\tconst files = await response.json()\r\n\t\t\t\tsetScannedFiles(files)\r\n\t\t\t} catch (error) {\r\n\t\t\t\t// Игнорируем ошибки сканирования\r\n\t\t\t}\r\n\t\t}\r\n\t\tscanFolder()\r\n\t}, [\r\n\t\tfolderPath,\r\n\t\tlogTreeFiles.console,\r\n\t\tlogTreeFiles.consoleFormat,\r\n\t\tignoreArray,\r\n\t])\r\n\r\n\t// Определяем доступные языки и устанавливаем язык по умолчанию\r\n\tuseEffect(() => {\r\n\t\tif (scannedFiles?.files && scannedFiles?.versions) {\r\n\t\t\t// Проверяем, есть ли языки в любой версии\r\n\t\t\tconst allLanguages = new Set<string>()\r\n\t\t\tscannedFiles.versions.forEach(version => {\r\n\t\t\t\tconst languages = getAvailableLanguages(version, scannedFiles.files)\r\n\t\t\t\tlanguages.forEach(lang => allLanguages.add(lang))\r\n\t\t\t})\r\n\r\n\t\t\t// Если есть языки, но язык не выбран, устанавливаем 'ru' по умолчанию\r\n\t\t\tif (allLanguages.size > 0 && !selectedLanguage) {\r\n\t\t\t\tconst defaultLang = allLanguages.has('ru')\r\n\t\t\t\t\t? 'ru'\r\n\t\t\t\t\t: Array.from(allLanguages)[0]\r\n\t\t\t\tsetSelectedLanguage(defaultLang)\r\n\t\t\t\tif (typeof window !== 'undefined') {\r\n\t\t\t\t\tlocalStorage.setItem(languageStorageKey, defaultLang)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}, [scannedFiles, selectedLanguage, languageStorageKey])\r\n\r\n\t// Сканирование на ошибки структуры и парсинг структуры документации\r\n\tuseEffect(() => {\r\n\t\tif (scannedFiles?.files && scannedFiles?.versions) {\r\n\t\t\tsetReceivedErrors(errorBuilder(scannedFiles.files))\r\n\r\n\t\t\t// Парсим структуру для каждой версии\r\n\t\t\tconst structures: VersionStructure[] = scannedFiles.versions.map(\r\n\t\t\t\tversion => {\r\n\t\t\t\t\tconst languages = getAvailableLanguages(version, scannedFiles.files)\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tversion,\r\n\t\t\t\t\t\tentities: parseVersionStructure(\r\n\t\t\t\t\t\t\tversion,\r\n\t\t\t\t\t\t\tscannedFiles.files,\r\n\t\t\t\t\t\t\tselectedLanguage,\r\n\t\t\t\t\t\t\tscannedFiles.metadata\r\n\t\t\t\t\t\t),\r\n\t\t\t\t\t\tlanguages: languages.length > 0 ? languages : undefined,\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t)\r\n\t\t\tsetDocumentationStructure(structures)\r\n\r\n\t\t\t// Проверяем, существует ли текущая страница из URL в структуре\r\n\t\t\tif (currentPage) {\r\n\t\t\t\t// Нормализуем путь для сравнения (заменяем обратные слэши на прямые)\r\n\t\t\t\tconst normalizedCurrentPage = currentPage.replace(/\\\\/g, '/')\r\n\r\n\t\t\t\tconst allFiles = scannedFiles.files.filter(file => {\r\n\t\t\t\t\tconst normalizedRelative = file.relativePath?.replace(/\\\\/g, '/')\r\n\t\t\t\t\tconst normalizedOriginal = file.originalRelativePath?.replace(\r\n\t\t\t\t\t\t/\\\\/g,\r\n\t\t\t\t\t\t'/'\r\n\t\t\t\t\t)\r\n\t\t\t\t\tconst normalizedPath = file.path?.replace(/\\\\/g, '/')\r\n\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\tnormalizedRelative === normalizedCurrentPage ||\r\n\t\t\t\t\t\tnormalizedOriginal === normalizedCurrentPage ||\r\n\t\t\t\t\t\tnormalizedPath === normalizedCurrentPage\r\n\t\t\t\t\t)\r\n\t\t\t\t})\r\n\r\n\t\t\t\tif (allFiles.length === 0) {\r\n\t\t\t\t\t// Страница не найдена, очищаем URL\r\n\t\t\t\t\tsetCurrentPage(null)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}, [scannedFiles, currentPage, selectedLanguage, setCurrentPage])\r\n\r\n\tif (receivedErrors.length > 0) {\r\n\t\treturn (\r\n\t\t\t<div className='flex flex-1 flex-col gap-4 p-6'>\r\n\t\t\t\t<ErrorsList errors={receivedErrors} />\r\n\t\t\t</div>\r\n\t\t)\r\n\t}\r\n\r\n\treturn (\r\n\t\t<SidebarProvider className='h-screen overflow-hidden'>\r\n\t\t\t<AppSidebar\r\n\t\t\t\ttitle={title}\r\n\t\t\t\tlogo={logo}\r\n\t\t\t\tversionSelect={versionSelect}\r\n\t\t\t\tversions={scannedFiles?.versions || []}\r\n\t\t\t\tdocumentationStructure={documentationStructure}\r\n\t\t\t\tonPageSelect={setCurrentPage}\r\n\t\t\t\tversionStorageKey={versionStorageKey}\r\n\t\t\t/>\r\n\t\t\t<SidebarInset>\r\n\t\t\t\t<header className='flex h-16 shrink-0 items-center justify-between gap-2 border-b px-3'>\r\n\t\t\t\t\t<div className='flex items-center gap-2'>\r\n\t\t\t\t\t\t<SidebarTrigger />\r\n\t\t\t\t\t\t<Separator orientation='vertical' className='mr-2 h-4' />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div className='flex items-center gap-2'>\r\n\t\t\t\t\t\t{useSearch && documentationStructure.length > 0 && (\r\n\t\t\t\t\t\t\t<SearchBar\r\n\t\t\t\t\t\t\t\tdocumentationStructure={documentationStructure}\r\n\t\t\t\t\t\t\t\tselectedVersion={selectedVersion}\r\n\t\t\t\t\t\t\t\tselectedLanguage={selectedLanguage}\r\n\t\t\t\t\t\t\t\tonPageSelect={setCurrentPage}\r\n\t\t\t\t\t\t\t\tscannedFiles={scannedFiles}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{useToggleLanguage && documentationStructure.length > 0 && (\r\n\t\t\t\t\t\t\t<LanguageToggle\r\n\t\t\t\t\t\t\t\tlanguages={documentationStructure\r\n\t\t\t\t\t\t\t\t\t.flatMap(s => s.languages || [])\r\n\t\t\t\t\t\t\t\t\t.filter((lang, index, arr) => arr.indexOf(lang) === index)}\r\n\t\t\t\t\t\t\t\tselectedLanguage={selectedLanguage}\r\n\t\t\t\t\t\t\t\tonLanguageChange={lang => {\r\n\t\t\t\t\t\t\t\t\tsetSelectedLanguage(lang)\r\n\t\t\t\t\t\t\t\t\t// При смене языка очищаем выбранную страницу и URL\r\n\t\t\t\t\t\t\t\t\tsetCurrentPage(null)\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{useToggleTheme && <ThemeToggle />}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</header>\r\n\t\t\t\t<main className='overflow-auto'>\r\n\t\t\t\t\t{currentPage ? (\r\n\t\t\t\t\t\t<div className='animate-in fade-in-0 duration-300'>\r\n\t\t\t\t\t\t\t<MarkdownViewer\r\n\t\t\t\t\t\t\t\tfilePath={currentPage}\r\n\t\t\t\t\t\t\t\tfolderPath={folderPath}\r\n\t\t\t\t\t\t\t\tonPageSelect={setCurrentPage}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<div className='flex flex-1 items-center justify-center p-12 animate-in fade-in-0 duration-300'>\r\n\t\t\t\t\t\t\t<div className='text-center'>\r\n\t\t\t\t\t\t\t\t<Logo className='mx-auto mb-4 h-12 w-12 text-muted-foreground' />\r\n\t\t\t\t\t\t\t\t<h2 className='mb-2 text-2xl font-semibold'>\r\n\t\t\t\t\t\t\t\t\tДобро пожаловать\r\n\t\t\t\t\t\t\t\t</h2>\r\n\t\t\t\t\t\t\t\t<p className='text-muted-foreground'>\r\n\t\t\t\t\t\t\t\t\tВыберите страницу документации из бокового меню\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</main>\r\n\t\t\t</SidebarInset>\r\n\t\t</SidebarProvider>\r\n\t)\r\n}\r\n"],"mappings":"qmBAAA,SAASA,GAAE,EAAE,CAAC,IAAI,EAAEC,EAAEC,EAAE,GAAG,GAAa,OAAO,GAAjB,UAA8B,OAAO,GAAjB,SAAmBA,GAAG,UAAoB,OAAO,GAAjB,SAAmB,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,IAAIC,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,EAAEA,EAAE,IAAI,EAAE,CAAC,IAAIF,EAAED,GAAE,EAAE,CAAC,CAAC,KAAKE,IAAIA,GAAG,KAAKA,GAAGD,EAAE,KAAM,KAAIA,KAAK,EAAE,EAAEA,CAAC,IAAIC,IAAIA,GAAG,KAAKA,GAAGD,GAAG,OAAOC,CAAC,CAAQ,SAASE,IAAM,CAAC,QAAQ,EAAE,EAAEH,EAAE,EAAEC,EAAE,GAAGC,EAAE,UAAU,OAAOF,EAAEE,EAAEF,KAAK,EAAE,UAAUA,CAAC,KAAK,EAAED,GAAE,CAAC,KAAKE,IAAIA,GAAG,KAAKA,GAAG,GAAG,OAAOA,CAAC,CAA/W,IAAAG,GAAAC,GAAA,QCAA,IAGaC,GCqBPC,GASAC,GAYAC,GAEAC,GAEOC,GA4CPC,GA6CAC,GAaOC,GAMPC,GAcAC,GAcAC,GAwBAC,GAUAC,GAmBAC,GAcAC,GAoBAC,GCxQOC,GCHPC,GAGAC,GAcOC,GCfAC,GCCAC,GCLPC,GAEOC,GCQAC,GAiBPC,GCpBOC,GCRPC,GAEOC,ECJPC,GACAC,GACAC,GACAC,GACAC,GAEAC,GAEAC,GACAC,GAGOC,GAEAC,EAEAC,GAEAC,GAEAC,GAEAC,GAEPC,GAMAC,GAEAC,GAEAC,GAEOC,GAGAC,GAEAC,EAEAC,GAGAC,GAGAC,GAGAC,GAEAC,GAGAC,EAEAC,GAGAC,GAGAC,GAGAC,GAEAC,GAGAC,GAKPC,GAkBAC,GAmBAC,GAEAC,GAEAC,GAEAC,GAEAC,GAEAC,GAEAC,GCrGOC,GGvBAC,GdHbC,GAAAC,GAAA,KAGa3E,GAAeA,CACxB4E,EACAC,IACoB,CAEpB,IAAMC,EAA2B,IAAIC,MAAMH,EAAOI,OAASH,EAAOG,MAAM,EACxE,QAASC,EAAI,EAAGA,EAAIL,EAAOI,OAAQC,IAC/BH,EAAcG,CAAC,EAAIL,EAAOK,CAAC,EAE/B,QAASA,EAAI,EAAGA,EAAIJ,EAAOG,OAAQC,IAC/BH,EAAcF,EAAOI,OAASC,CAAC,EAAIJ,EAAOI,CAAC,EAE/C,OAAOH,CACX,ECQM7E,GAA6BA,CAC/BiF,EACAC,KACwB,CACxBD,aAAAA,EACAC,UAAAA,CACH,GAGKjF,GAAwBA,CAC1BkF,EAAyC,IAAIC,IAC7CC,EAA4C,KAC5CJ,KACmB,CACnBE,SAAAA,EACAE,WAAAA,EACAJ,aAAAA,CACH,GAIK/E,GAA+C,CAAA,EAE/CC,GAA4B,cAErBC,GAAyBkF,GAAqB,CACvD,IAAMC,EAAWhF,GAAe+E,CAAM,EAChC,CAAEE,uBAAAA,EAAwBC,+BAAAA,CAA8B,EAAKH,EAoCnE,MAAO,CACHI,gBAnCqBC,GAAqB,CAC1C,GAAIA,EAAUC,WAAW,GAAG,GAAKD,EAAUE,SAAS,GAAG,EACnD,OAAOvF,GAA+BqF,CAAS,EAGnD,IAAMG,EAAaH,EAAUI,MAAMC,GAAoB,EAEjDC,EAAaH,EAAW,CAAC,IAAM,IAAMA,EAAWf,OAAS,EAAI,EAAI,EACvE,OAAO1E,GAAkByF,EAAYG,EAAYV,CAAQ,CAC7D,EA2BIW,4BAzBgCA,CAChCjB,EACAkB,IAC6B,CAC7B,GAAIA,EAAoB,CACpB,IAAMC,EAAoBX,EAA+BR,CAAY,EAC/DoB,EAAgBb,EAAuBP,CAAY,EAEzD,OAAImB,EACIC,EAEOtG,GAAasG,EAAeD,CAAiB,EAGjDA,EAGJC,GAAiBnG,EAC5B,CAEA,OAAOsF,EAAuBP,CAAY,GAAK/E,EACnD,EAMJ,EAEMG,GAAoBA,CACtByF,EACAG,EACAK,IAC8B,CAE9B,GADyBR,EAAWf,OAASkB,IACpB,EACrB,OAAOK,EAAgBrB,aAG3B,IAAMsB,EAAmBT,EAAWG,CAAU,EACxCO,EAAsBF,EAAgBnB,SAASsB,IAAIF,CAAgB,EAEzE,GAAIC,EAAqB,CACrB,IAAME,EAASrG,GAAkByF,EAAYG,EAAa,EAAGO,CAAmB,EAChF,GAAIE,EAAQ,OAAOA,CACvB,CAEA,IAAMrB,EAAaiB,EAAgBjB,WACnC,GAAIA,IAAe,KACf,OAIJ,IAAMsB,EACFV,IAAe,EACTH,EAAWc,KAAKZ,GAAoB,EACpCF,EAAWe,MAAMZ,CAAU,EAAEW,KAAKZ,GAAoB,EAC1Dc,EAAmBzB,EAAWN,OAEpC,QAASC,EAAI,EAAGA,EAAI8B,EAAkB9B,IAAK,CACvC,IAAM+B,EAAe1B,EAAWL,CAAC,EACjC,GAAI+B,EAAa7B,UAAUyB,CAAS,EAChC,OAAOI,EAAa9B,YAE5B,CAGJ,EAOM3E,GAAkCqF,GACpCA,EAAUkB,MAAM,EAAG,EAAE,EAAEG,QAAQ,GAAG,IAAM,GAClCC,QACC,IAAK,CACF,IAAMC,EAAUvB,EAAUkB,MAAM,EAAG,EAAE,EAC/BM,EAAaD,EAAQF,QAAQ,GAAG,EAChCI,EAAWF,EAAQL,MAAM,EAAGM,CAAU,EAC5C,OAAOC,EAAWjH,GAA4BiH,EAAWH,MAC7D,GAAC,EAKE1G,GAAkB+E,GAAsD,CACjF,GAAM,CAAE+B,MAAAA,EAAOC,YAAAA,CAAW,EAAKhC,EAC/B,OAAO9E,GAAmB8G,EAAaD,CAAK,CAChD,EAGM7G,GAAqBA,CACvB8G,EACAD,IACiB,CACjB,IAAM9B,EAAWtF,GAAqB,EAEtC,QAAWgF,KAAgBqC,EAAa,CACpC,IAAMC,EAAQD,EAAYrC,CAAY,EACtCxE,GAA0B8G,EAAOhC,EAAUN,EAAcoC,CAAK,CAClE,CAEA,OAAO9B,CACX,EAEM9E,GAA4BA,CAC9B+G,EACAlB,EACArB,EACAoC,IACA,CACA,IAAMI,EAAMD,EAAWzC,OACvB,QAASC,EAAI,EAAGA,EAAIyC,EAAKzC,IAAK,CAC1B,IAAM0C,EAAkBF,EAAWxC,CAAC,EACpCtE,GAAuBgH,EAAiBpB,EAAiBrB,EAAcoC,CAAK,CAChF,CACJ,EAGM3G,GAAyBA,CAC3BgH,EACApB,EACArB,EACAoC,IACA,CACA,GAAI,OAAOK,GAAoB,SAAU,CACrC/G,GAAwB+G,EAAiBpB,EAAiBrB,CAAY,EACtE,MACJ,CAEA,GAAI,OAAOyC,GAAoB,WAAY,CACvC9G,GAA0B8G,EAAiBpB,EAAiBrB,EAAcoC,CAAK,EAC/E,MACJ,CAEAxG,GACI6G,EACApB,EACArB,EACAoC,CAAK,CAEb,EAEM1G,GAA0BA,CAC5B+G,EACApB,EACArB,IACA,CACA,IAAM0C,EACFD,IAAoB,GAAKpB,EAAkBxF,GAAQwF,EAAiBoB,CAAe,EACvFC,EAAsB1C,aAAeA,CACzC,EAEMrE,GAA4BA,CAC9B8G,EACApB,EACArB,EACAoC,IACA,CACA,GAAItG,GAAc2G,CAAe,EAAG,CAChCjH,GAA0BiH,EAAgBL,CAAK,EAAGf,EAAiBrB,EAAcoC,CAAK,EACtF,MACJ,CAEIf,EAAgBjB,aAAe,OAC/BiB,EAAgBjB,WAAa,CAAA,GAEjCiB,EAAgBjB,WAAWuC,KACvB5H,GAA2BiF,EAAcyC,CAAiC,CAAC,CAEnF,EAEM7G,GAA0BA,CAC5B6G,EACApB,EACArB,EACAoC,IACA,CACA,IAAMQ,EAAUC,OAAOD,QAAQH,CAAe,EACxCD,EAAMI,EAAQ9C,OACpB,QAASC,EAAI,EAAGA,EAAIyC,EAAKzC,IAAK,CAC1B,GAAM,CAAC+C,EAAKC,CAAK,EAAIH,EAAQ7C,CAAC,EAC9BvE,GAA0BuH,EAAOlH,GAAQwF,EAAiByB,CAAG,EAAG9C,EAAcoC,CAAK,CACvF,CACJ,EAEMvG,GAAUA,CAACwF,EAAkC2B,IAAiC,CAChF,IAAIC,EAAU5B,EACR6B,EAAQF,EAAKlC,MAAMC,GAAoB,EACvCyB,EAAMU,EAAMpD,OAElB,QAASC,EAAI,EAAGA,EAAIyC,EAAKzC,IAAK,CAC1B,IAAMoD,EAAOD,EAAMnD,CAAC,EAEhBqD,EAAOH,EAAQ/C,SAASsB,IAAI2B,CAAI,EAC/BC,IACDA,EAAOpI,GAAqB,EAC5BiI,EAAQ/C,SAASmD,IAAIF,EAAMC,CAAI,GAEnCH,EAAUG,CACd,CAEA,OAAOH,CACX,EAGMnH,GAAiBwH,GACnB,kBAAmBA,GAASA,EAAqBxH,gBAAkB,GCzQ1DC,GACTwH,GACsB,CACtB,GAAIA,EAAe,EACf,MAAO,CACH/B,IAAKA,IAAA,GACL6B,IAAKA,IAAK,CAAE,GAIpB,IAAIG,EAAY,EACZC,EAA4BZ,OAAOa,OAAO,IAAI,EAC9CC,EAAoCd,OAAOa,OAAO,IAAI,EAEpDE,EAASA,CAACd,EAAUC,IAAgB,CACtCU,EAAMX,CAAG,EAAIC,EACbS,IAEIA,EAAYD,IACZC,EAAY,EACZG,EAAgBF,EAChBA,EAAQZ,OAAOa,OAAO,IAAI,EAElC,EAEA,MAAO,CACHlC,IAAIsB,EAAG,CACH,IAAIC,EAAQU,EAAMX,CAAG,EAErB,GAAIC,IAAUf,OACV,OAAOe,EAEX,IAAKA,EAAQY,EAAcb,CAAG,KAAOd,OACjC4B,OAAAA,EAAOd,EAAKC,CAAK,EACVA,CAEf,EACAM,IAAIP,EAAKC,EAAK,CACND,KAAOW,EACPA,EAAMX,CAAG,EAAIC,EAEba,EAAOd,EAAKC,CAAK,CAEzB,EAER,EChDM/G,GAA4B,CAAA,EAG5BC,GAAqBA,CACvB4H,EACAC,EACAC,EACAC,EACAC,KACmB,CACnBJ,UAAAA,EACAC,qBAAAA,EACAC,cAAAA,EACAC,6BAAAA,EACAC,WAAAA,CACH,GAEY/H,GAAwBmE,GAAqB,CACtD,GAAM,CAAE6D,OAAAA,EAAQC,2BAAAA,CAA0B,EAAK9D,EAQ3C+D,EAAkB1D,GAAsC,CAExD,IAAMmD,EAAsB,CAAA,EAExBQ,EAAe,EACfC,EAAa,EACbC,EAAgB,EAChBC,EAEEhC,EAAM9B,EAAUZ,OACtB,QAAS2E,EAAQ,EAAGA,EAAQjC,EAAKiC,IAAS,CACtC,IAAMC,EAAmBhE,EAAU+D,CAAK,EAExC,GAAIJ,IAAiB,GAAKC,IAAe,EAAG,CACxC,GAAII,IAAqBC,IAAoB,CACzCd,EAAUlB,KAAKjC,EAAUkB,MAAM2C,EAAeE,CAAK,CAAC,EACpDF,EAAgBE,EAAQ,EACxB,QACJ,CAEA,GAAIC,IAAqB,IAAK,CAC1BF,EAA0BC,EAC1B,QACJ,CACJ,CAEIC,IAAqB,IAAKL,IACrBK,IAAqB,IAAKL,IAC1BK,IAAqB,IAAKJ,IAC1BI,IAAqB,KAAKJ,GACvC,CAEA,IAAMM,EACFf,EAAU/D,SAAW,EAAIY,EAAYA,EAAUkB,MAAM2C,CAAa,EAGlER,EAAgBa,EAChBd,EAAuB,GAEvBc,EAAmChE,SAASiE,GAAkB,GAC9Dd,EAAgBa,EAAmChD,MAAM,EAAG,EAAE,EAC9DkC,EAAuB,IAMvBc,EAAmCjE,WAAWkE,GAAkB,IAEhEd,EAAgBa,EAAmChD,MAAM,CAAC,EAC1DkC,EAAuB,IAG3B,IAAME,EACFQ,GAA2BA,EAA0BD,EAC/CC,EAA0BD,EAC1BvC,OAEV,OAAO/F,GACH4H,EACAC,EACAC,EACAC,CAA4B,CAEpC,EAEA,GAAIE,EAAQ,CACR,IAAMY,EAAaZ,EAASS,IACtBI,EAAyBX,EAC/BA,EAAkB1D,GACdA,EAAUC,WAAWmE,CAAU,EACzBC,EAAuBrE,EAAUkB,MAAMkD,EAAWhF,MAAM,CAAC,EACzD7D,GAAmBD,GAAiB,GAAO0E,EAAWsB,OAAW,EAAI,CACnF,CAEA,GAAImC,EAA4B,CAC5B,IAAMY,EAAyBX,EAC/BA,EAAkB1D,GACdyD,EAA2B,CAAEzD,UAAAA,EAAW0D,eAAgBW,EAAwB,CACxF,CAEA,OAAOX,CACX,EC1GajI,GAAuBkE,GAAqB,CAErD,IAAM2E,EAAkB,IAAI7E,IAG5BE,OAAAA,EAAO4E,wBAAwBC,QAAQ,CAACC,EAAKV,IAAS,CAClDO,EAAgB3B,IAAI8B,EAAK,IAAUV,CAAK,CAC5C,CAAC,EAEOZ,GAA0C,CAC9C,IAAMpC,EAAmB,CAAA,EACrB2D,EAA2B,CAAA,EAG/B,QAASrF,EAAI,EAAGA,EAAI8D,EAAU/D,OAAQC,IAAK,CACvC,IAAMsF,EAAWxB,EAAU9D,CAAC,EAGtBuF,EAAcD,EAAS,CAAC,IAAM,IAC9BE,EAAmBP,EAAgBQ,IAAIH,CAAQ,EAEjDC,GAAeC,GAEXH,EAAetF,OAAS,IACxBsF,EAAeK,KAAI,EACnBhE,EAAOkB,KAAK,GAAGyC,CAAc,EAC7BA,EAAiB,CAAA,GAErB3D,EAAOkB,KAAK0C,CAAQ,GAGpBD,EAAezC,KAAK0C,CAAQ,CAEpC,CAGA,OAAID,EAAetF,OAAS,IACxBsF,EAAeK,KAAI,EACnBhE,EAAOkB,KAAK,GAAGyC,CAAc,GAG1B3D,CACX,CACJ,EC1CarF,GAAqBiE,IAAuB,CACrDoD,MAAO1H,GAA+BsE,EAAOmD,SAAS,EACtDY,eAAgBlI,GAAqBmE,CAAM,EAC3CqF,cAAevJ,GAAoBkE,CAAM,EACzC,GAAGlF,GAAsBkF,CAAM,CAClC,GCVKhE,GAAsB,MAEfC,GAAiBA,CAACqJ,EAAmBC,IAA4B,CAC1E,GAAM,CAAExB,eAAAA,EAAgB3D,gBAAAA,EAAiBQ,4BAAAA,EAA6ByE,cAAAA,CAAa,EAC/EE,EASEC,EAAkC,CAAA,EAClCC,EAAaH,EAAUI,KAAI,EAAGjF,MAAMzE,EAAmB,EAEzDoF,EAAS,GAEb,QAASgD,EAAQqB,EAAWhG,OAAS,EAAG2E,GAAS,EAAGA,GAAS,EAAG,CAC5D,IAAMuB,EAAoBF,EAAWrB,CAAK,EAEpC,CACFR,WAAAA,EACAJ,UAAAA,EACAC,qBAAAA,EACAC,cAAAA,EACAC,6BAAAA,CAA4B,EAC5BI,EAAe4B,CAAiB,EAEpC,GAAI/B,EAAY,CACZxC,EAASuE,GAAqBvE,EAAO3B,OAAS,EAAI,IAAM2B,EAASA,GACjE,QACJ,CAEA,IAAIP,EAAqB,CAAC,CAAC8C,EACvBhE,EAAeS,EACfS,EACM6C,EAAckC,UAAU,EAAGjC,CAA4B,EACvDD,CAAa,EAGvB,GAAI,CAAC/D,EAAc,CACf,GAAI,CAACkB,EAAoB,CAErBO,EAASuE,GAAqBvE,EAAO3B,OAAS,EAAI,IAAM2B,EAASA,GACjE,QACJ,CAIA,GAFAzB,EAAeS,EAAgBsD,CAAa,EAExC,CAAC/D,EAAc,CAEfyB,EAASuE,GAAqBvE,EAAO3B,OAAS,EAAI,IAAM2B,EAASA,GACjE,QACJ,CAEAP,EAAqB,EACzB,CAGA,IAAMgF,EACFrC,EAAU/D,SAAW,EACf,GACA+D,EAAU/D,SAAW,EACnB+D,EAAU,CAAC,EACX6B,EAAc7B,CAAS,EAAElC,KAAK,GAAG,EAEvCwE,EAAarC,EACboC,EAAkBrB,IAClBqB,EAEAE,EAAUD,EAAanG,EAE7B,GAAI6F,EAAsB9D,QAAQqE,CAAO,EAAI,GAEzC,SAGJP,EAAsBlD,KAAKyD,CAAO,EAElC,IAAMC,EAAiBpF,EAA4BjB,EAAckB,CAAkB,EACnF,QAASnB,EAAI,EAAGA,EAAIsG,EAAevG,OAAQ,EAAEC,EAAG,CAC5C,IAAMuC,EAAQ+D,EAAetG,CAAC,EAC9B8F,EAAsBlD,KAAKwD,EAAa7D,CAAK,CACjD,CAGAb,EAASuE,GAAqBvE,EAAO3B,OAAS,EAAI,IAAM2B,EAASA,EACrE,CAEA,OAAOA,CACX,ECjFalF,GAASA,IAAI+J,IAAwC,CAC9D,IAAI7B,EAAQ,EACR8B,EACAC,EACAC,EAAS,GAEb,KAAOhC,EAAQ6B,EAAWxG,SACjByG,EAAWD,EAAW7B,GAAO,KACzB+B,EAAgBhK,GAAQ+J,CAAQ,KACjCE,IAAWA,GAAU,KACrBA,GAAUD,GAItB,OAAOC,CACX,EAEMjK,GAAWkK,GAAwC,CAErD,GAAI,OAAOA,GAAQ,SACf,OAAOA,EAGX,IAAIF,EACAC,EAAS,GAEb,QAASE,EAAI,EAAGA,EAAID,EAAI5G,OAAQ6G,IACxBD,EAAIC,CAAC,IACAH,EAAgBhK,GAAQkK,EAAIC,CAAC,CAA4B,KAC1DF,IAAWA,GAAU,KACrBA,GAAUD,GAKtB,OAAOC,CACX,ECvCahK,GAAsBA,CAC/BmK,KACGC,IACY,CACf,IAAIjB,EACAkB,EACAC,EACAC,EAEEC,EAAqBtB,GAAqB,CAC5C,IAAMtF,EAASwG,EAAiBK,OAC5B,CAACC,EAAgBC,IAAwBA,EAAoBD,CAAc,EAC3EP,EAAiB,CAAe,EAGpChB,OAAAA,EAAcxJ,GAAkBiE,CAAM,EACtCyG,EAAWlB,EAAYnC,MAAMjC,IAC7BuF,EAAWnB,EAAYnC,MAAMJ,IAC7B2D,EAAiBK,EAEVA,EAAc1B,CAAS,CAClC,EAEM0B,EAAiB1B,GAAqB,CACxC,IAAM2B,EAAeR,EAASnB,CAAS,EAEvC,GAAI2B,EACA,OAAOA,EAGX,IAAM7F,EAASnF,GAAeqJ,EAAWC,CAAW,EACpDmB,OAAAA,EAASpB,EAAWlE,CAAM,EAEnBA,CACX,EAEAuF,OAAAA,EAAiBC,EAEV,IAAIM,IAA2BP,EAAezK,GAAO,GAAGgL,CAAI,CAAC,CACxE,EC/CM7K,GAA4E,CAAA,EAErEC,EAITmG,GACa,CACb,IAAM0E,EAAepF,GACjBA,EAAMU,CAAG,GAAKpG,GAElB8K,OAAAA,EAAY1L,cAAgB,GAErB0L,CACX,EChBM5K,GAAsB,8BACtBC,GAAyB,8BACzBC,GAAgB,aAChBC,GAAkB,mCAClBC,GACF,4HACEC,GAAqB,qDAErBC,GAAc,kEACdC,GACF,+FAESC,GAAc2F,GAAkBjG,GAAc2K,KAAK1E,CAAK,EAExD1F,EAAY0F,GAAkB,CAAC,CAACA,GAAS,CAAC2E,OAAOC,MAAMD,OAAO3E,CAAK,CAAC,EAEpEzF,GAAayF,GAAkB,CAAC,CAACA,GAAS2E,OAAOpK,UAAUoK,OAAO3E,CAAK,CAAC,EAExExF,GAAawF,GAAkBA,EAAMnC,SAAS,GAAG,GAAKvD,EAAS0F,EAAMnB,MAAM,EAAG,EAAE,CAAC,EAEjFpE,GAAgBuF,GAAkBhG,GAAgB0K,KAAK1E,CAAK,EAE5DtF,GAAQA,IAAM,GAErBC,GAAgBqF,GAIlB/F,GAAgByK,KAAK1E,CAAK,GAAK,CAAC9F,GAAmBwK,KAAK1E,CAAK,EAE3DpF,GAAUA,IAAM,GAEhBC,GAAYmF,GAAkB7F,GAAYuK,KAAK1E,CAAK,EAEpDlF,GAAWkF,GAAkB5F,GAAWsK,KAAK1E,CAAK,EAE3CjF,GAAqBiF,GAC9B,CAAC/E,EAAiB+E,CAAK,GAAK,CAACzE,EAAoByE,CAAK,EAE7ChF,GAAmBgF,GAAkBlE,GAAoBkE,EAAO9D,GAAatB,EAAO,EAEpFK,EAAoB+E,GAAkBnG,GAAoB6K,KAAK1E,CAAK,EAEpE9E,GAAqB8E,GAC9BlE,GAAoBkE,EAAO7D,GAAexB,EAAY,EAE7CQ,GAAqB6E,GAC9BlE,GAAoBkE,EAAO5D,GAAe9B,CAAQ,EAEzCc,GAAuB4E,GAChClE,GAAoBkE,EAAOhE,GAAiBpB,EAAO,EAE1CS,GAAoB2E,GAAkBlE,GAAoBkE,EAAO/D,GAAcnB,EAAO,EAEtFQ,GAAqB0E,GAC9BlE,GAAoBkE,EAAO1D,GAAezB,EAAQ,EAEzCU,EAAuByE,GAAkBlG,GAAuB4K,KAAK1E,CAAK,EAE1ExE,GAA6BwE,GACtCjE,GAAuBiE,EAAO7D,EAAa,EAElCV,GAAiCuE,GAC1CjE,GAAuBiE,EAAO3D,EAAiB,EAEtCX,GAA+BsE,GACxCjE,GAAuBiE,EAAOhE,EAAe,EAEpCL,GAA2BqE,GAAkBjE,GAAuBiE,EAAO9D,EAAW,EAEtFN,GAA4BoE,GACrCjE,GAAuBiE,EAAO/D,EAAY,EAEjCJ,GAA6BmE,GACtCjE,GAAuBiE,EAAO1D,GAAe,EAAI,EAI/CR,GAAsBA,CACxBkE,EACA6E,EACAC,IACA,CACA,IAAMpG,EAAS7E,GAAoBkL,KAAK/E,CAAK,EAE7C,OAAItB,EACIA,EAAO,CAAC,EACDmG,EAAUnG,EAAO,CAAC,CAAC,EAGvBoG,EAAUpG,EAAO,CAAC,CAAE,EAGxB,EACX,EAEM3C,GAAyBA,CAC3BiE,EACA6E,EACAG,EAAqB,KACrB,CACA,IAAMtG,EAAS5E,GAAuBiL,KAAK/E,CAAK,EAEhD,OAAItB,EACIA,EAAO,CAAC,EACDmG,EAAUnG,EAAO,CAAC,CAAC,EAEvBsG,EAGJ,EACX,EAIMhJ,GAAmBiJ,GAAkBA,IAAU,YAAcA,IAAU,aAEvEhJ,GAAgBgJ,GAAkBA,IAAU,SAAWA,IAAU,MAEjE/I,GAAe+I,GAAkBA,IAAU,UAAYA,IAAU,QAAUA,IAAU,UAErF9I,GAAiB8I,GAAkBA,IAAU,SAE7C7I,GAAiB6I,GAAkBA,IAAU,SAE7C5I,GAAqB4I,GAAkBA,IAAU,cAEjD3I,GAAiB2I,GAAkBA,IAAU,SCrGtC1I,GAAmBA,IAAK,CAOjC,IAAM2I,EAAatL,EAAU,OAAO,EAC9BuL,EAAYvL,EAAU,MAAM,EAC5BwL,EAAYxL,EAAU,MAAM,EAC5ByL,EAAkBzL,EAAU,aAAa,EACzC0L,EAAgB1L,EAAU,UAAU,EACpC2L,EAAe3L,EAAU,SAAS,EAClC4L,EAAkB5L,EAAU,YAAY,EACxC6L,EAAiB7L,EAAU,WAAW,EACtC8L,EAAe9L,EAAU,SAAS,EAClC+L,EAAc/L,EAAU,QAAQ,EAChCgM,EAAchM,EAAU,QAAQ,EAChCiM,EAAmBjM,EAAU,cAAc,EAC3CkM,EAAkBlM,EAAU,aAAa,EACzCmM,EAAkBnM,EAAU,aAAa,EACzCoM,EAAYpM,EAAU,MAAM,EAC5BqM,EAAmBrM,EAAU,aAAa,EAC1CsM,EAActM,EAAU,QAAQ,EAChCuM,EAAYvM,EAAU,MAAM,EAC5BwM,EAAexM,EAAU,SAAS,EAUlCyM,EAAaA,IACf,CAAC,OAAQ,QAAS,MAAO,aAAc,OAAQ,OAAQ,QAAS,QAAQ,EACtEC,EAAgBA,IAClB,CACI,SACA,MACA,SACA,OACA,QACA,WAEA,WACA,YAEA,YACA,eAEA,eACA,cAEA,aAAa,EAEfC,EAA6BA,IAC/B,CAAC,GAAGD,EAAa,EAAI/K,EAAqBN,CAAgB,EACxDuL,EAAgBA,IAAM,CAAC,OAAQ,SAAU,OAAQ,UAAW,QAAQ,EACpEC,EAAkBA,IAAM,CAAC,OAAQ,UAAW,MAAM,EAClDC,EAA0BA,IAC5B,CAACnL,EAAqBN,EAAkByK,CAAY,EAClDiB,EAAaA,IAAM,CAACtM,GAAY,OAAQ,OAAQ,GAAGqM,EAAuB,CAAE,EAC5EE,GAA4BA,IAC9B,CAACrM,GAAW,OAAQ,UAAWgB,EAAqBN,CAAgB,EAClE4L,GAA6BA,IAC/B,CACI,OACA,CAAEC,KAAM,CAAC,OAAQvM,GAAWgB,EAAqBN,CAAgB,CAAC,EAClEV,GACAgB,EACAN,CAAgB,EAElB8L,GAA4BA,IAC9B,CAACxM,GAAW,OAAQgB,EAAqBN,CAAgB,EACvD+L,GAAwBA,IAC1B,CAAC,OAAQ,MAAO,MAAO,KAAMzL,EAAqBN,CAAgB,EAChEgM,GAAwBA,IAC1B,CACI,QACA,MACA,SACA,UACA,SACA,SACA,UACA,WACA,cACA,UAAU,EAEZC,GAA0BA,IAC5B,CAAC,QAAS,MAAO,SAAU,UAAW,cAAe,UAAU,EAC7DC,EAAcA,IAAM,CAAC,OAAQ,GAAGT,EAAuB,CAAE,EACzDU,GAAcA,IAChB,CACI/M,GACA,OACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,GAAGqM,EAAuB,CAAE,EAE9BW,EAAaA,IAAM,CAACnC,EAAY3J,EAAqBN,CAAgB,EACrEqM,GAAkBA,IACpB,CACI,GAAGhB,EAAa,EAChB5K,GACAN,GACA,CAAEmM,SAAU,CAAChM,EAAqBN,CAAgB,CAAC,CAAE,EAEvDuM,GAAgBA,IAAM,CAAC,YAAa,CAAEC,OAAQ,CAAC,GAAI,IAAK,IAAK,QAAS,OAAO,CAAC,CAAE,EAChFC,GAAcA,IAChB,CACI,OACA,QACA,UACA/L,GACAX,GACA,CAAE2M,KAAM,CAACpM,EAAqBN,CAAgB,CAAC,CAAE,EAEnD2M,GAA4BA,IAC9B,CAACpN,GAAWgB,GAA2BN,EAAiB,EACtD2M,EAAcA,IAChB,CAEI,GACA,OACA,OACAlC,EACApK,EACAN,CAAgB,EAElB6M,GAAmBA,IACrB,CAAC,GAAIxN,EAAUkB,GAA2BN,EAAiB,EACzD6M,GAAiBA,IAAM,CAAC,QAAS,SAAU,SAAU,QAAQ,EAC7DC,GAAiBA,IACnB,CACI,SACA,WACA,SACA,UACA,SACA,UACA,cACA,aACA,aACA,aACA,aACA,YACA,MACA,aACA,QACA,YAAY,EAEdC,EAAyBA,IAC3B,CAAC3N,EAAUE,GAAWkB,GAA6BN,EAAmB,EACpE8M,GAAYA,IACd,CAEI,GACA,OACAlC,EACAzK,EACAN,CAAgB,EAElBkN,GAAcA,IAAM,CAAC,OAAQ7N,EAAUiB,EAAqBN,CAAgB,EAC5EmN,GAAaA,IAAM,CAAC,OAAQ9N,EAAUiB,EAAqBN,CAAgB,EAC3EoN,GAAYA,IAAM,CAAC/N,EAAUiB,EAAqBN,CAAgB,EAClEqN,GAAiBA,IAAM,CAACjO,GAAY,OAAQ,GAAGqM,EAAuB,CAAE,EAE9E,MAAO,CACHjG,UAAW,IACXpB,MAAO,CACHkJ,QAAS,CAAC,OAAQ,OAAQ,QAAS,QAAQ,EAC3CC,OAAQ,CAAC,OAAO,EAChBC,KAAM,CAAChO,EAAY,EACnBiO,WAAY,CAACjO,EAAY,EACzBkO,MAAO,CAACjO,EAAK,EACbkO,UAAW,CAACnO,EAAY,EACxB,cAAe,CAACA,EAAY,EAC5BoO,KAAM,CAAC,KAAM,MAAO,QAAQ,EAC5BC,KAAM,CAAC/N,EAAiB,EACxB,cAAe,CACX,OACA,aACA,QACA,SACA,SACA,WACA,OACA,YACA,OAAO,EAEX,eAAgB,CAACN,EAAY,EAC7BsO,QAAS,CAAC,OAAQ,QAAS,OAAQ,SAAU,UAAW,OAAO,EAC/DC,YAAa,CAAC,WAAY,OAAQ,SAAU,WAAY,UAAW,MAAM,EACzEC,OAAQ,CAACxO,EAAY,EACrByO,OAAQ,CAACzO,EAAY,EACrB0O,QAAS,CAAC,KAAM7O,CAAQ,EACxB8O,KAAM,CAAC3O,EAAY,EACnB,cAAe,CAACA,EAAY,EAC5B4O,SAAU,CAAC,UAAW,QAAS,SAAU,OAAQ,QAAS,QAAQ,CACrE,EACD/J,YAAa,CASTkJ,OAAQ,CACJ,CACIA,OAAQ,CACJ,OACA,SACAnO,GACAY,EACAM,EACA2K,CAAW,CAElB,CAAA,EAOL0C,UAAW,CAAC,WAAW,EAKvBU,QAAS,CACL,CAAEA,QAAS,CAAChP,EAAUW,EAAkBM,EAAqBkK,CAAc,CAAC,CAAE,EAMlF,cAAe,CAAC,CAAE,cAAeY,EAAU,CAAE,CAAE,EAK/C,eAAgB,CAAC,CAAE,eAAgBA,EAAU,CAAE,CAAE,EAKjD,eAAgB,CAAC,CAAE,eAAgB,CAAC,OAAQ,QAAS,aAAc,cAAc,EAAG,EAKpF,iBAAkB,CAAC,CAAE,iBAAkB,CAAC,QAAS,OAAO,CAAC,CAAE,EAK3DkD,IAAK,CAAC,CAAEA,IAAK,CAAC,SAAU,SAAS,CAAC,CAAE,EAKpCC,QAAS,CACL,QACA,eACA,SACA,OACA,cACA,QACA,eACA,gBACA,aACA,eACA,qBACA,qBACA,qBACA,kBACA,YACA,YACA,OACA,cACA,WACA,YACA,QAAQ,EAMZC,GAAI,CAAC,UAAW,aAAa,EAK7BC,MAAO,CAAC,CAAEA,MAAO,CAAC,QAAS,OAAQ,OAAQ,QAAS,KAAK,EAAG,EAK5DC,MAAO,CAAC,CAAEA,MAAO,CAAC,OAAQ,QAAS,OAAQ,OAAQ,QAAS,KAAK,EAAG,EAKpEC,UAAW,CAAC,UAAW,gBAAgB,EAKvC,aAAc,CAAC,CAAEC,OAAQ,CAAC,UAAW,QAAS,OAAQ,OAAQ,YAAY,EAAG,EAK7E,kBAAmB,CAAC,CAAEA,OAAQtD,EAA0B,CAAE,CAAE,EAK5DuD,SAAU,CAAC,CAAEA,SAAUtD,EAAa,CAAE,CAAE,EAKxC,aAAc,CAAC,CAAE,aAAcA,EAAa,CAAE,CAAE,EAKhD,aAAc,CAAC,CAAE,aAAcA,EAAa,CAAE,CAAE,EAKhDuD,WAAY,CAAC,CAAEA,WAAYtD,EAAe,CAAE,CAAE,EAK9C,eAAgB,CAAC,CAAE,eAAgBA,EAAe,CAAE,CAAE,EAKtD,eAAgB,CAAC,CAAE,eAAgBA,EAAe,CAAE,CAAE,EAKtDc,SAAU,CAAC,SAAU,QAAS,WAAY,WAAY,QAAQ,EAK9DyC,MAAO,CAAC,CAAEA,MAAOrD,EAAU,CAAE,CAAE,EAK/B,UAAW,CAAC,CAAE,UAAWA,EAAU,CAAE,CAAE,EAKvC,UAAW,CAAC,CAAE,UAAWA,EAAU,CAAE,CAAE,EAKvCsD,MAAO,CAAC,CAAEA,MAAOtD,EAAU,CAAE,CAAE,EAK/BuD,IAAK,CAAC,CAAEA,IAAKvD,EAAU,CAAE,CAAE,EAK3BwD,IAAK,CAAC,CAAEA,IAAKxD,EAAU,CAAE,CAAE,EAK3ByD,MAAO,CAAC,CAAEA,MAAOzD,EAAU,CAAE,CAAE,EAK/B0D,OAAQ,CAAC,CAAEA,OAAQ1D,EAAU,CAAE,CAAE,EAKjC2D,KAAM,CAAC,CAAEA,KAAM3D,EAAU,CAAE,CAAE,EAK7B4D,WAAY,CAAC,UAAW,YAAa,UAAU,EAK/CC,EAAG,CAAC,CAAEA,EAAG,CAACjQ,GAAW,OAAQgB,EAAqBN,CAAgB,EAAG,EAUrEwP,MAAO,CACH,CACIA,MAAO,CACHpQ,GACA,OACA,OACAoL,EACA,GAAGiB,EAAuB,CAAE,CAEnC,CAAA,EAML,iBAAkB,CAAC,CAAEgE,KAAM,CAAC,MAAO,cAAe,MAAO,aAAa,EAAG,EAKzE,YAAa,CAAC,CAAEA,KAAM,CAAC,SAAU,OAAQ,cAAc,EAAG,EAK1DA,KAAM,CAAC,CAAEA,KAAM,CAACpQ,EAAUD,GAAY,OAAQ,UAAW,OAAQY,CAAgB,EAAG,EAKpF0P,KAAM,CAAC,CAAEA,KAAM,CAAC,GAAIrQ,EAAUiB,EAAqBN,CAAgB,EAAG,EAKtE2P,OAAQ,CAAC,CAAEA,OAAQ,CAAC,GAAItQ,EAAUiB,EAAqBN,CAAgB,EAAG,EAK1E4P,MAAO,CACH,CACIA,MAAO,CACHtQ,GACA,QACA,OACA,OACAgB,EACAN,CAAgB,CAEvB,CAAA,EAML,YAAa,CAAC,CAAE,YAAa2L,GAAyB,CAAE,CAAE,EAK1D,gBAAiB,CAAC,CAAEkE,IAAKjE,GAA0B,CAAE,CAAE,EAKvD,YAAa,CAAC,CAAE,YAAaE,GAAyB,CAAE,CAAE,EAK1D,UAAW,CAAC,CAAE,UAAWA,GAAyB,CAAE,CAAE,EAKtD,YAAa,CAAC,CAAE,YAAaH,GAAyB,CAAE,CAAE,EAK1D,gBAAiB,CAAC,CAAEmE,IAAKlE,GAA0B,CAAE,CAAE,EAKvD,YAAa,CAAC,CAAE,YAAaE,GAAyB,CAAE,CAAE,EAK1D,UAAW,CAAC,CAAE,UAAWA,GAAyB,CAAE,CAAE,EAKtD,YAAa,CAAC,CAAE,YAAa,CAAC,MAAO,MAAO,QAAS,YAAa,WAAW,EAAG,EAKhF,YAAa,CAAC,CAAE,YAAaC,GAAqB,CAAE,CAAE,EAKtD,YAAa,CAAC,CAAE,YAAaA,GAAqB,CAAE,CAAE,EAKtDgE,IAAK,CAAC,CAAEA,IAAKtE,EAAuB,CAAE,CAAE,EAKxC,QAAS,CAAC,CAAE,QAASA,EAAuB,CAAE,CAAE,EAKhD,QAAS,CAAC,CAAE,QAASA,EAAuB,CAAE,CAAE,EAKhD,kBAAmB,CAAC,CAAEuE,QAAS,CAAC,GAAGhE,GAAqB,EAAI,QAAQ,EAAG,EAKvE,gBAAiB,CAAC,CAAE,gBAAiB,CAAC,GAAGC,GAAuB,EAAI,QAAQ,EAAG,EAK/E,eAAgB,CAAC,CAAE,eAAgB,CAAC,OAAQ,GAAGA,GAAuB,CAAE,EAAG,EAK3E,gBAAiB,CAAC,CAAEhI,QAAS,CAAC,SAAU,GAAG+H,GAAqB,CAAE,EAAG,EAKrE,cAAe,CAAC,CAAEiE,MAAO,CAAC,GAAGhE,GAAuB,EAAI,CAAEiE,SAAU,CAAC,GAAI,MAAM,CAAC,CAAE,CAAC,CAAE,EAKrF,aAAc,CACV,CAAEC,KAAM,CAAC,OAAQ,GAAGlE,GAAuB,EAAI,CAAEiE,SAAU,CAAC,GAAI,MAAM,CAAC,CAAE,CAAC,CAAE,EAMhF,gBAAiB,CAAC,CAAE,gBAAiBlE,GAAqB,CAAE,CAAE,EAK9D,cAAe,CAAC,CAAE,cAAe,CAAC,GAAGC,GAAuB,EAAI,UAAU,EAAG,EAK7E,aAAc,CAAC,CAAE,aAAc,CAAC,OAAQ,GAAGA,GAAuB,CAAE,EAAG,EAMvEmE,EAAG,CAAC,CAAEA,EAAG3E,EAAuB,CAAE,CAAE,EAKpC4E,GAAI,CAAC,CAAEA,GAAI5E,EAAuB,CAAE,CAAE,EAKtC6E,GAAI,CAAC,CAAEA,GAAI7E,EAAuB,CAAE,CAAE,EAKtC8E,GAAI,CAAC,CAAEA,GAAI9E,EAAuB,CAAE,CAAE,EAKtC+E,GAAI,CAAC,CAAEA,GAAI/E,EAAuB,CAAE,CAAE,EAKtCgF,GAAI,CAAC,CAAEA,GAAIhF,EAAuB,CAAE,CAAE,EAKtCiF,GAAI,CAAC,CAAEA,GAAIjF,EAAuB,CAAE,CAAE,EAKtCkF,GAAI,CAAC,CAAEA,GAAIlF,EAAuB,CAAE,CAAE,EAKtCmF,GAAI,CAAC,CAAEA,GAAInF,EAAuB,CAAE,CAAE,EAKtCoF,EAAG,CAAC,CAAEA,EAAG3E,EAAW,CAAE,CAAE,EAKxB4E,GAAI,CAAC,CAAEA,GAAI5E,EAAW,CAAE,CAAE,EAK1B6E,GAAI,CAAC,CAAEA,GAAI7E,EAAW,CAAE,CAAE,EAK1B8E,GAAI,CAAC,CAAEA,GAAI9E,EAAW,CAAE,CAAE,EAK1B+E,GAAI,CAAC,CAAEA,GAAI/E,EAAW,CAAE,CAAE,EAK1BgF,GAAI,CAAC,CAAEA,GAAIhF,EAAW,CAAE,CAAE,EAK1BiF,GAAI,CAAC,CAAEA,GAAIjF,EAAW,CAAE,CAAE,EAK1BkF,GAAI,CAAC,CAAEA,GAAIlF,EAAW,CAAE,CAAE,EAK1BmF,GAAI,CAAC,CAAEA,GAAInF,EAAW,CAAE,CAAE,EAK1B,UAAW,CAAC,CAAE,UAAWT,EAAuB,CAAE,CAAE,EAKpD,kBAAmB,CAAC,iBAAiB,EAKrC,UAAW,CAAC,CAAE,UAAWA,EAAuB,CAAE,CAAE,EAKpD,kBAAmB,CAAC,iBAAiB,EAUrCiB,KAAM,CAAC,CAAEA,KAAMP,GAAW,CAAE,CAAE,EAK9BmF,EAAG,CAAC,CAAEA,EAAG,CAAC9G,EAAgB,SAAU,GAAG2B,GAAW,CAAE,EAAG,EAKvD,QAAS,CACL,CACI,QAAS,CACL3B,EACA,SAEA,OACA,GAAG2B,GAAW,CAAE,CAEvB,CAAA,EAML,QAAS,CACL,CACI,QAAS,CACL3B,EACA,SACA,OAEA,QAEA,CAAE+G,OAAQ,CAAChH,CAAe,CAAC,EAC3B,GAAG4B,GAAW,CAAE,CAEvB,CAAA,EAMLqF,EAAG,CAAC,CAAEA,EAAG,CAAC,SAAU,KAAM,GAAGrF,GAAW,CAAE,EAAG,EAK7C,QAAS,CAAC,CAAE,QAAS,CAAC,SAAU,KAAM,OAAQ,GAAGA,GAAW,CAAE,EAAG,EAKjE,QAAS,CAAC,CAAE,QAAS,CAAC,SAAU,KAAM,GAAGA,GAAW,CAAE,EAAG,EAUzD,YAAa,CACT,CAAEgC,KAAM,CAAC,OAAQhE,EAAW5J,GAA2BN,EAAiB,CAAC,CAAE,EAM/E,iBAAkB,CAAC,cAAe,sBAAsB,EAKxD,aAAc,CAAC,SAAU,YAAY,EAKrC,cAAe,CAAC,CAAE4N,KAAM,CAACzD,EAAiB9J,EAAqBJ,EAAiB,EAAG,EAKnF,eAAgB,CACZ,CACI,eAAgB,CACZ,kBACA,kBACA,YACA,iBACA,SACA,gBACA,WACA,iBACA,iBACAX,GACAS,CAAgB,CAEvB,CAAA,EAML,cAAe,CAAC,CAAE6N,KAAM,CAACrN,GAA+BR,EAAkBkK,CAAS,EAAG,EAKtF,aAAc,CAAC,aAAa,EAK5B,cAAe,CAAC,SAAS,EAKzB,mBAAoB,CAAC,cAAc,EAKnC,aAAc,CAAC,cAAe,eAAe,EAK7C,cAAe,CAAC,oBAAqB,cAAc,EAKnD,eAAgB,CAAC,qBAAsB,mBAAmB,EAK1DkE,SAAU,CAAC,CAAEA,SAAU,CAAC/D,EAAe/J,EAAqBN,CAAgB,EAAG,EAK/E,aAAc,CACV,CAAE,aAAc,CAACX,EAAU,OAAQiB,EAAqBJ,EAAiB,CAAC,CAAE,EAMhF4N,QAAS,CACL,CACIA,QAAS,CAELxD,EACA,GAAGmB,EAAuB,CAAE,CAEnC,CAAA,EAML,aAAc,CAAC,CAAE,aAAc,CAAC,OAAQnL,EAAqBN,CAAgB,EAAG,EAKhF,sBAAuB,CAAC,CAAEyR,KAAM,CAAC,SAAU,SAAS,CAAC,CAAE,EAKvD,kBAAmB,CACf,CAAEA,KAAM,CAAC,OAAQ,UAAW,OAAQnR,EAAqBN,CAAgB,CAAC,CAAE,EAMhF,iBAAkB,CAAC,CAAEmO,KAAM,CAAC,OAAQ,SAAU,QAAS,UAAW,QAAS,KAAK,EAAG,EAMnF,oBAAqB,CAAC,CAAEuD,YAAatF,EAAU,CAAE,CAAE,EAKnD,aAAc,CAAC,CAAE+B,KAAM/B,EAAU,CAAE,CAAE,EAKrC,kBAAmB,CAAC,YAAa,WAAY,eAAgB,cAAc,EAK3E,wBAAyB,CAAC,CAAEuF,WAAY,CAAC,GAAG7E,GAAc,EAAI,MAAM,EAAG,EAKvE,4BAA6B,CACzB,CACI6E,WAAY,CACRtS,EACA,YACA,OACAiB,EACAL,EAAiB,CAExB,CAAA,EAML,wBAAyB,CAAC,CAAE0R,WAAYvF,EAAU,CAAE,CAAE,EAKtD,mBAAoB,CAChB,CAAE,mBAAoB,CAAC/M,EAAU,OAAQiB,EAAqBN,CAAgB,CAAC,CAAE,EAMrF,iBAAkB,CAAC,YAAa,YAAa,aAAc,aAAa,EAKxE,gBAAiB,CAAC,WAAY,gBAAiB,WAAW,EAK1D,YAAa,CAAC,CAAEmO,KAAM,CAAC,OAAQ,SAAU,UAAW,QAAQ,EAAG,EAK/DyD,OAAQ,CAAC,CAAEA,OAAQnG,EAAuB,CAAE,CAAE,EAK9C,iBAAkB,CACd,CACIoG,MAAO,CACH,WACA,MACA,SACA,SACA,WACA,cACA,MACA,QACAvR,EACAN,CAAgB,CAEvB,CAAA,EAML8R,WAAY,CACR,CAAEA,WAAY,CAAC,SAAU,SAAU,MAAO,WAAY,WAAY,cAAc,CAAC,CAAE,EAMvFC,MAAO,CAAC,CAAEA,MAAO,CAAC,SAAU,QAAS,MAAO,MAAM,EAAG,EAKrDC,KAAM,CAAC,CAAEA,KAAM,CAAC,aAAc,WAAY,QAAQ,EAAG,EAKrDC,QAAS,CAAC,CAAEA,QAAS,CAAC,OAAQ,SAAU,MAAM,EAAG,EAKjDhO,QAAS,CAAC,CAAEA,QAAS,CAAC,OAAQ3D,EAAqBN,CAAgB,EAAG,EAUtE,gBAAiB,CAAC,CAAEkS,GAAI,CAAC,QAAS,QAAS,QAAQ,EAAG,EAKtD,UAAW,CAAC,CAAE,UAAW,CAAC,SAAU,UAAW,UAAW,MAAM,EAAG,EAKnE,YAAa,CAAC,CAAE,YAAa,CAAC,SAAU,UAAW,SAAS,EAAG,EAK/D,cAAe,CAAC,CAAEA,GAAI7F,GAAe,CAAE,CAAE,EAKzC,YAAa,CAAC,CAAE6F,GAAI3F,GAAa,CAAE,CAAE,EAKrC,UAAW,CAAC,CAAE2F,GAAIzF,GAAW,CAAE,CAAE,EAKjC,WAAY,CACR,CACIyF,GAAI,CACA,OACA,CACIC,OAAQ,CACJ,CAAEC,GAAI,CAAC,IAAK,KAAM,IAAK,KAAM,IAAK,KAAM,IAAK,IAAI,CAAC,EAClD9S,GACAgB,EACAN,CAAgB,EAEpBqS,OAAQ,CAAC,GAAI/R,EAAqBN,CAAgB,EAClDsS,MAAO,CAAChT,GAAWgB,EAAqBN,CAAgB,CAC3D,EACDW,GACAP,EAAgB,CAEvB,CAAA,EAML,WAAY,CAAC,CAAE8R,GAAI9F,EAAU,CAAE,CAAE,EAKjC,oBAAqB,CAAC,CAAEmG,KAAM5F,GAAyB,CAAE,CAAE,EAK3D,mBAAoB,CAAC,CAAE6F,IAAK7F,GAAyB,CAAE,CAAE,EAKzD,kBAAmB,CAAC,CAAEyF,GAAIzF,GAAyB,CAAE,CAAE,EAKvD,gBAAiB,CAAC,CAAE4F,KAAMnG,EAAU,CAAE,CAAE,EAKxC,eAAgB,CAAC,CAAEoG,IAAKpG,EAAU,CAAE,CAAE,EAKtC,cAAe,CAAC,CAAEgG,GAAIhG,EAAU,CAAE,CAAE,EAUpCqG,QAAS,CAAC,CAAEA,QAAS7F,EAAW,CAAE,CAAE,EAKpC,YAAa,CAAC,CAAE,YAAaA,EAAW,CAAE,CAAE,EAK5C,YAAa,CAAC,CAAE,YAAaA,EAAW,CAAE,CAAE,EAK5C,YAAa,CAAC,CAAE,YAAaA,EAAW,CAAE,CAAE,EAK5C,YAAa,CAAC,CAAE,YAAaA,EAAW,CAAE,CAAE,EAK5C,YAAa,CAAC,CAAE,YAAaA,EAAW,CAAE,CAAE,EAK5C,YAAa,CAAC,CAAE,YAAaA,EAAW,CAAE,CAAE,EAK5C,aAAc,CAAC,CAAE,aAAcA,EAAW,CAAE,CAAE,EAK9C,aAAc,CAAC,CAAE,aAAcA,EAAW,CAAE,CAAE,EAK9C,aAAc,CAAC,CAAE,aAAcA,EAAW,CAAE,CAAE,EAK9C,aAAc,CAAC,CAAE,aAAcA,EAAW,CAAE,CAAE,EAK9C,aAAc,CAAC,CAAE,aAAcA,EAAW,CAAE,CAAE,EAK9C,aAAc,CAAC,CAAE,aAAcA,EAAW,CAAE,CAAE,EAK9C,aAAc,CAAC,CAAE,aAAcA,EAAW,CAAE,CAAE,EAK9C,aAAc,CAAC,CAAE,aAAcA,EAAW,CAAE,CAAE,EAK9C,WAAY,CAAC,CAAE8F,OAAQ7F,GAAgB,CAAE,CAAE,EAK3C,aAAc,CAAC,CAAE,WAAYA,GAAgB,CAAE,CAAE,EAKjD,aAAc,CAAC,CAAE,WAAYA,GAAgB,CAAE,CAAE,EAKjD,aAAc,CAAC,CAAE,WAAYA,GAAgB,CAAE,CAAE,EAKjD,aAAc,CAAC,CAAE,WAAYA,GAAgB,CAAE,CAAE,EAKjD,aAAc,CAAC,CAAE,WAAYA,GAAgB,CAAE,CAAE,EAKjD,aAAc,CAAC,CAAE,WAAYA,GAAgB,CAAE,CAAE,EAKjD,aAAc,CAAC,CAAE,WAAYA,GAAgB,CAAE,CAAE,EAKjD,aAAc,CAAC,CAAE,WAAYA,GAAgB,CAAE,CAAE,EAKjD,WAAY,CAAC,CAAE,WAAYA,GAAgB,CAAE,CAAE,EAK/C,mBAAoB,CAAC,kBAAkB,EAKvC,WAAY,CAAC,CAAE,WAAYA,GAAgB,CAAE,CAAE,EAK/C,mBAAoB,CAAC,kBAAkB,EAKvC,eAAgB,CAAC,CAAE6F,OAAQ,CAAC,GAAG5F,GAAc,EAAI,SAAU,MAAM,EAAG,EAKpE,eAAgB,CAAC,CAAE6F,OAAQ,CAAC,GAAG7F,GAAc,EAAI,SAAU,MAAM,EAAG,EAKpE,eAAgB,CAAC,CAAE4F,OAAQtG,EAAU,CAAE,CAAE,EAKzC,iBAAkB,CAAC,CAAE,WAAYA,EAAU,CAAE,CAAE,EAK/C,iBAAkB,CAAC,CAAE,WAAYA,EAAU,CAAE,CAAE,EAK/C,iBAAkB,CAAC,CAAE,WAAYA,EAAU,CAAE,CAAE,EAK/C,iBAAkB,CAAC,CAAE,WAAYA,EAAU,CAAE,CAAE,EAK/C,iBAAkB,CAAC,CAAE,WAAYA,EAAU,CAAE,CAAE,EAK/C,iBAAkB,CAAC,CAAE,WAAYA,EAAU,CAAE,CAAE,EAK/C,iBAAkB,CAAC,CAAE,WAAYA,EAAU,CAAE,CAAE,EAK/C,iBAAkB,CAAC,CAAE,WAAYA,EAAU,CAAE,CAAE,EAK/C,eAAgB,CAAC,CAAEuG,OAAQvG,EAAU,CAAE,CAAE,EAKzC,gBAAiB,CAAC,CAAEwG,QAAS,CAAC,GAAG9F,GAAc,EAAI,OAAQ,QAAQ,EAAG,EAKtE,iBAAkB,CACd,CAAE,iBAAkB,CAACzN,EAAUiB,EAAqBN,CAAgB,CAAC,CAAE,EAM3E,YAAa,CACT,CAAE4S,QAAS,CAAC,GAAIvT,EAAUkB,GAA2BN,EAAiB,CAAC,CAAE,EAM7E,gBAAiB,CAAC,CAAE2S,QAASxG,EAAU,CAAE,CAAE,EAU3C6B,OAAQ,CACJ,CACIA,OAAQ,CAEJ,GACA,OACAtD,EACA/J,GACAP,EAAiB,CAExB,CAAA,EAML,eAAgB,CAAC,CAAE4N,OAAQ7B,EAAU,CAAE,CAAE,EAKzC,eAAgB,CACZ,CACI,eAAgB,CACZ,OACAxB,EACAhK,GACAP,EAAiB,CAExB,CAAA,EAML,qBAAsB,CAAC,CAAE,eAAgB+L,EAAU,CAAE,CAAE,EAKvD,SAAU,CAAC,CAAEyG,KAAMhG,GAAgB,CAAE,CAAE,EAOvC,eAAgB,CAAC,YAAY,EAK7B,aAAc,CAAC,CAAEgG,KAAMzG,EAAU,CAAE,CAAE,EAOrC,gBAAiB,CAAC,CAAE,cAAe,CAAC/M,EAAUY,EAAiB,CAAC,CAAE,EAOlE,oBAAqB,CAAC,CAAE,cAAemM,EAAU,CAAE,CAAE,EAKrD,eAAgB,CAAC,CAAE,aAAcS,GAAgB,CAAE,CAAE,EAKrD,mBAAoB,CAAC,CAAE,aAAcT,EAAU,CAAE,CAAE,EAKnD,cAAe,CACX,CACI,cAAe,CACX,OACAvB,EACAjK,GACAP,EAAiB,CAExB,CAAA,EAML,oBAAqB,CAAC,CAAE,cAAe+L,EAAU,CAAE,CAAE,EAKrD0G,QAAS,CAAC,CAAEA,QAAS,CAACzT,EAAUiB,EAAqBN,CAAgB,EAAG,EAKxE,YAAa,CAAC,CAAE,YAAa,CAAC,GAAG+M,GAAc,EAAI,cAAe,cAAc,EAAG,EAKnF,WAAY,CAAC,CAAE,WAAYA,GAAc,CAAE,CAAE,EAK7C,YAAa,CACT,CAAE,YAAa,CAAC,SAAU,UAAW,UAAW,OAAQ,SAAU,MAAM,CAAC,EACzE,cAAc,EAMlB,iBAAkB,CAAC,CAAEgG,KAAM,CAAC,MAAO,WAAY,YAAa,SAAS,EAAG,EAKxE,wBAAyB,CAAC,CAAE,cAAe,CAAC1T,CAAQ,CAAC,CAAE,EACvD,6BAA8B,CAAC,CAAE,mBAAoB2N,EAAsB,CAAE,CAAE,EAC/E,2BAA4B,CAAC,CAAE,iBAAkBA,EAAsB,CAAE,CAAE,EAC3E,+BAAgC,CAAC,CAAE,mBAAoBZ,EAAU,CAAE,CAAE,EACrE,6BAA8B,CAAC,CAAE,iBAAkBA,EAAU,CAAE,CAAE,EACjE,wBAAyB,CAAC,CAAE,cAAeY,EAAsB,CAAE,CAAE,EACrE,sBAAuB,CAAC,CAAE,YAAaA,EAAsB,CAAE,CAAE,EACjE,0BAA2B,CAAC,CAAE,cAAeZ,EAAU,CAAE,CAAE,EAC3D,wBAAyB,CAAC,CAAE,YAAaA,EAAU,CAAE,CAAE,EACvD,wBAAyB,CAAC,CAAE,cAAeY,EAAsB,CAAE,CAAE,EACrE,sBAAuB,CAAC,CAAE,YAAaA,EAAsB,CAAE,CAAE,EACjE,0BAA2B,CAAC,CAAE,cAAeZ,EAAU,CAAE,CAAE,EAC3D,wBAAyB,CAAC,CAAE,YAAaA,EAAU,CAAE,CAAE,EACvD,wBAAyB,CAAC,CAAE,cAAeY,EAAsB,CAAE,CAAE,EACrE,sBAAuB,CAAC,CAAE,YAAaA,EAAsB,CAAE,CAAE,EACjE,0BAA2B,CAAC,CAAE,cAAeZ,EAAU,CAAE,CAAE,EAC3D,wBAAyB,CAAC,CAAE,YAAaA,EAAU,CAAE,CAAE,EACvD,wBAAyB,CAAC,CAAE,cAAeY,EAAsB,CAAE,CAAE,EACrE,sBAAuB,CAAC,CAAE,YAAaA,EAAsB,CAAE,CAAE,EACjE,0BAA2B,CAAC,CAAE,cAAeZ,EAAU,CAAE,CAAE,EAC3D,wBAAyB,CAAC,CAAE,YAAaA,EAAU,CAAE,CAAE,EACvD,wBAAyB,CAAC,CAAE,cAAeY,EAAsB,CAAE,CAAE,EACrE,sBAAuB,CAAC,CAAE,YAAaA,EAAsB,CAAE,CAAE,EACjE,0BAA2B,CAAC,CAAE,cAAeZ,EAAU,CAAE,CAAE,EAC3D,wBAAyB,CAAC,CAAE,YAAaA,EAAU,CAAE,CAAE,EACvD,wBAAyB,CAAC,CAAE,cAAeY,EAAsB,CAAE,CAAE,EACrE,sBAAuB,CAAC,CAAE,YAAaA,EAAsB,CAAE,CAAE,EACjE,0BAA2B,CAAC,CAAE,cAAeZ,EAAU,CAAE,CAAE,EAC3D,wBAAyB,CAAC,CAAE,YAAaA,EAAU,CAAE,CAAE,EACvD,oBAAqB,CAAC,CAAE,cAAe,CAAC9L,EAAqBN,CAAgB,CAAC,CAAE,EAChF,6BAA8B,CAAC,CAAE,mBAAoBgN,EAAsB,CAAE,CAAE,EAC/E,2BAA4B,CAAC,CAAE,iBAAkBA,EAAsB,CAAE,CAAE,EAC3E,+BAAgC,CAAC,CAAE,mBAAoBZ,EAAU,CAAE,CAAE,EACrE,6BAA8B,CAAC,CAAE,iBAAkBA,EAAU,CAAE,CAAE,EACjE,0BAA2B,CAAC,CAAE,cAAe,CAAC,SAAU,SAAS,CAAC,CAAE,EACpE,yBAA0B,CACtB,CAAE,cAAe,CAAC,CAAE4G,QAAS,CAAC,OAAQ,QAAQ,EAAGC,SAAU,CAAC,OAAQ,QAAQ,CAAC,CAAE,CAAC,CAAE,EAEtF,wBAAyB,CAAC,CAAE,iBAAkB5H,EAAa,CAAE,CAAE,EAC/D,uBAAwB,CAAC,CAAE,aAAc,CAAChM,CAAQ,CAAC,CAAE,EACrD,4BAA6B,CAAC,CAAE,kBAAmB2N,EAAsB,CAAE,CAAE,EAC7E,0BAA2B,CAAC,CAAE,gBAAiBA,EAAsB,CAAE,CAAE,EACzE,8BAA+B,CAAC,CAAE,kBAAmBZ,EAAU,CAAE,CAAE,EACnE,4BAA6B,CAAC,CAAE,gBAAiBA,EAAU,CAAE,CAAE,EAK/D,YAAa,CAAC,CAAE2G,KAAM,CAAC,QAAS,YAAa,OAAO,EAAG,EAKvD,cAAe,CACX,CAAE,cAAe,CAAC,SAAU,UAAW,UAAW,OAAQ,SAAU,MAAM,CAAC,CAAE,EAMjF,gBAAiB,CAAC,CAAEA,KAAM1G,GAAe,CAAE,CAAE,EAK7C,cAAe,CAAC,CAAE0G,KAAMxG,GAAa,CAAE,CAAE,EAKzC,YAAa,CAAC,CAAEwG,KAAMtG,GAAW,CAAE,CAAE,EAKrC,YAAa,CAAC,CAAE,YAAa,CAAC,QAAS,WAAW,CAAC,CAAE,EAKrD,aAAc,CAAC,CAAEsG,KAAM,CAAC,OAAQzS,EAAqBN,CAAgB,EAAG,EAUxEkT,OAAQ,CACJ,CACIA,OAAQ,CAEJ,GACA,OACA5S,EACAN,CAAgB,CAEvB,CAAA,EAMLwN,KAAM,CAAC,CAAEA,KAAMP,GAAS,CAAE,CAAE,EAK5BkG,WAAY,CAAC,CAAEA,WAAY,CAAC9T,EAAUiB,EAAqBN,CAAgB,EAAG,EAK9EoT,SAAU,CAAC,CAAEA,SAAU,CAAC/T,EAAUiB,EAAqBN,CAAgB,EAAG,EAK1E,cAAe,CACX,CACI,cAAe,CAEX,GACA,OACA8K,EACAlK,GACAP,EAAiB,CAExB,CAAA,EAML,oBAAqB,CAAC,CAAE,cAAe+L,EAAU,CAAE,CAAE,EAKrDiH,UAAW,CAAC,CAAEA,UAAW,CAAC,GAAIhU,EAAUiB,EAAqBN,CAAgB,EAAG,EAKhF,aAAc,CAAC,CAAE,aAAc,CAACX,EAAUiB,EAAqBN,CAAgB,EAAG,EAKlFsT,OAAQ,CAAC,CAAEA,OAAQ,CAAC,GAAIjU,EAAUiB,EAAqBN,CAAgB,EAAG,EAK1EuT,SAAU,CAAC,CAAEA,SAAU,CAAClU,EAAUiB,EAAqBN,CAAgB,EAAG,EAK1EwT,MAAO,CAAC,CAAEA,MAAO,CAAC,GAAInU,EAAUiB,EAAqBN,CAAgB,EAAG,EAKxE,kBAAmB,CACf,CACI,kBAAmB,CAEf,GACA,OACAM,EACAN,CAAgB,CAEvB,CAAA,EAML,gBAAiB,CAAC,CAAE,gBAAiBiN,GAAS,CAAE,CAAE,EAKlD,sBAAuB,CACnB,CAAE,sBAAuB,CAAC5N,EAAUiB,EAAqBN,CAAgB,CAAC,CAAE,EAMhF,oBAAqB,CACjB,CAAE,oBAAqB,CAACX,EAAUiB,EAAqBN,CAAgB,CAAC,CAAE,EAM9E,qBAAsB,CAClB,CAAE,qBAAsB,CAAC,GAAIX,EAAUiB,EAAqBN,CAAgB,CAAC,CAAE,EAMnF,sBAAuB,CACnB,CAAE,sBAAuB,CAACX,EAAUiB,EAAqBN,CAAgB,CAAC,CAAE,EAMhF,kBAAmB,CACf,CAAE,kBAAmB,CAAC,GAAIX,EAAUiB,EAAqBN,CAAgB,CAAC,CAAE,EAMhF,mBAAoB,CAChB,CAAE,mBAAoB,CAACX,EAAUiB,EAAqBN,CAAgB,CAAC,CAAE,EAM7E,oBAAqB,CACjB,CAAE,oBAAqB,CAACX,EAAUiB,EAAqBN,CAAgB,CAAC,CAAE,EAM9E,iBAAkB,CACd,CAAE,iBAAkB,CAAC,GAAIX,EAAUiB,EAAqBN,CAAgB,CAAC,CAAE,EAW/E,kBAAmB,CAAC,CAAE0S,OAAQ,CAAC,WAAY,UAAU,CAAC,CAAE,EAKxD,iBAAkB,CAAC,CAAE,iBAAkBjH,EAAuB,CAAE,CAAE,EAKlE,mBAAoB,CAAC,CAAE,mBAAoBA,EAAuB,CAAE,CAAE,EAKtE,mBAAoB,CAAC,CAAE,mBAAoBA,EAAuB,CAAE,CAAE,EAKtE,eAAgB,CAAC,CAAEgI,MAAO,CAAC,OAAQ,OAAO,CAAC,CAAE,EAK7CC,QAAS,CAAC,CAAEA,QAAS,CAAC,MAAO,QAAQ,CAAC,CAAE,EAUxCC,WAAY,CACR,CACIA,WAAY,CACR,GACA,MACA,SACA,UACA,SACA,YACA,OACArT,EACAN,CAAgB,CAEvB,CAAA,EAML,sBAAuB,CAAC,CAAE2T,WAAY,CAAC,SAAU,UAAU,CAAC,CAAE,EAK9DC,SAAU,CAAC,CAAEA,SAAU,CAACvU,EAAU,UAAWiB,EAAqBN,CAAgB,EAAG,EAKrF4N,KAAM,CACF,CAAEA,KAAM,CAAC,SAAU,UAAW1C,EAAW5K,EAAqBN,CAAgB,CAAC,CAAE,EAMrF6T,MAAO,CAAC,CAAEA,MAAO,CAACxU,EAAUiB,EAAqBN,CAAgB,EAAG,EAKpEsN,QAAS,CAAC,CAAEA,QAAS,CAAC,OAAQnC,EAAc7K,EAAqBN,CAAgB,EAAG,EAUpF8T,SAAU,CAAC,CAAEA,SAAU,CAAC,SAAU,SAAS,CAAC,CAAE,EAK9C/F,YAAa,CACT,CAAEA,YAAa,CAAC/C,EAAkB1K,EAAqBN,CAAgB,CAAC,CAAE,EAM9E,qBAAsB,CAAC,CAAE,qBAAsBsL,EAA0B,CAAE,CAAE,EAK7EyI,OAAQ,CAAC,CAAEA,OAAQ7G,GAAW,CAAE,CAAE,EAKlC,WAAY,CAAC,CAAE,WAAYA,GAAW,CAAE,CAAE,EAK1C,WAAY,CAAC,CAAE,WAAYA,GAAW,CAAE,CAAE,EAK1C,WAAY,CAAC,CAAE,WAAYA,GAAW,CAAE,CAAE,EAK1C8G,MAAO,CAAC,CAAEA,MAAO7G,GAAU,CAAE,CAAE,EAK/B,UAAW,CAAC,CAAE,UAAWA,GAAU,CAAE,CAAE,EAKvC,UAAW,CAAC,CAAE,UAAWA,GAAU,CAAE,CAAE,EAKvC,UAAW,CAAC,CAAE,UAAWA,GAAU,CAAE,CAAE,EAKvC,WAAY,CAAC,UAAU,EAKvB8G,KAAM,CAAC,CAAEA,KAAM7G,GAAS,CAAE,CAAE,EAK5B,SAAU,CAAC,CAAE,SAAUA,GAAS,CAAE,CAAE,EAKpC,SAAU,CAAC,CAAE,SAAUA,GAAS,CAAE,CAAE,EAKpC8G,UAAW,CACP,CAAEA,UAAW,CAAC5T,EAAqBN,EAAkB,GAAI,OAAQ,MAAO,KAAK,CAAC,CAAE,EAMpF,mBAAoB,CAAC,CAAEmU,OAAQ7I,EAA0B,CAAE,CAAE,EAK7D,kBAAmB,CAAC,CAAE4I,UAAW,CAAC,KAAM,MAAM,CAAC,CAAE,EAKjDE,UAAW,CAAC,CAAEA,UAAW/G,GAAc,CAAE,CAAE,EAK3C,cAAe,CAAC,CAAE,cAAeA,GAAc,CAAE,CAAE,EAKnD,cAAe,CAAC,CAAE,cAAeA,GAAc,CAAE,CAAE,EAKnD,cAAe,CAAC,CAAE,cAAeA,GAAc,CAAE,CAAE,EAKnD,iBAAkB,CAAC,gBAAgB,EAUnCgH,OAAQ,CAAC,CAAEA,OAAQjI,EAAU,CAAE,CAAE,EAKjCkI,WAAY,CAAC,CAAEA,WAAY,CAAC,OAAQ,MAAM,CAAC,CAAE,EAK7C,cAAe,CAAC,CAAEC,MAAOnI,EAAU,CAAE,CAAE,EAKvC,eAAgB,CACZ,CAAEoI,OAAQ,CAAC,SAAU,OAAQ,QAAS,aAAc,YAAa,YAAY,CAAC,CAAE,EAMpFC,OAAQ,CACJ,CACIA,OAAQ,CACJ,OACA,UACA,UACA,OACA,OACA,OACA,OACA,cACA,OACA,eACA,WACA,OACA,YACA,gBACA,QACA,OACA,UACA,OACA,WACA,aACA,aACA,aACA,WACA,WACA,WACA,WACA,YACA,YACA,YACA,YACA,YACA,YACA,cACA,cACA,UACA,WACAnU,EACAN,CAAgB,CAEvB,CAAA,EAML,eAAgB,CAAC,CAAE,eAAgB,CAAC,QAAS,SAAS,CAAC,CAAE,EAKzD,iBAAkB,CAAC,CAAE,iBAAkB,CAAC,OAAQ,MAAM,CAAC,CAAE,EAKzD0U,OAAQ,CAAC,CAAEA,OAAQ,CAAC,OAAQ,GAAI,IAAK,GAAG,EAAG,EAK3C,kBAAmB,CAAC,CAAEC,OAAQ,CAAC,OAAQ,QAAQ,CAAC,CAAE,EAKlD,WAAY,CAAC,CAAE,WAAYlJ,EAAuB,CAAE,CAAE,EAKtD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,WAAY,CAAC,CAAE,WAAYA,EAAuB,CAAE,CAAE,EAKtD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,YAAa,CAAC,CAAE,YAAaA,EAAuB,CAAE,CAAE,EAKxD,aAAc,CAAC,CAAEmJ,KAAM,CAAC,QAAS,MAAO,SAAU,YAAY,EAAG,EAKjE,YAAa,CAAC,CAAEA,KAAM,CAAC,SAAU,QAAQ,CAAC,CAAE,EAK5C,YAAa,CAAC,CAAEA,KAAM,CAAC,OAAQ,IAAK,IAAK,MAAM,EAAG,EAKlD,kBAAmB,CAAC,CAAEA,KAAM,CAAC,YAAa,WAAW,CAAC,CAAE,EAKxDC,MAAO,CAAC,CAAEA,MAAO,CAAC,OAAQ,OAAQ,cAAc,EAAG,EAKnD,UAAW,CAAC,CAAE,YAAa,CAAC,IAAK,OAAQ,OAAO,EAAG,EAKnD,UAAW,CAAC,CAAE,YAAa,CAAC,IAAK,KAAM,MAAM,EAAG,EAKhD,WAAY,CAAC,kBAAkB,EAK/BC,OAAQ,CAAC,CAAEA,OAAQ,CAAC,OAAQ,OAAQ,MAAO,MAAM,EAAG,EAKpD,cAAe,CACX,CACI,cAAe,CACX,OACA,SACA,WACA,YACAxU,EACAN,CAAgB,CAEvB,CAAA,EAWL+U,KAAM,CAAC,CAAEA,KAAM,CAAC,OAAQ,GAAG3I,EAAU,CAAE,EAAG,EAK1C,WAAY,CACR,CACI4I,OAAQ,CACJ3V,EACAkB,GACAN,GACAC,EAAiB,CAExB,CAAA,EAML8U,OAAQ,CAAC,CAAEA,OAAQ,CAAC,OAAQ,GAAG5I,EAAU,CAAE,EAAG,EAU9C,sBAAuB,CAAC,CAAE,sBAAuB,CAAC,OAAQ,MAAM,CAAC,CAAE,CACtE,EACD7J,uBAAwB,CACpBsM,SAAU,CAAC,aAAc,YAAY,EACrCC,WAAY,CAAC,eAAgB,cAAc,EAC3CC,MAAO,CAAC,UAAW,UAAW,QAAS,MAAO,MAAO,QAAS,SAAU,MAAM,EAC9E,UAAW,CAAC,QAAS,MAAM,EAC3B,UAAW,CAAC,MAAO,QAAQ,EAC3BU,KAAM,CAAC,QAAS,OAAQ,QAAQ,EAChCM,IAAK,CAAC,QAAS,OAAO,EACtBK,EAAG,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAI,EAClDC,GAAI,CAAC,KAAM,IAAI,EACfC,GAAI,CAAC,KAAM,IAAI,EACfO,EAAG,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAI,EAClDC,GAAI,CAAC,KAAM,IAAI,EACfC,GAAI,CAAC,KAAM,IAAI,EACfrE,KAAM,CAAC,IAAK,GAAG,EACf,YAAa,CAAC,SAAS,EACvB,aAAc,CACV,cACA,mBACA,aACA,cACA,cAAc,EAElB,cAAe,CAAC,YAAY,EAC5B,mBAAoB,CAAC,YAAY,EACjC,aAAc,CAAC,YAAY,EAC3B,cAAe,CAAC,YAAY,EAC5B,eAAgB,CAAC,YAAY,EAC7B,aAAc,CAAC,UAAW,UAAU,EACpC+F,QAAS,CACL,YACA,YACA,YACA,YACA,YACA,YACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,YAAY,EAEhB,YAAa,CAAC,aAAc,YAAY,EACxC,YAAa,CAAC,aAAc,YAAY,EACxC,YAAa,CAAC,aAAc,YAAY,EACxC,YAAa,CAAC,aAAc,YAAY,EACxC,YAAa,CAAC,aAAc,YAAY,EACxC,YAAa,CAAC,aAAc,YAAY,EACxC,iBAAkB,CAAC,mBAAoB,kBAAkB,EACzD,WAAY,CACR,aACA,aACA,aACA,aACA,aACA,aACA,aACA,YAAY,EAEhB,aAAc,CAAC,aAAc,YAAY,EACzC,aAAc,CAAC,aAAc,YAAY,EACzC,eAAgB,CACZ,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,gBAAgB,EAEpB,iBAAkB,CAAC,iBAAkB,gBAAgB,EACrD,iBAAkB,CAAC,iBAAkB,gBAAgB,EACrD2B,UAAW,CAAC,cAAe,cAAe,gBAAgB,EAC1D,iBAAkB,CAAC,YAAa,cAAe,cAAe,aAAa,EAC3E,WAAY,CACR,YACA,YACA,YACA,YACA,YACA,YACA,YACA,WAAW,EAEf,YAAa,CAAC,YAAa,WAAW,EACtC,YAAa,CAAC,YAAa,WAAW,EACtC,WAAY,CACR,YACA,YACA,YACA,YACA,YACA,YACA,YACA,WAAW,EAEf,YAAa,CAAC,YAAa,WAAW,EACtC,YAAa,CAAC,YAAa,WAAW,EACtCS,MAAO,CAAC,UAAW,UAAW,UAAU,EACxC,UAAW,CAAC,OAAO,EACnB,UAAW,CAAC,OAAO,EACnB,WAAY,CAAC,OAAO,CACvB,EACDrS,+BAAgC,CAC5B,YAAa,CAAC,SAAS,CAC1B,EACDyE,wBAAyB,CACrB,IACA,KACA,QACA,WACA,SACA,kBACA,OACA,eACA,aACA,SACA,cACA,WAAW,EAGvB,EGnzEa1F,GAAU9C,GAAoB6C,EAAgB,ICApD,SAAS2T,KAAMC,EAAe,CACpC,OAAOC,GAAQC,GAAKF,CAAM,CAAC,CAC5B,CALA,IAAAG,GAAAC,GAAA,KAAAC,KACAC,OCCA,SAASC,EAAS,CAChB,UAAAC,EACA,GAAGC,CACL,EAAyC,CACvC,SACE,QAAC,OACC,UAAWC,EAAG,yCAA0CF,CAAS,EAChE,GAAGC,EACN,CAEJ,CAZA,IAOIE,GAPJC,GAAAC,GAAA,KAAAC,KAOIH,GAAA,+BCCJ,SAASI,GAAUC,EAAqBC,EAAU,CAChD,GAAI,OAAOD,GAAQ,WACjB,OAAOA,EAAIC,CAAK,EACPD,GAAQ,OACjBA,EAAI,QAAUC,EAElB,CAMA,SAASC,MAAkBC,EAA8C,CACvE,OAAQC,GAAS,CACf,IAAIC,EAAa,GACXC,EAAWH,EAAK,IAAKH,GAAQ,CACjC,IAAMO,EAAUR,GAAOC,EAAKI,CAAI,EAChC,MAAI,CAACC,GAAc,OAAOE,GAAW,aACnCF,EAAa,IAERE,CACT,CAAC,EAMD,GAAIF,EACF,MAAO,IAAM,CACX,QAASG,EAAI,EAAGA,EAAIF,EAAS,OAAQE,IAAK,CACxC,IAAMD,EAAUD,EAASE,CAAC,EACtB,OAAOD,GAAW,WACpBA,EAAQ,EAERR,GAAOI,EAAKK,CAAC,EAAG,IAAI,CAExB,CACF,CAEJ,CACF,KAhDAC,cAAAA,GAAuB,wBC2BvB,SAASC,GAAcC,EAA+C,CACpE,OAAO,OAAOA,GAAU,UAAYA,IAAU,MAAQ,SAAUA,CAClE,CAEA,SAASC,GAAgBC,EAAuD,CAC9E,OACEA,GAAW,MACX,OAAOA,GAAY,UACnB,aAAcA,GACdA,EAAQ,WAAaC,IACrB,aAAcD,GACdH,GAAcG,EAAQ,QAAQ,CAElC,CAEkC,SAASE,GAAWC,EAAmB,CACvE,IAAMC,EAAYC,GAAgBF,CAAS,EACrCG,EAAa,aAAmC,CAACC,EAAOC,IAAiB,CAC7E,GAAI,CAAE,SAAAC,EAAU,GAAGC,CAAU,EAAIH,EAC7BR,GAAgBU,CAAQ,GAAK,OAAOE,IAAQ,aAC9CF,EAAWE,GAAIF,EAAS,QAAQ,GAElC,IAAMG,EAAsB,WAAS,QAAQH,CAAQ,EAC/CI,EAAYD,EAAc,KAAKE,EAAW,EAEhD,GAAID,EAAW,CAEb,IAAME,EAAaF,EAAU,MAAM,SAE7BG,EAAcJ,EAAc,IAAKK,GACjCA,IAAUJ,EAGF,WAAS,MAAME,CAAU,EAAI,EAAgB,WAAS,KAAK,IAAI,EAC5D,iBAAeA,CAAU,EACjCA,EAAW,MAAwC,SACpD,KAEGE,CAEV,EAED,SACE,QAACb,EAAA,CAAW,GAAGM,EAAW,IAAKF,EAC5B,SAAM,iBAAeO,CAAU,EACtB,eAAaA,EAAY,OAAWC,CAAW,EACrD,IAAA,CACN,CAEJ,CAEA,SACE,QAACZ,EAAA,CAAW,GAAGM,EAAW,IAAKF,EAC5B,SAAAC,CAAA,CACH,CAEJ,CAAC,EAEDH,OAAAA,EAAK,YAAc,GAAGH,CAAS,QACxBG,CACT,CAY2B,SAASD,GAAgBF,EAAmB,CACrE,IAAMC,EAAkB,aAAgC,CAACG,EAAOC,IAAiB,CAC/E,GAAI,CAAE,SAAAC,EAAU,GAAGC,CAAU,EAAIH,EAKjC,GAJIR,GAAgBU,CAAQ,GAAK,OAAOE,IAAQ,aAC9CF,EAAWE,GAAIF,EAAS,QAAQ,GAGxB,iBAAeA,CAAQ,EAAG,CAClC,IAAMS,EAAcC,GAAcV,CAAQ,EACpCF,EAAQa,GAAWV,EAAWD,EAAS,KAAiB,EAE9D,OAAIA,EAAS,OAAe,aAC1BF,EAAM,IAAMC,EAAea,GAAYb,EAAcU,CAAW,EAAIA,GAEzD,eAAaT,EAAUF,CAAK,CAC3C,CAEA,OAAa,WAAS,MAAME,CAAQ,EAAI,EAAU,WAAS,KAAK,IAAI,EAAI,IAC1E,CAAC,EAED,OAAAL,EAAU,YAAc,GAAGD,CAAS,aAC7BC,CACT,CA+BA,SAASU,GACPG,EAC+D,CAC/D,OACQ,iBAAeA,CAAK,GAC1B,OAAOA,EAAM,MAAS,YACtB,cAAeA,EAAM,MACrBA,EAAM,KAAK,YAAcK,EAE7B,CAEA,SAASF,GAAWV,EAAqBa,EAAsB,CAE7D,IAAMC,EAAgB,CAAE,GAAGD,CAAW,EAEtC,QAAWE,KAAYF,EAAY,CACjC,IAAMG,EAAgBhB,EAAUe,CAAQ,EAClCE,EAAiBJ,EAAWE,CAAQ,EAExB,WAAW,KAAKA,CAAQ,EAGpCC,GAAiBC,EACnBH,EAAcC,CAAQ,EAAI,IAAIG,IAAoB,CAChD,IAAMC,EAASF,EAAe,GAAGC,CAAI,EACrC,OAAAF,EAAc,GAAGE,CAAI,EACdC,CACT,EAGOH,IACPF,EAAcC,CAAQ,EAAIC,GAIrBD,IAAa,QACpBD,EAAcC,CAAQ,EAAI,CAAE,GAAGC,EAAe,GAAGC,CAAe,EACvDF,IAAa,cACtBD,EAAcC,CAAQ,EAAI,CAACC,EAAeC,CAAc,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAEtF,CAEA,MAAO,CAAE,GAAGjB,EAAW,GAAGc,CAAc,CAC1C,CAOA,SAASL,GAAcnB,EAA6B,CAElD,IAAI8B,EAAS,OAAO,yBAAyB9B,EAAQ,MAAO,KAAK,GAAG,IAChE+B,EAAUD,GAAU,mBAAoBA,GAAUA,EAAO,eAC7D,OAAIC,EACM/B,EAAgB,KAI1B8B,EAAS,OAAO,yBAAyB9B,EAAS,KAAK,GAAG,IAC1D+B,EAAUD,GAAU,mBAAoBA,GAAUA,EAAO,eACrDC,EACM/B,EAAQ,MAAuC,IAIjDA,EAAQ,MAAuC,KAAQA,EAAgB,IACjF,KA3NAgC,EAsEQC,GA7DFhC,GAYAU,GAoEAL,GAsCAgB,cA/HNU,EAAuB,sBACvBE,KAqEQD,GAAA,6BA7DFhC,GAAkB,OAAO,IAAI,YAAY,EAYzCU,GAAqCqB,EAAc,QAAQ,KAAK,EAAE,SAAS,CAAC,EAoE5E1B,GAAOJ,GAAW,MAAM,EAsCxBoB,GAAuB,OAAO,iBAAiB,IC/HrD,IAeMa,GACOC,GACAC,GAjBbC,GAAAC,GAAA,KAcIC,KACEL,GAAiBM,GAAQ,OAAOA,GAAU,UAAY,GAAGA,CAAK,GAAKA,IAAU,EAAI,IAAMA,EAChFL,GAAKM,GACLL,GAAM,CAACM,EAAMC,IAAUC,GAAQ,CACpC,IAAIC,EACJ,GAAqDF,GAAO,UAAa,KAAM,OAAOR,GAAGO,EAAoDE,GAAM,MAAqDA,GAAM,SAAS,EACvN,GAAM,CAAE,SAAAE,EAAU,gBAAAC,CAAgB,EAAIJ,EAChCK,EAAuB,OAAO,KAAKF,CAAQ,EAAE,IAAKG,GAAU,CAC9D,IAAMC,EAA4DN,IAAMK,CAAO,EACzEE,EAAuFJ,IAAgBE,CAAO,EACpH,GAAIC,IAAgB,KAAM,OAAO,KACjC,IAAME,EAAalB,GAAcgB,CAAW,GAAKhB,GAAciB,CAAkB,EACjF,OAAOL,EAASG,CAAO,EAAEG,CAAU,CACvC,CAAC,EACKC,EAAwBT,GAAS,OAAO,QAAQA,CAAK,EAAE,OAAO,CAACU,EAAKC,IAAQ,CAC9E,GAAI,CAACC,EAAKhB,CAAK,EAAIe,EACnB,OAAIf,IAAU,SAGdc,EAAIE,CAAG,EAAIhB,GACJc,CACX,EAAG,CAAC,CAAC,EACCG,EAA+Bd,GAAW,OAAsCE,EAA2BF,EAAO,oBAAsB,MAAQE,IAA6B,OAAvG,OAAyHA,EAAyB,OAAO,CAACS,EAAKC,IAAQ,CAC/O,GAAI,CAAE,MAAOG,EAAS,UAAWC,EAAa,GAAGC,CAAuB,EAAIL,EAC5E,OAAO,OAAO,QAAQK,CAAsB,EAAE,MAAOL,GAAQ,CACzD,GAAI,CAACC,EAAKhB,CAAK,EAAIe,EACnB,OAAO,MAAM,QAAQf,CAAK,EAAIA,EAAM,SAAS,CACzC,GAAGO,EACH,GAAGM,CACP,EAAEG,CAAG,CAAC,EAAK,CACP,GAAGT,EACH,GAAGM,CACP,EAAGG,CAAG,IAAMhB,CAChB,CAAC,EAAI,CACD,GAAGc,EACHI,EACAC,CACJ,EAAIL,CACR,EAAG,CAAC,CAAC,EACL,OAAOnB,GAAGO,EAAMM,EAAsBS,EAA4Eb,GAAM,MAAqDA,GAAM,SAAS,CAChM,ICtDJ,IAAAiB,GA8CMC,GAxCAC,GAoCAC,GA1CNC,GAAAC,GAAA,KAAAL,GAAuB,oBACvBM,KACAA,KAEAC,KA0CMN,GAAA,6BAxCAC,GAAiBM,GACrB,wSACA,CACE,SAAU,CACR,QAAS,CACP,QACE,gEACF,YACE,+EACF,QACE,2FACF,UACE,yEACF,MAAO,+CACP,KAAM,iDACR,EACA,KAAM,CACJ,QAAS,gBACT,GAAI,8BACJ,GAAI,uBACJ,KAAM,SACR,CACF,EACA,gBAAiB,CACf,QAAS,UACT,KAAM,SACR,CACF,CACF,EAQML,GAAe,cACnB,CAAC,CAAE,UAAAM,EAAW,QAAAC,EAAS,KAAAC,EAAM,QAAAC,EAAU,GAAO,GAAGC,CAAM,EAAGC,OAGtD,QAFWF,EAAUG,GAAO,SAE3B,CACC,UAAWC,EAAGd,GAAe,CAAE,QAAAQ,EAAS,KAAAC,EAAM,UAAAF,CAAU,CAAC,CAAC,EAC1D,IAAKK,EACJ,GAAGD,EACN,CAGN,EACAV,GAAO,YAAc,WCtDrB,IAAAc,GAAA,GAAAC,GAAAD,GAAA,oBAAAE,KAqBA,SAASC,GAASC,EAAmC,CACpD,IAAMC,EAAQ,YACRC,EAAa,OACbC,EAAY,MAElB,OAAI,OAAOH,GAAa,SAChBA,EACL,YAAY,EACZ,QAAQC,EAAO,EAAE,EACjB,QAAQC,EAAY,GAAG,EACvB,QAAQC,EAAW,GAAG,EACtB,KAAK,EAEJ,MAAM,QAAQH,CAAQ,EAClBA,EACL,IAAII,GAAS,CACb,GAAI,OAAOA,GAAU,SAAU,OAAOA,EACtC,GAAU,iBAAeA,CAAK,EAAG,CAChC,IAAMC,EAAaD,EAAM,MACzB,GAAIC,EAAW,SACd,OAAON,GAASM,EAAW,QAAQ,CAErC,CACA,MAAO,EACR,CAAC,EACA,KAAK,EAAE,EACP,YAAY,EACZ,QAAQJ,EAAO,EAAE,EACjB,QAAQC,EAAY,GAAG,EACvB,QAAQC,EAAW,GAAG,EACtB,KAAK,EAED,EACR,CAGA,SAASG,GAAU,CAClB,WAAAC,EACA,SAAAC,EACA,WAAAC,EACA,cAAAC,EACA,UAAAC,CACD,EAMG,CACF,IAAMC,EAAe,QAAM,EAG3B,SACC,QAAC,OAAI,UAAU,+DACd,qBAAC,OAAI,UAAU,iFACd,oBAAC,QAAK,UAAU,sCAAuC,SAAAJ,EAAS,KAChE,QAACK,GAAA,CACA,QAAQ,QACR,KAAK,KACL,UAAU,cACV,QAAS,IAAM,CACd,UAAU,UAAU,UAAUN,CAAU,EACxCG,EAAcE,CAAM,EACpB,WAAW,IAAMF,EAAc,IAAI,EAAG,GAAI,CAC3C,EAEC,UAhBYD,IAAeG,KAiB3B,OAAC,UAAM,UAAU,UAAU,KAE3B,OAAC,SAAK,UAAU,UAAU,KAE3B,OAAC,QAAK,UAAU,UAAU,qBAAS,GACpC,GACD,KACA,OAAC,GAAAE,MAAA,CACA,MAAOH,EACP,SAAUH,EACV,OAAO,MACP,gBAAiB,GACjB,YAAa,CACZ,OAAQ,EACR,QAAS,OACT,SAAU,OACV,WAAY,MACZ,WAAY,aACb,EAEC,SAAAD,EACF,GACD,CAEF,CAGA,SAASQ,GAAiBC,EAAaC,EAAkBC,EAA4B,CAEpF,GACC,CAACF,GACDA,EAAI,WAAW,SAAS,GACxBA,EAAI,WAAW,UAAU,GACzBA,EAAI,WAAW,OAAO,EAEtB,OAAOA,EAKR,GAAIA,EAAI,WAAW,GAAG,EAAG,CAExB,IAAMG,EAAkBD,EAAW,QAAQ,OAAQ,EAAE,EAAE,QAAQ,OAAQ,EAAE,EACzE,OAAIF,EAAI,WAAW,IAAIG,CAAe,GAAG,EACjCH,EAGJG,EACI,IAAIA,CAAe,GAAGH,CAAG,GAE1BA,CACR,CAIA,GAAI,CAACC,EAAU,CAEd,IAAME,EAAkBD,EAAW,QAAQ,OAAQ,EAAE,EAAE,QAAQ,OAAQ,EAAE,EACnEE,EAAYJ,EAAI,QAAQ,MAAO,GAAG,EAAE,QAAQ,QAAS,EAAE,EAC7D,OAAIG,EACI,IAAIA,CAAe,IAAIC,CAAS,GAEjC,IAAIA,CAAS,EACrB,CAGA,IAAMC,EAAUJ,EAAS,QAAQ,oBAAqB,EAAE,EAAE,QAAQ,MAAO,GAAG,EAItEK,EADYN,EAAI,QAAQ,MAAO,GAAG,EAAE,QAAQ,QAAS,EAAE,EAChC,MAAM,GAAG,EAAE,OAAO,OAAO,EAGhDO,EAAWF,EAAUA,EAAQ,MAAM,GAAG,EAAE,OAAO,OAAO,EAAI,CAAC,EAGjE,QAAWG,KAAQF,EACdE,IAAS,KACRD,EAAS,OAAS,GACrBA,EAAS,IAAI,EAEJC,IAAS,KACnBD,EAAS,KAAKC,CAAI,EAKpB,IAAMC,EAAeF,EAAS,OAAS,EAAIA,EAAS,KAAK,GAAG,EAAI,GAI1DJ,EAAkBD,EAAW,QAAQ,OAAQ,EAAE,EAAE,QAAQ,OAAQ,EAAE,EAEzE,OAAIC,EACCM,EACI,IAAIN,CAAe,IAAIM,CAAY,GAIpC,IAAIN,CAAe,GAGpBM,EAAe,IAAIA,CAAY,GAAK,GAC5C,CAEO,SAAS3B,GAAe,CAC9B,SAAAmB,EACA,WAAAC,EACA,aAAAQ,CACD,EAAwB,CACvB,GAAM,CAACC,EAASC,CAAU,EAAU,WAAiB,EAAE,EACjD,CAACC,EAASC,CAAU,EAAU,WAAS,EAAI,EAC3C,CAACC,EAAOC,CAAQ,EAAU,WAAwB,IAAI,EACtD,CAACC,EAAQC,CAAS,EAAU,WAAS,EAAK,EAC1C,CAACzB,EAAYC,CAAa,EAAU,WAAwB,IAAI,EAEhE,YAAU,IAAM,CACrB,IAAMyB,EAAa,IAAM,CACxBD,EAAU,SAAS,gBAAgB,UAAU,SAAS,MAAM,CAAC,CAC9D,EACAC,EAAW,EACX,IAAMC,EAAW,IAAI,iBAAiBD,CAAU,EAChD,OAAAC,EAAS,QAAQ,SAAS,gBAAiB,CAC1C,WAAY,GACZ,gBAAiB,CAAC,OAAO,CAC1B,CAAC,EACM,IAAMA,EAAS,WAAW,CAClC,EAAG,CAAC,CAAC,EAEL,IAAMzB,EAAYsB,EAAS,WAAU,YA4DrC,OA1DM,YAAU,IAAM,CAqDjBhB,IApDiB,SAAY,CAChCa,EAAW,EAAI,EACfE,EAAS,IAAI,EACbJ,EAAW,EAAE,EAGb,IAAMS,EAAW,IAEjB,GAAI,CACH,IAAMC,EAAY,KAAK,IAAI,EAGrBC,EAAS,IAAI,gBACnBA,EAAO,IAAI,WAAYtB,CAAQ,EAC/BsB,EAAO,IAAI,aAAcrB,CAAU,EAEnC,IAAMsB,EAAW,MAAM,MACtB,2BAA2BD,EAAO,SAAS,CAAC,GAC5C,CACC,QAAS,CACR,OAAQ,kBACT,CACD,CACD,EAEA,GAAI,CAACC,EAAS,GACb,MAAM,IAAI,MAAM,QAAQA,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,EAGlE,IAAMC,EAAO,MAAMD,EAAS,KAAK,EAG3BE,EAAU,KAAK,IAAI,EAAIJ,EACvBK,EAAiB,KAAK,IAAI,EAAGN,EAAWK,CAAO,EAIrD,GAFA,MAAM,IAAI,QAAQE,GAAW,WAAWA,EAASD,CAAc,CAAC,EAE5DF,EAAK,QACRb,EAAWa,EAAK,OAAO,EAEvB,WAAW,IAAM,CAChBX,EAAW,EAAK,CACjB,EAAG,GAAG,MAEN,OAAM,IAAI,MAAMW,EAAK,OAAS,yBAAyB,CAEzD,OAASI,EAAK,CACbb,EAASa,aAAe,MAAQA,EAAI,QAAU,eAAe,EAC7Df,EAAW,EAAK,CACjB,CACD,GAGc,CAEf,EAAG,CAACb,EAAUC,CAAU,CAAC,EAErBa,KAEF,OAAC,OAAI,UAAU,mFACd,oBAAC,KAAE,UAAU,mBAAmB,mIAAwBA,GAAM,EAC/D,KAKD,QAAC,OAAI,UAAU,8CAEb,UAAAF,MACA,QAAC,OAAI,UAAU,4DACd,oBAACiB,EAAA,CAAS,UAAU,YAAY,KAChC,OAACA,EAAA,CAAS,UAAU,aAAa,KACjC,OAACA,EAAA,CAAS,UAAU,aAAa,KACjC,OAACA,EAAA,CAAS,UAAU,YAAY,KAChC,OAACA,EAAA,CAAS,UAAU,aAAa,KACjC,OAACA,EAAA,CAAS,UAAU,YAAY,KAChC,OAACA,EAAA,CAAS,UAAU,aAAa,KACjC,OAACA,EAAA,CAAS,UAAU,YAAY,GACjC,EAIA,CAACjB,GAAWF,MACZ,OAAC,OAAI,UAAU,oCACd,mBAAC,GAAAoB,QAAA,CACF,cAAe,CAAC,GAAAC,OAAS,EACzB,cAAe,CAAC,GAAAC,QAAW,GAAAC,OAAc,EACzC,WAAY,CAEX,GAAI,CAAC,CAAE,KAAAC,EAAM,GAAGC,CAAM,IAAM,CAC3B,IAAMC,EAAStD,GAASqD,EAAM,QAAQ,EACtC,SACC,OAAC,MACA,GAAIC,EACJ,UAAU,2DACT,GAAGD,EACL,CAEF,EACA,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IAAM,CAC3B,IAAMC,EAAStD,GAASqD,EAAM,QAAQ,EACtC,SACC,OAAC,MACA,GAAIC,EACJ,UAAU,+DACT,GAAGD,EACL,CAEF,EACA,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IAAM,CAC3B,IAAMC,EAAStD,GAASqD,EAAM,QAAQ,EACtC,SACC,OAAC,MACA,GAAIC,EACJ,UAAU,+DACT,GAAGD,EACL,CAEF,EACA,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IAAM,CAC3B,IAAMC,EAAStD,GAASqD,EAAM,QAAQ,EACtC,SACC,OAAC,MACA,GAAIC,EACJ,UAAU,8DACT,GAAGD,EACL,CAEF,EACA,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IAAM,CAC3B,IAAMC,EAAStD,GAASqD,EAAM,QAAQ,EACtC,SACC,OAAC,MACA,GAAIC,EACJ,UAAU,+CACT,GAAGD,EACL,CAEF,EACA,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IAAM,CAC3B,IAAMC,EAAStD,GAASqD,EAAM,QAAQ,EACtC,SACC,OAAC,MACA,GAAIC,EACJ,UAAU,iDACT,GAAGD,EACL,CAEF,EAEA,EAAG,CAAC,CAAE,KAAAD,EAAM,SAAAnD,EAAU,GAAGoD,CAAM,IAAW,CAuBzC,GArB4B,WAAS,QAAQpD,CAAQ,EACd,KAAMI,GAAmB,CAC/D,GAAU,iBAAeA,CAAK,EAAG,CAChC,GAAIA,EAAM,OAAS,UAAYA,EAAM,OAAS,MAC7C,MAAO,GAER,IAAMC,EAAaD,EAAM,MACzB,GAAIC,GAAY,KAAM,CACrB,IAAMiD,EAAYjD,EAAW,KAC7B,GACCiD,EAAU,OAAS,YAClBA,EAAU,UAAY,OACtBA,EAAU,UAAY,UAEvB,MAAO,EAET,CACD,CACA,MAAO,EACR,CAAC,EAEqB,CACrB,GAAM,CAAE,IAAAC,EAAK,GAAGC,CAAS,EAAIJ,EAC7B,SACC,OAAC,OACA,UAAU,uCACT,GAAGI,EAEH,SAAAxD,EACF,CAEF,CAEA,SACC,OAAC,KAAE,UAAU,uCAAwC,GAAGoD,EACtD,SAAApD,EACF,CAEF,EAEA,GAAI,CAAC,CAAE,KAAAmD,EAAM,GAAGC,CAAM,OACrB,OAAC,MACA,UAAU,sDACT,GAAGA,EACL,EAED,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACrB,OAAC,MACA,UAAU,yDACT,GAAGA,EACL,EAED,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACrB,OAAC,MAAG,UAAU,iBAAkB,GAAGA,EAAO,EAG3C,MAAO,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,IACpBA,EAAM,OAAS,cAEjB,OAAC,SACA,KAAK,WACL,UAAU,oDACV,SAAQ,GACP,GAAGA,EACL,KAGK,OAAC,SAAO,GAAGA,EAAO,EAG1B,WAAY,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OAC7B,OAAC,cACA,UAAU,8EACT,GAAGA,EACL,EAGD,KAAM,CAAC,CAAE,KAAAD,EAAM,OAAAM,EAAQ,UAAAC,EAAW,SAAA1D,EAAU,GAAGoD,CAAM,IAAW,CAC/D,IAAMO,EAAQ,iBAAiB,KAAKD,GAAa,EAAE,EAC7CnD,EAAa,OAAOP,CAAQ,EAAE,QAAQ,MAAO,EAAE,EAErD,MAAI,CAACyD,GAAUE,KAEb,OAACrD,GAAA,CACA,WAAYC,EACZ,SAAUoD,EAAM,CAAC,EACjB,WAAYlD,EACZ,cAAeC,EACf,UAAWC,EACZ,KAID,OAAC,QACA,UAAU,oFACT,GAAGyC,EAEH,SAAApD,EACF,CAEF,EACA,IAAK,CAAC,CAAE,KAAAmD,EAAM,GAAGC,CAAM,IAAW,CACjC,GAAM,CAAE,IAAAG,EAAK,GAAGC,CAAS,EAAIJ,EAC7B,SAAO,OAAC,OAAK,GAAGI,EAAU,CAC3B,EAEA,IAAK,CAAC,CAAE,IAAAxC,EAAK,IAAA4C,EAAK,MAAAC,CAAM,IAAW,CAElC,IAAMC,EAAc/C,GACnBC,GAAO,GACPC,GAAY,GACZC,GAAc,MACf,EAEA,SACC,QAAC,UAAO,UAAU,OACjB,oBAAC,OACA,IAAK4C,EACL,IAAKF,EACL,MAAOC,EACP,QAAQ,OACR,UAAU,6DACV,QAAUE,GAAM,CAEf,IAAMC,EAASD,EAAE,OACjBC,EAAO,MAAM,QAAU,OACvB,IAAMC,EAASD,EAAO,QAAQ,QAAQ,EACtC,GAAIC,GAAU,CAACA,EAAO,cAAc,cAAc,EAAG,CACpD,IAAMC,EAAW,SAAS,cAAc,KAAK,EAC7CA,EAAS,UAAY,0GACrBA,EAAS,YAAc,+HAA2BlD,CAAG,+BAAW8C,CAAW,IAC3EG,EAAO,YAAYC,CAAQ,CAC5B,CACD,EACD,EACCN,MACA,OAAC,cAAW,UAAU,iDACpB,SAAAA,EACF,GAEF,CAEF,EAEA,EAAG,CAAC,CAAE,KAAAO,EAAM,SAAAnE,EAAU,GAAGoD,CAAM,IAG7B,CAACe,GACDA,EAAK,WAAW,MAAM,GACtBA,EAAK,WAAW,GAAG,GACnBA,EAAK,WAAW,SAAS,GACzBA,EAAK,WAAW,MAAM,KAGrB,OAAC,KACA,KAAMA,EACN,UAAU,gGACV,OAAO,SACP,IAAI,sBACH,GAAGf,EAEH,SAAApD,EACF,EAKEmE,EAAK,YAAY,EAAE,SAAS,KAAK,KA0BnC,OAAC,KACA,KAAMA,EACN,QA3BcJ,GAAwB,CACvCA,EAAE,eAAe,EAMjB,IAAMK,EAHMnD,EAAS,QAAQ,oBAAqB,EAAE,EAGnC,QAAQ,MAAO,GAAG,EAI7BoD,EADMF,EAAK,QAAQ,MAAO,GAAG,EACd,MAAM,GAAG,EAAE,OAAO,OAAO,EACxCG,EAAYF,EAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAEhD,QAAWG,KAAKF,EACXE,IAAM,KAAMD,EAAU,IAAI,EACrBC,IAAM,KAAKD,EAAU,KAAKC,CAAC,EAGrC,IAAMC,EAAWF,EAAU,KAAK,GAAG,EAEnC5C,EAAa8C,CAAQ,CACtB,EAME,UAAU,+GACT,GAAGpB,EAEH,SAAApD,EACF,KAMD,OAAC,KACA,KAAMmE,EACN,UAAU,gGACT,GAAGf,EACL,EAIF,MAAO,CAAC,CAAE,SAAApD,CAAS,OAClB,OAAC,OAAI,UAAU,8BACd,mBAAC,SAAM,UAAU,yBAA0B,SAAAA,EAAS,EACrD,EAED,MAAO,CAAC,CAAE,KAAAmD,EAAM,GAAGC,CAAM,OACxB,OAAC,SAAM,UAAU,kBAAmB,GAAGA,EAAO,EAE/C,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACrB,OAAC,MACA,UAAU,mGACT,GAAGA,EACL,EAED,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACrB,OAAC,MACA,UAAU,iDACT,GAAGA,EACL,EAED,MAAO,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACxB,OAAC,SAAM,UAAU,6BAA8B,GAAGA,EAAO,EAE1D,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACrB,OAAC,MACA,UAAU,8EACT,GAAGA,EACL,EAGD,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACrB,OAAC,MAAG,UAAU,8BAA+B,GAAGA,EAAO,EAGxD,OAAQ,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACzB,OAAC,UAAO,UAAU,gCAAiC,GAAGA,EAAO,EAE9D,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACrB,OAAC,MAAG,UAAU,yBAA0B,GAAGA,EAAO,EAEnD,IAAK,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACtB,OAAC,OAAI,UAAU,qCAAsC,GAAGA,EAAO,EAIhE,KAAM,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACvB,OAAC,QACA,UAAU,mDACT,GAAGA,EACL,EAGD,IAAK,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACtB,OAAC,OACA,UAAU,kGACT,GAAGA,EACL,EAGD,KAAM,CAAC,CAAE,KAAAD,EAAM,MAAAU,EAAO,GAAGT,CAAM,OAC9B,OAAC,QACA,MAAOS,EACP,UAAU,0CACT,GAAGT,EACL,EAGD,IAAK,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACtB,OAAC,OAAI,UAAU,oBAAqB,GAAGA,EAAO,EAE/C,IAAK,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACtB,OAAC,OAAI,UAAU,sBAAuB,GAAGA,EAAO,EAGjD,QAAS,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OAC1B,OAAC,WACA,UAAU,wDACT,GAAGA,EACL,EAED,QAAS,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OAC1B,OAAC,WACA,UAAU,2DACT,GAAGA,EACL,EAGD,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACrB,OAAC,MAAG,UAAU,iBAAkB,GAAGA,EAAO,EAE3C,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACrB,OAAC,MAAG,UAAU,gCAAiC,GAAGA,EAAO,EAE1D,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACrB,OAAC,MAAG,UAAU,6BAA8B,GAAGA,EAAO,EAGvD,MAAO,CAAC,CAAE,KAAAD,EAAM,IAAAnC,EAAK,GAAGoC,CAAM,OAC7B,OAAC,SACA,IAAKpC,EACL,SAAQ,GACR,UAAU,8CACT,GAAGoC,EACL,EAGD,OAAQ,CAAC,CAAE,KAAAD,EAAM,IAAAnC,EAAK,MAAA6C,EAAO,GAAGT,CAAM,OACrC,OAAC,UACA,IAAKpC,EACL,MAAO6C,EACP,UAAU,8CACV,gBAAe,GACd,GAAGT,EACL,EAGD,MAAO,CAAC,CAAE,KAAAD,EAAM,IAAAnC,EAAK,GAAGoC,CAAM,OAC7B,OAAC,SAAM,IAAKpC,EAAK,SAAQ,GAAC,UAAU,cAAe,GAAGoC,EAAO,EAG9D,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OAAW,OAAC,MAAI,GAAGA,EAAO,EAEhD,IAAK,CAAC,CAAE,KAAAD,EAAM,UAAAO,EAAW,GAAGN,CAAM,IAAW,CAE5C,IAAMqB,EAAiBf,EAAY,GAAGA,CAAS,QAAU,OACzD,SAAO,OAAC,OAAI,UAAWe,EAAiB,GAAGrB,EAAO,CACnD,EAEA,KAAM,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OAAW,OAAC,QAAM,GAAGA,EAAO,EAEpD,QAAS,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OAC1B,OAAC,WAAQ,UAAU,OAAQ,GAAGA,EAAO,EAGtC,QAAS,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OAC1B,OAAC,WAAQ,UAAU,OAAQ,GAAGA,EAAO,EAGtC,MAAO,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACxB,OAAC,SACA,UAAU,mEACT,GAAGA,EACL,EAGD,QAAS,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OAC1B,OAAC,WAAQ,UAAU,kBAAmB,GAAGA,EAAO,EAGjD,KAAM,CAAC,CAAE,KAAAD,EAAM,SAAAuB,EAAU,GAAGtB,CAAM,OACjC,OAAC,QACA,SAAUsB,EACV,UAAU,wBACT,GAAGtB,EACL,EAGD,MAAO,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACxB,OAAC,SAAM,UAAU,gCAAiC,GAAGA,EAAO,EAG7D,IAAK,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACtB,OAAC,OACA,UAAU,8DACT,GAAGA,EACL,EAGD,KAAM,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACvB,OAAC,QACA,UAAU,iDACT,GAAGA,EACL,EAGD,IAAK,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACtB,OAAC,OAAI,UAAU,gCAAiC,GAAGA,EAAO,EAG3D,KAAM,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACvB,OAAC,QAAK,UAAU,+BAAgC,GAAGA,EAAO,EAG3D,EAAG,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACpB,OAAC,KAAE,UAAU,+BAAgC,GAAGA,EAAO,EAGxD,IAAK,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACtB,OAAC,OAAI,UAAU,uBAAwB,GAAGA,EAAO,EAGlD,IAAK,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OAAW,OAAC,OAAK,GAAGA,EAAO,EAClD,IAAK,CAAC,CAAE,KAAAD,EAAM,IAAAwB,EAAK,GAAGvB,CAAM,OAAW,OAAC,OAAI,IAAKuB,EAAM,GAAGvB,EAAO,EAEjE,IAAK,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OAAW,OAAC,OAAK,GAAGA,EAAO,EAElD,KAAM,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACvB,OAAC,QAAK,UAAU,YAAa,GAAGA,EAAO,EAExC,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACrB,OAAC,MAAG,UAAU,gCAAiC,GAAGA,EAAO,EAE1D,GAAI,CAAC,CAAE,KAAAD,EAAM,GAAGC,CAAM,OACrB,OAAC,MAAG,UAAU,gCAAiC,GAAGA,EAAO,EAG1D,MAAO,CAAC,CAAE,KAAAD,EAAM,MAAAyB,EAAO,IAAAC,EAAK,IAAAC,EAAK,GAAG1B,CAAM,OACzC,OAAC,SACA,MAAOwB,EACP,IAAKC,EACL,IAAKC,EACL,UAAU,qBACT,GAAG1B,EACL,EAGD,SAAU,CAAC,CAAE,KAAAD,EAAM,MAAAyB,EAAO,IAAAE,EAAK,GAAG1B,CAAM,OACvC,OAAC,YACA,MAAOwB,EACP,IAAKE,EACL,UAAU,qBACT,GAAG1B,EACL,CAEF,EAEC,SAAAzB,EACF,EACC,GAEF,CAEF,CAlzBA,IAEAoD,GACAC,EACAC,GACAC,GACAC,GAIAC,GACAC,GACAC,GAgEIC,EA5EJC,GAAAC,GAAA,KAAAC,KACAC,KACAZ,GAA4B,wBAC5BC,EAAuB,oBACvBC,GAA0B,6BAC1BC,GAA2C,oCAC3CC,GAGO,0DACPC,GAAsB,yBACtBC,GAA2B,8BAC3BC,GAAsB,yBAgElBC,EAAA,+BC5EJ,IAAAK,GAAA,GAAAC,GAAAD,GAAA,mBAAAE,KAAA,eAAAC,GAAAH,ICAAI,KACA,IAAAC,GAAuB,oBAYnBC,GAAA,6BAVEC,GAA2B,QAAK,IACrC,sCAA4B,KAAKC,IAAM,CACtC,QAASA,EAAE,cACZ,EAAE,CACH,EAEO,SAASC,GAAmBC,EAAY,CAC9C,SACC,QAAO,YAAN,CACA,YACC,SAAC,OAAI,UAAU,MACd,qBAACC,EAAA,CAAS,UAAU,iBAAiB,KACrC,QAACA,EAAA,CAAS,UAAU,kBAAkB,KACtC,QAACA,EAAA,CAAS,UAAU,kBAAkB,KACtC,QAACA,EAAA,CAAS,UAAU,YAAY,GACjC,EAGD,oBAACJ,GAAA,CAAoB,GAAGG,EAAO,EAChC,CAEF,CCxBAE,KACAC,KACA,IAAAC,EAQO,wBACPC,GAAuB,oBAmGlBC,EAAA,6BApEL,SAASC,GAAaC,EAAkC,CACvD,OAAQA,EAAM,CACb,IAAK,kBACL,IAAK,oBACJ,OAAO,QACR,IAAK,uBACJ,OAAO,UACR,IAAK,uBACJ,OAAO,cACR,IAAK,uBACL,IAAK,yBACJ,OAAO,aACR,IAAK,uBACJ,OAAO,OACR,QACC,OAAO,aACT,CACD,CAEA,SAASC,GAAkBD,EAA0C,CACpE,OAAQA,EAAM,CACb,IAAK,kBACJ,MAAO,iEACR,IAAK,uBACJ,MAAO,6HACR,IAAK,oBACJ,MAAO,mFACR,IAAK,uBACJ,MAAO,0IACR,IAAK,uBACJ,MAAO,8FACR,IAAK,yBACJ,MAAO,sHACR,IAAK,uBACJ,MAAO,kFACR,IAAK,uBACJ,MAAO,2JACR,IAAK,4BACJ,MAAO,oIACR,IAAK,+BACJ,MAAO,wGACR,IAAK,6BACJ,MAAO,sJACR,QACC,MAAO,sCACT,CACD,CAEA,SAASE,GAAU,CAAE,MAAAC,EAAO,MAAAC,CAAM,EAAmB,CACpD,IAAMC,EAAON,GAAaI,EAAM,IAAI,EAC9B,CAACG,EAAQC,CAAS,EAAU,YAAS,EAAK,EAE1CC,EAAiB,IAAM,CAC5B,IAAMC,EAAaN,EAAM,MAAQA,EAAM,OAAO,KAAK,IAAI,GAAK,GAC5D,UAAU,UAAU,UAAUM,CAAU,EACxCF,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,GAAI,CACxC,EAEA,SACC,QAAC,OACA,UAAWG,EACV,iJACA,qBACD,EAEA,qBAAC,OAAI,UAAU,yBACd,oBAAC,OAAI,UAAU,yGACd,mBAACL,EAAA,CAAK,UAAU,UAAU,EAC3B,KACA,QAAC,OAAI,UAAU,mBACd,qBAAC,OAAI,UAAU,0CACd,qBAAC,OAAI,UAAU,0BACd,qBAAC,QAAK,UAAU,8CAA8C,cAC3DD,EAAQ,GACX,KACA,OAAC,QAAK,UAAU,yCACd,SAAAH,GAAkBE,EAAM,IAAI,EAC9B,GACD,KACA,OAACQ,GAAA,CACA,QAAQ,QACR,KAAK,KACL,UAAU,cACV,QAASH,EACT,MAAM,wFAEL,SAAAF,KACA,OAAC,gBAAa,UAAU,6BAA6B,KAErD,OAAC,QAAK,UAAU,cAAc,EAEhC,GACD,KACA,QAAC,OAAI,UAAU,YACZ,WAAAH,EAAM,MAAQA,EAAM,QAAUA,EAAM,WACrC,QAAC,OAAI,UAAU,oCACd,qBAAC,QAAK,UAAU,gCACd,UAAAA,EAAM,MAAQ,4BACdA,EAAM,QAAU,kCAChBA,EAAM,OAAS,mCACjB,EACCA,EAAM,SACN,OAAC,QAAK,UAAU,mEACd,SAAAA,EAAM,KACR,EAEAA,EAAM,WACN,OAAC,QAAK,UAAU,mEACd,SAAAA,EAAM,OACR,EAEAA,EAAM,UACN,OAAC,OAAI,UAAU,uBACb,SAAAA,EAAM,MAAM,IAAIS,MAChB,OAAC,QAEA,UAAU,mEAET,SAAAA,GAHIA,CAIN,CACA,EACF,GAEF,KAED,QAAC,OAAI,UAAU,yBACd,oBAAC,QAAK,UAAU,gCAAgC,qCAAK,KACrD,OAAC,QAAK,UAAU,6EACd,SAAAT,EAAM,MAAQA,EAAM,OAAO,KAAK,IAAI,EACtC,GACD,GACD,GACD,GACD,KAEA,QAAC,OAAI,UAAU,sDACd,qBAAC,OACA,oBAAC,QAAK,UAAU,4CAA4C,uDAE5D,KACA,OAAC,KAAE,UAAU,+BAAgC,SAAAA,EAAM,OAAO,GAC3D,KACA,QAAC,OACA,oBAAC,QAAK,UAAU,yDAAyD,uDAEzE,KACA,OAAC,KAAE,UAAU,kDACX,SAAAA,EAAM,IACR,GACD,GACD,GACD,CAEF,CAMO,SAASU,GAAW,CAAE,OAAAC,CAAO,EAAoB,CACvD,MAAI,CAACA,GAAUA,EAAO,SAAW,KAE/B,QAAC,OAAI,UAAU,8IACd,oBAAC,gBAAa,UAAU,oDAAoD,KAC5E,OAAC,MAAG,UAAU,gEAAgE,wGAE9E,KACA,OAAC,KAAE,UAAU,yDAAyD,sTAEtE,GACD,KAKD,QAAC,OAAI,UAAU,YACd,qBAAC,OAAI,UAAU,oCACd,qBAAC,OACA,oBAAC,MAAG,UAAU,oCAAoC,gLAElD,KACA,QAAC,KAAE,UAAU,qCAAqC,wDACxCA,EAAO,OAAO,IAAEA,EAAO,SAAW,EAAI,uCAAW,uCAAU,IAAI,0IAEzE,GACD,KACA,OAAC,OAAI,UAAU,6FACd,mBAAC,eAAY,UAAU,UAAU,EAClC,GACD,KAEA,OAAC,OAAI,UAAU,YACb,SAAAA,EAAO,IAAI,CAACX,EAAOC,OACnB,OAACF,GAAA,CAEA,MAAOC,EACP,MAAOC,GAFF,GAAGD,EAAM,IAAI,IAAIA,EAAM,IAAI,IAAIC,CAAK,EAG1C,CACA,EACF,GACD,CAEF,CCrPA,IAAAW,GAA0B,wBCA1B,IAAAC,GAAuB,oBACvBC,EAAiC,qCACjCC,GAA8C,wBAE9CC,KAYE,IAAAC,EAAA,6BAVIC,GAAyB,OAI/B,IAAMC,GAA8B,QAE9BC,GAAsB,cAG1B,CAAC,CAAE,UAAAC,EAAW,SAAAC,EAAU,GAAGC,CAAM,EAAGC,OACpC,QAAiB,UAAhB,CACC,IAAKA,EACL,UAAWC,EACT,iUACAJ,CACF,EACC,GAAGE,EAEH,UAAAD,KACD,OAAiB,OAAhB,CAAqB,QAAO,GAC3B,mBAAC,gBAAY,UAAU,qBAAqB,EAC9C,GACF,CACD,EACDF,GAAc,YAA8B,UAAQ,YAEpD,IAAMM,GAA6B,cAGjC,CAAC,CAAE,UAAAL,EAAW,GAAGE,CAAM,EAAGC,OAC1B,OAAiB,iBAAhB,CACC,IAAKA,EACL,UAAWC,EACT,uDACAJ,CACF,EACC,GAAGE,EAEJ,mBAAC,cAAU,UAAU,UAAU,EACjC,CACD,EACDG,GAAqB,YAA8B,iBAAe,YAElE,IAAMC,GAA+B,cAGnC,CAAC,CAAE,UAAAN,EAAW,GAAGE,CAAM,EAAGC,OAC1B,OAAiB,mBAAhB,CACC,IAAKA,EACL,UAAWC,EACT,uDACAJ,CACF,EACC,GAAGE,EAEJ,mBAAC,gBAAY,UAAU,UAAU,EACnC,CACD,EACDI,GAAuB,YACL,mBAAiB,YAEnC,IAAMC,GAAsB,cAG1B,CAAC,CAAE,UAAAP,EAAW,SAAAC,EAAU,SAAAO,EAAW,SAAU,GAAGN,CAAM,EAAGC,OACzD,OAAiB,SAAhB,CACC,oBAAiB,UAAhB,CACC,IAAKA,EACL,UAAWC,EACT,gjBACAI,IAAa,UACX,kIACFR,CACF,EACA,SAAUQ,EACT,GAAGN,EAEJ,oBAACG,GAAA,EAAqB,KACtB,OAAiB,WAAhB,CACC,UAAWD,EACT,MACAI,IAAa,UACX,yFACJ,EAEC,SAAAP,EACH,KACA,OAACK,GAAA,EAAuB,GAC1B,EACF,CACD,EACDC,GAAc,YAA8B,UAAQ,YAEpD,IAAME,GAAoB,cAGxB,CAAC,CAAE,UAAAT,EAAW,GAAGE,CAAM,EAAGC,OAC1B,OAAiB,QAAhB,CACC,IAAKA,EACL,UAAWC,EAAG,oCAAqCJ,CAAS,EAC3D,GAAGE,EACN,CACD,EACDO,GAAY,YAA8B,QAAM,YAEhD,IAAMC,GAAmB,cAGvB,CAAC,CAAE,UAAAV,EAAW,SAAAC,EAAU,GAAGC,CAAM,EAAGC,OACpC,QAAiB,OAAhB,CACC,IAAKA,EACL,UAAWC,EACT,4NACAJ,CACF,EACC,GAAGE,EAEJ,oBAAC,QAAK,UAAU,gEACd,mBAAiB,gBAAhB,CACC,mBAAC,UAAM,UAAU,UAAU,EAC7B,EACF,KACA,OAAiB,WAAhB,CAA0B,SAAAD,EAAS,GACtC,CACD,EACDS,GAAW,YAA8B,OAAK,YAE9C,IAAMC,GAAwB,cAG5B,CAAC,CAAE,UAAAX,EAAW,GAAGE,CAAM,EAAGC,OAC1B,OAAiB,YAAhB,CACC,IAAKA,EACL,UAAWC,EAAG,2BAA4BJ,CAAS,EAClD,GAAGE,EACN,CACD,EACDS,GAAgB,YAA8B,YAAU,YD/GrD,IAAAC,GAAA,6BAhBI,SAASC,GAAe,CAC9B,UAAAC,EACA,iBAAAC,EACA,iBAAAC,CACD,EAAwB,CACvB,OAAIF,EAAU,SAAW,EACjB,QAIP,SAACG,GAAA,CACA,MAAOF,GAAoB,GAC3B,cAAgBG,GAAU,CACzBF,EAAiBE,GAAS,IAAI,CAC/B,EAEA,sBAACC,GAAA,CAAc,UAAU,gBACxB,qBAAC,cAAU,UAAU,eAAe,KACpC,QAACC,GAAA,CAAY,YAAY,WAAW,GACrC,KACA,QAACC,GAAA,CACC,SAAAP,EAAU,IAAIQ,MACd,QAACC,GAAA,CAAsB,MAAOD,EAC5B,SAAAA,EAAK,YAAY,GADFA,CAEjB,CACA,EACF,GACD,CAEF,CE3CE,IAAAE,GAAA,6BAFK,SAASC,GAAK,CAAE,UAAAC,CAAU,EAAqC,CACrE,SACC,SAAC,OACA,MAAM,MACN,OAAO,MACP,QAAQ,cACR,KAAK,OACL,MAAM,6BACN,UAAWA,EAEX,qBAAC,QACA,EAAE,0lTACF,KAAK,UACN,KACA,QAAC,QACA,EAAE,8wIACF,KAAK,UACN,KACA,QAAC,QACA,EAAE,uuCACF,KAAK,UACN,GACD,CAEF,CCxBAC,KCAA,IAAAC,GAAuB,oBCAvB,IAAAC,GAAuB,oBACvBC,EAAiC,qCACjCC,GAAkB,wBAElBC,KAcE,IAAAC,GAAA,6BAZIC,GAAyB,OAI/B,IAAMC,GAA+B,SAIrC,IAAMC,GAAsB,cAG1B,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAM,EAAGC,OAC1B,QAAiB,UAAhB,CACC,IAAKA,EACL,UAAWC,EACT,0JACAH,CACF,EACC,GAAGC,EACN,CACD,EACDF,GAAc,YAA8B,UAAQ,YAEpD,IAAMK,GAAsB,cAG1B,CAAC,CAAE,UAAAJ,EAAW,SAAAK,EAAU,GAAGJ,CAAM,EAAGC,OACpC,SAACI,GAAA,CACC,qBAACP,GAAA,EAAc,KACf,SAAiB,UAAhB,CACC,IAAKG,EACL,UAAWC,EACT,8fACAH,CACF,EACC,GAAGC,EAEH,UAAAI,KACD,SAAiB,QAAhB,CAAsB,UAAU,gRAC/B,qBAAC,MAAE,UAAU,UAAU,KACvB,QAAC,QAAK,UAAU,UAAU,iBAAK,GACjC,GACF,GACF,CACD,EACDD,GAAc,YAA8B,UAAQ,YAEpD,IAAMG,GAAe,CAAC,CACpB,UAAAP,EACA,GAAGC,CACL,OACE,QAAC,OACC,UAAWE,EACT,qDACAH,CACF,EACC,GAAGC,EACN,EAEFM,GAAa,YAAc,eAE3B,IAAMC,GAAe,CAAC,CACpB,UAAAR,EACA,GAAGC,CACL,OACE,QAAC,OACC,UAAWE,EACT,gEACAH,CACF,EACC,GAAGC,EACN,EAEFO,GAAa,YAAc,eAE3B,IAAMC,GAAoB,cAGxB,CAAC,CAAE,UAAAT,EAAW,GAAGC,CAAM,EAAGC,OAC1B,QAAiB,QAAhB,CACC,IAAKA,EACL,UAAWC,EACT,oDACAH,CACF,EACC,GAAGC,EACN,CACD,EACDQ,GAAY,YAA8B,QAAM,YAEhD,IAAMC,GAA0B,cAG9B,CAAC,CAAE,UAAAV,EAAW,GAAGC,CAAM,EAAGC,OAC1B,QAAiB,cAAhB,CACC,IAAKA,EACL,UAAWC,EAAG,gCAAiCH,CAAS,EACvD,GAAGC,EACN,CACD,EACDS,GAAkB,YAA8B,cAAY,YDxG5DC,KACA,IAAAC,GAAuB,wBAMtBC,EAAA,6BAJKC,GAAgB,cAGpB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAM,EAAGC,OAC3B,OAAC,OACA,IAAKA,EACL,UAAWC,EACV,4FACAH,CACD,EACC,GAAGC,EACL,CACA,EACDF,GAAQ,YAAc,UAEtB,IAAMK,GAAqB,cAKzB,CAAC,CAAE,UAAAJ,EAAW,cAAAK,EAAe,GAAGJ,CAAM,EAAGC,IAAQ,CAClD,GAAM,CAACI,EAAOC,CAAQ,EAAU,YAASN,EAAM,OAAS,EAAE,EAE1D,OAAM,aAAU,IAAM,CACjBA,EAAM,QAAU,QACnBM,EAAS,OAAON,EAAM,KAAK,CAAC,CAE9B,EAAG,CAACA,EAAM,KAAK,CAAC,KAYf,QAAC,OAAI,UAAU,kCACd,oBAAC,WAAO,UAAU,mCAAmC,KACrD,OAAC,SACA,IAAKC,EACJ,GAAGD,EACJ,MAAOK,EACP,SAhBmBE,GAA2C,CAChE,IAAMC,EAAWD,EAAE,OAAO,MAC1BD,EAASE,CAAQ,EACjBJ,IAAgBI,CAAQ,EACpBR,EAAM,UACTA,EAAM,SAASO,CAAC,CAElB,EAUG,UAAWL,EACV,yJACAH,CACD,EACD,GACD,CAEF,CAAC,EACDI,GAAa,YAAc,eAE3B,IAAMM,GAAoB,cAGxB,CAAC,CAAE,UAAAV,EAAW,GAAGC,CAAM,EAAGC,OAC3B,OAAC,OACA,IAAKA,EACL,UAAWC,EAAG,kDAAmDH,CAAS,EACzE,GAAGC,EACL,CACA,EACDS,GAAY,YAAc,cAE1B,IAAMC,GAAqB,cAGzB,CAAC,CAAE,UAAAX,EAAW,GAAGC,CAAM,EAAGC,OAC3B,OAAC,OACA,IAAKA,EACL,UAAWC,EAAG,2BAA4BH,CAAS,EAClD,GAAGC,EACL,CACA,EACDU,GAAa,YAAc,eAE3B,IAAMC,GAAqB,cAKzB,CAAC,CAAE,UAAAZ,EAAW,QAAAa,EAAS,GAAGZ,CAAM,EAAGC,OACpC,QAAC,OAAI,IAAKA,EAAK,UAAWC,EAAG,sCAAuCH,CAAS,EAAI,GAAGC,EAClF,UAAAY,MACA,OAAC,OAAI,UAAU,0DACb,SAAAA,EACF,KAED,OAAC,OACC,SAAAZ,EAAM,SACR,GACD,CACA,EACDW,GAAa,YAAc,eAE3B,IAAME,GAAoB,cAMxB,CAAC,CAAE,UAAAd,EAAW,SAAAe,EAAU,GAAGd,CAAM,EAAGC,IAAQ,CAC7C,IAAMc,EAAc,IAAM,CACzBD,IAAW,CACZ,EAEA,SACC,OAAC,OACA,IAAKb,EACL,UAAWC,EACV,gOACAH,CACD,EACA,QAASgB,EACR,GAAGf,EACL,CAEF,CAAC,EACDa,GAAY,YAAc,cAE1B,IAAMG,GAAgB,CAAC,CACtB,KAAAC,EACA,aAAAC,EACA,SAAAC,CACD,OAME,OAACC,GAAA,CAAO,KAAMH,EAAM,aAAcC,EACjC,mBAACG,GAAA,CAAc,UAAU,sBACxB,mBAACvB,GAAA,CACC,SAAAqB,EACF,EACD,EACD,EE5IF,IAAMG,GAAmB,aAClB,SAASC,GACfC,EACAC,EACW,CAOX,IAAMC,EANeD,EAAM,OAAOE,GACfA,EAAK,aAAa,MAAM,OAAO,EAChC,CAAC,IAAMH,CACxB,EAGiC,OACjCI,GACCA,EAAE,QAAU,GAAKA,EAAE,OAAS,aAAeN,GAAiB,KAAKM,EAAE,IAAI,CACzE,EAEA,OAAIF,EAAa,SAAW,EACpB,CAAC,EAGFA,EAAa,IAAIG,GAAOA,EAAI,IAAI,EAAE,KAAK,CAC/C,CCrBA,IAAMC,GAAgB,iBAChBC,GAAiB,gBAEhB,SAASC,GACfC,EACAC,EACkD,CAClD,GAAID,EAAK,OAAS,OACjB,OAAIF,GAAe,KAAKE,EAAK,IAAI,EACzB,SAEJA,EAAK,YAAc,KACf,OAED,KAGR,GAAIA,EAAK,OAAS,YAAa,CAC9B,GAAIH,GAAc,KAAKG,EAAK,IAAI,EAC/B,MAAO,QASR,GANiBC,EAAS,KACzBC,GACCA,EAAE,aAAa,WAAWF,EAAK,aAAe,GAAG,GAChDE,EAAE,aAAa,WAAWF,EAAK,aAAe,IAAI,GAClDE,EAAE,OAAS,MACd,EAEC,MAAO,UAET,CAEA,OAAO,IACR,CCrCO,IAAMC,GACZ,GACyD,EAAE,OAAS,OAExDC,GACZ,GAC2D,EAAE,OAAS,SAE1DC,GACZ,GAEA,EAAE,OAAS,WAECC,GACZ,GAC0D,EAAE,OAAS,QAQ/D,SAASC,GAAS,EAAiC,CACzD,OAAIC,GAAO,CAAC,EAAU,EAAE,aAAa,QAAU,GAC3CC,GAAS,CAAC,EAAU,EAAE,SAAS,QAAU,GACzCC,GAAW,CAAC,GACZC,GAAQ,CAAC,EAAU,EAAE,UAAU,QAAU,GACtC,EACR,CC5BO,SAASC,GACfC,EACwB,CACxB,OAAOA,EAAK,KAAK,CAACC,EAAGC,IAAM,CAC1B,IAAMC,EAAKC,GAASH,CAAC,GAElBI,GAAQJ,CAAC,GAETK,GAAWL,CAAC,EAHZA,EAAE,SAAS,MAKXA,EAAE,aAAa,OAAS,IAErBM,EAAKH,GAASF,CAAC,GAElBG,GAAQH,CAAC,GAETI,GAAWJ,CAAC,EAHZA,EAAE,SAAS,MAKXA,EAAE,aAAa,OAAS,IAE3B,GAAIC,IAAOI,EAAI,OAAOJ,EAAKI,EAE3B,IAAMC,EAAKJ,GAASH,CAAC,GAElBI,GAAQJ,CAAC,GAETK,GAAWL,CAAC,EAHZA,EAAE,SAAS,MAKXA,EAAE,aAAa,OAAS,GAErBQ,EAAKL,GAASF,CAAC,GAElBG,GAAQH,CAAC,GAETI,GAAWJ,CAAC,EAHZA,EAAE,SAAS,MAKXA,EAAE,aAAa,OAAS,GAE3B,OAAOM,EAAG,cAAcC,CAAE,CAC3B,CAAC,CACF,CCzCO,SAASC,GAASC,EAAqC,CAC7D,OAAIA,EAAO,OAAS,OACZA,EAAO,aAAa,OAASA,EAAO,KAAK,KAAK,WAAW,MAAO,EAAE,EAEtEA,EAAO,OAAS,SACZA,EAAO,SAAS,MAEpBA,EAAO,OAAS,WACZA,EAAO,UAAU,OAASA,EAAO,OAAO,KAE5CA,EAAO,OAAS,QAElBA,EAAO,UAAU,OACjBA,EAAO,OAAO,KAAK,QAAQ,YAAa,EAAE,EAAE,QAAQ,MAAO,EAAE,EAGxD,EACR,CCnBO,IAAMC,GAAmB,aACnBC,GAAiB,gBRa9B,IAAAC,GAAuB,wBACvBC,GAAuB,oBA2MrBC,EAAA,6BAlLK,SAASC,GAAU,CACzB,uBAAAC,EACA,gBAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,aAAAC,CACD,EAAmB,CAClB,GAAM,CAACC,EAAMC,CAAO,EAAU,YAAS,EAAK,EACtC,CAACC,EAAOC,CAAQ,EAAU,YAAS,EAAE,EAGrCC,EAAmB,WAAQ,IAAM,CACtC,IAAMC,EAAM,IAAI,IAChB,GAAIN,GAAc,MACjB,QAAWO,KAAQP,EAAa,MAAO,CACtC,IAAMQ,EAAMD,EAAK,sBAAwBA,EAAK,aAC1CA,EAAK,SACRD,EAAI,IAAIE,EAAKD,EAAK,OAAO,CAE3B,CAED,OAAOD,CACR,EAAG,CAACN,CAAY,CAAC,EAGXS,EAAwB,WAAQ,IAAM,CAC3C,IAAMC,EAA0B,CAAC,EAEjC,QAAWC,KAAaf,EAAwB,CAE/C,GAAIC,GAAmBc,EAAU,UAAYd,EAC5C,SAGD,IAAMe,EAAe,CACpBC,EACAC,IACU,CACV,QAAWC,KAAUF,EACpB,GAAIE,EAAO,OAAS,OAAQ,CAE3B,GAAIA,EAAO,aAAa,aAAe,GACtC,SAGD,IAAMC,EACLD,EAAO,KAAK,sBAAwBA,EAAO,KAAK,aAC3CE,EAAQC,GAASH,CAAM,EAGvBI,EAAUd,EAAW,IAAIW,CAAQ,EAEvCN,EAAQ,KAAK,CACZ,OAAAK,EACA,QAAAD,EACA,KAAME,EACN,MAAAC,EACA,QAAAE,CACD,CAAC,CACF,MAAWJ,EAAO,OAAS,YAAcA,EAAO,OAAS,UAExDH,EAAaG,EAAO,MAAOD,CAAO,CAGrC,EAEAF,EAAaD,EAAU,SAAUA,EAAU,OAAO,CACnD,CAEA,OAAOD,CACR,EAAG,CAACd,EAAwBC,EAAiBQ,CAAU,CAAC,EAGlDe,EAAiB,CACtBD,EACAhB,EACAkB,EAAY,MACA,CACZ,IAAMC,EAAeH,EAAQ,YAAY,EACnCI,EAAapB,EAAM,YAAY,EAC/BqB,EAAQF,EAAa,QAAQC,CAAU,EAE7C,GAAIC,IAAU,GAAI,MAAO,GAGzB,IAAIC,EAAQ,KAAK,IAAI,EAAGD,EAAQH,EAAY,CAAC,EAEvCK,EAAcP,EAAQ,UAAUM,EAAOD,CAAK,EAC5CG,EAAeD,EAAY,YAAY,IAAI,EAC3CE,EAAcF,EAAY,YAAY;AAAA,CAAI,EAC1CG,EAAYH,EAAY,YAAY,GAAG,EAEvCI,EAAY,KAAK,IACtBH,EAAe,EACfC,EAAc,EACdC,EAAY,EACZJ,CACD,EAGIM,GAAM,KAAK,IAAIZ,EAAQ,OAAQK,EAAQrB,EAAM,OAASkB,EAAY,CAAC,EAEjEW,GAAab,EAAQ,UAAUK,EAAQrB,EAAM,OAAQ4B,EAAG,EACxDE,GAAeD,GAAW,QAAQ,IAAI,EACtCE,GAAcF,GAAW,QAAQ;AAAA,CAAI,EACrCG,GAAYH,GAAW,QAAQ,GAAG,EAEpCI,GAAUL,GACVE,KAAiB,GACpBG,GAAUZ,EAAQrB,EAAM,OAAS8B,GAAe,EACtCC,KAAgB,GAC1BE,GAAUZ,EAAQrB,EAAM,OAAS+B,GACvBC,KAAc,KACxBC,GAAUZ,EAAQrB,EAAM,OAASgC,IAGlC,IAAIE,EAAUlB,EAAQ,UAAUW,EAAWM,EAAO,EAAE,KAAK,EAGzD,OAAIN,EAAY,IAAGO,EAAU,MAAQA,GACjCD,GAAUjB,EAAQ,SAAQkB,EAAUA,EAAU,OAE3CA,CACR,EAGMC,EAAwB,WAAQ,IAAM,CAC3C,GAAI,CAACnC,EAAM,KAAK,EAAG,MAAO,CAAC,EAE3B,IAAMoB,EAAapB,EAAM,YAAY,EAAE,KAAK,EAE5C,OAAOM,EACL,OAAO8B,GAAQ,CACf,IAAMC,EAAaD,EAAK,MAAM,YAAY,EAAE,SAAShB,CAAU,EACzDkB,EAAYF,EAAK,KAAK,YAAY,EAAE,SAAShB,CAAU,EACvDmB,EAAeH,EAAK,SAAS,SAAShB,CAAU,GAAK,GAE3D,OAAOiB,GAAcC,GAAaC,CACnC,CAAC,EACA,IAAIH,GAAQ,CACZ,IAAIF,EAGJ,OAAIE,EAAK,SAAS,SAAShB,CAAU,EACpCc,EAAUjB,EAAemB,EAAK,QAASpC,CAAK,EAClCoC,EAAK,MAAM,YAAY,EAAE,SAAShB,CAAU,IAEtDc,EAAUE,EAAK,OAGT,CACN,GAAGA,EACH,QAAAF,CACD,CACD,CAAC,CACH,EAAG,CAAClC,EAAOM,CAAe,CAAC,EAGrBkC,EAAgBC,GAAiB,CACtC7C,EAAa6C,CAAI,EACjB1C,EAAQ,EAAK,EACbE,EAAS,EAAE,CACZ,EAGA,OAAM,aAAU,IAAM,CACrB,IAAMyC,EAAQC,GAAqB,CAC9BA,EAAE,MAAQ,MAAQA,EAAE,SAAWA,EAAE,WACpCA,EAAE,eAAe,EACjB5C,EAAQD,GAAQ,CAACA,CAAI,EAEvB,EAEA,gBAAS,iBAAiB,UAAW4C,CAAI,EAClC,IAAM,SAAS,oBAAoB,UAAWA,CAAI,CAC1D,EAAG,CAAC,CAAC,KAGJ,oBACC,qBAACE,GAAA,CACA,QAAQ,UACR,UAAU,2FACV,QAAS,IAAM7C,EAAQ,EAAI,EAE3B,oBAAC,WAAO,UAAU,eAAe,KACjC,OAAC,QAAK,UAAU,wBAAwB,sHAAqB,KAC7D,OAAC,QAAK,UAAU,wBAAwB,6CAAQ,KAChD,QAAC,OAAI,UAAU,gLACd,oBAAC,QAAK,UAAU,UAAU,kBAAC,EAAO,KACnC,GACD,KAEA,QAAC8C,GAAA,CAAc,KAAM/C,EAAM,aAAcC,EACxC,oBAAC+C,GAAA,CACA,YAAY,0HACZ,MAAO9C,EACP,cAAeC,EAChB,KACA,QAAC8C,GAAA,CACC,UAAAZ,EAAgB,SAAW,GAAKnC,EAAM,KAAK,MAC3C,OAACgD,GAAA,CAAa,yGAAkB,EAEhCb,EAAgB,OAAS,MACzB,OAACc,GAAA,CAAa,QAAQ,mDACpB,SAAAd,EAAgB,IAAI,CAACe,EAAQ7B,IAAU,CAEvC,IAAM8B,EAAmB,CAACC,EAAcpD,IAAkB,CACzD,GAAI,CAACoD,GAAQ,CAACpD,EAAO,OAAOoD,EAC5B,IAAMC,EAAQ,IAAI,OACjB,IAAIrD,EAAM,QAAQ,sBAAuB,MAAM,CAAC,IAChD,IACD,EAEA,OADcoD,EAAK,MAAMC,CAAK,EACjB,IAAI,CAACC,EAAMC,IACvBD,EAAK,YAAY,IAAMtD,EAAM,YAAY,KACxC,OAAC,QAEA,UAAU,wDAET,SAAAsD,GAHIC,CAIN,EAEAD,CAEF,CACD,EAEA,SACC,OAACE,GAAA,CAEA,MAAO,GAAGN,EAAO,KAAK,IAAIA,EAAO,IAAI,GACrC,SAAU,IAAMV,EAAaU,EAAO,IAAI,EACxC,UAAU,iBAEV,oBAAC,OAAI,UAAU,sBACd,oBAAC,QAAK,UAAU,cAAe,SAAAA,EAAO,MAAM,EAC3CA,EAAO,YACP,OAAC,QAAK,UAAU,6CACd,SAAAC,EAAiBD,EAAO,QAASlD,CAAK,EACxC,KAED,QAAC,QAAK,UAAU,mCACd,UAAAkD,EAAO,QAAQ,WAAIA,EAAO,MAC5B,GACD,GAfK,GAAGA,EAAO,OAAO,IAAIA,EAAO,IAAI,IAAI7B,CAAK,EAgB/C,CAEF,CAAC,EACF,EAEA,CAACrB,EAAM,KAAK,MACZ,OAACgD,GAAA,CAAa,sJAA4B,GAE5C,GACD,GACD,CAEF,CSzSA,IAAAS,GAAyB,wBACzBC,GAAuB,oBCDvBC,KACAA,KACA,IAAAC,GAA0B,wBAC1BC,EAAuB,oBAEvBC,KCLA,IAAAC,GAAuB,oBAEvBC,KAKM,IAAAC,GAAA,6BAHAC,GAAc,cAClB,CAAC,CAAE,UAAAC,EAAW,KAAAC,EAAM,GAAGC,CAAM,EAAGC,OAE5B,QAAC,SACC,KAAMF,EACN,UAAWG,EACT,0WACAJ,CACF,EACA,IAAKG,EACJ,GAAGD,EACN,CAGN,EACAH,GAAM,YAAc,QCnBpB,IAAAM,GAAuB,oBACvBC,GAAoC,wCAEpCC,KAUI,IAAAC,GAAA,6BAREC,GAAkB,cAItB,CACE,CAAE,UAAAC,EAAW,YAAAC,EAAc,aAAc,WAAAC,EAAa,GAAM,GAAGC,CAAM,EACrEC,OAEA,QAAoB,QAAnB,CACC,IAAKA,EACL,WAAYF,EACZ,YAAaD,EACb,UAAWI,EACT,qBACAJ,IAAgB,aAAe,iBAAmB,iBAClDD,CACF,EACC,GAAGG,EACN,CAEJ,EACAJ,GAAU,YAAiC,QAAK,YC1BhD,IAAAO,GAAuB,oBACvBC,EAAgC,qCAChCC,KACA,IAAAC,GAAkB,wBAElBC,KAcE,IAAAC,GAAA,6BAZIC,GAAuB,OAM7B,IAAMC,GAA6B,SAE7BC,GAAqB,cAGzB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAM,EAAGC,OAC1B,QAAgB,UAAf,CACC,UAAWC,EACT,0JACAH,CACF,EACC,GAAGC,EACJ,IAAKC,EACP,CACD,EACDH,GAAa,YAA6B,UAAQ,YAElD,IAAMK,GAAgBC,GACpB,mMACA,CACE,SAAU,CACR,KAAM,CACJ,IAAK,oGACL,OACE,6GACF,KAAM,gIACN,MACE,kIACJ,CACF,EACA,gBAAiB,CACf,KAAM,OACR,CACF,CACF,EAMMC,GAAqB,cAGzB,CAAC,CAAE,KAAAC,EAAO,QAAS,UAAAP,EAAW,SAAAQ,EAAU,GAAGP,CAAM,EAAGC,OACpD,SAACJ,GAAA,CACC,qBAACC,GAAA,EAAa,KACd,SAAgB,UAAf,CACC,IAAKG,EACL,UAAWC,EAAGC,GAAc,CAAE,KAAAG,CAAK,CAAC,EAAGP,CAAS,EAC/C,GAAGC,EAEJ,sBAAgB,QAAf,CAAqB,UAAU,2OAC9B,qBAAC,MAAE,UAAU,UAAU,KACvB,QAAC,QAAK,UAAU,UAAU,iBAAK,GACjC,EACCO,GACH,GACF,CACD,EACDF,GAAa,YAA6B,UAAQ,YAElD,IAAMG,GAAc,CAAC,CACnB,UAAAT,EACA,GAAGC,CACL,OACE,QAAC,OACC,UAAWE,EACT,mDACAH,CACF,EACC,GAAGC,EACN,EAEFQ,GAAY,YAAc,cAE1B,IAAMC,GAAc,CAAC,CACnB,UAAAV,EACA,GAAGC,CACL,OACE,QAAC,OACC,UAAWE,EACT,gEACAH,CACF,EACC,GAAGC,EACN,EAEFS,GAAY,YAAc,cAE1B,IAAMC,GAAmB,cAGvB,CAAC,CAAE,UAAAX,EAAW,GAAGC,CAAM,EAAGC,OAC1B,QAAgB,QAAf,CACC,IAAKA,EACL,UAAWC,EAAG,wCAAyCH,CAAS,EAC/D,GAAGC,EACN,CACD,EACDU,GAAW,YAA6B,QAAM,YAE9C,IAAMC,GAAyB,cAG7B,CAAC,CAAE,UAAAZ,EAAW,GAAGC,CAAM,EAAGC,OAC1B,QAAgB,cAAf,CACC,IAAKA,EACL,UAAWC,EAAG,gCAAiCH,CAAS,EACvD,GAAGC,EACN,CACD,EACDW,GAAiB,YAA6B,cAAY,YH7G1DC,KIbA,IAAAC,GAAuB,oBACvBC,GAAkC,sCAElCC,KAaI,IAAAC,GAAA,6BAXEC,GAAmC,YAEnCC,GAA2B,QAE3BC,GAAkC,WAElCC,GAAuB,cAG3B,CAAC,CAAE,UAAAC,EAAW,WAAAC,EAAa,EAAG,GAAGC,CAAM,EAAGC,OAC1C,QAAkB,UAAjB,CACC,oBAAkB,WAAjB,CACC,IAAKA,EACL,WAAYF,EACZ,UAAWG,EACT,saACAJ,CACF,EACC,GAAGE,EACN,EACF,CACD,EACDH,GAAe,YAA+B,WAAQ,YC7BtD,IAAAM,GAAuB,oBAEjBC,GAAoB,IAEnB,SAASC,IAAc,CAC5B,GAAM,CAACC,EAAUC,CAAW,EAAU,YAA8B,MAAS,EAE7E,OAAM,aAAU,IAAM,CACpB,IAAMC,EAAM,OAAO,WAAW,eAAeJ,GAAoB,CAAC,KAAK,EACjEK,EAAW,IAAM,CACrBF,EAAY,OAAO,WAAaH,EAAiB,CACnD,EACA,OAAAI,EAAI,iBAAiB,SAAUC,CAAQ,EACvCF,EAAY,OAAO,WAAaH,EAAiB,EAC1C,IAAMI,EAAI,oBAAoB,SAAUC,CAAQ,CACzD,EAAG,CAAC,CAAC,EAEE,CAAC,CAACH,CACX,CLKAI,KAiHK,IAAAC,EAAA,6BA/GCC,GAAsB,gBACtBC,GAAyB,KAAU,GAAK,EACxCC,GAAgB,QAChBC,GAAuB,QACvBC,GAAqB,OACrBC,GAA4B,IAY5BC,GAAuB,gBAA0C,IAAI,EAE3E,SAASC,IAAa,CACrB,IAAMC,EAAgB,aAAWF,EAAc,EAC/C,GAAI,CAACE,EACJ,MAAM,IAAI,MAAM,mDAAmD,EAGpE,OAAOA,CACR,CAEA,IAAMC,GAAwB,aAQ7B,CACC,CACC,YAAAC,EAAc,GACd,KAAMC,EACN,aAAcC,EACd,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,GAAGC,CACJ,EACAC,IACI,CACJ,IAAMC,EAAWC,GAAY,EACvB,CAACC,EAAYC,CAAa,EAAU,WAAS,EAAK,EAIlD,CAACC,EAAOC,CAAQ,EAAU,WAASb,CAAW,EAC9Cc,EAAOb,GAAYW,EACnBG,EAAgB,cACpBC,GAAmD,CACnD,IAAMC,EAAY,OAAOD,GAAU,WAAaA,EAAMF,CAAI,EAAIE,EAC1Dd,EACHA,EAAYe,CAAS,EAErBJ,EAASI,CAAS,EAInB,SAAS,OAAS,GAAG3B,EAAmB,IAAI2B,CAAS,qBAAqB1B,EAAsB,EACjG,EACA,CAACW,EAAaY,CAAI,CACnB,EAGMI,EAAsB,cAAY,IAChCV,EAAWG,EAAcG,GAAQ,CAACA,CAAI,EAAIC,EAAQD,GAAQ,CAACA,CAAI,EACpE,CAACN,EAAUO,EAASJ,CAAa,CAAC,EAG/B,YAAU,IAAM,CACrB,IAAMQ,EAAiBC,GAAyB,CAE9CA,EAAM,MAAQzB,KACbyB,EAAM,SAAWA,EAAM,WAExBA,EAAM,eAAe,EACrBF,EAAc,EAEhB,EAEA,cAAO,iBAAiB,UAAWC,CAAa,EACzC,IAAM,OAAO,oBAAoB,UAAWA,CAAa,CACjE,EAAG,CAACD,CAAa,CAAC,EAIlB,IAAMG,EAAQP,EAAO,WAAa,YAE5BQ,EAAqB,UAC1B,KAAO,CACN,MAAAD,EACA,KAAAP,EACA,QAAAC,EACA,SAAAP,EACA,WAAAE,EACA,cAAAC,EACA,cAAAO,CACD,GACA,CAACG,EAAOP,EAAMC,EAASP,EAAUE,EAAYC,EAAeO,CAAa,CAC1E,EAEA,SACC,OAACtB,GAAe,SAAf,CAAwB,MAAO0B,EAC/B,mBAACC,GAAA,CAAgB,cAAe,EAC/B,mBAAC,OACA,MACC,CACC,kBAAmB/B,GACnB,uBAAwBE,GACxB,GAAGU,CACJ,EAED,UAAWoB,EACV,oFACArB,CACD,EACA,IAAKI,EACJ,GAAGD,EAEH,SAAAD,EACF,EACD,EACD,CAEF,CACD,EACAN,GAAgB,YAAc,kBAE9B,IAAM0B,GAAgB,aAQrB,CACC,CACC,KAAAC,EAAO,OACP,QAAAC,EAAU,UACV,YAAAC,EAAc,YACd,UAAAzB,EACA,SAAAE,EACA,GAAGC,CACJ,EACAC,IACI,CACJ,GAAM,CAAE,SAAAC,EAAU,MAAAa,EAAO,WAAAX,EAAY,cAAAC,CAAc,EAAId,GAAW,EAElE,OAAI+B,IAAgB,UAElB,OAAC,OACA,UAAWJ,EACV,8EACArB,CACD,EACA,IAAKI,EACJ,GAAGD,EAEH,SAAAD,EACF,EAIEG,KAEF,OAACqB,GAAA,CAAM,KAAMnB,EAAY,aAAcC,EAAgB,GAAGL,EACzD,oBAACwB,GAAA,CACA,eAAa,UACb,cAAY,OACZ,UAAU,+EACV,MACC,CACC,kBAAmBrC,EACpB,EAED,KAAMiC,EAEN,qBAACK,GAAA,CAAY,UAAU,UACtB,oBAACC,GAAA,CAAW,mBAAO,KACnB,OAACC,GAAA,CAAiB,wCAA4B,GAC/C,KACA,OAAC,OAAI,UAAU,8BAA+B,SAAA5B,EAAS,GACxD,EACD,KAKD,OAAC,OACA,IAAKE,EACL,UAAU,qDACV,aAAYc,EACZ,mBAAkBA,IAAU,YAAcO,EAAc,GACxD,eAAcD,EACd,YAAWD,EAEX,mBAAC,OACA,UAAWF,EACV,gGACA,yCACAG,IAAY,YAAcA,IAAY,QACnC,gGACA,0HACHxB,CACD,EACC,GAAGG,EAEJ,mBAAC,OACA,eAAa,UACb,UAAU,gNAET,SAAAD,EACF,EACD,EACD,CAEF,CACD,EACAoB,GAAQ,YAAc,UAEtB,IAAMS,GAAuB,aAG3B,CAAC,CAAE,UAAA/B,EAAW,QAAAgC,EAAS,GAAG7B,CAAM,EAAGC,IAAQ,CAC5C,GAAM,CAAE,cAAAW,CAAc,EAAIrB,GAAW,EAErC,SACC,QAACuC,GAAA,CACA,IAAK7B,EACL,eAAa,UACb,QAAQ,QACR,KAAK,OACL,UAAWiB,EAAG,UAAWrB,CAAS,EAClC,QAASiB,GAAS,CACjBe,IAAUf,CAAK,EACfF,EAAc,CACf,EACC,GAAGZ,EAEJ,oBAAC,eAAU,KACX,OAAC,QAAK,UAAU,UAAU,0BAAc,GACzC,CAEF,CAAC,EACD4B,GAAe,YAAc,iBAE7B,IAAMG,GAAoB,aAGxB,CAAC,CAAE,UAAAlC,EAAW,GAAGG,CAAM,EAAGC,IAAQ,CACnC,GAAM,CAAE,cAAAW,CAAc,EAAIrB,GAAW,EAErC,SACC,OAAC,UACA,IAAKU,EACL,eAAa,OACb,aAAW,iBACX,SAAU,GACV,QAASW,EACT,MAAM,iBACN,UAAWM,EACV,kPACA,0JACA,4DACA,4DACArB,CACD,EACC,GAAGG,EACL,CAEF,CAAC,EACD+B,GAAY,YAAc,cAE1B,IAAMC,GAAqB,aAGzB,CAAC,CAAE,UAAAnC,EAAW,GAAGG,CAAM,EAAGC,OAE1B,OAAC,QACA,IAAKA,EACL,UAAWiB,EACV,sFACA,+MACArB,CACD,EACC,GAAGG,EACL,CAED,EACDgC,GAAa,YAAc,eAE3B,IAAMC,GAAqB,aAGzB,CAAC,CAAE,UAAApC,EAAW,GAAGG,CAAM,EAAGC,OAE1B,OAACiC,GAAA,CACA,IAAKjC,EACL,eAAa,QACb,UAAWiB,EACV,4FACArB,CACD,EACC,GAAGG,EACL,CAED,EACDiC,GAAa,YAAc,eAE3B,IAAME,GAAsB,aAG1B,CAAC,CAAE,UAAAtC,EAAW,GAAGG,CAAM,EAAGC,OAE1B,OAAC,OACA,IAAKA,EACL,eAAa,SACb,UAAWiB,EAAG,0BAA2BrB,CAAS,EACjD,GAAGG,EACL,CAED,EACDmC,GAAc,YAAc,gBAE5B,IAAMC,GAAsB,aAG1B,CAAC,CAAE,UAAAvC,EAAW,GAAGG,CAAM,EAAGC,OAE1B,OAAC,OACA,IAAKA,EACL,eAAa,SACb,UAAWiB,EAAG,0BAA2BrB,CAAS,EACjD,GAAGG,EACL,CAED,EACDoC,GAAc,YAAc,gBAE5B,IAAMC,GAAyB,aAG7B,CAAC,CAAE,UAAAxC,EAAW,GAAGG,CAAM,EAAGC,OAE1B,OAACqC,GAAA,CACA,IAAKrC,EACL,eAAa,YACb,UAAWiB,EAAG,gCAAiCrB,CAAS,EACvD,GAAGG,EACL,CAED,EACDqC,GAAiB,YAAc,mBAE/B,IAAME,GAAuB,aAG3B,CAAC,CAAE,UAAA1C,EAAW,GAAGG,CAAM,EAAGC,OAE1B,OAAC,OACA,IAAKA,EACL,eAAa,UACb,UAAWiB,EACV,iGACArB,CACD,EACC,GAAGG,EACL,CAED,EACDuC,GAAe,YAAc,iBAE7B,IAAMC,GAAqB,aAGzB,CAAC,CAAE,UAAA3C,EAAW,GAAGG,CAAM,EAAGC,OAE1B,OAAC,OACA,IAAKA,EACL,eAAa,QACb,UAAWiB,EAAG,4CAA6CrB,CAAS,EACnE,GAAGG,EACL,CAED,EACDwC,GAAa,YAAc,eAE3B,IAAMC,GAA0B,aAG9B,CAAC,CAAE,UAAA5C,EAAW,QAAA6C,EAAU,GAAO,GAAG1C,CAAM,EAAGC,OAI3C,OAHYyC,EAAUC,GAAO,MAG5B,CACA,IAAK1C,EACL,eAAa,cACb,UAAWiB,EACV,yOACA,8EACArB,CACD,EACC,GAAGG,EACL,CAED,EACDyC,GAAkB,YAAc,oBAEhC,IAAMG,GAA2B,aAG/B,CAAC,CAAE,UAAA/C,EAAW,QAAA6C,EAAU,GAAO,GAAG1C,CAAM,EAAGC,OAI3C,OAHYyC,EAAUC,GAAO,SAG5B,CACA,IAAK1C,EACL,eAAa,eACb,UAAWiB,EACV,2RAEA,gDACA,uCACArB,CACD,EACC,GAAGG,EACL,CAED,EACD4C,GAAmB,YAAc,qBAEjC,IAAMC,GAA4B,aAGhC,CAAC,CAAE,UAAAhD,EAAW,GAAGG,CAAM,EAAGC,OAC3B,OAAC,OACA,IAAKA,EACL,eAAa,gBACb,UAAWiB,EAAG,iBAAkBrB,CAAS,EACxC,GAAGG,EACL,CACA,EACD6C,GAAoB,YAAc,sBAElC,IAAMC,GAAoB,aAGxB,CAAC,CAAE,UAAAjD,EAAW,GAAGG,CAAM,EAAGC,OAC3B,OAAC,MACA,IAAKA,EACL,eAAa,OACb,UAAWiB,EAAG,qCAAsCrB,CAAS,EAC5D,GAAGG,EACL,CACA,EACD8C,GAAY,YAAc,cAE1B,IAAMC,GAAwB,aAG5B,CAAC,CAAE,UAAAlD,EAAW,GAAGG,CAAM,EAAGC,OAC3B,OAAC,MACA,IAAKA,EACL,eAAa,YACb,UAAWiB,EAAG,2BAA4BrB,CAAS,EAClD,GAAGG,EACL,CACA,EACD+C,GAAgB,YAAc,kBAE9B,IAAMC,GAA4BC,GACjC,ozBACA,CACC,SAAU,CACT,QAAS,CACR,QAAS,+DACT,QACC,8KACF,EACA,KAAM,CACL,QAAS,cACT,GAAI,cACJ,GAAI,iDACL,CACD,EACA,gBAAiB,CAChB,QAAS,UACT,KAAM,SACP,CACD,CACD,EAEMC,GAA0B,aAQ/B,CACC,CACC,QAAAR,EAAU,GACV,SAAAS,EAAW,GACX,QAAA9B,EAAU,UACV,KAAA+B,EAAO,UACP,QAAAC,EACA,UAAAxD,EACA,GAAGG,CACJ,EACAC,IACI,CACJ,IAAMqD,EAAOZ,EAAUC,GAAO,SACxB,CAAE,SAAAzC,EAAU,MAAAa,CAAM,EAAIxB,GAAW,EAEjCgE,KACL,OAACD,EAAA,CACA,IAAKrD,EACL,eAAa,cACb,YAAWmD,EACX,cAAaD,EACb,UAAWjC,EAAG8B,GAA0B,CAAE,QAAA3B,EAAS,KAAA+B,CAAK,CAAC,EAAGvD,CAAS,EACpE,GAAGG,EACL,EAGD,OAAKqD,GAID,OAAOA,GAAY,WACtBA,EAAU,CACT,SAAUA,CACX,MAIA,QAACG,GAAA,CACA,oBAACC,GAAA,CAAe,QAAO,GAAE,SAAAF,EAAO,KAChC,OAACG,GAAA,CACA,KAAK,QACL,MAAM,SACN,OAAQ3C,IAAU,aAAeb,EAChC,GAAGmD,EACL,GACD,GAlBOE,CAoBT,CACD,EACAL,GAAkB,YAAc,oBAEhC,IAAMS,GAA0B,aAM9B,CAAC,CAAE,UAAA9D,EAAW,QAAA6C,EAAU,GAAO,YAAAkB,EAAc,GAAO,GAAG5D,CAAM,EAAGC,OAIhE,OAHYyC,EAAUC,GAAO,SAG5B,CACA,IAAK1C,EACL,eAAa,cACb,UAAWiB,EACV,iVAEA,gDACA,wCACA,+CACA,0CACA,uCACA0C,GACC,2LACD/D,CACD,EACC,GAAGG,EACL,CAED,EACD2D,GAAkB,YAAc,oBAEhC,IAAME,GAAyB,aAG7B,CAAC,CAAE,UAAAhE,EAAW,GAAGG,CAAM,EAAGC,OAC3B,OAAC,OACA,IAAKA,EACL,eAAa,aACb,UAAWiB,EACV,yKACA,2HACA,wCACA,+CACA,0CACA,uCACArB,CACD,EACC,GAAGG,EACL,CACA,EACD6D,GAAiB,YAAc,mBAE/B,IAAMC,GAA4B,aAKhC,CAAC,CAAE,UAAAjE,EAAW,SAAAkE,EAAW,GAAO,GAAG/D,CAAM,EAAGC,IAAQ,CAErD,IAAM+D,EAAc,UAAQ,IACpB,GAAG,KAAK,MAAM,KAAK,OAAO,EAAI,EAAE,EAAI,EAAE,IAC3C,CAAC,CAAC,EAEL,SACC,QAAC,OACA,IAAK/D,EACL,eAAa,gBACb,UAAWiB,EAAG,8CAA+CrB,CAAS,EACrE,GAAGG,EAEH,UAAA+D,MACA,OAACE,EAAA,CACA,UAAU,oBACV,eAAa,qBACd,KAED,OAACA,EAAA,CACA,UAAU,sCACV,eAAa,qBACb,MACC,CACC,mBAAoBD,CACrB,EAEF,GACD,CAEF,CAAC,EACDF,GAAoB,YAAc,sBAElC,IAAMI,GAAuB,aAG3B,CAAC,CAAE,UAAArE,EAAW,GAAGG,CAAM,EAAGC,OAC3B,OAAC,MACA,IAAKA,EACL,eAAa,WACb,UAAWiB,EACV,iGACA,uCACArB,CACD,EACC,GAAGG,EACL,CACA,EACDkE,GAAe,YAAc,iBAE7B,IAAMC,GAA2B,aAG/B,CAAC,CAAE,GAAGnE,CAAM,EAAGC,OAAQ,OAAC,MAAG,IAAKA,EAAM,GAAGD,EAAO,CAAE,EACpDmE,GAAmB,YAAc,qBAEjC,IAAMC,GAA6B,aAOjC,CAAC,CAAE,QAAA1B,EAAU,GAAO,KAAAU,EAAO,KAAM,SAAAD,EAAU,UAAAtD,EAAW,GAAGG,CAAM,EAAGC,OAIlE,OAHYyC,EAAUC,GAAO,IAG5B,CACA,IAAK1C,EACL,eAAa,kBACb,YAAWmD,EACX,cAAaD,EACb,UAAWjC,EACV,8eACA,yFACAkC,IAAS,MAAQ,UACjBA,IAAS,MAAQ,UACjB,uCACAvD,CACD,EACC,GAAGG,EACL,CAED,EACDoE,GAAqB,YAAc,uBMrtBnC,IAAAC,GAA6B,2BAKtB,SAASC,GAAYC,EAAuE,CAClG,GAAI,CAACA,EAAU,OAAO,KAGtB,IAAMC,EAAiBD,EACrB,MAAM,QAAQ,EACd,IAAIE,GAAQA,EAAK,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACtE,KAAK,EAAE,EAKT,OAFuBJ,GAA4EG,CAAc,GAEzF,IACzB,CCTA,IAAAE,GAA2B,wBAwEtBC,EAAA,6BArEL,SAASC,GAAaC,EAAqC,CAC1D,OAAIA,EAAO,OAAS,QAAUA,EAAO,OAAS,SACtCA,EAAO,KAAK,sBAAwBA,EAAO,KAAK,aAEjDA,EAAO,OAAO,sBAAwBA,EAAO,OAAO,YAC5D,CAEA,SAASC,GAAeD,EAAqC,CAC5D,OAAIA,EAAO,OAAS,OACZA,EAAO,aAAa,OAASA,EAAO,KAAK,KAAK,WAAW,MAAO,EAAE,EAEtEA,EAAO,OAAS,SACZA,EAAO,SAAS,MAEpBA,EAAO,OAAS,WACZA,EAAO,UAAU,OAASA,EAAO,OAAO,KAE5CA,EAAO,OAAS,QAElBA,EAAO,UAAU,OACjBA,EAAO,OAAO,KAAK,QAAQ,YAAa,EAAE,EAAE,QAAQ,MAAO,EAAE,EAGxD,EACR,CAEA,SAASE,GACRF,EACqD,CACrD,OAAIA,EAAO,OAAS,OACZG,GAAYH,EAAO,aAAa,IAAI,GAAK,KAE7CA,EAAO,OAAS,SACZG,GAAYH,EAAO,SAAS,IAAI,EAEpCA,EAAO,OAAS,WACZG,GAAYH,EAAO,UAAU,IAAI,GAAK,KAE1CA,EAAO,OAAS,SACZG,GAAYH,EAAO,UAAU,IAAI,GAAK,IAG/C,CASO,SAASI,GAAwB,CACvC,OAAAJ,EACA,cAAAK,EACA,iBAAAC,EACA,aAAAC,CACD,EAAiC,CAChC,IAAMC,EAAYT,GAAaC,CAAM,EAC/BS,EAASJ,EAAc,IAAIG,CAAS,EACpCE,EAAOR,GAAcF,CAAM,EAEjC,GAAIA,EAAO,OAAS,OAAQ,CAC3B,IAAMW,EAAQV,GAAeD,CAAM,EAC7BY,EACLZ,EAAO,KAAK,sBAAwBA,EAAO,KAAK,aAEjD,SACC,OAACa,GAAA,CACA,mBAACC,GAAA,CAAkB,QAAS,IAAMP,IAAeK,CAAQ,EAAG,QAAO,GAClE,oBAAC,UAAO,KAAK,SACX,UAAAF,MAAQ,OAACA,EAAA,CAAK,UAAU,SAAS,KAClC,OAAC,QAAM,SAAAC,EAAM,GACd,EACD,EACD,CAEF,CAEA,GAAIX,EAAO,OAAS,SAAU,CAC7B,IAAMW,EAAQV,GAAeD,CAAM,EAE7Be,EAAMf,EAAO,SAAS,IAE5B,GAAIe,EAAK,CACR,IAAMC,EAAShB,EAAO,SAAS,QAAU,QAazC,SACC,OAACa,GAAA,CACA,mBAACC,GAAA,CAAkB,QAAO,GACzB,oBAAC,KACA,KAAMC,EACN,OAAQC,EACR,IAAKA,IAAW,SAAW,sBAAwB,OACnD,QAjBiBC,GAA2C,CAC/DA,EAAE,gBAAgB,EAEdD,IAAW,WACdC,EAAE,eAAe,EACjB,OAAO,KAAKF,EAAK,SAAU,qBAAqB,EAGlD,EAUI,UAAU,SAET,UAAAL,MAAQ,OAACA,EAAA,CAAK,UAAU,SAAS,KAClC,OAAC,QAAM,SAAAC,EAAM,GACd,EACD,EACD,CAEF,CAGA,IAAMC,EACLZ,EAAO,KAAK,sBAAwBA,EAAO,KAAK,aAMjD,SACC,OAACa,GAAA,CACA,mBAACC,GAAA,CAAkB,QANG,IAAM,CAC7BP,IAAeK,CAAQ,CACxB,EAI+C,QAAO,GACnD,oBAAC,UAAO,KAAK,SACX,UAAAF,MAAQ,OAACA,EAAA,CAAK,UAAU,SAAS,KAClC,OAAC,QAAM,SAAAC,EAAM,GACd,EACD,EACD,CAEF,CAEA,GAAIX,EAAO,OAAS,WAAY,CAC/B,IAAMW,EAAQV,GAAeD,CAAM,EAC7BkB,EAAgBlB,EAAO,UAAU,UAAY,YAC7CmB,EACLD,IAAkB,QAClBA,IAAkB,eACjBA,IAAkB,aAAeT,EAC7BW,EAAeF,IAAkB,cAEvC,SACC,QAACL,GAAA,CACA,qBAACC,GAAA,CACA,QAAS,IAAM,CACTM,GACJd,EAAiBE,CAAS,CAE5B,EACA,aAAYW,EAAe,OAAS,SAEnC,UAAAA,KACA,OAAC,eAAW,UAAU,SAAS,EAE/BT,MAAQ,OAACA,EAAA,CAAK,UAAU,SAAS,KAElC,OAAC,QAAM,SAAAC,EAAM,GACd,EACCQ,GAAgBnB,EAAO,MAAM,OAAS,MACtC,OAACqB,GAAA,CACC,SAAArB,EAAO,MACN,OACAsB,GACCA,EAAE,OAAS,QACX,CAACA,EAAE,KAAK,KAAK,SAAS,sBAAsB,CAC9C,EACC,IAAI,CAACC,EAAMC,IAAQ,CAEnB,GAAID,EAAK,OAAS,OAAQ,OAAO,KAEjC,IAAME,EACLF,EAAK,aAAa,OAClBA,EAAK,KAAK,KAAK,WAAW,MAAO,EAAE,EAC9BX,EACLW,EAAK,KAAK,sBAAwBA,EAAK,KAAK,aACvCG,EAAWvB,GAAYoB,EAAK,aAAa,IAAI,EAC7CI,EACLJ,EAAK,KAAK,sBAAwBA,EAAK,KAAK,aAC7C,SACC,OAACK,GAAA,CACA,mBAACC,GAAA,CACA,QAAS,IAAMtB,IAAeK,CAAQ,EACtC,QAAO,GAEP,oBAAC,UAAO,KAAK,SACX,UAAAc,MAAY,OAACA,EAAA,CAAS,UAAU,SAAS,KAC1C,OAAC,QAAM,SAAAD,EAAU,GAClB,EACD,GATwB,GAAGE,CAAO,IAAIH,CAAG,EAU1C,CAEF,CAAC,EACH,GAEF,CAEF,CAEA,GAAIxB,EAAO,OAAS,QAAS,CAC5B,IAAMW,EAAQV,GAAeD,CAAM,EACnC,SACC,QAACa,GAAA,CACA,qBAACC,GAAA,CAAkB,SAAQ,GACzB,UAAAJ,MAAQ,OAACA,EAAA,CAAK,UAAU,SAAS,KAClC,OAAC,QAAM,SAAAC,EAAM,GACd,EACCX,EAAO,MAAM,OAAS,MACtB,OAACqB,GAAA,CACC,SAAArB,EAAO,MACN,OACAsB,GACCA,EAAE,OAAS,QACX,CAACA,EAAE,KAAK,KAAK,SAAS,mBAAmB,CAC3C,EACC,IAAI,CAACC,EAAMC,IAAQ,CAEnB,GAAID,EAAK,OAAS,OAAQ,OAAO,KAEjC,IAAME,EACLF,EAAK,aAAa,OAClBA,EAAK,KAAK,KAAK,WAAW,MAAO,EAAE,EAC9BX,EACLW,EAAK,KAAK,sBAAwBA,EAAK,KAAK,aACvCG,EAAWvB,GAAYoB,EAAK,aAAa,IAAI,EAC7CI,EACLJ,EAAK,KAAK,sBAAwBA,EAAK,KAAK,aAC7C,SACC,OAACK,GAAA,CACA,mBAACC,GAAA,CACA,QAAS,IAAMtB,IAAeK,CAAQ,EACtC,QAAO,GAEP,oBAAC,UAAO,KAAK,SACX,UAAAc,MAAY,OAACA,EAAA,CAAS,UAAU,SAAS,KAC1C,OAAC,QAAM,SAAAD,EAAU,GAClB,EACD,GATwB,GAAGE,CAAO,IAAIH,CAAG,EAU1C,CAEF,CAAC,EACH,GAEF,CAEF,CAEA,OAAO,IACR,CR9JK,IAAAM,EAAA,6BA9EE,SAASC,GAAW,CAC1B,MAAAC,EACA,KAAAC,EACA,cAAAC,EACA,SAAAC,EAAW,CAAC,EACZ,uBAAAC,EAAyB,CAAC,EAC1B,aAAAC,EACA,kBAAAC,EACA,GAAGC,CACJ,EAII,CAEH,GAAM,CAACC,EAAiBC,CAAkB,EAAU,YAElD,IAAM,CACP,GAAIH,GAAqB,OAAO,OAAW,IAAa,CACvD,IAAMI,EAAQ,aAAa,QAAQJ,CAAiB,EACpD,GAAII,GAASP,EAAS,SAASO,CAAK,EACnC,OAAOA,CAET,CACA,OAAOP,EAAS,CAAC,CAClB,CAAC,EAEK,CAACQ,EAAeC,CAAgB,EAAU,YAC/C,IAAI,GACL,EAGM,aAAU,IAAM,CACrB,GAAIT,EAAS,OAAS,EAAG,CAExB,GAAIG,GAAqB,OAAO,OAAW,IAAa,CACvD,IAAMI,EAAQ,aAAa,QAAQJ,CAAiB,EACpD,GAAII,GAASP,EAAS,SAASO,CAAK,EAAG,CACtCD,EAAmBC,CAAK,EACxB,MACD,CACD,EAEI,CAACF,GAAmB,CAACL,EAAS,SAASK,CAAe,IACzDC,EAAmBN,EAAS,CAAC,CAAC,CAEhC,CACD,EAAG,CAACA,EAAUG,CAAiB,CAAC,EAG1B,aAAU,IAAM,CACjBA,GAAqBE,GAAmB,OAAO,OAAW,KAC7D,aAAa,QAAQF,EAAmBE,CAAe,CAEzD,EAAG,CAACA,EAAiBF,CAAiB,CAAC,EAGvC,IAAMO,EAAyB,WAAQ,IACjCL,EACEJ,EAAuB,KAAKU,GAAKA,EAAE,UAAYN,CAAe,EADxC,KAE3B,CAACA,EAAiBJ,CAAsB,CAAC,EAEtCW,EAAkBC,GAAiB,CACxCJ,EAAiBK,GAAQ,CACxB,IAAMC,EAAO,IAAI,IAAID,CAAI,EACzB,OAAIC,EAAK,IAAIF,CAAI,EAChBE,EAAK,OAAOF,CAAI,EAEhBE,EAAK,IAAIF,CAAI,EAEPE,CACR,CAAC,CACF,EAEA,SACC,QAACC,GAAA,CAAS,GAAGZ,EACZ,oBAACa,GAAA,CACA,oBAAC,OAAI,UAAU,oDACd,qBAAC,KACA,KAAK,IACL,UAAU,gIAEV,oBAAC,OAAI,UAAU,gFACb,SAAAnB,EACF,KACA,OAAC,QAAK,UAAU,gBAAiB,SAAAD,EAAM,GACxC,EACCE,KACA,QAACmB,GAAA,CACA,MAAOb,GAAmB,GAC1B,cAAec,GAAS,CACvBb,EAAmBa,CAAK,EAGpBjB,GACHA,EAAa,IAAI,CAEnB,EAEA,oBAACkB,GAAA,CAAc,UAAU,8JACxB,mBAACC,GAAA,EAAY,EACd,KACA,OAACC,GAAA,CACC,SAAAtB,EAAS,IAAIuB,MACb,OAACC,GAAA,CAAyB,MAAOD,EAC/B,SAAAA,GADeA,CAEjB,CACA,EACF,GACD,KAEA,OAAC,OAAI,UAAU,0MACd,mBAAC,QAAK,UAAU,0BACd,SAAAvB,EAAS,CAAC,GAAK,MACjB,EACD,GAEF,EACD,KACA,OAACyB,GAAA,CACC,SAAAf,GAAoBA,EAAiB,SAAS,OAAS,KACvD,OAACgB,GAAA,CACA,mBAACC,GAAA,CACC,SAAAjB,EAAiB,SAAS,IAAI,CAACkB,EAAQC,IAAU,CACjD,IAAMC,EACLF,EAAO,OAAS,QAAUA,EAAO,OAAS,SACvCA,EAAO,KAAK,sBACZA,EAAO,KAAK,aACZA,EAAO,OAAO,sBACdA,EAAO,OAAO,aAClB,SACC,OAACG,GAAA,CAEA,OAAQH,EACR,cAAepB,EACf,iBAAkBI,EAClB,aAAcV,GAJT,GAAG0B,EAAO,IAAI,IAAIC,CAAK,IAAIC,CAAS,EAK1C,CAEF,CAAC,EACF,EACD,KAEA,QAACJ,GAAA,CACA,oBAACM,GAAA,CAAkB,oFAAY,KAC/B,OAACL,GAAA,CACA,mBAACM,GAAA,CACA,oBAACC,GAAA,CAAkB,SAAQ,GAC1B,oBAAC,cAAS,KACV,OAAC,QAAK,uGAAgB,GACvB,EACD,EACD,GACD,EAEF,GACD,CAEF,CSxLA,IAAAC,GAA0B,wBAC1BC,GAAuB,oBACvBC,KA2BE,IAAAC,GAAA,6BAzBK,SAASC,IAAc,CAC7B,GAAM,CAACC,EAAOC,CAAQ,EAAU,YAA2B,IAAM,CAChE,GAAI,WAAW,SAAW,OAAW,MAAO,OAC5C,IAAMC,EAAS,WAAW,aAAa,QAAQ,OAAO,EACtD,OAAIA,IAAW,SAAWA,IAAW,OAAeA,EAC7C,MACR,CAAC,EAED,OAAM,aAAU,IAAM,CACrB,IAAMC,EAAO,SAAS,gBAClBH,IAAU,OACbG,EAAK,UAAU,IAAI,MAAM,EAEzBA,EAAK,UAAU,OAAO,MAAM,EAEzB,WAAW,SAAW,QACzB,WAAW,aAAa,QAAQ,QAASH,CAAK,CAEhD,EAAG,CAACA,CAAK,CAAC,KAOT,SAACI,GAAA,CACA,QAAQ,QACR,KAAK,OACL,QARkB,IAAM,CACzBH,EAASI,GAASA,IAAS,OAAS,QAAU,MAAO,CACtD,EAOE,UAAU,UACV,aAAW,eAEX,qBAAC,QAAI,UAAU,yEAAyE,KACxF,QAAC,SAAK,UAAU,iFAAiF,KACjG,QAAC,QAAK,UAAU,UAAU,wBAAY,GACvC,CAEF,CCzCA,IAAAC,GAAiD,iBAO1C,SAASC,GACfC,EACiD,CAEjD,IAAMC,KAAiB,gBAAY,IAAqB,CACvD,GAAI,OAAO,OAAW,IAAa,OAAO,KAE1C,IAAMC,EAAO,OAAO,SAAS,KAC7B,GAAI,CAACA,GAAQA,EAAK,QAAU,EAAG,OAAO,KAGtC,IAAMC,EAAWD,EAAK,MAAM,CAAC,EAC7B,GAAI,CAACC,EAAU,OAAO,KAGtB,GAAI,CACH,OAAO,mBAAmBA,CAAQ,CACnC,MAAQ,CACP,OAAOA,CACR,CACD,EAAG,CAAC,CAAC,EAGC,CAACC,EAAaC,CAAmB,KAAI,aAC1CJ,CACD,EAGMK,KAAiB,gBACrBC,GAAwB,CAGxB,GAFAF,EAAoBE,CAAI,EAEpB,OAAO,OAAW,IAAa,OAGnC,IAAMC,EAAaD,EAAOA,EAAK,QAAQ,MAAO,GAAG,EAAI,GAErD,GAAIC,EAAY,CAGf,IAAMC,EAAU,UAAUD,CAAU,EACpC,OAAO,SAAS,KAAOC,CACxB,MAEC,OAAO,QAAQ,UACd,GACA,SAAS,MACT,OAAO,SAAS,SAAW,OAAO,SAAS,MAC5C,CAEF,EACA,CAAC,CACF,EAGA,uBAAU,IAAM,CACf,GAAI,OAAO,OAAW,IAAa,OAEnC,IAAMC,EAAmB,IAAM,CAC9B,IAAMH,EAAON,EAAe,EAC5BI,EAAoBE,CAAI,CACzB,EAGA,cAAO,iBAAiB,aAAcG,CAAgB,EAEtD,OAAO,iBAAiB,WAAYA,CAAgB,EAE7C,IAAM,CACZ,OAAO,oBAAoB,aAAcA,CAAgB,EACzD,OAAO,oBAAoB,WAAYA,CAAgB,CACxD,CACD,EAAG,CAACT,CAAc,CAAC,EAEZ,CAACG,EAAaE,CAAc,CACpC,CClFA,IAAAK,GAAmB,0BCEZ,SAASC,GAAaC,EAAwBC,EAAc,CAClE,IAAMC,EAAS,CAAC,EAEZD,GACHC,EAAO,KAAKD,CAAG,EAIhB,IAAME,EAAiB,iBACjBC,EAAe,iBACfC,EAAkB,aAMxB,OAHkBL,EAAM,OAAOM,GAAQA,EAAK,QAAU,CAAC,EAG7C,QAAQA,GAAQ,CAErBA,EAAK,OAAS,aACjBJ,EAAO,KAAK,CACX,KAAM,kBACN,KAAMI,EAAK,KACX,KAAMA,EAAK,aACX,OAAQ,6OACR,IAAK,gGAAqBA,EAAK,IAAI,8PACpC,CAAC,EAIEA,EAAK,OAAS,cACZH,EAAe,KAAKG,EAAK,IAAI,GACjCJ,EAAO,KAAK,CACX,KAAM,uBACN,OAAQI,EAAK,KACb,KAAMA,EAAK,aACX,OAAQ,mCAAUA,EAAK,IAAI,wPAC3B,IAAK,qPACN,CAAC,EAGJ,CAAC,EAGDN,EAAM,QAAQM,GAAQ,CAErB,GAAIA,EAAK,OAAS,OAAQ,CACzB,IAAMC,EAAYD,EAAK,aAAa,MAAM,OAAO,EAGjD,GAAIC,EAAU,OAAS,EACtBL,EAAO,KAAK,CACX,KAAM,oBACN,KAAMI,EAAK,KACX,KAAMA,EAAK,aACX,OAAQ,6BAASA,EAAK,IAAI,uPAC1B,IAAK,uVAAyEA,EAAK,IAAI,IACxF,CAAC,MACK,CACN,IAAME,EAAeD,EAAU,CAAC,EAG3BJ,EAAe,KAAKK,CAAY,GACpCN,EAAO,KAAK,CACX,KAAM,uBACN,KAAMI,EAAK,KACX,KAAMA,EAAK,aACX,OAAQ,6BAASA,EAAK,IAAI,mGAAwBE,CAAY,gNAC9D,IAAK,kPACN,CAAC,CAEH,CACD,CAID,CAAC,EAGsBR,EAAM,OAC5BM,GACCA,EAAK,QAAU,GACfA,EAAK,OAAS,aACdH,EAAe,KAAKG,EAAK,IAAI,CAC/B,EAEe,QAAQG,GAAiB,CACvC,IAAMC,EAAeV,EAAM,OAAOM,GACfA,EAAK,aAAa,MAAM,OAAO,EAChC,CAAC,IAAMG,EAAc,IACtC,EAGmBC,EAAa,OAChCC,GAAKA,EAAE,QAAU,GAAKA,EAAE,OAAS,QAAUA,EAAE,YAAc,IAC5D,EAEY,QAAQC,GAAQ,CACtBA,EAAK,KAAK,SAAS,YAAY,GACnCV,EAAO,KAAK,CACX,KAAM,uBACN,KAAMU,EAAK,KACX,KAAMA,EAAK,aACX,OAAQ,sIAA6BH,EAAc,IAAI,gdACvD,IAAK,6GACJG,EAAK,KAAK,SAAS,KAAK,EACrBA,EAAK,KAAK,MAAM,EAAG,EAAE,EAAI,aACzBA,EAAK,KAAO,YAChB,iJACD,CAAC,CAEH,CAAC,EAGoBF,EAAa,OACjCC,GAAKA,EAAE,QAAU,GAAKA,EAAE,OAAS,aAAeP,EAAa,KAAKO,EAAE,IAAI,CACzE,EAEa,QAAQE,GAAe,CACnC,IAAMC,EAAaJ,EAAa,OAC/BC,GACCA,EAAE,aAAa,WAAWE,EAAY,YAAY,GAClDF,EAAE,OAAS,aACXA,EAAE,MAAQE,EAAY,KACxB,EAEIC,EAAW,OAAS,GACvBZ,EAAO,KAAK,CACX,KAAM,4BACN,OAAQY,EAAW,CAAC,EAAE,KACtB,KAAMA,EAAW,CAAC,EAAE,aACpB,OAAQ,8EAAkBD,EAAY,IAAI,0KAC1C,IAAK,mKAAiCC,EAAW,CAAC,EAAE,IAAI,4QACzD,CAAC,CAEH,CAAC,EAIuBJ,EAAa,OACpCC,GACCA,EAAE,QAAU,GACZA,EAAE,OAAS,aACX,CAACP,EAAa,KAAKO,EAAE,IAAI,GACzB,CAACR,EAAe,KAAKQ,EAAE,IAAI,CAC7B,EAEgB,QAAQI,GAAkB,CAKzC,GAHyBV,EAAgB,KAAKU,EAAe,IAAI,EAIhE,OAGD,IAAMD,EAAaJ,EAAa,OAC/BC,GACCA,EAAE,aAAa,WAAWI,EAAe,YAAY,GACrDJ,EAAE,OAAS,aACXA,EAAE,MAAQI,EAAe,KAC3B,EAEID,EAAW,OAAS,GACvBZ,EAAO,KAAK,CACX,KAAM,+BACN,OAAQY,EAAW,CAAC,EAAE,KACtB,KAAMA,EAAW,CAAC,EAAE,aACpB,OAAQ,iFAA0BC,EAAe,IAAI,0KACrD,IAAK,mKAAiCD,EAAW,CAAC,EAAE,IAAI,4PACzD,CAAC,CAEH,CAAC,EAGmBJ,EAAa,OAChCC,GAAKA,EAAE,OAAS,QAAUA,EAAE,KAAK,SAAS,YAAY,CACvD,EAEY,QAAQK,GAAc,CACjC,IAAMT,EAAYS,EAAW,aAAa,MAAM,OAAO,EAGjDC,EAAWD,EAAW,QAAU,EAChCE,EACLF,EAAW,QAAU,GACrBT,EAAU,OAAS,GACnBF,EAAgB,KAAKE,EAAU,CAAC,CAAC,EAE9B,CAACU,GAAY,CAACC,GACjBhB,EAAO,KAAK,CACX,KAAM,6BACN,KAAMc,EAAW,KACjB,KAAMA,EAAW,aACjB,OAAQ,wCAAoBA,EAAW,IAAI,qWAC3C,IAAK,gGAAqBA,EAAW,IAAI,8IAAgCP,EAAc,IAAI,kJAAoCA,EAAc,IAAI,QAClJ,CAAC,CAEH,CAAC,CACF,CAAC,EAEMP,CACR,CD6CO,SAASiB,GAAsBC,EAAmC,CACxE,MAAO,CACN,MAAOA,EAAK,OAAS,IACrB,OAAQA,EAAK,QAAU,GACvB,WAAYA,EAAK,YAAc,GAC/B,GAAGA,CACJ,CACD,CAKO,SAASC,GACfC,EACAC,EACW,CACX,GAAI,CAACA,EACJ,OAAOJ,GAAsBG,CAAS,EAIvC,IAAME,EAA+B,CACpC,KAAMF,EAAU,MAAQC,EAAW,KAEnC,OAAQD,EAAU,QAAU,GAE5B,WACCA,EAAU,aAAe,OACtBA,EAAU,WACVC,EAAW,YAAc,EAC9B,EAEA,OAAOJ,GAAsB,CAC5B,GAAGI,EACH,GAAGC,EACH,GAAGF,CACJ,CAAC,CACF,CE1QO,SAASG,GACfC,EACAC,EACAC,EACAC,EAIwB,CAExB,IAAMC,EAAeC,GAAuBJ,EAAOD,EAASE,CAAQ,EAG9DI,EAAWC,GAAcH,EAAcD,GAAY,CAAC,CAAC,EAG3D,OAAOK,GAAgBF,CAAQ,CAChC,CAKA,SAASD,GACRJ,EACAD,EACAE,EACiB,CAEjB,IAAIO,EAAOR,EAAM,OAAOS,GAAKA,EAAE,aAAa,MAAM,OAAO,EAAE,CAAC,IAAMV,CAAO,EAQzE,GAAI,CANmBS,EAAK,KAC3BC,GACCA,EAAE,QAAU,GAAKA,EAAE,OAAS,aAAeC,GAAiB,KAAKD,EAAE,IAAI,CACzE,EAIC,OAAOD,EAAK,IAAIC,IAAM,CAAE,GAAGA,EAAG,qBAAsBA,EAAE,YAAa,EAAE,EAItE,IAAME,EAAaV,GAAY,KAC/B,OAAAO,EAAOA,EAAK,OAAOC,GAAK,CACvB,IAAMG,EAAIH,EAAE,aAAa,MAAM,OAAO,EACtC,GAAIG,EAAE,OAAS,EAAG,MAAO,GACzB,IAAMC,EAASD,EAAE,CAAC,EAClB,OAAKF,GAAiB,KAAKG,CAAM,EAC1BF,EAAaE,IAAWF,EAAa,GADD,EAE5C,CAAC,EAGMH,EAAK,IAAIC,GAAK,CACpB,IAAMG,EAAIH,EAAE,aAAa,MAAM,OAAO,EACtC,OAAIG,EAAE,QAAU,GAAKF,GAAiB,KAAKE,EAAE,CAAC,CAAC,EACvC,CACN,GAAGH,EACH,MAAOA,EAAE,MAAQ,EACjB,aAAcG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EACjC,qBAAsBH,EAAE,YACzB,EAEM,CAAE,GAAGA,EAAG,qBAAsBA,EAAE,YAAa,CACrD,CAAC,CACF,CAMA,SAASH,GACRN,EACAE,EACwB,CACxB,IAAMG,EAAkC,CAAC,EAGzCL,EACE,OAAOS,GAAKA,EAAE,QAAU,GAAKA,EAAE,OAAS,MAAM,EAC9C,QAAQK,GAAQ,CAChB,IAAMC,EAAOC,GAAcF,EAAMd,CAAK,EAChCiB,EACLf,EAASY,EAAK,YAAY,GAAKZ,EAASY,EAAK,oBAAqB,EACnE,GAAIC,IAAS,OAAQ,CACpB,IAAMH,EAAIM,GAASJ,EAAMG,CAAI,EACxBE,GAASP,CAAC,GAAGP,EAAS,KAAKO,CAAC,CAClC,SAAWG,IAAS,SAAU,CAC7B,IAAMK,EAAIC,GAAWP,EAAMG,CAAI,EAC1BE,GAASC,CAAC,GAAGf,EAAS,KAAKe,CAAC,CAClC,CACD,CAAC,EAGF,IAAME,EAAgB,IAAI,IAC1B,OAAAtB,EACE,OACAS,GACCA,EAAE,QAAU,GACZA,EAAE,OAAS,aACX,CAACC,GAAiB,KAAKD,EAAE,IAAI,CAC/B,EACC,QAAQc,GAAO,CACf,GAAID,EAAc,IAAIC,EAAI,YAAY,EAAG,OACzCD,EAAc,IAAIC,EAAI,YAAY,EAElC,IAAMR,EAAOC,GAAcO,EAAKvB,CAAK,EAC/BwB,EAAUD,EAAI,aAAa,QAAQ,MAAO,GAAG,EAC7CE,EACLF,EAAI,sBAAsB,QAAQ,MAAO,GAAG,GAAKC,EAC5CP,EAAOf,EAASuB,CAAe,EAErC,GAAIV,IAAS,QAAS,CACrB,IAAMW,EAAIC,GAAUJ,EAAKvB,EAAOiB,EAAMf,CAAQ,EACzCiB,GAASO,CAAC,GAAGrB,EAAS,KAAKqB,CAAC,CAClC,SAAWX,IAAS,WAAY,CAC/B,IAAMa,EAAIC,GAAaN,EAAKvB,EAAOiB,EAAMf,CAAQ,EAC5CiB,GAASS,CAAC,GAAGvB,EAAS,KAAKuB,CAAC,CAClC,CACD,CAAC,EAEKvB,CACR,CAKA,SAASa,GACRJ,EACAG,EACsB,CACtB,IAAMa,EAA+B,CACpC,MAAO,IACP,OAAQ,GACR,WAAY,GACZ,GAAGb,EACH,MAAOA,GAAM,OAASH,EAAK,KAAK,QAAQ,SAAU,EAAE,CACrD,EACA,MAAO,CAAE,KAAM,OAAQ,KAAAA,EAAM,YAAAgB,CAAY,CAC1C,CAEA,SAAST,GACRP,EACAG,EACmD,CACnD,IAAMc,EAA2B,CAChC,KAAM,SACN,QAASd,GAAM,SAAW,OAC1B,MAAOA,GAAM,OAAS,IACtB,OAAQA,GAAM,QAAU,GACxB,WAAYA,GAAM,YAAc,GAChC,SAAUA,GAAM,UAAY,UAC5B,MAAOA,GAAM,OAASH,EAAK,KAAK,QAAQkB,GAAgB,EAAE,EAC1D,IAAKf,GAAM,IACX,OAAQA,GAAM,OACd,MAAOA,GAAM,MACb,KAAMA,GAAM,IACb,EACA,MAAO,CAAE,KAAM,SAAU,KAAAH,EAAM,SAAAiB,CAAS,CACzC,CAEA,SAASJ,GACRJ,EACAvB,EACAiC,EACAC,EAA+B,CAAC,EACV,CACtB,IAAMH,EAA0B,CAC/B,MAAO,IACP,OAAQ,GACR,WAAY,GACZ,GAAGE,EACH,MACCA,GAAS,OAASV,EAAI,KAAK,QAAQ,YAAa,EAAE,EAAE,QAAQ,MAAO,EAAE,CACvE,EAEMY,EAAQC,GAAkBb,EAAKvB,EAAO+B,EAAUG,CAAO,EAC7D,MAAO,CAAE,KAAM,QAAS,OAAQX,EAAK,MAAAY,EAAO,SAAAJ,CAAS,CACtD,CAEA,SAASF,GACRN,EACAvB,EACAiC,EACAC,EAA+B,CAAC,EACV,CACtB,IAAMH,EAA6B,CAClC,MAAO,IACP,OAAQ,GACR,WAAY,GACZ,SAAU,YACV,GAAGE,EACH,MAAOA,GAAS,OAASV,EAAI,IAC9B,EAEMY,EAAQC,GAAkBb,EAAKvB,EAAO+B,EAAUG,CAAO,EAC7D,MAAO,CAAE,KAAM,WAAY,OAAQX,EAAK,MAAAY,EAAO,SAAAJ,CAAS,CACzD,CAGA,SAASK,GACRb,EACAvB,EACAqC,EACAH,EACwB,CACxB,OAAOlC,EACL,OACAS,GACCA,EAAE,OAAS,QACXA,EAAE,YAAc,MAChB,CAACuB,GAAe,KAAKvB,EAAE,IAAI,IAC1BA,EAAE,aAAa,WAAWc,EAAI,aAAe,GAAG,GAChDd,EAAE,aAAa,WAAWc,EAAI,aAAe,IAAI,EACpD,EACC,IAAIT,GAAQ,CACZ,IAAMwB,EAAUxB,EAAK,sBAAwBA,EAAK,aAC5CyB,EAAWL,EAAQI,CAAO,EAS1BR,EAA+B,CACpC,GAPiBU,GAAYD,GAAY,CAAC,EAAG,CAC7C,MAAOF,EAAY,MACnB,OAAQA,EAAY,OACpB,WAAYA,EAAY,UACzB,CAAC,EAIA,MAAOE,GAAU,OAASzB,EAAK,KAAK,QAAQ,SAAU,EAAE,CACzD,EAEA,MAAO,CAAE,KAAM,OAAiB,KAAAA,EAAM,YAAAgB,CAAY,CACnD,CAAC,EACA,OAAOlB,GAAK,CAACO,GAASP,CAAC,CAAC,CAC3B,CCrOA,IAAA6B,EAA6C,iBAOrCC,EAAA,6BALD,SAASC,GAAc,CAC7B,MAAAC,EAAQ,gBACR,eAAAC,EAAiB,GACjB,kBAAAC,EAAoB,GACpB,UAAAC,EAAY,GACZ,KAAAC,KAAO,OAACC,GAAA,CAAK,UAAU,YAAY,EACnC,WAAAC,EAAa,OACb,aAAAC,EAAe,CAAC,EAChB,cAAAC,EAAgB,EACjB,EAAiC,CAChC,GAAM,CAACC,EAAcC,CAAe,KAAI,YAAqB,EACvD,CAACC,EAAgBC,CAAiB,KAAI,YAA+B,CAAC,CAAC,EACvE,CAACC,EAAwBC,CAAyB,KAAI,YAE1D,CAAC,CAAC,EACE,CAACC,EAAiBC,CAAkB,KAAI,YAA6B,EAGrEC,EAAoB,qBAAqBX,CAAU,GACnDY,EAAqB,sBAAsBZ,CAAU,GAGrD,CAACa,EAAaC,CAAc,EAAIC,GAAuBf,CAAU,EAGjE,CAACgB,EAAkBC,CAAmB,KAAI,YAC/C,IACK,OAAO,OAAW,KACP,aAAa,QAAQL,CAAkB,GACrC,IAInB,KAGA,aAAU,IAAM,CACf,GAAIT,GAAc,UAAYA,EAAa,SAAS,OAAS,EAAG,CAC/D,GAAIQ,GAAqB,OAAO,OAAW,IAAa,CACvD,IAAMO,EAAQ,aAAa,QAAQP,CAAiB,EACpD,GAAIO,GAASf,EAAa,SAAS,SAASe,CAAK,EAAG,CACnDR,EAAmBQ,CAAK,EACxB,MACD,CACD,CACAR,EAAmBP,EAAa,SAAS,CAAC,CAAC,CAC5C,CACD,EAAG,CAACA,GAAc,SAAUQ,CAAiB,CAAC,KAK9C,aAAU,IAAM,CACX,OAAO,OAAW,MACjBK,EACH,aAAa,QAAQJ,EAAoBI,CAAgB,EAEzD,aAAa,WAAWJ,CAAkB,EAG7C,EAAG,CAACI,EAAkBJ,CAAkB,CAAC,EAGzC,IAAMO,KAAc,WACnB,IAAMlB,EAAa,QAAU,CAAC,EAC9B,CAAC,KAAK,UAAUA,EAAa,QAAU,CAAC,CAAC,CAAC,CAC3C,EA2GA,SAzGA,aAAU,IAAM,CAEf,GAAI,CAACD,EAAY,OACjB,IAAMoB,EAAS,IAAI,gBACnBA,EAAO,IAAI,aAAcpB,CAAU,EACnCoB,EAAO,IAAI,UAAW,OAAOnB,EAAa,SAAW,EAAK,CAAC,EACvDA,EAAa,eAChBmB,EAAO,IAAI,gBAAiBnB,EAAa,aAAa,EAEvDA,EAAa,QAAQ,QAAQoB,GAAW,CACvCD,EAAO,OAAO,SAAUC,CAAO,CAChC,CAAC,GAGkB,SAAY,CAC9B,GAAI,CAEH,IAAMC,GAAQ,MADG,MAAM,MAAM,uBAAuBF,EAAO,SAAS,CAAC,EAAE,GAC1C,KAAK,EAClChB,EAAgBkB,EAAK,CACtB,MAAgB,CAEhB,CACD,GACW,CACZ,EAAG,CACFtB,EACAC,EAAa,QACbA,EAAa,cACbkB,CACD,CAAC,KAGD,aAAU,IAAM,CACf,GAAIhB,GAAc,OAASA,GAAc,SAAU,CAElD,IAAMoB,EAAe,IAAI,IAOzB,GANApB,EAAa,SAAS,QAAQqB,GAAW,CACtBC,GAAsBD,EAASrB,EAAa,KAAK,EACzD,QAAQuB,IAAQH,EAAa,IAAIG,EAAI,CAAC,CACjD,CAAC,EAGGH,EAAa,KAAO,GAAK,CAACP,EAAkB,CAC/C,IAAMW,EAAcJ,EAAa,IAAI,IAAI,EACtC,KACA,MAAM,KAAKA,CAAY,EAAE,CAAC,EAC7BN,EAAoBU,CAAW,EAC3B,OAAO,OAAW,KACrB,aAAa,QAAQf,EAAoBe,CAAW,CAEtD,CACD,CACD,EAAG,CAACxB,EAAca,EAAkBJ,CAAkB,CAAC,KAGvD,aAAU,IAAM,CACf,GAAIT,GAAc,OAASA,GAAc,SAAU,CAClDG,EAAkBsB,GAAazB,EAAa,KAAK,CAAC,EAGlD,IAAM0B,EAAiC1B,EAAa,SAAS,IAC5DqB,GAAW,CACV,IAAMM,EAAYL,GAAsBD,EAASrB,EAAa,KAAK,EACnE,MAAO,CACN,QAAAqB,EACA,SAAUO,GACTP,EACArB,EAAa,MACba,EACAb,EAAa,QACd,EACA,UAAW2B,EAAU,OAAS,EAAIA,EAAY,MAC/C,CACD,CACD,EAIA,GAHAtB,EAA0BqB,CAAU,EAGhChB,EAAa,CAEhB,IAAMmB,EAAwBnB,EAAY,QAAQ,MAAO,GAAG,EAE3CV,EAAa,MAAM,OAAO8B,IAAQ,CAClD,IAAMC,GAAqBD,GAAK,cAAc,QAAQ,MAAO,GAAG,EAC1DE,GAAqBF,GAAK,sBAAsB,QACrD,MACA,GACD,EACMG,GAAiBH,GAAK,MAAM,QAAQ,MAAO,GAAG,EAEpD,OACCC,KAAuBF,GACvBG,KAAuBH,GACvBI,KAAmBJ,CAErB,CAAC,EAEY,SAAW,GAEvBlB,EAAe,IAAI,CAErB,CACD,CACD,EAAG,CAACX,EAAcU,EAAaG,EAAkBF,CAAc,CAAC,EAE5DT,EAAe,OAAS,KAE1B,OAAC,OAAI,UAAU,iCACd,mBAACgC,GAAA,CAAW,OAAQhC,EAAgB,EACrC,KAKD,QAACiC,GAAA,CAAgB,UAAU,2BAC1B,oBAACC,GAAA,CACA,MAAO7C,EACP,KAAMI,EACN,cAAeI,EACf,SAAUC,GAAc,UAAY,CAAC,EACrC,uBAAwBI,EACxB,aAAcO,EACd,kBAAmBH,EACpB,KACA,QAAC6B,GAAA,CACA,qBAAC,UAAO,UAAU,sEACjB,qBAAC,OAAI,UAAU,0BACd,oBAACC,GAAA,EAAe,KAChB,OAACC,GAAA,CAAU,YAAY,WAAW,UAAU,WAAW,GACxD,KACA,QAAC,OAAI,UAAU,0BACb,UAAA7C,GAAaU,EAAuB,OAAS,MAC7C,OAACoC,GAAA,CACA,uBAAwBpC,EACxB,gBAAiBE,EACjB,iBAAkBO,EAClB,aAAcF,EACd,aAAcX,EACf,EAEAP,GAAqBW,EAAuB,OAAS,MACrD,OAACqC,GAAA,CACA,UAAWrC,EACT,QAAQsC,GAAKA,EAAE,WAAa,CAAC,CAAC,EAC9B,OAAO,CAACnB,EAAMoB,EAAOC,IAAQA,EAAI,QAAQrB,CAAI,IAAMoB,CAAK,EAC1D,iBAAkB9B,EAClB,iBAAkBU,GAAQ,CACzBT,EAAoBS,CAAI,EAExBZ,EAAe,IAAI,CACpB,EACD,EAEAnB,MAAkB,OAACqD,GAAA,EAAY,GACjC,GACD,KACA,OAAC,QAAK,UAAU,gBACd,SAAAnC,KACA,OAAC,OAAI,UAAU,oCACd,mBAACoC,GAAA,CACA,SAAUpC,EACV,WAAYb,EACZ,aAAcc,EACf,EACD,KAEA,OAAC,OAAI,UAAU,iFACd,oBAAC,OAAI,UAAU,cACd,oBAACf,GAAA,CAAK,UAAU,+CAA+C,KAC/D,OAAC,MAAG,UAAU,8BAA8B,uGAE5C,KACA,OAAC,KAAE,UAAU,wBAAwB,6QAErC,GACD,EACD,EAEF,GACD,GACD,CAEF","names":["r","f","n","o","clsx","init_clsx","__esmMin","concatArrays","createClassValidatorObject","createClassPartObject","EMPTY_CONFLICTS","ARBITRARY_PROPERTY_PREFIX","createClassGroupUtils","getGroupRecursive","getGroupIdForArbitraryProperty","createClassMap","processClassGroups","processClassesRecursively","processClassDefinition","processStringDefinition","processFunctionDefinition","processObjectDefinition","getPart","isThemeGetter","createLruCache","EMPTY_MODIFIERS","createResultObject","createParseClassName","createSortModifiers","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","twJoin","toValue","createTailwindMerge","fallbackThemeArr","fromTheme","arbitraryValueRegex","arbitraryVariableRegex","fractionRegex","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isFraction","isNumber","isInteger","isPercent","isTshirtSize","isAny","isLengthOnly","isNever","isShadow","isImage","isAnyNonArbitrary","isArbitrarySize","isArbitraryValue","isArbitraryLength","isArbitraryNumber","isArbitraryPosition","isArbitraryImage","isArbitraryShadow","isArbitraryVariable","isArbitraryVariableLength","isArbitraryVariableFamilyName","isArbitraryVariablePosition","isArbitraryVariableSize","isArbitraryVariableImage","isArbitraryVariableShadow","getIsArbitraryValue","getIsArbitraryVariable","isLabelPosition","isLabelImage","isLabelSize","isLabelLength","isLabelNumber","isLabelFamilyName","isLabelShadow","getDefaultConfig","twMerge","init_bundle_mjs","__esmMin","array1","array2","combinedArray","Array","length","i","classGroupId","validator","nextPart","Map","validators","config","classMap","conflictingClassGroups","conflictingClassGroupModifiers","getClassGroupId","className","startsWith","endsWith","classParts","split","CLASS_PART_SEPARATOR","startIndex","getConflictingClassGroupIds","hasPostfixModifier","modifierConflicts","baseConflicts","classPartObject","currentClassPart","nextClassPartObject","get","result","classRest","join","slice","validatorsLength","validatorObj","indexOf","undefined","content","colonIndex","property","theme","classGroups","group","classGroup","len","classDefinition","classPartObjectToEdit","push","entries","Object","key","value","path","current","parts","part","next","set","func","maxCacheSize","cacheSize","cache","create","previousCache","update","modifiers","hasImportantModifier","baseClassName","maybePostfixModifierPosition","isExternal","prefix","experimentalParseClassName","parseClassName","bracketDepth","parenDepth","modifierStart","postfixModifierPosition","index","currentCharacter","MODIFIER_SEPARATOR","baseClassNameWithImportantModifier","IMPORTANT_MODIFIER","fullPrefix","parseClassNameOriginal","modifierWeights","orderSensitiveModifiers","forEach","mod","currentSegment","modifier","isArbitrary","isOrderSensitive","has","sort","sortModifiers","classList","configUtils","classGroupsInConflict","classNames","trim","originalClassName","substring","variantModifier","modifierId","classId","conflictGroups","classLists","argument","resolvedValue","string","mix","k","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","reduce","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","args","themeGetter","test","Number","isNaN","testLabel","testValue","exec","shouldMatchNoLabel","label","themeColor","themeFont","themeText","themeFontWeight","themeTracking","themeLeading","themeBreakpoint","themeContainer","themeSpacing","themeRadius","themeShadow","themeInsetShadow","themeTextShadow","themeDropShadow","themeBlur","themePerspective","themeAspect","themeEase","themeAnimate","scaleBreak","scalePosition","scalePositionWithArbitrary","scaleOverflow","scaleOverscroll","scaleUnambiguousSpacing","scaleInset","scaleGridTemplateColsRows","scaleGridColRowStartAndEnd","span","scaleGridColRowStartOrEnd","scaleGridAutoColsRows","scaleAlignPrimaryAxis","scaleAlignSecondaryAxis","scaleMargin","scaleSizing","scaleColor","scaleBgPosition","position","scaleBgRepeat","repeat","scaleBgSize","size","scaleGradientStopPosition","scaleRadius","scaleBorderWidth","scaleLineStyle","scaleBlendMode","scaleMaskImagePosition","scaleBlur","scaleRotate","scaleScale","scaleSkew","scaleTranslate","animate","aspect","blur","breakpoint","color","container","ease","font","leading","perspective","radius","shadow","spacing","text","tracking","columns","box","display","sr","float","clear","isolation","object","overflow","overscroll","inset","start","end","top","right","bottom","left","visibility","z","basis","flex","grow","shrink","order","col","row","gap","justify","items","baseline","self","p","px","py","ps","pe","pt","pr","pb","pl","m","mx","my","ms","me","mt","mr","mb","ml","w","screen","h","list","placeholder","decoration","indent","align","whitespace","break","wrap","hyphens","bg","linear","to","radial","conic","from","via","rounded","border","divide","outline","ring","opacity","mask","closest","farthest","filter","brightness","contrast","grayscale","invert","saturate","sepia","table","caption","transition","duration","delay","backface","rotate","scale","skew","transform","origin","translate","accent","appearance","caret","scheme","cursor","resize","scroll","snap","touch","select","fill","stroke","cn","inputs","twMerge","clsx","init_utils","__esmMin","init_clsx","init_bundle_mjs","Skeleton","className","props","cn","import_jsx_runtime","init_skeleton","__esmMin","init_utils","setRef","ref","value","composeRefs","refs","node","hasCleanup","cleanups","cleanup","i","React","isPromiseLike","value","isLazyComponent","element","REACT_LAZY_TYPE","createSlot","ownerName","SlotClone","createSlotClone","Slot","props","forwardedRef","children","slotProps","use","childrenArray","slottable","isSlottable","newElement","newChildren","child","childrenRef","getElementRef","mergeProps","composeRefs","SLOTTABLE_IDENTIFIER","childProps","overrideProps","propName","slotPropValue","childPropValue","args","result","getter","mayWarn","React","import_jsx_runtime","init_dist","falsyToString","cx","cva","init_dist","__esmMin","init_clsx","value","clsx","base","config","props","_config_compoundVariants","variants","defaultVariants","getVariantClassNames","variant","variantProp","defaultVariantProp","variantKey","propsWithoutUndefined","acc","param","key","getCompoundVariantClassNames","cvClass","cvClassName","compoundVariantOptions","React","import_jsx_runtime","buttonVariants","Button","init_button","__esmMin","init_dist","init_utils","cva","className","variant","size","asChild","props","ref","Slot","cn","markdown_viewer_exports","__export","MarkdownViewer","toAnchor","children","regex","spaceRegex","dashRegex","child","childProps","CodeBlock","codeString","language","copiedCode","setCopiedCode","codeTheme","codeId","Button","SyntaxHighlighter","resolveImagePath","src","filePath","folderPath","cleanFolderPath","imageName","fileDir","imageParts","dirParts","part","resolvedPath","onPageSelect","content","setContent","loading","setLoading","error","setError","isDark","setIsDark","checkTheme","observer","minDelay","startTime","params","response","data","elapsed","remainingDelay","resolve","err","Skeleton","ReactMarkdown","remarkGfm","rehypeRaw","rehypeSanitize","node","props","anchor","childNode","ref","divProps","inline","className","match","alt","title","resolvedSrc","e","target","figure","errorDiv","href","base","relParts","baseParts","p","absolute","finalClassName","datetime","dir","value","min","max","import_lucide_react","React","import_react_markdown","import_react_syntax_highlighter","import_prism","import_rehype_raw","import_rehype_sanitize","import_remark_gfm","import_jsx_runtime","init_markdown_viewer","__esmMin","init_button","init_skeleton","client_exports","__export","Documentation","__toCommonJS","init_skeleton","React","import_jsx_runtime","LazyMarkdownViewer","m","MarkdownViewerLazy","props","Skeleton","init_button","init_utils","import_lucide_react","React","import_jsx_runtime","getErrorIcon","type","getErrorTypeLabel","ErrorCard","error","index","Icon","copied","setCopied","handleCopyPath","pathToCopy","cn","Button","file","ErrorsList","errors","import_lucide_react","React","SelectPrimitive","import_lucide_react","init_utils","import_jsx_runtime","Select","SelectValue","SelectTrigger","className","children","props","ref","cn","SelectScrollUpButton","SelectScrollDownButton","SelectContent","position","SelectLabel","SelectItem","SelectSeparator","import_jsx_runtime","LanguageToggle","languages","selectedLanguage","onLanguageChange","Select","value","SelectTrigger","SelectValue","SelectContent","lang","SelectItem","import_jsx_runtime","Logo","className","init_button","React","React","DialogPrimitive","import_lucide_react","init_utils","import_jsx_runtime","Dialog","DialogPortal","DialogOverlay","className","props","ref","cn","DialogContent","children","DialogPortal","DialogHeader","DialogFooter","DialogTitle","DialogDescription","init_utils","import_lucide_react","import_jsx_runtime","Command","className","props","ref","cn","CommandInput","onValueChange","value","setValue","e","newValue","CommandList","CommandEmpty","CommandGroup","heading","CommandItem","onSelect","handleClick","CommandDialog","open","onOpenChange","children","Dialog","DialogContent","LANGUAGE_PATTERN","getAvailableLanguages","version","files","languageDirs","file","f","dir","GROUP_PATTERN","BUTTON_PATTERN","getEntityType","item","allFiles","f","isPage","isButton","isDropdown","isGroup","isHidden","isPage","isButton","isDropdown","isGroup","getSortEntities","list","a","b","ao","isButton","isGroup","isDropdown","bo","at","bt","getTitle","entity","LANGUAGE_PATTERN","BUTTON_PATTERN","import_lucide_react","React","import_jsx_runtime","SearchBar","documentationStructure","selectedVersion","selectedLanguage","onPageSelect","scannedFiles","open","setOpen","query","setQuery","contentMap","map","file","key","searchablePages","results","structure","collectPages","entities","version","entity","filePath","title","getTitle","content","extractSnippet","maxLength","lowerContent","lowerQuery","index","start","beforeMatch","lastSentence","lastNewline","lastSpace","bestStart","end","afterMatch","nextSentence","nextNewline","nextSpace","bestEnd","snippet","filteredResults","page","titleMatch","pathMatch","contentMatch","handleSelect","path","down","e","Button","CommandDialog","CommandInput","CommandList","CommandEmpty","CommandGroup","result","highlightSnippet","text","regex","part","i","CommandItem","import_lucide_react","React","init_dist","import_lucide_react","React","init_button","React","init_utils","import_jsx_runtime","Input","className","type","props","ref","cn","React","SeparatorPrimitive","init_utils","import_jsx_runtime","Separator","className","orientation","decorative","props","ref","cn","React","SheetPrimitive","init_dist","import_lucide_react","init_utils","import_jsx_runtime","Sheet","SheetPortal","SheetOverlay","className","props","ref","cn","sheetVariants","cva","SheetContent","side","children","SheetHeader","SheetFooter","SheetTitle","SheetDescription","init_skeleton","React","TooltipPrimitive","init_utils","import_jsx_runtime","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","className","sideOffset","props","ref","cn","React","MOBILE_BREAKPOINT","useIsMobile","isMobile","setIsMobile","mql","onChange","init_utils","import_jsx_runtime","SIDEBAR_COOKIE_NAME","SIDEBAR_COOKIE_MAX_AGE","SIDEBAR_WIDTH","SIDEBAR_WIDTH_MOBILE","SIDEBAR_WIDTH_ICON","SIDEBAR_KEYBOARD_SHORTCUT","SidebarContext","useSidebar","context","SidebarProvider","defaultOpen","openProp","setOpenProp","className","style","children","props","ref","isMobile","useIsMobile","openMobile","setOpenMobile","_open","_setOpen","open","setOpen","value","openState","toggleSidebar","handleKeyDown","event","state","contextValue","TooltipProvider","cn","Sidebar","side","variant","collapsible","Sheet","SheetContent","SheetHeader","SheetTitle","SheetDescription","SidebarTrigger","onClick","Button","SidebarRail","SidebarInset","SidebarInput","Input","SidebarHeader","SidebarFooter","SidebarSeparator","Separator","SidebarContent","SidebarGroup","SidebarGroupLabel","asChild","Slot","SidebarGroupAction","SidebarGroupContent","SidebarMenu","SidebarMenuItem","sidebarMenuButtonVariants","cva","SidebarMenuButton","isActive","size","tooltip","Comp","button","Tooltip","TooltipTrigger","TooltipContent","SidebarMenuAction","showOnHover","SidebarMenuBadge","SidebarMenuSkeleton","showIcon","width","Skeleton","SidebarMenuSub","SidebarMenuSubItem","SidebarMenuSubButton","LucideIcons","resolveIcon","iconName","pascalCaseName","word","import_lucide_react","import_jsx_runtime","getEntityKey","entity","getEntityTitle","getEntityIcon","resolveIcon","DocumentationEntityItem","openDropdowns","onToggleDropdown","onPageSelect","entityKey","isOpen","Icon","title","filePath","SidebarMenuItem","SidebarMenuButton","url","target","e","dropdownState","shouldBeOpen","isAlwaysOpen","SidebarMenuSub","p","page","idx","pageTitle","PageIcon","pageKey","SidebarMenuSubItem","SidebarMenuSubButton","import_jsx_runtime","AppSidebar","title","logo","versionSelect","versions","documentationStructure","onPageSelect","versionStorageKey","props","selectedVersion","setSelectedVersion","saved","openDropdowns","setOpenDropdowns","currentStructure","s","toggleDropdown","path","prev","next","Sidebar","SidebarHeader","Select","value","SelectTrigger","SelectValue","SelectContent","version","SelectItem","SidebarContent","SidebarGroup","SidebarMenu","entity","index","entityKey","DocumentationEntityItem","SidebarGroupLabel","SidebarMenuItem","SidebarMenuButton","import_lucide_react","React","init_button","import_jsx_runtime","ThemeToggle","theme","setTheme","stored","root","Button","prev","import_react","useDocumentationRouter","folderPath","getPageFromURL","hash","pagePath","currentPage","setCurrentPageState","setCurrentPage","page","normalized","encoded","handleHashChange","import_gray_matter","errorBuilder","items","err","errors","versionPattern","groupPattern","languagePattern","item","pathParts","parentFolder","versionFolder","versionFiles","f","file","groupFolder","nestedDirs","dropdownFolder","buttonFile","isInRoot","isInLanguageFolder","applyBaseMetaDefaults","meta","inheritMeta","childMeta","parentMeta","inherited","parseVersionStructure","version","files","language","metadata","versionFiles","prepareFilesForVersion","entities","buildEntities","getSortEntities","list","f","LANGUAGE_PATTERN","wantedLang","p","second","file","type","getEntityType","meta","makePage","isHidden","b","makeButton","processedDirs","dir","dirPath","originalDirPath","g","makeGroup","d","makeDropdown","frontmatter","settings","BUTTON_PATTERN","dirMeta","allMeta","pages","collectPagesUnder","dirSettings","metaKey","pageMeta","inheritMeta","import_react","import_jsx_runtime","Documentation","title","useToggleTheme","useToggleLanguage","useSearch","logo","Logo","folderPath","logTreeFiles","versionSelect","scannedFiles","setScannedFiles","receivedErrors","setReceivedErrors","documentationStructure","setDocumentationStructure","selectedVersion","setSelectedVersion","versionStorageKey","languageStorageKey","currentPage","setCurrentPage","useDocumentationRouter","selectedLanguage","setSelectedLanguage","saved","ignoreArray","params","pattern","files","allLanguages","version","getAvailableLanguages","lang","defaultLang","errorBuilder","structures","languages","parseVersionStructure","normalizedCurrentPage","file","normalizedRelative","normalizedOriginal","normalizedPath","ErrorsList","SidebarProvider","AppSidebar","SidebarInset","SidebarTrigger","Separator","SearchBar","LanguageToggle","s","index","arr","ThemeToggle","MarkdownViewerLazy"]}
|