UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 30.3 kB
{"version":3,"file":"tab-nav.mjs","sources":["../../../../../../packages/components/tabs/src/tab-nav.tsx"],"sourcesContent":["import {\n computed,\n defineComponent,\n inject,\n nextTick,\n onMounted,\n onUpdated,\n ref,\n shallowRef,\n triggerRef,\n watch,\n} from 'vue'\nimport {\n useDocumentVisibility,\n useElementSize,\n useResizeObserver,\n useWindowFocus,\n} from '@vueuse/core'\nimport {\n buildProps,\n capitalize,\n definePropType,\n getEventCode,\n mutable,\n rAF,\n throwError,\n} from '@element-plus/utils'\nimport { EVENT_CODE } from '@element-plus/constants'\nimport { ElIcon } from '@element-plus/components/icon'\nimport { ArrowLeft, ArrowRight, Close } from '@element-plus/icons-vue'\nimport { useNamespace } from '@element-plus/hooks'\nimport useWheel from '@element-plus/components/virtual-list/src/hooks/use-wheel'\nimport { clamp } from 'lodash-unified'\nimport TabBar from './tab-bar.vue'\nimport { tabsRootContextKey } from './constants'\n\nimport type {\n CSSProperties,\n ComponentPublicInstance,\n ExtractPropTypes,\n ExtractPublicPropTypes,\n} from 'vue'\nimport type { TabBarInstance } from './tab-bar'\nimport type { TabPaneName, TabsPaneContext } from './constants'\n\ninterface Scrollable {\n next?: boolean\n prev?: number\n}\n\nexport const tabNavProps = buildProps({\n panes: {\n type: definePropType<TabsPaneContext[]>(Array),\n default: () => mutable([] as const),\n },\n currentName: {\n type: [String, Number],\n default: '',\n },\n editable: Boolean,\n type: {\n type: String,\n values: ['card', 'border-card', ''],\n default: '',\n },\n stretch: Boolean,\n /**\n * @description tab-nav tabindex\n */\n tabindex: {\n type: [String, Number],\n default: undefined,\n },\n} as const)\n\nexport const tabNavEmits = {\n tabClick: (tab: TabsPaneContext, tabName: TabPaneName, ev: Event) =>\n ev instanceof Event,\n tabRemove: (tab: TabsPaneContext, ev: Event) => ev instanceof Event,\n}\n\nexport type TabNavProps = ExtractPropTypes<typeof tabNavProps>\nexport type TabNavPropsPublic = ExtractPublicPropTypes<typeof tabNavProps>\nexport type TabNavEmits = typeof tabNavEmits\n\nconst COMPONENT_NAME = 'ElTabNav'\nconst TabNav = defineComponent({\n name: COMPONENT_NAME,\n props: tabNavProps,\n emits: tabNavEmits,\n setup(props, { expose, emit }) {\n const rootTabs = inject(tabsRootContextKey)\n if (!rootTabs) throwError(COMPONENT_NAME, `<el-tabs><tab-nav /></el-tabs>`)\n\n const ns = useNamespace('tabs')\n const visibility = useDocumentVisibility()\n const focused = useWindowFocus()\n\n const navScroll$ = ref<HTMLDivElement>()\n const nav$ = ref<HTMLDivElement>()\n const el$ = ref<HTMLDivElement>()\n const tabRefsMap = ref<{ [key: TabPaneName]: HTMLDivElement }>({})\n\n const tabBarRef = ref<TabBarInstance>()\n\n const scrollable = ref<false | Scrollable>(false)\n const navOffset = ref(0)\n const isFocus = ref(false)\n const focusable = ref(true)\n const tracker = shallowRef()\n\n const isHorizontal = computed(() =>\n ['top', 'bottom'].includes(rootTabs.props.tabPosition)\n )\n\n const sizeName = computed(() => (isHorizontal.value ? 'width' : 'height'))\n const navStyle = computed<CSSProperties>(() => {\n const dir = sizeName.value === 'width' ? 'X' : 'Y'\n return {\n transform: `translate${dir}(-${navOffset.value}px)`,\n }\n })\n\n const { width: navContainerWidth, height: navContainerHeight } =\n useElementSize(navScroll$)\n const { width: navWidth, height: navHeight } = useElementSize(\n nav$,\n { width: 0, height: 0 },\n { box: 'border-box' }\n )\n\n const navContainerSize = computed(() =>\n isHorizontal.value ? navContainerWidth.value : navContainerHeight.value\n )\n const navSize = computed(() =>\n isHorizontal.value ? navWidth.value : navHeight.value\n )\n\n const { onWheel } = useWheel(\n {\n atStartEdge: computed(() => navOffset.value <= 0),\n atEndEdge: computed(\n () => navSize.value - navOffset.value <= navContainerSize.value\n ),\n layout: computed(() =>\n isHorizontal.value ? 'horizontal' : 'vertical'\n ),\n },\n (offset) => {\n navOffset.value = clamp(\n navOffset.value + offset,\n 0,\n navSize.value - navContainerSize.value\n )\n }\n )\n\n const scrollPrev = () => {\n if (!navScroll$.value) return\n\n const containerSize =\n navScroll$.value[`offset${capitalize(sizeName.value)}`]\n const currentOffset = navOffset.value\n\n if (!currentOffset) return\n\n const newOffset =\n currentOffset > containerSize ? currentOffset - containerSize : 0\n\n navOffset.value = newOffset\n }\n\n const scrollNext = () => {\n if (!navScroll$.value || !nav$.value) return\n\n const navSize = nav$.value[`offset${capitalize(sizeName.value)}`]\n const containerSize =\n navScroll$.value[`offset${capitalize(sizeName.value)}`]\n const currentOffset = navOffset.value\n\n if (navSize - currentOffset <= containerSize) return\n\n const newOffset =\n navSize - currentOffset > containerSize * 2\n ? currentOffset + containerSize\n : navSize - containerSize\n\n navOffset.value = newOffset\n }\n\n const scrollToActiveTab = async () => {\n const nav = nav$.value\n if (!scrollable.value || !el$.value || !navScroll$.value || !nav) return\n\n await nextTick()\n\n const activeTab = tabRefsMap.value[props.currentName]\n if (!activeTab) return\n\n const navScroll = navScroll$.value\n\n const activeTabBounding = activeTab.getBoundingClientRect()\n const navScrollBounding = navScroll.getBoundingClientRect()\n const maxOffset = isHorizontal.value\n ? nav.offsetWidth - navScrollBounding.width\n : nav.offsetHeight - navScrollBounding.height\n const currentOffset = navOffset.value\n let newOffset = currentOffset\n\n if (isHorizontal.value) {\n if (activeTabBounding.left < navScrollBounding.left) {\n newOffset =\n currentOffset - (navScrollBounding.left - activeTabBounding.left)\n }\n if (activeTabBounding.right > navScrollBounding.right) {\n newOffset =\n currentOffset + activeTabBounding.right - navScrollBounding.right\n }\n } else {\n if (activeTabBounding.top < navScrollBounding.top) {\n newOffset =\n currentOffset - (navScrollBounding.top - activeTabBounding.top)\n }\n if (activeTabBounding.bottom > navScrollBounding.bottom) {\n newOffset =\n currentOffset +\n (activeTabBounding.bottom - navScrollBounding.bottom)\n }\n }\n newOffset = Math.max(newOffset, 0)\n navOffset.value = Math.min(newOffset, maxOffset)\n }\n\n const update = () => {\n if (!nav$.value || !navScroll$.value) return\n\n props.stretch && tabBarRef.value?.update()\n\n const navSize = nav$.value[`offset${capitalize(sizeName.value)}`]\n const containerSize =\n navScroll$.value[`offset${capitalize(sizeName.value)}`]\n const currentOffset = navOffset.value\n\n if (containerSize < navSize) {\n scrollable.value = scrollable.value || {}\n scrollable.value.prev = currentOffset\n scrollable.value.next = currentOffset + containerSize < navSize\n if (navSize - currentOffset < containerSize) {\n navOffset.value = navSize - containerSize\n }\n } else {\n scrollable.value = false\n if (currentOffset > 0) {\n navOffset.value = 0\n }\n }\n }\n\n const changeTab = (event: KeyboardEvent) => {\n const code = getEventCode(event)\n let step = 0\n\n switch (code) {\n case EVENT_CODE.left:\n case EVENT_CODE.up:\n step = -1\n break\n case EVENT_CODE.right:\n case EVENT_CODE.down:\n step = 1\n break\n default:\n return\n }\n\n const tabList = Array.from(\n (\n event.currentTarget as HTMLDivElement\n ).querySelectorAll<HTMLDivElement>('[role=tab]:not(.is-disabled)')\n )\n const currentIndex = tabList.indexOf(event.target as HTMLDivElement)\n let nextIndex = currentIndex + step\n\n if (nextIndex < 0) {\n nextIndex = tabList.length - 1\n } else if (nextIndex >= tabList.length) {\n nextIndex = 0\n }\n\n tabList[nextIndex].focus({ preventScroll: true }) // 改变焦点元素\n tabList[nextIndex].click() // 选中下一个tab\n setFocus()\n }\n\n const setFocus = () => {\n if (focusable.value) isFocus.value = true\n }\n const removeFocus = () => (isFocus.value = false)\n\n const setRefs = (\n el: Element | ComponentPublicInstance | null,\n key: TabPaneName\n ) => {\n tabRefsMap.value[key] = el as HTMLDivElement\n }\n\n const focusActiveTab = async () => {\n await nextTick()\n\n const activeTab = tabRefsMap.value[props.currentName]\n activeTab?.focus({ preventScroll: true })\n }\n\n watch(visibility, (visibility) => {\n if (visibility === 'hidden') {\n focusable.value = false\n } else if (visibility === 'visible') {\n setTimeout(() => (focusable.value = true), 50)\n }\n })\n watch(focused, (focused) => {\n if (focused) {\n setTimeout(() => (focusable.value = true), 50)\n } else {\n focusable.value = false\n }\n })\n\n useResizeObserver(el$, () => {\n rAF(update)\n })\n\n onMounted(() => setTimeout(() => scrollToActiveTab(), 0))\n onUpdated(() => update())\n\n expose({\n scrollToActiveTab,\n removeFocus,\n focusActiveTab,\n tabListRef: nav$,\n tabBarRef,\n scheduleRender: () => triggerRef(tracker),\n })\n\n return () => {\n const scrollBtn = scrollable.value\n ? [\n <span\n class={[\n ns.e('nav-prev'),\n ns.is('disabled', !scrollable.value.prev),\n ]}\n onClick={scrollPrev}\n >\n <ElIcon>\n <ArrowLeft />\n </ElIcon>\n </span>,\n <span\n class={[\n ns.e('nav-next'),\n ns.is('disabled', !scrollable.value.next),\n ]}\n onClick={scrollNext}\n >\n <ElIcon>\n <ArrowRight />\n </ElIcon>\n </span>,\n ]\n : null\n\n const tabs = props.panes.map((pane, index) => {\n const uid = pane.uid\n const disabled = pane.props.disabled\n const tabName = pane.props.name ?? pane.index ?? `${index}`\n const closable =\n !disabled &&\n (pane.isClosable || (pane.props.closable !== false && props.editable))\n pane.index = `${index}`\n\n const btnClose = closable ? (\n <ElIcon\n class=\"is-icon-close\"\n // `onClick` not exist when generate dts\n\n // @ts-ignore\n onClick={(ev: MouseEvent) => emit('tabRemove', pane, ev)}\n >\n <Close />\n </ElIcon>\n ) : null\n\n const tabLabelContent = pane.slots.label?.() || pane.props.label\n const tabindex =\n !disabled && pane.active\n ? (props.tabindex ?? rootTabs.props.tabindex)\n : -1\n\n return (\n <div\n ref={(el) => setRefs(el, tabName)}\n class={[\n ns.e('item'),\n ns.is(rootTabs.props.tabPosition),\n ns.is('active', pane.active),\n ns.is('disabled', disabled),\n ns.is('closable', closable),\n ns.is('focus', isFocus.value),\n ]}\n id={`tab-${tabName}`}\n key={`tab-${uid}`}\n aria-controls={`pane-${tabName}`}\n role=\"tab\"\n aria-selected={pane.active}\n tabindex={tabindex}\n onFocus={() => setFocus()}\n onBlur={() => removeFocus()}\n onClick={(ev: MouseEvent) => {\n removeFocus()\n emit('tabClick', pane, tabName, ev)\n }}\n onKeydown={(ev: KeyboardEvent) => {\n const code = getEventCode(ev)\n if (\n closable &&\n (code === EVENT_CODE.delete || code === EVENT_CODE.backspace)\n ) {\n emit('tabRemove', pane, ev)\n }\n }}\n >\n {...[tabLabelContent, btnClose]}\n </div>\n )\n })\n\n // By tracking the value property, we can schedule a job to re-render `TabNav` when needed.\n // Unlike `instance.update`, the scheduler ensures the job is queued only once even if we trigger it multiple times.\n tracker.value\n\n return (\n <div\n ref={el$}\n class={[\n ns.e('nav-wrap'),\n ns.is('scrollable', !!scrollable.value),\n ns.is(rootTabs.props.tabPosition),\n ]}\n >\n {scrollBtn}\n <div class={ns.e('nav-scroll')} ref={navScroll$}>\n {props.panes.length > 0 ? (\n <div\n class={[\n ns.e('nav'),\n ns.is(rootTabs.props.tabPosition),\n ns.is(\n 'stretch',\n props.stretch &&\n ['top', 'bottom'].includes(rootTabs.props.tabPosition)\n ),\n ]}\n ref={nav$}\n style={navStyle.value}\n role=\"tablist\"\n onKeydown={changeTab}\n onWheel={onWheel}\n >\n {...[\n !props.type ? (\n <TabBar\n ref={tabBarRef}\n tabs={[...props.panes]}\n tabRefs={tabRefsMap.value}\n />\n ) : null,\n tabs,\n ]}\n </div>\n ) : null}\n </div>\n </div>\n )\n }\n },\n})\n\nexport type TabNavInstance = InstanceType<typeof TabNav> & {\n scrollToActiveTab: () => Promise<void>\n removeFocus: () => void\n focusActiveTab: () => void\n scheduleRender: () => void\n tabListRef: HTMLDivElement | undefined\n tabBarRef: TabBarInstance | undefined\n}\n\nexport default TabNav\n"],"names":["tabNavProps","buildProps","panes","type","definePropType","Array","default","mutable","currentName","String","Number","editable","Boolean","values","stretch","tabindex","undefined","tabNavEmits","tabClick","tab","tabName","ev","Event","tabRemove","COMPONENT_NAME","TabNav","defineComponent","name","props","emits","setup","expose","emit","rootTabs","inject","tabsRootContextKey","throwError","ns","useNamespace","visibility","useDocumentVisibility","focused","useWindowFocus","navScroll$","ref","nav$","el$","tabRefsMap","tabBarRef","scrollable","navOffset","isFocus","focusable","tracker","shallowRef","isHorizontal","computed","includes","tabPosition","sizeName","value","navStyle","dir","transform","width","navContainerWidth","height","navContainerHeight","useElementSize","navWidth","navHeight","box","navContainerSize","navSize","onWheel","useWheel","atStartEdge","atEndEdge","layout","offset","clamp","scrollPrev","containerSize","capitalize","currentOffset","newOffset","scrollNext","scrollToActiveTab","nav","nextTick","activeTab","navScroll","activeTabBounding","getBoundingClientRect","navScrollBounding","maxOffset","offsetWidth","offsetHeight","left","right","top","bottom","Math","max","min","update","prev","next","changeTab","event","code","getEventCode","step","EVENT_CODE","up","down","tabList","from","currentTarget","querySelectorAll","currentIndex","indexOf","target","nextIndex","length","focus","preventScroll","click","setFocus","removeFocus","setRefs","el","key","focusActiveTab","watch","setTimeout","useResizeObserver","rAF","onMounted","onUpdated","tabListRef","scheduleRender","triggerRef","scrollBtn","_createVNode","e","is","ElIcon","ArrowLeft","ArrowRight","tabs","map","pane","index","uid","disabled","closable","isClosable","btnClose","Close","tabLabelContent","slots","label","active","onFocus","onBlur","delete","backspace","TabBar"],"mappings":";;;;;;;;;;;;;;;;;AAkDO,MAAMA,cAAcC,UAAAA,CAAW;AAAA,EACpCC,KAAAA,EAAO;AAAA,IACLC,IAAAA,EAAMC,eAAkCC,KAAK,CAAA;AAAA,IAC7CC,OAAAA,EAASA,MAAMC,OAAAA,CAAQ,EAAW;AAAA,GACpC;AAAA,EACAC,WAAAA,EAAa;AAAA,IACXL,IAAAA,EAAM,CAACM,MAAAA,EAAQC,MAAM,CAAA;AAAA,IACrBJ,OAAAA,EAAS;AAAA,GACX;AAAA,EACAK,QAAAA,EAAUC,OAAAA;AAAAA,EACVT,IAAAA,EAAM;AAAA,IACJA,IAAAA,EAAMM,MAAAA;AAAAA,IACNI,MAAAA,EAAQ,CAAC,MAAA,EAAQ,aAAA,EAAe,EAAE,CAAA;AAAA,IAClCP,OAAAA,EAAS;AAAA,GACX;AAAA,EACAQ,OAAAA,EAASF,OAAAA;AAAAA;AAAAA;AAAAA;AAAAA,EAITG,QAAAA,EAAU;AAAA,IACRZ,IAAAA,EAAM,CAACM,MAAAA,EAAQC,MAAM,CAAA;AAAA,IACrBJ,OAAAA,EAASU;AAAAA;AAEb,CAAU;AAEH,MAAMC,WAAAA,GAAc;AAAA,EACzBC,QAAAA,EAAUA,CAACC,GAAAA,EAAsBC,OAAAA,EAAsBC,OACrDA,EAAAA,YAAcC,KAAAA;AAAAA,EAChBC,SAAAA,EAAWA,CAACJ,GAAAA,EAAsBE,EAAAA,KAAcA,EAAAA,YAAcC;AAChE;AAMA,MAAME,cAAAA,GAAiB,UAAA;AACvB,MAAMC,yBAASC,eAAAA,CAAgB;AAAA,EAC7BC,IAAAA,EAAMH,cAAAA;AAAAA,EACNI,KAAAA,EAAO5B,WAAAA;AAAAA,EACP6B,KAAAA,EAAOZ,WAAAA;AAAAA,EACPa,MAAMF,KAAAA,EAAO;AAAA,IAAEG,MAAAA;AAAAA,IAAQC;AAAAA,GAAK,EAAG;AAC7B,IAAA,MAAMC,QAAAA,GAAWC,OAAOC,kBAAkB,CAAA;AAC1C,IAAA,IAAI,CAACF,QAAAA,EAAUG,UAAAA,CAAWZ,cAAAA,EAAgB,CAAA,8BAAA,CAAgC,CAAA;AAE1E,IAAA,MAAMa,EAAAA,GAAKC,aAAa,MAAM,CAAA;AAC9B,IAAA,MAAMC,aAAaC,qBAAAA,EAAsB;AACzC,IAAA,MAAMC,UAAUC,cAAAA,EAAe;AAE/B,IAAA,MAAMC,aAAaC,GAAAA,EAAoB;AACvC,IAAA,MAAMC,OAAOD,GAAAA,EAAoB;AACjC,IAAA,MAAME,MAAMF,GAAAA,EAAoB;AAChC,IAAA,MAAMG,UAAAA,GAAaH,GAAAA,CAA4C,EAAE,CAAA;AAEjE,IAAA,MAAMI,YAAYJ,GAAAA,EAAoB;AAEtC,IAAA,MAAMK,UAAAA,GAAaL,IAAwB,KAAK,CAAA;AAChD,IAAA,MAAMM,SAAAA,GAAYN,IAAI,CAAC,CAAA;AACvB,IAAA,MAAMO,OAAAA,GAAUP,IAAI,KAAK,CAAA;AACzB,IAAA,MAAMQ,SAAAA,GAAYR,IAAI,IAAI,CAAA;AAC1B,IAAA,MAAMS,UAAUC,UAAAA,EAAW;AAE3B,IAAA,MAAMC,YAAAA,GAAeC,QAAAA,CAAS,MAC5B,CAAC,KAAA,EAAO,QAAQ,CAAA,CAAEC,QAAAA,CAASxB,QAAAA,CAASL,KAAAA,CAAM8B,WAAW,CACvD,CAAA;AAEA,IAAA,MAAMC,WAAWH,QAAAA,CAAS,MAAOD,YAAAA,CAAaK,KAAAA,GAAQ,UAAU,QAAS,CAAA;AACzE,IAAA,MAAMC,QAAAA,GAAWL,SAAwB,MAAM;AAC7C,MAAA,MAAMM,GAAAA,GAAMH,QAAAA,CAASC,KAAAA,KAAU,OAAA,GAAU,GAAA,GAAM,GAAA;AAC/C,MAAA,OAAO;AAAA,QACLG,SAAAA,EAAW,CAAA,SAAA,EAAYD,GAAG,CAAA,EAAA,EAAKZ,UAAUU,KAAK,CAAA,GAAA;AAAA,OAChD;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM;AAAA,MAAEI,KAAAA,EAAOC,iBAAAA;AAAAA,MAAmBC,MAAAA,EAAQC;AAAAA,KAAmB,GAC3DC,eAAezB,UAAU,CAAA;AAC3B,IAAA,MAAM;AAAA,MAAEqB,KAAAA,EAAOK,QAAAA;AAAAA,MAAUH,MAAAA,EAAQI;AAAAA,KAAU,GAAIF,eAC7CvB,IAAAA,EACA;AAAA,MAAEmB,KAAAA,EAAO,CAAA;AAAA,MAAGE,MAAAA,EAAQ;AAAA,KAAE,EACtB;AAAA,MAAEK,GAAAA,EAAK;AAAA,KACT,CAAA;AAEA,IAAA,MAAMC,gBAAAA,GAAmBhB,SAAS,MAChCD,YAAAA,CAAaK,QAAQK,iBAAAA,CAAkBL,KAAAA,GAAQO,mBAAmBP,KACpE,CAAA;AACA,IAAA,MAAMa,OAAAA,GAAUjB,SAAS,MACvBD,YAAAA,CAAaK,QAAQS,QAAAA,CAAST,KAAAA,GAAQU,UAAUV,KAClD,CAAA;AAEA,IAAA,MAAM;AAAA,MAAEc;AAAAA,QAAYC,QAAAA,CAClB;AAAA,MACEC,WAAAA,EAAapB,QAAAA,CAAS,MAAMN,SAAAA,CAAUU,SAAS,CAAC,CAAA;AAAA,MAChDiB,SAAAA,EAAWrB,SACT,MAAMiB,OAAAA,CAAQb,QAAQV,SAAAA,CAAUU,KAAAA,IAASY,iBAAiBZ,KAC5D,CAAA;AAAA,MACAkB,QAAQtB,QAAAA,CAAS,MACfD,YAAAA,CAAaK,KAAAA,GAAQ,eAAe,UACtC;AAAA,OAEDmB,CAAAA,MAAAA,KAAW;AACV7B,MAAAA,SAAAA,CAAUU,KAAAA,GAAQoB,MAChB9B,SAAAA,CAAUU,KAAAA,GAAQmB,QAClB,CAAA,EACAN,OAAAA,CAAQb,KAAAA,GAAQY,gBAAAA,CAAiBZ,KACnC,CAAA;AAAA,IACF,CACF,CAAA;AAEA,IAAA,MAAMqB,aAAaA,MAAM;AACvB,MAAA,IAAI,CAACtC,WAAWiB,KAAAA,EAAO;AAEvB,MAAA,MAAMsB,aAAAA,GACJvC,WAAWiB,KAAAA,CAAM,CAAA,MAAA,EAASuB,WAAWxB,QAAAA,CAASC,KAAK,CAAC,CAAA,CAAE,CAAA;AACxD,MAAA,MAAMwB,gBAAgBlC,SAAAA,CAAUU,KAAAA;AAEhC,MAAA,IAAI,CAACwB,aAAAA,EAAe;AAEpB,MAAA,MAAMC,SAAAA,GACJD,aAAAA,GAAgBF,aAAAA,GAAgBE,aAAAA,GAAgBF,aAAAA,GAAgB,CAAA;AAElEhC,MAAAA,SAAAA,CAAUU,KAAAA,GAAQyB,SAAAA;AAAAA,IACpB,CAAA;AAEA,IAAA,MAAMC,aAAaA,MAAM;AACvB,MAAA,IAAI,CAAC3C,UAAAA,CAAWiB,KAAAA,IAAS,CAACf,KAAKe,KAAAA,EAAO;AAEtC,MAAA,MAAMa,QAAAA,GAAU5B,KAAKe,KAAAA,CAAM,CAAA,MAAA,EAASuB,WAAWxB,QAAAA,CAASC,KAAK,CAAC,CAAA,CAAE,CAAA;AAChE,MAAA,MAAMsB,aAAAA,GACJvC,WAAWiB,KAAAA,CAAM,CAAA,MAAA,EAASuB,WAAWxB,QAAAA,CAASC,KAAK,CAAC,CAAA,CAAE,CAAA;AACxD,MAAA,MAAMwB,gBAAgBlC,SAAAA,CAAUU,KAAAA;AAEhC,MAAA,IAAIa,QAAAA,GAAUW,iBAAiBF,aAAAA,EAAe;AAE9C,MAAA,MAAMG,YACJZ,QAAAA,GAAUW,aAAAA,GAAgBF,gBAAgB,CAAA,GACtCE,aAAAA,GAAgBF,gBAChBT,QAAAA,GAAUS,aAAAA;AAEhBhC,MAAAA,SAAAA,CAAUU,KAAAA,GAAQyB,SAAAA;AAAAA,IACpB,CAAA;AAEA,IAAA,MAAME,oBAAoB,YAAY;AACpC,MAAA,MAAMC,MAAM3C,IAAAA,CAAKe,KAAAA;AACjB,MAAA,IAAI,CAACX,UAAAA,CAAWW,KAAAA,IAAS,CAACd,GAAAA,CAAIc,SAAS,CAACjB,UAAAA,CAAWiB,KAAAA,IAAS,CAAC4B,GAAAA,EAAK;AAElE,MAAA,MAAMC,QAAAA,EAAS;AAEf,MAAA,MAAMC,SAAAA,GAAY3C,UAAAA,CAAWa,KAAAA,CAAMhC,KAAAA,CAAMpB,WAAW,CAAA;AACpD,MAAA,IAAI,CAACkF,SAAAA,EAAW;AAEhB,MAAA,MAAMC,YAAYhD,UAAAA,CAAWiB,KAAAA;AAE7B,MAAA,MAAMgC,iBAAAA,GAAoBF,UAAUG,qBAAAA,EAAsB;AAC1D,MAAA,MAAMC,iBAAAA,GAAoBH,UAAUE,qBAAAA,EAAsB;AAC1D,MAAA,MAAME,SAAAA,GAAYxC,aAAaK,KAAAA,GAC3B4B,GAAAA,CAAIQ,cAAcF,iBAAAA,CAAkB9B,KAAAA,GACpCwB,GAAAA,CAAIS,YAAAA,GAAeH,iBAAAA,CAAkB5B,MAAAA;AACzC,MAAA,MAAMkB,gBAAgBlC,SAAAA,CAAUU,KAAAA;AAChC,MAAA,IAAIyB,SAAAA,GAAYD,aAAAA;AAEhB,MAAA,IAAI7B,aAAaK,KAAAA,EAAO;AACtB,QAAA,IAAIgC,iBAAAA,CAAkBM,IAAAA,GAAOJ,iBAAAA,CAAkBI,IAAAA,EAAM;AACnDb,UAAAA,SAAAA,GACED,aAAAA,IAAiBU,iBAAAA,CAAkBI,IAAAA,GAAON,iBAAAA,CAAkBM,IAAAA,CAAAA;AAAAA,QAChE;AACA,QAAA,IAAIN,iBAAAA,CAAkBO,KAAAA,GAAQL,iBAAAA,CAAkBK,KAAAA,EAAO;AACrDd,UAAAA,SAAAA,GACED,aAAAA,GAAgBQ,iBAAAA,CAAkBO,KAAAA,GAAQL,iBAAAA,CAAkBK,KAAAA;AAAAA,QAChE;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAIP,iBAAAA,CAAkBQ,GAAAA,GAAMN,iBAAAA,CAAkBM,GAAAA,EAAK;AACjDf,UAAAA,SAAAA,GACED,aAAAA,IAAiBU,iBAAAA,CAAkBM,GAAAA,GAAMR,iBAAAA,CAAkBQ,GAAAA,CAAAA;AAAAA,QAC/D;AACA,QAAA,IAAIR,iBAAAA,CAAkBS,MAAAA,GAASP,iBAAAA,CAAkBO,MAAAA,EAAQ;AACvDhB,UAAAA,SAAAA,GACED,aAAAA,IACCQ,iBAAAA,CAAkBS,MAAAA,GAASP,iBAAAA,CAAkBO,MAAAA,CAAAA;AAAAA,QAClD;AAAA,MACF;AACAhB,MAAAA,SAAAA,GAAYiB,IAAAA,CAAKC,GAAAA,CAAIlB,SAAAA,EAAW,CAAC,CAAA;AACjCnC,MAAAA,SAAAA,CAAUU,KAAAA,GAAQ0C,IAAAA,CAAKE,GAAAA,CAAInB,SAAAA,EAAWU,SAAS,CAAA;AAAA,IACjD,CAAA;AAEA,IAAA,MAAMU,SAASA,MAAM;AAzOzB,MAAA,IAAA,EAAA;AA0OM,MAAA,IAAI,CAAC5D,IAAAA,CAAKe,KAAAA,IAAS,CAACjB,WAAWiB,KAAAA,EAAO;AAEtChC,MAAAA,KAAAA,CAAMd,OAAAA,KAAAA,CAAWkC,EAAAA,GAAAA,SAAAA,CAAUY,KAAAA,KAAVZ,IAAAA,GAAAA,MAAAA,GAAAA,EAAAA,CAAiByD,MAAAA,EAAAA,CAAAA;AAElC,MAAA,MAAMhC,QAAAA,GAAU5B,KAAKe,KAAAA,CAAM,CAAA,MAAA,EAASuB,WAAWxB,QAAAA,CAASC,KAAK,CAAC,CAAA,CAAE,CAAA;AAChE,MAAA,MAAMsB,aAAAA,GACJvC,WAAWiB,KAAAA,CAAM,CAAA,MAAA,EAASuB,WAAWxB,QAAAA,CAASC,KAAK,CAAC,CAAA,CAAE,CAAA;AACxD,MAAA,MAAMwB,gBAAgBlC,SAAAA,CAAUU,KAAAA;AAEhC,MAAA,IAAIsB,gBAAgBT,QAAAA,EAAS;AAC3BxB,QAAAA,UAAAA,CAAWW,KAAAA,GAAQX,UAAAA,CAAWW,KAAAA,IAAS,EAAC;AACxCX,QAAAA,UAAAA,CAAWW,MAAM8C,IAAAA,GAAOtB,aAAAA;AACxBnC,QAAAA,UAAAA,CAAWW,KAAAA,CAAM+C,IAAAA,GAAOvB,aAAAA,GAAgBF,aAAAA,GAAgBT,QAAAA;AACxD,QAAA,IAAIA,QAAAA,GAAUW,gBAAgBF,aAAAA,EAAe;AAC3ChC,UAAAA,SAAAA,CAAUU,QAAQa,QAAAA,GAAUS,aAAAA;AAAAA,QAC9B;AAAA,MACF,CAAA,MAAO;AACLjC,QAAAA,UAAAA,CAAWW,KAAAA,GAAQ,KAAA;AACnB,QAAA,IAAIwB,gBAAgB,CAAA,EAAG;AACrBlC,UAAAA,SAAAA,CAAUU,KAAAA,GAAQ,CAAA;AAAA,QACpB;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAMgD,YAAaC,CAAAA,KAAAA,KAAyB;AAC1C,MAAA,MAAMC,IAAAA,GAAOC,aAAaF,KAAK,CAAA;AAC/B,MAAA,IAAIG,IAAAA,GAAO,CAAA;AAEX,MAAA,QAAQF,IAAAA;AAAI,QACV,KAAKG,UAAAA,CAAWf,IAAAA;AAAAA,QAChB,KAAKe,UAAAA,CAAWC,EAAAA;AACdF,UAAAA,IAAAA,GAAO,EAAA;AACP,UAAA;AAAA,QACF,KAAKC,UAAAA,CAAWd,KAAAA;AAAAA,QAChB,KAAKc,UAAAA,CAAWE,IAAAA;AACdH,UAAAA,IAAAA,GAAO,CAAA;AACP,UAAA;AAAA,QACF;AACE,UAAA;AAAA;AAGJ,MAAA,MAAMI,UAAU/G,KAAAA,CAAMgH,IAAAA,CAElBR,MAAMS,aAAAA,CACNC,gBAAAA,CAAiC,8BAA8B,CACnE,CAAA;AACA,MAAA,MAAMC,YAAAA,GAAeJ,OAAAA,CAAQK,OAAAA,CAAQZ,KAAAA,CAAMa,MAAwB,CAAA;AACnE,MAAA,IAAIC,YAAYH,YAAAA,GAAeR,IAAAA;AAE/B,MAAA,IAAIW,YAAY,CAAA,EAAG;AACjBA,QAAAA,SAAAA,GAAYP,QAAQQ,MAAAA,GAAS,CAAA;AAAA,MAC/B,CAAA,MAAA,IAAWD,SAAAA,IAAaP,OAAAA,CAAQQ,MAAAA,EAAQ;AACtCD,QAAAA,SAAAA,GAAY,CAAA;AAAA,MACd;AAEAP,MAAAA,OAAAA,CAAQO,SAAS,EAAEE,KAAAA,CAAM;AAAA,QAAEC,aAAAA,EAAe;AAAA,OAAM,CAAA;AAChDV,MAAAA,OAAAA,CAAQO,SAAS,EAAEI,KAAAA,EAAM;AACzBC,MAAAA,QAAAA,EAAS;AAAA,IACX,CAAA;AAEA,IAAA,MAAMA,WAAWA,MAAM;AACrB,MAAA,IAAI5E,SAAAA,CAAUQ,KAAAA,EAAOT,OAAAA,CAAQS,KAAAA,GAAQ,IAAA;AAAA,IACvC,CAAA;AACA,IAAA,MAAMqE,WAAAA,GAAcA,MAAO9E,OAAAA,CAAQS,KAAAA,GAAQ,KAAA;AAE3C,IAAA,MAAMsE,OAAAA,GAAUA,CACdC,EAAAA,EACAC,GAAAA,KACG;AACHrF,MAAAA,UAAAA,CAAWa,KAAAA,CAAMwE,GAAG,CAAA,GAAID,EAAAA;AAAAA,IAC1B,CAAA;AAEA,IAAA,MAAME,iBAAiB,YAAY;AACjC,MAAA,MAAM5C,QAAAA,EAAS;AAEf,MAAA,MAAMC,SAAAA,GAAY3C,UAAAA,CAAWa,KAAAA,CAAMhC,KAAAA,CAAMpB,WAAW,CAAA;AACpDkF,MAAAA,SAAAA,IAAAA,IAAAA,GAAAA,MAAAA,GAAAA,SAAAA,CAAWmC,KAAAA,CAAM;AAAA,QAAEC,aAAAA,EAAe;AAAA,OAAK,CAAA;AAAA,IACzC,CAAA;AAEAQ,IAAAA,KAAAA,CAAM/F,UAAAA,EAAaA,CAAAA,WAAAA,KAAe;AAChC,MAAA,IAAIA,gBAAe,QAAA,EAAU;AAC3Ba,QAAAA,SAAAA,CAAUQ,KAAAA,GAAQ,KAAA;AAAA,MACpB,CAAA,MAAA,IAAWrB,gBAAe,SAAA,EAAW;AACnCgG,QAAAA,UAAAA,CAAW,MAAOnF,SAAAA,CAAUQ,KAAAA,GAAQ,IAAA,EAAO,EAAE,CAAA;AAAA,MAC/C;AAAA,IACF,CAAC,CAAA;AACD0E,IAAAA,KAAAA,CAAM7F,OAAAA,EAAUA,CAAAA,QAAAA,KAAY;AAC1B,MAAA,IAAIA,QAAAA,EAAS;AACX8F,QAAAA,UAAAA,CAAW,MAAOnF,SAAAA,CAAUQ,KAAAA,GAAQ,IAAA,EAAO,EAAE,CAAA;AAAA,MAC/C,CAAA,MAAO;AACLR,QAAAA,SAAAA,CAAUQ,KAAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAC,CAAA;AAED4E,IAAAA,iBAAAA,CAAkB1F,KAAK,MAAM;AAC3B2F,MAAAA,GAAAA,CAAIhC,MAAM,CAAA;AAAA,IACZ,CAAC,CAAA;AAEDiC,IAAAA,SAAAA,CAAU,MAAMH,UAAAA,CAAW,MAAMhD,iBAAAA,EAAkB,EAAG,CAAC,CAAC,CAAA;AACxDoD,IAAAA,SAAAA,CAAU,MAAMlC,QAAQ,CAAA;AAExB1E,IAAAA,MAAAA,CAAO;AAAA,MACLwD,iBAAAA;AAAAA,MACA0C,WAAAA;AAAAA,MACAI,cAAAA;AAAAA,MACAO,UAAAA,EAAY/F,IAAAA;AAAAA,MACZG,SAAAA;AAAAA,MACA6F,cAAAA,EAAgBA,MAAMC,UAAAA,CAAWzF,OAAO;AAAA,KACzC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,MAAM0F,SAAAA,GAAY9F,UAAAA,CAAWW,KAAAA,GACzB,CAAAoF,YAAA,MAAA,EAAA;AAAA,QAAA,OAAA,EAEW,CACL3G,EAAAA,CAAG4G,CAAAA,CAAE,UAAU,CAAA,EACf5G,EAAAA,CAAG6G,EAAAA,CAAG,UAAA,EAAY,CAACjG,UAAAA,CAAWW,KAAAA,CAAM8C,IAAI,CAAC,CAAA;AAAA,QAC1C,SAAA,EACQzB;AAAAA,OAAU,EAAA,CAAA+D,WAAAA,CAAAG,MAAAA,EAAA,IAAA,EAAA;AAAA,QAAA7I,SAAAA,MAAA,CAAA0I,YAAAI,SAAAA,EAAA,IAAA,EAAA,IAAA,CAAA;AAAA,OAAA,CAAA,CAAA,CAAA,EAAAJ,YAAA,MAAA,EAAA;AAAA,QAAA,OAAA,EAOZ,CACL3G,EAAAA,CAAG4G,CAAAA,CAAE,UAAU,CAAA,EACf5G,EAAAA,CAAG6G,EAAAA,CAAG,UAAA,EAAY,CAACjG,UAAAA,CAAWW,KAAAA,CAAM+C,IAAI,CAAC,CAAA;AAAA,QAC1C,SAAA,EACQrB;AAAAA,OAAU,EAAA,CAAA0D,WAAAA,CAAAG,MAAAA,EAAA,IAAA,EAAA;AAAA,QAAA7I,SAAAA,MAAA,CAAA0I,YAAAK,UAAAA,EAAA,IAAA,EAAA,IAAA,CAAA;AAAA,OAAA,CAAA,CAAA,CAAA,CAAA,GAOvB,IAAA;AAEJ,MAAA,MAAMC,OAAO1H,KAAAA,CAAM1B,KAAAA,CAAMqJ,GAAAA,CAAI,CAACC,MAAMC,KAAAA,KAAU;AApXpD,QAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAqXQ,QAAA,MAAMC,MAAMF,IAAAA,CAAKE,GAAAA;AACjB,QAAA,MAAMC,QAAAA,GAAWH,KAAK5H,KAAAA,CAAM+H,QAAAA;AAC5B,QAAA,MAAMvI,OAAAA,GAAAA,CAAUoI,gBAAK5H,KAAAA,CAAMD,IAAAA,KAAX6H,YAAmBA,IAAAA,CAAKC,KAAAA,KAAxBD,IAAAA,GAAAA,EAAAA,GAAiC,CAAA,EAAGC,KAAK,CAAA,CAAA;AACzD,QAAA,MAAMG,QAAAA,GACJ,CAACD,QAAAA,KACAH,IAAAA,CAAKK,cAAeL,IAAAA,CAAK5H,KAAAA,CAAMgI,QAAAA,KAAa,KAAA,IAAShI,KAAAA,CAAMjB,QAAAA,CAAAA;AAC9D6I,QAAAA,IAAAA,CAAKC,KAAAA,GAAQ,GAAGA,KAAK,CAAA,CAAA;AAErB,QAAA,MAAMK,QAAAA,GAAWF,QAAAA,GAAQZ,WAAAA,CAAAG,MAAAA,EAAA;AAAA,UAAA,OAAA,EAAA,eAAA;AAAA,UAAA,SAAA,EAMX9H,CAAAA,EAAAA,KAAmBW,IAAAA,CAAK,WAAA,EAAawH,MAAMnI,EAAE;AAAA,SAAC,EAAA;AAAA,UAAAf,SAAAA,MAAA,CAAA0I,YAAAe,KAAAA,EAAA,IAAA,EAAA,IAAA,CAAA;AAAA,SAAA,CAAA,GAIxD,IAAA;AAEJ,QAAA,MAAMC,oBAAkBR,EAAAA,GAAAA,CAAAA,EAAAA,GAAAA,IAAAA,CAAKS,KAAAA,EAAMC,KAAAA,KAAXV,IAAAA,GAAAA,MAAAA,GAAAA,EAAAA,CAAAA,IAAAA,CAAAA,EAAAA,CAAAA,KAAwBA,KAAK5H,KAAAA,CAAMsI,KAAAA;AAC3D,QAAA,MAAMnJ,QAAAA,GACJ,CAAC4I,QAAAA,IAAYH,IAAAA,CAAKW,MAAAA,GAAAA,CACbvI,WAAMb,QAAAA,KAANa,IAAAA,GAAAA,EAAAA,GAAkBK,QAAAA,CAASL,KAAAA,CAAMb,QAAAA,GAClC,EAAA;AAEN,QAAA,OAAAiI,YAAA,KAAA,EAAA;AAAA,UAAA,KAAA,EAEUb,CAAAA,EAAAA,KAAOD,OAAAA,CAAQC,EAAAA,EAAI/G,OAAO,CAAA;AAAA,UAAC,OAAA,EAC1B,CACLiB,EAAAA,CAAG4G,CAAAA,CAAE,MAAM,CAAA,EACX5G,EAAAA,CAAG6G,EAAAA,CAAGjH,QAAAA,CAASL,KAAAA,CAAM8B,WAAW,CAAA,EAChCrB,EAAAA,CAAG6G,GAAG,QAAA,EAAUM,IAAAA,CAAKW,MAAM,CAAA,EAC3B9H,EAAAA,CAAG6G,EAAAA,CAAG,UAAA,EAAYS,QAAQ,GAC1BtH,EAAAA,CAAG6G,EAAAA,CAAG,UAAA,EAAYU,QAAQ,GAC1BvH,EAAAA,CAAG6G,EAAAA,CAAG,OAAA,EAAS/F,OAAAA,CAAQS,KAAK,CAAC,CAAA;AAAA,UAC9B,IAAA,EACG,OAAOxC,OAAO,CAAA,CAAA;AAAA,UAAE,KAAA,EACf,OAAOsI,GAAG,CAAA,CAAA;AAAA,UAAE,eAAA,EACF,QAAQtI,OAAO,CAAA,CAAA;AAAA,UAAE,MAAA,EAAA,KAAA;AAAA,UAAA,iBAEjBoI,IAAAA,CAAKW,MAAAA;AAAAA,UAAM,UAAA,EAChBpJ,QAAAA;AAAAA,UAAQ,SAAA,EACTqJ,MAAMpC,QAAAA,EAAS;AAAA,UAAC,QAAA,EACjBqC,MAAMpC,WAAAA,EAAY;AAAA,UAAC,WACjB5G,CAAAA,EAAAA,KAAmB;AAC3B4G,YAAAA,WAAAA,EAAY;AACZjG,YAAAA,IAAAA,CAAK,UAAA,EAAYwH,IAAAA,EAAMpI,OAAAA,EAASC,EAAE,CAAA;AAAA,UACpC,CAAA;AAAA,UAAC,aACWA,CAAAA,EAAAA,KAAsB;AAChC,YAAA,MAAMyF,IAAAA,GAAOC,aAAa1F,EAAE,CAAA;AAC5B,YAAA,IACEuI,aACC9C,IAAAA,KAASG,UAAAA,CAAWqD,MAAAA,IAAUxD,IAAAA,KAASG,WAAWsD,SAAAA,CAAAA,EACnD;AACAvI,cAAAA,IAAAA,CAAK,WAAA,EAAawH,MAAMnI,EAAE,CAAA;AAAA,YAC5B;AAAA,UACF;AAAA,WAAC,CAAA,GAEG,CAAC2I,eAAAA,EAAiBF,QAAQ,CAAC,CAAA,CAAA;AAAA,MAGrC,CAAC,CAAA;AAIDzG,MAAAA,OAAAA,CAAQO,KAAAA;AAER,MAAA,OAAAoF,YAAA,KAAA,EAAA;AAAA,QAAA,KAAA,EAESlG,GAAAA;AAAAA,QAAG,SACD,CACLT,EAAAA,CAAG4G,EAAE,UAAU,CAAA,EACf5G,GAAG6G,EAAAA,CAAG,YAAA,EAAc,CAAC,CAACjG,UAAAA,CAAWW,KAAK,CAAA,EACtCvB,EAAAA,CAAG6G,GAAGjH,QAAAA,CAASL,KAAAA,CAAM8B,WAAW,CAAC;AAAA,OAClC,EAAA,CAEAqF,SAAAA,EAASC,WAAAA,CAAA,KAAA,EAAA;AAAA,QAAA,OAAA,EACE3G,EAAAA,CAAG4G,CAAAA,CAAE,YAAY,CAAA;AAAA,QAAC,KAAA,EAAOtG;AAAAA,SAAU,CAC5Cf,KAAAA,CAAM1B,MAAM0H,MAAAA,GAAS,CAAA,GAACoB,YAAA,KAAA,EAAA;AAAA,QAAA,OAAA,EAEZ,CACL3G,EAAAA,CAAG4G,CAAAA,CAAE,KAAK,CAAA,EACV5G,EAAAA,CAAG6G,EAAAA,CAAGjH,QAAAA,CAASL,KAAAA,CAAM8B,WAAW,CAAA,EAChCrB,EAAAA,CAAG6G,GACD,SAAA,EACAtH,KAAAA,CAAMd,OAAAA,IACJ,CAAC,KAAA,EAAO,QAAQ,CAAA,CAAE2C,QAAAA,CAASxB,QAAAA,CAASL,KAAAA,CAAM8B,WAAW,CACzD,CAAC,CAAA;AAAA,QACF,KAAA,EACIb,IAAAA;AAAAA,QAAI,SACFgB,QAAAA,CAASD,KAAAA;AAAAA,QAAK,MAAA,EAAA,SAAA;AAAA,QAAA,WAAA,EAEVgD,SAAAA;AAAAA,QAAS,SAAA,EACXlC;AAAAA,OAAO,EAAA,CAAA,GAEZ,CACF,CAAC9C,KAAAA,CAAMzB,IAAAA,GAAI6I,YAAAwB,SAAAA,EAAA;AAAA,QAAA,KAAA,EAEFxH,SAAAA;AAAAA,QAAS,MAAA,EACR,CAAC,GAAGpB,KAAAA,CAAM1B,KAAK,CAAA;AAAA,QAAC,WACb6C,UAAAA,CAAWa;AAAAA,OAAK,EAAA,IAAA,CAAA,GAEzB,IAAA,EACJ0F,IAAI,CACL,KAED,IAAI,CAAA,CAAA,CAAA,CAAA;AAAA,IAIhB,CAAA;AAAA,EACF;AACF,CAAC;;;;"}