vue-stack-tabs 1.4.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.en.md +1 -0
  2. package/README.md +1 -0
  3. package/README.ru.md +1 -0
  4. package/dist/StackTabs.vue.d.ts +3 -0
  5. package/dist/components/ContextMenu/ContextMenuItem.vue.d.ts +1 -1
  6. package/dist/hooks/tabPanel/pageComponentFactory.d.ts +5 -2
  7. package/dist/hooks/tabPanel/refresh.d.ts +8 -3
  8. package/dist/hooks/tabPanel/tabStore.d.ts +80 -0
  9. package/dist/hooks/useTabActions.d.ts +1 -0
  10. package/dist/hooks/useTabPanel.d.ts +27 -5
  11. package/dist/model/TabModel.d.ts +5 -0
  12. package/dist/style.css +1 -1
  13. package/dist/utils/tabInfoEncoder.d.ts +10 -0
  14. package/dist/utils/urlParser.d.ts +14 -3
  15. package/dist/vue-stack-tabs.es.js +1 -1
  16. package/package.json +4 -7
  17. package/src/lib/StackTabs.vue +24 -2
  18. package/src/lib/assets/image/close_all.svg +1 -9
  19. package/src/lib/assets/image/close_lefts.svg +1 -1
  20. package/src/lib/assets/image/close_other.svg +1 -1
  21. package/src/lib/assets/image/close_rights.svg +1 -1
  22. package/src/lib/assets/image/reload.svg +1 -3
  23. package/src/lib/assets/image/reload_all.svg +1 -6
  24. package/src/lib/assets/style/common/mixins.scss +58 -19
  25. package/src/lib/assets/style/common/var.scss +100 -60
  26. package/src/lib/assets/style/icon.scss +31 -98
  27. package/src/lib/assets/style/index.scss +2 -2
  28. package/src/lib/assets/style/loading.scss +45 -0
  29. package/src/lib/assets/style/{stackTab.scss → stack-tab.scss} +105 -177
  30. package/src/lib/assets/style/transition.scss +12 -17
  31. package/src/lib/components/ContextMenu/ContextMenuItem.vue +5 -5
  32. package/src/lib/components/ContextMenu/index.vue +22 -19
  33. package/src/lib/components/PageLoading.vue +5 -5
  34. package/src/lib/components/StackKeepAlive/StackKeepAlive.vue +5 -3
  35. package/src/lib/components/TabHeader/TabHeaderItem.vue +13 -7
  36. package/src/lib/components/TabHeader/TabHeaderScroll.vue +8 -6
  37. package/src/lib/components/TabHeader/index.vue +16 -2
  38. package/src/lib/hooks/tabPanel/pageComponentFactory.tsx +96 -26
  39. package/src/lib/hooks/tabPanel/refresh.ts +40 -18
  40. package/src/lib/hooks/tabPanel/tabStore.ts +665 -0
  41. package/src/lib/hooks/useContextMenu.ts +1 -1
  42. package/src/lib/hooks/useIframeManager.ts +10 -3
  43. package/src/lib/hooks/useTabActions.ts +10 -6
  44. package/src/lib/hooks/useTabPanel.tsx +325 -195
  45. package/src/lib/hooks/useTabRouter.ts +50 -48
  46. package/src/lib/model/TabModel.ts +5 -0
  47. package/src/lib/utils/tabInfoEncoder.ts +101 -17
  48. package/src/lib/utils/urlParser.ts +35 -11
  49. package/dist/vue-stack-tabs.css +0 -2
  50. package/src/lib/assets/style/overlayer.scss +0 -46
@@ -1,8 +1,6 @@
1
- import { defu } from 'defu'
2
1
  import { getCurrentInstance } from 'vue'
3
2
  import type { ComponentInternalInstance } from 'vue'
4
3
  import type { LocationQueryRaw, RouteLocationPathRaw } from 'vue-router'
5
- import type { ITabPage } from '../model/TabModel'
6
4
  import { isNavigationFailure, useRoute, useRouter } from 'vue-router'
7
5
 
8
6
  import useTabPanel from './useTabPanel'
@@ -10,7 +8,9 @@ import {
10
8
  parseUrl,
11
9
  cloneLocationQuery,
12
10
  clonePage,
13
- isSameQueryIgnoringReserved
11
+ isSameQueryIgnoringReserved,
12
+ normalizePathname,
13
+ omitStackTabsReservedQuery
14
14
  } from '../utils/urlParser'
15
15
  import { TabEventType, useTabEmitter } from './useTabEventBus'
16
16
 
@@ -18,18 +18,6 @@ import { runNavigationTransaction } from './tabPanel/navigationTransaction'
18
18
 
19
19
  import { createPageId } from '../utils/tabInfoEncoder'
20
20
 
21
- interface PageStackLike {
22
- clear: () => void
23
- push: (page: ITabPage) => void
24
- }
25
-
26
- const restorePages = (stack: PageStackLike, pages: ITabPage[]) => {
27
- stack.clear()
28
- for (const page of pages) {
29
- stack.push(clonePage(page))
30
- }
31
- }
32
-
33
21
  /**
34
22
  * useTabRouter - 标签内路由 Hook
35
23
  *
@@ -62,7 +50,19 @@ export default function useTabRouter() {
62
50
  const route = useRoute()
63
51
  const router = useRouter()
64
52
  const emitter = useTabEmitter()
65
- const { getTab, evictPageCache, addPageScroller, active: activateTab } = useTabPanel()
53
+ const {
54
+ getTab,
55
+ getTopPage,
56
+ getPages,
57
+ appendPage,
58
+ popPages,
59
+ getPageSnapshot,
60
+ replacePages,
61
+ updatePage,
62
+ evictPageCache,
63
+ addPageScroller,
64
+ active: activateTab
65
+ } = useTabPanel()
66
66
 
67
67
  /**
68
68
  * 当前标签的编码信息字符串,存于 URL query.__tab。
@@ -85,10 +85,11 @@ export default function useTabRouter() {
85
85
  const forward = (to: RouteLocationPathRaw) => {
86
86
  const tab = getTab(tabId)
87
87
  const targetQuery = (to.query || {}) as LocationQueryRaw
88
+ const targetPath = normalizePathname(to.path)
88
89
 
89
90
  if (tab) {
90
- const top = tab.pages.peek()
91
- if (top && top.path === to.path) {
91
+ const top = getTopPage(tab.id)
92
+ if (top && top.path === targetPath) {
92
93
  if (isSameQueryIgnoringReserved(targetQuery, top.query || {})) {
93
94
  if (!tab.active) {
94
95
  activateTab(tab.id)
@@ -98,37 +99,38 @@ export default function useTabRouter() {
98
99
  }
99
100
  }
100
101
 
101
- // __tab 是 StackTabs 解析路由归属标签的关键,优先沿用目标 query 已有的值,
102
- // 避免被 to.query 中非字符串的同名 key 或缺失值覆盖。
103
- const query = defu(to.query, { __tab: tabInfo })
102
+ // __tab 是 StackTabs 解析路由归属标签的关键:强制使用当前标签的编码,
103
+ // 业务 query 传入同名 key 时也不能把导航带到其它标签。
104
+ const query: LocationQueryRaw = { ...omitStackTabsReservedQuery(targetQuery) }
105
+ if (typeof tabInfo === 'string' && tabInfo) query.__tab = tabInfo
104
106
  const transactionVersion = ++navigationVersion
105
107
  emitter.emit(TabEventType.FORWARD)
106
108
 
107
109
  let optimisticPageId = ''
108
110
  runNavigationTransaction({
109
111
  apply: () => {
110
- const snapshot = tab ? tab.pages.readonlyList().map((p) => clonePage(p)) : []
112
+ const snapshot = tab ? getPageSnapshot(tab.id) : []
111
113
  if (tab) {
112
114
  optimisticPageId = createPageId()
113
- tab.pages.push({
115
+ appendPage(tab.id, {
114
116
  id: optimisticPageId,
115
117
  tabId: tab.id,
116
- path: to.path,
117
- query: cloneLocationQuery(targetQuery)
118
+ path: targetPath,
119
+ query: cloneLocationQuery(query)
118
120
  })
119
121
  }
120
122
  return snapshot
121
123
  },
122
124
  navigate: () => router.push({ path: to.path, query }),
123
125
  rollback: (snapshot) => {
124
- if (tab) restorePages(tab.pages, snapshot)
126
+ if (tab) replacePages(tab.id, snapshot)
125
127
  },
126
128
  isFailureResult: isNavigationFailure,
127
129
  isCurrent: () => navigationVersion === transactionVersion,
128
130
  cleanupStale: () => {
129
131
  if (!tab || !optimisticPageId) return
130
- const pages = tab.pages.list().filter((page) => page.id !== optimisticPageId)
131
- restorePages(tab.pages, pages)
132
+ const pages = getPages(tab.id).filter((page) => page.id !== optimisticPageId)
133
+ replacePages(tab.id, pages)
132
134
  }
133
135
  }).catch((error: unknown) => {
134
136
  if (!import.meta.env.PROD) {
@@ -149,7 +151,7 @@ export default function useTabRouter() {
149
151
  const tab = getTab(tabId)
150
152
  if (!tab) return false
151
153
 
152
- const stack = tab.pages
154
+ const pages = getPages(tab.id)
153
155
  let steps = 0
154
156
 
155
157
  if (typeof to === 'number') {
@@ -157,14 +159,14 @@ export default function useTabRouter() {
157
159
  } else {
158
160
  const parsed = parseUrl(to)
159
161
  const targetQuery = parsed.query || {}
160
- const pages = stack.readonlyList()
162
+ const targetPath = normalizePathname(parsed.path)
161
163
  let found = false
162
164
 
163
- for (let i = stack.size() - 2; i >= 0; i--) {
165
+ for (let i = pages.length - 2; i >= 0; i--) {
164
166
  steps++
165
167
  const page = pages[i]
166
168
  if (
167
- page?.path === parsed.path &&
169
+ page?.path === targetPath &&
168
170
  isSameQueryIgnoringReserved(targetQuery, page?.query || {})
169
171
  ) {
170
172
  found = true
@@ -184,45 +186,45 @@ export default function useTabRouter() {
184
186
 
185
187
  if (steps <= 0) return false
186
188
 
187
- if (stack.size() <= steps) {
189
+ const availableSteps = pages.length - 1
190
+ if (availableSteps < steps) {
188
191
  // 请求退栈步数大于当前可用层数时,仅退到栈底(首页);开发模式下提示维护者。
189
192
  if (!import.meta.env.PROD) {
190
193
  console.warn(
191
- `[vue-stack-tabs] backward requested ${steps} steps but stack only has ${stack.size() - 1} available.`
194
+ `[vue-stack-tabs] backward requested ${steps} steps but stack only has ${availableSteps} available.`
192
195
  )
193
196
  }
194
- steps = stack.size() - 1
197
+ steps = availableSteps
195
198
  }
196
199
 
197
200
  if (steps <= 0) return false
198
201
 
199
- const originalPages = stack.readonlyList().map((p) => clonePage(p))
200
- const recyclingBin: string[] = []
201
- for (let i = 0; i < steps; i++) {
202
- const popped = stack.pop()
203
- if (popped) recyclingBin.push(popped.id)
204
- }
202
+ const originalPages = getPageSnapshot(tab.id)
203
+ const recyclingBin = popPages(tab.id, steps).map((page) => page.id)
205
204
 
206
- const target = stack.peek()
205
+ const target = getTopPage(tab.id)
207
206
  if (!target) {
208
- restorePages(stack, originalPages)
207
+ replacePages(tab.id, originalPages)
209
208
  return false
210
209
  }
211
210
 
212
211
  if (backQuery) {
213
- target._backParams = backQuery
212
+ updatePage(tab.id, target.id, { _backParams: backQuery })
214
213
  }
215
214
 
216
215
  emitter.emit(TabEventType.BACKWARD)
217
216
 
218
- // 栈顶 query 已带 __tab 时优先沿用,避免被默认 tabInfo 覆盖导致解析时识别错乱。
219
- const targetQueryWithTab = defu(target.query || {}, { __tab: tabInfo })
217
+ // 与 forward 一致:目标页固定归属当前标签,保留其余业务 query。
218
+ const targetQueryWithTab: LocationQueryRaw = {
219
+ ...omitStackTabsReservedQuery(target.query || {})
220
+ }
221
+ if (typeof tabInfo === 'string' && tabInfo) targetQueryWithTab.__tab = tabInfo
220
222
  const transactionVersion = ++navigationVersion
221
223
 
222
224
  runNavigationTransaction({
223
225
  apply: () => originalPages,
224
226
  navigate: () => router.push({ path: target.path, query: targetQueryWithTab }),
225
- rollback: (snapshot) => restorePages(stack, snapshot),
227
+ rollback: (snapshot) => replacePages(tab.id, snapshot),
226
228
  isFailureResult: isNavigationFailure,
227
229
  isCurrent: () => navigationVersion === transactionVersion,
228
230
  commit: () => {
@@ -231,7 +233,7 @@ export default function useTabRouter() {
231
233
  }
232
234
  },
233
235
  cleanupStale: () => {
234
- const activePageIds = new Set(stack.list().map((page) => page.id))
236
+ const activePageIds = new Set(getPages(tab.id).map((page) => page.id))
235
237
  for (const id of recyclingBin) {
236
238
  if (!activePageIds.has(id)) evictPageCache(id)
237
239
  }
@@ -64,6 +64,11 @@ export interface ITabItem extends ITabBase {
64
64
  url?: string
65
65
  active: boolean
66
66
  pages: Stack<ITabPage>
67
+ /**
68
+ * 固定在标签栏最前方的内部标记(目前仅 homeTab 使用)。
69
+ * pinned 标签不可被拖动,其他标签也不能排到它前面;仅存在于运行时,不写入 __tab。
70
+ */
71
+ pinned?: boolean
67
72
  }
68
73
 
69
74
  /** 标签内的单个页面(对应 keep-alive 的一个缓存实例) */
@@ -1,4 +1,5 @@
1
1
  import type { ITabBase } from '../model/TabModel'
2
+ import { isRecord } from './typeGuards'
2
3
 
3
4
  interface EncodedTabInfoV1 {
4
5
  version: 1
@@ -14,20 +15,42 @@ interface EncodedTabInfoV1 {
14
15
  * 标签信息编解码器
15
16
  *
16
17
  * 职责:将标签元数据编码为 URL query 可用的短字符串,用于 __tab 参数。
17
- * 当前格式为 JSON + Base64,兼容旧版 id|title|iframe|closable|refreshable|mode 编码。
18
+ * 当前格式为 JSON + Base64URL;解码同时兼容标准 Base64(历史链接)与
19
+ * 旧版 id|title|iframe|closable|refreshable|mode 编码。
18
20
  */
19
21
 
20
22
  const MAX_DECODED_TAB_INFO_LENGTH = 2048
21
23
  const MAX_ENCODED_TAB_INFO_LENGTH = 4096
24
+ /** URL 中 __tab 的 title 上限,避免超长标题把 payload 顶到解码上限导致 id 丢失。 */
25
+ export const MAX_TAB_TITLE_LENGTH = 256
26
+ /** legacy 格式中 id 的合理上限,用于拒绝任意字符串伪装成标签 id。 */
27
+ const MAX_LEGACY_TAB_ID_LENGTH = 128
22
28
 
23
29
  /**
24
- * 把任意 UTF-8 字符串安全地编码为 base64(避免中文/特殊字符直接 btoa 抛错)。
25
- * 使用 encodeURIComponent + unescape 是经典跨浏览器方案,比手动管理 TextEncoder 更简洁。
30
+ * 把 UTF-8 字符串编码为 Base64URL(无填充、`+`→`-`、`/`→`_`)。
31
+ * 使用 TextEncoder 取代已废弃的 escape/unescape,同时让结果可直接放进 URL。
26
32
  */
27
- const encodeBase64 = (value: string): string => btoa(unescape(encodeURIComponent(value)))
33
+ const encodeBase64Url = (value: string): string => {
34
+ const bytes = new TextEncoder().encode(value)
35
+ let binary = ''
36
+ for (const byte of bytes) binary += String.fromCharCode(byte)
37
+ return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')
38
+ }
28
39
 
29
- /** encodeBase64 的逆操作,非合法 base64 时抛错,由调用方 try/catch。 */
30
- const decodeBase64 = (encoded: string): string => decodeURIComponent(escape(atob(encoded)))
40
+ /**
41
+ * 解码 Base64URL / 标准 Base64。
42
+ * 兼容旧链接:先还原 URL-safe 字符与填充,再按 UTF-8 解码。
43
+ */
44
+ const decodeBase64 = (encoded: string): string => {
45
+ const normalized = encoded.replace(/-/g, '+').replace(/_/g, '/')
46
+ const padded = normalized + '='.repeat((4 - (normalized.length % 4)) % 4)
47
+ const binary = atob(padded)
48
+ const bytes = new Uint8Array(binary.length)
49
+ for (let index = 0; index < binary.length; index++) {
50
+ bytes[index] = binary.charCodeAt(index)
51
+ }
52
+ return new TextDecoder().decode(bytes)
53
+ }
31
54
 
32
55
  const DEFAULT_TAB_INFO: ITabBase = {
33
56
  id: '',
@@ -38,7 +61,14 @@ const DEFAULT_TAB_INFO: ITabBase = {
38
61
  iframeRefreshMode: 'postMessage'
39
62
  }
40
63
 
41
- import { isRecord } from './typeGuards'
64
+ /** 检测控制字符,避免 legacy id 携带不可见字符。 */
65
+ const hasControlCharacter = (value: string): boolean => {
66
+ for (const char of value) {
67
+ const code = char.charCodeAt(0)
68
+ if (code <= 31 || code === 127) return true
69
+ }
70
+ return false
71
+ }
42
72
 
43
73
  const toTabInfo = (payload: unknown): ITabBase => {
44
74
  if (!isRecord(payload)) return { ...DEFAULT_TAB_INFO }
@@ -54,16 +84,36 @@ const toTabInfo = (payload: unknown): ITabBase => {
54
84
  }
55
85
  }
56
86
 
87
+ /**
88
+ * 旧版分隔符格式:id|title|iframe|closable|refreshable[|mode]。
89
+ *
90
+ * 严格校验字段数量与 Y/N 标记:非法字符串(例如 `?__tab=invalid`)不能再被解析成
91
+ * 任意 id 的标签。格式不合法时返回默认值,由路由层走兜底标签逻辑。
92
+ */
57
93
  const decodeLegacyTabInfo = (tabString: string): ITabBase => {
58
94
  const tabValues: string[] = tabString.split('|')
59
- const refreshMode = tabValues[5] === 'R' ? ('reload' as const) : ('postMessage' as const)
95
+ if (tabValues.length < 5 || tabValues.length > 6) return { ...DEFAULT_TAB_INFO }
96
+
97
+ const [id = '', title = '', iframe, closable, refreshable, mode] = tabValues
98
+ const isFlag = (value: string | undefined): value is 'Y' | 'N' => value === 'Y' || value === 'N'
99
+ const hasValidId =
100
+ id.length > 0 &&
101
+ id.length <= MAX_LEGACY_TAB_ID_LENGTH &&
102
+ id.trim() === id &&
103
+ !hasControlCharacter(id)
104
+
105
+ if (!hasValidId || !isFlag(iframe) || !isFlag(closable) || !isFlag(refreshable)) {
106
+ return { ...DEFAULT_TAB_INFO }
107
+ }
108
+ if (mode !== undefined && mode !== '' && mode !== 'R') return { ...DEFAULT_TAB_INFO }
109
+
60
110
  return {
61
- id: tabValues[0] ?? '',
62
- title: tabValues[1] ?? '',
63
- iframe: tabValues[2] === 'Y',
64
- closable: tabValues[3] === 'Y',
65
- refreshable: tabValues[4] === 'Y',
66
- iframeRefreshMode: refreshMode
111
+ id,
112
+ title,
113
+ iframe: iframe === 'Y',
114
+ closable: closable === 'Y',
115
+ refreshable: refreshable === 'Y',
116
+ iframeRefreshMode: mode === 'R' ? 'reload' : 'postMessage'
67
117
  }
68
118
  }
69
119
 
@@ -71,13 +121,13 @@ export const encodeTabInfo = (tabData: ITabBase): string => {
71
121
  const payload: EncodedTabInfoV1 = {
72
122
  version: 1,
73
123
  id: tabData.id,
74
- title: tabData.title,
124
+ title: tabData.title.slice(0, MAX_TAB_TITLE_LENGTH),
75
125
  iframe: tabData.iframe,
76
126
  closable: tabData.closable,
77
127
  refreshable: tabData.refreshable,
78
128
  iframeRefreshMode: tabData.iframeRefreshMode === 'reload' ? 'reload' : 'postMessage'
79
129
  }
80
- return encodeBase64(JSON.stringify(payload))
130
+ return encodeBase64Url(JSON.stringify(payload))
81
131
  }
82
132
 
83
133
  export const decodeTabInfo = (encoded: string): ITabBase => {
@@ -102,4 +152,38 @@ export const decodeTabInfo = (encoded: string): ITabBase => {
102
152
  }
103
153
  }
104
154
 
105
- export const createPageId = (): string => crypto.randomUUID()
155
+ /**
156
+ * 生成运行时 id。
157
+ *
158
+ * `crypto.randomUUID` 仅在安全上下文(https / localhost)可用;内网 http 部署时
159
+ * 回退到 `crypto.getRandomValues`(非安全上下文同样可用),最后才退回 Math.random,
160
+ * 避免在受限环境下直接抛 TypeError 导致整个组件不可用。
161
+ */
162
+ export const createId = (): string => {
163
+ const cryptoObject = globalThis.crypto
164
+
165
+ if (typeof cryptoObject?.randomUUID === 'function') {
166
+ return cryptoObject.randomUUID()
167
+ }
168
+
169
+ const bytes = new Uint8Array(16)
170
+ if (typeof cryptoObject?.getRandomValues === 'function') {
171
+ cryptoObject.getRandomValues(bytes)
172
+ } else {
173
+ for (let index = 0; index < bytes.length; index++) {
174
+ bytes[index] = Math.floor(Math.random() * 256)
175
+ }
176
+ }
177
+
178
+ // RFC 4122 version 4 + variant bits
179
+ bytes[6] = (bytes[6]! & 0x0f) | 0x40
180
+ bytes[8] = (bytes[8]! & 0x3f) | 0x80
181
+
182
+ const hex: string[] = []
183
+ for (const byte of bytes) hex.push(byte.toString(16).padStart(2, '0'))
184
+ return `${hex.slice(0, 4).join('')}-${hex.slice(4, 6).join('')}-${hex
185
+ .slice(6, 8)
186
+ .join('')}-${hex.slice(8, 10).join('')}-${hex.slice(10, 16).join('')}`
187
+ }
188
+
189
+ export const createPageId = (): string => createId()
@@ -68,28 +68,42 @@ export function decodeSafeTabUrl(encodedUrl: unknown): string {
68
68
  }
69
69
 
70
70
  /**
71
- * 判断 URL 是否为跨域(相对路径或同源视为同域)
71
+ * 判断 URL 是否为跨域(相对路径或同源视为同域)。
72
+ *
73
+ * 统一用 `new URL(url, origin)` 解析,协议相对 URL(`//host/path`)也会按实际
74
+ * origin 判定,避免被误判为同源。`about:blank` 与相对路径视为同源。
72
75
  * @param url - 待检查的 URL
73
76
  */
74
77
  export function isCrossOriginUrl(url: string): boolean {
75
- if (!url || !/^https?:\/\//i.test(url)) return false
78
+ if (!url) return false
79
+ const base = getUrlBase()
76
80
  try {
77
- const cur = typeof window !== 'undefined' ? window.location : { origin: 'http://localhost' }
78
- const u = new URL(url, cur.origin)
79
- return u.origin !== cur.origin
81
+ const parsed = new URL(url, base)
82
+ // 非 http(s) 不是「跨域」,而是非法 URL;由 isAllowedTabUrl 负责拒绝。
83
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return false
84
+ return parsed.origin !== new URL(base).origin
80
85
  } catch {
81
86
  return true
82
87
  }
83
88
  }
84
89
 
85
90
  /**
86
- * 解析 URL 字符串为 path 和 query
87
- * @param uri 完整 URL 或 path?query 字符串
91
+ * 解析 URL 字符串为 path、query 和 hash。
92
+ *
93
+ * hash 会先从 query 中剥离,避免 `/page?x=1#section` 被解析成 `query.x = '1#section'`。
94
+ * @param uri 完整 URL 或 path?query#hash 字符串
88
95
  */
89
- export function parseUrl(uri: string): { path: string; query: LocationQueryRaw } {
90
- const [pathPart = '', queryPart] = uri.split('?')
96
+ export function parseUrl(uri: string): {
97
+ path: string
98
+ query: LocationQueryRaw
99
+ hash: string
100
+ } {
101
+ const hashIndex = uri.indexOf('#')
102
+ const hash = hashIndex >= 0 ? uri.slice(hashIndex) : ''
103
+ const withoutHash = hashIndex >= 0 ? uri.slice(0, hashIndex) : uri
104
+ const [pathPart = '', queryPart] = withoutHash.split('?')
91
105
  if (queryPart === undefined) {
92
- return { path: pathPart, query: {} }
106
+ return { path: pathPart, query: {}, hash }
93
107
  }
94
108
 
95
109
  const params = new URLSearchParams(queryPart)
@@ -102,7 +116,17 @@ export function parseUrl(uri: string): { path: string; query: LocationQueryRaw }
102
116
  }
103
117
  query[key] = Array.isArray(existing) ? [...existing, value] : [existing, value]
104
118
  }
105
- return { path: pathPart, query }
119
+ return { path: pathPart, query, hash }
120
+ }
121
+
122
+ /**
123
+ * 规范化 pathname:去掉末尾多余斜杠(根路径 `/` 保留)。
124
+ * 页面栈比较与写入统一使用,避免 `/list` 与 `/list/` 被当成两个页面。
125
+ */
126
+ export function normalizePathname(path: string): string {
127
+ if (!path || path === '/') return path
128
+ const normalized = path.replace(/\/+$/, '')
129
+ return normalized || '/'
106
130
  }
107
131
 
108
132
  /** 浅克隆 LocationQueryRaw,避免引用共享导致的副作用 */
@@ -1,2 +0,0 @@
1
- .stack-tab__contextmenu-title[data-v-3d616fa0]{margin-left:8px}.divider[data-v-cfc33246]{height:1px;margin:5px 0;position:relative}.div-transparent[data-v-cfc33246]:before{content:"";background-image:linear-gradient(90deg,#0000,#a9a9a9,#0000);width:100%;height:1px;position:absolute;top:0;left:0;right:0}.stack-tab{grid-gap:5px;background-color:#fff;flex-direction:column;min-height:300px;display:flex}.stack-tab__container{flex:1 1 0;position:relative;overflow:hidden}.stack-tab__keep-alive-panel{width:100%;height:100%;position:absolute;top:0;left:0}.stack-tab .cache-page-wrapper{width:100%;height:100%}.stack-tab__maximum{position:fixed;top:0;left:0;width:100vw!important;height:100vh!important}.stack-tab__mask-button{background-color:#4d4d4d;width:20px;height:100%;margin:0 5px;transition:all .15s ease-in-out}.stack-tab__header-button[disabled] .stack-tab__mask-button{cursor:not-allowed;background-color:#aaa;transition:none}.stack-tab__mask-button:hover{background-color:#409eff}.stack-tab__mask-button:active{background-color:#337ecc}.stack-tab__button{width:20px;height:20px;margin:0 5px}.stack-tab__header{box-sizing:border-box;border-bottom:1px solid #f0f0f0;width:100%;height:40px;display:flex;position:relative}.stack-tab__header-button{z-index:2;cursor:pointer;width:fit-content;height:40px;color:inherit;font:inherit;text-align:inherit;appearance:none;background-color:#fff;border:0;align-items:center;padding:0;display:flex;overflow:hidden}.stack-tab__header-button[disabled]{box-shadow:none;cursor:not-allowed;background-color:#fafafa}.stack-tab__scroll{flex:1 1 0;height:40px;position:relative;overflow:hidden}.stack-tab__scroll-container{width:100%;height:100%;overflow:hidden}.stack-tab__scroll-container.is-mobile{overflow:auto hidden}.stack-tab__scrollbar{opacity:0;background-color:#0000001a;border-radius:6px;height:6px;transition:all .15s ease-in-out;position:absolute;bottom:0;left:0;right:0}.stack-tab__scroll:hover .stack-tab__scrollbar,.stack-tab__scrollbar.is-dragging{opacity:1}.stack-tab__scrollbar-thumb{background-color:#0000001a;border-radius:6px;height:100%;transition:background-color .3s ease-in-out;position:absolute;top:0;left:0}.stack-tab__scrollbar-thumb:hover{cursor:grab}.stack-tab__scrollbar-thumb:hover:active{cursor:grabbing}.stack-tab__scrollbar.is-dragging .stack-tab__scrollbar-thumb,.stack-tab__scrollbar-thumb:hover{background-color:#409eff!important}.stack-tab__nav{content-visibility:auto;flex-wrap:nowrap;height:100%;margin:0;padding:0 16px 0 0;list-style:none;display:inline-flex;position:relative}.stack-tab__item{color:#4d4d4d;cursor:pointer;-webkit-user-select:none;user-select:none;transform-origin:0 100%;content-visibility:auto;background-color:#fafafa;border:1px solid #f0f0f0;border-left:none;border-radius:8px 8px 0 0;flex:none;align-items:center;margin-top:5px;padding:0 24px;font-size:14px;transition:all .15s ease-in-out;display:flex;position:relative}.stack-tab__item:first-child{border-left:1px solid #f0f0f0}.stack-tab__item.is-dragging{opacity:.55}.stack-tab__item.is-drop-before:before,.stack-tab__item.is-drop-after:after{z-index:2;content:"";background:#409eff;border-radius:2px;width:5px;position:absolute;top:2px;bottom:2px;box-shadow:0 0 6px #409effcc}.stack-tab__item.is-drop-before:before{left:-3px}.stack-tab__item.is-drop-after:after{right:-3px}.stack-tab__item.is-contextmenu{color:#000}.stack-tab__item.is-active{z-index:1;margin-top:unset;background-color:#fff;border-bottom-color:#fff;box-shadow:-5px 0 5px -5px #0009,5px 0 5px -5px #0009}.stack-tab__item:hover,.stack-tab__item.is-active{color:#409eff}.stack-tab__item:hover.is-icon,.stack-tab__item.is-active.is-icon{padding:0 12px}.stack-tab__item:hover.is-icon .stack-tab__item-button,.stack-tab__item.is-active.is-icon .stack-tab__item-button{width:20px;margin-left:4px}.stack-tab__item-tab{min-width:0;height:100%;color:inherit;cursor:inherit;font:inherit;text-align:inherit;appearance:none;background:0 0;border:0;flex:auto;align-items:center;padding:0;display:flex}.stack-tab__item-title{flex:1 1 0;display:flex}.stack-tab__item-title-content{text-overflow:ellipsis;white-space:nowrap;min-width:30px;max-width:100px;overflow:hidden}.stack-tab__item-icon{margin-right:5px;font-size:16px}.stack-tab__item-button{width:0;height:100%;font:inherit;appearance:none;background-color:#4d4d4d;border:0;padding:0;transition:all .15s ease-in-out}.stack-tab__item-button:hover{background-color:#409eff}.stack-tab__item-button:active{background-color:#337ecc}.stack-tab__badge{display:inline-block;position:relative}.stack-tab__badge-content{color:#fff;text-align:center;box-sizing:border-box;border:1px solid #fff;border-radius:.5rem;min-width:.5rem;min-height:.5rem;padding:.3rem;font-size:.5rem;line-height:.4rem;position:absolute;top:.1rem;right:.1rem;transform:translate(100%)translateY(-50%)}.stack-tab__badge-content.default{background:#ef4f4f}.stack-tab__badge-content.primary{background:#409eff}.stack-tab__iframes{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0}.stack-tab__iframe-wrapper{pointer-events:auto;width:100%;height:100%;position:absolute;top:0;left:0}.stack-tab__iframe{border:0;width:100%;height:100%;position:absolute;top:0;left:0}.stack-tab__iframe-loading{z-index:1;background:var(--stack-tab-iframe-loading-bg,#f5f5f5);justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:absolute;top:0;left:0}.stack-tab__iframe-loading-text{color:var(--stack-tab-iframe-loading-color,#999);font-size:var(--stack-tab-font-size,14px)}.stack-tab__iframe-error{z-index:2;pointer-events:auto;background:var(--stack-tab-iframe-error-bg,#ffffffeb);box-sizing:border-box;justify-content:center;align-items:center;gap:8px;width:100%;height:100%;padding:16px;display:flex;position:absolute;top:0;left:0}.stack-tab__iframe-error-text{color:var(--stack-tab-iframe-error-color,#666);font-size:var(--stack-tab-font-size,14px)}.stack-tab__iframe-error-retry,.stack-tab__iframe-error-open{color:#4d4d4d;cursor:pointer;font:inherit;background:#fff;border:1px solid #f0f0f0;border-radius:6px;padding:4px 10px}.stack-tab__contextmenu{z-index:999;transform-origin:0 0;background:#fff;border:1px solid #f0f0f0;border-radius:10px 0;min-width:120px;padding:8px;font-size:14px;position:fixed;box-shadow:5px 5px 5px #0000001a}.stack-tab__contextmenu-item{width:100%;min-height:30px;line-height:30px;font:inherit;text-align:inherit;appearance:none;box-sizing:border-box;color:#4d4d4d;cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:0;border-radius:10px 0;justify-content:flex-start;align-items:center;margin:0;padding:0 10px;transition:color .2s ease-in-out,background-color .2s ease-in-out;display:flex;position:relative}.stack-tab__contextmenu-item:hover,.stack-tab__contextmenu-item:active,.stack-tab__contextmenu-item:focus-visible{color:#fff;background-color:#409eff}.stack-tab__contextmenu-item:hover .svg-mask,.stack-tab__contextmenu-item:active .svg-mask,.stack-tab__contextmenu-item:focus-visible .svg-mask{background-color:#fff}.stack-tab__contextmenu-item:focus{outline:none}.stack-tab__contextmenu-item[disabled]{color:#aaa;pointer-events:none;cursor:default;background:0 0}.stack-tab__contextmenu-item[disabled] .svg-mask{background-color:#aaa}.stack-tab__contextmenu-icon{width:14px;height:14px;transition:background-color .2s ease-in-out}.stack-tab__contextmenu-icon.svg-mask{background-color:#4d4d4d;width:14px;height:14px}.stack-tab__shadow-left{box-shadow:-5px 0 5px -5px #0009}.stack-tab__shadow-right{box-shadow:5px 0 5px -5px #0009}.stack-tab__shadow-inset-left:after{content:"";pointer-events:none;position:absolute;inset:0;box-shadow:inset 5px 0 5px -5px #0009}.stack-tab__shadow-inset-right:after{content:"";pointer-events:none;position:absolute;inset:0;box-shadow:inset -5px 0 5px -5px #0009}.stack-tab__shadow-inset-all:after{content:"";pointer-events:none;position:absolute;inset:0;box-shadow:inset 5px 0 5px -5px #0009,inset -5px 0 5px -5px #0009}.stack-tab__shadow-inset-top:after{content:"";pointer-events:none;position:absolute;inset:0;box-shadow:inset 0 5px 5px -5px #0009}.stack-tab__shadow-inset-bottom:after{content:"";pointer-events:none;position:absolute;inset:0;box-shadow:inset 0 -5px 5px -5px #0009}.stack-tab__shadow-inset-vertical:after{content:"";pointer-events:none;position:absolute;inset:0;box-shadow:inset 0 5px 5px -5px #0009,inset 0 -5px 5px -5px #0009}.stack-tab__icon-fullscreen{-webkit-mask:url("data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1659850629232'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='8369'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='200'%20height='200'%3e%3cdefs%3e%3cstyle%20type='text/css'%3e%3c/style%3e%3c/defs%3e%3cpath%20d='M358.4%20768H426.666667v85.333333H213.333333v-213.333333h85.333334v68.266667l128-128%2059.733333%2059.733333-128%20128z%20m345.6%200l-128-128%2059.733333-59.733333%20132.266667%20132.266666V640h85.333333v213.333333h-213.333333v-85.333333h64zM358.4%20298.666667l128%20128-59.733333%2059.733333-128-128V426.666667H213.333333V213.333333h213.333334v85.333334H358.4z%20m345.6%200H640V213.333333h213.333333v213.333334h-85.333333V354.133333l-132.266667%20132.266667-59.733333-59.733333%20128-128z'%20fill='%23444444'%20p-id='8370'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1659850629232'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='8369'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='200'%20height='200'%3e%3cdefs%3e%3cstyle%20type='text/css'%3e%3c/style%3e%3c/defs%3e%3cpath%20d='M358.4%20768H426.666667v85.333333H213.333333v-213.333333h85.333334v68.266667l128-128%2059.733333%2059.733333-128%20128z%20m345.6%200l-128-128%2059.733333-59.733333%20132.266667%20132.266666V640h85.333333v213.333333h-213.333333v-85.333333h64zM358.4%20298.666667l128%20128-59.733333%2059.733333-128-128V426.666667H213.333333V213.333333h213.333334v85.333334H358.4z%20m345.6%200H640V213.333333h213.333333v213.333334h-85.333333V354.133333l-132.266667%20132.266667-59.733333-59.733333%20128-128z'%20fill='%23444444'%20p-id='8370'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-restore{-webkit-mask:url("data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1659850610341'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='8217'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='200'%20height='200'%3e%3cdefs%3e%3cstyle%20type='text/css'%3e%3c/style%3e%3c/defs%3e%3cpath%20d='M298.666667%20631.466667H226.133333v-81.066667h217.6v204.8h-85.333333v-68.266667l-128%20128L170.666667%20759.466667l128-128z%20m422.4%200l128%20128-59.733334%2059.733333-128-128v68.266667h-85.333333V554.666667h217.6v81.066666h-72.533333zM298.666667%20341.333333L187.733333%20230.4%20243.2%20170.666667l115.2%20115.2V217.6h85.333333v204.8H226.133333V341.333333H298.666667z%20m430.933333%200h64v81.066667h-217.6V217.6h85.333333v72.533333L780.8%20170.666667l59.733333%2059.733333L729.6%20341.333333z'%20fill='%23444444'%20p-id='8218'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1659850610341'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='8217'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='200'%20height='200'%3e%3cdefs%3e%3cstyle%20type='text/css'%3e%3c/style%3e%3c/defs%3e%3cpath%20d='M298.666667%20631.466667H226.133333v-81.066667h217.6v204.8h-85.333333v-68.266667l-128%20128L170.666667%20759.466667l128-128z%20m422.4%200l128%20128-59.733334%2059.733333-128-128v68.266667h-85.333333V554.666667h217.6v81.066666h-72.533333zM298.666667%20341.333333L187.733333%20230.4%20243.2%20170.666667l115.2%20115.2V217.6h85.333333v204.8H226.133333V341.333333H298.666667z%20m430.933333%200h64v81.066667h-217.6V217.6h85.333333v72.533333L780.8%20170.666667l59.733333%2059.733333L729.6%20341.333333z'%20fill='%23444444'%20p-id='8218'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-close{-webkit-mask:url("data:image/svg+xml,%3csvg%20class='icon'%20width='200'%20height='200'%20p-id='1922'%20t='1660030183477'%20version='1.1'%20viewBox='0%200%201024%201024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cdefs%3e%3cstyle%20type='text/css'/%3e%3c/defs%3e%3cpath%20d='m235.52%20204.8c-7.6799%200-15.362%203.0703-21.506%209.2143-12.288%2012.288-12.288%2030.724%200%2043.013l254.97%20254.97-254.97%20254.97c-12.288%2012.288-12.288%2030.724%200%2043.013%206.1439%206.1441%2013.826%209.2143%2021.506%209.2143%207.68%200%2015.362-3.0703%2021.506-9.2143l254.97-254.97%20254.97%20254.97c6.1439%206.1441%2013.826%209.2143%2021.506%209.2143%207.6799%200%2015.362-3.0703%2021.506-9.2143%2012.288-12.288%2012.288-30.724%200-43.013l-254.97-254.97%20254.97-254.97c12.288-12.288%2012.288-30.724%200-43.013-6.1439-6.1441-13.826-9.2143-21.506-9.2143-7.68%200-15.362%203.0703-21.506%209.2143l-254.97%20254.97-254.97-254.97c-6.1439-6.1441-13.826-9.2143-21.506-9.2143z'%20stroke-width='.96001'/%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3csvg%20class='icon'%20width='200'%20height='200'%20p-id='1922'%20t='1660030183477'%20version='1.1'%20viewBox='0%200%201024%201024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cdefs%3e%3cstyle%20type='text/css'/%3e%3c/defs%3e%3cpath%20d='m235.52%20204.8c-7.6799%200-15.362%203.0703-21.506%209.2143-12.288%2012.288-12.288%2030.724%200%2043.013l254.97%20254.97-254.97%20254.97c-12.288%2012.288-12.288%2030.724%200%2043.013%206.1439%206.1441%2013.826%209.2143%2021.506%209.2143%207.68%200%2015.362-3.0703%2021.506-9.2143l254.97-254.97%20254.97%20254.97c6.1439%206.1441%2013.826%209.2143%2021.506%209.2143%207.6799%200%2015.362-3.0703%2021.506-9.2143%2012.288-12.288%2012.288-30.724%200-43.013l-254.97-254.97%20254.97-254.97c12.288-12.288%2012.288-30.724%200-43.013-6.1439-6.1441-13.826-9.2143-21.506-9.2143-7.68%200-15.362%203.0703-21.506%209.2143l-254.97%20254.97-254.97-254.97c-6.1439-6.1441-13.826-9.2143-21.506-9.2143z'%20stroke-width='.96001'/%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-close-fill{-webkit-mask:url("data:image/svg+xml,%3csvg%20t='1676454450456'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='4689'%20width='200'%20height='200'%3e%3cpath%20d='M512%20451.669333L421.504%20361.130667A42.666667%2042.666667%200%200%200%20361.130667%20421.546667L451.669333%20512l-90.538666%2090.496a42.666667%2042.666667%200%200%200%2060.373333%2060.373333L512%20572.330667l90.496%2090.538666a42.666667%2042.666667%200%200%200%2060.373333-60.373333L572.330667%20512l90.538666-90.496a42.666667%2042.666667%200%201%200-60.373333-60.373333L512%20451.669333z%20m-271.530667%20331.861334A384%20384%200%201%201%20783.530667%20240.469333%20384%20384%200%200%201%20240.469333%20783.530667z'%20fill='%23000000'%20p-id='4690'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3csvg%20t='1676454450456'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='4689'%20width='200'%20height='200'%3e%3cpath%20d='M512%20451.669333L421.504%20361.130667A42.666667%2042.666667%200%200%200%20361.130667%20421.546667L451.669333%20512l-90.538666%2090.496a42.666667%2042.666667%200%200%200%2060.373333%2060.373333L512%20572.330667l90.496%2090.538666a42.666667%2042.666667%200%200%200%2060.373333-60.373333L572.330667%20512l90.538666-90.496a42.666667%2042.666667%200%201%200-60.373333-60.373333L512%20451.669333z%20m-271.530667%20331.861334A384%20384%200%201%201%20783.530667%20240.469333%20384%20384%200%200%201%20240.469333%20783.530667z'%20fill='%23000000'%20p-id='4690'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-close-lefts{-webkit-mask:url("data:image/svg+xml,%3csvg%20t='1676511927584'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='18731'%20width='200'%20height='200'%3e%3cpath%20d='M156%20219H92a4%204%200%200%200-4%204v634a4%204%200%200%200%204%204h64a4%204%200%200%200%204-4V223a4%204%200%200%200-4-4z%20m756.7%20128.4h-368V172.8a16%2016%200%200%200-16.2-16%2015.4%2015.4%200%200%200-12.2%205.9L238.9%20501.9a16%2016%200%200%200%200%2020.2l277.4%20339.2a15.4%2015.4%200%200%200%2012.2%205.9%2016%2016%200%200%200%2016.2-16V676.6h368a16%2016%200%200%200%2016-16V363.4a16%2016%200%200%200-16-16z%20m-56%20257.2h-384v89.6L323.7%20512l149-182.2v89.6h384z'%20p-id='18732'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3csvg%20t='1676511927584'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='18731'%20width='200'%20height='200'%3e%3cpath%20d='M156%20219H92a4%204%200%200%200-4%204v634a4%204%200%200%200%204%204h64a4%204%200%200%200%204-4V223a4%204%200%200%200-4-4z%20m756.7%20128.4h-368V172.8a16%2016%200%200%200-16.2-16%2015.4%2015.4%200%200%200-12.2%205.9L238.9%20501.9a16%2016%200%200%200%200%2020.2l277.4%20339.2a15.4%2015.4%200%200%200%2012.2%205.9%2016%2016%200%200%200%2016.2-16V676.6h368a16%2016%200%200%200%2016-16V363.4a16%2016%200%200%200-16-16z%20m-56%20257.2h-384v89.6L323.7%20512l149-182.2v89.6h384z'%20p-id='18732'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-close-rights{-webkit-mask:url("data:image/svg+xml,%3csvg%20t='1676511848479'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='18577'%20width='200'%20height='200'%3e%3cpath%20d='M924%20191h-64a4%204%200%200%200-4%204v634a4%204%200%200%200%204%204h64a4%204%200%200%200%204-4V195a4%204%200%200%200-4-4z%20m-416.3-28.3a15.4%2015.4%200%200%200-12.2-5.9%2016%2016%200%200%200-16.2%2016v174.6h-368a16%2016%200%200%200-16%2016v297.2a16%2016%200%200%200%2016%2016h368v174.6a16%2016%200%200%200%2016.2%2016%2015.4%2015.4%200%200%200%2012.2-5.9l277.4-339.2a16%2016%200%200%200%200-20.2z%20m43.6%20531.5v-89.6h-384V419.4h384v-89.6l149%20182.2z'%20p-id='18578'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3csvg%20t='1676511848479'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='18577'%20width='200'%20height='200'%3e%3cpath%20d='M924%20191h-64a4%204%200%200%200-4%204v634a4%204%200%200%200%204%204h64a4%204%200%200%200%204-4V195a4%204%200%200%200-4-4z%20m-416.3-28.3a15.4%2015.4%200%200%200-12.2-5.9%2016%2016%200%200%200-16.2%2016v174.6h-368a16%2016%200%200%200-16%2016v297.2a16%2016%200%200%200%2016%2016h368v174.6a16%2016%200%200%200%2016.2%2016%2015.4%2015.4%200%200%200%2012.2-5.9l277.4-339.2a16%2016%200%200%200%200-20.2z%20m43.6%20531.5v-89.6h-384V419.4h384v-89.6l149%20182.2z'%20p-id='18578'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-close-others{-webkit-mask:url("data:image/svg+xml,%3csvg%20t='1695280793106'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='9167'%20width='200'%20height='200'%3e%3cpath%20d='M388.266667%20512L290.133333%20413.866667l29.866667-29.866667%20149.333333%20149.333333L320%20682.666667l-29.866667-29.866667L388.266667%20554.666667H128v-42.666667h260.266667z%20m290.133333%200H938.666667v42.666667h-260.266667l98.133333%2098.133333-29.866666%2029.866667-149.333334-149.333334L746.666667%20384l29.866666%2029.866667-98.133333%2098.133333z'%20fill='%23444444'%20p-id='9168'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3csvg%20t='1695280793106'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='9167'%20width='200'%20height='200'%3e%3cpath%20d='M388.266667%20512L290.133333%20413.866667l29.866667-29.866667%20149.333333%20149.333333L320%20682.666667l-29.866667-29.866667L388.266667%20554.666667H128v-42.666667h260.266667z%20m290.133333%200H938.666667v42.666667h-260.266667l98.133333%2098.133333-29.866666%2029.866667-149.333334-149.333334L746.666667%20384l29.866666%2029.866667-98.133333%2098.133333z'%20fill='%23444444'%20p-id='9168'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-close-all{-webkit-mask:url("data:image/svg+xml,%3csvg%20t='1660395177016'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='2947'%20width='200'%20height='200'%3e%3cpath%20d='M354%20671h58.9c4.7%200%209.2-2.1%2012.3-5.7L512%20561.8l86.8%20103.5c3%203.6%207.5%205.7%2012.3%205.7H670c6.8%200%2010.5-7.9%206.1-13.1L553.8%20512l122.4-145.9c4.4-5.2%200.7-13.1-6.1-13.1h-58.9c-4.7%200-9.2%202.1-12.3%205.7L512%20462.2l-86.8-103.5c-3-3.6-7.5-5.7-12.3-5.7H354c-6.8%200-10.5%207.9-6.1%2013.1L470.2%20512%20347.9%20657.9c-4.4%205.2-0.7%2013.1%206.1%2013.1z'%20p-id='2948'%3e%3c/path%3e%3cpath%20d='M880%20112H144c-17.7%200-32%2014.3-32%2032v736c0%2017.7%2014.3%2032%2032%2032h736c17.7%200%2032-14.3%2032-32V144c0-17.7-14.3-32-32-32z%20m-40%20728H184V184h656v656z'%20p-id='2949'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3csvg%20t='1660395177016'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='2947'%20width='200'%20height='200'%3e%3cpath%20d='M354%20671h58.9c4.7%200%209.2-2.1%2012.3-5.7L512%20561.8l86.8%20103.5c3%203.6%207.5%205.7%2012.3%205.7H670c6.8%200%2010.5-7.9%206.1-13.1L553.8%20512l122.4-145.9c4.4-5.2%200.7-13.1-6.1-13.1h-58.9c-4.7%200-9.2%202.1-12.3%205.7L512%20462.2l-86.8-103.5c-3-3.6-7.5-5.7-12.3-5.7H354c-6.8%200-10.5%207.9-6.1%2013.1L470.2%20512%20347.9%20657.9c-4.4%205.2-0.7%2013.1%206.1%2013.1z'%20p-id='2948'%3e%3c/path%3e%3cpath%20d='M880%20112H144c-17.7%200-32%2014.3-32%2032v736c0%2017.7%2014.3%2032%2032%2032h736c17.7%200%2032-14.3%2032-32V144c0-17.7-14.3-32-32-32z%20m-40%20728H184V184h656v656z'%20p-id='2949'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-reload{-webkit-mask:url("data:image/svg+xml,%3csvg%20class='icon'%20width='200'%20height='200'%20p-id='6183'%20t='1660269579969'%20version='1.1'%20viewBox='0%200%201024%201024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cdefs%3e%3cstyle%20type='text/css'/%3e%3c/defs%3e%3cpath%20d='m512%2015.756c-273.37%200-494.99%20222.17-494.99%20496.24s221.61%20496.24%20494.99%20496.24%20494.99-222.17%20494.99-496.24c0-274.07-221.58-496.24-494.99-496.24zm0%20942.84c-246.06%200-445.51-199.94-445.51-446.63%200-246.68%20199.45-446.63%20445.51-446.63s445.51%20199.94%20445.51%20446.63-199.45%20446.63-445.51%20446.63z'%20p-id='6184'/%3e%3cpath%20d='m512.05%20308.72c-51.167%200-102.23%2019.852-141.25%2059.557-38.945%2039.672-58.5%2091.731-58.5%20143.72s19.522%20104.05%2058.5%20143.72c39.011%2039.705%2090.079%2059.557%20141.25%2059.557%2051.101%200%20102.17-19.852%20141.18-59.557%2038.945-39.672%2058.467-91.731%2058.467-143.72s-19.522-104.05-58.467-143.72c-39.011-39.705-90.079-59.557-141.18-59.557zm14.336%2047.599c3.3363-12.618%2016.153-20.183%2028.606-16.78%2012.486%203.4023%2019.819%2016.417%2016.483%2029.068-3.3363%2012.684-16.087%2020.249-28.54%2016.846-12.486-3.4023-19.885-16.417-16.549-29.134zm-155.85%20217.05c-12.387%203.4354-25.204-4.063-28.54-16.747-3.3362-12.684%203.9969-25.732%2016.483-29.134%2012.486-3.3693%2025.27%204.129%2028.606%2016.846%203.3362%2012.651-4.063%2025.633-16.549%2029.035zm16.417-154.33c-9.1169-9.2821-9.1169-24.312%200-33.594%209.1499-9.2821%2023.882-9.2821%2032.999%200%209.0839%209.2821%209.0839%2024.312%200%2033.594-9.1169%209.3151-23.882%209.3151-32.999%200zm106.69%20245.99c-3.3363%2012.618-16.153%2020.183-28.54%2016.78-12.486-3.4023-19.885-16.417-16.549-29.068%203.3363-12.684%2016.153-20.249%2028.606-16.846%2012.42%203.4023%2019.819%2016.417%2016.483%2029.134zm-52.224-84.463c-37.888-38.648-37.888-101.14%200-139.73%2037.888-38.549%2099.361-38.549%20137.25%200%2037.888%2038.582%2037.888%20101.11%200%20139.73-37.888%2038.549-99.361%2038.549-137.25%200zm191.75%2055.329c-9.1499%209.249-23.948%209.249-32.999%200-9.1169-9.2821-9.1169-24.345%200-33.594%209.0839-9.3151%2023.882-9.3151%2032.999%200%209.0508%209.249%209.0508%2024.279%200%2033.594zm44.924-171.17c3.3363%2012.717-4.063%2025.732-16.549%2029.134-12.387%203.3693-25.204-4.129-28.54-16.846-3.3363-12.651%204.063-25.699%2016.483-29.101%2012.486-3.3363%2025.27%204.129%2028.606%2016.813z'%20p-id='6185'/%3e%3cg%20transform='translate(.47897%2028.177)'%3e%3cpath%20d='m210.09%20197.4%2021.669%20142.01%2036.6-5.6816-21.669-142.04z'%20p-id='6186'/%3e%3cpath%20d='m398.01%20863.79%2023.222%2029.432%20109.24-89.484-23.222-29.432z'%20p-id='6187'/%3e%3cpath%20d='m777.55%20308.98-13.411%2035.179%20129.98%2051.266%2013.411-35.179z'%20p-id='6188'/%3e%3cpath%20d='m115.51%20606.64%20131.3%2051.795%2013.411-35.179-131.3-51.795z'%20p-id='6189'/%3e%3cpath%20d='m627.61%20103.85-23.189-29.432-105.77%2086.644%2023.189%2029.399z'%20p-id='6190'/%3e%3cpath%20d='m756.93%20636.2%2021.273%20139.92%2036.699-5.7806-21.306-139.96z'%20p-id='6191'/%3e%3c/g%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3csvg%20class='icon'%20width='200'%20height='200'%20p-id='6183'%20t='1660269579969'%20version='1.1'%20viewBox='0%200%201024%201024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cdefs%3e%3cstyle%20type='text/css'/%3e%3c/defs%3e%3cpath%20d='m512%2015.756c-273.37%200-494.99%20222.17-494.99%20496.24s221.61%20496.24%20494.99%20496.24%20494.99-222.17%20494.99-496.24c0-274.07-221.58-496.24-494.99-496.24zm0%20942.84c-246.06%200-445.51-199.94-445.51-446.63%200-246.68%20199.45-446.63%20445.51-446.63s445.51%20199.94%20445.51%20446.63-199.45%20446.63-445.51%20446.63z'%20p-id='6184'/%3e%3cpath%20d='m512.05%20308.72c-51.167%200-102.23%2019.852-141.25%2059.557-38.945%2039.672-58.5%2091.731-58.5%20143.72s19.522%20104.05%2058.5%20143.72c39.011%2039.705%2090.079%2059.557%20141.25%2059.557%2051.101%200%20102.17-19.852%20141.18-59.557%2038.945-39.672%2058.467-91.731%2058.467-143.72s-19.522-104.05-58.467-143.72c-39.011-39.705-90.079-59.557-141.18-59.557zm14.336%2047.599c3.3363-12.618%2016.153-20.183%2028.606-16.78%2012.486%203.4023%2019.819%2016.417%2016.483%2029.068-3.3363%2012.684-16.087%2020.249-28.54%2016.846-12.486-3.4023-19.885-16.417-16.549-29.134zm-155.85%20217.05c-12.387%203.4354-25.204-4.063-28.54-16.747-3.3362-12.684%203.9969-25.732%2016.483-29.134%2012.486-3.3693%2025.27%204.129%2028.606%2016.846%203.3362%2012.651-4.063%2025.633-16.549%2029.035zm16.417-154.33c-9.1169-9.2821-9.1169-24.312%200-33.594%209.1499-9.2821%2023.882-9.2821%2032.999%200%209.0839%209.2821%209.0839%2024.312%200%2033.594-9.1169%209.3151-23.882%209.3151-32.999%200zm106.69%20245.99c-3.3363%2012.618-16.153%2020.183-28.54%2016.78-12.486-3.4023-19.885-16.417-16.549-29.068%203.3363-12.684%2016.153-20.249%2028.606-16.846%2012.42%203.4023%2019.819%2016.417%2016.483%2029.134zm-52.224-84.463c-37.888-38.648-37.888-101.14%200-139.73%2037.888-38.549%2099.361-38.549%20137.25%200%2037.888%2038.582%2037.888%20101.11%200%20139.73-37.888%2038.549-99.361%2038.549-137.25%200zm191.75%2055.329c-9.1499%209.249-23.948%209.249-32.999%200-9.1169-9.2821-9.1169-24.345%200-33.594%209.0839-9.3151%2023.882-9.3151%2032.999%200%209.0508%209.249%209.0508%2024.279%200%2033.594zm44.924-171.17c3.3363%2012.717-4.063%2025.732-16.549%2029.134-12.387%203.3693-25.204-4.129-28.54-16.846-3.3363-12.651%204.063-25.699%2016.483-29.101%2012.486-3.3363%2025.27%204.129%2028.606%2016.813z'%20p-id='6185'/%3e%3cg%20transform='translate(.47897%2028.177)'%3e%3cpath%20d='m210.09%20197.4%2021.669%20142.01%2036.6-5.6816-21.669-142.04z'%20p-id='6186'/%3e%3cpath%20d='m398.01%20863.79%2023.222%2029.432%20109.24-89.484-23.222-29.432z'%20p-id='6187'/%3e%3cpath%20d='m777.55%20308.98-13.411%2035.179%20129.98%2051.266%2013.411-35.179z'%20p-id='6188'/%3e%3cpath%20d='m115.51%20606.64%20131.3%2051.795%2013.411-35.179-131.3-51.795z'%20p-id='6189'/%3e%3cpath%20d='m627.61%20103.85-23.189-29.432-105.77%2086.644%2023.189%2029.399z'%20p-id='6190'/%3e%3cpath%20d='m756.93%20636.2%2021.273%20139.92%2036.699-5.7806-21.306-139.96z'%20p-id='6191'/%3e%3c/g%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-reload-lefts{-webkit-mask:url("data:image/svg+xml,%3csvg%20t='1660395291415'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='7049'%20width='200'%20height='200'%3e%3cpath%20d='M266.666667%20523.093333a241.152%20241.152%200%200%201%2041.386666-136.106666%2032%2032%200%200%201%2053.333334%2035.413333%20181.504%20181.504%200%201%200%20151.04-80.64%20214.826667%20214.826667%200%200%200-61.866667%208.96%2032.384%2032.384%200%200%201-40.106667-21.333333%2032.042667%2032.042667%200%200%201%2021.333334-40.106667%20269.44%20269.44%200%200%201%2080.64-11.946667%20245.546667%20245.546667%200%201%201-245.76%20245.76z'%20fill='%23292D32'%20p-id='7050'%3e%3c/path%3e%3cpath%20d='M389.504%20350.72a32.256%2032.256%200%200%201-2.986667-45.226667l71.253334-81.493333a31.872%2031.872%200%200%201%2045.226666-2.986667%2032.256%2032.256%200%200%201%202.986667%2045.226667l-71.253333%2081.493333a34.389333%2034.389333%200%200%201-24.32%2010.666667%2032.469333%2032.469333%200%200%201-20.906667-7.68z'%20fill='%23292D32'%20p-id='7051'%3e%3c/path%3e%3cpath%20d='M474.453333%20413.013333L391.68%20352.426667a32.085333%2032.085333%200%200%201%2038.101333-51.626667l82.773334%2060.586667a31.957333%2031.957333%200%200%201%206.826666%2044.8%2032.725333%2032.725333%200%200%201-44.8%206.826666z'%20fill='%23292D32'%20p-id='7052'%3e%3c/path%3e%3cpath%20d='M640%20970.666667H384c-231.765333%200-330.666667-98.901333-330.666667-330.666667V384c0-231.765333%2098.901333-330.666667%20330.666667-330.666667h256c231.765333%200%20330.666667%2098.901333%20330.666667%20330.666667v256c0%20231.765333-98.901333%20330.666667-330.666667%20330.666667z%20m-256-853.333334C187.136%20117.333333%20117.333333%20187.136%20117.333333%20384v256c0%20196.864%2069.802667%20266.666667%20266.666667%20266.666667h256c196.864%200%20266.666667-69.802667%20266.666667-266.666667V384c0-196.864-69.76-266.666667-266.666667-266.666667z'%20fill='%23292D32'%20p-id='7053'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3csvg%20t='1660395291415'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='7049'%20width='200'%20height='200'%3e%3cpath%20d='M266.666667%20523.093333a241.152%20241.152%200%200%201%2041.386666-136.106666%2032%2032%200%200%201%2053.333334%2035.413333%20181.504%20181.504%200%201%200%20151.04-80.64%20214.826667%20214.826667%200%200%200-61.866667%208.96%2032.384%2032.384%200%200%201-40.106667-21.333333%2032.042667%2032.042667%200%200%201%2021.333334-40.106667%20269.44%20269.44%200%200%201%2080.64-11.946667%20245.546667%20245.546667%200%201%201-245.76%20245.76z'%20fill='%23292D32'%20p-id='7050'%3e%3c/path%3e%3cpath%20d='M389.504%20350.72a32.256%2032.256%200%200%201-2.986667-45.226667l71.253334-81.493333a31.872%2031.872%200%200%201%2045.226666-2.986667%2032.256%2032.256%200%200%201%202.986667%2045.226667l-71.253333%2081.493333a34.389333%2034.389333%200%200%201-24.32%2010.666667%2032.469333%2032.469333%200%200%201-20.906667-7.68z'%20fill='%23292D32'%20p-id='7051'%3e%3c/path%3e%3cpath%20d='M474.453333%20413.013333L391.68%20352.426667a32.085333%2032.085333%200%200%201%2038.101333-51.626667l82.773334%2060.586667a31.957333%2031.957333%200%200%201%206.826666%2044.8%2032.725333%2032.725333%200%200%201-44.8%206.826666z'%20fill='%23292D32'%20p-id='7052'%3e%3c/path%3e%3cpath%20d='M640%20970.666667H384c-231.765333%200-330.666667-98.901333-330.666667-330.666667V384c0-231.765333%2098.901333-330.666667%20330.666667-330.666667h256c231.765333%200%20330.666667%2098.901333%20330.666667%20330.666667v256c0%20231.765333-98.901333%20330.666667-330.666667%20330.666667z%20m-256-853.333334C187.136%20117.333333%20117.333333%20187.136%20117.333333%20384v256c0%20196.864%2069.802667%20266.666667%20266.666667%20266.666667h256c196.864%200%20266.666667-69.802667%20266.666667-266.666667V384c0-196.864-69.76-266.666667-266.666667-266.666667z'%20fill='%23292D32'%20p-id='7053'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-reload-rights{-webkit-mask:url("data:image/svg+xml,%3csvg%20t='1660395328256'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='7284'%20width='200'%20height='200'%3e%3cpath%20d='M640%20970.666667H384c-231.765333%200-330.666667-98.901333-330.666667-330.666667V384c0-231.765333%2098.901333-330.666667%20330.666667-330.666667h256c231.765333%200%20330.666667%2098.901333%20330.666667%20330.666667v256c0%20231.765333-98.901333%20330.666667-330.666667%20330.666667z%20m-256-853.333334C187.136%20117.333333%20117.333333%20187.136%20117.333333%20384v256c0%20196.864%2069.802667%20266.666667%20266.666667%20266.666667h256c196.864%200%20266.666667-69.802667%20266.666667-266.666667V384c0-196.864-69.76-266.666667-266.666667-266.666667z'%20fill='%23292D32'%20p-id='7285'%3e%3c/path%3e%3cpath%20d='M266.666667%20523.093333A245.632%20245.632%200%200%201%20512%20277.76a271.445333%20271.445333%200%200%201%2080.64%2011.946667%2032.128%2032.128%200%200%201-18.773333%2061.44A212.736%20212.736%200%200%200%20512%20342.186667a180.821333%20180.821333%200%201%200%20151.04%2080.64%2032%2032%200%200%201%2053.333333-35.413334%20245.333333%20245.333333%200%201%201-449.706666%20135.68z'%20fill='%23292D32'%20p-id='7286'%3e%3c/path%3e%3cpath%20d='M589.269333%20347.306667l-71.253333-81.493334a32.042667%2032.042667%200%200%201%2048.213333-42.24l71.253334%2081.493334a32.256%2032.256%200%200%201-2.986667%2045.226666%2029.866667%2029.866667%200%200%201-20.906667%208.106667%2032.512%2032.512%200%200%201-24.32-11.093333z'%20fill='%23292D32'%20p-id='7287'%3e%3c/path%3e%3cpath%20d='M504.746667%20405.717333a32.469333%2032.469333%200%200%201%206.741333-44.8l82.858667-60.586666a32.469333%2032.469333%200%200%201%2044.8%206.741333%2032.469333%2032.469333%200%200%201-6.826667%2044.8l-82.773333%2060.586667a31.189333%2031.189333%200%200%201-18.773334%206.4%2032.725333%2032.725333%200%200%201-26.026666-13.141334z'%20fill='%23292D32'%20p-id='7288'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3csvg%20t='1660395328256'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='7284'%20width='200'%20height='200'%3e%3cpath%20d='M640%20970.666667H384c-231.765333%200-330.666667-98.901333-330.666667-330.666667V384c0-231.765333%2098.901333-330.666667%20330.666667-330.666667h256c231.765333%200%20330.666667%2098.901333%20330.666667%20330.666667v256c0%20231.765333-98.901333%20330.666667-330.666667%20330.666667z%20m-256-853.333334C187.136%20117.333333%20117.333333%20187.136%20117.333333%20384v256c0%20196.864%2069.802667%20266.666667%20266.666667%20266.666667h256c196.864%200%20266.666667-69.802667%20266.666667-266.666667V384c0-196.864-69.76-266.666667-266.666667-266.666667z'%20fill='%23292D32'%20p-id='7285'%3e%3c/path%3e%3cpath%20d='M266.666667%20523.093333A245.632%20245.632%200%200%201%20512%20277.76a271.445333%20271.445333%200%200%201%2080.64%2011.946667%2032.128%2032.128%200%200%201-18.773333%2061.44A212.736%20212.736%200%200%200%20512%20342.186667a180.821333%20180.821333%200%201%200%20151.04%2080.64%2032%2032%200%200%201%2053.333333-35.413334%20245.333333%20245.333333%200%201%201-449.706666%20135.68z'%20fill='%23292D32'%20p-id='7286'%3e%3c/path%3e%3cpath%20d='M589.269333%20347.306667l-71.253333-81.493334a32.042667%2032.042667%200%200%201%2048.213333-42.24l71.253334%2081.493334a32.256%2032.256%200%200%201-2.986667%2045.226666%2029.866667%2029.866667%200%200%201-20.906667%208.106667%2032.512%2032.512%200%200%201-24.32-11.093333z'%20fill='%23292D32'%20p-id='7287'%3e%3c/path%3e%3cpath%20d='M504.746667%20405.717333a32.469333%2032.469333%200%200%201%206.741333-44.8l82.858667-60.586666a32.469333%2032.469333%200%200%201%2044.8%206.741333%2032.469333%2032.469333%200%200%201-6.826667%2044.8l-82.773333%2060.586667a31.189333%2031.189333%200%200%201-18.773334%206.4%2032.725333%2032.725333%200%200%201-26.026666-13.141334z'%20fill='%23292D32'%20p-id='7288'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-reload-all{-webkit-mask:url("data:image/svg+xml,%3csvg%20class='icon'%20width='200'%20height='200'%20p-id='2129'%20t='1660034441839'%20version='1.1'%20viewBox='0%200%201024%201024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='m861.68%20670.07c-42.264%2093.421-118.37%20164.79-214.29%20200.94a383.74%20383.74%200%200%201-135.56%2024.888c-53.832%200-107.52-11.472-158.03-34.332a384.83%20384.83%200%200%201-85.645-53.484c2.088%2019.248%202.688%2039.252-0.144%2056.82a24.072%2024.072%200%200%201-47.52-7.6801c5.868-36.372-8.784-95.785-14.928-115.62a23.88%2023.88%200%200%201%200.144-14.172c0.312-1.128%200.744-2.232%201.236-3.312%200.168-0.34803%200.264-0.72003%200.444-1.056%201.548-3.072%203.708-5.88%206.6-8.148a24.024%2024.024%200%200%201%2024.888-2.808c23.496%205.028%2064.98%2010.98%20108.61%203.264a24.069%2024.069%200%201%201%208.4001%2047.4%20306.12%20306.12%200%200%201-61.848%204.2601%20336.12%20336.12%200%200%200%2079.597%2050.688c81.673%2036.948%20172.87%2039.888%20256.78%208.2561%2083.893-31.632%20150.44-94.033%20187.41-175.73%2036.948-81.673%2039.9-172.85%208.28-256.77a24.072%2024.072%200%201%201%2045.036-16.968c36.144%2095.941%2032.784%20200.2-9.4561%20293.56zm-99.589-269.61a16.044%2016.044%200%200%201%2020.664%209.36c27.252%2072.348%2024.72%20150.95-7.1161%20221.34-47.652%20105.3-153.3%20170.07-264.45%20170.07-26.556%200-53.424-3.6961-79.884-11.412a16.043%2016.043%200%201%201%208.9761-30.804c122.05%2035.556%20253.62-25.08%20306.11-141.08%2028.332-62.58%2030.564-132.47%206.336-196.79a16.044%2016.044%200%200%201%209.3601-20.676zm-500.14%20222.9a16.068%2016.068%200%200%201-20.676-9.3601c-27.3-72.312-24.78-150.94%207.08-221.37%2058.896-130.15%20201.54-197.47%20339.17-160.11a16.044%2016.044%200%200%201-8.4121%2030.96c-122.3-33.204-249.17%2026.652-301.53%20142.38a255.59%20255.59%200%200%200-6.3%20196.81%2016.056%2016.056%200%200%201-9.336%2020.676zm554.39-332.09c-0.108%200.552-0.204%201.092-0.348%201.644a23.112%2023.112%200%200%201-1.74%204.704c-0.084%200.192-0.132%200.372-0.22807%200.54-0.876%201.68-2.016%203.228-3.3%204.68-0.12%200.132-0.192%200.288-0.312%200.432-0.372%200.396-0.816%200.684-1.212%201.068-0.468%200.432-0.876%200.924-1.38%201.332-0.192%200.168-0.432%200.276-0.636%200.42-0.612%200.456-1.248%200.84-1.884%201.224-0.792%200.48-1.572%200.96-2.4%201.344-0.576%200.264-1.1761%200.46802-1.7761%200.70802a33.924%2033.924%200%200%201-2.784%200.876c-0.612%200.144-1.212%200.228-1.836%200.324-0.96%200.156-1.908%200.276-2.892%200.3-0.288%200.0125-0.54%200.084-0.828%200.084-0.324%200-0.648-0.096-0.984-0.108a22.14%2022.14%200%200%201-3.4321-0.408c-0.336-0.048-0.684-0.024-1.044-0.108-22.296-5.184-66.696-12.648-113.51-4.356a24.072%2024.072%200%200%201-8.388-47.4%20305.64%20305.64%200%200%201%2061.8-4.284%20334.87%20334.87%200%200%200-76.896-48.24c-168.6-76.26-367.87-1.14-444.16%20167.49-36.96%2081.709-39.9%20172.91-8.256%20256.81a24.062%2024.062%200%201%201-45.024%2016.992c-36.18-95.929-32.832-200.22%209.42-293.64%2087.241-192.81%20315.06-278.71%20507.88-191.5a382.86%20382.86%200%200%201%2083.004%2051.144c-2.1-19.272-2.712-39.312%200.144-56.892a24.063%2024.063%200%201%201%2047.508%207.692c-5.916%2036.492%208.7721%2095.809%2014.904%20115.6l0.048%200.22801c0.552%201.848%200.852%203.708%200.948%205.604%200.036%200.48-0.0127%200.936-0.0127%201.416-0.0127%201.44-0.132%202.868-0.396%204.284z'%20stroke-width='.7501'%20p-id='2130'/%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3csvg%20class='icon'%20width='200'%20height='200'%20p-id='2129'%20t='1660034441839'%20version='1.1'%20viewBox='0%200%201024%201024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='m861.68%20670.07c-42.264%2093.421-118.37%20164.79-214.29%20200.94a383.74%20383.74%200%200%201-135.56%2024.888c-53.832%200-107.52-11.472-158.03-34.332a384.83%20384.83%200%200%201-85.645-53.484c2.088%2019.248%202.688%2039.252-0.144%2056.82a24.072%2024.072%200%200%201-47.52-7.6801c5.868-36.372-8.784-95.785-14.928-115.62a23.88%2023.88%200%200%201%200.144-14.172c0.312-1.128%200.744-2.232%201.236-3.312%200.168-0.34803%200.264-0.72003%200.444-1.056%201.548-3.072%203.708-5.88%206.6-8.148a24.024%2024.024%200%200%201%2024.888-2.808c23.496%205.028%2064.98%2010.98%20108.61%203.264a24.069%2024.069%200%201%201%208.4001%2047.4%20306.12%20306.12%200%200%201-61.848%204.2601%20336.12%20336.12%200%200%200%2079.597%2050.688c81.673%2036.948%20172.87%2039.888%20256.78%208.2561%2083.893-31.632%20150.44-94.033%20187.41-175.73%2036.948-81.673%2039.9-172.85%208.28-256.77a24.072%2024.072%200%201%201%2045.036-16.968c36.144%2095.941%2032.784%20200.2-9.4561%20293.56zm-99.589-269.61a16.044%2016.044%200%200%201%2020.664%209.36c27.252%2072.348%2024.72%20150.95-7.1161%20221.34-47.652%20105.3-153.3%20170.07-264.45%20170.07-26.556%200-53.424-3.6961-79.884-11.412a16.043%2016.043%200%201%201%208.9761-30.804c122.05%2035.556%20253.62-25.08%20306.11-141.08%2028.332-62.58%2030.564-132.47%206.336-196.79a16.044%2016.044%200%200%201%209.3601-20.676zm-500.14%20222.9a16.068%2016.068%200%200%201-20.676-9.3601c-27.3-72.312-24.78-150.94%207.08-221.37%2058.896-130.15%20201.54-197.47%20339.17-160.11a16.044%2016.044%200%200%201-8.4121%2030.96c-122.3-33.204-249.17%2026.652-301.53%20142.38a255.59%20255.59%200%200%200-6.3%20196.81%2016.056%2016.056%200%200%201-9.336%2020.676zm554.39-332.09c-0.108%200.552-0.204%201.092-0.348%201.644a23.112%2023.112%200%200%201-1.74%204.704c-0.084%200.192-0.132%200.372-0.22807%200.54-0.876%201.68-2.016%203.228-3.3%204.68-0.12%200.132-0.192%200.288-0.312%200.432-0.372%200.396-0.816%200.684-1.212%201.068-0.468%200.432-0.876%200.924-1.38%201.332-0.192%200.168-0.432%200.276-0.636%200.42-0.612%200.456-1.248%200.84-1.884%201.224-0.792%200.48-1.572%200.96-2.4%201.344-0.576%200.264-1.1761%200.46802-1.7761%200.70802a33.924%2033.924%200%200%201-2.784%200.876c-0.612%200.144-1.212%200.228-1.836%200.324-0.96%200.156-1.908%200.276-2.892%200.3-0.288%200.0125-0.54%200.084-0.828%200.084-0.324%200-0.648-0.096-0.984-0.108a22.14%2022.14%200%200%201-3.4321-0.408c-0.336-0.048-0.684-0.024-1.044-0.108-22.296-5.184-66.696-12.648-113.51-4.356a24.072%2024.072%200%200%201-8.388-47.4%20305.64%20305.64%200%200%201%2061.8-4.284%20334.87%20334.87%200%200%200-76.896-48.24c-168.6-76.26-367.87-1.14-444.16%20167.49-36.96%2081.709-39.9%20172.91-8.256%20256.81a24.062%2024.062%200%201%201-45.024%2016.992c-36.18-95.929-32.832-200.22%209.42-293.64%2087.241-192.81%20315.06-278.71%20507.88-191.5a382.86%20382.86%200%200%201%2083.004%2051.144c-2.1-19.272-2.712-39.312%200.144-56.892a24.063%2024.063%200%201%201%2047.508%207.692c-5.916%2036.492%208.7721%2095.809%2014.904%20115.6l0.048%200.22801c0.552%201.848%200.852%203.708%200.948%205.604%200.036%200.48-0.0127%200.936-0.0127%201.416-0.0127%201.44-0.132%202.868-0.396%204.284z'%20stroke-width='.7501'%20p-id='2130'/%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-left-arrow{-webkit-mask:url("data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1659850602902'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='8065'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='200'%20height='200'%3e%3cdefs%3e%3cstyle%20type='text/css'%3e%3c/style%3e%3c/defs%3e%3cpath%20d='M635.733333%20490.666667l174.933334%20174.933333-64%2059.733333-234.666667-234.666666L746.666667%20256%20810.666667%20315.733333l-174.933334%20174.933334z%20m-260.266666%200l174.933333%20174.933333-59.733333%2059.733333L256%20490.666667%20490.666667%20256l59.733333%2059.733333-174.933333%20174.933334z'%20fill='%23444444'%20p-id='8066'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1659850602902'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='8065'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='200'%20height='200'%3e%3cdefs%3e%3cstyle%20type='text/css'%3e%3c/style%3e%3c/defs%3e%3cpath%20d='M635.733333%20490.666667l174.933334%20174.933333-64%2059.733333-234.666667-234.666666L746.666667%20256%20810.666667%20315.733333l-174.933334%20174.933334z%20m-260.266666%200l174.933333%20174.933333-59.733333%2059.733333L256%20490.666667%20490.666667%20256l59.733333%2059.733333-174.933333%20174.933334z'%20fill='%23444444'%20p-id='8066'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-right-arrow{-webkit-mask:url("data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1659850594120'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='7913'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='200'%20height='200'%3e%3cdefs%3e%3cstyle%20type='text/css'%3e%3c/style%3e%3c/defs%3e%3cpath%20d='M430.933333%20490.666667L256%20665.6%20315.733333%20725.333333l234.666667-234.666666L315.733333%20256%20256%20315.733333l174.933333%20174.933334z%20m256%200L512%20665.6l59.733333%2059.733333%20234.666667-234.666666L576%20256%20512%20315.733333l174.933333%20174.933334z'%20fill='%23444444'%20p-id='7914'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1659850594120'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='7913'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='200'%20height='200'%3e%3cdefs%3e%3cstyle%20type='text/css'%3e%3c/style%3e%3c/defs%3e%3cpath%20d='M430.933333%20490.666667L256%20665.6%20315.733333%20725.333333l234.666667-234.666666L315.733333%20256%20256%20315.733333l174.933333%20174.933334z%20m256%200L512%20665.6l59.733333%2059.733333%20234.666667-234.666666L576%20256%20512%20315.733333l174.933333%20174.933334z'%20fill='%23444444'%20p-id='7914'%3e%3c/path%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab__icon-open{-webkit-mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201024%201024'%20width='200'%20height='200'%3e%3cpath%20d='M640%20384v-85.333H213.333v597.334h597.334V384H640zm0-128h128v128h128V256H128v640h85.333V384H640V256z'%20fill='%23444444'/%3e%3c/svg%3e") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201024%201024'%20width='200'%20height='200'%3e%3cpath%20d='M640%20384v-85.333H213.333v597.334h597.334V384H640zm0-128h128v128h128V256H128v640h85.333V384H640V256z'%20fill='%23444444'/%3e%3c/svg%3e") 50%/contain no-repeat}.stack-tab-zoom-enter-active,.stack-tab-zoom-leave-active{transition:all .3s ease-in-out}.stack-tab-zoom-enter-from,.stack-tab-zoom-leave-to{opacity:0;transform:scale(0)}.stack-tab-swap-move,.stack-tab-swap-enter-active,.stack-tab-swap-leave-active{transition:all .3s ease-in-out}.stack-tab-swap-enter-from,.stack-tab-swap-leave-to{opacity:0}.stack-tab-swap-enter-from{transform:translate(30px)}.stack-tab-swap-leave-to{transform:translate(-30px)}.stack-tab-swap-back-enter-active,.stack-tab-swap-back-leave-active{transition:all .3s ease-in-out}.stack-tab-swap-back-enter-from,.stack-tab-swap-back-leave-to{opacity:0}.stack-tab-swap-back-enter-from{transform:translate(-30px)}.stack-tab-swap-back-leave-to{transform:translate(30px)}.stack-tab-loading-mask{opacity:.8;background:#fff;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:absolute;top:0;left:0}.stack-tab-loading--spin{z-index:auto;background-color:#007bff;align-self:center;width:60px;height:60px;animation:1.5s linear infinite turn;-webkit-mask:url("data:image/svg+xml,%3csvg%20class='icon'%20width='200'%20height='200'%20p-id='6183'%20t='1660269579969'%20version='1.1'%20viewBox='0%200%201024%201024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cdefs%3e%3cstyle%20type='text/css'/%3e%3c/defs%3e%3cpath%20d='m512%2015.756c-273.37%200-494.99%20222.17-494.99%20496.24s221.61%20496.24%20494.99%20496.24%20494.99-222.17%20494.99-496.24c0-274.07-221.58-496.24-494.99-496.24zm0%20942.84c-246.06%200-445.51-199.94-445.51-446.63%200-246.68%20199.45-446.63%20445.51-446.63s445.51%20199.94%20445.51%20446.63-199.45%20446.63-445.51%20446.63z'%20p-id='6184'/%3e%3cpath%20d='m512.05%20308.72c-51.167%200-102.23%2019.852-141.25%2059.557-38.945%2039.672-58.5%2091.731-58.5%20143.72s19.522%20104.05%2058.5%20143.72c39.011%2039.705%2090.079%2059.557%20141.25%2059.557%2051.101%200%20102.17-19.852%20141.18-59.557%2038.945-39.672%2058.467-91.731%2058.467-143.72s-19.522-104.05-58.467-143.72c-39.011-39.705-90.079-59.557-141.18-59.557zm14.336%2047.599c3.3363-12.618%2016.153-20.183%2028.606-16.78%2012.486%203.4023%2019.819%2016.417%2016.483%2029.068-3.3363%2012.684-16.087%2020.249-28.54%2016.846-12.486-3.4023-19.885-16.417-16.549-29.134zm-155.85%20217.05c-12.387%203.4354-25.204-4.063-28.54-16.747-3.3362-12.684%203.9969-25.732%2016.483-29.134%2012.486-3.3693%2025.27%204.129%2028.606%2016.846%203.3362%2012.651-4.063%2025.633-16.549%2029.035zm16.417-154.33c-9.1169-9.2821-9.1169-24.312%200-33.594%209.1499-9.2821%2023.882-9.2821%2032.999%200%209.0839%209.2821%209.0839%2024.312%200%2033.594-9.1169%209.3151-23.882%209.3151-32.999%200zm106.69%20245.99c-3.3363%2012.618-16.153%2020.183-28.54%2016.78-12.486-3.4023-19.885-16.417-16.549-29.068%203.3363-12.684%2016.153-20.249%2028.606-16.846%2012.42%203.4023%2019.819%2016.417%2016.483%2029.134zm-52.224-84.463c-37.888-38.648-37.888-101.14%200-139.73%2037.888-38.549%2099.361-38.549%20137.25%200%2037.888%2038.582%2037.888%20101.11%200%20139.73-37.888%2038.549-99.361%2038.549-137.25%200zm191.75%2055.329c-9.1499%209.249-23.948%209.249-32.999%200-9.1169-9.2821-9.1169-24.345%200-33.594%209.0839-9.3151%2023.882-9.3151%2032.999%200%209.0508%209.249%209.0508%2024.279%200%2033.594zm44.924-171.17c3.3363%2012.717-4.063%2025.732-16.549%2029.134-12.387%203.3693-25.204-4.129-28.54-16.846-3.3363-12.651%204.063-25.699%2016.483-29.101%2012.486-3.3363%2025.27%204.129%2028.606%2016.813z'%20p-id='6185'/%3e%3cg%20transform='translate(.47897%2028.177)'%3e%3cpath%20d='m210.09%20197.4%2021.669%20142.01%2036.6-5.6816-21.669-142.04z'%20p-id='6186'/%3e%3cpath%20d='m398.01%20863.79%2023.222%2029.432%20109.24-89.484-23.222-29.432z'%20p-id='6187'/%3e%3cpath%20d='m777.55%20308.98-13.411%2035.179%20129.98%2051.266%2013.411-35.179z'%20p-id='6188'/%3e%3cpath%20d='m115.51%20606.64%20131.3%2051.795%2013.411-35.179-131.3-51.795z'%20p-id='6189'/%3e%3cpath%20d='m627.61%20103.85-23.189-29.432-105.77%2086.644%2023.189%2029.399z'%20p-id='6190'/%3e%3cpath%20d='m756.93%20636.2%2021.273%20139.92%2036.699-5.7806-21.306-139.96z'%20p-id='6191'/%3e%3c/g%3e%3c/svg%3e") 0 0/contain;mask:url("data:image/svg+xml,%3csvg%20class='icon'%20width='200'%20height='200'%20p-id='6183'%20t='1660269579969'%20version='1.1'%20viewBox='0%200%201024%201024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cdefs%3e%3cstyle%20type='text/css'/%3e%3c/defs%3e%3cpath%20d='m512%2015.756c-273.37%200-494.99%20222.17-494.99%20496.24s221.61%20496.24%20494.99%20496.24%20494.99-222.17%20494.99-496.24c0-274.07-221.58-496.24-494.99-496.24zm0%20942.84c-246.06%200-445.51-199.94-445.51-446.63%200-246.68%20199.45-446.63%20445.51-446.63s445.51%20199.94%20445.51%20446.63-199.45%20446.63-445.51%20446.63z'%20p-id='6184'/%3e%3cpath%20d='m512.05%20308.72c-51.167%200-102.23%2019.852-141.25%2059.557-38.945%2039.672-58.5%2091.731-58.5%20143.72s19.522%20104.05%2058.5%20143.72c39.011%2039.705%2090.079%2059.557%20141.25%2059.557%2051.101%200%20102.17-19.852%20141.18-59.557%2038.945-39.672%2058.467-91.731%2058.467-143.72s-19.522-104.05-58.467-143.72c-39.011-39.705-90.079-59.557-141.18-59.557zm14.336%2047.599c3.3363-12.618%2016.153-20.183%2028.606-16.78%2012.486%203.4023%2019.819%2016.417%2016.483%2029.068-3.3363%2012.684-16.087%2020.249-28.54%2016.846-12.486-3.4023-19.885-16.417-16.549-29.134zm-155.85%20217.05c-12.387%203.4354-25.204-4.063-28.54-16.747-3.3362-12.684%203.9969-25.732%2016.483-29.134%2012.486-3.3693%2025.27%204.129%2028.606%2016.846%203.3362%2012.651-4.063%2025.633-16.549%2029.035zm16.417-154.33c-9.1169-9.2821-9.1169-24.312%200-33.594%209.1499-9.2821%2023.882-9.2821%2032.999%200%209.0839%209.2821%209.0839%2024.312%200%2033.594-9.1169%209.3151-23.882%209.3151-32.999%200zm106.69%20245.99c-3.3363%2012.618-16.153%2020.183-28.54%2016.78-12.486-3.4023-19.885-16.417-16.549-29.068%203.3363-12.684%2016.153-20.249%2028.606-16.846%2012.42%203.4023%2019.819%2016.417%2016.483%2029.134zm-52.224-84.463c-37.888-38.648-37.888-101.14%200-139.73%2037.888-38.549%2099.361-38.549%20137.25%200%2037.888%2038.582%2037.888%20101.11%200%20139.73-37.888%2038.549-99.361%2038.549-137.25%200zm191.75%2055.329c-9.1499%209.249-23.948%209.249-32.999%200-9.1169-9.2821-9.1169-24.345%200-33.594%209.0839-9.3151%2023.882-9.3151%2032.999%200%209.0508%209.249%209.0508%2024.279%200%2033.594zm44.924-171.17c3.3363%2012.717-4.063%2025.732-16.549%2029.134-12.387%203.3693-25.204-4.129-28.54-16.846-3.3363-12.651%204.063-25.699%2016.483-29.101%2012.486-3.3363%2025.27%204.129%2028.606%2016.813z'%20p-id='6185'/%3e%3cg%20transform='translate(.47897%2028.177)'%3e%3cpath%20d='m210.09%20197.4%2021.669%20142.01%2036.6-5.6816-21.669-142.04z'%20p-id='6186'/%3e%3cpath%20d='m398.01%20863.79%2023.222%2029.432%20109.24-89.484-23.222-29.432z'%20p-id='6187'/%3e%3cpath%20d='m777.55%20308.98-13.411%2035.179%20129.98%2051.266%2013.411-35.179z'%20p-id='6188'/%3e%3cpath%20d='m115.51%20606.64%20131.3%2051.795%2013.411-35.179-131.3-51.795z'%20p-id='6189'/%3e%3cpath%20d='m627.61%20103.85-23.189-29.432-105.77%2086.644%2023.189%2029.399z'%20p-id='6190'/%3e%3cpath%20d='m756.93%20636.2%2021.273%20139.92%2036.699-5.7806-21.306-139.96z'%20p-id='6191'/%3e%3c/g%3e%3c/svg%3e") 0 0/contain}@keyframes turn{0%{transform:rotate(0)}25%{transform:rotate(-90deg)}50%{transform:rotate(-180deg)}75%{transform:rotate(-270deg)}to{transform:rotate(-360deg)}}
2
- /*$vite$:1*/