@star-ng/ui 0.0.0-placeholder.0 → 0.1.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 (217) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +147 -3
  3. package/fesm2022/star-ng-ui-accordion.mjs +376 -0
  4. package/fesm2022/star-ng-ui-accordion.mjs.map +1 -0
  5. package/fesm2022/star-ng-ui-autocomplete.mjs +782 -0
  6. package/fesm2022/star-ng-ui-autocomplete.mjs.map +1 -0
  7. package/fesm2022/star-ng-ui-avatar.mjs +154 -0
  8. package/fesm2022/star-ng-ui-avatar.mjs.map +1 -0
  9. package/fesm2022/star-ng-ui-badge.mjs +153 -0
  10. package/fesm2022/star-ng-ui-badge.mjs.map +1 -0
  11. package/fesm2022/star-ng-ui-breadcrumb.mjs +199 -0
  12. package/fesm2022/star-ng-ui-breadcrumb.mjs.map +1 -0
  13. package/fesm2022/star-ng-ui-button.mjs +282 -0
  14. package/fesm2022/star-ng-ui-button.mjs.map +1 -0
  15. package/fesm2022/star-ng-ui-card.mjs +112 -0
  16. package/fesm2022/star-ng-ui-card.mjs.map +1 -0
  17. package/fesm2022/star-ng-ui-chart.mjs +1904 -0
  18. package/fesm2022/star-ng-ui-chart.mjs.map +1 -0
  19. package/fesm2022/star-ng-ui-checkbox.mjs +345 -0
  20. package/fesm2022/star-ng-ui-checkbox.mjs.map +1 -0
  21. package/fesm2022/star-ng-ui-core.mjs +392 -0
  22. package/fesm2022/star-ng-ui-core.mjs.map +1 -0
  23. package/fesm2022/star-ng-ui-data-display.mjs +1556 -0
  24. package/fesm2022/star-ng-ui-data-display.mjs.map +1 -0
  25. package/fesm2022/star-ng-ui-date-picker.mjs +2786 -0
  26. package/fesm2022/star-ng-ui-date-picker.mjs.map +1 -0
  27. package/fesm2022/star-ng-ui-dialog.mjs +948 -0
  28. package/fesm2022/star-ng-ui-dialog.mjs.map +1 -0
  29. package/fesm2022/star-ng-ui-drawer.mjs +158 -0
  30. package/fesm2022/star-ng-ui-drawer.mjs.map +1 -0
  31. package/fesm2022/star-ng-ui-editor.mjs +416 -0
  32. package/fesm2022/star-ng-ui-editor.mjs.map +1 -0
  33. package/fesm2022/star-ng-ui-field.mjs +378 -0
  34. package/fesm2022/star-ng-ui-field.mjs.map +1 -0
  35. package/fesm2022/star-ng-ui-file-upload.mjs +762 -0
  36. package/fesm2022/star-ng-ui-file-upload.mjs.map +1 -0
  37. package/fesm2022/star-ng-ui-i18n-de.mjs +179 -0
  38. package/fesm2022/star-ng-ui-i18n-de.mjs.map +1 -0
  39. package/fesm2022/star-ng-ui-i18n-es.mjs +179 -0
  40. package/fesm2022/star-ng-ui-i18n-es.mjs.map +1 -0
  41. package/fesm2022/star-ng-ui-input-group.mjs +188 -0
  42. package/fesm2022/star-ng-ui-input-group.mjs.map +1 -0
  43. package/fesm2022/star-ng-ui-input-mask.mjs +434 -0
  44. package/fesm2022/star-ng-ui-input-mask.mjs.map +1 -0
  45. package/fesm2022/star-ng-ui-input-number.mjs +691 -0
  46. package/fesm2022/star-ng-ui-input-number.mjs.map +1 -0
  47. package/fesm2022/star-ng-ui-input-otp.mjs +343 -0
  48. package/fesm2022/star-ng-ui-input-otp.mjs.map +1 -0
  49. package/fesm2022/star-ng-ui-input-tags.mjs +616 -0
  50. package/fesm2022/star-ng-ui-input-tags.mjs.map +1 -0
  51. package/fesm2022/star-ng-ui-knob.mjs +514 -0
  52. package/fesm2022/star-ng-ui-knob.mjs.map +1 -0
  53. package/fesm2022/star-ng-ui-layout.mjs +608 -0
  54. package/fesm2022/star-ng-ui-layout.mjs.map +1 -0
  55. package/fesm2022/star-ng-ui-listbox.mjs +978 -0
  56. package/fesm2022/star-ng-ui-listbox.mjs.map +1 -0
  57. package/fesm2022/star-ng-ui-media.mjs +833 -0
  58. package/fesm2022/star-ng-ui-media.mjs.map +1 -0
  59. package/fesm2022/star-ng-ui-menu.mjs +1840 -0
  60. package/fesm2022/star-ng-ui-menu.mjs.map +1 -0
  61. package/fesm2022/star-ng-ui-message.mjs +191 -0
  62. package/fesm2022/star-ng-ui-message.mjs.map +1 -0
  63. package/fesm2022/star-ng-ui-paginator.mjs +387 -0
  64. package/fesm2022/star-ng-ui-paginator.mjs.map +1 -0
  65. package/fesm2022/star-ng-ui-panel.mjs +324 -0
  66. package/fesm2022/star-ng-ui-panel.mjs.map +1 -0
  67. package/fesm2022/star-ng-ui-password.mjs +517 -0
  68. package/fesm2022/star-ng-ui-password.mjs.map +1 -0
  69. package/fesm2022/star-ng-ui-popover.mjs +241 -0
  70. package/fesm2022/star-ng-ui-popover.mjs.map +1 -0
  71. package/fesm2022/star-ng-ui-progress-bar.mjs +183 -0
  72. package/fesm2022/star-ng-ui-progress-bar.mjs.map +1 -0
  73. package/fesm2022/star-ng-ui-radio.mjs +411 -0
  74. package/fesm2022/star-ng-ui-radio.mjs.map +1 -0
  75. package/fesm2022/star-ng-ui-rating.mjs +211 -0
  76. package/fesm2022/star-ng-ui-rating.mjs.map +1 -0
  77. package/fesm2022/star-ng-ui-select-button.mjs +613 -0
  78. package/fesm2022/star-ng-ui-select-button.mjs.map +1 -0
  79. package/fesm2022/star-ng-ui-select.mjs +2523 -0
  80. package/fesm2022/star-ng-ui-select.mjs.map +1 -0
  81. package/fesm2022/star-ng-ui-skeleton.mjs +160 -0
  82. package/fesm2022/star-ng-ui-skeleton.mjs.map +1 -0
  83. package/fesm2022/star-ng-ui-slider.mjs +552 -0
  84. package/fesm2022/star-ng-ui-slider.mjs.map +1 -0
  85. package/fesm2022/star-ng-ui-spinner.mjs +148 -0
  86. package/fesm2022/star-ng-ui-spinner.mjs.map +1 -0
  87. package/fesm2022/star-ng-ui-stepper.mjs +360 -0
  88. package/fesm2022/star-ng-ui-stepper.mjs.map +1 -0
  89. package/fesm2022/star-ng-ui-table.mjs +3477 -0
  90. package/fesm2022/star-ng-ui-table.mjs.map +1 -0
  91. package/fesm2022/star-ng-ui-tabs.mjs +464 -0
  92. package/fesm2022/star-ng-ui-tabs.mjs.map +1 -0
  93. package/fesm2022/star-ng-ui-tag.mjs +129 -0
  94. package/fesm2022/star-ng-ui-tag.mjs.map +1 -0
  95. package/fesm2022/star-ng-ui-theme-switch.mjs +105 -0
  96. package/fesm2022/star-ng-ui-theme-switch.mjs.map +1 -0
  97. package/fesm2022/star-ng-ui-theme.mjs +98 -0
  98. package/fesm2022/star-ng-ui-theme.mjs.map +1 -0
  99. package/fesm2022/star-ng-ui-toast.mjs +298 -0
  100. package/fesm2022/star-ng-ui-toast.mjs.map +1 -0
  101. package/fesm2022/star-ng-ui-toggle-switch.mjs +316 -0
  102. package/fesm2022/star-ng-ui-toggle-switch.mjs.map +1 -0
  103. package/fesm2022/star-ng-ui-tooltip.mjs +297 -0
  104. package/fesm2022/star-ng-ui-tooltip.mjs.map +1 -0
  105. package/fesm2022/star-ng-ui-transloco.mjs +40 -0
  106. package/fesm2022/star-ng-ui-transloco.mjs.map +1 -0
  107. package/fesm2022/star-ng-ui-tree.mjs +1446 -0
  108. package/fesm2022/star-ng-ui-tree.mjs.map +1 -0
  109. package/fesm2022/star-ng-ui-utility.mjs +2134 -0
  110. package/fesm2022/star-ng-ui-utility.mjs.map +1 -0
  111. package/fesm2022/star-ng-ui.mjs +51 -0
  112. package/package.json +281 -5
  113. package/styles/_base.scss +70 -0
  114. package/styles/_shared.scss +2 -0
  115. package/styles/_tokens.scss +190 -0
  116. package/styles/controls/_accordion.scss +75 -0
  117. package/styles/controls/_autocomplete.scss +44 -0
  118. package/styles/controls/_avatar.scss +39 -0
  119. package/styles/controls/_breadcrumb.scss +45 -0
  120. package/styles/controls/_button.scss +137 -0
  121. package/styles/controls/_card.scss +38 -0
  122. package/styles/controls/_chart.scss +214 -0
  123. package/styles/controls/_chip.scss +51 -0
  124. package/styles/controls/_choice.scss +153 -0
  125. package/styles/controls/_data-display.scss +118 -0
  126. package/styles/controls/_date-picker.scss +300 -0
  127. package/styles/controls/_dialog.scss +123 -0
  128. package/styles/controls/_drawer.scss +118 -0
  129. package/styles/controls/_editor.scss +74 -0
  130. package/styles/controls/_field.scss +92 -0
  131. package/styles/controls/_file-upload.scss +136 -0
  132. package/styles/controls/_input-group.scss +104 -0
  133. package/styles/controls/_input-mask.scss +46 -0
  134. package/styles/controls/_input-number.scss +125 -0
  135. package/styles/controls/_knob.scss +76 -0
  136. package/styles/controls/_layout.scss +182 -0
  137. package/styles/controls/_listbox.scss +38 -0
  138. package/styles/controls/_media.scss +222 -0
  139. package/styles/controls/_menu.scss +254 -0
  140. package/styles/controls/_message.scss +48 -0
  141. package/styles/controls/_org-chart.scss +128 -0
  142. package/styles/controls/_paginator.scss +59 -0
  143. package/styles/controls/_panel.scss +83 -0
  144. package/styles/controls/_popover.scss +40 -0
  145. package/styles/controls/_progress-bar.scss +74 -0
  146. package/styles/controls/_select-button.scss +61 -0
  147. package/styles/controls/_select.scss +216 -0
  148. package/styles/controls/_skeleton.scss +43 -0
  149. package/styles/controls/_slider.scss +163 -0
  150. package/styles/controls/_spinner.scss +34 -0
  151. package/styles/controls/_stepper.scss +109 -0
  152. package/styles/controls/_table.scss +523 -0
  153. package/styles/controls/_tabs.scss +93 -0
  154. package/styles/controls/_tag.scss +84 -0
  155. package/styles/controls/_toast.scss +141 -0
  156. package/styles/controls/_tooltip.scss +14 -0
  157. package/styles/controls/_tree.scss +113 -0
  158. package/styles/controls/_utility.scss +654 -0
  159. package/styles/star-ng.css +5803 -0
  160. package/styles/star-ng.min.css +1 -0
  161. package/styles/star-ng.scss +50 -0
  162. package/theme/star-theme-first-paint.js +1 -0
  163. package/types/star-ng-ui-accordion.d.ts +82 -0
  164. package/types/star-ng-ui-autocomplete.d.ts +171 -0
  165. package/types/star-ng-ui-avatar.d.ts +43 -0
  166. package/types/star-ng-ui-badge.d.ts +46 -0
  167. package/types/star-ng-ui-breadcrumb.d.ts +39 -0
  168. package/types/star-ng-ui-button.d.ts +79 -0
  169. package/types/star-ng-ui-card.d.ts +29 -0
  170. package/types/star-ng-ui-chart.d.ts +337 -0
  171. package/types/star-ng-ui-checkbox.d.ts +92 -0
  172. package/types/star-ng-ui-core.d.ts +310 -0
  173. package/types/star-ng-ui-data-display.d.ts +339 -0
  174. package/types/star-ng-ui-date-picker.d.ts +701 -0
  175. package/types/star-ng-ui-dialog.d.ts +254 -0
  176. package/types/star-ng-ui-drawer.d.ts +29 -0
  177. package/types/star-ng-ui-editor.d.ts +96 -0
  178. package/types/star-ng-ui-field.d.ts +146 -0
  179. package/types/star-ng-ui-file-upload.d.ts +192 -0
  180. package/types/star-ng-ui-i18n-de.d.ts +7 -0
  181. package/types/star-ng-ui-i18n-es.d.ts +7 -0
  182. package/types/star-ng-ui-input-group.d.ts +58 -0
  183. package/types/star-ng-ui-input-mask.d.ts +126 -0
  184. package/types/star-ng-ui-input-number.d.ts +193 -0
  185. package/types/star-ng-ui-input-otp.d.ts +86 -0
  186. package/types/star-ng-ui-input-tags.d.ts +159 -0
  187. package/types/star-ng-ui-knob.d.ts +121 -0
  188. package/types/star-ng-ui-layout.d.ts +154 -0
  189. package/types/star-ng-ui-listbox.d.ts +197 -0
  190. package/types/star-ng-ui-media.d.ts +161 -0
  191. package/types/star-ng-ui-menu.d.ts +332 -0
  192. package/types/star-ng-ui-message.d.ts +52 -0
  193. package/types/star-ng-ui-paginator.d.ts +85 -0
  194. package/types/star-ng-ui-panel.d.ts +65 -0
  195. package/types/star-ng-ui-password.d.ts +129 -0
  196. package/types/star-ng-ui-popover.d.ts +57 -0
  197. package/types/star-ng-ui-progress-bar.d.ts +49 -0
  198. package/types/star-ng-ui-radio.d.ts +116 -0
  199. package/types/star-ng-ui-rating.d.ts +52 -0
  200. package/types/star-ng-ui-select-button.d.ts +169 -0
  201. package/types/star-ng-ui-select.d.ts +540 -0
  202. package/types/star-ng-ui-skeleton.d.ts +47 -0
  203. package/types/star-ng-ui-slider.d.ts +145 -0
  204. package/types/star-ng-ui-spinner.d.ts +29 -0
  205. package/types/star-ng-ui-stepper.d.ts +89 -0
  206. package/types/star-ng-ui-table.d.ts +829 -0
  207. package/types/star-ng-ui-tabs.d.ts +109 -0
  208. package/types/star-ng-ui-tag.d.ts +35 -0
  209. package/types/star-ng-ui-theme-switch.d.ts +36 -0
  210. package/types/star-ng-ui-theme.d.ts +95 -0
  211. package/types/star-ng-ui-toast.d.ts +84 -0
  212. package/types/star-ng-ui-toggle-switch.d.ts +81 -0
  213. package/types/star-ng-ui-tooltip.d.ts +66 -0
  214. package/types/star-ng-ui-transloco.d.ts +14 -0
  215. package/types/star-ng-ui-tree.d.ts +310 -0
  216. package/types/star-ng-ui-utility.d.ts +533 -0
  217. package/types/star-ng-ui.d.ts +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-ng-ui-tree.mjs","names":[],"sources":["../../../projects/star-ng/tree/tree-model.ts","../../../projects/star-ng/tree/tree.ts"],"sourcesContent":["// Pure helpers of the tree: flattening, sibling position, keyboard targets, selection state and\n// the scroll math of windowed rendering. They hold no DOM or signal state, so they are unit\n// tested without layout. This file is internal and is not exported from the entry point.\n\n/** The part of a tree node that the helpers read. `StarTreeNode` fits it. */\nexport interface BranchLike<N> {\n readonly key: string;\n readonly children?: readonly N[];\n}\n\n/** One visible row of the flattened tree. */\nexport interface TreeRow<N> {\n readonly node: N;\n /** Depth of the node, starting at 1 (`aria-level`). */\n readonly level: number;\n /** Number of siblings, the node included (`aria-setsize`). */\n readonly setSize: number;\n /** Position among the siblings, starting at 1 (`aria-posinset`). */\n readonly position: number;\n readonly parentKey: string | null;\n}\n\n/**\n * Flattens the nodes whose parents are open into rows. The sibling numbers come from the data,\n * so they stay right for rows that are not in the DOM. `openAll` shows every branch open (filter).\n */\nexport function flattenVisible<N extends BranchLike<N>>(\n nodes: readonly N[],\n open: ReadonlySet<string>,\n openAll = false,\n): TreeRow<N>[] {\n const rows: TreeRow<N>[] = [];\n const walk = (list: readonly N[], level: number, parentKey: string | null) => {\n const setSize = list.length;\n list.forEach((node, i) => {\n rows.push({ node, level, setSize, position: i + 1, parentKey });\n if (node.children?.length && (openAll || open.has(node.key))) {\n walk(node.children, level + 1, node.key);\n }\n });\n };\n walk(nodes, 1, null);\n return rows;\n}\n\n/** Row index of each key. */\nexport function rowIndexOf<N extends BranchLike<N>>(\n rows: readonly TreeRow<N>[],\n): Map<string, number> {\n const map = new Map<string, number>();\n rows.forEach((row, i) => map.set(row.node.key, i));\n return map;\n}\n\n/** All keys below a node (including itself). */\nexport function subtreeKeys<N extends BranchLike<N>>(node: N): string[] {\n const keys: string[] = [];\n const walk = (current: N) => {\n keys.push(current.key);\n current.children?.forEach(walk);\n };\n walk(node);\n return keys;\n}\n\n/** Parent key of every node (null at the top). */\nexport function parentsOf<N extends BranchLike<N>>(\n nodes: readonly N[],\n): Map<string, string | null> {\n const map = new Map<string, string | null>();\n const walk = (list: readonly N[], parent: string | null) =>\n list.forEach((node) => {\n map.set(node.key, parent);\n if (node.children) walk(node.children, node.key);\n });\n walk(nodes, null);\n return map;\n}\n\n/**\n * The key that keeps the focus after the rows changed: the previous key if it is still a row,\n * else its nearest ancestor that is a row, else the first row.\n */\nexport function stillFocusable(\n previous: string | null | undefined,\n rowIndex: ReadonlyMap<string, number>,\n parents: ReadonlyMap<string, string | null>,\n firstKey: string | null,\n): string | null {\n let key = previous ?? null;\n while (key !== null) {\n if (rowIndex.has(key)) return key;\n key = parents.get(key) ?? null;\n }\n return firstKey;\n}\n\n/**\n * The row that a navigation key moves to, or null when the key does not move (or there is no\n * target). Arrow right on a closed branch and arrow left on an open branch toggle it: they have\n * no target.\n */\nexport function navigationTarget<N extends BranchLike<N>>(\n rows: readonly TreeRow<N>[],\n index: number,\n key: string,\n state: { hasChildren: boolean; expanded: boolean },\n): string | null {\n const row = rows[index];\n if (!row) return null;\n switch (key) {\n case 'ArrowDown':\n return rows[index + 1]?.node.key ?? null;\n case 'ArrowUp':\n return rows[index - 1]?.node.key ?? null;\n case 'Home':\n return rows[0]?.node.key ?? null;\n case 'End':\n return rows.at(-1)?.node.key ?? null;\n case 'ArrowRight':\n return state.hasChildren && state.expanded ? (rows[index + 1]?.node.key ?? null) : null;\n case 'ArrowLeft':\n return state.hasChildren && state.expanded ? null : row.parentKey;\n default:\n return null;\n }\n}\n\n/** Check state of one node: true, false or 'mixed' from the leaves below it. */\nexport type CheckState = boolean | 'mixed';\n\n/**\n * Check state of every node of a tree in one pass (checkbox mode). A node with children is\n * `true` when all leaves below it are selected, `'mixed'` when some are. `isLeaf` tells, by key,\n * what counts as a leaf (the filter copies a node and may cut its children).\n */\nexport function checkStates<N extends BranchLike<N>>(\n nodes: readonly N[],\n selected: ReadonlySet<string>,\n isLeaf: (key: string) => boolean,\n): Map<string, CheckState> {\n const states = new Map<string, CheckState>();\n const walk = (node: N): { leaves: number; checked: number } => {\n if (!node.children?.length) {\n states.set(node.key, selected.has(node.key));\n const leaf = isLeaf(node.key);\n return { leaves: leaf ? 1 : 0, checked: leaf && selected.has(node.key) ? 1 : 0 };\n }\n let leaves = 0;\n let checked = 0;\n for (const child of node.children) {\n const part = walk(child);\n leaves += part.leaves;\n checked += part.checked;\n }\n states.set(node.key, checked === 0 ? false : checked === leaves ? true : 'mixed');\n return { leaves, checked };\n };\n nodes.forEach(walk);\n return states;\n}\n\n/**\n * Scroll offset that brings a fixed-size row fully into view with the least movement, or null\n * when the row is already fully visible.\n */\nexport function scrollOffsetToReveal(\n index: number,\n itemSize: number,\n scrollOffset: number,\n viewportSize: number,\n): number | null {\n const top = index * itemSize;\n const bottom = top + itemSize;\n if (top < scrollOffset) return top;\n if (bottom > scrollOffset + viewportSize) return Math.max(0, bottom - viewportSize);\n return null;\n}\n","import { _IdGenerator } from '@angular/cdk/a11y';\nimport type { ListRange } from '@angular/cdk/collections';\nimport { CdkConnectedOverlay, CdkOverlayOrigin, ConnectedPosition } from '@angular/cdk/overlay';\nimport {\n CdkFixedSizeVirtualScroll,\n CdkVirtualForOf,\n CdkVirtualScrollViewport,\n} from '@angular/cdk/scrolling';\nimport { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport {\n afterEveryRender,\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n numberAttribute,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { matchesFilter, STAR_UI_TEXT, StarDirectionService, starInlineKey } from '@star-ng/ui/core';\nimport {\n checkStates,\n flattenVisible,\n navigationTarget,\n parentsOf,\n rowIndexOf,\n scrollOffsetToReveal,\n stillFocusable,\n subtreeKeys,\n TreeRow,\n} from './tree-model';\n\n/** Tree data (PrimeNG `TreeNode`). `key` must be unique in the tree. */\nexport interface StarTreeNode<T = unknown> {\n readonly key: string;\n readonly label: string;\n readonly icon?: string;\n readonly data?: T;\n readonly children?: readonly StarTreeNode<T>[];\n readonly selectable?: boolean;\n readonly disabled?: boolean;\n}\n\ntype VisibleNode = TreeRow<StarTreeNode>;\n\n/** Keeps nodes that match the query or have a matching descendant. */\nfunction filterNodes(nodes: readonly StarTreeNode[], query: string): StarTreeNode[] {\n if (!query) return [...nodes];\n return nodes.flatMap((node) => {\n const children = filterNodes(node.children ?? [], query);\n return matchesFilter(node.label, query) || children.length ? [{ ...node, children }] : [];\n });\n}\n\n/**\n * Tree (PrimeNG `p-tree`): expand / collapse, single, multiple or checkbox selection (checkbox\n * mode selects whole branches and shows mixed parents), filter, and the WAI-ARIA tree keyboard\n * model (Up / Down, Right opens or enters, Left closes or goes to the parent, Home / End,\n * Enter / Space select, `*` expands siblings).\n *\n * Large trees: `virtualScroll` with `scrollHeight` and `virtualItemSize` renders only the rows in\n * and near the viewport (CDK virtual scrolling). Every row has a fixed height then. Keys, selection\n * and `aria-setsize` / `aria-posinset` work over all open rows, also the ones that are not in the DOM.\n *\n * Value: the selected node keys.\n * `<star-tree [nodes]=\"departments\" selectionMode=\"checkbox\" [(value)]=\"keys\" filter ariaLabel=\"Departments\" />`\n */\n@Component({\n selector: 'star-tree',\n imports: [CdkVirtualScrollViewport, CdkFixedSizeVirtualScroll, CdkVirtualForOf, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-tree' },\n template: `\n @if (filter()) {\n <div class=\"star-panel__filter\">\n <i class=\"ph-bold ph-magnifying-glass\" aria-hidden=\"true\"></i>\n <input\n #filterInput\n type=\"search\"\n class=\"star-input star-input--sm\"\n autocomplete=\"off\"\n [attr.aria-label]=\"text.filterPlaceholder\"\n [placeholder]=\"text.filterPlaceholder\"\n [value]=\"query()\"\n (input)=\"query.set(filterInput.value)\"\n />\n </div>\n }\n <ng-template #row let-item>\n <li\n class=\"star-tree__item\"\n role=\"treeitem\"\n [attr.data-key]=\"item.node.key\"\n [attr.aria-level]=\"item.level\"\n [attr.aria-setsize]=\"item.setSize\"\n [attr.aria-posinset]=\"item.position\"\n [attr.aria-expanded]=\"item.node.children?.length ? isExpanded(item.node) : null\"\n [attr.aria-selected]=\"\n selectionMode() && selectionMode() !== 'checkbox' ? isSelected(item.node) : null\n \"\n [attr.aria-checked]=\"selectionMode() === 'checkbox' ? checkState(item.node) : null\"\n [attr.aria-disabled]=\"item.node.disabled || null\"\n [attr.tabindex]=\"focusKey() === item.node.key ? 0 : -1\"\n [class.star-tree__item--selected]=\"isSelected(item.node)\"\n [style.--star-tree-level]=\"item.level - 1\"\n [style.height.px]=\"showViewport() ? virtualItemSize() : null\"\n (click)=\"onClick(item.node, $event)\"\n (keydown)=\"onKeydown($event, item)\"\n (focus)=\"onRowFocus(item.node.key)\"\n >\n @if (item.node.children?.length) {\n <span\n class=\"star-tree__toggle\"\n aria-hidden=\"true\"\n (click)=\"$event.stopPropagation(); toggle(item.node)\"\n >\n <i class=\"ph-bold ph-caret-right\"></i>\n </span>\n } @else {\n <span class=\"star-tree__toggle star-tree__toggle--leaf\" aria-hidden=\"true\"></span>\n }\n @if (selectionMode() === 'checkbox') {\n <span\n class=\"star-check__box star-tree__check\"\n aria-hidden=\"true\"\n [class.star-tree__check--on]=\"checkState(item.node) !== false\"\n >\n @if (checkState(item.node) === 'mixed') {\n <i class=\"ph-bold ph-minus\"></i>\n } @else if (checkState(item.node) === true) {\n <i class=\"ph-bold ph-check\"></i>\n }\n </span>\n }\n @if (item.node.icon) {\n <i class=\"star-tree__icon\" [class]=\"item.node.icon\" aria-hidden=\"true\"></i>\n }\n <span class=\"star-tree__label\">{{ item.node.label }}</span>\n </li>\n </ng-template>\n @if (showViewport()) {\n <cdk-virtual-scroll-viewport\n #viewport\n class=\"star-tree__viewport\"\n role=\"tree\"\n [itemSize]=\"virtualItemSize()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-multiselectable]=\"multiselectable()\"\n [attr.tabindex]=\"activeRendered() ? -1 : 0\"\n [style.height]=\"viewportHeight()\"\n (focus)=\"onViewportFocus()\"\n (blur)=\"parked = false\"\n (keydown)=\"onViewportKeydown($event)\"\n >\n <ng-template\n cdkVirtualFor\n let-item\n [cdkVirtualForOf]=\"visible()\"\n [cdkVirtualForTrackBy]=\"trackRow\"\n >\n <ng-container [ngTemplateOutlet]=\"row\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n </ng-template>\n </cdk-virtual-scroll-viewport>\n } @else {\n <ul\n #tree\n class=\"star-tree__list\"\n role=\"tree\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-multiselectable]=\"multiselectable()\"\n [style.max-height]=\"scrollHeight()\"\n >\n @for (item of visible(); track item.node.key) {\n <ng-container [ngTemplateOutlet]=\"row\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n } @empty {\n <li class=\"star-listbox__empty\" role=\"presentation\">{{ text.emptyFilterMessage }}</li>\n }\n </ul>\n }\n `,\n})\nexport class StarTree implements FormValueControl<readonly string[]> {\n protected readonly text = inject(STAR_UI_TEXT);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly doc = inject(DOCUMENT);\n readonly value = model<readonly string[]>([]);\n readonly nodes = input<readonly StarTreeNode[]>([]);\n readonly selectionMode = input<'single' | 'multiple' | 'checkbox' | null>(null);\n /** Expanded node keys. */\n readonly expanded = model<readonly string[]>([]);\n readonly filter = input(false, { transform: booleanAttribute });\n /** Maximum height of the tree (a CSS length, for example `16rem`). The tree scrolls inside it. */\n readonly scrollHeight = input<string | null>(null);\n /**\n * Windowed rendering for large trees (CDK virtual scrolling): only the rows in and near the\n * viewport are in the DOM. Needs `scrollHeight`, and every row gets the fixed height\n * `virtualItemSize`. Without `scrollHeight` the tree renders all rows as usual.\n */\n readonly virtualScroll = input(false, { transform: booleanAttribute });\n /** Row height in pixels in windowed rendering. Keep it equal to the real height of a row. */\n readonly virtualItemSize = input(34, { transform: numberAttribute });\n readonly ariaLabel = input<string | null>(null);\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly touch = output<void>();\n readonly nodeSelect = output<StarTreeNode>();\n\n protected readonly query = signal('');\n private readonly viewport = viewChild(CdkVirtualScrollViewport);\n private readonly filtered = computed(() => filterNodes(this.nodes(), this.query()));\n\n private readonly index = computed(() => {\n const map = new Map<string, StarTreeNode>();\n const walk = (nodes: readonly StarTreeNode[]) =>\n nodes.forEach((node) => {\n map.set(node.key, node);\n walk(node.children ?? []);\n });\n walk(this.nodes());\n return map;\n });\n private readonly parents = computed(() => parentsOf(this.nodes()));\n private readonly openKeys = computed(() => new Set(this.expanded()));\n private readonly selectedKeys = computed(() => new Set(this.value()));\n\n /** Flattened visible rows; a filter shows every matching branch open. */\n protected readonly visible = computed<VisibleNode[]>(() =>\n flattenVisible(this.filtered(), this.openKeys(), !!this.query()),\n );\n private readonly rowIndex = computed(() => rowIndexOf(this.visible()));\n\n /** Check state of each node of the (filtered) tree; empty outside checkbox mode. */\n private readonly checkMap = computed(() =>\n this.selectionMode() === 'checkbox'\n ? checkStates(this.filtered(), this.selectedKeys(), (key) => this.isLeaf(key))\n : new Map<string, boolean | 'mixed'>(),\n );\n\n /**\n * The active row (the one with `tabindex` 0). It stays a row after the rows change, and it\n * is kept in state, not read from the DOM: in windowed rendering its element may not exist.\n */\n protected readonly focusKey = linkedSignal<readonly VisibleNode[], string | null>({\n source: this.visible,\n computation: (rows, previous) =>\n stillFocusable(previous?.value, this.rowIndex(), this.parents(), rows[0]?.node.key ?? null),\n });\n\n // ---- windowed rendering ----\n protected readonly windowed = computed(\n () => this.virtualScroll() && !!this.scrollHeight() && this.virtualItemSize() > 0,\n );\n /** The windowed viewport shows when there are rows; the empty message needs the plain list. */\n protected readonly showViewport = computed(() => this.windowed() && this.visible().length > 0);\n /** Height of the viewport: as high as the rows, at most `scrollHeight`. */\n protected readonly viewportHeight = computed(\n () => `min(${this.visible().length * this.virtualItemSize()}px, ${this.scrollHeight()})`,\n );\n /** Rows that are in the DOM now: indexes `start` up to (not including) `end`. */\n private readonly range = signal<ListRange>({ start: 0, end: 0 });\n /** The active row is in the DOM. If it is not, the viewport takes the Tab stop. */\n protected readonly activeRendered = computed(() => {\n const index = this.rowIndex().get(this.focusKey() ?? '');\n const { start, end } = this.range();\n return index !== undefined && index >= start && index < end;\n });\n protected readonly multiselectable = computed(() =>\n this.selectionMode() !== 'single' && this.selectionMode() !== null ? true : null,\n );\n /** Row to focus as soon as its element exists (it may need scrolling in first). */\n private pendingFocus: string | null = null;\n /** The focus waits on the viewport because the focused row left the DOM. */\n protected parked = false;\n\n protected readonly trackRow = (_: number, row: VisibleNode) => row.node.key;\n\n constructor() {\n effect((onCleanup) => {\n const viewport = this.viewport();\n if (!viewport) {\n this.range.set({ start: 0, end: 0 });\n return;\n }\n this.range.set({ ...viewport.getRenderedRange() });\n // The range is emitted before the DOM changes: the focused row is still there.\n const subscription = viewport.renderedRangeStream.subscribe((range) => {\n this.parkFocus(range);\n this.range.set({ ...range });\n });\n onCleanup(() => subscription.unsubscribe());\n });\n // The rows change (a branch opens above the focused row, a filter, new nodes) and the focused\n // row may leave the window without a scroll. This effect runs before the template updates.\n effect(() => {\n this.visible();\n untracked(() => {\n const viewport = this.viewport();\n if (viewport) this.parkFocus(viewport.getRenderedRange());\n });\n });\n // The viewport measures its height once; it must measure again when the rows change it.\n afterRenderEffect(() => {\n this.viewportHeight();\n this.viewport()?.checkViewportSize();\n });\n afterEveryRender(() => {\n this.applyPendingFocus();\n if (this.parked) this.restoreParkedFocus();\n });\n }\n\n isExpanded(node: StarTreeNode): boolean {\n return !!this.query() || this.openKeys().has(node.key);\n }\n\n toggle(node: StarTreeNode, open = !this.isExpanded(node)): void {\n this.expanded.update((keys) => {\n if (!open) return keys.filter((k) => k !== node.key);\n return keys.includes(node.key) ? keys : [...keys, node.key];\n });\n }\n\n protected isSelected(node: StarTreeNode): boolean {\n return this.selectedKeys().has(node.key);\n }\n\n /** Checkbox mode: true, false or 'mixed' from the leaves below. */\n protected checkState(node: StarTreeNode): boolean | 'mixed' {\n const known = this.checkMap().get(node.key);\n if (known !== undefined) return known;\n if (!node.children?.length) return this.isSelected(node);\n return (\n checkStates([node], this.selectedKeys(), (key) => this.isLeaf(key)).get(node.key) ?? false\n );\n }\n\n select(node: StarTreeNode): void {\n const mode = this.selectionMode();\n if (!mode || this.disabled() || node.disabled || node.selectable === false) return;\n if (mode === 'single') {\n this.value.set([node.key]);\n } else if (mode === 'multiple') {\n this.value.update((keys) =>\n keys.includes(node.key) ? keys.filter((k) => k !== node.key) : [...keys, node.key],\n );\n } else {\n // Checkbox: the whole branch follows the clicked node; parents are derived.\n const branch = subtreeKeys(node);\n const inBranch = new Set(branch);\n const on = this.checkState(node) !== true;\n this.value.update((keys) => {\n const rest = keys.filter((k) => !inBranch.has(k));\n return on ? [...rest, ...branch.filter((key) => this.isLeaf(key))] : rest;\n });\n }\n this.nodeSelect.emit(node);\n }\n\n protected onClick(node: StarTreeNode, event: MouseEvent): void {\n this.focusKey.set(node.key);\n (event.currentTarget as HTMLElement).focus();\n if (this.selectionMode()) this.select(node);\n else if (node.children?.length) this.toggle(node);\n }\n\n protected onRowFocus(key: string): void {\n this.focusKey.set(key);\n this.pendingFocus = null;\n this.parked = false;\n }\n\n /**\n * Moves the focus to a row. The row becomes the active row at once. In windowed rendering the\n * row is scrolled into the window first, and the focus is applied after its element renders.\n */\n private focusRow(key: string | null | undefined): void {\n if (!key) return;\n this.focusKey.set(key);\n this.pendingFocus = key;\n if (this.showViewport()) this.revealRow(key);\n queueMicrotask(() => this.applyPendingFocus());\n }\n\n /** Scrolls a row into the window with the least movement (`scrollToIndex` puts it on top). */\n private revealRow(key: string): void {\n const viewport = this.viewport();\n const index = this.rowIndex().get(key);\n if (!viewport || index === undefined) return;\n const offset = scrollOffsetToReveal(\n index,\n this.virtualItemSize(),\n viewport.measureScrollOffset(),\n viewport.getViewportSize(),\n );\n if (offset !== null) viewport.scrollToOffset(offset);\n }\n\n private rowElement(key: string): HTMLElement | null {\n return this.host.nativeElement.querySelector<HTMLElement>(`[data-key=\"${CSS.escape(key)}\"]`);\n }\n\n private applyPendingFocus(): void {\n const key = this.pendingFocus;\n if (key === null) return;\n if (!this.rowIndex().has(key)) {\n this.pendingFocus = null;\n return;\n }\n const row = this.rowElement(key);\n if (!row) return; // not rendered yet: the next render calls this again\n this.pendingFocus = null;\n row.focus({ preventScroll: this.windowed() });\n }\n\n /**\n * The browser drops the focus to the page body when the focused element leaves the DOM. Before\n * the focused row scrolls out of the window, the focus moves to the viewport; the keys still\n * work there, and the focus returns to the row when it renders again.\n */\n private parkFocus(range: ListRange): void {\n const viewport = this.viewport()?.elementRef.nativeElement;\n const active = this.doc.activeElement;\n if (!viewport || !active || active === viewport || !viewport.contains(active)) return;\n const key = active.closest<HTMLElement>('[data-key]')?.dataset['key'];\n const index = key === undefined ? undefined : this.rowIndex().get(key);\n if (index !== undefined && index >= range.start && index < range.end) return;\n this.parked = true;\n viewport.focus({ preventScroll: true });\n }\n\n private restoreParkedFocus(): void {\n const viewport = this.viewport()?.elementRef.nativeElement;\n if (!viewport || this.doc.activeElement !== viewport) {\n this.parked = false;\n return;\n }\n const key = this.focusKey();\n if (key === null) return;\n this.rowElement(key)?.focus({ preventScroll: true });\n }\n\n /** Tab into the viewport (no row has the Tab stop): the focus goes to the active row. */\n protected onViewportFocus(): void {\n if (!this.parked) this.focusRow(this.focusKey());\n }\n\n /** Keys on the viewport itself (the focus is parked there): they act on the active row. */\n protected onViewportKeydown(event: KeyboardEvent): void {\n if (event.target !== event.currentTarget) return;\n const row = this.visible()[this.rowIndex().get(this.focusKey() ?? '') ?? -1];\n if (row) this.onKeydown(event, row);\n }\n\n protected onKeydown(event: KeyboardEvent, row: VisibleNode): void {\n const rows = this.visible();\n // A key that arrives before the last move has rendered (a held key, a far scroll) continues\n // from the row that the last move aimed at, not from the row that still has the DOM focus.\n const item =\n this.pendingFocus === null\n ? row\n : (rows[this.rowIndex().get(this.pendingFocus) ?? -1] ?? row);\n const index = this.rowIndex().get(item.node.key) ?? -1;\n const hasChildren = !!item.node.children?.length;\n const expanded = hasChildren && this.isExpanded(item.node);\n // Arrow right opens a branch and Arrow left closes it (WAI-ARIA tree pattern). In\n // right-to-left the arrows swap: the branch opens toward the left.\n const key = starInlineKey(event);\n const target = () => navigationTarget(rows, index, key, { hasChildren, expanded });\n const handled = () => event.preventDefault();\n switch (key) {\n case 'ArrowDown':\n case 'ArrowUp':\n case 'Home':\n case 'End':\n handled();\n return this.focusRow(target());\n case 'ArrowRight':\n handled();\n if (hasChildren && !expanded) this.toggle(item.node, true);\n else this.focusRow(target());\n return;\n case 'ArrowLeft':\n handled();\n if (expanded) this.toggle(item.node, false);\n else this.focusRow(target());\n return;\n case 'Enter':\n case ' ':\n handled();\n if (this.selectionMode()) this.select(item.node);\n else if (hasChildren) this.toggle(item.node);\n return;\n case '*': {\n handled();\n const siblings = rows\n .filter((r) => r.parentKey === item.parentKey && r.node.children?.length)\n .map((r) => r.node.key);\n this.expanded.update((keys) => {\n const open = new Set(keys);\n const added = siblings.filter((key) => !open.has(key));\n return added.length ? [...keys, ...added] : keys;\n });\n return;\n }\n }\n }\n\n /** Label of a node key (used by `star-tree-select`). */\n labelFor(key: string): string {\n return this.index().get(key)?.label ?? key;\n }\n\n /** Keys of leaves only, for checkbox summaries. */\n isLeaf(key: string): boolean {\n return !this.index().get(key)?.children?.length;\n }\n\n focus(): void {\n this.focusRow(this.focusKey());\n }\n}\n\nconst POSITIONS: ConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 6 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -6 },\n];\n\n/**\n * Tree select (PrimeNG `p-treeselect`): a select field whose panel is an `star-tree`.\n * Value: selected node keys (one key in `single` mode).\n *\n * `<star-tree-select [nodes]=\"departments\" selectionMode=\"checkbox\" [(value)]=\"keys\" placeholder=\"Department\" />`\n */\n@Component({\n selector: 'star-tree-select',\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, StarTree],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'star-select star-tree-select',\n '[class.star-select--open]': 'open()',\n '[class.star-select--disabled]': 'disabled()',\n '[class.star-select--invalid]': 'invalid() && touched()',\n },\n template: `\n <div class=\"star-select__control\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <button\n #trigger\n type=\"button\"\n class=\"star-select__trigger star-tree-select__trigger\"\n aria-haspopup=\"tree\"\n [id]=\"inputId\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-label]=\"triggerName()\"\n (click)=\"open.set(!open())\"\n (keydown.arrowdown)=\"$event.preventDefault(); open.set(true)\"\n (blur)=\"!open() && touch.emit()\"\n >\n @if (summary()) {\n <span class=\"star-select__value\">{{ summary() }}</span>\n } @else {\n <span class=\"star-select__placeholder\">{{\n placeholder() ?? text.selectPlaceholder\n }}</span>\n }\n </button>\n @if (showClear() && value().length && !disabled()) {\n <button\n type=\"button\"\n class=\"star-select__icon-btn\"\n [attr.aria-label]=\"text.clear\"\n (click)=\"value.set([])\"\n >\n <i class=\"ph-bold ph-x\" aria-hidden=\"true\"></i>\n </button>\n }\n <i class=\"ph-bold ph-caret-down star-select__caret\" aria-hidden=\"true\"></i>\n </div>\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayUsePopover=\"inline\"\n [cdkConnectedOverlayMinWidth]=\"origin.elementRef.nativeElement.offsetWidth\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (attach)=\"panelTree()?.focus()\"\n (detach)=\"close()\"\n (overlayOutsideClick)=\"onOutside($event)\"\n (overlayKeydown)=\"$event.key === 'Escape' && close(true)\"\n >\n <div class=\"star-panel star-tree-select__panel\">\n <star-tree\n #panelTree\n [nodes]=\"nodes()\"\n [selectionMode]=\"selectionMode()\"\n [(value)]=\"value\"\n [(expanded)]=\"expanded\"\n [filter]=\"filter()\"\n scrollHeight=\"18rem\"\n [virtualScroll]=\"virtualScroll()\"\n [virtualItemSize]=\"virtualItemSize()\"\n [ariaLabel]=\"ariaLabel()\"\n (nodeSelect)=\"selectionMode() === 'single' && close(true)\"\n />\n </div>\n </ng-template>\n `,\n})\nexport class StarTreeSelect implements FormValueControl<readonly string[]> {\n /** Keeps the CDK direction (overlays and menus) in step with `<html dir>`. */\n private readonly directionSync = inject(StarDirectionService);\n protected readonly text = inject(STAR_UI_TEXT);\n protected readonly inputId = inject(_IdGenerator).getId('star-tree-select-');\n protected readonly positions = POSITIONS;\n\n readonly value = model<readonly string[]>([]);\n readonly nodes = input<readonly StarTreeNode[]>([]);\n readonly selectionMode = input<'single' | 'multiple' | 'checkbox'>('single');\n readonly expanded = model<readonly string[]>([]);\n readonly filter = input(false, { transform: booleanAttribute });\n /** Windowed rendering of the panel tree (see `star-tree`). The panel is 18rem high. */\n readonly virtualScroll = input(false, { transform: booleanAttribute });\n /** Row height in pixels in windowed rendering. */\n readonly virtualItemSize = input(34, { transform: numberAttribute });\n readonly showClear = input(false, { transform: booleanAttribute });\n readonly placeholder = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n readonly maxSelectedLabels = input(3);\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touched = input(false, { transform: booleanAttribute });\n readonly touch = output<void>();\n\n protected readonly open = signal(false);\n protected readonly panelTree = viewChild<StarTree>('panelTree');\n private readonly trigger = viewChild.required<ElementRef<HTMLButtonElement>>('trigger');\n\n private readonly labels = computed(() => {\n const map = new Map<string, string>();\n const walk = (nodes: readonly StarTreeNode[]) =>\n nodes.forEach((n) => {\n map.set(n.key, n.label);\n walk(n.children ?? []);\n });\n walk(this.nodes());\n return map;\n });\n\n protected readonly summary = computed(() => {\n const keys = this.value();\n if (keys.length > this.maxSelectedLabels()) return this.text.selectedItems(keys.length);\n return keys.map((key) => this.labels().get(key) ?? key).join(', ');\n });\n\n /**\n * Accessible name of the trigger button: the label and the text on the button, so the visible\n * text is part of the name (WCAG 2.5.3). `null` without `ariaLabel`: a `star-field` label then\n * names the button.\n */\n protected readonly triggerName = computed(() => {\n const label = this.ariaLabel();\n if (!label) return null;\n return `${label}: ${this.summary() || (this.placeholder() ?? this.text.selectPlaceholder)}`;\n });\n\n protected close(focus = false): void {\n if (!this.open()) return;\n this.open.set(false);\n if (focus) this.trigger().nativeElement.focus();\n }\n\n protected onOutside(event: MouseEvent): void {\n if (this.trigger().nativeElement.contains(event.target as Node)) return;\n this.close();\n this.touch.emit();\n }\n\n focus(): void {\n this.trigger().nativeElement.focus();\n }\n}\n"],"mappings":";;;;;;;AA0BA,SAAgB,eACd,OACA,MACA,UAAU,OAAK;CAEf,MAAM,OAAqB,CAAA;CAC3B,MAAM,QAAQ,MAAoB,OAAe,cAA4B;EAC3E,MAAM,UAAU,KAAK;EACrB,KAAK,SAAS,MAAM,MAAK;GACvB,KAAK,KAAK;IAAE;IAAM;IAAO;IAAS,UAAU,IAAI;IAAG;GAAS,CAAE;GAC9D,IAAI,KAAK,UAAU,WAAW,WAAW,KAAK,IAAI,KAAK,GAAG,IACxD,KAAK,KAAK,UAAU,QAAQ,GAAG,KAAK,GAAG;EAE3C,CAAC;CACH;CACA,KAAK,OAAO,GAAG,IAAI;CACnB,OAAO;AACT;AAGA,SAAgB,WACd,MAA2B;CAE3B,MAAM,sBAAM,IAAI,IAAG;CACnB,KAAK,SAAS,KAAK,MAAM,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC;CACjD,OAAO;AACT;AAGA,SAAgB,YAAqC,MAAO;CAC1D,MAAM,OAAiB,CAAA;CACvB,MAAM,QAAQ,YAAc;EAC1B,KAAK,KAAK,QAAQ,GAAG;EACrB,QAAQ,UAAU,QAAQ,IAAI;CAChC;CACA,KAAK,IAAI;CACT,OAAO;AACT;AAGA,SAAgB,UACd,OAAmB;CAEnB,MAAM,sBAAM,IAAI,IAAG;CACnB,MAAM,QAAQ,MAAoB,WAChC,KAAK,SAAS,SAAQ;EACpB,IAAI,IAAI,KAAK,KAAK,MAAM;EACxB,IAAI,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,GAAG;CACjD,CAAC;CACH,KAAK,OAAO,IAAI;CAChB,OAAO;AACT;AAMA,SAAgB,eACd,UACA,UACA,SACA,UAAuB;CAEvB,IAAI,MAAM,YAAY;CACtB,OAAO,QAAQ,MAAM;EACnB,IAAI,SAAS,IAAI,GAAG,GAAG,OAAO;EAC9B,MAAM,QAAQ,IAAI,GAAG,KAAK;CAC5B;CACA,OAAO;AACT;AAOA,SAAgB,iBACd,MACA,OACA,KACA,OAAkD;CAElD,MAAM,MAAM,KAAK;CACjB,IAAI,CAAC,KAAK,OAAO;CACjB,QAAQ,KAAR;EACE,KAAK,aACH,OAAO,KAAK,QAAQ,EAAE,EAAE,KAAK,OAAO;EACtC,KAAK,WACH,OAAO,KAAK,QAAQ,EAAE,EAAE,KAAK,OAAO;EACtC,KAAK,QACH,OAAO,KAAK,EAAE,EAAE,KAAK,OAAO;EAC9B,KAAK,OACH,OAAO,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,OAAO;EAClC,KAAK,cACH,OAAO,MAAM,eAAe,MAAM,WAAY,KAAK,QAAQ,EAAE,EAAE,KAAK,OAAO,OAAQ;EACrF,KAAK,aACH,OAAO,MAAM,eAAe,MAAM,WAAW,OAAO,IAAI;EAC1D,SACE,OAAO;CACX;AACF;AAUA,SAAgB,YACd,OACA,UACA,QAAgC;CAEhC,MAAM,yBAAS,IAAI,IAAG;CACtB,MAAM,QAAQ,SAAgD;EAC5D,IAAI,CAAC,KAAK,UAAU,QAAQ;GAC1B,OAAO,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC;GAC3C,MAAM,OAAO,OAAO,KAAK,GAAG;GAC5B,OAAO;IAAE,QAAQ,OAAO,IAAI;IAAG,SAAS,QAAQ,SAAS,IAAI,KAAK,GAAG,IAAI,IAAI;GAAC;EAChF;EACA,IAAI,SAAS;EACb,IAAI,UAAU;EACd,KAAK,MAAM,SAAS,KAAK,UAAU;GACjC,MAAM,OAAO,KAAK,KAAK;GACvB,UAAU,KAAK;GACf,WAAW,KAAK;EAClB;EACA,OAAO,IAAI,KAAK,KAAK,YAAY,IAAI,QAAQ,YAAY,SAAS,OAAO,OAAO;EAChF,OAAO;GAAE;GAAQ;EAAO;CAC1B;CACA,MAAM,QAAQ,IAAI;CAClB,OAAO;AACT;AAMA,SAAgB,qBACd,OACA,UACA,cACA,cAAoB;CAEpB,MAAM,MAAM,QAAQ;CACpB,MAAM,SAAS,MAAM;CACrB,IAAI,MAAM,cAAc,OAAO;CAC/B,IAAI,SAAS,eAAe,cAAc,OAAO,KAAK,IAAI,GAAG,SAAS,YAAY;CAClF,OAAO;AACT;ACzHA,SAAS,YAAY,OAAgC,OAAa;CAChE,IAAI,CAAC,OAAO,OAAO,CAAC,GAAG,KAAK;CAC5B,OAAO,MAAM,SAAS,SAAQ;EAC5B,MAAM,WAAW,YAAY,KAAK,YAAY,CAAA,GAAI,KAAK;EACvD,OAAO,cAAc,KAAK,OAAO,KAAK,KAAK,SAAS,SAAS,CAAC;GAAE,GAAG;GAAM;EAAQ,CAAE,IAAI,CAAA;CACzF,CAAC;AACH;AAiIA,IAAa,WAAb,MAAa,SAAQ;CACA,OAAO,OAAO,YAAY;CAC5B,OAAO,OAAgC,UAAU;CACjD,MAAM,OAAO,QAAQ;CAC7B,QAAQ,MAAyB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACpC,QAAQ,MAA+B,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAC1C,gBAAgB,MAAiD,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAEtE,WAAW,MAAyB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACvC,SAAS,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,SAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAEnD,eAAe,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAMzC,gBAAgB,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,gBAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAE1D,kBAAkB,MAAM,IAAE;EAAA,GAAA,YAAA,EAAA,WAAA,kBAAA,+BAAA,CAAA;EAAI,WAAW;CAAe,CAAA;CACxD,YAAY,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACtC,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,QAAQ,OAAM;CACd,aAAa,OAAM;CAET,QAAQ,OAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACpB,WAAW,UAAU,0BAAyB,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAC9C,WAAW,eAAe,YAAY,KAAK,MAAK,GAAI,KAAK,MAAK,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAElE,QAAQ,eAAc;EACrC,MAAM,sBAAM,IAAI,IAAG;EACnB,MAAM,QAAQ,UACZ,MAAM,SAAS,SAAQ;GACrB,IAAI,IAAI,KAAK,KAAK,IAAI;GACtB,KAAK,KAAK,YAAY,CAAA,CAAE;EAC1B,CAAC;EACH,KAAK,KAAK,MAAK,CAAE;EACjB,OAAO;CACT,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACe,UAAU,eAAe,UAAU,KAAK,MAAK,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACjD,WAAW,eAAe,IAAI,IAAI,KAAK,SAAQ,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACnD,eAAe,eAAe,IAAI,IAAI,KAAK,MAAK,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAGlD,UAAU,eAC3B,eAAe,KAAK,SAAQ,GAAI,KAAK,SAAQ,GAAI,CAAC,CAAC,KAAK,MAAK,CAAE,GAChE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACgB,WAAW,eAAe,WAAW,KAAK,QAAO,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAGrD,WAAW,eAC1B,KAAK,cAAa,MAAO,aACrB,YAAY,KAAK,SAAQ,GAAI,KAAK,aAAY,IAAK,QAAQ,KAAK,OAAO,GAAG,CAAC,oBAC3E,IAAI,IAAG,GACZ,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAMkB,WAAW,aAAY;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EACxC,QAAQ,KAAK;EACb,cAAc,MAAM,aAClB,eAAe,UAAU,OAAO,KAAK,SAAQ,GAAI,KAAK,QAAO,GAAI,KAAK,EAAE,EAAE,KAAK,OAAO,IAAI;CAAC,CAAA;CAI5E,WAAW,eACtB,KAAK,cAAa,KAAM,CAAC,CAAC,KAAK,aAAY,KAAM,KAAK,gBAAe,IAAK,GACjF,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,eAAe,eAAe,KAAK,SAAQ,KAAM,KAAK,QAAO,CAAE,CAAC,SAAS,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAE3E,iBAAiB,eAC5B,OAAO,KAAK,QAAO,CAAE,CAAC,SAAS,KAAK,gBAAe,EAAE,MAAO,KAAK,aAAY,EAAE,IACtF,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAEgB,QAAQ,OAAkB;EAAE,OAAO;EAAG,KAAK;CAAC,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAE7C,iBAAiB,eAAc;EAChD,MAAM,QAAQ,KAAK,SAAQ,CAAE,CAAC,IAAI,KAAK,SAAQ,KAAM,EAAE;EACvD,MAAM,EAAE,OAAO,QAAQ,KAAK,MAAK;EACjC,OAAO,UAAU,UAAa,SAAS,SAAS,QAAQ;CAC1D,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CACiB,kBAAkB,eACnC,KAAK,cAAa,MAAO,YAAY,KAAK,cAAa,MAAO,OAAO,OAAO,MAC7E,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAEO,eAA8B;CAE5B,SAAS;CAEA,YAAY,GAAW,QAAqB,IAAI,KAAK;CAExE,cAAA;EACE,QAAQ,cAAa;GACnB,MAAM,WAAW,KAAK,SAAQ;GAC9B,IAAI,CAAC,UAAU;IACb,KAAK,MAAM,IAAI;KAAE,OAAO;KAAG,KAAK;IAAC,CAAE;IACnC;GACF;GACA,KAAK,MAAM,IAAI,EAAE,GAAG,SAAS,iBAAgB,EAAE,CAAE;GAEjD,MAAM,eAAe,SAAS,oBAAoB,WAAW,UAAS;IACpE,KAAK,UAAU,KAAK;IACpB,KAAK,MAAM,IAAI,EAAE,GAAG,MAAK,CAAE;GAC7B,CAAC;GACD,gBAAgB,aAAa,YAAW,CAAE;EAC5C,CAAC;EAGD,aAAY;GACV,KAAK,QAAO;GACZ,gBAAe;IACb,MAAM,WAAW,KAAK,SAAQ;IAC9B,IAAI,UAAU,KAAK,UAAU,SAAS,iBAAgB,CAAE;GAC1D,CAAC;EACH,CAAC;EAED,wBAAuB;GACrB,KAAK,eAAc;GACnB,KAAK,SAAQ,CAAE,EAAE,kBAAiB;EACpC,CAAC;EACD,uBAAsB;GACpB,KAAK,kBAAiB;GACtB,IAAI,KAAK,QAAQ,KAAK,mBAAkB;EAC1C,CAAC;CACH;CAEA,WAAW,MAAkB;EAC3B,OAAO,CAAC,CAAC,KAAK,MAAK,KAAM,KAAK,SAAQ,CAAE,CAAC,IAAI,KAAK,GAAG;CACvD;CAEA,OAAO,MAAoB,OAAO,CAAC,KAAK,WAAW,IAAI,GAAC;EACtD,KAAK,SAAS,QAAQ,SAAQ;GAC5B,IAAI,CAAC,MAAM,OAAO,KAAK,QAAQ,MAAM,MAAM,KAAK,GAAG;GACnD,OAAO,KAAK,SAAS,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,MAAM,KAAK,GAAG;EAC5D,CAAC;CACH;CAEU,WAAW,MAAkB;EACrC,OAAO,KAAK,aAAY,CAAE,CAAC,IAAI,KAAK,GAAG;CACzC;CAGU,WAAW,MAAkB;EACrC,MAAM,QAAQ,KAAK,SAAQ,CAAE,CAAC,IAAI,KAAK,GAAG;EAC1C,IAAI,UAAU,QAAW,OAAO;EAChC,IAAI,CAAC,KAAK,UAAU,QAAQ,OAAO,KAAK,WAAW,IAAI;EACvD,OACE,YAAY,CAAC,IAAI,GAAG,KAAK,aAAY,IAAK,QAAQ,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,KAAK;CAEzF;CAEA,OAAO,MAAkB;EACvB,MAAM,OAAO,KAAK,cAAa;EAC/B,IAAI,CAAC,QAAQ,KAAK,SAAQ,KAAM,KAAK,YAAY,KAAK,eAAe,OAAO;EAC5E,IAAI,SAAS,UACX,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG,CAAC;OACpB,IAAI,SAAS,YAClB,KAAK,MAAM,QAAQ,SACjB,KAAK,SAAS,KAAK,GAAG,IAAI,KAAK,QAAQ,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,MAAM,KAAK,GAAG,CAAC;OAE/E;GAEL,MAAM,SAAS,YAAY,IAAI;GAC/B,MAAM,WAAW,IAAI,IAAI,MAAM;GAC/B,MAAM,KAAK,KAAK,WAAW,IAAI,MAAM;GACrC,KAAK,MAAM,QAAQ,SAAQ;IACzB,MAAM,OAAO,KAAK,QAAQ,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,GAAG,MAAM,GAAG,OAAO,QAAQ,QAAQ,KAAK,OAAO,GAAG,CAAC,CAAC,IAAI;GACvE,CAAC;EACH;EACA,KAAK,WAAW,KAAK,IAAI;CAC3B;CAEU,QAAQ,MAAoB,OAAiB;EACrD,KAAK,SAAS,IAAI,KAAK,GAAG;EACzB,MAAM,cAA8B,MAAK;EAC1C,IAAI,KAAK,cAAa,GAAI,KAAK,OAAO,IAAI;OACrC,IAAI,KAAK,UAAU,QAAQ,KAAK,OAAO,IAAI;CAClD;CAEU,WAAW,KAAW;EAC9B,KAAK,SAAS,IAAI,GAAG;EACrB,KAAK,eAAe;EACpB,KAAK,SAAS;CAChB;CAMQ,SAAS,KAA8B;EAC7C,IAAI,CAAC,KAAK;EACV,KAAK,SAAS,IAAI,GAAG;EACrB,KAAK,eAAe;EACpB,IAAI,KAAK,aAAY,GAAI,KAAK,UAAU,GAAG;EAC3C,qBAAqB,KAAK,kBAAiB,CAAE;CAC/C;CAGQ,UAAU,KAAW;EAC3B,MAAM,WAAW,KAAK,SAAQ;EAC9B,MAAM,QAAQ,KAAK,SAAQ,CAAE,CAAC,IAAI,GAAG;EACrC,IAAI,CAAC,YAAY,UAAU,QAAW;EACtC,MAAM,SAAS,qBACb,OACA,KAAK,gBAAe,GACpB,SAAS,oBAAmB,GAC5B,SAAS,gBAAe,CAAE;EAE5B,IAAI,WAAW,MAAM,SAAS,eAAe,MAAM;CACrD;CAEQ,WAAW,KAAW;EAC5B,OAAO,KAAK,KAAK,cAAc,cAA2B,cAAc,IAAI,OAAO,GAAG,EAAC,GAAI;CAC7F;CAEQ,oBAAiB;EACvB,MAAM,MAAM,KAAK;EACjB,IAAI,QAAQ,MAAM;EAClB,IAAI,CAAC,KAAK,SAAQ,CAAE,CAAC,IAAI,GAAG,GAAG;GAC7B,KAAK,eAAe;GACpB;EACF;EACA,MAAM,MAAM,KAAK,WAAW,GAAG;EAC/B,IAAI,CAAC,KAAK;EACV,KAAK,eAAe;EACpB,IAAI,MAAM,EAAE,eAAe,KAAK,SAAQ,EAAE,CAAE;CAC9C;CAOQ,UAAU,OAAgB;EAChC,MAAM,WAAW,KAAK,SAAQ,CAAE,EAAE,WAAW;EAC7C,MAAM,SAAS,KAAK,IAAI;EACxB,IAAI,CAAC,YAAY,CAAC,UAAU,WAAW,YAAY,CAAC,SAAS,SAAS,MAAM,GAAG;EAC/E,MAAM,MAAM,OAAO,QAAqB,YAAY,CAAC,EAAE,QAAQ;EAC/D,MAAM,QAAQ,QAAQ,SAAY,SAAY,KAAK,SAAQ,CAAE,CAAC,IAAI,GAAG;EACrE,IAAI,UAAU,UAAa,SAAS,MAAM,SAAS,QAAQ,MAAM,KAAK;EACtE,KAAK,SAAS;EACd,SAAS,MAAM,EAAE,eAAe,KAAI,CAAE;CACxC;CAEQ,qBAAkB;EACxB,MAAM,WAAW,KAAK,SAAQ,CAAE,EAAE,WAAW;EAC7C,IAAI,CAAC,YAAY,KAAK,IAAI,kBAAkB,UAAU;GACpD,KAAK,SAAS;GACd;EACF;EACA,MAAM,MAAM,KAAK,SAAQ;EACzB,IAAI,QAAQ,MAAM;EAClB,KAAK,WAAW,GAAG,CAAC,EAAE,MAAM,EAAE,eAAe,KAAI,CAAE;CACrD;CAGU,kBAAe;EACvB,IAAI,CAAC,KAAK,QAAQ,KAAK,SAAS,KAAK,SAAQ,CAAE;CACjD;CAGU,kBAAkB,OAAoB;EAC9C,IAAI,MAAM,WAAW,MAAM,eAAe;EAC1C,MAAM,MAAM,KAAK,QAAO,CAAE,CAAC,KAAK,SAAQ,CAAE,CAAC,IAAI,KAAK,SAAQ,KAAM,EAAE,KAAK;EACzE,IAAI,KAAK,KAAK,UAAU,OAAO,GAAG;CACpC;CAEU,UAAU,OAAsB,KAAgB;EACxD,MAAM,OAAO,KAAK,QAAO;EAGzB,MAAM,OACJ,KAAK,iBAAiB,OAClB,MACC,KAAK,KAAK,SAAQ,CAAE,CAAC,IAAI,KAAK,YAAY,KAAK,OAAO;EAC7D,MAAM,QAAQ,KAAK,SAAQ,CAAE,CAAC,IAAI,KAAK,KAAK,GAAG,KAAK;EACpD,MAAM,cAAc,CAAC,CAAC,KAAK,KAAK,UAAU;EAC1C,MAAM,WAAW,eAAe,KAAK,WAAW,KAAK,IAAI;EAGzD,MAAM,MAAM,cAAc,KAAK;EAC/B,MAAM,eAAe,iBAAiB,MAAM,OAAO,KAAK;GAAE;GAAa;EAAQ,CAAE;EACjF,MAAM,gBAAgB,MAAM,eAAc;EAC1C,QAAQ,KAAR;GACE,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;IACH,QAAO;IACP,OAAO,KAAK,SAAS,OAAM,CAAE;GAC/B,KAAK;IACH,QAAO;IACP,IAAI,eAAe,CAAC,UAAU,KAAK,OAAO,KAAK,MAAM,IAAI;SACpD,KAAK,SAAS,OAAM,CAAE;IAC3B;GACF,KAAK;IACH,QAAO;IACP,IAAI,UAAU,KAAK,OAAO,KAAK,MAAM,KAAK;SACrC,KAAK,SAAS,OAAM,CAAE;IAC3B;GACF,KAAK;GACL,KAAK;IACH,QAAO;IACP,IAAI,KAAK,cAAa,GAAI,KAAK,OAAO,KAAK,IAAI;SAC1C,IAAI,aAAa,KAAK,OAAO,KAAK,IAAI;IAC3C;GACF,KAAK,KAAK;IACR,QAAO;IACP,MAAM,WAAW,KACd,QAAQ,MAAM,EAAE,cAAc,KAAK,aAAa,EAAE,KAAK,UAAU,MAAM,CAAC,CACxE,KAAK,MAAM,EAAE,KAAK,GAAG;IACxB,KAAK,SAAS,QAAQ,SAAQ;KAC5B,MAAM,OAAO,IAAI,IAAI,IAAI;KACzB,MAAM,QAAQ,SAAS,QAAQ,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC;KACrD,OAAO,MAAM,SAAS,CAAC,GAAG,MAAM,GAAG,KAAK,IAAI;IAC9C,CAAC;IACD;GACF;EACF;CACF;CAGA,SAAS,KAAW;EAClB,OAAO,KAAK,MAAK,CAAE,CAAC,IAAI,GAAG,CAAC,EAAE,SAAS;CACzC;CAGA,OAAO,KAAW;EAChB,OAAO,CAAC,KAAK,MAAK,CAAE,CAAC,IAAI,GAAG,CAAC,EAAE,UAAU;CAC3C;CAEA,QAAK;EACH,KAAK,SAAS,KAAK,SAAQ,CAAE;CAC/B;CAjVW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAQ,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAR,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAQ,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,UAAA;GAAA,OAAA;GAAA,YAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,YAAA;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WA0BmB;GAAwB,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UAvIpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2GT,UAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MA9GS;IAAwB,UAAA;IAAA,QAAA,CAAA,eAAA,YAAA;IAAA,SAAA,CAAA,qBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAyB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAe,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAgHrF,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAQ,YAAA,CAAA;EAlHpB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS;IAAC;IAA0B;IAA2B;IAAiB;GAAgB;GAChG,iBAAiB,wBAAwB;GACzC,MAAM,EAAE,OAAO,YAAW;GAC1B,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4GX,CAAA;CA2BuC,CAAA;CAAA,sBAAA,CAAA;CAAA,gBAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,eAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,gBAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,eAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,iBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,OAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,YAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,GAAA,iBAAA,wBAAwB,GAAA,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AA0ThE,MAAM,YAAiC,CACrC;CAAE,SAAS;CAAS,SAAS;CAAU,UAAU;CAAS,UAAU;CAAO,SAAS;AAAC,GACrF;CAAE,SAAS;CAAS,SAAS;CAAO,UAAU;CAAS,UAAU;CAAU,SAAS;AAAE,CACvF;AAmFD,IAAa,iBAAb,MAAa,eAAc;CAER,gBAAgB,OAAO,oBAAoB;CACzC,OAAO,OAAO,YAAY;CAC1B,UAAU,OAAO,YAAY,CAAC,CAAC,MAAM,mBAAmB;CACxD,YAAY;CAEtB,QAAQ,MAAyB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACpC,QAAQ,MAA+B,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAC1C,gBAAgB,MAA0C,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CACnE,WAAW,MAAyB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACvC,SAAS,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,SAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAEnD,gBAAgB,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,gBAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAE1D,kBAAkB,MAAM,IAAE;EAAA,GAAA,YAAA,EAAA,WAAA,kBAAA,+BAAA,CAAA;EAAI,WAAW;CAAe,CAAA;CACxD,YAAY,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACtD,cAAc,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CACxC,YAAY,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACtC,oBAAoB,MAAM,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,oBAAA,CAAA,+BAAA,CAAA,CAAA;CAC5B,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACpD,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACpD,QAAQ,OAAM;CAEJ,OAAO,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACpB,YAAY,UAAoB,aAAY,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAC9C,UAAU,UAAU,SAAwC,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEtE,SAAS,eAAc;EACtC,MAAM,sBAAM,IAAI,IAAG;EACnB,MAAM,QAAQ,UACZ,MAAM,SAAS,MAAK;GAClB,IAAI,IAAI,EAAE,KAAK,EAAE,KAAK;GACtB,KAAK,EAAE,YAAY,CAAA,CAAE;EACvB,CAAC;EACH,KAAK,KAAK,MAAK,CAAE;EACjB,OAAO;CACT,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,UAAU,eAAc;EACzC,MAAM,OAAO,KAAK,MAAK;EACvB,IAAI,KAAK,SAAS,KAAK,kBAAiB,GAAI,OAAO,KAAK,KAAK,cAAc,KAAK,MAAM;EACtF,OAAO,KAAK,KAAK,QAAQ,KAAK,OAAM,CAAE,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI;CACnE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAOiB,cAAc,eAAc;EAC7C,MAAM,QAAQ,KAAK,UAAS;EAC5B,IAAI,CAAC,OAAO,OAAO;EACnB,OAAO,GAAG,MAAK,IAAK,KAAK,QAAO,MAAO,KAAK,YAAW,KAAM,KAAK,KAAK;CACzE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,MAAM,QAAQ,OAAK;EAC3B,IAAI,CAAC,KAAK,KAAI,GAAI;EAClB,KAAK,KAAK,IAAI,KAAK;EACnB,IAAI,OAAO,KAAK,QAAO,CAAE,CAAC,cAAc,MAAK;CAC/C;CAEU,UAAU,OAAiB;EACnC,IAAI,KAAK,QAAO,CAAE,CAAC,cAAc,SAAS,MAAM,MAAc,GAAG;EACjE,KAAK,MAAK;EACV,KAAK,MAAM,KAAI;CACjB;CAEA,QAAK;EACH,KAAK,QAAO,CAAE,CAAC,cAAc,MAAK;CACpC;CAvEW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAd,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAc,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,mBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,UAAA;GAAA,OAAA;EAAA;EAAA,MAAA;GAAA,YAAA;IAAA,2BAAA;IAAA,+BAAA;IAAA,8BAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,WAAA;GAAA,aAAA;GAAA,UAAA;EAAA,GAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,SAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UAjEf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+DT,UAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MAvES;IAAmB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,UAAA,CAAA,qBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAgB,UAAA;IAAA,UAAA,CAAA,kBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAjWpC;IAAQ,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AA0aR,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAc,YAAA,CAAA;EA3E1B,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS;IAAC;IAAqB;IAAkB;GAAQ;GACzD,iBAAiB,wBAAwB;GACzC,MAAM;IACJ,OAAO;IACP,6BAA6B;IAC7B,iCAAiC;IACjC,gCAAgC;GACjC;GACD,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgEX,CAAA;CA2BoD,CAAA;CAAA,gBAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,eAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,gBAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,eAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,iBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,mBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,OAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAW,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CACe,WAAS,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA"}