@getmicdrop/venue-calendar 4.1.1 → 4.1.3

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 (74) hide show
  1. package/dist/{CartView-CtjD8V0q.js → CartView-Ch5u_XNt.js} +9 -9
  2. package/dist/CartView-Ch5u_XNt.js.map +1 -0
  3. package/dist/{Checkout-BJHl8xYU.js → Checkout-BuMXyZ-P.js} +7 -7
  4. package/dist/Checkout-BuMXyZ-P.js.map +1 -0
  5. package/dist/{Checkout-DoVPtrYg.js → Checkout-W9ZKvslZ.js} +9 -9
  6. package/dist/Checkout-W9ZKvslZ.js.map +1 -0
  7. package/dist/{CheckoutTimer-D4MC5IYH.js → CheckoutTimer-CcvQHf7M.js} +5 -5
  8. package/dist/CheckoutTimer-CcvQHf7M.js.map +1 -0
  9. package/dist/{ClockIcon-D45f1Q-z.js → ClockIcon-xJ9vnueH.js} +2 -2
  10. package/dist/ClockIcon-xJ9vnueH.js.map +1 -0
  11. package/dist/{CollectionView-BSEvR-gc.js → CollectionView-CUC_hZXs.js} +5 -5
  12. package/dist/CollectionView-CUC_hZXs.js.map +1 -0
  13. package/dist/{Event-irP-50kI.js → Event-DUboyXzh.js} +678 -670
  14. package/dist/Event-DUboyXzh.js.map +1 -0
  15. package/dist/{EventPage-CpVnrui_.js → EventPage-CJUZxcD0.js} +8 -8
  16. package/dist/EventPage-CJUZxcD0.js.map +1 -0
  17. package/dist/{Heading-C1khaqEJ.js → Heading-DuFE5Nn7.js} +2 -2
  18. package/dist/Heading-DuFE5Nn7.js.map +1 -0
  19. package/dist/{ScarcityBadge-BA6ggEw1.js → ScarcityBadge-BDboK4kL.js} +2 -2
  20. package/dist/ScarcityBadge-BDboK4kL.js.map +1 -0
  21. package/dist/{SeriesPage-Czjmgcsx.js → SeriesPage-Cmt_PDc1.js} +5 -5
  22. package/dist/{SeriesPage-Czjmgcsx.js.map → SeriesPage-Cmt_PDc1.js.map} +1 -1
  23. package/dist/{Spinner-TrJuavsX.js → Spinner-6CR0t76S.js} +2 -2
  24. package/dist/Spinner-6CR0t76S.js.map +1 -0
  25. package/dist/{Success-BMbYDrI_.js → Success-Ddtrw8q1.js} +9 -9
  26. package/dist/Success-Ddtrw8q1.js.map +1 -0
  27. package/dist/{Text-D1OVPbh4.js → Text-DvFm7F_Y.js} +2 -2
  28. package/dist/Text-DvFm7F_Y.js.map +1 -0
  29. package/dist/{VenueCalendar-C3dyo3ed.js → VenueCalendar-BkXnqWM4.js} +13 -13
  30. package/dist/VenueCalendar-BkXnqWM4.js.map +1 -0
  31. package/dist/{ViewTicketsEmbed-B_ZmztVm.js → ViewTicketsEmbed-BfNfsMlP.js} +5 -5
  32. package/dist/ViewTicketsEmbed-BfNfsMlP.js.map +1 -0
  33. package/dist/api/api.cjs.map +1 -1
  34. package/dist/api/api.mjs.map +1 -1
  35. package/dist/{index-Isz8FTUK.js → index-DFkHNEXz.js} +3 -3
  36. package/dist/index-DFkHNEXz.js.map +1 -0
  37. package/dist/{modalManager.svelte-Miof_kcE.js → modalManager.svelte-D4K5P-CZ.js} +2 -2
  38. package/dist/modalManager.svelte-D4K5P-CZ.js.map +1 -0
  39. package/dist/{promo-BrfXl08U.js → promo-9UNhPM6h.js} +2 -2
  40. package/dist/{promo-BrfXl08U.js.map → promo-9UNhPM6h.js.map} +1 -1
  41. package/dist/{serverTotals-CyUAvr3I.js → serverTotals-DfJRMhGC.js} +2 -2
  42. package/dist/{serverTotals-CyUAvr3I.js.map → serverTotals-DfJRMhGC.js.map} +1 -1
  43. package/dist/{shareCopyFeedback.svelte-D4Cluqm9.js → shareCopyFeedback.svelte-DtAB39dx.js} +2 -2
  44. package/dist/shareCopyFeedback.svelte-DtAB39dx.js.map +1 -0
  45. package/dist/{showcase-state-options-Cq6DaXjA.js → showcase-state-options-CraNao6p.js} +2 -2
  46. package/dist/{showcase-state-options-Cq6DaXjA.js.map → showcase-state-options-CraNao6p.js.map} +1 -1
  47. package/dist/{transform-BPfZV2q1.js → transform-DM09-ZYI.js} +2 -2
  48. package/dist/{transform-BPfZV2q1.js.map → transform-DM09-ZYI.js.map} +1 -1
  49. package/dist/{utm-BF-dq-u8.js → utm-DkV6j_9s.js} +2 -2
  50. package/dist/{utm-BF-dq-u8.js.map → utm-DkV6j_9s.js.map} +1 -1
  51. package/dist/venue-calendar.es.js +1 -1
  52. package/dist/venue-calendar.iife.js +31 -31
  53. package/dist/venue-calendar.iife.js.map +1 -1
  54. package/dist/venue-calendar.umd.js +26 -26
  55. package/dist/venue-calendar.umd.js.map +1 -1
  56. package/package.json +2 -2
  57. package/dist/CartView-CtjD8V0q.js.map +0 -1
  58. package/dist/Checkout-BJHl8xYU.js.map +0 -1
  59. package/dist/Checkout-DoVPtrYg.js.map +0 -1
  60. package/dist/CheckoutTimer-D4MC5IYH.js.map +0 -1
  61. package/dist/ClockIcon-D45f1Q-z.js.map +0 -1
  62. package/dist/CollectionView-BSEvR-gc.js.map +0 -1
  63. package/dist/Event-irP-50kI.js.map +0 -1
  64. package/dist/EventPage-CpVnrui_.js.map +0 -1
  65. package/dist/Heading-C1khaqEJ.js.map +0 -1
  66. package/dist/ScarcityBadge-BA6ggEw1.js.map +0 -1
  67. package/dist/Spinner-TrJuavsX.js.map +0 -1
  68. package/dist/Success-BMbYDrI_.js.map +0 -1
  69. package/dist/Text-D1OVPbh4.js.map +0 -1
  70. package/dist/VenueCalendar-C3dyo3ed.js.map +0 -1
  71. package/dist/ViewTicketsEmbed-B_ZmztVm.js.map +0 -1
  72. package/dist/index-Isz8FTUK.js.map +0 -1
  73. package/dist/modalManager.svelte-Miof_kcE.js.map +0 -1
  74. package/dist/shareCopyFeedback.svelte-D4Cluqm9.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Event-DUboyXzh.js","sources":["../node_modules/@getmicdrop/svelte-components/dist/primitives/Accordion/context.js","../node_modules/@getmicdrop/svelte-components/dist/primitives/Accordion/AccordionRoot.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Accordion/Accordion.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Accordion/AccordionItem.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/ChevronUpOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/phosphor/BuildingIcon.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/phosphor/UserIcon.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Accordion/AccordionTrigger.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Accordion/AccordionContent.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Accordion/AccordionItemLegacy.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Accordion/index.js","../node_modules/@getmicdrop/svelte-components/dist/assets/svg/user-image.svg","../node_modules/@getmicdrop/svelte-components/dist/primitives/Avatar/Avatar.svelte","../node_modules/cssfilter/lib/default.js","../node_modules/cssfilter/lib/util.js","../node_modules/cssfilter/lib/parser.js","../node_modules/cssfilter/lib/css.js","../node_modules/cssfilter/lib/index.js","../node_modules/xss/lib/util.js","../node_modules/xss/lib/default.js","../node_modules/xss/lib/parser.js","../node_modules/xss/lib/xss.js","../node_modules/xss/lib/index.js","../node_modules/@getmicdrop/svelte-components/dist/richtext/allowlist.js","../node_modules/@getmicdrop/svelte-components/dist/richtext/sanitize.js","../node_modules/@getmicdrop/svelte-components/dist/primitives/RichTextContent/RichTextContent.svelte","../node_modules/@getmicdrop/svelte-components/dist/components/Layout/Section.svelte","../src/lib/public-calendar-flow/order-totals.ts","../src/lib/public-calendar-flow/livePricing.svelte.ts","../src/lib/public-calendar-flow/HeroImage.svelte","../src/lib/public-calendar-flow/EventHeader.svelte","../src/lib/public-calendar-flow/TicketCard.svelte","../src/lib/public-calendar-flow/BookingWidget.svelte","../src/lib/public-calendar-flow/AboutSection.svelte","../src/lib/public-calendar-flow/PerformerGrid.svelte","../src/lib/public-calendar-flow/FaqAccordion.svelte","../src/lib/public-calendar-flow/MobileCta.svelte","../src/lib/public-calendar-flow/PromoCodeInput.svelte","../src/lib/public-calendar-flow/ShowtimeDesigns.svelte","../src/lib/public-calendar-flow/collection-teasers.ts","../src/lib/public-calendar-flow/Event.svelte"],"sourcesContent":["/**\n * Accordion compound component context.\n *\n * Convention: every compound component ships a context.ts using Svelte 5's\n * createContext(). The returned [get, set] tuple is type-safe and auto-throws\n * when a sub-component renders outside its Root.\n *\n * Migrated off the legacy `setContext('accordion')` + writable store (brief 00\n * §A1). Prop-derived values (multiple, flush, variant) are exposed as GETTERS so\n * they're correct during SSR and reactive after mount with no $effect — effects\n * don't run on the server. The set of open item ids is owned mutable reactive\n * state (a SvelteSet) registered/toggled by the items themselves, the only thing\n * the Root can't know from its own props.\n */\nimport { createContext } from 'svelte';\nexport const [getAccordionContext, setAccordionContext] = createContext();\nexport const [getAccordionItemContext, setAccordionItemContext] = createContext();\n","<script lang=\"ts\">\n /**\n * AccordionRoot — the compound root for the Accordion (brief 00 §A1/§A3).\n *\n * Owns the open-item set and the single-vs-multiple behavior, exposed to child\n * Trigger/Content/Item parts via createContext (no legacy store). Renders the\n * same container DOM the legacy <Accordion> always has, so existing usage stays\n * byte-identical.\n *\n * Props:\n * multiple: boolean - Allow multiple items open at once\n * flush: boolean - Remove outer border/radius (Flowbite flush variant)\n * variant: 'default' | 'ghost' - 'ghost' uses transparent header bg +\n * conventional down-when-closed / up-when-open chevron, for FAQ-style\n * accordions that sit on another surface and shouldn't paint their own bg.\n */\n import type { Snippet } from 'svelte';\n import { SvelteSet } from 'svelte/reactivity';\n import { cn } from '../../utils/classNames.js';\n import {\n setAccordionContext,\n type AccordionContext,\n type AccordionVariant,\n } from './context.js';\n\n interface Props {\n multiple?: boolean;\n flush?: boolean;\n variant?: AccordionVariant;\n class?: string;\n children?: Snippet;\n }\n\n let {\n multiple = false,\n flush = false,\n variant = 'default',\n class: className = '',\n children,\n }: Props = $props();\n\n // Owned mutable state: which item ids are currently open. Reactive set so\n // Trigger/Content read live open state (brief 00 §A1 — collections use a\n // reactive set with register AND unregister, never a mount-only flag).\n const openItems = new SvelteSet<string>();\n\n function applyOpen(id: string) {\n if (!multiple) openItems.clear();\n openItems.add(id);\n }\n\n // Prop-derived context values are GETTERS (SSR-correct, reactive, no $effect);\n // the open-set methods close over live `multiple` via the same getters.\n const ctx: AccordionContext = {\n get multiple() { return multiple; },\n get flush() { return flush; },\n get variant() { return variant; },\n openItems,\n isOpen(id: string) { return openItems.has(id); },\n toggle(id: string) {\n if (openItems.has(id)) {\n openItems.delete(id);\n } else {\n applyOpen(id);\n }\n },\n open(id: string) {\n if (!openItems.has(id)) applyOpen(id);\n },\n unregister(id: string) {\n openItems.delete(id);\n },\n };\n setAccordionContext(ctx);\n\n // Flowbite-native container classes.\n // overflow-hidden is intentionally omitted so dropdowns/menus inside items can\n // render outside the container.\n let containerClasses = $derived(\n flush\n ? 'divide-y divide-border'\n : 'border border-border rounded-lg divide-y divide-border',\n );\n</script>\n\n<div class={cn(containerClasses, className)} data-accordion={multiple ? 'open' : 'collapse'}>\n {#if children}{@render children()}{/if}\n</div>\n","<script lang=\"ts\">\n /**\n * Accordion — back-compat entry that forwards to AccordionRoot.\n *\n * Kept so `<Accordion>…</Accordion>` and `Accordion.Root` both render the same\n * compound root (Button precedent — the legacy name stays, the namespace object\n * hangs Root/Item/Trigger/Content off it via index.ts). All behavior now lives\n * in AccordionRoot (createContext, brief 00 §A1/§A3); this is a thin pass-through\n * so existing usage is byte-identical.\n *\n * Props:\n * multiple: boolean - Allow multiple items open at once\n * flush: boolean - Remove outer border/radius (Flowbite flush variant)\n * variant: 'default' | 'ghost' - 'ghost' uses transparent header bg + conventional\n * down-when-closed / up-when-open chevron. For FAQ-style accordions\n * that sit on top of another surface and shouldn't paint their own bg.\n */\n import type { Snippet } from 'svelte';\n import AccordionRoot from './AccordionRoot.svelte';\n import type { AccordionVariant } from './context.js';\n\n interface Props {\n multiple?: boolean;\n flush?: boolean;\n variant?: AccordionVariant;\n class?: string;\n children?: Snippet;\n }\n\n let {\n multiple = false,\n flush = false,\n variant = 'default',\n class: className = '',\n children,\n }: Props = $props();\n</script>\n\n<AccordionRoot {multiple} {flush} {variant} class={className}>\n {#if children}{@render children()}{/if}\n</AccordionRoot>\n","<script lang=\"ts\">\n /**\n * AccordionItem — the canonical per-item grouping part (`Accordion.Item`,\n * brief 00 §A3).\n *\n * Provides one shared item context (stable ids + open state) to a sibling\n * `Accordion.Trigger` and `Accordion.Content`, then renders its `children`\n * verbatim. Ids come from `$props.id()` (SSR-stable — never Math.random) so the\n * trigger↔content ARIA wiring is correct on first paint (§A1/§A6).\n *\n * Canonical usage:\n * <Accordion.Item open={…}>\n * <Accordion.Trigger>Title</Accordion.Trigger>\n * <Accordion.Content>Body</Accordion.Content>\n * </Accordion.Item>\n *\n * The legacy flat `<AccordionItem header={…}>panel</AccordionItem>` shape is a\n * SEPARATE @deprecated shim (AccordionItemLegacy.svelte) that wraps this part;\n * the flat `AccordionItem` export resolves to that shim, so existing call sites\n * stay byte-identical. New code should use `Accordion.Item`.\n *\n * Props:\n * open: boolean - Start expanded\n * borderOpenClass: string - Additional classes when open\n */\n import type { Snippet } from 'svelte';\n import { onMount } from 'svelte';\n import { cn } from '../../utils/classNames.js';\n import {\n getAccordionContext,\n setAccordionItemContext,\n type AccordionItemContext,\n } from './context.js';\n\n interface Props {\n open?: boolean;\n class?: string;\n borderOpenClass?: string;\n children?: Snippet;\n }\n\n let {\n open = false,\n class: className = '',\n borderOpenClass = '',\n children,\n }: Props = $props();\n\n const accordion = getAccordionContext();\n\n // SSR-stable id (brief 00 §A1) — never Math.random()/crypto.randomUUID(),\n // which produce different values on server and client.\n const uid = $props.id();\n const triggerId = `${uid}-trigger`;\n const contentId = `${uid}-content`;\n\n // Register an initially-open item once on mount (honors single/multiple mode);\n // unregister on teardown so the open-set never dangles (brief 00 §A1 cleanup).\n onMount(() => {\n if (open) accordion.open(uid);\n return () => accordion.unregister(uid);\n });\n\n let isOpen = $derived(accordion.isOpen(uid));\n\n const item: AccordionItemContext = {\n get id() { return uid; },\n get triggerId() { return triggerId; },\n get contentId() { return contentId; },\n get open() { return isOpen; },\n get variant() { return accordion.variant; },\n get flush() { return accordion.flush; },\n toggle() { accordion.toggle(uid); },\n };\n setAccordionItemContext(item);\n</script>\n\n<div class={cn(className, isOpen && borderOpenClass ? borderOpenClass : '')}>\n {@render children?.()}\n</div>\n","<script lang=\"ts\">\n interface Props {\n size?: string;\n color?: string;\n class?: string;\n }\n let { size = \"24\", color = \"currentColor\", class: className = \"\" }: Props = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 15.75l7.5-7.5 7.5 7.5\" />\n</svg>\n","<script lang=\"ts\">\n /**\n * Building — Phosphor icon (canonical Micdrop icon family).\n * Outline by default; pass `weight=\"fill\"` for solid, or let a stateful parent\n * (NavItem / Tabs / BottomNav / status badge) drive it via icon-weight context.\n */\n import { useIconWeight, type IconWeight } from './iconWeight.js';\n\n interface Props {\n /** Pixel size (width + height). */\n size?: string;\n /** Icon color; defaults to `currentColor` (inherits text color). */\n color?: string;\n /** Extra classes. */\n class?: string;\n /** `regular` (outline) or `fill` (solid). Overrides ambient state weight. */\n weight?: IconWeight;\n }\n\n let { size = '24', color = 'currentColor', class: className = '', weight }: Props = $props();\n\n const ctx = useIconWeight();\n let resolved: IconWeight = $derived(weight ?? ctx?.weight ?? 'regular');\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n style:color={color === 'currentColor' ? undefined : color}\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n {#if resolved === 'fill'}<path d=\"M239.73,208H224V96a16,16,0,0,0-16-16H164a4,4,0,0,0-4,4V208H144V32.41a16.43,16.43,0,0,0-6.16-13,16,16,0,0,0-18.72-.69L39.12,72A16,16,0,0,0,32,85.34V208H16.27A8.18,8.18,0,0,0,8,215.47,8,8,0,0,0,16,224H240a8,8,0,0,0,8-8.53A8.18,8.18,0,0,0,239.73,208ZM76,184a8,8,0,0,1-8.53,8A8.18,8.18,0,0,1,60,183.72V168.27A8.19,8.19,0,0,1,67.47,160,8,8,0,0,1,76,168Zm0-56a8,8,0,0,1-8.53,8A8.19,8.19,0,0,1,60,127.72V112.27A8.19,8.19,0,0,1,67.47,104,8,8,0,0,1,76,112Zm40,56a8,8,0,0,1-8.53,8,8.18,8.18,0,0,1-7.47-8.26V168.27a8.19,8.19,0,0,1,7.47-8.26,8,8,0,0,1,8.53,8Zm0-56a8,8,0,0,1-8.53,8,8.19,8.19,0,0,1-7.47-8.26V112.27a8.19,8.19,0,0,1,7.47-8.26,8,8,0,0,1,8.53,8Z\"/>{:else}<path d=\"M136,216V32a8,8,0,0,0-12.44-6.65l-80,53.33A8,8,0,0,0,40,85.35V216\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><path d=\"M136,88h72a8,8,0,0,1,8,8V216\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"16\" y1=\"216\" x2=\"240\" y2=\"216\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"104\" y1=\"112\" x2=\"104\" y2=\"128\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"72\" y1=\"112\" x2=\"72\" y2=\"128\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"72\" y1=\"168\" x2=\"72\" y2=\"184\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"104\" y1=\"168\" x2=\"104\" y2=\"184\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>{/if}\n</svg>\n","<script lang=\"ts\">\n /**\n * User — Phosphor icon (canonical Micdrop icon family).\n * Outline by default; pass `weight=\"fill\"` for solid, or let a stateful parent\n * (NavItem / Tabs / BottomNav / status badge) drive it via icon-weight context.\n */\n import { useIconWeight, type IconWeight } from './iconWeight.js';\n\n interface Props {\n /** Pixel size (width + height). */\n size?: string;\n /** Icon color; defaults to `currentColor` (inherits text color). */\n color?: string;\n /** Extra classes. */\n class?: string;\n /** `regular` (outline) or `fill` (solid). Overrides ambient state weight. */\n weight?: IconWeight;\n }\n\n let { size = '24', color = 'currentColor', class: className = '', weight }: Props = $props();\n\n const ctx = useIconWeight();\n let resolved: IconWeight = $derived(weight ?? ctx?.weight ?? 'regular');\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n style:color={color === 'currentColor' ? undefined : color}\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n {#if resolved === 'fill'}<path d=\"M230.93,220a8,8,0,0,1-6.93,4H32a8,8,0,0,1-6.92-12c15.23-26.33,38.7-45.21,66.09-54.16a72,72,0,1,1,73.66,0c27.39,8.95,50.86,27.83,66.09,54.16A8,8,0,0,1,230.93,220Z\"/>{:else}<circle cx=\"128\" cy=\"96\" r=\"64\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><path d=\"M32,216c19.37-33.47,54.55-56,96-56s76.63,22.53,96,56\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>{/if}\n</svg>\n","<!-- native-element-exception: the disclosure trigger is a bare <button> carrying accordion-specific ARIA (aria-expanded/aria-controls) + the legacy header markup; wrapping it in SC Button would change the byte-identical DOM the Accordion char tests pin and add unwanted Button chrome. This is the same raw <button> the pre-split AccordionItem always rendered. -->\n<script lang=\"ts\">\n import { mergeLabels, type SCLabels } from '../../utils/labels.js';\n /**\n * AccordionTrigger — the clickable header button of an accordion item\n * (brief 00 §A3 part split, §A6 keyboard + ARIA).\n *\n * Surfaced as a distinct part from the legacy `header` snippet. Renders the\n * exact same `<h2><button>…chevron</button></h2>` markup the legacy\n * AccordionItem header always produced, so existing usage stays byte-identical.\n *\n * ARIA (component-owned): the button carries `aria-expanded` and\n * `aria-controls` → the content region id; its own id is `aria-labelledby`'d by\n * the content. Enter/Space toggle natively (it's a real <button>).\n */\n import type { Snippet } from 'svelte';\n import { getAccordionItemContext } from './context.js';\n import { ChevronDownOutline, ChevronUpOutline } from '../Icons';\n import { textWeight, typography } from '../../tokens/typography';\n import { cn } from '../../utils/classNames.js';\n\n const defaultLabels = {\n accordionItem: 'Accordion Item',\n };\n\n interface Props {\n class?: string;\n children?: Snippet;\n labels?: SCLabels<typeof defaultLabels>;\n }\n\n let {\n class: className = '',\n children,\n labels: userLabels = {},\n }: Props = $props();\n\n let labels = $derived(mergeLabels(defaultLabels, userLabels));\n\n const item = getAccordionItemContext();\n\n let isGhost = $derived(item.variant === 'ghost');\n\n // Flowbite-native header classes.\n // 'ghost' variant: transparent bg + softer hover, for FAQ-style accordions\n // that sit on another surface and shouldn't paint their own gray header.\n let headerClasses = $derived(\n cn(\n `flex items-center justify-between w-full p-5 ${textWeight.emphasis} text-left`,\n typography.smMuted,\n isGhost ? 'bg-transparent' : 'bg-muted',\n isGhost ? 'hover:bg-bg-secondary' : 'hover:bg-bg-tertiary',\n 'focus:outline-hidden',\n 'gap-3',\n item.open && !isGhost ? 'bg-muted' : '',\n className,\n ),\n );\n</script>\n\n<h2>\n <button\n type=\"button\"\n id={item.triggerId}\n class={headerClasses}\n aria-expanded={item.open}\n aria-controls={item.contentId}\n onclick={() => item.toggle()}\n >\n <span class={typography.body}>\n {#if children}{@render children()}{:else}{labels.accordionItem}{/if}\n </span>\n <!-- Chevron: 'ghost' uses ChevronDown (closed=down, open=up — conventional FAQ behavior).\n 'default' keeps the legacy ChevronUp (closed=up, open=down) for back-compat with\n existing consumers (admin tables, mobile cards). -->\n {#if isGhost}\n <ChevronDownOutline class=\"w-3 h-3 shrink-0 transition-transform duration-fast {item.open ? 'rotate-180' : ''}\" />\n {:else}\n <ChevronUpOutline class=\"w-3 h-3 shrink-0 transition-transform duration-fast {item.open ? 'rotate-180' : ''}\" />\n {/if}\n </button>\n</h2>\n","<script lang=\"ts\">\n /**\n * AccordionContent — the collapsible panel of an accordion item\n * (brief 00 §A3 part split, §A6 ARIA).\n *\n * Surfaced as a distinct part from the legacy children panel. Renders the exact\n * same slide-transitioned panel markup the legacy AccordionItem always\n * produced, so existing usage stays byte-identical — plus the §A6 region\n * wiring: `role=\"region\"`, a stable id (so the trigger's `aria-controls`\n * resolves) and `aria-labelledby` → the trigger button id.\n */\n import type { Snippet } from 'svelte';\n import { DURATION, safeSlide } from '../../utils/transitions.js';\n import { getAccordionItemContext } from './context.js';\n import { typography } from '../../tokens/typography';\n\n interface Props {\n children?: Snippet;\n }\n\n let { children }: Props = $props();\n\n const item = getAccordionItemContext();\n</script>\n\n{#if item.open}\n <div\n id={item.contentId}\n role=\"region\"\n aria-labelledby={item.triggerId}\n transition:safeSlide={{ duration: DURATION.fast }}\n >\n <div class=\"p-5 {item.flush ? '' : 'border border-t-0 border-border'}\">\n <p class={typography.bodyMuted}>\n {#if children}{@render children()}{/if}\n </p>\n </div>\n </div>\n{/if}\n","<script lang=\"ts\">\n import { mergeLabels, type SCLabels } from '../../utils/labels.js';\n /**\n * AccordionItemLegacy — the @deprecated flat `<AccordionItem>` shim.\n *\n * Preserves the pre-split shape byte-identically: an item that ALWAYS renders a\n * clickable trigger (the `header` snippet if given, else the default\n * \"Accordion Item\" label) plus a collapsible panel built from `children`. It\n * wraps the canonical parts (Accordion.Item > Accordion.Trigger +\n * Accordion.Content) so existing call sites — including the header-LESS shape,\n * which on origin/main still rendered a default clickable trigger — keep their\n * exact DOM and behavior while they migrate to the explicit parts.\n *\n * The flat `AccordionItem` export resolves to THIS component; `Accordion.Item`\n * (the namespace part) is the lean grouping component (AccordionItem.svelte).\n *\n * Props:\n * open: boolean - Start expanded\n * border: boolean - Show bottom border (Flowbite API; documented, not wired)\n * borderOpenClass: string - Additional classes when open\n * header: @deprecated Snippet - clickable-header content (use Accordion.Trigger)\n */\n import type { Snippet } from 'svelte';\n import { deprecation } from '../../utils/deprecation.js';\n import AccordionItem from './AccordionItem.svelte';\n import AccordionTrigger from './AccordionTrigger.svelte';\n import AccordionContent from './AccordionContent.svelte';\n\n const defaultLabels = {\n accordionItem: 'Accordion Item',\n };\n\n interface Props {\n open?: boolean;\n class?: string;\n border?: boolean;\n borderOpenClass?: string;\n /** @deprecated Use a child `<Accordion.Trigger>` instead of the header snippet. */\n header?: Snippet;\n children?: Snippet;\n labels?: SCLabels<typeof defaultLabels>;\n }\n\n let {\n open = false,\n class: className = '',\n // eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\n border = true,\n borderOpenClass = '',\n header,\n children,\n labels: userLabels = {},\n }: Props = $props();\n\n let labels = $derived(mergeLabels(defaultLabels, userLabels));\n\n deprecation(\n `The flat <AccordionItem> is deprecated. Replace:\\n` +\n ` <AccordionItem open={…}>{#snippet header()}Title{/snippet}Body</AccordionItem>\\n` +\n `with the explicit parts:\\n` +\n ` <Accordion.Item open={…}><Accordion.Trigger>Title</Accordion.Trigger><Accordion.Content>Body</Accordion.Content></Accordion.Item>`,\n );\n</script>\n\n<AccordionItem {open} class={className} {borderOpenClass}>\n {#if header}\n <AccordionTrigger {labels}>{@render header()}</AccordionTrigger>\n {:else}\n <!-- No header snippet: omit Trigger children so AccordionTrigger falls back to\n its default \"Accordion Item\" label — the legacy header-LESS clickable\n trigger, byte-identical to origin/main. -->\n <AccordionTrigger {labels} />\n {/if}\n <AccordionContent>{@render children?.()}</AccordionContent>\n</AccordionItem>\n","/**\n * Accordion compound exports — namespace object + flat names (brief 00 §A3,\n * Button precedent).\n *\n * `Accordion.Root/Item/Trigger/Content` are the canonical parts. The flat\n * `AccordionRoot/AccordionTrigger/AccordionContent` aliases resolve to the same\n * canonical components.\n *\n * Back-compat exception: the flat `AccordionItem` resolves to the @deprecated\n * legacy shim (AccordionItemLegacy), NOT the lean `Accordion.Item` grouping\n * part. The legacy shim always renders a clickable trigger (the `header` snippet\n * or the default label) + a panel from `children` — byte-identical to\n * origin/main, including the header-LESS shape — so existing consumers are\n * untouched. New code should use `Accordion.Item` + explicit Trigger/Content.\n */\nimport AccordionLegacy from './Accordion.svelte';\nimport Root from './AccordionRoot.svelte';\nimport Item from './AccordionItem.svelte';\nimport ItemLegacy from './AccordionItemLegacy.svelte';\nimport Trigger from './AccordionTrigger.svelte';\nimport Content from './AccordionContent.svelte';\nconst Accordion = Object.assign(AccordionLegacy, { Root, Item, Trigger, Content });\nexport default Accordion;\n// Flat names. AccordionItem stays the legacy back-compat shim; the other parts\n// alias the canonical components.\nexport { Root as AccordionRoot, ItemLegacy as AccordionItem, Item as AccordionItemRoot, Trigger as AccordionTrigger, Content as AccordionContent, };\n","export default \"data:image/svg+xml,%3csvg%20width='38'%20height='38'%20viewBox='0%200%2038%2038'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3cpath%20d='M0%206C0%202.68629%202.68629%200%206%200H32C35.3137%200%2038%202.68629%2038%206V32C38%2035.3137%2035.3137%2038%2032%2038H6C2.68629%2038%200%2035.3137%200%2032V6Z'%20fill='url(%23pattern0_243_46200)'/%3e%3cdefs%3e%3cpattern%20id='pattern0_243_46200'%20patternContentUnits='objectBoundingBox'%20width='1'%20height='1'%3e%3cuse%20xlink:href='%23image0_243_46200'%20transform='scale(0.00166667)'/%3e%3c/pattern%3e%3cimage%20id='image0_243_46200'%20width='600'%20height='600'%20xlink:href='data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QNyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA2LjAtYzAwMyA3OS4xNjQ1MjcsIDIwMjAvMTAvMTUtMTc6NDg6MzIgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6NzUwMTA4MDQxMjEwMTFFQTkzRjVFNTZDMjRGNEVGNjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDNFMzkyREQ2MkY2MTFFQkJBQUI4RThDNTFDQzgyODgiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDNFMzkyREM2MkY2MTFFQkJBQUI4RThDNTFDQzgyODgiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMzg3MTJBMDU0RTUxMUVCQTk1QUE0M0M3QTExMTlBQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEMzg3MTJBMTU0RTUxMUVCQTk1QUE0M0M3QTExMTlBQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8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'/%3e%3c/defs%3e%3c/svg%3e\"","<script lang=\"ts\">\r\n import { textWeight } from '../../tokens/typography';\r\n import type { AvatarSize } from './avatar-types.js';\r\n /**\r\n * Avatar Component - Flowbite-style native implementation\r\n *\r\n * Displays a user / performer headshot with optional fallback initials.\r\n *\r\n * Image rendering composes the canonical `<Image>` primitive (R-IMAGE-02)\r\n * with `fit=\"cover\"` — headshots are framed square and fill the box. When\r\n * the supplied `src` is broken, Image degrades through the shared\r\n * `defaultAvatar` asset (one copy in SC) before any placeholder. Sizing /\r\n * shape is owned here and forwarded down as classes.\r\n */\r\n\r\n import Image from '../Image/Image.svelte';\r\n import defaultAvatar from '../../assets/svg/user-image.svg';\r\n\r\n interface Props {\r\n /** Image source URL */\r\n src?: string;\r\n /** Alt text for the image */\r\n alt?: string;\r\n /**\r\n * @deprecated Ignored. A person's photo is always a rounded square\r\n * (`radiusAliases.avatar`) — passing this no longer produces a circle.\r\n * Retained so the ~5 consumers still passing it keep compiling; delete\r\n * the prop and its call sites together in a future major.\r\n */\r\n rounded?: boolean;\r\n /** Size variant */\r\n size?: AvatarSize;\r\n /** Fallback initials when no image */\r\n initials?: string;\r\n /** Additional CSS classes */\r\n class?: string;\r\n }\r\n\r\n // `rounded` is deliberately NOT destructured: it is accepted by the type for\r\n // source compatibility and then dropped, so no caller can reintroduce a\r\n // circle. See the @deprecated note on the prop.\r\n let {\r\n src = '',\r\n alt = '',\r\n size = 'md',\r\n initials = '',\r\n class: className = ''\r\n }: Props = $props();\r\n\r\n // Size classes — keyed by the canonical AvatarSize so a future size addition\r\n // fails the build until its visual mapping is filled in here.\r\n const sizeClasses: Record<AvatarSize, string> = {\r\n xs: 'w-6 h-6 type-caption',\r\n sm: 'w-8 h-8 type-caption',\r\n md: 'w-10 h-10 type-body',\r\n lg: 'w-14 h-14 type-bodyLarge',\r\n xl: 'w-20 h-20 type-bodyLarger'\r\n };\r\n\r\n let sizeClass = $derived(sizeClasses[size] || sizeClasses.md);\r\n\r\n // THE shape of a person's photo — a rounded square, never a circle.\r\n //\r\n // The corner SCALES with the box, because one fixed radius cannot serve both\r\n // ends of the scale: `radiusAliases.avatar` (12px) on the 24px xs box is\r\n // exactly half its width — a literal circle, which is the thing this rule\r\n // exists to prevent. Every step below keeps the corner at roughly a fifth to\r\n // a quarter of the box, so a headshot reads as the same shape at every size:\r\n //\r\n // xs 24px → 6px (25%) lg 56px → 12px (21%)\r\n // sm 32px → 8px (25%) xl 80px → 12px (15%)\r\n // md 40px → 8px (20%)\r\n //\r\n // 12px is `radiusAliases.avatar` — the reference corner, reached at lg and\r\n // above. Written as emitting utilities rather than the alias because\r\n // radius-alias tokens are consumed as CSS vars and `rounded-avatar` compiles\r\n // to nothing (see scripts/build-tokens.mjs). Keyed by AvatarSize so a future\r\n // size fails the build until its corner is filled in here.\r\n const shapeClasses: Record<AvatarSize, string> = {\r\n xs: 'rounded-md',\r\n sm: 'rounded-lg',\r\n md: 'rounded-lg',\r\n lg: 'rounded-xl',\r\n xl: 'rounded-xl'\r\n };\r\n\r\n let shapeClass = $derived(shapeClasses[size] || shapeClasses.md);\r\n</script>\r\n\r\n{#if src}\r\n <!-- Headshots are square and fill the box → fit=\"cover\" (no blur backdrop).\r\n A broken URL degrades to the shared defaultAvatar headshot, then to the\r\n branded placeholder. -->\r\n <Image\r\n {src}\r\n {alt}\r\n fit=\"cover\"\r\n fallback={defaultAvatar}\r\n class=\"{sizeClass} {shapeClass} {className}\"\r\n />\r\n{:else if initials}\r\n <div\r\n class=\"flex items-center justify-center {textWeight.emphasis} tone-secondary bg-bg-tertiary {sizeClass} {shapeClass} {className}\"\r\n >\r\n {initials}\r\n </div>\r\n{:else}\r\n <!-- Default placeholder -->\r\n <div\r\n class=\"flex items-center justify-center bg-bg-tertiary {sizeClass} {shapeClass} {className}\"\r\n >\r\n <svg class=\"w-1/2 h-1/2 tone-muted\" fill=\"currentColor\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path fill-rule=\"evenodd\" d=\"M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z\" clip-rule=\"evenodd\"></path>\r\n </svg>\r\n </div>\r\n{/if}\r\n","/**\n * cssfilter\n *\n * @author 老雷<leizongmin@gmail.com>\n */\n\nfunction getDefaultWhiteList () {\n // 白名单值说明:\n // true: 允许该属性\n // Function: function (val) { } 返回true表示允许该属性,其他值均表示不允许\n // RegExp: regexp.test(val) 返回true表示允许该属性,其他值均表示不允许\n // 除上面列出的值外均表示不允许\n var whiteList = {};\n\n whiteList['align-content'] = false; // default: auto\n whiteList['align-items'] = false; // default: auto\n whiteList['align-self'] = false; // default: auto\n whiteList['alignment-adjust'] = false; // default: auto\n whiteList['alignment-baseline'] = false; // default: baseline\n whiteList['all'] = false; // default: depending on individual properties\n whiteList['anchor-point'] = false; // default: none\n whiteList['animation'] = false; // default: depending on individual properties\n whiteList['animation-delay'] = false; // default: 0\n whiteList['animation-direction'] = false; // default: normal\n whiteList['animation-duration'] = false; // default: 0\n whiteList['animation-fill-mode'] = false; // default: none\n whiteList['animation-iteration-count'] = false; // default: 1\n whiteList['animation-name'] = false; // default: none\n whiteList['animation-play-state'] = false; // default: running\n whiteList['animation-timing-function'] = false; // default: ease\n whiteList['azimuth'] = false; // default: center\n whiteList['backface-visibility'] = false; // default: visible\n whiteList['background'] = true; // default: depending on individual properties\n whiteList['background-attachment'] = true; // default: scroll\n whiteList['background-clip'] = true; // default: border-box\n whiteList['background-color'] = true; // default: transparent\n whiteList['background-image'] = true; // default: none\n whiteList['background-origin'] = true; // default: padding-box\n whiteList['background-position'] = true; // default: 0% 0%\n whiteList['background-repeat'] = true; // default: repeat\n whiteList['background-size'] = true; // default: auto\n whiteList['baseline-shift'] = false; // default: baseline\n whiteList['binding'] = false; // default: none\n whiteList['bleed'] = false; // default: 6pt\n whiteList['bookmark-label'] = false; // default: content()\n whiteList['bookmark-level'] = false; // default: none\n whiteList['bookmark-state'] = false; // default: open\n whiteList['border'] = true; // default: depending on individual properties\n whiteList['border-bottom'] = true; // default: depending on individual properties\n whiteList['border-bottom-color'] = true; // default: current color\n whiteList['border-bottom-left-radius'] = true; // default: 0\n whiteList['border-bottom-right-radius'] = true; // default: 0\n whiteList['border-bottom-style'] = true; // default: none\n whiteList['border-bottom-width'] = true; // default: medium\n whiteList['border-collapse'] = true; // default: separate\n whiteList['border-color'] = true; // default: depending on individual properties\n whiteList['border-image'] = true; // default: none\n whiteList['border-image-outset'] = true; // default: 0\n whiteList['border-image-repeat'] = true; // default: stretch\n whiteList['border-image-slice'] = true; // default: 100%\n whiteList['border-image-source'] = true; // default: none\n whiteList['border-image-width'] = true; // default: 1\n whiteList['border-left'] = true; // default: depending on individual properties\n whiteList['border-left-color'] = true; // default: current color\n whiteList['border-left-style'] = true; // default: none\n whiteList['border-left-width'] = true; // default: medium\n whiteList['border-radius'] = true; // default: 0\n whiteList['border-right'] = true; // default: depending on individual properties\n whiteList['border-right-color'] = true; // default: current color\n whiteList['border-right-style'] = true; // default: none\n whiteList['border-right-width'] = true; // default: medium\n whiteList['border-spacing'] = true; // default: 0\n whiteList['border-style'] = true; // default: depending on individual properties\n whiteList['border-top'] = true; // default: depending on individual properties\n whiteList['border-top-color'] = true; // default: current color\n whiteList['border-top-left-radius'] = true; // default: 0\n whiteList['border-top-right-radius'] = true; // default: 0\n whiteList['border-top-style'] = true; // default: none\n whiteList['border-top-width'] = true; // default: medium\n whiteList['border-width'] = true; // default: depending on individual properties\n whiteList['bottom'] = false; // default: auto\n whiteList['box-decoration-break'] = true; // default: slice\n whiteList['box-shadow'] = true; // default: none\n whiteList['box-sizing'] = true; // default: content-box\n whiteList['box-snap'] = true; // default: none\n whiteList['box-suppress'] = true; // default: show\n whiteList['break-after'] = true; // default: auto\n whiteList['break-before'] = true; // default: auto\n whiteList['break-inside'] = true; // default: auto\n whiteList['caption-side'] = false; // default: top\n whiteList['chains'] = false; // default: none\n whiteList['clear'] = true; // default: none\n whiteList['clip'] = false; // default: auto\n whiteList['clip-path'] = false; // default: none\n whiteList['clip-rule'] = false; // default: nonzero\n whiteList['color'] = true; // default: implementation dependent\n whiteList['color-interpolation-filters'] = true; // default: auto\n whiteList['column-count'] = false; // default: auto\n whiteList['column-fill'] = false; // default: balance\n whiteList['column-gap'] = false; // default: normal\n whiteList['column-rule'] = false; // default: depending on individual properties\n whiteList['column-rule-color'] = false; // default: current color\n whiteList['column-rule-style'] = false; // default: medium\n whiteList['column-rule-width'] = false; // default: medium\n whiteList['column-span'] = false; // default: none\n whiteList['column-width'] = false; // default: auto\n whiteList['columns'] = false; // default: depending on individual properties\n whiteList['contain'] = false; // default: none\n whiteList['content'] = false; // default: normal\n whiteList['counter-increment'] = false; // default: none\n whiteList['counter-reset'] = false; // default: none\n whiteList['counter-set'] = false; // default: none\n whiteList['crop'] = false; // default: auto\n whiteList['cue'] = false; // default: depending on individual properties\n whiteList['cue-after'] = false; // default: none\n whiteList['cue-before'] = false; // default: none\n whiteList['cursor'] = false; // default: auto\n whiteList['direction'] = false; // default: ltr\n whiteList['display'] = true; // default: depending on individual properties\n whiteList['display-inside'] = true; // default: auto\n whiteList['display-list'] = true; // default: none\n whiteList['display-outside'] = true; // default: inline-level\n whiteList['dominant-baseline'] = false; // default: auto\n whiteList['elevation'] = false; // default: level\n whiteList['empty-cells'] = false; // default: show\n whiteList['filter'] = false; // default: none\n whiteList['flex'] = false; // default: depending on individual properties\n whiteList['flex-basis'] = false; // default: auto\n whiteList['flex-direction'] = false; // default: row\n whiteList['flex-flow'] = false; // default: depending on individual properties\n whiteList['flex-grow'] = false; // default: 0\n whiteList['flex-shrink'] = false; // default: 1\n whiteList['flex-wrap'] = false; // default: nowrap\n whiteList['float'] = false; // default: none\n whiteList['float-offset'] = false; // default: 0 0\n whiteList['flood-color'] = false; // default: black\n whiteList['flood-opacity'] = false; // default: 1\n whiteList['flow-from'] = false; // default: none\n whiteList['flow-into'] = false; // default: none\n whiteList['font'] = true; // default: depending on individual properties\n whiteList['font-family'] = true; // default: implementation dependent\n whiteList['font-feature-settings'] = true; // default: normal\n whiteList['font-kerning'] = true; // default: auto\n whiteList['font-language-override'] = true; // default: normal\n whiteList['font-size'] = true; // default: medium\n whiteList['font-size-adjust'] = true; // default: none\n whiteList['font-stretch'] = true; // default: normal\n whiteList['font-style'] = true; // default: normal\n whiteList['font-synthesis'] = true; // default: weight style\n whiteList['font-variant'] = true; // default: normal\n whiteList['font-variant-alternates'] = true; // default: normal\n whiteList['font-variant-caps'] = true; // default: normal\n whiteList['font-variant-east-asian'] = true; // default: normal\n whiteList['font-variant-ligatures'] = true; // default: normal\n whiteList['font-variant-numeric'] = true; // default: normal\n whiteList['font-variant-position'] = true; // default: normal\n whiteList['font-weight'] = true; // default: normal\n whiteList['grid'] = false; // default: depending on individual properties\n whiteList['grid-area'] = false; // default: depending on individual properties\n whiteList['grid-auto-columns'] = false; // default: auto\n whiteList['grid-auto-flow'] = false; // default: none\n whiteList['grid-auto-rows'] = false; // default: auto\n whiteList['grid-column'] = false; // default: depending on individual properties\n whiteList['grid-column-end'] = false; // default: auto\n whiteList['grid-column-start'] = false; // default: auto\n whiteList['grid-row'] = false; // default: depending on individual properties\n whiteList['grid-row-end'] = false; // default: auto\n whiteList['grid-row-start'] = false; // default: auto\n whiteList['grid-template'] = false; // default: depending on individual properties\n whiteList['grid-template-areas'] = false; // default: none\n whiteList['grid-template-columns'] = false; // default: none\n whiteList['grid-template-rows'] = false; // default: none\n whiteList['hanging-punctuation'] = false; // default: none\n whiteList['height'] = true; // default: auto\n whiteList['hyphens'] = false; // default: manual\n whiteList['icon'] = false; // default: auto\n whiteList['image-orientation'] = false; // default: auto\n whiteList['image-resolution'] = false; // default: normal\n whiteList['ime-mode'] = false; // default: auto\n whiteList['initial-letters'] = false; // default: normal\n whiteList['inline-box-align'] = false; // default: last\n whiteList['justify-content'] = false; // default: auto\n whiteList['justify-items'] = false; // default: auto\n whiteList['justify-self'] = false; // default: auto\n whiteList['left'] = false; // default: auto\n whiteList['letter-spacing'] = true; // default: normal\n whiteList['lighting-color'] = true; // default: white\n whiteList['line-box-contain'] = false; // default: block inline replaced\n whiteList['line-break'] = false; // default: auto\n whiteList['line-grid'] = false; // default: match-parent\n whiteList['line-height'] = false; // default: normal\n whiteList['line-snap'] = false; // default: none\n whiteList['line-stacking'] = false; // default: depending on individual properties\n whiteList['line-stacking-ruby'] = false; // default: exclude-ruby\n whiteList['line-stacking-shift'] = false; // default: consider-shifts\n whiteList['line-stacking-strategy'] = false; // default: inline-line-height\n whiteList['list-style'] = true; // default: depending on individual properties\n whiteList['list-style-image'] = true; // default: none\n whiteList['list-style-position'] = true; // default: outside\n whiteList['list-style-type'] = true; // default: disc\n whiteList['margin'] = true; // default: depending on individual properties\n whiteList['margin-bottom'] = true; // default: 0\n whiteList['margin-left'] = true; // default: 0\n whiteList['margin-right'] = true; // default: 0\n whiteList['margin-top'] = true; // default: 0\n whiteList['marker-offset'] = false; // default: auto\n whiteList['marker-side'] = false; // default: list-item\n whiteList['marks'] = false; // default: none\n whiteList['mask'] = false; // default: border-box\n whiteList['mask-box'] = false; // default: see individual properties\n whiteList['mask-box-outset'] = false; // default: 0\n whiteList['mask-box-repeat'] = false; // default: stretch\n whiteList['mask-box-slice'] = false; // default: 0 fill\n whiteList['mask-box-source'] = false; // default: none\n whiteList['mask-box-width'] = false; // default: auto\n whiteList['mask-clip'] = false; // default: border-box\n whiteList['mask-image'] = false; // default: none\n whiteList['mask-origin'] = false; // default: border-box\n whiteList['mask-position'] = false; // default: center\n whiteList['mask-repeat'] = false; // default: no-repeat\n whiteList['mask-size'] = false; // default: border-box\n whiteList['mask-source-type'] = false; // default: auto\n whiteList['mask-type'] = false; // default: luminance\n whiteList['max-height'] = true; // default: none\n whiteList['max-lines'] = false; // default: none\n whiteList['max-width'] = true; // default: none\n whiteList['min-height'] = true; // default: 0\n whiteList['min-width'] = true; // default: 0\n whiteList['move-to'] = false; // default: normal\n whiteList['nav-down'] = false; // default: auto\n whiteList['nav-index'] = false; // default: auto\n whiteList['nav-left'] = false; // default: auto\n whiteList['nav-right'] = false; // default: auto\n whiteList['nav-up'] = false; // default: auto\n whiteList['object-fit'] = false; // default: fill\n whiteList['object-position'] = false; // default: 50% 50%\n whiteList['opacity'] = false; // default: 1\n whiteList['order'] = false; // default: 0\n whiteList['orphans'] = false; // default: 2\n whiteList['outline'] = false; // default: depending on individual properties\n whiteList['outline-color'] = false; // default: invert\n whiteList['outline-offset'] = false; // default: 0\n whiteList['outline-style'] = false; // default: none\n whiteList['outline-width'] = false; // default: medium\n whiteList['overflow'] = false; // default: depending on individual properties\n whiteList['overflow-wrap'] = false; // default: normal\n whiteList['overflow-x'] = false; // default: visible\n whiteList['overflow-y'] = false; // default: visible\n whiteList['padding'] = true; // default: depending on individual properties\n whiteList['padding-bottom'] = true; // default: 0\n whiteList['padding-left'] = true; // default: 0\n whiteList['padding-right'] = true; // default: 0\n whiteList['padding-top'] = true; // default: 0\n whiteList['page'] = false; // default: auto\n whiteList['page-break-after'] = false; // default: auto\n whiteList['page-break-before'] = false; // default: auto\n whiteList['page-break-inside'] = false; // default: auto\n whiteList['page-policy'] = false; // default: start\n whiteList['pause'] = false; // default: implementation dependent\n whiteList['pause-after'] = false; // default: implementation dependent\n whiteList['pause-before'] = false; // default: implementation dependent\n whiteList['perspective'] = false; // default: none\n whiteList['perspective-origin'] = false; // default: 50% 50%\n whiteList['pitch'] = false; // default: medium\n whiteList['pitch-range'] = false; // default: 50\n whiteList['play-during'] = false; // default: auto\n whiteList['position'] = false; // default: static\n whiteList['presentation-level'] = false; // default: 0\n whiteList['quotes'] = false; // default: text\n whiteList['region-fragment'] = false; // default: auto\n whiteList['resize'] = false; // default: none\n whiteList['rest'] = false; // default: depending on individual properties\n whiteList['rest-after'] = false; // default: none\n whiteList['rest-before'] = false; // default: none\n whiteList['richness'] = false; // default: 50\n whiteList['right'] = false; // default: auto\n whiteList['rotation'] = false; // default: 0\n whiteList['rotation-point'] = false; // default: 50% 50%\n whiteList['ruby-align'] = false; // default: auto\n whiteList['ruby-merge'] = false; // default: separate\n whiteList['ruby-position'] = false; // default: before\n whiteList['shape-image-threshold'] = false; // default: 0.0\n whiteList['shape-outside'] = false; // default: none\n whiteList['shape-margin'] = false; // default: 0\n whiteList['size'] = false; // default: auto\n whiteList['speak'] = false; // default: auto\n whiteList['speak-as'] = false; // default: normal\n whiteList['speak-header'] = false; // default: once\n whiteList['speak-numeral'] = false; // default: continuous\n whiteList['speak-punctuation'] = false; // default: none\n whiteList['speech-rate'] = false; // default: medium\n whiteList['stress'] = false; // default: 50\n whiteList['string-set'] = false; // default: none\n whiteList['tab-size'] = false; // default: 8\n whiteList['table-layout'] = false; // default: auto\n whiteList['text-align'] = true; // default: start\n whiteList['text-align-last'] = true; // default: auto\n whiteList['text-combine-upright'] = true; // default: none\n whiteList['text-decoration'] = true; // default: none\n whiteList['text-decoration-color'] = true; // default: currentColor\n whiteList['text-decoration-line'] = true; // default: none\n whiteList['text-decoration-skip'] = true; // default: objects\n whiteList['text-decoration-style'] = true; // default: solid\n whiteList['text-emphasis'] = true; // default: depending on individual properties\n whiteList['text-emphasis-color'] = true; // default: currentColor\n whiteList['text-emphasis-position'] = true; // default: over right\n whiteList['text-emphasis-style'] = true; // default: none\n whiteList['text-height'] = true; // default: auto\n whiteList['text-indent'] = true; // default: 0\n whiteList['text-justify'] = true; // default: auto\n whiteList['text-orientation'] = true; // default: mixed\n whiteList['text-overflow'] = true; // default: clip\n whiteList['text-shadow'] = true; // default: none\n whiteList['text-space-collapse'] = true; // default: collapse\n whiteList['text-transform'] = true; // default: none\n whiteList['text-underline-position'] = true; // default: auto\n whiteList['text-wrap'] = true; // default: normal\n whiteList['top'] = false; // default: auto\n whiteList['transform'] = false; // default: none\n whiteList['transform-origin'] = false; // default: 50% 50% 0\n whiteList['transform-style'] = false; // default: flat\n whiteList['transition'] = false; // default: depending on individual properties\n whiteList['transition-delay'] = false; // default: 0s\n whiteList['transition-duration'] = false; // default: 0s\n whiteList['transition-property'] = false; // default: all\n whiteList['transition-timing-function'] = false; // default: ease\n whiteList['unicode-bidi'] = false; // default: normal\n whiteList['vertical-align'] = false; // default: baseline\n whiteList['visibility'] = false; // default: visible\n whiteList['voice-balance'] = false; // default: center\n whiteList['voice-duration'] = false; // default: auto\n whiteList['voice-family'] = false; // default: implementation dependent\n whiteList['voice-pitch'] = false; // default: medium\n whiteList['voice-range'] = false; // default: medium\n whiteList['voice-rate'] = false; // default: normal\n whiteList['voice-stress'] = false; // default: normal\n whiteList['voice-volume'] = false; // default: medium\n whiteList['volume'] = false; // default: medium\n whiteList['white-space'] = false; // default: normal\n whiteList['widows'] = false; // default: 2\n whiteList['width'] = true; // default: auto\n whiteList['will-change'] = false; // default: auto\n whiteList['word-break'] = true; // default: normal\n whiteList['word-spacing'] = true; // default: normal\n whiteList['word-wrap'] = true; // default: normal\n whiteList['wrap-flow'] = false; // default: auto\n whiteList['wrap-through'] = false; // default: wrap\n whiteList['writing-mode'] = false; // default: horizontal-tb\n whiteList['z-index'] = false; // default: auto\n\n return whiteList;\n}\n\n\n/**\n * 匹配到白名单上的一个属性时\n *\n * @param {String} name\n * @param {String} value\n * @param {Object} options\n * @return {String}\n */\nfunction onAttr (name, value, options) {\n // do nothing\n}\n\n/**\n * 匹配到不在白名单上的一个属性时\n *\n * @param {String} name\n * @param {String} value\n * @param {Object} options\n * @return {String}\n */\nfunction onIgnoreAttr (name, value, options) {\n // do nothing\n}\n\nvar REGEXP_URL_JAVASCRIPT = /javascript\\s*\\:/img;\n\n/**\n * 过滤属性值\n *\n * @param {String} name\n * @param {String} value\n * @return {String}\n */\nfunction safeAttrValue(name, value) {\n if (REGEXP_URL_JAVASCRIPT.test(value)) return '';\n return value;\n}\n\n\nexports.whiteList = getDefaultWhiteList();\nexports.getDefaultWhiteList = getDefaultWhiteList;\nexports.onAttr = onAttr;\nexports.onIgnoreAttr = onIgnoreAttr;\nexports.safeAttrValue = safeAttrValue;\n","module.exports = {\n indexOf: function (arr, item) {\n var i, j;\n if (Array.prototype.indexOf) {\n return arr.indexOf(item);\n }\n for (i = 0, j = arr.length; i < j; i++) {\n if (arr[i] === item) {\n return i;\n }\n }\n return -1;\n },\n forEach: function (arr, fn, scope) {\n var i, j;\n if (Array.prototype.forEach) {\n return arr.forEach(fn, scope);\n }\n for (i = 0, j = arr.length; i < j; i++) {\n fn.call(scope, arr[i], i, arr);\n }\n },\n trim: function (str) {\n if (String.prototype.trim) {\n return str.trim();\n }\n return str.replace(/(^\\s*)|(\\s*$)/g, '');\n },\n trimRight: function (str) {\n if (String.prototype.trimRight) {\n return str.trimRight();\n }\n return str.replace(/(\\s*$)/g, '');\n }\n};\n","/**\n * cssfilter\n *\n * @author 老雷<leizongmin@gmail.com>\n */\n\nvar _ = require('./util');\n\n\n/**\n * 解析style\n *\n * @param {String} css\n * @param {Function} onAttr 处理属性的函数\n * 参数格式: function (sourcePosition, position, name, value, source)\n * @return {String}\n */\nfunction parseStyle (css, onAttr) {\n css = _.trimRight(css);\n if (css[css.length - 1] !== ';') css += ';';\n var cssLength = css.length;\n var isParenthesisOpen = false;\n var lastPos = 0;\n var i = 0;\n var retCSS = '';\n\n function addNewAttr () {\n // 如果没有正常的闭合圆括号,则直接忽略当前属性\n if (!isParenthesisOpen) {\n var source = _.trim(css.slice(lastPos, i));\n var j = source.indexOf(':');\n if (j !== -1) {\n var name = _.trim(source.slice(0, j));\n var value = _.trim(source.slice(j + 1));\n // 必须有属性名称\n if (name) {\n var ret = onAttr(lastPos, retCSS.length, name, value, source);\n if (ret) retCSS += ret + '; ';\n }\n }\n }\n lastPos = i + 1;\n }\n\n for (; i < cssLength; i++) {\n var c = css[i];\n if (c === '/' && css[i + 1] === '*') {\n // 备注开始\n var j = css.indexOf('*/', i + 2);\n // 如果没有正常的备注结束,则后面的部分全部跳过\n if (j === -1) break;\n // 直接将当前位置调到备注结尾,并且初始化状态\n i = j + 1;\n lastPos = i + 1;\n isParenthesisOpen = false;\n } else if (c === '(') {\n isParenthesisOpen = true;\n } else if (c === ')') {\n isParenthesisOpen = false;\n } else if (c === ';') {\n if (isParenthesisOpen) {\n // 在圆括号里面,忽略\n } else {\n addNewAttr();\n }\n } else if (c === '\\n') {\n addNewAttr();\n }\n }\n\n return _.trim(retCSS);\n}\n\nmodule.exports = parseStyle;\n","/**\n * cssfilter\n *\n * @author 老雷<leizongmin@gmail.com>\n */\n\nvar DEFAULT = require('./default');\nvar parseStyle = require('./parser');\nvar _ = require('./util');\n\n\n/**\n * 返回值是否为空\n *\n * @param {Object} obj\n * @return {Boolean}\n */\nfunction isNull (obj) {\n return (obj === undefined || obj === null);\n}\n\n/**\n * 浅拷贝对象\n *\n * @param {Object} obj\n * @return {Object}\n */\nfunction shallowCopyObject (obj) {\n var ret = {};\n for (var i in obj) {\n ret[i] = obj[i];\n }\n return ret;\n}\n\n/**\n * 创建CSS过滤器\n *\n * @param {Object} options\n * - {Object} whiteList\n * - {Function} onAttr\n * - {Function} onIgnoreAttr\n * - {Function} safeAttrValue\n */\nfunction FilterCSS (options) {\n options = shallowCopyObject(options || {});\n options.whiteList = options.whiteList || DEFAULT.whiteList;\n options.onAttr = options.onAttr || DEFAULT.onAttr;\n options.onIgnoreAttr = options.onIgnoreAttr || DEFAULT.onIgnoreAttr;\n options.safeAttrValue = options.safeAttrValue || DEFAULT.safeAttrValue;\n this.options = options;\n}\n\nFilterCSS.prototype.process = function (css) {\n // 兼容各种奇葩输入\n css = css || '';\n css = css.toString();\n if (!css) return '';\n\n var me = this;\n var options = me.options;\n var whiteList = options.whiteList;\n var onAttr = options.onAttr;\n var onIgnoreAttr = options.onIgnoreAttr;\n var safeAttrValue = options.safeAttrValue;\n\n var retCSS = parseStyle(css, function (sourcePosition, position, name, value, source) {\n\n var check = whiteList[name];\n var isWhite = false;\n if (check === true) isWhite = check;\n else if (typeof check === 'function') isWhite = check(value);\n else if (check instanceof RegExp) isWhite = check.test(value);\n if (isWhite !== true) isWhite = false;\n\n // 如果过滤后 value 为空则直接忽略\n value = safeAttrValue(name, value);\n if (!value) return;\n\n var opts = {\n position: position,\n sourcePosition: sourcePosition,\n source: source,\n isWhite: isWhite\n };\n\n if (isWhite) {\n\n var ret = onAttr(name, value, opts);\n if (isNull(ret)) {\n return name + ':' + value;\n } else {\n return ret;\n }\n\n } else {\n\n var ret = onIgnoreAttr(name, value, opts);\n if (!isNull(ret)) {\n return ret;\n }\n\n }\n });\n\n return retCSS;\n};\n\n\nmodule.exports = FilterCSS;\n","/**\n * cssfilter\n *\n * @author 老雷<leizongmin@gmail.com>\n */\n\nvar DEFAULT = require('./default');\nvar FilterCSS = require('./css');\n\n\n/**\n * XSS过滤\n *\n * @param {String} css 要过滤的CSS代码\n * @param {Object} options 选项:whiteList, onAttr, onIgnoreAttr\n * @return {String}\n */\nfunction filterCSS (html, options) {\n var xss = new FilterCSS(options);\n return xss.process(html);\n}\n\n\n// 输出\nexports = module.exports = filterCSS;\nexports.FilterCSS = FilterCSS;\nfor (var i in DEFAULT) exports[i] = DEFAULT[i];\n\n// 在浏览器端使用\nif (typeof window !== 'undefined') {\n window.filterCSS = module.exports;\n}\n","module.exports = {\n indexOf: function (arr, item) {\n var i, j;\n if (Array.prototype.indexOf) {\n return arr.indexOf(item);\n }\n for (i = 0, j = arr.length; i < j; i++) {\n if (arr[i] === item) {\n return i;\n }\n }\n return -1;\n },\n forEach: function (arr, fn, scope) {\n var i, j;\n if (Array.prototype.forEach) {\n return arr.forEach(fn, scope);\n }\n for (i = 0, j = arr.length; i < j; i++) {\n fn.call(scope, arr[i], i, arr);\n }\n },\n trim: function (str) {\n if (String.prototype.trim) {\n return str.trim();\n }\n return str.replace(/(^\\s*)|(\\s*$)/g, \"\");\n },\n spaceIndex: function (str) {\n var reg = /\\s|\\n|\\t/;\n var match = reg.exec(str);\n return match ? match.index : -1;\n },\n};\n","/**\n * default settings\n *\n * @author Zongmin Lei<leizongmin@gmail.com>\n */\n\nvar FilterCSS = require(\"cssfilter\").FilterCSS;\nvar getDefaultCSSWhiteList = require(\"cssfilter\").getDefaultWhiteList;\nvar _ = require(\"./util\");\n\nfunction getDefaultWhiteList() {\n return {\n a: [\"target\", \"href\", \"title\"],\n abbr: [\"title\"],\n address: [],\n area: [\"shape\", \"coords\", \"href\", \"alt\"],\n article: [],\n aside: [],\n audio: [\n \"autoplay\",\n \"controls\",\n \"crossorigin\",\n \"loop\",\n \"muted\",\n \"preload\",\n \"src\",\n ],\n b: [],\n bdi: [\"dir\"],\n bdo: [\"dir\"],\n big: [],\n blockquote: [\"cite\"],\n br: [],\n caption: [],\n center: [],\n cite: [],\n code: [],\n col: [\"align\", \"valign\", \"span\", \"width\"],\n colgroup: [\"align\", \"valign\", \"span\", \"width\"],\n dd: [],\n del: [\"datetime\"],\n details: [\"open\"],\n div: [],\n dl: [],\n dt: [],\n em: [],\n figcaption: [],\n figure: [],\n font: [\"color\", \"size\", \"face\"],\n footer: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n header: [],\n hr: [],\n i: [],\n img: [\"src\", \"alt\", \"title\", \"width\", \"height\", \"loading\"],\n ins: [\"datetime\"],\n kbd: [],\n li: [],\n mark: [],\n nav: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n section: [],\n small: [],\n span: [],\n sub: [],\n summary: [],\n sup: [],\n strong: [],\n strike: [],\n table: [\"width\", \"border\", \"align\", \"valign\"],\n tbody: [\"align\", \"valign\"],\n td: [\"width\", \"rowspan\", \"colspan\", \"align\", \"valign\"],\n tfoot: [\"align\", \"valign\"],\n th: [\"width\", \"rowspan\", \"colspan\", \"align\", \"valign\"],\n thead: [\"align\", \"valign\"],\n tr: [\"rowspan\", \"align\", \"valign\"],\n tt: [],\n u: [],\n ul: [],\n video: [\n \"autoplay\",\n \"controls\",\n \"crossorigin\",\n \"loop\",\n \"muted\",\n \"playsinline\",\n \"poster\",\n \"preload\",\n \"src\",\n \"height\",\n \"width\",\n ],\n };\n}\n\nvar defaultCSSFilter = new FilterCSS();\n\n/**\n * default onTag function\n *\n * @param {String} tag\n * @param {String} html\n * @param {Object} options\n * @return {String}\n */\nfunction onTag(tag, html, options) {\n // do nothing\n}\n\n/**\n * default onIgnoreTag function\n *\n * @param {String} tag\n * @param {String} html\n * @param {Object} options\n * @return {String}\n */\nfunction onIgnoreTag(tag, html, options) {\n // do nothing\n}\n\n/**\n * default onTagAttr function\n *\n * @param {String} tag\n * @param {String} name\n * @param {String} value\n * @return {String}\n */\nfunction onTagAttr(tag, name, value) {\n // do nothing\n}\n\n/**\n * default onIgnoreTagAttr function\n *\n * @param {String} tag\n * @param {String} name\n * @param {String} value\n * @return {String}\n */\nfunction onIgnoreTagAttr(tag, name, value) {\n // do nothing\n}\n\n/**\n * default escapeHtml function\n *\n * @param {String} html\n */\nfunction escapeHtml(html) {\n return html.replace(REGEXP_LT, \"&lt;\").replace(REGEXP_GT, \"&gt;\");\n}\n\n/**\n * default safeAttrValue function\n *\n * @param {String} tag\n * @param {String} name\n * @param {String} value\n * @param {Object} cssFilter\n * @return {String}\n */\nfunction safeAttrValue(tag, name, value, cssFilter) {\n // unescape attribute value firstly\n value = friendlyAttrValue(value);\n\n if (name === \"href\" || name === \"src\") {\n // filter `href` and `src` attribute\n // only allow the value that starts with `http://` | `https://` | `mailto:` | `/` | `#`\n value = _.trim(value);\n if (value === \"#\") return \"#\";\n if (\n !(\n value.substr(0, 7) === \"http://\" ||\n value.substr(0, 8) === \"https://\" ||\n value.substr(0, 7) === \"mailto:\" ||\n value.substr(0, 4) === \"tel:\" ||\n value.substr(0, 11) === \"data:image/\" ||\n value.substr(0, 6) === \"ftp://\" ||\n value.substr(0, 2) === \"./\" ||\n value.substr(0, 3) === \"../\" ||\n value[0] === \"#\" ||\n value[0] === \"/\"\n )\n ) {\n return \"\";\n }\n } else if (name === \"background\") {\n // filter `background` attribute (maybe no use)\n // `javascript:`\n REGEXP_DEFAULT_ON_TAG_ATTR_4.lastIndex = 0;\n if (REGEXP_DEFAULT_ON_TAG_ATTR_4.test(value)) {\n return \"\";\n }\n } else if (name === \"style\") {\n // `expression()`\n REGEXP_DEFAULT_ON_TAG_ATTR_7.lastIndex = 0;\n if (REGEXP_DEFAULT_ON_TAG_ATTR_7.test(value)) {\n return \"\";\n }\n // `url()`\n REGEXP_DEFAULT_ON_TAG_ATTR_8.lastIndex = 0;\n if (REGEXP_DEFAULT_ON_TAG_ATTR_8.test(value)) {\n REGEXP_DEFAULT_ON_TAG_ATTR_4.lastIndex = 0;\n if (REGEXP_DEFAULT_ON_TAG_ATTR_4.test(value)) {\n return \"\";\n }\n }\n if (cssFilter !== false) {\n cssFilter = cssFilter || defaultCSSFilter;\n value = cssFilter.process(value);\n }\n }\n\n // escape `<>\"` before returns\n value = escapeAttrValue(value);\n return value;\n}\n\n// RegExp list\nvar REGEXP_LT = /</g;\nvar REGEXP_GT = />/g;\nvar REGEXP_QUOTE = /\"/g;\nvar REGEXP_QUOTE_2 = /&quot;/g;\nvar REGEXP_ATTR_VALUE_1 = /&#([a-zA-Z0-9]*);?/gim;\nvar REGEXP_ATTR_VALUE_COLON = /&colon;?/gim;\nvar REGEXP_ATTR_VALUE_NEWLINE = /&newline;?/gim;\n// var REGEXP_DEFAULT_ON_TAG_ATTR_3 = /\\/\\*|\\*\\//gm;\nvar REGEXP_DEFAULT_ON_TAG_ATTR_4 =\n /((j\\s*a\\s*v\\s*a|v\\s*b|l\\s*i\\s*v\\s*e)\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t\\s*|m\\s*o\\s*c\\s*h\\s*a):/gi;\n// var REGEXP_DEFAULT_ON_TAG_ATTR_5 = /^[\\s\"'`]*(d\\s*a\\s*t\\s*a\\s*)\\:/gi;\n// var REGEXP_DEFAULT_ON_TAG_ATTR_6 = /^[\\s\"'`]*(d\\s*a\\s*t\\s*a\\s*)\\:\\s*image\\//gi;\nvar REGEXP_DEFAULT_ON_TAG_ATTR_7 =\n /e\\s*x\\s*p\\s*r\\s*e\\s*s\\s*s\\s*i\\s*o\\s*n\\s*\\(.*/gi;\nvar REGEXP_DEFAULT_ON_TAG_ATTR_8 = /u\\s*r\\s*l\\s*\\(.*/gi;\n\n/**\n * escape double quote\n *\n * @param {String} str\n * @return {String} str\n */\nfunction escapeQuote(str) {\n return str.replace(REGEXP_QUOTE, \"&quot;\");\n}\n\n/**\n * unescape double quote\n *\n * @param {String} str\n * @return {String} str\n */\nfunction unescapeQuote(str) {\n return str.replace(REGEXP_QUOTE_2, '\"');\n}\n\n/**\n * escape html entities\n *\n * @param {String} str\n * @return {String}\n */\nfunction escapeHtmlEntities(str) {\n return str.replace(REGEXP_ATTR_VALUE_1, function replaceUnicode(str, code) {\n return code[0] === \"x\" || code[0] === \"X\"\n ? String.fromCharCode(parseInt(code.substr(1), 16))\n : String.fromCharCode(parseInt(code, 10));\n });\n}\n\n/**\n * escape html5 new danger entities\n *\n * @param {String} str\n * @return {String}\n */\nfunction escapeDangerHtml5Entities(str) {\n return str\n .replace(REGEXP_ATTR_VALUE_COLON, \":\")\n .replace(REGEXP_ATTR_VALUE_NEWLINE, \" \");\n}\n\n/**\n * clear nonprintable characters\n *\n * @param {String} str\n * @return {String}\n */\nfunction clearNonPrintableCharacter(str) {\n var str2 = \"\";\n for (var i = 0, len = str.length; i < len; i++) {\n str2 += str.charCodeAt(i) < 32 ? \" \" : str.charAt(i);\n }\n return _.trim(str2);\n}\n\n/**\n * get friendly attribute value\n *\n * @param {String} str\n * @return {String}\n */\nfunction friendlyAttrValue(str) {\n str = unescapeQuote(str);\n str = escapeHtmlEntities(str);\n str = escapeDangerHtml5Entities(str);\n str = clearNonPrintableCharacter(str);\n return str;\n}\n\n/**\n * unescape attribute value\n *\n * @param {String} str\n * @return {String}\n */\nfunction escapeAttrValue(str) {\n str = escapeQuote(str);\n str = escapeHtml(str);\n return str;\n}\n\n/**\n * `onIgnoreTag` function for removing all the tags that are not in whitelist\n */\nfunction onIgnoreTagStripAll() {\n return \"\";\n}\n\n/**\n * remove tag body\n * specify a `tags` list, if the tag is not in the `tags` list then process by the specify function (optional)\n *\n * @param {array} tags\n * @param {function} next\n */\nfunction StripTagBody(tags, next) {\n if (typeof next !== \"function\") {\n next = function () {};\n }\n\n var isRemoveAllTag = !Array.isArray(tags);\n function isRemoveTag(tag) {\n if (isRemoveAllTag) return true;\n return _.indexOf(tags, tag) !== -1;\n }\n\n var removeList = [];\n var posStart = false;\n\n return {\n onIgnoreTag: function (tag, html, options) {\n if (isRemoveTag(tag)) {\n if (options.isClosing) {\n var ret = \"[/removed]\";\n var end = options.position + ret.length;\n removeList.push([\n posStart !== false ? posStart : options.position,\n end,\n ]);\n posStart = false;\n return ret;\n } else {\n if (!posStart) {\n posStart = options.position;\n }\n return \"[removed]\";\n }\n } else {\n return next(tag, html, options);\n }\n },\n remove: function (html) {\n var rethtml = \"\";\n var lastPos = 0;\n _.forEach(removeList, function (pos) {\n rethtml += html.slice(lastPos, pos[0]);\n lastPos = pos[1];\n });\n rethtml += html.slice(lastPos);\n return rethtml;\n },\n };\n}\n\n/**\n * remove html comments\n *\n * @param {String} html\n * @return {String}\n */\nfunction stripCommentTag(html) {\n var retHtml = \"\";\n var lastPos = 0;\n while (lastPos < html.length) {\n var i = html.indexOf(\"<!--\", lastPos);\n if (i === -1) {\n retHtml += html.slice(lastPos);\n break;\n }\n retHtml += html.slice(lastPos, i);\n var j = html.indexOf(\"-->\", i);\n if (j === -1) {\n break;\n }\n lastPos = j + 3;\n }\n return retHtml;\n}\n\n/**\n * remove invisible characters\n *\n * @param {String} html\n * @return {String}\n */\nfunction stripBlankChar(html) {\n var chars = html.split(\"\");\n chars = chars.filter(function (char) {\n var c = char.charCodeAt(0);\n if (c === 127) return false;\n if (c <= 31) {\n if (c === 10 || c === 13) return true;\n return false;\n }\n return true;\n });\n return chars.join(\"\");\n}\n\nexports.whiteList = getDefaultWhiteList();\nexports.getDefaultWhiteList = getDefaultWhiteList;\nexports.onTag = onTag;\nexports.onIgnoreTag = onIgnoreTag;\nexports.onTagAttr = onTagAttr;\nexports.onIgnoreTagAttr = onIgnoreTagAttr;\nexports.safeAttrValue = safeAttrValue;\nexports.escapeHtml = escapeHtml;\nexports.escapeQuote = escapeQuote;\nexports.unescapeQuote = unescapeQuote;\nexports.escapeHtmlEntities = escapeHtmlEntities;\nexports.escapeDangerHtml5Entities = escapeDangerHtml5Entities;\nexports.clearNonPrintableCharacter = clearNonPrintableCharacter;\nexports.friendlyAttrValue = friendlyAttrValue;\nexports.escapeAttrValue = escapeAttrValue;\nexports.onIgnoreTagStripAll = onIgnoreTagStripAll;\nexports.StripTagBody = StripTagBody;\nexports.stripCommentTag = stripCommentTag;\nexports.stripBlankChar = stripBlankChar;\nexports.attributeWrapSign = '\"';\nexports.cssFilter = defaultCSSFilter;\nexports.getDefaultCSSWhiteList = getDefaultCSSWhiteList;\n","/**\n * Simple HTML Parser\n *\n * @author Zongmin Lei<leizongmin@gmail.com>\n */\n\nvar _ = require(\"./util\");\n\n/**\n * get tag name\n *\n * @param {String} html e.g. '<a hef=\"#\">'\n * @return {String}\n */\nfunction getTagName(html) {\n var i = _.spaceIndex(html);\n var tagName;\n if (i === -1) {\n tagName = html.slice(1, -1);\n } else {\n tagName = html.slice(1, i + 1);\n }\n tagName = _.trim(tagName).toLowerCase();\n if (tagName.slice(0, 1) === \"/\") tagName = tagName.slice(1);\n if (tagName.slice(-1) === \"/\") tagName = tagName.slice(0, -1);\n return tagName;\n}\n\n/**\n * is close tag?\n *\n * @param {String} html 如:'<a hef=\"#\">'\n * @return {Boolean}\n */\nfunction isClosing(html) {\n return html.slice(0, 2) === \"</\";\n}\n\n/**\n * parse input html and returns processed html\n *\n * @param {String} html\n * @param {Function} onTag e.g. function (sourcePosition, position, tag, html, isClosing)\n * @param {Function} escapeHtml\n * @return {String}\n */\nfunction parseTag(html, onTag, escapeHtml) {\n \"use strict\";\n\n var rethtml = \"\";\n var lastPos = 0;\n var tagStart = false;\n var quoteStart = false;\n var currentPos = 0;\n var len = html.length;\n var currentTagName = \"\";\n var currentHtml = \"\";\n\n chariterator: for (currentPos = 0; currentPos < len; currentPos++) {\n var c = html.charAt(currentPos);\n if (tagStart === false) {\n if (c === \"<\") {\n tagStart = currentPos;\n continue;\n }\n } else {\n if (quoteStart === false) {\n if (c === \"<\") {\n rethtml += escapeHtml(html.slice(lastPos, currentPos));\n tagStart = currentPos;\n lastPos = currentPos;\n continue;\n }\n if (c === \">\" || currentPos === len - 1) {\n rethtml += escapeHtml(html.slice(lastPos, tagStart));\n currentHtml = html.slice(tagStart, currentPos + 1);\n currentTagName = getTagName(currentHtml);\n rethtml += onTag(\n tagStart,\n rethtml.length,\n currentTagName,\n currentHtml,\n isClosing(currentHtml)\n );\n lastPos = currentPos + 1;\n tagStart = false;\n continue;\n }\n if (c === '\"' || c === \"'\") {\n var i = 1;\n var ic = html.charAt(currentPos - i);\n\n while (ic.trim() === \"\" || ic === \"=\") {\n if (ic === \"=\") {\n quoteStart = c;\n continue chariterator;\n }\n ic = html.charAt(currentPos - ++i);\n }\n }\n } else {\n if (c === quoteStart) {\n quoteStart = false;\n continue;\n }\n }\n }\n }\n if (lastPos < len) {\n rethtml += escapeHtml(html.substr(lastPos));\n }\n\n return rethtml;\n}\n\nvar REGEXP_ILLEGAL_ATTR_NAME = /[^a-zA-Z0-9\\\\_:.-]/gim;\n\n/**\n * parse input attributes and returns processed attributes\n *\n * @param {String} html e.g. `href=\"#\" target=\"_blank\"`\n * @param {Function} onAttr e.g. `function (name, value)`\n * @return {String}\n */\nfunction parseAttr(html, onAttr) {\n \"use strict\";\n\n var lastPos = 0;\n var lastMarkPos = 0;\n var retAttrs = [];\n var tmpName = false;\n var len = html.length;\n\n function addAttr(name, value) {\n name = _.trim(name);\n name = name.replace(REGEXP_ILLEGAL_ATTR_NAME, \"\").toLowerCase();\n if (name.length < 1) return;\n var ret = onAttr(name, value || \"\");\n if (ret) retAttrs.push(ret);\n }\n\n // 逐个分析字符\n for (var i = 0; i < len; i++) {\n var c = html.charAt(i);\n var v, j;\n if (tmpName === false && c === \"=\") {\n tmpName = html.slice(lastPos, i);\n lastPos = i + 1;\n lastMarkPos = html.charAt(lastPos) === '\"' || html.charAt(lastPos) === \"'\" ? lastPos : findNextQuotationMark(html, i + 1);\n continue;\n }\n if (tmpName !== false) {\n if (\n i === lastMarkPos\n ) {\n j = html.indexOf(c, i + 1);\n if (j === -1) {\n break;\n } else {\n v = _.trim(html.slice(lastMarkPos + 1, j));\n addAttr(tmpName, v);\n tmpName = false;\n i = j;\n lastPos = i + 1;\n continue;\n }\n }\n }\n if (/\\s|\\n|\\t/.test(c)) {\n html = html.replace(/\\s|\\n|\\t/g, \" \");\n if (tmpName === false) {\n j = findNextEqual(html, i);\n if (j === -1) {\n v = _.trim(html.slice(lastPos, i));\n addAttr(v);\n tmpName = false;\n lastPos = i + 1;\n continue;\n } else {\n i = j - 1;\n continue;\n }\n } else {\n j = findBeforeEqual(html, i - 1);\n if (j === -1) {\n v = _.trim(html.slice(lastPos, i));\n v = stripQuoteWrap(v);\n addAttr(tmpName, v);\n tmpName = false;\n lastPos = i + 1;\n continue;\n } else {\n continue;\n }\n }\n }\n }\n\n if (lastPos < html.length) {\n if (tmpName === false) {\n addAttr(html.slice(lastPos));\n } else {\n addAttr(tmpName, stripQuoteWrap(_.trim(html.slice(lastPos))));\n }\n }\n\n return _.trim(retAttrs.join(\" \"));\n}\n\nfunction findNextEqual(str, i) {\n for (; i < str.length; i++) {\n var c = str[i];\n if (c === \" \") continue;\n if (c === \"=\") return i;\n return -1;\n }\n}\n\nfunction findNextQuotationMark(str, i) {\n for (; i < str.length; i++) {\n var c = str[i];\n if (c === \" \") continue;\n if (c === \"'\" || c === '\"') return i;\n return -1;\n }\n}\n\nfunction findBeforeEqual(str, i) {\n for (; i > 0; i--) {\n var c = str[i];\n if (c === \" \") continue;\n if (c === \"=\") return i;\n return -1;\n }\n}\n\nfunction isQuoteWrapString(text) {\n if (\n (text[0] === '\"' && text[text.length - 1] === '\"') ||\n (text[0] === \"'\" && text[text.length - 1] === \"'\")\n ) {\n return true;\n } else {\n return false;\n }\n}\n\nfunction stripQuoteWrap(text) {\n if (isQuoteWrapString(text)) {\n return text.substr(1, text.length - 2);\n } else {\n return text;\n }\n}\n\nexports.parseTag = parseTag;\nexports.parseAttr = parseAttr;\n","/**\n * filter xss\n *\n * @author Zongmin Lei<leizongmin@gmail.com>\n */\n\nvar FilterCSS = require(\"cssfilter\").FilterCSS;\nvar DEFAULT = require(\"./default\");\nvar parser = require(\"./parser\");\nvar parseTag = parser.parseTag;\nvar parseAttr = parser.parseAttr;\nvar _ = require(\"./util\");\n\n/**\n * returns `true` if the input value is `undefined` or `null`\n *\n * @param {Object} obj\n * @return {Boolean}\n */\nfunction isNull(obj) {\n return obj === undefined || obj === null;\n}\n\n/**\n * get attributes for a tag\n *\n * @param {String} html\n * @return {Object}\n * - {String} html\n * - {Boolean} closing\n */\nfunction getAttrs(html) {\n var i = _.spaceIndex(html);\n if (i === -1) {\n return {\n html: \"\",\n closing: html[html.length - 2] === \"/\",\n };\n }\n html = _.trim(html.slice(i + 1, -1));\n var isClosing = html[html.length - 1] === \"/\";\n if (isClosing) html = _.trim(html.slice(0, -1));\n return {\n html: html,\n closing: isClosing,\n };\n}\n\n/**\n * shallow copy\n *\n * @param {Object} obj\n * @return {Object}\n */\nfunction shallowCopyObject(obj) {\n var ret = {};\n for (var i in obj) {\n ret[i] = obj[i];\n }\n return ret;\n}\n\nfunction keysToLowerCase(obj) {\n var ret = {};\n for (var i in obj) {\n if (Array.isArray(obj[i])) {\n ret[i.toLowerCase()] = obj[i].map(function (item) {\n return item.toLowerCase();\n });\n } else {\n ret[i.toLowerCase()] = obj[i];\n }\n }\n return ret;\n}\n\n/**\n * FilterXSS class\n *\n * @param {Object} options\n * whiteList (or allowList), onTag, onTagAttr, onIgnoreTag,\n * onIgnoreTagAttr, safeAttrValue, escapeHtml\n * stripIgnoreTagBody, allowCommentTag, stripBlankChar\n * css{whiteList, onAttr, onIgnoreAttr} `css=false` means don't use `cssfilter`\n */\nfunction FilterXSS(options) {\n options = shallowCopyObject(options || {});\n\n if (options.stripIgnoreTag) {\n if (options.onIgnoreTag) {\n console.error(\n 'Notes: cannot use these two options \"stripIgnoreTag\" and \"onIgnoreTag\" at the same time'\n );\n }\n options.onIgnoreTag = DEFAULT.onIgnoreTagStripAll;\n }\n if (options.whiteList || options.allowList) {\n options.whiteList = keysToLowerCase(options.whiteList || options.allowList);\n } else {\n options.whiteList = DEFAULT.whiteList;\n }\n\n this.attributeWrapSign = options.singleQuotedAttributeValue === true ? \"'\" : DEFAULT.attributeWrapSign;\n\n options.onTag = options.onTag || DEFAULT.onTag;\n options.onTagAttr = options.onTagAttr || DEFAULT.onTagAttr;\n options.onIgnoreTag = options.onIgnoreTag || DEFAULT.onIgnoreTag;\n options.onIgnoreTagAttr = options.onIgnoreTagAttr || DEFAULT.onIgnoreTagAttr;\n options.safeAttrValue = options.safeAttrValue || DEFAULT.safeAttrValue;\n options.escapeHtml = options.escapeHtml || DEFAULT.escapeHtml;\n this.options = options;\n\n if (options.css === false) {\n this.cssFilter = false;\n } else {\n options.css = options.css || {};\n this.cssFilter = new FilterCSS(options.css);\n }\n}\n\n/**\n * start process and returns result\n *\n * @param {String} html\n * @return {String}\n */\nFilterXSS.prototype.process = function (html) {\n // compatible with the input\n html = html || \"\";\n html = html.toString();\n if (!html) return \"\";\n\n var me = this;\n var options = me.options;\n var whiteList = options.whiteList;\n var onTag = options.onTag;\n var onIgnoreTag = options.onIgnoreTag;\n var onTagAttr = options.onTagAttr;\n var onIgnoreTagAttr = options.onIgnoreTagAttr;\n var safeAttrValue = options.safeAttrValue;\n var escapeHtml = options.escapeHtml;\n var attributeWrapSign = me.attributeWrapSign;\n var cssFilter = me.cssFilter;\n\n // remove invisible characters\n if (options.stripBlankChar) {\n html = DEFAULT.stripBlankChar(html);\n }\n\n // remove html comments\n if (!options.allowCommentTag) {\n html = DEFAULT.stripCommentTag(html);\n }\n\n // if enable stripIgnoreTagBody\n var stripIgnoreTagBody = false;\n if (options.stripIgnoreTagBody) {\n stripIgnoreTagBody = DEFAULT.StripTagBody(\n options.stripIgnoreTagBody,\n onIgnoreTag\n );\n onIgnoreTag = stripIgnoreTagBody.onIgnoreTag;\n }\n\n var retHtml = parseTag(\n html,\n function (sourcePosition, position, tag, html, isClosing) {\n var info = {\n sourcePosition: sourcePosition,\n position: position,\n isClosing: isClosing,\n isWhite: Object.prototype.hasOwnProperty.call(whiteList, tag),\n };\n\n // call `onTag()`\n var ret = onTag(tag, html, info);\n if (!isNull(ret)) return ret;\n\n if (info.isWhite) {\n if (info.isClosing) {\n return \"</\" + tag + \">\";\n }\n\n var attrs = getAttrs(html);\n var whiteAttrList = whiteList[tag];\n var attrsHtml = parseAttr(attrs.html, function (name, value) {\n // call `onTagAttr()`\n var isWhiteAttr = _.indexOf(whiteAttrList, name) !== -1;\n var ret = onTagAttr(tag, name, value, isWhiteAttr);\n if (!isNull(ret)) return ret;\n\n if (isWhiteAttr) {\n // call `safeAttrValue()`\n value = safeAttrValue(tag, name, value, cssFilter);\n if (value) {\n return name + '=' + attributeWrapSign + value + attributeWrapSign;\n } else {\n return name;\n }\n } else {\n // call `onIgnoreTagAttr()`\n ret = onIgnoreTagAttr(tag, name, value, isWhiteAttr);\n if (!isNull(ret)) return ret;\n return;\n }\n });\n\n // build new tag html\n html = \"<\" + tag;\n if (attrsHtml) html += \" \" + attrsHtml;\n if (attrs.closing) html += \" /\";\n html += \">\";\n return html;\n } else {\n // call `onIgnoreTag()`\n ret = onIgnoreTag(tag, html, info);\n if (!isNull(ret)) return ret;\n return escapeHtml(html);\n }\n },\n escapeHtml\n );\n\n // if enable stripIgnoreTagBody\n if (stripIgnoreTagBody) {\n retHtml = stripIgnoreTagBody.remove(retHtml);\n }\n\n return retHtml;\n};\n\nmodule.exports = FilterXSS;\n","/**\n * xss\n *\n * @author Zongmin Lei<leizongmin@gmail.com>\n */\n\nvar DEFAULT = require(\"./default\");\nvar parser = require(\"./parser\");\nvar FilterXSS = require(\"./xss\");\n\n/**\n * filter xss function\n *\n * @param {String} html\n * @param {Object} options { whiteList, onTag, onTagAttr, onIgnoreTag, onIgnoreTagAttr, safeAttrValue, escapeHtml }\n * @return {String}\n */\nfunction filterXSS(html, options) {\n var xss = new FilterXSS(options);\n return xss.process(html);\n}\n\nexports = module.exports = filterXSS;\nexports.filterXSS = filterXSS;\nexports.FilterXSS = FilterXSS;\n\n(function () {\n for (var i in DEFAULT) {\n exports[i] = DEFAULT[i];\n }\n for (var j in parser) {\n exports[j] = parser[j];\n }\n})();\n\n// using `xss` on the browser, output `filterXSS` to the globals\nif (typeof window !== \"undefined\") {\n window.filterXSS = module.exports;\n}\n\n// using `xss` on the WebWorker, output `filterXSS` to the globals\nfunction isWorkerEnv() {\n return (\n typeof self !== \"undefined\" &&\n typeof DedicatedWorkerGlobalScope !== \"undefined\" &&\n self instanceof DedicatedWorkerGlobalScope\n );\n}\nif (isWorkerEnv()) {\n self.filterXSS = module.exports;\n}\n","/**\n * Event-description rich-text allowlist — the single source of truth for what\n * formatting is permitted in an event description across every surface:\n *\n * 1. the admin editor toolbar (only expose buttons for these tags),\n * 2. sanitize-on-save (admin),\n * 3. sanitize-on-render (public event page + embed),\n * 4. the future Eventbrite sync (structured-content text module).\n *\n * The set is the INTERSECTION of {what the Tiptap toolbar emits} ∩ {what\n * Eventbrite's structured-content text module preserves} ∩ {safe to render}.\n * Keeping it here, shared, is what guarantees an organizer's description renders\n * structurally identically in our editor, on our event page, and on Eventbrite.\n *\n * Eventbrite's text module preserves roughly:\n * <p> <strong> <em> <u> <a> <ul> <ol> <li> <h2> <h3> <br>\n * and strips scripts, styles, classes, and everything else. We deliberately\n * stay BELOW that ceiling: no headings/underline (toolbar is bold/italic/lists/\n * links only), so nothing a user can type is ever stripped downstream.\n *\n * `<b>`/`<i>` are tolerated on the way IN (Word/Docs paste emits them) but the\n * editor itself emits the canonical `<strong>`/`<em>`.\n */\n/** Tags permitted in a stored/rendered event description. */\nexport const EVENT_DESCRIPTION_TAGS = [\n \"p\",\n \"br\",\n \"strong\",\n \"b\",\n \"em\",\n \"i\",\n \"ul\",\n \"ol\",\n \"li\",\n \"a\",\n];\n/**\n * Per-tag attribute allowlist. Only links carry an attribute (`href`); we drop\n * `target`/`rel`/`class`/`id`/`style` so what we store is the minimal shape\n * Eventbrite also keeps. Link safety (protocol) is enforced in `sanitize.ts`.\n */\nexport const EVENT_DESCRIPTION_ATTRS = {\n a: [\"href\"],\n};\n/** URL protocols permitted on links. Everything else (javascript:, data:, etc.) is dropped. */\nexport const EVENT_DESCRIPTION_LINK_PROTOCOLS = [\"http:\", \"https:\", \"mailto:\"];\n/**\n * `xss` whiteList shape: `{ tag: [attr, ...] }`. Built from the two lists above\n * so there is exactly one place to edit the allowlist.\n */\nexport const EVENT_DESCRIPTION_WHITELIST = Object.fromEntries(EVENT_DESCRIPTION_TAGS.map((tag) => [\n tag,\n EVENT_DESCRIPTION_ATTRS[tag] ?? [],\n]));\n","/**\n * Isomorphic sanitizer for event-description HTML.\n *\n * Runs identically on the server and in the browser (no DOM / no jsdom) so it\n * is safe to call during SvelteKit SSR of the public event page — unlike a\n * DOMPurify-based sanitizer, which needs a DOM and therefore degrades to\n * raw-passthrough or all-tags-stripped on the server.\n *\n * Security boundary: call this BOTH on save (admin) AND on render (public).\n * Descriptions can also arrive via CSV import or the future Eventbrite sync, so\n * render-time sanitize is not optional defense-in-depth — it's load-bearing.\n */\nimport { FilterXSS } from \"xss\";\nimport { EVENT_DESCRIPTION_LINK_PROTOCOLS, EVENT_DESCRIPTION_WHITELIST, } from \"./allowlist.js\";\n/**\n * Is this href safe to keep? Only absolute http(s)/mailto and protocol-relative\n * or root-relative links survive. `javascript:`, `data:`, `vbscript:`, etc. are\n * dropped. Parsing is done without the URL API so it behaves the same on every\n * runtime; we just inspect the leading scheme.\n */\nfunction isSafeHref(value) {\n const v = value.trim();\n if (v === \"\")\n return false;\n // Relative or protocol-relative links carry no scheme — allow them.\n if (v.startsWith(\"/\") || v.startsWith(\"#\") || v.startsWith(\"?\"))\n return true;\n const schemeMatch = v.match(/^([a-z][a-z0-9+.-]*):/i);\n if (!schemeMatch)\n return true; // no scheme → relative → safe\n return EVENT_DESCRIPTION_LINK_PROTOCOLS.includes(schemeMatch[1].toLowerCase() + \":\");\n}\nconst filter = new FilterXSS({\n whiteList: EVENT_DESCRIPTION_WHITELIST,\n // Remove disallowed tags entirely rather than escaping them into visible\n // `&lt;script&gt;` text.\n stripIgnoreTag: true,\n // Drop the CONTENTS of these too, so a pasted <script>…</script> leaves\n // nothing behind.\n stripIgnoreTagBody: [\"script\", \"style\"],\n allowCommentTag: false,\n css: false,\n safeAttrValue(tag, name, value) {\n if (tag === \"a\" && name === \"href\") {\n return isSafeHref(value) ? value : \"\";\n }\n return \"\";\n },\n});\n/**\n * Sanitize untrusted description HTML down to the shared event-description\n * allowlist. Returns clean HTML safe to store and to render with `{@html}`.\n */\nexport function sanitizeEventDescriptionHtml(dirty) {\n if (!dirty)\n return \"\";\n // A rejected href (unsafe protocol) leaves js-xss emitting a bare `href`\n // attribute; drop it so the output is the minimal `<a>text</a>` shape.\n return filter\n .process(String(dirty))\n .replace(/<a\\s+href(?:=\"\")?\\s*>/gi, \"<a>\");\n}\n","<script lang=\"ts\">\n import { sanitizeEventDescriptionHtml } from '../../richtext/index.js';\n\n // The canonical long-form treatment now lives in tokens/ and ships to\n // consumers via typography-base.css (sc 1003). Imported directly here too, so\n // the component keeps its treatment wherever it is bundled — including\n // embeds, which load no base layer at all.\n import '../../tokens/prose.css';\n\n interface Props {\n /** Stored event-description HTML. Sanitized here before rendering, so it is safe to pass DB/API values directly. */\n html?: string | null;\n class?: string;\n }\n\n let { html = '', class: className = '' }: Props = $props();\n\n // Sanitize on render. Isomorphic (SSR-safe) — descriptions can arrive via CSV\n // import or Eventbrite sync, so this is load-bearing, not just defense-in-depth.\n let safe = $derived(sanitizeEventDescriptionHtml(html));\n</script>\n\n{#if safe}\n <!-- eslint-disable-next-line svelte/no-at-html-tags -- sanitized via sanitizeEventDescriptionHtml above -->\n <div class={`mic-prose ${className}`}>{@html safe}</div>\n{/if}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import { typography } from '../../tokens/typography';\n\n /**\n * Section - Semantic section wrapper with optional title\n *\n * Use Section to group related content with consistent spacing.\n * Provides proper HTML5 semantics with <section> element.\n *\n * @example\n * <Section title=\"Recent Orders\">\n * <OrdersTable />\n * </Section>\n *\n * @example\n * <Section>\n * <Chart />\n * </Section>\n */\n\n interface Props {\n /** Section title (optional) */\n title?: string;\n /** Title size */\n titleSize?: 'sm' | 'md' | 'lg';\n /** Gap between title and content */\n gap?: '2' | '3' | '4' | '6';\n /** Additional CSS classes for the section */\n class?: string;\n /** Additional CSS classes for the title */\n titleClass?: string;\n /** Child content */\n children?: Snippet;\n }\n\n let {\n title = '',\n titleSize = 'md',\n gap = '4',\n class: className = '',\n titleClass = '',\n children\n }: Props = $props();\n\n const titleSizeMap: Record<string, string> = {\n sm: typography.subheading,\n md: typography.h3,\n lg: typography.h2\n };\n\n const gapMap: Record<string, string> = {\n '2': 'space-y-2',\n '3': 'space-y-3',\n '4': 'space-y-4',\n '6': 'space-y-6'\n };\n\n let sectionClasses = $derived(\n [\n title ? gapMap[gap] || 'space-y-4' : '',\n className\n ].filter(Boolean).join(' ')\n );\n\n let titleClasses = $derived(\n [\n titleSizeMap[titleSize] || titleSizeMap.md,\n titleClass\n ].filter(Boolean).join(' ')\n );\n</script>\n\n<section class={sectionClasses} aria-label={title || undefined}>\n {#if title}\n <h2 class={titleClasses}>{title}</h2>\n {/if}\n\n {@render children?.()}\n</section>\n","import { roundCurrency, toTicketId } from '@getmicdrop/svelte-components';\r\nimport { calculateTax } from './defaults';\r\nimport type {\r\n OrderLine,\r\n OrderTotals,\r\n PromoCodeState,\r\n TicketTypeData,\r\n} from './types';\r\n\r\n/**\r\n * Client-side order-totals computation for the public checkout widget — the\r\n * single home for the arithmetic that Event.svelte renders through\r\n * OrderSummary and hands to the parent's checkout. (Checkout.svelte keeps its\r\n * own pre-server fallback because it assembles from already-built cart lines +\r\n * a flat promoDiscount, not per-ticket promo state; both honour the same\r\n * OrderTotals SHAPE below, so a reviewer can reconcile them by eye.)\r\n *\r\n * Contract (shared with CheckoutConfig / ServerOrderTotals):\r\n * - `unitPrice` and line `subtotal` are GROSS — the full ticket price,\r\n * pre-promo. The promo is represented ONCE, as the aggregate\r\n * `promoDiscount`, never baked into the line prices.\r\n * - `total` = (subtotal − promoDiscount) + fees + taxes.\r\n *\r\n * Baking the discount into the line prices AND reporting `promoDiscount`\r\n * double-counts it: OrderSummary shows a separate \"− Promo discount\" line\r\n * (so the arithmetic on screen stops reconciling) and Checkout's fallback\r\n * subtracts `promoDiscount` from the summed line subtotals a second time.\r\n */\r\nexport function computeOrderTotals(\r\n tickets: TicketTypeData[],\r\n quantities: Record<number, number>,\r\n donationAmounts: Record<number, string>,\r\n promoState: PromoCodeState,\r\n taxPercentage: number\r\n): OrderTotals {\r\n const lines: OrderLine[] = [];\r\n let subtotal = 0;\r\n let fees = 0;\r\n let promoDiscount = 0;\r\n // Set when a selected non-donation ticket has no wire price: the order's\r\n // subtotal and amount-due become unknowable, so both dash and checkout\r\n // hard-blocks — never a coerced $0 (mf#2383 / vc#619).\r\n let hasMissingPrice = false;\r\n\r\n for (const ticket of tickets) {\r\n const qty = quantities[ticket.id] ?? 0;\r\n if (qty <= 0) continue;\r\n\r\n const isDonation = ticket.isDonation || ticket.ticketType === 2;\r\n const rawPrice = isDonation\r\n ? parseFloat(donationAmounts[ticket.id]) || 0\r\n : ticket.price;\r\n\r\n // Missing OR malformed wire price on a real (non-donation) ticket → a null\r\n // line that renders an em-dash, and the whole order is marked unpriced. The\r\n // `!Number.isFinite` half catches a NaN/Infinity that would otherwise flow\r\n // into toUSD() and throw (mf#2383 / vc#619).\r\n if (rawPrice == null || !Number.isFinite(rawPrice)) {\r\n lines.push({\r\n ticketId: toTicketId(ticket.id),\r\n ticketName: ticket.name,\r\n quantity: qty,\r\n unitPrice: null,\r\n fee: ticket.fee,\r\n subtotal: null,\r\n isDonation: false,\r\n });\r\n hasMissingPrice = true;\r\n continue;\r\n }\r\n // rawPrice is narrowed to number by the guard above — no coercion needed.\r\n const basePrice: number = rawPrice;\r\n const ticketFee = isDonation ? 0 : ticket.fee;\r\n\r\n // Per-ticket promo discount — never applied to donations.\r\n let ticketDiscount = 0;\r\n if (promoState.isApplied && promoState.discountAmount > 0 && !isDonation) {\r\n const eligible =\r\n promoState.discountTicketIds.length === 0 ||\r\n promoState.discountTicketIds.includes(ticket.id);\r\n if (eligible) {\r\n if (promoState.discountType === '%') {\r\n // discountAmount is a percentage (0–100); percent/100 is a ratio.\r\n // Clamp to the ticket price so an over-100% code can't discount a\r\n // line below zero or bleed into other tickets' gross subtotal —\r\n // mirrors the '$' branch's Math.min guard.\r\n const percent = promoState.discountAmount;\r\n ticketDiscount = Math.min(basePrice, basePrice * (percent / 100));\r\n } else if (promoState.discountType === '$') {\r\n ticketDiscount = Math.min(promoState.discountAmount, basePrice);\r\n }\r\n }\r\n }\r\n\r\n // GROSS line price — the promo lives ONLY in the aggregate\r\n // promoDiscount below, never baked into unitPrice/subtotal.\r\n const ticketSubtotal = basePrice * qty;\r\n\r\n lines.push({\r\n ticketId: toTicketId(ticket.id),\r\n ticketName: ticket.name,\r\n quantity: qty,\r\n unitPrice: basePrice,\r\n fee: ticketFee,\r\n subtotal: ticketSubtotal,\r\n isDonation,\r\n });\r\n\r\n subtotal += ticketSubtotal;\r\n fees += ticketFee * qty;\r\n promoDiscount += ticketDiscount * qty;\r\n }\r\n\r\n // Round each accumulation to cents — a percentage promo produces fractions\r\n // (10% of 9.99 = 0.999). Matches the Checkout fallback so the emitted\r\n // OrderTotals is clean-cent money, not sub-cent-noisy floats.\r\n subtotal = roundCurrency(subtotal);\r\n fees = roundCurrency(fees);\r\n promoDiscount = roundCurrency(promoDiscount);\r\n\r\n // A missing price makes the money picture unknowable: dash the subtotal and\r\n // amount-due, hide the fee/tax rows (0), and let the buy button hard-block via\r\n // its unpriced-total path. The priced lines still show their own numbers.\r\n if (hasMissingPrice) {\r\n return {\r\n lines,\r\n subtotal: null,\r\n fees: 0,\r\n taxes: 0,\r\n total: null,\r\n promoDiscount,\r\n giftCardAmount: 0,\r\n };\r\n }\r\n\r\n // Apply the promo exactly once, to the gross subtotal. Per-ticket discounts\r\n // are already clamped to their basePrice, so this never goes negative.\r\n const discountedSubtotal = roundCurrency(\r\n Math.max(0, subtotal - promoDiscount)\r\n );\r\n const taxes = calculateTax(discountedSubtotal + fees, taxPercentage);\r\n\r\n return {\r\n lines,\r\n subtotal,\r\n fees,\r\n taxes,\r\n total: roundCurrency(discountedSubtotal + fees + taxes),\r\n promoDiscount,\r\n giftCardAmount: 0,\r\n };\r\n}\r\n","import { createLogger } from '@getmicdrop/svelte-components';\n\nimport { apiPost, getOrdersV2Url } from '../api/client';\nimport { createPaymentIntent } from '../api/orders';\nimport { applyPromoCode } from '../api/promo';\n\nimport { buildServerTotalsFromPaymentIntent } from './serverTotals';\n\nimport type { ServerOrderTotals } from './types';\n\nconst logger = createLogger('livePricing');\n\n/** Debounce before a server reprice — batches rapid +/- taps into one call and\n * keeps us under the public-orders rate limit. */\nconst DEBOUNCE_MS = 350;\n\nexport interface PricingInput {\n eventId: number | string;\n /** ticketId -> quantity (only >0 entries drive pricing). */\n quantities: Record<string | number, number>;\n /** ticketId -> donation dollar string (type-2 tickets). */\n donationAmounts?: Record<string | number, string>;\n /** The active promo code, or '' when none is applied. */\n promoCode: string;\n}\n\nfunction toNumericQuantities(\n q: Record<string | number, number>\n): Record<number, number> {\n const out: Record<number, number> = {};\n for (const [k, v] of Object.entries(q)) {\n const n = Number(v) || 0;\n if (n > 0) out[Number(k)] = n;\n }\n return out;\n}\n\nfunction toNumericDonations(\n d: Record<string | number, string> | undefined\n): Record<number, number> {\n const out: Record<number, number> = {};\n if (!d) return out;\n for (const [k, v] of Object.entries(d)) {\n const n = parseFloat(v);\n if (Number.isFinite(n) && n > 0) out[Number(k)] = n;\n }\n return out;\n}\n\n/**\n * Live server-priced totals for the public event page — the SAME\n * cart → (apply-promo) → payment-intent loop the operator's create-order page\n * runs (its create-order page re-prices on every ticket change), so tax /\n * service fee / promo update in real time here instead of only at checkout.\n *\n * SAFE FOR PUBLIC SCALE — the pricing cart is created EMPTY (no quantities), so\n * it holds NO reservations and decrements NO inventory (the backend only\n * reserves for qty>0). payment-intent then prices reservation-less straight off\n * the passed quantities (the backend's product-quantities fallback). Seat\n * holds still happen only at checkout, on the checkout page's own cart — this\n * cart is display-only and simply expires. A shopper who never selects a ticket\n * makes zero server calls.\n *\n * Rune store: read `.serverTotals` / `.pricing` from a component and they track.\n * A monotonic `#seq` drops out-of-order responses, so a slow reprice against\n * stale quantities can never clobber a newer one.\n */\nexport class LivePricing {\n /** Server-authoritative totals, or null before the first response / when\n * nothing is selected (callers fall back to the client estimate). */\n serverTotals = $state<ServerOrderTotals | null>(null);\n /** A reprice is scheduled or in flight — drive a subtle \"updating\" affordance. */\n pricing = $state(false);\n\n #cartId: string | null = null;\n #cartEventId: number | string | null = null;\n #promoOnCart = '';\n #seq = 0;\n #timer: ReturnType<typeof setTimeout> | null = null;\n\n /** Schedule a debounced reprice for the current selection. Call from an\n * $effect that reads quantities / donations / promo. */\n schedule(input: PricingInput): void {\n if (this.#timer) clearTimeout(this.#timer);\n const q = toNumericQuantities(input.quantities);\n // Nothing selected → no cart, no server call; drop back to the client estimate.\n if (Object.keys(q).length === 0) {\n this.#seq++; // cancel any in-flight write\n this.serverTotals = null;\n this.pricing = false;\n return;\n }\n this.pricing = true; // optimistic: the client estimate shows meanwhile\n this.#timer = setTimeout(() => {\n void this.#run(input);\n }, DEBOUNCE_MS);\n }\n\n async #run(input: PricingInput): Promise<void> {\n const mySeq = ++this.#seq;\n const wantPromo = input.promoCode?.trim() ?? '';\n try {\n // A promo removal drops the discounted pricing cart for a fresh clean one\n // (there is no reliable public remove-promo, and a fresh empty cart is\n // cheap + reservation-less).\n const needFreshCart =\n !this.#cartId ||\n this.#cartEventId !== input.eventId ||\n (!wantPromo && !!this.#promoOnCart);\n\n if (needFreshCart) {\n const res = await apiPost<{ cartUUID?: string; uuid?: string }>(\n `${getOrdersV2Url()}/cart`,\n { eventID: Number(input.eventId), quantities: {} }\n );\n if (mySeq !== this.#seq) return;\n this.#cartId = res.success\n ? (res.data?.cartUUID ?? res.data?.uuid ?? null)\n : null;\n this.#cartEventId = input.eventId;\n this.#promoOnCart = '';\n }\n // Cart create failed → leave serverTotals as-is; the client estimate carries.\n if (!this.#cartId) {\n if (mySeq === this.#seq) this.pricing = false;\n return;\n }\n\n const quantities = toNumericQuantities(input.quantities);\n const donations = toNumericDonations(input.donationAmounts);\n\n // (Re)apply the promo to the cart against the CURRENT quantities — a %\n // code must re-price when the selection changes (reservation-less carts\n // fix the discount at apply time). The debounce already batches, so a\n // redundant re-apply on an unchanged selection is not worth the bookkeeping.\n if (wantPromo) {\n await applyPromoCode(this.#cartId, wantPromo, quantities);\n if (mySeq !== this.#seq) return;\n this.#promoOnCart = wantPromo;\n }\n\n const pi = await createPaymentIntent(this.#cartId, quantities, donations);\n if (mySeq !== this.#seq) return;\n this.serverTotals = pi ? buildServerTotalsFromPaymentIntent(pi) : null;\n } catch (err) {\n logger.error('live reprice failed; keeping client estimate', err);\n // Leave serverTotals untouched → the client estimate stays visible.\n } finally {\n if (mySeq === this.#seq) this.pricing = false;\n }\n }\n\n /** Reset on event identity change (the component is reused across navigation). */\n reset(): void {\n this.#seq++;\n if (this.#timer) clearTimeout(this.#timer);\n this.#timer = null;\n this.#cartId = null;\n this.#cartEventId = null;\n this.#promoOnCart = '';\n this.serverTotals = null;\n this.pricing = false;\n }\n}\n","<script lang=\"ts\">\r\n import { Image } from '@getmicdrop/svelte-components';\r\n import { PLACEHOLDER_IMAGE } from '$lib/utils/constants.js';\r\n\r\n interface Props {\r\n src: string;\r\n alt: string;\r\n labels?: Record<string, string>;\r\n }\r\n\r\n let { src, alt, labels: _labels = {} }: Props = $props();\r\n</script>\r\n\r\n<!-- SC Image's default blur-backdrop framing IS what this component used to\r\n hand-roll: contained main image over a blurred zoomed copy of the same\r\n already-fetched bitmap (scale 1.15, blur 16px, saturate 1.2). Adopting the\r\n canonical also picks up blur-up reveal. The old escape rationale\r\n (aria-hidden on the backdrop) is moot — Image owns its backdrop layer\r\n internally. When the event has no poster, fall back to the venue\r\n placeholder (same PLACEHOLDER_IMAGE the checkout sidebar + success view\r\n use) rather than a broken image or the generic branded mark. -->\r\n<Image\r\n {src}\r\n {alt}\r\n fallback={PLACEHOLDER_IMAGE}\r\n loading=\"eager\"\r\n class=\"w-full rounded-xl max-h-[37.5rem] min-h-48\"\r\n/>\r\n","<script lang=\"ts\">\r\n import {\r\n CalendarIcon,\r\n LocationIcon,\r\n ExportIcon,\r\n BuildingIcon,\r\n ClockIcon,\r\n UserIcon,\r\n } from '@getmicdrop/svelte-components/primitives/Icons/phosphor/index.js';\r\n import { onDestroy } from 'svelte';\r\n import { Heading, Button } from '@getmicdrop/svelte-components';\r\n import { announce } from '@getmicdrop/svelte-components/a11y';\r\n import { createShareCopyFeedback } from '$lib/public-calendar-flow/shareCopyFeedback.svelte';\r\n import ScarcityBadge from '../../components/ScarcityBadge.svelte';\r\n import type {\r\n EventData,\r\n ScarcityLevel,\r\n } from '$lib/public-calendar-flow/types';\r\n import {\r\n formatFullDateCompact,\r\n formatEventTime,\r\n formatTimeRange,\r\n formatDoorsTime,\r\n getScarcityLevel,\r\n getScarcityText,\r\n } from '$lib/public-calendar-flow/defaults';\r\n\r\n interface Props {\r\n event: EventData;\r\n hideDateTime?: boolean;\r\n hideVenue?: boolean;\r\n labels?: Record<string, string>;\r\n /** BCP-47 locale tag (e.g. 'es', 'es-MX'). Undefined → en-US. */\r\n locale?: string;\r\n }\r\n\r\n let {\r\n event,\r\n hideDateTime = false,\r\n hideVenue = false,\r\n labels: _labels = {},\r\n locale = undefined,\r\n }: Props = $props();\r\n\r\n let scarcityLevel: ScarcityLevel = $derived(\r\n getScarcityLevel(event.totalTicketsRemaining, event.totalTicketsCapacity)\r\n );\r\n let scarcityText = $derived(\r\n getScarcityText(scarcityLevel, event.totalTicketsRemaining, 'event')\r\n );\r\n\r\n let ageText = $derived(\r\n (() => {\r\n if (!event.displayAgeRestriction) return null;\r\n if (event.ageRestriction && event.ageRestriction > 0) {\r\n return `Ages ${event.ageRestriction}+`;\r\n }\r\n return 'All ages';\r\n })()\r\n );\r\n\r\n // Share-link copy feedback — inline, never a toast (VC has no toasts).\r\n // 'copied' briefly swaps the button label; 'failed' reveals the URL below\r\n // so the buyer can select and copy it manually.\r\n // Shared inline copy-feedback state machine (single source, also used by the\r\n // confirmation sidebar). VC has no toasts, so feedback is inline.\r\n const shareFeedback = createShareCopyFeedback();\r\n\r\n function shareEvent() {\r\n const url =\r\n typeof window !== 'undefined'\r\n ? `${window.location.origin}/e/${event.id}-${event.slug}`\r\n : '#';\r\n shareFeedback.share(url);\r\n }\r\n\r\n onDestroy(shareFeedback.dispose);\r\n\r\n // Announce the inline copy-failure fallback to screen readers without a\r\n // duplicate live-region DOM node (the visible span below stays as-is).\r\n $effect(() => {\r\n if (shareFeedback.copyState === 'failed')\r\n announce(`Copy failed — select to copy: ${shareFeedback.copyFailedUrl}`, {\r\n politeness: 'assertive',\r\n });\r\n });\r\n</script>\r\n\r\n<div class=\"flex flex-col gap-4\">\r\n <div class=\"flex items-start gap-3 flex-wrap\">\r\n <Heading level={1} variant=\"title\" tone=\"primary\">\r\n {event.title}\r\n </Heading>\r\n {#if scarcityText && event.status === 'on_sale'}\r\n <ScarcityBadge\r\n remaining={event.totalTicketsRemaining}\r\n total={event.totalTicketsCapacity}\r\n context=\"event\"\r\n />\r\n {/if}\r\n </div>\r\n\r\n <!-- Share -->\r\n <div class=\"flex flex-col gap-1.5 self-start\">\r\n <Button variant=\"ghost\" size=\"xs\" onclick={shareEvent}>\r\n <ExportIcon size=\"16\" class=\"shrink-0\" />\r\n {shareFeedback.copyState === 'copied' ? 'Link copied' : 'Share'}\r\n </Button>\r\n {#if shareFeedback.copyState === 'failed'}\r\n <span class=\"copy-fallback caption\">\r\n Copy failed — select to copy:\r\n <span class=\"copy-url\">{shareFeedback.copyFailedUrl}</span>\r\n </span>\r\n {/if}\r\n </div>\r\n\r\n {#if !hideDateTime}\r\n <!-- Date -->\r\n <div class=\"flex items-start gap-3\">\r\n <CalendarIcon size=\"16\" class=\"shrink-0 mt-0.5 icon-muted\" />\r\n <span class=\"body-md\"\r\n >{formatFullDateCompact(\r\n event.startDateTime,\r\n event.timezone,\r\n locale\r\n )}</span\r\n >\r\n </div>\r\n\r\n <!-- Time + doors -->\r\n {#if event.displayStartTime !== false}\r\n <div class=\"flex items-start gap-3\">\r\n <ClockIcon size=\"16\" class=\"shrink-0 mt-0.5 icon-muted\" />\r\n <div class=\"flex flex-col gap-0.5\">\r\n {#if event.displayEndTime !== false}\r\n <span class=\"body-md\"\r\n >{formatTimeRange(\r\n event.startDateTime,\r\n event.endDateTime,\r\n event.timezone,\r\n locale\r\n )}</span\r\n >\r\n {:else}\r\n <span class=\"body-md\"\r\n >{formatEventTime(\r\n event.startDateTime,\r\n event.timezone,\r\n locale\r\n )}</span\r\n >\r\n {/if}\r\n {#if event.displayDoorsTime !== false && event.doorsOpenTime}\r\n <span class=\"caption\"\r\n >Doors open {formatDoorsTime(\r\n event.doorsOpenTime,\r\n event.timezone,\r\n locale\r\n )}</span\r\n >\r\n {/if}\r\n </div>\r\n </div>\r\n {:else if event.displayDoorsTime !== false && event.doorsOpenTime}\r\n <!-- No start/end time, but doors time is shown -->\r\n <div class=\"flex items-start gap-3\">\r\n <ClockIcon size=\"16\" class=\"shrink-0 mt-0.5 icon-muted\" />\r\n <span class=\"body-md\"\r\n >Doors open {formatDoorsTime(\r\n event.doorsOpenTime,\r\n event.timezone,\r\n locale\r\n )}</span\r\n >\r\n </div>\r\n {/if}\r\n {/if}\r\n\r\n {#if !hideVenue}\r\n <!-- Venue + address -->\r\n <div class=\"flex items-start gap-3\">\r\n <LocationIcon size=\"16\" class=\"shrink-0 mt-0.5 icon-muted\" />\r\n <div class=\"flex flex-col gap-0.5\">\r\n <span class=\"body-md\">{event.venue.name}</span>\r\n {#if event.venue.address}\r\n <span class=\"caption\">{event.venue.address}</span>\r\n {/if}\r\n </div>\r\n </div>\r\n\r\n <!-- Stage name -->\r\n {#if event.stageName}\r\n <div class=\"flex items-start gap-3\">\r\n <BuildingIcon size=\"16\" class=\"shrink-0 mt-0.5 icon-muted\" />\r\n <span class=\"body-md\">{event.stageName}</span>\r\n </div>\r\n {/if}\r\n\r\n <!-- Age restriction -->\r\n {#if ageText}\r\n <div class=\"flex items-start gap-3\">\r\n <UserIcon size=\"16\" class=\"shrink-0 mt-0.5 icon-muted\" />\r\n <span class=\"body-md\">{ageText}</span>\r\n </div>\r\n {/if}\r\n {/if}\r\n</div>\r\n\r\n<style>\r\n /* Inline share-copy fallback — VC surfaces feedback inline, never as a toast. */\r\n .copy-fallback {\r\n color: hsl(var(--accent-danger));\r\n }\r\n\r\n .copy-url {\r\n user-select: all;\r\n word-break: break-all;\r\n color: hsl(var(--text-secondary));\r\n }\r\n</style>\r\n","<!-- @style-escape: widget-intentional. -->\r\n<script module lang=\"ts\">\r\n import { createDebouncedAnnouncer } from '@getmicdrop/svelte-components/a11y';\r\n\r\n // Event renders desktopContent() in BOTH the desktop (`hidden md:grid`) and\r\n // mobile (`md:hidden`) containers at once, so every TicketCard exists 2–3× in\r\n // the DOM simultaneously. On `main` each copy's aria-live region lived inside a\r\n // CSS-hidden subtree (not in the accessibility tree), so exactly one copy\r\n // spoke; routing every copy through the always-live singleton announce()\r\n // region made all of them speak — a single \"+\" click announced 2–3×. The\r\n // canonical fix is createDebouncedAnnouncer (\"prevent spam during rapid\r\n // updates\") held at MODULE scope, so all instances share one debouncer and the\r\n // identical same-tick calls coalesce into one announcement.\r\n //\r\n // Keyed by the composed message via a plain string-keyed cache (not a Map —\r\n // this is a module-scope lookup, never reactive state, so SvelteMap would be\r\n // the wrong tool). One debouncer per distinct message: identical text (the\r\n // duplicate DOM copies of ONE ticket) shares a debouncer and collapses, while\r\n // two DIFFERENT tickets — whose messages differ by name/count — each get their\r\n // own and both still announce.\r\n const QTY_ANNOUNCE_DEBOUNCE_MS = 200;\r\n const qtyAnnouncers: Record<\r\n string,\r\n ReturnType<typeof createDebouncedAnnouncer>\r\n > = Object.create(null);\r\n function announceQuantity(message: string) {\r\n const debounced = (qtyAnnouncers[message] ??= createDebouncedAnnouncer(\r\n QTY_ANNOUNCE_DEBOUNCE_MS\r\n ));\r\n debounced(message, { politeness: 'polite' });\r\n }\r\n</script>\r\n\r\n<script lang=\"ts\">\r\n import { defaultLabels } from '$lib/public-calendar-flow/i18n/labels.js';\r\n import {\r\n AddIcon,\r\n SubtractIcon,\r\n } from '@getmicdrop/svelte-components/primitives/Icons/phosphor/index.js';\r\n import {\r\n Badge,\r\n Button,\r\n Heading,\r\n Input,\r\n Text,\r\n toTicketId,\r\n formatCurrency,\r\n triggerHaptic,\r\n } from '@getmicdrop/svelte-components';\r\n import type { TicketId } from '@getmicdrop/svelte-components';\r\n import { toUSD } from '@getmicdrop/svelte-components';\r\n import { formatPriceOrFree } from '$lib/core';\r\n import ScarcityBadge from '../../components/ScarcityBadge.svelte';\r\n import type {\r\n TicketTypeData,\r\n ScarcityLevel,\r\n } from '$lib/public-calendar-flow/types';\r\n import {\r\n getScarcityLevel,\r\n getScarcityText,\r\n formatSmartSalesDate,\r\n DURATION,\r\n } from '$lib/public-calendar-flow/defaults';\r\n\r\n interface Props {\r\n ticket: TicketTypeData;\r\n quantity: number;\r\n onQuantityChange: (_ticketId: TicketId, _quantity: number) => void;\r\n donationAmount?: string;\r\n onDonationChange?: (_ticketId: TicketId, _amount: string) => void;\r\n isRevealedByPromo?: boolean;\r\n isDiscountedByPromo?: boolean;\r\n discountedPrice?: number | null;\r\n labels?: Record<string, string>;\r\n }\r\n\r\n let {\r\n ticket,\r\n quantity,\r\n onQuantityChange,\r\n donationAmount = '',\r\n onDonationChange,\r\n isRevealedByPromo = false,\r\n isDiscountedByPromo = false,\r\n discountedPrice = null,\r\n labels = defaultLabels,\r\n }: Props = $props();\r\n\r\n // --- State detection ---\r\n let isDonation = $derived(ticket.isDonation || ticket.ticketType === 2);\r\n let isSoldOut = $derived(\r\n ticket.status === 'sold_out' ||\r\n ticket.quantityAvailable === 0 ||\r\n // The minimum-per-order can't be met within what a buyer may actually take\r\n // (limited by remaining availability AND maxPerOrder) — un-purchasable, so\r\n // treat it as sold out rather than letting the 0->minPerOrder jump build an\r\n // oversold or below-minimum cart that dead-ends at \"Payment failed\".\r\n ticket.minPerOrder >\r\n Math.min(ticket.maxPerOrder, ticket.quantityAvailable)\r\n );\r\n let isComingSoon = $derived(ticket.status === 'coming_soon');\r\n let isSalesEnded = $derived(ticket.status === 'sales_ended');\r\n let isDisabled = $derived(isSoldOut || isComingSoon || isSalesEnded);\r\n\r\n let scarcityLevel: ScarcityLevel = $derived(\r\n getScarcityLevel(ticket.quantityAvailable, ticket.quantityTotal)\r\n );\r\n let scarcityText = $derived(\r\n getScarcityText(scarcityLevel, ticket.quantityAvailable, 'ticket')\r\n );\r\n\r\n // Donation validation\r\n let donationValue = $derived(parseFloat(donationAmount) || 0);\r\n let donationError = $derived(\r\n isDonation && donationAmount !== '' && donationValue < 1\r\n ? 'Minimum $1.00'\r\n : ''\r\n );\r\n let isDonationValid = $derived(\r\n !isDonation || (donationAmount !== '' && donationValue >= 1)\r\n );\r\n\r\n let canDecrement = $derived(quantity > 0);\r\n let canIncrement = $derived(\r\n !isDisabled &&\r\n quantity < ticket.maxPerOrder &&\r\n quantity < ticket.quantityAvailable &&\r\n isDonationValid\r\n );\r\n\r\n function decrement() {\r\n if (canDecrement) {\r\n // If decrementing would go below minimum, jump to 0 (remove from cart)\r\n const newQty = quantity - 1;\r\n onQuantityChange(\r\n toTicketId(ticket.id),\r\n newQty < ticket.minPerOrder ? 0 : newQty\r\n );\r\n triggerHaptic('light');\r\n }\r\n }\r\n\r\n function increment() {\r\n if (canIncrement) {\r\n // If at 0, jump to minimum purchase quantity — but clamp to real bounds so\r\n // the jump can never overshoot remaining availability or maxPerOrder.\r\n const target = quantity === 0 ? ticket.minPerOrder : quantity + 1;\r\n const newQty = Math.min(\r\n target,\r\n ticket.maxPerOrder,\r\n ticket.quantityAvailable\r\n );\r\n onQuantityChange(toTicketId(ticket.id), newQty);\r\n triggerHaptic('light');\r\n }\r\n }\r\n\r\n // Writable derived: tracks the donationAmount prop, while local edits (the\r\n // bind:value below) override until the prop next changes — the same\r\n // prop-sync the old $state + $effect pair performed, without the effect.\r\n let donationInputValue = $derived(donationAmount);\r\n\r\n // Push local changes upstream\r\n function syncDonation() {\r\n if (donationInputValue !== donationAmount) {\r\n onDonationChange?.(toTicketId(ticket.id), donationInputValue);\r\n }\r\n }\r\n\r\n // Price display — show total inclusive of fees (matching production TicketBlock.svelte).\r\n // A missing wire price stays null so formatPriceOrFree renders an em-dash, never\r\n // \"Free\" (null + fee would coerce to 0 → \"Free\") — mf#2383 / vc#619.\r\n let totalPrice = $derived(\r\n isDonation\r\n ? 0\r\n : ticket.price == null\r\n ? null\r\n : ticket.price + (ticket.price === 0 ? 0 : ticket.fee)\r\n );\r\n let priceDisplay = $derived(\r\n isDonation ? '' : formatPriceOrFree(totalPrice, labels)\r\n );\r\n let feeCaption = $derived(\r\n !isDonation && ticket.fee > 0 && ticket.price > 0\r\n ? `incl. ${formatCurrency(toUSD(ticket.fee))} ${labels.fee || 'fee'}`\r\n : ''\r\n );\r\n // What the buyer actually pays once the promo is applied. A promo that takes\r\n // the ticket to $0 reads as the free label, not \"$0.00\" — the same\r\n // zero-amount rendering every other surface uses.\r\n let discountedTotal = $derived(\r\n discountedPrice === null || discountedPrice === undefined\r\n ? null\r\n : discountedPrice + (discountedPrice === 0 ? 0 : ticket.fee)\r\n );\r\n let discountedIsFree = $derived(\r\n discountedTotal !== null && discountedTotal <= 0\r\n );\r\n\r\n // Sales start display for coming soon tickets\r\n let salesStartDisplay = $derived(\r\n isComingSoon && ticket.salesStartDate\r\n ? `Sales start ${formatSmartSalesDate(ticket.salesStartDate)}`\r\n : isComingSoon\r\n ? 'Coming soon'\r\n : ''\r\n );\r\n\r\n // Announce the selected quantity to screen readers on CHANGE only — never on\r\n // mount (Event mounts both responsive ticket trees, so a mount-time announce\r\n // would flood the singleton announcer with every ticket's initial value).\r\n let qtyAnnounceReady = false;\r\n $effect(() => {\r\n const q = quantity;\r\n if (!qtyAnnounceReady) {\r\n qtyAnnounceReady = true;\r\n return;\r\n }\r\n // Announce ticket name + quantity — the same string the qty-display\r\n // aria-label assembles — so a screen-reader user on a multi-ticket event can\r\n // tell WHICH ticket changed; a bare number can't. Routed through the\r\n // module-scoped debounced announcer so the duplicate responsive-tree copies\r\n // of this ticket coalesce into exactly one announcement per change.\r\n announceQuantity(\r\n `${ticket.name} ${labels.quantityNoun || 'quantity'}: ${q}`\r\n );\r\n });\r\n</script>\r\n\r\n<article\r\n class=\"ticket-card rounded-lg border p-4 transition-all\"\r\n class:disabled-ticket={isDisabled}\r\n class:revealed={isRevealedByPromo && !isDisabled}\r\n style=\"transition-duration: {DURATION.normal}ms;\"\r\n>\r\n <div class=\"vc-flex-between-start gap-4\">\r\n <!-- Ticket info -->\r\n <div class=\"flex-1 min-w-0\">\r\n <div class=\"flex-row-2 flex-wrap\">\r\n <Heading level={4} size=\"sm\" weight=\"semibold\">\r\n {ticket.name}\r\n </Heading>\r\n {#if isSoldOut}\r\n <Badge variant=\"error\">{labels.soldOut || 'Sold out'}</Badge>\r\n {:else if isSalesEnded}\r\n <Badge variant=\"neutral\">Sales ended</Badge>\r\n {:else if isRevealedByPromo}\r\n <Badge variant=\"success\">Unlocked</Badge>\r\n {:else if isDiscountedByPromo}\r\n <Badge variant=\"green\">Discount applied</Badge>\r\n {:else if scarcityText && !isComingSoon}\r\n <ScarcityBadge\r\n remaining={ticket.quantityAvailable}\r\n total={ticket.quantityTotal}\r\n context=\"ticket\"\r\n />\r\n {/if}\r\n </div>\r\n\r\n {#if ticket.description}\r\n <div class=\"mt-1\">\r\n <Text size=\"xs\" color=\"muted\" class=\"block line-clamp-2\">\r\n {ticket.description}\r\n </Text>\r\n </div>\r\n {/if}\r\n\r\n <!-- Price row -->\r\n <div class=\"flex-row-2 mt-2\">\r\n {#if isDonation}\r\n <!-- Donation: $ input -->\r\n <div class=\"donation-input-wrapper\" oninput={syncDonation}>\r\n <Input\r\n label=\"Donation amount\"\r\n size=\"md\"\r\n type=\"text\"\r\n placeholder=\"0.00\"\r\n bind:value={donationInputValue}\r\n disabled={isDisabled}\r\n errorText={donationError}\r\n color={donationError ? 'red' : 'base'}\r\n />\r\n </div>\r\n {:else if isDiscountedByPromo && discountedIsFree}\r\n <!-- Promo took the ticket to $0: the buyer reads exactly \"Free\". No\r\n strikethrough, no original price — the same single word the\r\n natively-free ticket beside it renders. -->\r\n <span class=\"price-lg text-color-primary\"\r\n >{formatPriceOrFree(discountedTotal ?? 0, labels)}</span\r\n >\r\n {:else if isDiscountedByPromo && discountedTotal !== null}\r\n <!-- Discounted: strikethrough original total + discounted total (both inclusive of fee) -->\r\n <span class=\"price-strikethrough\"\r\n >{formatPriceOrFree(\r\n Number.isFinite(totalPrice) ? totalPrice : 0,\r\n labels\r\n )}</span\r\n >\r\n <span class=\"price-discounted\"\r\n >{formatPriceOrFree(\r\n Number.isFinite(discountedTotal) ? discountedTotal : 0,\r\n labels\r\n )}</span\r\n >\r\n {#if feeCaption}\r\n <span class=\"price-fee\">{feeCaption}</span>\r\n {/if}\r\n {:else if isComingSoon}\r\n <!-- Coming soon: show price dimmed -->\r\n <span class=\"price-lg text-color-muted\">{priceDisplay}</span>\r\n {:else}\r\n <!-- Standard price -->\r\n <span class=\"price-lg text-color-primary\">{priceDisplay}</span>\r\n {#if feeCaption}\r\n <span class=\"price-fee\">{feeCaption}</span>\r\n {/if}\r\n {/if}\r\n </div>\r\n\r\n <!-- Coming soon / sales ended message -->\r\n {#if salesStartDisplay}\r\n <div class=\"mt-1.5\">\r\n <Text size=\"xs\" color=\"muted\" class=\"block\">\r\n {salesStartDisplay}\r\n </Text>\r\n </div>\r\n {/if}\r\n </div>\r\n\r\n <!-- Quantity controls -->\r\n <div class=\"flex items-center quantity-selector\">\r\n {#if isSoldOut || isComingSoon || isSalesEnded}\r\n <!-- No controls for coming soon / sales ended -->\r\n {:else}\r\n <Button\r\n variant=\"alternative\"\r\n size=\"icon-lg\"\r\n onclick={decrement}\r\n disabled={!canDecrement}\r\n aria-label=\"{labels.decrease ||\r\n 'Decrease'} {ticket.name} {labels.quantityNoun || 'quantity'}\"\r\n >\r\n <SubtractIcon size=\"16\" />\r\n </Button>\r\n\r\n <span\r\n class=\"qty-display type-subheading\"\r\n aria-label=\"{ticket.name} {labels.quantityNoun ||\r\n 'quantity'}: {quantity}\"\r\n >\r\n {quantity}\r\n </span>\r\n\r\n <Button\r\n variant=\"alternative\"\r\n size=\"icon-lg\"\r\n onclick={increment}\r\n disabled={!canIncrement}\r\n aria-label=\"{labels.increase ||\r\n 'Increase'} {ticket.name} {labels.quantityNoun || 'quantity'}\"\r\n >\r\n <AddIcon size=\"16\" />\r\n </Button>\r\n {/if}\r\n </div>\r\n </div>\r\n</article>\r\n\r\n<style>\r\n /* Card states using HSL CSS variables (matching TicketBlock.svelte) */\r\n .ticket-card {\r\n border-color: hsl(var(--stroke-secondary, 220 13% 91%));\r\n background-color: hsl(var(--ts-card-bg, var(--bg-primary, 0 0% 100%)));\r\n }\r\n\r\n .ticket-card.revealed {\r\n border-color: hsl(var(--accent-success) / 50%);\r\n background-color: hsl(var(--accent-success) / 8%);\r\n }\r\n\r\n .ticket-card.disabled-ticket {\r\n opacity: 0.5;\r\n }\r\n\r\n /* Quantity selector */\r\n .quantity-selector {\r\n gap: 0.5rem;\r\n user-select: none;\r\n }\r\n\r\n .qty-display {\r\n min-width: 2rem;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: hsl(var(--text-primary, 222 47% 11%));\r\n user-select: none;\r\n }\r\n\r\n /* Discounted price green text */\r\n .price-discounted {\r\n /* stylelint-disable micdrop/no-raw-text-values -- discounted-price emphasis 0.875rem/600 — no type-* role is 0.875rem@600; keep exact weight on this buyer-money price pending role-vs-keep decision issue 500 */\r\n font-size: 0.875rem;\r\n line-height: 1.25rem;\r\n font-weight: 600;\r\n /* stylelint-enable micdrop/no-raw-text-values */\r\n color: hsl(var(--accent-success)); /* green-600 */\r\n }\r\n\r\n /* Donation input wrapper */\r\n .donation-input-wrapper {\r\n min-width: 10rem;\r\n }\r\n\r\n :global([data-theme='dark']) .ticket-card {\r\n border-color: hsl(var(--stroke-secondary, 215 19% 35%));\r\n background-color: hsl(var(--ts-card-bg, var(--bg-primary, 222 47% 11%)));\r\n }\r\n\r\n :global([data-theme='dark']) .ticket-card.revealed {\r\n border-color: hsl(var(--accent-success)); /* green-700 */\r\n background-color: hsl(var(--accent-success));\r\n }\r\n\r\n :global([data-theme='dark']) .qty-display {\r\n color: hsl(var(--text-primary, 0 0% 100%));\r\n }\r\n</style>\r\n","<!-- @style-escape: widget-intentional. -->\r\n<script lang=\"ts\">\r\n import { defaultLabels } from '$lib/public-calendar-flow/i18n/labels.js';\r\n import { CalendarIcon } from '@getmicdrop/svelte-components/primitives/Icons/phosphor/index.js';\r\n import {\r\n Badge,\r\n Button,\r\n Card,\r\n Heading,\r\n Text,\r\n } from '@getmicdrop/svelte-components';\r\n import { announce } from '@getmicdrop/svelte-components/a11y';\r\n import { ClockIcon } from '@getmicdrop/svelte-components/primitives/Icons/phosphor/index.js';\r\n import ScarcityBadge from '../../components/ScarcityBadge.svelte';\r\n import { formatPriceOrFree } from '$lib/core';\r\n import type {\r\n EventData,\r\n OrderTotals,\r\n CtaConfig,\r\n ScarcityLevel,\r\n } from '$lib/public-calendar-flow/types';\r\n import {\r\n getCtaConfig,\r\n getPriceDisplay,\r\n getScarcityLevel,\r\n getScarcityText,\r\n formatBrowseDate,\r\n formatEventTime,\r\n DURATION,\r\n } from '$lib/public-calendar-flow/defaults';\r\n import OrderSummary from './OrderSummary.svelte';\r\n\r\n interface Props {\r\n event: EventData;\r\n orderTotals: OrderTotals;\r\n hasSelectedTickets: boolean;\r\n onCheckout: () => void;\r\n promoApplied?: boolean;\r\n /**\r\n * Waitlist gating (decision #3). When `gated` (and the event is sold out /\r\n * disabled), the widget presents \"Join Waitlist\" instead of a dead disabled\r\n * button — but ONLY when `waitlistEnabled`. All default false so a normal\r\n * event renders exactly as before.\r\n */\r\n gated?: boolean;\r\n waitlistEnabled?: boolean;\r\n onJoinWaitlist?: () => void;\r\n /** Non-blocking tokenized-link failure notice shown near the CTA. */\r\n waitlistLinkError?: string;\r\n onDismissWaitlistLinkError?: () => void;\r\n /**\r\n * Live event-status flip (SSE). When `unavailable`, the operator canceled/\r\n * postponed the event while the buyer is viewing it: the CTA becomes a\r\n * disabled \"unavailable\" state so no cart/checkout can be started, before the\r\n * buyer reaches the checkout floor. `unavailableReason` (\"postponed\" vs the\r\n * canceled/hidden default) tunes the copy. Default-off.\r\n */\r\n unavailable?: boolean;\r\n unavailableReason?: string;\r\n labels?: Record<string, string>;\r\n /** BCP-47 locale tag (e.g. 'es', 'es-MX'). Undefined → en-US. */\r\n locale?: string;\r\n }\r\n\r\n let {\r\n event,\r\n orderTotals,\r\n hasSelectedTickets,\r\n onCheckout,\r\n promoApplied = false,\r\n gated = false,\r\n waitlistEnabled = false,\r\n onJoinWaitlist = () => {},\r\n waitlistLinkError = '',\r\n onDismissWaitlistLinkError = () => {},\r\n unavailable = false,\r\n unavailableReason = '',\r\n labels = defaultLabels,\r\n locale = undefined,\r\n }: Props = $props();\r\n\r\n // Present the waitlist \"Join\" CTA only when the event is gated (freed\r\n // inventory reserved for tokenized waitlisters) AND the organizer enabled the\r\n // waitlist. Anything else falls through to the existing on-sale / disabled\r\n // branches unchanged.\r\n let showWaitlistCta = $derived(gated && waitlistEnabled);\r\n\r\n let ctaConfig: CtaConfig = $derived(getCtaConfig(event));\r\n let priceDisplay = $derived(getPriceDisplay(event));\r\n let scarcityLevel: ScarcityLevel = $derived(\r\n getScarcityLevel(event.totalTicketsRemaining, event.totalTicketsCapacity)\r\n );\r\n let scarcityText = $derived(\r\n getScarcityText(scarcityLevel, event.totalTicketsRemaining, 'event')\r\n );\r\n let isFreeEvent = $derived(\r\n event.tickets\r\n .filter(t => t.status === 'on_sale' && !t.isHidden)\r\n .every(t => t.price === 0)\r\n );\r\n\r\n function scrollToTickets() {\r\n if (typeof document === 'undefined') return;\r\n const section = document.getElementById('ticket-section');\r\n if (section) {\r\n section.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n }\r\n\r\n // Announce the non-blocking tokenized-link failure to screen readers without\r\n // duplicating the visible notice in the DOM.\r\n $effect(() => {\r\n if (waitlistLinkError) announce(waitlistLinkError, { politeness: 'polite' });\r\n });\r\n</script>\r\n\r\n<!--\r\n\tBookingWidget: Airbnb-style sticky sidebar card.\r\n\tTransitions from \"informational\" to \"cart\" mode with no skeleton placeholders.\r\n\tPassword protection is handled at the widget/browse level, not on the event page.\r\n-->\r\n{#if unavailable}\r\n <!-- LIVE-UNAVAILABLE STATE: the operator canceled/postponed the event while\r\n the buyer was on the page (SSE flip). Present a disabled CTA so no cart or\r\n checkout can be started; the banner in Event.svelte explains why. Takes\r\n precedence over every other branch (waitlist, on-sale, sold-out). -->\r\n <Card\r\n border\r\n padding={false}\r\n class=\"rounded-xl shadow-lg overflow-hidden bg-surface-secondary\"\r\n >\r\n <div class=\"p-5 space-y-3\">\r\n <Heading weight=\"semibold\">\r\n {unavailableReason === 'postponed'\r\n ? labels.eventPostponed || 'Event postponed'\r\n : labels.eventUnavailable || 'Event unavailable'}\r\n </Heading>\r\n <Button variant=\"default\" size=\"lg\" class=\"w-full\" disabled>\r\n {labels.unavailable || 'Unavailable'}\r\n </Button>\r\n </div>\r\n </Card>\r\n{:else if showWaitlistCta}\r\n <!-- WAITLIST-GATED STATE (decision #3): present sold-out + join waitlist even\r\n when tickets are technically available, so freed seats route to notified\r\n waitlisters via their tokenized links. -->\r\n <Card\r\n border\r\n padding={false}\r\n class=\"rounded-xl shadow-lg overflow-hidden bg-surface-secondary\"\r\n >\r\n <div class=\"p-5 space-y-3\">\r\n <Heading weight=\"semibold\">\r\n {labels.soldOut || 'Sold out'}\r\n </Heading>\r\n <Button\r\n variant=\"default\"\r\n size=\"lg\"\r\n class=\"w-full\"\r\n onclick={onJoinWaitlist}\r\n >\r\n <ClockIcon size=\"16\" class=\"mr-1.5\" />\r\n {labels.joinWaitlist || 'Join waitlist'}\r\n </Button>\r\n <div\r\n class=\"flex items-center justify-center gap-1.5 text-color-tertiary\"\r\n aria-hidden=\"true\"\r\n >\r\n <Text size=\"xs\" color=\"secondary\" class=\"block\">\r\n {labels.getNotifiedWhenAvailable ||\r\n 'Get notified when tickets are available'}\r\n </Text>\r\n </div>\r\n {#if waitlistLinkError}\r\n <div class=\"waitlist-link-notice\">\r\n <Text size=\"xs\" color=\"secondary\" class=\"block\">\r\n {waitlistLinkError}\r\n </Text>\r\n <Button\r\n variant=\"link\"\r\n size=\"xs\"\r\n class=\"self-start px-0\"\r\n onclick={onDismissWaitlistLinkError}\r\n >\r\n {labels.dismiss || 'Dismiss'}\r\n </Button>\r\n </div>\r\n {/if}\r\n </div>\r\n </Card>\r\n{:else if event.status === 'on_sale' && hasSelectedTickets}\r\n <!--\r\n\t\tFILLED STATE: cap the card to the viewport so a long order summary\r\n\t\tcan't push the Checkout button below the fold. Only the ticket-line\r\n\t\tlist scrolls; the totals block and Checkout button stay pinned, so\r\n\t\tthe buyer always sees Subtotal / Fees / Tax / Total and what they're\r\n\t\tabout to click.\r\n\t-->\r\n <Card\r\n border\r\n padding={false}\r\n class=\"flex flex-col max-h-[calc(100vh-1.5rem)] rounded-xl shadow-lg overflow-hidden bg-surface-secondary\"\r\n >\r\n <div\r\n class=\"flex flex-col flex-1 min-h-0\"\r\n style=\"animation: widget-fade-in {DURATION.normal}ms var(--ease-smooth);\"\r\n >\r\n <!-- Scrollable: ticket-line items only -->\r\n <div class=\"p-5 pb-3 flex-1 overflow-y-auto min-h-0\">\r\n <OrderSummary {orderTotals} mode=\"lines\" {labels} />\r\n </div>\r\n <!-- Pinned: totals + Checkout button -->\r\n <div class=\"px-5 pt-3 pb-5 shrink-0 border-t border-default space-y-3\">\r\n <OrderSummary {orderTotals} mode=\"totals\" {labels} />\r\n <Button variant=\"default\" size=\"lg\" class=\"w-full\" onclick={onCheckout}>\r\n {#if isFreeEvent}\r\n {event.isRegistrationEvent\r\n ? labels.reserveASpot || 'Reserve a spot'\r\n : labels.getTickets || 'Get tickets'} &middot; Free\r\n {:else}\r\n {labels.checkout || 'Checkout'} &middot; {formatPriceOrFree(\r\n orderTotals.total,\r\n labels\r\n )}\r\n {/if}\r\n </Button>\r\n </div>\r\n </div>\r\n </Card>\r\n{:else}\r\n <Card\r\n border\r\n padding={false}\r\n class=\"rounded-xl shadow-lg overflow-hidden bg-surface-secondary\"\r\n >\r\n <div class=\"p-5\">\r\n {#if event.status === 'on_sale' && !ctaConfig.disabled}\r\n <!-- ON SALE: informational empty state (filled state handled in the sibling branch above) -->\r\n <div class=\"space-y-3\">\r\n <!-- Price display -->\r\n <div class=\"flex items-baseline gap-2\">\r\n {#if priceDisplay}\r\n <span class=\"price-lg text-color-primary type-heading\">\r\n {priceDisplay}\r\n </span>\r\n {:else if isFreeEvent}\r\n <span class=\"price-lg text-color-primary type-heading\">\r\n Free\r\n </span>\r\n {/if}\r\n </div>\r\n\r\n <!-- Event date/time summary (compact) -->\r\n <div class=\"flex items-center gap-2\">\r\n <CalendarIcon size=\"16\" class=\"shrink-0 icon-muted\" />\r\n {#if event.displayStartTime !== false}\r\n <span class=\"body-sm\"\r\n >{formatBrowseDate(event.startDateTime, event.timezone, locale)} &middot;\r\n {formatEventTime(\r\n event.startDateTime,\r\n event.timezone,\r\n locale\r\n )}</span\r\n >\r\n {:else}\r\n <span class=\"body-sm\"\r\n >{formatBrowseDate(\r\n event.startDateTime,\r\n event.timezone,\r\n locale\r\n )}</span\r\n >\r\n {/if}\r\n </div>\r\n\r\n <!-- Scarcity badge -->\r\n {#if scarcityText}\r\n <div>\r\n <ScarcityBadge\r\n remaining={event.totalTicketsRemaining}\r\n total={event.totalTicketsCapacity}\r\n context=\"event\"\r\n />\r\n </div>\r\n {/if}\r\n\r\n <!-- Promo applied badge -->\r\n {#if promoApplied}\r\n <div>\r\n <Badge variant=\"success\"\r\n >{labels.promoApplied || 'Promo applied'}</Badge\r\n >\r\n </div>\r\n {/if}\r\n\r\n <!-- Divider -->\r\n <div class=\"divider\"></div>\r\n\r\n <!-- CTA: scroll to ticket section. Label + disabled state come from\r\n\t\t\t\t ctaConfig so this widget agrees with MobileCta in all states\r\n\t\t\t\t (incl. on_sale events whose startDateTime is in the past). -->\r\n <Button\r\n variant=\"default\"\r\n size=\"lg\"\r\n class=\"w-full\"\r\n onclick={scrollToTickets}\r\n >\r\n {ctaConfig.text}\r\n </Button>\r\n </div>\r\n {:else}\r\n <!-- DISABLED STATES: cancelled, past, sales_ended, coming_soon, sold_out,\r\n\t\t\t plus on_sale events that ctaConfig has computed as disabled\r\n\t\t\t (e.g. all tickets soldOut, sales window closed). One branch,\r\n\t\t\t one source of truth — ctaConfig.text / .disabled / .reason. -->\r\n <div class=\"space-y-3\">\r\n <Heading weight=\"semibold\">\r\n {ctaConfig.text}\r\n </Heading>\r\n {#if ctaConfig.reason}\r\n <Text size=\"sm\" color=\"secondary\" class=\"block\">\r\n {ctaConfig.reason}\r\n </Text>\r\n {/if}\r\n <Button variant=\"default\" size=\"lg\" class=\"w-full\" disabled={true}>\r\n {ctaConfig.text}\r\n </Button>\r\n </div>\r\n {/if}\r\n </div>\r\n </Card>\r\n{/if}\r\n\r\n<style>\r\n .waitlist-link-notice {\r\n margin-top: 0.25rem;\r\n padding: 0.625rem 0.75rem;\r\n border-radius: 0.5rem;\r\n background-color: hsl(var(--bg-secondary, 210 20% 98%));\r\n border: 1px solid hsl(var(--border-default, 220 13% 91%));\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.375rem;\r\n }\r\n\r\n @keyframes widget-fade-in {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-4px);\r\n }\r\n\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n\r\n /*\r\n\t * The filled-state card uses max-h-[calc(100vh-1.5rem)] inline (see Card\r\n\t * class above) to cap height to the viewport so the Checkout button\r\n\t * never falls below the fold when many ticket types are selected.\r\n\t * 1.5rem reserves a bottom gap; sticky parent is top-0 so no top offset.\r\n\t */\r\n</style>\r\n","<script lang=\"ts\">\r\n import { RichTextContent, Section } from '@getmicdrop/svelte-components';\r\n\r\n interface Props {\r\n description: string;\r\n labels?: Record<string, string>;\r\n }\r\n\r\n let { description, labels: _labels = {} }: Props = $props();\r\n</script>\r\n\r\n<Section title=\"About\" titleSize=\"lg\" gap=\"3\">\r\n <div class=\"tone-secondary\">\r\n <RichTextContent html={description} />\r\n </div>\r\n</Section>\r\n","<script lang=\"ts\">\r\n\timport { Avatar, Card, Heading, Section } from '@getmicdrop/svelte-components';\r\n\timport type { PerformerData } from '$lib/public-calendar-flow/types';\r\n\r\n\tinterface Props {\r\n\t\tperformers: PerformerData[];\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { performers, labels: _labels = {}, }: Props = $props();\r\n</script>\r\n\r\n{#if performers.length > 0}\r\n\t<Section title=\"Performers\" titleSize=\"lg\" gap=\"4\">\r\n\t\t<div class=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\r\n\t\t\t{#each performers as performer (performer.id)}\r\n\t\t\t\t<Card padding={false} class=\"flex items-center gap-3 p-3 bg-surface-secondary shadow-none\">\r\n\t\t\t\t\t<Avatar\r\n\t\t\t\t\t\tsrc={performer.profileImage || ''}\r\n\t\t\t\t\t\talt={performer.displayName}\r\n\t\t\t\t\t\tinitials={performer.displayName.charAt(0)}\r\n\t\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\t\tclass=\"shrink-0 rounded-lg\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<div class=\"min-w-0\">\r\n\t\t\t\t\t\t<Heading level={4} size=\"sm\" weight=\"semibold\" class=\"truncate\">\r\n\t\t\t\t\t\t\t{performer.displayName}\r\n\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</Card>\r\n\t\t\t{/each}\r\n\t\t</div>\r\n\t</Section>\r\n{/if}\r\n\r\n","<script lang=\"ts\">\r\n\timport { Accordion, AccordionItem, Section } from '@getmicdrop/svelte-components';\r\n\timport type { FAQItem } from '$lib/public-calendar-flow/types';\r\n\r\n\tinterface Props {\r\n\t\tfaqs: FAQItem[];\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { faqs, labels: _labels = {}, }: Props = $props();\r\n</script>\r\n\r\n{#if faqs.length > 0}\r\n\t<Section title=\"Frequently asked questions\" titleSize=\"lg\" gap=\"3\">\r\n\t\t<Accordion flush variant=\"ghost\">\r\n\t\t\t{#each faqs as faq (faq.question)}\r\n\t\t\t\t<AccordionItem>\r\n\t\t\t\t\t{#snippet header()}{faq.question}{/snippet}\r\n\t\t\t\t\t{faq.answer}\r\n\t\t\t\t</AccordionItem>\r\n\t\t\t{/each}\r\n\t\t</Accordion>\r\n\t</Section>\r\n{/if}\r\n","<!-- @style-escape: widget-intentional. -->\r\n<script lang=\"ts\">\r\n import { defaultLabels } from '$lib/public-calendar-flow/i18n/labels.js';\r\n import {\r\n Button,\r\n Text,\r\n triggerHaptic,\r\n layers,\r\n } from '@getmicdrop/svelte-components';\r\n import { ClockIcon } from '@getmicdrop/svelte-components/primitives/Icons/phosphor/index.js';\r\n import { isActivationKey } from '@getmicdrop/svelte-components/a11y';\r\n import type {\r\n EventData,\r\n OrderTotals,\r\n CtaConfig,\r\n } from '$lib/public-calendar-flow/types';\r\n import { formatPriceOrFree } from '$lib/core';\r\n import {\r\n getCtaConfig,\r\n getPriceDisplay,\r\n } from '$lib/public-calendar-flow/defaults';\r\n import OrderSummary from './OrderSummary.svelte';\r\n\r\n interface Props {\r\n event: EventData;\r\n orderTotals: OrderTotals;\r\n hasSelectedTickets: boolean;\r\n onCheckout: () => void;\r\n /**\r\n * Waitlist gating (decision #3). When `gated` + `waitlistEnabled`, the peek\r\n * bar shows \"Join Waitlist\" instead of the checkout/scroll CTA. Defaults\r\n * keep a normal event byte-identical.\r\n */\r\n gated?: boolean;\r\n waitlistEnabled?: boolean;\r\n onJoinWaitlist?: () => void;\r\n /**\r\n * Live event-status flip (SSE). When `unavailable`, the operator canceled/\r\n * postponed the event mid-view: the mobile bar shows a disabled \"unavailable\"\r\n * CTA so the drawer can't open and checkout can't start. Default-off.\r\n */\r\n unavailable?: boolean;\r\n labels?: Record<string, string>;\r\n }\r\n\r\n let {\r\n event,\r\n orderTotals,\r\n hasSelectedTickets,\r\n onCheckout,\r\n gated = false,\r\n waitlistEnabled = false,\r\n onJoinWaitlist = () => {},\r\n unavailable = false,\r\n labels = defaultLabels,\r\n }: Props = $props();\r\n\r\n let showWaitlistCta = $derived(gated && waitlistEnabled);\r\n\r\n let ctaConfig: CtaConfig = $derived(getCtaConfig(event));\r\n let priceDisplay = $derived(getPriceDisplay(event));\r\n let totalTicketCount = $derived(\r\n orderTotals.lines.reduce((sum, l) => sum + l.quantity, 0)\r\n );\r\n let isFreeEvent = $derived(\r\n event.tickets\r\n .filter(t => t.status === 'on_sale' && !t.isHidden)\r\n .every(t => t.price === 0)\r\n );\r\n\r\n // State machine: 'peek' = collapsed bar, 'open' = full drawer. ONE\r\n // physical element resizes between the two — no second flyout.\r\n let mode = $state<'peek' | 'open'>('peek');\r\n\r\n // Fire a medium-strength haptic tick on every snap transition. Android\r\n // users feel it; iOS silently no-ops. Skip the first effect run so we\r\n // don't pulse on mount.\r\n let prevModeForHaptic: 'peek' | 'open' | null = $state(null);\r\n $effect(() => {\r\n if (prevModeForHaptic !== null && prevModeForHaptic !== mode) {\r\n triggerHaptic('medium');\r\n }\r\n prevModeForHaptic = mode;\r\n });\r\n\r\n // Defensive: if tickets get removed while the drawer is open, snap\r\n // closed. Otherwise the sheet stays at stale openHeight with no body\r\n // to render, showing a white block over the page.\r\n $effect(() => {\r\n if (!hasSelectedTickets) mode = 'peek';\r\n });\r\n\r\n const PEEK_H = 80;\r\n let bodyEl = $state<HTMLDivElement | null>(null);\r\n let viewportH = $state(800);\r\n $effect(() => {\r\n if (typeof window === 'undefined') return;\r\n const sync = () => (viewportH = window.innerHeight);\r\n sync();\r\n window.addEventListener('resize', sync, { passive: true });\r\n return () => window.removeEventListener('resize', sync);\r\n });\r\n\r\n // Measure intrinsic content height — drawer snaps to fit-content, no whitespace.\r\n let openHeight = $state(0);\r\n $effect(() => {\r\n if (!bodyEl || typeof ResizeObserver === 'undefined') return;\r\n function measure() {\r\n if (!bodyEl) return;\r\n // bodyEl has flex:1 1 auto so its scrollHeight equals its stretched\r\n // box height (= what we're trying to compute). Feedback loop. Use\r\n // firstElementChild's offsetHeight — OrderSummary's intrinsic size.\r\n const inner = bodyEl.firstElementChild as HTMLElement | null;\r\n const innerH = inner?.offsetHeight ?? 0;\r\n const total = PEEK_H + innerH + 76 + 8;\r\n openHeight = Math.min(total, Math.round(viewportH * 0.9));\r\n }\r\n measure();\r\n const ro = new ResizeObserver(measure);\r\n const inner = bodyEl.firstElementChild as HTMLElement | null;\r\n if (inner) ro.observe(inner);\r\n return () => ro.disconnect();\r\n });\r\n\r\n function scrollToTickets() {\r\n if (typeof document === 'undefined') return;\r\n const sections = document.querySelectorAll<HTMLElement>('#ticket-section');\r\n for (const section of sections) {\r\n if (section.offsetParent !== null) {\r\n section.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n return;\r\n }\r\n }\r\n }\r\n\r\n function handleBarClick() {\r\n if (ctaConfig.disabled) return;\r\n if (!hasSelectedTickets) {\r\n scrollToTickets();\r\n return;\r\n }\r\n // Toggle: peek → open, open → peek. Tapping the grab area / bar at\r\n // either state moves to the other state.\r\n mode = mode === 'peek' ? 'open' : 'peek';\r\n }\r\n\r\n function handleBarKeydown(e: KeyboardEvent) {\r\n // Only the bar itself toggles on keyboard — a keydown that bubbled up from\r\n // the inner checkout button belongs to that button, not the toggle bar.\r\n if (e.target !== e.currentTarget) return;\r\n if (isActivationKey(e)) {\r\n e.preventDefault();\r\n handleBarClick();\r\n }\r\n }\r\n\r\n function handleDrawerCheckout() {\r\n mode = 'peek';\r\n onCheckout();\r\n }\r\n\r\n function closeDrawer() {\r\n mode = 'peek';\r\n }\r\n\r\n function ticketsLabel(n: number): string {\r\n return n === 1 ? labels.ticket || 'ticket' : labels.tickets || 'tickets';\r\n }\r\n\r\n // === Drag mechanics — vaul-inspired =====================================\r\n //\r\n // Pointer Events instead of touch-only (mouse + touch + stylus, one path).\r\n // Track positions over a short rolling window to compute velocity for\r\n // \"flick\" detection. Resistance (rubber-band) beyond bounds. Body\r\n // scroll-vs-drag arbitration: at body scrollTop>0, drag is just body\r\n // scroll; only when at top do downward drags close the drawer.\r\n let dragStartY = 0;\r\n let dragStartHeight = 0;\r\n let dragDeltaY = $state(0);\r\n let isDragging = $state(false);\r\n let pointerId = $state<number | null>(null);\r\n let dragTarget = $state<HTMLElement | null>(null);\r\n\r\n // Rolling history for velocity: [{y, t}, ...]. Keep last ~5 samples.\r\n let history: { y: number; t: number }[] = [];\r\n\r\n function recordSample(y: number) {\r\n const t = performance.now();\r\n history.push({ y, t });\r\n // Keep ~120ms of history — enough to compute a stable velocity\r\n // without overweighting old samples.\r\n while (history.length > 0 && t - history[0].t > 120) history.shift();\r\n }\r\n\r\n function computeVelocity(): number {\r\n if (history.length < 2) return 0;\r\n const first = history[0];\r\n const last = history[history.length - 1];\r\n const dt = last.t - first.t;\r\n if (dt <= 0) return 0;\r\n return (last.y - first.y) / dt; // px/ms — positive = downward\r\n }\r\n\r\n function handlePointerDown(e: PointerEvent) {\r\n // Drag is disabled entirely when there's nothing to expand to —\r\n // otherwise the user can pull the sheet up against undefined open\r\n // state and the layout breaks.\r\n if (!hasSelectedTickets) return;\r\n // Only primary pointer; don't capture if click landed on a button.\r\n if (e.button !== 0 && e.pointerType === 'mouse') return;\r\n const t = e.target as HTMLElement | null;\r\n if (t?.closest('button, a, input, select, textarea, [role=\"button\"]'))\r\n return;\r\n\r\n // Body scroll arbitration: if user starts the drag inside the\r\n // drawer body AND the body is scrolled past 0, this gesture is\r\n // body-scroll, not drawer-drag. Let it pass through.\r\n const body = bodyEl;\r\n if (mode === 'open' && body && body.contains(t) && body.scrollTop > 0)\r\n return;\r\n\r\n dragStartY = e.clientY;\r\n dragStartHeight = mode === 'open' ? openHeight : PEEK_H;\r\n dragDeltaY = 0;\r\n history = [];\r\n recordSample(e.clientY);\r\n isDragging = true;\r\n pointerId = e.pointerId;\r\n dragTarget = e.currentTarget as HTMLElement;\r\n dragTarget.setPointerCapture(e.pointerId);\r\n }\r\n\r\n function handlePointerMove(e: PointerEvent) {\r\n if (!isDragging || e.pointerId !== pointerId) return;\r\n const dy = e.clientY - dragStartY;\r\n recordSample(e.clientY);\r\n // Rubber-band with a HARD CAP so the sheet can never exceed a tiny\r\n // fraction past the bounds. Without the cap, even a small multiplier\r\n // lets enthusiastic drags reach absurd heights — which then \"slowly\r\n // retracts\" on release looks broken.\r\n const RUBBER_RESISTANCE = 0.15;\r\n const MAX_OVERSHOOT = 24;\r\n const rawHeight = dragStartHeight - dy;\r\n let finalHeight: number;\r\n if (rawHeight > openHeight) {\r\n const overshoot = Math.min(\r\n (rawHeight - openHeight) * RUBBER_RESISTANCE,\r\n MAX_OVERSHOOT\r\n );\r\n finalHeight = openHeight + overshoot;\r\n } else if (rawHeight < PEEK_H) {\r\n const overshoot = Math.min(\r\n (PEEK_H - rawHeight) * RUBBER_RESISTANCE,\r\n MAX_OVERSHOOT\r\n );\r\n finalHeight = PEEK_H - overshoot;\r\n } else {\r\n finalHeight = rawHeight;\r\n }\r\n dragDeltaY = dragStartHeight - finalHeight;\r\n }\r\n\r\n function handlePointerUp(e: PointerEvent) {\r\n if (!isDragging || e.pointerId !== pointerId) return;\r\n const v = computeVelocity(); // px/ms, downward positive\r\n const dy = dragDeltaY;\r\n\r\n // Snap decision combines distance + velocity. Strong flick beats\r\n // distance threshold; slow drag needs to clear midpoint.\r\n const FLICK_VELOCITY = 0.5; // px/ms — calibrated to typical \"flick\"\r\n const POSITION_THRESHOLD = (openHeight - PEEK_H) / 2;\r\n\r\n if (mode === 'open') {\r\n // Started open. Snap closed if dragged down enough OR flicked down.\r\n if (dy > POSITION_THRESHOLD || v > FLICK_VELOCITY) {\r\n mode = 'peek';\r\n }\r\n } else {\r\n // Started peek. Snap open if dragged up enough OR flicked up.\r\n const upward = -dy;\r\n if (upward > 40 || v < -FLICK_VELOCITY) {\r\n mode = 'open';\r\n }\r\n }\r\n\r\n isDragging = false;\r\n dragDeltaY = 0;\r\n history = [];\r\n dragTarget?.releasePointerCapture(e.pointerId);\r\n dragTarget = null;\r\n pointerId = null;\r\n }\r\n\r\n function handlePointerCancel(_e: PointerEvent) {\r\n isDragging = false;\r\n dragDeltaY = 0;\r\n history = [];\r\n if (dragTarget && pointerId !== null) {\r\n try {\r\n dragTarget.releasePointerCapture(pointerId);\r\n } catch {\r\n // pointer already released\r\n }\r\n }\r\n dragTarget = null;\r\n pointerId = null;\r\n }\r\n\r\n // Live sheet height: while dragging, follow the finger; on release,\r\n // snap to mode via CSS transition.\r\n let liveHeight = $derived.by(() => {\r\n if (!hasSelectedTickets) return PEEK_H;\r\n if (isDragging) return Math.max(PEEK_H * 0.5, dragStartHeight - dragDeltaY);\r\n return mode === 'open' ? openHeight : PEEK_H;\r\n });\r\n\r\n // Body reveal progress 0→1 as sheet grows peek→open. Used to fade the\r\n // order summary in during drag, not just on release.\r\n let revealProgress = $derived.by(() => {\r\n const range = Math.max(1, openHeight - PEEK_H);\r\n return Math.min(1, Math.max(0, (liveHeight - PEEK_H) / range));\r\n });\r\n</script>\r\n\r\n{#if unavailable}\r\n <!-- LIVE-UNAVAILABLE MOBILE BAR: operator canceled/postponed the event mid-view\r\n (SSE flip). Disabled CTA, no draggable sheet — nothing can be added to a\r\n cart. The banner in Event.svelte explains why; the checkout floor backs it. -->\r\n <!-- @modal-escape: fixed mobile CTA bar; matches the sibling draggable sheet's placement. -->\r\n <div\r\n class=\"peek-sheet md:hidden fixed bottom-0 left-0 right-0 bg-bg-primary\"\r\n style:z-index={layers.modal}\r\n style:height=\"{PEEK_H}px\"\r\n style=\"padding-bottom: env(safe-area-inset-bottom, 0);\"\r\n role=\"region\"\r\n aria-label={labels.eventUnavailable || 'Event unavailable'}\r\n >\r\n <div class=\"peek-sheet__top\">\r\n <div class=\"peek-sheet__row flex items-center justify-between gap-3 px-4\">\r\n <div class=\"flex-1 min-w-0\">\r\n <Text size=\"sm\" weight=\"semibold\" class=\"block\">\r\n {labels.eventUnavailable || 'Event unavailable'}\r\n </Text>\r\n </div>\r\n <Button variant=\"default\" size=\"lg\" disabled class=\"shrink-0 min-w-32\">\r\n {labels.unavailable || 'Unavailable'}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n{:else if showWaitlistCta}\r\n <!-- WAITLIST-GATED MOBILE BAR (decision #3): a simple fixed peek bar with a\r\n \"Join Waitlist\" CTA. No draggable order-summary sheet — a gated event has\r\n no selectable tickets, so there is nothing to expand to. -->\r\n <!-- @modal-escape: fixed mobile CTA bar; matches the sibling draggable sheet's placement. -->\r\n <div\r\n class=\"peek-sheet md:hidden fixed bottom-0 left-0 right-0 bg-bg-primary\"\r\n style:z-index={layers.modal}\r\n style:height=\"{PEEK_H}px\"\r\n style=\"padding-bottom: env(safe-area-inset-bottom, 0);\"\r\n role=\"region\"\r\n aria-label={labels.joinWaitlist || 'Join waitlist'}\r\n >\r\n <div class=\"peek-sheet__top\">\r\n <div class=\"peek-sheet__row flex items-center justify-between gap-3 px-4\">\r\n <div class=\"flex-1 min-w-0\">\r\n <Text size=\"sm\" weight=\"semibold\" class=\"block\">\r\n {labels.soldOut || 'Sold out'}\r\n </Text>\r\n </div>\r\n <Button\r\n variant=\"default\"\r\n size=\"lg\"\r\n onclick={onJoinWaitlist}\r\n class=\"shrink-0 min-w-32\"\r\n >\r\n <ClockIcon size=\"16\" class=\"mr-1.5\" />\r\n {labels.joinWaitlist || 'Join waitlist'}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n{:else}\r\n <!-- Backdrop scrim. Tap-to-close. -->\r\n {#if hasSelectedTickets}\r\n <!-- Decorative backdrop scrim: tap-outside-to-close is a pointer-only\r\n convenience. It carries no keyboard handler because keyboard users close\r\n the sheet by activating the toggle bar (role=\"button\", Enter/Space →\r\n collapse), so a focusable scrim would only add a redundant tab stop.\r\n The Svelte compiler does not flag it (the aria-hidden attribute is\r\n present), so no svelte-ignore is needed. -->\r\n <!-- @onclick-non-interactive-escape: backdrop scrim, pointer-only convenience.\r\n The prose above was already correct and still did not exempt anything — the\r\n rule reads THIS token, never a comment that looks like a declaration, so the\r\n scrim kept firing as a keyboard trap it is not. The scrim's only job is\r\n `closeDrawer` (mode → 'peek'), and that job has a real keyboard path in this\r\n same file: the toggle bar below carries a static role=\"button\", tabindex=\"0\"\r\n and onkeydown={handleBarKeydown}, which routes Enter AND the physical Space\r\n bar (isActivationKey) into handleBarClick → collapse. Driven proof in\r\n `e2e/a11y-keyboard-reach.e2e.js`. Making the scrim focusable would add a\r\n redundant tab stop in front of the sheet, not accessibility. -->\r\n <div\r\n class=\"md:hidden fixed inset-0 transition-all duration-300 {mode ===\r\n 'open'\r\n ? 'ease-smooth'\r\n : 'ease-exit'}\"\r\n style:z-index={layers.overlay}\r\n class:scrim-open={mode === 'open'}\r\n class:scrim-closed={mode === 'peek'}\r\n onclick={closeDrawer}\r\n aria-hidden={mode !== 'open'}\r\n ></div>\r\n {/if}\r\n\r\n <!-- Unified sheet. -->\r\n <!-- @tokens-px-escape: `env(safe-area-inset-bottom, 0px)` fallback requires literal px per CSS spec; iOS safe-area can't be expressed as a token. -->\r\n <!-- @modal-escape: bespoke draggable bottom-sheet (pointer-drag peek/open gesture, live height) — SC Modal cannot express a drag-to-dismiss sheet -->\r\n <div\r\n class=\"peek-sheet md:hidden fixed bottom-0 left-0 right-0 bg-bg-primary\"\r\n class:peek-sheet--dragging={isDragging}\r\n class:peek-sheet--open={mode === 'open'}\r\n style:z-index={layers.modal}\r\n style:height=\"{liveHeight}px\"\r\n style=\"padding-bottom: env(safe-area-inset-bottom, 0);\"\r\n role=\"dialog\"\r\n tabindex=\"-1\"\r\n aria-modal={mode === 'open'}\r\n aria-label={labels.orderSummary || 'Order summary'}\r\n onpointerdown={handlePointerDown}\r\n onpointermove={handlePointerMove}\r\n onpointerup={handlePointerUp}\r\n onpointercancel={handlePointerCancel}\r\n >\r\n <!-- Top region — tap-to-open + drag handle. Fixed PEEK_H tall so the\r\n\t content row's vertical position is identical regardless of whether\r\n\t the grab handle is present. Grab handle is absolute-positioned so\r\n\t it doesn't push the row down. -->\r\n <!-- Toggle bar: a STATIC role=\"button\" (not a conditional expression) so the\r\n keyboard-trap detector and screen readers both see a genuine, statically-\r\n provable button. handleBarKeydown activates on Enter AND Space\r\n (isActivationKey). With no tickets selected the bar is an inert container\r\n (the {:else} branch) with no tab stop. -->\r\n {#if hasSelectedTickets}\r\n <div\r\n class=\"peek-sheet__top\"\r\n onclick={handleBarClick}\r\n onkeydown={handleBarKeydown}\r\n role=\"button\"\r\n tabindex=\"0\"\r\n aria-expanded={mode === 'open'}\r\n aria-label={mode === 'open'\r\n ? labels.collapseOrderSummary || 'Collapse order summary'\r\n : labels.expandOrderSummary || 'Expand order summary'}\r\n >\r\n {@render barContent()}\r\n </div>\r\n {:else}\r\n <div class=\"peek-sheet__top\">\r\n {@render barContent()}\r\n </div>\r\n {/if}\r\n\r\n {#snippet barContent()}\r\n {#if hasSelectedTickets}\r\n <div class=\"peek-sheet__grab\" aria-hidden=\"true\">\r\n <div class=\"peek-sheet__pill\"></div>\r\n </div>\r\n {/if}\r\n\r\n <div class=\"peek-sheet__row flex items-center justify-between gap-3 px-4\">\r\n <div class=\"flex-1 min-w-0\">\r\n {#if hasSelectedTickets}\r\n <Text size=\"sm\" weight=\"semibold\" class=\"tabular-nums\">\r\n {totalTicketCount}\r\n {ticketsLabel(totalTicketCount)} &middot;\r\n {formatPriceOrFree(orderTotals.total, labels)}\r\n </Text>\r\n {:else if priceDisplay && !ctaConfig.disabled}\r\n <Text size=\"sm\" weight=\"semibold\" class=\"block\">\r\n {priceDisplay}\r\n </Text>\r\n {:else if ctaConfig.reason}\r\n <Text size=\"xs\" color=\"muted\" class=\"block\">\r\n {ctaConfig.reason}\r\n </Text>\r\n {/if}\r\n </div>\r\n\r\n {#if mode === 'peek'}\r\n <Button\r\n variant=\"default\"\r\n size=\"lg\"\r\n disabled={ctaConfig.disabled}\r\n onclick={e => {\r\n e.stopPropagation();\r\n if (ctaConfig.disabled) return;\r\n if (hasSelectedTickets) {\r\n onCheckout();\r\n } else {\r\n scrollToTickets();\r\n }\r\n }}\r\n class=\"shrink-0 min-w-32\"\r\n >\r\n {#if hasSelectedTickets}\r\n {labels.checkout || 'Checkout'}\r\n {:else}\r\n {ctaConfig.text}\r\n {/if}\r\n </Button>\r\n {/if}\r\n </div>\r\n {/snippet}\r\n\r\n {#if hasSelectedTickets}\r\n <div\r\n bind:this={bodyEl}\r\n class=\"peek-sheet__body\"\r\n style:opacity={revealProgress}\r\n >\r\n <OrderSummary {orderTotals} {labels} />\r\n </div>\r\n\r\n {#if mode === 'open'}\r\n <div class=\"peek-sheet__actions\">\r\n <Button\r\n variant=\"default\"\r\n size=\"lg\"\r\n class=\"w-full\"\r\n disabled={ctaConfig.disabled}\r\n onclick={handleDrawerCheckout}\r\n >\r\n {#if isFreeEvent}\r\n {event.isRegistrationEvent\r\n ? labels.reserveASpot || 'Reserve a spot'\r\n : labels.getTickets || 'Get tickets'}\r\n {:else}\r\n {labels.checkout || 'Checkout'} &middot; {formatPriceOrFree(\r\n orderTotals.total,\r\n labels\r\n )}\r\n {/if}\r\n </Button>\r\n </div>\r\n {/if}\r\n {/if}\r\n </div>\r\n{/if}\r\n\r\n<style>\r\n .peek-sheet {\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n\r\n /* Apple-smooth spring token (canonical) */\r\n transition: height var(--motion-slow) var(--ease-smooth);\r\n will-change: height;\r\n box-shadow:\r\n 0 -8px 24px color-mix(in srgb, hsl(var(--overlay-bg)) 8%, transparent),\r\n 0 -2px 6px color-mix(in srgb, hsl(var(--overlay-bg)) 6%, transparent);\r\n\r\n /* touch-action: pan-y on the sheet root lets pointer events fire for\r\n\t\t * vertical drag while still allowing native scroll inside .peek-sheet__body\r\n\t\t * which has its own touch-action setting. */\r\n touch-action: pan-y;\r\n }\r\n\r\n .peek-sheet--open {\r\n border-top-left-radius: 24px;\r\n border-top-right-radius: 24px;\r\n box-shadow:\r\n 0 -8px 32px color-mix(in srgb, hsl(var(--overlay-bg)) 12%, transparent),\r\n 0 -2px 8px color-mix(in srgb, hsl(var(--overlay-bg)) 8%, transparent);\r\n }\r\n\r\n .peek-sheet--dragging {\r\n transition: none;\r\n }\r\n\r\n .peek-sheet__top {\r\n position: relative;\r\n flex-shrink: 0;\r\n height: 80px; /* matches PEEK_H — bar content vertical position\r\n\t\t * never shifts based on grab-handle presence. */\r\n\r\n /* Grab area: forbid all default browser gestures so pointer events\r\n\t\t * arrive cleanly. iOS specifically requires `none` here or it tries\r\n\t\t * to consume the drag for page-scroll. */\r\n touch-action: none;\r\n user-select: none;\r\n }\r\n\r\n .peek-sheet__row {\r\n height: 100%;\r\n }\r\n\r\n /* Grab handle absolute-positioned at the top center so it never shifts\r\n\t * the row content vertically. Only renders when hasSelectedTickets. */\r\n .peek-sheet__grab {\r\n position: absolute;\r\n top: 8px;\r\n left: 0;\r\n right: 0;\r\n display: flex;\r\n justify-content: center;\r\n pointer-events: none;\r\n }\r\n\r\n .peek-sheet__pill {\r\n width: 40px;\r\n height: 4px;\r\n border-radius: 9999px;\r\n background-color: color-mix(\r\n in srgb,\r\n hsl(var(--text-tertiary)) 30%,\r\n transparent\r\n );\r\n }\r\n\r\n .peek-sheet__body {\r\n flex: 1 1 auto;\r\n min-height: 0;\r\n overflow-y: auto;\r\n overscroll-behavior: contain;\r\n padding: 0 16px 8px;\r\n\r\n /* Body opacity is driven from JS (revealProgress) so it tracks the\r\n\t\t * sheet height during drag instead of only fading in on release.\r\n\t\t * Body owns its own pan-y so internal touch-scroll works without\r\n\t\t * interfering with the sheet's drag handler. */\r\n touch-action: pan-y;\r\n }\r\n\r\n /* Smooth fade when not actively dragging (release/tap-open animations). */\r\n .peek-sheet:not(.peek-sheet--dragging) .peek-sheet__body {\r\n transition: opacity var(--motion-normal) var(--ease-smooth);\r\n }\r\n\r\n .peek-sheet__actions {\r\n flex-shrink: 0;\r\n padding: 12px 16px 16px;\r\n border-top: 1px solid;\r\n border-color: color-mix(\r\n in srgb,\r\n var(--color-stroke-secondary) 50%,\r\n transparent\r\n );\r\n }\r\n\r\n .scrim-closed {\r\n opacity: 0;\r\n pointer-events: none;\r\n background-color: transparent;\r\n backdrop-filter: none;\r\n }\r\n\r\n .scrim-open {\r\n opacity: 1;\r\n pointer-events: auto;\r\n background-color: color-mix(\r\n in srgb,\r\n hsl(var(--overlay-bg)) 35%,\r\n transparent\r\n );\r\n backdrop-filter: blur(8px);\r\n }\r\n</style>\r\n","<!-- @style-escape: widget-intentional. -->\r\n<script module lang=\"ts\">\r\n import { createDebouncedAnnouncer } from '@getmicdrop/svelte-components/a11y';\r\n\r\n // Event renders desktopContent() in BOTH the desktop (`hidden md:grid`) and\r\n // mobile (`md:hidden`) containers at once, so this PromoCodeInput — and the\r\n // hint $effect below — exists twice in the DOM, both instances sharing the one\r\n // promoState.hint prop. On `main` the hint was a `<p role=\"status\"\r\n // aria-live=\"polite\">` living inside the CSS-hidden duplicate subtree, so\r\n // exactly one copy was in the accessibility tree and spoke once; routing it\r\n // through the always-live singleton announce() made both copies speak (a single\r\n // Apply announced 2×). Same canonical fix as TicketCard/ScarcityBadge: a\r\n // module-scoped createDebouncedAnnouncer held here (so every instance shares\r\n // it) and keyed by the composed message via a plain string-keyed dict (not a\r\n // Map — this is a module-scope lookup, never reactive state). Identical text\r\n // (the duplicate DOM copies of ONE hint) shares a debouncer and collapses into\r\n // exactly one announcement.\r\n const PROMO_HINT_DEBOUNCE_MS = 200;\r\n const hintAnnouncers: Record<\r\n string,\r\n ReturnType<typeof createDebouncedAnnouncer>\r\n > = Object.create(null);\r\n function announcePromoHint(message: string) {\r\n const debounced = (hintAnnouncers[message] ??= createDebouncedAnnouncer(\r\n PROMO_HINT_DEBOUNCE_MS\r\n ));\r\n debounced(message, { politeness: 'polite' });\r\n }\r\n</script>\r\n\r\n<script lang=\"ts\">\r\n import { defaultLabels } from '$lib/public-calendar-flow/i18n/labels.js';\r\n\timport { Input, Button } from '@getmicdrop/svelte-components';\r\n\timport type { PromoCodeState } from '$lib/public-calendar-flow/types';\r\n\timport { DURATION } from '$lib/public-calendar-flow/defaults';\r\n\r\n\tinterface Props {\r\n\t\tpromoState: PromoCodeState;\r\n\t\tonApply: (_code: string) => void;\r\n\t\tonRemove: () => void;\r\n\t\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { promoState, onApply, onRemove, labels = defaultLabels, }: Props = $props();\r\n\r\n\tlet isExpanded = $state(false);\r\n\tlet inputValue = $state('');\r\n\r\n\tfunction handleApply() {\r\n\t\tconst trimmed = inputValue.trim();\r\n\t\tif (!trimmed) return;\r\n\t\tonApply(trimmed);\r\n\t}\r\n\r\n\tfunction handleRemove() {\r\n\t\tinputValue = '';\r\n\t\tonRemove();\r\n\t}\r\n\r\n\tfunction handleKeydown(e: KeyboardEvent) {\r\n\t\tif (e.key === 'Enter') {\r\n\t\t\te.preventDefault();\r\n\t\t\thandleApply();\r\n\t\t}\r\n\t}\r\n\r\n\t// Auto-expand when promo is applied (e.g. on restore)\r\n\tlet shouldExpand = $derived(promoState.isApplied || isExpanded);\r\n\r\n\t// Announce the success hint to screen readers without a second DOM copy —\r\n\t// routed through the module-scoped debounced announcer so the two duplicate\r\n\t// responsive-tree copies of this component coalesce into ONE announcement.\r\n\t$effect(() => {\r\n\t\tif (promoState.hint) announcePromoHint(promoState.hint);\r\n\t});\r\n</script>\r\n\r\n<div class=\"promo-section\" role=\"group\" aria-labelledby=\"promo-label\">\r\n\t<span id=\"promo-label\" class=\"sr-only\">Promo code entry</span>\r\n\t{#if !shouldExpand}\r\n\t\t<Button variant=\"link\" onclick={() => (isExpanded = true)}>\r\n\t\t\t{labels.havePromoCode || 'Have a promo code?'}\r\n\t\t</Button>\r\n\t{:else}\r\n\t\t<div\r\n\t\t\tclass=\"space-y-2\"\r\n\t\t\tstyle=\"animation: promo-slide-in {DURATION.normal}ms var(--ease-smooth);\"\r\n\t\t>\r\n\t\t\t<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n\t\t\t<!-- a11y-keep: keyboard-capture wrapper — onkeydown only forwards Enter to\r\n\t\t\t apply the promo (a keyboard convenience, not a click target); the real\r\n\t\t\t controls inside (Input, Apply/Remove buttons) are natively focusable,\r\n\t\t\t and the wrapping group carries role=\"group\" above. -->\r\n\t\t\t<div class=\"promo-input-wrapper\" onkeydown={handleKeydown}>\r\n\t\t\t\t<div class=\"flex-1\">\r\n\t\t\t\t\t<Input\r\n\t\t\t\t\t\tlabel={labels.promoCode || 'Promo code'}\r\n\t\t\t\t\t\tplaceholder={labels.enterCode || 'Enter code'}\r\n\t\t\t\t\t\tsize=\"md\"\r\n\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\tbind:value={inputValue}\r\n\t\t\t\t\t\tdisabled={promoState.isApplied || promoState.isValidating}\r\n\t\t\t\t\t\terrorText={promoState.error || ''}\r\n\t\t\t\t\t\tcolor={promoState.error ? 'red' : 'base'}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t{#if promoState.isApplied}\r\n\t\t\t\t\t<div class=\"self-start mt-5\">\r\n\t\t\t\t\t\t<Button variant=\"outline\" onclick={handleRemove} class=\"h-10\" aria-label={labels.removePromoCode || 'Remove promo code'}>\r\n\t\t\t\t\t\t\t{labels.remove || 'Remove'}\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t{:else}\r\n\t\t\t\t\t<div class=\"self-start mt-5\">\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tonclick={handleApply}\r\n\t\t\t\t\t\t\tdisabled={promoState.isValidating || !inputValue.trim()}\r\n\t\t\t\t\t\t\tclass=\"h-10\"\r\n\t\t\t\t\t\t\taria-label={promoState.isValidating ? (labels.checkingPromoCode || 'Checking promo code') : (labels.applyPromoCode || 'Apply promo code')}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{promoState.isValidating ? (labels.checking || 'Checking...') : (labels.apply || 'Apply')}\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t{/if}\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- Success hint -->\r\n\t\t\t{#if promoState.hint}\r\n\t\t\t\t<p class=\"promo-message success body-sm\">{promoState.hint}</p>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\t{/if}\r\n</div>\r\n\r\n<style>\r\n\t.promo-section {\r\n\t\tmargin-top: 1rem;\r\n\t}\r\n\r\n\t.promo-input-wrapper {\r\n\t\tdisplay: flex;\r\n\t\tgap: 0.5rem;\r\n\t\talign-items: flex-start;\r\n\t}\r\n\r\n\t.promo-message {\r\n\t\tmargin-top: 0.5rem;\r\n\t}\r\n\r\n\t.promo-message.success {\r\n\t\tcolor: hsl(var(--accent-success)); /* green-600 */\r\n\t}\r\n\r\n\t@keyframes promo-slide-in {\r\n\t\tfrom {\r\n\t\t\topacity: 0;\r\n\t\t\ttransform: translateY(-4px);\r\n\t\t}\r\n\r\n\t\tto {\r\n\t\t\topacity: 1;\r\n\t\t\ttransform: translateY(0);\r\n\t\t}\r\n\t}\r\n</style>","<script lang=\"ts\">\r\n import { Button, Text } from '@getmicdrop/svelte-components';\r\n import { isActivationKey } from '@getmicdrop/svelte-components/a11y';\r\n import { SvelteMap } from 'svelte/reactivity';\r\n import type { EventData } from '$lib/public-calendar-flow/types';\r\n import {\r\n formatFullDateCompact,\r\n formatEventTime,\r\n formatBrowseDate,\r\n } from '$lib/public-calendar-flow/defaults';\r\n import { defaultLabels } from '$lib/public-calendar-flow/i18n/labels.js';\r\n\r\n interface Props {\r\n event: EventData;\r\n onShowtimeClick?: (_occurrence: { id: number; slug: string }) => void;\r\n labels?: Record<string, string>;\r\n /** BCP-47 locale tag (e.g. 'es', 'es-MX'). Undefined → en-US. */\r\n locale?: string;\r\n }\r\n\r\n let {\r\n event,\r\n onShowtimeClick = undefined,\r\n labels = defaultLabels,\r\n locale = undefined,\r\n }: Props = $props();\r\n\r\n // --- Data ---\r\n type GroupedOccurrences = {\r\n dateLabel: string;\r\n dateKey: string;\r\n occurrences: NonNullable<EventData['seriesOccurrences']>;\r\n }[];\r\n\r\n let groupedOccurrences: GroupedOccurrences = $derived(\r\n (() => {\r\n if (!event.seriesOccurrences) return [];\r\n const groups: Map<\r\n string,\r\n {\r\n dateLabel: string;\r\n occurrences: NonNullable<EventData['seriesOccurrences']>;\r\n }\r\n > = new SvelteMap();\r\n for (const occ of event.seriesOccurrences) {\r\n const dateKey = formatBrowseDate(\r\n occ.startDateTime,\r\n event.timezone,\r\n locale\r\n );\r\n if (!groups.has(dateKey)) {\r\n groups.set(dateKey, {\r\n dateLabel: formatFullDateCompact(\r\n occ.startDateTime,\r\n event.timezone,\r\n locale\r\n ),\r\n occurrences: [],\r\n });\r\n }\r\n groups.get(dateKey)!.occurrences.push(occ);\r\n }\r\n return [...groups.entries()].map(([dateKey, g]) => ({\r\n dateKey,\r\n dateLabel: g.dateLabel,\r\n occurrences: g.occurrences,\r\n }));\r\n })()\r\n );\r\n\r\n function handleShowtimeClick(occ: { id: number; slug: string }) {\r\n if (onShowtimeClick) {\r\n onShowtimeClick(occ);\r\n }\r\n }\r\n</script>\r\n\r\n<section>\r\n <div class=\"space-y-4\">\r\n {#each groupedOccurrences as group (group.dateKey)}\r\n <div>\r\n <div class=\"mb-2\">\r\n <Text size=\"sm\" weight=\"semibold\" class=\"block\">\r\n {group.dateLabel}\r\n </Text>\r\n </div>\r\n <div class=\"space-y-2\">\r\n {#each group.occurrences as occ (occ.id)}\r\n <div\r\n class=\"row-a border-default bg-surface-primary hover:bg-surface-secondary\"\r\n class:row-disabled={occ.ctaDisabled}\r\n onclick={() =>\r\n !occ.ctaDisabled &&\r\n handleShowtimeClick({ id: occ.id, slug: occ.slug })}\r\n onkeydown={(e: KeyboardEvent) => {\r\n // isActivationKey honours Enter AND the physical Space bar\r\n // (via e.code === 'Space'); preventDefault stops Space scroll.\r\n if (occ.ctaDisabled || !isActivationKey(e)) return;\r\n e.preventDefault();\r\n handleShowtimeClick({ id: occ.id, slug: occ.slug });\r\n }}\r\n tabindex={occ.ctaDisabled ? -1 : 0}\r\n role=\"button\"\r\n >\r\n <div class=\"showtime-main\">\r\n {#if event.displayStartTime !== false}\r\n <Text size=\"sm\" weight=\"medium\">\r\n {formatEventTime(occ.startDateTime, event.timezone, locale)}\r\n </Text>\r\n {/if}\r\n <!-- `venueName` is set ONLY for an occurrence the API has\r\n flagged as moved off the series' master venue/room, so this\r\n block is silent for every ordinary showtime — no noise when\r\n nothing changed. When it IS set the attendee has to notice,\r\n hence the explicit \"different location\" lead-in rather than\r\n a bare venue name they'd read as decoration. -->\r\n {#if occ.venueName}\r\n <div class=\"showtime-venue\">\r\n <Text\r\n size=\"xs\"\r\n weight=\"semibold\"\r\n class=\"showtime-venue-lead block\"\r\n >\r\n {labels.showtimeDifferentLocation ||\r\n 'Different location:'}\r\n {occ.venueName}\r\n </Text>\r\n {#if occ.venueAddress}\r\n <Text size=\"xs\" class=\"showtime-venue-address block\">\r\n {occ.venueAddress}\r\n </Text>\r\n {/if}\r\n </div>\r\n {/if}\r\n </div>\r\n <Button\r\n size=\"sm\"\r\n variant={occ.ctaDisabled ? 'alternative' : 'default'}\r\n disabled={occ.ctaDisabled}\r\n class=\"shrink-0 pointer-events-none\"\r\n >\r\n {occ.ctaText}\r\n </Button>\r\n </div>\r\n {/each}\r\n </div>\r\n </div>\r\n {/each}\r\n </div>\r\n</section>\r\n\r\n<style>\r\n /* === Shared === */\r\n .row-disabled {\r\n opacity: 0.5;\r\n cursor: default;\r\n }\r\n\r\n /* Time + (rare) moved-location note stack in the row's leading column so the\r\n CTA stays vertically centred against the pair. min-width:0 lets a long\r\n venue string wrap instead of forcing the flex row wider than the card. */\r\n .showtime-main {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n gap: 0.125rem;\r\n min-width: 0;\r\n }\r\n\r\n /* Colours are pinned on the <Text> elements themselves, not inherited from\r\n this wrapper: SC's Text sets its own colour, so a parent `color` would be\r\n overridden and the \"moved\" line would render as ordinary body copy. */\r\n .showtime-venue :global(.showtime-venue-lead) {\r\n color: hsl(var(--accent-warning));\r\n }\r\n\r\n .showtime-venue :global(.showtime-venue-address) {\r\n color: hsl(var(--text-secondary));\r\n }\r\n\r\n /* === Design A: Full-width rows === */\r\n .row-a {\r\n width: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 0.75rem;\r\n padding: 0.75rem;\r\n border-radius: 0.5rem;\r\n border-width: 1px;\r\n border-style: solid;\r\n cursor: pointer;\r\n transition-property: all;\r\n transition-timing-function: var(--ease-smooth);\r\n transition-duration: var(--motion-micro);\r\n }\r\n\r\n .row-a:hover:not(.row-disabled) {\r\n border-color: hsl(var(--stroke-primary)); /* gray-300 */\r\n }\r\n\r\n :global([data-theme='dark']) .row-a:hover:not(.row-disabled) {\r\n border-color: hsl(var(--stroke-primary)); /* gray-600 */\r\n }\r\n</style>\r\n","import type { BrowseEvent } from '$lib/browse-widgets/types';\r\nimport type { CollectionEvent } from '$lib/public-calendar-flow/types';\r\nimport { formatDateKey } from '$lib/utils/datetime.js';\r\n\r\n/**\r\n * Map a collection's child events to the canonical `BrowseEvent` shape consumed\r\n * by `groupEventsBySeries` + `toEventCardProps` (the same mapper every other v2\r\n * browse view uses).\r\n *\r\n * This is the SINGLE SOURCE for the mapping: `Event.svelte`'s\r\n * `collectionTeaserGroups` derived calls it, and the guard test drives THIS\r\n * function — there is no hand-copied mirror to drift.\r\n *\r\n * `.date` is the venue-tz calendar-day key (`formatDateKey`), NOT a raw UTC\r\n * `.slice(0, 10)`: it feeds `groupEventsBySeries`' `${seriesId}:${date}` key, so\r\n * a late-night show (9pm PT = next-day 04:00 UTC) stays on its venue day and\r\n * groups with its same-venue-day siblings instead of splitting forward a day.\r\n * Card display is unaffected (cards render `formatBrowseDate`).\r\n *\r\n * @param collectionEvents - collection child events (may be undefined upstream)\r\n * @param timezone - the event's IANA timezone (resolves the venue-local day)\r\n */\r\nexport function collectionEventsToBrowseEvents(\r\n collectionEvents: CollectionEvent[],\r\n timezone: string\r\n): BrowseEvent[] {\r\n return collectionEvents.map<BrowseEvent>(ce => ({\r\n eventID: ce.id,\r\n name: ce.name,\r\n date: formatDateKey(ce.startDateTime, timezone),\r\n startDateTime: ce.startDateTime,\r\n imageUrl: ce.image,\r\n // browse-widgets/types narrows out 'past' (it computes past-ness from\r\n // endDateTime at runtime); coerce to the closest unbookable status the\r\n // canonical union accepts.\r\n status: ce.status === 'past' ? 'sales_ended' : ce.status,\r\n slug: ce.slug,\r\n timeZone: timezone,\r\n ticketsRemaining: ce.ticketsRemaining,\r\n ticketsTotal: ce.ticketsTotal,\r\n }));\r\n}\r\n","<script lang=\"ts\">\r\n // @currency-escape: event price display\r\n import {\r\n Button,\r\n createLogger,\r\n EventCard,\r\n Grid,\r\n Heading,\r\n Text,\r\n toTicketId,\r\n } from '@getmicdrop/svelte-components';\r\n import { announce } from '@getmicdrop/svelte-components/a11y';\r\n import type { TicketId } from '@getmicdrop/svelte-components';\r\n import type {\r\n EventData,\r\n OrderTotals,\r\n PromoCodeState,\r\n } from '$lib/public-calendar-flow/types';\r\n import { createDefaultPromoState } from '$lib/public-calendar-flow/defaults';\r\n import { computeOrderTotals } from '$lib/public-calendar-flow/order-totals';\r\n import { LivePricing } from '$lib/public-calendar-flow/livePricing.svelte';\r\n\r\n import HeroImage from './HeroImage.svelte';\r\n import EventHeader from './EventHeader.svelte';\r\n import TicketCard from './TicketCard.svelte';\r\n import BookingWidget from './BookingWidget.svelte';\r\n import AboutSection from './AboutSection.svelte';\r\n import PerformerGrid from './PerformerGrid.svelte';\r\n import FaqAccordion from './FaqAccordion.svelte';\r\n import MobileCta from './MobileCta.svelte';\r\n import PromoCodeInput from './PromoCodeInput.svelte';\r\n import ShowtimeDesigns from './ShowtimeDesigns.svelte';\r\n import { toEventCardProps } from '$lib/browse-widgets/to-event-card-props';\r\n import { PLACEHOLDER_IMAGE } from '$lib/utils/constants.js';\r\n import { groupEventsBySeries } from '$lib/browse-widgets/utils';\r\n import { collectionEventsToBrowseEvents } from './collection-teasers';\r\n import type { BrowseEvent } from '$lib/browse-widgets/types';\r\n import { getLabelsForLocale } from '$lib/public-calendar-flow/i18n/index.js';\r\n\r\n const logger = createLogger('Event');\r\n\r\n // Production component. Pure event renderer — no mock data, no toggle\r\n // store, no showcase wiring. The showcase harness that used to drive it\r\n // (`ShowcaseEvent.svelte`) was deleted as dead code in #615.\r\n interface Props {\r\n event: EventData;\r\n onCheckout?: (_orderTotals: OrderTotals) => void;\r\n /** Inline failure message shown near the ticket area when the parent's\r\n * checkout hand-off fails (e.g. cart creation rejected). VC surfaces\r\n * failures inline, never as a toast. */\r\n checkoutError?: string;\r\n onPromoApply?: (_code: string) => Promise<PromoCodeState>;\r\n onPromoRemove?: () => void;\r\n onCollectionEventClick?: (_event: {\r\n id?: number | string;\r\n slug: string;\r\n }) => void;\r\n onShowtimeClick?: (_occurrence: { id: number; slug: string }) => void;\r\n /** True only for the series MASTER page (series-home): renders the\r\n * occurrence picker alone, no single date / tickets. A series INSTANCE\r\n * (one occurrence) leaves this false and renders like a normal event —\r\n * its date + tickets — with the picker shown as \"other dates\". */\r\n isSeriesMaster?: boolean;\r\n /**\r\n * Waitlist gating (decisions #3/#22/#36). Threaded from EventPage:\r\n * - `gated`: present sold-out + Join Waitlist to non-members even if\r\n * inventory exists, so freed seats route to tokenized waitlisters.\r\n * - `waitlistEnabled`: organizer turned the waitlist on.\r\n * - `onJoinWaitlist`: open the signup modal (owned by EventPage).\r\n * - `waitlistLinkError` / `onDismissWaitlistLinkError`: non-blocking notice\r\n * for a bad/expired/used tokenized unlock link.\r\n * All optional + default-off so a non-waitlist event renders unchanged.\r\n */\r\n gated?: boolean;\r\n waitlistEnabled?: boolean;\r\n onJoinWaitlist?: () => void;\r\n waitlistLinkError?: string;\r\n onDismissWaitlistLinkError?: () => void;\r\n /**\r\n * Live event-status flip (threaded from EventPage's SSE stream). When\r\n * `unavailable`, the operator has canceled/postponed/unpublished the event\r\n * while the buyer is viewing it: the booking CTAs disable and a banner shows,\r\n * before the buyer ever reaches the checkout floor. `unavailableReason` is the\r\n * raw status action (\"canceled\" | \"postponed\" | \"draft\") for message copy.\r\n * Default-off so a normal event renders unchanged.\r\n */\r\n unavailable?: boolean;\r\n unavailableReason?: string;\r\n labels?: Record<string, string>;\r\n /** BCP-47 locale tag (e.g. 'es', 'es-MX'). Undefined → browser locale → en. */\r\n locale?: string;\r\n }\r\n\r\n let {\r\n event,\r\n onCheckout: onCheckoutProp = undefined,\r\n checkoutError = '',\r\n onPromoApply: onPromoApplyProp = undefined,\r\n onPromoRemove: onPromoRemoveProp = undefined,\r\n onCollectionEventClick: onCollectionEventClickProp = undefined,\r\n onShowtimeClick: onShowtimeClickProp = undefined,\r\n isSeriesMaster = false,\r\n gated = false,\r\n waitlistEnabled = false,\r\n onJoinWaitlist = () => {},\r\n waitlistLinkError = '',\r\n onDismissWaitlistLinkError = () => {},\r\n unavailable = false,\r\n unavailableReason = '',\r\n labels = {},\r\n locale = undefined,\r\n }: Props = $props();\r\n\r\n // When gated, the inline ticket selection is suppressed (a non-member must\r\n // not be able to add freed inventory to a cart) and the booking widgets show\r\n // the Join Waitlist CTA instead. Only active when the organizer enabled the\r\n // waitlist; otherwise gating falls back to the normal sold-out presentation.\r\n let waitlistGated = $derived(gated && waitlistEnabled);\r\n\r\n // The locale-resolved label set — read this, never the raw `labels` prop, so\r\n // this component's OWN copy translates too (its children already receive it).\r\n const mergedLabels = $derived(getLabelsForLocale(locale, labels));\r\n\r\n // Live-flip banner copy. Falls back to sensible English when neither the\r\n // resolved locale bundle nor a host override supplies the string.\r\n let unavailableBanner = $derived(\r\n unavailableReason === 'postponed'\r\n ? mergedLabels.eventPostponedBanner ||\r\n 'This event has been postponed. Ticket sales are paused'\r\n : mergedLabels.eventCanceledBanner ||\r\n 'This event is no longer available for purchase'\r\n );\r\n\r\n // Screen-reader announcements for the inline notices below. Each mirrors the\r\n // reactive gate of its visible element without a duplicate live-region DOM node.\r\n $effect(() => {\r\n if (unavailable) announce(unavailableBanner, { politeness: 'assertive' });\r\n });\r\n $effect(() => {\r\n if (checkoutError) announce(checkoutError, { politeness: 'assertive' });\r\n });\r\n // The waitlist-link failure is announced by BookingWidget on regular events\r\n // (the sidebar is CSS-hidden on mobile, not unmounted), so the inline mobile\r\n // notice does NOT re-announce there — two effects would otherwise hit the\r\n // singleton announcer with the same message. But BookingWidget only mounts\r\n // when !isFullWidth, so on a series-master/collection surface nothing would\r\n // announce the notice; announce it here in exactly — and only — that case.\r\n $effect(() => {\r\n if (isFullWidth && waitlistGated && waitlistLinkError) {\r\n announce(waitlistLinkError, { politeness: 'polite' });\r\n }\r\n });\r\n\r\n // Ticket quantities keyed by ticket ID\r\n let quantities: Record<TicketId, number> = $state({});\r\n\r\n // Promo code state\r\n let promoState = $state<PromoCodeState>(createDefaultPromoState());\r\n\r\n // Donation amounts keyed by ticket ID\r\n let donationAmounts: Record<TicketId, string> = $state({});\r\n\r\n // Live server pricing — the operator-parity loop that prices tax / service\r\n // fee / promo against the real backend as tickets change (not only at\r\n // checkout). Reservation-less, so it holds no inventory (see LivePricing).\r\n const live = new LivePricing();\r\n\r\n // Reset cart-related state when the event identity changes. Covers both\r\n // showcase-mode mock swaps and production navigation between events.\r\n $effect(() => {\r\n const _id = event.id;\r\n quantities = {};\r\n promoState = createDefaultPromoState();\r\n donationAmounts = {};\r\n live.reset();\r\n });\r\n\r\n // Visible tickets (account for promo reveals)\r\n let visibleTickets = $derived(\r\n event.tickets.filter(t => {\r\n if (!t.isHidden) return true;\r\n if (promoState.revealHiddenTickets) return true;\r\n return promoState.revealTicketIds.includes(t.id);\r\n })\r\n );\r\n\r\n // Group tickets by section\r\n let groupedTickets = $derived(\r\n (() => {\r\n const groups: Record<string, typeof visibleTickets> = {};\r\n for (const ticket of visibleTickets) {\r\n const section = ticket.sectionName || '_default';\r\n if (!groups[section]) groups[section] = [];\r\n groups[section].push(ticket);\r\n }\r\n return groups;\r\n })()\r\n );\r\n\r\n let hasMultipleSections = $derived(\r\n Object.keys(groupedTickets).filter(k => k !== '_default').length > 0\r\n );\r\n\r\n // Show tickets for on_sale AND sold_out events (sold out shows them as disabled)\r\n let isOnSale = $derived(event.status === 'on_sale');\r\n let showTicketCards = $derived(\r\n (event.status === 'on_sale' || event.status === 'sold_out') &&\r\n visibleTickets.length > 0\r\n );\r\n\r\n // Calculate order totals (with donation amounts and promo discounts).\r\n // Arithmetic lives in the canonical computeOrderTotals so the widget and\r\n // the checkout fallback can't drift apart on the promo double-count.\r\n let orderTotals: OrderTotals = $derived(\r\n computeOrderTotals(\r\n event.tickets,\r\n quantities,\r\n donationAmounts,\r\n promoState,\r\n event.venue.taxPercentage\r\n )\r\n );\r\n\r\n let hasSelectedTickets = $derived(orderTotals.lines.length > 0);\r\n\r\n // Drive the live server reprice whenever the selection or promo changes. The\r\n // controller debounces + guards order, and no-ops (clears back to the client\r\n // estimate) when nothing is selected.\r\n $effect(() => {\r\n live.schedule({\r\n eventId: event.id,\r\n quantities,\r\n donationAmounts,\r\n promoCode: promoState.isApplied ? promoState.code : '',\r\n });\r\n });\r\n\r\n // What OrderSummary / the booking widgets actually render: the server-priced\r\n // totals once they arrive (authoritative tax / service fee / promo), otherwise\r\n // the instant client estimate. The server subtotal is GROSS (reconstructed in\r\n // buildServerTotalsFromPaymentIntent), so the receipt reconciles with the\r\n // promo line exactly as the client path does. A missing wire price keeps the\r\n // client's dash + hard-block — never overwrite it with a server figure that\r\n // priced around the unpriced line.\r\n let displayTotals: OrderTotals = $derived.by(() => {\r\n const st = live.serverTotals;\r\n if (!st || orderTotals.subtotal === null) return orderTotals;\r\n return {\r\n lines: orderTotals.lines,\r\n subtotal: st.subtotal,\r\n fees: st.fees,\r\n taxes: st.taxes,\r\n total: st.total,\r\n promoDiscount: st.promoDiscount,\r\n giftCardAmount: st.giftCardAmount,\r\n };\r\n });\r\n\r\n // Series occurrences — group by date for same-day shows\r\n let isSeries = $derived(!!event.eventSeriesId);\r\n\r\n // Collection — loose grouping of different events\r\n let isCollection = $derived(!!event.collectionId);\r\n\r\n // Full-width layout mode (no sidebar, no single-date tickets). Used by the\r\n // series MASTER page and collections. A series INSTANCE renders the normal\r\n // sidebar layout (its own date + tickets) plus the occurrence picker.\r\n let isFullWidth = $derived((isSeries && isSeriesMaster) || isCollection);\r\n\r\n // Collection events normalized to the canonical BrowseEvent shape and\r\n // grouped via groupEventsBySeries so EventCard can render them through the\r\n // shared toEventCardProps mapper (same as every other v2 view). The mapping\r\n // (incl. the venue-tz `.date` key) lives in collectionEventsToBrowseEvents so\r\n // the guard test drives the real code, not a hand-copied mirror.\r\n let collectionTeaserGroups = $derived(\r\n groupEventsBySeries(\r\n collectionEventsToBrowseEvents(\r\n event.collectionEvents ?? [],\r\n event.timezone\r\n )\r\n )\r\n );\r\n\r\n function handleCollectionEventClick(clicked: BrowseEvent) {\r\n const out = { id: clicked.eventID, slug: clicked.slug ?? '' };\r\n if (onCollectionEventClickProp) {\r\n onCollectionEventClickProp(out);\r\n } else {\r\n logger.info('Navigate to collection event:', out.slug);\r\n }\r\n }\r\n\r\n // --- Handlers ---\r\n function handleQuantityChange(ticketId: TicketId, qty: number) {\r\n quantities = { ...quantities, [ticketId]: qty };\r\n }\r\n\r\n function handleDonationChange(ticketId: TicketId, amount: string) {\r\n donationAmounts = { ...donationAmounts, [ticketId]: amount };\r\n }\r\n\r\n function handleCheckout() {\r\n if (onCheckoutProp) {\r\n // Hand off the server-priced totals when we have them (checkout re-prices\r\n // its own cart, but this keeps the number the buyer clicked consistent).\r\n onCheckoutProp(displayTotals);\r\n } else {\r\n // Showcase-only fallback (no onCheckoutProp wired). Dev visibility\r\n // only — production delegates to the parent, which owns checkout.\r\n logger.info('Checkout:', orderTotals);\r\n }\r\n }\r\n\r\n // --- Promo handlers ---\r\n function handlePromoApply(code: string) {\r\n if (onPromoApplyProp) {\r\n // Production mode: async API validation\r\n promoState = { ...promoState, isValidating: true, error: '', hint: '' };\r\n onPromoApplyProp(code)\r\n .then(result => {\r\n promoState = result;\r\n })\r\n .catch(() => {\r\n promoState = {\r\n ...createDefaultPromoState(),\r\n code: code.toUpperCase(),\r\n error: 'Failed to validate promo code',\r\n };\r\n });\r\n return;\r\n }\r\n\r\n // No production handler wired (e.g. real embeds). Do nothing — applying\r\n // a client-side mock discount would mis-state the price for a real buyer.\r\n promoState = createDefaultPromoState();\r\n }\r\n\r\n function handlePromoRemove() {\r\n // Always clean up hidden ticket quantities locally\r\n const hiddenIds = event.tickets.filter(t => t.isHidden).map(t => t.id);\r\n const newQuantities = { ...quantities };\r\n for (const id of hiddenIds) {\r\n delete newQuantities[id];\r\n }\r\n quantities = newQuantities;\r\n promoState = createDefaultPromoState();\r\n\r\n // Notify production caller\r\n if (onPromoRemoveProp) {\r\n onPromoRemoveProp();\r\n }\r\n }\r\n\r\n // Compute per-ticket promo info\r\n function getTicketPromoInfo(\r\n ticketId: TicketId,\r\n ticket: {\r\n price: number;\r\n isDonation: boolean;\r\n isHidden: boolean;\r\n ticketType?: number;\r\n }\r\n ) {\r\n const isDonation = ticket.isDonation || ticket.ticketType === 2;\r\n const isRevealed =\r\n ticket.isHidden &&\r\n (promoState.revealHiddenTickets ||\r\n promoState.revealTicketIds.includes(ticketId));\r\n\r\n let isDiscounted = false;\r\n let discountedPrice: number | null = null;\r\n\r\n // A ticket with no price cannot be discounted — there is nothing to take off\r\n // it. Without this guard an always-free ticket goes down the discount path\r\n // under any promo and renders \"Free\" struck through beside \"Free\", under a\r\n // \"Discount applied\" badge that saved the buyer nothing.\r\n if (\r\n promoState.isApplied &&\r\n promoState.discountAmount > 0 &&\r\n !isDonation &&\r\n ticket.price > 0\r\n ) {\r\n const eligible =\r\n promoState.discountTicketIds.length === 0 ||\r\n promoState.discountTicketIds.includes(ticketId);\r\n if (eligible) {\r\n isDiscounted = true;\r\n if (promoState.discountType === '%') {\r\n discountedPrice =\r\n ticket.price * (1 - promoState.discountAmount / 100);\r\n } else if (promoState.discountType === '$') {\r\n discountedPrice = Math.max(\r\n 0,\r\n ticket.price - promoState.discountAmount\r\n );\r\n }\r\n }\r\n }\r\n\r\n return { isRevealed, isDiscounted, discountedPrice };\r\n }\r\n</script>\r\n\r\n<div class=\"w-full min-h-screen bg-surface-primary text-color-primary\">\r\n <div class=\"max-w-6xl mx-auto px-4 py-6 md:px-6 md:py-8\">\r\n <!-- Shared desktop content (rendered via snippet to avoid duplication) -->\r\n {#snippet desktopContent()}\r\n <!-- Live event-status banner: shown the instant the operator cancels/\r\n postpones the event while the buyer is on the page (SSE-driven). The\r\n booking CTAs disable in tandem; the checkout floor remains the hard\r\n stop if anyone slips through. -->\r\n {#if unavailable}\r\n <div class=\"event-unavailable-banner\">\r\n {unavailableBanner}\r\n </div>\r\n {/if}\r\n\r\n <!-- Hero image -->\r\n <HeroImage src={event.imageUrl} alt={event.title} labels={mergedLabels} />\r\n\r\n <!-- Event header (title, date, venue, stage, age, scarcity badge) -->\r\n <EventHeader\r\n {event}\r\n hideDateTime={isFullWidth}\r\n hideVenue={isCollection}\r\n labels={mergedLabels}\r\n {locale}\r\n />\r\n\r\n <!-- INLINE TICKET SELECTION (hidden for series/collection — no single-event\r\n tickets; also hidden when waitlist-gated so freed inventory can't be\r\n added to a cart by a non-member) -->\r\n {#if showTicketCards && !isFullWidth && !waitlistGated}\r\n <section id=\"ticket-section\">\r\n <div class=\"mb-4\">\r\n <Heading size=\"xl\" weight=\"semibold\">\r\n {isOnSale\r\n ? mergedLabels.selectTickets || 'Select tickets'\r\n : mergedLabels.ticketsTab || 'Tickets'}\r\n </Heading>\r\n </div>\r\n\r\n {#if hasMultipleSections}\r\n <!-- Sectioned tickets -->\r\n {#each Object.entries(groupedTickets) as [sectionName, sectionTickets] (sectionName)}\r\n <div class=\"mb-6 last:mb-0\">\r\n {#if sectionName !== '_default'}\r\n <div class=\"mb-3\">\r\n <Heading level={3} size=\"sm\" weight=\"semibold\">\r\n {sectionName}\r\n </Heading>\r\n </div>\r\n {/if}\r\n <!-- TODO: swap back to <Stack gap=\"3\"> once SC merges the\r\n\t\t\t\t\t\t\t\t ambiguous-Stack-export fix (see open issue). The root\r\n\t\t\t\t\t\t\t\t index.js does `export *` from both primitives/ and\r\n\t\t\t\t\t\t\t\t patterns/layout/, both of which contribute Stack, so\r\n\t\t\t\t\t\t\t\t the browser refuses to resolve `import { Stack }`. -->\r\n <div class=\"space-y-3\">\r\n {#each sectionTickets as ticket (ticket.id)}\r\n {@const promoInfo = getTicketPromoInfo(\r\n toTicketId(ticket.id),\r\n ticket\r\n )}\r\n <TicketCard\r\n {ticket}\r\n quantity={quantities[ticket.id] ?? 0}\r\n onQuantityChange={handleQuantityChange}\r\n donationAmount={donationAmounts[ticket.id] ?? ''}\r\n onDonationChange={handleDonationChange}\r\n isRevealedByPromo={promoInfo.isRevealed}\r\n isDiscountedByPromo={promoInfo.isDiscounted}\r\n discountedPrice={promoInfo.discountedPrice}\r\n labels={mergedLabels}\r\n />\r\n {/each}\r\n </div>\r\n </div>\r\n {/each}\r\n {:else}\r\n <!-- Flat ticket list. Same TODO as the sectioned branch above:\r\n\t\t\t\t\t\t swap to <Stack gap=\"3\"> once SC's root index.js no longer\r\n\t\t\t\t\t\t star-exports Stack from two sibling trees. -->\r\n <div class=\"space-y-3\">\r\n {#each visibleTickets as ticket (ticket.id)}\r\n {@const promoInfo = getTicketPromoInfo(\r\n toTicketId(ticket.id),\r\n ticket\r\n )}\r\n <TicketCard\r\n {ticket}\r\n quantity={quantities[ticket.id] ?? 0}\r\n onQuantityChange={handleQuantityChange}\r\n donationAmount={donationAmounts[ticket.id] ?? ''}\r\n onDonationChange={handleDonationChange}\r\n isRevealedByPromo={promoInfo.isRevealed}\r\n isDiscountedByPromo={promoInfo.isDiscounted}\r\n discountedPrice={promoInfo.discountedPrice}\r\n labels={mergedLabels}\r\n />\r\n {/each}\r\n </div>\r\n {/if}\r\n\r\n <!-- Promo code input: only show when event is on sale -->\r\n {#if isOnSale}\r\n <PromoCodeInput\r\n {promoState}\r\n onApply={handlePromoApply}\r\n onRemove={handlePromoRemove}\r\n labels={mergedLabels}\r\n />\r\n {/if}\r\n </section>\r\n {/if}\r\n\r\n <!-- Checkout hand-off failure (inline — VC never toasts). Surfaced by\r\n\t\t\t the parent when cart creation is rejected, shown next to the\r\n\t\t\t ticket selection where the buyer just tapped \"Get tickets\". -->\r\n {#if checkoutError}\r\n <p class=\"checkout-error type-body\">{checkoutError}</p>\r\n {/if}\r\n\r\n <!-- Tokenized waitlist-link failure notice (decisions #3/#22/#36).\r\n Non-blocking: the page stays gated; this only explains why the link\r\n did not unlock checkout. Shown near the ticket CTA on mobile (the\r\n desktop sidebar renders its own copy). -->\r\n {#if waitlistGated && waitlistLinkError}\r\n <div class=\"md:hidden waitlist-link-notice\">\r\n <Text size=\"xs\" color=\"secondary\" class=\"block\">\r\n {waitlistLinkError}\r\n </Text>\r\n <Button\r\n variant=\"link\"\r\n size=\"xs\"\r\n class=\"self-start px-0\"\r\n onclick={onDismissWaitlistLinkError}\r\n >\r\n {mergedLabels.dismiss || 'Dismiss'}\r\n </Button>\r\n </div>\r\n {/if}\r\n\r\n <!-- Showtimes (series — primary content, before About) -->\r\n {#if isSeries}\r\n <section>\r\n <div class=\"mb-4\">\r\n <Heading size=\"xl\" weight=\"semibold\">\r\n {isSeriesMaster\r\n ? mergedLabels.upcomingShows || 'Upcoming shows'\r\n : mergedLabels.otherDates || 'Other dates'}\r\n </Heading>\r\n </div>\r\n <ShowtimeDesigns\r\n {event}\r\n onShowtimeClick={onShowtimeClickProp}\r\n labels={mergedLabels}\r\n {locale}\r\n />\r\n </section>\r\n {/if}\r\n\r\n <!-- Collection: About goes above event widgets -->\r\n {#if isCollection}\r\n <AboutSection description={event.description} labels={mergedLabels} />\r\n {/if}\r\n\r\n <!-- Collection events grid (widgets) -->\r\n {#if isCollection}\r\n <section>\r\n <div class=\"mb-4\">\r\n <Heading size=\"xl\" weight=\"semibold\">Events</Heading>\r\n </div>\r\n <Grid cols=\"auto\" minWidth=\"240px\" gap=\"6\">\r\n {#each collectionTeaserGroups as g (g.event.eventID)}\r\n {@const { pillEvents, ...card } = toEventCardProps(\r\n g,\r\n mergedLabels,\r\n locale\r\n )}\r\n <EventCard\r\n {...card}\r\n layout=\"vertical\"\r\n density=\"standard\"\r\n showDescription\r\n placeholderImage={PLACEHOLDER_IMAGE}\r\n onclick={() => handleCollectionEventClick(g.event)}\r\n onpillclick={i =>\r\n handleCollectionEventClick(pillEvents[i] ?? g.event)}\r\n />\r\n {/each}\r\n </Grid>\r\n </section>\r\n {/if}\r\n\r\n <!-- About section (non-collection) -->\r\n {#if !isCollection}\r\n <AboutSection description={event.description} labels={mergedLabels} />\r\n {/if}\r\n\r\n <!-- Performers (hidden for series/collection) -->\r\n {#if !isFullWidth}\r\n <PerformerGrid performers={event.performers} labels={mergedLabels} />\r\n {/if}\r\n\r\n <!-- FAQs (hidden for collection — FAQs are per-venue, not per-collection) -->\r\n {#if event.faqs.length > 0 && !isCollection}\r\n <FaqAccordion faqs={event.faqs} labels={mergedLabels} />\r\n {/if}\r\n\r\n <!-- Disclaimer -->\r\n {#if event.disclaimer}\r\n <section class=\"pt-4 border-t border-default\">\r\n <Text size=\"xs\" color=\"muted\" leading=\"relaxed\" class=\"block\">\r\n {event.disclaimer}\r\n </Text>\r\n </section>\r\n {/if}\r\n {/snippet}\r\n\r\n <!-- ============================================== -->\r\n <!-- DESKTOP LAYOUT -->\r\n <!-- ============================================== -->\r\n {#if isFullWidth}\r\n <!-- Series/Collection: full-width single column (no sidebar) -->\r\n <div class=\"hidden md:block space-y-8\">\r\n {@render desktopContent()}\r\n </div>\r\n {:else}\r\n <!-- Regular: two-column Airbnb split (1fr 360px) -->\r\n <div class=\"hidden md:grid grid-cols-booking-split gap-8 items-start\">\r\n <div class=\"space-y-8\">\r\n {@render desktopContent()}\r\n </div>\r\n <div class=\"sticky top-6\">\r\n <BookingWidget\r\n {event}\r\n orderTotals={displayTotals}\r\n {hasSelectedTickets}\r\n onCheckout={handleCheckout}\r\n promoApplied={promoState.isApplied}\r\n {gated}\r\n {unavailable}\r\n {unavailableReason}\r\n {waitlistEnabled}\r\n {onJoinWaitlist}\r\n {waitlistLinkError}\r\n {onDismissWaitlistLinkError}\r\n labels={mergedLabels}\r\n {locale}\r\n />\r\n </div>\r\n </div>\r\n {/if}\r\n\r\n <!-- ============================================== -->\r\n <!-- MOBILE: Single column with fixed bottom CTA -->\r\n <!-- ============================================== -->\r\n <div class=\"md:hidden space-y-6\" class:pb-24={!isFullWidth}>\r\n {@render desktopContent()}\r\n </div>\r\n\r\n <!-- Mobile: Fixed bottom CTA bar (DICE-style) — hidden for series/collection -->\r\n {#if !isFullWidth}\r\n <div class=\"md:hidden\">\r\n <MobileCta\r\n {event}\r\n orderTotals={displayTotals}\r\n {hasSelectedTickets}\r\n onCheckout={handleCheckout}\r\n {gated}\r\n {unavailable}\r\n {waitlistEnabled}\r\n {onJoinWaitlist}\r\n labels={mergedLabels}\r\n />\r\n </div>\r\n {/if}\r\n </div>\r\n</div>\r\n\r\n<style>\r\n /* Live event-status banner (SSE-driven cancel/postpone flip). Status color\r\n rides the widget's HSL theme token with the same fallback the status\r\n badges use. */\r\n .event-unavailable-banner {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n padding: 0.75rem 1rem;\r\n border-radius: 0.5rem;\r\n /* stylelint-disable micdrop/no-raw-text-values -- bare emphasis weight on inherited size — every type-* role imposes a font-size; keep exact to avoid a size shift on this alert, pending decision issue 500 */\r\n font-weight: 600;\r\n /* stylelint-enable micdrop/no-raw-text-values */\r\n background: hsl(var(--status-sold-out, 0 72% 51%) / 12%);\r\n color: hsl(var(--status-sold-out, 0 72% 51%));\r\n border: 1px solid hsl(var(--status-sold-out, 0 72% 51%) / 30%);\r\n }\r\n\r\n /* Inline checkout-failure message — VC surfaces failures inline, not as a\r\n\t toast. Danger-accent text so it reads as an error against the ticket area. */\r\n .checkout-error {\r\n margin-top: 0.75rem;\r\n color: hsl(var(--accent-danger));\r\n }\r\n\r\n .waitlist-link-notice {\r\n margin-top: 0.75rem;\r\n padding: 0.625rem 0.75rem;\r\n border-radius: 0.5rem;\r\n background-color: hsl(var(--bg-secondary, 210 20% 98%));\r\n border: 1px solid hsl(var(--border-default, 220 13% 91%));\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.375rem;\r\n }\r\n</style>\r\n"],"names":["getAccordionContext","setAccordionContext","createContext","getAccordionItemContext","setAccordionItemContext","multiple","$","$$props","flush","variant","className","openItems","SvelteSet","applyOpen","id","containerClasses","div","root","$0","cn","AccordionRoot","$$anchor","uid","open","borderOpenClass","accordion","triggerId","contentId","onMount","isOpen","size","color","svg","ctx","useIconWeight","resolved","root_2","path","$$render","consequent","alternate","styles","defaultLabels","userLabels","labels","mergeLabels","item","isGhost","headerClasses","textWeight","typography","h2","button","span","text","ChevronDownOutline","ChevronUpOutline","consequent_1","alternate_1","div_1","p","safeSlide","DURATION","AccordionItem","AccordionTrigger","AccordionContent","node_2","Accordion","AccordionLegacy","Root","Item","Trigger","Content","defaultAvatar","src","alt","initials","sizeClasses","sizeClass","shapeClasses","shapeClass","Image","root_1","getDefaultWhiteList","whiteList","onAttr","name","value","options","onIgnoreAttr","REGEXP_URL_JAVASCRIPT","safeAttrValue","_default","util","arr","i","j","fn","scope","str","_","require$$0","parseStyle","css","cssLength","isParenthesisOpen","lastPos","retCSS","addNewAttr","source","ret","c","parser","DEFAULT","require$$1","require$$2","isNull","obj","shallowCopyObject","FilterCSS","me","sourcePosition","position","check","isWhite","opts","filterCSS","html","xss","exports","module","reg","match","getDefaultCSSWhiteList","defaultCSSFilter","onTag","tag","onIgnoreTag","onTagAttr","onIgnoreTagAttr","escapeHtml","REGEXP_LT","REGEXP_GT","cssFilter","friendlyAttrValue","REGEXP_DEFAULT_ON_TAG_ATTR_4","REGEXP_DEFAULT_ON_TAG_ATTR_7","REGEXP_DEFAULT_ON_TAG_ATTR_8","escapeAttrValue","REGEXP_QUOTE","REGEXP_QUOTE_2","REGEXP_ATTR_VALUE_1","REGEXP_ATTR_VALUE_COLON","REGEXP_ATTR_VALUE_NEWLINE","escapeQuote","unescapeQuote","escapeHtmlEntities","code","escapeDangerHtml5Entities","clearNonPrintableCharacter","str2","len","onIgnoreTagStripAll","StripTagBody","tags","next","isRemoveAllTag","isRemoveTag","removeList","posStart","end","rethtml","pos","stripCommentTag","retHtml","stripBlankChar","chars","char","getTagName","tagName","isClosing","parseTag","tagStart","quoteStart","currentPos","currentTagName","currentHtml","chariterator","ic","REGEXP_ILLEGAL_ATTR_NAME","parseAttr","lastMarkPos","retAttrs","tmpName","addAttr","v","findNextQuotationMark","findNextEqual","findBeforeEqual","stripQuoteWrap","isQuoteWrapString","require$$3","getAttrs","keysToLowerCase","FilterXSS","attributeWrapSign","stripIgnoreTagBody","info","attrs","whiteAttrList","attrsHtml","isWhiteAttr","filterXSS","isWorkerEnv","EVENT_DESCRIPTION_TAGS","EVENT_DESCRIPTION_ATTRS","EVENT_DESCRIPTION_LINK_PROTOCOLS","EVENT_DESCRIPTION_WHITELIST","isSafeHref","schemeMatch","filter","sanitizeEventDescriptionHtml","dirty","safe","title","titleSize","gap","titleClass","titleSizeMap","gapMap","sectionClasses","titleClasses","section","computeOrderTotals","tickets","quantities","donationAmounts","promoState","taxPercentage","lines","subtotal","fees","promoDiscount","hasMissingPrice","ticket","qty","isDonation","rawPrice","toTicketId","basePrice","ticketFee","ticketDiscount","percent","ticketSubtotal","roundCurrency","discountedSubtotal","taxes","calculateTax","logger","createLogger","DEBOUNCE_MS","toNumericQuantities","q","out","k","n","toNumericDonations","d","LivePricing","#serverTotals","#pricing","#cartId","#cartEventId","#promoOnCart","#seq","#timer","input","#run","mySeq","wantPromo","res","apiPost","getOrdersV2Url","donations","applyPromoCode","pi","createPaymentIntent","buildServerTotalsFromPaymentIntent","err","PLACEHOLDER_IMAGE","hideDateTime","hideVenue","locale","scarcityLevel","getScarcityLevel","scarcityText","getScarcityText","ageText","shareFeedback","createShareCopyFeedback","shareEvent","url","onDestroy","announce","root_8","Heading","node","ScarcityBadge","div_2","Button","ExportIcon","node_3","text_1","span_1","text_2","div_3","fragment_3","CalendarIcon","node_6","span_2","div_4","root_4","ClockIcon","node_8","div_5","span_3","formatTimeRange","span_4","formatEventTime","consequent_2","span_5","root_3","formatDoorsTime","consequent_3","div_6","root_5","node_11","span_6","consequent_4","consequent_5","formatFullDateCompact","consequent_6","div_7","fragment_4","LocationIcon","node_13","div_8","span_7","span_8","text_9","consequent_7","div_9","BuildingIcon","node_16","span_9","consequent_8","div_10","UserIcon","node_18","span_10","consequent_9","text_8","consequent_10","QTY_ANNOUNCE_DEBOUNCE_MS","qtyAnnouncers","announceQuantity","message","createDebouncedAnnouncer","donationAmount","isRevealedByPromo","isDiscountedByPromo","discountedPrice","isSoldOut","isComingSoon","isSalesEnded","isDisabled","donationValue","donationError","isDonationValid","canDecrement","canIncrement","decrement","newQty","triggerHaptic","increment","target","donationInputValue","syncDonation","totalPrice","priceDisplay","formatPriceOrFree","feeCaption","formatCurrency","toUSD","discountedTotal","discountedIsFree","salesStartDisplay","formatSmartSalesDate","qtyAnnounceReady","article","root_9","Badge","Text","Input","node_5","$$value","fragment_8","fragment_9","consequent_11","root_7","node_9","consequent_12","SubtractIcon","node_12","AddIcon","consequent_13","classes","promoApplied","gated","waitlistEnabled","onJoinWaitlist","waitlistLinkError","onDismissWaitlistLinkError","unavailable","unavailableReason","showWaitlistCta","ctaConfig","getCtaConfig","getPriceDisplay","isFreeEvent","t","scrollToTickets","Card","node_1","node_4","OrderSummary","node_10","root_11","root_6","formatBrowseDate","div_11","node_19","div_12","node_21","node_22","text_13","div_13","root_10","node_23","text_14","text_15","node_25","text_16","alternate_2","alternate_3","Section","RichTextContent","performer","$1","Avatar","faq","totalTicketCount","sum","l","mode","prevModeForHaptic","PEEK_H","bodyEl","viewportH","sync","openHeight","measure","innerH","total","ro","inner","sections","handleBarClick","handleBarKeydown","e","isActivationKey","handleDrawerCheckout","closeDrawer","ticketsLabel","dragStartY","dragStartHeight","dragDeltaY","isDragging","pointerId","dragTarget","history","recordSample","y","computeVelocity","first","last","dt","handlePointerDown","body","handlePointerMove","dy","RUBBER_RESISTANCE","MAX_OVERSHOOT","rawHeight","finalHeight","overshoot","handlePointerUp","FLICK_VELOCITY","POSITION_THRESHOLD","handlePointerCancel","_e","liveHeight","revealProgress","range","layers","styles_1","styles_2","barContent","node_7","text_6","div_14","div_15","fragment_17","node_15","div_16","node_17","styles_4","classes_1","styles_3","PROMO_HINT_DEBOUNCE_MS","hintAnnouncers","announcePromoHint","isExpanded","inputValue","handleApply","trimmed","handleRemove","handleKeydown","shouldExpand","$2","$3","onShowtimeClick","groupedOccurrences","groups","SvelteMap","occ","dateKey","g","handleShowtimeClick","group","text_3","text_4","collectionEventsToBrowseEvents","collectionEvents","timezone","ce","formatDateKey","onCheckoutProp","checkoutError","onPromoApplyProp","onPromoRemoveProp","onCollectionEventClickProp","onShowtimeClickProp","isSeriesMaster","waitlistGated","mergedLabels","getLabelsForLocale","unavailableBanner","isFullWidth","createDefaultPromoState","live","visibleTickets","groupedTickets","hasMultipleSections","isOnSale","showTicketCards","orderTotals","hasSelectedTickets","displayTotals","st","isSeries","isCollection","collectionTeaserGroups","groupEventsBySeries","handleCollectionEventClick","clicked","handleQuantityChange","ticketId","handleDonationChange","amount","handleCheckout","handlePromoApply","result","handlePromoRemove","hiddenIds","newQuantities","getTicketPromoInfo","isRevealed","isDiscounted","root_13","desktopContent","HeroImage","EventHeader","section_1","sectionName","sectionTickets","$$item","$$array","promoInfo","TicketCard","PromoCodeInput","section_2","ShowtimeDesigns","AboutSection","section_3","Grid","node_20","pillEvents","card","toEventCardProps","EventCard","computed_const","PerformerGrid","FaqAccordion","section_4","node_26","node_28","node_29","BookingWidget","node_30","consequent_14","node_27","node_31","root_12","MobileCta","node_33","consequent_15"],"mappings":";;;;;;;;;;;;;AAeO,MAAM,CAACA,IAAqBC,EAAmB,IAAIC,GAAa,GAC1D,CAACC,IAAyBC,EAAuB,IAAIF,GAAa;;kBChB/E;;AAiCE,MACEG,IAAQC,EAAA,KAAAC,GAAA,YAAA,GAAG,EAAK,GAChBC,0BAAQ,EAAK,GACbC,4BAAU,SAAS,GACZC,0BAAY,EAAE;AAOvB,QAAMC,IAAY,IAAIC,GAAS;AAE/B,WAASC,EAAUC,GAAY;AAC7B,IAAKT,EAAQ,KAAEM,EAAU,MAAK,GAC9BA,EAAU,IAAIG,CAAE;AAAA,EAClB;AAwBA,EAAAb,GApB2B;AAAA,IACzB,IAAI,WAAW;AAAE,aAAOI,EAAQ;AAAA,IAAE;AAAA,IAClC,IAAI,QAAQ;AAAE,aAAOG,EAAK;AAAA,IAAE;AAAA,IAC5B,IAAI,UAAU;AAAE,aAAOC,EAAO;AAAA,IAAE;AAAA,IAChC,WAAAE;AAAA,IACA,OAAOG,GAAY;AAAE,aAAOH,EAAU,IAAIG,CAAE;AAAA,IAAG;AAAA,IAC/C,OAAOA,GAAY;AACjB,MAAIH,EAAU,IAAIG,CAAE,IAClBH,EAAU,OAAOG,CAAE,IAEnBD,EAAUC,CAAE;AAAA,IAEhB;AAAA,IACA,KAAKA,GAAY;AACf,MAAKH,EAAU,IAAIG,CAAE,KAAGD,EAAUC,CAAE;AAAA,IACtC;AAAA,IACA,WAAWA,GAAY;AACrB,MAAAH,EAAU,OAAOG,CAAE;AAAA,IACrB;AAAA,GAEqB;AAKvB,MAAIC,oBACFP,EAAI,IACA,2BACA,wDAAwD;MAI/DQ,IAAGC,GAAA,eAAHD,CAAG;;;;;;;;;;UAAHA,CAAG;;kBAAHA,GAAG,GAAAE,CAAA,GAAHZ,EAAA,cAAAU,GAAG,kBAAyDX,EAAQ,IAAG,SAAS,UAAU;AAAA;kBAA/Ec,GAAEb,EAAA,IAACS,CAAgB,GAAEL,EAAS,CAAA,CAAA,CAAA;AAAA,iBAAzCM,CAAG;AAFI;kBCnFR;AA6BE,MACEX,IAAQC,EAAA,KAAAC,GAAA,YAAA,GAAG,EAAK,GAChBC,0BAAQ,EAAK,GACbC,4BAAU,SAAS,GACZC,0BAAY,EAAE;AAKxB,EAAAU,GAAaC,GAAA;AAAA;aAAEhB,EAAQ;AAAA;;aAAGG,EAAK;AAAA;;aAAGC,EAAO;AAAA;;aAASC,EAAS;AAAA;;;;;;;;;;;;;;;;AAFpD;;kBCpCR;QAoDQY,IAAGhB,EAAA,SAAA;;AAXT,MACEiB,IAAIjB,EAAA,KAAAC,GAAA,QAAA,GAAG,EAAK,GACLG,0BAAY,EAAE,GACrBc,oCAAkB,EAAE;AAItB,QAAMC,IAAYzB,GAAmB,GAK/B0B,OAAeJ,CAAG,YAClBK,OAAeL,CAAG;AAIxB,EAAAM,GAAO,OACDL,EAAI,KAAEE,EAAU,KAAKH,CAAG,GACtB,MAAOG,EAAU,WAAWH,CAAG,EACtC;AAED,MAAIO,IAAMvB,EAAA,QAAA,MAAYmB,EAAU,OAAOH,CAAG,CAAA;AAW1C,EAAAlB,GATgC;AAAA,IAC9B,IAAI,KAAK;AAAE,aAAOkB;AAAA,IAAK;AAAA,IACvB,IAAI,YAAY;AAAE,aAAOI;AAAA,IAAW;AAAA,IACpC,IAAI,YAAY;AAAE,aAAOC;AAAA,IAAW;AAAA,IACpC,IAAI,OAAO;AAAE,mBAAOE,CAAM;AAAA,IAAE;AAAA,IAC5B,IAAI,UAAU;AAAE,aAAOJ,EAAU;AAAA,IAAS;AAAA,IAC1C,IAAI,QAAQ;AAAE,aAAOA,EAAU;AAAA,IAAO;AAAA,IACtC,SAAS;AAAE,MAAAA,EAAU,OAAOH,CAAG;AAAA,IAAG;AAAA,GAER;MAG7BN,IAAGC,GAAA,eAAHD,CAAG;oDAAHA,CAAG,wCAAHA,GAAG,GAAAE,CAAA,GAAA;AAAA,iBAAQC,GAAGT,EAAS,GAAAJ,EAAA,IAAEuB,CAAM,KAAIL,EAAe,IAAGA,EAAe,IAAG,EAAE,CAAA;AAAA,kBAAzER,CAAG;AAFI;;kBC3ER;AAME,MAAMc,IAAIxB,EAAA,KAAAC,GAAA,QAAA,GAAG,IAAI,GAAEwB,0BAAQ,cAAc,GAASrB,0BAAY,EAAE;MAGjEsB,IAAEf,GAAA;;AAAF,IAAAX,EAAA,UAAA0B,aACQtB,EAAS,CAAA,CAAA,GADjBJ,EAAA,cAAA0B,YAGQF,EAAI,CAAA,GAHZxB,EAAA,cAAA0B,aAISF,EAAI,CAAA,GAJbxB,EAAA,cAAA0B,aAMSD,EAAK,CAAA;AAAA,kBANdC,CAAE;AAFK;;kBCPR;;AAmBE,MAAMF,IAAIxB,EAAA,KAAAC,GAAA,QAAA,GAAG,IAAI,GAAEwB,0BAAQ,cAAc,GAASrB,0BAAY,EAAE;AAEhE,QAAMuB,IAAMC,GAAa;AACzB,MAAIC,IAAoB7B,EAAA,QAAA,MAAAC,EAAA,UAAsB0B,GAAK,UAAU,SAAS;MAGvED,IAAEI,GAAA;;kBAAFJ,CAAE;;;UAUyBK,IAAIpB,GAAA;kBAAJoB,CAAI;AAAA;;;;;AAAzB,MAAA/B,EAAA,IAAA6B,CAAQ,MAAK,SAAMG,EAAAC,CAAA,IAAAD,EAAAE,GAAA,EAAA;AAAA;;UAVzBR,CAAE;AAAF,IAAA1B,EAAA,UAAA0B,aACQtB,EAAS,CAAA,CAAA,GADjBJ,EAAA,cAAA0B,YAGQF,EAAI,CAAA,GAHZxB,EAAA,cAAA0B,aAISF,EAAI,CAAA,GAJbW,IAAAnC,EAAA,UAAA0B,mBAOcD,EAAK,MAAK,iBAAiB,SAAYA,EAAK,EAAA,CAAA;AAAA,kBAP1DC,CAAE;AAFK;;kBCvBR;;AAmBE,MAAMF,IAAIxB,EAAA,KAAAC,GAAA,QAAA,GAAG,IAAI,GAAEwB,0BAAQ,cAAc,GAASrB,0BAAY,EAAE;AAEhE,QAAMuB,IAAMC,GAAa;AACzB,MAAIC,IAAoB7B,EAAA,QAAA,MAAAC,EAAA,UAAsB0B,GAAK,UAAU,SAAS;MAGvED,IAAEI,GAAA;;kBAAFJ,CAAE;;;UAUyBK,IAAIpB,GAAA;kBAAJoB,CAAI;AAAA;;;;;AAAzB,MAAA/B,EAAA,IAAA6B,CAAQ,MAAK,SAAMG,EAAAC,CAAA,IAAAD,EAAAE,GAAA,EAAA;AAAA;;UAVzBR,CAAE;AAAF,IAAA1B,EAAA,UAAA0B,aACQtB,EAAS,CAAA,CAAA,GADjBJ,EAAA,cAAA0B,YAGQF,EAAI,CAAA,GAHZxB,EAAA,cAAA0B,aAISF,EAAI,CAAA,GAJbW,IAAAnC,EAAA,UAAA0B,mBAOcD,EAAK,MAAK,iBAAiB,SAAYA,EAAK,EAAA,CAAA;AAAA,kBAP1DC,CAAE;AAFK;;kBCtBR;;AAoBE,QAAMU,IAAa,EACjB,eAAe,iBAAgB;AASjC,MACShC,IAASJ,EAAA,KAAAC,GAAA,SAAA,GAAG,EAAE,GAEboC,IAAUrC,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GAGhBqC,IAAMtC,EAAA,QAAA,MAAYuC,GAAYH,GAAeC,EAAU,CAAA,CAAA;AAE3D,QAAMG,IAAO3C,GAAuB;AAEpC,MAAI4C,IAAOzC,EAAA,QAAA,MAAYwC,EAAK,YAAY,OAAO,GAK3CE,IAAa1C,EAAA,QAAA,MACfa,GAAE,gDACgD8B,GAAW,QAAQ,cACnEC,GAAW,SAAO5C,EAAA,IAClByC,CAAO,IAAG,mBAAmB,YAAUzC,EAAA,IACvCyC,CAAO,IAAG,0BAA0B,wBACpC,wBACA,SACAD,EAAK,eAASC,CAAO,IAAG,aAAa,IACrCrC,EAAS,CAAA,CAAA;MAKdyC,IAAElC,GAAA,GACAmC,YADFD,CAAE,GASEE,YARFD,CAAK,eAQHC,CAAI;;;;;;;AACuC,MAAA/C,EAAA,gBAAA,MAAAA,EAAA,SAAAgD,GAAAhD,EAAA,IAAAsC,CAAM,EAAC,aAAa,CAAA;;;;;;UAD/DS,CAAI;oBAAJA,GAAI,CAAA;;;;AAO6E,YAAAnC,IAAAZ,EAAA,QAAA,MAAAwC,EAAK,OAAO,eAAe,EAAE;AAA5G,QAAAS,GAAkBlC,GAAA;AAAA;;;;;;;AAE2D,YAAAH,IAAAZ,EAAA,QAAA,MAAAwC,EAAK,OAAO,eAAe,EAAE;AAA1G,QAAAU,GAAgBnC,GAAA;AAAA;;;;;;;YAHd0B,CAAO,IAAAT,EAAAmB,CAAA,IAAAnB,EAAAoB,GAAA,EAAA;AAAA;;UAdbN,CAAK,WADPD,CAAE;oBACAC,GAAK,MAEAN,EAAK,SAAS,GAFnBxC,EAAA,UAAA8C,mBAGQJ,CAAa,CAAA,CAAA,mBAHrBI,GAAK,iBAIWN,EAAK,IAAI,mBAJzBM,GAAK,iBAKWN,EAAK,SAAS,eAG5BO,GAAI,GAAA/C,EAAA,KAAQ4C,GAAW,IAAI,CAAA;AAAA,2BAR7BE,GAAK,MAMWN,EAAK,QAAM,eAP7BK,CAAE;AAFK;;;kBC1DR;;AAsBE,QAAML,IAAO3C,GAAuB;;;;UAInCa,IAAEC,GAAA,GAMA0C,YANF3C,CAAE,GAOE4C,YADFD,CAAG,eACDC,CAAC;;;;;;;;;;cAADA,CAAC,WADHD,CAAG,WANL3C,CAAE;wBAAFA,GAAE,MACG8B,EAAK,SAAS,mBADnB9B,GAAE,mBAGgB8B,EAAK,SAAS,GAG9BxC,EAAA,UAAAqD,aAAgBb,EAAK,QAAQ,KAAK,iCAAiC,EAAA,eACjEc,GAAC,GAAAtD,EAAA,KAAQ4C,GAAW,SAAS,CAAA;AAAA,UAPjC5C,EAAA,WAAA,GAAAU,GAAE,MAAA6C,IAAA,OAAA,EAIuB,UAAUC,GAAS,KAAI,EAAA,eAJhD9C,CAAE;AAAA;;AADA,MAAA8B,EAAK,QAAIR,EAAAmB,CAAA;AAAA;;;AAFN;;kBCvBR;;AA4BE,QAAMf,IAAa,EACjB,eAAe,iBAAgB;AAcjC,MACEnB,IAAIjB,EAAA,KAAAC,GAAA,QAAA,GAAG,EAAK,GACLG,0BAAY,EAAE;yBAEZ,EAAI;AACb,MAAAc,oCAAkB,EAAE,GAGZmB,IAAUrC,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,GAAA,GAGhBqC,IAAMtC,EAAA,QAAA,MAAYuC,GAAYH,GAAeC,EAAU,CAAA,CAAA;AAU5D,EAAAoB,GAAa1C,GAAA;AAAA;aAAEE,EAAI;AAAA;;aAASb,EAAS;AAAA;;aAAGc,EAAe;AAAA;;;;;AAEnD,UAAAwC,GAAgB3C,GAAA;AAAA;2BAAEuB,CAAM;AAAA;;;;;;;;AAKxB,UAAAoB,GAAgB3C,GAAA;AAAA;2BAAEuB,CAAM;AAAA;;;;;;;;AAE1B,MAAAqB,GAAgBC,GAAA;AAAA;;;;;;;;;AAXX;ACzCR,MAAMC,KAAY,OAAO,OAAOC,IAAiB,EAAA,MAAEC,UAAMC,IAAI,SAAEC,IAAO,SAAEC,IAAS,GCrBjFC,KAAe;;kBCAf;;AAyCE,MACEC,IAAGpE,EAAA,KAAAC,GAAA,OAAA,GAAG,EAAE,GACRoE,wBAAM,EAAE,GACR7C,yBAAO,IAAI,GACX8C,6BAAW,EAAE,GACNlE,0BAAY,EAAE;AAKvB,QAAMmE,IAAuC;AAAA,IAC3C,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA;AAGN,MAAIC,oBAAqBD,EAAY/C,EAAI,CAAA,KAAK+C,EAAY,EAAE;AAmB5D,QAAME,IAAwC;AAAA,IAC5C,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA;AAGN,MAAIC,oBAAsBD,EAAajD,EAAI,CAAA,KAAKiD,EAAa,EAAE;;;;AAO9D,MAAAE,GAAK5D,GAAA;AAAA;iBACHqD,EAAG;AAAA;;iBACHC,EAAG;AAAA;;;iBAEMF;AAAA;;0BACFK,CAAS,KAAA,EAAA,IAAAxE,EAAA,IAAG0E,CAAU,KAAA,EAAA,IAAGtE,EAAS,KAAA,EAAA;AAAA;;;UAG3CM,IAAGC,GAAA,eAAHD,GAAG,EAAA;cAAHA,CAAG;oBAAHA,GAAG,GAAA,oCACuCiC,GAAW,gDAAyC6B,CAAS,KAAA,EAAA,IAAAxE,EAAA,IAAG0E,CAAU,KAAA,EAAA,IAAGtE,OAAS,EAAA,EAAA,iBAE9HkE,GAAQ;AAAA,sBAHV5D,CAAG;AAAA;UAOH2C,IAAGuB,GAAA;AAAH,MAAA5E,EAAA,gBAAA,MAAAA,EAAA,UAAAqD,GAAG,GAAA,mDAAArD,EAAA,IACsDwE,CAAS,KAAA,EAAA,IAAAxE,EAAA,IAAG0E,CAAU,WAAGtE,EAAS,KAAA,EAAA,EAAA,CAAA,eAD3FiD,CAAG;AAAA;;AAnBD,MAAAe,EAAG,WAWEE,EAAQ,IAAAtC,EAAAmB,GAAA,CAAA,IAAAnB,EAAAE,GAAA,EAAA;AAAA;;;AAbV;;;;;ACjFR,WAAS2C,IAAuB;AAM9B,QAAIC,IAAY,CAAA;AAEhB,WAAAA,EAAU,eAAe,IAAI,IAC7BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,YAAY,IAAI,IAC1BA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,oBAAoB,IAAI,IAClCA,EAAU,MAAS,IACnBA,EAAU,cAAc,IAAI,IAC5BA,EAAU,YAAe,IACzBA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,oBAAoB,IAAI,IAClCA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,2BAA2B,IAAI,IACzCA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,sBAAsB,IAAI,IACpCA,EAAU,2BAA2B,IAAI,IACzCA,EAAU,UAAa,IACvBA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,aAAgB,IAC1BA,EAAU,uBAAuB,IAAI,IACrCA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,UAAa,IACvBA,EAAU,QAAW,IACrBA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,SAAY,IACtBA,EAAU,eAAe,IAAI,IAC7BA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,2BAA2B,IAAI,IACzCA,EAAU,4BAA4B,IAAI,IAC1CA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,oBAAoB,IAAI,IAClCA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,oBAAoB,IAAI,IAClCA,EAAU,aAAa,IAAI,IAC3BA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,eAAe,IAAI,IAC7BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,oBAAoB,IAAI,IAClCA,EAAU,oBAAoB,IAAI,IAClCA,EAAU,oBAAoB,IAAI,IAClCA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,YAAY,IAAI,IAC1BA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,wBAAwB,IAAI,IACtCA,EAAU,yBAAyB,IAAI,IACvCA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,cAAc,IAAI,IAC5BA,EAAU,SAAY,IACtBA,EAAU,sBAAsB,IAAI,IACpCA,EAAU,YAAY,IAAI,IAC1BA,EAAU,YAAY,IAAI,IAC1BA,EAAU,UAAU,IAAI,IACxBA,EAAU,cAAc,IAAI,IAC5BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,SAAY,IACtBA,EAAU,QAAW,IACrBA,EAAU,OAAU,IACpBA,EAAU,WAAW,IAAI,IACzBA,EAAU,WAAW,IAAI,IACzBA,EAAU,QAAW,IACrBA,EAAU,6BAA6B,IAAI,IAC3CA,EAAU,cAAc,IAAI,IAC5BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,YAAY,IAAI,IAC1BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,aAAa,IAAI,IAC3BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,UAAa,IACvBA,EAAU,UAAa,IACvBA,EAAU,UAAa,IACvBA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,eAAe,IAAI,IAC7BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,OAAU,IACpBA,EAAU,MAAS,IACnBA,EAAU,WAAW,IAAI,IACzBA,EAAU,YAAY,IAAI,IAC1BA,EAAU,SAAY,IACtBA,EAAU,YAAe,IACzBA,EAAU,UAAa,IACvBA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,YAAe,IACzBA,EAAU,aAAa,IAAI,IAC3BA,EAAU,SAAY,IACtBA,EAAU,OAAU,IACpBA,EAAU,YAAY,IAAI,IAC1BA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,WAAW,IAAI,IACzBA,EAAU,WAAW,IAAI,IACzBA,EAAU,aAAa,IAAI,IAC3BA,EAAU,WAAW,IAAI,IACzBA,EAAU,QAAW,IACrBA,EAAU,cAAc,IAAI,IAC5BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,eAAe,IAAI,IAC7BA,EAAU,WAAW,IAAI,IACzBA,EAAU,WAAW,IAAI,IACzBA,EAAU,OAAU,IACpBA,EAAU,aAAa,IAAI,IAC3BA,EAAU,uBAAuB,IAAI,IACrCA,EAAU,cAAc,IAAI,IAC5BA,EAAU,wBAAwB,IAAI,IACtCA,EAAU,WAAW,IAAI,IACzBA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,cAAc,IAAI,IAC5BA,EAAU,YAAY,IAAI,IAC1BA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,yBAAyB,IAAI,IACvCA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,yBAAyB,IAAI,IACvCA,EAAU,wBAAwB,IAAI,IACtCA,EAAU,sBAAsB,IAAI,IACpCA,EAAU,uBAAuB,IAAI,IACrCA,EAAU,aAAa,IAAI,IAC3BA,EAAU,OAAU,IACpBA,EAAU,WAAW,IAAI,IACzBA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,UAAU,IAAI,IACxBA,EAAU,cAAc,IAAI,IAC5BA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,eAAe,IAAI,IAC7BA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,uBAAuB,IAAI,IACrCA,EAAU,oBAAoB,IAAI,IAClCA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,SAAY,IACtBA,EAAU,UAAa,IACvBA,EAAU,OAAU,IACpBA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,UAAU,IAAI,IACxBA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,eAAe,IAAI,IAC7BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,OAAU,IACpBA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,YAAY,IAAI,IAC1BA,EAAU,WAAW,IAAI,IACzBA,EAAU,aAAa,IAAI,IAC3BA,EAAU,WAAW,IAAI,IACzBA,EAAU,eAAe,IAAI,IAC7BA,EAAU,oBAAoB,IAAI,IAClCA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,wBAAwB,IAAI,IACtCA,EAAU,YAAY,IAAI,IAC1BA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,SAAY,IACtBA,EAAU,eAAe,IAAI,IAC7BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,YAAY,IAAI,IAC1BA,EAAU,eAAe,IAAI,IAC7BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,QAAW,IACrBA,EAAU,OAAU,IACpBA,EAAU,UAAU,IAAI,IACxBA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,WAAW,IAAI,IACzBA,EAAU,YAAY,IAAI,IAC1BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,eAAe,IAAI,IAC7BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,WAAW,IAAI,IACzBA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,WAAW,IAAI,IACzBA,EAAU,YAAY,IAAI,IAC1BA,EAAU,WAAW,IAAI,IACzBA,EAAU,WAAW,IAAI,IACzBA,EAAU,YAAY,IAAI,IAC1BA,EAAU,WAAW,IAAI,IACzBA,EAAU,SAAS,IAAI,IACvBA,EAAU,UAAU,IAAI,IACxBA,EAAU,WAAW,IAAI,IACzBA,EAAU,UAAU,IAAI,IACxBA,EAAU,WAAW,IAAI,IACzBA,EAAU,QAAQ,IAAI,IACtBA,EAAU,YAAY,IAAI,IAC1BA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,UAAa,IACvBA,EAAU,QAAW,IACrBA,EAAU,UAAa,IACvBA,EAAU,UAAa,IACvBA,EAAU,eAAe,IAAI,IAC7BA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,eAAe,IAAI,IAC7BA,EAAU,eAAe,IAAI,IAC7BA,EAAU,WAAc,IACxBA,EAAU,eAAe,IAAI,IAC7BA,EAAU,YAAY,IAAI,IAC1BA,EAAU,YAAY,IAAI,IAC1BA,EAAU,UAAa,IACvBA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,eAAe,IAAI,IAC7BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,OAAU,IACpBA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,aAAa,IAAI,IAC3BA,EAAU,QAAW,IACrBA,EAAU,aAAa,IAAI,IAC3BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,cAAiB,IAC3BA,EAAU,oBAAoB,IAAI,IAClCA,EAAU,QAAW,IACrBA,EAAU,aAAa,IAAI,IAC3BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,WAAc,IACxBA,EAAU,oBAAoB,IAAI,IAClCA,EAAU,SAAY,IACtBA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,SAAY,IACtBA,EAAU,OAAU,IACpBA,EAAU,YAAY,IAAI,IAC1BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,WAAc,IACxBA,EAAU,QAAW,IACrBA,EAAU,WAAc,IACxBA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,YAAY,IAAI,IAC1BA,EAAU,YAAY,IAAI,IAC1BA,EAAU,eAAe,IAAI,IAC7BA,EAAU,uBAAuB,IAAI,IACrCA,EAAU,eAAe,IAAI,IAC7BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,OAAU,IACpBA,EAAU,QAAW,IACrBA,EAAU,UAAU,IAAI,IACxBA,EAAU,cAAc,IAAI,IAC5BA,EAAU,eAAe,IAAI,IAC7BA,EAAU,mBAAmB,IAAI,IACjCA,EAAU,aAAa,IAAI,IAC3BA,EAAU,SAAY,IACtBA,EAAU,YAAY,IAAI,IAC1BA,EAAU,UAAU,IAAI,IACxBA,EAAU,cAAc,IAAI,IAC5BA,EAAU,YAAY,IAAI,IAC1BA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,sBAAsB,IAAI,IACpCA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,uBAAuB,IAAI,IACrCA,EAAU,sBAAsB,IAAI,IACpCA,EAAU,sBAAsB,IAAI,IACpCA,EAAU,uBAAuB,IAAI,IACrCA,EAAU,eAAe,IAAI,IAC7BA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,wBAAwB,IAAI,IACtCA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,aAAa,IAAI,IAC3BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,eAAe,IAAI,IAC7BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,yBAAyB,IAAI,IACvCA,EAAU,WAAW,IAAI,IACzBA,EAAU,MAAS,IACnBA,EAAU,YAAe,IACzBA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,iBAAiB,IAAI,IAC/BA,EAAU,aAAgB,IAC1BA,EAAU,kBAAkB,IAAI,IAChCA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,qBAAqB,IAAI,IACnCA,EAAU,4BAA4B,IAAI,IAC1CA,EAAU,cAAc,IAAI,IAC5BA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,aAAgB,IAC1BA,EAAU,eAAe,IAAI,IAC7BA,EAAU,gBAAgB,IAAI,IAC9BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,aAAa,IAAI,IAC3BA,EAAU,YAAY,IAAI,IAC1BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,SAAY,IACtBA,EAAU,aAAa,IAAI,IAC3BA,EAAU,SAAY,IACtBA,EAAU,QAAW,IACrBA,EAAU,aAAa,IAAI,IAC3BA,EAAU,YAAY,IAAI,IAC1BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,WAAW,IAAI,IACzBA,EAAU,WAAW,IAAI,IACzBA,EAAU,cAAc,IAAI,IAC5BA,EAAU,cAAc,IAAI,IAC5BA,EAAU,SAAS,IAAI,IAEhBA;AAAA,EACT;AAWA,WAASC,EAAQC,GAAMC,GAAOC,GAAS;AAAA,EAEvC;AAUA,WAASC,EAAcH,GAAMC,GAAOC,GAAS;AAAA,EAE7C;AAEA,MAAIE,IAAwB;AAS5B,WAASC,EAAcL,GAAMC,GAAO;AAClC,WAAIG,EAAsB,KAAKH,CAAK,IAAU,KACvCA;AAAA,EACT;AAGA,SAAAK,GAAA,YAAoBT,EAAmB,GACvCS,GAAA,sBAA8BT,GAC9BS,GAAA,SAAiBP,GACjBO,GAAA,eAAuBH,GACvBG,GAAA,gBAAwBD;;;;wBC7YxBE,KAAiB;AAAA,IACf,SAAS,SAAUC,GAAKhD,GAAM;AAC5B,UAAIiD,GAAGC;AACP,UAAI,MAAM,UAAU;AAClB,eAAOF,EAAI,QAAQhD,CAAI;AAEzB,WAAKiD,IAAI,GAAGC,IAAIF,EAAI,QAAQC,IAAIC,GAAGD;AACjC,YAAID,EAAIC,CAAC,MAAMjD;AACb,iBAAOiD;AAGX,aAAO;AAAA,IACX;AAAA,IACE,SAAS,SAAUD,GAAKG,GAAIC,GAAO;AACjC,UAAIH,GAAGC;AACP,UAAI,MAAM,UAAU;AAClB,eAAOF,EAAI,QAAQG,GAAIC,CAAK;AAE9B,WAAKH,IAAI,GAAGC,IAAIF,EAAI,QAAQC,IAAIC,GAAGD;AACjC,QAAAE,EAAG,KAAKC,GAAOJ,EAAIC,CAAC,GAAGA,GAAGD,CAAG;AAAA,IAEnC;AAAA,IACE,MAAM,SAAUK,GAAK;AACnB,aAAI,OAAO,UAAU,OACZA,EAAI,KAAI,IAEVA,EAAI,QAAQ,kBAAkB,EAAE;AAAA,IAC3C;AAAA,IACE,WAAW,SAAUA,GAAK;AACxB,aAAI,OAAO,UAAU,YACZA,EAAI,UAAS,IAEfA,EAAI,QAAQ,WAAW,EAAE;AAAA,IACpC;AAAA;;;;;;AC3BA,MAAIC,IAAIC,GAAA;AAWR,WAASC,EAAYC,GAAKlB,GAAQ;AAChC,IAAAkB,IAAMH,EAAE,UAAUG,CAAG,GACjBA,EAAIA,EAAI,SAAS,CAAC,MAAM,QAAKA,KAAO;AACxC,QAAIC,IAAYD,EAAI,QAChBE,IAAoB,IACpBC,IAAU,GACVX,IAAI,GACJY,IAAS;AAEb,aAASC,IAAc;AAErB,UAAI,CAACH,GAAmB;AACtB,YAAII,IAAST,EAAE,KAAKG,EAAI,MAAMG,GAASX,CAAC,CAAC,GACrCC,IAAIa,EAAO,QAAQ,GAAG;AAC1B,YAAIb,MAAM,IAAI;AACZ,cAAIV,IAAOc,EAAE,KAAKS,EAAO,MAAM,GAAGb,CAAC,CAAC,GAChCT,IAAQa,EAAE,KAAKS,EAAO,MAAMb,IAAI,CAAC,CAAC;AAEtC,cAAIV,GAAM;AACR,gBAAIwB,IAAMzB,EAAOqB,GAASC,EAAO,QAAQrB,GAAMC,GAAOsB,CAAM;AAC5D,YAAIC,MAAKH,KAAUG,IAAM;AAAA,UACnC;AAAA,QACA;AAAA,MACA;AACI,MAAAJ,IAAUX,IAAI;AAAA,IAClB;AAEE,WAAOA,IAAIS,GAAWT,KAAK;AACzB,UAAIgB,IAAIR,EAAIR,CAAC;AACb,UAAIgB,MAAM,OAAOR,EAAIR,IAAI,CAAC,MAAM,KAAK;AAEnC,YAAIC,IAAIO,EAAI,QAAQ,MAAMR,IAAI,CAAC;AAE/B,YAAIC,MAAM,GAAI;AAEd,QAAAD,IAAIC,IAAI,GACRU,IAAUX,IAAI,GACdU,IAAoB;AAAA,MAC1B,MAAW,CAAIM,MAAM,MACfN,IAAoB,KACXM,MAAM,MACfN,IAAoB,KACXM,MAAM,MACXN,KAGFG,EAAU,IAEHG,MAAM;AAAA,KACfH,EAAU;AAAA,IAEhB;AAEE,WAAOR,EAAE,KAAKO,CAAM;AAAA,EACtB;AAEAK,SAAAA,KAAiBV;;;;;;ACnEjB,MAAIW,IAAUZ,GAAA,GACVC,IAAaY,GAAA;AACTC,EAAAA,GAAA;AASR,WAASC,EAAQC,GAAK;AACpB,WAA6BA,KAAQ;AAAA,EACvC;AAQA,WAASC,EAAmBD,GAAK;AAC/B,QAAIP,IAAM,CAAA;AACV,aAASf,KAAKsB;AACZ,MAAAP,EAAIf,CAAC,IAAIsB,EAAItB,CAAC;AAEhB,WAAOe;AAAA,EACT;AAWA,WAASS,EAAW/B,GAAS;AAC3B,IAAAA,IAAU8B,EAAkB9B,KAAW,EAAE,GACzCA,EAAQ,YAAYA,EAAQ,aAAayB,EAAQ,WACjDzB,EAAQ,SAASA,EAAQ,UAAUyB,EAAQ,QAC3CzB,EAAQ,eAAeA,EAAQ,gBAAgByB,EAAQ,cACvDzB,EAAQ,gBAAgBA,EAAQ,iBAAiByB,EAAQ,eACzD,KAAK,UAAUzB;AAAA,EACjB;AAEA,SAAA+B,EAAU,UAAU,UAAU,SAAUhB,GAAK;AAI3C,QAFAA,IAAMA,KAAO,IACbA,IAAMA,EAAI,SAAQ,GACd,CAACA,EAAK,QAAO;AAEjB,QAAIiB,IAAK,MACLhC,IAAUgC,EAAG,SACbpC,IAAYI,EAAQ,WACpBH,IAASG,EAAQ,QACjBC,IAAeD,EAAQ,cACvBG,IAAgBH,EAAQ,eAExBmB,IAASL,EAAWC,GAAK,SAAUkB,GAAgBC,GAAUpC,GAAMC,GAAOsB,GAAQ;AAEpF,UAAIc,IAAQvC,EAAUE,CAAI,GACtBsC,IAAU;AAQd,UAPID,MAAU,KAAMC,IAAUD,IACrB,OAAOA,KAAU,aAAYC,IAAUD,EAAMpC,CAAK,IAClDoC,aAAiB,WAAQC,IAAUD,EAAM,KAAKpC,CAAK,IACxDqC,MAAY,OAAMA,IAAU,KAGhCrC,IAAQI,EAAcL,GAAMC,CAAK,GAC7B,EAACA,GAEL;AAAA,YAAIsC,IAAO;AAAA,UACT,UAAUH;AAAA,UACV,gBAAgBD;AAAA,UAChB,QAAQZ;AAAA,UACR,SAASe;AAAA;AAGX,YAAIA,GAAS;AAEX,cAAId,IAAMzB,EAAOC,GAAMC,GAAOsC,CAAI;AAClC,iBAAIT,EAAON,CAAG,IACLxB,IAAO,MAAMC,IAEbuB;AAAA,QAGf,OAAW;AAEL,cAAIA,IAAMrB,EAAaH,GAAMC,GAAOsC,CAAI;AACxC,cAAI,CAACT,EAAON,CAAG;AACb,mBAAOA;AAAA,QAGf;AAAA;AAAA,IACA,CAAG;AAED,WAAOH;AAAA,EACT,GAGAJ,KAAiBgB;;;;;ACvGjB,QAAIN,IAAUZ,GAAA,GACVkB,IAAYL,GAAA;AAUhB,aAASY,EAAWC,GAAMvC,GAAS;AACjC,UAAIwC,IAAM,IAAIT,EAAU/B,CAAO;AAC/B,aAAOwC,EAAI,QAAQD,CAAI;AAAA,IACzB;AAIAE,IAAAA,IAAUC,YAAiBJ,GAC3BG,EAAA,YAAoBV;AACpB,aAASxB,KAAKkB,EAASgB,CAAAA,EAAQlC,CAAC,IAAIkB,EAAQlB,CAAC;AAG7C,IAAI,OAAO,SAAW,QACpB,OAAO,YAAYmC,EAAO;AAAA;;;;wBC9B5BrC,KAAiB;AAAA,IACf,SAAS,SAAUC,GAAKhD,GAAM;AAC5B,UAAIiD,GAAGC;AACP,UAAI,MAAM,UAAU;AAClB,eAAOF,EAAI,QAAQhD,CAAI;AAEzB,WAAKiD,IAAI,GAAGC,IAAIF,EAAI,QAAQC,IAAIC,GAAGD;AACjC,YAAID,EAAIC,CAAC,MAAMjD;AACb,iBAAOiD;AAGX,aAAO;AAAA,IACX;AAAA,IACE,SAAS,SAAUD,GAAKG,GAAIC,GAAO;AACjC,UAAIH,GAAGC;AACP,UAAI,MAAM,UAAU;AAClB,eAAOF,EAAI,QAAQG,GAAIC,CAAK;AAE9B,WAAKH,IAAI,GAAGC,IAAIF,EAAI,QAAQC,IAAIC,GAAGD;AACjC,QAAAE,EAAG,KAAKC,GAAOJ,EAAIC,CAAC,GAAGA,GAAGD,CAAG;AAAA,IAEnC;AAAA,IACE,MAAM,SAAUK,GAAK;AACnB,aAAI,OAAO,UAAU,OACZA,EAAI,KAAI,IAEVA,EAAI,QAAQ,kBAAkB,EAAE;AAAA,IAC3C;AAAA,IACE,YAAY,SAAUA,GAAK;AACzB,UAAIgC,IAAM,YACNC,IAAQD,EAAI,KAAKhC,CAAG;AACxB,aAAOiC,IAAQA,EAAM,QAAQ;AAAA,IACjC;AAAA;;;;;;AC1BA,MAAIb,IAAYlB,GAAA,EAAqB,WACjCgC,IAAyBhC,GAAA,EAAqB,qBAC9CD,IAAIc,GAAA;AAER,WAAS/B,IAAsB;AAC7B,WAAO;AAAA,MACL,GAAG,CAAC,UAAU,QAAQ,OAAO;AAAA,MAC7B,MAAM,CAAC,OAAO;AAAA,MACd,SAAS,CAAA;AAAA,MACT,MAAM,CAAC,SAAS,UAAU,QAAQ,KAAK;AAAA,MACvC,SAAS,CAAA;AAAA,MACT,OAAO,CAAA;AAAA,MACP,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;MAEF,GAAG,CAAA;AAAA,MACH,KAAK,CAAC,KAAK;AAAA,MACX,KAAK,CAAC,KAAK;AAAA,MACX,KAAK,CAAA;AAAA,MACL,YAAY,CAAC,MAAM;AAAA,MACnB,IAAI,CAAA;AAAA,MACJ,SAAS,CAAA;AAAA,MACT,QAAQ,CAAA;AAAA,MACR,MAAM,CAAA;AAAA,MACN,MAAM,CAAA;AAAA,MACN,KAAK,CAAC,SAAS,UAAU,QAAQ,OAAO;AAAA,MACxC,UAAU,CAAC,SAAS,UAAU,QAAQ,OAAO;AAAA,MAC7C,IAAI,CAAA;AAAA,MACJ,KAAK,CAAC,UAAU;AAAA,MAChB,SAAS,CAAC,MAAM;AAAA,MAChB,KAAK,CAAA;AAAA,MACL,IAAI,CAAA;AAAA,MACJ,IAAI,CAAA;AAAA,MACJ,IAAI,CAAA;AAAA,MACJ,YAAY,CAAA;AAAA,MACZ,QAAQ,CAAA;AAAA,MACR,MAAM,CAAC,SAAS,QAAQ,MAAM;AAAA,MAC9B,QAAQ,CAAA;AAAA,MACR,IAAI,CAAA;AAAA,MACJ,IAAI,CAAA;AAAA,MACJ,IAAI,CAAA;AAAA,MACJ,IAAI,CAAA;AAAA,MACJ,IAAI,CAAA;AAAA,MACJ,IAAI,CAAA;AAAA,MACJ,QAAQ,CAAA;AAAA,MACR,IAAI,CAAA;AAAA,MACJ,GAAG,CAAA;AAAA,MACH,KAAK,CAAC,OAAO,OAAO,SAAS,SAAS,UAAU,SAAS;AAAA,MACzD,KAAK,CAAC,UAAU;AAAA,MAChB,KAAK,CAAA;AAAA,MACL,IAAI,CAAA;AAAA,MACJ,MAAM,CAAA;AAAA,MACN,KAAK,CAAA;AAAA,MACL,IAAI,CAAA;AAAA,MACJ,GAAG,CAAA;AAAA,MACH,KAAK,CAAA;AAAA,MACL,GAAG,CAAA;AAAA,MACH,SAAS,CAAA;AAAA,MACT,OAAO,CAAA;AAAA,MACP,MAAM,CAAA;AAAA,MACN,KAAK,CAAA;AAAA,MACL,SAAS,CAAA;AAAA,MACT,KAAK,CAAA;AAAA,MACL,QAAQ,CAAA;AAAA,MACR,QAAQ,CAAA;AAAA,MACR,OAAO,CAAC,SAAS,UAAU,SAAS,QAAQ;AAAA,MAC5C,OAAO,CAAC,SAAS,QAAQ;AAAA,MACzB,IAAI,CAAC,SAAS,WAAW,WAAW,SAAS,QAAQ;AAAA,MACrD,OAAO,CAAC,SAAS,QAAQ;AAAA,MACzB,IAAI,CAAC,SAAS,WAAW,WAAW,SAAS,QAAQ;AAAA,MACrD,OAAO,CAAC,SAAS,QAAQ;AAAA,MACzB,IAAI,CAAC,WAAW,SAAS,QAAQ;AAAA,MACjC,IAAI,CAAA;AAAA,MACJ,GAAG,CAAA;AAAA,MACH,IAAI,CAAA;AAAA,MACJ,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;;EAGN;AAEA,MAAImD,IAAmB,IAAIf,EAAS;AAUpC,WAASgB,EAAMC,GAAKT,GAAMvC,GAAS;AAAA,EAEnC;AAUA,WAASiD,EAAYD,GAAKT,GAAMvC,GAAS;AAAA,EAEzC;AAUA,WAASkD,EAAUF,GAAKlD,GAAMC,GAAO;AAAA,EAErC;AAUA,WAASoD,EAAgBH,GAAKlD,GAAMC,GAAO;AAAA,EAE3C;AAOA,WAASqD,EAAWb,GAAM;AACxB,WAAOA,EAAK,QAAQc,GAAW,MAAM,EAAE,QAAQC,GAAW,MAAM;AAAA,EAClE;AAWA,WAASnD,EAAc6C,GAAKlD,GAAMC,GAAOwD,GAAW;AAIlD,QAFAxD,IAAQyD,EAAkBzD,CAAK,GAE3BD,MAAS,UAAUA,MAAS,OAAO;AAIrC,UADAC,IAAQa,EAAE,KAAKb,CAAK,GAChBA,MAAU,IAAK,QAAO;AAC1B,UACE,EACEA,EAAM,OAAO,GAAG,CAAC,MAAM,aACvBA,EAAM,OAAO,GAAG,CAAC,MAAM,cACvBA,EAAM,OAAO,GAAG,CAAC,MAAM,aACvBA,EAAM,OAAO,GAAG,CAAC,MAAM,UACvBA,EAAM,OAAO,GAAG,EAAE,MAAM,iBACxBA,EAAM,OAAO,GAAG,CAAC,MAAM,YACvBA,EAAM,OAAO,GAAG,CAAC,MAAM,QACvBA,EAAM,OAAO,GAAG,CAAC,MAAM,SACvBA,EAAM,CAAC,MAAM,OACbA,EAAM,CAAC,MAAM;AAGf,eAAO;AAAA,IAEb,WAAaD,MAAS;AAIlB,UADA2D,EAA6B,YAAY,GACrCA,EAA6B,KAAK1D,CAAK;AACzC,eAAO;AAAA,eAEAD,MAAS,SAAS;AAQ3B,UANA4D,EAA6B,YAAY,GACrCA,EAA6B,KAAK3D,CAAK,MAI3C4D,EAA6B,YAAY,GACrCA,EAA6B,KAAK5D,CAAK,MACzC0D,EAA6B,YAAY,GACrCA,EAA6B,KAAK1D,CAAK;AACzC,eAAO;AAGX,MAAIwD,MAAc,OAChBA,IAAYA,KAAaT,GACzB/C,IAAQwD,EAAU,QAAQxD,CAAK;AAAA,IAErC;AAGE,WAAAA,IAAQ6D,EAAgB7D,CAAK,GACtBA;AAAA,EACT;AAGA,MAAIsD,IAAY,MACZC,IAAY,MACZO,IAAe,MACfC,IAAiB,WACjBC,IAAsB,yBACtBC,IAA0B,eAC1BC,IAA4B,iBAE5BR,IACF,yFAGEC,IACF,kDACEC,IAA+B;AAQnC,WAASO,EAAYvD,GAAK;AACxB,WAAOA,EAAI,QAAQkD,GAAc,QAAQ;AAAA,EAC3C;AAQA,WAASM,EAAcxD,GAAK;AAC1B,WAAOA,EAAI,QAAQmD,GAAgB,GAAG;AAAA,EACxC;AAQA,WAASM,EAAmBzD,GAAK;AAC/B,WAAOA,EAAI,QAAQoD,GAAqB,SAAwBpD,GAAK0D,GAAM;AACzE,aAAOA,EAAK,CAAC,MAAM,OAAOA,EAAK,CAAC,MAAM,MAClC,OAAO,aAAa,SAASA,EAAK,OAAO,CAAC,GAAG,EAAE,CAAC,IAChD,OAAO,aAAa,SAASA,GAAM,EAAE,CAAC;AAAA,IAC9C,CAAG;AAAA,EACH;AAQA,WAASC,EAA0B3D,GAAK;AACtC,WAAOA,EACJ,QAAQqD,GAAyB,GAAG,EACpC,QAAQC,GAA2B,GAAG;AAAA,EAC3C;AAQA,WAASM,EAA2B5D,GAAK;AAEvC,aADI6D,IAAO,IACFjE,IAAI,GAAGkE,IAAM9D,EAAI,QAAQJ,IAAIkE,GAAKlE;AACzC,MAAAiE,KAAQ7D,EAAI,WAAWJ,CAAC,IAAI,KAAK,MAAMI,EAAI,OAAOJ,CAAC;AAErD,WAAOK,EAAE,KAAK4D,CAAI;AAAA,EACpB;AAQA,WAAShB,EAAkB7C,GAAK;AAC9B,WAAAA,IAAMwD,EAAcxD,CAAG,GACvBA,IAAMyD,EAAmBzD,CAAG,GAC5BA,IAAM2D,EAA0B3D,CAAG,GACnCA,IAAM4D,EAA2B5D,CAAG,GAC7BA;AAAA,EACT;AAQA,WAASiD,EAAgBjD,GAAK;AAC5B,WAAAA,IAAMuD,EAAYvD,CAAG,GACrBA,IAAMyC,EAAWzC,CAAG,GACbA;AAAA,EACT;AAKA,WAAS+D,IAAsB;AAC7B,WAAO;AAAA,EACT;AASA,WAASC,EAAaC,GAAMC,GAAM;AAChC,IAAI,OAAOA,KAAS,eAClBA,IAAO,WAAY;AAAA,IAAA;AAGrB,QAAIC,IAAiB,CAAC,MAAM,QAAQF,CAAI;AACxC,aAASG,EAAY/B,GAAK;AACxB,aAAI8B,IAAuB,KACpBlE,EAAE,QAAQgE,GAAM5B,CAAG,MAAM;AAAA,IACpC;AAEE,QAAIgC,IAAa,CAAA,GACbC,IAAW;AAEf,WAAO;AAAA,MACL,aAAa,SAAUjC,GAAKT,GAAMvC,GAAS;AACzC,YAAI+E,EAAY/B,CAAG;AACjB,cAAIhD,EAAQ,WAAW;AACrB,gBAAIsB,IAAM,cACN4D,KAAMlF,EAAQ,WAAWsB,EAAI;AACjC,mBAAA0D,EAAW,KAAK;AAAA,cACdC,MAAa,KAAQA,IAAWjF,EAAQ;AAAA,cACxCkF;AAAA,YACZ,CAAW,GACDD,IAAW,IACJ3D;AAAA,UACjB;AACU,mBAAK2D,MACHA,IAAWjF,EAAQ,WAEd;AAAA;AAGT,iBAAO6E,EAAK7B,GAAKT,GAAMvC,CAAO;AAAA,MAEtC;AAAA,MACI,QAAQ,SAAUuC,GAAM;AACtB,YAAI4C,IAAU,IACVjE,IAAU;AACd,eAAAN,EAAE,QAAQoE,GAAY,SAAUI,GAAK;AACnC,UAAAD,KAAW5C,EAAK,MAAMrB,GAASkE,EAAI,CAAC,CAAC,GACrClE,IAAUkE,EAAI,CAAC;AAAA,QACvB,CAAO,GACDD,KAAW5C,EAAK,MAAMrB,CAAO,GACtBiE;AAAA,MACb;AAAA;EAEA;AAQA,WAASE,EAAgB9C,GAAM;AAG7B,aAFI+C,IAAU,IACVpE,IAAU,GACPA,IAAUqB,EAAK,UAAQ;AAC5B,UAAIhC,IAAIgC,EAAK,QAAQ,QAAQrB,CAAO;AACpC,UAAIX,MAAM,IAAI;AACZ,QAAA+E,KAAW/C,EAAK,MAAMrB,CAAO;AAC7B;AAAA,MACN;AACI,MAAAoE,KAAW/C,EAAK,MAAMrB,GAASX,CAAC;AAChC,UAAIC,IAAI+B,EAAK,QAAQ,OAAOhC,CAAC;AAC7B,UAAIC,MAAM;AACR;AAEF,MAAAU,IAAUV,IAAI;AAAA,IAClB;AACE,WAAO8E;AAAA,EACT;AAQA,WAASC,EAAehD,GAAM;AAC5B,QAAIiD,IAAQjD,EAAK,MAAM,EAAE;AACzB,WAAAiD,IAAQA,EAAM,OAAO,SAAUC,GAAM;AACnC,UAAIlE,IAAIkE,EAAK,WAAW,CAAC;AACzB,aAAIlE,MAAM,MAAY,KAClBA,KAAK,KACHA,MAAM,MAAMA,MAAM,KAGjB;AAAA,IACX,CAAG,GACMiE,EAAM,KAAK,EAAE;AAAA,EACtB;AAEApF,SAAAA,GAAA,YAAoBT,EAAmB,GACvCS,GAAA,sBAA8BT,GAC9BS,GAAA,QAAgB2C,GAChB3C,GAAA,cAAsB6C,GACtB7C,GAAA,YAAoB8C,GACpB9C,GAAA,kBAA0B+C,GAC1B/C,GAAA,gBAAwBD,GACxBC,GAAA,aAAqBgD,GACrBhD,GAAA,cAAsB8D,GACtB9D,GAAA,gBAAwB+D,GACxB/D,GAAA,qBAA6BgE,GAC7BhE,GAAA,4BAAoCkE,GACpClE,GAAA,6BAAqCmE,GACrCnE,GAAA,oBAA4BoD,GAC5BpD,GAAA,kBAA0BwD,GAC1BxD,GAAA,sBAA8BsE,GAC9BtE,GAAA,eAAuBuE,GACvBvE,GAAA,kBAA0BiF,GAC1BjF,GAAA,iBAAyBmF,GACzBnF,GAAA,oBAA4B,KAC5BA,GAAA,YAAoB0C,GACpB1C,GAAA,yBAAiCyC;;;;;;ACtcjC,MAAIjC,IAAIC,GAAA;AAQR,WAAS6E,EAAWnD,GAAM;AACxB,QAAIhC,IAAIK,EAAE,WAAW2B,CAAI,GACrBoD;AACJ,WAAIpF,MAAM,KACRoF,IAAUpD,EAAK,MAAM,GAAG,EAAE,IAE1BoD,IAAUpD,EAAK,MAAM,GAAGhC,IAAI,CAAC,GAE/BoF,IAAU/E,EAAE,KAAK+E,CAAO,EAAE,YAAW,GACjCA,EAAQ,MAAM,GAAG,CAAC,MAAM,QAAKA,IAAUA,EAAQ,MAAM,CAAC,IACtDA,EAAQ,MAAM,EAAE,MAAM,QAAKA,IAAUA,EAAQ,MAAM,GAAG,EAAE,IACrDA;AAAA,EACT;AAQA,WAASC,EAAUrD,GAAM;AACvB,WAAOA,EAAK,MAAM,GAAG,CAAC,MAAM;AAAA,EAC9B;AAUA,WAASsD,EAAStD,GAAMQ,GAAOK,GAAY;AAGzC,QAAI+B,IAAU,IACVjE,IAAU,GACV4E,IAAW,IACXC,IAAa,IACbC,IAAa,GACbvB,IAAMlC,EAAK,QACX0D,IAAiB,IACjBC,IAAc;AAElB,IAAAC,EAAc,MAAKH,IAAa,GAAGA,IAAavB,GAAKuB,KAAc;AACjE,UAAIzE,IAAIgB,EAAK,OAAOyD,CAAU;AAC9B,UAAIF,MAAa;AACf,YAAIvE,MAAM,KAAK;AACb,UAAAuE,IAAWE;AACX;AAAA,QACR;AAAA,iBAEUD,MAAe,IAAO;AACxB,YAAIxE,MAAM,KAAK;AACb,UAAA4D,KAAW/B,EAAWb,EAAK,MAAMrB,GAAS8E,CAAU,CAAC,GACrDF,IAAWE,GACX9E,IAAU8E;AACV;AAAA,QACV;AACQ,YAAIzE,MAAM,OAAOyE,MAAevB,IAAM,GAAG;AACvC,UAAAU,KAAW/B,EAAWb,EAAK,MAAMrB,GAAS4E,CAAQ,CAAC,GACnDI,IAAc3D,EAAK,MAAMuD,GAAUE,IAAa,CAAC,GACjDC,IAAiBP,EAAWQ,CAAW,GACvCf,KAAWpC;AAAA,YACT+C;AAAA,YACAX,EAAQ;AAAA,YACRc;AAAA,YACAC;AAAA,YACAN,EAAUM,CAAW;AAAA,aAEvBhF,IAAU8E,IAAa,GACvBF,IAAW;AACX;AAAA,QACV;AACQ,YAAIvE,MAAM,OAAOA,MAAM;AAIrB,mBAHIhB,IAAI,GACJ6F,IAAK7D,EAAK,OAAOyD,IAAazF,CAAC,GAE5B6F,EAAG,KAAI,MAAO,MAAMA,MAAO,OAAK;AACrC,gBAAIA,MAAO,KAAK;AACd,cAAAL,IAAaxE;AACb,uBAAS4E;AAAA,YACvB;AACY,YAAAC,IAAK7D,EAAK,OAAOyD,IAAa,EAAEzF,CAAC;AAAA,UAC7C;AAAA,MAEA,WACYgB,MAAMwE,GAAY;AACpB,QAAAA,IAAa;AACb;AAAA,MACV;AAAA,IAGA;AACE,WAAI7E,IAAUuD,MACZU,KAAW/B,EAAWb,EAAK,OAAOrB,CAAO,CAAC,IAGrCiE;AAAA,EACT;AAEA,MAAIkB,IAA2B;AAS/B,WAASC,EAAU/D,GAAM1C,GAAQ;AAG/B,QAAIqB,IAAU,GACVqF,IAAc,GACdC,IAAW,CAAA,GACXC,IAAU,IACVhC,IAAMlC,EAAK;AAEf,aAASmE,EAAQ5G,GAAMC,GAAO;AAG5B,UAFAD,IAAOc,EAAE,KAAKd,CAAI,GAClBA,IAAOA,EAAK,QAAQuG,GAA0B,EAAE,EAAE,YAAW,GACzD,EAAAvG,EAAK,SAAS,IAClB;AAAA,YAAIwB,IAAMzB,EAAOC,GAAMC,KAAS,EAAE;AAClC,QAAIuB,KAAKkF,EAAS,KAAKlF,CAAG;AAAA;AAAA,IAC9B;AAGE,aAASf,IAAI,GAAGA,IAAIkE,GAAKlE,KAAK;AAC5B,UAAIgB,IAAIgB,EAAK,OAAOhC,CAAC,GACjBoG,GAAGnG;AACP,UAAIiG,MAAY,MAASlF,MAAM,KAAK;AAClC,QAAAkF,IAAUlE,EAAK,MAAMrB,GAASX,CAAC,GAC/BW,IAAUX,IAAI,GACdgG,IAAchE,EAAK,OAAOrB,CAAO,MAAM,OAAOqB,EAAK,OAAOrB,CAAO,MAAM,MAAMA,IAAU0F,EAAsBrE,GAAMhC,IAAI,CAAC;AACxH;AAAA,MACN;AACI,UAAIkG,MAAY,MAEZlG,MAAMgG,GACN;AAEA,YADA/F,IAAI+B,EAAK,QAAQhB,GAAGhB,IAAI,CAAC,GACrBC,MAAM;AACR;AAEA,QAAAmG,IAAI/F,EAAE,KAAK2B,EAAK,MAAMgE,IAAc,GAAG/F,CAAC,CAAC,GACzCkG,EAAQD,GAASE,CAAC,GAClBF,IAAU,IACVlG,IAAIC,GACJU,IAAUX,IAAI;AACd;AAAA,MAEV;AAEI,UAAI,WAAW,KAAKgB,CAAC;AAEnB,YADAgB,IAAOA,EAAK,QAAQ,aAAa,GAAG,GAChCkE,MAAY;AAEd,cADAjG,IAAIqG,EAActE,GAAMhC,CAAC,GACrBC,MAAM,IAAI;AACZ,YAAAmG,IAAI/F,EAAE,KAAK2B,EAAK,MAAMrB,GAASX,CAAC,CAAC,GACjCmG,EAAQC,CAAC,GACTF,IAAU,IACVvF,IAAUX,IAAI;AACd;AAAA,UACV,OAAe;AACL,YAAAA,IAAIC,IAAI;AACR;AAAA,UACV;AAAA,iBAEQA,IAAIsG,EAAgBvE,GAAMhC,IAAI,CAAC,GAC3BC,MAAM,IAAI;AACZ,UAAAmG,IAAI/F,EAAE,KAAK2B,EAAK,MAAMrB,GAASX,CAAC,CAAC,GACjCoG,IAAII,EAAeJ,CAAC,GACpBD,EAAQD,GAASE,CAAC,GAClBF,IAAU,IACVvF,IAAUX,IAAI;AACd;AAAA,QACV;AACU;AAAA,IAIV;AAEE,WAAIW,IAAUqB,EAAK,WACbkE,MAAY,KACdC,EAAQnE,EAAK,MAAMrB,CAAO,CAAC,IAE3BwF,EAAQD,GAASM,EAAenG,EAAE,KAAK2B,EAAK,MAAMrB,CAAO,CAAC,CAAC,CAAC,IAIzDN,EAAE,KAAK4F,EAAS,KAAK,GAAG,CAAC;AAAA,EAClC;AAEA,WAASK,EAAclG,GAAKJ,GAAG;AAC7B,WAAOA,IAAII,EAAI,QAAQJ,KAAK;AAC1B,UAAIgB,IAAIZ,EAAIJ,CAAC;AACb,UAAIgB,MAAM;AACV,eAAIA,MAAM,MAAYhB,IACf;AAAA,IACX;AAAA,EACA;AAEA,WAASqG,EAAsBjG,GAAKJ,GAAG;AACrC,WAAOA,IAAII,EAAI,QAAQJ,KAAK;AAC1B,UAAIgB,IAAIZ,EAAIJ,CAAC;AACb,UAAIgB,MAAM;AACV,eAAIA,MAAM,OAAOA,MAAM,MAAYhB,IAC5B;AAAA,IACX;AAAA,EACA;AAEA,WAASuG,EAAgBnG,GAAKJ,GAAG;AAC/B,WAAOA,IAAI,GAAGA,KAAK;AACjB,UAAIgB,IAAIZ,EAAIJ,CAAC;AACb,UAAIgB,MAAM;AACV,eAAIA,MAAM,MAAYhB,IACf;AAAA,IACX;AAAA,EACA;AAEA,WAASyG,EAAkBlJ,GAAM;AAC/B,WACGA,EAAK,CAAC,MAAM,OAAOA,EAAKA,EAAK,SAAS,CAAC,MAAM,OAC7CA,EAAK,CAAC,MAAM,OAAOA,EAAKA,EAAK,SAAS,CAAC,MAAM;AAAA,EAMlD;AAEA,WAASiJ,EAAejJ,GAAM;AAC5B,WAAIkJ,EAAkBlJ,CAAI,IACjBA,EAAK,OAAO,GAAGA,EAAK,SAAS,CAAC,IAE9BA;AAAA,EAEX;AAEA,SAAA0D,GAAA,WAAmBqE,GACnBrE,GAAA,YAAoB8E;;;;;;AC1PpB,MAAIvE,IAAYlB,GAAA,EAAqB,WACjCY,IAAUC,GAAA,GACVF,IAASG,GAAA,GACTkE,IAAWrE,EAAO,UAClB8E,IAAY9E,EAAO,WACnBZ,IAAIqG,GAAA;AAQR,WAASrF,EAAOC,GAAK;AACnB,WAA4BA,KAAQ;AAAA,EACtC;AAUA,WAASqF,EAAS3E,GAAM;AACtB,QAAIhC,IAAIK,EAAE,WAAW2B,CAAI;AACzB,QAAIhC,MAAM;AACR,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAASgC,EAAKA,EAAK,SAAS,CAAC,MAAM;AAAA;AAGvC,IAAAA,IAAO3B,EAAE,KAAK2B,EAAK,MAAMhC,IAAI,GAAG,EAAE,CAAC;AACnC,QAAIqF,IAAYrD,EAAKA,EAAK,SAAS,CAAC,MAAM;AAC1C,WAAIqD,MAAWrD,IAAO3B,EAAE,KAAK2B,EAAK,MAAM,GAAG,EAAE,CAAC,IACvC;AAAA,MACL,MAAMA;AAAA,MACN,SAASqD;AAAA;EAEb;AAQA,WAAS9D,EAAkBD,GAAK;AAC9B,QAAIP,IAAM,CAAA;AACV,aAAS,KAAKO;AACZ,MAAAP,EAAI,CAAC,IAAIO,EAAI,CAAC;AAEhB,WAAOP;AAAA,EACT;AAEA,WAAS6F,EAAgBtF,GAAK;AAC5B,QAAIP,IAAM,CAAA;AACV,aAAS,KAAKO;AACZ,MAAI,MAAM,QAAQA,EAAI,CAAC,CAAC,IACtBP,EAAI,EAAE,aAAa,IAAIO,EAAI,CAAC,EAAE,IAAI,SAAUvE,GAAM;AAChD,eAAOA,EAAK,YAAW;AAAA,MAC/B,CAAO,IAEDgE,EAAI,EAAE,YAAW,CAAE,IAAIO,EAAI,CAAC;AAGhC,WAAOP;AAAA,EACT;AAWA,WAAS8F,EAAUpH,GAAS;AAC1B,IAAAA,IAAU8B,EAAkB9B,KAAW,EAAE,GAErCA,EAAQ,mBACNA,EAAQ,eACV,QAAQ;AAAA,MACN;AAAA,OAGJA,EAAQ,cAAcyB,EAAQ,sBAE5BzB,EAAQ,aAAaA,EAAQ,YAC/BA,EAAQ,YAAYmH,EAAgBnH,EAAQ,aAAaA,EAAQ,SAAS,IAE1EA,EAAQ,YAAYyB,EAAQ,WAG9B,KAAK,oBAAoBzB,EAAQ,+BAA+B,KAAO,MAAMyB,EAAQ,mBAErFzB,EAAQ,QAAQA,EAAQ,SAASyB,EAAQ,OACzCzB,EAAQ,YAAYA,EAAQ,aAAayB,EAAQ,WACjDzB,EAAQ,cAAcA,EAAQ,eAAeyB,EAAQ,aACrDzB,EAAQ,kBAAkBA,EAAQ,mBAAmByB,EAAQ,iBAC7DzB,EAAQ,gBAAgBA,EAAQ,iBAAiByB,EAAQ,eACzDzB,EAAQ,aAAaA,EAAQ,cAAcyB,EAAQ,YACnD,KAAK,UAAUzB,GAEXA,EAAQ,QAAQ,KAClB,KAAK,YAAY,MAEjBA,EAAQ,MAAMA,EAAQ,OAAO,CAAA,GAC7B,KAAK,YAAY,IAAI+B,EAAU/B,EAAQ,GAAG;AAAA,EAE9C;AAQA,SAAAoH,EAAU,UAAU,UAAU,SAAU7E,GAAM;AAI5C,QAFAA,IAAOA,KAAQ,IACfA,IAAOA,EAAK,SAAQ,GAChB,CAACA,EAAM,QAAO;AAElB,QAAIP,IAAK,MACLhC,IAAUgC,EAAG,SACbpC,IAAYI,EAAQ,WACpB+C,IAAQ/C,EAAQ,OAChBiD,IAAcjD,EAAQ,aACtBkD,IAAYlD,EAAQ,WACpBmD,IAAkBnD,EAAQ,iBAC1BG,IAAgBH,EAAQ,eACxBoD,IAAapD,EAAQ,YACrBqH,IAAoBrF,EAAG,mBACvBuB,IAAYvB,EAAG;AAGnB,IAAIhC,EAAQ,mBACVuC,IAAOd,EAAQ,eAAec,CAAI,IAI/BvC,EAAQ,oBACXuC,IAAOd,EAAQ,gBAAgBc,CAAI;AAIrC,QAAI+E,IAAqB;AACzB,IAAItH,EAAQ,uBACVsH,IAAqB7F,EAAQ;AAAA,MAC3BzB,EAAQ;AAAA,MACRiD;AAAA,OAEFA,IAAcqE,EAAmB;AAGnC,QAAIhC,IAAUO;AAAA,MACZtD;AAAA,MACA,SAAUN,GAAgBC,GAAUc,GAAKT,GAAMqD,GAAW;AACxD,YAAI2B,IAAO;AAAA,UACT,gBAAgBtF;AAAA,UAChB,UAAUC;AAAA,UACV,WAAW0D;AAAA,UACX,SAAS,OAAO,UAAU,eAAe,KAAKhG,GAAWoD,CAAG;AAAA,WAI1D1B,IAAMyB,EAAMC,GAAKT,GAAMgF,CAAI;AAC/B,YAAI,CAAC3F,EAAON,CAAG,EAAG,QAAOA;AAEzB,YAAIiG,EAAK,SAAS;AAChB,cAAIA,EAAK;AACP,mBAAO,OAAOvE,IAAM;AAGtB,cAAIwE,IAAQN,EAAS3E,CAAI,GACrBkF,IAAgB7H,EAAUoD,CAAG,GAC7B0E,IAAYpB,EAAUkB,EAAM,MAAM,SAAU1H,GAAMC,GAAO;AAE3D,gBAAI4H,IAAc/G,EAAE,QAAQ6G,GAAe3H,CAAI,MAAM,IACjDwB,IAAM4B,EAAUF,GAAKlD,GAAMC,GAAO4H,CAAW;AACjD,mBAAK/F,EAAON,CAAG,IAEXqG,KAEF5H,IAAQI,EAAc6C,GAAKlD,GAAMC,GAAOwD,CAAS,GAC7CxD,IACKD,IAAO,MAAMuH,IAAoBtH,IAAQsH,IAEzCvH,MAITwB,IAAM6B,EAAgBH,GAAKlD,GAAMC,GAAO4H,CAAW,GAC9C/F,EAAON,CAAG,IACf,SADyBA,KAbFA;AAAA,UAgBnC,CAAS;AAGD,iBAAAiB,IAAO,MAAMS,GACT0E,MAAWnF,KAAQ,MAAMmF,IACzBF,EAAM,YAASjF,KAAQ,OAC3BA,KAAQ,KACDA;AAAA,QACf;AAGQ,iBADAjB,IAAM2B,EAAYD,GAAKT,GAAMgF,CAAI,GAC5B3F,EAAON,CAAG,IACR8B,EAAWb,CAAI,IADGjB;AAAA,MAGjC;AAAA,MACI8B;AAAA;AAIF,WAAIkE,MACFhC,IAAUgC,EAAmB,OAAOhC,CAAO,IAGtCA;AAAA,EACT,GAEA9C,KAAiB4E;;;;;ACjOjB,QAAI3F,IAAUZ,GAAA,GACVW,IAASE,GAAA,GACT0F,IAAYzF,GAAA;AAShB,aAASiG,EAAUrF,GAAMvC,GAAS;AAChC,UAAIwC,IAAM,IAAI4E,EAAUpH,CAAO;AAC/B,aAAOwC,EAAI,QAAQD,CAAI;AAAA,IACzB;AAEAE,IAAAA,IAAUC,YAAiBkF,GAC3BnF,EAAA,YAAoBmF,GACpBnF,EAAA,YAAoB2E,IAEnB,WAAY;AACX,eAAS7G,KAAKkB;AACZgB,QAAAA,EAAQlC,CAAC,IAAIkB,EAAQlB,CAAC;AAExB,eAASC,KAAKgB;AACZiB,QAAAA,EAAQjC,CAAC,IAAIgB,EAAOhB,CAAC;AAAA,IAEzB,GAAC,GAGG,OAAO,SAAW,QACpB,OAAO,YAAYkC,EAAO;AAI5B,aAASmF,IAAc;AACrB,aACE,OAAO,OAAS,OAChB,OAAO,6BAA+B,OACtC,gBAAgB;AAAA,IAEpB;AACA,IAAIA,EAAW,MACb,KAAK,YAAYnF,EAAO;AAAA;;;ACzBnB,MAAMoF,KAAyB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAMaC,KAA0B;AAAA,EACnC,GAAG,CAAC,MAAM;AACd,GAEaC,KAAmC,CAAC,SAAS,UAAU,SAAS,GAKhEC,KAA8B,OAAO,YAAYH,GAAuB,IAAI,CAAC9E,MAAQ;AAAA,EAC9FA;AAAA,EACA+E,GAAwB/E,CAAG,KAAK,CAAA;AACpC,CAAC,CAAC;ACjCF,SAASkF,GAAWnI,GAAO;AACvB,QAAM4G,IAAI5G,EAAM,KAAI;AACpB,MAAI4G,MAAM;AACN,WAAO;AAEX,MAAIA,EAAE,WAAW,GAAG,KAAKA,EAAE,WAAW,GAAG,KAAKA,EAAE,WAAW,GAAG;AAC1D,WAAO;AACX,QAAMwB,IAAcxB,EAAE,MAAM,wBAAwB;AACpD,SAAKwB,IAEEH,GAAiC,SAASG,EAAY,CAAC,EAAE,YAAW,IAAK,GAAG,IADxE;AAEf;AACA,MAAMC,KAAS,IAAIhB,GAAAA,UAAU;AAAA,EACzB,WAAWa;AAAA;AAAA;AAAA,EAGX,gBAAgB;AAAA;AAAA;AAAA,EAGhB,oBAAoB,CAAC,UAAU,OAAO;AAAA,EACtC,iBAAiB;AAAA,EACjB,KAAK;AAAA,EACL,cAAcjF,GAAKlD,GAAMC,GAAO;AAC5B,WAAIiD,MAAQ,OAAOlD,MAAS,UACjBoI,GAAWnI,CAAK,IAAIA,IAExB;AAAA,EACX;AACJ,CAAC;AAKM,SAASsI,GAA6BC,GAAO;AAChD,SAAKA,IAIEF,GACF,QAAQ,OAAOE,CAAK,CAAC,EACrB,QAAQ,2BAA2B,KAAK,IALlC;AAMf;;kBC7DA;;AAeE,MAAM/F,IAAIzH,EAAA,KAAAC,GAAA,QAAA,GAAG,EAAE,GAASG,0BAAY,EAAE,GAIlCqN,IAAIzN,EAAA,QAAA,MAAYuN,GAA6B9F,EAAI,CAAA,CAAA;;;;UAKpD/G,IAAGC,GAAA;AAAH,MAAAX,EAAA,KAAAU,eAA4C+M,CAAI,GAAA,EAAA,WAAhD/M,CAAG,GAAHV,EAAA,gBAAA,MAAAA,EAAA,UAAAU,mBAAwBN,EAAS,CAAA,EAAA,CAAA,eAAjCM,CAAG;AAAA;;YAFD+M,CAAI,KAAAzL,EAAAC,CAAA;AAAA;;;AAFD;;kBCpBR;;AAoCE,MACEyL,IAAK1N,EAAA,KAAAC,GAAA,SAAA,GAAG,EAAE,GACV0N,8BAAY,IAAI,GAChBC,wBAAM,GAAG,GACFxN,0BAAY,EAAE,GACrByN,+BAAa,EAAE;AAIjB,QAAMC,IAAoC;AAAA,IACxC,IAAIlL,GAAW;AAAA,IACf,IAAIA,GAAW;AAAA,IACf,IAAIA,GAAW;AAAA,KAGXmL,IAA8B;AAAA,IAClC,GAAK;AAAA,IACL,GAAK;AAAA,IACL,GAAK;AAAA,IACL,GAAK;AAAA;AAGP,MAAIC,qBAEAN,EAAK,IAAGK,EAAOH,EAAG,MAAK,cAAc,IACrCxN,EAAQ,GACR,OAAO,OAAO,EAAE,KAAK,GAAG,CAAA,GAGxB6N,IAAYjO,EAAA,QAAA,MAAA,CAEZ8N,EAAaH,EAAS,CAAA,KAAKG,EAAa,IACxCD,EAAS,GACT,OAAO,OAAO,EAAE,KAAK,GAAG,CAAA;MAI7BK,IAAOtJ,GAAA,eAAPsJ,CAAO;;;UAEHrL,IAAElC,GAAA,eAAFkC,GAAE,EAAA;cAAFA,CAAE;AAAF,QAAA7C,EAAA,UAAA6C,mBAAUoL,CAAY,CAAA,CAAA,iBAAGP,GAAK;AAAA,sBAA9B7K,CAAE;AAAA;;MADA6K,EAAK,KAAA1L,EAAAC,CAAA;AAAA;;;oDADXiM,CAAO;AAAP,IAAAlO,EAAA,UAAAkO,mBAAeF,CAAc,CAAA,CAAA,mBAA7BE,GAAO,cAAoCR,EAAK,KAAI,MAAS;AAAA,kBAA7DQ,CAAO;AAFA;AC3CD,SAASC,GACdC,GACAC,GACAC,GACAC,GACAC,GACa;AACb,QAAMC,IAAqB,CAAA;AAC3B,MAAIC,IAAW,GACXC,IAAO,GACPC,IAAgB,GAIhBC,IAAkB;AAEtB,aAAWC,KAAUV,GAAS;AAC5B,UAAMW,IAAMV,EAAWS,EAAO,EAAE,KAAK;AACrC,QAAIC,KAAO,EAAG;AAEd,UAAMC,IAAaF,EAAO,cAAcA,EAAO,eAAe,GACxDG,IAAWD,IACb,WAAWV,EAAgBQ,EAAO,EAAE,CAAC,KAAK,IAC1CA,EAAO;AAMX,QAAIG,KAAY,QAAQ,CAAC,OAAO,SAASA,CAAQ,GAAG;AAClD,MAAAR,EAAM,KAAK;AAAA,QACT,UAAUS,GAAWJ,EAAO,EAAE;AAAA,QAC9B,YAAYA,EAAO;AAAA,QACnB,UAAUC;AAAA,QACV,WAAW;AAAA,QACX,KAAKD,EAAO;AAAA,QACZ,UAAU;AAAA,QACV,YAAY;AAAA,MAAA,CACb,GACDD,IAAkB;AAClB;AAAA,IACF;AAEA,UAAMM,IAAoBF,GACpBG,IAAYJ,IAAa,IAAIF,EAAO;AAG1C,QAAIO,IAAiB;AACrB,QAAId,EAAW,aAAaA,EAAW,iBAAiB,KAAK,CAACS,MAE1DT,EAAW,kBAAkB,WAAW,KACxCA,EAAW,kBAAkB,SAASO,EAAO,EAAE;AAE/C,UAAIP,EAAW,iBAAiB,KAAK;AAKnC,cAAMe,IAAUf,EAAW;AAC3B,QAAAc,IAAiB,KAAK,IAAIF,GAAWA,KAAaG,IAAU,IAAI;AAAA,MAClE,MAAA,CAAWf,EAAW,iBAAiB,QACrCc,IAAiB,KAAK,IAAId,EAAW,gBAAgBY,CAAS;AAOpE,UAAMI,IAAiBJ,IAAYJ;AAEnC,IAAAN,EAAM,KAAK;AAAA,MACT,UAAUS,GAAWJ,EAAO,EAAE;AAAA,MAC9B,YAAYA,EAAO;AAAA,MACnB,UAAUC;AAAA,MACV,WAAWI;AAAA,MACX,KAAKC;AAAA,MACL,UAAUG;AAAA,MACV,YAAAP;AAAA,IAAA,CACD,GAEDN,KAAYa,GACZZ,KAAQS,IAAYL,GACpBH,KAAiBS,IAAiBN;AAAA,EACpC;AAYA,MAPAL,IAAWc,GAAcd,CAAQ,GACjCC,IAAOa,GAAcb,CAAI,GACzBC,IAAgBY,GAAcZ,CAAa,GAKvCC;AACF,WAAO;AAAA,MACL,OAAAJ;AAAA,MACA,UAAU;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,eAAAG;AAAA,MACA,gBAAgB;AAAA,IAAA;AAMpB,QAAMa,IAAqBD;AAAA,IACzB,KAAK,IAAI,GAAGd,IAAWE,CAAa;AAAA,EAAA,GAEhCc,IAAQC,GAAaF,IAAqBd,GAAMH,CAAa;AAEnE,SAAO;AAAA,IACL,OAAAC;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC;AAAA,IACA,OAAAe;AAAA,IACA,OAAOF,GAAcC,IAAqBd,IAAOe,CAAK;AAAA,IACtD,eAAAd;AAAA,IACA,gBAAgB;AAAA,EAAA;AAEpB;AC7IA,MAAMgB,KAASC,GAAa,aAAa,GAInCC,KAAc;AAYpB,SAASC,GACPC,GACwB;AACxB,QAAMC;AACN,aAAW,CAACC,GAAGrE,CAAC,KAAK,OAAO,QAAQmE,CAAC,GAAG;AACtC,UAAMG,IAAI,OAAOtE,CAAC,KAAK;AACvB,IAAIsE,IAAI,MAAGF,EAAI,OAAOC,CAAC,CAAA,IAAKC;AAAA,EAC9B;AACA,SAAOF;AACT;AAEA,SAASG,GACPC,GACwB;AACxB,QAAMJ;AACN,MAAA,CAAKI,EAAG,QAAOJ;AACf,aAAW,CAACC,GAAGrE,CAAC,KAAK,OAAO,QAAQwE,CAAC,GAAG;AACtC,UAAMF,IAAI,WAAWtE,CAAC;AACtB,IAAI,OAAO,SAASsE,CAAC,KAAKA,IAAI,MAAGF,EAAI,OAAOC,CAAC,KAAKC;AAAA,EACpD;AACA,SAAOF;AACT;AAoBO,MAAMK,GAAY;AAAA;;;;;;;;;;;;;;EAAlB,cAAA;AAGU,SAAAC,KAAAvQ,EAAA,MAAiC,IAAI,GAE1C,KAAAwQ,KAAAxQ,EAAA,MAAO,EAAK,GAEtB,KAAAyQ,KAAyB,MACzB,KAAAC,KAAuC,MACvC,KAAAC,KAAe,IACf,KAAAC,KAAO,GACP,KAAAC,KAA+C;AAAA,EAAA;AAAA;;;;;;;EAI/C,SAASC,GAA2B;AAClC,IAAI,KAAAD,MAAa,aAAa,KAAAA,EAAW;AACzC,UAAMb,IAAID,GAAoBe,EAAM,UAAU;AAE9C,QAAI,OAAO,KAAKd,CAAC,EAAE,WAAW,GAAG;AAC/B,iBACA,KAAK,eAAe,MACpB,KAAK,UAAU;AACf;AAAA,IACF;AACA,SAAK,UAAU,IACf,KAAAa,KAAc;AAAA,YAAiB;QACxB,KAAAE,GAAUD,CAAK;AAAA,MACtB;AAAA,MAAGhB;AAAA;EACL;AAAA,EAEA,MAAMiB,GAAKD,GAAoC;AAC7C,UAAME,IAAA,EAAU,SACVC,IAAYH,EAAM,WAAW,KAAA,KAAU;AAC7C,QAAI;AASF,UALM,CACH,KAAAL,MACD,KAAAC,OAAsBI,EAAM,WAAA,CAC1BG,KAAA,CAAA,CAAe,SAEA;AACjB,cAAMC,IAAM,MAAMC,GAAA,GACbC,eACD,SAAS,OAAON,EAAM,OAAO,GAAG,YAAA,CAAA,EAAA,CAAA;AAEpC,YAAIE,MAAU,QAAW;AACzB,aAAAP,KAAeS,EAAI,UACdA,EAAI,MAAM,YAAYA,EAAI,MAAM,QAAQ,OACzC,MACJ,KAAAR,KAAoBI,EAAM,SAC1B,KAAAH,KAAoB;AAAA,MACtB;AAEA,UAAA,CAAK,SAAc;AACjB,QAAIK,MAAU,KAAAJ,OAAW,KAAK,UAAU;AACxC;AAAA,MACF;AAEA,YAAMvC,IAAa0B,GAAoBe,EAAM,UAAU,GACjDO,IAAYjB,GAAmBU,EAAM,eAAe;AAM1D,UAAIG,GAAW;AAEb,YADA,MAAMK,GAAe,SAAcL,GAAW5C,CAAU,GACpD2C,MAAU,QAAW;AACzB,aAAAL,KAAoBM;AAAA,MACtB;AAEA,YAAMM,IAAK,MAAMC,GAAoB,KAAAf,IAAcpC,GAAYgD,CAAS;AACxE,UAAIL,MAAU,QAAW;AACzB,WAAK,eAAeO,IAAKE,GAAmCF,CAAE,IAAI;AAAA,IACpE,SAASG,GAAK;AACZ,MAAA9B,GAAO,MAAM,gDAAgD8B,CAAG;AAAA,IAElE,UAAA;AACE,MAAIV,MAAU,KAAAJ,OAAW,KAAK,UAAU;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA,EAGA,QAAc;AACZ,eACI,KAAAC,MAAa,aAAa,KAAAA,EAAW,GACzC,KAAAA,KAAc,MACd,KAAAJ,KAAe,MACf,KAAAC,KAAoB,MACpB,KAAAC,KAAoB,IACpB,KAAK,eAAe,MACpB,KAAK,UAAU;AAAA,EACjB;AACF;kBCnKA;AAUiC,EAAA3Q,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GAWhC0E,GAAK5D,GAAA;AAAA;;;;;;;aAGM4Q;AAAA;;;;AAbJ;;kBCXR;;AAoCE,MAEEC,IAAY5R,EAAA,KAAAC,GAAA,gBAAA,GAAG,EAAK,GACpB4R,8BAAY,EAAK;AACF,EAAA7R,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA;AACf,MAAA6R,2BAAS,MAAS,GAGhBC,IAA4B/R,EAAA,QAAA,MAC9BgS,GAAgB/R,EAAA,MAAO,+BAA6B,oBAAoB,CAAA,GAEtEgS,oBACFC,GAAelS,EAAA,IAAC+R,CAAa,GAAA9R,EAAA,MAAQ,uBAAuB,OAAO,CAAA,GAGjEkS,oBAEElS,EAAA,MAAS,gCACD,kBAAcA,EAAA,MAAU,iBAAiB,oBAC5B,cAAc,MAE9B,aAJkC,IAK1C;AAQH,QAAMmS,IAAgBC,GAAuB;AAE7C,WAASC,IAAa;AACpB,UAAMC,IAAG,OACA,SAAW,MACX,GAAA,OAAO,SAAS,MAAM,MAAAtS,EAAA,MAAY,EAAE,YAAU,IAAI,KACrD;AACN,IAAAmS,EAAc,MAAMG,CAAG;AAAA,EACzB;AAEA,EAAAC,GAAUJ,EAAc,OAAO,GAI/BpS,EAAA,kBAAc;AACZ,IAAIoS,EAAc,cAAc,YAC9BK,GAAQ,iCAAkCL,EAAc,aAAa,IAAA,EACnE,YAAY,YAAW,CAAA;AAAA,EAE7B,CAAC;MAGF1R,IAAGgS,GAAA,GACDrP,YADF3C,CAAG,eACD2C,CAAG;AACD,EAAAsP,GAAOC,GAAA;AAAA,WAAQ;AAAA;;;;;oDACP,KAAK,CAAA;;;;;;;AAGX,MAAAC,GAAa9R,GAAA;AAAA;yBACK;AAAA;;yBACJ;AAAA;;;;;YAHZkR,CAAY,KAAAhS,EAAA,MAAU,WAAW,aAAS+B,EAAAC,CAAA;AAAA;;UAJhDoB,CAAG;AAcH,MAAAyP,cAdAzP,GAAG,CAAA,eAcHyP,CAAG;AACD,EAAAC,GAAMnP,GAAA;AAAA;;aAAoC0O;AAAA;;AACxC,MAAAU,GAAUC,GAAA,EAAA,MAAA,MAAA,OAAA,YAAA;;AACV,MAAAjT,EAAA,gBAAA,MAAAA,EAAA,SAAAkT,GAAA,IAAAd,EAAc,cAAc,WAAW,gBAAgB,OAAO,EAAA,CAAA;;;;;;;UAG9DrP,IAAI6B,GAAA,GAEFuO,sBAFFpQ,CAAI,CAAA,eAEFoQ,GAAI,EAAA;cAAJA,CAAI,WAFNpQ,CAAI,GAEqB/C,EAAA,gBAAA,MAAAA,EAAA,SAAAoT,GAAAhB,EAAc,aAAa,CAAA,eAFpDrP,CAAI;AAAA;;MADFqP,EAAc,cAAc,YAAQpQ,EAAAmB,CAAA;AAAA;;UAL1C2P,CAAG;oBAAHA,GAAG,CAAA;;;oBAeDO,IAAGrT,EAAA,YAAAsT,CAAA,eAAHD,CAAG;AACD,MAAAE,GAAYC,GAAA,EAAA,MAAA,MAAA,OAAA,8BAAA;UACZC,IAAIzT,EAAA,QAAAwT,GAAA,CAAA,eAAJC,GAAI,EAAA;cAAJA,CAAI,WAFNJ,CAAG;wBAAHA,GAAG,CAAA;;;cAaDK,IAAGC,GAAA,eAAHD,CAAG;AACD,UAAAE,GAASC,GAAA,EAAA,MAAA,MAAA,OAAA,8BAAA;cACTC,IAAG9T,EAAA,QAAA6T,GAAA,CAAA,eAAHC,CAAG;;;kBAECC,KAAIjS,GAAA,gBAAJiS,IAAI,EAAA;sBAAJA,EAAI;gBACD,MAAAC,WACM,eAAa/T,EAAA,MACb,aAAWA,EAAA,MACX,UACN6R,EAAM,CAAA;AAAA,8BALTiC,EAAI;AAAA;kBASJE,KAAInS,GAAA,gBAAJmS,IAAI,EAAA;sBAAJA,EAAI;gBACD,MAAAC,GAAejU,EAAA,MACT,eAAaA,EAAA,MACb,UACN6R,EAAM,CAAA;AAAA,8BAJTmC,EAAI;AAAA;;AAVI,cAAAhU,EAAA,MAAA,mBAAmB,KAAK+B,EAAAmS,CAAA,IAAAnS,EAAAE,GAAA,EAAA;AAAA;;;;;kBAmBhCkS,KAAIC,GAAA,gBAAJD,EAAI;sBAAJA,EAAI;gBACU,MAAAE,GAAerU,EAAA,MACpB,eAAaA,EAAA,MACb,UACN6R,EAAM,CAAA;AAAA,8BAJTsC,EAAI;AAAA;;sBADI,qBAAqB,MAAKnU,EAAA,MAAU,iBAAa+B,EAAAuS,CAAA;AAAA;;kBAnB7DT,CAAG,WAFLJ,CAAG,eAAHA,CAAG;AAAA;cAkCHc,IAAGC,GAAA,eAAHD,CAAG;AACD,UAAAZ,GAASc,GAAA,EAAA,MAAA,MAAA,OAAA,8BAAA;cACTC,IAAI3U,EAAA,QAAA0U,GAAA,CAAA,eAAJC,CAAI;kBAAJA,CAAI,WAFNH,CAAG;YAGa,MAAAF,GAAerU,EAAA,MACpB,eAAaA,EAAA,MACb,UACN6R,EAAM,CAAA;AAAA,0BANX0C,CAAG;AAAA;;AAnCK,UAAAvU,EAAA,MAAA,qBAAqB,KAAK+B,EAAA4S,CAAA,IAAA3U,EAAA,MAiCrB,qBAAqB,cAAe,iBAAa+B,EAAA6S,GAAA,CAAA;AAAA;;;QA1C3D,MAAAC,GAAqB7U,EAAA,MACf,eAAaA,EAAA,MACb,UACN6R,EAAM,CAAA;AAAA;;;MARRF,EAAY,KAAA5P,EAAA+S,CAAA;AAAA;;;;;oBAgEfC,IAAGhV,EAAA,YAAAiV,CAAA,eAAHD,CAAG;AACD,MAAAE,GAAYC,GAAA,EAAA,MAAA,MAAA,OAAA,8BAAA;UACZC,IAAGpV,EAAA,QAAAmV,GAAA,CAAA,GACDE,YADFD,CAAG,eACDC,GAAI,EAAA;cAAJA,CAAI;wBAAJA,GAAI,CAAA;;;cAEFC,IAAIjB,GAAA,eAAJiB,GAAI,EAAA;kBAAJA,CAAI,GAAwBtV,EAAA,gBAAA,MAAAA,EAAA,SAAAuV,GAAAtV,EAAA,MAAA,MAAM,OAAO,CAAA,eAAzCqV,CAAI;AAAA;;AADI,UAAArV,EAAA,MAAA,MAAM,WAAO+B,EAAAwT,CAAA;AAAA;;cAFzBJ,CAAG,WAFLJ,CAAG;wBAAHA,GAAG,CAAA;;;cAYDS,IAAGhB,GAAA,eAAHgB,CAAG;AACD,UAAAC,GAAYC,GAAA,EAAA,MAAA,MAAA,OAAA,8BAAA;cACZC,IAAI5V,EAAA,QAAA2V,GAAA,CAAA,eAAJC,GAAI,EAAA;kBAAJA,CAAI,WAFNH,CAAG,iDAE2B,SAAS,CAAA,eAFvCA,CAAG;AAAA;;kBADK,aAASzT,EAAA6T,CAAA;AAAA;;;;;cASjBC,IAAGrB,GAAA,eAAHqB,CAAG;AACD,UAAAC,GAAQC,GAAA,EAAA,MAAA,MAAA,OAAA,8BAAA;cACRC,IAAIjW,EAAA,QAAAgW,GAAA,CAAA,eAAJC,GAAI,EAAA;kBAAJA,CAAI,WAFNH,CAAG,+CAEqB3D,CAAO,CAAA,CAAA,eAF/B2D,CAAG;AAAA;;gBADD3D,CAAO,KAAAnQ,EAAAkU,CAAA;AAAA;;AAhBqB,MAAAlW,EAAA,gBAAA,MAAAA,EAAA,SAAAmW,GAAAlW,EAAA,MAAA,MAAM,IAAI,CAAA;;;MALvC4R,EAAS,KAAA7P,EAAAoU,CAAA;AAAA;;UA1FhB1V,CAAG,eAAHA,CAAG;AAFI;AClEN,MAAM2V,KAA2B,KAC3BC,KAGF,uBAAO,OAAO,IAAI;AACtB,SAASC,GAAiBC,GAAiB;AAIzC,GAHmBF,GAAcE,CAAO,MAAMC,GAC5CJ,EAAwB,GAEhBG,GAAO,EAAI,YAAY,SAAQ,CAAA;AAC3C;;kBAGF;;AA2CE,MAIEE,IAAc1W,EAAA,KAAAC,GAAA,kBAAA,GAAG,EAAE,GAEnB0W,sCAAoB,EAAK,GACzBC,wCAAsB,EAAK,GAC3BC,oCAAkB,IAAI,GACtBvU,2BAASF,EAAa,GAIpB4M,IAAUhP,EAAA,QAAA,MAAAC,EAAA,OAAmB,cAAUA,EAAA,OAAW,eAAe,CAAC,GAClE6W,6BACK,WAAW,cAAU7W,EAAA,OACnB,sBAAsB;AAAA;AAAA;AAAA;AAAA,EAKtBA,EAAA,OAAA,cACL,KAAK,IAAGA,EAAA,OAAQ,sBAAoB,iBAAiB,CAAA,GAEvD8W,IAAY/W,EAAA,QAAA,MAAAC,EAAA,OAAmB,WAAW,aAAa,GACvD+W,IAAYhX,EAAA,QAAA,MAAAC,EAAA,OAAmB,WAAW,aAAa,GACvDgX,IAAUjX,EAAA,QAAA,MAAAA,EAAA,IAAY8W,CAAS,KAAA9W,EAAA,IAAI+W,CAAY,WAAIC,CAAY,CAAA,GAE/DjF,IAA4B/R,EAAA,QAAA,MAC9BgS,GAAgB/R,EAAA,OAAQ,4BAA0B,aAAa,CAAA,GAE7DgS,oBACFC,GAAelS,EAAA,IAAC+R,CAAa,GAAA9R,EAAA,OAAS,mBAAmB,QAAQ,CAAA,GAI/DiX,IAAalX,EAAA,QAAA,MAAY,WAAW0W,EAAc,MAAK,CAAC,GACxDS,IAAanX,EAAA,QAAA,MAAAA,EAAA,IACfgP,CAAU,KAAI0H,EAAc,MAAK,MAAE1W,EAAA,IAAIkX,CAAa,IAAG,IACnD,kBACA,EAAE,GAEJE,IAAepX,EAAA,QAAA,MAAA,CAAAA,EAAA,IAChBgP,CAAU,KAAK0H,EAAc,MAAK,MAAE1W,EAAA,IAAIkX,CAAa,KAAI,CAAC,GAGzDG,iCAAmC,CAAC,GACpCC,2BACDL,CAAU,KAAAhX,EAAA,WAAAA,EAAA,OACS,eAAWA,EAAA,WAAAA,EAAA,OACX,2BAClBmX,CAAe,CAAA;AAGnB,WAASG,IAAY;AACnB,QAAEvX,EAAA,IAAEqX,CAAY,GAAE;AAEhB,YAAMG,iBAAoB;yBAExBtI,GAAUjP,EAAA,OAAQ,EAAE,GACpBuX,aAAgB,cAAc,IAAIA,CAAM,GAE1CC,GAAc,OAAO;AAAA,IACvB;AAAA,EACF;AAEA,WAASC,IAAY;AACnB,QAAE1X,EAAA,IAAEsX,CAAY,GAAE;AAGhB,YAAMK,IAAM1X,EAAA,aAAgB,IAACA,EAAA,OAAU,2BAAyB,GAC1DuX,IAAS,KAAK,IAClBG,GAAM1X,EAAA,OACC,aAAWA,EAAA,OACX,iBAAiB;yBAETiP,GAAUjP,EAAA,OAAQ,EAAE,GAAGuX,CAAM,GAC9CC,GAAc,OAAO;AAAA,IACvB;AAAA,EACF;AAKA,MAAIG,cAA8BlB,CAAc;AAGhD,WAASmB,IAAe;AACtB,IAAE7X,EAAA,IAAE4X,CAAkB,MAAKlB,EAAc,0BACpBxH,GAAUjP,EAAA,OAAQ,EAAE,GAAAD,EAAA,IAAG4X,CAAkB,CAAA;AAAA,EAEhE;AAKA,MAAIE,0BACF9I,CAAU,IACN,IACO/O,EAAA,OAAA,SAAS,OACd,OACOA,EAAA,OAAA,kBAAgB,UAAU,IAAI,aAAW,IAAG,GAEvD8X,IAAY/X,EAAA,QAAA,MAAAA,EAAA,IACdgP,CAAU,IAAG,KAAKgJ,GAAiBhY,EAAA,IAAC8X,CAAU,GAAExV,EAAM,CAAA,CAAA,GAEpD2V,IAAUjY,EAAA,QAAA,MAAA,CAAAA,EAAA,IACXgP,CAAU,KAAA/O,EAAA,OAAW,MAAM,KAACA,EAAA,OAAW,QAAQ,aACnCiY,GAAeC,GAAKlY,EAAA,OAAQ,GAAG,MAAMqC,IAAO,OAAO,KAAK,KACjE,EAAE,GAKJ8V,oBACFvB,QAAoB,QAAQA,QAAoB,SAC5C,OACAA,EAAe,KAAIA,EAAe,MAAK,IAAI,aAAW,IAAG,GAE3DwB,0BACFD,CAAe,MAAK,QAAIpY,EAAA,IAAIoY,CAAe,KAAI,CAAC,GAI9CE,IAAiBtY,EAAA,QAAA,MAAAA,EAAA,IACnB+W,CAAY,KAAA9W,EAAA,OAAW,iBACJ,eAAAsY,YAA4B,cAAc,CAAA,WACzDxB,CAAY,IACV,gBACA,EAAE,GAMNyB,IAAmB;AACvB,EAAAxY,EAAA,kBAAc;AACZ,UAAMgQ,IAAC/P,EAAA;AACP,QAAE,CAAGuY,GAAkB;AACrB,MAAAA,IAAmB;AACnB;AAAA,IACF;AAMA,IAAAjC,GAAgB,GAAAtW,EAAA,OACJ,IAAI,IAAIqC,EAAM,EAAC,gBAAgB,UAAU,KAAK0N,CAAC,EAAA;AAAA,EAE7D,CAAC;MAGFyI,IAAOC,GAAA;;AAML,MAAAhY,YANF+X,CAAO,GAQHpV,YAFF3C,CAAG,GAGCoS,YADFzP,CAAG,eACDyP,CAAG;AACD,EAAAH,GAAOC,GAAA;AAAA,WAAQ;AAAA;;;;;qDACN,IAAI,CAAA;;;;;;;AAGX,MAAA+F,GAAK5X,GAAA;AAAA;;;;gDAAkBuB,EAAM,EAAC,WAAW,UAAU,CAAA;;;;;AAEnD,MAAAqW,GAAK5X,GAAA;AAAA;;;;;;;;;AAEL,MAAA4X,GAAK5X,GAAA;AAAA;;;;;;;;;AAEL,MAAA4X,GAAK5X,GAAA;AAAA;;;;;;;;;AAEL,MAAA8R,GAAa9R,GAAA;AAAA;0BACM;AAAA;;0BACJ;AAAA;;;;;YAXb+V,CAAS,IAAA9U,EAAAC,CAAA,IAAAjC,EAAA,IAEJgX,CAAY,IAAAhV,EAAAmB,GAAA,CAAA,IAEZwT,EAAiB,cAEjBC,MAAmB5U,EAAAuS,GAAA,CAAA,IAAAvU,EAAA,IAEnBiS,CAAY,KAAA,CAAAjS,EAAA,IAAK+W,CAAY,KAAA/U,EAAA4S,GAAA,CAAA;AAAA;;UAZxC9B,CAAG;qBAAHA,GAAG,CAAA;;;UAsBDO,IAAG1S,GAAA,eAAH0S,CAAG;AACD,MAAAuF,GAAI3F,GAAA;AAAA;;;;;;0DACK,WAAW,CAAA;;;kBAFtBI,CAAG,eAAHA,CAAG;AAAA;;eADM,eAAWrR,EAAA6S,EAAA;AAAA;;MAStBnB,IAAG1T,EAAA,QAAA4D,IAAA,CAAA,eAAH8P,CAAG;;;UAGCI,IAAGlP,GAAA,eAAHkP,CAAG;;sCASOqD,CAAa,IAAG,QAAQ,MAAM;AARtC,QAAA0B,GAAKC,GAAA;AAAA;;;;;yBAMM7B,CAAU;AAAA;;yBACTE,CAAa;AAAA;;;;cAFxB,QAAU;yBAAES,CAAkB;AAAA;cAA9B,MAAUmB,IAAA;kBAAEnB,GAAkBmB,EAAA;AAAA;;;cANjCjF,CAAG,GAAH9T,EAAA,UAAA,SAAA8T,GAA4C+D,CAAY,eAAxD/D,CAAG;AAAA;UAgBH/Q,IAAIjB,GAAA,eAAJiB,GAAI,EAAA;cAAJA,CAAI;QACD,MAAAiV,GAAiBhY,EAAA,IAACoY,CAAe,KAAI,GAAG9V,EAAM,CAAA;AAAA,sBADjDS,CAAI;AAAA;oBAKJoQ,IAAInT,EAAA,YAAAgZ,CAAA,eAAJ7F,GAAI,EAAA;cAAJA,CAAI;AAMJ,UAAAM,eANAN,GAAI,CAAA,gBAMJM,IAAI,EAAA;cAAJA,EAAI;yBAAJA,IAAI,CAAA;;;cAOFM,KAAIM,GAAA,gBAAJN,IAAI,EAAA;kBAAJA,EAAI,gDAAoBkE,CAAU,CAAA,CAAA,gBAAlClE,EAAI;AAAA;;gBADFkE,CAAU,KAAAjW,GAAA6T,EAAA;AAAA;;;;;;;gBAXXmC,GACA,OAAO,SAAQhY,EAAA,IAAC8X,CAAU,CAAA,IAAA9X,EAAA,IAAI8X,CAAU,IAAG,GAC3CxV,EAAM,CAAA;AAAA,gBAIN0V,GACA,OAAO,SAAQhY,EAAA,IAACoY,CAAe,CAAA,IAAApY,EAAA,IAAIoY,CAAe,IAAG,GACrD9V,EAAM,CAAA;AAAA;;;UAQT2R,IAAIQ,GAAA,eAAJR,GAAI,EAAA;cAAJA,CAAI,+CAAoC8D,CAAY,CAAA,CAAA,eAApD9D,CAAI;AAAA;oBAGJG,IAAIpU,EAAA,YAAAiZ,CAAA,eAAJ7E,GAAI,EAAA;cAAJA,CAAI;yBAAJA,GAAI,CAAA;;;cAEFO,KAAIN,GAAA,gBAAJM,IAAI,EAAA;kBAAJA,EAAI,gDAAoBsD,CAAU,CAAA,CAAA,gBAAlCtD,EAAI;AAAA;;gBADFsD,CAAU,KAAAjW,GAAAkX,EAAA;AAAA;;kDAD4BnB,CAAY,CAAA,CAAA;;;YA3CpD/I,CAAU,IAAAhN,EAAA+S,EAAA,IAcL6B,EAAmB,KAAA5W,EAAA,IAAIqY,CAAgB,IAAArW,EAAAwT,IAAA,CAAA,IAOvCoB,EAAmB,KAAA5W,EAAA,IAAIoY,CAAe,MAAK,OAAIpW,EAAAkU,GAAA,CAAA,IAAAlW,EAAA,IAiB/C+W,CAAY,IAAA/U,EAAAoU,GAAA,CAAA,IAAApU,EAAAE,IAAA,EAAA;AAAA;;UAvCvBwR,CAAG;qBAAHA,GAAG,CAAA;;;UAqDDc,IAAG2E,GAAA,eAAH3E,CAAG;AACD,MAAAoE,GAAIQ,GAAA;AAAA;;;;;;uDACFd,CAAiB,CAAA,CAAA;;;kBAFrB9D,CAAG,eAAHA,CAAG;AAAA;;YADD8D,CAAiB,KAAAtW,EAAAqX,EAAA;AAAA;;UAnFvBhW,CAAG;AA6FH,MAAA2R,eA7FA3R,GAAG,CAAA,eA6FH2R,EAAG;;;;;;wCAQaqC,CAAY,CAAA,wBACV/U,EAAM,EAAC,YAClB,UAAU,iCAAU,IAAI,wBAAGA,EAAM,EAAC,gBAAgB,UAAU;AAN/D,QAAAyQ,GAAM2B,GAAA;AAAA;;mBAGI6C;AAAA;;;;;;;AAKR,YAAA+B,GAAYvY,IAAA,EAAA,MAAA,KAAA,CAAA;AAAA;;;;UAGdsU,IAAIrV,EAAA,QAAA0U,GAAA,CAAA,gBAAJW,GAAI,EAAA;cAAJA,CAAI;yBAAJA,GAAI,CAAA;;wCAYQiC,CAAY,CAAA,wBACVhV,EAAM,EAAC,YAClB,UAAU,iCAAU,IAAI,wBAAGA,EAAM,EAAC,gBAAgB,UAAU;AAN/D,QAAAyQ,GAAMwG,IAAA;AAAA;;mBAGI7B;AAAA;;;;;;;AAKR,YAAA8B,GAAOzY,IAAA,EAAA,MAAA,KAAA,CAAA;AAAA;;;;;AAhBT,QAAAf,EAAA,cAAAqV,6BAEqB,QAAI,EAAA,KAAG/S,EAAM,EAAC,gBAChC,eAAU,EAAA,KAAArC,EAAA,YAAA,EAAA,EAAA;;;;YAjBX6W,CAAS,KAAA9W,EAAA,IAAI+W,CAAY,KAAA/W,EAAA,IAAIgX,CAAY,IAAAhV,EAAAyX,EAAA,IAAAzX,EAAAoB,GAAA,EAAA;AAAA;;UAD/C4R,EAAG,WA/FLtU,CAAG,WANL+X,CAAO;oBAAPA,GAAO,GAAA,mEAAA,MAAAiB,GAAA;AAAA,+BAEiBzC,CAAU;AAAA,MACjB,UAAAN,EAAiB,YAAKM,CAAU;AAAA,oBAHjDwB,GAAO,wBAIuBjV,GAAS,MAAM,KAAA;AAAA,kBAJ7CiV,CAAO;AAFA;;;kBClOR;;AA+DE,MAKEkB,IAAY3Z,EAAA,KAAAC,GAAA,gBAAA,GAAG,EAAK,GACpB2Z,0BAAQ,EAAK,GACbC,oCAAkB,EAAK,GACvBC,IAAc9Z,EAAA,KAAAC,GAAA,kBAAA,GAAA,MAAS;AAAA,EAAC,CAAC,GACzB8Z,sCAAoB,EAAE,GACtBC,IAA0Bha,EAAA,KAAAC,GAAA,8BAAA,GAAA,MAAS;AAAA,EAAC,CAAC,GACrCga,gCAAc,EAAK,GACnBC,sCAAoB,EAAE,GACtB5X,2BAASF,EAAa,GACtB0P,2BAAS,MAAS,GAOhBqI,IAAena,EAAA,QAAA,MAAY4Z,EAAK,KAAIC,GAAe,GAEnDO,oBAAgCC,GAAYpa,EAAA,KAAA,CAAA,GAC5C8X,oBAAwBuC,GAAera,EAAA,KAAA,CAAA,GACvC8R,IAA4B/R,EAAA,QAAA,MAC9BgS,GAAgB/R,EAAA,MAAO,+BAA6B,oBAAoB,CAAA,GAEtEgS,oBACFC,GAAelS,EAAA,IAAC+R,CAAa,GAAA9R,EAAA,MAAQ,uBAAuB,OAAO,CAAA,GAEjEsa,IAAWva,EAAA,QAAA,MAAAC,EAAA,MACP,QACH,OAAM,CAACua,MAAKA,EAAE,WAAW,cAAcA,EAAE,QAAQ,EACjD,MAAK,CAACA,MAAKA,EAAE,UAAU,CAAC,CAAA;AAG7B,WAASC,IAAkB;AACzB,QAAE,OAAS,WAAa,IAAa;AACrC,UAAMvM,IAAU,SAAS,eAAe,gBAAgB;AACxD,IAAIA,KACFA,EAAQ,eAAc,EAAG,UAAU,UAAU,OAAO,SAAO;AAAA,EAE/D;AAIA,EAAAlO,EAAA,kBAAc;AACZ,IAAI+Z,EAAiB,KAAEtH,GAASsH,EAAiB,GAAA,EAAI,YAAY,UAAQ;AAAA,EAC3E,CAAC;;;;AAaAW,MAAAA,GAAI3Z,GAAA;AAAA;iBAEM;AAAA;;cAGRL,IAAGC,GAAA,eAAHD,CAAG;AACD,UAAAiS,GAAOgI,GAAA;AAAA;;;;AACL,cAAA3a,EAAA,gBAAA,MAAAA,EAAA,SAAAgD,GAAAkX,QAAsB,cACnB5X,EAAM,EAAC,kBAAkB,oBACzBA,EAAM,EAAC,oBAAoB,mBAAmB,CAAA;;;;;AAEnD,UAAAyQ,GAAMnP,GAAA;AAAA;;;;;;;oDACJtB,EAAM,EAAC,eAAe,aAAa,CAAA;;;sBAPvC5B,CAAG,eAAHA,CAAG;AAAA;;;;AAeLga,MAAAA,GAAI3Z,GAAA;AAAA;iBAEM;AAAA;;cAGRsC,IAAGgR,GAAA,eAAHhR,CAAG;AACD,UAAAsP,GAAOM,GAAA;AAAA;;;;oDACL3Q,EAAM,EAAC,WAAW,UAAU,CAAA;;;;;AAE9B,UAAAyQ,GAAM6H,GAAA;AAAA;;;;qBAIId,EAAc;AAAA;;;AAEtB,cAAAlG,GAASkF,GAAA,EAAA,MAAA,MAAA,OAAA,UAAA;;yDACTxW,EAAM,EAAC,gBAAgB,oBAAe,EAAA,EAAA,CAAA;;;;cAExCwQ,IAAG9S,EAAA,QAAA4a,GAAA,CAAA,eAAH9H,CAAG;AAID,UAAA8F,GAAIpF,GAAA;AAAA;;;;;;oDACFlR,EAAM,EAAC,4BACN,yCAAyC,CAAA;;;sBAN9CwQ,CAAG;4BAAHA,GAAG,CAAA;;;kBAUDO,IAAGvR,GAAA,eAAHuR,CAAG;AACD,cAAAuF,GAAI/E,GAAA;AAAA;;;;;;wDACFkG,EAAiB,CAAA,CAAA;;;;;AAEnB,cAAAhH,GAAMqG,GAAA;AAAA;;;;yBAIIY,EAA0B;AAAA;;;;wDAElC1X,EAAM,EAAC,WAAW,SAAS,CAAA;;;0BAV/B+Q,CAAG,eAAHA,CAAG;AAAA;;cADD0G,EAAiB,KAAA/X,EAAAmB,CAAA;AAAA;;kBAtBvBE,CAAG,eAAHA,CAAG;AAAA;;;;AA+CLqX,MAAAA,GAAI3Z,GAAA;AAAA;iBAEM;AAAA;;cAGR2S,IAAGC,GAAA,GAKDG,YALFJ,CAAG,eAKDI,CAAG;AACD,UAAA+G,GAAYC,GAAA;AAAA;;;;;qBAA6BxY,EAAM;AAAA;sBADjDwR,CAAG;AAIH,cAAAU,cAJAV,GAAG,CAAA,eAIHU,CAAG;AACD,UAAAqG,GAAYnG,GAAA;AAAA;;;;;qBAA8BpS,EAAM;AAAA;;;AAChD,UAAAyQ,GAAMwG,GAAA;AAAA;;;;;;;;;;;oEAEI,sBACHjX,EAAM,EAAC,gBAAgB,mBACvBA,EAAM,EAAC,cAAc,kBAAa,EAAA,SAAA,CAAA;;;8DAErCA,IAAO,YAAY,2CAAsB0V,GAAiB/X,EAAA,YAC7C,OACZqC,EAAM,CAAA,CAAA,CAAA;;;wBAPLiY,CAAW,IAAAvY,EAAAuS,CAAA,IAAAvS,EAAAE,GAAA,EAAA;AAAA;;;;;sBAHnBsS,CAAG,WATLd,CAAG,uCAAHA,GAAG,6BAEgClQ,GAAS,MAAM,wBAAA,CAAA,eAFlDkQ,CAAG;AAAA;;;;AA2BLgH,MAAAA,GAAI3Z,GAAA;AAAA;iBAEM;AAAA;;cAGRiU,IAAG+F,GAAA,eAAH/F,CAAG;;;kBAGCI,IAAGsD,GAAA,GAEDjD,YAFFL,CAAG,eAEDK,CAAG;;;sBAEC1S,IAAI0R,GAAA,gBAAJ1R,GAAI,EAAA;0BAAJA,CAAI,gDACFgV,CAAY,CAAA,CAAA,eADdhV,CAAI;AAAA;sBAIJoQ,IAAI6H,GAAA;8BAAJ7H,CAAI;AAAA;;AALF,kBAAAnT,EAAA,IAAA+X,CAAY,iBAIPwC,CAAW,KAAAvY,EAAA+S,GAAA,CAAA;AAAA;;sBALtBU,CAAG;AAaH,kBAAAK,cAbAL,GAAG,CAAA,eAaHK,CAAG;AACD,cAAAvC,GAAYoC,GAAA,EAAA,MAAA,MAAA,OAAA,uBAAA;;;;sBAEVlC,IAAI0F,GAAA,gBAAJ1F,CAAI;0BAAJA,CAAI;;;;sBACD,MAAAwH,GAAgBhb,EAAA,MAAO,eAAaA,EAAA,MAAQ,UAAU6R,GAAM;AAAA,sBAC7D,MAAAoC,GAAejU,EAAA,MACR,eAAaA,EAAA,MACb,UACN6R,EAAM,CAAA;AAAA;iCALT2B,CAAI;AAAA;sBASJM,IAAIoF,GAAA,gBAAJpF,GAAI,EAAA;0BAAJA,CAAI;oBACD,MAAAkH,GAAgBhb,EAAA,MACV,eAAaA,EAAA,MACb,UACN6R,EAAM,CAAA;AAAA,kCAJTiC,CAAI;AAAA;;AAVI,kBAAA9T,EAAA,MAAA,qBAAqB,KAAK+B,EAAAwT,CAAA,IAAAxT,EAAAoB,IAAA,EAAA;AAAA;;sBAFtC0S,CAAG;iCAAHA,GAAG,CAAA;;;sBAwBDoF,IAAGxI,GAAA,gBAAHwI,CAAG;AACD,kBAAArI,GAAasI,IAAA;AAAA;qCACK;AAAA;;qCACJ;AAAA;;8BAHhBD,CAAG,eAAHA,CAAG;AAAA;;wBADDjJ,CAAY,KAAAjQ,EAAA6T,CAAA;AAAA;;;;;sBAYduF,IAAG1I,GAAA,gBAAH0I,CAAG;AACD,kBAAAzC,GAAK0C,IAAA;AAAA;;;;6DACF/Y,EAAM,EAAC,gBAAgB,eAAe,CAAA;;;8BAF3C8Y,CAAG,eAAHA,CAAG;AAAA;;kBADDzB,EAAY,KAAA3X,EAAAkU,EAAA;AAAA;;;AAchB,cAAAnD,GAAMuI,IAAA;AAAA;;;yBAIIb;AAAA;;;AAER,kBAAAza,EAAA,gBAAA,MAAAA,EAAA,SAAAub,IAAAvb,EAAA,IAAAoa,CAAS,EAAC,IAAI,CAAA;;;0BArElBhF,CAAG,eAAHA,CAAG;AAAA;kBA6EHoG,IAAGC,GAAA,eAAHD,CAAG;AACD,cAAA7I,GAAO+I,GAAA;AAAA;;;;AACL,kBAAA1b,EAAA,gBAAA,MAAAA,EAAA,SAAA2b,GAAA3b,EAAA,IAAAoa,CAAS,EAAC,IAAI,CAAA;;;;;;;AAGd,kBAAAxB,GAAI7X,GAAA;AAAA;;;;;;AACF,sBAAAf,EAAA,gBAAA,MAAAA,EAAA,SAAA4b,GAAA5b,EAAA,IAAAoa,CAAS,EAAC,MAAM,CAAA;;;;;;AAFhB,kBAAApa,EAAA,IAAAoa,CAAS,EAAC,UAAMpY,EAAAkX,CAAA;AAAA;;;AAKpB,cAAAnG,GAAM8I,GAAA;AAAA;;;0BAAsD;AAAA;;;AAC1D,kBAAA7b,EAAA,gBAAA,MAAAA,EAAA,SAAA8b,GAAA9b,EAAA,IAAAoa,CAAS,EAAC,IAAI,CAAA;;;0BAVlBoB,CAAG,eAAHA,CAAG;AAAA;;AA/EK,cAAAvb,EAAA,MAAA,WAAW,aAAS,CAAAD,EAAA,IAAKoa,CAAS,EAAC,WAAQpY,EAAAoU,CAAA,IAAApU,EAAA+Z,GAAA,EAAA;AAAA;;kBADvD/G,CAAG,eAAHA,CAAG;AAAA;;;;;AAlHH,MAAAiF,EAAW,IAAAjY,EAAAC,CAAA,IAAAjC,EAAA,IAqBNma,CAAe,IAAAnY,EAAAmS,GAAA,CAAA,IAAAlU,EAAA,MAgDT,WAAW,aAASA,EAAA,qBAAA+B,EAAA4S,GAAA,CAAA,IAAA5S,EAAAga,GAAA,EAAA;AAAA;;;AA5E5B;;kBClHR;AAQoC,EAAAhc,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GAGnCgc,GAAOlb,GAAA;AAAA;;;;UACLL,IAAGC,GAAA,eAAHD,CAAG;AACD,MAAAwb,GAAetJ,GAAA;AAAA;;;kBADjBlS,CAAG,eAAHA,CAAG;AAAA;;;AAHE;;kBCTR;iBASkCV,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA;;;;AAIhC,MAAAgc,GAAOlb,GAAA;AAAA;;;;cACNL,IAAGkE,GAAA;AAAH,UAAA5E,EAAA,KAAAU,4BACqByb,MAAWA,EAAU,QAArBA,MAAS;AAC5BzB,YAAAA,GAAI3Z,GAAA;AAAA,uBAAU;AAAA;;;;gDAERob,CAAS,EAAC,gBAAgB,EAAE,GAEvBC,IAAApc,EAAA,QAAA,MAAAA,EAAA,IAAAmc,CAAS,EAAC,YAAY,OAAO,CAAC,CAAA;AAHxC,kBAAAE,GAAM1B,GAAA;AAAA;;;;AAED,6BAAA3a,EAAA,IAAAmc,CAAS,EAAC;AAAA;;;;;;;;oBAKf9Y,IAAGrD,EAAA,QAAA2a,GAAA,CAAA,eAAHtX,CAAG;AACF,gBAAAsP,GAAO/O,GAAA;AAAA,yBAAQ;AAAA;;;;;;AACd,oBAAA5D,EAAA,gBAAA,MAAAA,EAAA,SAAAgD,GAAAhD,EAAA,IAAAmc,CAAS,EAAC,WAAW,CAAA;;;4BAFvB9Y,CAAG;;;;sBAVN3C,CAAG,eAAHA,CAAG;AAAA;;;;;AAFU,MAAAT,EAAA,WAAA,SAAS,KAAC+B,EAAAC,CAAA;AAAA;;;AAFlB;kBCVR;iBAS4BjC,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA;;;;AAI1B,MAAAgc,GAAOlb,GAAA;AAAA;;;;AACN,UAAA8C,GAAS9C,GAAA;AAAA;;;;AACM,cAAAf,EAAA,KAAA2a,GAAA,IAAA,MAAA1a,EAAA,MAAA,CAAAqc,MAAKA,EAAI,cAATA,MAAG;AAChB7Y,gBAAAA,GAAa1C,GAAA;AAAA,kBACH,QAAM,CAAAA,MAAA;;;AAAI,oBAAAf,EAAA,gBAAA,MAAAA,EAAA,SAAAgD,GAAAhD,EAAA,IAAAsc,CAAG,EAAC,QAAQ,CAAA;;;;;AAC/B,oBAAAtc,EAAA,gBAAA,MAAAA,EAAA,SAAAkT,GAAAlT,EAAA,IAAAsc,CAAG,EAAC,MAAM,CAAA;;;;;;;;;;;;;AANN,MAAArc,EAAA,KAAA,SAAS,KAAC+B,EAAAC,CAAA;AAAA;;;AAFZ;;kBCTR;;AA4CE,MAKE2X,IAAK5Z,EAAA,KAAAC,GAAA,SAAA,GAAG,EAAK,GACb4Z,oCAAkB,EAAK,GACvBC,IAAc9Z,EAAA,KAAAC,GAAA,kBAAA,GAAA,MAAS;AAAA,EAAC,CAAC,GACzBga,gCAAc,EAAK,GACnB3X,2BAASF,EAAa,GAGpB+X,IAAena,EAAA,QAAA,MAAY4Z,EAAK,KAAIC,GAAe,GAEnDO,oBAAgCC,GAAYpa,EAAA,KAAA,CAAA,GAC5C8X,oBAAwBuC,GAAera,EAAA,KAAA,CAAA,GACvCsc,IAAgBvc,EAAA,QAAA,MAAAC,EAAA,YACN,MAAM,QAAQuc,GAAKC,MAAMD,IAAMC,EAAE,UAAU,CAAC,CAAA,GAEtDlC,IAAWva,EAAA,QAAA,MAAAC,EAAA,MACP,QACH,OAAM,CAACua,MAAKA,EAAE,WAAW,cAAcA,EAAE,QAAQ,EACjD,MAAK,CAACA,MAAKA,EAAE,UAAU,CAAC,CAAA,GAKzBkC,IAAO1c,EAAA,MAAwB,MAAM,GAKrC2c,IAA4C3c,EAAA,MAAO,IAAI;AAC3D,EAAAA,EAAA,kBAAc;AACZ,IAAEA,EAAA,IAAE2c,CAAiB,MAAK,cAAQA,CAAiB,MAAA3c,EAAA,IAAK0c,CAAI,KAC1DjF,GAAc,QAAQ,GAExBzX,EAAA,IAAA2c,SAAoBD,CAAI,GAAA,EAAA;AAAA,EAC1B,CAAC,GAKD1c,EAAA,kBAAc;AACZ,IAAEC,EAAA,sBAAAD,EAAA,IAAuB0c,GAAO,MAAM;AAAA,EACxC,CAAC;AAED,QAAME,IAAS;AACf,MAAIC,IAAS7c,EAAA,MAA8B,IAAI,GAC3C8c,IAAY9c,EAAA,MAAO,GAAG;AAC1B,EAAAA,EAAA,kBAAc;AACZ,QAAE,OAAS,SAAW,IAAa;AACnC,UAAM+c,IAAI,MAAA/c,EAAA,IAAU8c,GAAY,OAAO,aAAW,EAAA;AAClD,WAAAC,EAAI,GACJ,OAAO,iBAAiB,UAAUA,GAAI,EAAI,SAAS,IAAI,SAC1C,OAAO,oBAAoB,UAAUA,CAAI;AAAA,EACxD,CAAC;AAGD,MAAIC,IAAahd,EAAA,MAAO,CAAC;AACzB,EAAAA,EAAA,kBAAc;AACZ,eAAK6c,CAAM,KAAA,OAAW,iBAAmB,IAAa;AACtD,aAASI,IAAU;AACjB,UAAE,CAAAjd,EAAA,IAAG6c,CAAM,EAAE;AAKb,YAAMK,IADKld,EAAA,IAAG6c,CAAM,EAAC,mBACC,gBAAgB,GAChCM,IAAQP,IAASM,IAAS,KAAK;AACrC,MAAAld,EAAA,IAAAgd,GAAa,KAAK,IAAIG,GAAO,KAAK,MAAKnd,EAAA,IAAC8c,CAAS,IAAG,GAAG,CAAA,GAAA,EAAA;AAAA,IACzD;AACA,IAAAG,EAAO;AACP,UAAMG,IAAK,IAAI,eAAeH,CAAO,GAC/BI,KAAKrd,EAAA,IAAG6c,CAAM,EAAC;AACrB,WAAIQ,MAAOD,EAAG,QAAQC,EAAK,GACrB,MAAOD,EAAG,WAAU;AAAA,EAC5B,CAAC;AAED,WAAS3C,IAAkB;AACzB,QAAE,OAAS,WAAa,IAAa;AACrC,UAAM6C,IAAW,SAAS,iBAA8B,iBAAiB;AACzE,eAAWpP,KAAWoP;AACpB,UAAIpP,EAAQ,iBAAiB,MAAM;AACjC,QAAAA,EAAQ,eAAc,EAAG,UAAU,UAAU,OAAO,SAAO;AAC3D;AAAA,MACF;AAAA,EAEJ;AAEA,WAASqP,IAAiB;AACxB,QAAE,CAAAvd,EAAA,IAAEoa,CAAS,EAAC,UACd;AAAA,iCAAyB;AACvB,QAAAK,EAAe;AACf;AAAA,MACF;AAGA,MAAAza,EAAA,IAAA0c,SAAOA,CAAI,MAAK,SAAS,SAAS,QAAM,EAAA;AAAA;AAAA,EAC1C;AAEA,WAASc,EAAiBC,GAAkB;AAG1C,IAAIA,EAAE,WAAWA,EAAE,iBACfC,GAAgBD,CAAC,MACnBA,EAAE,eAAc,GAChBF,EAAc;AAAA,EAElB;AAEA,WAASI,IAAuB;AAC9B,IAAA3d,EAAA,IAAA0c,GAAO,MAAM;EAEf;AAEA,WAASkB,IAAc;AACrB,IAAA5d,EAAA,IAAA0c,GAAO,MAAM;AAAA,EACf;AAEA,WAASmB,EAAa1N,GAAmB;AACvC,WAAOA,MAAM,IAAI7N,EAAM,EAAC,UAAU,WAAWA,EAAM,EAAC,WAAW;AAAA,EACjE;AASA,MAAIwb,IAAa,GACbC,IAAkB,GAClBC,IAAahe,EAAA,MAAO,CAAC,GACrBie,IAAaje,EAAA,MAAO,EAAK,GACzBke,IAAYle,EAAA,MAAsB,IAAI,GACtCme,IAAane,EAAA,MAA2B,IAAI,GAG5Coe,IAAmC,CAAA;AAEvC,WAASC,EAAaC,GAAW;AAC/B,UAAM9D,IAAI,YAAY,IAAG;AAIzB,SAHA4D,EAAQ,KAAI,EAAG,GAAAE,GAAG,GAAA9D,EAAC,CAAA,GAGZ4D,EAAQ,SAAS,KAAK5D,IAAI4D,EAAQ,CAAC,EAAE,IAAI,MAAK,CAAAA,EAAQ,MAAK;AAAA,EACpE;AAEA,WAASG,IAA0B;AACjC,QAAIH,EAAQ,SAAS,EAAG,QAAO;AAC/B,UAAMI,IAAQJ,EAAQ,CAAC,GACjBK,IAAOL,EAAQA,EAAQ,SAAS,CAAC,GACjCM,KAAKD,EAAK,IAAID,EAAM;AAC1B,WAAIE,MAAM,IAAU,KACZD,EAAK,IAAID,EAAM,KAAKE;AAAA,EAC9B;AAEA,WAASC,EAAkBlB,GAAiB;AAM1C,iCAAIA,EAAE,WAAW,KAAKA,EAAE,gBAAgB,QAAS;AACjD,UAAMjD,IAAIiD,EAAE;AACZ,QAAIjD,GAAG,QAAQ,qDAAqD,EAClE;AAKF,UAAMoE,WAAO/B,CAAM;AACnB,UAAIH,CAAI,MAAK,UAAUkC,MAAQA,GAAK,SAASpE,CAAC,KAAKoE,GAAK,YAAY,MAGpEd,IAAaL,EAAE,SACfM,UAAkBrB,CAAI,MAAK,SAAM1c,EAAA,IAAGgd,CAAU,IAAGJ,GACjD5c,EAAA,IAAAge,GAAa,CAAC,GACdI,IAAO,CAAA,GACPC,EAAaZ,EAAE,OAAO,GACtBzd,EAAA,IAAAie,GAAa,EAAI,SACjBC,GAAYT,EAAE,WAAS,EAAA,SACvBU,GAAaV,EAAE,eAAa,EAAA,GAC5Bzd,EAAA,IAAAme,CAAU,EAAC,kBAAkBV,EAAE,SAAS;AAAA,EAC1C;AAEA,WAASoB,EAAkBpB,GAAiB;AAC1C,QAAE,CAAAzd,EAAA,IAAGie,CAAU,KAAIR,EAAE,cAASzd,EAAA,IAAKke,CAAS,EAAE;AAC9C,UAAMY,IAAKrB,EAAE,UAAUK;AACvB,IAAAO,EAAaZ,EAAE,OAAO;AAKtB,UAAMsB,KAAoB,MACpBC,KAAgB,IAChBC,IAAYlB,IAAkBe;AACpC,QAAII;AACJ,QAAID,IAASjf,EAAA,IAAGgd,CAAU,GAAE;AAC1B,YAAMmC,KAAY,KAAK,KACpBF,IAASjf,EAAA,IAAGgd,CAAU,KAAI+B,IAC3BC,EAAa;AAEf,MAAAE,IAAWlf,EAAA,IAAGgd,CAAU,IAAGmC;AAAA,IAC7B,WAAWF,IAAYrC,GAAQ;AAC7B,YAAMuC,KAAY,KAAK,KACpBvC,IAASqC,KAAaF,IACvBC,EAAa;AAEf,MAAAE,IAActC,IAASuC;AAAA,IACzB;AACE,MAAAD,IAAcD;UAEhBjB,GAAaD,IAAkBmB,CAAW;AAAA,EAC5C;AAEA,WAASE,EAAgB3B,GAAiB;AACxC,QAAE,CAAAzd,EAAA,IAAGie,CAAU,KAAIR,EAAE,cAASzd,EAAA,IAAKke,CAAS,EAAE;AAC9C,UAAMrS,IAAI0S,KACJO,WAAKd,CAAU,GAIfqB,KAAiB,KACjBC,KAAkBtf,EAAA,IAAIgd,CAAU,IAAGJ,KAAU;AAEnD,IAAE5c,EAAA,IAAE0c,CAAI,MAAK,UAEPoC,KAAKQ,KAAsBzT,IAAIwT,OACjCrf,EAAA,IAAA0c,GAAO,MAAM,MAICoC,KACH,MAAMjT,IAAC,CAAIwT,OACtBrf,EAAA,IAAA0c,GAAO,MAAM,GAIjB1c,EAAA,IAAAie,GAAa,EAAK,GAClBje,EAAA,IAAAge,GAAa,CAAC,GACdI,IAAO,CAAA,GACPpe,EAAA,IAAAme,CAAU,GAAE,sBAAsBV,EAAE,SAAS,GAC7Czd,EAAA,IAAAme,GAAa,IAAI,GACjBne,EAAA,IAAAke,GAAY,IAAI;AAAA,EAClB;AAEA,WAASqB,EAAoBC,GAAkB;AAI7C,QAHAxf,EAAA,IAAAie,GAAa,EAAK,GAClBje,EAAA,IAAAge,GAAa,CAAC,GACdI,IAAO,CAAA,SACHD,CAAU,KAAAne,EAAA,IAAIke,CAAS,MAAK;AAC9B,UAAI;cACFC,CAAU,EAAC,sBAAqBne,EAAA,IAACke,CAAS,CAAA;AAAA,MAC5C,QAAQ;AAAA,MAER;AAEF,IAAAle,EAAA,IAAAme,GAAa,IAAI,GACjBne,EAAA,IAAAke,GAAY,IAAI;AAAA,EAClB;AAIA,MAAIuB,oBACAxf,EAAA,qBACAD,EAAA,IAAEie,CAAU,IAAS,KAAK,IAAIrB,IAAS,KAAKmB,UAAkBC,CAAU,CAAA,UACnEtB,CAAI,MAAK,SAAM1c,EAAA,IAAGgd,CAAU,IAAGJ,IAFNA,CAGjC,GAIG8C,oBAAmC;AACrC,UAAMC,IAAQ,KAAK,IAAI,GAAC3f,EAAA,IAAEgd,CAAU,IAAGJ,CAAM;AAC7C,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAC5c,EAAA,IAAGyf,CAAU,IAAG7C,KAAU+C,CAAK,CAAA;AAAA,EAC9D,CAAC;;;;UAQAjf,IAAGC,GAAA;;AAQD,UAAA0C,aARF3C,CAAG,GASCoS,YADFzP,EAAG,GAECgQ,YADFP,CAAG,gBACDO,CAAG;AACD,MAAAuF,GAAI+B,IAAA;AAAA;;;;;;gDACFrY,EAAM,EAAC,oBAAoB,mBAAmB,CAAA;;;kBAFlD+Q,CAAG;yBAAHA,GAAG,CAAA;AAKH,MAAAN,GAAMnP,IAAA;AAAA;;;;;;;gDACJtB,EAAM,EAAC,eAAe,aAAa,CAAA;;;kBAPvCwQ,CAAG,WADLzP,EAAG,WARL3C,CAAG;yBAAHA,GAAG,mDAAAyB,IAAA,EAAA,WAEayd,GAAO,OAAK,QAAA,OAAA,CAAA,GAF5B5f,EAAA,cAAAU,GAAG,cAMU4B,EAAM,EAAC,oBAAoB,mBAAmB;AAAA,sBAN3D5B,CAAG;AAAA;UA0BHgT,IAAG/S,GAAA;;AAQD,UAAAmT,aARFJ,CAAG,GASCc,YADFV,EAAG,GAECkB,YADFR,CAAG,gBACDQ,CAAG;AACD,MAAA4D,GAAI3F,IAAA;AAAA;;;;;;gDACF3Q,EAAM,EAAC,WAAW,UAAU,CAAA;;;kBAFhC0S,CAAG;yBAAHA,GAAG,CAAA;AAKH,MAAAjC,GAAM6H,IAAA;AAAA;;;iBAGId,EAAc;AAAA;;;;AAGtB,UAAAlG,GAASkF,IAAA,EAAA,MAAA,MAAA,OAAA,UAAA;;qDACTxW,EAAM,EAAC,gBAAgB,oBAAe,EAAA,EAAA,CAAA;;;kBAb1CkS,CAAG,WADLV,EAAG,WARLJ,CAAG;yBAAHA,GAAG,mDAAAmM,IAAA,EAAA,WAEaD,GAAO,OAAK,QAAA,OAAA,CAAA,GAF5B5f,EAAA,cAAA0T,GAAG,cAMUpR,EAAM,EAAC,gBAAgB,eAAe;AAAA,sBANnDoR,CAAG;AAAA;;;;cA8CD0B,IAAGtT,GAAA;;;AAAH,YAAA4X,IAAA1Z,EAAA,UAAAoV,mEAC6DsH,CAAI,MAChE,SACI,gBACA,WAAW,IAAA,kBAAAhD,GAAA;AAAA,cAEG,cAAA1Z,EAAA,IAAA0c,CAAI,MAAK;AAAA,cACP,gBAAA1c,EAAA,IAAA0c,CAAI,MAAK;AAAA,gCAP9BtH,GAAG,eAAApV,EAAA,IASW0c,CAAI,MAAK,MAAM,mBAT7BtH,GAAG,IAAA0K,GAAA,EAAA,WAKaF,GAAO,SAAO;AAAA,cAL9B5f,EAAA,UAAA,SAAAoV,GAQUwI,CAAW,eARrBxI,CAAG;AAAA;;;;;UAgBLK,IAAGzV,EAAA,QAAAwT,IAAA,CAAA;;;cA6CQuM,IAAU,CAAAhf,MAAA;;;;kBAEf+U,KAAGzB,GAAA;2BAAHyB,EAAG;AAAA;;;;;cAKLoF,KAAGlb,EAAA,QAAAggB,GAAA,CAAA,GACD5E,aADFF,EAAG,gBACDE,EAAG;;;AAEC,cAAAxC,GAAI7X,IAAA;AAAA;;;;;;;wDACFwb,CAAgB,KAAA,EAAA;AAAA;;;sBAChB,MAAAsB,QAAatB,CAAgB,CAAA;AAAA,4BAC7BvE,GAAiB/X,EAAA,YAAa,OAAOqC,EAAM,CAAA;AAAA;;;;;;AAG7C,cAAAsW,GAAI7X,IAAA;AAAA;;;;;;+DACFgX,CAAY,CAAA,CAAA;;;;;AAGd,cAAAa,GAAI7X,IAAA;AAAA;;;;;;AACF,kBAAAf,EAAA,gBAAA,MAAAA,EAAA,SAAAigB,IAAAjgB,EAAA,IAAAoa,CAAS,EAAC,MAAM,CAAA;;;;;;AANX,cAAAna,EAAA,qBAAA+B,GAAA4S,EAAA,IAAA5U,EAAA,IAAA+X,CAAY,YAAKqC,CAAS,EAAC,WAAQpY,GAAA6S,IAAA,CAAA,IAAA7U,EAAA,IAInCoa,CAAS,EAAC,UAAMpY,GAAA+S,IAAA,CAAA;AAAA;;kBAX3BqG,EAAG;6BAAHA,IAAG,CAAA;;;AAmBD,cAAArI,GAAMhS,IAAA;AAAA;;;AAGK,yBAAAf,EAAA,IAAAoa,CAAS,EAAC;AAAA;gBACX,SAAA,CAAAqD,OAAK;AAEZ,kBADAA,GAAE,gBAAe,GACf,CAAAzd,EAAA,IAAEoa,CAAS,EAAC,qDAIZK,EAAe;AAAA,gBAEnB;AAAA;;;;;;6DAIGnY,EAAM,EAAC,YAAY,UAAU,CAAA;;;AAE7B,sBAAAtC,EAAA,gBAAA,MAAAA,EAAA,SAAAmW,IAAAnW,EAAA,IAAAoa,CAAS,EAAC,IAAI,CAAA;;;;;;;;;;;;AAnBhB,cAAApa,EAAA,IAAA0c,CAAI,MAAK,UAAM1a,GAAA6T,EAAA;AAAA;;kBAnBrBqF,EAAG;;yBApDPzF,CAAG;;;gBA0BC+F,IAAG/G,GAAA,eAAH+G,CAAG;AAWO,YAAAuE,EAAUxG,CAAA,WAXpBiC,CAAG;8BAAHA,GAAG,iBAAAxb,EAAA,IAMa0c,CAAI,MAAK,MAAM,mBAN/BlB,GAAG,cAAAxb,EAAA,IAOU0c,CAAI,MAAK,SACjBpa,EAAM,EAAC,wBAAwB,2BAC/BA,EAAM,EAAC,sBAAsB,sBAAsB;AAAA,gBATxDtC,EAAA,UAAA,SAAAwb,GAEU+B,CAAc,GAFxBvd,EAAA,UAAA,WAAAwb,GAGYgC,CAAgB,eAH5BhC,CAAG;AAAA;gBAcH0E,IAAGlF,GAAA,eAAHkF,CAAG;AACO,YAAAH,EAAU5K,CAAA,WADpB+K,CAAG,eAAHA,CAAG;AAAA;;;;;;;;0BA0DHC,IAAGngB,EAAA,YAAAogB,CAAA;;6BAAHD,CAAG;AAKD,YAAAtF,GAAYwF,IAAA;AAAA;;;;uBAAgB/d,EAAM;AAAA;wBALpC6d,CAAG,eAAHA,GAAG,CAAApH,OAAA/Y,EAAA,IACS6c,GAAM9D,EAAA,GAAA,MAAA/Y,EAAA,IAAN6c,CAAM,CAAA;+BADlBsD,GAAG,CAAA;;;oBASDG,KAAGnH,GAAA,gBAAHmH,EAAG;AACD,gBAAAvN,GAAMwN,IAAA;AAAA;;;;AAIK,2BAAAvgB,EAAA,IAAAoa,CAAS,EAAC;AAAA;2BACXuD;AAAA;;;;;uEAGA,sBACHrb,EAAM,EAAC,gBAAgB,mBACvBA,EAAM,EAAC,cAAc,aAAa,CAAA;;;qEAErCA,IAAO,YAAY,2CAAsB0V,GAAiB/X,EAAA,YAC7C,OACZqC,EAAM,CAAA,CAAA,CAAA;;;8BAPLiY,CAAW,IAAAvY,GAAAoU,EAAA,IAAApU,GAAA+Z,IAAA,EAAA;AAAA;;;;;4BARnBuE,EAAG,gBAAHA,EAAG;AAAA;;AADD,gBAAAtgB,EAAA,IAAA0c,CAAI,MAAK,UAAM1a,GAAAkX,EAAA;AAAA;;AARnB,YAAAlZ,EAAA,gBAAA,MAAAwgB,IAAAxgB,EAAA,UAAAmgB,2BAGgBT,CAAc,EAAA,CAAA,CAAA;;;;;;gBArGlCjK,CAAG;AAAA;;wBAAHA,GAAG,GAAA,mFAAA,MAAAgL,GAAA;AAAA,wCAE0BxC,CAAU;AAAA,UACd,oBAAAje,EAAA,IAAA0c,CAAI,MAAK;AAAA,6BAHlCjH,GAAG,mDAAAiL,IAAA;AAAA,UAIa,WAAAd,GAAO;AAAA,2BACPH,CAAU,KAAA,EAAA;AAAA,4BAL1BhK,GAAG,cAAAzV,EAAA,IASU0c,CAAI,MAAK,MAAM,GAT5B1c,EAAA,cAAAyV,GAAG,cAUUnT,EAAM,EAAC,gBAAgB,eAAe;AAAA,UAVnDtC,EAAA,UAAA,eAAAyV,GAWgBkJ,CAAiB,GAXjC3e,EAAA,UAAA,eAAAyV,GAYgBoJ,CAAiB,GAZjC7e,EAAA,UAAA,aAAAyV,GAac2J,CAAe,GAb7Bpf,EAAA,MAAA,iBAAAyV,GAckB8J,CAAmB;;;AA3GnC,MAAAtF,EAAW,iBA0BNE,CAAe,IAAAnY,EAAAmB,IAAA,CAAA,IAAAnB,EAAAga,IAAA,EAAA;AAAA;;;AA5BjB;;;;;;;;ACjTN,MAAM2E,KAAyB,KACzBC,KAGF,uBAAO,OAAO,IAAI;AACtB,SAASC,GAAkBrK,GAAiB;AAI1C,GAHmBoK,GAAepK,CAAO,MAAMC,GAC7CkK,EAAsB,GAEdnK,GAAO,EAAI,YAAY,SAAQ,CAAA;AAC3C;;kBAGF;;AAaC,MAAqClU,IAAMtC,EAAA,KAAAC,GAAA,UAAA,GAAGmC,EAAa,GAEvD0e,IAAa9gB,EAAA,MAAO,EAAK,GACzB+gB,IAAa/gB,EAAA,MAAO,EAAE;AAE1B,WAASghB,IAAc;AACtB,UAAMC,IAAOjhB,EAAA,IAAG+gB,CAAU,EAAC,KAAI;AAC/B,IAAKE,eACGA,CAAO;AAAA,EAChB;AAEA,WAASC,IAAe;AACvB,IAAAlhB,EAAA,IAAA+gB,GAAa,EAAE;EAEhB;AAEA,WAASI,EAAc1D,GAAkB;AACxC,IAAIA,EAAE,QAAQ,YACbA,EAAE,eAAc,GAChBuD,EAAW;AAAA,EAEb;AAGA,MAAII,IAAYphB,EAAA,QAAA,MAAAC,EAAA,WAAuB,aAASD,EAAA,IAAI8gB,CAAU,CAAA;AAK9D,EAAA9gB,EAAA,kBAAc;AACb,IAAEC,EAAA,WAAa,QAAM4gB,gBAA6B,IAAI;AAAA,EACvD,CAAC;MAGDngB,IAAG2T,GAAA,yBAAH3T,CAAG,GAAA,CAAA;;;AAGD,MAAAqS,GAAMhS,GAAA;AAAA;QAAgC,SAAA,MAAAf,EAAA,IAAA8gB,GAAa,EAAI;AAAA;;;gDACtDxe,EAAM,EAAC,iBAAiB,oBAAoB,CAAA;;;;;UAG7Ce,IAAGvB,GAAA,GASFgR,YATDzP,CAAG,GAUDgQ,YADDP,CAAG,eACFO,CAAG;;gCAEK/Q,EAAM,EAAC,aAAa,YAAY,uBAC1BA,EAAM,EAAC,aAAa,YAAY,GAIxB+e,IAAArhB,EAAA,QAAA,MAAAC,EAAA,WAAA,0BAAwB,YAAY,GACnCqhB,IAAAthB,EAAA,QAAA,MAAAC,EAAA,WAAA,SAAS,EAAE,oCACf,QAAQ,QAAQ,MAAM;AARxC,QAAA4Y,GAAK8B,GAAA;AAAA;;;;;;;;;;;;;;;;;cAKL,QAAU;yBAAEoG,CAAU;AAAA;cAAtB,MAAUhI,GAAA;kBAAEgI,GAAUhI,GAAA,EAAA;AAAA;;;cANvB1F,CAAG;wBAAHA,GAAG,CAAA;;;cAcFK,IAAG/S,GAAA,eAAH+S,CAAG;;oCACuEpR,EAAM,EAAC,mBAAmB,mBAAmB;AAAtH,YAAAyQ,GAAME,GAAA;AAAA;uBAA4BiO;AAAA;;;;;;;sDACjC5e,EAAM,EAAC,UAAU,QAAQ,CAAA;;;;;kBAF3BoR,CAAG,eAAHA,CAAG;AAAA;cAMHI,IAAGnT,GAAA,eAAHmT,CAAG;;iDAGmB,gBAAY,CAAA9T,EAAA,IAAK+gB,CAAU,EAAC,KAAI,CAAA,oCAE9B,eAAgBze,EAAM,EAAC,qBAAqB,wBAA0BA,EAAM,EAAC,kBAAkB,kBAAkB;AAJxI,YAAAyQ,GAAM6H,GAAA;AAAA,uBACGoG;AAAA;;;;;;;;;;mEAKG,eAAgB1e,EAAM,EAAC,YAAY,gBAAkBA,EAAM,EAAC,SAAS,OAAO,CAAA;;;;;kBAPzFwR,CAAG,eAAHA,CAAG;AAAA;;uBAPW,YAAS9R,EAAAmB,CAAA,IAAAnB,EAAAE,GAAA,EAAA;AAAA;;cAdzB4Q,CAAG;wBAAHA,GAAG,CAAA;;;cAoCFxP,IAACsB,GAAA,eAADtB,GAAC,EAAA;kBAADA,CAAC,sDAAmD,IAAI,CAAA,eAAxDA,CAAC;AAAA;;uBADa,QAAItB,EAAAmS,CAAA;AAAA;;cA5CpB9Q,CAAG,uCAAHA,GAAG,6BAE+BG,GAAS,MAAM,wBAAA,CAAA,GAOhDxD,EAAA,UAAA,WAAA8S,GAA2CqO,CAAa,eATzD9d,CAAG;AAAA;;YALC+d,CAAY,IAAApf,EAAAoB,GAAA,EAAA,IAAApB,EAAAC,CAAA;AAAA;;UAFlBvB,CAAG,eAAHA,CAAG;AAFI;;;kBC3ER;;AAoBE,MAEE6gB,IAAevhB,EAAA,KAAAC,GAAA,mBAAA,GAAG,MAAS,GAC3BqC,2BAASF,EAAa,GACtB0P,2BAAS,MAAS,GAUhB0P,2BACK;AACL,QAAE,CAAAvhB,EAAA,MAAS,kBAAmB,QAAM,CAAA;AACpC,UAAMwhB,IAMF,IAAIC,GAAS;AACjB,eAAWC,KAAG1hB,EAAA,MAAU,mBAAmB;AACzC,YAAM2hB,IAAU3G,GACd0G,EAAI,eAAa1hB,EAAA,MACX,UACN6R,GAAM;AAER,MAAK2P,EAAO,IAAIG,CAAO,KACrBH,EAAO,IAAIG,GAAO;AAAA,QAChB,WAAW9M,GACT6M,EAAI,eAAa1hB,EAAA,MACX,UACN6R,GAAM;AAAA,QAER,aAAW,CAAA;AAAA,UAGf2P,EAAO,IAAIG,CAAO,EAAG,YAAY,KAAKD,CAAG;AAAA,IAC3C;AACA,WAAM,CAAA,GAAKF,EAAO,QAAO,GAAI,IAAG,CAAA,CAAGG,GAASC,CAAC,OAAA,EAC3C,SAAAD,GACA,WAAWC,EAAE,WACb,aAAaA,EAAE,YAAW,EAAA;AAAA,EAE9B,IAAC;AAGH,WAASC,EAAoBH,GAAmC;AAC9D,IAAIJ,EAAe,KACjBA,EAAe,EAACI,CAAG;AAAA,EAEvB;MAGDzT,IAAOmG,GAAA,GACL3T,YADFwN,CAAO;SACLxN,GAAG,IAAA,MAAAV,EAAA,IACKwhB,CAAkB,GAAA,CAAIO,MAAOA,EAAM,SAAO,CAAAhhB,GAApBghB,MAAK;QAC/B1e,IAAGvB,GAAA,GACDgR,YADFzP,CAAG,eACDyP,CAAG;AACD,IAAA8F,GAAIhG,GAAA;AAAA;;;;;;AACF,QAAA5S,EAAA,gBAAA,MAAAA,EAAA,SAAAgD,GAAAhD,EAAA,IAAA+hB,CAAK,EAAC,SAAS,CAAA;;;gBAFnBjP,CAAG;AAKH,QAAAO,cALAP,GAAG,CAAA;WAKHO,GAAG,IAAA,MAAArT,EAAA,IACK+hB,CAAK,EAAC,aAAW,CAAIJ,MAAKA,EAAI,IAAE,CAAA5gB,GAAX4gB,MAAG;UAC5BjO,IAAG9O,GAAA;;AAgBD,UAAAkP,YAhBFJ,CAAG,eAgBDI,CAAG;;;AAEC,UAAA8E,GAAI7X,GAAA;AAAA;;;;;;gBACF,MAAAmT,SAAgByN,CAAG,EAAC,eAAa1hB,EAAA,MAAQ,UAAU6R,EAAM,CAAA;AAAA;;;;;;AAFnD,UAAA7R,EAAA,MAAA,qBAAqB,MAAK+B,EAAAC,CAAA;AAAA;;;;;cAYlCuS,IAAG7T,GAAA,eAAH6T,CAAG;AACD,UAAAoE,GAAI3F,GAAA;AAAA;;;;;;wDAKF3Q,EAAM,EAAC,6BACN,0BAAqB,EAAA;AAAA,wBACtBtC,EAAA,IAAA2hB,CAAG,EAAC,aAAS,EAAA,EAAA,CAAA;;;;;;;AAGb,cAAA/I,GAAI7X,GAAA;AAAA;;;;;AACF,kBAAAf,EAAA,gBAAA,MAAAA,EAAA,SAAAgiB,GAAAhiB,EAAA,IAAA2hB,CAAG,EAAC,YAAY,CAAA;;;;;;AAFhB,cAAA3hB,EAAA,IAAA2hB,CAAG,EAAC,gBAAY3f,EAAAmB,CAAA;AAAA;;kBAVtBqR,CAAG,eAAHA,CAAG;AAAA;;AADD,UAAAxU,EAAA,IAAA2hB,CAAG,EAAC,aAAS3f,EAAAmS,CAAA;AAAA;;cAZnBL,CAAG;wBAAHA,GAAG,CAAA;;AAiCO,YAAAlT,IAAAZ,EAAA,QAAA,MAAAA,EAAA,IAAA2hB,CAAG,EAAC,cAAc,gBAAgB,SAAS;AAFrD,QAAA5O,GAAM+F,GAAA;AAAA;;;;;AAGK,mBAAA9Y,EAAA,IAAA2hB,CAAG,EAAC;AAAA;;;;;AAGb,YAAA3hB,EAAA,gBAAA,MAAAA,EAAA,SAAAiiB,GAAAjiB,EAAA,IAAA2hB,CAAG,EAAC,OAAO,CAAA;;;;;cArDfjO,CAAG;wBAAHA,GAAG,GAAA,oFAAA,MAAAgG,GAAA,EAAA,gBAAA1Z,EAAA,IAEkB2hB,CAAG,EAAC,YAAW,CAAA,GAFpC3hB,EAAA,cAAA0T,qBAaWiO,CAAG,EAAC,cAAW,KAAQ,CAAC;AAAA,UAbnC3hB,EAAA,UAAA,SAAA0T,gBAIIiO,CAAG,EAAC,eACLG,EAAmB,EAAG,IAAE9hB,EAAA,IAAE2hB,CAAG,EAAC,IAAI,MAAI3hB,EAAA,IAAE2hB,CAAG,EAAC,KAAI,CAAA,CAAA,0BALnDjO,GAAG,CAMU+J,MAAqB;AAG/B,QAAEzd,EAAA,IAAE2hB,CAAG,EAAC,gBAAgBjE,GAAgBD,CAAC,MACzCA,EAAE,eAAc,GAChBqE,EAAmB,EAAG,IAAE9hB,EAAA,IAAE2hB,CAAG,EAAC,IAAI,MAAI3hB,EAAA,IAAE2hB,CAAG,EAAC,KAAI,CAAA;AAAA,MAClD,CAAC,eAZFjO,CAAG;AAAA,gBAFPL,CAAG,WANLhQ,CAAG,eAAHA,CAAG;AAAA,cAFP3C,CAAG,WADLwN,CAAO,eAAPA,CAAO;AAFA;;ACrDD,SAASgU,GACdC,GACAC,GACe;AACf,SAAOD,EAAiB,IAAiB,CAAAE,OAAO;AAAA,IAC9C,SAASA,EAAG;AAAA,IACZ,MAAMA,EAAG;AAAA,IACT,MAAMC,GAAcD,EAAG,eAAeD,CAAQ;AAAA,IAC9C,eAAeC,EAAG;AAAA,IAClB,UAAUA,EAAG;AAAA;AAAA;AAAA;AAAA,IAIb,QAAQA,EAAG,WAAW,SAAS,gBAAgBA,EAAG;AAAA,IAClD,MAAMA,EAAG;AAAA,IACT,UAAUD;AAAA,IACV,kBAAkBC,EAAG;AAAA,IACrB,cAAcA,EAAG;AAAA,EAAA,EACjB;AACJ;;kBCzCA;;AAuCE,QAAMzS,IAASC,GAAa,OAAO;AAsDnC,MAEc0S,IAAcviB,EAAA,KAAAC,GAAA,cAAA,GAAG,MAAS,GACtCuiB,kCAAgB,EAAE,GACJC,iCAAmB,MAAS,GAC3BC,kCAAoB,MAAS,GACpBC,2CAA6B,MAAS,GAC7CC,oCAAsB,MAAS,GAChDC,mCAAiB,EAAK,GACtBjJ,0BAAQ,EAAK,GACbC,oCAAkB,EAAK,GACvBC,IAAc9Z,EAAA,KAAAC,GAAA,kBAAA,GAAA,MAAS;AAAA,EAAC,CAAC,GACzB8Z,sCAAoB,EAAE,GACtBC,IAA0Bha,EAAA,KAAAC,GAAA,8BAAA,GAAA,MAAS;AAAA,EAAC,CAAC,GACrCga,gCAAc,EAAK,GACnBC,sCAAoB,EAAE,GACtB5X,IAAMtC,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GACN6R,2BAAS,MAAS,GAOhBgR,IAAa9iB,EAAA,QAAA,MAAY4Z,EAAK,KAAIC,GAAe;AAIrD,QAAMkJ,IAAY/iB,EAAA,QAAA,MAAYgjB,GAAmBlR,EAAM,GAAExP,EAAM,CAAA,CAAA;AAI/D,MAAI2gB,IAAiBjjB,EAAA,QAAA,MACnBka,EAAiB,MAAK,oBAClB6I,CAAY,EAAC,wBACX,iEACFA,CAAY,EAAC,uBACX,gDAAgD;AAKxD,EAAA/iB,EAAA,kBAAc;AACZ,IAAIia,EAAW,KAAExH,SAASwQ,CAAiB,GAAA,EAAI,YAAY,aAAW;AAAA,EACxE,CAAC,GACDjjB,EAAA,kBAAc;AACZ,IAAIwiB,EAAa,KAAE/P,GAAS+P,EAAa,GAAA,EAAI,YAAY,aAAW;AAAA,EACtE,CAAC,GAODxiB,EAAA,kBAAc;AACZ,UAAIkjB,CAAW,KAAAljB,EAAA,IAAI8iB,CAAa,KAAI/I,OAClCtH,GAASsH,EAAiB,GAAA,EAAI,YAAY,SAAQ,CAAA;AAAA,EAEtD,CAAC;AAGD,MAAI1L,IAAuCrO,EAAA,MAAMA,EAAA,MAAA,CAAA,CAAA,CAAA,GAG7CuO,IAAavO,EAAA,MAAMA,EAAA,MAAiBmjB,GAAuB,CAAA,CAAA,GAG3D7U,IAA4CtO,EAAA,MAAMA,EAAA,MAAA,CAAA,CAAA,CAAA;AAKtD,QAAMojB,IAAO,IAAI9S,GAAW;AAI5B,EAAAtQ,EAAA,kBAAc;YACM,UAClBqO,GAAU,CAAA,GAAA,EAAA,GACVrO,EAAA,IAAAuO,GAAa4U,GAAuB,GAAA,EAAA,SACpC7U,GAAe,CAAA,GAAA,EAAA,GACf8U,EAAK,MAAK;AAAA,EACZ,CAAC;AAGD,MAAIC,4BACI,QAAQ,OAAM,CAAC7I,OACdA,EAAE,kBACHjM,CAAU,EAAC,sBAA4B,KACrCvO,EAAA,IAACuO,CAAU,EAAC,gBAAgB,SAASiM,EAAE,EAAE,CAChD,CAAA,GAIC8I,2BACK;AACL,UAAM7B,IAA6C,CAAA;AACnD,eAAW3S,MAAM9O,EAAA,IAAIqjB,CAAc,GAAE;AACnC,YAAMnV,IAAUY,GAAO,eAAe;AACtC,MAAK2S,EAAOvT,CAAO,MAAGuT,EAAOvT,CAAO,IAAA,CAAA,IACpCuT,EAAOvT,CAAO,EAAE,KAAKY,EAAM;AAAA,IAC7B;AACA,WAAO2S;AAAA,EACT,IAAC,GAGC8B,IAAmBvjB,EAAA,QAAA,MACrB,OAAO,KAAIA,EAAA,IAACsjB,CAAc,CAAA,EAAE,OAAM,CAACpT,MAAKA,MAAM,UAAU,EAAE,SAAS,CAAC,GAIlEsT,IAAQxjB,EAAA,QAAA,MAAAC,EAAA,MAAkB,WAAW,SAAS,GAC9CwjB,IAAezjB,EAAA,QAAA,OAAAC,EAAA,MACV,WAAW,aAASA,EAAA,MAAU,WAAW,eAAUD,EAAA,IACxDqjB,CAAc,EAAC,SAAS,CAAC,GAMzBK,IAAwB1jB,EAAA,QAAA,MAC1BmO,GAAkBlO,EAAA,MACV,SAAOD,EAAA,IACbqO,CAAU,GAAArO,EAAA,IACVsO,CAAe,GAAAtO,EAAA,IACfuO,CAAU,GAAAtO,EAAA,MACJ,MAAM,aAAa,CAAA,GAIzB0jB,0BAA8BD,CAAW,EAAC,MAAM,SAAS,CAAC;AAK9D,EAAA1jB,EAAA,kBAAc;AACZ,IAAAojB,EAAK,SAAQ;AAAA,MACX,iBAAe;AAAA,MACf,kBAAA/U,CAAU;AAAA,MACV,uBAAAC,CAAe;AAAA,MACf,WAAStO,EAAA,IAAEuO,CAAU,EAAC,kBAAYA,CAAU,EAAC,OAAO;AAAA;EAExD,CAAC;AASD,MAAIqV,oBAA+C;AACjD,UAAMC,IAAKT,EAAK;AAChB,WAAE,CAAGS,KAAE7jB,EAAA,IAAI0jB,CAAW,EAAC,aAAa,OAAY1jB,EAAA,IAAC0jB,CAAW,IACtD;AAAA,MACJ,OAAK1jB,EAAA,IAAE0jB,CAAW,EAAC;AAAA,MACnB,UAAUG,EAAG;AAAA,MACb,MAAMA,EAAG;AAAA,MACT,OAAOA,EAAG;AAAA,MACV,OAAOA,EAAG;AAAA,MACV,eAAeA,EAAG;AAAA,MAClB,gBAAgBA,EAAG;AAAA;EAEvB,CAAC,GAGGC,8BAA4B,aAAa,GAGzCC,8BAAgC,YAAY,GAK5Cb,IAAWljB,EAAA,QAAA,MAAAA,EAAA,IAAa8jB,CAAQ,KAAIjB,EAAc,WAAKkB,CAAY,CAAA,GAOnEC,oBACFC,GACE/B,GAA8BjiB,EAAA,MACtB,gCACA,QAAQ,CAAA,CAAA;AAKpB,WAASikB,EAA2BC,GAAsB;AACxD,UAAMlU,KAAG,EAAK,IAAIkU,EAAQ,SAAS,MAAMA,EAAQ,QAAQ,GAAE;AAC3D,IAAIxB,EAA0B,IAC5BA,EAA0B,EAAC1S,EAAG,IAE9BL,EAAO,KAAK,iCAAiCK,GAAI,IAAI;AAAA,EAEzD;AAGA,WAASmU,EAAqBC,GAAoBtV,IAAa;AAC7D,IAAA/O,EAAA,IAAAqO,GAAU,EAAA,GAAArO,EAAA,IAAQqO,CAAU,GAAA,CAAGgW,CAAQ,GAAGtV,GAAG,GAAA,EAAA;AAAA,EAC/C;AAEA,WAASuV,EAAqBD,GAAoBE,IAAgB;AAChE,IAAAvkB,EAAA,IAAAsO,GAAe,EAAA,GAAAtO,EAAA,IAAQsO,CAAe,GAAA,CAAG+V,CAAQ,GAAGE,GAAM,GAAA,EAAA;AAAA,EAC5D;AAEA,WAASC,IAAiB;AACxB,IAAIjC,EAAc,IAGhBA,UAAeqB,CAAa,CAAA,IAI5BhU,EAAO,KAAK,mBAAa8T,CAAW,CAAA;AAAA,EAExC;AAGA,WAASe,GAAiBlb,GAAc;AACtC,QAAIkZ,EAAgB,GAAE;;QAEpBlU;AAAA;mBAAkBA,CAAU;AAAA,UAAE,cAAc;AAAA,UAAM,OAAO;AAAA,UAAI,MAAM;AAAA;;SACnEkU,EAAgB,EAAClZ,CAAI,EAClB,KAAI,CAACmb,OAAU;AACd,QAAA1kB,EAAA,IAAAuO,GAAamW,IAAM,EAAA;AAAA,MACrB,CAAC,EACA,MAAK,MAAO;;UACXnW;AAAA;eACK4U,GAAuB;AAAA,YAC1B,MAAM5Z,EAAK,YAAW;AAAA,YACtB,OAAO;AAAA;;;MAEX,CAAC;AACH;AAAA,IACF;AAIA,IAAAvJ,EAAA,IAAAuO,GAAa4U,GAAuB,GAAA,EAAA;AAAA,EACtC;AAEA,WAASwB,KAAoB;AAE3B,UAAMC,IAAS3kB,EAAA,MAAS,QAAQ,OAAM,CAACua,MAAKA,EAAE,QAAQ,EAAE,IAAG,CAACA,MAAKA,EAAE,EAAE,GAC/DqK,gBAAqBxW,CAAU,EAAA;AACrC,eAAW7N,KAAMokB;AACR,aAAAC,GAAcrkB,CAAE;AAEzB,IAAAR,EAAA,IAAAqO,GAAawW,IAAa,EAAA,GAC1B7kB,EAAA,IAAAuO,GAAa4U,GAAuB,GAAA,EAAA,GAGhCT,EAAiB,KACnBA,IAAiB;AAAA,EAErB;AAGA,WAASoC,EACPT,GACAvV,IAMA;AACA,UAAME,IAAaF,GAAO,cAAcA,GAAO,eAAe,GACxDiW,IACJjW,GAAO,mBACNP,CAAU,EAAC,uBAAmBvO,EAAA,IAC7BuO,CAAU,EAAC,gBAAgB,SAAS8V,CAAQ;AAEhD,QAAIW,IAAe,IACfnO,IAAiC;AAMrC,iBACEtI,CAAU,EAAC,aAASvO,EAAA,IACpBuO,CAAU,EAAC,iBAAiB,KAAC,CAC5BS,KACDF,GAAO,QAAQ,MAED9O,EAAA,IACZuO,CAAU,EAAC,kBAAkB,WAAW,KAACvO,EAAA,IACzCuO,CAAU,EAAC,kBAAkB,SAAS8V,CAAQ,OAE9CW,IAAe,UACXzW,CAAU,EAAC,iBAAiB,MAC9BsI,IACE/H,GAAO,SAAS,IAAC9O,EAAA,IAAGuO,CAAU,EAAC,iBAAiB,OAC3CvO,EAAA,IAAEuO,CAAU,EAAC,iBAAiB,QACrCsI,IAAkB,KAAK,IACrB,GACA/H,GAAO,QAAK9O,EAAA,IAAGuO,CAAU,EAAC,cAAc,KAM1C,EAAG,YAAAwW,GAAY,cAAAC,GAAc,iBAAAnO,EAAe;AAAA,EACpD;MAGDnW,IAAGukB,GAAA,GACD5hB,aADF3C,CAAG;;UAGUwkB,IAAc,CAAAnkB,MAAA;;;;cAMnB+R,KAAGnS,GAAA,gBAAHmS,IAAG,EAAA;kBAAHA,EAAG,gDACDmQ,CAAiB,CAAA,CAAA,eADnBnQ,EAAG;AAAA;;UADDmH,EAAW,KAAAjY,EAAAC,CAAA;AAAA;;;AAOf,MAAAkjB,GAASxK,GAAA;AAAA;yBAAY;AAAA;;yBAAqB;AAAA;;uBAAeoI,CAAY;AAAA;;;AAGrE,MAAAqC,GAAWxhB,IAAA;AAAA;;;;uBAEIsf,CAAW;AAAA;;uBACda,CAAY;AAAA;;uBACfhB,CAAY;AAAA;;iBACnBjR,EAAM;AAAA;;;;;cAONuT,KAAO1R,GAAA,GACLN,aADFgS,EAAO,gBACLhS,EAAG;AACD,UAAAV,GAAOiI,IAAA;AAAA;;;;;2DACL4I,CAAQ,UACLT,CAAY,EAAC,iBAAiB,yBAC9BA,CAAY,EAAC,cAAc,SAAS,CAAA;;;sBAJ3C1P,EAAG;6BAAHA,IAAG,CAAA;;;;mCAUK,OAAO,QAAOrT,EAAA,IAACsjB,CAAc,MAAOgC,IAAaC,EAAc,MAAED,IAAW,CAAAvkB,IAAAykB,OAAA;;oBAAxCF,KAAW,MAAAtlB,EAAA,IAAAylB,EAAA,EAAA,CAAA,GAAEF,KAAc,MAAAvlB,EAAA,IAAAylB,EAAA,EAAA,CAAA;oBACnE/R,KAAG5R,GAAA,gBAAH4R,EAAG;;;wBAECI,KAAGlP,GAAA,gBAAHkP,EAAG;AACD,oBAAAnB,GAAOkB,IAAA;AAAA,6BAAQ;AAAA;;;;;+DACbyR,GAAW,CAAA,CAAA;;;gCAFfxR,EAAG,gBAAHA,EAAG;AAAA;;AADD,oBAAAwR,GAAW,MAAK,cAAUtjB,GAAAmB,EAAA;AAAA;;oBAY9BqR,KAAGxU,EAAA,QAAAggB,IAAA,CAAA;uBAAHxL,IAAG,IACK+Q,IAAc,CAAIzW,OAAQA,GAAO,IAAE,CAAA/N,IAAjB+N,OAAM;wBACrB4W,KAAS1lB,EAAA,QAAA,MAAG8kB,EAClB5V,SAAWJ,EAAM,EAAC,EAAE,GAAA9O,EAAA,IACpB8O,EAAM,CAAA,CAAA;;AAII,wBAAAlO,KAAAZ,EAAA,QAAA,MAAAA,EAAA,IAAAqO,CAAU,EAAArO,EAAA,IAAC8O,EAAM,EAAC,EAAE,KAAK,CAAC,GAEpBsN,KAAApc,EAAA,QAAA,MAAAA,EAAA,IAAAsO,CAAe,EAAAtO,EAAA,IAAC8O,EAAM,EAAC,EAAE,KAAK,EAAE;AAJjD,oBAAA6W,GAAU5kB,IAAA;AAAA;qCACR+N,EAAM;AAAA;;;;wCAEWsV;AAAA;;;wCAEAE;AAAA;AACC,+BAAAtkB,EAAA,IAAA0lB,EAAS,EAAC;AAAA;;AACR,+BAAA1lB,EAAA,IAAA0lB,EAAS,EAAC;AAAA;;AACd,+BAAA1lB,EAAA,IAAA0lB,EAAS,EAAC;AAAA;;qCACnB3C,CAAY;AAAA;;;4BAfzBvO,EAAG,WAbLd,EAAG,gBAAHA,EAAG;AAAA;;kBAsCLsB,KAAGX,GAAA;qBAAHW,IAAG,IAAA,MAAAhV,EAAA,IACKqjB,CAAc,GAAA,CAAIvU,OAAQA,GAAO,IAAE,CAAA/N,IAAjB+N,OAAM;sBACrB4W,KAAS1lB,EAAA,QAAA,MAAG8kB,EAClB5V,SAAWJ,EAAM,EAAC,EAAE,GAAA9O,EAAA,IACpB8O,EAAM,CAAA,CAAA;;AAII,sBAAAlO,KAAAZ,EAAA,QAAA,MAAAA,EAAA,IAAAqO,CAAU,EAAArO,EAAA,IAAC8O,EAAM,EAAC,EAAE,KAAK,CAAC,GAEpBsN,KAAApc,EAAA,QAAA,MAAAA,EAAA,IAAAsO,CAAe,EAAAtO,EAAA,IAAC8O,EAAM,EAAC,EAAE,KAAK,EAAE;AAJjD,kBAAA6W,GAAU5kB,IAAA;AAAA;mCACR+N,EAAM;AAAA;;;;sCAEWsV;AAAA;;;sCAEAE;AAAA;AACC,6BAAAtkB,EAAA,IAAA0lB,EAAS,EAAC;AAAA;;AACR,6BAAA1lB,EAAA,IAAA0lB,EAAS,EAAC;AAAA;;AACd,6BAAA1lB,EAAA,IAAA0lB,EAAS,EAAC;AAAA;;mCACnB3C,CAAY;AAAA;;;0BAfzB/N,EAAG,gBAAHA,EAAG;AAAA;;oBAzCDuO,CAAmB,IAAAvhB,GAAAmS,EAAA,IAAAnS,GAAAE,IAAA,EAAA;AAAA;;;;;AAgErB,cAAA0jB,GAAc7kB,IAAA;AAAA;+BACZwN,CAAU;AAAA;yBACFkW;AAAA,0BACCE;AAAA;+BACF5B,CAAY;AAAA;;;;oBALnBS,CAAQ,KAAAxhB,GAAAuS,EAAA;AAAA;;kBAxEd8Q,EAAO,eAAPA,EAAO;AAAA;;gBADL5B,CAAe,KAAA,CAAAzjB,EAAA,IAAKkjB,CAAW,KAAA,CAAAljB,EAAA,IAAK8iB,CAAa,KAAA9gB,EAAA4S,EAAA;AAAA;;;;;cAwFnDtR,KAACmR,GAAA,gBAADnR,IAAC,EAAA;kBAADA,EAAC,0CAAmCkf,EAAa,CAAA,CAAA,eAAjDlf,EAAC;AAAA;;UADCkf,EAAa,KAAAxgB,EAAA6S,EAAA;AAAA;;;;;cASfO,KAAG4F,GAAA,gBAAH5F,EAAG;AACD,UAAAwD,GAAIW,IAAA;AAAA;;;;;;qDACFQ,EAAiB,CAAA,CAAA;;;;;AAEnB,UAAAhH,GAAMoC,IAAA;AAAA;;;;qBAII6E,EAA0B;AAAA;;;;2DAElC+I,CAAY,EAAC,WAAW,SAAS,CAAA;;;sBAVrC3N,EAAG,eAAHA,EAAG;AAAA;;AADD,UAAApV,EAAA,IAAA8iB,CAAa,KAAI/I,EAAiB,KAAA/X,EAAA+S,EAAA;AAAA;;;;;cAkBpC8Q,KAAO1M,GAAA,GACL1D,aADFoQ,EAAO,gBACLpQ,EAAG;AACD,UAAA9C,GAAO0N,IAAA;AAAA;;;;;qDACLwC,EAAc,UACXE,CAAY,EAAC,iBAAiB,yBAC9BA,CAAY,EAAC,cAAc,aAAa,CAAA;;;sBAJ/CtN,EAAG;6BAAHA,IAAG,CAAA;AAOH,UAAAqQ,GAAenQ,IAAA;AAAA;;;;qBAEGiN,EAAmB;AAAA;;2BAC5BG,CAAY;AAAA;;qBACnBjR,EAAM;AAAA;sBAZV+T,EAAO,eAAPA,EAAO;AAAA;;gBADL/B,CAAQ,KAAA9hB,EAAAwT,EAAA;AAAA;;;;;AAoBV,UAAAuQ,GAAYhlB,GAAA;AAAA;6BAAoB;AAAA;;2BAAqBgiB,CAAY;AAAA;;;;gBAD/DgB,CAAY,KAAA/hB,EAAA6T,EAAA;AAAA;;;;;cAMdmQ,KAAO7M,GAAA,GACLrD,aADFkQ,EAAO,gBACLlQ,EAAG;AACD,UAAAnD,GAAOwI,IAAA;AAAA;;;;;;;;sBADTrF,EAAG;6BAAHA,IAAG,CAAA;AAGH,UAAAmQ,GAAIC,IAAA;AAAA;;;;;yCACIlC,CAAsB,GAAA,CAAInC,OAAGA,GAAE,MAAM,SAAO,CAAA9gB,IAAlB8gB,OAAC;;0BACrB,YAAAsE,IAAU,GAAKC,GAAI,IAAIC,SAChCxE,EAAC,GAAA7hB,EAAA,IACD+iB,CAAY,GACZjR,EAAM,CAAA;AAHG,yBAAA,EAAA,YAAAqU,IAAe,MAAAC,GAAI;AAAA;AAK7B,gBAAAE,sCACK,MAAI;AAAA;;;;2BAIU3U;AAAA;iCACHuS,EAA0BlkB,EAAA,IAAC6hB,EAAC,EAAC,KAAK;AAAA,gCACpCpc,OACXye,EAA0BlkB,EAAA,IAAAumB,EAAA,EAAC,WAAW9gB,EAAC,KAAAzF,EAAA,IAAK6hB,EAAC,EAAC,KAAK;AAAA;;;;sBAnB5DmE,EAAO,eAAPA,EAAO;AAAA;;gBADLjC,CAAY,KAAA/hB,EAAAkU,EAAA;AAAA;;;;;AA6Bd,UAAA6P,GAAYhlB,GAAA;AAAA;6BAAoB;AAAA;;2BAAqBgiB,CAAY;AAAA;;;;gBAD9DgB,CAAY,KAAA/hB,EAAAoU,EAAA;AAAA;;;;;AAMf,UAAAoQ,GAAazlB,GAAA;AAAA;6BAAmB;AAAA;;2BAAoBgiB,CAAY;AAAA;;;;gBAD7DG,CAAW,KAAAlhB,EAAAkX,EAAA;AAAA;;;;;AAMd,UAAAuN,GAAY1lB,GAAA;AAAA;6BAAa;AAAA;;2BAAcgiB,CAAY;AAAA;;;;AAD3C,UAAA9iB,EAAA,MAAA,KAAK,SAAS,YAAM8jB,CAAY,KAAA/hB,EAAAqX,EAAA;AAAA;;;;;cAMxCqN,KAAOhU,GAAA,gBAAPgU,EAAO;AACL,UAAA9N,GAAI+N,IAAA;AAAA;;;;;;;6DACI,UAAU,CAAA;;;sBAFpBD,EAAO,eAAPA,EAAO;AAAA;;kBADC,cAAU1kB,EAAAyX,EAAA;AAAA;;;;qBA/MxBpW,EAAG;;;YA6NC6X,IAAGO,GAAA,eAAHP,CAAG;AACO,QAAAgK,EAAc0B,CAAA,WADxB1L,CAAG,eAAHA,CAAG;AAAA;YAKHE,IAAGL,GAAA,GACDS,YADFJ,CAAG,eACDI,CAAG;AACO,QAAA0J,EAAc2B,CAAA,WADxBrL,CAAG;AAGH,YAAA0E,cAHA1E,GAAG,CAAA,gBAGH0E,CAAG;AACD,QAAA4G,GAAaC,IAAA;AAAA;;;;yBAECnD,CAAa;AAAA;;yBACzBD,CAAkB;AAAA;sBACPa;AAAA;AACE,mBAAAxkB,EAAA,IAAAuO,CAAU,EAAC;AAAA;;mBACxBqL,EAAK;AAAA;;mBACLK,EAAW;AAAA;;mBACXC,EAAiB;AAAA;;mBACjBL,EAAe;AAAA;;mBACfC,EAAc;AAAA;;mBACdC,EAAiB;AAAA;;mBACjBC,EAA0B;AAAA;;yBACnB+I,CAAY;AAAA;;mBACnBjR,EAAM;AAAA;oBAfVoO,CAAG,WAJL9E,CAAG,eAAHA,CAAG;AAAA;;cAPD8H,CAAW,IAAAlhB,EAAAglB,CAAA,IAAAhlB,EAAAoB,GAAA,EAAA;AAAA;;QAmCf+c,KAAGngB,EAAA,QAAAinB,IAAA,CAAA;;qBAAH9G,EAAG;AACO,IAAA+E,EAAcgC,EAAA,WADxB/G,EAAG;uBAAHA,IAAG,CAAA;;;YAMDG,IAAG6G,GAAA,eAAH7G,CAAG;AACD,QAAA8G,GAASC,GAAA;AAAA;;;;yBAEKzD,CAAa;AAAA;;yBACzBD,CAAkB;AAAA;sBACPa;AAAA;mBACX5K,EAAK;AAAA;;mBACLK,EAAW;AAAA;;mBACXJ,EAAe;AAAA;;mBACfC,EAAc;AAAA;;yBACPiJ,CAAY;AAAA;oBAVvBzC,CAAG,eAAHA,CAAG;AAAA;;cADA4C,CAAW,KAAAlhB,EAAAslB,EAAA;AAAA;;YAnQlBjkB,EAAG,GA8PDrD,EAAA,gBAAA,MAAA0Z,KAAA1Z,EAAA,UAAAmgB,0DAA8C+C,CAAW,EAAA,CAAA,CAAA;AAAA;UA/P7DxiB,CAAG,eAAHA,CAAG;AAFI;","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]}