@extclp/vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 28.4 kB
Source Map (JSON)
{"version":3,"file":"number-input.vue2.mjs","sources":["../../../components/number-input/number-input.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Icon } from '@/components/icon'\nimport { Renderer } from '@/components/renderer'\nimport { useFieldStore } from '@/components/form'\n\nimport { computed, onMounted, ref, toRef, watch } from 'vue'\n\nimport { useHover, useModifier, useTimerRecord } from '@vexip-ui/hooks'\nimport {\n createIconProp,\n createSizeProp,\n createStateProp,\n emitEvent,\n useIcons,\n useLocale,\n useNameHelper,\n useProps\n} from '@vexip-ui/config'\nimport {\n boundRange,\n debounce,\n getGlobalCount,\n isNull,\n isValidNumber,\n minus,\n plus,\n throttle,\n toFixed,\n toNumber\n} from '@vexip-ui/utils'\nimport { numberInputProps } from './props'\n\nimport type { NumberInputSlots } from './symbol'\n\ntype InputEventType = 'input' | 'change'\n\nconst isEmpty = (value: unknown) => !value && value !== 0\nconst isNullOrNaN = (value: unknown) => isNull(value) || Number.isNaN(value)\n\ndefineOptions({ name: 'NumberInput' })\n\nconst {\n idFor,\n labelId,\n state,\n disabled,\n loading,\n size,\n validateField,\n clearField,\n getFieldValue,\n setFieldValue\n} = useFieldStore<number>(focus)\n\nconst _props = defineProps(numberInputProps)\nconst props = useProps('numberInput', _props, {\n size: createSizeProp(size),\n state: createStateProp(state),\n locale: null,\n prefix: createIconProp(),\n prefixColor: '',\n suffix: createIconProp(),\n suffixColor: '',\n // 格式化后显示\n formatter: {\n default: null,\n isFunc: true\n },\n value: {\n default: () => getFieldValue(),\n static: true\n },\n min: -Infinity,\n max: Infinity,\n placeholder: null,\n autofocus: false,\n spellcheck: false,\n autocomplete: false,\n precision: -1,\n readonly: false,\n step: 1,\n ctrlStep: 100,\n shiftStep: 10,\n altStep: 0.1,\n disabled: () => disabled.value,\n controlClass: null,\n debounce: false,\n delay: null,\n clearable: false,\n loading: () => loading.value,\n loadingIcon: createIconProp(),\n loadingLock: false,\n loadingEffect: null,\n sync: false,\n syncStep: false,\n controlType: 'right',\n emptyType: 'NaN',\n controlAttrs: null,\n name: {\n default: '',\n static: true\n },\n slots: () => ({})\n})\n\nconst emit = defineEmits(['update:value'])\n\nconst slots = defineSlots<NumberInputSlots>()\n\nconst nh = useNameHelper('number-input')\nconst locale = useLocale('numberInput', toRef(props, 'locale'))\nconst icons = useIcons()\n\nconst { timeout, interval } = useTimerRecord()\n\nconst focused = ref(false)\nconst currentValue = ref<string | number>(isEmpty(props.value) ? getEmptyValue() : props.value)\nconst inputting = ref(false)\nconst plusHolding = ref(false)\nconst minusHolding = ref(false)\n\nconst control = ref<HTMLInputElement>()\nconst { wrapper, isHover } = useHover()\n\nuseModifier({\n target: control,\n passive: false,\n onKeyDown: (event, modifier) => {\n emitEvent(props.onKeyDown, event)\n\n if (modifier.up || modifier.down) {\n event.preventDefault()\n event.stopPropagation()\n\n if ((modifier.up && plusDisabled.value) || (modifier.down && minusDisabled.value)) {\n return\n }\n\n changeStep(\n modifier.up ? 'plus' : 'minus',\n event.ctrlKey ? 'ctrl' : event.shiftKey ? 'shift' : event.altKey ? 'alt' : undefined\n )\n modifier.resetAll()\n } else if (modifier.enter) {\n event.preventDefault()\n event.stopPropagation()\n emitChangeEvent('change')\n modifier.resetAll()\n }\n },\n onKeyUp: event => {\n emitEvent(props.onKeyUp, event)\n\n if (event.key === 'Enter') {\n handleEnter()\n }\n }\n})\n\nconst idIndex = `${getGlobalCount()}`\n\nlet lastValue: number\n\nconst controlId = computed(() => `${nh.bs(idIndex)}__control`)\nconst outOfRange = computed(() => {\n return (\n !isNullOrNaN(currentValue.value) &&\n (toNumber(currentValue.value) > props.max || toNumber(currentValue.value) < props.min)\n )\n})\nconst isReadonly = computed(() => (props.loading && props.loadingLock) || props.readonly)\nconst plusDisabled = computed(() => {\n return (\n props.disabled ||\n isReadonly.value ||\n (!isNullOrNaN(currentValue.value) && toNumber(currentValue.value) >= props.max)\n )\n})\nconst minusDisabled = computed(() => {\n return (\n props.disabled ||\n isReadonly.value ||\n (!isNullOrNaN(currentValue.value) && toNumber(currentValue.value) <= props.min)\n )\n})\nconst className = computed(() => {\n const [display, fade] = (props.controlType || 'right').split('-')\n\n return [\n nh.b(),\n nh.bs('vars'),\n nh.ns('input-vars'),\n {\n [nh.bm('inherit')]: props.inherit,\n [nh.bm('focused')]: inputting.value,\n [nh.bm('disabled')]: props.disabled,\n [nh.bm('readonly')]: isReadonly.value,\n [nh.bm('loading')]: props.loading,\n [nh.bm(props.size)]: props.size !== 'default',\n [nh.bm(props.state)]: props.state !== 'default',\n [nh.bm(`control-${display}`)]: display !== 'right',\n [nh.bm('control-fade')]: fade,\n [nh.bm('out-of-range')]: outOfRange.value\n }\n ]\n})\nconst hasPrefix = computed(() => {\n return !!(slots.prefix || props.prefix || props.slots.prefix)\n})\nconst hasSuffix = computed(() => {\n return !!(slots.suffix || props.suffix || props.slots.suffix)\n})\nconst preciseNumber = computed(() => {\n return !inputting.value &&\n typeof currentValue.value === 'number' &&\n !Number.isNaN(currentValue.value) &&\n props.precision >= 0\n ? toFixed(currentValue.value, props.precision)\n : currentValue.value\n})\nconst formattedValue = computed(() => {\n if (isNullOrNaN(preciseNumber.value) || typeof preciseNumber.value !== 'number')\n return preciseNumber.value ?? ''\n\n return !inputting.value && typeof props.formatter === 'function'\n ? props.formatter(preciseNumber.value as number)\n : preciseNumber.value.toString()\n})\nconst hasValue = computed(() => !!(currentValue.value || currentValue.value === 0))\nconst showClear = computed(() => {\n return !props.disabled && !isReadonly.value && props.clearable && isHover.value && hasValue.value\n})\nconst autoComplete = computed(() => {\n return typeof props.autocomplete === 'boolean'\n ? props.autocomplete\n ? 'on'\n : 'off'\n : props.autocomplete\n})\n\nconst delay = toNumber(props.delay)\nconst handleInput = props.debounce\n ? debounce(handleChange, delay || 100)\n : throttle(handleChange, delay || 16)\n\nwatch(\n () => props.value,\n value => {\n if (value !== lastValue) {\n parseValue()\n }\n },\n { immediate: true }\n)\nwatch(inputting, value => {\n if (!value) {\n setInputValue(inputting.value ? currentValue.value : formattedValue.value)\n }\n})\n\nonMounted(() => {\n setInputValue(inputting.value ? currentValue.value : formattedValue.value)\n})\n\ndefineExpose({\n idFor,\n focused,\n isHover,\n outOfRange,\n preciseNumber,\n formattedValue,\n isReadonly,\n wrapper,\n input: control,\n focus,\n blur: () => control.value?.blur()\n})\n\nfunction setInputValue(value?: number | string | null) {\n if (control.value) {\n control.value.value = isNullOrNaN(value) ? '' : value!.toString()\n }\n}\n\nfunction boundValueRange(value: number) {\n return boundRange(value, props.min, props.max)\n}\n\nfunction parseValue() {\n let value = props.value\n value = inputting.value ? value : isValidNumber(value, true) ? toNumber(value) : getEmptyValue()\n\n if (props.precision >= 0 && !isNullOrNaN(value)) {\n value = toFixed(boundValueRange(value), props.precision)\n }\n\n currentValue.value = value\n lastValue = value\n\n setInputValue(inputting.value ? value : formattedValue.value)\n}\n\nfunction focus(options?: FocusOptions) {\n control.value?.focus(options)\n}\n\nfunction handleFocus(event: FocusEvent) {\n focused.value = true\n inputting.value = true\n emitEvent(props.onFocus, event)\n}\n\nfunction handleBlur(event: FocusEvent) {\n focused.value = false\n\n setTimeout(() => {\n if (!focused.value) {\n inputting.value = false\n emitEvent(props.onBlur, event)\n emitChangeEvent('change')\n }\n }, 120)\n}\n\nfunction handleHold(type: 'plus' | 'minus', event: PointerEvent) {\n const disabled = type === 'plus' ? plusDisabled : minusDisabled\n const change = type === 'plus' ? plusNumber : minusNumber\n\n if (event.button !== 0 || disabled.value) return\n\n change(event)\n document.addEventListener('pointerup', cancelStep)\n document.addEventListener('touchend', cancelStep)\n clearTimeout(timeout.step)\n clearInterval(interval.step)\n ;(type === 'plus' ? plusHolding : minusHolding).value = true\n\n timeout.step = setTimeout(() => {\n interval.step = setInterval(() => {\n disabled.value ? cancelStep() : change(event)\n }, 32)\n }, 500)\n}\n\nfunction cancelStep() {\n document.removeEventListener('pointerup', cancelStep)\n document.removeEventListener('touchend', cancelStep)\n clearTimeout(timeout.step)\n clearInterval(interval.step)\n\n plusHolding.value = false\n minusHolding.value = false\n}\n\nfunction plusNumber(event: PointerEvent) {\n !focused.value && focus()\n changeStep(\n 'plus',\n event.ctrlKey ? 'ctrl' : event.shiftKey ? 'shift' : event.altKey ? 'alt' : undefined\n )\n}\n\nfunction minusNumber(event: PointerEvent) {\n !focused.value && focus()\n changeStep(\n 'minus',\n event.ctrlKey ? 'ctrl' : event.shiftKey ? 'shift' : event.altKey ? 'alt' : undefined\n )\n}\n\nfunction changeStep(type: 'plus' | 'minus', modifier?: 'ctrl' | 'shift' | 'alt') {\n if (props.disabled || isReadonly.value) return\n\n let value = currentValue.value || 0\n let step!: number\n\n switch (modifier) {\n case 'ctrl':\n step = props.ctrlStep\n break\n case 'shift':\n step = props.shiftStep\n break\n case 'alt':\n step = props.altStep\n break\n default:\n step = props.step\n }\n\n const stringValue = value.toString().trim()\n\n if (stringValue.endsWith('.')) {\n value = toNumber(stringValue.slice(0, -1))\n }\n\n if (type === 'plus') {\n value = plus(value, step)\n } else {\n value = minus(value, step)\n }\n\n setValue(value, props.syncStep && !props.sync ? 'change' : 'input')\n}\n\nfunction handleChange(event: Event) {\n const type = event.type as InputEventType\n const stringValue = (event.target as HTMLInputElement).value\n\n let value = stringValue.trim()\n\n // to rollback invalid value to empty in `<input>` when change\n if (type === 'change' && stringValue && !isValidNumber(stringValue, true)) {\n const floatValue = parseFloat(stringValue)\n\n if (Number.isNaN(floatValue)) {\n value = ''\n } else {\n value = floatValue.toString()\n }\n }\n\n inputting.value = type === 'input'\n\n setValue(value, type)\n}\n\nfunction setValue(value: string | number, type: InputEventType, sync = props.sync) {\n if (type !== 'input') {\n currentValue.value = isEmpty(value) ? getEmptyValue() : toNumber(value)\n } else {\n currentValue.value = value\n }\n\n setInputValue(currentValue.value)\n emitChangeEvent(type, sync)\n}\n\nfunction getEmptyValue() {\n switch (props.emptyType) {\n case 'undefined':\n return undefined! as number\n case 'null':\n return null! as number\n default:\n return NaN\n }\n}\n\nfunction emitChangeEvent(type: InputEventType, sync = props.sync) {\n type = type === 'input' ? 'input' : 'change'\n\n if (type === 'change') {\n const empty = isEmpty(currentValue.value)\n const value = empty ? getEmptyValue() : toNumber(currentValue.value)\n\n let boundValue = empty ? value : boundValueRange(toNumber(value))\n\n if (!empty && props.precision >= 0) {\n boundValue = toFixed(boundValue, props.precision)\n }\n\n const changed = !Object.is(boundValue, value)\n\n if (!empty) {\n currentValue.value = boundValue\n }\n\n if (!sync && Object.is(lastValue, boundValue)) {\n !Object.is(props.value, value) && emit('update:value', boundValue)\n return\n }\n\n lastValue = boundValue\n\n if (!sync || changed) {\n emit('update:value', boundValue)\n setFieldValue(boundValue)\n }\n\n emitEvent(props.onChange, boundValue)\n\n if (!sync || changed) {\n validateField()\n }\n } else {\n const value = parseFloat(currentValue.value as string)\n const empty = Number.isNaN(value)\n\n let boundValue = empty ? getEmptyValue() : boundValueRange(toNumber(value))\n\n if (!empty && props.precision >= 0) {\n boundValue = toFixed(boundValue, props.precision)\n }\n\n const emitUpdate = sync && !Object.is(lastValue, boundValue)\n\n if (emitUpdate) {\n lastValue = boundValue\n\n emit('update:value', boundValue)\n setFieldValue(boundValue)\n }\n\n emitEvent(props.onInput, value)\n\n if (emitUpdate) {\n validateField()\n }\n }\n}\n\nfunction handleClear() {\n if (props.disabled || isReadonly.value) return\n\n setValue(NaN, 'change', false)\n emitEvent(props.onClear)\n clearField()\n focus()\n}\n\nfunction handleEnter() {\n emitEvent(props.onEnter)\n}\n\nfunction handlePrefixClick(event: MouseEvent) {\n emitEvent(props.onPrefixClick, event)\n}\n\nfunction handleSuffixClick(event: MouseEvent) {\n emitEvent(props.onSuffixClick, event)\n}\n\nfunction handleKeyPress(event: KeyboardEvent) {\n emitEvent(props.onKeyPress, event)\n}\n</script>\n\n<template>\n <div\n :id=\"idFor\"\n ref=\"wrapper\"\n :class=\"className\"\n role=\"group\"\n @click=\"control?.focus()\"\n >\n <div\n v-if=\"hasPrefix\"\n :class=\"[nh.be('icon'), nh.be('prefix')]\"\n :style=\"{ color: props.prefixColor }\"\n @click=\"handlePrefixClick\"\n >\n <slot name=\"prefix\">\n <Renderer :renderer=\"props.slots.prefix\">\n <Icon :icon=\"props.prefix\"></Icon>\n </Renderer>\n </slot>\n </div>\n <input\n v-bind=\"props.controlAttrs\"\n :id=\"controlId\"\n ref=\"control\"\n :class=\"[nh.be('control'), props.controlAttrs?.class, props.controlClass]\"\n type=\"text\"\n :autofocus=\"props.autofocus\"\n :autocomplete=\"autoComplete\"\n :spellcheck=\"props.spellcheck\"\n :disabled=\"props.disabled\"\n :readonly=\"isReadonly\"\n :placeholder=\"props.placeholder ?? locale.placeholder\"\n :name=\"props.name || props.controlAttrs?.name\"\n role=\"spinbutton\"\n :title=\"outOfRange ? locale.outOfRange : undefined\"\n :aria-valuenow=\"preciseNumber\"\n :aria-valuemin=\"props.min !== -Infinity ? props.min : undefined\"\n :aria-valuemax=\"props.max !== Infinity ? props.max : undefined\"\n :aria-labelledby=\"labelId\"\n @submit.prevent\n @blur=\"handleBlur\"\n @focus=\"handleFocus\"\n @keypress=\"handleKeyPress\"\n @input=\"handleInput\"\n @change=\"handleChange\"\n />\n <div\n v-if=\"hasSuffix\"\n :class=\"[nh.be('icon'), nh.be('suffix')]\"\n :style=\"{\n color: props.suffixColor,\n opacity: showClear || props.loading ? '0%' : ''\n }\"\n @click=\"handleSuffixClick\"\n >\n <slot name=\"suffix\">\n <Renderer :renderer=\"props.slots.suffix\">\n <Icon :icon=\"props.suffix\"></Icon>\n </Renderer>\n </slot>\n </div>\n <div\n v-else-if=\"props.clearable || props.loading\"\n :class=\"[nh.be('icon'), nh.bem('icon', 'placeholder'), nh.be('suffix')]\"\n ></div>\n <Transition :name=\"nh.ns('fade')\" appear>\n <button\n v-if=\"showClear\"\n :class=\"[nh.be('icon'), nh.be('clear')]\"\n type=\"button\"\n tabindex=\"-1\"\n :aria-label=\"locale.ariaLabel.clear\"\n @click.stop=\"handleClear\"\n >\n <Icon v-bind=\"icons.clear\" label=\"clear\"></Icon>\n </button>\n <div v-else-if=\"props.loading\" :class=\"[nh.be('icon'), nh.be('loading')]\">\n <Icon\n v-bind=\"icons.loading\"\n :effect=\"props.loadingEffect || icons.loading.effect\"\n :icon=\"props.loadingIcon || icons.loading.icon\"\n label=\"loading\"\n ></Icon>\n </div>\n </Transition>\n <template v-if=\"props.controlType !== 'none'\">\n <div\n :class=\"{\n [nh.be('plus')]: true,\n [nh.bem('plus', 'disabled')]: plusDisabled,\n [nh.bem('plus', 'holding')]: plusHolding\n }\"\n role=\"button\"\n :aria-label=\"locale.ariaLabel.increase\"\n :aria-labelledby=\"labelId\"\n :aria-controls=\"controlId\"\n @pointerdown.prevent=\"handleHold('plus', $event)\"\n @mousedown.prevent\n @touchstart.prevent\n >\n <Icon v-bind=\"icons.angleUp\" :scale=\"+(icons.angleUp.scale || 1) * 0.8\"></Icon>\n </div>\n <div\n :class=\"{\n [nh.be('minus')]: true,\n [nh.bem('minus', 'disabled')]: minusDisabled,\n [nh.bem('minus', 'holding')]: minusHolding\n }\"\n :aria-label=\"locale.ariaLabel.decrease\"\n :aria-labelledby=\"labelId\"\n :aria-controls=\"controlId\"\n @pointerdown.prevent=\"handleHold('minus', $event)\"\n @mousedown.prevent\n @touchstart.prevent\n >\n <Icon v-bind=\"icons.angleDown\" :scale=\"+(icons.angleDown.scale || 1) * 0.8\"></Icon>\n </div>\n </template>\n </div>\n</template>\n"],"names":["isEmpty","value","isNullOrNaN","isNull","idFor","labelId","state","disabled","loading","size","validateField","clearField","getFieldValue","setFieldValue","useFieldStore","focus","props","useProps","__props","createSizeProp","createStateProp","createIconProp","emit","__emit","slots","_useSlots","nh","useNameHelper","locale","useLocale","toRef","icons","useIcons","timeout","interval","useTimerRecord","focused","ref","currentValue","getEmptyValue","inputting","plusHolding","minusHolding","control","wrapper","isHover","useHover","useModifier","event","modifier","emitEvent","plusDisabled","minusDisabled","changeStep","emitChangeEvent","handleEnter","idIndex","getGlobalCount","lastValue","controlId","computed","outOfRange","toNumber","isReadonly","className","display","fade","hasPrefix","hasSuffix","preciseNumber","toFixed","formattedValue","hasValue","showClear","autoComplete","delay","handleInput","debounce","handleChange","throttle","watch","parseValue","setInputValue","onMounted","__expose","_a","boundValueRange","boundRange","isValidNumber","options","handleFocus","handleBlur","handleHold","type","change","plusNumber","minusNumber","cancelStep","step","stringValue","plus","minus","setValue","floatValue","sync","empty","boundValue","changed","emitUpdate","handleClear","handlePrefixClick","handleSuffixClick","handleKeyPress"],"mappings":";;;;;;;;;;;;;;;;;AAoCA,UAAMA,IAAU,CAACC,MAAmB,CAACA,KAASA,MAAU,GAClDC,IAAc,CAACD,MAAmBE,GAAOF,CAAK,KAAK,OAAO,MAAMA,CAAK,GAIrE;AAAA,MACJ,OAAAG;AAAA,MACA,SAAAC;AAAA,MACA,OAAAC;AAAA,MACA,UAAAC;AAAA,MACA,SAAAC;AAAA,MACA,MAAAC;AAAA,MACA,eAAAC;AAAA,MACA,YAAAC;AAAA,MACA,eAAAC;AAAA,MACA,eAAAC;AAAA,IAAA,IACEC,GAAsBC,CAAK,GAGzBC,IAAQC,GAAS,eADRC,IAC+B;AAAA,MAC5C,MAAMC,GAAeV,EAAI;AAAA,MACzB,OAAOW,GAAgBd,EAAK;AAAA,MAC5B,QAAQ;AAAA,MACR,QAAQe,GAAe;AAAA,MACvB,aAAa;AAAA,MACb,QAAQA,GAAe;AAAA,MACvB,aAAa;AAAA;AAAA,MAEb,WAAW;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,SAAS,MAAMT,GAAc;AAAA,QAC7B,QAAQ;AAAA,MACV;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,aAAa;AAAA,MACb,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,WAAW;AAAA,MACX,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,WAAW;AAAA,MACX,SAAS;AAAA,MACT,UAAU,MAAML,GAAS;AAAA,MACzB,cAAc;AAAA,MACd,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,MACX,SAAS,MAAMC,GAAQ;AAAA,MACvB,aAAaa,GAAe;AAAA,MAC5B,aAAa;AAAA,MACb,eAAe;AAAA,MACf,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa;AAAA,MACb,WAAW;AAAA,MACX,cAAc;AAAA,MACd,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,MACA,OAAO,OAAO,CAAC;AAAA,IAAA,CAChB,GAEKC,IAAOC,IAEPC,KAAQC,GAAA,GAERC,IAAKC,GAAc,cAAc,GACjCC,IAASC,GAAU,eAAeC,GAAMd,GAAO,QAAQ,CAAC,GACxDe,IAAQC,GAAS,GAEjB,EAAE,SAAAC,GAAS,UAAAC,EAAS,IAAIC,GAAe,GAEvCC,IAAUC,EAAI,EAAK,GACnBC,IAAeD,EAAqBrC,EAAQgB,EAAM,KAAK,IAAIuB,EAAA,IAAkBvB,EAAM,KAAK,GACxFwB,IAAYH,EAAI,EAAK,GACrBI,IAAcJ,EAAI,EAAK,GACvBK,IAAeL,EAAI,EAAK,GAExBM,IAAUN,EAAsB,GAChC,EAAE,SAAAO,IAAS,SAAAC,GAAQ,IAAIC,GAAS;AAE1B,IAAAC,GAAA;AAAA,MACV,QAAQJ;AAAA,MACR,SAAS;AAAA,MACT,WAAW,CAACK,GAAOC,MAAa;AAG1B,YAFMC,EAAAlC,EAAM,WAAWgC,CAAK,GAE5BC,EAAS,MAAMA,EAAS,MAAM;AAIhC,cAHAD,EAAM,eAAe,GACrBA,EAAM,gBAAgB,GAEjBC,EAAS,MAAME,EAAa,SAAWF,EAAS,QAAQG,EAAc;AACzE;AAGF,UAAAC;AAAA,YACEJ,EAAS,KAAK,SAAS;AAAA,YACvBD,EAAM,UAAU,SAASA,EAAM,WAAW,UAAUA,EAAM,SAAS,QAAQ;AAAA,UAC7E,GACAC,EAAS,SAAS;AAAA,QAAA,MACpB,CAAWA,EAAS,UAClBD,EAAM,eAAe,GACrBA,EAAM,gBAAgB,GACtBM,EAAgB,QAAQ,GACxBL,EAAS,SAAS;AAAA,MAEtB;AAAA,MACA,SAAS,CAASD,MAAA;AACN,QAAAE,EAAAlC,EAAM,SAASgC,CAAK,GAE1BA,EAAM,QAAQ,WACJO,GAAA;AAAA,MACd;AAAA,IACF,CACD;AAEK,UAAAC,KAAU,GAAGC,GAAA,CAAgB;AAE/B,QAAAC;AAEE,UAAAC,IAAYC,EAAS,MAAM,GAAGlC,EAAG,GAAG8B,EAAO,CAAC,WAAW,GACvDK,IAAaD,EAAS,MAExB,CAAC1D,EAAYoC,EAAa,KAAK,MAC9BwB,EAASxB,EAAa,KAAK,IAAItB,EAAM,OAAO8C,EAASxB,EAAa,KAAK,IAAItB,EAAM,IAErF,GACK+C,IAAaH,EAAS,MAAO5C,EAAM,WAAWA,EAAM,eAAgBA,EAAM,QAAQ,GAClFmC,IAAeS,EAAS,MAE1B5C,EAAM,YACN+C,EAAW,SACV,CAAC7D,EAAYoC,EAAa,KAAK,KAAKwB,EAASxB,EAAa,KAAK,KAAKtB,EAAM,GAE9E,GACKoC,IAAgBQ,EAAS,MAE3B5C,EAAM,YACN+C,EAAW,SACV,CAAC7D,EAAYoC,EAAa,KAAK,KAAKwB,EAASxB,EAAa,KAAK,KAAKtB,EAAM,GAE9E,GACKgD,KAAYJ,EAAS,MAAM;AACzB,YAAA,CAACK,GAASC,CAAI,KAAKlD,EAAM,eAAe,SAAS,MAAM,GAAG;AAEzD,aAAA;AAAA,QACLU,EAAG,EAAE;AAAA,QACLA,EAAG,GAAG,MAAM;AAAA,QACZA,EAAG,GAAG,YAAY;AAAA,QAClB;AAAA,UACE,CAACA,EAAG,GAAG,SAAS,CAAC,GAAGV,EAAM;AAAA,UAC1B,CAACU,EAAG,GAAG,SAAS,CAAC,GAAGc,EAAU;AAAA,UAC9B,CAACd,EAAG,GAAG,UAAU,CAAC,GAAGV,EAAM;AAAA,UAC3B,CAACU,EAAG,GAAG,UAAU,CAAC,GAAGqC,EAAW;AAAA,UAChC,CAACrC,EAAG,GAAG,SAAS,CAAC,GAAGV,EAAM;AAAA,UAC1B,CAACU,EAAG,GAAGV,EAAM,IAAI,CAAC,GAAGA,EAAM,SAAS;AAAA,UACpC,CAACU,EAAG,GAAGV,EAAM,KAAK,CAAC,GAAGA,EAAM,UAAU;AAAA,UACtC,CAACU,EAAG,GAAG,WAAWuC,CAAO,EAAE,CAAC,GAAGA,MAAY;AAAA,UAC3C,CAACvC,EAAG,GAAG,cAAc,CAAC,GAAGwC;AAAA,UACzB,CAACxC,EAAG,GAAG,cAAc,CAAC,GAAGmC,EAAW;AAAA,QAAA;AAAA,MAExC;AAAA,IAAA,CACD,GACKM,KAAYP,EAAS,MAClB,CAAC,EAAEpC,GAAM,UAAUR,EAAM,UAAUA,EAAM,MAAM,OACvD,GACKoD,KAAYR,EAAS,MAClB,CAAC,EAAEpC,GAAM,UAAUR,EAAM,UAAUA,EAAM,MAAM,OACvD,GACKqD,IAAgBT,EAAS,MACtB,CAACpB,EAAU,SAChB,OAAOF,EAAa,SAAU,YAC9B,CAAC,OAAO,MAAMA,EAAa,KAAK,KAChCtB,EAAM,aAAa,IACjBsD,EAAQhC,EAAa,OAAOtB,EAAM,SAAS,IAC3CsB,EAAa,KAClB,GACKiC,IAAiBX,EAAS,MAC1B1D,EAAYmE,EAAc,KAAK,KAAK,OAAOA,EAAc,SAAU,WAC9DA,EAAc,SAAS,KAEzB,CAAC7B,EAAU,SAAS,OAAOxB,EAAM,aAAc,aAClDA,EAAM,UAAUqD,EAAc,KAAe,IAC7CA,EAAc,MAAM,SAAS,CAClC,GACKG,KAAWZ,EAAS,MAAM,CAAC,EAAEtB,EAAa,SAASA,EAAa,UAAU,EAAE,GAC5EmC,KAAYb,EAAS,MAClB,CAAC5C,EAAM,YAAY,CAAC+C,EAAW,SAAS/C,EAAM,aAAa6B,GAAQ,SAAS2B,GAAS,KAC7F,GACKE,KAAed,EAAS,MACrB,OAAO5C,EAAM,gBAAiB,YACjCA,EAAM,eACJ,OACA,QACFA,EAAM,YACX,GAEK2D,KAAQb,EAAS9C,EAAM,KAAK,GAC5B4D,KAAc5D,EAAM,WACtB6D,GAASC,GAAcH,MAAS,GAAG,IACnCI,GAASD,GAAcH,MAAS,EAAE;AAEtC,IAAAK;AAAA,MACE,MAAMhE,EAAM;AAAA,MACZ,CAASf,MAAA;AACP,QAAIA,MAAUyD,KACDuB,GAAA;AAAA,MAEf;AAAA,MACA,EAAE,WAAW,GAAK;AAAA,IACpB,GACAD,GAAMxC,GAAW,CAASvC,MAAA;AACxB,MAAKA,KACHiF,EAAc1C,EAAU,QAAQF,EAAa,QAAQiC,EAAe,KAAK;AAAA,IAC3E,CACD,GAEDY,GAAU,MAAM;AACd,MAAAD,EAAc1C,EAAU,QAAQF,EAAa,QAAQiC,EAAe,KAAK;AAAA,IAAA,CAC1E,GAEYa,GAAA;AAAA,MACX,OAAAhF;AAAA,MACA,SAAAgC;AAAA,MACA,SAAAS;AAAA,MACA,YAAAgB;AAAA,MACA,eAAAQ;AAAA,MACA,gBAAAE;AAAA,MACA,YAAAR;AAAA,MACA,SAAAnB;AAAA,MACA,OAAOD;AAAA,MACP,OAAA5B;AAAA,MACA,MAAM,MAAA;;AAAM,gBAAAsE,IAAA1C,EAAQ,UAAR,gBAAA0C,EAAe;AAAA;AAAA,IAAK,CACjC;AAED,aAASH,EAAcjF,GAAgC;AACrD,MAAI0C,EAAQ,UACVA,EAAQ,MAAM,QAAQzC,EAAYD,CAAK,IAAI,KAAKA,EAAO,SAAS;AAAA,IAClE;AAGF,aAASqF,EAAgBrF,GAAe;AACtC,aAAOsF,GAAWtF,GAAOe,EAAM,KAAKA,EAAM,GAAG;AAAA,IAAA;AAG/C,aAASiE,KAAa;AACpB,UAAIhF,IAAQe,EAAM;AACV,MAAAf,IAAAuC,EAAU,QAAQvC,IAAQuF,GAAcvF,GAAO,EAAI,IAAI6D,EAAS7D,CAAK,IAAIsC,EAAc,GAE3FvB,EAAM,aAAa,KAAK,CAACd,EAAYD,CAAK,MAC5CA,IAAQqE,EAAQgB,EAAgBrF,CAAK,GAAGe,EAAM,SAAS,IAGzDsB,EAAa,QAAQrC,GACTyD,IAAAzD,GAEZiF,EAAc1C,EAAU,QAAQvC,IAAQsE,EAAe,KAAK;AAAA,IAAA;AAG9D,aAASxD,EAAM0E,GAAwB;;AAC7B,OAAAJ,IAAA1C,EAAA,UAAA,QAAA0C,EAAO,MAAMI;AAAA,IAAO;AAG9B,aAASC,GAAY1C,GAAmB;AACtC,MAAAZ,EAAQ,QAAQ,IAChBI,EAAU,QAAQ,IACRU,EAAAlC,EAAM,SAASgC,CAAK;AAAA,IAAA;AAGhC,aAAS2C,GAAW3C,GAAmB;AACrC,MAAAZ,EAAQ,QAAQ,IAEhB,WAAW,MAAM;AACX,QAACA,EAAQ,UACXI,EAAU,QAAQ,IACRU,EAAAlC,EAAM,QAAQgC,CAAK,GAC7BM,EAAgB,QAAQ;AAAA,SAEzB,GAAG;AAAA,IAAA;AAGC,aAAAsC,GAAWC,GAAwB7C,GAAqB;AACzDzC,YAAAA,IAAWsF,MAAS,SAAS1C,IAAeC,GAC5C0C,IAASD,MAAS,SAASE,KAAaC;AAE9C,MAAIhD,EAAM,WAAW,KAAKzC,EAAS,UAEnCuF,EAAO9C,CAAK,GACH,SAAA,iBAAiB,aAAaiD,CAAU,GACxC,SAAA,iBAAiB,YAAYA,CAAU,GAChD,aAAahE,EAAQ,IAAI,GACzB,cAAcC,EAAS,IAAI,IACzB2D,MAAS,SAASpD,IAAcC,GAAc,QAAQ,IAEhDT,EAAA,OAAO,WAAW,MAAM;AACrB,QAAAC,EAAA,OAAO,YAAY,MAAM;AAChC3B,UAAAA,EAAS,QAAQ0F,MAAeH,EAAO9C,CAAK;AAAA,WAC3C,EAAE;AAAA,SACJ,GAAG;AAAA,IAAA;AAGR,aAASiD,IAAa;AACX,eAAA,oBAAoB,aAAaA,CAAU,GAC3C,SAAA,oBAAoB,YAAYA,CAAU,GACnD,aAAahE,EAAQ,IAAI,GACzB,cAAcC,EAAS,IAAI,GAE3BO,EAAY,QAAQ,IACpBC,EAAa,QAAQ;AAAA,IAAA;AAGvB,aAASqD,GAAW/C,GAAqB;AACtC,OAAAZ,EAAQ,SAASrB,EAAM,GACxBsC;AAAA,QACE;AAAA,QACAL,EAAM,UAAU,SAASA,EAAM,WAAW,UAAUA,EAAM,SAAS,QAAQ;AAAA,MAC7E;AAAA,IAAA;AAGF,aAASgD,GAAYhD,GAAqB;AACvC,OAAAZ,EAAQ,SAASrB,EAAM,GACxBsC;AAAA,QACE;AAAA,QACAL,EAAM,UAAU,SAASA,EAAM,WAAW,UAAUA,EAAM,SAAS,QAAQ;AAAA,MAC7E;AAAA,IAAA;AAGO,aAAAK,EAAWwC,GAAwB5C,GAAqC;AAC3E,UAAAjC,EAAM,YAAY+C,EAAW,MAAO;AAEpC,UAAA9D,IAAQqC,EAAa,SAAS,GAC9B4D;AAEJ,cAAQjD,GAAU;AAAA,QAChB,KAAK;AACH,UAAAiD,IAAOlF,EAAM;AACb;AAAA,QACF,KAAK;AACH,UAAAkF,IAAOlF,EAAM;AACb;AAAA,QACF,KAAK;AACH,UAAAkF,IAAOlF,EAAM;AACb;AAAA,QACF;AACE,UAAAkF,IAAOlF,EAAM;AAAA,MAAA;AAGjB,YAAMmF,IAAclG,EAAM,SAAS,EAAE,KAAK;AAEtC,MAAAkG,EAAY,SAAS,GAAG,MAC1BlG,IAAQ6D,EAASqC,EAAY,MAAM,GAAG,EAAE,CAAC,IAGvCN,MAAS,SACH5F,IAAAmG,GAAKnG,GAAOiG,CAAI,IAEhBjG,IAAAoG,GAAMpG,GAAOiG,CAAI,GAG3BI,EAASrG,GAAOe,EAAM,YAAY,CAACA,EAAM,OAAO,WAAW,OAAO;AAAA,IAAA;AAGpE,aAAS8D,EAAa9B,GAAc;AAClC,YAAM6C,IAAO7C,EAAM,MACbmD,IAAenD,EAAM,OAA4B;AAEnD,UAAA/C,IAAQkG,EAAY,KAAK;AAG7B,UAAIN,MAAS,YAAYM,KAAe,CAACX,GAAcW,GAAa,EAAI,GAAG;AACnE,cAAAI,IAAa,WAAWJ,CAAW;AAErC,QAAA,OAAO,MAAMI,CAAU,IACjBtG,IAAA,KAERA,IAAQsG,EAAW,SAAS;AAAA,MAC9B;AAGF,MAAA/D,EAAU,QAAQqD,MAAS,SAE3BS,EAASrG,GAAO4F,CAAI;AAAA,IAAA;AAGtB,aAASS,EAASrG,GAAwB4F,GAAsBW,IAAOxF,EAAM,MAAM;AACjF,MAAI6E,MAAS,UACXvD,EAAa,QAAQtC,EAAQC,CAAK,IAAIsC,EAAc,IAAIuB,EAAS7D,CAAK,IAEtEqC,EAAa,QAAQrC,GAGvBiF,EAAc5C,EAAa,KAAK,GAChCgB,EAAgBuC,GAAMW,CAAI;AAAA,IAAA;AAG5B,aAASjE,IAAgB;AACvB,cAAQvB,EAAM,WAAW;AAAA,QACvB,KAAK;AACI;AAAA,QACT,KAAK;AACI,iBAAA;AAAA,QACT;AACS,iBAAA;AAAA,MAAA;AAAA,IACX;AAGF,aAASsC,EAAgBuC,GAAsBW,IAAOxF,EAAM,MAAM;AAGhE,UAFO6E,IAAAA,MAAS,UAAU,UAAU,UAEhCA,MAAS,UAAU;AACf,cAAAY,IAAQzG,EAAQsC,EAAa,KAAK,GAClCrC,IAAQwG,IAAQlE,EAAkB,IAAAuB,EAASxB,EAAa,KAAK;AAEnE,YAAIoE,IAAaD,IAAQxG,IAAQqF,EAAgBxB,EAAS7D,CAAK,CAAC;AAEhE,QAAI,CAACwG,KAASzF,EAAM,aAAa,MAClB0F,IAAApC,EAAQoC,GAAY1F,EAAM,SAAS;AAGlD,cAAM2F,IAAU,CAAC,OAAO,GAAGD,GAAYzG,CAAK;AAM5C,YAJKwG,MACHnE,EAAa,QAAQoE,IAGnB,CAACF,KAAQ,OAAO,GAAG9C,GAAWgD,CAAU,GAAG;AAC5C,WAAA,OAAO,GAAG1F,EAAM,OAAOf,CAAK,KAAKqB,EAAK,gBAAgBoF,CAAU;AACjE;AAAA,QAAA;AAGU,QAAAhD,IAAAgD,IAER,CAACF,KAAQG,OACXrF,EAAK,gBAAgBoF,CAAU,GAC/B7F,GAAc6F,CAAU,IAGhBxD,EAAAlC,EAAM,UAAU0F,CAAU,IAEhC,CAACF,KAAQG,MACGjG,GAAA;AAAA,MAChB,OACK;AACC,cAAAT,IAAQ,WAAWqC,EAAa,KAAe,GAC/CmE,IAAQ,OAAO,MAAMxG,CAAK;AAEhC,YAAIyG,IAAaD,IAAQlE,EAAA,IAAkB+C,EAAgBxB,EAAS7D,CAAK,CAAC;AAE1E,QAAI,CAACwG,KAASzF,EAAM,aAAa,MAClB0F,IAAApC,EAAQoC,GAAY1F,EAAM,SAAS;AAGlD,cAAM4F,IAAaJ,KAAQ,CAAC,OAAO,GAAG9C,GAAWgD,CAAU;AAE3D,QAAIE,MACUlD,IAAAgD,GAEZpF,EAAK,gBAAgBoF,CAAU,GAC/B7F,GAAc6F,CAAU,IAGhBxD,EAAAlC,EAAM,SAASf,CAAK,GAE1B2G,KACYlG,GAAA;AAAA,MAChB;AAAA,IACF;AAGF,aAASmG,KAAc;AACjB,MAAA7F,EAAM,YAAY+C,EAAW,UAExBuC,EAAA,KAAK,UAAU,EAAK,GAC7BpD,EAAUlC,EAAM,OAAO,GACZL,GAAA,GACLI,EAAA;AAAA,IAAA;AAGR,aAASwC,KAAc;AACrB,MAAAL,EAAUlC,EAAM,OAAO;AAAA,IAAA;AAGzB,aAAS8F,GAAkB9D,GAAmB;AAClC,MAAAE,EAAAlC,EAAM,eAAegC,CAAK;AAAA,IAAA;AAGtC,aAAS+D,GAAkB/D,GAAmB;AAClC,MAAAE,EAAAlC,EAAM,eAAegC,CAAK;AAAA,IAAA;AAGtC,aAASgE,GAAehE,GAAsB;AAClC,MAAAE,EAAAlC,EAAM,YAAYgC,CAAK;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}