cmms/frontend/node_modules/@vexip-ui/utils/dist/index.cjs.map

1 line
170 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"index.cjs","sources":["../src/common.ts","../src/clipboard.ts","../src/color.ts","../src/counter.ts","../src/data.ts","../src/number.ts","../src/date.ts","../src/deep-clone.ts","../src/destroy-object.ts","../src/dom-event.ts","../src/dom.ts","../src/escape-html.ts","../src/event-emitter.ts","../src/log.ts","../src/performance.ts","../src/support.ts","../src/transform.ts","../src/word-case.ts"],"sourcesContent":["/** 当前环境是否为客户端 */\nexport const isClient = typeof window !== 'undefined'\n/** 当前环境是否为 IOS */\nexport const isIOS =\n /* #__PURE__ */ isClient &&\n window?.navigator?.userAgent &&\n /iP(ad|hone|od)/.test(window.navigator.userAgent)\n\nconst toString = Object.prototype.toString\nconst hasOwnProperty = Object.prototype.hasOwnProperty\n\n/**\n * 判断一个值是否为指定的类型\n *\n * @param value 需判断的值\n * @param type 指定的类型,注意大小写\n *\n * @returns 类型是否匹配\n */\nexport function is(value: unknown, type: string) {\n return toString.call(value) === `[object ${type}]`\n}\n\n/**\n * 判断一个对象是否包含指定的键值\n *\n * @param value 需判断的对象\n * @param key 指定的键值\n *\n * @returns 是否包含键值\n */\nexport function has(value: Record<string, any>, key: string | symbol): key is keyof typeof value {\n return hasOwnProperty.call(value, key)\n}\n\n/**\n * 判断一个值是否已定义\n *\n * @param value 需判断的值\n *\n * @returns 是否已定义\n */\nexport function isDefined<T = unknown>(\n value: T | undefined | null,\n): value is Exclude<T, undefined | null> {\n return value !== undefined && value !== null\n}\n\n/**\n * 判断一个值是否未被定义\n *\n * @param value 需判断的值\n *\n * @returns 是否未定义\n */\nexport function isNull(value: unknown): value is null | undefined {\n return value === undefined || value === null\n}\n\n/**\n * 判断一个值是否为数字\n *\n * @param value 需判断的值\n *\n * @returns 是否为数字\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number'\n}\n\n/**\n * 判断一个值是否为 `NaN`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `NaN`\n */\nexport function isNaN(value: unknown): value is number {\n return Number.isNaN(value)\n}\n\n/**\n * 判断一个值是否为字符串\n *\n * @param value 需判断的值\n *\n * @returns 是否为字符串\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string'\n}\n\n/**\n * 判断一个值是否为布尔值\n *\n * @param value 需判断的值\n *\n * @returns 是否为布尔值\n */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean'\n}\n\n/**\n * 判断一个值是否为 `true`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `true`\n */\nexport function isTrue(value: unknown): value is true {\n return value === true\n}\n\n/**\n * 判断一个值是否为 `false`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `false`\n */\nexport function isFalse(value: unknown): value is false {\n return value === false\n}\n\n/**\n * 判断一个值是否为 `Symbol`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `Symbol`\n */\nexport function isSymbol(value: unknown): value is symbol {\n return typeof value === 'symbol'\n}\n\n/**\n * 判断一个值是否为 `BigInt`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `BigInt`\n */\nexport function isBigInt(value: unknown): value is bigint {\n return typeof value === 'bigint'\n}\n\n/**\n * 判断一个值是否为数组\n *\n * @param value 需判断的值\n *\n * @returns 是否为数组\n */\nexport function isArray<T = any>(value: unknown): value is T[] {\n return Array.isArray(value)\n}\n\n/**\n * 判断一个值是否为对象\n *\n * 注意,`null` 与原生的特殊对象不被包含\n *\n * @param value 需判断的值\n *\n * @returns 是否为对象\n */\nexport function isObject<T extends Record<any, any> = Record<any, any>>(\n value: unknown,\n): value is T {\n return is(value, 'Object')\n}\n\n/**\n * 判断一个值是否为 `Promise`\n *\n * 如果一个对象包含 `then` 和 `catch` 方法,则被认为是一个 `Promise`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `Promise`\n */\nexport function isPromise<T = any>(value: unknown): value is Promise<T> {\n return (\n !!value &&\n typeof (value as any).then === 'function' &&\n typeof (value as any).catch === 'function'\n )\n}\n\n/**\n * 判断一个值是否为函数\n *\n * @param value 需判断的值\n *\n * @returns 是否为函数\n */\nexport function isFunction(value: unknown): value is (...any: any[]) => any {\n return typeof value === 'function'\n}\n\n/**\n * 判断一个值是否为 `Set`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `Set`\n */\nexport function isSet<T = any>(value: unknown): value is Set<T> {\n return is(value, 'Set')\n}\n\n/**\n * 判断一个值是否为 `Map`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `Map`\n */\nexport function isMap<K = any, V = any>(value: unknown): value is Map<K, V> {\n return is(value, 'Map')\n}\n\n/**\n * 判断一个值是否为 `Date`\n *\n * @param value 需判断的值\n *\n * @returns 是否为 `Date`\n */\nexport function isDate(value: unknown): value is Date {\n return is(value, 'Date')\n}\n\n/**\n * 判断一个值是否为正则\n *\n * @param value 需判断的值\n *\n * @returns 是否为正则\n */\nexport function isRegExp(value: unknown): value is RegExp {\n return is(value, 'RegExp')\n}\n\n/**\n * 判断一个值是否为空\n *\n * - 如果这是一个数组或字符串,则 `length` 为 `0` 时为空\n * - 如果这是一个 `Set` 或 `Map`,则 `size` 为 `0` 时为空\n * - 如果这是一个对象,则无任何键值时为空\n * - 如果这是一个数字,则为 `NaN` 时为空\n * - 其余情况下,未定义时为空\n *\n * @param value 需判断的值\n *\n * @returns 是否为空\n */\nexport function isEmpty(value: unknown) {\n if (Array.isArray(value) || typeof value === 'string') {\n return value.length === 0\n }\n\n if (value instanceof Map || value instanceof Set) {\n return value.size === 0\n }\n\n if (isObject(value)) {\n return Object.keys(value).length === 0\n }\n\n if (typeof value === 'number') {\n return isNaN(value)\n }\n\n return isNull(value)\n}\n\n/**\n * 判断一个值是否为 `Element`\n *\n * @param value 需判断的值\n * @param ssr 是否考虑服务端渲染\n *\n * @returns 是否为 `Element`\n */\nexport function isElement<T extends Element = Element>(value: unknown, ssr = false): value is T {\n if (!ssr && !isClient) return false\n\n return !!(value && 'nodeType' in (value as any))\n}\n\n/**\n * 判断一个值能否被迭代\n *\n * @param value 需判断的值\n *\n * @returns 能否被迭代\n */\nexport function isIterable(value: unknown) {\n return isDefined(value) && typeof (value as any)[Symbol.iterator] === 'function'\n}\n\n/**\n * 一个空的占位函数\n */\nexport function noop(...args: any[]): any\nexport function noop() {}\n\n/**\n * 一个返回 `true` 的占位函数\n *\n * @returns `true`\n */\nexport function toTrue(...args: any[]): true\nexport function toTrue() {\n return true\n}\n\n/**\n * 一个返回 `false` 的占位函数\n *\n * @returns `false`\n */\nexport function toFalse(...args: any[]): false\nexport function toFalse() {\n return false\n}\n\n/**\n * 生成一个值递进的数组\n *\n * @param size 大小\n * @param start 开始的数值,默认为 1\n * @param step 跨度,默认为 1\n *\n * @returns 生成的数组\n */\nexport function range(size: number, start = 1, step = 1) {\n const array: number[] = []\n\n for (let i = 0; i < size; ++i) {\n array.push(start + i * step)\n }\n\n return array\n}\n\n/**\n * 获取变量的类型\n *\n * @param value 任意变量\n *\n * @returns 变量的类型\n */\nexport function getType(value: unknown) {\n return Object.prototype.toString.call(value).slice(8, -1)\n}\n\n/**\n * 根据长度生成一串随机的字符串\n *\n * @param length 字符串的长度\n *\n * @returns 生成的字符串\n */\nexport function randomString(length = 16) {\n const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'\n const maxPos = chars.length\n\n let string = ''\n\n while (length--) {\n string += chars.charAt(Math.floor(Math.random() * maxPos))\n }\n\n return string\n}\n\n/**\n * 根据一系列判断条件,执行第一个为 `true` 的条件所对应的回调函数\n *\n * @param conditions 判断条件及回调函数\n * @param options 额外的选项\n *\n * @returns 是否匹配了任一条件\n */\nexport async function decide(\n conditions: [boolean | (() => boolean), () => void | Promise<void>][],\n options: {\n /**\n * 当匹配任意一个条件时,会在该条件对应的回调函数执行前执行\n */\n beforeMatchAny?: () => void | Promise<void>,\n /**\n * 当匹配任意一个条件时,会在该条件对应的回调函数执行完后执行\n */\n afterMatchAny?: () => void | Promise<void>\n } = {},\n) {\n if (conditions.length) {\n for (const [condition, callback] of conditions) {\n if (typeof condition === 'function' ? condition() : condition) {\n if (typeof options.beforeMatchAny === 'function') {\n await options.beforeMatchAny()\n }\n\n await callback()\n\n if (typeof options.afterMatchAny === 'function') {\n await options.afterMatchAny()\n }\n\n return true\n }\n }\n }\n\n return false\n}\n","import { isClient } from './common'\n\n/**\n * 将指定的文本写入粘贴板\n *\n * @param text 需要写入的文本\n *\n * @returns 是否写入成功\n */\nexport async function writeClipboard(text: string) {\n if (!isClient) return false\n\n try {\n await navigator.clipboard.writeText(text)\n\n return true\n } catch {\n let isSuccess = false\n\n const textarea = document.createElement('textarea')\n const prevFocused = document.activeElement\n\n textarea.value = text\n\n // Prevent keyboard from showing on mobile\n textarea.setAttribute('readonly', '')\n\n textarea.style.contain = 'strict'\n textarea.style.position = 'absolute'\n textarea.style.height = '0'\n textarea.style.fontSize = '12pt' // Prevent zooming on iOS\n\n const selection = document.getSelection()\n const originalRange = selection ? selection.rangeCount > 0 && selection.getRangeAt(0) : null\n\n document.body.appendChild(textarea)\n textarea.select()\n\n // Explicit selection workaround for iOS\n textarea.selectionStart = 0\n textarea.selectionEnd = text.length\n\n isSuccess = document.execCommand('copy')\n document.body.removeChild(textarea)\n\n if (originalRange) {\n selection!.removeAllRanges() // originalRange can't be truthy when selection is falsy\n selection!.addRange(originalRange)\n }\n\n // Get the focus back on the previously focused element, if any\n if (prevFocused) {\n ;(prevFocused as HTMLElement).focus()\n }\n\n return isSuccess\n }\n}\n","import { isDefined } from './common'\n\ninterface RGB extends Record<any, any> {\n r: number,\n g: number,\n b: number,\n a?: number\n}\n\nexport interface RGBColor extends RGB {\n a?: 1,\n format?: 'name' | 'rgb'\n}\n\nexport interface RGBAColor extends RGB {\n a: number,\n format?: 'name' | 'rgba'\n}\n\nexport interface HEX3Color extends RGB {\n a?: 1,\n format?: 'name' | 'hex3'\n}\nexport interface HEX4Color extends RGB {\n a: number,\n format?: 'name' | 'hex4'\n}\nexport interface HEX6Color extends RGB {\n a?: 1,\n format?: 'name' | 'hex6'\n}\nexport interface HEX8Color extends RGB {\n a: number,\n format?: 'name' | 'hex8'\n}\n\ninterface HSL extends Record<any, any> {\n h: number,\n s: number,\n l: number,\n a?: number\n}\n\nexport interface HSLColor extends HSL {\n a?: 1,\n format?: 'name' | 'hsl'\n}\n\nexport interface HSLAColor extends HSL {\n a: number,\n format?: 'name' | 'hsla'\n}\n\ninterface HSV extends Record<any, any> {\n h: number,\n s: number,\n v: number,\n a?: number\n}\n\nexport interface HSVColor extends HSV {\n a?: 1,\n format?: 'name' | 'hsv'\n}\n\nexport interface HSVAColor extends HSV {\n a: number,\n format?: 'name' | 'hsva'\n}\n\nexport type Color =\n | string\n | RGBColor\n | RGBAColor\n | HSLColor\n | HSLAColor\n | HSVColor\n | HSVAColor\n | HEX3Color\n | HEX4Color\n | HEX6Color\n | HEX8Color\n\nexport type ObjectColor = Exclude<Color, string>\n\nexport interface ColorMeta {\n rgb: RGBColor,\n hsl: HSLColor,\n hsv: HSVColor,\n hex: string,\n alpha: number,\n rgba: RGBAColor,\n hsla: HSLAColor,\n hsva: HSVAColor,\n hex8: string,\n gray: number,\n origin: Color\n}\n\nexport type ColorType = 'hex' | 'rgb' | 'hsv' | 'hsl'\n\nconst INTEGER_REG = '[-\\\\+]?\\\\d+%?'\nconst NUMBER_REG = '[-\\\\+]?\\\\d*\\\\.\\\\d+%?'\n\nconst NUMBER_UNIT = `(?:${NUMBER_REG})|(?:${INTEGER_REG})`\n\nconst COLOR_REG_3 = `[\\\\s|\\\\(]+(${NUMBER_UNIT})[,|\\\\s]+(${NUMBER_UNIT})[,|\\\\s]+(${NUMBER_UNIT})\\\\s*\\\\)?`\nconst COLOR_REG_4 = `[\\\\s|\\\\(]+(${NUMBER_UNIT})[,|\\\\s]+(${NUMBER_UNIT})[,|\\\\s]+(${NUMBER_UNIT})[,|\\\\s]+(${NUMBER_UNIT})\\\\s*\\\\)?`\n\n// const UNIT_REG = new RegExp(NUMBER_UNIT)\n\n// const FORMAT_REG = /^((((?:rgb)|(?:hsl)|(?:hsv))a?)|hex[3468]?|name)$/\n\nexport const RGB_REG = new RegExp(`rgb${COLOR_REG_3}`)\nexport const RGBA_REG = new RegExp(`rgba${COLOR_REG_4}`)\nexport const HSL_REG = new RegExp(`hsl${COLOR_REG_4}`)\nexport const HSLA_REG = new RegExp(`hsla${COLOR_REG_4}`)\nexport const HSV_REG = new RegExp(`hsv${COLOR_REG_4}`)\nexport const HSVA_REG = new RegExp(`hsva${COLOR_REG_4}`)\n\nexport const HEX_REG_3 = /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/\nexport const HEX_REG_4 = /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/\nexport const HEX_REG_6 = /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\nexport const HEX_REG_8 = /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n\nexport const NAMED_COLORS = Object.freeze({\n aliceblue: 'f0f8ff',\n antiquewhite: 'faebd7',\n aqua: '0ff',\n aquamarine: '7fffd4',\n azure: 'f0ffff',\n beige: 'f5f5dc',\n bisque: 'ffe4c4',\n black: '000',\n blanchedalmond: 'ffebcd',\n blue: '00f',\n blueviolet: '8a2be2',\n brown: 'a52a2a',\n burlywood: 'deb887',\n burntsienna: 'ea7e5d',\n cadetblue: '5f9ea0',\n chartreuse: '7fff00',\n chocolate: 'd2691e',\n coral: 'ff7f50',\n cornflowerblue: '6495ed',\n cornsilk: 'fff8dc',\n crimson: 'dc143c',\n cyan: '0ff',\n darkblue: '00008b',\n darkcyan: '008b8b',\n darkgoldenrod: 'b8860b',\n darkgray: 'a9a9a9',\n darkgreen: '006400',\n darkgrey: 'a9a9a9',\n darkkhaki: 'bdb76b',\n darkmagenta: '8b008b',\n darkolivegreen: '556b2f',\n darkorange: 'ff8c00',\n darkorchid: '9932cc',\n darkred: '8b0000',\n darksalmon: 'e9967a',\n darkseagreen: '8fbc8f',\n darkslateblue: '483d8b',\n darkslategray: '2f4f4f',\n darkslategrey: '2f4f4f',\n darkturquoise: '00ced1',\n darkviolet: '9400d3',\n deeppink: 'ff1493',\n deepskyblue: '00bfff',\n dimgray: '696969',\n dimgrey: '696969',\n dodgerblue: '1e90ff',\n firebrick: 'b22222',\n floralwhite: 'fffaf0',\n forestgreen: '228b22',\n fuchsia: 'f0f',\n gainsboro: 'dcdcdc',\n ghostwhite: 'f8f8ff',\n gold: 'ffd700',\n goldenrod: 'daa520',\n gray: '808080',\n green: '008000',\n greenyellow: 'adff2f',\n grey: '808080',\n honeydew: 'f0fff0',\n hotpink: 'ff69b4',\n indianred: 'cd5c5c',\n indigo: '4b0082',\n ivory: 'fffff0',\n khaki: 'f0e68c',\n lavender: 'e6e6fa',\n lavenderblush: 'fff0f5',\n lawngreen: '7cfc00',\n lemonchiffon: 'fffacd',\n lightblue: 'add8e6',\n lightcoral: 'f08080',\n lightcyan: 'e0ffff',\n lightgoldenrodyellow: 'fafad2',\n lightgray: 'd3d3d3',\n lightgreen: '90ee90',\n lightgrey: 'd3d3d3',\n lightpink: 'ffb6c1',\n lightsalmon: 'ffa07a',\n lightseagreen: '20b2aa',\n lightskyblue: '87cefa',\n lightslategray: '789',\n lightslategrey: '789',\n lightsteelblue: 'b0c4de',\n lightyellow: 'ffffe0',\n lime: '0f0',\n limegreen: '32cd32',\n linen: 'faf0e6',\n magenta: 'f0f',\n maroon: '800000',\n mediumaquamarine: '66cdaa',\n mediumblue: '0000cd',\n mediumorchid: 'ba55d3',\n mediumpurple: '9370db',\n mediumseagreen: '3cb371',\n mediumslateblue: '7b68ee',\n mediumspringgreen: '00fa9a',\n mediumturquoise: '48d1cc',\n mediumvioletred: 'c71585',\n midnightblue: '191970',\n mintcream: 'f5fffa',\n mistyrose: 'ffe4e1',\n moccasin: 'ffe4b5',\n navajowhite: 'ffdead',\n navy: '000080',\n oldlace: 'fdf5e6',\n olive: '808000',\n olivedrab: '6b8e23',\n orange: 'ffa500',\n orangered: 'ff4500',\n orchid: 'da70d6',\n palegoldenrod: 'eee8aa',\n palegreen: '98fb98',\n paleturquoise: 'afeeee',\n palevioletred: 'db7093',\n papayawhip: 'ffefd5',\n peachpuff: 'ffdab9',\n peru: 'cd853f',\n pink: 'ffc0cb',\n plum: 'dda0dd',\n powderblue: 'b0e0e6',\n purple: '800080',\n rebeccapurple: '663399',\n red: 'f00',\n rosybrown: 'bc8f8f',\n royalblue: '4169e1',\n saddlebrown: '8b4513',\n salmon: 'fa8072',\n sandybrown: 'f4a460',\n seagreen: '2e8b57',\n seashell: 'fff5ee',\n sienna: 'a0522d',\n silver: 'c0c0c0',\n skyblue: '87ceeb',\n slateblue: '6a5acd',\n slategray: '708090',\n slategrey: '708090',\n snow: 'fffafa',\n springgreen: '00ff7f',\n steelblue: '4682b4',\n tan: 'd2b48c',\n teal: '008080',\n thistle: 'd8bfd8',\n tomato: 'ff6347',\n turquoise: '40e0d0',\n violet: 'ee82ee',\n wheat: 'f5deb3',\n white: 'fff',\n whitesmoke: 'f5f5f5',\n yellow: 'ff0',\n yellowgreen: '9acd32',\n})\n\nexport type ColorName = keyof typeof NAMED_COLORS\n\nexport const COLOR_NAMES = Object.freeze(new Set(Object.keys(NAMED_COLORS))) as Readonly<\n Set<ColorName>\n>\n\n/**\n * 判断给定的字符串是否为一个合法颜色值\n *\n * @param value 原始字符串\n *\n * @returns 是否为合法颜色\n */\nexport function isColor(value: string): boolean {\n value = String(value).trim().toLowerCase()\n\n if (!value) {\n return false\n }\n\n if (value === 'transparent' || NAMED_COLORS[value as ColorName]) {\n return true\n }\n\n return (\n value === 'transparent' ||\n COLOR_NAMES.has(value as ColorName) ||\n RGB_REG.test(value) ||\n RGBA_REG.test(value) ||\n HSL_REG.test(value) ||\n HSLA_REG.test(value) ||\n HSV_REG.test(value) ||\n HSVA_REG.test(value) ||\n HEX_REG_3.test(value) ||\n HEX_REG_4.test(value) ||\n HEX_REG_6.test(value) ||\n HEX_REG_8.test(value)\n )\n}\n\n/**\n * 将给定的字符串转化为 {@link ObjectColor},无法转换时返回 null\n *\n * @param color 原始颜色字符串\n *\n * @returns 解析后的颜色对象\n */\nexport function parseStringColor(color: string): ObjectColor | null {\n color = color.toString().trim().toLowerCase()\n\n if (color === 'transparent') {\n return { r: 0, g: 0, b: 0, a: 0, format: 'name', toString: toRgbString }\n }\n\n let named = false\n\n if (NAMED_COLORS[color as ColorName]) {\n color = NAMED_COLORS[color as ColorName]\n named = true\n }\n\n let match\n\n if ((match = RGB_REG.exec(color))) {\n const { r, g, b } = normalizeRgb(match[1], match[2], match[3])\n\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255,\n format: 'rgb',\n toString: toRgbString,\n }\n }\n\n if ((match = RGBA_REG.exec(color))) {\n const { r, g, b } = normalizeRgb(match[1], match[2], match[3])\n\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255,\n a: normalizeAlpha(match[4]),\n format: 'rgba',\n toString: toRgbString,\n }\n }\n\n if ((match = HSL_REG.exec(color))) {\n const { h, s, l } = normalizeHsl(match[0], match[1], match[3])\n\n return { h: h * 360, s, l, format: 'hsl', toString: toHslString }\n }\n\n if ((match = HSLA_REG.exec(color))) {\n const { h, s, l } = normalizeHsl(match[0], match[1], match[3])\n\n return {\n h: h * 360,\n s,\n l,\n a: normalizeAlpha(match[4]),\n format: 'hsla',\n toString: toHslString,\n }\n }\n\n if ((match = HSV_REG.exec(color))) {\n const { h, s, v } = normalizeHsv(match[0], match[1], match[3])\n\n return { h: h * 360, s, v, format: 'hsv', toString: toHsvString }\n }\n\n if ((match = HSVA_REG.exec(color))) {\n const { h, s, v } = normalizeHsv(match[0], match[1], match[3])\n\n return {\n h: h * 360,\n s,\n v,\n a: normalizeAlpha(match[4]),\n format: 'hsva',\n toString: toHsvString,\n }\n }\n\n if ((match = HEX_REG_3.exec(color))) {\n return {\n r: parseInt(`${match[1]}${match[1]}`, 16),\n g: parseInt(`${match[2]}${match[2]}`, 16),\n b: parseInt(`${match[3]}${match[3]}`, 16),\n format: named ? 'name' : 'hex3',\n toString: toRgbString,\n }\n }\n\n if ((match = HEX_REG_4.exec(color))) {\n return {\n r: parseInt(`${match[1]}${match[1]}`, 16),\n g: parseInt(`${match[2]}${match[2]}`, 16),\n b: parseInt(`${match[3]}${match[3]}`, 16),\n a: convertHexToDecimal(`${match[4]}${match[4]}`),\n format: named ? 'name' : 'hex4',\n toString: toRgbString,\n }\n }\n\n if ((match = HEX_REG_6.exec(color))) {\n return {\n r: parseInt(match[1], 16),\n g: parseInt(match[2], 16),\n b: parseInt(match[3], 16),\n format: named ? 'name' : 'hex6',\n toString: toRgbString,\n }\n }\n\n if ((match = HEX_REG_8.exec(color))) {\n return {\n r: parseInt(match[1], 16),\n g: parseInt(match[2], 16),\n b: parseInt(match[3], 16),\n a: convertHexToDecimal(match[4]),\n format: named ? 'name' : 'hex8',\n toString: toRgbString,\n }\n }\n\n return null\n}\n\n/**\n * 将给定的 {@link Color} 解析为 {@link ColorMeta}\n *\n * @param color 原始颜色值\n *\n * @returns 解析后的颜色元数据\n */\nexport function parseColor(color: Color): ColorMeta {\n const { a, ...rgb } = parseColorToRgba(color)\n\n delete rgb.format\n\n const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b)\n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n const hex = rgbToHex(rgb.r, rgb.g, rgb.b)\n\n const hex8 = rgbaToHex(rgb.r, rgb.g, rgb.b, a)\n\n return {\n rgb: rgb as RGBColor,\n hsl,\n hsv,\n hex,\n alpha: a,\n rgba: { ...rgb, a, format: 'rgba' },\n hsla: { ...hsl, a, format: 'hsla' },\n hsva: { ...hsv, a, format: 'hsva' },\n hex8,\n gray: rgbToGrayScale(rgb),\n origin: color,\n }\n}\n\n/**\n * 将给定的 {@link Color} 解析为 {@link RGBAColor}\n *\n * @param originColor 原始颜色值\n *\n * @returns 解析后的 RGB 颜色对象\n */\nexport function parseColorToRgba(originColor: Color): RGBAColor {\n let rgb: RGBColor = { r: 0, g: 0, b: 0 }\n let a = 1\n let color: Color | null\n\n if (typeof originColor === 'string') {\n color = parseStringColor(originColor)\n } else {\n color = originColor\n }\n\n if (color !== null && typeof color === 'object') {\n if ('l' in color) {\n rgb = hslToRgb(color.h, color.s, color.l)\n } else if ('v' in color) {\n rgb = hsvToRgb(color.h, color.s, color.v)\n }\n\n if ('a' in color) {\n a = normalizeAlpha(color.a ?? 1)\n\n if (Number.isNaN(a)) {\n a = 1\n }\n }\n\n rgb = color as RGBColor\n }\n\n return { ...rgb, a, format: 'rgba', toString: toRgbString }\n}\n\n/**\n * 将原始的 h、s、l 值标准化为 0 ~ 1 的值\n *\n * @param h 0 ~ 360\n * @param s 0 ~ 10% ~ 100%\n * @param l 0 ~ 10% ~ 100%\n *\n * @returns 标准化后的 HSL 对象\n */\nexport function normalizeHsl(h: number | string, s: number | string, l: number | string) {\n return {\n h: boundRange(h, 0, 360) / 360,\n s: boundRange(isPercentage(s) ? parsePercentage(s) : s, 0, 1),\n l: boundRange(isPercentage(l) ? parsePercentage(l) : l, 0, 1),\n }\n}\n\n/**\n * 将原始的 r、g、b 值标准化为 0 ~ 1 的值\n *\n * @param r 0 ~ 255\n * @param g 0 ~ 255\n * @param b 0 ~ 255\n *\n * @returns 标准化后 RGB 对象\n */\nexport function normalizeRgb(r: number | string, g: number | string, b: number | string) {\n return {\n r: boundRange(r, 0, 255) / 255,\n g: boundRange(g, 0, 255) / 255,\n b: boundRange(b, 0, 255) / 255,\n }\n}\n\n/**\n * 将原始的 h、s、v 值标准化为 0 ~ 1 的值\n *\n * @param h 0 ~ 360\n * @param s 0 ~ 10% ~ 100%\n * @param v 0 ~ 10% ~ 100%\n *\n * @returns 标准化的 HSV 对象\n */\nexport function normalizeHsv(h: number | string, s: number | string, v: number | string) {\n return {\n h: boundRange(h, 0, 360) / 360,\n s: boundRange(isPercentage(s) ? parsePercentage(s) : s, 0, 1),\n v: boundRange(isPercentage(v) ? parsePercentage(v) : v, 0, 1),\n }\n}\n\n/**\n * 将原始透明度值标准化为 0 ~ 1 的值\n *\n * @param a 0 ~ 10% ~ 100%\n *\n * @returns 标准化后的透明度\n */\nexport function normalizeAlpha(a: number | string) {\n return boundRange(isPercentage(a) ? parsePercentage(a) : a, 0, 1)\n}\n\n/**\n * 将 HSL 颜色转换为 RGB 颜色\n *\n * @param h 0 ~ 360\n * @param s 0 ~ 10% ~ 100%\n * @param l 0 ~ 10% ~ 100%\n *\n * @returns 转换后的 RGB 颜色\n */\nexport function hslToRgb(h: number | string, s: number | string, l: number | string): RGBColor {\n let r, g, b\n ;({ h, s, l } = normalizeHsl(h, s, l))\n\n if (s === 0) {\n r = g = b = l\n } else {\n const q = l < 0.5 ? 1 * (1 + s) : l + s - l * s\n const p = 2 * l - q\n\n r = hueToRgb(p, q, h + 1 / 3)\n g = hueToRgb(p, q, h)\n b = hueToRgb(p, q, h - 1 / 3)\n }\n\n r *= 255\n g *= 255\n b *= 255\n\n return { r, g, b, toString: toRgbString }\n}\n\n/**\n * 将 RGB 颜色转换为 HSL 颜色\n *\n * @param r 0 ~ 255\n * @param g 0 ~ 255\n * @param b 0 ~ 255\n *\n * @returns 转换后的 HSL 颜色\n */\nexport function rgbToHsl(r: number | string, g: number | string, b: number | string): HSLColor {\n ;({ r, g, b } = normalizeRgb(r, g, b))\n\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n let h, s\n\n const l = (max + min) / 2\n\n if (max === min) {\n h = s = 0\n } else {\n const d = max - min\n\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n\n switch (max) {\n case r: {\n h = (g - b) / d + (g < b ? 6 : 0)\n break\n }\n case g: {\n h = (b - r) / d + 2\n break\n }\n case b: {\n h = (r - g) / d + 4\n break\n }\n default: {\n h = 0\n }\n }\n\n h *= 60\n }\n\n return { h, s, l, toString: toHslString }\n}\n\n/**\n * 将 HSL 颜色转换为 HSV 颜色\n *\n * @param h 0 ~ 360\n * @param s 0 ~ 10% ~ 100%\n * @param l 0 ~ 10% ~ 100%\n *\n * @returns 转换后的 HSV 颜色\n */\nexport function hslToHsv(h: number | string, s: number | string, l: number | string): HSVColor {\n ;({ h, s, l } = normalizeHsl(h, s, l))\n\n const v = 0.5 * (2 * l + s * (1 - Math.abs(2 * l - 1)))\n\n s = (2 * (v - l)) / v\n\n return { h: h * 360, s, v, toString: toHsvString }\n}\n\n/**\n * 将 HSV 颜色转换为 HSL 颜色\n *\n * @param h 0 ~ 360\n * @param s 0 ~ 10% ~ 100%\n * @param v 0 ~ 10% ~ 100%\n *\n * @returns 转换后的 HSL 颜色\n */\nexport function hsvToHsl(h: number | string, s: number | string, v: number | string): HSLColor {\n ;({ h, s, v } = normalizeHsv(h, s, v))\n\n const l = 0.5 * v * (2 - s)\n\n s = (v * s) / (1 - Math.abs(2 * l - 1))\n\n return { h: h * 360, s, l, toString: toHslString }\n}\n\n/**\n * 将 HSV 颜色转换为 RGB 颜色\n *\n * @param h 0 ~ 360\n * @param s 0 ~ 10% ~ 100%\n * @param v 0 ~ 10% ~ 100%\n *\n * @returns 转换后的 RGB 颜色\n */\nexport function hsvToRgb(h: number | string, s: number | string, v: number | string): RGBColor {\n ;({ h, s, v } = normalizeHsv(h, s, v))\n\n h *= 6\n\n const i = Math.floor(h)\n const f = h - i\n const p = v * (1 - s)\n const q = v * (1 - f * s)\n const t = v * (1 - (1 - f) * s)\n const mod = i % 6\n\n let r = [v, q, p, p, t, v][mod]\n let g = [t, v, v, q, p, p][mod]\n let b = [p, p, t, v, v, q][mod]\n\n r *= 255\n g *= 255\n b *= 255\n\n return { r, g, b, toString: toRgbString }\n}\n\n/**\n * 将 RGB 颜色转换为 HSV 颜色\n *\n * @param r 0 ~ 255\n * @param g 0 ~ 255\n * @param b 0 ~ 255\n *\n * @returns 转换后的 HSV 颜色\n */\nexport function rgbToHsv(r: number | string, g: number | string, b: number | string): HSVColor {\n ;({ r, g, b } = normalizeRgb(r, g, b))\n\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n\n let h\n\n const v = max\n const d = max - min\n const s = max === 0 ? 0 : d / max\n\n if (max === min) {\n h = 0\n } else {\n switch (max) {\n case r: {\n h = (g - b) / d + (g < b ? 6 : 0)\n break\n }\n case g: {\n h = (b - r) / d + 2\n break\n }\n case b: {\n h = (r - g) / d + 4\n break\n }\n default: {\n h = 0\n }\n }\n\n h *= 60\n }\n\n return { h, s, v, toString: toHsvString }\n}\n\n/**\n * 将 RGB 颜色转换为 HEX 颜色\n *\n * @param r 0 ~ 255\n * @param g 0 ~ 255\n * @param b 0 ~ 255\n * @param allow3Char 是否允许 3 位的 HEX 值\n *\n * @returns 转换后的 HEX 颜色\n */\nexport function rgbToHex(\n r: number | string,\n g: number | string,\n b: number | string,\n allow3Char = false,\n) {\n ;({ r, g, b } = normalizeRgb(r, g, b))\n\n const hex = [\n repairDigits(Math.round(r * 255).toString(16)),\n repairDigits(Math.round(g * 255).toString(16)),\n repairDigits(Math.round(b * 255).toString(16)),\n ]\n\n if (allow3Char && isRepetitive(hex[0]) && isRepetitive(hex[1]) && isRepetitive(hex[2])) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0)\n }\n\n return '#' + hex.join('')\n}\n\n/**\n * 将 RGBA 颜色转换为 HEX 颜色\n *\n * @param r 0 ~ 255\n * @param g 0 ~ 255\n * @param b 0 ~ 255\n * @param a 0 ~ 10% ~ 100%\n * @param allow4Char 是否允许 4 位的 HEX 值\n *\n * @returns 转换后的 HEX 颜色\n */\nexport function rgbaToHex(\n r: number | string,\n g: number | string,\n b: number | string,\n a: number | string,\n allow4Char = false,\n) {\n ;({ r, g, b } = normalizeRgb(r, g, b))\n\n const hex = [\n repairDigits(Math.round(r * 255).toString(16)),\n repairDigits(Math.round(g * 255).toString(16)),\n repairDigits(Math.round(b * 255).toString(16)),\n repairDigits(convertDecimalToHex(normalizeAlpha(a))),\n ]\n\n if (\n allow4Char &&\n isRepetitive(hex[0]) &&\n isRepetitive(hex[1]) &&\n isRepetitive(hex[2]) &&\n isRepetitive(hex[3])\n ) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0)\n }\n\n return '#' + hex.join('')\n}\n\n/**\n * 将两种颜色按照一定的比例混合\n *\n * @param color1 第一种颜色\n * @param color2 第二种颜色\n * @param weight 混合比例 0 ~ 1越小则第一种颜色越少\n *\n * @returns 混合后的颜色\n */\nexport function mixColor(color1: Color, color2: Color, weight = 0.5): RGBAColor {\n if (!color1 && !color2) return { r: 0, g: 0, b: 0, a: 1 }\n if (!color1) return parseColorToRgba(color2)\n if (!color2) return parseColorToRgba(color1)\n\n const rgba1 = parseColorToRgba(color1)\n const rgba2 = parseColorToRgba(color2)\n\n const originalWeight = boundRange(weight, 0, 1)\n const normalizedWeight = originalWeight * 2 - 1\n\n const alphaDistance = rgba1.a - rgba2.a\n const mixWeight =\n normalizedWeight * alphaDistance === -1\n ? normalizedWeight\n : (normalizedWeight + alphaDistance) / (1 + normalizedWeight * alphaDistance)\n const weight1 = (mixWeight + 1) / 2\n const weight2 = 1 - weight1\n\n return {\n r: Math.round(rgba1.r * weight1 + rgba2.r * weight2),\n g: Math.round(rgba1.g * weight1 + rgba2.g * weight2),\n b: Math.round(rgba1.b * weight1 + rgba2.b * weight2),\n a: Math.round(rgba1.a * originalWeight + rgba2.a * (1 - originalWeight)),\n format: 'rgba',\n toString: toRgbString,\n }\n}\n\n/**\n * 调整给定颜色值的透明度\n *\n * @param color 需要调整的颜色\n * @param alpha 调整后的透明度 0 ~ 10% ~ 100%\n *\n * @returns 调整后的颜色\n */\nexport function adjustAlpha(color: Color, alpha: number | string) {\n const rgba = parseColorToRgba(color)\n\n rgba.a = normalizeAlpha(alpha)\n\n return rgba\n}\n\n/**\n * 随机生成一个颜色值\n *\n * @param withAlpha 是否具有透明度\n * @param type 颜色的类型\n *\n * @returns 生成的颜色字面值\n */\nexport function randomColor(withAlpha = false, type: ColorType = 'hex') {\n const r = Math.round(Math.random() * 255)\n const g = Math.round(Math.random() * 255)\n const b = Math.round(Math.random() * 255)\n\n if (type === 'hex') {\n return withAlpha ? rgbaToHex(r, g, b, Math.random()) : rgbToHex(r, g, b)\n }\n\n let color: ObjectColor\n\n if (type === 'hsl') {\n color = rgbToHsl(r, g, b)\n } else if (type === 'hsv') {\n color = rgbToHsv(r, g, b)\n } else {\n color = Object.create({ r, g, b, toString: toRgbString })\n }\n\n if (withAlpha) {\n ;(color as RGBAColor).a = Math.random()\n }\n\n return color.toString()\n}\n\n/**\n * 随机生成一个特定色调(冷暖色)的颜色值\n *\n * @param prefer 色调\n * @param withAlpha 是否具有透明度\n * @param type 颜色的类型\n *\n * @returns 生成的颜色字面值\n */\nexport function randomPreferColor(\n prefer: 'hard' | 'soft',\n withAlpha = false,\n type: ColorType = 'hex',\n) {\n const h = Math.round(Math.random() * 360)\n const s = Math.round(prefer === 'hard' ? 80 + Math.random() * 20 : 20 + Math.random() * 70) / 100\n const l = Math.round(prefer === 'hard' ? 40 + Math.random() * 20 : 80 + Math.random() * 15) / 100\n\n if (type === 'hsl') {\n return toHslString.bind({ h, s, l })()\n }\n\n let color!: ObjectColor\n\n if (type === 'hex' || type === 'rgb') {\n color = hslToRgb(h, s, l)\n\n if (type === 'hex') {\n const { r, g, b } = color\n\n return withAlpha ? rgbaToHex(r, g, b, Math.random()) : rgbToHex(r, g, b)\n }\n } else if (type === 'hsv') {\n color = hslToHsv(h, s, l)\n }\n\n if (withAlpha) {\n ;(color as RGBAColor).a = Math.random()\n }\n\n return color.toString()\n}\n\n/**\n * 随机生成一个冷色调的颜色值\n *\n * @param withAlpha 是否具有透明度\n * @param type 颜色的类型\n *\n * @returns 生成的颜色字面值\n */\nexport function randomHardColor(withAlpha = false, type: ColorType = 'hex') {\n return randomPreferColor('hard', withAlpha, type)\n}\n\n/**\n * 随机生成一个暖色调的颜色值\n *\n * @param withAlpha 是否具有透明度\n * @param type 颜色的类型\n *\n * @returns 生成的颜色字面值\n */\nexport function randomSoftColor(withAlpha = false, type: ColorType = 'hex') {\n return randomPreferColor('soft', withAlpha, type)\n}\n\n/**\n * 获取给定颜色的灰度\n *\n * @param color 颜色字面值\n *\n * @returns 颜色的灰度\n */\nexport function toGrayScale(color: string) {\n return rgbToGrayScale(parseColorToRgba(color))\n}\n\nfunction repairDigits(str: string) {\n return str.length === 1 ? `0${str}` : str.toString()\n}\n\nfunction isRepetitive(string: string): boolean {\n return string.charAt(0) === string.charAt(1)\n}\n\n// function testUnit(color: number | string): boolean {\n// return UNIT_REG.test(color as string)\n// }\n\nfunction convertDecimalToHex(number: number | string): string {\n return Math.round(parseFloat(number as string) * 255).toString(16)\n}\n\nfunction convertHexToDecimal(hex: string): number {\n return parseInt(hex, 16) / 255\n}\n\nfunction boundRange(number: number | string, min: number, max: number): number {\n return Math.max(min, Math.min(max, parseFloat(number as string)))\n}\n\nfunction hueToRgb(p: number, q: number, t: number): number {\n if (t < 0) t += 1\n if (t > 1) t -= 1\n if (t < 1 / 6) return p + (q - p) * 6 * t\n if (t < 1 / 2) return q\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\n\n return p\n}\n\nfunction isPercentage(percent: number | string): boolean {\n return String(percent).trim().includes('%')\n}\n\nfunction parsePercentage(percent: number | string): number {\n const number = parseFloat(percent as string) / 100\n\n return Number.isNaN(number) ? 0 : number\n}\n\nfunction toRgbString(this: RGB) {\n if (isDefined(this.a) && this.a >= 0 && this.a < 1) {\n return `rgba(${this.r}, ${this.g}, ${this.b}, ${this.a})`\n }\n\n return `rgb(${this.r}, ${this.g}, ${this.b})`\n}\n\nfunction toHslString(this: HSL) {\n const s = `${this.s * 100}%`\n const l = `${this.l * 100}%`\n\n if (isDefined(this.a) && this.a >= 0 && this.a < 1) {\n return `hsla(${this.h}, ${s}, ${l}, ${this.a})`\n }\n\n return `hsl(${this.h}, ${s}, ${l})`\n}\n\nfunction toHsvString(this: HSV) {\n const s = `${this.s * 100}%`\n const v = `${this.v * 100}%`\n\n if (isDefined(this.a) && this.a >= 0 && this.a < 1) {\n return `hsva(${this.h}, ${s}, ${v}, ${this.a})`\n }\n\n return `hsv(${this.h}, ${s}, ${v})`\n}\n\nfunction rgbToGrayScale(rgb: RGB) {\n return (rgb.r * 0.2126 + rgb.g * 0.7152 + rgb.b * 0.0722) / 255\n}\n","let globalCount = 0\n\nexport function getGlobalCount() {\n return globalCount++\n}\n\nexport function setGlobalCount(count: number) {\n globalCount = Math.round(count)\n}\n\nexport function createCounter(count = 0) {\n return {\n getCount: () => count++,\n setCount: (newCount: number) => {\n count = newCount\n },\n }\n}\n","export interface BITree {\n tree: number[],\n /**\n * 为第 index 个元素增减值\n *\n * @param index 索引值\n * @param num 增减的值\n */\n add(index: number, num: number): void,\n /**\n * 求前 index 个元素的和\n *\n * @param index 索引值\n *\n * @returns 前 index 个元素的和\n */\n sum(index?: number): number,\n /**\n * 获取第 index 个元素的值\n *\n * @param index 索引值\n *\n * @returns 第 index 个元素的值\n */\n get(index: number): number,\n /**\n * 根据目标值寻找一个最接近的元素的索引值\n *\n * @param target 目标值\n *\n * @returns 最接近的元素的索引值\n */\n boundIndex(target: number): number\n}\n\nfunction lowBit(num: number) {\n return num & -num\n}\n\n/**\n * 创建一个二叉索引树Fenwick 树)对象\n *\n * 为了节省初始化性能开销,需确保元素最小值已知,其初始值为:元素最小值 * 元素总数\n *\n * @param length 树的大小,即元素的总数\n * @param min 规定元素的最小值\n *\n * @returns 二叉索引树对象\n */\nexport function createBITree(length: number, min = 0): BITree {\n const tree: number[] = new Array(length + 1).fill(0)\n\n function add(index: number, delta: number) {\n if (!delta || index >= length) return\n\n index += 1\n\n while (index <= length) {\n tree[index] += delta\n index += lowBit(index)\n }\n }\n\n function sum(index = length) {\n if (index <= 0) return 0\n if (index > length) index = length\n\n let sum = index * min\n\n while (index > 0) {\n sum += tree[index]\n index -= lowBit(index)\n }\n\n return sum\n }\n\n function get(index: number) {\n return sum(index + 1) - sum(index)\n }\n\n function boundIndex(target: number) {\n let left = 0\n let right = length\n\n while (right > left) {\n const middle = Math.floor((left + right) / 2)\n const total = sum(middle)\n\n if (total > target) {\n right = middle\n continue\n } else if (total < target) {\n if (left === middle) {\n return sum(left + 1) <= target ? left + 1 : left\n }\n\n left = middle\n } else {\n return middle\n }\n }\n\n return left\n }\n\n return { tree, add, sum, get, boundIndex }\n}\n","import type { AnyCase } from './word-case'\n\nexport const numberRE = /^\\s*[+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?\\s*$/\n\n/**\n * 检测给定的值是否可以通过 parseFlat 或 Number 方法转为数字\n *\n * 开启严格模式则通过正则以更严格的方法判断\n *\n * @param value 需要检测的值\n * @param strict 是否为严格模式\n *\n * @returns 值是否可以转为数字\n */\nexport function isValidNumber(value: unknown, strict = false) {\n if (typeof value === 'number') {\n return !Number.isNaN(value)\n }\n\n if (strict) {\n return numberRE.test(String(value))\n }\n\n return !Number.isNaN(parseFloat(value as string)) || !Number.isNaN(Number(value))\n}\n\n/**\n * 将给定的值转成数字NaN 的情况将会处理成 0\n *\n * @param value 需要转换的值\n *\n * @returns 转换后的数字\n */\nexport function toNumber(value: unknown) {\n let number = parseFloat(value as string)\n\n if (Number.isNaN(number)) {\n number = Number(value)\n }\n\n return Number.isNaN(number) ? 0 : number\n}\n\n/**\n * 为给定的整数开头填充 0直至满足指定的长度\n *\n * @param number 需要处理的整数\n * @param length 填充至的长度\n *\n * @returns 填充后的字面值\n */\nexport function padStartZeros(number: number, length: number) {\n if (length <= 0) {\n return number.toString()\n }\n\n return `${number < 0 ? '-' : ''}${String(Math.abs(Math.round(number))).padStart(length, '0')}`\n}\n\n/**\n * 将小于 10 整数 N 变成 `0N` 的字符串,方法不会对入参校验\n *\n * @param number 需要处理的整数\n *\n * @returns 填充后的字面值\n */\nexport function doubleDigits(number: number) {\n return padStartZeros(number, 2)\n}\n\n/**\n * 返回数字的小数位数\n *\n * @param number 指定的数字\n *\n * @returns 数字的小数位数\n */\nexport function decimalLength(number: number | string) {\n // Get digit length of e\n const eSplit = number.toString().split(/[eE]/)\n const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0)\n\n return len > 0 ? len : 0\n}\n\n/**\n * Return decimal length of a number\n *\n * @param number The input number\n * @deprecated Using `decimalLength` to replace it\n */\nexport function digitLength(number: number | string) {\n return decimalLength(number)\n}\n\n/**\n * 将给定的数字格式化为指定的位阶\n *\n * @param number 需要格式化的数字\n * @param segment 分隔的位数,默认为 3\n * @param separator 分隔的符号,默认为 ','\n *\n * @returns 格式化后的字面值\n */\nexport function segmentNumber(number: number | string, segment = 3, separator = ',') {\n if (typeof number !== 'number') {\n number = parseFloat(number)\n }\n\n if (Number.isNaN(number)) return '0'\n\n let [integer, decimal] = String(number).split('.')\n\n const formatRegExp = new RegExp(`(\\\\d+)(\\\\d{${segment}})`)\n\n while (formatRegExp.test(integer)) {\n integer = integer.replace(formatRegExp, `$1${separator}$2`)\n }\n\n decimal = decimal ? `.${decimal}` : ''\n\n return `${integer}${decimal}`\n}\n\n/**\n * 将给定的实数保留一定的小数\n *\n * @param number 需要处理的实数\n * @param decimal 需要保留的小数\n *\n * @returns 保留小数后的值\n */\nexport function toFixed(number: number, decimal: number) {\n decimal = Math.max(Math.round(decimal), 0)\n\n let snum = number.toFixed(decimalLength(number))\n\n const pointPos = snum.indexOf('.')\n\n if (pointPos === -1) return number\n\n const nums = snum.replace('.', '').split('')\n const targetPos = pointPos + decimal\n const datum = nums[targetPos]\n\n if (!datum) return number\n\n if (snum.charAt(targetPos + 1) === '5') {\n snum = snum.substring(0, targetPos + 1) + '6'\n } else {\n snum = snum.substring(0, targetPos + 2)\n }\n\n return parseFloat(Number(snum).toFixed(decimal))\n}\n\n/**\n * 将给定的实数扩大一定的倍数并保留一定的小数\n *\n * @param number 要处理的实数\n * @param multiple 要扩大的倍数\n * @param decimal 要保留的小数\n *\n * @returns 扩大并保留小数后的值\n */\nexport function multipleFixed(number: number, multiple: number, decimal: number) {\n return toFixed(number * multiple, decimal)\n}\n\n/**\n * 根据临界值对给定的数字进行舍入\n *\n * @param number 需要舍入的数\n * @param criticalValue 舍入的临界值 (0 ~ 1),达到临界值进位反之舍弃\n *\n * @returns 舍入后的值\n */\nexport function round(number: number, criticalValue: number) {\n if (criticalValue < 0 || criticalValue > 1) {\n return Math.round(number)\n }\n\n const ceilValue = Math.ceil(number)\n\n if (number + 1 - criticalValue >= ceilValue) {\n return ceilValue\n } else {\n return Math.floor(number)\n }\n}\n\n/**\n * 将给定的数字限定在指定的范围内\n *\n * @param number 需要限定范围的数\n * @param min 边界最小值,包含该值\n * @param max 边界最大值,包含该值\n *\n * @returns 限定在范围内的值\n */\nexport function boundRange(number: number | string, min: number, max: number) {\n return Math.max(min, Math.min(max, parseFloat(number as string)))\n}\n\n/**\n * 将给定的被除数和除数,不断的取余直至达到次数限制或余数小于除数,返回系列余数\n *\n * @param number 被除数,需大于 0\n * @param divideBy 除数,需大于 1\n * @param limit 次数限制,默认为 0小于 1 则不作限制\n *\n * @returns 相除过程的系列余数\n */\nexport function leaveNumber(number: number, divideBy: number, limit = 0) {\n if (number <= 0 || divideBy <= 1) return [number]\n\n if (limit < 1) {\n limit = Infinity\n }\n\n const remainders: number[] = []\n let count = 0\n\n while (number >= divideBy && count < limit) {\n remainders.push(number % divideBy)\n number = Math.floor(number / divideBy)\n ++count\n }\n\n remainders.push(number)\n\n return remainders.reverse()\n}\n\nconst ordinalSuffixes = ['th', 'st', 'nd', 'rd']\n\n/**\n * 将给定的数字转换为序数词\n *\n * @param value 需要转换的数字\n *\n * @returns 转换后的序数词\n */\nexport function ordinalNumber(value: number) {\n value = Math.round(value)\n\n if (value <= 0) return `${value}th`\n\n const suffix =\n value % 100 > 10 && value % 100 < 14\n ? ordinalSuffixes[0]\n : ordinalSuffixes[value % 10] || ordinalSuffixes[0]\n\n return `${value}${suffix}`\n}\n\nexport type SizeUnitWithAuto = AnyCase<'B' | 'KB' | 'MB' | 'GB' | 'TB' | 'AUTO'>\nexport type SizeUnit = Exclude<SizeUnitWithAuto, AnyCase<'AUTO'>>\n\nconst SIZE_UNIT_WITH_AUTO = Object.freeze([\n 'B',\n 'KB',\n 'MB',\n 'GB',\n 'TB',\n 'AUTO',\n] as Uppercase<SizeUnitWithAuto>[])\n\n/**\n * 根据给定的 Byte 数值,将其格式化成指定单位的大小\n *\n * @param byte 需要计算的 Byte 数值\n * @param unit 格式化的单位\n * @param precision 结果的精度\n * @param joinUtil 是否加入单位\n *\n * @returns 格式化后的值\n */\nexport function formatByteSize(byte: number, unit?: SizeUnitWithAuto): number\nexport function formatByteSize(byte: number, unit?: SizeUnitWithAuto, precision?: number): number\nexport function formatByteSize(byte: number, unit?: SizeUnitWithAuto, joinUtil?: true): number\nexport function formatByteSize(\n byte: number,\n unit?: SizeUnitWithAuto,\n joinUtil?: true,\n precision?: number\n): number\nexport function formatByteSize(\n byte: number,\n unit: SizeUnitWithAuto = 'AUTO',\n joinUtil: number | boolean = false,\n precision?: number,\n) {\n if (typeof precision === 'undefined') {\n if (typeof joinUtil === 'number') {\n precision = joinUtil\n joinUtil = false\n } else {\n precision = 2\n }\n }\n\n let upperUnit = unit.toUpperCase() as Uppercase<SizeUnitWithAuto>\n upperUnit = SIZE_UNIT_WITH_AUTO.includes(upperUnit) ? upperUnit : 'AUTO'\n\n let power\n switch (upperUnit) {\n case 'AUTO':\n power = 0\n break\n case 'KB':\n power = 1\n break\n case 'MB':\n power = 2\n break\n case 'GB':\n power = 3\n break\n case 'TB':\n power = 4\n break\n default:\n return byte\n }\n\n let targetSize\n\n if (!power) {\n for (targetSize = byte; targetSize > 1024; ++power) {\n if (power > 4) break\n targetSize = targetSize / 1024\n }\n } else {\n targetSize = byte / 1024 ** power\n }\n\n targetSize = toFixed(targetSize, precision)\n\n return joinUtil\n ? `${targetSize}${upperUnit === 'AUTO' ? SIZE_UNIT_WITH_AUTO[Math.min(power, 4)] : upperUnit}`\n : targetSize\n}\n\n/**\n * 在给定的范围内随机一个数\n *\n * @param max 最大值\n * @param min 最小值,默认为 0\n *\n * @returns 生成的随机数\n */\nexport function random(max: number, min = 0) {\n if (min === max) return min\n\n if (min > max) {\n ;[min, max] = [max, min]\n }\n\n return Math.random() * (max - min) + min\n}\n\n/**\n * 将数字处理为的指定的有效位数\n *\n * @param number 需要处理的数字\n * @param precision 数字的有效位数\n *\n * @returns 处理后的数字\n *\n * @example\n * ```ts\n * toPrecision(0.09999999999999998) === 0.1 // true\n * ```\n */\nexport function toPrecision(number: number | string, precision = 15) {\n return +parseFloat(Number(number).toPrecision(precision))\n}\n\nfunction multipleInt(number: number | string) {\n const snum = String(number)\n\n if (!snum.includes('e')) {\n return Number(snum.replace('.', ''))\n }\n\n const dLength = decimalLength(number)\n\n return dLength > 0 ? toPrecision(Number(number) * 10 ** dLength) : Number(number)\n}\n\n/**\n * Create an operation to support rest params.\n *\n * @param operation The original operation\n */\nfunction createOperation(operation: (n1: number | string, n2: number | string) => number) {\n return (...numbers: (number | string)[]) => {\n let result = numbers[0] as number\n\n for (let i = 1, len = numbers.length; i < len; ++i) {\n result = operation(result, numbers[i])\n }\n\n return result\n }\n}\n\n/**\n * 精确的乘法\n *\n * @param numbers 需要依次相乘的数字\n *\n * @returns 乘积\n */\nexport const times = createOperation((number1, number2) => {\n const int1 = multipleInt(number1)\n const int2 = multipleInt(number2)\n const base = decimalLength(number1) + decimalLength(number2)\n const int = int1 * int2\n\n return int / 10 ** base\n})\n\n/**\n * 精确的加法\n *\n * @param numbers 需要依次相加的数字\n *\n * @returns 和\n */\nexport const plus = createOperation((number1, number2) => {\n const base = 10 ** Math.max(decimalLength(number1), decimalLength(number2))\n\n return (times(number1, base) + times(number2, base)) / base\n})\n\n/**\n * 精确的减法\n *\n * @param numbers 需要依次相减的数字\n *\n * @returns 差值\n */\nexport const minus = createOperation((number1, number2) => {\n const base = 10 ** Math.max(decimalLength(number1), decimalLength(number2))\n\n return (times(number1, base) - times(number2, base)) / base\n})\n\n/**\n * 精确的除法\n *\n * @param numbers 需要依次相除的数字\n *\n * @returns 商\n */\nexport const divide = createOperation((number1, number2) => {\n const int1 = multipleInt(number1)\n const int2 = multipleInt(number2)\n\n return times(int1 / int2, toPrecision(10 ** (decimalLength(number2) - decimalLength(number1))))\n})\n","import { doubleDigits } from './number'\n\nexport type Dateable = number | string | Date\n\n/** @deprecated renames to `SECOND_ON_MILLISECONDS` */\nexport const SECOND_ON_MILLS = 1000\nexport const SECOND_ON_MILLISECONDS = 1000\n\nexport const MINUTE_ON_SECONDS = 60\n/** @deprecated renames to `MINUTE_ON_MILLISECONDS` */\nexport const MINUTE_ON_MILLS = MINUTE_ON_SECONDS * SECOND_ON_MILLISECONDS\nexport const MINUTE_ON_MILLISECONDS = MINUTE_ON_SECONDS * SECOND_ON_MILLISECONDS\n\nexport const HOUR_ON_MINUTES = 60\nexport const HOUR_ON_SECONDS = HOUR_ON_MINUTES * MINUTE_ON_SECONDS\n/** @deprecated renames to `HOUR_ON_MILLISECONDS` */\nexport const HOUR_ON_MILLS = HOUR_ON_SECONDS * SECOND_ON_MILLISECONDS\nexport const HOUR_ON_MILLISECONDS = HOUR_ON_SECONDS * SECOND_ON_MILLISECONDS\n\nexport const DAY_ON_HOURS = 24\nexport const DAY_ON_MINUTES = DAY_ON_HOURS * HOUR_ON_MINUTES\nexport const DAY_ON_SECONDS = DAY_ON_MINUTES * MINUTE_ON_SECONDS\n/** @deprecated renames to `DAY_ON_MILLISECONDS` */\nexport const DAY_ON_MILLS = DAY_ON_SECONDS * SECOND_ON_MILLISECONDS\nexport const DAY_ON_MILLISECONDS = DAY_ON_SECONDS * SECOND_ON_MILLISECONDS\n\nexport const WEEK_ON_DAYS = 7\nexport const WEEK_ON_HOURS = WEEK_ON_DAYS * DAY_ON_HOURS\nexport const WEEK_ON_MINUTES = WEEK_ON_HOURS * HOUR_ON_MINUTES\nexport const WEEK_ON_SECONDS = WEEK_ON_MINUTES * MINUTE_ON_SECONDS\n/** @deprecated renames to `WEEK_ON_MILLISECONDS` */\nexport const WEEK_ON_MILLS = WEEK_ON_SECONDS * SECOND_ON_MILLISECONDS\nexport const WEEK_ON_MILLISECONDS = WEEK_ON_SECONDS * SECOND_ON_MILLISECONDS\n\nexport const QUARTER_ON_MONTHS = 3\n\nexport const YEAR_ON_QUARTERS = 4\nexport const YEAR_ON_MONTHS = YEAR_ON_QUARTERS * QUARTER_ON_MONTHS\n\ntype Formatter = (date: Date, match: string) => string | number\n\ninterface Formatters {\n [prop: string]: Formatter\n}\n\nconst formatters: Formatters = {\n y(date, match) {\n const year = date.getFullYear()\n\n return match.length === 4 ? year : (year % 1000) % 100\n },\n M(date, match) {\n const month = date.getMonth() + 1\n\n return match.length === 2 ? doubleDigits(month) : month\n },\n d(date, match) {\n const day = date.getDate()\n\n return match.length === 2 ? doubleDigits(day) : day\n },\n H(date, match) {\n const hour = date.getHours()\n\n return match.length === 2 ? doubleDigits(hour) : hour\n },\n m(date, match) {\n const minute = date.getMinutes()\n\n return match.length === 2 ? doubleDigits(minute) : minute\n },\n s(date, match) {\n const second = date.getSeconds()\n\n return match.length === 2 ? doubleDigits(second) : second\n },\n q(date, match) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3)\n\n return match.length === 2 ? doubleDigits(quarter) : quarter\n },\n}\n\nconst formatRegExp = /[yMdHmsq](\\w)*|./g\nconst quotationRegExp = /'(.+?)'/g\n\n/**\n * 将任意可转为 `Date` 对象的变量转为一个新日期\n *\n * @param any 任意可转换的值\n * @param strict 是否在传入非法值时抛错\n *\n * @returns 转换后的 `Date` 对象\n */\nexport function toDate(any: Dateable, strict = false) {\n const date = new Date(any)\n\n if (strict && Number.isNaN(+date)) {\n throw new RangeError('Invalid date value')\n }\n\n if (typeof any === 'string' && !any.includes(':')) {\n date.setHours(0)\n date.setMinutes(0)\n date.setSeconds(0)\n }\n\n return date\n}\n\n/**\n * 将日期格式化成指定格式\n *\n * @param date 需要格式化的Date对象\n * @param pattern 格式化结构 年-y 月-M 日-d 时-H 分-m 秒-s 季度-q\n *\n * @returns 格式化后的字面值\n *\n * @example\n * ```ts\n * format(new Date(), 'yyyy-MM-dd')\n * ```\n *\n * @example\n * ```ts\n * format(Date.now(), 'yyyy-MM-dd\\'T\\'HH:mm:ss\\'Z\\'')\n * ```\n */\nexport function format(date: Dateable, pattern = 'yyyy-MM-dd HH:mm:ss') {\n date = toDate(date)\n\n const matches = pattern.match(formatRegExp)\n const length = matches?.length\n\n if (!length) {\n return pattern\n }\n\n let i = 0\n let result = ''\n\n while (i < length) {\n const substring = (matches as RegExpMatchArray)[i]\n const firstCharacter = substring[0]\n const formatter = formatters[firstCharacter]\n\n if (formatter) {\n result += formatter(date, substring)\n } else {\n result += substring\n }\n\n ++i\n }\n\n return result.replace(quotationRegExp, '$1')\n}\n\n/**\n * 获取日期的时间部分\n *\n * @param date 给定的日期\n *\n * @returns 日期的时间部分\n */\nexport function getTime(date: Dateable) {\n date = toDate(date)\n\n return `${doubleDigits(date.getHours())}:${doubleDigits(date.getMinutes())}:${doubleDigits(\n date.getSeconds(),\n )}`\n}\n\n/**\n * 获取日期所在的季度\n *\n * @param date 给定的日期\n *\n * @returns 日期所在的季度\n */\nexport function getQuarter(date: Dateable) {\n date = toDate(date)\n\n return Math.floor(date.getMonth() / 3) + 1\n}\n\nconst weeksForChinese = ['日', '一', '二', '三', '四', '五', '六']\n\n/**\n * 获取中文星期\n *\n * @param date 给定的日期\n *\n * @returns 中文星期\n */\nexport function getChineseWeek(date: Date) {\n return weeksForChinese[date.getDay()]\n}\n\n/**\n * 为日期增减给定的毫秒\n *\n * @param date 原始日期\n * @param amount 增减的毫秒\n *\n * @returns 修改后的日期\n */\nexport function addMilliseconds(date: Dateable, amount: number) {\n date = toDate(date)\n date.setTime(date.getTime() + amount)\n\n return date\n}\n\n/**\n * 为日期增减给定的秒\n *\n * @param date 原始日期\n * @param amount 增减的秒\n *\n * @returns 修改后的日期\n */\nexport function addSeconds(date: Dateable, amount: number) {\n amount *= SECOND_ON_MILLISECONDS\n\n return addMilliseconds(date, amount)\n}\n\n/**\n * 为日期增减给定的分钟\n *\n * @param date 原始日期\n * @param amount 增减的分钟\n *\n * @returns 修改后的日期\n */\nexport function addMinutes(date: Dateable, amount: number) {\n amount *= MINUTE_ON_SECONDS\n\n return addSeconds(date, amount)\n}\n\n/**\n * 为日期增减给定的小时\n *\n * @param date 原始日期\n * @param amount 增减的小时\n *\n * @returns 修改后的日期\n */\nexport function addHours(date: Dateable, amount: number) {\n amount *= HOUR_ON_MINUTES\n\n return addMinutes(date, amount)\n}\n\n/**\n * 为日期增减给定的半天数12小时\n *\n * @param date 原始日期\n * @param amount 增减的半天数\n *\n * @returns 修改后的日期\n */\nexport function addHalfDays(date: Dateable, amount: number) {\n amount *= 12\n\n return addHours(date, amount)\n}\n\n/**\n * 为日期增减给定的天数\n *\n * @param date 原始日期\n * @param amount 增减的天数\n *\n * @returns 修改后的日期\n */\nexport function addDays(date: Dateable, amount: number) {\n date = toDate(date)\n amount = ~~amount\n\n date.setDate(date.getDate() + amount)\n\n return date\n}\n\n/**\n * 为日期增减给定的周数\n *\n * @param date 原始日期\n * @param amount 增减的周数\n *\n * @returns 修改后的日期\n */\nexport function addWeeks(date: Dateable, amount: number) {\n amount *= WEEK_ON_DAYS\n\n return addDays(date, amount)\n}\n\n/**\n * 为日期增减给定的月数\n *\n * @param date 原始日期\n * @param amount 增减的月数\n *\n * @returns 修改后的日期\n */\nexport function addMonths(date: Dateable, amount: number) {\n date = toDate(date)\n amount = ~~amount\n\n date.setMonth(date.getMonth() + amount)\n\n return date\n}\n\n/**\n * 为日期增减给定的季度3个月\n *\n * @param date 原始日期\n * @param amount 增减的季度\n *\n * @returns 修改后的日期\n */\nexport function addQuarters(date: Dateable, amount: number) {\n amount *= QUARTER_ON_MONTHS\n\n return addMonths(date, amount)\n}\n\n/**\n * 为日期增减给定的年份\n *\n * @param date 原始日期\n * @param amount 增减的年份\n *\n * @returns 修改后的日期\n */\nexport function addYears(date: Dateable, amount: number) {\n amount *= YEAR_ON_MONTHS\n\n return addMonths(date, amount)\n}\n\n/**\n * 生成一个天数递进的日期数组\n *\n * @param start 开始日期\n * @param size range 的大小, 默认 42 (一般电子日历为 6 行 7 列)\n * @param step range 的跨幅\n *\n * @returns 生成的日期数组\n */\nexport function rangeDate(start: Dateable, size = 42, step = 1) {\n start = toDate(start)\n\n const dateRange: Date[] = []\n\n for (let i = 0; i < size; ++i) {\n dateRange.push(addDays(start, i * step))\n }\n\n return dateRange\n}\n\n/**\n * 生成一个月份递进的日期数组\n *\n * @param start 开始日期\n * @param size range 的大小, 默认 12 (一年)\n * @param step range 的跨幅\n *\n * @returns 生成的日期数组\n */\nexport function rangeMonth(start: Dateable, size = 12, step = 1) {\n start = toDate(start)\n\n const dateRange: Date[] = []\n\n for (let i = 0; i < size; ++i) {\n dateRange.push(addMonths(start, i * step))\n }\n\n return dateRange\n}\n\n/**\n * 根据给定的日期获取上一个周日\n *\n * @param date 原始日期\n *\n * @returns 上一个周日\n */\nexport function getLastSunday(date: Date) {\n const day = date.getDay() ?? 7\n\n return addDays(date, -day)\n}\n\n/**\n * 获取给定的日期所在秒的开始日期(毫秒归零)\n *\n * @param date 原始日期\n *\n * @returns 新的开始日期\n */\nexport function startOfSecond(date: Dateable) {\n date = toDate(date)\n date.setMilliseconds(0)\n\n return date\n}\n\n/**\n * 获取给定的日期所在分钟的开始日期 (秒归零)\n *\n * @param date 原始日期\n *\n * @returns 新的开始日期\n */\nexport function startOfMinute(date: Dateable) {\n date = toDate(date)\n date.setSeconds(0, 0)\n\n return date\n}\n\n/**\n * 获取给定的日期所在小时的开始日期 (分钟归零)\n *\n * @param date 原始日期\n *\n * @returns 新的开始日期\n */\nexport function startOfHour(date: Dateable) {\n date = toDate(date)\n date.setMinutes(0, 0, 0)\n\n return date\n}\n\n/**\n * 获取给定的日期所在天的开始日期\n *\n * @param date 原始日期\n *\n * @returns 新的开始日期\n */\nexport function startOfDay(date: Dateable) {\n date = toDate(date)\n date.setHours(0, 0, 0, 0)\n\n return date\n}\n\n/**\n * 获取给定日期所在天的结束日期\n *\n * @param date 原始日期\n *\n * @returns 新的开始日期\n */\nexport function endOfDay(date: Dateable) {\n date = toDate(date)\n date.setHours(23, 59, 59, 999)\n\n return date\n}\n\n/**\n * 获取给定的日期所在周的第一天的开始日期\n *\n * @param date 需要解析的时间\n * @param startOn 设定周的第一天,默认为周日\n *\n * @returns 新的开始日期\n */\nexport function startOfWeek(date: Dateable, startOn = 0) {\n startOn = startOn % 7\n\n if (startOn < 0) {\n startOn += 7\n }\n\n date = toDate(date)\n\n const day = date.getDay()\n const difference = (day < startOn ? 7 : 0) + day - startOn\n\n date.setDate(date.getDate() - difference)\n date.setHours(0, 0, 0, 0)\n\n return date\n}\n\n/**\n * 判断给定的年份是否为闰年\n *\n * @param year 原始年份\n *\n * @returns 是否为闰年\n */\nexport function isLeapYear(year: number) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0\n}\n\n/**\n * 获取给定年份和月份的最后一天\n *\n * @param year 原始年份\n * @param month 原始月份\n *\n * @returns 最后一天\n */\nexport function getLastDayOfMonth(year: number, month: number) {\n let lastDay: number\n\n if (month < 7) {\n if (month !== 2) {\n lastDay = 30 + (month % 2)\n } else {\n if (isLeapYear(year)) {\n lastDay = 29\n } else {\n lastDay = 28\n }\n }\n } else {\n lastDay = 31 - (month % 2)\n }\n\n return lastDay\n}\n\n/**\n * 获取给定的日期所在月份的第一天的开始日期\n *\n * @param date 原始日期\n * @param startOn 设定一个月的第一天,默认为 1 号\n *\n * @returns 新的开始日期\n */\nexport function startOfMonth(date: Dateable, startOn = 1) {\n date = toDate(date)\n\n const year = date.getFullYear()\n const month = date.getMonth() + 1\n const day = date.getDate()\n\n const lastDay = getLastDayOfMonth(year, month)\n\n startOn = startOn % lastDay\n\n if (startOn < 0) {\n startOn += lastDay\n }\n\n if (day < startOn) {\n date.setMonth(month - 1)\n }\n\n date.setDate(startOn)\n date.setHours(0, 0, 0, 0)\n\n return date\n}\n\n/**\n * 获取给定日期所在季度的第一天的开始日期\n *\n * @param date 原始日期\n *\n * @returns 新的开始日期\n */\nexport function startOfQuarter(date: Dateable) {\n date = toDate(date)\n\n const quarter = getQuarter(date)\n\n date.setDate(1)\n date.setHours(0, 0, 0, 0)\n date.setMonth((quarter - 1) * 3)\n\n return date\n}\n\n/**\n * 获取给定日期所在年份的第一天的开始日期\n *\n * @param date 原始日期\n * @param startOn 设定年的开始月份,默认为一月\n *\n * @returns 新的开始日期\n */\nexport function startOfYear(date: Dateable, startOn = 0) {\n startOn = startOn % 11\n\n if (startOn < 0) {\n startOn += 11\n }\n\n date = toDate(date)\n\n const month = date.getMonth()\n const difference = (month < startOn ? 11 : 0) + month - startOn\n\n date.setMonth(date.getMonth() - difference)\n date.setDate(1)\n date.setHours(0, 0, 0, 0)\n\n return date\n}\n\n/**\n * 比较两个日期相差的毫秒\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的毫秒数\n */\nexport function differenceMilliseconds(left: Dateable, right: Dateable) {\n left = toDate(left)\n right = toDate(right)\n\n return right.getTime() - left.getTime()\n}\n\n/**\n * 比较两个日期相差的秒\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的秒数\n */\nexport function differenceSeconds(left: Dateable, right: Dateable) {\n const diff = differenceMilliseconds(left, right) / SECOND_ON_MILLS\n\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\n/**\n * 比较两个日期相差的分钟\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的分钟数\n */\nexport function differenceMinutes(left: Dateable, right: Dateable) {\n const diff = differenceMilliseconds(left, right) / MINUTE_ON_MILLS\n\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\n/**\n * 比较两个日期相差的小时\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的小时数\n */\nexport function differenceHours(left: Dateable, right: Dateable) {\n const diff = differenceMilliseconds(left, right) / HOUR_ON_MILLS\n\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\n/**\n * 比较两个日期相差的天数\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的天数\n */\nexport function differenceDays(left: Dateable, right: Dateable) {\n left = startOfDay(left)\n right = startOfDay(right)\n\n return (right.getTime() - left.getTime()) / DAY_ON_MILLS\n}\n\n/**\n * 比较两个日期相差的周\n *\n * @param left 原始日期\n * @param right 原始日期\n * @param weekStartOn 设定周的第一天,默认为周日\n *\n * @returns 相差的周数\n */\nexport function differenceWeeks(left: Dateable, right: Dateable, weekStartOn = 0) {\n left = startOfWeek(left, weekStartOn)\n right = startOfWeek(right, weekStartOn)\n\n return (right.getTime() - left.getTime()) / WEEK_ON_MILLS\n}\n\n/**\n * 比较两个日期相差的月\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的月份\n */\nexport function differenceMonths(left: Dateable, right: Dateable) {\n left = toDate(left)\n right = toDate(right)\n\n const yearDiff = right.getFullYear() - left.getFullYear()\n const monthDiff = right.getMonth() - left.getMonth()\n\n return yearDiff * 12 + monthDiff\n}\n\n/**\n * 比较两个日期相差的季度\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的季度\n */\nexport function differenceQuarters(left: Dateable, right: Dateable) {\n left = toDate(left)\n right = toDate(right)\n\n const yearDiff = right.getFullYear() - left.getFullYear()\n const quarterDiff = getQuarter(right) - getQuarter(left)\n\n return yearDiff * 4 + quarterDiff\n}\n\n/**\n * 比较两个日期相差的年份\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的年份\n */\nexport function differenceYears(left: Dateable, right: Dateable) {\n left = toDate(left)\n right = toDate(right)\n\n return right.getFullYear() - left.getFullYear()\n}\n\n/**\n * 升序比较两个日期大小,用于给数组的 sort 方法使用\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 比较后的结果,`-1` 则左侧小,`1` 则右侧小,`0` 则相等\n */\nexport function compareAsc(left: Dateable, right: Dateable) {\n left = toDate(left)\n right = toDate(right)\n\n const diff = left.getTime() - right.getTime()\n\n return diff < 0 ? -1 : diff > 0 ? 1 : diff\n}\n\n/**\n * 降序比较两个日期大小,用于给数组的 sort 方法使用\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 比较后的结果,`1` 则左侧小,`-1` 则右侧小,`0` 则相等\n */\nexport function compareDesc(left: Dateable, right: Dateable) {\n return -compareAsc(left, right)\n}\n\n/**\n * 比较两个日期相差的完整秒\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整秒数\n */\nexport function differenceFullSeconds(left: Dateable, right: Dateable) {\n left = startOfSecond(left)\n right = startOfSecond(right)\n\n return differenceSeconds(left, right)\n}\n\n/**\n * 比较两个日期相差的完整分钟\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整分钟数\n */\nexport function differenceFullMinutes(left: Dateable, right: Dateable) {\n left = startOfMinute(left)\n right = startOfMinute(right)\n\n return differenceMinutes(left, right)\n}\n\n/**\n * 比较两个日期相差的完整小时\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整小时数\n */\nexport function differenceFullHours(left: Dateable, right: Dateable) {\n left = startOfHour(left)\n right = startOfHour(right)\n\n return differenceHours(left, right)\n}\n\n/**\n * 比较两个日期相差的完整天\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整天数\n */\nexport function differenceFullDays(left: Dateable, right: Dateable) {\n const sign = compareDesc(left, right)\n const difference = Math.abs(differenceDays(left, right))\n\n left = toDate(left)\n left.setDate(left.getDate() + sign * difference)\n\n const isLastNotFull = compareDesc(left, right) === -sign\n\n return sign * (difference - (isLastNotFull ? 1 : 0))\n}\n\n/**\n * 比较两个日期相差的完整周\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整周数\n */\nexport function differenceFullWeeks(left: Dateable, right: Dateable) {\n const diff = differenceFullDays(left, right) / WEEK_ON_DAYS\n\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\n/**\n * 比较两个日期相差的完整月\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整月份\n */\nexport function differenceFullMonths(left: Dateable, right: Dateable) {\n const sign = compareDesc(left, right)\n const difference = Math.abs(differenceMonths(left, right))\n\n left = toDate(left)\n left.setMonth(left.getMonth() + sign * difference)\n\n const isLastNotFull = compareDesc(left, right) === -sign\n\n return sign * (difference - (isLastNotFull ? 1 : 0))\n}\n\n/**\n * 比较两个日期相差的完整季度\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整季度\n */\nexport function differenceFullQuarters(left: Dateable, right: Dateable) {\n const diff = differenceFullMonths(left, right) / 3\n\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\n/**\n * 比较两个日期相差的完整年份\n *\n * @param left 原始日期\n * @param right 原始日期\n *\n * @returns 相差的完整年份\n */\nexport function differenceFullYears(left: Dateable, right: Dateable) {\n const sign = compareDesc(left, right)\n const difference = Math.abs(differenceYears(left, right))\n\n left = toDate(left)\n left.setFullYear(left.getFullYear() + sign * difference)\n\n const isLastNotFull = compareDesc(left, right) === -sign\n\n return sign * (difference - (isLastNotFull ? 1 : 0))\n}\n","import { getType, noop } from './common'\n\nexport interface DeepCloneOptions {\n /**\n * 一个自定义的克隆对象方法,用于处理方法内置以外的对象克隆,如 Class 的实例\n *\n * @param type 对象的类型,注意格式为大驼峰\n * @param obj 原始对象\n *\n * @returns 克隆后对象\n */\n cloneObject?: (type: string, obj: unknown) => any\n}\n\n/**\n * 深度拷贝对象或数组\n *\n * @param obj 需要拷贝的对象或数组\n *\n * @returns 克隆后的对象\n */\nexport function deepClone<T>(obj: T, options: DeepCloneOptions = {}): T {\n if (obj == null || typeof obj !== 'object') {\n return obj\n }\n\n const { cloneObject = noop } = options\n const temp = Object.create(null) as any\n\n // 循环数组栈\n const loopList: Array<{\n parent: any,\n prop: any,\n data: any\n }> = [\n {\n parent: temp,\n prop: 'root',\n data: obj,\n },\n ]\n\n const referenceMap = new WeakMap<any, any>()\n const setProps: Array<{ parent: any, prop: any }> = []\n const mapProps: Array<{ parent: any, prop: any }> = []\n\n while (loopList.length) {\n // 先入后出,深度优先\n const { parent, prop, data } = loopList.pop()!\n\n if (!parent) continue\n\n const type = getType(data)\n\n if (type === 'Date') {\n parent[prop] = new Date(data as Date)\n continue\n }\n\n if (type !== 'Array') {\n const result = cloneObject(type, data)\n\n if (result != null) {\n parent[prop] = result\n continue\n }\n }\n\n // 初始化克隆对象\n const cloned: any = (parent[prop] =\n type === 'Array' || type === 'Set' || type === 'Map' ? [] : Object.create(null))\n\n if (type === 'Set' || type === 'Map') {\n let i = 0\n\n if (type === 'Set') {\n for (const item of data) {\n if (referenceMap.has(item)) {\n cloned[i] = referenceMap.get(item)!\n } else if (item !== null && typeof item === 'object') {\n loopList.push({\n parent: cloned,\n prop: i,\n data: item,\n })\n } else {\n cloned[i] = item\n }\n\n ++i\n }\n\n setProps.push({ parent, prop })\n } else {\n for (const entry of data) {\n const clonedEntry = []\n i = 0\n\n for (const item of entry) {\n if (referenceMap.has(item)) {\n clonedEntry[i] = referenceMap.get(item)!\n } else if (item !== null && typeof item === 'object') {\n loopList.push({\n parent: clonedEntry,\n prop: i,\n data: item,\n })\n } else {\n clonedEntry[i] = item\n }\n\n ++i\n }\n\n cloned.push(clonedEntry)\n }\n\n mapProps.push({ parent, prop })\n }\n } else {\n for (const key of Object.keys(data)) {\n const item = data[key]\n\n // 处理循环引用\n if (referenceMap.has(item)) {\n cloned[key] = referenceMap.get(item)!\n } else if (item !== null && typeof item === 'object') {\n loopList.push({\n parent: cloned,\n prop: key,\n data: item,\n })\n } else {\n cloned[key] = item\n }\n }\n }\n\n referenceMap.set(data, cloned)\n }\n\n for (const { parent, prop } of setProps) {\n parent[prop] = new Set(parent[prop])\n }\n\n for (const { parent, prop } of mapProps) {\n parent[prop] = new Map(parent[prop])\n }\n\n return temp.root\n}\n","const defaultMessage = 'This object was destroyed, do not use it anywhere'\nconst returnTrue = () => true\n\n/**\n * 将一个对象销毁,销毁后的对象所有方法不可用,属性值均为 `null`\n *\n * @param object 要销毁的对象\n * @param message 销毁后,调用方法时的错误信息\n */\nexport function destroyObject(object: any, message = defaultMessage) {\n const throwDestroyed = () => {\n throw new Error(message)\n }\n\n Object.keys(object).forEach(name => {\n if (typeof object[name] === 'function') {\n object[name] = throwDestroyed.bind(object)\n } else {\n object[name] = null\n }\n })\n\n Object.getOwnPropertyNames(object.constructor.prototype).forEach(name => {\n if (name !== 'constructor' && typeof object[name] === 'function') {\n object[name] = throwDestroyed.bind(object)\n }\n })\n\n object.isDestroyed = returnTrue\n}\n","import { isClient, isDefined } from './common'\n\n/**\n * 专用的类型,用于适配 Vexip UI 中 `transfer` 属性的处理\n */\nexport interface TransferNode extends Element {\n __transferElement?: Element | null\n}\n\nexport interface EventPayload extends EventInit {\n /**\n * 事件的类型\n */\n type: string,\n [prop: string]: any\n}\n\n/**\n * 当前是否可以使用触摸交互\n */\nexport const USE_TOUCH = isClient && ('ontouchstart' in window || getMaxTouchPoints() > 0)\n/**\n * 当前点击的类型,可以使用触摸交互时为 `pointerdown`,否则为 `click`\n */\nexport const CLICK_TYPE = USE_TOUCH ? 'pointerdown' : 'click'\n\nfunction getMaxTouchPoints() {\n return typeof navigator !== 'undefined'\n ? navigator.maxTouchPoints || ((navigator as any).msMaxTouchPoints as number) || 0\n : 0\n}\n\n/**\n * 为指定的元素派发事件\n *\n * @param el 指定的元素\n * @param payload 事件的属性\n * @param Event 事件类\n *\n * @returns 事件是否派发成功\n */\nexport function dispatchEvent(el: Element, payload: EventPayload, Event = window.Event) {\n const { type, bubbles = false, cancelable = false, ...data } = payload\n\n if (!isDefined(type) || type === '') return false\n\n let event\n\n if (isDefined(Event)) {\n event = new Event(type, { bubbles, cancelable })\n } else {\n event = document.createEvent('HTMLEvents')\n event.initEvent(type, bubbles, cancelable)\n }\n\n Object.assign(event, data)\n\n return el.dispatchEvent(event)\n}\n","import { isClient, isDefined } from './common'\nimport { isValidNumber, toNumber } from './number'\n\nimport type { TransferNode } from './dom-event'\n\nconst TABABLE_SELECTOR = [\n 'button',\n '[href]:not(.disabled)',\n 'input',\n 'select',\n 'textarea',\n '[tabindex]',\n '[contenteditable]',\n]\n .map(s => `${s}:not(:disabled):not([disabled])`)\n .join(', ')\n\nfunction isElement(el?: Element | null): el is HTMLElement {\n return !!el && el.nodeType === 1\n}\n\nfunction ensureElement(el?: Element | null) {\n return isElement(el) ? el : document.body\n}\n\n/**\n * 检索匹配指定选择器的所有元素\n *\n * @param selector 选择器\n * @param root 根元素,不指定时为 `document.body`\n *\n * @returns 匹配的所有元素\n */\nexport function queryAll(selector: string, root?: Element | null) {\n if (!isClient || !selector) return []\n\n return Array.from(ensureElement(root).querySelectorAll(selector)) as HTMLElement[]\n}\n\n/**\n * 判断指定的元素是否聚焦或包含聚焦的元素\n *\n * @param el 需判断的元素\n *\n * @returns 是否聚焦或包含聚焦的元素\n */\nexport function isFocusIn(el?: Element | null) {\n if (!isClient) return false\n\n const activeEl = document.activeElement as HTMLElement\n\n if (!isElement(el) || !activeEl) return false\n\n return el === activeEl || contains(activeEl, el)\n}\n\n/**\n * 判断一个元素是否包含另一个元素\n *\n * @param el 被包含的元素(子元素)\n * @param parent 包含的元素(父元素)\n *\n * @returns 元素是否包含另一个元素\n */\nexport function contains(el?: Element | null, parent?: HTMLElement | null) {\n if (!el || !parent) return false\n\n const tel = (parent as TransferNode).__transferElement\n\n return parent.contains(el) || (!!tel && (tel === el || tel.contains(el)))\n}\n\n/**\n * 判断指定的元素是否隐藏\n *\n * @param el 需判断的元素\n *\n * @returns 元素是否隐藏\n */\nexport function isHidden(el?: Element | null) {\n if (!isClient || !isElement(el) || !el.parentNode || !contains(el, document.body)) {\n return true\n }\n\n if (el.style.display === 'none') {\n return true\n }\n\n const rect = el.getBoundingClientRect()\n\n return !(rect && rect.width > 0 && rect.height > 0)\n}\n\n/**\n * 判断指定的元素是否可见\n *\n * @param el 需判断的元素\n *\n * @returns 元素是否可见\n */\nexport function isVisible(el?: Element | null) {\n return !isHidden(el)\n}\n\n/**\n * 判断指定的元素是否被禁用\n *\n * @param el 需判断的元素\n *\n * @returns 元素是否被禁用\n */\nexport function isDisabled(el?: Element | null) {\n return (\n !isElement(el) ||\n (el.hasAttribute('disabled') && el.getAttribute('disabled') !== 'false') ||\n (el as HTMLInputElement).disabled\n )\n}\n\n/**\n * 检索可以被切换焦点Tab的元素\n *\n * @param root 根元素,不指定时为 `document.body`\n * @param includeDisabled 是否包含被禁用的元素\n *\n * @returns 可以被切换焦点的元素\n */\nexport function queryTabables(root?: HTMLElement, includeDisabled = false) {\n const isDis = includeDisabled ? () => false : isDisabled\n\n return queryAll(TABABLE_SELECTOR, root).filter(\n el => isVisible(el) && el.tabIndex > -1 && !isDis(el),\n )\n}\n\n/**\n * 获取元素横向的内边距像素值\n *\n * @param el 指定的元素\n *\n * @returns 元素横向的内边距像素值\n */\nexport function getXPadding(el: HTMLElement | null) {\n if (!isClient || !el) return 0\n\n const computedStyle = getComputedStyle(el)\n const padding = parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight)\n\n return padding || 0\n}\n\n/**\n * 获取元素纵向的内边距像素值\n *\n * @param el 指定的元素\n *\n * @returns 元素纵向的内边距像素值\n */\nexport function getYPadding(el: HTMLElement | null) {\n if (!isClient || !el) return 0\n\n const computedStyle = getComputedStyle(el)\n const padding = parseFloat(computedStyle.paddingTop) + parseFloat(computedStyle.paddingBottom)\n\n return padding || 0\n}\n\n/**\n * 获取元素横向的外边距像素值\n *\n * @param el 指定的元素\n *\n * @returns 元素横向的外边距像素值\n */\nexport function getXMargin(el: HTMLElement | null) {\n if (!isClient || !el) return 0\n\n const computedStyle = getComputedStyle(el)\n const margin = parseFloat(computedStyle.marginLeft) + parseFloat(computedStyle.marginRight)\n\n return margin || 0\n}\n\n/**\n * 获取元素纵向的外边距像素值\n *\n * @param el 指定的元素\n *\n * @returns 元素纵向的外边距像素值\n */\nexport function getYMargin(el: HTMLElement | null) {\n if (!isClient || !el) return 0\n\n const computedStyle = getComputedStyle(el)\n const margin = parseFloat(computedStyle.marginTop) + parseFloat(computedStyle.marginBottom)\n\n return margin || 0\n}\n\n/**\n * 获取元素横向的边框像素值\n *\n * @param el 指定的元素\n *\n * @returns 元素横向的边框像素值\n */\nexport function getXBorder(el: HTMLElement | null) {\n if (!isClient || !el) return 0\n\n const computedStyle = getComputedStyle(el)\n const width =\n parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth)\n\n return width || 0\n}\n\n/**\n * 获取元素纵向的边框像素值\n *\n * @param el 指定的元素\n *\n * @returns 元素纵向的边框像素值\n */\nexport function getYBorder(el: HTMLElement | null) {\n if (!isClient || !el) return 0\n\n const computedStyle = getComputedStyle(el)\n const width =\n parseFloat(computedStyle.borderTopWidth) + parseFloat(computedStyle.borderBottomWidth)\n\n return width || 0\n}\n\n/**\n * 获取元素的选中宽度\n *\n * @param el 指定的元素\n *\n * @returns 元素的选中宽度\n */\nexport function getRangeWidth(el: HTMLElement | null) {\n if (!isClient || !el) return 0\n\n const range = document.createRange()\n\n range.setStart(el, 0)\n range.setEnd(el, el.childNodes.length)\n\n const rangeWidth = range.getBoundingClientRect().width\n const xPadding = getXPadding(el)\n\n return rangeWidth + xPadding\n}\n\n/**\n * 给定的值如果为合法数字,则将转换为像素值\n *\n * @param value 需要判断的值\n *\n * @returns 转换后的像素值\n */\nexport function toCssSize(value: number | string) {\n return isValidNumber(value, true) ? `${toNumber(value)}px` : String(value).trim()\n}\n\n/**\n * 将指定的值转换为 HTML 属性值\n *\n * @param value 需要转换的值\n *\n * @returns 转换后的 HTML 属性值\n */\nexport function toAttrValue(value?: boolean | null): 'true' | undefined\nexport function toAttrValue(value?: string | number | null): string | undefined\nexport function toAttrValue(value?: string | number | boolean | null) {\n return isDefined(value) && value !== false ? String(value) : undefined\n}\n","const escapeRE = /[\"'&<>]/\n\n/**\n * 将 html 内容的敏感字符进行转换\n *\n * @param string html 内容\n *\n * @returns 转换后的 html 内容\n */\nexport function escapeHtml(string: unknown) {\n const str = '' + string\n const match = escapeRE.exec(str)\n\n if (!match) {\n return str\n }\n\n let html = ''\n let escaped: string\n let index: number\n let lastIndex = 0\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escaped = '&quot;'\n break\n case 38: // &\n escaped = '&amp;'\n break\n case 39: // '\n escaped = '&#39;'\n break\n case 60: // <\n escaped = '&lt;'\n break\n case 62: // >\n escaped = '&gt;'\n break\n default:\n continue\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index)\n }\n\n lastIndex = index + 1\n html += escaped\n }\n\n return lastIndex !== index ? html + str.substring(lastIndex, index) : html\n}\n","export type EventType = number | string | symbol\nexport type EventHandler = (...payload: any[]) => void\nexport type EventHandlerSet = Set<EventHandler>\nexport type EventHandlerMap = Map<EventType, EventHandlerSet>\n\nexport interface EventEmitter {\n /**\n * 为指定的事件添加回调方法\n *\n * @param type 事件类型\n * @param handler 回调方法\n */\n on: (type: EventType, handler: EventHandler) => void,\n /**\n * 为指定的事件移除回调方法\n *\n * @param type 事件类型\n * @param handler 回调方法\n */\n off: (type: EventType, handler: EventHandler) => void,\n /**\n * 为指定的事件清除所有回调方法\n *\n * @param type 事件类型\n */\n clear: (type: EventType) => void,\n /**\n * 清除所有事件的所有回调方法\n */\n clearAll: () => void,\n /**\n * 派发特定的事件\n *\n * @param type 事件类型\n * @param payload 传入事件回调方法的参数\n */\n emit: (type: EventType, ...payload: any[]) => void\n}\n\n/**\n * 创建一个自定义的事件发射器\n *\n * @returns 事件发射器\n */\nexport function createEventEmitter() {\n const handlerMap: EventHandlerMap = new Map()\n\n return {\n on(type, handler) {\n const handlers = handlerMap.get(type)\n const added = handlers?.add(handler)\n\n if (!added) {\n handlerMap.set(type, new Set([handler]))\n }\n },\n off(type, handler) {\n const handlers = handlerMap.get(type)\n\n if (handlers) {\n handlers.delete(handler)\n }\n },\n clear(type) {\n const handlers = handlerMap.get(type)\n\n if (handlers) {\n handlers.clear()\n }\n },\n clearAll() {\n handlerMap.clear()\n },\n emit(type, ...payload) {\n const handlers = handlerMap.get(type)\n\n if (handlers) {\n handlers.forEach(handler => {\n handler(...payload)\n })\n }\n },\n } as EventEmitter\n}\n","function logOnce(message: string, cache: Set<string>, logFn: (...data: any[]) => void) {\n if (message && !cache.has(message)) {\n logFn(message)\n cache.add(message)\n }\n}\n\nconst infoCache = new Set<string>()\n\n/**\n * 仅发出一次的提示消息\n *\n * @param message 消息内容\n * @param logFn 输出函数\n */\nexport function infoOnce(message: string, logFn = console.info) {\n logOnce(message, infoCache, logFn)\n}\n\nconst warnCache = new Set<string>()\n\n/**\n * 仅发出一次的警告消息\n *\n * @param message 消息内容\n * @param logFn 输出函数\n */\nexport function warnOnce(message: string, logFn = console.warn) {\n logOnce(message, warnCache, logFn)\n}\n\nconst errorCache = new Set<string>()\n\n/**\n * 仅发出一次的错误消息\n *\n * @param message 消息内容\n * @param logFn 输出函数\n */\nexport function errorOnce(message: string, logFn = console.warn) {\n logOnce(message, errorCache, logFn)\n}\n","import { isClient, noop } from './common'\n\nexport const raf = isClient\n ? requestAnimationFrame\n : (cb: FrameRequestCallback) => {\n setTimeout(cb, 16)\n }\n\n/**\n * 将一个方法进行节流\n *\n * @param method 需要节流的方法,需自行绑定 this\n * @param interval 节流后的触发间隔,默认 16 ms (1 帧)\n *\n * @returns 节流后的方法\n */\nexport function throttle<T extends (...args: any[]) => any>(\n method: T,\n interval = 16,\n): (...args: Parameters<T>) => void {\n if (typeof method !== 'function') {\n return noop\n }\n\n const invoke = (...args: Parameters<T>) => {\n method(...args)\n }\n\n if (interval <= 0) {\n return debounceMinor(invoke)\n }\n\n let lastCall = 0\n let timer: ReturnType<typeof setTimeout>\n\n return function (...args: Parameters<T>) {\n const current = Date.now()\n const elapsed = current - lastCall\n\n clearTimeout(timer)\n\n if (elapsed >= interval) {\n lastCall = current\n invoke(...args)\n } else {\n timer = setTimeout(\n () => {\n lastCall = Date.now()\n invoke(...args)\n },\n Math.max(0, interval - elapsed),\n )\n }\n }\n}\n\n/**\n * 将一个方法进行防抖\n *\n * @param method 需要防抖的方法,需自行绑定 this\n * @param delay 防抖的限制时间,默认 100ms\n *\n * @returns 防抖后的方法\n */\nexport function debounce<T extends (...args: any[]) => any>(\n method: T,\n delay = 100,\n): (...args: Parameters<T>) => void {\n if (typeof method !== 'function') {\n return noop\n }\n\n const invoke = (...args: Parameters<T>) => {\n method(...args)\n }\n\n if (delay <= 0) {\n return debounceMinor(invoke)\n }\n\n let timer: ReturnType<typeof setTimeout>\n\n return function (...args: Parameters<T>) {\n clearTimeout(timer)\n\n timer = setTimeout(() => {\n invoke(...args)\n }, delay)\n }\n}\n\n/**\n * 对给定的方法进行微任务级别的防抖\n *\n * @param method 需要防抖的方法,需自行绑定 this\n *\n * @returns 防抖后的方法\n */\nexport function debounceMinor<T extends (...args: any[]) => any>(method: T) {\n if (typeof method !== 'function') {\n return method\n }\n\n let called = false\n let lastArgs: Parameters<T>\n let promise: Promise<Awaited<ReturnType<T>>>\n\n return function (...args: Parameters<T>) {\n lastArgs = args\n\n if (!called) {\n called = true\n promise = Promise.resolve().then(() => {\n called = false\n promise = undefined!\n\n return method(...lastArgs)\n })\n }\n\n return promise\n }\n}\n\n/**\n * 对给定的方法进行渲染帧级别的防抖\n *\n * @param method 需要防抖的方法,需自行绑定 this\n *\n * @returns 防抖后的方法\n */\nexport function debounceFrame<T extends (...args: any[]) => any>(method: T) {\n if (typeof method !== 'function') {\n return method\n }\n\n let called = false\n let lastArgs: Parameters<T>\n let promise: Promise<Awaited<ReturnType<T>>>\n\n return function (...args: Parameters<T>) {\n lastArgs = args\n\n if (!called) {\n called = true\n promise = new Promise(resolve =>\n raf(() => {\n called = false\n promise = undefined!\n\n resolve(method(...lastArgs))\n }),\n )\n }\n\n return promise\n }\n}\n\nconst tickCallbacks = new Set<(...args: any[]) => any>()\nconst tickArgsMap = new WeakMap<any, any[]>()\n\nfunction flushTickCallbacks() {\n tickCallbacks.forEach(fn => {\n fn(...tickArgsMap.get(fn)!)\n })\n tickCallbacks.clear()\n}\n\n/**\n * 在下一微任务,仅执行一次传入的方法\n *\n * @param method 需要执行的方法\n * @param args 方法的额外参数,在方法调用前多次传入将会覆盖之前的参数\n */\nexport function nextTickOnce<T extends (...args: any[]) => any>(method: T, ...args: any[]) {\n if (typeof method !== 'function') {\n return method\n }\n\n tickArgsMap.set(method, args)\n\n if (tickCallbacks.has(method)) {\n return\n }\n\n tickCallbacks.add(method)\n\n if (tickCallbacks.size === 1) {\n Promise.resolve().then(flushTickCallbacks)\n }\n}\n\nconst frameCallbacks = new Set<(...args: any[]) => any>()\nconst frameArgsMap = new WeakMap<any, any[]>()\n\nfunction flushFrameCallbacks() {\n frameCallbacks.forEach(fn => {\n fn(...frameArgsMap.get(fn)!)\n })\n frameCallbacks.clear()\n}\n\n/**\n * 在下一渲染帧,仅执行一次传入的方法\n *\n * @param method 需要执行的方法\n * @param args 方法的额外参数,在方法调用前多次传入将会覆盖之前的参数\n */\nexport function nextFrameOnce<T extends (...args: any[]) => any>(method: T, ...args: any[]) {\n if (typeof method !== 'function') {\n return method\n }\n\n frameArgsMap.set(method, args)\n\n if (frameCallbacks.has(method)) {\n return\n }\n\n frameCallbacks.add(method)\n\n if (frameCallbacks.size === 1) {\n raf(flushFrameCallbacks)\n }\n}\n\n/**\n * 按指定的并发数,并行地为系列源数据执行操作\n *\n * @param maxConcurrency 最大的并发数\n * @param source 源数据\n * @param iteratorFn 处理操作的异步函数\n *\n * @returns 等待所有任务执行完的 Promise 对象\n */\nexport async function runParallel<T>(\n maxConcurrency: number,\n source: T[],\n iteratorFn: (item: T, source: T[]) => Promise<any>,\n) {\n const ret: Array<Promise<any>> = []\n const executing: Array<Promise<any>> = []\n\n for (const item of source) {\n const p = Promise.resolve().then(() => iteratorFn(item, source))\n\n ret.push(p)\n\n if (maxConcurrency <= source.length) {\n const e: Promise<any> = p.then(() => executing.splice(executing.indexOf(e), 1))\n\n executing.push(e)\n\n if (executing.length >= maxConcurrency) {\n await Promise.race(executing)\n }\n }\n }\n\n return Promise.all(ret)\n}\n","import { isClient } from './common'\n\nlet flexGapSupported: boolean | null = null\n\n/**\n * 判断当前的环境是否支持 CSS 样式:`gap`、`row-gap` 和 `column-gap`\n *\n * @returns 是否支持\n */\nexport function supportFlexGap() {\n if (!isClient) {\n return true\n }\n\n if (flexGapSupported === null) {\n const flex = document.createElement('div')\n\n flex.style.display = 'flex'\n flex.style.flexDirection = 'column'\n flex.style.rowGap = '1px'\n\n flex.appendChild(document.createElement('div'))\n flex.appendChild(document.createElement('div'))\n document.body.appendChild(flex)\n\n flexGapSupported = flex.scrollHeight === 1\n\n document.body.removeChild(flex)\n }\n\n return flexGapSupported\n}\n\nlet imgLoadingSupported: boolean | null = null\n\n/**\n * 判断当前环境是否支持 `<img>` 标签的 `loading` 属性\n *\n * @returns 是否支持\n */\nexport function supportImgLoading() {\n if (!isClient) {\n return false\n }\n\n if (imgLoadingSupported === null) {\n imgLoadingSupported = 'loading' in document.createElement('img')\n }\n\n return imgLoadingSupported\n}\n","import { isDefined, isFunction, isIterable, isObject, toTrue } from './common'\nimport { deepClone } from './deep-clone'\nimport { raf } from './performance'\n\n/**\n * 如果一个值不为数组,则将其转换为数组\n *\n * @param value 指定的值\n *\n * @returns 原始数组或转换后的数组\n */\nexport function ensureArray<T>(value: T | T[]) {\n return Array.isArray(value) ? value : [value]\n}\n\n/**\n * 如果一个值为函数,则执行它并返回结果,否则返回其本身\n *\n * @param value 指定的值\n * @param args 若为函数时,传入的参数\n *\n * @returns 原始值或函数执行结果\n */\nexport function callIfFunc<T, P extends any[] = any[]>(value: T | ((...args: P) => T), ...args: P) {\n return isFunction(value) ? value(...args) : value\n}\n\n/**\n * 将路径中的 `\\` 替换为 `/`\n *\n * @param path 指定的路径\n *\n * @returns 替换后的路径\n */\nexport function normalizePath(path: string) {\n return path.replace(/[\\\\/]+/g, '/')\n}\n\n/**\n * 获取字符串的最后一个字符\n *\n * @param value 指定的字符串\n *\n * @returns 最后一个字符\n */\nexport function getLast(value: string): string | undefined\n/**\n * 获取数组的最后一个元素\n *\n * @param value 指定的数组\n *\n * @returns 最后一个元素\n */\nexport function getLast<T>(value: T[]): T | undefined\nexport function getLast(value: string | any[]) {\n return value[value.length - 1]\n}\n\ntype RecordKey = string | number | symbol\n\nconst defaultAccessor = (v: unknown) => v\n\nexport function listToMap<T = any, K extends keyof T = keyof T>(\n list: T[],\n prop: K,\n useMap?: false\n): Record<T[K] extends RecordKey ? T[K] : RecordKey, T>\nexport function listToMap<T = any, O = T, K extends keyof T = keyof T>(\n list: T[],\n prop: K,\n accessor?: (item: T) => O,\n useMap?: false\n): Record<T[K] extends RecordKey ? T[K] : RecordKey, O>\nexport function listToMap<T = any, K = RecordKey>(\n list: T[],\n prop: (item: T) => K,\n useMap?: false\n): Record<K extends RecordKey ? K : RecordKey, T>\nexport function listToMap<T = any, O = T, K = RecordKey>(\n list: T[],\n prop: (item: T) => K,\n accessor?: (item: T) => O,\n useMap?: false\n): Record<K extends RecordKey ? K : RecordKey, O>\nexport function listToMap<T = any, K extends keyof T = keyof T>(\n list: T[],\n prop: K,\n useMap?: true\n): Map<T[K], T>\nexport function listToMap<T = any, O = T, K extends keyof T = keyof T>(\n list: T[],\n prop: K,\n accessor?: (item: T) => O,\n useMap?: true\n): Map<T[K], O>\nexport function listToMap<T = any, K = any>(\n list: T[],\n prop: (item: T) => K,\n useMap?: true\n): Map<K, T>\nexport function listToMap<T = any, O = T, K = any>(\n list: T[],\n prop: (item: T) => K,\n accessor?: (item: T) => O,\n useMap?: true\n): Map<K, O>\n/**\n * 根据数组元素中某个或多个属性的值转换为映射对象\n *\n * @param list 需要被转换的数组\n * @param prop 需要被转换的属性或提供一个读取方法\n * @param accessor 映射的值的读取方法,默认返回元素本身\n * @param useMap 是否使用 Map 对象储存结果\n *\n * @returns 转换后的映射对象\n */\nexport function listToMap<T = any, O = T>(\n list: T[],\n prop: keyof T | ((item: T) => any),\n accessor?: boolean | ((item: T) => O),\n useMap?: boolean,\n) {\n let normalizeAccessor: (item: T) => O\n\n if (typeof accessor !== 'function' && useMap === undefined) {\n useMap = !!accessor\n normalizeAccessor = defaultAccessor as any\n } else {\n normalizeAccessor = typeof accessor === 'function' ? accessor : (defaultAccessor as any)\n }\n\n const map = (useMap ? new Map<string, any>() : {}) as any\n\n if (!isDefined(prop)) return map\n\n const set = useMap\n ? (key: any, value: O) => map.set(key, value)\n : (key: any, value: O) => (map[key] = value)\n const propAccessor = isFunction(prop) ? prop : (item: T) => item[prop]\n\n list.forEach(item => {\n if (!isDefined(item)) return\n\n const key = propAccessor(item)\n\n if (isDefined(key)) {\n set(key, normalizeAccessor(item))\n }\n })\n\n return map\n}\n\nexport {\n /** @deprecated please use listToMap to replace it */\n listToMap as transformListToMap,\n}\n\n/**\n * 移除数组中的某个元素\n *\n * @param array 需要被移除元素的数组\n * @param item 需要被移除的元素, 或一个查找方法,如果元素为函数时则需要做一层简单包装\n * @param isFn 标记数组的元素是否为函数\n *\n * @returns 被移除的元素\n */\nexport function removeArrayItem<T = any>(\n array: T[],\n item: T | ((item: T) => boolean),\n isFn = false,\n): T | null {\n let index = -1\n\n if (isFn || typeof item !== 'function') {\n index = array.findIndex(current => current === item)\n } else {\n index = array.findIndex(item as (item: T) => boolean)\n }\n\n if (~index) {\n return array.splice(index, 1)[0]\n }\n\n return null\n}\n\n/**\n * 按照一定顺序的属性对数据进行分组\n *\n * @param list 需要分数的数据\n * @param props 需要按顺序分组的属性\n *\n * @returns 分组后的对象\n */\nexport function groupByProps<T = any>(\n list: T[],\n props: Array<string | ((item: T) => any)> | string | ((item: T) => any) = [],\n): Record<string, T[]> {\n if (typeof props === 'string' || typeof props === 'function') {\n props = [props]\n }\n\n const propCount = props.length\n const zipData: Record<string, any> = {}\n\n for (const item of list) {\n let data\n\n for (let i = 0; i < propCount; ++i) {\n const isLast = i === propCount - 1\n const prop = props[i]\n const value = typeof prop === 'function' ? prop(item) : item[prop as keyof T]\n\n if (!data) {\n if (!zipData[value]) {\n zipData[value] = isLast ? [] : {}\n }\n\n data = zipData[value]\n } else {\n if (!data[value]) {\n data[value] = isLast ? [] : {}\n }\n\n data = data[value]\n }\n }\n\n data.push(item)\n }\n\n return zipData\n}\n\nexport interface TreeOptions<T = string> {\n keyField?: T,\n childField?: T,\n parentField?: T,\n /** 若指定,`parent` 值等于 `rootId` 的节点被认为是顶级节点 */\n rootId?: any\n}\n\n/**\n * 将一个展平的列表转换为树\n *\n * @param list 要转换的列表\n * @param options 转换的配置项\n *\n * @returns 转换后的树\n */\nexport function transformTree<T = any>(list: T[], options: TreeOptions<keyof T> = {}) {\n const {\n keyField = 'id' as keyof T,\n childField = 'children' as keyof T,\n parentField = 'parent' as keyof T,\n rootId = null,\n } = options\n\n const hasRootId = isDefined(rootId) && rootId !== ''\n const tree: T[] = []\n const record = new Map<T[keyof T], T[]>()\n\n for (let i = 0, len = list.length; i < len; ++i) {\n const item = list[i]\n const id = item[keyField]\n\n if (hasRootId ? id === rootId : !isDefined(id)) {\n continue\n }\n\n if (record.has(id)) {\n ;(item as any)[childField] = record.get(id)!\n } else {\n ;(item as any)[childField] = []\n record.set(id, (item as any)[childField])\n }\n\n if (item[parentField] && (!hasRootId || item[parentField] !== rootId)) {\n const parentId = item[parentField]\n\n if (!record.has(parentId)) {\n record.set(parentId, [])\n }\n\n record.get(parentId)!.push(item)\n } else {\n tree.push(item)\n }\n }\n\n return tree\n}\n\nexport { transformTree as buildTree }\n\n/**\n * 将一个树展平成列表\n *\n * @param tree 要展平的树\n * @param options 转换的配置项\n *\n * @returns 展平后的列表\n */\nexport function flatTree<T = any>(\n tree: T[],\n options: TreeOptions<keyof T> & {\n /** 是否为深度优先遍历 */\n depthFirst?: boolean,\n /**\n * 是否为无 ID 的节点插入 ID 值\n *\n * @default true\n */\n injectId?: boolean,\n /** 构建节点的 ID 的方法 */\n buildId?: (index: number) => any,\n /** 过滤节点的方法 */\n filter?: (item: T) => boolean,\n /** 过滤的结果是否会影响其子级 */\n cascaded?: boolean,\n /** 是否强制为节点插入 ID 值 */\n forceInject?: boolean\n } = {},\n) {\n const {\n keyField = 'id' as keyof T,\n childField = 'children' as keyof T,\n parentField = 'parent' as keyof T,\n rootId = null,\n depthFirst = false,\n injectId = true,\n buildId = i => i,\n filter = toTrue,\n cascaded = false,\n forceInject = false,\n } = options\n\n let idCount = 1\n\n const hasRootId = isDefined(rootId) && rootId !== ''\n const list: T[] = []\n const loop = [...tree]\n\n while (loop.length) {\n const item = loop.shift()!\n\n const childrenValue = item[childField]\n const children: T[] = Array.isArray(childrenValue) && childrenValue.length ? childrenValue : []\n\n if (injectId && (forceInject || !item[keyField])) {\n item[keyField] = buildId(idCount++)\n }\n\n const id = item[keyField]\n\n if (\n injectId &&\n parentField &&\n (hasRootId ? item[parentField] === rootId : !item[parentField])\n ) {\n ;(item as any)[parentField] = rootId\n }\n\n const filterResult = filter(item)\n\n if (filterResult) list.push(item)\n\n if (filterResult || !cascaded) {\n for (let i = 0, len = children.length; i < len; ++i) {\n const child = children[i]\n\n if (injectId && parentField) {\n child[parentField] = id\n }\n\n !depthFirst && loop.push(child)\n }\n\n if (depthFirst) {\n loop.unshift(...children)\n }\n }\n }\n\n return list\n}\n\n/**\n * 遍历树并为每个节点执行回调方法\n *\n * @param tree 要遍历的树\n * @param cb 回调函数\n * @param options 遍历的配置项\n */\nexport function walkTree<T = any>(\n tree: T[],\n cb: (item: T, depth: number, parent: T | null) => void,\n options: {\n /** 是否为深度优先遍历 */\n depthFirst?: boolean,\n childField?: keyof T\n } = {},\n) {\n const { childField = 'children' as keyof T, depthFirst = false } = options\n const loop = [...tree.map(item => ({ item, depth: 0, parent: null as T | null }))]\n\n while (loop.length) {\n const { item, depth, parent } = loop.shift()!\n const children = item[childField] as T[]\n\n cb(item, depth, parent)\n\n if (isIterable(children)) {\n loop[depthFirst ? 'unshift' : 'push'](\n ...Array.from(children).map(child => ({ item: child, depth: depth + 1, parent: item })),\n )\n }\n }\n}\n\n/**\n * 遍历树并为每个节点执行回调方法,并用其返回值构建一颗新的树\n *\n * @param tree 要遍历的树\n * @param cb 回调函数\n * @param options 遍历的配置项\n *\n * @returns 构建后新的树\n */\nexport function mapTree<T = any, R = any>(\n tree: T[],\n cb: (item: T, depth: number, parent: T | null) => R,\n options: {\n /** 是否为深度优先遍历 */\n depthFirst?: boolean,\n childField?: keyof T,\n /** 是否强制重置 `children` 字段 */\n clearChildren?: boolean\n } = {},\n) {\n const { childField = 'children' as keyof T, depthFirst = false, clearChildren = true } = options\n const result: R[] = []\n const loop = [...tree.map(item => ({ item, depth: 0, parent: null as T | null, result }))]\n\n while (loop.length) {\n const { item, depth, parent, result } = loop.shift()!\n const children = item[childField] as T[]\n const newItem = cb(item, depth, parent) ?? ({} as any)\n\n if (clearChildren) {\n newItem[childField] = []\n }\n\n result.push(newItem)\n\n if (isIterable(children)) {\n const items = Array.from(children)\n\n if (items.length) {\n newItem[childField] = []\n loop[depthFirst ? 'unshift' : 'push'](\n ...Array.from(children).map(child => ({\n item: child,\n depth: depth + 1,\n parent: item,\n result: newItem[childField],\n })),\n )\n }\n }\n }\n\n return result\n}\n\n/**\n * 遍历树并为每个节点执行过滤方法,并用符合条件的节点构建一棵新的树\n *\n * @param tree 要遍历的树\n * @param cb 过滤的方法\n * @param options 遍历的配置项\n *\n * @returns 过滤后新的树\n */\nexport function filterTree<T = any>(\n tree: T[],\n cb: (item: T, depth: number, parent: T | null) => boolean,\n options: {\n /** 判断一个节点是否为叶子节点 */\n isLeaf?: (item: T) => boolean,\n /** 是否只对叶子节点进行过滤 */\n leafOnly?: boolean,\n childField?: keyof T\n } = {},\n) {\n const {\n childField = 'children' as keyof T,\n leafOnly = false,\n isLeaf = item => !isIterable(item[childField]),\n } = options\n\n const filter = (data: T[], depth: number, parent: T | null): T[] => {\n return data\n .map(item => ({ ...item }))\n .filter(item => {\n const children = item[childField] as T[]\n const leaf = isLeaf(item)\n const items = isIterable(children) && Array.from(children)\n\n if (leafOnly && !leaf) {\n if (items && items.length) {\n const matched = filter(items, depth + 1, item)\n item[childField] = matched as any\n\n return !!matched.length\n }\n\n return false\n }\n\n const result = cb(item, depth, parent)\n\n if (leaf) return result\n if (!leafOnly && result) return true\n\n if (items && items.length) {\n const matched = filter(items, depth + 1, item)\n item[childField] = matched as any\n\n return !!matched.length\n }\n\n return result\n })\n }\n\n return filter(tree, 0, null)\n}\n\nexport interface SortOptions<T = string> {\n /** 属性名 */\n key: T,\n /** 排序方法 */\n method?: (prev: any, next: any) => number,\n /** 读取方法 */\n accessor?: (...args: any[]) => any,\n /** 升降序 */\n type?: 'asc' | 'desc',\n /** 传入读取器的额外参数 */\n params?: any[]\n}\n\nconst defaultSortMethod = (prev: any, next: any) => {\n if (Number.isNaN(Number(prev) - Number(next))) {\n return String(prev).localeCompare(next)\n }\n\n return prev - next\n}\n\n/**\n * 根据依赖的属性对数组逐层排序\n *\n * @param list 需要排序的数组\n * @param props 排序依赖的属性\n *\n * @returns 排序后的数组\n */\nexport function sortByProps<T = any>(\n list: T[],\n props: keyof T | SortOptions<keyof T> | (keyof T | SortOptions<keyof T>)[],\n) {\n if (\n !list.sort ||\n (isObject<SortOptions>(props) && !props.key) ||\n !(props as string | SortOptions[]).length\n ) {\n return list\n }\n\n const sortedList = Array.from(list)\n\n if (!Array.isArray(props)) {\n props = [props]\n }\n\n const formattedProps = props\n .map(\n value =>\n (typeof value === 'string'\n ? {\n key: value,\n method: defaultSortMethod,\n type: 'asc',\n }\n : value) as SortOptions<keyof T>,\n )\n .map(value => {\n if (typeof value.accessor !== 'function') {\n value.accessor = (data: T) => data[value.key]\n }\n\n if (typeof value.method !== 'function') {\n value.method = defaultSortMethod\n }\n\n value.params = Array.isArray(value.params) ? value.params : []\n\n return value as Required<SortOptions>\n })\n\n sortedList.sort((prev, next) => {\n let lastResult = 0\n\n for (const prop of formattedProps) {\n const { method, type, accessor, params } = prop\n const desc = type === 'desc'\n const result = method(accessor(prev, ...params), accessor(next, ...params))\n\n lastResult = desc ? -result : result\n // 若不为0则无需进行下一层排序\n if (lastResult) break\n }\n\n return lastResult\n })\n\n return sortedList\n}\n\n/**\n * 将两个对象进行深度的动态合并\n *\n * @param sourceObj 用于接收合并的源对象\n * @param targetObj 被合并的对象,当属性名相同但值类型不同的情况,此对象的权重更高\n * @param isNewObj 标记合并至一个全新的对象(深度的)\n *\n * @returns 合并后的对象\n */\nexport function mergeObjects<T extends Record<string, any>, U extends Record<string, any>>(\n sourceObj: T,\n targetObj: U,\n isNewObj = true,\n) {\n sourceObj = isNewObj ? deepClone(sourceObj) : sourceObj\n\n const loop: Array<{\n source: Record<string, any>,\n target: Record<string, any>\n }> = [\n {\n source: sourceObj,\n target: targetObj,\n },\n ]\n\n while (loop.length) {\n const { source, target } = loop.pop()!\n\n Object.keys(target).forEach(key => {\n if (isObject(target[key])) {\n if (!isObject(source[key])) {\n source[key] = Object.create(null)\n }\n\n loop.push({\n source: source[key],\n target: target[key],\n })\n } else if (Array.isArray(target[key])) {\n if (!Array.isArray(source[key])) {\n source[key] = []\n }\n\n loop.push({\n source: source[key],\n target: target[key],\n })\n } else {\n source[key] = target[key]\n }\n })\n }\n\n return sourceObj as T & U\n}\n\n/**\n * 将一个任务队列按每帧一次依次指定,返回一个触发取消的方法\n *\n * @param queue 任务队列\n *\n * @returns 终止队列执行的方法\n */\nexport function runQueueFrame(queue: Array<() => void>) {\n queue = Array.from(queue)\n\n let cancelled = false\n\n const run = () => {\n if (cancelled) return\n\n queue.shift()?.()\n queue.length && raf(run)\n }\n\n run()\n\n return () => (cancelled = true)\n}\n","/**\n * 将给定的常量字符串类型拓展为不区分大小写的任意组合\n */\nexport type AnyCase<S> = string extends S\n ? string\n : S extends `${infer F1}${infer F2}${infer R}`\n ? `${Uppercase<F1> | Lowercase<F1>}${Uppercase<F2> | Lowercase<F2>}${AnyCase<R>}`\n : S extends `${infer F}${infer R}`\n ? `${Uppercase<F> | Lowercase<F>}${AnyCase<R>}`\n : ''\n\nfunction allCapital(value: string) {\n const matched = value.match(/[A-Z]+/)\n\n return matched && matched[0] === value\n}\n\n// const kebabRE = /\\B([A-Z])/g\nconst kebabRE = /\\B([A-Z])(?=[^A-Z_-])/g\n\n/**\n * 将字面值转换为短横线连接\n *\n * @param value 需要转换的字面值\n *\n * @returns 转换后的短横线连接字面值\n *\n * @example\n * ```ts\n * toKebabCase('AaBbCc') // aa-bb-cc\n * toKebabCase('AABb') // aa-bb\n * toKebabCase('AAA') // aaa\n * toKebabCase('AaBb CcDd') // aa-bb cc-dd\n * ```\n */\nexport function toKebabCase(value: string) {\n // if (allCapital(value)) {\n // return value.toLocaleLowerCase()\n // }\n\n return value.replace(kebabRE, '-$1').toLowerCase()\n}\n\n/**\n * 将给定的常量字符串类型拓展为大驼峰\n */\nexport type CapitalCase<T extends string> = T extends `${infer First} ${infer Rest}`\n ? CapitalCase<`${First}-${Rest}`>\n : T extends `${infer First}-${infer Rest}`\n ? `${Capitalize<First>}${CapitalCase<Rest>}`\n : Capitalize<T>\n\n/**\n * 将字面值转换为大驼峰\n *\n * @param value 需要转换的字面值\n *\n * @returns 转换后的大驼峰字面值\n */\nexport function toCapitalCase<T extends string>(value: T) {\n value = value.trim().replace(/\\s+/g, '-') as T\n value = value.replace(/-+(\\w)/g, (_, char) => (char ? char.toUpperCase() : '')) as T\n\n return (value.charAt(0).toLocaleUpperCase() + value.slice(1)).replace(\n /[^\\w]/g,\n '',\n ) as CapitalCase<T>\n}\n\n/**\n * 将字面值转换为小驼峰\n *\n * @param value 需要转换的字面值\n *\n * @returns 转换后的小驼峰字面值\n */\nexport function toCamelCase(value: string) {\n const capitalName = toCapitalCase(value)\n\n if (allCapital(capitalName)) {\n return capitalName.toLocaleLowerCase()\n }\n\n return capitalName.charAt(0).toLowerCase() + capitalName.slice(1)\n}\n"],"names":["isClient","isIOS","_a","toString","hasOwnProperty","is","value","type","has","key","isDefined","isNull","isNumber","isNaN","isString","isBoolean","isTrue","isFalse","isSymbol","isBigInt","isArray","isObject","isPromise","isFunction","isSet","isMap","isDate","isRegExp","isEmpty","isElement","ssr","isIterable","noop","toTrue","toFalse","range","size","start","step","array","i","getType","randomString","length","chars","maxPos","string","decide","conditions","options","condition","callback","writeClipboard","text","isSuccess","textarea","prevFocused","selection","originalRange","INTEGER_REG","NUMBER_REG","NUMBER_UNIT","COLOR_REG_3","COLOR_REG_4","RGB_REG","RGBA_REG","HSL_REG","HSLA_REG","HSV_REG","HSVA_REG","HEX_REG_3","HEX_REG_4","HEX_REG_6","HEX_REG_8","NAMED_COLORS","COLOR_NAMES","isColor","parseStringColor","color","toRgbString","named","match","g","b","normalizeRgb","normalizeAlpha","h","s","l","normalizeHsl","toHslString","v","normalizeHsv","toHsvString","convertHexToDecimal","parseColor","a","rgb","parseColorToRgba","hsl","rgbToHsl","hsv","rgbToHsv","hex","rgbToHex","hex8","rgbaToHex","rgbToGrayScale","originColor","hslToRgb","hsvToRgb","boundRange","isPercentage","parsePercentage","r","q","p","hueToRgb","max","min","d","hslToHsv","hsvToHsl","f","t","mod","allow3Char","repairDigits","isRepetitive","allow4Char","convertDecimalToHex","mixColor","color1","color2","weight","rgba1","rgba2","originalWeight","normalizedWeight","alphaDistance","weight1","weight2","adjustAlpha","alpha","rgba","randomColor","withAlpha","randomPreferColor","prefer","randomHardColor","randomSoftColor","toGrayScale","str","number","percent","globalCount","getGlobalCount","setGlobalCount","count","createCounter","newCount","lowBit","num","createBITree","tree","add","index","delta","sum","get","boundIndex","target","left","right","middle","total","numberRE","isValidNumber","strict","toNumber","padStartZeros","doubleDigits","decimalLength","eSplit","len","digitLength","segmentNumber","segment","separator","integer","decimal","formatRegExp","toFixed","snum","pointPos","nums","targetPos","multipleFixed","multiple","round","criticalValue","ceilValue","leaveNumber","divideBy","limit","remainders","ordinalSuffixes","ordinalNumber","suffix","SIZE_UNIT_WITH_AUTO","formatByteSize","byte","unit","joinUtil","precision","upperUnit","power","targetSize","random","toPrecision","multipleInt","dLength","createOperation","operation","numbers","result","times","number1","number2","int1","int2","base","plus","minus","divide","SECOND_ON_MILLS","SECOND_ON_MILLISECONDS","MINUTE_ON_SECONDS","MINUTE_ON_MILLS","MINUTE_ON_MILLISECONDS","HOUR_ON_MINUTES","HOUR_ON_SECONDS","HOUR_ON_MILLS","HOUR_ON_MILLISECONDS","DAY_ON_HOURS","DAY_ON_MINUTES","DAY_ON_SECONDS","DAY_ON_MILLS","DAY_ON_MILLISECONDS","WEEK_ON_DAYS","WEEK_ON_HOURS","WEEK_ON_MINUTES","WEEK_ON_SECONDS","WEEK_ON_MILLS","WEEK_ON_MILLISECONDS","QUARTER_ON_MONTHS","YEAR_ON_QUARTERS","YEAR_ON_MONTHS","formatters","date","year","month","day","hour","minute","second","quarter","quotationRegExp","toDate","any","format","pattern","matches","substring","firstCharacter","formatter","getTime","getQuarter","weeksForChinese","getChineseWeek","addMilliseconds","amount","addSeconds","addMinutes","addHours","addHalfDays","addDays","addWeeks","addMonths","addQuarters","addYears","rangeDate","dateRange","rangeMonth","getLastSunday","startOfSecond","startOfMinute","startOfHour","startOfDay","endOfDay","startOfWeek","startOn","difference","isLeapYear","getLastDayOfMonth","lastDay","startOfMonth","startOfQuarter","startOfYear","differenceMilliseconds","differenceSeconds","diff","differenceMinutes","differenceHours","differenceDays","differenceWeeks","weekStartOn","differenceMonths","yearDiff","monthDiff","differenceQuarters","quarterDiff","differenceYears","compareAsc","compareDesc","differenceFullSeconds","differenceFullMinutes","differenceFullHours","differenceFullDays","sign","isLastNotFull","differenceFullWeeks","differenceFullMonths","differenceFullQuarters","differenceFullYears","deepClone","obj","cloneObject","temp","loopList","referenceMap","setProps","mapProps","parent","prop","data","cloned","item","entry","clonedEntry","defaultMessage","returnTrue","destroyObject","object","message","throwDestroyed","name","USE_TOUCH","getMaxTouchPoints","CLICK_TYPE","dispatchEvent","el","payload","Event","bubbles","cancelable","event","TABABLE_SELECTOR","ensureElement","queryAll","selector","root","isFocusIn","activeEl","contains","tel","isHidden","rect","isVisible","isDisabled","queryTabables","includeDisabled","isDis","getXPadding","computedStyle","getYPadding","getXMargin","getYMargin","getXBorder","getYBorder","getRangeWidth","rangeWidth","xPadding","toCssSize","toAttrValue","escapeRE","escapeHtml","html","escaped","lastIndex","createEventEmitter","handlerMap","handler","handlers","logOnce","cache","logFn","infoCache","infoOnce","warnCache","warnOnce","errorCache","errorOnce","raf","cb","throttle","method","interval","invoke","args","debounceMinor","lastCall","timer","current","elapsed","debounce","delay","called","lastArgs","promise","debounceFrame","resolve","tickCallbacks","tickArgsMap","flushTickCallbacks","fn","nextTickOnce","frameCallbacks","frameArgsMap","flushFrameCallbacks","nextFrameOnce","runParallel","maxConcurrency","source","iteratorFn","ret","executing","e","flexGapSupported","supportFlexGap","flex","imgLoadingSupported","supportImgLoading","ensureArray","callIfFunc","normalizePath","path","getLast","defaultAccessor","listToMap","list","accessor","useMap","normalizeAccessor","map","set","propAccessor","removeArrayItem","isFn","groupByProps","props","propCount","zipData","isLast","transformTree","keyField","childField","parentField","rootId","hasRootId","record","id","parentId","flatTree","depthFirst","injectId","buildId","filter","cascaded","forceInject","idCount","loop","childrenValue","children","filterResult","child","walkTree","depth","mapTree","clearChildren","newItem","filterTree","leafOnly","isLeaf","leaf","items","matched","defaultSortMethod","prev","next","sortByProps","sortedList","formattedProps","lastResult","params","desc","mergeObjects","sourceObj","targetObj","isNewObj","runQueueFrame","queue","cancelled","run","allCapital","kebabRE","toKebabCase","toCapitalCase","_","char","toCamelCase","capitalName"],"mappings":"gFACa,MAAAA,EAAW,OAAO,OAAW,WAE7B,MAAAC,GACKD,KAChBE,GAAA,2BAAQ,YAAR,YAAAA,GAAmB,YACnB,iBAAiB,KAAK,OAAO,UAAU,SAAS,EAE5CC,GAAW,OAAO,UAAU,SAC5BC,GAAiB,OAAO,UAAU,eAUxB,SAAAC,EAAGC,EAAgBC,EAAc,CAC/C,OAAOJ,GAAS,KAAKG,CAAK,IAAM,WAAWC,CAAI,GACjD,CAUgB,SAAAC,GAAIF,EAA4BG,EAAiD,CACxF,OAAAL,GAAe,KAAKE,EAAOG,CAAG,CACvC,CASO,SAASC,EACdJ,EACuC,CAChC,OAAuBA,GAAU,IAC1C,CASO,SAASK,GAAOL,EAA2C,CACzD,OAAuBA,GAAU,IAC1C,CASO,SAASM,GAASN,EAAiC,CACxD,OAAO,OAAOA,GAAU,QAC1B,CASO,SAASO,GAAMP,EAAiC,CAC9C,OAAA,OAAO,MAAMA,CAAK,CAC3B,CASO,SAASQ,GAASR,EAAiC,CACxD,OAAO,OAAOA,GAAU,QAC1B,CASO,SAASS,GAAUT,EAAkC,CAC1D,OAAO,OAAOA,GAAU,SAC1B,CASO,SAASU,GAAOV,EAA+B,CACpD,OAAOA,IAAU,EACnB,CASO,SAASW,GAAQX,EAAgC,CACtD,OAAOA,IAAU,EACnB,CASO,SAASY,GAASZ,EAAiC,CACxD,OAAO,OAAOA,GAAU,QAC1B,CASO,SAASa,GAASb,EAAiC,CACxD,OAAO,OAAOA,GAAU,QAC1B,CASO,SAASc,GAAiBd,EAA8B,CACtD,OAAA,MAAM,QAAQA,CAAK,CAC5B,CAWO,SAASe,EACdf,EACY,CACL,OAAAD,EAAGC,EAAO,QAAQ,CAC3B,CAWO,SAASgB,GAAmBhB,EAAqC,CAEpE,MAAA,CAAC,CAACA,GACF,OAAQA,EAAc,MAAS,YAC/B,OAAQA,EAAc,OAAU,UAEpC,CASO,SAASiB,GAAWjB,EAAiD,CAC1E,OAAO,OAAOA,GAAU,UAC1B,CASO,SAASkB,GAAelB,EAAiC,CACvD,OAAAD,EAAGC,EAAO,KAAK,CACxB,CASO,SAASmB,GAAwBnB,EAAoC,CACnE,OAAAD,EAAGC,EAAO,KAAK,CACxB,CASO,SAASoB,GAAOpB,EAA+B,CAC7C,OAAAD,EAAGC,EAAO,MAAM,CACzB,CASO,SAASqB,GAASrB,EAAiC,CACjD,OAAAD,EAAGC,EAAO,QAAQ,CAC3B,CAeO,SAASsB,GAAQtB,EAAgB,CACtC,OAAI,MAAM,QAAQA,CAAK,GAAK,OAAOA,GAAU,SACpCA,EAAM,SAAW,EAGtBA,aAAiB,KAAOA,aAAiB,IACpCA,EAAM,OAAS,EAGpBe,EAASf,CAAK,EACT,OAAO,KAAKA,CAAK,EAAE,SAAW,EAGnC,OAAOA,GAAU,SACZO,GAAMP,CAAK,EAGbK,GAAOL,CAAK,CACrB,CAUgB,SAAAuB,GAAuCvB,EAAgBwB,EAAM,GAAmB,CAC9F,MAAI,CAACA,GAAO,CAAC9B,EAAiB,GAEvB,CAAC,EAAEM,GAAS,aAAeA,EACpC,CASO,SAASyB,EAAWzB,EAAgB,CACzC,OAAOI,EAAUJ,CAAK,GAAK,OAAQA,EAAc,OAAO,QAAQ,GAAM,UACxE,CAMO,SAAS0B,GAAO,CAAC,CAQjB,SAASC,IAAS,CAChB,MAAA,EACT,CAQO,SAASC,IAAU,CACjB,MAAA,EACT,CAWO,SAASC,GAAMC,EAAcC,EAAQ,EAAGC,EAAO,EAAG,CACvD,MAAMC,EAAkB,CAAC,EAEzB,QAASC,EAAI,EAAGA,EAAIJ,EAAM,EAAEI,EACpBD,EAAA,KAAKF,EAAQG,EAAIF,CAAI,EAGtB,OAAAC,CACT,CASO,SAASE,GAAQnC,EAAgB,CAC/B,OAAA,OAAO,UAAU,SAAS,KAAKA,CAAK,EAAE,MAAM,EAAG,EAAE,CAC1D,CASgB,SAAAoC,GAAaC,EAAS,GAAI,CACxC,MAAMC,EAAQ,iEACRC,EAASD,EAAM,OAErB,IAAIE,EAAS,GAEb,KAAOH,KACKG,GAAAF,EAAM,OAAO,KAAK,MAAM,KAAK,SAAWC,CAAM,CAAC,EAGpD,OAAAC,CACT,CAUA,eAAsBC,GACpBC,EACAC,EASI,GACJ,CACA,GAAID,EAAW,QACb,SAAW,CAACE,EAAWC,CAAQ,IAAKH,EAClC,GAAI,OAAOE,GAAc,WAAaA,EAAA,EAAcA,EAC9C,OAAA,OAAOD,EAAQ,gBAAmB,YACpC,MAAMA,EAAQ,eAAe,EAG/B,MAAME,EAAS,EAEX,OAAOF,EAAQ,eAAkB,YACnC,MAAMA,EAAQ,cAAc,EAGvB,GAKN,MAAA,EACT,CC1ZA,eAAsBG,GAAeC,EAAc,CAC7C,GAAA,CAACrD,EAAiB,MAAA,GAElB,GAAA,CACI,aAAA,UAAU,UAAU,UAAUqD,CAAI,EAEjC,EAAA,MACD,CACN,IAAIC,EAAY,GAEV,MAAAC,EAAW,SAAS,cAAc,UAAU,EAC5CC,EAAc,SAAS,cAE7BD,EAAS,MAAQF,EAGRE,EAAA,aAAa,WAAY,EAAE,EAEpCA,EAAS,MAAM,QAAU,SACzBA,EAAS,MAAM,SAAW,WAC1BA,EAAS,MAAM,OAAS,IACxBA,EAAS,MAAM,SAAW,OAEpB,MAAAE,EAAY,SAAS,aAAa,EAClCC,EAAgBD,EAAYA,EAAU,WAAa,GAAKA,EAAU,WAAW,CAAC,EAAI,KAE/E,gBAAA,KAAK,YAAYF,CAAQ,EAClCA,EAAS,OAAO,EAGhBA,EAAS,eAAiB,EAC1BA,EAAS,aAAeF,EAAK,OAEjBC,EAAA,SAAS,YAAY,MAAM,EAC9B,SAAA,KAAK,YAAYC,CAAQ,EAE9BG,IACFD,EAAW,gBAAgB,EAC3BA,EAAW,SAASC,CAAa,GAI/BF,GACAA,EAA4B,MAAM,EAG/BF,CAAA,CAEX,CC4CA,MAAMK,GAAc,gBACdC,GAAa,uBAEbC,EAAc,MAAMD,EAAU,QAAQD,EAAW,IAEjDG,GAAc,cAAcD,CAAW,aAAaA,CAAW,aAAaA,CAAW,YACvFE,EAAc,cAAcF,CAAW,aAAaA,CAAW,aAAaA,CAAW,aAAaA,CAAW,YAMxGG,GAAU,IAAI,OAAO,MAAMF,EAAW,EAAE,EACxCG,GAAW,IAAI,OAAO,OAAOF,CAAW,EAAE,EAC1CG,GAAU,IAAI,OAAO,MAAMH,CAAW,EAAE,EACxCI,GAAW,IAAI,OAAO,OAAOJ,CAAW,EAAE,EAC1CK,GAAU,IAAI,OAAO,MAAML,CAAW,EAAE,EACxCM,GAAW,IAAI,OAAO,OAAON,CAAW,EAAE,EAE1CO,GAAY,uDACZC,GAAY,uEACZC,GAAY,uDACZC,GAAY,uEAEZC,EAAe,OAAO,OAAO,CACxC,UAAW,SACX,aAAc,SACd,KAAM,MACN,WAAY,SACZ,MAAO,SACP,MAAO,SACP,OAAQ,SACR,MAAO,MACP,eAAgB,SAChB,KAAM,MACN,WAAY,SACZ,MAAO,SACP,UAAW,SACX,YAAa,SACb,UAAW,SACX,WAAY,SACZ,UAAW,SACX,MAAO,SACP,eAAgB,SAChB,SAAU,SACV,QAAS,SACT,KAAM,MACN,SAAU,SACV,SAAU,SACV,cAAe,SACf,SAAU,SACV,UAAW,SACX,SAAU,SACV,UAAW,SACX,YAAa,SACb,eAAgB,SAChB,WAAY,SACZ,WAAY,SACZ,QAAS,SACT,WAAY,SACZ,aAAc,SACd,cAAe,SACf,cAAe,SACf,cAAe,SACf,cAAe,SACf,WAAY,SACZ,SAAU,SACV,YAAa,SACb,QAAS,SACT,QAAS,SACT,WAAY,SACZ,UAAW,SACX,YAAa,SACb,YAAa,SACb,QAAS,MACT,UAAW,SACX,WAAY,SACZ,KAAM,SACN,UAAW,SACX,KAAM,SACN,MAAO,SACP,YAAa,SACb,KAAM,SACN,SAAU,SACV,QAAS,SACT,UAAW,SACX,OAAQ,SACR,MAAO,SACP,MAAO,SACP,SAAU,SACV,cAAe,SACf,UAAW,SACX,aAAc,SACd,UAAW,SACX,WAAY,SACZ,UAAW,SACX,qBAAsB,SACtB,UAAW,SACX,WAAY,SACZ,UAAW,SACX,UAAW,SACX,YAAa,SACb,cAAe,SACf,aAAc,SACd,eAAgB,MAChB,eAAgB,MAChB,eAAgB,SAChB,YAAa,SACb,KAAM,MACN,UAAW,SACX,MAAO,SACP,QAAS,MACT,OAAQ,SACR,iBAAkB,SAClB,WAAY,SACZ,aAAc,SACd,aAAc,SACd,eAAgB,SAChB,gBAAiB,SACjB,kBAAmB,SACnB,gBAAiB,SACjB,gBAAiB,SACjB,aAAc,SACd,UAAW,SACX,UAAW,SACX,SAAU,SACV,YAAa,SACb,KAAM,SACN,QAAS,SACT,MAAO,SACP,UAAW,SACX,OAAQ,SACR,UAAW,SACX,OAAQ,SACR,cAAe,SACf,UAAW,SACX,cAAe,SACf,cAAe,SACf,WAAY,SACZ,UAAW,SACX,KAAM,SACN,KAAM,SACN,KAAM,SACN,WAAY,SACZ,OAAQ,SACR,cAAe,SACf,IAAK,MACL,UAAW,SACX,UAAW,SACX,YAAa,SACb,OAAQ,SACR,WAAY,SACZ,SAAU,SACV,SAAU,SACV,OAAQ,SACR,OAAQ,SACR,QAAS,SACT,UAAW,SACX,UAAW,SACX,UAAW,SACX,KAAM,SACN,YAAa,SACb,UAAW,SACX,IAAK,SACL,KAAM,SACN,QAAS,SACT,OAAQ,SACR,UAAW,SACX,OAAQ,SACR,MAAO,SACP,MAAO,MACP,WAAY,SACZ,OAAQ,MACR,YAAa,QACf,CAAC,EAIYC,GAAc,OAAO,OAAO,IAAI,IAAI,OAAO,KAAKD,CAAY,CAAC,CAAC,EAWpE,SAASE,GAAQtE,EAAwB,CAG9C,OAFAA,EAAQ,OAAOA,CAAK,EAAE,KAAA,EAAO,YAAY,EAEpCA,EAIDA,IAAU,eAAiBoE,EAAapE,CAAkB,EACrD,GAIPA,IAAU,eACVqE,GAAY,IAAIrE,CAAkB,GAClC0D,GAAQ,KAAK1D,CAAK,GAClB2D,GAAS,KAAK3D,CAAK,GACnB4D,GAAQ,KAAK5D,CAAK,GAClB6D,GAAS,KAAK7D,CAAK,GACnB8D,GAAQ,KAAK9D,CAAK,GAClB+D,GAAS,KAAK/D,CAAK,GACnBgE,GAAU,KAAKhE,CAAK,GACpBiE,GAAU,KAAKjE,CAAK,GACpBkE,GAAU,KAAKlE,CAAK,GACpBmE,GAAU,KAAKnE,CAAK,EAnBb,EAqBX,CASO,SAASuE,GAAiBC,EAAmC,CAGlE,GAFAA,EAAQA,EAAM,SAAW,EAAA,KAAA,EAAO,YAAY,EAExCA,IAAU,cACZ,MAAO,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,OAAQ,OAAQ,SAAUC,CAAY,EAGzE,IAAIC,EAAQ,GAERN,EAAaI,CAAkB,IACjCA,EAAQJ,EAAaI,CAAkB,EAC/BE,EAAA,IAGN,IAAAC,EAEJ,GAAKA,EAAQjB,GAAQ,KAAKc,CAAK,EAAI,CACjC,KAAM,CAAE,EAAG,EAAAI,EAAG,EAAAC,CAAA,EAAMC,EAAaH,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAEtD,MAAA,CACL,EAAG,EAAI,IACP,EAAGC,EAAI,IACP,EAAGC,EAAI,IACP,OAAQ,MACR,SAAUJ,CACZ,CAAA,CAGF,GAAKE,EAAQhB,GAAS,KAAKa,CAAK,EAAI,CAClC,KAAM,CAAE,EAAG,EAAAI,EAAG,EAAAC,CAAA,EAAMC,EAAaH,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAEtD,MAAA,CACL,EAAG,EAAI,IACP,EAAGC,EAAI,IACP,EAAGC,EAAI,IACP,EAAGE,EAAeJ,EAAM,CAAC,CAAC,EAC1B,OAAQ,OACR,SAAUF,CACZ,CAAA,CAGF,GAAKE,EAAQf,GAAQ,KAAKY,CAAK,EAAI,CACjC,KAAM,CAAE,EAAAQ,EAAG,EAAAC,EAAG,EAAAC,CAAA,EAAMC,EAAaR,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAEtD,MAAA,CAAE,EAAGK,EAAI,IAAK,EAAAC,EAAG,EAAAC,EAAG,OAAQ,MAAO,SAAUE,CAAY,CAAA,CAGlE,GAAKT,EAAQd,GAAS,KAAKW,CAAK,EAAI,CAClC,KAAM,CAAE,EAAAQ,EAAG,EAAAC,EAAG,EAAAC,CAAA,EAAMC,EAAaR,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAEtD,MAAA,CACL,EAAGK,EAAI,IACP,EAAAC,EACA,EAAAC,EACA,EAAGH,EAAeJ,EAAM,CAAC,CAAC,EAC1B,OAAQ,OACR,SAAUS,CACZ,CAAA,CAGF,GAAKT,EAAQb,GAAQ,KAAKU,CAAK,EAAI,CACjC,KAAM,CAAE,EAAAQ,EAAG,EAAAC,EAAG,EAAAI,CAAA,EAAMC,EAAaX,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAEtD,MAAA,CAAE,EAAGK,EAAI,IAAK,EAAAC,EAAG,EAAAI,EAAG,OAAQ,MAAO,SAAUE,CAAY,CAAA,CAGlE,GAAKZ,EAAQZ,GAAS,KAAKS,CAAK,EAAI,CAClC,KAAM,CAAE,EAAAQ,EAAG,EAAAC,EAAG,EAAAI,CAAA,EAAMC,EAAaX,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAEtD,MAAA,CACL,EAAGK,EAAI,IACP,EAAAC,EACA,EAAAI,EACA,EAAGN,EAAeJ,EAAM,CAAC,CAAC,EAC1B,OAAQ,OACR,SAAUY,CACZ,CAAA,CAGF,OAAKZ,EAAQX,GAAU,KAAKQ,CAAK,GACxB,CACL,EAAG,SAAS,GAAGG,EAAM,CAAC,CAAC,GAAGA,EAAM,CAAC,CAAC,GAAI,EAAE,EACxC,EAAG,SAAS,GAAGA,EAAM,CAAC,CAAC,GAAGA,EAAM,CAAC,CAAC,GAAI,EAAE,EACxC,EAAG,SAAS,GAAGA,EAAM,CAAC,CAAC,GAAGA,EAAM,CAAC,CAAC,GAAI,EAAE,EACxC,OAAQD,EAAQ,OAAS,OACzB,SAAUD,CACZ,GAGGE,EAAQV,GAAU,KAAKO,CAAK,GACxB,CACL,EAAG,SAAS,GAAGG,EAAM,CAAC,CAAC,GAAGA,EAAM,CAAC,CAAC,GAAI,EAAE,EACxC,EAAG,SAAS,GAAGA,EAAM,CAAC,CAAC,GAAGA,EAAM,CAAC,CAAC,GAAI,EAAE,EACxC,EAAG,SAAS,GAAGA,EAAM,CAAC,CAAC,GAAGA,EAAM,CAAC,CAAC,GAAI,EAAE,EACxC,EAAGa,GAAoB,GAAGb,EAAM,CAAC,CAAC,GAAGA,EAAM,CAAC,CAAC,EAAE,EAC/C,OAAQD,EAAQ,OAAS,OACzB,SAAUD,CACZ,GAGGE,EAAQT,GAAU,KAAKM,CAAK,GACxB,CACL,EAAG,SAASG,EAAM,CAAC,EAAG,EAAE,EACxB,EAAG,SAASA,EAAM,CAAC,EAAG,EAAE,EACxB,EAAG,SAASA,EAAM,CAAC,EAAG,EAAE,EACxB,OAAQD,EAAQ,OAAS,OACzB,SAAUD,CACZ,GAGGE,EAAQR,GAAU,KAAKK,CAAK,GACxB,CACL,EAAG,SAASG,EAAM,CAAC,EAAG,EAAE,EACxB,EAAG,SAASA,EAAM,CAAC,EAAG,EAAE,EACxB,EAAG,SAASA,EAAM,CAAC,EAAG,EAAE,EACxB,EAAGa,GAAoBb,EAAM,CAAC,CAAC,EAC/B,OAAQD,EAAQ,OAAS,OACzB,SAAUD,CACZ,EAGK,IACT,CASO,SAASgB,GAAWjB,EAAyB,CAClD,KAAM,CAAE,EAAAkB,EAAG,GAAGC,CAAI,EAAIC,EAAiBpB,CAAK,EAE5C,OAAOmB,EAAI,OAEX,MAAME,EAAMC,GAASH,EAAI,EAAGA,EAAI,EAAGA,EAAI,CAAC,EAClCI,EAAMC,GAASL,EAAI,EAAGA,EAAI,EAAGA,EAAI,CAAC,EAClCM,EAAMC,EAASP,EAAI,EAAGA,EAAI,EAAGA,EAAI,CAAC,EAElCQ,EAAOC,EAAUT,EAAI,EAAGA,EAAI,EAAGA,EAAI,EAAGD,CAAC,EAEtC,MAAA,CACL,IAAAC,EACA,IAAAE,EACA,IAAAE,EACA,IAAAE,EACA,MAAOP,EACP,KAAM,CAAE,GAAGC,EAAK,EAAAD,EAAG,OAAQ,MAAO,EAClC,KAAM,CAAE,GAAGG,EAAK,EAAAH,EAAG,OAAQ,MAAO,EAClC,KAAM,CAAE,GAAGK,EAAK,EAAAL,EAAG,OAAQ,MAAO,EAClC,KAAAS,EACA,KAAME,GAAeV,CAAG,EACxB,OAAQnB,CACV,CACF,CASO,SAASoB,EAAiBU,EAA+B,CAC9D,IAAIX,EAAgB,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EACnCD,EAAI,EACJlB,EAEA,OAAA,OAAO8B,GAAgB,SACzB9B,EAAQD,GAAiB+B,CAAW,EAE5B9B,EAAA8B,EAGN9B,IAAU,MAAQ,OAAOA,GAAU,WACjC,MAAOA,EACTmB,EAAMY,GAAS/B,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAC,EAC/B,MAAOA,IAChBmB,EAAMa,GAAShC,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAC,GAGtC,MAAOA,IACLkB,EAAAX,EAAeP,EAAM,GAAK,CAAC,EAE3B,OAAO,MAAMkB,CAAC,IACZA,EAAA,IAIFC,EAAAnB,GAGD,CAAE,GAAGmB,EAAK,EAAAD,EAAG,OAAQ,OAAQ,SAAUjB,CAAY,CAC5D,CAWgB,SAAAU,EAAaH,EAAoBC,EAAoBC,EAAoB,CAChF,MAAA,CACL,EAAGuB,EAAWzB,EAAG,EAAG,GAAG,EAAI,IAC3B,EAAGyB,EAAWC,EAAazB,CAAC,EAAI0B,EAAgB1B,CAAC,EAAIA,EAAG,EAAG,CAAC,EAC5D,EAAGwB,EAAWC,EAAaxB,CAAC,EAAIyB,EAAgBzB,CAAC,EAAIA,EAAG,EAAG,CAAC,CAC9D,CACF,CAWgB,SAAAJ,EAAa8B,EAAoBhC,EAAoBC,EAAoB,CAChF,MAAA,CACL,EAAG4B,EAAWG,EAAG,EAAG,GAAG,EAAI,IAC3B,EAAGH,EAAW7B,EAAG,EAAG,GAAG,EAAI,IAC3B,EAAG6B,EAAW5B,EAAG,EAAG,GAAG,EAAI,GAC7B,CACF,CAWgB,SAAAS,EAAaN,EAAoBC,EAAoBI,EAAoB,CAChF,MAAA,CACL,EAAGoB,EAAWzB,EAAG,EAAG,GAAG,EAAI,IAC3B,EAAGyB,EAAWC,EAAazB,CAAC,EAAI0B,EAAgB1B,CAAC,EAAIA,EAAG,EAAG,CAAC,EAC5D,EAAGwB,EAAWC,EAAarB,CAAC,EAAIsB,EAAgBtB,CAAC,EAAIA,EAAG,EAAG,CAAC,CAC9D,CACF,CASO,SAASN,EAAeW,EAAoB,CAC1C,OAAAe,EAAWC,EAAahB,CAAC,EAAIiB,EAAgBjB,CAAC,EAAIA,EAAG,EAAG,CAAC,CAClE,CAWgB,SAAAa,GAASvB,EAAoBC,EAAoBC,EAA8B,CAC7F,IAAI,EAAGN,EAAGC,EAGV,GAFE,CAAE,EAAAG,EAAG,EAAAC,EAAG,EAAAC,CAAA,EAAMC,EAAaH,EAAGC,EAAGC,CAAC,EAEhCD,IAAM,EACR,EAAIL,EAAIC,EAAIK,MACP,CACC,MAAA2B,EAAI3B,EAAI,GAAM,GAAK,EAAID,GAAKC,EAAID,EAAIC,EAAID,EACxC6B,EAAI,EAAI5B,EAAI2B,EAElB,EAAIE,GAASD,EAAGD,EAAG7B,EAAI,EAAI,CAAC,EACxBJ,EAAAmC,GAASD,EAAGD,EAAG7B,CAAC,EACpBH,EAAIkC,GAASD,EAAGD,EAAG7B,EAAI,EAAI,CAAC,CAAA,CAGzB,UAAA,IACAJ,GAAA,IACAC,GAAA,IAEE,CAAE,EAAG,EAAAD,EAAG,EAAAC,EAAG,SAAUJ,CAAY,CAC1C,CAWgB,SAAAqB,GAASc,EAAoBhC,EAAoBC,EAA8B,EAC3F,CAAE,EAAA+B,EAAG,EAAAhC,EAAG,EAAAC,CAAA,EAAMC,EAAa8B,EAAGhC,EAAGC,CAAC,GAEpC,MAAMmC,EAAM,KAAK,IAAIJ,EAAGhC,EAAGC,CAAC,EACtBoC,EAAM,KAAK,IAAIL,EAAGhC,EAAGC,CAAC,EAC5B,IAAIG,EAAG,EAED,MAAAE,GAAK8B,EAAMC,GAAO,EAExB,GAAID,IAAQC,EACVjC,EAAI,EAAI,MACH,CACL,MAAMkC,EAAIF,EAAMC,EAIhB,OAFA,EAAI/B,EAAI,GAAMgC,GAAK,EAAIF,EAAMC,GAAOC,GAAKF,EAAMC,GAEvCD,EAAK,CACX,KAAKJ,EAAG,CACN5B,GAAKJ,EAAIC,GAAKqC,GAAKtC,EAAIC,EAAI,EAAI,GAC/B,KAAA,CAEF,KAAKD,EAAG,CACDI,GAAAH,EAAI+B,GAAKM,EAAI,EAClB,KAAA,CAEF,KAAKrC,EAAG,CACDG,GAAA4B,EAAIhC,GAAKsC,EAAI,EAClB,KAAA,CAEF,QACMlC,EAAA,CACN,CAGGA,GAAA,EAAA,CAGP,MAAO,CAAE,EAAAA,EAAG,EAAG,EAAAE,EAAG,SAAUE,CAAY,CAC1C,CAWgB,SAAA+B,GAASnC,EAAoBC,EAAoBC,EAA8B,EAC3F,CAAE,EAAAF,EAAG,EAAAC,EAAG,EAAAC,CAAA,EAAMC,EAAaH,EAAGC,EAAGC,CAAC,GAE9B,MAAAG,EAAI,IAAO,EAAIH,EAAID,GAAK,EAAI,KAAK,IAAI,EAAIC,EAAI,CAAC,IAE/C,OAAAD,EAAA,GAAKI,EAAIH,GAAMG,EAEb,CAAE,EAAGL,EAAI,IAAK,EAAAC,EAAG,EAAAI,EAAG,SAAUE,CAAY,CACnD,CAWgB,SAAA6B,GAASpC,EAAoBC,EAAoBI,EAA8B,EAC3F,CAAE,EAAAL,EAAG,EAAAC,EAAG,EAAAI,CAAA,EAAMC,EAAaN,EAAGC,EAAGI,CAAC,GAE9B,MAAAH,EAAI,GAAMG,GAAK,EAAIJ,GAEzB,OAAAA,EAAKI,EAAIJ,GAAM,EAAI,KAAK,IAAI,EAAIC,EAAI,CAAC,GAE9B,CAAE,EAAGF,EAAI,IAAK,EAAAC,EAAG,EAAAC,EAAG,SAAUE,CAAY,CACnD,CAWgB,SAAAoB,GAASxB,EAAoBC,EAAoBI,EAA8B,EAC3F,CAAE,EAAAL,EAAG,EAAAC,EAAG,EAAAI,CAAA,EAAMC,EAAaN,EAAGC,EAAGI,CAAC,GAE/BL,GAAA,EAEC,MAAA9C,EAAI,KAAK,MAAM8C,CAAC,EAChBqC,EAAIrC,EAAI9C,EACR4E,EAAIzB,GAAK,EAAIJ,GACb4B,EAAIxB,GAAK,EAAIgC,EAAIpC,GACjBqC,EAAIjC,GAAK,GAAK,EAAIgC,GAAKpC,GACvBsC,EAAMrF,EAAI,EAEZ,IAAA0E,EAAI,CAACvB,EAAGwB,EAAGC,EAAGA,EAAGQ,EAAGjC,CAAC,EAAEkC,CAAG,EAC1B3C,EAAI,CAAC0C,EAAGjC,EAAGA,EAAGwB,EAAGC,EAAGA,CAAC,EAAES,CAAG,EAC1B1C,EAAI,CAACiC,EAAGA,EAAGQ,EAAGjC,EAAGA,EAAGwB,CAAC,EAAEU,CAAG,EAEzB,OAAAX,GAAA,IACAhC,GAAA,IACAC,GAAA,IAEE,CAAE,EAAA+B,EAAG,EAAAhC,EAAG,EAAAC,EAAG,SAAUJ,CAAY,CAC1C,CAWgB,SAAAuB,GAASY,EAAoBhC,EAAoBC,EAA8B,EAC3F,CAAE,EAAA+B,EAAG,EAAAhC,EAAG,EAAAC,CAAA,EAAMC,EAAa8B,EAAGhC,EAAGC,CAAC,GAEpC,MAAMmC,EAAM,KAAK,IAAIJ,EAAGhC,EAAGC,CAAC,EACtBoC,EAAM,KAAK,IAAIL,EAAGhC,EAAGC,CAAC,EAExB,IAAAG,EAEJ,MAAMK,EAAI2B,EACJE,EAAIF,EAAMC,EACVhC,EAAI+B,IAAQ,EAAI,EAAIE,EAAIF,EAE9B,GAAIA,IAAQC,EACNjC,EAAA,MACC,CACL,OAAQgC,EAAK,CACX,KAAKJ,EAAG,CACN5B,GAAKJ,EAAIC,GAAKqC,GAAKtC,EAAIC,EAAI,EAAI,GAC/B,KAAA,CAEF,KAAKD,EAAG,CACDI,GAAAH,EAAI+B,GAAKM,EAAI,EAClB,KAAA,CAEF,KAAKrC,EAAG,CACDG,GAAA4B,EAAIhC,GAAKsC,EAAI,EAClB,KAAA,CAEF,QACMlC,EAAA,CACN,CAGGA,GAAA,EAAA,CAGP,MAAO,CAAE,EAAAA,EAAG,EAAAC,EAAG,EAAAI,EAAG,SAAUE,CAAY,CAC1C,CAYO,SAASW,EACdU,EACAhC,EACAC,EACA2C,EAAa,GACb,EACE,CAAE,EAAAZ,EAAG,EAAAhC,EAAG,EAAAC,CAAA,EAAMC,EAAa8B,EAAGhC,EAAGC,CAAC,GAEpC,MAAMoB,EAAM,CACVwB,EAAa,KAAK,MAAMb,EAAI,GAAG,EAAE,SAAS,EAAE,CAAC,EAC7Ca,EAAa,KAAK,MAAM7C,EAAI,GAAG,EAAE,SAAS,EAAE,CAAC,EAC7C6C,EAAa,KAAK,MAAM5C,EAAI,GAAG,EAAE,SAAS,EAAE,CAAC,CAC/C,EAEA,OAAI2C,GAAcE,EAAazB,EAAI,CAAC,CAAC,GAAKyB,EAAazB,EAAI,CAAC,CAAC,GAAKyB,EAAazB,EAAI,CAAC,CAAC,EAC5EA,EAAI,CAAC,EAAE,OAAO,CAAC,EAAIA,EAAI,CAAC,EAAE,OAAO,CAAC,EAAIA,EAAI,CAAC,EAAE,OAAO,CAAC,EAGvD,IAAMA,EAAI,KAAK,EAAE,CAC1B,CAaO,SAASG,EACdQ,EACAhC,EACAC,EACAa,EACAiC,EAAa,GACb,EACE,CAAE,EAAAf,EAAG,EAAAhC,EAAG,EAAAC,CAAA,EAAMC,EAAa8B,EAAGhC,EAAGC,CAAC,GAEpC,MAAMoB,EAAM,CACVwB,EAAa,KAAK,MAAMb,EAAI,GAAG,EAAE,SAAS,EAAE,CAAC,EAC7Ca,EAAa,KAAK,MAAM7C,EAAI,GAAG,EAAE,SAAS,EAAE,CAAC,EAC7C6C,EAAa,KAAK,MAAM5C,EAAI,GAAG,EAAE,SAAS,EAAE,CAAC,EAC7C4C,EAAaG,GAAoB7C,EAAeW,CAAC,CAAC,CAAC,CACrD,EAGE,OAAAiC,GACAD,EAAazB,EAAI,CAAC,CAAC,GACnByB,EAAazB,EAAI,CAAC,CAAC,GACnByB,EAAazB,EAAI,CAAC,CAAC,GACnByB,EAAazB,EAAI,CAAC,CAAC,EAEZA,EAAI,CAAC,EAAE,OAAO,CAAC,EAAIA,EAAI,CAAC,EAAE,OAAO,CAAC,EAAIA,EAAI,CAAC,EAAE,OAAO,CAAC,EAAIA,EAAI,CAAC,EAAE,OAAO,CAAC,EAG1E,IAAMA,EAAI,KAAK,EAAE,CAC1B,CAWO,SAAS4B,GAASC,EAAeC,EAAeC,EAAS,GAAgB,CAC9E,GAAI,CAACF,GAAU,CAACC,EAAe,MAAA,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EACxD,GAAI,CAACD,EAAe,OAAAlC,EAAiBmC,CAAM,EAC3C,GAAI,CAACA,EAAe,OAAAnC,EAAiBkC,CAAM,EAErC,MAAAG,EAAQrC,EAAiBkC,CAAM,EAC/BI,EAAQtC,EAAiBmC,CAAM,EAE/BI,EAAiB1B,EAAWuB,EAAQ,EAAG,CAAC,EACxCI,EAAmBD,EAAiB,EAAI,EAExCE,EAAgBJ,EAAM,EAAIC,EAAM,EAKhCI,IAHJF,EAAmBC,IAAkB,GACjCD,GACCA,EAAmBC,IAAkB,EAAID,EAAmBC,IACtC,GAAK,EAC5BE,EAAU,EAAID,EAEb,MAAA,CACL,EAAG,KAAK,MAAML,EAAM,EAAIK,EAAUJ,EAAM,EAAIK,CAAO,EACnD,EAAG,KAAK,MAAMN,EAAM,EAAIK,EAAUJ,EAAM,EAAIK,CAAO,EACnD,EAAG,KAAK,MAAMN,EAAM,EAAIK,EAAUJ,EAAM,EAAIK,CAAO,EACnD,EAAG,KAAK,MAAMN,EAAM,EAAIE,EAAiBD,EAAM,GAAK,EAAIC,EAAe,EACvE,OAAQ,OACR,SAAU1D,CACZ,CACF,CAUgB,SAAA+D,GAAYhE,EAAciE,EAAwB,CAC1D,MAAAC,EAAO9C,EAAiBpB,CAAK,EAE9B,OAAAkE,EAAA,EAAI3D,EAAe0D,CAAK,EAEtBC,CACT,CAUO,SAASC,GAAYC,EAAY,GAAO3I,EAAkB,MAAO,CACtE,MAAM2G,EAAI,KAAK,MAAM,KAAK,SAAW,GAAG,EAClChC,EAAI,KAAK,MAAM,KAAK,SAAW,GAAG,EAClCC,EAAI,KAAK,MAAM,KAAK,SAAW,GAAG,EAExC,GAAI5E,IAAS,MACX,OAAO2I,EAAYxC,EAAUQ,EAAGhC,EAAGC,EAAG,KAAK,OAAO,CAAC,EAAIqB,EAASU,EAAGhC,EAAGC,CAAC,EAGrE,IAAAL,EAEJ,OAAIvE,IAAS,MACHuE,EAAAsB,GAASc,EAAGhC,EAAGC,CAAC,EACf5E,IAAS,MACVuE,EAAAwB,GAASY,EAAGhC,EAAGC,CAAC,EAEhBL,EAAA,OAAO,OAAO,CAAE,EAAAoC,EAAG,EAAAhC,EAAG,EAAAC,EAAG,SAAUJ,EAAa,EAGtDmE,IACApE,EAAoB,EAAI,KAAK,OAAO,GAGjCA,EAAM,SAAS,CACxB,CAWO,SAASqE,GACdC,EACAF,EAAY,GACZ3I,EAAkB,MAClB,CACA,MAAM+E,EAAI,KAAK,MAAM,KAAK,SAAW,GAAG,EAClCC,EAAI,KAAK,MAAM6D,IAAW,OAAS,GAAK,KAAK,OAAO,EAAI,GAAK,GAAK,KAAK,OAAO,EAAI,EAAE,EAAI,IACxF5D,EAAI,KAAK,MAAM4D,IAAW,OAAS,GAAK,KAAK,OAAO,EAAI,GAAK,GAAK,KAAK,OAAO,EAAI,EAAE,EAAI,IAE9F,GAAI7I,IAAS,MACX,OAAOmF,EAAY,KAAK,CAAE,EAAAJ,EAAG,EAAAC,EAAG,EAAAC,CAAA,CAAG,EAAE,EAGnC,IAAAV,EAEA,GAAAvE,IAAS,OAASA,IAAS,OAG7B,GAFQuE,EAAA+B,GAASvB,EAAGC,EAAGC,CAAC,EAEpBjF,IAAS,MAAO,CAClB,KAAM,CAAE,EAAA2G,EAAG,EAAAhC,EAAG,EAAAC,CAAM,EAAAL,EAEpB,OAAOoE,EAAYxC,EAAUQ,EAAGhC,EAAGC,EAAG,KAAK,OAAO,CAAC,EAAIqB,EAASU,EAAGhC,EAAGC,CAAC,CAAA,OAEhE5E,IAAS,QACVuE,EAAA2C,GAASnC,EAAGC,EAAGC,CAAC,GAG1B,OAAI0D,IACApE,EAAoB,EAAI,KAAK,OAAO,GAGjCA,EAAM,SAAS,CACxB,CAUO,SAASuE,GAAgBH,EAAY,GAAO3I,EAAkB,MAAO,CACnE,OAAA4I,GAAkB,OAAQD,EAAW3I,CAAI,CAClD,CAUO,SAAS+I,GAAgBJ,EAAY,GAAO3I,EAAkB,MAAO,CACnE,OAAA4I,GAAkB,OAAQD,EAAW3I,CAAI,CAClD,CASO,SAASgJ,GAAYzE,EAAe,CAClC,OAAA6B,GAAeT,EAAiBpB,CAAK,CAAC,CAC/C,CAEA,SAASiD,EAAayB,EAAa,CACjC,OAAOA,EAAI,SAAW,EAAI,IAAIA,CAAG,GAAKA,EAAI,SAAS,CACrD,CAEA,SAASxB,EAAalF,EAAyB,CAC7C,OAAOA,EAAO,OAAO,CAAC,IAAMA,EAAO,OAAO,CAAC,CAC7C,CAMA,SAASoF,GAAoBuB,EAAiC,CACrD,OAAA,KAAK,MAAM,WAAWA,CAAgB,EAAI,GAAG,EAAE,SAAS,EAAE,CACnE,CAEA,SAAS3D,GAAoBS,EAAqB,CACzC,OAAA,SAASA,EAAK,EAAE,EAAI,GAC7B,CAEA,SAASQ,EAAW0C,EAAyBlC,EAAaD,EAAqB,CACtE,OAAA,KAAK,IAAIC,EAAK,KAAK,IAAID,EAAK,WAAWmC,CAAgB,CAAC,CAAC,CAClE,CAEA,SAASpC,GAASD,EAAWD,EAAWS,EAAmB,CAGzD,OAFIA,EAAI,IAAQA,GAAA,GACZA,EAAI,IAAQA,GAAA,GACZA,EAAI,EAAI,EAAUR,GAAKD,EAAIC,GAAK,EAAIQ,EACpCA,EAAI,EAAI,EAAUT,EAClBS,EAAI,EAAI,EAAUR,GAAKD,EAAIC,IAAM,EAAI,EAAIQ,GAAK,EAE3CR,CACT,CAEA,SAASJ,EAAa0C,EAAmC,CACvD,OAAO,OAAOA,CAAO,EAAE,KAAK,EAAE,SAAS,GAAG,CAC5C,CAEA,SAASzC,EAAgByC,EAAkC,CACnD,MAAAD,EAAS,WAAWC,CAAiB,EAAI,IAE/C,OAAO,OAAO,MAAMD,CAAM,EAAI,EAAIA,CACpC,CAEA,SAAS1E,GAAuB,CAC1B,OAAArE,EAAU,KAAK,CAAC,GAAK,KAAK,GAAK,GAAK,KAAK,EAAI,EACxC,QAAQ,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,IAGjD,OAAO,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,CAAC,GAC5C,CAEA,SAASgF,GAAuB,CAC9B,MAAMH,EAAI,GAAG,KAAK,EAAI,GAAG,IACnBC,EAAI,GAAG,KAAK,EAAI,GAAG,IAErB,OAAA9E,EAAU,KAAK,CAAC,GAAK,KAAK,GAAK,GAAK,KAAK,EAAI,EACxC,QAAQ,KAAK,CAAC,KAAK6E,CAAC,KAAKC,CAAC,KAAK,KAAK,CAAC,IAGvC,OAAO,KAAK,CAAC,KAAKD,CAAC,KAAKC,CAAC,GAClC,CAEA,SAASK,GAAuB,CAC9B,MAAMN,EAAI,GAAG,KAAK,EAAI,GAAG,IACnBI,EAAI,GAAG,KAAK,EAAI,GAAG,IAErB,OAAAjF,EAAU,KAAK,CAAC,GAAK,KAAK,GAAK,GAAK,KAAK,EAAI,EACxC,QAAQ,KAAK,CAAC,KAAK6E,CAAC,KAAKI,CAAC,KAAK,KAAK,CAAC,IAGvC,OAAO,KAAK,CAAC,KAAKJ,CAAC,KAAKI,CAAC,GAClC,CAEA,SAASgB,GAAeV,EAAU,CACxB,OAAAA,EAAI,EAAI,MAASA,EAAI,EAAI,MAASA,EAAI,EAAI,OAAU,GAC9D,CCrkCA,IAAI0D,GAAc,EAEX,SAASC,IAAiB,CACxB,OAAAD,IACT,CAEO,SAASE,GAAeC,EAAe,CAC9BH,GAAA,KAAK,MAAMG,CAAK,CAChC,CAEgB,SAAAC,GAAcD,EAAQ,EAAG,CAChC,MAAA,CACL,SAAU,IAAMA,IAChB,SAAWE,GAAqB,CACtBF,EAAAE,CAAA,CAEZ,CACF,CCkBA,SAASC,GAAOC,EAAa,CAC3B,OAAOA,EAAM,CAACA,CAChB,CAYgB,SAAAC,GAAaxH,EAAgB4E,EAAM,EAAW,CAC5D,MAAM6C,EAAiB,IAAI,MAAMzH,EAAS,CAAC,EAAE,KAAK,CAAC,EAE1C,SAAA0H,EAAIC,EAAeC,EAAe,CACrC,GAAA,GAACA,GAASD,GAAS3H,GAIvB,IAFS2H,GAAA,EAEFA,GAAS3H,GACdyH,EAAKE,CAAK,GAAKC,EACfD,GAASL,GAAOK,CAAK,CACvB,CAGO,SAAAE,EAAIF,EAAQ3H,EAAQ,CACvB,GAAA2H,GAAS,EAAU,MAAA,GACnBA,EAAQ3H,IAAgB2H,EAAA3H,GAE5B,IAAI6H,EAAMF,EAAQ/C,EAElB,KAAO+C,EAAQ,GACbE,GAAOJ,EAAKE,CAAK,EACjBA,GAASL,GAAOK,CAAK,EAGhBE,OAAAA,CAAA,CAGT,SAASC,EAAIH,EAAe,CAC1B,OAAOE,EAAIF,EAAQ,CAAC,EAAIE,EAAIF,CAAK,CAAA,CAGnC,SAASI,EAAWC,EAAgB,CAClC,IAAIC,EAAO,EACPC,EAAQlI,EAEZ,KAAOkI,EAAQD,GAAM,CACnB,MAAME,EAAS,KAAK,OAAOF,EAAOC,GAAS,CAAC,EACtCE,EAAQP,EAAIM,CAAM,EAExB,GAAIC,EAAQJ,EAAQ,CACVE,EAAAC,EACR,QAAA,SACSC,EAAQJ,EAAQ,CACzB,GAAIC,IAASE,EACX,OAAON,EAAII,EAAO,CAAC,GAAKD,EAASC,EAAO,EAAIA,EAGvCA,EAAAE,CAAA,KAEA,QAAAA,CACT,CAGK,OAAAF,CAAA,CAGT,MAAO,CAAE,KAAAR,EAAM,IAAAC,EAAK,IAAAG,EAAK,IAAAC,EAAK,WAAAC,CAAW,CAC3C,CCzGO,MAAMM,GAAW,0CAYR,SAAAC,GAAc3K,EAAgB4K,EAAS,GAAO,CACxD,OAAA,OAAO5K,GAAU,SACZ,CAAC,OAAO,MAAMA,CAAK,EAGxB4K,EACKF,GAAS,KAAK,OAAO1K,CAAK,CAAC,EAG7B,CAAC,OAAO,MAAM,WAAWA,CAAe,CAAC,GAAK,CAAC,OAAO,MAAM,OAAOA,CAAK,CAAC,CAClF,CASO,SAAS6K,GAAS7K,EAAgB,CACnC,IAAAmJ,EAAS,WAAWnJ,CAAe,EAEnC,OAAA,OAAO,MAAMmJ,CAAM,IACrBA,EAAS,OAAOnJ,CAAK,GAGhB,OAAO,MAAMmJ,CAAM,EAAI,EAAIA,CACpC,CAUgB,SAAA2B,GAAc3B,EAAgB9G,EAAgB,CAC5D,OAAIA,GAAU,EACL8G,EAAO,SAAS,EAGlB,GAAGA,EAAS,EAAI,IAAM,EAAE,GAAG,OAAO,KAAK,IAAI,KAAK,MAAMA,CAAM,CAAC,CAAC,EAAE,SAAS9G,EAAQ,GAAG,CAAC,EAC9F,CASO,SAAS0I,EAAa5B,EAAgB,CACpC,OAAA2B,GAAc3B,EAAQ,CAAC,CAChC,CASO,SAAS6B,EAAc7B,EAAyB,CAErD,MAAM8B,EAAS9B,EAAO,SAAS,EAAE,MAAM,MAAM,EACvC+B,GAAOD,EAAO,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,GAAK,IAAI,OAAS,EAAEA,EAAO,CAAC,GAAK,GAE7D,OAAAC,EAAM,EAAIA,EAAM,CACzB,CAQO,SAASC,GAAYhC,EAAyB,CACnD,OAAO6B,EAAc7B,CAAM,CAC7B,CAWO,SAASiC,GAAcjC,EAAyBkC,EAAU,EAAGC,EAAY,IAAK,CAKnF,GAJI,OAAOnC,GAAW,WACpBA,EAAS,WAAWA,CAAM,GAGxB,OAAO,MAAMA,CAAM,EAAU,MAAA,IAE7B,GAAA,CAACoC,EAASC,CAAO,EAAI,OAAOrC,CAAM,EAAE,MAAM,GAAG,EAEjD,MAAMsC,EAAe,IAAI,OAAO,cAAcJ,CAAO,IAAI,EAElD,KAAAI,EAAa,KAAKF,CAAO,GAC9BA,EAAUA,EAAQ,QAAQE,EAAc,KAAKH,CAAS,IAAI,EAGlD,OAAAE,EAAAA,EAAU,IAAIA,CAAO,GAAK,GAE7B,GAAGD,CAAO,GAAGC,CAAO,EAC7B,CAUgB,SAAAE,GAAQvC,EAAgBqC,EAAiB,CACvDA,EAAU,KAAK,IAAI,KAAK,MAAMA,CAAO,EAAG,CAAC,EAEzC,IAAIG,EAAOxC,EAAO,QAAQ6B,EAAc7B,CAAM,CAAC,EAEzC,MAAAyC,EAAWD,EAAK,QAAQ,GAAG,EAE7B,GAAAC,IAAa,GAAW,OAAAzC,EAE5B,MAAM0C,EAAOF,EAAK,QAAQ,IAAK,EAAE,EAAE,MAAM,EAAE,EACrCG,EAAYF,EAAWJ,EAGzB,OAFUK,EAAKC,CAAS,GAIxBH,EAAK,OAAOG,EAAY,CAAC,IAAM,IACjCH,EAAOA,EAAK,UAAU,EAAGG,EAAY,CAAC,EAAI,IAE1CH,EAAOA,EAAK,UAAU,EAAGG,EAAY,CAAC,EAGjC,WAAW,OAAOH,CAAI,EAAE,QAAQH,CAAO,CAAC,GAR5BrC,CASrB,CAWgB,SAAA4C,GAAc5C,EAAgB6C,EAAkBR,EAAiB,CACxE,OAAAE,GAAQvC,EAAS6C,EAAUR,CAAO,CAC3C,CAUgB,SAAAS,GAAM9C,EAAgB+C,EAAuB,CACvD,GAAAA,EAAgB,GAAKA,EAAgB,EAChC,OAAA,KAAK,MAAM/C,CAAM,EAGpB,MAAAgD,EAAY,KAAK,KAAKhD,CAAM,EAE9B,OAAAA,EAAS,EAAI+C,GAAiBC,EACzBA,EAEA,KAAK,MAAMhD,CAAM,CAE5B,CAWgB,SAAA1C,GAAW0C,EAAyBlC,EAAaD,EAAa,CACrE,OAAA,KAAK,IAAIC,EAAK,KAAK,IAAID,EAAK,WAAWmC,CAAgB,CAAC,CAAC,CAClE,CAWO,SAASiD,GAAYjD,EAAgBkD,EAAkBC,EAAQ,EAAG,CACvE,GAAInD,GAAU,GAAKkD,GAAY,EAAG,MAAO,CAAClD,CAAM,EAE5CmD,EAAQ,IACFA,EAAA,KAGV,MAAMC,EAAuB,CAAC,EAC9B,IAAI/C,EAAQ,EAEL,KAAAL,GAAUkD,GAAY7C,EAAQ8C,GACxBC,EAAA,KAAKpD,EAASkD,CAAQ,EACxBlD,EAAA,KAAK,MAAMA,EAASkD,CAAQ,EACnC,EAAA7C,EAGJ,OAAA+C,EAAW,KAAKpD,CAAM,EAEfoD,EAAW,QAAQ,CAC5B,CAEA,MAAMC,GAAkB,CAAC,KAAM,KAAM,KAAM,IAAI,EASxC,SAASC,GAAczM,EAAe,CAG3C,GAFQA,EAAA,KAAK,MAAMA,CAAK,EAEpBA,GAAS,EAAU,MAAA,GAAGA,CAAK,KAE/B,MAAM0M,EACJ1M,EAAQ,IAAM,IAAMA,EAAQ,IAAM,GAC9BwM,GAAgB,CAAC,EACjBA,GAAgBxM,EAAQ,EAAE,GAAKwM,GAAgB,CAAC,EAE/C,MAAA,GAAGxM,CAAK,GAAG0M,CAAM,EAC1B,CAKA,MAAMC,GAAsB,OAAO,OAAO,CACxC,IACA,KACA,KACA,KACA,KACA,MACF,CAAkC,EAqB3B,SAASC,GACdC,EACAC,EAAyB,OACzBC,EAA6B,GAC7BC,EACA,CACI,OAAOA,EAAc,MACnB,OAAOD,GAAa,UACVC,EAAAD,EACDA,EAAA,IAECC,EAAA,GAIZ,IAAAC,EAAYH,EAAK,YAAY,EACjCG,EAAYN,GAAoB,SAASM,CAAS,EAAIA,EAAY,OAE9D,IAAAC,EACJ,OAAQD,EAAW,CACjB,IAAK,OACKC,EAAA,EACR,MACF,IAAK,KACKA,EAAA,EACR,MACF,IAAK,KACKA,EAAA,EACR,MACF,IAAK,KACKA,EAAA,EACR,MACF,IAAK,KACKA,EAAA,EACR,MACF,QACS,OAAAL,CAAA,CAGP,IAAAM,EAEJ,GAAKD,EAMHC,EAAaN,EAAO,MAAQK,MAL5B,KAAKC,EAAaN,EAAMM,EAAa,MAC/B,EAAAD,EAAQ,GAD6B,EAAEA,EAE3CC,EAAaA,EAAa,KAMjB,OAAAA,EAAAzB,GAAQyB,EAAYH,CAAS,EAEnCD,EACH,GAAGI,CAAU,GAAGF,IAAc,OAASN,GAAoB,KAAK,IAAIO,EAAO,CAAC,CAAC,EAAID,CAAS,GAC1FE,CACN,CAUgB,SAAAC,GAAOpG,EAAaC,EAAM,EAAG,CACvC,OAAAA,IAAQD,EAAYC,GAEpBA,EAAMD,IACP,CAACC,EAAKD,CAAG,EAAI,CAACA,EAAKC,CAAG,GAGlB,KAAK,OAAA,GAAYD,EAAMC,GAAOA,EACvC,CAegB,SAAAoG,GAAYlE,EAAyB6D,EAAY,GAAI,CACnE,MAAO,CAAC,WAAW,OAAO7D,CAAM,EAAE,YAAY6D,CAAS,CAAC,CAC1D,CAEA,SAASM,EAAYnE,EAAyB,CACtC,MAAAwC,EAAO,OAAOxC,CAAM,EAE1B,GAAI,CAACwC,EAAK,SAAS,GAAG,EACpB,OAAO,OAAOA,EAAK,QAAQ,IAAK,EAAE,CAAC,EAG/B,MAAA4B,EAAUvC,EAAc7B,CAAM,EAE7B,OAAAoE,EAAU,EAAIF,GAAY,OAAOlE,CAAM,EAAI,IAAMoE,CAAO,EAAI,OAAOpE,CAAM,CAClF,CAOA,SAASqE,EAAgBC,EAAiE,CACxF,MAAO,IAAIC,IAAiC,CACtC,IAAAC,EAASD,EAAQ,CAAC,EAEb,QAAAxL,EAAI,EAAGgJ,EAAMwC,EAAQ,OAAQxL,EAAIgJ,EAAK,EAAEhJ,EAC/CyL,EAASF,EAAUE,EAAQD,EAAQxL,CAAC,CAAC,EAGhC,OAAAyL,CACT,CACF,CASO,MAAMC,EAAQJ,EAAgB,CAACK,EAASC,IAAY,CACnD,MAAAC,EAAOT,EAAYO,CAAO,EAC1BG,EAAOV,EAAYQ,CAAO,EAC1BG,EAAOjD,EAAc6C,CAAO,EAAI7C,EAAc8C,CAAO,EAG3D,OAFYC,EAAOC,EAEN,IAAMC,CACrB,CAAC,EASYC,GAAOV,EAAgB,CAACK,EAASC,IAAY,CAClD,MAAAG,EAAO,IAAM,KAAK,IAAIjD,EAAc6C,CAAO,EAAG7C,EAAc8C,CAAO,CAAC,EAE1E,OAAQF,EAAMC,EAASI,CAAI,EAAIL,EAAME,EAASG,CAAI,GAAKA,CACzD,CAAC,EASYE,GAAQX,EAAgB,CAACK,EAASC,IAAY,CACnD,MAAAG,EAAO,IAAM,KAAK,IAAIjD,EAAc6C,CAAO,EAAG7C,EAAc8C,CAAO,CAAC,EAE1E,OAAQF,EAAMC,EAASI,CAAI,EAAIL,EAAME,EAASG,CAAI,GAAKA,CACzD,CAAC,EASYG,GAASZ,EAAgB,CAACK,EAASC,IAAY,CACpD,MAAAC,EAAOT,EAAYO,CAAO,EAC1BG,EAAOV,EAAYQ,CAAO,EAEzB,OAAAF,EAAMG,EAAOC,EAAMX,GAAY,KAAOrC,EAAc8C,CAAO,EAAI9C,EAAc6C,CAAO,EAAE,CAAC,CAChG,CAAC,ECzcYQ,GAAkB,IAClBC,EAAyB,IAEzBC,EAAoB,GAEpBC,GAAkBD,EAAoBD,EACtCG,GAAyBF,EAAoBD,EAE7CI,EAAkB,GAClBC,GAAkBD,EAAkBH,EAEpCK,GAAgBD,GAAkBL,EAClCO,GAAuBF,GAAkBL,EAEzCQ,GAAe,GACfC,GAAiBD,GAAeJ,EAChCM,GAAiBD,GAAiBR,EAElCU,GAAeD,GAAiBV,EAChCY,GAAsBF,GAAiBV,EAEvCa,GAAe,EACfC,GAAgBD,GAAeL,GAC/BO,GAAkBD,GAAgBV,EAClCY,GAAkBD,GAAkBd,EAEpCgB,GAAgBD,GAAkBhB,EAClCkB,GAAuBF,GAAkBhB,EAEzCmB,GAAoB,EAEpBC,GAAmB,EACnBC,GAAiBD,GAAmBD,GAQ3CG,GAAyB,CAC7B,EAAEC,EAAMlL,EAAO,CACP,MAAAmL,EAAOD,EAAK,YAAY,EAE9B,OAAOlL,EAAM,SAAW,EAAImL,EAAQA,EAAO,IAAQ,GACrD,EACA,EAAED,EAAMlL,EAAO,CACP,MAAAoL,EAAQF,EAAK,SAAA,EAAa,EAEhC,OAAOlL,EAAM,SAAW,EAAIoG,EAAagF,CAAK,EAAIA,CACpD,EACA,EAAEF,EAAMlL,EAAO,CACP,MAAAqL,EAAMH,EAAK,QAAQ,EAEzB,OAAOlL,EAAM,SAAW,EAAIoG,EAAaiF,CAAG,EAAIA,CAClD,EACA,EAAEH,EAAMlL,EAAO,CACP,MAAAsL,EAAOJ,EAAK,SAAS,EAE3B,OAAOlL,EAAM,SAAW,EAAIoG,EAAakF,CAAI,EAAIA,CACnD,EACA,EAAEJ,EAAMlL,EAAO,CACP,MAAAuL,EAASL,EAAK,WAAW,EAE/B,OAAOlL,EAAM,SAAW,EAAIoG,EAAamF,CAAM,EAAIA,CACrD,EACA,EAAEL,EAAMlL,EAAO,CACP,MAAAwL,EAASN,EAAK,WAAW,EAE/B,OAAOlL,EAAM,SAAW,EAAIoG,EAAaoF,CAAM,EAAIA,CACrD,EACA,EAAEN,EAAMlL,EAAO,CACb,MAAMyL,EAAU,KAAK,MAAMP,EAAK,SAAS,EAAI,GAAK,CAAC,EAEnD,OAAOlL,EAAM,SAAW,EAAIoG,EAAaqF,CAAO,EAAIA,CAAA,CAExD,EAEM3E,GAAe,oBACf4E,GAAkB,WAUR,SAAAC,EAAOC,EAAe3F,EAAS,GAAO,CAC9C,MAAAiF,EAAO,IAAI,KAAKU,CAAG,EAEzB,GAAI3F,GAAU,OAAO,MAAM,CAACiF,CAAI,EACxB,MAAA,IAAI,WAAW,oBAAoB,EAG3C,OAAI,OAAOU,GAAQ,UAAY,CAACA,EAAI,SAAS,GAAG,IAC9CV,EAAK,SAAS,CAAC,EACfA,EAAK,WAAW,CAAC,EACjBA,EAAK,WAAW,CAAC,GAGZA,CACT,CAoBgB,SAAAW,GAAOX,EAAgBY,EAAU,sBAAuB,CACtEZ,EAAOS,EAAOT,CAAI,EAEZ,MAAAa,EAAUD,EAAQ,MAAMhF,EAAY,EACpCpJ,EAASqO,GAAA,YAAAA,EAAS,OAExB,GAAI,CAACrO,EACI,OAAAoO,EAGT,IAAIvO,EAAI,EACJyL,EAAS,GAEb,KAAOzL,EAAIG,GAAQ,CACX,MAAAsO,EAAaD,EAA6BxO,CAAC,EAC3C0O,EAAiBD,EAAU,CAAC,EAC5BE,EAAYjB,GAAWgB,CAAc,EAEvCC,EACQlD,GAAAkD,EAAUhB,EAAMc,CAAS,EAEzBhD,GAAAgD,EAGV,EAAAzO,CAAA,CAGG,OAAAyL,EAAO,QAAQ0C,GAAiB,IAAI,CAC7C,CASO,SAASS,GAAQjB,EAAgB,CACtC,OAAAA,EAAOS,EAAOT,CAAI,EAEX,GAAG9E,EAAa8E,EAAK,SAAA,CAAU,CAAC,IAAI9E,EAAa8E,EAAK,YAAY,CAAC,IAAI9E,EAC5E8E,EAAK,WAAW,CAAA,CACjB,EACH,CASO,SAASkB,EAAWlB,EAAgB,CACzC,OAAAA,EAAOS,EAAOT,CAAI,EAEX,KAAK,MAAMA,EAAK,SAAS,EAAI,CAAC,EAAI,CAC3C,CAEA,MAAMmB,GAAkB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EASnD,SAASC,GAAepB,EAAY,CAClC,OAAAmB,GAAgBnB,EAAK,QAAQ,CACtC,CAUgB,SAAAqB,GAAgBrB,EAAgBsB,EAAgB,CAC9D,OAAAtB,EAAOS,EAAOT,CAAI,EAClBA,EAAK,QAAQA,EAAK,QAAQ,EAAIsB,CAAM,EAE7BtB,CACT,CAUgB,SAAAuB,GAAWvB,EAAgBsB,EAAgB,CAC/C,OAAAA,GAAA7C,EAEH4C,GAAgBrB,EAAMsB,CAAM,CACrC,CAUgB,SAAAE,GAAWxB,EAAgBsB,EAAgB,CAC/C,OAAAA,GAAA5C,EAEH6C,GAAWvB,EAAMsB,CAAM,CAChC,CAUgB,SAAAG,GAASzB,EAAgBsB,EAAgB,CAC7C,OAAAA,GAAAzC,EAEH2C,GAAWxB,EAAMsB,CAAM,CAChC,CAUgB,SAAAI,GAAY1B,EAAgBsB,EAAgB,CAChD,OAAAA,GAAA,GAEHG,GAASzB,EAAMsB,CAAM,CAC9B,CAUgB,SAAAK,GAAQ3B,EAAgBsB,EAAgB,CACtD,OAAAtB,EAAOS,EAAOT,CAAI,EAClBsB,EAAS,CAAC,CAACA,EAEXtB,EAAK,QAAQA,EAAK,QAAQ,EAAIsB,CAAM,EAE7BtB,CACT,CAUgB,SAAA4B,GAAS5B,EAAgBsB,EAAgB,CAC7C,OAAAA,GAAAhC,GAEHqC,GAAQ3B,EAAMsB,CAAM,CAC7B,CAUgB,SAAAO,GAAU7B,EAAgBsB,EAAgB,CACxD,OAAAtB,EAAOS,EAAOT,CAAI,EAClBsB,EAAS,CAAC,CAACA,EAEXtB,EAAK,SAASA,EAAK,SAAS,EAAIsB,CAAM,EAE/BtB,CACT,CAUgB,SAAA8B,GAAY9B,EAAgBsB,EAAgB,CAChD,OAAAA,GAAA1B,GAEHiC,GAAU7B,EAAMsB,CAAM,CAC/B,CAUgB,SAAAS,GAAS/B,EAAgBsB,EAAgB,CAC7C,OAAAA,GAAAxB,GAEH+B,GAAU7B,EAAMsB,CAAM,CAC/B,CAWO,SAASU,GAAU9P,EAAiBD,EAAO,GAAIE,EAAO,EAAG,CAC9DD,EAAQuO,EAAOvO,CAAK,EAEpB,MAAM+P,EAAoB,CAAC,EAE3B,QAAS5P,EAAI,EAAGA,EAAIJ,EAAM,EAAEI,EAC1B4P,EAAU,KAAKN,GAAQzP,EAAOG,EAAIF,CAAI,CAAC,EAGlC,OAAA8P,CACT,CAWO,SAASC,GAAWhQ,EAAiBD,EAAO,GAAIE,EAAO,EAAG,CAC/DD,EAAQuO,EAAOvO,CAAK,EAEpB,MAAM+P,EAAoB,CAAC,EAE3B,QAAS5P,EAAI,EAAGA,EAAIJ,EAAM,EAAEI,EAC1B4P,EAAU,KAAKJ,GAAU3P,EAAOG,EAAIF,CAAI,CAAC,EAGpC,OAAA8P,CACT,CASO,SAASE,GAAcnC,EAAY,CAClC,MAAAG,EAAMH,EAAK,OAAA,GAAY,EAEtB,OAAA2B,GAAQ3B,EAAM,CAACG,CAAG,CAC3B,CASO,SAASiC,GAAcpC,EAAgB,CAC5C,OAAAA,EAAOS,EAAOT,CAAI,EAClBA,EAAK,gBAAgB,CAAC,EAEfA,CACT,CASO,SAASqC,GAAcrC,EAAgB,CAC5C,OAAAA,EAAOS,EAAOT,CAAI,EACbA,EAAA,WAAW,EAAG,CAAC,EAEbA,CACT,CASO,SAASsC,GAAYtC,EAAgB,CAC1C,OAAAA,EAAOS,EAAOT,CAAI,EACbA,EAAA,WAAW,EAAG,EAAG,CAAC,EAEhBA,CACT,CASO,SAASuC,GAAWvC,EAAgB,CACzC,OAAAA,EAAOS,EAAOT,CAAI,EAClBA,EAAK,SAAS,EAAG,EAAG,EAAG,CAAC,EAEjBA,CACT,CASO,SAASwC,GAASxC,EAAgB,CACvC,OAAAA,EAAOS,EAAOT,CAAI,EAClBA,EAAK,SAAS,GAAI,GAAI,GAAI,GAAG,EAEtBA,CACT,CAUgB,SAAAyC,GAAYzC,EAAgB0C,EAAU,EAAG,CACvDA,EAAUA,EAAU,EAEhBA,EAAU,IACDA,GAAA,GAGb1C,EAAOS,EAAOT,CAAI,EAEZ,MAAAG,EAAMH,EAAK,OAAO,EAClB2C,GAAcxC,EAAMuC,EAAU,EAAI,GAAKvC,EAAMuC,EAEnD,OAAA1C,EAAK,QAAQA,EAAK,QAAQ,EAAI2C,CAAU,EACxC3C,EAAK,SAAS,EAAG,EAAG,EAAG,CAAC,EAEjBA,CACT,CASO,SAAS4C,GAAW3C,EAAc,CACvC,OAAQA,EAAO,IAAM,GAAKA,EAAO,MAAQ,GAAMA,EAAO,MAAQ,CAChE,CAUgB,SAAA4C,GAAkB5C,EAAcC,EAAe,CACzD,IAAA4C,EAEJ,OAAI5C,EAAQ,EACNA,IAAU,EACZ4C,EAAU,GAAM5C,EAAQ,EAEpB0C,GAAW3C,CAAI,EACP6C,EAAA,GAEAA,EAAA,GAIdA,EAAU,GAAM5C,EAAQ,EAGnB4C,CACT,CAUgB,SAAAC,GAAa/C,EAAgB0C,EAAU,EAAG,CACxD1C,EAAOS,EAAOT,CAAI,EAEZ,MAAAC,EAAOD,EAAK,YAAY,EACxBE,EAAQF,EAAK,SAAA,EAAa,EAC1BG,EAAMH,EAAK,QAAQ,EAEnB8C,EAAUD,GAAkB5C,EAAMC,CAAK,EAE7C,OAAAwC,EAAUA,EAAUI,EAEhBJ,EAAU,IACDA,GAAAI,GAGT3C,EAAMuC,GACH1C,EAAA,SAASE,EAAQ,CAAC,EAGzBF,EAAK,QAAQ0C,CAAO,EACpB1C,EAAK,SAAS,EAAG,EAAG,EAAG,CAAC,EAEjBA,CACT,CASO,SAASgD,GAAehD,EAAgB,CAC7CA,EAAOS,EAAOT,CAAI,EAEZ,MAAAO,EAAUW,EAAWlB,CAAI,EAE/B,OAAAA,EAAK,QAAQ,CAAC,EACdA,EAAK,SAAS,EAAG,EAAG,EAAG,CAAC,EACnBA,EAAA,UAAUO,EAAU,GAAK,CAAC,EAExBP,CACT,CAUgB,SAAAiD,GAAYjD,EAAgB0C,EAAU,EAAG,CACvDA,EAAUA,EAAU,GAEhBA,EAAU,IACDA,GAAA,IAGb1C,EAAOS,EAAOT,CAAI,EAEZ,MAAAE,EAAQF,EAAK,SAAS,EACtB2C,GAAczC,EAAQwC,EAAU,GAAK,GAAKxC,EAAQwC,EAExD,OAAA1C,EAAK,SAASA,EAAK,SAAS,EAAI2C,CAAU,EAC1C3C,EAAK,QAAQ,CAAC,EACdA,EAAK,SAAS,EAAG,EAAG,EAAG,CAAC,EAEjBA,CACT,CAUgB,SAAAkD,GAAuBzI,EAAgBC,EAAiB,CACtE,OAAAD,EAAOgG,EAAOhG,CAAI,EAClBC,EAAQ+F,EAAO/F,CAAK,EAEbA,EAAM,UAAYD,EAAK,QAAQ,CACxC,CAUgB,SAAA0I,GAAkB1I,EAAgBC,EAAiB,CACjE,MAAM0I,EAAOF,GAAuBzI,EAAMC,CAAK,EAAI8D,GAE5C,OAAA4E,EAAO,EAAI,KAAK,MAAMA,CAAI,EAAI,KAAK,KAAKA,CAAI,CACrD,CAUgB,SAAAC,GAAkB5I,EAAgBC,EAAiB,CACjE,MAAM0I,EAAOF,GAAuBzI,EAAMC,CAAK,EAAIiE,GAE5C,OAAAyE,EAAO,EAAI,KAAK,MAAMA,CAAI,EAAI,KAAK,KAAKA,CAAI,CACrD,CAUgB,SAAAE,GAAgB7I,EAAgBC,EAAiB,CAC/D,MAAM0I,EAAOF,GAAuBzI,EAAMC,CAAK,EAAIqE,GAE5C,OAAAqE,EAAO,EAAI,KAAK,MAAMA,CAAI,EAAI,KAAK,KAAKA,CAAI,CACrD,CAUgB,SAAAG,GAAe9I,EAAgBC,EAAiB,CAC9D,OAAAD,EAAO8H,GAAW9H,CAAI,EACtBC,EAAQ6H,GAAW7H,CAAK,GAEhBA,EAAM,QAAA,EAAYD,EAAK,QAAa,GAAA2E,EAC9C,CAWO,SAASoE,GAAgB/I,EAAgBC,EAAiB+I,EAAc,EAAG,CACzE,OAAAhJ,EAAAgI,GAAYhI,EAAMgJ,CAAW,EAC5B/I,EAAA+H,GAAY/H,EAAO+I,CAAW,GAE9B/I,EAAM,QAAA,EAAYD,EAAK,QAAa,GAAAiF,EAC9C,CAUgB,SAAAgE,GAAiBjJ,EAAgBC,EAAiB,CAChED,EAAOgG,EAAOhG,CAAI,EAClBC,EAAQ+F,EAAO/F,CAAK,EAEpB,MAAMiJ,EAAWjJ,EAAM,YAAY,EAAID,EAAK,YAAY,EAClDmJ,EAAYlJ,EAAM,SAAS,EAAID,EAAK,SAAS,EAEnD,OAAOkJ,EAAW,GAAKC,CACzB,CAUgB,SAAAC,GAAmBpJ,EAAgBC,EAAiB,CAClED,EAAOgG,EAAOhG,CAAI,EAClBC,EAAQ+F,EAAO/F,CAAK,EAEpB,MAAMiJ,EAAWjJ,EAAM,YAAY,EAAID,EAAK,YAAY,EAClDqJ,EAAc5C,EAAWxG,CAAK,EAAIwG,EAAWzG,CAAI,EAEvD,OAAOkJ,EAAW,EAAIG,CACxB,CAUgB,SAAAC,GAAgBtJ,EAAgBC,EAAiB,CAC/D,OAAAD,EAAOgG,EAAOhG,CAAI,EAClBC,EAAQ+F,EAAO/F,CAAK,EAEbA,EAAM,cAAgBD,EAAK,YAAY,CAChD,CAUgB,SAAAuJ,GAAWvJ,EAAgBC,EAAiB,CAC1DD,EAAOgG,EAAOhG,CAAI,EAClBC,EAAQ+F,EAAO/F,CAAK,EAEpB,MAAM0I,EAAO3I,EAAK,QAAQ,EAAIC,EAAM,QAAQ,EAE5C,OAAO0I,EAAO,EAAI,GAAKA,EAAO,EAAI,EAAIA,CACxC,CAUgB,SAAAa,EAAYxJ,EAAgBC,EAAiB,CACpD,MAAA,CAACsJ,GAAWvJ,EAAMC,CAAK,CAChC,CAUgB,SAAAwJ,GAAsBzJ,EAAgBC,EAAiB,CACrE,OAAAD,EAAO2H,GAAc3H,CAAI,EACzBC,EAAQ0H,GAAc1H,CAAK,EAEpByI,GAAkB1I,EAAMC,CAAK,CACtC,CAUgB,SAAAyJ,GAAsB1J,EAAgBC,EAAiB,CACrE,OAAAD,EAAO4H,GAAc5H,CAAI,EACzBC,EAAQ2H,GAAc3H,CAAK,EAEpB2I,GAAkB5I,EAAMC,CAAK,CACtC,CAUgB,SAAA0J,GAAoB3J,EAAgBC,EAAiB,CACnE,OAAAD,EAAO6H,GAAY7H,CAAI,EACvBC,EAAQ4H,GAAY5H,CAAK,EAElB4I,GAAgB7I,EAAMC,CAAK,CACpC,CAUgB,SAAA2J,GAAmB5J,EAAgBC,EAAiB,CAC5D,MAAA4J,EAAOL,EAAYxJ,EAAMC,CAAK,EAC9BiI,EAAa,KAAK,IAAIY,GAAe9I,EAAMC,CAAK,CAAC,EAEvDD,EAAOgG,EAAOhG,CAAI,EAClBA,EAAK,QAAQA,EAAK,QAAQ,EAAI6J,EAAO3B,CAAU,EAE/C,MAAM4B,EAAgBN,EAAYxJ,EAAMC,CAAK,IAAM,CAAC4J,EAE7C,OAAAA,GAAQ3B,GAAc4B,EAAgB,EAAI,GACnD,CAUgB,SAAAC,GAAoB/J,EAAgBC,EAAiB,CACnE,MAAM0I,EAAOiB,GAAmB5J,EAAMC,CAAK,EAAI4E,GAExC,OAAA8D,EAAO,EAAI,KAAK,MAAMA,CAAI,EAAI,KAAK,KAAKA,CAAI,CACrD,CAUgB,SAAAqB,GAAqBhK,EAAgBC,EAAiB,CAC9D,MAAA4J,EAAOL,EAAYxJ,EAAMC,CAAK,EAC9BiI,EAAa,KAAK,IAAIe,GAAiBjJ,EAAMC,CAAK,CAAC,EAEzDD,EAAOgG,EAAOhG,CAAI,EAClBA,EAAK,SAASA,EAAK,SAAS,EAAI6J,EAAO3B,CAAU,EAEjD,MAAM4B,EAAgBN,EAAYxJ,EAAMC,CAAK,IAAM,CAAC4J,EAE7C,OAAAA,GAAQ3B,GAAc4B,EAAgB,EAAI,GACnD,CAUgB,SAAAG,GAAuBjK,EAAgBC,EAAiB,CACtE,MAAM0I,EAAOqB,GAAqBhK,EAAMC,CAAK,EAAI,EAE1C,OAAA0I,EAAO,EAAI,KAAK,MAAMA,CAAI,EAAI,KAAK,KAAKA,CAAI,CACrD,CAUgB,SAAAuB,GAAoBlK,EAAgBC,EAAiB,CAC7D,MAAA4J,EAAOL,EAAYxJ,EAAMC,CAAK,EAC9BiI,EAAa,KAAK,IAAIoB,GAAgBtJ,EAAMC,CAAK,CAAC,EAExDD,EAAOgG,EAAOhG,CAAI,EAClBA,EAAK,YAAYA,EAAK,YAAY,EAAI6J,EAAO3B,CAAU,EAEvD,MAAM4B,EAAgBN,EAAYxJ,EAAMC,CAAK,IAAM,CAAC4J,EAE7C,OAAAA,GAAQ3B,GAAc4B,EAAgB,EAAI,GACnD,CC73BO,SAASK,GAAaC,EAAQ/R,EAA4B,GAAO,CACtE,GAAI+R,GAAO,MAAQ,OAAOA,GAAQ,SACzB,OAAAA,EAGH,KAAA,CAAE,YAAAC,EAAcjT,CAAA,EAASiB,EACzBiS,EAAc,OAAA,OAAO,IAAI,EAGzBC,EAID,CACH,CACE,OAAQD,EACR,KAAM,OACN,KAAMF,CAAA,CAEV,EAEMI,MAAmB,QACnBC,EAA8C,CAAC,EAC/CC,EAA8C,CAAC,EAErD,KAAOH,EAAS,QAAQ,CAEtB,KAAM,CAAE,OAAAI,EAAQ,KAAAC,EAAM,KAAAC,CAAK,EAAIN,EAAS,IAAI,EAE5C,GAAI,CAACI,EAAQ,SAEP,MAAAhV,EAAOkC,GAAQgT,CAAI,EAEzB,GAAIlV,IAAS,OAAQ,CACnBgV,EAAOC,CAAI,EAAI,IAAI,KAAKC,CAAY,EACpC,QAAA,CAGF,GAAIlV,IAAS,QAAS,CACd,MAAA0N,EAASgH,EAAY1U,EAAMkV,CAAI,EAErC,GAAIxH,GAAU,KAAM,CAClBsH,EAAOC,CAAI,EAAIvH,EACf,QAAA,CACF,CAIF,MAAMyH,EAAeH,EAAOC,CAAI,EAC9BjV,IAAS,SAAWA,IAAS,OAASA,IAAS,MAAQ,CAAA,EAAK,OAAO,OAAO,IAAI,EAE5E,GAAAA,IAAS,OAASA,IAAS,MAAO,CACpC,IAAIiC,EAAI,EAER,GAAIjC,IAAS,MAAO,CAClB,UAAWoV,KAAQF,EACbL,EAAa,IAAIO,CAAI,EACvBD,EAAOlT,CAAC,EAAI4S,EAAa,IAAIO,CAAI,EACxBA,IAAS,MAAQ,OAAOA,GAAS,SAC1CR,EAAS,KAAK,CACZ,OAAQO,EACR,KAAMlT,EACN,KAAMmT,CAAA,CACP,EAEDD,EAAOlT,CAAC,EAAImT,EAGZ,EAAAnT,EAGJ6S,EAAS,KAAK,CAAE,OAAAE,EAAQ,KAAAC,CAAA,CAAM,CAAA,KACzB,CACL,UAAWI,KAASH,EAAM,CACxB,MAAMI,EAAc,CAAC,EACjBrT,EAAA,EAEJ,UAAWmT,KAAQC,EACbR,EAAa,IAAIO,CAAI,EACvBE,EAAYrT,CAAC,EAAI4S,EAAa,IAAIO,CAAI,EAC7BA,IAAS,MAAQ,OAAOA,GAAS,SAC1CR,EAAS,KAAK,CACZ,OAAQU,EACR,KAAMrT,EACN,KAAMmT,CAAA,CACP,EAEDE,EAAYrT,CAAC,EAAImT,EAGjB,EAAAnT,EAGJkT,EAAO,KAAKG,CAAW,CAAA,CAGzBP,EAAS,KAAK,CAAE,OAAAC,EAAQ,KAAAC,CAAA,CAAM,CAAA,CAChC,KAEA,WAAW/U,KAAO,OAAO,KAAKgV,CAAI,EAAG,CAC7B,MAAAE,EAAOF,EAAKhV,CAAG,EAGjB2U,EAAa,IAAIO,CAAI,EACvBD,EAAOjV,CAAG,EAAI2U,EAAa,IAAIO,CAAI,EAC1BA,IAAS,MAAQ,OAAOA,GAAS,SAC1CR,EAAS,KAAK,CACZ,OAAQO,EACR,KAAMjV,EACN,KAAMkV,CAAA,CACP,EAEDD,EAAOjV,CAAG,EAAIkV,CAChB,CAISP,EAAA,IAAIK,EAAMC,CAAM,CAAA,CAG/B,SAAW,CAAE,OAAAH,EAAQ,KAAAC,CAAK,IAAKH,EAC7BE,EAAOC,CAAI,EAAI,IAAI,IAAID,EAAOC,CAAI,CAAC,EAGrC,SAAW,CAAE,OAAAD,EAAQ,KAAAC,CAAK,IAAKF,EAC7BC,EAAOC,CAAI,EAAI,IAAI,IAAID,EAAOC,CAAI,CAAC,EAGrC,OAAON,EAAK,IACd,CCtJA,MAAMY,GAAiB,oDACjBC,GAAa,IAAM,GAQT,SAAAC,GAAcC,EAAaC,EAAUJ,GAAgB,CACnE,MAAMK,EAAiB,IAAM,CACrB,MAAA,IAAI,MAAMD,CAAO,CACzB,EAEA,OAAO,KAAKD,CAAM,EAAE,QAAgBG,GAAA,CAC9B,OAAOH,EAAOG,CAAI,GAAM,WAC1BH,EAAOG,CAAI,EAAID,EAAe,KAAKF,CAAM,EAEzCA,EAAOG,CAAI,EAAI,IACjB,CACD,EAED,OAAO,oBAAoBH,EAAO,YAAY,SAAS,EAAE,QAAgBG,GAAA,CACnEA,IAAS,eAAiB,OAAOH,EAAOG,CAAI,GAAM,aACpDH,EAAOG,CAAI,EAAID,EAAe,KAAKF,CAAM,EAC3C,CACD,EAEDA,EAAO,YAAcF,EACvB,CCTO,MAAMM,GAAYrW,IAAa,iBAAkB,QAAUsW,GAAsB,EAAA,GAI3EC,GAAaF,GAAY,cAAgB,QAEtD,SAASC,IAAoB,CAC3B,OAAO,OAAO,UAAc,MACxB,UAAU,gBAAoB,UAAkB,mBAA+B,CAErF,CAWO,SAASE,GAAcC,EAAaC,EAAuBC,EAAQ,OAAO,MAAO,CAChF,KAAA,CAAE,KAAApW,EAAM,QAAAqW,EAAU,GAAO,WAAAC,EAAa,GAAO,GAAGpB,GAASiB,EAE/D,GAAI,CAAChW,EAAUH,CAAI,GAAKA,IAAS,GAAW,MAAA,GAExC,IAAAuW,EAEA,OAAApW,EAAUiW,CAAK,EACjBG,EAAQ,IAAIH,EAAMpW,EAAM,CAAE,QAAAqW,EAAS,WAAAC,EAAY,GAEvCC,EAAA,SAAS,YAAY,YAAY,EACnCA,EAAA,UAAUvW,EAAMqW,EAASC,CAAU,GAGpC,OAAA,OAAOC,EAAOrB,CAAI,EAElBgB,EAAG,cAAcK,CAAK,CAC/B,CCrDA,MAAMC,GAAmB,CACvB,SACA,wBACA,QACA,SACA,WACA,aACA,mBACF,EACG,IAASxR,GAAA,GAAGA,CAAC,iCAAiC,EAC9C,KAAK,IAAI,EAEZ,SAAS1D,GAAU4U,EAAwC,CACzD,MAAO,CAAC,CAACA,GAAMA,EAAG,WAAa,CACjC,CAEA,SAASO,GAAcP,EAAqB,CAC1C,OAAO5U,GAAU4U,CAAE,EAAIA,EAAK,SAAS,IACvC,CAUgB,SAAAQ,GAASC,EAAkBC,EAAuB,CAChE,MAAI,CAACnX,GAAY,CAACkX,EAAiB,CAAC,EAE7B,MAAM,KAAKF,GAAcG,CAAI,EAAE,iBAAiBD,CAAQ,CAAC,CAClE,CASO,SAASE,GAAUX,EAAqB,CACzC,GAAA,CAACzW,EAAiB,MAAA,GAEtB,MAAMqX,EAAW,SAAS,cAE1B,MAAI,CAACxV,GAAU4U,CAAE,GAAK,CAACY,EAAiB,GAEjCZ,IAAOY,GAAYC,GAASD,EAAUZ,CAAE,CACjD,CAUgB,SAAAa,GAASb,EAAqBlB,EAA6B,CACzE,GAAI,CAACkB,GAAM,CAAClB,EAAe,MAAA,GAE3B,MAAMgC,EAAOhC,EAAwB,kBAE9B,OAAAA,EAAO,SAASkB,CAAE,GAAM,CAAC,CAACc,IAAQA,IAAQd,GAAMc,EAAI,SAASd,CAAE,EACxE,CASO,SAASe,GAASf,EAAqB,CAKxC,GAJA,CAACzW,GAAY,CAAC6B,GAAU4U,CAAE,GAAK,CAACA,EAAG,YAAc,CAACa,GAASb,EAAI,SAAS,IAAI,GAI5EA,EAAG,MAAM,UAAY,OAChB,MAAA,GAGH,MAAAgB,EAAOhB,EAAG,sBAAsB,EAEtC,MAAO,EAAEgB,GAAQA,EAAK,MAAQ,GAAKA,EAAK,OAAS,EACnD,CASO,SAASC,GAAUjB,EAAqB,CACtC,MAAA,CAACe,GAASf,CAAE,CACrB,CASO,SAASkB,GAAWlB,EAAqB,CAC9C,MACE,CAAC5U,GAAU4U,CAAE,GACZA,EAAG,aAAa,UAAU,GAAKA,EAAG,aAAa,UAAU,IAAM,SAC/DA,EAAwB,QAE7B,CAUgB,SAAAmB,GAAcT,EAAoBU,EAAkB,GAAO,CACnE,MAAAC,EAAQD,EAAkB,IAAM,GAAQF,GAEvC,OAAAV,GAASF,GAAkBI,CAAI,EAAE,OACtCV,GAAMiB,GAAUjB,CAAE,GAAKA,EAAG,SAAW,IAAM,CAACqB,EAAMrB,CAAE,CACtD,CACF,CASO,SAASsB,GAAYtB,EAAwB,CAClD,GAAI,CAACzW,GAAY,CAACyW,EAAW,MAAA,GAEvB,MAAAuB,EAAgB,iBAAiBvB,CAAE,EAGzC,OAFgB,WAAWuB,EAAc,WAAW,EAAI,WAAWA,EAAc,YAAY,GAE3E,CACpB,CASO,SAASC,GAAYxB,EAAwB,CAClD,GAAI,CAACzW,GAAY,CAACyW,EAAW,MAAA,GAEvB,MAAAuB,EAAgB,iBAAiBvB,CAAE,EAGzC,OAFgB,WAAWuB,EAAc,UAAU,EAAI,WAAWA,EAAc,aAAa,GAE3E,CACpB,CASO,SAASE,GAAWzB,EAAwB,CACjD,GAAI,CAACzW,GAAY,CAACyW,EAAW,MAAA,GAEvB,MAAAuB,EAAgB,iBAAiBvB,CAAE,EAGzC,OAFe,WAAWuB,EAAc,UAAU,EAAI,WAAWA,EAAc,WAAW,GAEzE,CACnB,CASO,SAASG,GAAW1B,EAAwB,CACjD,GAAI,CAACzW,GAAY,CAACyW,EAAW,MAAA,GAEvB,MAAAuB,EAAgB,iBAAiBvB,CAAE,EAGzC,OAFe,WAAWuB,EAAc,SAAS,EAAI,WAAWA,EAAc,YAAY,GAEzE,CACnB,CASO,SAASI,GAAW3B,EAAwB,CACjD,GAAI,CAACzW,GAAY,CAACyW,EAAW,MAAA,GAEvB,MAAAuB,EAAgB,iBAAiBvB,CAAE,EAIzC,OAFE,WAAWuB,EAAc,eAAe,EAAI,WAAWA,EAAc,gBAAgB,GAEvE,CAClB,CASO,SAASK,GAAW5B,EAAwB,CACjD,GAAI,CAACzW,GAAY,CAACyW,EAAW,MAAA,GAEvB,MAAAuB,EAAgB,iBAAiBvB,CAAE,EAIzC,OAFE,WAAWuB,EAAc,cAAc,EAAI,WAAWA,EAAc,iBAAiB,GAEvE,CAClB,CASO,SAASM,GAAc7B,EAAwB,CACpD,GAAI,CAACzW,GAAY,CAACyW,EAAW,MAAA,GAEvB,MAAAtU,EAAQ,SAAS,YAAY,EAE7BA,EAAA,SAASsU,EAAI,CAAC,EACpBtU,EAAM,OAAOsU,EAAIA,EAAG,WAAW,MAAM,EAE/B,MAAA8B,EAAapW,EAAM,sBAAA,EAAwB,MAC3CqW,EAAWT,GAAYtB,CAAE,EAE/B,OAAO8B,EAAaC,CACtB,CASO,SAASC,GAAUnY,EAAwB,CAChD,OAAO2K,GAAc3K,EAAO,EAAI,EAAI,GAAG6K,GAAS7K,CAAK,CAAC,KAAO,OAAOA,CAAK,EAAE,KAAK,CAClF,CAWO,SAASoY,GAAYpY,EAA0C,CACpE,OAAOI,EAAUJ,CAAK,GAAKA,IAAU,GAAQ,OAAOA,CAAK,EAAI,MAC/D,CCpRA,MAAMqY,GAAW,UASV,SAASC,GAAW9V,EAAiB,CAC1C,MAAM0G,EAAM,GAAK1G,EACXmC,EAAQ0T,GAAS,KAAKnP,CAAG,EAE/B,GAAI,CAACvE,EACI,OAAAuE,EAGT,IAAIqP,EAAO,GACPC,EACAxO,EACAyO,EAAY,EAEhB,IAAKzO,EAAQrF,EAAM,MAAOqF,EAAQd,EAAI,OAAQc,IAAS,CAC7C,OAAAd,EAAI,WAAWc,CAAK,EAAG,CAC7B,IAAK,IACOwO,EAAA,SACV,MACF,IAAK,IACOA,EAAA,QACV,MACF,IAAK,IACOA,EAAA,QACV,MACF,IAAK,IACOA,EAAA,OACV,MACF,IAAK,IACOA,EAAA,OACV,MACF,QACE,QAAA,CAGAC,IAAczO,IACRuO,GAAArP,EAAI,UAAUuP,EAAWzO,CAAK,GAGxCyO,EAAYzO,EAAQ,EACZuO,GAAAC,CAAA,CAGV,OAAOC,IAAczO,EAAQuO,EAAOrP,EAAI,UAAUuP,EAAWzO,CAAK,EAAIuO,CACxE,CCRO,SAASG,IAAqB,CAC7B,MAAAC,MAAkC,IAEjC,MAAA,CACL,GAAG1Y,EAAM2Y,EAAS,CACV,MAAAC,EAAWF,EAAW,IAAI1Y,CAAI,GACtB4Y,GAAA,YAAAA,EAAU,IAAID,KAG1BD,EAAW,IAAI1Y,EAAM,IAAI,IAAI,CAAC2Y,CAAO,CAAC,CAAC,CAE3C,EACA,IAAI3Y,EAAM2Y,EAAS,CACX,MAAAC,EAAWF,EAAW,IAAI1Y,CAAI,EAEhC4Y,GACFA,EAAS,OAAOD,CAAO,CAE3B,EACA,MAAM3Y,EAAM,CACJ,MAAA4Y,EAAWF,EAAW,IAAI1Y,CAAI,EAEhC4Y,GACFA,EAAS,MAAM,CAEnB,EACA,UAAW,CACTF,EAAW,MAAM,CACnB,EACA,KAAK1Y,KAASmW,EAAS,CACf,MAAAyC,EAAWF,EAAW,IAAI1Y,CAAI,EAEhC4Y,GACFA,EAAS,QAAmBD,GAAA,CAC1BA,EAAQ,GAAGxC,CAAO,CAAA,CACnB,CACH,CAEJ,CACF,CCnFA,SAAS0C,GAAQlD,EAAiBmD,EAAoBC,EAAiC,CACjFpD,GAAW,CAACmD,EAAM,IAAInD,CAAO,IAC/BoD,EAAMpD,CAAO,EACbmD,EAAM,IAAInD,CAAO,EAErB,CAEA,MAAMqD,OAAgB,IAQf,SAASC,GAAStD,EAAiBoD,EAAQ,QAAQ,KAAM,CACtDF,GAAAlD,EAASqD,GAAWD,CAAK,CACnC,CAEA,MAAMG,OAAgB,IAQf,SAASC,GAASxD,EAAiBoD,EAAQ,QAAQ,KAAM,CACtDF,GAAAlD,EAASuD,GAAWH,CAAK,CACnC,CAEA,MAAMK,OAAiB,IAQhB,SAASC,GAAU1D,EAAiBoD,EAAQ,QAAQ,KAAM,CACvDF,GAAAlD,EAASyD,GAAYL,CAAK,CACpC,CCvCO,MAAMO,GAAM7Z,EACf,sBACC8Z,GAA6B,CAC5B,WAAWA,EAAI,EAAE,CACnB,EAUY,SAAAC,GACdC,EACAC,EAAW,GACuB,CAC9B,GAAA,OAAOD,GAAW,WACb,OAAAhY,EAGH,MAAAkY,EAAS,IAAIC,IAAwB,CACzCH,EAAO,GAAGG,CAAI,CAChB,EAEA,GAAIF,GAAY,EACd,OAAOG,GAAcF,CAAM,EAG7B,IAAIG,EAAW,EACXC,EAEJ,OAAO,YAAaH,EAAqB,CACjC,MAAAI,EAAU,KAAK,IAAI,EACnBC,EAAUD,EAAUF,EAE1B,aAAaC,CAAK,EAEdE,GAAWP,GACFI,EAAAE,EACXL,EAAO,GAAGC,CAAI,GAENG,EAAA,WACN,IAAM,CACJD,EAAW,KAAK,IAAI,EACpBH,EAAO,GAAGC,CAAI,CAChB,EACA,KAAK,IAAI,EAAGF,EAAWO,CAAO,CAChC,CAEJ,CACF,CAUgB,SAAAC,GACdT,EACAU,EAAQ,IAC0B,CAC9B,GAAA,OAAOV,GAAW,WACb,OAAAhY,EAGH,MAAAkY,EAAS,IAAIC,IAAwB,CACzCH,EAAO,GAAGG,CAAI,CAChB,EAEA,GAAIO,GAAS,EACX,OAAON,GAAcF,CAAM,EAGzB,IAAAI,EAEJ,OAAO,YAAaH,EAAqB,CACvC,aAAaG,CAAK,EAElBA,EAAQ,WAAW,IAAM,CACvBJ,EAAO,GAAGC,CAAI,GACbO,CAAK,CACV,CACF,CASO,SAASN,GAAiDJ,EAAW,CACtE,GAAA,OAAOA,GAAW,WACb,OAAAA,EAGT,IAAIW,EAAS,GACTC,EACAC,EAEJ,OAAO,YAAaV,EAAqB,CAC5B,OAAAS,EAAAT,EAENQ,IACMA,EAAA,GACTE,EAAU,QAAQ,QAAU,EAAA,KAAK,KACtBF,EAAA,GACCE,EAAA,OAEHb,EAAO,GAAGY,CAAQ,EAC1B,GAGIC,CACT,CACF,CASO,SAASC,GAAiDd,EAAW,CACtE,GAAA,OAAOA,GAAW,WACb,OAAAA,EAGT,IAAIW,EAAS,GACTC,EACAC,EAEJ,OAAO,YAAaV,EAAqB,CAC5B,OAAAS,EAAAT,EAENQ,IACMA,EAAA,GACTE,EAAU,IAAI,QAAQE,GACpBlB,GAAI,IAAM,CACCc,EAAA,GACCE,EAAA,OAEFE,EAAAf,EAAO,GAAGY,CAAQ,CAAC,CAC5B,CAAA,CACH,GAGKC,CACT,CACF,CAEA,MAAMG,MAAoB,IACpBC,OAAkB,QAExB,SAASC,IAAqB,CAC5BF,EAAc,QAAcG,GAAA,CAC1BA,EAAG,GAAGF,GAAY,IAAIE,CAAE,CAAE,CAAA,CAC3B,EACDH,EAAc,MAAM,CACtB,CAQgB,SAAAI,GAAgDpB,KAAcG,EAAa,CACrF,GAAA,OAAOH,GAAW,WACb,OAAAA,EAGGiB,GAAA,IAAIjB,EAAQG,CAAI,EAExB,CAAAa,EAAc,IAAIhB,CAAM,IAI5BgB,EAAc,IAAIhB,CAAM,EAEpBgB,EAAc,OAAS,GACjB,QAAA,QAAA,EAAU,KAAKE,EAAkB,EAE7C,CAEA,MAAMG,MAAqB,IACrBC,OAAmB,QAEzB,SAASC,IAAsB,CAC7BF,EAAe,QAAcF,GAAA,CAC3BA,EAAG,GAAGG,GAAa,IAAIH,CAAE,CAAE,CAAA,CAC5B,EACDE,EAAe,MAAM,CACvB,CAQgB,SAAAG,GAAiDxB,KAAcG,EAAa,CACtF,GAAA,OAAOH,GAAW,WACb,OAAAA,EAGIsB,GAAA,IAAItB,EAAQG,CAAI,EAEzB,CAAAkB,EAAe,IAAIrB,CAAM,IAI7BqB,EAAe,IAAIrB,CAAM,EAErBqB,EAAe,OAAS,GAC1BxB,GAAI0B,EAAmB,EAE3B,CAWsB,eAAAE,GACpBC,EACAC,EACAC,EACA,CACA,MAAMC,EAA2B,CAAC,EAC5BC,EAAiC,CAAC,EAExC,UAAWnG,KAAQgG,EAAQ,CACnB,MAAAvU,EAAI,QAAQ,QAAQ,EAAE,KAAK,IAAMwU,EAAWjG,EAAMgG,CAAM,CAAC,EAI3D,GAFJE,EAAI,KAAKzU,CAAC,EAENsU,GAAkBC,EAAO,OAAQ,CAC7B,MAAAI,EAAkB3U,EAAE,KAAK,IAAM0U,EAAU,OAAOA,EAAU,QAAQC,CAAC,EAAG,CAAC,CAAC,EAE9ED,EAAU,KAAKC,CAAC,EAEZD,EAAU,QAAUJ,GAChB,MAAA,QAAQ,KAAKI,CAAS,CAC9B,CACF,CAGK,OAAA,QAAQ,IAAID,CAAG,CACxB,CCnQA,IAAIG,GAAmC,KAOhC,SAASC,IAAiB,CAC/B,GAAI,CAACjc,EACI,MAAA,GAGT,GAAIgc,KAAqB,KAAM,CACvB,MAAAE,EAAO,SAAS,cAAc,KAAK,EAEzCA,EAAK,MAAM,QAAU,OACrBA,EAAK,MAAM,cAAgB,SAC3BA,EAAK,MAAM,OAAS,MAEpBA,EAAK,YAAY,SAAS,cAAc,KAAK,CAAC,EAC9CA,EAAK,YAAY,SAAS,cAAc,KAAK,CAAC,EACrC,SAAA,KAAK,YAAYA,CAAI,EAE9BF,GAAmBE,EAAK,eAAiB,EAEhC,SAAA,KAAK,YAAYA,CAAI,CAAA,CAGzB,OAAAF,EACT,CAEA,IAAIG,GAAsC,KAOnC,SAASC,IAAoB,CAClC,OAAKpc,GAIDmc,KAAwB,OACJA,GAAA,YAAa,SAAS,cAAc,KAAK,GAG1DA,IAPE,EAQX,CCvCO,SAASE,GAAe/b,EAAgB,CAC7C,OAAO,MAAM,QAAQA,CAAK,EAAIA,EAAQ,CAACA,CAAK,CAC9C,CAUgB,SAAAgc,GAAuChc,KAAmC6Z,EAAS,CACjG,OAAO5Y,GAAWjB,CAAK,EAAIA,EAAM,GAAG6Z,CAAI,EAAI7Z,CAC9C,CASO,SAASic,GAAcC,EAAc,CACnC,OAAAA,EAAK,QAAQ,UAAW,GAAG,CACpC,CAkBO,SAASC,GAAQnc,EAAuB,CACtC,OAAAA,EAAMA,EAAM,OAAS,CAAC,CAC/B,CAIA,MAAMoc,GAAmB/W,GAAeA,EAwDjC,SAASgX,GACdC,EACApH,EACAqH,EACAC,EACA,CACI,IAAAC,EAEA,OAAOF,GAAa,YAAcC,IAAW,QAC/CA,EAAS,CAAC,CAACD,EACSE,EAAAL,IAEAK,EAAA,OAAOF,GAAa,WAAaA,EAAYH,GAGnE,MAAMM,EAAOF,EAAa,IAAA,IAAqB,CAAC,EAEhD,GAAI,CAACpc,EAAU8U,CAAI,EAAU,OAAAwH,EAE7B,MAAMC,EAAMH,EACR,CAACrc,EAAUH,IAAa0c,EAAI,IAAIvc,EAAKH,CAAK,EAC1C,CAACG,EAAUH,IAAc0c,EAAIvc,CAAG,EAAIH,EAClC4c,EAAe3b,GAAWiU,CAAI,EAAIA,EAAQG,GAAYA,EAAKH,CAAI,EAErE,OAAAoH,EAAK,QAAgBjH,GAAA,CACf,GAAA,CAACjV,EAAUiV,CAAI,EAAG,OAEhB,MAAAlV,EAAMyc,EAAavH,CAAI,EAEzBjV,EAAUD,CAAG,GACXwc,EAAAxc,EAAKsc,EAAkBpH,CAAI,CAAC,CAClC,CACD,EAEMqH,CACT,CAgBO,SAASG,GACd5a,EACAoT,EACAyH,EAAO,GACG,CACV,IAAI9S,EAAQ,GAQZ,OANI8S,GAAQ,OAAOzH,GAAS,WAC1BrL,EAAQ/H,EAAM,UAAqBgY,GAAAA,IAAY5E,CAAI,EAE3CrL,EAAA/H,EAAM,UAAUoT,CAA4B,EAGlD,CAACrL,EACI/H,EAAM,OAAO+H,EAAO,CAAC,EAAE,CAAC,EAG1B,IACT,CAUO,SAAS+S,GACdT,EACAU,EAA0E,GACrD,EACjB,OAAOA,GAAU,UAAY,OAAOA,GAAU,cAChDA,EAAQ,CAACA,CAAK,GAGhB,MAAMC,EAAYD,EAAM,OAClBE,EAA+B,CAAC,EAEtC,UAAW7H,KAAQiH,EAAM,CACnB,IAAAnH,EAEJ,QAASjT,EAAI,EAAGA,EAAI+a,EAAW,EAAE/a,EAAG,CAC5B,MAAAib,EAASjb,IAAM+a,EAAY,EAC3B/H,EAAO8H,EAAM9a,CAAC,EACdlC,EAAQ,OAAOkV,GAAS,WAAaA,EAAKG,CAAI,EAAIA,EAAKH,CAAe,EAEvEC,GAOEA,EAAKnV,CAAK,IACbmV,EAAKnV,CAAK,EAAImd,EAAS,GAAK,CAAC,GAG/BhI,EAAOA,EAAKnV,CAAK,IAVZkd,EAAQld,CAAK,IAChBkd,EAAQld,CAAK,EAAImd,EAAS,GAAK,CAAC,GAGlChI,EAAO+H,EAAQld,CAAK,EAOtB,CAGFmV,EAAK,KAAKE,CAAI,CAAA,CAGT,OAAA6H,CACT,CAkBO,SAASE,GAAuBd,EAAW3Z,EAAgC,GAAI,CAC9E,KAAA,CACJ,SAAA0a,EAAW,KACX,WAAAC,EAAa,WACb,YAAAC,EAAc,SACd,OAAAC,EAAS,IAAA,EACP7a,EAEE8a,EAAYrd,EAAUod,CAAM,GAAKA,IAAW,GAC5C1T,EAAY,CAAC,EACb4T,MAAa,IAEV,QAAAxb,EAAI,EAAGgJ,EAAMoR,EAAK,OAAQpa,EAAIgJ,EAAK,EAAEhJ,EAAG,CACzC,MAAAmT,EAAOiH,EAAKpa,CAAC,EACbyb,EAAKtI,EAAKgI,CAAQ,EAExB,GAAI,EAAAI,EAAYE,IAAOH,EAAS,CAACpd,EAAUud,CAAE,GAWzC,GAPAD,EAAO,IAAIC,CAAE,EACbtI,EAAaiI,CAAU,EAAII,EAAO,IAAIC,CAAE,GAExCtI,EAAaiI,CAAU,EAAI,CAAC,EAC9BI,EAAO,IAAIC,EAAKtI,EAAaiI,CAAU,CAAC,GAGtCjI,EAAKkI,CAAW,IAAM,CAACE,GAAapI,EAAKkI,CAAW,IAAMC,GAAS,CAC/D,MAAAI,EAAWvI,EAAKkI,CAAW,EAE5BG,EAAO,IAAIE,CAAQ,GACfF,EAAA,IAAIE,EAAU,EAAE,EAGzBF,EAAO,IAAIE,CAAQ,EAAG,KAAKvI,CAAI,CAAA,MAE/BvL,EAAK,KAAKuL,CAAI,CAChB,CAGK,OAAAvL,CACT,CAYO,SAAS+T,GACd/T,EACAnH,EAiBI,GACJ,CACM,KAAA,CACJ,SAAA0a,EAAW,KACX,WAAAC,EAAa,WACb,YAAAC,EAAc,SACd,OAAAC,EAAS,KACT,WAAAM,EAAa,GACb,SAAAC,EAAW,GACX,QAAAC,EAAe9b,GAAAA,EACf,OAAA+b,EAAStc,GACT,SAAAuc,EAAW,GACX,YAAAC,EAAc,EAAA,EACZxb,EAEJ,IAAIyb,EAAU,EAEd,MAAMX,EAAYrd,EAAUod,CAAM,GAAKA,IAAW,GAC5ClB,EAAY,CAAC,EACb+B,EAAO,CAAC,GAAGvU,CAAI,EAErB,KAAOuU,EAAK,QAAQ,CACZ,MAAAhJ,EAAOgJ,EAAK,MAAM,EAElBC,GAAgBjJ,EAAKiI,CAAU,EAC/BiB,GAAgB,MAAM,QAAQD,EAAa,GAAKA,GAAc,OAASA,GAAgB,CAAC,EAE1FP,IAAaI,GAAe,CAAC9I,EAAKgI,CAAQ,KACvChI,EAAAgI,CAAQ,EAAIW,EAAQI,GAAS,GAG9B,MAAAT,GAAKtI,EAAKgI,CAAQ,EAGtBU,GACAR,IACCE,EAAYpI,EAAKkI,CAAW,IAAMC,EAAS,CAACnI,EAAKkI,CAAW,KAE3DlI,EAAakI,CAAW,EAAIC,GAG1B,MAAAgB,GAAeP,EAAO5I,CAAI,EAI5B,GAFAmJ,IAAmBlC,EAAA,KAAKjH,CAAI,EAE5BmJ,IAAgB,CAACN,EAAU,CACpB,QAAAhc,GAAI,EAAGgJ,GAAMqT,GAAS,OAAQrc,GAAIgJ,GAAK,EAAEhJ,GAAG,CAC7C,MAAAuc,GAAQF,GAASrc,EAAC,EAEpB6b,GAAYR,IACdkB,GAAMlB,CAAW,EAAII,IAGtB,CAAAG,GAAcO,EAAK,KAAKI,EAAK,CAAA,CAG5BX,GACGO,EAAA,QAAQ,GAAGE,EAAQ,CAC1B,CACF,CAGK,OAAAjC,CACT,CASO,SAASoC,GACd5U,EACA0P,EACA7W,EAII,CAAA,EACJ,CACA,KAAM,CAAE,WAAA2a,EAAa,WAAuB,WAAAQ,EAAa,EAAU,EAAAnb,EAC7D0b,EAAO,CAAC,GAAGvU,EAAK,IAAIuL,IAAS,CAAE,KAAAA,EAAM,MAAO,EAAG,OAAQ,IAAA,EAAmB,CAAC,EAEjF,KAAOgJ,EAAK,QAAQ,CAClB,KAAM,CAAE,KAAAhJ,EAAM,MAAAsJ,EAAO,OAAA1J,CAAO,EAAIoJ,EAAK,MAAM,EACrCE,EAAWlJ,EAAKiI,CAAU,EAE7B9D,EAAAnE,EAAMsJ,EAAO1J,CAAM,EAElBxT,EAAW8c,CAAQ,GAChBF,EAAAP,EAAa,UAAY,MAAM,EAClC,GAAG,MAAM,KAAKS,CAAQ,EAAE,IAAIE,IAAU,CAAE,KAAMA,EAAO,MAAOE,EAAQ,EAAG,OAAQtJ,GAAO,CACxF,CACF,CAEJ,CAWO,SAASuJ,GACd9U,EACA0P,EACA7W,EAMI,CAAA,EACJ,CACA,KAAM,CAAE,WAAA2a,EAAa,WAAuB,WAAAQ,EAAa,GAAO,cAAAe,EAAgB,IAASlc,EACnFgL,EAAc,CAAC,EACf0Q,EAAO,CAAC,GAAGvU,EAAK,IAAauL,IAAA,CAAE,KAAAA,EAAM,MAAO,EAAG,OAAQ,KAAkB,OAAA1H,CAAA,EAAS,CAAC,EAEzF,KAAO0Q,EAAK,QAAQ,CACZ,KAAA,CAAE,KAAAhJ,EAAM,MAAAsJ,EAAO,OAAA1J,EAAQ,OAAAtH,CAAO,EAAI0Q,EAAK,MAAM,EAC7CE,EAAWlJ,EAAKiI,CAAU,EAC1BwB,EAAUtF,EAAGnE,EAAMsJ,EAAO1J,CAAM,GAAM,CAAC,EAEzC4J,IACMC,EAAAxB,CAAU,EAAI,CAAC,GAGzB3P,EAAO,KAAKmR,CAAO,EAEfrd,EAAW8c,CAAQ,GACP,MAAM,KAAKA,CAAQ,EAEvB,SACAO,EAAAxB,CAAU,EAAI,CAAC,EAClBe,EAAAP,EAAa,UAAY,MAAM,EAClC,GAAG,MAAM,KAAKS,CAAQ,EAAE,IAAcE,IAAA,CACpC,KAAMA,EACN,MAAOE,EAAQ,EACf,OAAQtJ,EACR,OAAQyJ,EAAQxB,CAAU,CAAA,EAC1B,CACJ,EAEJ,CAGK,OAAA3P,CACT,CAWO,SAASoR,GACdjV,EACA0P,EACA7W,EAMI,CAAA,EACJ,CACM,KAAA,CACJ,WAAA2a,EAAa,WACb,SAAA0B,EAAW,GACX,OAAAC,EAAiB5J,GAAA,CAAC5T,EAAW4T,EAAKiI,CAAU,CAAC,CAAA,EAC3C3a,EAEEsb,EAAS,CAAC9I,EAAWwJ,EAAe1J,IACjCE,EACJ,IAAaE,IAAA,CAAE,GAAGA,CAAK,EAAE,EACzB,OAAeA,GAAA,CACR,MAAAkJ,EAAWlJ,EAAKiI,CAAU,EAC1B4B,EAAOD,EAAO5J,CAAI,EAClB8J,EAAQ1d,EAAW8c,CAAQ,GAAK,MAAM,KAAKA,CAAQ,EAErD,GAAAS,GAAY,CAACE,EAAM,CACjB,GAAAC,GAASA,EAAM,OAAQ,CACzB,MAAMC,EAAUnB,EAAOkB,EAAOR,EAAQ,EAAGtJ,CAAI,EAC7C,OAAAA,EAAKiI,CAAU,EAAI8B,EAEZ,CAAC,CAACA,EAAQ,MAAA,CAGZ,MAAA,EAAA,CAGT,MAAMzR,EAAS6L,EAAGnE,EAAMsJ,EAAO1J,CAAM,EAErC,GAAIiK,EAAa,OAAAvR,EACb,GAAA,CAACqR,GAAYrR,EAAe,MAAA,GAE5B,GAAAwR,GAASA,EAAM,OAAQ,CACzB,MAAMC,EAAUnB,EAAOkB,EAAOR,EAAQ,EAAGtJ,CAAI,EAC7C,OAAAA,EAAKiI,CAAU,EAAI8B,EAEZ,CAAC,CAACA,EAAQ,MAAA,CAGZ,OAAAzR,CAAA,CACR,EAGE,OAAAsQ,EAAOnU,EAAM,EAAG,IAAI,CAC7B,CAeA,MAAMuV,GAAoB,CAACC,EAAWC,IAChC,OAAO,MAAM,OAAOD,CAAI,EAAI,OAAOC,CAAI,CAAC,EACnC,OAAOD,CAAI,EAAE,cAAcC,CAAI,EAGjCD,EAAOC,EAWA,SAAAC,GACdlD,EACAU,EACA,CAEE,GAAA,CAACV,EAAK,MACLvb,EAAsBic,CAAK,GAAK,CAACA,EAAM,KACxC,CAAEA,EAAiC,OAE5B,OAAAV,EAGH,MAAAmD,EAAa,MAAM,KAAKnD,CAAI,EAE7B,MAAM,QAAQU,CAAK,IACtBA,EAAQ,CAACA,CAAK,GAGhB,MAAM0C,EAAiB1C,EACpB,IACChd,GACG,OAAOA,GAAU,SACd,CACE,IAAKA,EACL,OAAQqf,GACR,KAAM,KAAA,EAERrf,CAAA,EAEP,IAAaA,IACR,OAAOA,EAAM,UAAa,aAC5BA,EAAM,SAAYmV,GAAYA,EAAKnV,EAAM,GAAG,GAG1C,OAAOA,EAAM,QAAW,aAC1BA,EAAM,OAASqf,IAGXrf,EAAA,OAAS,MAAM,QAAQA,EAAM,MAAM,EAAIA,EAAM,OAAS,CAAC,EAEtDA,EACR,EAEQ,OAAAyf,EAAA,KAAK,CAACH,EAAMC,IAAS,CAC9B,IAAII,EAAa,EAEjB,UAAWzK,KAAQwK,EAAgB,CACjC,KAAM,CAAE,OAAAhG,EAAQ,KAAAzZ,EAAM,SAAAsc,EAAU,OAAAqD,CAAW,EAAA1K,EACrC2K,EAAO5f,IAAS,OAChB0N,EAAS+L,EAAO6C,EAAS+C,EAAM,GAAGM,CAAM,EAAGrD,EAASgD,EAAM,GAAGK,CAAM,CAAC,EAI1E,GAFaD,EAAAE,EAAO,CAAClS,EAASA,EAE1BgS,EAAY,KAAA,CAGX,OAAAA,CAAA,CACR,EAEMF,CACT,CAWO,SAASK,GACdC,EACAC,EACAC,EAAW,GACX,CACYF,EAAAE,EAAWxL,GAAUsL,CAAS,EAAIA,EAE9C,MAAM1B,EAGD,CACH,CACE,OAAQ0B,EACR,OAAQC,CAAA,CAEZ,EAEA,KAAO3B,EAAK,QAAQ,CAClB,KAAM,CAAE,OAAAhD,EAAQ,OAAAhR,GAAWgU,EAAK,IAAI,EAEpC,OAAO,KAAKhU,CAAM,EAAE,QAAelK,GAAA,CAC7BY,EAASsJ,EAAOlK,CAAG,CAAC,GACjBY,EAASsa,EAAOlb,CAAG,CAAC,IACvBkb,EAAOlb,CAAG,EAAW,OAAA,OAAO,IAAI,GAGlCke,EAAK,KAAK,CACR,OAAQhD,EAAOlb,CAAG,EAClB,OAAQkK,EAAOlK,CAAG,CAAA,CACnB,GACQ,MAAM,QAAQkK,EAAOlK,CAAG,CAAC,GAC7B,MAAM,QAAQkb,EAAOlb,CAAG,CAAC,IACrBkb,EAAAlb,CAAG,EAAI,CAAC,GAGjBke,EAAK,KAAK,CACR,OAAQhD,EAAOlb,CAAG,EAClB,OAAQkK,EAAOlK,CAAG,CAAA,CACnB,GAEMkb,EAAAlb,CAAG,EAAIkK,EAAOlK,CAAG,CAC1B,CACD,CAAA,CAGI,OAAA4f,CACT,CASO,SAASG,GAAcC,EAA0B,CAC9CA,EAAA,MAAM,KAAKA,CAAK,EAExB,IAAIC,EAAY,GAEhB,MAAMC,EAAM,IAAM,OACZD,KAEJxgB,EAAAugB,EAAM,UAAN,MAAAvgB,IACMugB,EAAA,QAAU5G,GAAI8G,CAAG,EACzB,EAEI,OAAAA,EAAA,EAEG,IAAOD,EAAY,EAC5B,CC3rBA,SAASE,GAAWtgB,EAAe,CAC3B,MAAAof,EAAUpf,EAAM,MAAM,QAAQ,EAE7B,OAAAof,GAAWA,EAAQ,CAAC,IAAMpf,CACnC,CAGA,MAAMugB,GAAU,yBAiBT,SAASC,GAAYxgB,EAAe,CAKzC,OAAOA,EAAM,QAAQugB,GAAS,KAAK,EAAE,YAAY,CACnD,CAkBO,SAASE,GAAgCzgB,EAAU,CACxD,OAAAA,EAAQA,EAAM,KAAA,EAAO,QAAQ,OAAQ,GAAG,EAChCA,EAAAA,EAAM,QAAQ,UAAW,CAAC0gB,EAAGC,IAAUA,EAAOA,EAAK,YAAY,EAAI,EAAG,GAEtE3gB,EAAM,OAAO,CAAC,EAAE,kBAAsB,EAAAA,EAAM,MAAM,CAAC,GAAG,QAC5D,SACA,EACF,CACF,CASO,SAAS4gB,GAAY5gB,EAAe,CACnC,MAAA6gB,EAAcJ,GAAczgB,CAAK,EAEnC,OAAAsgB,GAAWO,CAAW,EACjBA,EAAY,kBAAkB,EAGhCA,EAAY,OAAO,CAAC,EAAE,cAAgBA,EAAY,MAAM,CAAC,CAClE"}