@area8975/ui 0.1.1-dev.21 → 0.1.1-dev.23
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.
- package/fesm2022/area8975-ui.mjs +87 -11
- package/fesm2022/area8975-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/area8975-ui.d.ts +37 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"area8975-ui.mjs","names":[],"sources":["../../../projects/ui/src/lib/format/privacy.ts","../../../projects/ui/src/lib/format/format.ts","../../../projects/ui/src/lib/theme/dark-class.ts","../../../projects/ui/src/lib/charts/chart/chart.palette.ts","../../../projects/ui/src/lib/charts/chart/axis-chart.base.ts","../../../projects/ui/src/lib/charts/chart/chart.options.ts","../../../projects/ui/src/lib/generic/skeleton/skeleton.component.ts","../../../projects/ui/src/lib/generic/skeleton/skeleton.component.html","../../../projects/ui/src/lib/charts/chart-legend/chart-legend.component.ts","../../../projects/ui/src/lib/charts/chart-legend/chart-legend.component.html","../../../projects/ui/src/lib/charts/chart/chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-table.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.component.ts","../../../projects/ui/src/lib/charts/bar-chart/bar-chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.template.html","../../../projects/ui/src/lib/charts/bar-chart/bar-chart.types.ts","../../../projects/ui/src/lib/charts/line-chart/line-chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.template.html","../../../projects/ui/src/lib/charts/line-chart/line-chart.types.ts","../../../projects/ui/src/lib/charts/pie-chart/pie-chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.template.html","../../../projects/ui/src/lib/charts/pie-chart/pie-chart.types.ts","../../../projects/ui/src/lib/forms/checkbox/checkbox.component.ts","../../../projects/ui/src/lib/forms/checkbox/checkbox.component.html","../../../projects/ui/src/lib/forms/file/file.utils.ts","../../../projects/ui/src/lib/forms/dropzone/dropzone.component.ts","../../../projects/ui/src/lib/forms/dropzone/dropzone.component.html","../../../projects/ui/src/lib/forms/field/field.component.ts","../../../projects/ui/src/lib/forms/field/field.component.html","../../../projects/ui/src/lib/forms/file/file.types.ts","../../../projects/ui/src/lib/forms/input/input.component.ts","../../../projects/ui/src/lib/forms/input/input.component.html","../../../projects/ui/src/lib/forms/input/input.types.ts","../../../projects/ui/src/lib/forms/input-addon/input-addon.component.ts","../../../projects/ui/src/lib/forms/input-group/input-group.component.ts","../../../projects/ui/src/lib/forms/radio/radio.component.ts","../../../projects/ui/src/lib/forms/radio/radio.component.html","../../../projects/ui/src/lib/generic/badge/badge.component.ts","../../../projects/ui/src/lib/generic/badge/badge.component.html","../../../projects/ui/src/lib/generic/card/card.types.ts","../../../projects/ui/src/lib/generic/card/card.component.ts","../../../projects/ui/src/lib/layout/overlay/overlay.positioner.ts","../../../projects/ui/src/lib/layout/overlay/overlay.stack.ts","../../../projects/ui/src/lib/layout/overlay/overlay.component.ts","../../../projects/ui/src/lib/generic/dropdown/dropdown.directives.ts","../../../projects/ui/src/lib/generic/dropdown/dropdown.component.ts","../../../projects/ui/src/lib/generic/dropdown/dropdown.component.html","../../../projects/ui/src/lib/forms/select/select.component.ts","../../../projects/ui/src/lib/forms/select/select.component.html","../../../projects/ui/src/lib/forms/select/select.datasource.ts","../../../projects/ui/src/lib/forms/select/select.types.ts","../../../projects/ui/src/lib/forms/textarea/textarea.component.ts","../../../projects/ui/src/lib/forms/textarea/textarea.component.html","../../../projects/ui/src/lib/forms/textarea/textarea.types.ts","../../../projects/ui/src/lib/generic/alert/alert.component.ts","../../../projects/ui/src/lib/generic/alert/alert.component.html","../../../projects/ui/src/lib/generic/alert/alert.types.ts","../../../projects/ui/src/lib/generic/avatar/avatar.component.ts","../../../projects/ui/src/lib/generic/avatar/avatar.component.html","../../../projects/ui/src/lib/generic/avatar/avatar.types.ts","../../../projects/ui/src/lib/generic/badge/badge.types.ts","../../../projects/ui/src/lib/generic/button/button.component.ts","../../../projects/ui/src/lib/generic/button/button.component.html","../../../projects/ui/src/lib/generic/button/button.types.ts","../../../projects/ui/src/lib/generic/button-group/button-group.component.ts","../../../projects/ui/src/lib/generic/calendar/calendar.utils.ts","../../../projects/ui/src/lib/generic/calendar/calendar.component.ts","../../../projects/ui/src/lib/generic/calendar/calendar.component.html","../../../projects/ui/src/lib/generic/calendar/calendar.types.ts","../../../projects/ui/src/lib/generic/card-header/card-header.component.ts","../../../projects/ui/src/lib/generic/card-header/card-header.component.html","../../../projects/ui/src/lib/generic/card-header/card-header.types.ts","../../../projects/ui/src/lib/generic/container/container.component.ts","../../../projects/ui/src/lib/presets/modal-close-btn/modal-close-btn.component.ts","../../../projects/ui/src/lib/presets/modal-close-btn/modal-close-btn.component.html","../../../projects/ui/src/lib/generic/drawer/drawer.component.ts","../../../projects/ui/src/lib/generic/drawer/drawer.component.html","../../../projects/ui/src/lib/generic/tooltip/tooltip.component.ts","../../../projects/ui/src/lib/generic/tooltip/tooltip.component.html","../../../projects/ui/src/lib/generic/kpi/kpi.component.ts","../../../projects/ui/src/lib/generic/kpi/kpi.component.html","../../../projects/ui/src/lib/generic/loading/loading.component.ts","../../../projects/ui/src/lib/generic/loading/loading.component.html","../../../projects/ui/src/lib/generic/loading/loading.types.ts","../../../projects/ui/src/lib/generic/modal/modal.component.ts","../../../projects/ui/src/lib/generic/modal/modal.component.html","../../../projects/ui/src/lib/generic/money/money.component.ts","../../../projects/ui/src/lib/generic/money/money.component.html","../../../projects/ui/src/lib/generic/money/money.types.ts","../../../projects/ui/src/lib/generic/pagination/pagination.component.ts","../../../projects/ui/src/lib/generic/pagination/pagination.component.html","../../../projects/ui/src/lib/generic/progress/progress.component.ts","../../../projects/ui/src/lib/generic/progress/progress.component.html","../../../projects/ui/src/lib/generic/progress/progress.types.ts","../../../projects/ui/src/lib/generic/segmented/segmented.component.ts","../../../projects/ui/src/lib/generic/segmented/segmented.component.html","../../../projects/ui/src/lib/generic/skeleton/skeleton.types.ts","../../../projects/ui/src/lib/generic/stat/stat.component.ts","../../../projects/ui/src/lib/generic/stat/stat.component.html","../../../projects/ui/src/lib/generic/tab/tab.directive.ts","../../../projects/ui/src/lib/generic/tab/tab.component.ts","../../../projects/ui/src/lib/generic/tab/tab.component.html","../../../projects/ui/src/lib/generic/table/table.registry.ts","../../../projects/ui/src/lib/generic/table/table.component.ts","../../../projects/ui/src/lib/generic/table/table.component.html","../../../projects/ui/src/lib/generic/table/table.datasource.ts","../../../projects/ui/src/lib/generic/toast/toast.component.ts","../../../projects/ui/src/lib/generic/toast/toast.component.html","../../../projects/ui/src/lib/generic/toast/toast.service.ts","../../../projects/ui/src/lib/generic/toast/toast.types.ts","../../../projects/ui/src/lib/generic/toaster/toaster.component.ts","../../../projects/ui/src/lib/generic/toaster/toaster.component.html","../../../projects/ui/src/lib/generic/toaster/toaster.types.ts","../../../projects/ui/src/lib/layout/layout/layout.component.ts","../../../projects/ui/src/lib/layout/layout/layout.component.html","../../../projects/ui/src/lib/layout/sidebar/sidebar.component.ts","../../../projects/ui/src/lib/layout/sidebar/sidebar.component.html","../../../projects/ui/src/lib/layout/sidebar-group/sidebar-group.component.ts","../../../projects/ui/src/lib/layout/sidebar-group/sidebar-group.component.html","../../../projects/ui/src/lib/layout/sidebar-item/sidebar-item.component.ts","../../../projects/ui/src/lib/layout/sidebar-item/sidebar-item.component.html","../../../projects/ui/src/lib/presets/colour/colour.component.ts","../../../projects/ui/src/lib/presets/colour/colour.component.html","../../../projects/ui/src/lib/presets/counter/counter.component.ts","../../../projects/ui/src/lib/presets/counter/counter.component.html","../../../projects/ui/src/lib/presets/date-range-picker/date-range-picker.component.ts","../../../projects/ui/src/lib/presets/date-range-picker/date-range-picker.component.html","../../../projects/ui/src/lib/presets/date-range-picker/date-range-presets.ts","../../../projects/ui/src/lib/presets/time-select/time-select.component.ts","../../../projects/ui/src/lib/presets/time-select/time-select.component.html","../../../projects/ui/src/lib/presets/datepicker/datepicker.component.ts","../../../projects/ui/src/lib/presets/datepicker/datepicker.component.html","../../../projects/ui/src/lib/presets/dropdown-button/dropdown-button.component.ts","../../../projects/ui/src/lib/presets/dropdown-button/dropdown-button.component.html","../../../projects/ui/src/lib/presets/dropdown-menu/dropdown-menu.component.ts","../../../projects/ui/src/lib/presets/dropdown-menu/dropdown-menu.component.html","../../../projects/ui/src/lib/presets/file-input/file-input.component.ts","../../../projects/ui/src/lib/presets/file-input/file-input.component.html","../../../projects/ui/src/lib/presets/search/search.component.ts","../../../projects/ui/src/lib/presets/search/search.component.html","../../../projects/ui/src/lib/presets/switch/switch.component.ts","../../../projects/ui/src/lib/presets/switch/switch.component.html","../../../projects/ui/src/lib/presets/table-filters/table-filters.types.ts","../../../projects/ui/src/lib/presets/table-filters/table-filters.component.ts","../../../projects/ui/src/lib/presets/table-filters/table-filters.component.html","../../../projects/ui/src/lib/presets/user-menu/user-menu.component.ts","../../../projects/ui/src/lib/presets/user-menu/user-menu.component.html","../../../projects/ui/src/lib/theme/theme.ts","../../../projects/ui/src/lib/theme/theme-switch.component.ts"],"sourcesContent":["import {\n InjectionToken,\n type Provider,\n type Signal,\n signal\n} from '@angular/core';\n\n\nexport const UiPrivacies = [\n 'visible',\n 'discreet',\n 'hidden'\n] as const;\n\n/** Discreet hides amounts but keeps their shape, hidden hides everything about them. */\nexport type UiPrivacy = typeof UiPrivacies[number];\n\nexport const UI_PRIVACY = new InjectionToken<Signal<UiPrivacy>>('UI_PRIVACY', {\n providedIn: 'root',\n factory: () => signal<UiPrivacy>('visible').asReadonly()\n});\n\n/** The factory runs in an injection context, so it can return a signal from an app service. */\nexport function provideUiPrivacy(privacy: () => Signal<UiPrivacy>): Provider {\n return {\n provide: UI_PRIVACY,\n useFactory: privacy\n };\n}\n\n// #region Privacy\n\nconst PRIVACY_MASK = ' - - -';\n\nexport function maskMoney(currency: string, locale: string): string {\n return new Intl.NumberFormat(locale, { style: 'currency', currency })\n .formatToParts(0)\n .map(part =>\n part.type === 'currency' || part.type === 'literal'\n ? part.value\n : PRIVACY_MASK\n )\n .filter((value, index, values) =>\n value !== PRIVACY_MASK || values[index - 1] !== PRIVACY_MASK\n )\n .join('');\n}\n// #endregion\n","import { inject, InjectionToken, type Provider } from '@angular/core';\n\nimport { maskMoney, UI_PRIVACY } from './privacy';\n\n\nexport interface UiFormat {\n /** ISO 4217 code, e.g. \"GBP\". */\n currency: string;\n\n /** BCP 47 tag, e.g. \"en-GB\". */\n locale: string;\n}\n\nexport const UI_FORMAT_DEFAULTS: UiFormat = {\n currency: 'GBP',\n locale: 'en-GB'\n};\n\nexport const UI_FORMAT = new InjectionToken<UiFormat>('UI_FORMAT', {\n providedIn: 'root',\n factory: () => UI_FORMAT_DEFAULTS\n});\n\nexport function provideUiFormat(format: Partial<UiFormat>): Provider {\n return {\n provide: UI_FORMAT,\n useValue: { ...UI_FORMAT_DEFAULTS, ...format }\n };\n}\n\nconst MONEY = Symbol('money');\n\nexport interface MoneyFormatterParts {\n format: (value: number) => string;\n mask: string;\n}\n\n/** The unmasked formatter and mask behind a formatter from `injectMoneyFormatter`, null for any other function. */\nexport function moneyFormatterParts(formatter: (value: number) => string): MoneyFormatterParts | null {\n return (formatter as { [MONEY]?: MoneyFormatterParts })[MONEY] ?? null;\n}\n\n/** Needs an injection context. Reads `UI_PRIVACY` on every call, so a template or computed calling it follows the mode. */\nexport function injectMoneyFormatter(\n options: Intl.NumberFormatOptions = {}\n): (value: number) => string {\n const { currency, locale } = inject(UI_FORMAT);\n const privacy = inject(UI_PRIVACY);\n const formatter = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n ...options\n });\n const resolved = formatter.resolvedOptions();\n const mask = maskMoney(resolved.currency ?? currency, resolved.locale);\n\n const format = (value: number) => formatter.format(value);\n\n return Object.assign(\n (value: number) => privacy() === 'visible' ? format(value) : mask,\n { [MONEY]: { format, mask } }\n );\n}\n","import { DOCUMENT } from '@angular/common';\nimport { DestroyRef, inject, Injectable, signal } from '@angular/core';\n\n\n@Injectable({ providedIn: 'root' })\nexport class UiDarkClass {\n readonly isDark = signal(false);\n\n constructor() {\n const root = inject(DOCUMENT).documentElement;\n const read = () => this.isDark.set(root.classList.contains('dark'));\n\n read();\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(read);\n\n observer.observe(root, { attributes: true, attributeFilter: ['class'] });\n inject(DestroyRef).onDestroy(() => observer.disconnect());\n }\n}\n","/**\n * Categorical colours for chart series, in a fixed order that was checked for\n * colour blindness (adjacent pairs stay apart for protan, deutan and tritan).\n * Keep the order, a series takes the next slot, never a generated colour.\n */\nexport const CHART_PALETTE = [\n '#2a78d6', // blue\n '#eb6834', // orange\n '#1baf7a', // aqua\n '#eda100', // yellow\n '#e87ba4', // magenta\n '#008300', // green\n '#4a3aa7', // violet\n '#e34948' // red\n] as const;\n\n/** Violet and green are lightened to keep 3:1 contrast on a dark card. */\nexport const CHART_PALETTE_DARK = [\n '#2a78d6', // blue\n '#eb6834', // orange\n '#1baf7a', // aqua\n '#eda100', // yellow\n '#e87ba4', // magenta\n '#2e9e2e', // green\n '#8a7cf0', // violet\n '#e34948' // red\n] as const;\n\n/** Past eight series, fold the rest into \"Other\" instead of reusing a colour. */\nexport const CHART_MAX_SERIES = CHART_PALETTE.length;\n\n/** Lines can go to sixteen, the second eight reuse the colours dashed. */\nexport const CHART_MAX_LINE_SERIES = CHART_PALETTE.length * 2;\n\n/** Chart chrome, apex needs real colours so these can't be CSS variables. */\nexport interface ChartInk {\n text: string;\n muted: string;\n grid: string;\n surface: string;\n\n context: string;\n}\n\nexport const CHART_INK: ChartInk = {\n text: '#1e2939', // gray-800\n muted: '#6a7282', // gray-500\n grid: '#e5e7eb', // gray-200\n surface: '#ffffff',\n context: '#d1d5dc' // gray-300\n};\n\nexport const CHART_INK_DARK: ChartInk = {\n text: '#e5e5e5', // neutral-200\n muted: '#a1a1a1', // neutral-400\n grid: '#404040', // neutral-700\n surface: '#262626', // neutral-800\n context: '#525252' // neutral-600\n};\n\nexport function chartInk(dark: boolean): ChartInk {\n return dark ? CHART_INK_DARK : CHART_INK;\n}\n\nexport interface ChartSeriesStyle {\n colour: string;\n dashed: boolean;\n}\n\n/** Past the eighth slot a series goes grey, reusing a colour would make two series look the same. */\nexport function chartColour(index: number, dark = false): string {\n return (dark ? CHART_PALETTE_DARK : CHART_PALETTE)[index] ?? chartInk(dark).context;\n}\n\n/**\n * Colour plus line style for a slot. With `dashes` the ninth to sixteenth\n * slots reuse the colours as dashed lines, colour and dash together keep\n * them apart. Anything past that is grey.\n */\nexport function chartSeriesStyle(index: number, dashes: boolean, dark = false): ChartSeriesStyle {\n if (dashes && index >= CHART_PALETTE.length && index < CHART_MAX_LINE_SERIES) {\n return { colour: chartColour(index - CHART_PALETTE.length, dark), dashed: true };\n }\n\n return { colour: chartColour(index, dark), dashed: false };\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n inject,\n input,\n signal\n} from '@angular/core';\n\nimport { moneyFormatterParts, UI_FORMAT } from '../../format/format';\nimport { maskMoney, UI_PRIVACY, type UiPrivacy } from '../../format/privacy';\nimport { UiDarkClass } from '../../theme/dark-class';\nimport type {\n ChartLegendItem,\n ChartLegendPosition,\n ChartLegendSource\n} from '../chart-legend/chart-legend.types';\nimport {\n chartInk,\n type ChartSeriesStyle,\n chartSeriesStyle\n} from './chart.palette';\nimport type {\n ChartHeight,\n ChartOptions,\n ChartSeries,\n ChartValueFormatter\n} from './chart.types';\n\n\n/** Inputs every chart with categories along one axis and values up the other shares. */\n@Directive()\nexport abstract class UiAxisChartBase implements ChartLegendSource {\n protected readonly uiFormat = inject(UI_FORMAT);\n private readonly privacy = inject(UI_PRIVACY);\n\n protected readonly dark = inject(UiDarkClass).isDark;\n protected readonly ink = computed(() => chartInk(this.dark()));\n\n readonly series = input.required<ChartSeries[]>();\n readonly categories = input.required<string[]>();\n\n /** Says what the chart shows, e.g. \"Spending by month\". */\n readonly ariaLabel = input.required<string>();\n\n readonly height = input<ChartHeight>(300);\n\n /** Used on the value axis, the tooltip and the table, e.g. to show money. */\n readonly valueFormatter = input<ChartValueFormatter>(numberFormatter(this.uiFormat.locale));\n\n /** Masks the values in privacy mode. Defaults to whether `valueFormatter` came from `injectMoneyFormatter`. */\n readonly sensitive = input<boolean | undefined, unknown>(undefined, {\n transform: value => value === undefined ? undefined : booleanAttribute(value)\n });\n\n /** Heading for the category column in the data table. */\n readonly categoryLabel = input<string>('Category');\n\n readonly loading = input(false, { transform: booleanAttribute });\n readonly emptyText = input<string>('No data to show');\n\n /** Shows the data table under the chart instead of only to screen readers. */\n readonly showTable = input(false, { transform: booleanAttribute });\n\n /** Raw ApexCharts options merged over the defaults, for anything not covered here. */\n readonly options = input<ChartOptions | null>(null);\n\n /**\n * Only these series get palette colours, the rest go grey so the few that\n * matter stand out. The way to show more series than there are colours.\n */\n readonly highlight = input<string[] | null>(null);\n\n readonly highlightKeepsColours = input(false, { transform: booleanAttribute });\n\n /** `none` leaves the legend out, for when a `ui-chart-legend` is linked with `for`. */\n readonly legend = input<ChartLegendPosition>('auto');\n\n /** Series switched off in the legend. */\n readonly hiddenSeries = signal<string[]>([]);\n\n /** The series the legend is pointing at, the others fade while it's set. */\n readonly emphasis = signal<string | null>(null);\n\n /** Charts that draw lines can tell series apart by dashes too, bars can't. */\n protected readonly supportsDashes: boolean = false;\n\n private readonly money = computed(() => moneyFormatterParts(this.valueFormatter()));\n\n protected readonly privacyMode = computed<UiPrivacy>(() =>\n this.sensitive() ?? !!this.money() ? this.privacy() : 'visible'\n );\n\n protected readonly masked = computed(() => this.privacyMode() !== 'visible');\n protected readonly concealed = computed(() => this.privacyMode() === 'hidden');\n\n protected readonly displayFormatter = computed<ChartValueFormatter>(() => {\n const money = this.money();\n\n if (!this.masked()) {\n return money?.format ?? this.valueFormatter();\n }\n\n const mask = money?.mask ?? maskMoney(this.uiFormat.currency, this.uiFormat.locale);\n\n return () => mask;\n });\n\n protected readonly apexHeight = computed(() => {\n const height = this.height();\n\n return height === 'fill' ? '100%' : height;\n });\n\n protected readonly isEmpty = computed(() =>\n !this.series().some(item => item.data.some(value => value !== null))\n );\n\n protected readonly isMuted = computed(() => {\n const highlight = this.highlight();\n\n return this.series().map(item =>\n !!highlight && !highlight.includes(item.name)\n );\n });\n\n // highlighted series take slots in the order they're highlighted, so colours don't depend on data order\n private readonly colourOrder = computed(() =>\n this.highlightKeepsColours() ? null : this.highlight()\n );\n\n protected readonly styles = computed<ChartSeriesStyle[]>(() => {\n const order = this.colourOrder();\n const muted = this.isMuted();\n\n return this.series().map((item, index) => {\n const dashed = this.supportsDashes && !!item.dashed;\n\n if (muted[index]) {\n return { colour: this.ink().context, dashed };\n }\n\n const style = chartSeriesStyle(\n order ? order.indexOf(item.name) : index,\n this.supportsDashes,\n this.dark()\n );\n\n return {\n colour: item.colour ?? style.colour,\n dashed: style.dashed || dashed\n };\n });\n });\n\n protected readonly colours = computed(() =>\n this.styles().map(style => style.colour)\n );\n protected readonly dashed = computed(() =>\n this.styles().map(style => style.dashed)\n );\n\n /** Grey context series stay out of the legend, the note says how many there are. */\n readonly legendItems = computed<ChartLegendItem[]>(() => {\n const order = this.colourOrder();\n const items = this.series()\n .map((item, index) => ({\n name: item.name,\n ...this.styles()[index]\n }))\n .filter((_, index) => !this.isMuted()[index]);\n\n return order\n ? items.sort((a, b) =>\n order.indexOf(a.name) - order.indexOf(b.name)\n )\n : items;\n });\n\n readonly legendNote = computed(() => {\n const count = this.isMuted().filter(Boolean).length;\n\n return count ? `${count} more in grey` : '';\n });\n\n protected formatValue(value: number | null | undefined): string {\n return value === null || value === undefined\n ? '-'\n : this.displayFormatter()(value);\n }\n}\n\nfunction numberFormatter(locale: string): ChartValueFormatter {\n const formatter = new Intl.NumberFormat(locale);\n\n return value => formatter.format(value);\n}\n","import type { ChartInk } from './chart.palette';\nimport type { ChartOptions } from './chart.types';\n\n\n/** Axis text, muted so it sits behind the data. */\nexport function chartAxisLabels(ink: ChartInk) {\n return { style: { colors: ink.muted, fontSize: '12px' } };\n}\n\nexport interface ChartTooltipRow {\n colour: string;\n name: string;\n\n /** Left out in privacy mode, the row keeps its swatch and name. */\n value?: string;\n dashed?: boolean;\n}\n\n/** Defaults every chart starts from, quiet chrome so the data does the talking. */\nexport function baseChartOptions(ink: ChartInk): ChartOptions {\n const labels = chartAxisLabels(ink);\n\n return {\n chart: {\n fontFamily: 'inherit',\n foreColor: ink.muted,\n parentHeightOffset: 0,\n redrawOnParentResize: true,\n toolbar: { show: false },\n zoom: { enabled: false },\n animations: { enabled: true, speed: 300 }\n },\n dataLabels: { enabled: false },\n // apex fades fills and lines to 85% by default, which washes the palette out\n fill: { type: 'solid', opacity: 1 },\n grid: {\n borderColor: ink.grid,\n strokeDashArray: 0,\n padding: { top: 0, right: 8, bottom: 0, left: 8 }\n },\n // ui-chart-legend draws the legend, apex's own stays off\n legend: { show: false },\n xaxis: {\n axisBorder: { show: true, color: ink.grid },\n axisTicks: { show: false },\n labels\n },\n yaxis: {\n axisBorder: { show: false },\n axisTicks: { show: false },\n labels\n },\n states: {\n hover: { filter: { type: 'lighten' } },\n active: { filter: { type: 'none' } }\n }\n };\n}\n\n/** Plain objects merge key by key, arrays and everything else replace. */\nexport function mergeChartOptions(base: ChartOptions, overrides: ChartOptions | null): ChartOptions {\n return overrides ? deepMerge(base, overrides) as ChartOptions : base;\n}\n\nexport function chartTooltipHtml(\n title: string,\n rows: ChartTooltipRow[],\n footer = '',\n total?: { name: string; value: string }\n): string {\n const items = rows.map(row => `\n <div class=\"ui-chart-tooltip-row ui-text-body-alt\">\n <span\n class=\"ui-chart-tooltip-dot${row.dashed ? ' ui-chart-tooltip-dot--dashed' : ''}\"\n style=\"--ui-chart-tooltip-colour: ${escapeHtml(row.colour)}\"\n ></span>\n <span class=\"ui-chart-tooltip-name\">${escapeHtml(row.name)}</span>\n ${row.value === undefined ? '' : `<span class=\"ui-chart-tooltip-value\">${escapeHtml(row.value)}</span>`}\n </div>\n `).join('');\n\n return `\n <div class=\"ui-chart-tooltip\">\n ${title ? `<div class=\"ui-chart-tooltip-title ui-text-caption\">${escapeHtml(title)}</div>` : ''}\n ${items}\n ${total ? `\n <div class=\"ui-chart-tooltip-row ui-chart-tooltip-total ui-text-body-alt\">\n <span class=\"ui-chart-tooltip-name\">${escapeHtml(total.name)}</span>\n <span class=\"ui-chart-tooltip-value\">${escapeHtml(total.value)}</span>\n </div>\n ` : ''}\n ${footer ? `<div class=\"ui-chart-tooltip-footer ui-text-caption\">${escapeHtml(footer)}</div>` : ''}\n </div>\n `;\n}\n\n// tooltip HTML is built from data, so anything that came from outside gets escaped\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction deepMerge(base: unknown, overrides: unknown): unknown {\n if (!isPlainObject(base) || !isPlainObject(overrides)) {\n return overrides === undefined ? base : overrides;\n }\n\n const merged: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(overrides)) {\n merged[key] = deepMerge(base[key], value);\n }\n\n return merged;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n numberAttribute\n} from '@angular/core';\n\nimport type { SkeletonShape } from './skeleton.types';\n\n\n/**\n * A placeholder shown while content loads. Size it with classes on the\n * element, e.g. `class=\"w-48\"` for text or `class=\"size-12\"` for a circle.\n */\n@Component({\n selector: 'ui-skeleton',\n templateUrl: './skeleton.component.html',\n styleUrl: './skeleton.component.css',\n host: {\n // purely visual, the loading region should set aria-busy instead\n 'aria-hidden': 'true',\n '[class]': 'generatedClasses()'\n }\n})\nexport class UiSkeletonComponent {\n readonly shape = input<SkeletonShape>('text');\n readonly animated = input(true, { transform: booleanAttribute });\n\n /** Text only, stacks this many lines with a shorter last one. */\n readonly lines = input(1, { transform: numberAttribute });\n\n protected readonly lineIndexes = computed(() =>\n Array.from(\n { length: Math.max(1, Math.floor(this.lines())) },\n (_, index) => index\n )\n );\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-skeleton',\n `ui-skeleton--${this.shape()}`,\n this.animated() ? 'ui-skeleton--animated' : ''\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","@if (shape() === 'text') {\n @for (index of lineIndexes(); track index) {\n <span class=\"ui-skeleton-line\"></span>\n }\n} @else {\n <span class=\"ui-skeleton-block\"></span>\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n model,\n output,\n signal,\n untracked\n} from '@angular/core';\n\nimport type { ChartLegendItem, ChartLegendSource } from './chart-legend.types';\n\n\n/**\n * A row of colour keys naming what each colour means. Link it to a chart\n * with `for`, or pass `items` to use it next to anything coloured by series.\n */\n@Component({\n selector: 'ui-chart-legend',\n templateUrl: './chart-legend.component.html',\n styleUrl: './chart-legend.component.css'\n})\nexport class UiChartLegendComponent {\n readonly items = input<ChartLegendItem[]>([]);\n\n /** Small text after the items, e.g. how many series aren't listed. */\n readonly note = input<string>('');\n\n /** A chart to take items from and hide or fade series on, set its `legend` to `none`. */\n readonly for = input<ChartLegendSource | null>(null);\n\n /** Adjusts the linked chart's items, e.g. to relabel them. Keep each `name`. */\n readonly itemsWith = input<((items: ChartLegendItem[]) => ChartLegendItem[]) | null>(null);\n\n /** Names of items switched off, bound two-way when `toggleable`. */\n readonly hidden = model<string[]>([]);\n\n /** Lets each item be clicked to hide or show its series. */\n readonly toggleable = input(false, { transform: booleanAttribute });\n\n /** The item being hovered or focused, null when it leaves. Charts fade the other series. */\n readonly focusChange = output<string | null>();\n\n private readonly hovered = signal<string | null>(null);\n private readonly focused = signal<string | null>(null);\n\n // the pointer wins while it's over an item, keyboard focus is the fallback\n private readonly pointedAt = computed(() => this.hovered() ?? this.focused());\n\n // a linked chart wins over the plain inputs\n protected readonly shownItems = computed(() => {\n const source = this.for();\n\n if (!source) {\n return this.items();\n }\n\n const adjust = this.itemsWith();\n\n return adjust ? adjust(source.legendItems()) : source.legendItems();\n });\n protected readonly shownNote = computed(() => this.for()?.legendNote() ?? this.note());\n private readonly hiddenNames = computed(() => this.for()?.hiddenSeries() ?? this.hidden());\n\n protected readonly visibleCount = computed(() =>\n this.shownItems().filter(item => !this.hiddenNames().includes(item.name)).length\n );\n\n constructor() {\n effect(() => {\n const name = this.pointedAt();\n\n untracked(() => {\n this.for()?.emphasis.set(name);\n this.focusChange.emit(name);\n });\n });\n }\n\n protected hover(name: string | null): void {\n this.hovered.set(name);\n }\n\n protected focus(name: string | null): void {\n this.focused.set(name);\n }\n\n protected isHidden(item: ChartLegendItem): boolean {\n return this.hiddenNames().includes(item.name);\n }\n\n // the last one showing stays on, an empty chart helps nobody\n protected isLocked(item: ChartLegendItem): boolean {\n return !this.isHidden(item) && this.visibleCount() === 1;\n }\n\n protected toggle(item: ChartLegendItem): void {\n if (this.isLocked(item)) {\n return;\n }\n\n const hidden = this.hiddenNames();\n const next = hidden.includes(item.name)\n ? hidden.filter(name => name !== item.name)\n : [...hidden, item.name];\n\n const source = this.for();\n\n if (source) {\n source.hiddenSeries.set(next);\n } else {\n this.hidden.set(next);\n }\n }\n}\n","<ul class=\"ui-chart-legend\" role=\"list\">\n @for (item of shownItems(); track item.name) {\n <li\n (mouseenter)=\"hover(item.name)\"\n (mouseleave)=\"hover(null)\"\n (focusin)=\"focus(item.name)\"\n (focusout)=\"focus(null)\"\n >\n @if (toggleable()) {\n <button\n type=\"button\"\n class=\"ui-chart-legend-item ui-chart-legend-item--button ui-text-body-alt\"\n [attr.aria-pressed]=\"!isHidden(item)\"\n [attr.aria-disabled]=\"isLocked(item) || null\"\n [attr.data-hidden]=\"isHidden(item) ? '' : null\"\n (click)=\"toggle(item)\"\n >\n <span\n class=\"ui-chart-legend-key\"\n [class.ui-chart-legend-key--dashed]=\"item.dashed\"\n [style.--ui-chart-legend-colour]=\"item.colour\"\n ></span>\n {{ item.label ?? item.name }}\n </button>\n } @else {\n <span class=\"ui-chart-legend-item ui-text-body-alt\">\n <span\n class=\"ui-chart-legend-key\"\n [class.ui-chart-legend-key--dashed]=\"item.dashed\"\n [style.--ui-chart-legend-colour]=\"item.colour\"\n ></span>\n {{ item.label ?? item.name }}\n </span>\n }\n </li>\n }\n</ul>\n\n@if (shownNote()) {\n <span class=\"text-muted-foreground-1 ui-text-caption\">{{ shownNote() }}</span>\n}\n","import {\n afterNextRender,\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\n\nimport type ApexCharts from 'apexcharts';\n\nimport type { ChartOptions } from './chart.types';\n\n\n// missing from apex's types\ntype ApexChartsEvents = ApexCharts & {\n addEventListener(name: 'updated', handler: () => void): void;\n};\n\n\n/**\n * Draws raw ApexCharts options. The typed charts (bar, line and so on) are\n * built on this, reach for it directly only when they can't do what you need.\n */\n@Component({\n selector: 'ui-chart',\n template: `\n <div\n #canvas\n class=\"ui-chart-canvas\"\n role=\"img\"\n [attr.aria-label]=\"ariaLabel()\"\n ></div>\n `,\n styleUrl: './chart.component.css',\n // ApexCharts builds its own DOM, scoped styles would never reach the tooltip\n encapsulation: ViewEncapsulation.None,\n host: { class: 'ui-chart' }\n})\nexport class UiChartComponent {\n readonly options = input.required<ChartOptions>();\n\n /** What the chart shows, e.g. \"Spending by month\". Screen readers get this instead of the SVG. */\n readonly ariaLabel = input.required<string>();\n\n /** Series names to keep off the plot, e.g. switched off in the legend. */\n readonly hiddenSeries = input<string[]>([]);\n\n /** Fades every other series so this one stands out, e.g. while its legend item is hovered. */\n readonly emphasis = input<string | null>(null);\n\n private readonly canvas = viewChild.required<ElementRef<HTMLElement>>(\n 'canvas'\n );\n private readonly chart = signal<ApexCharts | null>(null);\n\n private destroyed = false;\n\n private drawnNames: (string | null)[] = [];\n\n constructor() {\n // loaded on first use so pages without charts don't pay for the library\n afterNextRender(async () => {\n const { default: Apex } = await import('apexcharts');\n\n if (this.destroyed) {\n return;\n }\n\n const chart = new Apex(\n this.canvas().nativeElement,\n untracked(this.options)\n );\n\n (chart as ApexChartsEvents).addEventListener('updated', () => {\n this.applyHidden(chart);\n this.applyEmphasis();\n });\n\n this.drawnNames = this.seriesNames();\n await chart.render();\n this.chart.set(chart);\n this.applyHidden(chart);\n this.applyEmphasis();\n });\n\n // later option changes update in place, so bars animate to their new size\n effect(() => {\n const options = this.options();\n const chart = this.chart();\n\n if (!chart) {\n return;\n }\n\n // apex animates a reorder by morphing lines into each other\n const names = this.seriesNames();\n const reordered = names.length === this.drawnNames.length &&\n names.some((name, index) => name !== this.drawnNames[index]) &&\n names.every(name => this.drawnNames.includes(name));\n\n this.drawnNames = names;\n chart.updateOptions(options, false, !reordered);\n });\n\n effect(() => {\n this.emphasis();\n\n if (this.chart()) {\n this.applyEmphasis();\n }\n });\n\n effect(() => {\n const chart = this.chart();\n\n if (chart) {\n this.applyHidden(chart);\n this.applyEmphasis();\n }\n });\n\n inject(DestroyRef).onDestroy(() => {\n this.destroyed = true;\n this.chart()?.destroy();\n });\n }\n\n private applyHidden(chart: ApexCharts): void {\n const hidden = this.hiddenSeries();\n\n // apex throws toggling a series it hasn't drawn, e.g. at zero width\n if (!this.canvas().nativeElement.querySelector('.apexcharts-inner .apexcharts-series')) {\n return;\n }\n\n for (const name of this.seriesNames()) {\n if (!name) {\n continue;\n }\n\n if (hidden.includes(name)) {\n chart.hideSeries(name);\n } else {\n chart.showSeries(name);\n }\n }\n }\n\n // done with a class rather than apex's own highlight, which has no clean way to undo\n private applyEmphasis(): void {\n const names = this.seriesNames();\n\n // a hidden series isn't drawn, fading everything towards it would leave nothing to see\n const emphasis = untracked(this.emphasis);\n const active =\n emphasis &&\n names.includes(emphasis) &&\n !untracked(this.hiddenSeries).includes(emphasis)\n ? emphasis\n : null;\n const groups = this.canvas().nativeElement.querySelectorAll<\n SVGGElement\n >('.apexcharts-series[data\\\\:realIndex]');\n\n for (const group of groups) {\n const name = names[Number(group.getAttribute('data:realIndex'))];\n\n group.classList.toggle(\n 'ui-chart-series--faded',\n !!active && name !== active\n );\n }\n }\n\n // pies pass plain numbers as series, their names live in labels\n private seriesNames(): (string | null)[] {\n const { series = [], labels = [] } = untracked(this.options);\n\n return series.map((item, index) =>\n typeof item === 'object' && item !== null && 'name' in item\n ? item.name ?? null\n : labels[index] ?? null\n );\n }\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\n\nimport type { ChartSeries, ChartValueFormatter } from './chart.types';\n\n\n/**\n * The numbers behind a chart as a table. Hidden visually by default so screen\n * readers still get the data, `visible` shows it for everyone.\n */\n@Component({\n selector: 'ui-chart-table',\n template: `\n <!-- sr-only on a wrapper, the table's own width would otherwise override it -->\n <div [class.sr-only]=\"!visible()\">\n <table class=\"ui-chart-table\">\n <caption class=\"sr-only\">{{ caption() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\" class=\"ui-text-caption\">{{ categoryLabel() }}</th>\n @for (item of series(); track item.name) {\n <th scope=\"col\" class=\"ui-text-caption\">{{ item.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (category of categories(); track $index; let row = $index) {\n <tr>\n <th scope=\"row\" class=\"ui-text-body-alt\">{{ category }}</th>\n @for (item of series(); track item.name) {\n <td class=\"ui-text-body-alt\">\n @if (masked() && isValue(item.data[row])) {\n <span aria-hidden=\"true\">{{ format(item.data[row]) }}</span>\n <span class=\"sr-only\">amount hidden</span>\n } @else {{{ format(item.data[row]) }}}\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n `,\n styleUrl: './chart-table.component.css'\n})\nexport class UiChartTableComponent {\n readonly caption = input.required<string>();\n readonly categories = input.required<string[]>();\n readonly series = input.required<ChartSeries[]>();\n readonly valueFormatter = input.required<ChartValueFormatter>();\n readonly categoryLabel = input<string>('Category');\n readonly visible = input(false, { transform: booleanAttribute });\n\n /** Values are masks, screen readers hear \"amount hidden\" instead. */\n readonly masked = input(false, { transform: booleanAttribute });\n\n protected isValue(value: number | null | undefined): value is number {\n return value !== null && value !== undefined;\n }\n\n protected format(value: number | null | undefined): string {\n return this.isValue(value) ? this.valueFormatter()(value) : '-';\n }\n}\n","import { booleanAttribute, Component, computed, input, model } from '@angular/core';\n\nimport { UiSkeletonComponent } from '../../generic/skeleton/skeleton.component';\nimport { UiChartLegendComponent } from '../chart-legend/chart-legend.component';\nimport type { ChartLegendItem } from '../chart-legend/chart-legend.types';\nimport { UiChartComponent } from './chart.component';\nimport type { ChartHeight, ChartOptions, ChartSeries, ChartValueFormatter } from './chart.types';\nimport { UiChartTableComponent } from './chart-table.component';\n\n\n/** The loading, empty and data table states around a chart, shared by every chart type. */\n@Component({\n selector: 'ui-chart-frame',\n template: `\n @if (loading()) {\n <div [style.height.px]=\"fixedHeight()\" [class.grow]=\"fill()\" aria-busy=\"true\">\n <span class=\"sr-only\">Loading chart</span>\n <ui-skeleton shape=\"rect\" class=\"size-full\" />\n </div>\n } @else if (empty()) {\n <div\n class=\"flex justify-center items-center border border-line-2 border-dashed rounded-lg text-muted-foreground-1 ui-text-body-alt\"\n [class.grow]=\"fill()\"\n [style.height.px]=\"fixedHeight()\"\n >\n {{ emptyText() }}\n </div>\n } @else {\n <!-- one series needs no legend, the chart's title already names it -->\n @if (showLegend() && (legendItems().length > 1 || legendNote())) {\n <ui-chart-legend\n class=\"mb-3 shrink-0\"\n [items]=\"legendItems()\"\n [note]=\"legendNote()\"\n [(hidden)]=\"hiddenSeries\"\n (focusChange)=\"emphasis.set($event)\"\n toggleable\n />\n }\n\n <ui-chart\n [class.grow]=\"fill()\"\n [class.min-h-0]=\"fill()\"\n [options]=\"options()\"\n [ariaLabel]=\"ariaLabel()\"\n [hiddenSeries]=\"hiddenSeries()\"\n [emphasis]=\"emphasis()\"\n />\n\n <ui-chart-table\n [caption]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [valueFormatter]=\"valueFormatter()\"\n [masked]=\"masked()\"\n [categoryLabel]=\"categoryLabel()\"\n [visible]=\"showTable()\"\n />\n }\n `,\n imports: [\n UiChartComponent,\n UiChartTableComponent,\n UiChartLegendComponent,\n UiSkeletonComponent\n ],\n host: {\n class: 'relative w-full min-w-0',\n '[class.block]': '!fill()',\n '[class.flex]': 'fill()',\n '[class.flex-col]': 'fill()',\n '[class.h-full]': 'fill()'\n }\n})\nexport class UiChartFrameComponent {\n readonly options = input.required<ChartOptions>();\n readonly ariaLabel = input.required<string>();\n readonly categories = input.required<string[]>();\n readonly series = input.required<ChartSeries[]>();\n readonly legendItems = input.required<ChartLegendItem[]>();\n readonly legendNote = input<string>('');\n readonly hiddenSeries = model<string[]>([]);\n readonly valueFormatter = input.required<ChartValueFormatter>();\n readonly categoryLabel = input.required<string>();\n readonly height = input.required<ChartHeight>();\n readonly emptyText = input.required<string>();\n\n readonly loading = input(false, { transform: booleanAttribute });\n readonly empty = input(false, { transform: booleanAttribute });\n readonly showTable = input(false, { transform: booleanAttribute });\n readonly masked = input(false, { transform: booleanAttribute });\n readonly showLegend = input(true, { transform: booleanAttribute });\n\n /** The series the legend is pointing at, the others fade while it's set. */\n readonly emphasis = model<string | null>(null);\n\n protected readonly fill = computed(() => this.height() === 'fill');\n protected readonly fixedHeight = computed(() => {\n const height = this.height();\n\n return height === 'fill' ? null : height;\n });\n}\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n chartAxisLabels,\n chartTooltipHtml,\n mergeChartOptions\n} from '../chart/chart.options';\nimport type { ChartInk } from '../chart/chart.palette';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { BarChartOrientation } from './bar-chart.types';\n\n\n// thin bars read better than slabs, whatever width is left over becomes air\nconst MAX_BAR_THICKNESS = 24;\n\nconst FADED_STRENGTH = 0.3;\n\n// apex can't parse color-mix(), so faded colours are blended here\nfunction fade(colour: string, ink: ChartInk): string {\n const hex = /^#([0-9a-f]{6})$/i;\n const from = hex.exec(colour)?.[1];\n const to = hex.exec(ink.surface)?.[1];\n\n if (!from || !to) {\n return ink.context;\n }\n\n const channel = (value: string, at: number) => parseInt(value.slice(at, at + 2), 16);\n const mixed = [0, 2, 4].map(at =>\n Math.round(channel(from, at) * FADED_STRENGTH + channel(to, at) * (1 - FADED_STRENGTH))\n );\n\n return `rgb(${mixed.join(', ')})`;\n}\n\n/**\n * Bars or columns for comparing amounts across categories. Several series\n * sit side by side, or on top of each other with `stacked`.\n */\n@Component({\n selector: 'ui-bar-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiBarChartComponent extends UiAxisChartBase {\n readonly orientation = input<BarChartOrientation>('vertical');\n readonly stacked = input(false, { transform: booleanAttribute });\n\n /** Picks out one category, e.g. the month a page is showing, and fades the rest. */\n readonly highlightCategory = input<string | null>(null);\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const ink = this.ink();\n const base = baseChartOptions(ink);\n const labels = chartAxisLabels(ink);\n const horizontal = this.orientation() === 'horizontal';\n const format = this.displayFormatter();\n const masked = this.masked();\n const series = this.series();\n const categories = this.categories();\n const colours = this.colours();\n const picked = categories.indexOf(this.highlightCategory() ?? '');\n\n // apex applies a px width to each bar, grouped or not\n const thickness = `${MAX_BAR_THICKNESS}px`;\n const valueLabels = masked\n ? { show: false }\n : { ...labels, formatter: (value: string | number) => format(Number(value)) };\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: 'bar',\n height: this.apexHeight(),\n stacked: this.stacked()\n },\n colors: picked < 0\n ? colours\n : colours.map(colour => ({ dataPointIndex }: { dataPointIndex: number }) =>\n dataPointIndex === picked\n ? colour\n : fade(colour, ink)\n ),\n series: series.map(item => ({\n name: item.name,\n data: this.concealed() ? item.data.map(() => null) : item.data\n })),\n plotOptions: {\n bar: {\n horizontal,\n // apex 4 ignores borderRadiusWhenStacked and rounds every segment, square reads cleaner\n borderRadius: this.stacked() ? 0 : 4,\n borderRadiusApplication: 'end',\n columnWidth: thickness,\n barHeight: thickness\n }\n },\n // a surface coloured gap between touching bars and stack segments\n stroke: { show: true, width: 2, colors: [ink.surface] },\n // horizontal bars swap the axes, values run along the bottom\n xaxis: {\n ...base.xaxis,\n categories,\n labels: horizontal ? valueLabels : labels\n },\n yaxis: { ...base.yaxis, labels: horizontal ? labels : valueLabels },\n grid: {\n ...base.grid,\n // gridlines run across the value axis only\n xaxis: { lines: { show: horizontal } },\n yaxis: { lines: { show: !horizontal } }\n },\n tooltip: this.concealed()\n ? { enabled: false }\n : this.stacked()\n ? {\n shared: true,\n intersect: false,\n custom: ({ dataPointIndex }: { dataPointIndex: number }) => {\n const rows = series\n .map((item, index) => ({\n colour: colours[index],\n name: item.name,\n raw: item.data[dataPointIndex] ?? null\n }))\n .filter(row => !this.hiddenSeries().includes(row.name));\n const values = rows.map(row => row.raw).filter(value => value !== null);\n\n return chartTooltipHtml(\n categories[dataPointIndex] ?? '',\n rows.map(row => ({ ...row, value: masked ? undefined : this.formatValue(row.raw) })),\n '',\n masked ? undefined : {\n name: 'Total',\n value: this.formatValue(values.length ? values.reduce((sum, value) => sum + value, 0) : null)\n }\n );\n }\n }\n : {\n shared: false,\n intersect: true,\n custom: ({ seriesIndex, dataPointIndex }: { seriesIndex: number; dataPointIndex: number }) =>\n chartTooltipHtml(categories[dataPointIndex] ?? '', [{\n colour: colours[seriesIndex],\n name: series[seriesIndex]?.name ?? '',\n value: masked ? undefined : this.formatValue(series[seriesIndex]?.data[dataPointIndex])\n }])\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"displayFormatter()\"\n [masked]=\"masked()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** vertical draws columns rising from the bottom, horizontal draws bars from the left. */\nexport const BarChartOrientations = ['vertical', 'horizontal'] as const;\n\n/** @see {@link BarChartOrientations} */\nexport type BarChartOrientation = typeof BarChartOrientations[number];\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n chartAxisLabels,\n chartTooltipHtml,\n mergeChartOptions\n} from '../chart/chart.options';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { LineChartCurve } from './line-chart.types';\n\n\n// past this many categories only some get a label, or they crowd into each other\nconst MAX_AXIS_LABELS = 8;\n\n// grey context rows past this are summed up, the table has the rest\nconst MAX_CONTEXT_ROWS = 5;\n\n// with more lines than this the tooltip lists them biggest first, the same order they sit in\nconst SORT_ROWS_AFTER = 8;\n\n/**\n * Lines for showing how values change over something ordered, usually time.\n * Hovering anywhere shows every series at that point.\n */\n@Component({\n selector: 'ui-line-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiLineChartComponent extends UiAxisChartBase {\n protected override readonly supportsDashes = true;\n\n readonly curve = input<LineChartCurve>('straight');\n\n /** Draws a dot on every point, not just the hovered one. Handy with few points. */\n readonly showPoints = input(false, { transform: booleanAttribute });\n\n /** Shades this category and everything after it as a forecast. */\n readonly projectedFrom = input<string | null>(null);\n\n readonly projectedLabel = input<string>('Projected');\n\n private readonly projectedAnnotations = computed<ChartOptions['annotations']>(() => {\n const from = this.projectedFrom();\n const categories = this.categories();\n const ink = this.ink();\n\n // apex crashes redrawing without annotations\n if (!from || !categories.includes(from)) {\n return { xaxis: [] };\n }\n\n return {\n xaxis: [{\n x: from,\n x2: categories[categories.length - 1],\n fillColor: ink.muted,\n opacity: 0.08,\n borderColor: 'transparent',\n label: {\n text: this.projectedLabel(),\n position: 'top',\n orientation: 'horizontal',\n textAnchor: 'start',\n borderWidth: 0,\n offsetX: 8,\n offsetY: 16,\n style: {\n background: 'transparent',\n color: ink.muted,\n fontSize: '12px'\n }\n }\n }]\n };\n });\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const ink = this.ink();\n const base = baseChartOptions(ink);\n const labels = chartAxisLabels(ink);\n const series = this.series();\n const categories = this.categories();\n const colours = this.colours();\n const dashed = this.dashed();\n const muted = this.isMuted();\n const masked = this.masked();\n\n // grey context lines go first so the highlighted ones are drawn on top\n const order = series.map((_, index) => index).sort((a, b) => Number(muted[b]) - Number(muted[a]));\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: 'line',\n height: this.apexHeight()\n },\n annotations: this.projectedAnnotations(),\n colors: order.map(index => colours[index]),\n series: order.map(index => ({\n name: series[index].name,\n data: this.concealed() ? series[index].data.map(() => null) : series[index].data\n })),\n stroke: {\n curve: this.curve(),\n width: order.map(index => muted[index] ? 1.5 : 2),\n dashArray: order.map(index => dashed[index] ? 6 : 0),\n lineCap: 'round'\n },\n // the surface ring keeps a dot readable where it sits on another line\n markers: {\n size: this.showPoints() ? 4 : 0,\n strokeColors: ink.surface,\n strokeWidth: 2,\n hover: { size: 5 }\n },\n xaxis: {\n ...base.xaxis,\n categories,\n tickAmount: categories.length > MAX_AXIS_LABELS ? MAX_AXIS_LABELS : undefined,\n labels: { ...labels, hideOverlappingLabels: true, rotate: 0 },\n crosshairs: {\n show: true,\n width: 1,\n stroke: { color: ink.grid, width: 1, dashArray: 0 }\n },\n // the tooltip already names the category\n tooltip: { enabled: false }\n },\n yaxis: {\n ...base.yaxis,\n labels: masked ? { show: false } : { ...labels, formatter: this.displayFormatter() }\n },\n grid: {\n ...base.grid,\n xaxis: { lines: { show: false } },\n yaxis: { lines: { show: true } }\n },\n tooltip: this.concealed() ? { enabled: false } : {\n shared: true,\n intersect: false,\n // read at hover time, so hiding a series doesn't rebuild the chart\n custom: ({ dataPointIndex }: { dataPointIndex: number }) => {\n const rows = series\n .map((item, index) => ({\n colour: colours[index],\n dashed: dashed[index],\n name: item.name,\n raw: item.data[dataPointIndex] ?? null,\n muted: muted[index]\n }))\n .filter(row => !this.hiddenSeries().includes(row.name))\n .sort((a, b) => this.tooltipOrder(a, b))\n .map(row => ({ ...row, value: masked ? undefined : this.formatValue(row.raw) }));\n\n const shown = rows.filter(row => !row.muted).length + MAX_CONTEXT_ROWS;\n const extra = rows.length - shown;\n\n return chartTooltipHtml(\n categories[dataPointIndex] ?? '',\n rows.slice(0, shown),\n extra > 0 ? `${extra} more` : ''\n );\n }\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n\n // highlighted rows first in highlight order, then the grey ones biggest first\n private tooltipOrder(\n a: { name: string; raw: number | null; muted: boolean },\n b: { name: string; raw: number | null; muted: boolean }\n ): number {\n if (a.muted !== b.muted) {\n return Number(a.muted) - Number(b.muted);\n }\n\n const highlight = this.highlight();\n\n if (!a.muted && highlight) {\n return highlight.indexOf(a.name) - highlight.indexOf(b.name);\n }\n\n // a handful keep the legend order, lots are easier to scan biggest first\n if (!a.muted && this.series().length <= SORT_ROWS_AFTER) {\n return 0;\n }\n\n return (b.raw ?? -Infinity) - (a.raw ?? -Infinity);\n }\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"displayFormatter()\"\n [masked]=\"masked()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** How points are joined, straight segments, a smooth curve, or steps. */\nexport const LineChartCurves = ['straight', 'smooth', 'stepline'] as const;\n\n/** @see {@link LineChartCurves} */\nexport type LineChartCurve = typeof LineChartCurves[number];\n","import { Component, computed, input } from '@angular/core';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n chartTooltipHtml,\n mergeChartOptions\n} from '../chart/chart.options';\nimport {\n type ChartSeriesStyle,\n chartSeriesStyle\n} from '../chart/chart.palette';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { PieChartVariant } from './pie-chart.types';\n\n\n/**\n * Slices for showing how a whole splits into parts. Each category is a\n * slice, only the first series is drawn. Best kept to a handful of slices,\n * fold the small ones into \"Other\".\n */\n@Component({\n selector: 'ui-pie-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiPieChartComponent extends UiAxisChartBase {\n readonly variant = input<PieChartVariant>('pie');\n\n private readonly percentFormatter = new Intl.NumberFormat(this.uiFormat.locale, {\n style: 'percent',\n maximumFractionDigits: 1\n });\n\n /** Shown above the total in the middle of a donut. */\n readonly totalLabel = input<string>('Total');\n\n protected readonly values = computed(() => this.series()[0]?.data ?? []);\n\n // slices are categories here, so highlight and colours work per category not per series\n protected override readonly isEmpty = computed(() =>\n !this.values().some(value => value !== null && value > 0)\n );\n\n protected override readonly isMuted = computed(() => {\n const highlight = this.highlight();\n\n return this.categories().map(name =>\n !!highlight && !highlight.includes(name)\n );\n });\n\n protected override readonly styles = computed<ChartSeriesStyle[]>(() => {\n const highlight = this.highlight();\n const muted = this.isMuted();\n\n return this.categories().map((name, index) =>\n muted[index]\n ? { colour: this.ink().context, dashed: false }\n : chartSeriesStyle(\n highlight ? highlight.indexOf(name) : index,\n false,\n this.dark()\n )\n );\n });\n\n override readonly legendItems = computed(() => {\n const highlight = this.highlight();\n const items = this.categories()\n .map((name, index) => ({ name, ...this.styles()[index] }))\n .filter((_, index) => !this.isMuted()[index]);\n\n return highlight\n ? items.sort((a, b) =>\n highlight.indexOf(a.name) - highlight.indexOf(b.name)\n )\n : items;\n });\n\n // apex can't hide a pie slice, so hidden ones are left out of the options instead\n private readonly slices = computed(() => {\n const hidden = this.hiddenSeries();\n const values = this.values();\n const colours = this.colours();\n\n return this.categories()\n .map((name, index) => ({\n name,\n value: values[index] ?? 0,\n colour: colours[index]\n }))\n .filter(slice => !hidden.includes(slice.name));\n });\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const ink = this.ink();\n const base = baseChartOptions(ink);\n const slices = this.slices();\n const donut = this.variant() === 'donut';\n const total = slices.reduce((sum, slice) => sum + slice.value, 0);\n const concealed = this.concealed();\n const drawn = concealed ? [{ name: '', value: 1, colour: ink.grid }] : slices;\n const centreText = {\n fontSize: '12px',\n color: ink.muted,\n offsetY: -4\n };\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: donut ? 'donut' : 'pie',\n height: this.apexHeight()\n },\n colors: drawn.map(slice => slice.colour),\n labels: drawn.map(slice => slice.name),\n series: drawn.map(slice => slice.value),\n // a surface coloured gap between slices\n stroke: { show: true, width: 2, colors: [ink.surface] },\n // lightening a grey slice turns it white, it looks like it's gone\n states: {\n ...base.states,\n hover: { filter: { type: concealed ? 'none' : 'darken' } }\n },\n plotOptions: {\n pie: {\n // clicking would pop a slice out, the legend does the toggling\n expandOnClick: false,\n donut: {\n size: '65%',\n labels: {\n show: donut,\n name: centreText,\n value: {\n fontSize: '20px',\n fontWeight: 600,\n color: ink.text,\n offsetY: 4,\n formatter: (value: string) =>\n this.formatValue(Number(value))\n },\n total: {\n show: true,\n showAlways: true,\n label: this.totalLabel(),\n ...centreText,\n formatter: () => this.formatValue(total)\n }\n }\n }\n }\n },\n tooltip: concealed ? { enabled: false } : {\n // apex makes pie tooltips dark and slice coloured, ours match the other charts\n theme: 'light',\n fillSeriesColor: false,\n custom: ({ seriesIndex }: { seriesIndex: number; }) => {\n const slice = slices[seriesIndex];\n\n return slice\n ? chartTooltipHtml(\n '',\n [{\n colour: slice.colour,\n name: slice.name,\n value: this.masked() ? undefined : this.formatValue(slice.value)\n }],\n total\n ? `${\n this.percentFormatter.format(slice.value / total)\n } of total`\n : ''\n )\n : '';\n }\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"displayFormatter()\"\n [masked]=\"masked()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** pie fills the whole circle, donut leaves a hole with the total in it. */\nexport const PieChartVariants = ['pie', 'donut'] as const;\n\n/** @see {@link PieChartVariants} */\nexport type PieChartVariant = typeof PieChartVariants[number];\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model\n} from '@angular/core';\n\nimport { InputValidation } from '../input/input.types';\n\n\n@Component({\n selector: 'ui-checkbox',\n templateUrl: './checkbox.component.html',\n styleUrl: './checkbox.component.css',\n // keep id/name off the host, same fix as ui-radio\n host: { '[attr.id]': 'null', '[attr.name]': 'null' }\n})\nexport class UiCheckboxComponent {\n readonly value = model.required<boolean>();\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n\n // shows a dash instead of a tick, purely visual, doesn't change value\n readonly indeterminate = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n // lets presets like ui-switch restyle the native input\n readonly classes = input<string>('');\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-checkbox',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n toggle(): void {\n this.value.set(!this.value());\n }\n}\n","<input\n type=\"checkbox\"\n [class]=\"generatedClasses()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [required]=\"required()\"\n [checked]=\"value()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (change)=\"toggle()\"\n/>\n","import type { FileRejection, FileSelection } from './file.types';\n\n\nconst SIZE_UNITS = ['B', 'KB', 'MB', 'GB'];\n\n/**\n * Checks a file against a native `accept` string, e.g. \".csv,image/*\".\n * Dropped files skip the browser's own accept check, so we do it ourselves.\n */\nexport function matchesAccept(file: File, accept: string): boolean {\n const tokens = accept\n .split(',')\n .map(token => token.trim().toLowerCase())\n .filter(Boolean);\n\n if (!tokens.length) {\n return true;\n }\n\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n\n return tokens.some(token => {\n if (token.startsWith('.')) {\n return name.endsWith(token);\n }\n\n if (token.endsWith('/*')) {\n return type.startsWith(token.slice(0, -1));\n }\n\n return type === token;\n });\n}\n\n/** Splits files into ones that pass the accept and size rules and ones that don't. */\nexport function selectFiles(\n files: File[],\n accept: string,\n maxSize: number | null\n): FileSelection {\n const accepted: File[] = [];\n const rejected: FileRejection[] = [];\n\n for (const file of files) {\n if (!matchesAccept(file, accept)) {\n rejected.push({ file, reason: 'type' });\n } else if (maxSize !== null && file.size > maxSize) {\n rejected.push({ file, reason: 'size' });\n } else {\n accepted.push(file);\n }\n }\n\n return { accepted, rejected };\n}\n\n/** Human readable size, e.g. 1536 -> \"1.5 KB\". */\nexport function formatFileSize(bytes: number): string {\n let size = bytes;\n let unit = 0;\n\n while (size >= 1024 && unit < SIZE_UNITS.length - 1) {\n size /= 1024;\n unit++;\n }\n\n const rounded = unit === 0 ? size : Math.round(size * 10) / 10;\n\n return `${rounded} ${SIZE_UNITS[unit]}`;\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n output,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { IconName, NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroArrowUpTray, heroDocument } from '@ng-icons/heroicons/outline';\n\nimport type { FileRejection } from '../file/file.types';\nimport { formatFileSize, selectFiles } from '../file/file.utils';\n\n\n@Component({\n selector: 'ui-dropzone',\n templateUrl: './dropzone.component.html',\n styleUrl: './dropzone.component.css',\n imports: [NgIcon],\n providers: [provideIcons({\n heroArrowUpTray,\n heroDocument\n })]\n})\nexport class UiDropzoneComponent {\n readonly value = model<File[]>([]);\n\n readonly id = input<string>('');\n readonly accept = input<string>('');\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string>('');\n readonly describedBy = input<string>('');\n\n /** Max size per file in bytes. */\n readonly maxSize = input<number | null>(null);\n\n readonly title = input<string>('');\n readonly hint = input<string>('');\n readonly icon = input<IconName>('heroArrowUpTray');\n\n readonly rejected = output<FileRejection[]>();\n\n private readonly picker = viewChild.required<ElementRef<HTMLInputElement>>(\n 'picker'\n );\n\n // dragenter/leave fire for every child, so count them instead of toggling\n private dragDepth = 0;\n\n protected readonly isDragging = signal(false);\n protected readonly hasRejection = signal(false);\n\n protected readonly displayTitle = computed(() =>\n this.title() ||\n (this.multiple()\n ? 'Drop files here or click to browse'\n : 'Drop a file here or click to browse')\n );\n\n protected readonly files = computed(() =>\n this.value().map(file => ({\n name: file.name,\n size: formatFileSize(file.size)\n }))\n );\n\n protected openPicker(): void {\n if (this.disabled()) {\n return;\n }\n\n const picker = this.picker().nativeElement;\n\n if (picker.showPicker) {\n picker.showPicker();\n } else {\n picker.click();\n }\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.openPicker();\n }\n }\n\n protected handlePick(event: Event): void {\n const target = event.target as HTMLInputElement;\n\n this.addFiles([...target.files ?? []]);\n\n // reset so picking the same file again still fires change\n target.value = '';\n }\n\n protected handleDragEnter(event: DragEvent): void {\n event.preventDefault();\n\n if (this.disabled()) {\n return;\n }\n\n this.dragDepth++;\n this.isDragging.set(true);\n }\n\n protected handleDragOver(event: DragEvent): void {\n // without this the browser won't allow the drop\n event.preventDefault();\n\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = this.disabled() ? 'none' : 'copy';\n }\n }\n\n protected handleDragLeave(): void {\n this.dragDepth = Math.max(0, this.dragDepth - 1);\n\n if (!this.dragDepth) {\n this.isDragging.set(false);\n }\n }\n\n protected handleDrop(event: DragEvent): void {\n event.preventDefault();\n\n this.dragDepth = 0;\n this.isDragging.set(false);\n\n if (!this.disabled()) {\n this.addFiles([...event.dataTransfer?.files ?? []]);\n }\n }\n\n protected clear(): void {\n this.value.set([]);\n this.hasRejection.set(false);\n }\n\n private addFiles(files: File[]): void {\n if (!files.length) {\n return;\n }\n\n // the native picker enforces this, but a drop can carry several files\n const candidates = this.multiple() ? files : files.slice(0, 1);\n const { accepted, rejected } = selectFiles(\n candidates,\n this.accept(),\n this.maxSize()\n );\n\n this.hasRejection.set(rejected.length > 0);\n\n if (rejected.length) {\n this.rejected.emit(rejected);\n }\n\n if (accepted.length) {\n this.value.set(accepted);\n }\n }\n}\n","<div\n class=\"ui-dropzone\"\n role=\"button\"\n [attr.id]=\"id() || null\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-disabled]=\"disabled() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.data-dragging]=\"isDragging() ? '' : null\"\n [attr.data-invalid]=\"hasRejection() ? '' : null\"\n (click)=\"openPicker()\"\n (keydown)=\"handleKeydown($event)\"\n (dragenter)=\"handleDragEnter($event)\"\n (dragover)=\"handleDragOver($event)\"\n (dragleave)=\"handleDragLeave()\"\n (drop)=\"handleDrop($event)\"\n>\n <span class=\"ui-dropzone-icon\">\n <ng-icon [name]=\"icon()\" size=\"24\" class=\"shrink-0\" />\n </span>\n\n <span class=\"text-foreground ui-text-body\">\n {{ displayTitle() }}\n </span>\n\n @if (hint()) {\n <span class=\"text-muted-foreground-1 ui-text-caption\">\n {{ hint() }}\n </span>\n }\n</div>\n\n<input\n #picker\n type=\"file\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"handlePick($event)\"\n/>\n\n@if (files().length) {\n <div class=\"ui-dropzone-files\">\n <ul class=\"ui-dropzone-list\">\n @for (file of files(); track $index) {\n <li class=\"ui-dropzone-file\">\n <ng-icon\n name=\"heroDocument\"\n class=\"text-muted-foreground-1 shrink-0\"\n />\n <span class=\"text-foreground truncate ui-text-body\">\n {{ file.name }}\n </span>\n <span\n class=\"ms-auto text-muted-foreground-1 shrink-0 ui-text-caption\"\n >\n {{ file.size }}\n </span>\n </li>\n }\n </ul>\n\n @if (!disabled()) {\n <button\n type=\"button\"\n class=\"ui-dropzone-clear ui-text-caption\"\n (click)=\"clear()\"\n >\n {{ files().length > 1 ? 'Remove files' : 'Remove file' }}\n </button>\n }\n </div>\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n\n@Component({\n selector: 'ui-field',\n templateUrl: './field.component.html',\n styleUrl: './field.component.css',\n host: { class: 'block' }\n})\nexport class UiFieldComponent {\n readonly label = input<string>('');\n readonly hint = input<string>('');\n\n /**\n * Shows a \"*\" marker next to the label.\n */\n readonly required = input(false, { transform: booleanAttribute });\n\n /**\n * An error message, shown instead of `hint` when present.\n */\n readonly error = input<string>('');\n\n // Pass the id of the control being labelled (e.g. the `ui-input`'s `id`)\n // so the label is properly associated with it for accessibility.\n readonly for = input<string>('');\n\n // Ids for the hint/error elements - pass both to the control's\n // `describedBy` (e.g. `ui-input`) so screen readers announce whichever\n // is showing. Safe to pass both even though only one renders at a\n // time - an aria-describedby token pointing at a nonexistent id is\n // simply ignored.\n readonly hintId = input<string>('');\n readonly errorId = input<string>('');\n\n protected get forAttr() {\n return this.for() || null;\n }\n\n protected get hintAttr() {\n return this.hintId() || null;\n }\n\n protected get errorAttr() {\n return this.errorId() || null;\n }\n}\n","@if (label()) {\n <label\n [attr.for]=\"forAttr\"\n class=\"ui-text-body ui-field-label\"\n >\n {{ label() }}\n\n @if (required()) {\n <span class=\"text-danger-500\" aria-hidden=\"true\">*</span>\n <span class=\"sr-only\">(required)</span>\n }\n </label>\n}\n\n<ng-content />\n\n@if (error()) {\n <div\n [attr.id]=\"errorAttr\"\n class=\"text-danger-600 ui-text-caption ui-field-hint\"\n role=\"alert\"\n >\n {{ error() }}\n </div>\n} @else if (hint()) {\n <div\n [attr.id]=\"hintAttr\"\n class=\"text-muted-foreground-1 ui-text-caption ui-field-hint\"\n >\n {{ hint() }}\n </div>\n}\n","/** Why a file was turned away by a file picker. */\nexport const FileRejectionReasons = ['type', 'size'] as const;\n\n/** @see {@link FileRejectionReasons} */\nexport type FileRejectionReason = typeof FileRejectionReasons[number];\n\nexport interface FileRejection {\n file: File;\n reason: FileRejectionReason;\n}\n\nexport interface FileSelection {\n accepted: File[];\n rejected: FileRejection[];\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n Component,\n computed,\n contentChild,\n input,\n model,\n output,\n signal,\n TemplateRef\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroEye, heroEyeSlash } from '@ng-icons/heroicons/outline';\n\nimport {\n type InputAriaAutocomplete,\n type InputAriaHasPopup,\n type InputMode,\n type InputType,\n type InputValidation\n} from './input.types';\n\n\n@Component({\n selector: 'ui-input',\n templateUrl: './input.component.html',\n styleUrl: './input.component.css',\n imports: [NgTemplateOutlet, NgIcon],\n providers: [provideIcons({\n heroEyeSlash,\n heroEye\n })]\n})\nexport class UiInputComponent<ValueType = string> {\n readonly value = model.required<ValueType>();\n\n readonly classes = input<string>('');\n\n readonly type = input<InputType>('text');\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n readonly autocomplete = input<string>('');\n readonly inputmode = input<InputMode | ''>('');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n // these values can be strings or numbers depending on the input type\n readonly min = input<string | number>('');\n readonly max = input<string | number>('');\n readonly step = input<string | number>('');\n readonly pattern = input<string>('');\n readonly minlength = input<number | null>(null);\n readonly maxlength = input<number | null>(null);\n\n readonly autofocus = input(false, { transform: booleanAttribute });\n readonly spellcheck = input(true, { transform: booleanAttribute });\n\n /** With `type=\"password\"`, adds a button to show and hide what's been typed. */\n readonly revealable = input(false, { transform: booleanAttribute });\n\n readonly list = input<string>('');\n readonly ariaLabel = input<string>('');\n readonly describedBy = input<string>('');\n\n // for inputs that drive a popup, e.g. a select's search box or a datepicker\n // not \"role\", a static role attribute would also land on the host element\n readonly inputRole = input<string>('');\n readonly ariaExpanded = input<boolean | null>(null);\n readonly ariaControls = input<string>('');\n readonly ariaActiveDescendant = input<string | null>(null);\n readonly ariaAutocomplete = input<InputAriaAutocomplete | ''>('');\n readonly ariaHasPopup = input<InputAriaHasPopup | ''>('');\n\n readonly focused = output<FocusEvent>();\n readonly blurred = output<FocusEvent>();\n\n // Leading/Trialing elements that appear inside of the input.\n readonly leadingElement = contentChild<TemplateRef<unknown>>('leading');\n readonly trailingElement = contentChild<TemplateRef<unknown>>('trailing');\n\n protected readonly revealed = signal(false);\n\n protected readonly canReveal = computed(() =>\n this.revealable() && this.type() === 'password'\n );\n\n protected readonly shownType = computed<InputType>(() =>\n this.canReveal() && this.revealed() ? 'text' : this.type()\n );\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-input',\n 'ui-text-body',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected handleInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n\n this.value.set(this.parseValue(target));\n }\n\n protected handleFocus(event: FocusEvent): void {\n this.focused.emit(event);\n }\n\n protected handleBlur(event: FocusEvent): void {\n this.blurred.emit(event);\n }\n\n private parseValue(element: HTMLInputElement): ValueType {\n if (this.type() !== 'number') {\n return element.value as ValueType;\n }\n\n if (!element.value) {\n return null as ValueType;\n }\n\n return element.valueAsNumber as ValueType;\n }\n}\n","<ng-container *ngTemplateOutlet=\"leadingElement()\"></ng-container>\n\n<input\n [value]=\"value()\"\n [class]=\"generatedClasses()\"\n [type]=\"shownType()\"\n [attr.id]=\"id() || null\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [autocomplete]=\"autocomplete()\"\n [attr.min]=\"min() === '' ? null : min()\"\n [attr.max]=\"max() === '' ? null : max()\"\n [attr.step]=\"step() === '' ? null : step()\"\n [attr.pattern]=\"pattern() || null\"\n [attr.inputmode]=\"inputmode() || null\"\n [attr.maxlength]=\"maxlength()\"\n [attr.minlength]=\"minlength()\"\n \n [attr.spellcheck]=\"spellcheck()\"\n [attr.list]=\"list() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.role]=\"inputRole() || null\"\n [attr.aria-expanded]=\"ariaExpanded()\"\n [attr.aria-controls]=\"ariaControls() || null\"\n [attr.aria-activedescendant]=\"ariaActiveDescendant()\"\n [attr.aria-autocomplete]=\"ariaAutocomplete() || null\"\n [attr.aria-haspopup]=\"ariaHasPopup() || null\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n/>\n\n<ng-container *ngTemplateOutlet=\"trailingElement()\"></ng-container>\n\n@if (canReveal()) {\n <button\n type=\"button\"\n class=\"ui-input-reveal\"\n [attr.aria-label]=\"revealed() ? 'Hide password' : 'Show password'\"\n [attr.aria-pressed]=\"revealed()\"\n [disabled]=\"disabled()\"\n (click)=\"revealed.set(!revealed())\"\n >\n <ng-icon [name]=\"revealed() ? 'heroEyeSlash' : 'heroEye'\" size=\"18\" class=\"shrink-0\" />\n </button>\n}\n","/** Native type values ui-input supports. File/checkbox/radio/range need their own components. */\nexport const InputTypes = [\n 'text',\n 'email',\n 'tel',\n 'url',\n 'search',\n 'password',\n 'number',\n 'date',\n 'time',\n 'datetime-local',\n 'month',\n 'week',\n 'color'\n] as const;\n\n/** @see {@link InputTypes} */\nexport type InputType = typeof InputTypes[number];\n\n/** Native inputmode values, hinting at the virtual keyboard to show. */\nexport const InputModes = [\n 'none',\n 'text',\n 'decimal',\n 'numeric',\n 'tel',\n 'search',\n 'email',\n 'url'\n] as const;\n\n/** @see {@link InputModes} */\nexport type InputMode = typeof InputModes[number];\n\n/** true is valid, false is invalid, null is not yet validated. */\nexport type InputValidation = boolean | null;\n\n/** Native aria-autocomplete values, for inputs that suggest as you type. */\nexport const InputAriaAutocompletes = ['none', 'inline', 'list', 'both'] as const;\n\n/** @see {@link InputAriaAutocompletes} */\nexport type InputAriaAutocomplete = typeof InputAriaAutocompletes[number];\n\n/** Native aria-haspopup values, for inputs that open something. */\nexport const InputAriaHasPopups = ['listbox', 'dialog', 'grid', 'menu', 'tree'] as const;\n\n/** @see {@link InputAriaHasPopups} */\nexport type InputAriaHasPopup = typeof InputAriaHasPopups[number];\n","import { Component } from '@angular/core';\n\n\n/**\n * A static and non-interactable text or symbol that can be combined with\n * a `ui-input` inside of a `ui-input-group`. Example: this could represent\n * a currency symbol or unit of measurement.\n */\n@Component({\n selector: 'ui-input-addon',\n template: `<ng-content />`,\n styleUrl: './input-addon.component.css',\n host: { class: 'ui-text-body-alt' }\n})\nexport class UiInputAddonComponent {}\n","import { Component, contentChildren, effect, model } from '@angular/core';\n\nimport { UiInputComponent } from '../input/input.component';\nimport { InputValidation } from '../input/input.types';\n\n\n@Component({\n selector: 'ui-input-group',\n template: '<ng-content />',\n styleUrl: './input-group.component.css'\n})\nexport class UiInputGroupComponent {\n readonly inputs = contentChildren(UiInputComponent, { descendants: false });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n constructor() {\n effect(() => {\n const state = this.validationState();\n\n for (const input of this.inputs()) {\n input.validationState.set(state);\n }\n });\n }\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model\n} from '@angular/core';\n\nimport { InputValidation } from '../input/input.types';\n\n\n@Component({\n selector: 'ui-radio',\n templateUrl: './radio.component.html',\n styleUrl: './radio.component.css',\n // unbind id and name attrs to not cause conflict with the native input\n host: { '[attr.id]': 'null', '[attr.name]': 'null' }\n})\nexport class UiRadioComponent<ValueType = unknown> {\n readonly value = model.required<ValueType>();\n readonly option = input.required<ValueType>();\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n readonly compareWith = input<(a: ValueType, b: ValueType) => boolean>(\n (a, b) => a === b\n );\n\n readonly checked = computed(() =>\n this.compareWith()(this.value(), this.option())\n );\n\n select(): void {\n this.value.set(this.option());\n }\n}\n","<input\n type=\"radio\"\n class=\"not-checked:bg-layer border-line-3 focus:ring-2 focus:ring-primary-200/50 size-4 text-primary-600\"\n [id]=\"id()\"\n [name]=\"name()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n (change)=\"select()\"\n/>\n","import { Component, computed, input } from '@angular/core';\n\nimport { BadgeAppearance, BadgeIntent, BadgeSize } from './badge.types';\n\n\n@Component({\n selector: 'ui-badge',\n templateUrl: './badge.component.html',\n styleUrl: './badge.component.css',\n host: { '[class]': 'generatedClasses()' }\n})\nexport class UiBadgeComponent {\n readonly appearance = input<BadgeAppearance>('solid');\n readonly intent = input<BadgeIntent>('primary');\n readonly size = input<BadgeSize>('md');\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-badge',\n `ui-badge--${this.intent()}-${this.appearance()}`,\n `ui-badge--${this.size()}`\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","<ng-content />\n","/** The radius that a card can hold. Maps directly to tailwindcss' rounded classes. */\nexport const CardRadii = ['none', 'sm', 'md', 'lg', 'xl'] as const;\n\n/** @see {@link CardRadii} */\nexport type CardRadius = typeof CardRadii[number];\n\n// Written out in full so tailwind picks them up\nexport const radiusClasses: Record<CardRadius, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl'\n};\n","import { Component, computed, input } from '@angular/core';\n\nimport { CardRadius, radiusClasses } from './card.types';\n\n\n@Component({\n selector: 'ui-card',\n template: '<ng-content />',\n styleUrl: './card.component.css',\n host: { '[class]': 'generatedClasses()' }\n})\nexport class UiCardComponent {\n readonly radius = input<CardRadius>('md');\n\n readonly generatedClasses = computed<string>(() =>\n radiusClasses[this.radius()]\n );\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { autoUpdate, computePosition, flip, offset, shift } from \"@floating-ui/dom\";\n\nimport { UiOverlayOptions } from \"./overlay.types\";\n\n\n@Injectable({ providedIn: \"root\" })\nexport class UiOverlayPositioner {\n readonly position = (\n reference: HTMLElement,\n overlay: HTMLElement,\n options: UiOverlayOptions\n ) => computePosition(reference, overlay, {\n placement: options.placement,\n strategy: \"fixed\",\n middleware: [\n offset(options.offset),\n flip({ padding: options.viewportPadding }),\n shift({ padding: options.viewportPadding })\n ]\n });\n\n readonly watch = (\n reference: HTMLElement,\n overlay: HTMLElement,\n update: () => void\n ) => autoUpdate(reference, overlay, update);\n}\n","import { DestroyRef, inject, Injectable } from '@angular/core';\n\nimport { UiOverlayStackEntry } from './overlay.types';\n\n\n/** Tracks open overlays so only the top one reacts to outside clicks and Escape. */\n@Injectable({ providedIn: 'root' })\nexport class UiOverlayStack {\n private readonly entries: UiOverlayStackEntry[] = [];\n\n constructor() {\n document.addEventListener('click', this.onDocumentClick);\n document.addEventListener('keydown', this.onKeyDown);\n\n inject(DestroyRef).onDestroy(() => {\n document.removeEventListener('click', this.onDocumentClick);\n document.removeEventListener('keydown', this.onKeyDown);\n });\n }\n\n readonly push = (entry: UiOverlayStackEntry) => {\n this.remove(entry);\n this.entries.push(entry);\n };\n\n readonly remove = (entry: UiOverlayStackEntry) => {\n const index = this.entries.indexOf(entry);\n if (index !== -1) { this.entries.splice(index, 1); }\n };\n\n private readonly top = () => this.entries.at(-1);\n\n private readonly onDocumentClick = (event: MouseEvent) =>\n this.top()?.onDocumentClick(event);\n\n private readonly onKeyDown = (event: KeyboardEvent) =>\n this.top()?.onKeyDown(event);\n}\n","import {\n Component,\n effect,\n ElementRef,\n inject,\n input,\n WritableSignal\n} from '@angular/core';\n\nimport { Placement } from '@floating-ui/dom';\n\nimport { DropdownMatchWidth } from '../../generic/dropdown/dropdown.types';\nimport { UiOverlayPositioner } from './overlay.positioner';\nimport { UiOverlayStack } from './overlay.stack';\nimport { UiOverlayCloseBehaviour, UiOverlayStackEntry } from './overlay.types';\n\n\n@Component({\n selector: 'ui-overlay',\n exportAs: 'uiOverlay',\n template: '<ng-content />',\n host: { style: 'display: contents;' }\n})\nexport class UiOverlayComponent implements UiOverlayStackEntry {\n private readonly positioner = inject(UiOverlayPositioner);\n private readonly stack = inject(UiOverlayStack);\n\n readonly content = input<ElementRef<HTMLInputElement>>();\n readonly anchor = input<ElementRef<HTMLElement>>();\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickAnywhere'\n );\n\n readonly isOpen = input.required<WritableSignal<boolean>>();\n\n readonly placement = input<Placement>('bottom-start');\n readonly offset = input<number>(0);\n readonly viewportPadding = input<number>(0);\n\n /** Forces this element to match the width of its anchor element. */\n readonly matchWidth = input<DropdownMatchWidth | null>(null);\n\n constructor() {\n effect(onCleanup => {\n if (!this.isOpen()()) { return; }\n\n this.stack.push(this);\n onCleanup(() => this.stack.remove(this));\n });\n\n effect(onCleanup => {\n const anchor = this.anchor();\n const content = this.content();\n\n if (!this.isOpen()() || !anchor || !content) { return; }\n\n const referenceElement = anchor.nativeElement;\n const floatingElement = content.nativeElement;\n\n const update = () => {\n const matchWidth = this.matchWidth();\n\n if (matchWidth) {\n const width = `${referenceElement.offsetWidth}px`;\n\n if (matchWidth === 'both') {\n floatingElement.style.maxWidth = width;\n floatingElement.style.minWidth = width;\n } else {\n floatingElement.style[matchWidth] = width;\n }\n }\n\n return this.positioner.position(\n referenceElement,\n floatingElement,\n {\n placement: this.placement(),\n offset: this.offset(),\n viewportPadding: this.viewportPadding()\n }\n ).then(({ x, y }) =>\n Object.assign(floatingElement.style, {\n left: `${x}px`,\n top: `${y}px`\n })\n );\n };\n\n update();\n\n onCleanup(\n this.positioner.watch(referenceElement, floatingElement, update)\n );\n });\n }\n\n private readonly close = () => this.isOpen().set(false);\n\n readonly onDocumentClick = (event: MouseEvent) => {\n const behaviour = this.closeBehaviour();\n if (behaviour === 'none') { return; }\n\n const target = event.target;\n if (!(target instanceof Node)) { return; }\n\n const anchorElement = this.anchor()?.nativeElement;\n const contentElement = this.content()?.nativeElement;\n const isInsideAnchor = anchorElement?.contains(target) ?? false;\n const isInsideContent = contentElement?.contains(target) ?? false;\n\n // Anchor can wrap the content too, so only treat a click as \"on the\n // anchor\" (e.g. the trigger button) when it's not inside the content.\n if (isInsideAnchor && !isInsideContent) { return; }\n\n if (behaviour === 'whenClickAnywhere') {\n this.close();\n return;\n }\n\n if (!isInsideContent) {\n this.close();\n }\n };\n\n readonly onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') { this.close(); }\n };\n}\n","import { Directive, ElementRef, inject } from \"@angular/core\";\n\n\n@Directive({\n selector: '[uiDropdownContent]',\n host: { style: \"position: fixed; z-index: 50;\" }\n})\nexport class UiDropdownDirective {\n readonly element = inject(ElementRef<HTMLElement>);\n}\n","import {\n Component,\n contentChild,\n ElementRef,\n inject,\n input,\n WritableSignal\n} from '@angular/core';\n\nimport { Placement } from '@floating-ui/dom';\n\nimport { UiOverlayComponent } from '../../layout/overlay/overlay.component';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiDropdownDirective } from './dropdown.directives';\nimport { DropdownMatchWidth } from './dropdown.types';\n\n\n@Component({\n selector: 'ui-dropdown',\n exportAs: 'uiDropdown',\n templateUrl: './dropdown.component.html',\n imports: [UiOverlayComponent],\n host: { class: 'inline-flex size-fit' }\n})\nexport class UiDropdownComponent {\n protected readonly anchor = inject(ElementRef<HTMLElement>);\n readonly content = contentChild(UiDropdownDirective);\n readonly isOpen = input.required<WritableSignal<boolean>>();\n readonly placement = input<Placement>('bottom-start');\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickAnywhere'\n );\n\n readonly offset = input<number>(0);\n readonly viewportPadding = input<number>(0);\n\n /** Gives the floating content a min-width matching the dropdown's own width. */\n readonly matchWidth = input<DropdownMatchWidth | null>(null);\n\n readonly toggle = () => this.isOpen().update(value => !value);\n readonly close = () => this.isOpen().set(false);\n readonly open = () => this.isOpen().set(true);\n}\n","<ui-overlay\n [isOpen]=\"isOpen()\"\n [closeBehaviour]=\"closeBehaviour()\"\n [content]=\"content()?.element\"\n [anchor]=\"anchor\"\n [placement]=\"placement()\"\n [offset]=\"offset()\"\n [viewportPadding]=\"viewportPadding()\"\n [matchWidth]=\"matchWidth()\"\n>\n <ng-content />\n</ui-overlay>","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n computed,\n contentChild,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n output,\n signal,\n TemplateRef,\n untracked\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\n\nimport { Placement } from '@floating-ui/dom';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport {\n heroCheck,\n heroChevronDown,\n heroPlus,\n heroXMark\n} from '@ng-icons/heroicons/outline';\nimport {\n catchError,\n debounceTime,\n Observable,\n of,\n skip,\n Subject,\n switchMap\n} from 'rxjs';\n\nimport { UiBadgeComponent } from '../../generic/badge/badge.component';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../../generic/dropdown/dropdown.directives';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiInputComponent } from '../input/input.component';\nimport { InputValidation } from '../input/input.types';\nimport { SelectDataSource, SelectDataSourceContent } from './select.datasource';\nimport {\n SearchMode,\n SelectMultipleDisplay,\n SelectOptionContext,\n SelectRow,\n SelectTriggerContext\n} from './select.types';\n\n\nlet nextId = 0;\n\n@Component({\n selector: 'ui-select',\n templateUrl: './select.component.html',\n styleUrl: './select.component.css',\n imports: [\n UiDropdownComponent,\n UiDropdownDirective,\n UiInputComponent,\n UiBadgeComponent,\n UiCardComponent,\n NgIcon,\n NgTemplateOutlet\n ],\n host: { '(focusout)': 'onFocusOut($event)' },\n providers: [provideIcons({\n heroChevronDown,\n heroXMark,\n heroCheck,\n heroPlus\n })]\n})\nexport class UiSelectComponent<Model = unknown> {\n readonly isOpen = signal(false);\n readonly placement = input<Placement>('bottom-start');\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickOutside'\n );\n\n readonly dataSource = input.required<SelectDataSource<Model>>();\n readonly items = signal<Model[]>([]);\n\n readonly placeholder = input<string>('Select an option');\n\n /** Goes on the trigger (or the inline search box), pass it to ui-field's `for`. */\n readonly id = input<string>('');\n readonly describedBy = input<string>('');\n\n readonly pageSize = input<number>(10);\n readonly searchMode = input<SearchMode>('none');\n\n // added: disabled state, previously had CSS but nothing set it\n readonly disabled = input(false, { transform: booleanAttribute });\n // added: validation styling to match ui-input\n readonly validationState = model<InputValidation>(null);\n\n // opt-in, most selects back a required value where clearing isn't valid\n readonly clearable = input(false, { transform: booleanAttribute });\n readonly clearLabel = input<string>('None');\n\n /**\n * Offers a \"Create\" row when a search matches nothing. Needs a\n * searchMode, the parent handles `create` and adds the new item.\n */\n readonly creatable = input(false, { transform: booleanAttribute });\n readonly createLabel = input<(query: string) => string>(query =>\n `Create \"${query}\"`\n );\n\n /** Puts a heading above each run of items in the same group. Expects items sorted by group. */\n readonly groupBy = input<((item: Model) => string | null) | null>(null);\n\n /** Scrolls the selected option into view when the list opens. */\n readonly scrollToSelected = input(true, { transform: booleanAttribute });\n\n /** Lets several items be picked, bound through `selectedItems`. */\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly multipleDisplay = input<SelectMultipleDisplay>('text');\n\n /** In text display, swaps the list of names for a count past this many. 0 always counts. */\n readonly counterAfter = input<number | null>(null);\n readonly counterLabel = input<(count: number) => string>(count =>\n `${count} selected`\n );\n\n readonly compareWith = input<(a: Model, b: Model) => boolean>(\n (a, b) => a === b\n );\n\n readonly displayWith = input<(item: Model) => string>(\n item => `${item}`\n );\n\n readonly selectionChange = output<Model | null>();\n\n /** Emits the search text when the \"Create\" row is picked. */\n readonly create = output<string>();\n // changed to a model so a selection can be bound in from outside\n readonly selectedItem = model<Model | null>(null);\n readonly selectedItems = model<Model[]>([]);\n readonly query = signal('');\n readonly loading = signal(false);\n readonly hasMore = signal(true);\n\n readonly optionTemplate = contentChild<\n TemplateRef<SelectOptionContext<Model>>\n >('option');\n readonly triggerTemplate = contentChild<\n TemplateRef<SelectTriggerContext<Model>>\n >('trigger');\n\n /** Index into the pickable rows, the one keyboard focus sits on. */\n readonly activeIndex = signal(0);\n\n readonly listId = `ui-select-${nextId++}`;\n\n readonly hasSelection = computed(() =>\n this.multiple()\n ? this.selectedItems().length > 0\n : this.selectedItem() !== null\n );\n\n readonly triggerLabel = computed(() => {\n const display = this.displayWith();\n\n if (!this.multiple()) {\n const selected = this.selectedItem();\n\n return selected !== null ? display(selected) : this.placeholder();\n }\n\n const selected = this.selectedItems();\n const counterAfter = this.counterAfter();\n\n if (!selected.length) {\n return this.placeholder();\n }\n\n return counterAfter !== null && selected.length > counterAfter\n ? this.counterLabel()(selected.length)\n : selected.map(display).join(', ');\n });\n\n readonly isEmpty = computed(() =>\n this.multiple() ? !this.selectedItems().length : this.selectedItem() === null\n );\n\n /** Tags only replace the trigger text when there's no inline search box. */\n readonly showTags = computed(() =>\n this.multiple() &&\n this.multipleDisplay() === 'tags' &&\n this.searchMode() !== 'inline'\n );\n\n /** The text to create from, or null when there's nothing to offer. */\n readonly createQuery = computed(() => {\n const query = this.query().trim();\n const display = this.displayWith();\n\n if (!this.creatable() || !query || this.loading()) {\n return null;\n }\n\n const exists = this.items().some(item =>\n display(item).toLowerCase() === query.toLowerCase()\n );\n\n return exists ? null : query;\n });\n\n readonly rows = computed<SelectRow<Model>[]>(() => {\n const rows: SelectRow<Model>[] = [];\n const groupBy = this.groupBy();\n const display = this.displayWith();\n const createQuery = this.createQuery();\n\n let index = 0;\n let group: string | null | undefined;\n\n if (this.clearable() && this.hasSelection()) {\n rows.push({ kind: 'clear', id: this.rowId(index), index: index++ });\n }\n\n for (const item of this.items()) {\n if (groupBy) {\n const next = groupBy(item);\n\n if (next !== group && next) {\n rows.push({\n kind: 'group',\n id: `${this.listId}-group-${rows.length}`,\n label: next\n });\n }\n\n group = next;\n }\n\n rows.push({\n kind: 'item',\n id: this.rowId(index),\n index: index++,\n item,\n label: display(item),\n selected: this.isSelected(item)\n });\n }\n\n if (createQuery) {\n rows.push({\n kind: 'create',\n id: this.rowId(index),\n index,\n query: createQuery\n });\n }\n\n return rows;\n });\n\n private readonly pickable = computed(() =>\n this.rows().filter(row => row.kind !== 'group')\n );\n\n readonly activeId = computed(() =>\n this.isOpen() ? this.pickable()[this.activeIndex()]?.id ?? null : null\n );\n\n private page = 0;\n\n // one shared stream for every fetch, so a new request cancels whatever was still in flight\n private readonly load$ = new Subject<void>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n\n constructor() {\n // reloads when a new data source comes in, e.g. after creating an item\n effect(() => {\n this.dataSource();\n untracked(() => this.loadFirstPage());\n });\n\n // start on the selected option, and bring it into view\n effect(() => {\n if (!this.isOpen()) {\n return;\n }\n\n untracked(() => {\n const selected = this.pickable().findIndex(row =>\n row.kind === 'item' && row.selected\n );\n\n this.activeIndex.set(\n this.scrollToSelected() && selected >= 0 ? selected : 0\n );\n\n afterNextRender(() => {\n if (this.scrollToSelected()) {\n this.scrollActiveIntoView();\n }\n\n if (this.searchMode() === 'dropdown') {\n this.searchInput()?.focus();\n }\n }, { injector: this.injector });\n });\n });\n\n // debounce the query signal itself instead of a separate subject\n toObservable(this.query).pipe(\n debounceTime(300),\n skip(1), // skip the initial value, the data source effect already loads that\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.loadFirstPage());\n\n // switchMap cancels the previous request, fixing stale responses overwriting newer ones\n this.load$.pipe(\n switchMap(() => this.fetchPage()),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(result => this.applyResult(result));\n }\n\n private fetchPage(): Observable<SelectDataSourceContent<Model> | null> {\n this.loading.set(true);\n\n const request = this.dataSource().load({\n query: this.query(),\n page: this.page,\n size: this.pageSize()\n });\n\n return request.pipe(catchError(() => of(null)));\n }\n\n private applyResult(result: SelectDataSourceContent<Model> | null): void {\n this.loading.set(false);\n\n if (result) {\n this.items.update(items => [...items, ...result.items]);\n this.hasMore.set(result.hasMore);\n }\n\n this.cdr.markForCheck();\n }\n\n open(): void {\n if (!this.disabled()) {\n this.isOpen.set(true);\n }\n }\n\n toggle(): void {\n if (this.isOpen()) {\n this.isOpen.set(false);\n } else {\n this.open();\n }\n }\n\n select(item: Model): void {\n this.selectedItem.set(item);\n this.selectionChange.emit(item);\n }\n\n isSelected(item: Model): boolean {\n const compare = this.compareWith();\n\n if (item === null) {\n return false;\n }\n\n if (this.multiple()) {\n return this.selectedItems().some(selected =>\n compare(selected, item)\n );\n }\n\n const selected = this.selectedItem();\n\n return selected !== null && compare(selected, item);\n }\n\n toggleItem(item: Model): void {\n const compare = this.compareWith();\n\n this.selectedItems.update(selected =>\n this.isSelected(item)\n ? selected.filter(existing => !compare(existing, item))\n : [...selected, item]\n );\n }\n\n removeItem(item: Model): void {\n const compare = this.compareWith();\n\n this.selectedItems.update(selected =>\n selected.filter(existing => !compare(existing, item))\n );\n }\n\n clear(): void {\n if (this.multiple()) {\n this.selectedItems.set([]);\n } else {\n this.selectedItem.set(null);\n this.selectionChange.emit(null);\n }\n\n this.isOpen.set(false);\n this.focusTrigger();\n\n if (this.searchMode() === 'inline') {\n this.query.set('');\n }\n }\n\n onItemClick(item: Model): void {\n // multiple stays open so several can be ticked in one go\n if (this.multiple()) {\n this.toggleItem(item);\n return;\n }\n\n this.select(item);\n this.isOpen.set(false);\n this.focusTrigger();\n\n // The behaviour of clearing the inline search flows better than\n // leaving it as is. Clicking into the input with a value already\n // selected will reveal the previous query which may be confusing.\n if (this.searchMode() === 'inline') {\n this.query.set('');\n }\n }\n\n onCreate(): void {\n const query = this.createQuery();\n\n if (!query) {\n return;\n }\n\n this.create.emit(query);\n this.query.set('');\n\n if (!this.multiple()) {\n this.isOpen.set(false);\n this.focusTrigger();\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n const count = this.pickable().length;\n // space types in search boxes, only the plain trigger treats it as a pick\n const isSpacePick = event.key === ' ' && this.searchMode() === 'none';\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n\n if (!this.isOpen()) {\n this.open();\n return;\n }\n\n this.moveActive(event.key === 'ArrowDown' ? 1 : -1, count);\n return;\n case 'Home':\n case 'End':\n if (this.isOpen() && count && this.searchMode() === 'none') {\n event.preventDefault();\n this.setActive(event.key === 'Home' ? 0 : count - 1);\n }\n return;\n case 'Enter':\n case ' ':\n if (event.key === ' ' && !isSpacePick) {\n return;\n }\n\n event.preventDefault();\n\n if (!this.isOpen()) {\n this.open();\n } else {\n this.pickActive();\n }\n return;\n case 'Escape':\n // the overlay closes itself, focus just needs a home\n this.focusTrigger();\n return;\n }\n }\n\n onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget;\n\n if (this.closeBehaviour() === 'none') {\n return;\n }\n\n // tabbing away closes it, moving between the trigger and the list doesn't\n if (\n !(next instanceof Node) ||\n !this.host.nativeElement.contains(next)\n ) {\n this.isOpen.set(false);\n }\n }\n\n setActive(index: number): void {\n this.activeIndex.set(index);\n\n afterNextRender(() => this.scrollActiveIntoView(), {\n injector: this.injector\n });\n }\n\n loadFirstPage(): void {\n this.page = 0;\n this.items.set([]);\n this.hasMore.set(true);\n\n this.load$.next();\n }\n\n loadNextPage(): void {\n if (this.loading() || !this.hasMore()) {\n return;\n }\n\n this.page++;\n this.load$.next();\n }\n\n onQueryChange(query: string): void {\n // sets straight away so the search box doesn't fight the user's typing, the\n // constructor's toObservable pipeline debounces the actual reload\n this.query.set(query);\n this.activeIndex.set(0);\n this.open();\n }\n\n onScroll(scrollContainer: HTMLElement): void {\n const remainingPixels = scrollContainer.scrollHeight\n - scrollContainer.scrollTop\n - scrollContainer.clientHeight;\n\n if (remainingPixels < 48) {\n this.loadNextPage();\n }\n }\n\n private pickActive(): void {\n const row = this.pickable()[this.activeIndex()];\n\n if (!row) {\n return;\n }\n\n if (row.kind === 'clear') {\n this.clear();\n } else if (row.kind === 'create') {\n this.onCreate();\n } else if (row.kind === 'item') {\n this.onItemClick(row.item);\n }\n }\n\n private moveActive(step: number, count: number): void {\n if (count) {\n this.setActive((this.activeIndex() + step + count) % count);\n }\n }\n\n private scrollActiveIntoView(): void {\n const id = this.activeId();\n\n if (id) {\n this.host.nativeElement\n .querySelector(`#${id}`)\n ?.scrollIntoView({ block: 'nearest' });\n }\n }\n\n private focusTrigger(): void {\n const trigger = this.searchMode() === 'inline'\n ? this.searchInput()\n : this.host.nativeElement.querySelector<HTMLElement>('.ui-select');\n\n trigger?.focus();\n }\n\n // the inline box or the one inside the dropdown, never both\n private searchInput(): HTMLInputElement | null {\n return this.host.nativeElement.querySelector('ui-input input');\n }\n\n private rowId(index: number): string {\n return `${this.listId}-${index}`;\n }\n}\n","<ui-dropdown\n [isOpen]=\"isOpen\"\n [placement]=\"placement()\"\n [closeBehaviour]=\"closeBehaviour()\"\n matchWidth=\"minWidth\"\n class=\"w-full\"\n>\n @if (searchMode() === 'inline') {\n <ui-input\n [value]=\"isOpen() ? query() : triggerLabel()\"\n (valueChange)=\"onQueryChange($event)\"\n [placeholder]=\"triggerLabel()\"\n [disabled]=\"disabled()\"\n [id]=\"id()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n [ariaControls]=\"listId\"\n [ariaActiveDescendant]=\"activeId()\"\n inputRole=\"combobox\"\n ariaAutocomplete=\"list\"\n ariaHasPopup=\"listbox\"\n class=\"border-0!\"\n classes=\"h-auto! py-1.5!\"\n autocomplete=\"off\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n >\n <ng-template #trailing>\n <ng-icon\n name=\"heroChevronDown\"\n class=\"mx-3 size-4 text-muted-foreground transition-transform duration-100 shrink-0\"\n [class.rotate-180]=\"isOpen()\"\n />\n </ng-template>\n </ui-input>\n } @else {\n <div\n class=\"ui-select-trigger\"\n [class.ui-select-trigger--tags]=\"showTags()\"\n >\n <button\n type=\"button\"\n class=\"flex justify-between items-center gap-2 px-3 py-1.5 text-left ui-select\"\n aria-haspopup=\"listbox\"\n [attr.id]=\"id() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"searchMode() === 'none' ? activeId() : null\"\n [disabled]=\"disabled()\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n >\n @if (showTags()) {\n <!-- the visible tags sit on top, this names the button for screen readers -->\n <span class=\"sr-only\">{{ triggerLabel() }}</span>\n } @else if (!multiple() && triggerTemplate() && selectedItem() !== null) {\n <span class=\"flex items-center gap-2 min-w-0 ui-text-body\">\n <ng-container\n *ngTemplateOutlet=\"triggerTemplate()!; context: { $implicit: selectedItem()! }\"\n />\n </span>\n } @else if (multiple()) {\n <span class=\"ui-text-body ui-select-label\" [class.text-muted-foreground-1]=\"isEmpty()\">\n <span\n class=\"ui-select-label-sizer\"\n aria-hidden=\"true\"\n >{{ placeholder() }}</span>\n <span class=\"ui-select-label-text\">{{\n triggerLabel()\n }}</span>\n </span>\n } @else {\n <span class=\"ui-text-body truncate\" [class.text-muted-foreground-1]=\"isEmpty()\">{{\n triggerLabel()\n }}</span>\n }\n\n <ng-icon\n name=\"heroChevronDown\"\n class=\"ms-auto size-4 text-muted-foreground transition-transform duration-100 shrink-0\"\n [class.rotate-180]=\"isOpen()\"\n />\n </button>\n\n @if (showTags()) {\n <span\n class=\"ui-text-body ui-select-tags-sizer\"\n aria-hidden=\"true\"\n >\n {{ placeholder() }}\n </span>\n\n <div class=\"ui-select-tags\">\n @for (item of selectedItems(); track $index) {\n <ui-badge\n intent=\"secondary\"\n appearance=\"soft\"\n size=\"xs\"\n class=\"ui-select-tag ui-text-caption\"\n >\n <span class=\"truncate\">{{\n displayWith()(item)\n }}</span>\n\n @if (!disabled()) {\n <button\n type=\"button\"\n class=\"ui-select-tag-remove\"\n [attr.aria-label]=\"'Remove ' + displayWith()(item)\"\n (click)=\"removeItem(item)\"\n >\n <ng-icon\n name=\"heroXMark\"\n class=\"size-3 shrink-0\"\n />\n </button>\n }\n </ui-badge>\n } @empty {\n <span\n class=\"text-muted-foreground-1 ui-text-body truncate\"\n >\n {{ placeholder() }}\n </span>\n }\n </div>\n }\n </div>\n }\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <ui-card radius=\"lg\" class=\"divide-y overflow-hidden\">\n @if (searchMode() === 'dropdown') {\n <div class=\"p-2\">\n <ui-input\n [value]=\"query()\"\n (valueChange)=\"onQueryChange($event)\"\n (keydown)=\"onKeydown($event)\"\n [ariaExpanded]=\"true\"\n [ariaControls]=\"listId\"\n [ariaActiveDescendant]=\"activeId()\"\n inputRole=\"combobox\"\n ariaAutocomplete=\"list\"\n ariaLabel=\"Search options\"\n autocomplete=\"off\"\n placeholder=\"Search...\"\n />\n </div>\n }\n\n <div\n #scrollContainer\n class=\"py-1 max-h-60 overflow-y-auto\"\n role=\"listbox\"\n [attr.id]=\"listId\"\n [attr.aria-multiselectable]=\"multiple() || null\"\n (scroll)=\"onScroll(scrollContainer)\"\n >\n @for (row of rows(); track row.id) {\n @switch (row.kind) {\n @case ('group') {\n <div\n class=\"ui-text-caption ui-select-group\"\n role=\"presentation\"\n >\n {{ row.label }}\n </div>\n }\n @case ('clear') {\n <button\n type=\"button\"\n role=\"option\"\n aria-selected=\"false\"\n tabindex=\"-1\"\n class=\"text-muted-foreground-1 ui-text-body-alt ui-select-option\"\n [attr.id]=\"row.id\"\n [attr.data-active]=\"row.index === activeIndex() ? '' : null\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"activeIndex.set(row.index)\"\n (click)=\"clear()\"\n >\n <span class=\"truncate\">{{\n clearLabel()\n }}</span>\n </button>\n }\n @case ('item') {\n <button\n type=\"button\"\n role=\"option\"\n tabindex=\"-1\"\n class=\"text-dropdown-item-foreground ui-text-body-alt ui-select-option\"\n [attr.id]=\"row.id\"\n [attr.aria-selected]=\"row.selected\"\n [attr.data-active]=\"row.index === activeIndex() ? '' : null\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"activeIndex.set(row.index)\"\n (click)=\"onItemClick(row.item)\"\n >\n @if (optionTemplate(); as template) {\n <span\n class=\"flex items-center gap-2 min-w-0 grow\"\n >\n <ng-container\n *ngTemplateOutlet=\"template; context: {\n $implicit: row.item,\n selected: row.selected,\n active: row.index === activeIndex()\n }\"\n />\n </span>\n } @else {\n <span class=\"truncate\">{{\n row.label\n }}</span>\n }\n\n @if (row.selected) {\n <ng-icon\n name=\"heroCheck\"\n class=\"size-4 text-primary-600! shrink-0\"\n strokeWidth=\"2.5\"\n />\n }\n </button>\n }\n @case ('create') {\n <button\n type=\"button\"\n role=\"option\"\n aria-selected=\"false\"\n tabindex=\"-1\"\n class=\"justify-start! text-primary-600 ui-text-body-alt ui-select-option\"\n [attr.id]=\"row.id\"\n [attr.data-active]=\"row.index === activeIndex() ? '' : null\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"activeIndex.set(row.index)\"\n (click)=\"onCreate()\"\n >\n <ng-icon\n name=\"heroPlus\"\n class=\"size-4 shrink-0\"\n />\n <span class=\"truncate\">{{\n createLabel()(row.query)\n }}</span>\n </button>\n }\n }\n }\n\n @if (loading()) {\n <div class=\"px-3 py-2 text-muted-foreground ui-text-body-alt text-center\">\n Loading...\n </div>\n }\n\n @if (!loading() && items().length === 0 && !createQuery()) {\n <div class=\"px-3 py-2 text-muted-foreground ui-text-body-alt text-center\">\n No results\n </div>\n }\n </div>\n </ui-card>\n </div>\n }\n</ui-dropdown>\n","import { Observable, of } from 'rxjs';\n\n\nexport interface SelectDataSourceParameters {\n query: string;\n page: number;\n size: number;\n}\n\nexport interface SelectDataSourceContent<Model> {\n items: Model[];\n hasMore: boolean;\n}\n\nexport interface SelectDataSource<Model> {\n load(\n params: SelectDataSourceParameters\n ): Observable<SelectDataSourceContent<Model>>;\n}\n\nexport class SelectLocalDataSource<Model> implements SelectDataSource<Model> {\n constructor(\n private readonly items: Model[],\n private readonly search: (item: Model, query: string) => boolean\n ) {}\n\n load(\n params: SelectDataSourceParameters\n ): Observable<SelectDataSourceContent<Model>> {\n const query = params.query.trim();\n\n const filteredItems = query\n ? this.items.filter(item => this.search(item, query))\n : this.items;\n\n const start = params.page * params.size;\n const end = start + params.size;\n\n return of({\n items: filteredItems.slice(start, end),\n hasMore: end < filteredItems.length\n });\n }\n}\n\n// wraps any fetch function, so no specific backend is baked in here\nexport class SelectRemoteDataSource<Model> implements SelectDataSource<Model> {\n constructor(\n private readonly fetch: (\n params: SelectDataSourceParameters\n ) => Observable<SelectDataSourceContent<Model>>\n ) {}\n\n load(\n params: SelectDataSourceParameters\n ): Observable<SelectDataSourceContent<Model>> {\n return this.fetch(params);\n }\n}\n","export type SearchMode =\n | 'none'\n | 'inline'\n | 'dropdown';\n\n/** How a multiple select shows its selection when closed. */\nexport const SelectMultipleDisplays = ['text', 'tags'] as const;\n\n/** @see {@link SelectMultipleDisplays} */\nexport type SelectMultipleDisplay = typeof SelectMultipleDisplays[number];\n\n/** Context for a projected `#option` template. */\nexport interface SelectOptionContext<Model> {\n $implicit: Model;\n selected: boolean;\n active: boolean;\n}\n\n/** Context for a projected `#trigger` template, single select only. */\nexport interface SelectTriggerContext<Model> {\n $implicit: Model;\n}\n\n/** One line in the open list. Groups are headings, the rest can be picked. */\nexport type SelectRow<Model> =\n | { kind: 'group'; id: string; label: string; }\n | { kind: 'clear'; id: string; index: number; }\n | { kind: 'create'; id: string; index: number; query: string; }\n | {\n kind: 'item';\n id: string;\n index: number;\n item: Model;\n label: string;\n selected: boolean;\n };\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model,\n output\n} from '@angular/core';\n\nimport { type TextareaResize, type TextareaValidation } from './textarea.types';\n\n\n@Component({\n selector: 'ui-textarea',\n templateUrl: './textarea.component.html',\n styleUrl: './textarea.component.css'\n})\nexport class UiTextareaComponent {\n readonly value = model.required<string>();\n\n readonly classes = input<string>('');\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n\n readonly rows = input<number>(3);\n readonly resize = input<TextareaResize>('vertical');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<TextareaValidation>(null);\n\n readonly minlength = input<number | null>(null);\n readonly maxlength = input<number | null>(null);\n\n readonly autofocus = input(false, { transform: booleanAttribute });\n readonly spellcheck = input(true, { transform: booleanAttribute });\n\n readonly ariaLabel = input<string>('');\n readonly describedBy = input<string>('');\n\n readonly focused = output<FocusEvent>();\n readonly blurred = output<FocusEvent>();\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-textarea',\n 'ui-text-body',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected handleInput(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n\n this.value.set(target.value);\n }\n\n protected handleFocus(event: FocusEvent): void {\n this.focused.emit(event);\n }\n\n protected handleBlur(event: FocusEvent): void {\n this.blurred.emit(event);\n }\n}\n","<textarea\n [value]=\"value()\"\n [class]=\"generatedClasses()\"\n [attr.id]=\"id() || null\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [rows]=\"rows()\"\n [style.resize]=\"resize()\"\n [attr.maxlength]=\"maxlength()\"\n [attr.minlength]=\"minlength()\"\n \n [attr.spellcheck]=\"spellcheck()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n></textarea>\n","/** Native resize values for the textarea element. */\nexport const TextareaResizeOptions = [\n 'none',\n 'both',\n 'horizontal',\n 'vertical'\n] as const;\n\n/** @see {@link TextareaResizeOptions} */\nexport type TextareaResize = typeof TextareaResizeOptions[number];\n\n/** true is valid, false is invalid, null is not yet validated. */\nexport type TextareaValidation = boolean | null;\n","import {\n Component,\n computed,\n contentChild,\n input,\n TemplateRef\n} from '@angular/core';\n\nimport { AlertAppearance, AlertIntent } from './alert.types';\n\n\n@Component({\n selector: 'ui-alert',\n templateUrl: './alert.component.html',\n styleUrl: './alert.component.css',\n host: {\n role: 'alert',\n '[class]': 'generatedClasses()'\n }\n})\nexport class UiAlertComponent {\n readonly appearance = input<AlertAppearance>('soft');\n readonly intent = input<AlertIntent>('info');\n\n readonly icon = contentChild<TemplateRef<unknown>>('icon', {\n descendants: false\n });\n\n readonly generatedClasses = computed(() =>\n [\n 'block',\n 'ui-alert',\n `ui-alert--${this.appearance()}`,\n `ui-alert--${this.intent()}`\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","<ng-content />\n","export const AlertIntents = [\n 'info',\n 'success',\n 'warning',\n 'danger'\n];\n\nexport const AlertAppearances = [\n 'soft',\n 'bordered'\n] as const;\n\nexport type AlertIntent = typeof AlertIntents[number];\nexport type AlertAppearance = typeof AlertAppearances[number];\n","import { Component, computed, input, signal } from '@angular/core';\n\nimport type { AvatarSize } from './avatar.types';\n\n\n@Component({\n selector: 'ui-avatar',\n templateUrl: './avatar.component.html',\n styleUrl: './avatar.component.css',\n host: {\n role: 'img',\n '[attr.aria-label]': 'name()',\n '[class]': 'generatedClasses()'\n }\n})\nexport class UiAvatarComponent {\n readonly name = input.required<string>();\n readonly src = input<string | null>(null);\n readonly size = input<AvatarSize>('md');\n\n private readonly failedSrc = signal<string | null>(null);\n\n protected readonly showImage = computed(() => {\n const src = this.src();\n\n return !!src && src !== this.failedSrc();\n });\n\n protected readonly initials = computed(() => {\n const words = this.name().trim().split(/\\s+/).filter(Boolean);\n const first = words[0]?.[0] ?? '';\n const last = words.length > 1 ? words[words.length - 1][0] : '';\n\n return (first + last).toUpperCase();\n });\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-avatar',\n `ui-avatar--${this.size()}`,\n this.size() === 'lg' ? 'ui-text-body-alt' : 'ui-text-caption'\n ].join(' ')\n );\n\n protected imageFailed(): void {\n this.failedSrc.set(this.src());\n }\n}\n","@if (showImage()) {\n <img class=\"ui-avatar-image\" [src]=\"src()\" alt=\"\" (error)=\"imageFailed()\" />\n} @else {\n <span aria-hidden=\"true\">{{ initials() }}</span>\n}\n","export const AvatarSizes = ['sm', 'md', 'lg'] as const;\n\n/** @see {@link AvatarSizes} */\nexport type AvatarSize = typeof AvatarSizes[number];\n","export const BadgeIntents = [\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger'\n] as const;\n\nexport const BadgeAppearances = [\n 'solid',\n 'outline',\n 'soft'\n] as const;\n\nexport const BadgeSizes = [\n 'xs',\n 'sm',\n 'md',\n 'lg'\n] as const;\n\nexport type BadgeIntent = typeof BadgeIntents[number];\nexport type BadgeAppearance = typeof BadgeAppearances[number];\nexport type BadgeSize = typeof BadgeSizes[number];\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport type {\n ButtonAppearance,\n ButtonIntent,\n ButtonSize,\n ButtonType\n} from './button.types';\n\n\n/**\n * A general-purpose button.\n */\n@Component({\n selector: 'ui-button',\n templateUrl: './button.component.html',\n styleUrl: './button.component.css'\n})\nexport class UiButtonComponent {\n readonly appearance = input<ButtonAppearance>('solid');\n readonly intent = input<ButtonIntent>('primary');\n readonly size = input<ButtonSize>('md');\n readonly classes = input<string>('');\n\n readonly type = input<ButtonType>('button');\n readonly ariaLabel = input<string>('');\n\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly loading = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the underlying `<button>` element should be disabled - true when\n * `disabled` is set explicitly, or implicitly while `loading` is true.\n */\n readonly isDisabled = computed(() => this.disabled() || this.loading());\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-button',\n this.intentAndAppearanceClasses(),\n this.sizeClasses(),\n this.textClasses(),\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n private readonly intentAndAppearanceClasses = computed(() => {\n const intent = this.intent();\n const appearance = this.appearance();\n\n return [intent, appearance].includes('none') ?\n '' :\n `ui-button--${intent}-${appearance}`;\n });\n\n private readonly sizeClasses = computed(() => `ui-button--${this.size()}`);\n\n private readonly textClasses = computed(() => ({\n sm: 'ui-text-caption',\n md: 'ui-text-body',\n lg: 'ui-text-body'\n }[this.size()]));\n}\n","<button\n [type]=\"type()\"\n [disabled]=\"isDisabled()\"\n [class]=\"generatedClasses()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-busy]=\"loading() || null\"\n>\n <ng-content></ng-content>\n\n @if (loading()) {\n <span class=\"sr-only\">Loading</span>\n\n <span class=\"flex items-end justify-center\" aria-hidden=\"true\">\n <span class=\"ms-0.5 inline-flex items-end gap-px pb-px\">\n <span class=\"ui-button__loading-dot\">.</span>\n <span class=\"ui-button__loading-dot\">.</span>\n <span class=\"ui-button__loading-dot\">.</span>\n </span>\n </span>\n }\n</button>\n","/**\n * The semantic colour of a button. `\"none\"` opts out of intent/appearance\n * styling entirely - see `UiButtonComponent.intent`.\n */\nexport const ButtonIntents = [\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger',\n 'none'\n] as const;\n\n/**\n * The visual treatment of a button (fill, outline, etc.), combined with its\n * `intent` to select a variant class. `\"none\"` opts out of intent/appearance\n * styling entirely - see `UiButtonComponent.appearance`.\n */\nexport const ButtonAppearances = [\n 'solid',\n 'outline',\n 'ghost',\n 'white',\n 'link',\n 'none'\n] as const;\n\n/** The size of a button, controlling its padding and typography scale. */\nexport const ButtonSizes = [\n 'sm',\n 'md',\n 'lg'\n] as const;\n\n/** The native `type` attribute a button can render with. */\nexport const ButtonTypes = [\n 'button',\n 'submit',\n 'reset'\n] as const;\n\n/** @see {@link ButtonIntents} */\nexport type ButtonIntent = typeof ButtonIntents[number];\n\n/** @see {@link ButtonAppearances} */\nexport type ButtonAppearance = typeof ButtonAppearances[number];\n\n/** @see {@link ButtonSizes} */\nexport type ButtonSize = typeof ButtonSizes[number];\n\n/** @see {@link ButtonTypes} */\nexport type ButtonType = typeof ButtonTypes[number];\n","import { Component, contentChildren } from '@angular/core';\n\nimport { UiButtonComponent } from '../button/button.component';\n\n\n/**\n * @example\n * ```html\n * <ui-button-group>\n * <ui-button intent=\"secondary\" appearance=\"white\">First</ui-button>\n * <ui-button intent=\"secondary\" appearance=\"white\">Second</ui-button>\n * <ui-button intent=\"secondary\" appearance=\"white\">Last</ui-button>\n * </ui-button-group>\n * ```\n */\n@Component({\n selector: 'ui-button-group',\n template: '<ng-content></ng-content>',\n host: { class: 'inline-flex' }\n})\nexport class UiButtonGroupComponent {\n readonly buttons = contentChildren(UiButtonComponent, {\n descendants: false\n });\n}\n","import type { IsoDate, IsoDateTime } from './calendar.types';\n\n\nconst ISO_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst TIME_PATTERN = /^([01]\\d|2[0-3]):([0-5]\\d)$/;\n\n// dates are built from local parts so a timezone never shifts the day\nexport function toIsoDate(date: Date): IsoDate {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n}\n\n/** Local midnight for an ISO date, or null when it isn't a real date. */\nexport function parseIsoDate(value: IsoDate | null | undefined): Date | null {\n const match = value ? ISO_PATTERN.exec(value) : null;\n\n if (!match) {\n return null;\n }\n\n const [, year, month, day] = match.map(Number);\n const date = new Date(year, month - 1, day);\n\n // rejects things like 2026-02-31 rolling over into March\n return date.getMonth() === month - 1 ? date : null;\n}\n\nexport function addDays(date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\n}\n\n/** Moves by whole months, keeping the day where it can (31 Jan + 1 -> 28 Feb). */\nexport function addMonths(date: Date, months: number): Date {\n const target = new Date(date.getFullYear(), date.getMonth() + months, 1);\n const lastDay = daysInMonth(target.getFullYear(), target.getMonth());\n\n target.setDate(Math.min(date.getDate(), lastDay));\n\n return target;\n}\n\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\n/** Local date and time for \"2026-09-29T14:30\", a date-only string gives midnight. */\nexport function parseIsoDateTime(\n value: IsoDateTime | null | undefined\n): Date | null {\n const date = parseIsoDate(value?.slice(0, 10));\n const time = parseTime(value?.slice(11, 16));\n\n if (date && time) {\n date.setHours(time.hours, time.minutes);\n }\n\n return date;\n}\n\n/** \"14:30\" -> { hours: 14, minutes: 30 }, or null when it isn't a real time. */\nexport function parseTime(\n value: string | null | undefined\n): { hours: number; minutes: number } | null {\n const match = value ? TIME_PATTERN.exec(value) : null;\n\n return match ? { hours: Number(match[1]), minutes: Number(match[2]) } : null;\n}\n\nexport function toTime(hours: number, minutes: number): string {\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;\n}\n","import {\n afterNextRender,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n linkedSignal,\n model,\n signal\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroChevronLeft, heroChevronRight } from '@ng-icons/heroicons/outline';\n\nimport { UiSelectComponent } from '../../forms/select/select.component';\nimport { SelectLocalDataSource } from '../../forms/select/select.datasource';\nimport type {\n CalendarDay,\n CalendarMode,\n DateRange,\n IsoDate,\n WeekStart\n} from './calendar.types';\nimport { addDays, addMonths, parseIsoDate, toIsoDate } from './calendar.utils';\n\n\n// always six rows so the calendar doesn't jump in height between months\nconst GRID_DAYS = 42;\nconst YEARS_BACK = 100;\nconst YEARS_FORWARD = 10;\n\n@Component({\n selector: 'ui-calendar',\n templateUrl: './calendar.component.html',\n styleUrl: './calendar.component.css',\n imports: [NgIcon, UiSelectComponent],\n providers: [provideIcons({ heroChevronLeft, heroChevronRight })]\n})\nexport class UiCalendarComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n readonly mode = input<CalendarMode>('single');\n\n /** The picked date in single mode. */\n readonly value = model<IsoDate | null>(null);\n\n /** The picked start and end in range mode. */\n readonly range = model<DateRange>({ start: null, end: null });\n\n readonly min = input<IsoDate | null>(null);\n readonly max = input<IsoDate | null>(null);\n readonly isDateDisabled = input<(date: IsoDate) => boolean>(() => false);\n\n readonly weekStart = input<WeekStart>(1);\n readonly locale = input<string>('en-GB');\n\n protected readonly today = toIsoDate(new Date());\n\n // a string so picking a range end doesn't count as a change and jump the view\n private readonly anchorDate = computed(() =>\n this.mode() === 'range' ? this.range().start : this.value()\n );\n\n // the date keyboard focus sits on, follows the anchor until the user moves it\n private readonly activeDate = linkedSignal(\n () => parseIsoDate(this.anchorDate()) ?? parseIsoDate(this.today)!\n );\n\n // previews the end of a half picked range\n private readonly hoveredDate = signal<IsoDate | null>(null);\n\n protected readonly viewMonth = linkedSignal(() =>\n this.activeDate().getMonth()\n );\n protected readonly viewYear = linkedSignal(() =>\n this.activeDate().getFullYear()\n );\n\n protected readonly monthNames = computed(() => {\n const format = new Intl.DateTimeFormat(this.locale(), {\n month: 'long'\n });\n\n return Array.from(\n { length: 12 },\n (_, month) => format.format(new Date(2026, month, 1))\n );\n });\n\n protected readonly weekdays = computed(() => {\n const format = new Intl.DateTimeFormat(this.locale(), {\n weekday: 'short'\n });\n\n // 4 Jan 2026 is a Sunday\n return Array.from(\n { length: 7 },\n (_, index) =>\n format.format(\n new Date(2026, 0, 4 + (this.weekStart() + index) % 7)\n )\n .slice(0, 2)\n );\n });\n\n protected readonly monthSource = computed(() =>\n new SelectLocalDataSource(\n Array.from({ length: 12 }, (_, month) => month),\n () => true\n )\n );\n\n protected readonly yearSource = computed(() => {\n const current = new Date().getFullYear();\n const selected = parseIsoDate(this.anchorDate())?.getFullYear() ??\n current;\n const first = parseIsoDate(this.min())?.getFullYear() ??\n Math.min(current - YEARS_BACK, selected);\n const last = parseIsoDate(this.max())?.getFullYear() ??\n Math.max(current + YEARS_FORWARD, selected);\n\n // newest first, recent years are what people usually want\n const years = Array.from(\n { length: last - first + 1 },\n (_, index) => last - index\n );\n\n return new SelectLocalDataSource(years, () => true);\n });\n\n protected readonly displayMonth = (month: number) =>\n this.monthNames()[month];\n\n protected readonly days = computed<CalendarDay[]>(() => {\n const year = this.viewYear();\n const month = this.viewMonth();\n const { start, end, previewEnd } = this.rangeBounds();\n const labelFormat = new Intl.DateTimeFormat(this.locale(), {\n dateStyle: 'full'\n });\n\n const first = new Date(year, month, 1);\n const offset = (first.getDay() - this.weekStart() + 7) % 7;\n const gridStart = addDays(first, -offset);\n\n return Array.from({ length: GRID_DAYS }, (_, index) => {\n const date = addDays(gridStart, index);\n const iso = toIsoDate(date);\n\n return {\n iso,\n day: date.getDate(),\n label: labelFormat.format(date),\n isOutside: date.getMonth() !== month,\n isToday: iso === this.today,\n isSelected: iso === start || iso === end,\n isDisabled: this.isUnavailable(iso),\n isInRange: !!start &&\n !!previewEnd &&\n iso > start &&\n iso < previewEnd,\n isRangeStart: !!previewEnd &&\n iso === start &&\n start !== previewEnd,\n isRangeEnd: !!start &&\n iso === previewEnd &&\n start !== previewEnd\n };\n });\n });\n\n private readonly rangeBounds = computed(() => {\n if (this.mode() === 'single') {\n return { start: this.value(), end: null, previewEnd: null };\n }\n\n const { start, end } = this.range();\n const hovered = this.hoveredDate();\n const preview = !end && start && hovered && hovered > start\n ? hovered\n : null;\n\n return { start, end, previewEnd: end ?? preview };\n });\n\n /** Only one day is tabbable, arrow keys move between the rest. */\n protected readonly tabbableDate = computed(() => {\n const active = this.activeDate();\n const inView = active.getFullYear() === this.viewYear() &&\n active.getMonth() === this.viewMonth();\n\n return toIsoDate(\n inView ? active : new Date(this.viewYear(), this.viewMonth(), 1)\n );\n });\n\n protected readonly canGoBack = computed(() => {\n const min = this.min();\n const lastOfPrevious = new Date(this.viewYear(), this.viewMonth(), 0);\n\n return !min || toIsoDate(lastOfPrevious) >= min;\n });\n\n protected readonly canGoForward = computed(() => {\n const max = this.max();\n const firstOfNext = new Date(this.viewYear(), this.viewMonth() + 1, 1);\n\n return !max || toIsoDate(firstOfNext) <= max;\n });\n\n /** Moves focus onto the active day, e.g. when a datepicker opens. */\n focusActiveDate(): void {\n this.host.nativeElement\n .querySelector<HTMLButtonElement>(\n `[data-date=\"${this.tabbableDate()}\"]`\n )\n ?.focus();\n }\n\n protected showMonth(offset: number): void {\n const target = new Date(this.viewYear(), this.viewMonth() + offset, 1);\n\n this.viewYear.set(target.getFullYear());\n this.viewMonth.set(target.getMonth());\n }\n\n protected select(day: CalendarDay): void {\n if (day.isDisabled) {\n return;\n }\n\n if (this.mode() === 'single') {\n this.value.set(day.iso);\n return;\n }\n\n const { start, end } = this.range();\n\n // a fresh click starts over, picking before the start moves the start\n if (!start || end || day.iso < start) {\n this.range.set({ start: day.iso, end: null });\n } else {\n this.range.set({ start, end: day.iso });\n }\n }\n\n protected preview(date: IsoDate | null): void {\n if (this.mode() === 'range') {\n this.hoveredDate.set(date);\n }\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n const current = parseIsoDate(this.tabbableDate())!;\n const target = this.keyTarget(event, current);\n\n if (!target) {\n return;\n }\n\n event.preventDefault();\n\n this.activeDate.set(target);\n this.viewYear.set(target.getFullYear());\n this.viewMonth.set(target.getMonth());\n\n afterNextRender(() => this.focusActiveDate(), {\n injector: this.injector\n });\n }\n\n private keyTarget(event: KeyboardEvent, current: Date): Date | null {\n const dayOfWeek = (current.getDay() - this.weekStart() + 7) % 7;\n\n switch (event.key) {\n case 'ArrowLeft':\n return addDays(current, -1);\n case 'ArrowRight':\n return addDays(current, 1);\n case 'ArrowUp':\n return addDays(current, -7);\n case 'ArrowDown':\n return addDays(current, 7);\n case 'Home':\n return addDays(current, -dayOfWeek);\n case 'End':\n return addDays(current, 6 - dayOfWeek);\n case 'PageUp':\n return addMonths(current, event.shiftKey ? -12 : -1);\n case 'PageDown':\n return addMonths(current, event.shiftKey ? 12 : 1);\n default:\n return null;\n }\n }\n\n private isUnavailable(iso: IsoDate): boolean {\n const min = this.min();\n const max = this.max();\n\n // ISO dates sort the same as strings\n return (!!min && iso < min) ||\n (!!max && iso > max) ||\n this.isDateDisabled()(iso);\n }\n}\n","<div class=\"ui-calendar-header\">\n <button\n type=\"button\"\n class=\"ui-calendar-nav\"\n aria-label=\"Previous month\"\n [disabled]=\"!canGoBack()\"\n (click)=\"showMonth(-1)\"\n >\n <ng-icon name=\"heroChevronLeft\" class=\"shrink-0\" />\n </button>\n\n <div class=\"ui-calendar-selects\">\n <ui-select\n class=\"ui-calendar-month\"\n [dataSource]=\"monthSource()\"\n [displayWith]=\"displayMonth\"\n [pageSize]=\"12\"\n [(selectedItem)]=\"viewMonth\"\n />\n <ui-select\n class=\"ui-calendar-year\"\n [dataSource]=\"yearSource()\"\n [pageSize]=\"500\"\n [(selectedItem)]=\"viewYear\"\n />\n </div>\n\n <button\n type=\"button\"\n class=\"ui-calendar-nav\"\n aria-label=\"Next month\"\n [disabled]=\"!canGoForward()\"\n (click)=\"showMonth(1)\"\n >\n <ng-icon name=\"heroChevronRight\" class=\"shrink-0\" />\n </button>\n</div>\n\n<div class=\"ui-calendar-weekdays\" aria-hidden=\"true\">\n @for (weekday of weekdays(); track $index) {\n <span class=\"ui-calendar-weekday ui-text-caption\">{{ weekday }}</span>\n }\n</div>\n\n<div class=\"ui-calendar-grid\" (mouseleave)=\"preview(null)\">\n @for (day of days(); track day.iso) {\n <button\n type=\"button\"\n class=\"ui-calendar-day ui-text-body-alt\"\n [attr.data-date]=\"day.iso\"\n [attr.data-outside]=\"day.isOutside ? '' : null\"\n [attr.data-today]=\"day.isToday ? '' : null\"\n [attr.data-in-range]=\"day.isInRange ? '' : null\"\n [attr.data-range-start]=\"day.isRangeStart ? '' : null\"\n [attr.data-range-end]=\"day.isRangeEnd ? '' : null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-pressed]=\"day.isSelected\"\n [attr.aria-label]=\"day.label\"\n [tabindex]=\"day.iso === tabbableDate() ? 0 : -1\"\n [attr.aria-disabled]=\"day.isDisabled || null\"\n (click)=\"select(day)\"\n (keydown)=\"handleKeydown($event)\"\n (mouseenter)=\"preview(day.iso)\"\n (focus)=\"preview(day.iso)\"\n >\n {{ day.day }}\n </button>\n }\n</div>\n","/** Which day each calendar row starts on. 0 is Sunday, 1 is Monday. */\nexport const WeekStarts = [0, 1] as const;\n\n/** @see {@link WeekStarts} */\nexport type WeekStart = typeof WeekStarts[number];\n\n/** A date-only ISO string, e.g. \"2026-09-29\". */\nexport type IsoDate = string;\n\nexport interface CalendarDay {\n iso: IsoDate;\n day: number;\n label: string;\n isOutside: boolean;\n isToday: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n isInRange: boolean;\n isRangeStart: boolean;\n isRangeEnd: boolean;\n}\n\n/** A local date and time ISO string, e.g. \"2026-09-29T14:30\". */\nexport type IsoDateTime = string;\n\n/** Whether a calendar picks one date or a start and end. */\nexport const CalendarModes = ['single', 'range'] as const;\n\n/** @see {@link CalendarModes} */\nexport type CalendarMode = typeof CalendarModes[number];\n\nexport interface DateRange {\n start: IsoDate | null;\n end: IsoDate | null;\n}\n","import { Component, input } from '@angular/core';\n\nimport type { CardHeadingLevel } from './card-header.types';\n\n\n@Component({\n selector: 'ui-card-header',\n templateUrl: './card-header.component.html',\n host: { class: 'block' }\n})\nexport class UiCardHeaderComponent {\n // not `title`, that would also show the native tooltip\n readonly heading = input.required<string>();\n readonly subtitle = input<string>('');\n\n /** Pick the level that fits the page's outline, it doesn't change the look. */\n readonly headingLevel = input<CardHeadingLevel>(2);\n}\n","<header class=\"flex flex-wrap justify-between items-start gap-x-4 gap-y-3 mb-4\">\n <div class=\"min-w-0\">\n @switch (headingLevel()) {\n @case (3) {\n <h3 class=\"text-foreground ui-text-h4\">{{ heading() }}</h3>\n }\n @case (4) {\n <h4 class=\"text-foreground ui-text-h4\">{{ heading() }}</h4>\n }\n @default {\n <h2 class=\"text-foreground ui-text-h4\">{{ heading() }}</h2>\n }\n }\n\n @if (subtitle()) {\n <p class=\"mt-1 text-muted-foreground-1 ui-text-body-alt\">{{ subtitle() }}</p>\n }\n </div>\n\n <div class=\"flex flex-wrap empty:hidden items-center gap-2\"><ng-content /></div>\n</header>\n","export const CardHeadingLevels = [2, 3, 4] as const;\n\n/** @see {@link CardHeadingLevels} */\nexport type CardHeadingLevel = typeof CardHeadingLevels[number];\n","import { Component } from '@angular/core';\n\n\n@Component({\n selector: 'ui-container',\n template: '<ng-content></ng-content>',\n host: { class: 'block container' }\n})\nexport class UiContainerComponent {}\n","import { Component, model } from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroXMark } from '@ng-icons/heroicons/outline';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\n@Component({\n selector: 'ui-modal-close-btn',\n templateUrl: './modal-close-btn.component.html',\n imports: [UiButtonComponent, NgIcon],\n providers: [provideIcons({ heroXMark })]\n})\nexport class UiModalCloseButtonComponent {\n readonly isOpen = model.required<boolean>();\n}\n","<ui-button\n appearance=\"white\"\n intent=\"secondary\"\n classes=\"p-2! border-transparent! shadow-none!\"\n (click)=\"isOpen.set(false)\"\n>\n <ng-icon name=\"heroXMark\" strokeWidth=\"2.5\" />\n</ui-button>\n","import { booleanAttribute, Component, input, signal } from '@angular/core';\n\nimport { UiModalCloseButtonComponent } from '../../presets/modal-close-btn/modal-close-btn.component';\n\n\n@Component({\n selector: 'ui-drawer',\n templateUrl: './drawer.component.html',\n styleUrl: './drawer.component.css',\n imports: [UiModalCloseButtonComponent],\n host: { '[class.open]': 'isOpen()' }\n})\nexport class UiDrawerComponent {\n readonly isOpen = signal<boolean>(false);\n readonly enableBackdrop = input(true, { transform: booleanAttribute });\n\n readonly label = input<string>('');\n readonly subLabel = input<string>('');\n}\n","@if (enableBackdrop()) {\n <div\n class=\"absolute inset-0 bg-black/10 transition-opacity\"\n [class.opacity-0]=\"!isOpen()\"\n [class.pointer-events-none]=\"!isOpen()\"\n aria-hidden=\"true\"\n (click)=\"isOpen.set(false)\"\n >\n </div>\n}\n\n<aside\n class=\"right-0 absolute inset-y-0 bg-layer border-line-2 border-s w-100 max-w-full h-full transition-transform duration-200\"\n [class.translate-x-full]=\"!isOpen()\"\n>\n <div class=\"flex flex-col h-full\">\n <header\n class=\"flex justify-between px-5 py-2.5 border-line-2 border-b\"\n [class.items-start]=\"subLabel()\"\n [class.items-center]=\"!subLabel()\"\n >\n <div>\n <h3 class=\"font-semibold ui-text-h3\">{{ label() }}</h3>\n\n @if (subLabel()) {\n <h4 class=\"ui-text-body\">{{ subLabel() }}</h4>\n }\n </div>\n <div class=\"flex items-center gap-x-3 shrink-0\">\n <ng-content select=\"[drawer-actions]\" />\n <ui-modal-close-btn [(isOpen)]=\"isOpen\" />\n </div>\n </header>\n\n <div class=\"p-5 overflow-y-auto grow\">\n <ng-content />\n </div>\n </div>\n</aside>\n","import {\n Component,\n computed,\n ElementRef,\n inject,\n input,\n signal,\n viewChild,\n WritableSignal\n} from '@angular/core';\n\nimport { Placement } from '@floating-ui/dom';\n\nimport { UiOverlayComponent } from '../../layout/overlay/overlay.component';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiTooltipTrigger } from './tooltip.types';\n\n\n@Component({\n selector: 'ui-tooltip',\n exportAs: 'uiTooltip',\n templateUrl: './tooltip.component.html',\n styleUrl: './tooltip.component.css',\n imports: [UiOverlayComponent],\n host: {\n class: 'inline-flex size-fit',\n '(mouseenter)': 'onHover(true)',\n '(mouseleave)': 'onHover(false)',\n '(focusin)': 'onFocus(true)',\n '(focusout)': 'onFocus(false)',\n '(click)': 'onClick()'\n }\n})\nexport class UiTooltipComponent {\n protected readonly anchor = inject(ElementRef<HTMLElement>);\n protected readonly content = viewChild('content', { read: ElementRef });\n\n readonly text = input.required<string>();\n readonly placement = input<Placement>('top');\n readonly trigger = input<UiTooltipTrigger>('hover');\n readonly classes = input<string>('');\n\n readonly isOpen = input<WritableSignal<boolean>>(signal(false));\n\n protected readonly closeBehaviour = computed<UiOverlayCloseBehaviour>(() =>\n this.trigger() === 'click'\n ? 'whenClickOutside'\n : 'none'\n );\n\n protected readonly generatedClasses = computed(() =>\n ['ui-tooltip', 'ui-text-caption', this.classes()]\n .filter(Boolean)\n .join(' ')\n );\n\n protected onHover(isHovering: boolean) {\n if (this.trigger() === 'hover') {\n this.isOpen().set(isHovering);\n }\n }\n\n // Hover also listens to focus so keyboard users still get the tooltip\n protected onFocus(isFocused: boolean) {\n if (['hover', 'focus'].includes(this.trigger())) {\n this.isOpen().set(isFocused);\n }\n }\n\n protected onClick() {\n if (this.trigger() === 'click') {\n this.isOpen().update(value => !value);\n }\n }\n}\n","<ui-overlay\n [isOpen]=\"isOpen()\"\n [closeBehaviour]=\"closeBehaviour()\"\n [content]=\"content()\"\n [anchor]=\"anchor\"\n [placement]=\"placement()\"\n>\n <ng-content />\n\n @if (isOpen()()) {\n <div #content class=\"p-1.5\" style=\"position: fixed; z-index: 60\">\n <div role=\"tooltip\" [class]=\"generatedClasses()\">{{ text() }}</div>\n </div>\n }\n</ui-overlay>\n","import { Component, input } from '@angular/core';\n\nimport { IconName, NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroQuestionMarkCircle } from '@ng-icons/heroicons/outline';\n\nimport { UiCardComponent } from '../card/card.component';\nimport { UiTooltipComponent } from '../tooltip/tooltip.component';\n\n\n@Component({\n selector: 'ui-kpi',\n templateUrl: './kpi.component.html',\n imports: [UiCardComponent, NgIcon, UiTooltipComponent],\n host: { class: 'block' },\n providers: [provideIcons({ heroQuestionMarkCircle })]\n})\nexport class UiKpiComponent {\n readonly label = input<string>('');\n readonly value = input<string>('');\n readonly hint = input<string>('');\n readonly icon = input<IconName>();\n readonly iconPosition = input<'left' | 'right'>('left');\n}\n","<ui-card radius=\"xl\" class=\"h-full\">\n <div class=\"flex gap-x-4 p-4 md:p-5\">\n @if (icon() && iconPosition() === 'left') {\n <div class=\"flex justify-center items-center bg-surface rounded-lg size-12 shrink-0\">\n <ng-icon\n [name]=\"icon()\"\n size=\"32\"\n class=\"size-8 text-muted-foreground-2 shrink-0\"\n strokeWidth=\"1.5\"\n />\n </div>\n }\n\n <div class=\"grow\">\n <div class=\"flex items-center gap-x-2 text-muted-foreground-2\">\n <span class=\"font-semibold ui-text-h4 text-sm uppercase\">\n {{ label() }}\n </span>\n\n @if (hint()) {\n <ui-tooltip\n [text]=\"hint()\"\n placement=\"top\"\n trigger=\"hover\"\n >\n <ng-icon name=\"heroQuestionMarkCircle\" size=\"18\" />\n </ui-tooltip>\n }\n </div>\n\n <div class=\"flex flex-wrap items-center gap-2 mt-1\">\n <h3 class=\"font-semibold text-foreground ui-text-h2\">\n <!-- falls back to the plain value when nothing is projected -->\n <ng-content select=\"[kpi-value]\">{{ value() }}</ng-content>\n </h3>\n <ng-content select=\"[kpi-badge]\"></ng-content>\n </div>\n </div>\n\n @if (icon() && iconPosition() === 'right') {\n <div class=\"flex justify-center items-center bg-surface rounded-lg size-12 shrink-0\">\n <ng-icon\n [name]=\"icon()\"\n size=\"32\"\n class=\"size-8 text-muted-foreground-2 shrink-0\"\n strokeWidth=\"1.5\"\n />\n </div>\n }\n </div>\n</ui-card>\n","import { Component, computed, input } from '@angular/core';\n\nimport { UiLoadingType } from './loading.types';\n\n\nconst TEXT_TYPES: UiLoadingType[] = [\n 'blinking-caret',\n 'shimmer-text',\n 'loading-dots'\n];\n\n@Component({\n selector: 'ui-loading',\n templateUrl: './loading.component.html',\n styleUrl: './loading.component.css'\n})\nexport class UiLoadingComponent {\n readonly type = input<UiLoadingType>('spinner');\n\n protected readonly hasText = computed(() =>\n TEXT_TYPES.includes(this.type())\n );\n\n protected readonly throbberSpokes = Array.from({ length: 12 }, (_, i) => i);\n}\n","<div class=\"ui-loading\" role=\"status\">\n @switch (type()) {\n @case ('throbber') {\n <svg\n class=\"ui-loading--throbber\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n @for (i of throbberSpokes; track i) {\n <line\n x1=\"12\"\n y1=\"2.5\"\n x2=\"12\"\n y2=\"7\"\n [attr.transform]=\"'rotate(' + i * (360 / throbberSpokes.length) + ' 12 12)'\"\n [style.animation-delay.s]=\"i / throbberSpokes.length - 1\"\n />\n }\n </svg>\n }\n @case ('pulse-ring') {\n <span\n class=\"ui-loading--pulse-ring ui-loading--pulse\"\n aria-hidden=\"true\"\n ></span>\n }\n @case ('pulse-dot') {\n <span\n class=\"ui-loading--pulse ui-loading--pulse-dot\"\n aria-hidden=\"true\"\n ></span>\n }\n @case ('wave') {\n <span\n class=\"ui-loading--row ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3, 4, 5]; track i) {\n <span class=\"ui-loading--bar\"></span>\n }\n </span>\n }\n @case ('equaliser') {\n <span\n class=\"ui-loading--row ui-loading--stagger ui-loading--bars\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3, 4, 5]; track i) {\n <span class=\"ui-loading--bar\"></span>\n }\n </span>\n }\n @case ('terminal') {\n <span class=\"ui-loading--prompt\" aria-hidden=\"true\">></span>\n <span class=\"ui-loading--caret\" aria-hidden=\"true\"></span>\n }\n @case ('blinking-caret') {\n <span>Loading</span>\n <span class=\"ui-loading--caret\" aria-hidden=\"true\"></span>\n }\n @case ('shimmer-text') {\n <span class=\"ui-loading--shimmer\">Loading</span>\n }\n @case ('loading-dots') {\n <span>Loading</span>\n <span\n class=\"ui-loading--text-dots ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3]; track i) {\n <span class=\"ui-loading--text-dot\">.</span>\n }\n </span>\n }\n @case ('bouncing-dots') {\n <span\n class=\"ui-loading--row ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3]; track i) {\n <span class=\"ui-loading--dot ui-loading--dot-bounce\"></span>\n }\n </span>\n }\n @case ('fading-dots') {\n <span\n class=\"ui-loading--row ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3]; track i) {\n <span class=\"ui-loading--dot ui-loading--dot-fade\"></span>\n }\n </span>\n }\n @default {\n <span class=\"ui-loading--spinner\" aria-hidden=\"true\"></span>\n }\n }\n\n @if (!hasText()) {\n <span class=\"sr-only\">Loading</span>\n }\n</div>\n","export const UI_LOADING_TYPES = [\n 'spinner',\n 'throbber',\n 'pulse-ring',\n 'pulse-dot',\n 'wave',\n 'equaliser',\n 'terminal',\n 'blinking-caret',\n 'shimmer-text',\n 'loading-dots',\n 'bouncing-dots',\n 'fading-dots'\n] as const satisfies string[];\n\nexport type UiLoadingType = typeof UI_LOADING_TYPES[number];\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n contentChild,\n ElementRef,\n input,\n model,\n TemplateRef,\n viewChild\n} from '@angular/core';\n\nimport { UiOverlayComponent } from '../../layout/overlay/overlay.component';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiModalCloseButtonComponent } from '../../presets/modal-close-btn/modal-close-btn.component';\nimport { UiCardComponent } from '../card/card.component';\nimport { ModalSize } from './modal.types';\n\n\n@Component({\n selector: 'ui-modal',\n templateUrl: './modal.component.html',\n styleUrl: './modal.component.css',\n imports: [\n UiOverlayComponent,\n UiModalCloseButtonComponent,\n NgTemplateOutlet,\n UiCardComponent\n ]\n})\nexport class UiModalComponent {\n readonly isOpen = model.required<boolean>();\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickOutside'\n );\n readonly title = input<string>('');\n readonly size = input<ModalSize>('md');\n readonly classes = input<string>('');\n\n readonly headerElement = contentChild<TemplateRef<unknown>>(\n 'header',\n { descendants: false }\n );\n readonly footerElement = contentChild<TemplateRef<unknown>>(\n 'footer',\n { descendants: false }\n );\n readonly panelElement = viewChild(\n 'panel',\n { read: ElementRef<HTMLElement> }\n );\n\n readonly generatedClasses = computed<string>(() =>\n [\n 'ui-modal',\n `ui-modal--${this.size()}`,\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","@if (isOpen()) {\n <div\n class=\"group z-50 fixed inset-0 flex justify-center items-center bg-black/40 starting:opacity-0 p-4 transition-opacity duration-150 ease-out\"\n animate.leave=\"fs-modal--leaving opacity-0\"\n >\n <ui-overlay\n [isOpen]=\"isOpen\"\n [closeBehaviour]=\"closeBehaviour()\"\n [content]=\"panelElement()\"\n tabIndex=\"-1\"\n role=\"dialog\"\n aria-modal=\"true\"\n class=\"block max-w-full starting:scale-95 group-[.fs-modal--leaving]:scale-95 transition duration-150 ease-out\"\n >\n <ui-card #panel radius=\"xl\" [class]=\"generatedClasses()\">\n <div class=\"flex flex-col max-h-[calc(100dvh-2rem-2px)]\">\n <header class=\"flex justify-between items-center gap-x-5 p-5 border-neutral border-b shrink-0\">\n @if (headerElement()) {\n <ng-container *ngTemplateOutlet=\"headerElement()\" />\n } @else {\n <span class=\"ui-text-h3\">{{ title() }}</span>\n <ui-modal-close-btn [(isOpen)]=\"isOpen\" />\n }\n </header>\n <div class=\"flex-1 min-h-0 overflow-auto\">\n <ng-content />\n </div>\n\n @if (footerElement()) {\n <footer class=\"flex justify-end items-center gap-2.5 p-5 shrink-0\">\n <ng-container *ngTemplateOutlet=\"footerElement()\" />\n </footer>\n }\n </div>\n </ui-card>\n </ui-overlay>\n </div>\n}\n","import { booleanAttribute, Component, computed, inject, input } from '@angular/core';\n\nimport { UI_FORMAT } from '../../format/format';\nimport { maskMoney, UI_PRIVACY } from '../../format/privacy';\nimport type { MoneySignDisplay } from './money.types';\n\n\n/**\n * Formats a money value, e.g. -42.1 as \"-£42.10\".\n */\n@Component({\n selector: 'ui-money',\n templateUrl: './money.component.html',\n styleUrl: './money.component.css',\n host: {\n '[class]': 'generatedClasses()',\n '[attr.title]': 'title()'\n }\n})\nexport class UiMoneyComponent {\n private readonly defaults = inject(UI_FORMAT);\n private readonly privacy = inject(UI_PRIVACY);\n\n readonly value = input.required<number | null>();\n\n /** Defaults to the currency from `provideUiFormat`. */\n readonly currency = input<string>(this.defaults.currency);\n\n /** Defaults to the locale from `provideUiFormat`. */\n readonly locale = input<string>(this.defaults.locale);\n readonly signDisplay = input<MoneySignDisplay>('auto');\n\n /** Green for money in, red for money out. */\n readonly colourBySign = input(false, { transform: booleanAttribute });\n\n /** Rounds to whole units, e.g. \"£2,235\" for headline figures where pence are noise. */\n readonly wholeUnits = input(false, { transform: booleanAttribute });\n\n /** Short form like \"£12K\", the full amount goes in the title. */\n readonly compact = input(false, { transform: booleanAttribute });\n\n /** Shown when there's no value. */\n readonly placeholder = input<string>('-');\n\n // -0 would otherwise format as \"-£0.00\"\n private readonly amount = computed(() => {\n const value = this.value();\n\n return value === null || Number.isNaN(value) ? null : value || 0;\n });\n\n protected readonly masked = computed(() => this.privacy() !== 'visible' && this.amount() !== null);\n\n protected readonly mask = computed(() => maskMoney(this.currency(), this.locale()));\n\n protected readonly formatted = computed(() => {\n const amount = this.amount();\n\n return amount === null ? this.placeholder() : this.format(amount, this.compact());\n });\n\n protected readonly title = computed(() => {\n const amount = this.amount();\n\n return this.compact() && amount !== null && !this.masked() ? this.format(amount, false) : null;\n });\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-money',\n this.signClass()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n private readonly signClass = computed(() => {\n const amount = this.amount();\n\n if (!this.colourBySign() || amount === null || this.privacy() === 'hidden') {\n return '';\n }\n\n if (amount > 0) {\n return 'ui-money--positive';\n }\n\n return amount < 0 ? 'ui-money--negative' : '';\n });\n\n private format(amount: number, compact: boolean): string {\n return new Intl.NumberFormat(this.locale(), {\n style: 'currency',\n currency: this.currency(),\n signDisplay: this.signDisplay(),\n notation: compact ? 'compact' : 'standard',\n ...(this.wholeUnits() && { minimumFractionDigits: 0, maximumFractionDigits: 0 })\n }).format(amount);\n }\n}\n","@if (masked()) {\n <span aria-hidden=\"true\">{{ mask() }}</span>\n <span class=\"sr-only\">amount hidden</span>\n} @else {{{ formatted() }}}\n","/** Intl signDisplay values, controls when a + or - is shown. */\nexport const MoneySignDisplays = [\n 'auto',\n 'always',\n 'exceptZero',\n 'never'\n] as const;\n\n/** @see {@link MoneySignDisplays} */\nexport type MoneySignDisplay = typeof MoneySignDisplays[number];\n","import { Component, computed, input, model } from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroChevronLeft, heroChevronRight } from '@ng-icons/heroicons/outline';\n\nimport { UiButtonComponent } from '../button/button.component';\nimport type { PaginationItem } from './pagination.types';\n\n\n@Component({\n selector: 'ui-pagination',\n templateUrl: './pagination.component.html',\n styleUrl: './pagination.component.css',\n imports: [UiButtonComponent, NgIcon],\n host: {\n role: 'navigation',\n 'aria-label': 'Pagination',\n class: 'ui-pagination'\n },\n providers: [provideIcons({ heroChevronLeft, heroChevronRight })]\n})\nexport class UiPaginationComponent {\n // zero-based, same as the table\n readonly page = model<number>(0);\n readonly totalPages = input.required<number>();\n\n readonly isFirstPage = computed(() => this.page() <= 0);\n readonly isLastPage = computed(() => this.page() >= this.totalPages() - 1);\n\n // first, last and the pages either side of the current one, with gaps collapsed\n readonly items = computed(() => {\n const total = this.totalPages();\n const current = this.page();\n const items: PaginationItem[] = [];\n\n for (let i = 0; i < total; i++) {\n const isEdge = i === 0 || i === total - 1;\n const isNearCurrent = Math.abs(i - current) <= 1;\n\n // no point hiding a single page behind an ellipsis\n const hidesOnePage = (i === 1 && current === 3) ||\n (i === total - 2 && current === total - 4);\n\n if (isEdge || isNearCurrent || hidesOnePage) {\n items.push(i);\n } else if (items.at(-1) !== 'ellipsis') {\n items.push('ellipsis');\n }\n }\n\n return items;\n });\n\n pageLabel(page: number): string {\n const label = `Page ${page + 1}`;\n\n return page === this.page() ? `${label}, current page` : label;\n }\n\n goToPage(page: number): void {\n if (page < 0 || page >= this.totalPages()) {\n return;\n }\n\n this.page.set(page);\n }\n}\n","<ui-button\n appearance=\"none\"\n classes=\"ui-pagination--goto-btn ui-text-body\"\n [disabled]=\"isFirstPage()\"\n (click)=\"goToPage(page() - 1)\"\n>\n <ng-icon name=\"heroChevronLeft\" class=\"shrink-0\" />\n</ui-button>\n\n@for (item of items(); track $index) {\n @if (item === 'ellipsis') {\n <span class=\"ui-text-body ui-pagination-ellipsis\">…</span>\n } @else {\n <ui-button\n appearance=\"none\"\n classes=\"ui-pagination--goto-btn ui-text-body\"\n [class.active]=\"item === page()\"\n (click)=\"goToPage(item)\"\n >\n {{ item + 1 }}\n </ui-button>\n }\n}\n\n<ui-button\n appearance=\"none\"\n classes=\"ui-pagination--goto-btn ui-text-body\"\n [disabled]=\"isLastPage()\"\n (click)=\"goToPage(page() + 1)\"\n>\n <ng-icon name=\"heroChevronRight\" class=\"shrink-0\" />\n</ui-button>\n","import { Component, computed, input } from '@angular/core';\n\nimport type {\n ProgressIntent,\n ProgressLabelPosition,\n ProgressOrientation,\n ProgressSegment,\n ProgressShape,\n ProgressSize\n} from './progress.types';\n\n\ninterface SegmentView {\n percent: number;\n intent: ProgressIntent;\n label: string;\n}\n\n/**\n * A progress bar. Leave `value` null for work of unknown length, a value over\n * `max` fills the bar but the label still shows the real amount.\n */\n@Component({\n selector: 'ui-progress',\n templateUrl: './progress.component.html',\n styleUrl: './progress.component.css',\n host: {\n '[class.ui-progress-host--vertical]': 'orientation() === \"vertical\"'\n }\n})\nexport class UiProgressComponent {\n readonly value = input<number | null>(0);\n readonly max = input<number>(100);\n\n readonly intent = input<ProgressIntent>('primary');\n readonly size = input<ProgressSize>('md');\n readonly shape = input<ProgressShape>('rounded');\n readonly orientation = input<ProgressOrientation>('horizontal');\n\n readonly title = input<string>('');\n readonly labelPosition = input<ProgressLabelPosition>('none');\n readonly labelWith = input<(value: number, max: number) => string>(\n (value, max) => `${Math.round(value / max * 100)}%`\n );\n\n /** Splits the bar into this many blocks. */\n readonly steps = input<number | null>(null);\n\n /** Several fills stacked in one track, each with its own colour. */\n readonly segments = input<ProgressSegment[] | null>(null);\n\n /** Needed when there's no visible title. */\n readonly ariaLabel = input<string>('');\n\n protected readonly isIndeterminate = computed(() => this.value() === null && !this.segments());\n\n protected readonly total = computed(() => {\n const segments = this.segments();\n\n return segments\n ? segments.reduce((sum, segment) => sum + segment.value, 0)\n : this.value() ?? 0;\n });\n\n /** 0 to 100, what the bar actually draws. */\n protected readonly fillPercent = computed(() =>\n this.clampPercent(this.total() / this.max() * 100)\n );\n\n protected readonly label = computed(() =>\n this.isIndeterminate() ? '' : this.labelWith()(this.total(), this.max())\n );\n\n protected readonly segmentViews = computed<SegmentView[]>(() => {\n const segments = this.segments() ?? [];\n let used = 0;\n\n // later segments get squeezed once the track is full\n return segments.map(segment => {\n const percent = Math.min(this.clampPercent(segment.value / this.max() * 100), 100 - used);\n\n used += percent;\n\n return {\n percent,\n intent: segment.intent ?? this.intent(),\n label: segment.label ?? this.labelWith()(segment.value, this.max())\n };\n });\n });\n\n protected readonly stepStates = computed(() => {\n const steps = Math.max(1, Math.floor(this.steps() ?? 1));\n const filled = Math.round(this.fillPercent() / 100 * steps);\n\n return Array.from({ length: steps }, (_, index) => index < filled);\n });\n\n // keeps the floating label over the end of the fill without spilling off either side\n protected readonly floatingOffset = computed(() =>\n `clamp(0px, calc(${this.fillPercent()}% - 1.25rem), calc(100% - 2.5rem))`\n );\n\n protected readonly isVertical = computed(() => this.orientation() === 'vertical');\n\n protected readonly rootClasses = computed(() =>\n [\n 'ui-progress',\n `ui-progress--${this.orientation()}`,\n `ui-progress--${this.size()}`,\n `ui-progress--${this.shape()}`,\n this.labelPosition() === 'inside' ? 'ui-progress--label-inside' : ''\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected fillClasses(intent: ProgressIntent): string {\n return [\n 'ui-progress-fill',\n `ui-progress-fill--${intent}`,\n this.isIndeterminate() ? 'ui-progress-fill--indeterminate' : ''\n ]\n .filter(Boolean)\n .join(' ');\n }\n\n private clampPercent(percent: number): number {\n return Number.isFinite(percent) ? Math.min(100, Math.max(0, percent)) : 0;\n }\n}\n","<div [class]=\"rootClasses()\">\n @if (title() || labelPosition() === 'top') {\n <div class=\"ui-progress-header\">\n <span class=\"text-foreground ui-text-body-alt\">{{ title() }}</span>\n\n @if (labelPosition() === 'top') {\n <span class=\"text-foreground ui-text-body-alt\">{{ label() }}</span>\n }\n </div>\n }\n\n @if (labelPosition() === 'floating' && !isIndeterminate() && !isVertical()) {\n <div class=\"ui-progress-floating-row\" aria-hidden=\"true\">\n <span\n class=\"ui-progress-floating ui-text-caption\"\n [class]=\"'ui-progress-floating--' + intent()\"\n [style.margin-inline-start]=\"floatingOffset()\"\n >\n {{ label() }}\n </span>\n </div>\n }\n\n <div class=\"ui-progress-row\">\n <div\n class=\"ui-progress-track\"\n [class.ui-progress-track--steps]=\"steps()\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"isIndeterminate() ? null : total()\"\n [attr.aria-valuetext]=\"label() || null\"\n [attr.aria-label]=\"ariaLabel() || title() || null\"\n >\n @if (steps()) {\n @for (filled of stepStates(); track $index) {\n <span\n class=\"ui-progress-step\"\n [class]=\"filled ? 'ui-progress-fill--' + intent() : ''\"\n ></span>\n }\n } @else if (segments()) {\n @for (segment of segmentViews(); track $index) {\n <span\n [class]=\"fillClasses(segment.intent)\"\n [style.width.%]=\"isVertical() ? null : segment.percent\"\n [style.height.%]=\"isVertical() ? segment.percent : null\"\n [attr.title]=\"segment.label\"\n >\n @if (labelPosition() === 'inside') {\n <span class=\"ui-progress-inside-label ui-text-caption\">{{ segment.label }}</span>\n }\n </span>\n }\n } @else {\n <span\n [class]=\"fillClasses(intent())\"\n [style.width.%]=\"isVertical() || isIndeterminate() ? null : fillPercent()\"\n [style.height.%]=\"isVertical() && !isIndeterminate() ? fillPercent() : null\"\n >\n @if (labelPosition() === 'inside' && !isIndeterminate()) {\n <span class=\"ui-progress-inside-label ui-text-caption\">{{ label() }}</span>\n }\n </span>\n }\n </div>\n\n @if (labelPosition() === 'end' && !isIndeterminate()) {\n <span class=\"ui-progress-end text-foreground ui-text-body-alt\">{{ label() }}</span>\n }\n </div>\n</div>\n","/** Same names as badges, so a status reads the same wherever it shows. */\nexport const ProgressIntents = [\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger'\n] as const;\n\n/** @see {@link ProgressIntents} */\nexport type ProgressIntent = typeof ProgressIntents[number];\n\n/** Track thickness, md matches Preline's default and xl fits a label inside. */\nexport const ProgressSizes = ['sm', 'md', 'lg', 'xl'] as const;\n\n/** @see {@link ProgressSizes} */\nexport type ProgressSize = typeof ProgressSizes[number];\n\n/** Where the value label goes, if anywhere. */\nexport const ProgressLabelPositions = ['none', 'inside', 'end', 'top', 'floating'] as const;\n\n/** @see {@link ProgressLabelPositions} */\nexport type ProgressLabelPosition = typeof ProgressLabelPositions[number];\n\n/** rounded: both ends round, square: no rounding, straight: square track with a round fill. */\nexport const ProgressShapes = ['rounded', 'square', 'straight'] as const;\n\n/** @see {@link ProgressShapes} */\nexport type ProgressShape = typeof ProgressShapes[number];\n\nexport const ProgressOrientations = ['horizontal', 'vertical'] as const;\n\n/** @see {@link ProgressOrientations} */\nexport type ProgressOrientation = typeof ProgressOrientations[number];\n\n/** One part of a stacked bar, e.g. spending in one category. */\nexport interface ProgressSegment {\n value: number;\n intent?: ProgressIntent;\n label?: string;\n}\n","import { booleanAttribute, Component, input, model } from '@angular/core';\n\nimport type { SegmentedOption } from './segmented.types';\n\n\nlet nextId = 0;\n\n@Component({\n selector: 'ui-segmented',\n templateUrl: './segmented.component.html',\n styleUrl: './segmented.component.css',\n host: { '[class.block]': 'fill()' }\n})\nexport class UiSegmentedComponent<T> {\n readonly options = input.required<SegmentedOption<T>[]>();\n readonly value = model.required<T>();\n\n /** What the options choose between, e.g. \"How far back the charts go\". */\n readonly ariaLabel = input.required<string>();\n\n /** Stretches to the container's width with the options sharing it evenly. */\n readonly fill = input(false, { transform: booleanAttribute });\n\n protected readonly name = `ui-segmented-${nextId++}`;\n}\n","<div class=\"ui-segmented\" [class.ui-segmented--fill]=\"fill()\" role=\"radiogroup\" [attr.aria-label]=\"ariaLabel()\">\n @for (option of options(); track option.value) {\n <label\n class=\"ui-segmented-option ui-text-body-alt\"\n [class.ui-segmented-option--selected]=\"option.value === value()\"\n >\n <input\n type=\"radio\"\n class=\"sr-only\"\n [name]=\"name\"\n [checked]=\"option.value === value()\"\n [attr.aria-label]=\"option.ariaLabel || null\"\n (change)=\"value.set(option.value)\"\n />\n {{ option.label }}\n </label>\n }\n</div>\n","/** What a skeleton stands in for, lines of text, an avatar or a block. */\nexport const SkeletonShapes = ['text', 'circle', 'rect'] as const;\n\n/** @see {@link SkeletonShapes} */\nexport type SkeletonShape = typeof SkeletonShapes[number];\n","import { Component, input } from '@angular/core';\n\n\n/** Each stat is its own `dl`, so wrap a row of them in a plain div. */\n@Component({\n selector: 'ui-stat',\n templateUrl: './stat.component.html',\n host: { class: 'block min-w-0' }\n})\nexport class UiStatComponent {\n readonly label = input.required<string>();\n}\n","<dl>\n <dt class=\"text-muted-foreground-1 ui-text-body-alt\">{{ label() }}</dt>\n <dd class=\"flex flex-wrap items-center gap-x-2 gap-y-1 mt-1\">\n <span class=\"font-semibold text-foreground ui-text-h3\">\n <ng-content />\n </span>\n <ng-content select=\"[stat-change]\" />\n </dd>\n <dd class=\"empty:hidden mt-1 text-muted-foreground-1 ui-text-caption\"><ng-content select=\"[stat-note]\" /></dd>\n</dl>\n","import { booleanAttribute, Directive, input, model } from '@angular/core';\n\n\n@Directive({\n selector: '[uiTab]',\n host: { '[hidden]': '!active()' }\n})\nexport class UiTabDirective {\n label = input.required<string>({ alias: 'uiTab' });\n disabled = input(false, { transform: booleanAttribute });\n active = model<boolean>(false);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n contentChild,\n contentChildren,\n effect,\n input,\n signal,\n TemplateRef\n} from '@angular/core';\n\nimport { UiButtonComponent } from '../button/button.component';\nimport { UiTabDirective } from './tab.directive';\n\n\nexport type TabButtonAppearance =\n | 'solid'\n | 'underline';\n\n@Component({\n selector: 'ui-tab',\n templateUrl: './tab.component.html',\n styleUrl: './tab.component.css',\n imports: [UiButtonComponent, NgTemplateOutlet],\n host: { class: 'block' }\n})\nexport class UiTabComponent {\n readonly tabs = contentChildren(UiTabDirective);\n readonly selectedIndex = signal<number>(0);\n readonly actions = contentChild<TemplateRef<unknown>>('actions');\n\n readonly appearance = input<TabButtonAppearance>('solid');\n\n readonly generatedButtonClasses = computed(() =>\n [\n `ui-tab-button--${this.appearance()}`,\n 'font-medium'\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n constructor() {\n effect(() => {\n const tabs = this.tabs();\n if (!tabs.length || tabs.some(tab => tab.active())) { return; }\n\n tabs[0].active.set(true);\n });\n }\n\n select(index: number) {\n const tabs = this.tabs();\n\n const target = tabs[index];\n if (!target || target.disabled()) { return; }\n\n tabs.forEach((tab, i) => tab.active.set(i === index));\n }\n}\n","<div class=\"flex\" role=\"tablist\">\n <div class=\"flex justify-between w-full\">\n <nav class=\"flex gap-x-2.5\" role=\"tablist\">\n @for (tab of tabs(); track tab; let i = $index) {\n <ui-button\n role=\"tab\"\n appearance=\"none\"\n [classes]=\"generatedButtonClasses()\"\n [disabled]=\"tab.disabled()\"\n [class.active]=\"tab.active()\"\n (click)=\"select(i)\"\n >\n {{ tab.label() }}\n </ui-button>\n }\n </nav>\n <div class=\"flex gap-x-2.5\">\n <ng-container *ngTemplateOutlet=\"actions()\"></ng-container>\n </div>\n </div>\n</div>\n\n<ng-content></ng-content>\n","import { Injectable, isDevMode, signal, type WritableSignal } from '@angular/core';\n\n\nexport interface UiLinkedTable {\n readonly query: WritableSignal<string>;\n readonly filters: WritableSignal<Record<string, unknown>>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class UiTableRegistry {\n private readonly tables = signal<ReadonlyMap<string, UiLinkedTable>>(new Map());\n\n get(id: string): UiLinkedTable | null {\n return this.tables().get(id) ?? null;\n }\n\n register(id: string, table: UiLinkedTable): void {\n const existing = this.tables().get(id);\n\n if (isDevMode() && existing && existing !== table) {\n console.warn(`[ui-table] two tables share the id \"${id}\", controls will link to the newest one`);\n }\n\n this.tables.update(tables => new Map(tables).set(id, table));\n }\n\n unregister(id: string, table: UiLinkedTable): void {\n if (this.tables().get(id) !== table) {\n return;\n }\n\n this.tables.update(tables => {\n const next = new Map(tables);\n\n next.delete(id);\n\n return next;\n });\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n model,\n OnDestroy,\n OnInit,\n output,\n signal,\n untracked\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport {\n heroBars2,\n heroChevronDown,\n heroChevronUp,\n heroChevronUpDown,\n heroFunnel,\n heroMagnifyingGlass,\n heroViewColumns\n} from '@ng-icons/heroicons/outline';\nimport { catchError, debounceTime, filter, of, Subject, switchMap } from 'rxjs';\n\nimport { UI_FORMAT } from '../../format/format';\nimport { UiCheckboxComponent } from '../../forms/checkbox/checkbox.component';\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { UiSelectComponent } from '../../forms/select/select.component';\nimport {\n SelectDataSource,\n SelectLocalDataSource\n} from '../../forms/select/select.datasource';\nimport { UiButtonComponent } from '../button/button.component';\nimport { UiDropdownComponent } from '../dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../dropdown/dropdown.directives';\nimport { UiLoadingComponent } from '../loading/loading.component';\nimport { UiMoneyComponent } from '../money/money.component';\nimport {\n type TableDataSource,\n type TableDataSourceContent,\n type TableDataSourceParameters\n} from './table.datasource';\nimport { UiTableRegistry } from './table.registry';\nimport {\n type TableColumn,\n type TableColumnFilterOption,\n type TableRowAction,\n type TableSortState\n} from './table.types';\n\n\nconst DEFAULT_COLUMN_WIDTH = 160;\nconst SELECTION_COLUMN_WIDTH = 44;\n\ninterface ColumnDragPreview {\n label: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n@Component({\n selector: 'ui-table',\n templateUrl: './table.component.html',\n styleUrl: './table.component.css',\n imports: [\n NgIcon,\n UiButtonComponent,\n UiCheckboxComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n UiInputComponent,\n UiSelectComponent,\n UiLoadingComponent,\n UiMoneyComponent\n ],\n host: { class: 'block' },\n providers: [provideIcons({\n heroMagnifyingGlass,\n heroFunnel,\n heroViewColumns,\n heroBars2,\n heroChevronUpDown,\n heroChevronUp,\n heroChevronDown\n })]\n})\nexport class UiTableComponent<Row = unknown> implements OnInit, OnDestroy {\n readonly classes = input<string>('');\n\n /** Lets controls elsewhere on the page link to this table, e.g. `<ui-search [table]=\"'transactions'\">`. */\n readonly tableId = input<string | null>(null);\n\n readonly columns = input.required<TableColumn<Row>[]>();\n readonly dataSource = input.required<TableDataSource<Row>>();\n\n readonly emptyMessage = input<string>('No data to display.');\n readonly errorMessage = input<string>(\n 'Something went wrong loading this data.'\n );\n\n // identifies a row across sorts/filters/pages, defaults to its position which\n // is only stable for an unsorted, unfiltered, unpaginated table\n readonly rowId = input<(row: Row, index: number) => unknown>(\n (_row, index) => index\n );\n\n readonly selectable = input(false, { transform: booleanAttribute });\n readonly searchable = input(false, { transform: booleanAttribute });\n readonly searchPlaceholder = input<string>('Search...');\n readonly paginated = input(false, { transform: booleanAttribute });\n readonly pageSize = input<number>(10);\n readonly toggleableColumns = input(false, { transform: booleanAttribute });\n readonly reorderableColumns = input(false, { transform: booleanAttribute });\n readonly reorderableRows = input(false, { transform: booleanAttribute });\n readonly stickyHeader = input(false, { transform: booleanAttribute });\n readonly actions = input<TableRowAction<Row>[]>([]);\n\n readonly sort = model<TableSortState | null>(null);\n readonly selectedRowIds = model<Set<unknown>>(new Set());\n\n readonly selectionChange = output<Row[]>();\n readonly rowsReordered = output<Row[]>();\n\n readonly rows = signal<Row[]>([]);\n readonly total = signal(0);\n readonly loading = signal(false);\n readonly error = signal(false);\n\n readonly query = signal('');\n readonly filters = signal<Record<string, unknown>>({});\n\n protected readonly currentPage = signal(0);\n protected readonly hiddenColumnIds = signal<Set<string>>(new Set());\n protected readonly columnOrderIds = signal<string[] | null>(null);\n protected readonly columnWidths = signal<Record<string, number>>({});\n protected readonly columnMenuOpen = signal(false);\n protected readonly filterMenuOpen = signal(false);\n\n protected readonly draggedColumnId = signal<string | null>(null);\n protected readonly dragOverColumnId = signal<string | null>(null);\n protected readonly dragPreview = signal<ColumnDragPreview | null>(null);\n protected readonly draggedRowIndex = signal<number | null>(null);\n\n readonly isEmpty = computed(() =>\n !this.loading() && !this.error() && this.rows().length === 0\n );\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-table',\n 'ui-text-body',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected readonly orderedColumns = computed(() => {\n const order = this.columnOrderIds();\n\n if (!order) {\n return this.columns();\n }\n\n const byId = new Map(this.columns().map(column => [column.id, column]));\n const ordered = order\n .map(id => byId.get(id))\n .filter((column): column is TableColumn<Row> => !!column);\n\n const missing = this.columns().filter(column =>\n !order.includes(column.id)\n );\n\n return [...ordered, ...missing];\n });\n\n protected readonly hideableColumns = computed(() =>\n this.orderedColumns().filter(column => column.hideable !== false)\n );\n\n protected readonly visibleColumns = computed(() =>\n this.orderedColumns().filter(column =>\n !this.hiddenColumnIds().has(column.id)\n )\n );\n\n // pinned-left columns first, then unpinned, then pinned-right, so sticky offsets stack correctly\n protected readonly renderColumns = computed(() => {\n const columns = this.visibleColumns();\n\n return [\n ...columns.filter(column => column.pin === 'left'),\n ...columns.filter(column => !column.pin),\n ...columns.filter(column => column.pin === 'right')\n ];\n });\n\n // hidden columns stay filterable, the menu isn't tied to what's on screen\n protected readonly filterableColumns = computed(() =>\n this.orderedColumns().filter(column => column.filterable)\n );\n\n protected readonly hasFilterableColumns = computed(() =>\n this.filterableColumns().length > 0\n );\n\n protected readonly activeFilterCount = computed(() =>\n Object.keys(this.filters()).length\n );\n\n protected readonly hasActions = computed(() => this.actions().length > 0);\n protected readonly actionsColumnWidth = computed(() =>\n Math.max(60, this.actions().length * 40)\n );\n\n protected readonly totalPages = computed(() =>\n this.paginated()\n ? Math.max(1, Math.ceil(this.total() / this.pageSize()))\n : 1\n );\n\n protected readonly resultsLabel = computed(() => {\n const total = this.total();\n\n return total === 1 ? '1 result' : `${total} results`;\n });\n\n protected readonly allSelected = computed(() => {\n const rows = this.rows();\n\n return rows.length > 0 &&\n rows.every((row, index) =>\n this.selectedRowIds().has(this.rowId()(row, index))\n );\n });\n\n protected readonly someSelected = computed(() => {\n const rows = this.rows();\n const selected = this.selectedRowIds();\n const count = rows.filter((row, index) =>\n selected.has(this.rowId()(row, index))\n ).length;\n\n return count > 0 && count < rows.length;\n });\n\n private readonly leftOffsets = computed(() => {\n const offsets: Record<string, number> = {};\n let offset = this.selectable() ? SELECTION_COLUMN_WIDTH : 0;\n\n for (\n const column of this.renderColumns().filter(c => c.pin === 'left')\n ) {\n offsets[column.id] = offset;\n offset += this.columnWidth(column);\n }\n\n return offsets;\n });\n\n private readonly rightOffsets = computed(() => {\n const offsets: Record<string, number> = {};\n let offset = 0;\n\n const columns = this.renderColumns()\n .filter(c => c.pin === 'right')\n .slice()\n .reverse();\n\n for (const column of columns) {\n offsets[column.id] = offset;\n offset += this.columnWidth(column);\n }\n\n return offsets;\n });\n\n // one shared stream for every load, so a newer request cancels whatever was still in flight\n private readonly load$ = new Subject<void>();\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly registry = inject(UiTableRegistry);\n protected readonly uiFormat = inject(UI_FORMAT);\n\n private loadedQuery = '';\n private loadedFilters: Record<string, unknown> = {};\n\n private resizeState: {\n columnId: string;\n startX: number;\n startWidth: number;\n } | null = null;\n private columnDragState: {\n columnId: string;\n pointerOffsetX: number;\n previewY: number;\n previewHeight: number;\n } | null = null;\n private readonly filterDataSources = new Map<\n string,\n SelectDataSource<TableColumnFilterOption>\n >();\n\n constructor() {\n effect(onCleanup => {\n const id = this.tableId();\n\n if (!id) {\n return;\n }\n\n // registering reads the registry, tracked it would loop\n untracked(() => this.registry.register(id, this));\n onCleanup(() => this.registry.unregister(id, this));\n });\n\n // a query set before the first emission, e.g. by a linked search, still reloads\n toObservable(this.query).pipe(\n debounceTime(300),\n filter(query => query !== this.loadedQuery),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.resetAndReload());\n\n toObservable(this.filters).pipe(\n debounceTime(300),\n filter(filters => filters !== this.loadedFilters),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.resetAndReload());\n\n this.load$.pipe(\n switchMap(() => this.fetch()),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(result => this.applyResult(result));\n }\n\n ngOnInit(): void {\n this.reload();\n }\n\n ngOnDestroy(): void {\n document.removeEventListener('pointermove', this.onResizeMove);\n document.removeEventListener('pointerup', this.onResizeEnd);\n document.removeEventListener('pointermove', this.onColumnDragMove);\n document.removeEventListener('pointerup', this.onColumnDragEnd);\n }\n\n reload(): void {\n this.load$.next();\n }\n\n protected cellValue(column: TableColumn<Row>, row: Row): unknown {\n return column.accessor(row);\n }\n\n // ng-icon's `name` wants a string; displayType 'icon' is the caller's promise the accessor gives one\n protected cellIconValue(column: TableColumn<Row>, row: Row): string {\n return column.accessor(row) as string;\n }\n\n protected moneyCellValue(column: TableColumn<Row>, row: Row): number | null {\n const value = column.accessor(row);\n\n return value === null || value === undefined ? null : Number(value);\n }\n\n protected formattedCellValue(column: TableColumn<Row>, row: Row): string {\n const value = column.accessor(row);\n\n if (value === null || value === undefined) {\n return '';\n }\n\n switch (column.displayType) {\n case 'number':\n return new Intl.NumberFormat().format(Number(value));\n case 'date':\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium'\n })\n .format(new Date(value as string | number | Date));\n case 'time':\n return new Intl.DateTimeFormat(undefined, {\n timeStyle: 'short'\n })\n .format(new Date(value as string | number | Date));\n default:\n return String(value);\n }\n }\n\n protected onQueryChange(value: string): void {\n this.query.set(value);\n }\n\n protected filterValue(columnId: string): string {\n return (this.filters()[columnId] as string) ?? '';\n }\n\n protected onFilterInput(columnId: string, value: string): void {\n this.setFilter(columnId, value);\n }\n\n protected filterDataSource(\n column: TableColumn<Row>\n ): SelectDataSource<TableColumnFilterOption> {\n let dataSource = this.filterDataSources.get(column.id);\n\n if (!dataSource) {\n dataSource = new SelectLocalDataSource(\n column.filterOptions ?? [],\n (option, query) =>\n option.label.toLowerCase().includes(query.toLowerCase())\n );\n\n this.filterDataSources.set(column.id, dataSource);\n }\n\n return dataSource;\n }\n\n protected selectedFilterOption(\n column: TableColumn<Row>\n ): TableColumnFilterOption | null {\n const value = this.filters()[column.id];\n\n return column.filterOptions?.find(option => option.value === value) ??\n null;\n }\n\n protected filterOptionLabel(option: TableColumnFilterOption): string {\n return option.label;\n }\n\n protected onFilterSelect(\n columnId: string,\n option: TableColumnFilterOption | null\n ): void {\n this.setFilter(columnId, option?.value);\n }\n\n protected clearFilters(): void {\n this.filters.set({});\n }\n\n protected toggleSort(column: TableColumn<Row>): void {\n if (!column.sortable) {\n return;\n }\n\n const current = this.sort();\n\n if (!current || current.columnId !== column.id) {\n this.sort.set({ columnId: column.id, direction: 'asc' });\n } else if (current.direction === 'asc') {\n this.sort.set({ columnId: column.id, direction: 'desc' });\n } else {\n this.sort.set(null);\n }\n\n this.resetAndReload();\n }\n\n protected sortIcon(column: TableColumn<Row>): string {\n const current = this.sort();\n\n if (!current || current.columnId !== column.id) {\n return 'heroChevronUpDown';\n }\n\n return current.direction === 'asc'\n ? 'heroChevronUp'\n : 'heroChevronDown';\n }\n\n protected goToPage(page: number): void {\n if (page < 0 || page >= this.totalPages()) {\n return;\n }\n\n this.currentPage.set(page);\n this.reload();\n }\n\n protected isColumnVisible(column: TableColumn<Row>): boolean {\n return !this.hiddenColumnIds().has(column.id);\n }\n\n protected toggleColumnVisibility(column: TableColumn<Row>): void {\n this.hiddenColumnIds.update(hidden => {\n const next = new Set(hidden);\n\n if (next.has(column.id)) {\n next.delete(column.id);\n } else {\n next.add(column.id);\n }\n\n return next;\n });\n }\n\n protected isRowSelected(row: Row, index: number): boolean {\n return this.selectedRowIds().has(this.rowId()(row, index));\n }\n\n protected toggleRow(row: Row, index: number): void {\n const id = this.rowId()(row, index);\n\n this.selectedRowIds.update(selected => {\n const next = new Set(selected);\n\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n\n return next;\n });\n\n this.emitSelectionChange();\n }\n\n protected toggleSelectAll(): void {\n const wasAllSelected = this.allSelected();\n\n this.selectedRowIds.update(selected => {\n const next = new Set(selected);\n\n this.rows().forEach((row, index) => {\n const id = this.rowId()(row, index);\n\n if (wasAllSelected) {\n next.delete(id);\n } else {\n next.add(id);\n }\n });\n\n return next;\n });\n\n this.emitSelectionChange();\n }\n\n protected columnWidth(column: TableColumn<Row>): number {\n return this.columnWidths()[column.id] ??\n column.width ??\n DEFAULT_COLUMN_WIDTH;\n }\n\n protected isPinned(column: TableColumn<Row>): boolean {\n return column.pin === 'left' || column.pin === 'right';\n }\n\n protected leftOffset(column: TableColumn<Row>): number | null {\n return column.pin === 'left' ? this.leftOffsets()[column.id] : null;\n }\n\n protected rightOffset(column: TableColumn<Row>): number | null {\n return column.pin === 'right' ? this.rightOffsets()[column.id] : null;\n }\n\n protected startResize(event: PointerEvent, column: TableColumn<Row>): void {\n event.preventDefault();\n event.stopPropagation();\n\n this.resizeState = {\n columnId: column.id,\n startX: event.clientX,\n startWidth: this.columnWidth(column)\n };\n\n document.addEventListener('pointermove', this.onResizeMove);\n document.addEventListener('pointerup', this.onResizeEnd);\n }\n\n protected canReorderRows(): boolean {\n return this.reorderableRows() && !this.sort();\n }\n\n // custom pointer-based drag instead of native HTML5 DnD, so the floating\n // preview can be pinned to the header row instead of following the cursor\n // wherever it goes, and so a drop indicator can show the exact landing spot\n protected onColumnDragStart(\n event: PointerEvent,\n column: TableColumn<Row>\n ): void {\n event.preventDefault();\n\n const headerCell = (event.currentTarget as HTMLElement).closest('th');\n const headerRow = headerCell?.closest('tr');\n\n if (!headerCell || !headerRow) {\n return;\n }\n\n const cellRect = headerCell.getBoundingClientRect();\n const rowRect = headerRow.getBoundingClientRect();\n\n this.columnDragState = {\n columnId: column.id,\n pointerOffsetX: event.clientX - cellRect.left,\n previewY: rowRect.top + (rowRect.height - cellRect.height) / 2,\n previewHeight: cellRect.height\n };\n\n this.draggedColumnId.set(column.id);\n this.dragPreview.set({\n label: column.header,\n x: cellRect.left,\n y: this.columnDragState.previewY,\n width: cellRect.width,\n height: this.columnDragState.previewHeight\n });\n\n document.addEventListener('pointermove', this.onColumnDragMove);\n document.addEventListener('pointerup', this.onColumnDragEnd);\n }\n\n protected onRowDragStart(event: DragEvent, index: number): void {\n this.draggedRowIndex.set(index);\n event.dataTransfer?.setData('text/plain', String(index));\n }\n\n protected onRowDragOver(event: DragEvent): void {\n if (this.draggedRowIndex() !== null) {\n event.preventDefault();\n }\n }\n\n protected onRowDrop(event: DragEvent, index: number): void {\n event.preventDefault();\n\n const from = this.draggedRowIndex();\n this.draggedRowIndex.set(null);\n\n if (from === null || from === index) {\n return;\n }\n\n const next = [...this.rows()];\n const [moved] = next.splice(from, 1);\n next.splice(index, 0, moved);\n\n this.rows.set(next);\n this.rowsReordered.emit(next);\n }\n\n private readonly onResizeMove = (event: PointerEvent): void => {\n if (!this.resizeState) {\n return;\n }\n\n const column = this.columns().find(c =>\n c.id === this.resizeState!.columnId\n );\n const minWidth = column?.minWidth ?? 60;\n const delta = event.clientX - this.resizeState.startX;\n const width = Math.max(minWidth, this.resizeState.startWidth + delta);\n\n this.columnWidths.update(widths => ({\n ...widths,\n [this.resizeState!.columnId]: width\n }));\n };\n\n private readonly onResizeEnd = (): void => {\n this.resizeState = null;\n document.removeEventListener('pointermove', this.onResizeMove);\n document.removeEventListener('pointerup', this.onResizeEnd);\n };\n\n private readonly onColumnDragMove = (event: PointerEvent): void => {\n const state = this.columnDragState;\n\n if (!state) {\n return;\n }\n\n // x tracks the pointer, y stays pinned to the header row - the preview\n // can never wander down into the body no matter where the pointer goes\n this.dragPreview.update(preview =>\n preview && {\n ...preview,\n x: event.clientX - state.pointerOffsetX\n }\n );\n\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const headerCell = target?.closest<HTMLElement>('th[data-column-id]');\n const columnId = headerCell?.dataset['columnId'];\n\n this.dragOverColumnId.set(\n columnId && columnId !== state.columnId ? columnId : null\n );\n };\n\n private readonly onColumnDragEnd = (): void => {\n const state = this.columnDragState;\n const overId = this.dragOverColumnId();\n\n this.columnDragState = null;\n this.draggedColumnId.set(null);\n this.dragOverColumnId.set(null);\n this.dragPreview.set(null);\n\n document.removeEventListener('pointermove', this.onColumnDragMove);\n document.removeEventListener('pointerup', this.onColumnDragEnd);\n\n if (!state || !overId || state.columnId === overId) {\n return;\n }\n\n const order = this.columnOrderIds() ?? this.columns().map(c => c.id);\n const from = order.indexOf(state.columnId);\n const to = order.indexOf(overId);\n\n if (from === -1 || to === -1) {\n return;\n }\n\n // dropped column takes the exact slot of the highlighted target, which\n // shifts over to make room - `to` is deliberately the target's index\n // from before removal, so splicing it into the now-shorter array lands\n // the dragged column exactly where the target was and pushes it aside,\n // rather than merely landing next to it\n const next = [...order];\n next.splice(from, 1);\n next.splice(to, 0, state.columnId);\n\n this.columnOrderIds.set(next);\n };\n\n private setFilter(columnId: string, value: unknown): void {\n this.filters.update(filters => {\n const next = { ...filters };\n\n if (value) {\n next[columnId] = value;\n } else {\n delete next[columnId];\n }\n\n return next;\n });\n }\n\n private resetAndReload(): void {\n this.currentPage.set(0);\n this.reload();\n }\n\n private emitSelectionChange(): void {\n const ids = this.selectedRowIds();\n const selectedRows = this.rows().filter((row, index) =>\n ids.has(this.rowId()(row, index))\n );\n\n this.selectionChange.emit(selectedRows);\n }\n\n private fetch() {\n this.loading.set(true);\n this.error.set(false);\n\n const params: TableDataSourceParameters = {\n page: this.currentPage(),\n size: this.paginated() ? this.pageSize() : 0,\n query: this.query(),\n sort: this.sort(),\n filters: this.filters()\n };\n\n this.loadedQuery = params.query;\n this.loadedFilters = params.filters;\n\n return this.dataSource().load(params).pipe(catchError(() => of(null)));\n }\n\n private applyResult(result: TableDataSourceContent<Row> | null): void {\n this.loading.set(false);\n\n if (result) {\n this.rows.set(result.items);\n this.total.set(result.total);\n } else {\n this.error.set(true);\n }\n\n this.cdr.markForCheck();\n }\n}\n","@if (searchable() || hasFilterableColumns() || toggleableColumns()) {\n <div class=\"ui-table-toolbar\">\n @if (searchable()) {\n <ui-input\n [value]=\"query()\"\n (valueChange)=\"onQueryChange($event)\"\n [placeholder]=\"searchPlaceholder()\"\n class=\"max-w-xs\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroMagnifyingGlass\"\n class=\"ms-3 size-4 text-muted-foreground-1\"\n />\n </ng-template>\n </ui-input>\n }\n\n @if (hasFilterableColumns()) {\n <ui-dropdown\n [isOpen]=\"filterMenuOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n >\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n (click)=\"filterMenuOpen.update(open => !open)\"\n >\n <ng-icon name=\"heroFunnel\" class=\"size-4\" />\n Filters\n @if (activeFilterCount()) {\n <span class=\"ui-table-filter-count ui-text-caption\">\n {{ activeFilterCount() }}\n </span>\n }\n </ui-button>\n\n @if (filterMenuOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"ui-table-filter-menu\">\n @for (column of filterableColumns(); track column.id) {\n <div class=\"flex flex-col gap-1\">\n <span\n class=\"text-muted-foreground-1 ui-text-caption\"\n >\n {{ column.header }}\n </span>\n\n @if (column.filterOptions) {\n <ui-select\n [dataSource]=\"filterDataSource(column)\"\n [selectedItem]=\"selectedFilterOption(column)\"\n (selectionChange)=\"onFilterSelect(column.id, $event)\"\n [displayWith]=\"filterOptionLabel\"\n [clearable]=\"true\"\n clearLabel=\"All\"\n placeholder=\"All\"\n />\n } @else {\n <ui-input\n [value]=\"filterValue(column.id)\"\n (valueChange)=\"onFilterInput(column.id, $event)\"\n placeholder=\"Filter...\"\n [ariaLabel]=\"'Filter ' + column.header\"\n />\n }\n </div>\n }\n\n @if (activeFilterCount()) {\n <ui-button\n appearance=\"link\"\n intent=\"secondary\"\n class=\"text-end\"\n classes=\"self-end p-0! text-sm\"\n (click)=\"clearFilters()\"\n >\n Clear filters\n </ui-button>\n }\n </div>\n </div>\n }\n </ui-dropdown>\n }\n\n @if (toggleableColumns()) {\n <ui-dropdown\n [isOpen]=\"columnMenuOpen\"\n placement=\"bottom-end\"\n closeBehaviour=\"whenClickOutside\"\n class=\"ms-auto\"\n >\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n (click)=\"columnMenuOpen.update(open => !open)\"\n >\n <ng-icon name=\"heroViewColumns\" class=\"size-4\" />\n Columns\n </ui-button>\n\n @if (columnMenuOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"bg-layer shadow-xs py-1 border border-dropdown-divider rounded-lg min-w-40\">\n @for (column of hideableColumns(); track column.id) {\n <label\n class=\"flex items-center gap-2 hover:bg-dropdown-item-hover px-3 py-2 ui-text-body-alt cursor-pointer\"\n >\n <ui-checkbox\n [value]=\"isColumnVisible(column)\"\n (valueChange)=\"toggleColumnVisibility(column)\"\n />\n {{ column.header }}\n </label>\n }\n </div>\n </div>\n }\n </ui-dropdown>\n }\n </div>\n}\n\n<div class=\"ui-table-scroll\">\n <table [class]=\"generatedClasses()\">\n <colgroup>\n @if (selectable()) {\n <col [style.width.px]=\"44\" />\n }\n\n @for (column of renderColumns(); track column.id) {\n <col [style.width.px]=\"columnWidth(column)\" />\n }\n\n @if (hasActions()) {\n <col [style.width.px]=\"actionsColumnWidth()\" />\n }\n </colgroup>\n\n <thead [class.ui-table-sticky]=\"stickyHeader()\">\n <tr>\n @if (selectable()) {\n <th class=\"text-center! ui-table-select-cell\">\n <ui-checkbox\n [value]=\"allSelected()\"\n [indeterminate]=\"someSelected()\"\n (valueChange)=\"toggleSelectAll()\"\n />\n </th>\n }\n\n @for (column of renderColumns(); track column.id) {\n <th\n scope=\"col\"\n [attr.data-column-id]=\"column.id\"\n [class.ui-table-pinned]=\"isPinned(column)\"\n [attr.data-pin]=\"column.pin || null\"\n [class.ui-table-column-dragging]=\"draggedColumnId() === column.id\"\n [class.ui-table-column-drag-over]=\"dragOverColumnId() === column.id\"\n [style.left.px]=\"leftOffset(column)\"\n [style.right.px]=\"rightOffset(column)\"\n >\n <div class=\"ui-table-th-content\">\n @if (reorderableColumns() && column.reorderable !== false) {\n <ng-icon\n name=\"heroBars2\"\n class=\"ui-table-drag-handle\"\n (pointerdown)=\"onColumnDragStart($event, column)\"\n />\n }\n\n @if (column.sortable) {\n <ui-button\n appearance=\"none\"\n classes=\"flex items-center gap-1 p-0! border-transparent! rounded-none! cursor-pointer hocus:text-foreground\"\n (click)=\"toggleSort(column)\"\n >\n <span\n class=\"font-medium text-muted-foreground-1 ui-text-caption uppercase\"\n >\n {{ column.header }}\n </span>\n <ng-icon\n [name]=\"sortIcon(column)\"\n class=\"ms-auto size-4 shrink-0\"\n />\n </ui-button>\n } @else {\n <span\n class=\"font-medium text-muted-foreground-1 ui-text-caption ui-text-caption uppercase\"\n >\n {{ column.header }}\n </span>\n }\n </div>\n\n @if (column.resizable) {\n <span\n class=\"ui-table-resize-handle\"\n (pointerdown)=\"startResize($event, column)\"\n ></span>\n }\n </th>\n }\n\n @if (hasActions()) {\n <th class=\"ui-table-actions-cell\"></th>\n }\n </tr>\n </thead>\n\n <tbody class=\"ui-text-body-alt\">\n @if (loading()) {\n <tr>\n <td\n [attr.colspan]=\"renderColumns().length + (selectable() ? 1 : 0) + (hasActions() ? 1 : 0)\"\n class=\"ui-table-status\"\n >\n <ui-loading type=\"loading-dots\" />\n </td>\n </tr>\n } @else if (error()) {\n <tr>\n <td\n [attr.colspan]=\"renderColumns().length + (selectable() ? 1 : 0) + (hasActions() ? 1 : 0)\"\n class=\"ui-table-status ui-table-status-error\"\n >\n {{ errorMessage() }}\n <ui-button\n appearance=\"link\"\n intent=\"danger\"\n classes=\"ms-1 p-0! text-sm underline\"\n (click)=\"reload()\"\n >\n Retry\n </ui-button>\n </td>\n </tr>\n } @else if (isEmpty()) {\n <tr>\n <td\n [attr.colspan]=\"renderColumns().length + (selectable() ? 1 : 0) + (hasActions() ? 1 : 0)\"\n class=\"ui-table-status\"\n >\n {{ emptyMessage() }}\n </td>\n </tr>\n } @else {\n @for (row of rows(); track rowId()(row, $index); let i = $index) {\n <tr\n [class.ui-table-row-selected]=\"isRowSelected(row, i)\"\n [class.ui-table-row-dragging]=\"draggedRowIndex() === i\"\n [draggable]=\"canReorderRows()\"\n (dragstart)=\"onRowDragStart($event, i)\"\n (dragover)=\"onRowDragOver($event)\"\n (drop)=\"onRowDrop($event, i)\"\n >\n @if (selectable()) {\n <td class=\"ui-table-select-cell\">\n <ui-checkbox\n [value]=\"isRowSelected(row, i)\"\n (valueChange)=\"toggleRow(row, i)\"\n />\n </td>\n }\n\n @for (column of renderColumns(); track column.id) {\n <td\n [class.ui-table-pinned]=\"isPinned(column)\"\n [attr.data-pin]=\"column.pin || null\"\n [style.left.px]=\"leftOffset(column)\"\n [style.right.px]=\"rightOffset(column)\"\n >\n @if (column.displayType === 'icon') {\n <ng-icon\n [name]=\"cellIconValue(column, row)\"\n class=\"size-4\"\n />\n } @else if (column.displayType === 'currency') {\n <ui-money\n [value]=\"moneyCellValue(column, row)\"\n [currency]=\"column.currency ?? uiFormat.currency\"\n placeholder=\"\"\n />\n } @else {\n {{ formattedCellValue(column, row) }}\n }\n </td>\n }\n\n @if (hasActions()) {\n <td class=\"ui-table-actions-cell\">\n @for (action of actions(); track action.id) {\n <ui-button\n appearance=\"none\"\n classes=\"p-1.5! border-transparent! rounded-md! text-muted-foreground-1 cursor-pointer hocus:bg-surface hocus:text-foreground disabled:opacity-40! disabled:cursor-not-allowed\"\n [disabled]=\"!!action.disabled?.(row)\"\n [ariaLabel]=\"action.label\"\n [title]=\"action.label\"\n (click)=\"action.onClick(row)\"\n >\n <ng-icon\n [name]=\"action.icon\"\n class=\"size-4\"\n />\n </ui-button>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (dragPreview(); as preview) {\n <div\n class=\"ui-table-drag-preview ui-text-body-alt\"\n [style.left.px]=\"preview.x\"\n [style.top.px]=\"preview.y\"\n [style.width.px]=\"preview.width\"\n [style.height.px]=\"preview.height\"\n >\n <ng-icon name=\"heroBars2\" class=\"ui-table-drag-preview-icon\" />\n <span class=\"truncate\">{{ preview.label }}</span>\n </div>\n}\n\n@if (paginated()) {\n <div class=\"ui-table-footer\">\n <span class=\"text-muted-foreground-1 ui-text-caption\">{{\n resultsLabel()\n }}</span>\n\n <div class=\"ui-table-pagination\">\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n [disabled]=\"currentPage() === 0\"\n (click)=\"goToPage(currentPage() - 1)\"\n >\n Prev\n </ui-button>\n\n <span class=\"ui-text-body-alt\">Page {{ currentPage() + 1 }} of {{\n totalPages()\n }}</span>\n\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n [disabled]=\"currentPage() + 1 >= totalPages()\"\n (click)=\"goToPage(currentPage() + 1)\"\n >\n Next\n </ui-button>\n </div>\n </div>\n}\n","import { Observable, of } from 'rxjs';\n\nimport { type TableSortState } from './table.types';\n\n\nexport interface TableDataSourceParameters {\n page: number;\n /** 0 or less means \"no limit\", used when the table isn't paginated */\n size: number;\n query: string;\n sort: TableSortState | null;\n filters: Record<string, unknown>;\n}\n\nexport interface TableDataSourceContent<Row> {\n items: Row[];\n total: number;\n}\n\nexport interface TableDataSource<Row> {\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>>;\n}\n\nexport interface TableLocalDataSourceOptions<Row> {\n search?: (item: Row, query: string) => boolean;\n sortValue?: (item: Row, columnId: string) => unknown;\n filter?: (item: Row, filters: Record<string, unknown>) => boolean;\n}\n\nexport class TableLocalDataSource<Row> implements TableDataSource<Row> {\n constructor(\n private readonly items: Row[],\n private readonly options: TableLocalDataSourceOptions<Row> = {}\n ) {}\n\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>> {\n let result = this.items;\n\n const query = params.query.trim();\n\n if (query && this.options.search) {\n result = result.filter(item => this.options.search!(item, query));\n }\n\n if (Object.keys(params.filters).length && this.options.filter) {\n result = result.filter(item => this.options.filter!(item, params.filters));\n }\n\n if (params.sort && this.options.sortValue) {\n const { columnId, direction } = params.sort;\n const factor = direction === 'asc' ? 1 : -1;\n\n result = [...result].sort((a, b) => {\n const valueA = this.options.sortValue!(a, columnId);\n const valueB = this.options.sortValue!(b, columnId);\n\n if (valueA === valueB) {\n return 0;\n }\n\n return (valueA as never) > (valueB as never) ? factor : -factor;\n });\n }\n\n const total = result.length;\n const items = params.size > 0 ?\n result.slice(params.page * params.size, (params.page * params.size) + params.size) :\n result;\n\n return of({ items, total });\n }\n}\n\n// wraps any fetch function, so no specific backend is baked in here\nexport class TableRemoteDataSource<Row> implements TableDataSource<Row> {\n constructor(\n private readonly fetch: (\n params: TableDataSourceParameters\n ) => Observable<TableDataSourceContent<Row>>\n ) {}\n\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>> {\n return this.fetch(params);\n }\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n output\n} from '@angular/core';\n\nimport { IconType, NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroXMark } from '@ng-icons/heroicons/outline';\nimport {\n heroCheckCircleSolid,\n heroExclamationTriangleSolid,\n heroInformationCircleSolid,\n heroXCircleSolid\n} from '@ng-icons/heroicons/solid';\n\nimport { UiCardComponent } from '../card/card.component';\nimport { ToastIntent } from './toast.types';\n\n\nconst INTENT_ICONS: Record<ToastIntent, IconType> = {\n info: 'heroInformationCircleSolid',\n success: 'heroCheckCircleSolid',\n warning: 'heroExclamationTriangleSolid',\n danger: 'heroXCircleSolid'\n};\n\nconst INTENT_COLOURS: Record<ToastIntent, string> = {\n info: 'text-primary-600',\n success: 'text-success-600',\n warning: 'text-warning-600',\n danger: 'text-danger-600'\n};\n\n@Component({\n selector: 'ui-toast',\n templateUrl: './toast.component.html',\n imports: [NgIcon, UiCardComponent],\n host: {\n '(mouseenter)': 'setHovered(true)',\n '(mouseleave)': 'setHovered(false)',\n '(focusin)': 'setFocused(true)',\n '(focusout)': 'setFocused(false)'\n },\n providers: [provideIcons({\n heroInformationCircleSolid,\n heroCheckCircleSolid,\n heroExclamationTriangleSolid,\n heroXCircleSolid,\n heroXMark\n })]\n})\nexport class UiToastComponent {\n readonly intent = input<ToastIntent>('info');\n readonly classes = input<string>('');\n readonly dismissable = input(false, { transform: booleanAttribute });\n\n /** ms before the toast dismisses itself, paused while hovered or focused. null never times out. */\n readonly timeoutMs = input<number | null>(null);\n\n readonly dismissed = output<void>();\n\n protected readonly icon = computed(() => INTENT_ICONS[this.intent()]);\n protected readonly iconColour = computed(() =>\n INTENT_COLOURS[this.intent()]\n );\n\n // errors interrupt the screen reader, everything else waits its turn\n protected readonly role = computed(() =>\n this.intent() === 'danger' ? 'alert' : 'status'\n );\n\n private hovered = false;\n private focused = false;\n\n private timer?: ReturnType<typeof setTimeout>;\n private startedAt = 0;\n private remaining = 0;\n\n constructor() {\n effect(onCleanup => {\n const timeoutMs = this.timeoutMs();\n\n if (timeoutMs === null) {\n return;\n }\n\n this.remaining = timeoutMs;\n this.updateTimer();\n\n onCleanup(() => this.stopTimer());\n });\n }\n\n protected setHovered(hovered: boolean): void {\n this.hovered = hovered;\n this.updateTimer();\n }\n\n protected setFocused(focused: boolean): void {\n this.focused = focused;\n this.updateTimer();\n }\n\n private updateTimer(): void {\n if (this.hovered || this.focused) {\n this.stopTimer();\n } else if (this.timeoutMs() !== null && this.timer === undefined) {\n this.startTimer();\n }\n }\n\n private startTimer(): void {\n this.startedAt = Date.now();\n this.timer = setTimeout(() => this.dismissed.emit(), this.remaining);\n }\n\n // keeps whatever time was left so the countdown carries on after a pause\n private stopTimer(): void {\n if (this.timer === undefined) {\n return;\n }\n\n clearTimeout(this.timer);\n this.timer = undefined;\n this.remaining -= Date.now() - this.startedAt;\n }\n}\n","<ui-card\n radius=\"xl\"\n class=\"p-4 w-full max-w-xs\"\n [class]=\"classes()\"\n [attr.role]=\"role()\"\n tabindex=\"-1\"\n>\n <div class=\"flex gap-x-3\">\n <div class=\"inline-flex\" [class]=\"iconColour()\">\n <ng-icon\n [name]=\"icon()\"\n class=\"shrink-0\"\n size=\"24\"\n />\n </div>\n <div class=\"grow\">\n <p class=\"text-layer-foreground ui-text-body\">\n <ng-content />\n </p>\n </div>\n @if (dismissable()) {\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n (click)=\"dismissed.emit()\"\n >\n <ng-icon name=\"heroXMark\" />\n </button>\n }\n </div>\n</ui-card>\n","import { Injectable, signal } from '@angular/core';\n\nimport { Toast, ToastMessage, ToastOptions } from './toast.types';\n\n\n@Injectable({ providedIn: 'root' })\nexport class UiToastService {\n private readonly _toasts = signal<Toast[]>([]);\n private nextId = 0;\n\n readonly toasts = this._toasts.asReadonly();\n\n show<ContextType>(\n message: ToastMessage<ContextType>,\n options: ToastOptions<ContextType> = {}\n ): number {\n const id = this.nextId++;\n\n const toast: Toast = {\n id,\n message,\n templateContext: {\n $implicit: options.context,\n dismiss: () => this.dismiss(id)\n },\n intent: options.intent ?? 'info',\n dismissable: options.dismissable ?? true,\n timeoutMs: options.timeoutMs\n };\n\n this._toasts.update(toasts => [...toasts, toast]);\n\n return id;\n }\n\n dismiss(id: number): void {\n this._toasts.update(toasts => toasts.filter(toast => toast.id !== id));\n }\n}\n","import { TemplateRef } from '@angular/core';\n\n\nexport const ToastIntents = [\n 'info',\n 'success',\n 'warning',\n 'danger'\n] as const;\n\nexport type ToastIntent = typeof ToastIntents[number];\n\n/** What a toast template receives: `let-data` for the context, `let-dismiss=\"dismiss\"` to close it. */\nexport interface ToastTemplateContext<ContextType = unknown> {\n $implicit: ContextType;\n dismiss: () => void;\n}\n\nexport type ToastMessage<ContextType = unknown> =\n | string\n | TemplateRef<ToastTemplateContext<ContextType>>;\n\nexport interface Toast {\n id: number;\n message: ToastMessage;\n templateContext: ToastTemplateContext;\n intent: ToastIntent;\n dismissable: boolean;\n\n // null never times out, undefined falls back to the toaster's timeout\n timeoutMs?: number | null;\n}\n\nexport type ToastOptions<ContextType = unknown> =\n & Partial<\n Pick<Toast, 'intent' | 'dismissable' | 'timeoutMs'>\n >\n & {\n context?: ContextType;\n };\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, inject, input } from '@angular/core';\n\nimport { UiToastComponent } from '../toast/toast.component';\nimport { UiToastService } from '../toast/toast.service';\nimport { ToasterPosition } from './toaster.types';\n\n\n// top stacks are reversed so the newest toast is always nearest the edge\nconst POSITION_CLASSES: Record<ToasterPosition, string> = {\n 'top-left': 'top-0 left-0 items-start flex-col-reverse',\n 'top-center':\n 'top-0 left-1/2 -translate-x-1/2 items-center flex-col-reverse',\n 'top-right': 'top-0 right-0 items-end flex-col-reverse',\n 'bottom-left': 'bottom-0 left-0 items-start flex-col',\n 'bottom-center': 'bottom-0 left-1/2 -translate-x-1/2 items-center flex-col',\n 'bottom-right': 'bottom-0 right-0 items-end flex-col'\n};\n\n@Component({\n selector: 'ui-toaster',\n templateUrl: './toaster.component.html',\n styleUrl: './toaster.component.css',\n imports: [UiToastComponent, NgTemplateOutlet]\n})\nexport class UiToasterComponent {\n readonly position = input<ToasterPosition>('bottom-right');\n readonly timeoutMs = input<number | null>(null);\n\n protected readonly toastService = inject(UiToastService);\n\n protected readonly positionClasses = computed(() =>\n POSITION_CLASSES[this.position()]\n );\n}\n","<section\n class=\"z-50 box-content fixed flex px-4 py-2.5 w-full max-w-xs pointer-events-none\"\n [class]=\"positionClasses()\"\n aria-label=\"Notifications\"\n>\n @for (toast of toastService.toasts(); track toast.id) {\n <div\n class=\"ui-toaster--item\"\n animate.enter=\"ui-toaster--enter\"\n animate.leave=\"ui-toaster--leave\"\n >\n <div class=\"ui-toaster--item-inner\">\n <ui-toast\n class=\"block py-1.5 w-full pointer-events-auto\"\n [intent]=\"toast.intent\"\n [dismissable]=\"toast.dismissable\"\n [timeoutMs]=\"toast.timeoutMs === undefined ? timeoutMs() : toast.timeoutMs\"\n (dismissed)=\"toastService.dismiss(toast.id)\"\n >\n @if (typeof toast.message === 'string') {\n {{ toast.message }}\n } @else {\n <ng-container\n *ngTemplateOutlet=\"toast.message; context: toast.templateContext\"\n />\n }\n </ui-toast>\n </div>\n </div>\n }\n</section>\n","export const ToasterPositions = [\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-left',\n 'bottom-center',\n 'bottom-right'\n] as const;\n\nexport type ToasterPosition = typeof ToasterPositions[number];\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, contentChild, TemplateRef } from '@angular/core';\n\n\n@Component({\n selector: 'ui-layout',\n templateUrl: './layout.component.html',\n styleUrl: './layout.component.css',\n imports: [NgTemplateOutlet]\n})\nexport class UiLayoutComponent {\n readonly sidebar = contentChild<TemplateRef<unknown>>('sidebar');\n}\n","<div class=\"shrink-0\">\n <ng-container *ngTemplateOutlet=\"sidebar()\" />\n</div>\n\n<main class=\"min-w-0 overflow-y-auto grow\">\n <ng-content />\n</main>\n","import { Component, computed, model } from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroBars3, heroChevronDoubleLeft } from '@ng-icons/heroicons/outline';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\n@Component({\n selector: 'ui-sidebar',\n exportAs: 'uiSidebar',\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.css',\n imports: [UiButtonComponent, NgIcon],\n host: {\n '[class.open]': 'isOpen()',\n '(document:keydown.escape)': 'isOpen.set(false)'\n },\n providers: [provideIcons({ heroChevronDoubleLeft, heroBars3 })]\n})\nexport class UiSidebarComponent {\n readonly isOpen = model<boolean>(false);\n\n readonly isCollapsed = computed(() => !this.isOpen());\n\n readonly toggle = () => this.isOpen.update(isOpen => !isOpen);\n}\n","<div class=\"ui-sidebar-backdrop\" aria-hidden=\"true\" (click)=\"isOpen.set(false)\">\n</div>\n\n<aside class=\"ui-sidebar-panel\">\n <div class=\"ui-sidebar-content\">\n <ng-content />\n </div>\n\n <footer class=\"ui-sidebar-footer\">\n <div class=\"ui-sidebar-footer-content\">\n <ng-content select=\"[sidebar-footer]\" />\n </div>\n\n <ui-button\n appearance=\"ghost\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"justify-center size-10 p-0!\"\n [ariaLabel]=\"isOpen() ? 'Collapse sidebar' : 'Expand sidebar'\"\n (click)=\"toggle()\"\n >\n <ng-icon\n name=\"heroChevronDoubleLeft\"\n size=\"16\"\n strokeWidth=\"2\"\n class=\"duration-300 shrink-0\"\n [class.rotate-180]=\"!isOpen()\"\n />\n </ui-button>\n </footer>\n</aside>\n\n@if (!isOpen()) {\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n class=\"ui-sidebar-open-btn\"\n classes=\"p-3! rounded-full! shadow-lg!\"\n ariaLabel=\"Open sidebar\"\n (click)=\"isOpen.set(true)\"\n >\n <ng-icon name=\"heroBars3\" size=\"20\" strokeWidth=\"2\" class=\"shrink-0\" />\n </ui-button>\n}\n","import { Component, computed, inject, input } from '@angular/core';\n\nimport { UiSidebarComponent } from '../sidebar/sidebar.component';\n\n\nlet nextId = 0;\n\n@Component({\n selector: 'ui-sidebar-group',\n templateUrl: './sidebar-group.component.html',\n styleUrl: './sidebar-group.component.css'\n})\nexport class UiSidebarGroupComponent {\n private readonly sidebar = inject(UiSidebarComponent, { optional: true });\n\n readonly label = input.required<string>();\n\n protected readonly labelId = `ui-sidebar-group-${nextId++}`;\n\n readonly isCollapsed = computed(() => this.sidebar?.isCollapsed() ?? false);\n}\n","@if (isCollapsed()) {\n <div class=\"ui-sidebar-group-divider\" aria-hidden=\"true\"></div>\n} @else {\n <span class=\"ui-sidebar-group-label ui-text-caption\" [id]=\"labelId\">{{ label() }}</span>\n}\n\n<div\n class=\"ui-sidebar-group-items\"\n role=\"group\"\n [attr.aria-labelledby]=\"isCollapsed() ? null : labelId\"\n [attr.aria-label]=\"isCollapsed() ? label() : null\"\n>\n <ng-content />\n</div>\n","import { Component, computed, inject, input } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport { UiSidebarComponent } from '../sidebar/sidebar.component';\n\n\n@Component({\n selector: 'ui-sidebar-item',\n templateUrl: './sidebar-item.component.html',\n styleUrl: './sidebar-item.component.css',\n imports: [UiButtonComponent, NgIcon]\n})\nexport class UiSidebarItemComponent {\n private readonly sidebar = inject(UiSidebarComponent, { optional: true });\n\n readonly label = input.required<string>();\n readonly icon = input<string>('');\n\n readonly isCollapsed = computed(() => this.sidebar ? !this.sidebar.isOpen() : false);\n}\n","@if (!isCollapsed() || icon()) {\n <ui-button\n appearance=\"ghost\"\n intent=\"secondary\"\n class=\"block\"\n [classes]=\"isCollapsed()\n ? 'ui-sidebar-item ui-sidebar-item--collapsed'\n : 'ui-sidebar-item'\"\n [ariaLabel]=\"isCollapsed() ? label() : ''\"\n >\n @if (icon()) {\n <ng-icon [name]=\"icon()\" size=\"20\" class=\"shrink-0\" />\n }\n\n @if (!isCollapsed()) {\n <span class=\"truncate\">{{ label() }}</span>\n\n <span class=\"empty:hidden ms-auto\">\n <ng-content select=\"ui-badge\" />\n </span>\n }\n </ui-button>\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n viewChild\n} from '@angular/core';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { UiInputGroupComponent } from '../../forms/input-group/input-group.component';\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\nconst HEX_PATTERN = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\n@Component({\n selector: 'ui-colour',\n templateUrl: './colour.component.html',\n imports: [UiInputComponent, UiInputGroupComponent, UiButtonComponent]\n})\nexport class UiColourComponent {\n readonly value = model<string>('#000000');\n\n readonly id = input<string>('');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n private readonly picker = viewChild.required<ElementRef<HTMLInputElement>>(\n 'picker'\n );\n\n protected readonly isValid = computed(() => HEX_PATTERN.test(this.value()));\n\n // the native picker only understands lowercase #rrggbb\n protected readonly pickerValue = computed(() => {\n if (!this.isValid()) {\n return '#000000';\n }\n\n const hex = this.value().slice(1).toLowerCase();\n\n return hex.length === 3\n ? '#' + [...hex].map(char => char + char).join('')\n : '#' + hex;\n });\n\n protected openPicker(): void {\n const picker = this.picker().nativeElement;\n\n if (picker.showPicker) {\n picker.showPicker();\n } else {\n picker.click();\n }\n }\n\n protected handlePick(event: Event): void {\n this.value.set((event.target as HTMLInputElement).value);\n }\n}\n","<ui-input-group [validationState]=\"isValid() ? null : false\">\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"h-full\"\n ariaLabel=\"Pick colour\"\n [disabled]=\"disabled()\"\n (click)=\"openPicker()\"\n >\n <span\n class=\"border border-line-2 rounded size-5\"\n [style.background-color]=\"isValid() ? value() : 'transparent'\"\n ></span>\n </ui-button>\n\n <input\n #picker\n type=\"color\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"pickerValue()\"\n [disabled]=\"disabled()\"\n (input)=\"handlePick($event)\"\n />\n\n <ui-input\n [(value)]=\"value\"\n [id]=\"id()\"\n [disabled]=\"disabled()\"\n [maxlength]=\"7\"\n [spellcheck]=\"false\"\n autocomplete=\"off\"\n placeholder=\"#000000\"\n />\n</ui-input-group>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n contentChild,\n input,\n model,\n TemplateRef\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroMinus, heroPlus } from '@ng-icons/heroicons/outline';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\n\n\n// todo\n// this component is just a number input with custom step buttons\n\n@Component({\n selector: 'ui-counter',\n templateUrl: './counter.component.html',\n imports: [UiInputComponent, NgTemplateOutlet, NgIcon],\n providers: [provideIcons({ heroPlus, heroMinus })]\n})\nexport class UiCounterComponent {\n readonly value = model<number | null>(null);\n readonly step = input<number>(1);\n readonly max = input<number>();\n readonly min = input<number>();\n readonly placeholder = input<string>('');\n\n // Leading/Trialing elements that appear inside of the input.\n readonly leadingElement = contentChild<TemplateRef<unknown>>('leading');\n readonly trailingElement = contentChild<TemplateRef<unknown>>('trailing');\n\n onStepUp() {\n let value = this.value() ?? 0;\n\n value += this.step();\n\n const max = this.max();\n\n if (max !== undefined && value > max) {\n value = max;\n }\n\n this.value.set(value);\n }\n\n onStepDown() {\n let value = this.value() ?? 0;\n\n value -= this.step();\n\n const min = this.min();\n\n if (min !== undefined && value < min) {\n value = min;\n }\n\n this.value.set(value);\n }\n}\n","<ui-input\n [(value)]=\"value\"\n [placeholder]=\"placeholder()\"\n type=\"number\"\n classes=\"[&::-webkit-inner-spin-button]:m-0 [&::-webkit-outer-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [appearance:textfield]\"\n>\n <ng-template #leading>\n <ng-container *ngTemplateOutlet=\"leadingElement()\" />\n </ng-template>\n <ng-template #trailing>\n <ng-container *ngTemplateOutlet=\"trailingElement()\" />\n\n <div class=\"flex self-stretch ms-2\">\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8\"\n (click)=\"onStepUp()\"\n >\n <ng-icon name=\"heroPlus\" class=\"shrink-0\" />\n </button>\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8\"\n (click)=\"onStepDown()\"\n >\n <ng-icon name=\"heroMinus\" class=\"shrink-0\" />\n </button>\n </div>\n </ng-template>\n</ui-input>\n","import {\n afterNextRender,\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroCalendarDateRange, heroXMark } from '@ng-icons/heroicons/outline';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport type { InputValidation } from '../../forms/input/input.types';\nimport { UiCalendarComponent } from '../../generic/calendar/calendar.component';\nimport type {\n DateRange,\n IsoDate,\n WeekStart\n} from '../../generic/calendar/calendar.types';\nimport { parseIsoDate } from '../../generic/calendar/calendar.utils';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../../generic/dropdown/dropdown.directives';\nimport type { DateRangePreset } from './date-range-picker.types';\n\n\nconst OPEN_KEYS = ['Enter', ' ', 'ArrowDown'];\n\n@Component({\n selector: 'ui-date-range-picker',\n templateUrl: './date-range-picker.component.html',\n styleUrl: './date-range-picker.component.css',\n imports: [\n UiInputComponent,\n UiCalendarComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n NgIcon\n ],\n host: { class: 'block' },\n providers: [provideIcons({ heroCalendarDateRange, heroXMark })]\n})\nexport class UiDateRangePickerComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n readonly value = model<DateRange>({ start: null, end: null });\n\n readonly id = input<string>('');\n readonly placeholder = input<string>('Select dates');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(true, { transform: booleanAttribute });\n readonly validationState = input<InputValidation>(null);\n readonly describedBy = input<string>('');\n\n readonly min = input<IsoDate | null>(null);\n readonly max = input<IsoDate | null>(null);\n readonly isDateDisabled = input<(date: IsoDate) => boolean>(() => false);\n readonly weekStart = input<WeekStart>(1);\n readonly locale = input<string>('en-GB');\n\n /** Intl options for the dates shown in the input. */\n readonly format = input<Intl.DateTimeFormatOptions>({\n dateStyle: 'medium'\n });\n\n /** Quick picks beside the calendar, see date-range-presets.ts for ready made ones. */\n readonly presets = input<DateRangePreset[]>([]);\n\n protected readonly isOpen = signal(false);\n\n private readonly calendar = viewChild(UiCalendarComponent);\n\n protected readonly hasValue = computed(() => !!this.value().start);\n\n // worked out on open so \"today\" is never stale\n protected readonly presetRanges = computed(() =>\n this.isOpen()\n ? this.presets().map(preset => this.clamp(preset.range()))\n : []\n );\n\n protected readonly activePreset = computed(() => {\n const { start, end } = this.value();\n\n return this.presetRanges().findIndex(range =>\n range.start === start && range.end === end\n );\n });\n\n protected readonly display = computed(() => {\n const start = parseIsoDate(this.value().start);\n const end = parseIsoDate(this.value().end);\n const format = new Intl.DateTimeFormat(this.locale(), this.format());\n\n if (!start) {\n return '';\n }\n\n // formatRange shares the month/year, e.g. \"1 – 7 Sept 2026\"\n return end\n ? format.formatRange(start, end)\n : `${format.format(start)} – …`;\n });\n\n protected toggle(): void {\n if (!this.disabled()) {\n this.isOpen.update(open => !open);\n }\n }\n\n protected handleInputKeydown(event: KeyboardEvent): void {\n if (this.disabled() || !OPEN_KEYS.includes(event.key)) {\n return;\n }\n\n event.preventDefault();\n this.isOpen.set(true);\n\n afterNextRender(() => this.calendar()?.focusActiveDate(), {\n injector: this.injector\n });\n }\n\n protected handleRange(range: DateRange): void {\n // only close once both ends are picked\n if (range.start && range.end) {\n this.isOpen.set(false);\n this.focusInput();\n }\n }\n\n protected choosePreset(preset: DateRangePreset): void {\n this.value.set(this.clamp(preset.range()));\n this.isOpen.set(false);\n this.focusInput();\n }\n\n protected handlePanelKeydown(event: KeyboardEvent): void {\n // the overlay closes itself on escape, we just put focus back\n if (event.key === 'Escape') {\n this.focusInput();\n }\n }\n\n protected clear(event: Event): void {\n // stop the input underneath from opening the calendar\n event.stopPropagation();\n\n this.value.set({ start: null, end: null });\n this.focusInput();\n }\n\n // keeps presets inside min/max, e.g. \"This year\" stops at today when max is today\n private clamp({ start, end }: DateRange): DateRange {\n const min = this.min();\n const max = this.max();\n\n return {\n start: start && min && start < min ? min : start,\n end: end && max && end > max ? max : end\n };\n }\n\n private focusInput(): void {\n this.host.nativeElement.querySelector('input')?.focus();\n }\n}\n","<ui-dropdown\n [isOpen]=\"isOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n class=\"w-full\"\n>\n <ui-input\n [value]=\"display()\"\n [id]=\"id()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n ariaHasPopup=\"dialog\"\n [validationState]=\"validationState()\"\n classes=\"cursor-pointer\"\n autocomplete=\"off\"\n readonly\n (click)=\"toggle()\"\n (keydown)=\"handleInputKeydown($event)\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroCalendarDateRange\"\n class=\"ms-3 text-muted-foreground-1 shrink-0\"\n />\n </ng-template>\n\n <ng-template #trailing>\n @if (clearable() && hasValue() && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8 self-stretch text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear dates\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"ui-date-range-panel\">\n @if (presets().length) {\n <div class=\"ui-date-range-presets\" role=\"group\" aria-label=\"Quick ranges\">\n @for (preset of presets(); track preset.label; let index = $index) {\n <button\n type=\"button\"\n class=\"ui-date-range-preset ui-text-body-alt\"\n [attr.aria-pressed]=\"index === activePreset()\"\n (click)=\"choosePreset(preset)\"\n (keydown)=\"handlePanelKeydown($event)\"\n >\n {{ preset.label }}\n </button>\n }\n </div>\n }\n\n <ui-calendar\n class=\"p-3\"\n mode=\"range\"\n [(range)]=\"value\"\n [min]=\"min()\"\n [max]=\"max()\"\n [isDateDisabled]=\"isDateDisabled()\"\n [weekStart]=\"weekStart()\"\n [locale]=\"locale()\"\n (rangeChange)=\"handleRange($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n </div>\n </div>\n }\n</ui-dropdown>\n","import type { WeekStart } from '../../generic/calendar/calendar.types';\nimport { addDays, toIsoDate } from '../../generic/calendar/calendar.utils';\nimport type { DateRangePreset } from './date-range-picker.types';\n\n\n// everything is relative to the moment it's clicked, not when the page loaded\nconst today = () => {\n const now = new Date();\n\n return new Date(now.getFullYear(), now.getMonth(), now.getDate());\n};\n\nconst between = (start: Date, end: Date) => ({\n start: toIsoDate(start),\n end: toIsoDate(end)\n});\n\nexport function todayPreset(label = 'Today'): DateRangePreset {\n return { label, range: () => between(today(), today()) };\n}\n\n/** The last `days` days, counting today. */\nexport function lastDaysPreset(days: number, label = `Last ${days} days`): DateRangePreset {\n return { label, range: () => between(addDays(today(), 1 - days), today()) };\n}\n\nexport function thisWeekPreset(weekStart: WeekStart = 1, label = 'This week'): DateRangePreset {\n return {\n label,\n range: () => {\n const offset = (today().getDay() - weekStart + 7) % 7;\n const start = addDays(today(), -offset);\n\n return between(start, addDays(start, 6));\n }\n };\n}\n\n/** A calendar month, 0 is this month, -1 is last month. */\nexport function monthPreset(offset = 0, label = offset ? 'Last month' : 'This month'): DateRangePreset {\n return {\n label,\n range: () => {\n const now = today();\n\n return between(\n new Date(now.getFullYear(), now.getMonth() + offset, 1),\n new Date(now.getFullYear(), now.getMonth() + offset + 1, 0)\n );\n }\n };\n}\n\n/** A calendar year, 0 is this year, -1 is last year. */\nexport function yearPreset(offset = 0, label = offset ? 'Last year' : 'This year'): DateRangePreset {\n return {\n label,\n range: () => {\n const year = today().getFullYear() + offset;\n\n return between(new Date(year, 0, 1), new Date(year, 11, 31));\n }\n };\n}\n\n/**\n * A financial year starting on the given day, e.g. the UK tax year is\n * `financialYearPreset(3, 6)` for 6 April. 0 is the current one, -1 the one before.\n */\nexport function financialYearPreset(\n startMonth: number,\n startDay: number,\n offset = 0,\n label = offset ? 'Last financial year' : 'This financial year'\n): DateRangePreset {\n return {\n label,\n range: () => {\n const now = today();\n const thisYearsStart = new Date(now.getFullYear(), startMonth, startDay);\n\n // before this year's start date we're still in the one that began last year\n const startYear = now >= thisYearsStart ? now.getFullYear() : now.getFullYear() - 1;\n const start = new Date(startYear + offset, startMonth, startDay);\n const end = addDays(new Date(startYear + offset + 1, startMonth, startDay), -1);\n\n return between(start, end);\n }\n };\n}\n\n/** A sensible starting set, pass your own list to change it. */\nexport function defaultDateRangePresets(weekStart: WeekStart = 1): DateRangePreset[] {\n return [\n todayPreset(),\n lastDaysPreset(7),\n lastDaysPreset(30),\n thisWeekPreset(weekStart),\n monthPreset(0),\n monthPreset(-1),\n yearPreset(0),\n yearPreset(-1)\n ];\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroClock } from '@ng-icons/heroicons/outline';\n\nimport { UiSelectComponent } from '../../forms/select/select.component';\nimport { SelectLocalDataSource } from '../../forms/select/select.datasource';\nimport { parseTime, toTime } from '../../generic/calendar/calendar.utils';\n\n\n@Component({\n selector: 'ui-time-select',\n templateUrl: './time-select.component.html',\n styleUrl: './time-select.component.css',\n imports: [UiSelectComponent, NgIcon],\n host: { class: 'inline-flex items-center gap-x-1' },\n providers: [provideIcons({ heroClock })]\n})\nexport class UiTimeSelectComponent {\n /** 24 hour \"HH:mm\" string. */\n readonly value = model<string>('00:00');\n\n readonly minuteStep = input<number>(5);\n readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly hours = computed(() =>\n parseTime(this.value())?.hours ?? 0\n );\n protected readonly minutes = computed(() =>\n parseTime(this.value())?.minutes ?? 0\n );\n\n protected readonly hourSource = new SelectLocalDataSource(\n Array.from({ length: 24 }, (_, hour) => hour),\n () => true\n );\n\n protected readonly minuteSource = computed(() => {\n const step = Math.max(1, Math.floor(this.minuteStep()));\n\n return new SelectLocalDataSource(\n Array.from(\n { length: Math.ceil(60 / step) },\n (_, index) => index * step\n ),\n () => true\n );\n });\n\n protected readonly pad = (value: number) => String(value).padStart(2, '0');\n\n protected setHours(hours: number | null): void {\n if (hours !== null) {\n this.value.set(toTime(hours, this.minutes()));\n }\n }\n\n protected setMinutes(minutes: number | null): void {\n if (minutes !== null) {\n this.value.set(toTime(this.hours(), minutes));\n }\n }\n}\n","<ng-icon name=\"heroClock\" class=\"me-1 text-muted-foreground-1 shrink-0\" />\n\n<ui-select\n class=\"ui-time-select-part\"\n [dataSource]=\"hourSource\"\n [displayWith]=\"pad\"\n [pageSize]=\"24\"\n [selectedItem]=\"hours()\"\n [disabled]=\"disabled()\"\n (selectionChange)=\"setHours($event)\"\n/>\n\n<span class=\"text-muted-foreground-1\" aria-hidden=\"true\">:</span>\n\n<ui-select\n class=\"ui-time-select-part\"\n [dataSource]=\"minuteSource()\"\n [displayWith]=\"pad\"\n [pageSize]=\"60\"\n [selectedItem]=\"minutes()\"\n [disabled]=\"disabled()\"\n (selectionChange)=\"setMinutes($event)\"\n/>\n","import {\n afterNextRender,\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroCalendar, heroXMark } from '@ng-icons/heroicons/outline';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport type { InputValidation } from '../../forms/input/input.types';\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport { UiCalendarComponent } from '../../generic/calendar/calendar.component';\nimport type {\n IsoDate,\n IsoDateTime,\n WeekStart\n} from '../../generic/calendar/calendar.types';\nimport {\n parseIsoDateTime,\n parseTime,\n toIsoDate\n} from '../../generic/calendar/calendar.utils';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../../generic/dropdown/dropdown.directives';\nimport { UiTimeSelectComponent } from '../time-select/time-select.component';\n\n\nconst OPEN_KEYS = ['Enter', ' ', 'ArrowDown'];\n\n@Component({\n selector: 'ui-datepicker',\n templateUrl: './datepicker.component.html',\n styleUrl: './datepicker.component.css',\n imports: [\n UiInputComponent,\n UiCalendarComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n UiButtonComponent,\n UiTimeSelectComponent,\n NgIcon,\n UiCardComponent\n ],\n host: { class: 'block' },\n providers: [provideIcons({ heroCalendar, heroXMark })]\n})\nexport class UiDatepickerComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n /** \"2026-09-29\", or \"2026-09-29T14:30\" when `withTime` is on. */\n readonly value = model<IsoDate | IsoDateTime | null>(null);\n\n readonly id = input<string>('');\n readonly placeholder = input<string>('Select date');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(true, { transform: booleanAttribute });\n readonly validationState = input<InputValidation>(null);\n readonly describedBy = input<string>('');\n\n readonly min = input<IsoDate | null>(null);\n readonly max = input<IsoDate | null>(null);\n readonly isDateDisabled = input<(date: IsoDate) => boolean>(() => false);\n readonly weekStart = input<WeekStart>(1);\n readonly locale = input<string>('en-GB');\n\n readonly withTime = input(false, { transform: booleanAttribute });\n readonly minuteStep = input<number>(5);\n\n /** Time used when a date is picked before a time has been chosen. */\n readonly defaultTime = input<string>('00:00');\n\n /** Intl options for the value shown in the input. */\n readonly format = input<Intl.DateTimeFormatOptions | null>(null);\n\n protected readonly isOpen = signal(false);\n\n private readonly calendar = viewChild(UiCalendarComponent);\n\n protected readonly datePart = computed(() =>\n this.value()?.slice(0, 10) ?? null\n );\n\n protected readonly timePart = computed(() => {\n const time = this.value()?.slice(11, 16);\n\n return parseTime(time) ? time! : this.defaultTime();\n });\n\n protected readonly display = computed(() => {\n const date = parseIsoDateTime(this.value());\n const format = this.format() ?? (this.withTime()\n ? { dateStyle: 'medium', timeStyle: 'short' } as const\n : { dateStyle: 'medium' } as const);\n\n return date\n ? new Intl.DateTimeFormat(this.locale(), format).format(date)\n : '';\n });\n\n protected toggle(): void {\n if (!this.disabled()) {\n this.isOpen.update(open => !open);\n }\n }\n\n protected handleInputKeydown(event: KeyboardEvent): void {\n if (this.disabled() || !OPEN_KEYS.includes(event.key)) {\n return;\n }\n\n event.preventDefault();\n this.isOpen.set(true);\n\n afterNextRender(() => this.calendar()?.focusActiveDate(), {\n injector: this.injector\n });\n }\n\n protected handlePick(date: IsoDate | null): void {\n if (!date) {\n return;\n }\n\n if (!this.withTime()) {\n this.value.set(date);\n this.close();\n return;\n }\n\n // stays open so the time can be set too\n this.value.set(`${date}T${this.timePart()}`);\n }\n\n protected handleTime(time: string): void {\n // picking a time first puts it on today\n const date = this.datePart() ?? toIsoDate(new Date());\n\n this.value.set(`${date}T${time}`);\n }\n\n protected close(): void {\n this.isOpen.set(false);\n this.focusInput();\n }\n\n protected handlePanelKeydown(event: KeyboardEvent): void {\n // the overlay closes itself on escape, we just put focus back\n if (event.key === 'Escape') {\n this.focusInput();\n }\n }\n\n protected clear(event: Event): void {\n // stop the input underneath from opening the calendar\n event.stopPropagation();\n\n this.value.set(null);\n this.focusInput();\n }\n\n private focusInput(): void {\n this.host.nativeElement.querySelector('input')?.focus();\n }\n}\n","<ui-dropdown\n [isOpen]=\"isOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n class=\"w-full\"\n>\n <ui-input\n [value]=\"display()\"\n [id]=\"id()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n ariaHasPopup=\"dialog\"\n [validationState]=\"validationState()\"\n classes=\"cursor-pointer\"\n autocomplete=\"off\"\n readonly\n (click)=\"toggle()\"\n (keydown)=\"handleInputKeydown($event)\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroCalendar\"\n class=\"ms-3 text-muted-foreground-1 shrink-0\"\n />\n </ng-template>\n\n <ng-template #trailing>\n @if (clearable() && value() && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center self-stretch w-8 text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear date\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <ui-card radius=\"xl\" class=\"p-3\">\n <ui-calendar\n [value]=\"datePart()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [isDateDisabled]=\"isDateDisabled()\"\n [weekStart]=\"weekStart()\"\n [locale]=\"locale()\"\n (valueChange)=\"handlePick($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n\n @if (withTime()) {\n <div class=\"flex justify-between items-center gap-x-2 mt-3 pt-3 border-line-2 border-t\">\n <ui-time-select\n [value]=\"timePart()\"\n [minuteStep]=\"minuteStep()\"\n (valueChange)=\"handleTime($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n\n <ui-button size=\"sm\" (click)=\"close()\">Done</ui-button>\n </div>\n }\n </ui-card>\n </div>\n }\n</ui-dropdown>\n","import { Component, input, model } from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroChevronDown } from '@ng-icons/heroicons/outline';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport {\n ButtonAppearance,\n ButtonIntent\n} from '../../generic/button/button.types';\n\n\n@Component({\n selector: 'ui-dropdown-button',\n templateUrl: './dropdown-button.component.html',\n imports: [UiButtonComponent, NgIcon],\n providers: [provideIcons({ heroChevronDown })]\n})\nexport class UiDropdownButtonComponent {\n readonly intent = input<ButtonIntent>('secondary');\n readonly appearance = input<ButtonAppearance>('white');\n readonly icon = input<string>('heroChevronDown');\n readonly isOpen = model.required<boolean>();\n}\n","<ui-button\n [intent]=\"intent()\"\n [appearance]=\"appearance()\"\n (click)=\"isOpen.update(value => !value)\"\n>\n <ng-content />\n <ng-icon\n name=\"heroChevronDown\"\n class=\"size-4 transition-transform duration-100 shrink-0\"\n [class.rotate-180]=\"isOpen()\"\n />\n</ui-button>\n","import { Component, input } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { DropdownMenuItem } from './dropdown-menu.types';\n\n\n@Component({\n selector: 'ui-dropdown-menu',\n templateUrl: './dropdown-menu.component.html',\n imports: [UiButtonComponent, UiCardComponent, NgIcon]\n})\nexport class UiDropdownMenuComponent {\n readonly items = input.required<DropdownMenuItem[]>();\n}\n","<ui-card radius=\"lg\" class=\"divide-y w-3xs max-w-md\" role=\"menu\">\n @for (item of items(); track $index) {\n @if ('divider' in item) {\n <div class=\"my-1 border-border border-t\"></div>\n } @else if ('children' in item) {\n <div class=\"flex flex-col gap-y-0.5 p-1\">\n <span\n class=\"block px-4 pt-2 pb-1 font-medium text-muted-foreground ui-text-caption uppercase\"\n >\n {{ item.label }}\n </span>\n\n @for (child of item.children; track child.label) {\n <ui-button\n appearance=\"none\"\n classes=\"flex items-center gap-x-3.5 px-3 py-2 rounded-lg ui-text-body-alt text-dropdown-item-foreground hover:bg-dropdown-item-hover focus:bg-dropdown-item-focus w-full border-transparent focus:outline-hidden!\"\n (click)=\"child.onClick()\"\n >\n @if (child.icon) {\n <ng-icon\n [name]=\"child.icon\"\n size=\"18\"\n strokeWidth=\"1.5\"\n class=\"size-4 shrink-0\"\n />\n }\n\n {{ child.label }}\n </ui-button>\n }\n </div>\n } @else {\n <div class=\"p-1\">\n <ui-button\n appearance=\"none\"\n classes=\"flex items-center gap-x-3.5 px-3 py-2 rounded-lg ui-text-body-alt text-dropdown-item-foreground hover:bg-dropdown-item-hover focus:bg-dropdown-item-focus w-full border-transparent focus:outline-hidden!\"\n (click)=\"item.onClick()\"\n >\n @if (item.icon) {\n <ng-icon\n [name]=\"item.icon\"\n size=\"18\"\n strokeWidth=\"2\"\n class=\"size-4 shrink-0\"\n />\n }\n\n {{ item.label }}\n </ui-button>\n </div>\n }\n }\n</ui-card>\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n output,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroArrowUp, heroXMark } from '@ng-icons/heroicons/outline';\n\nimport type { FileRejection } from '../../forms/file/file.types';\nimport { selectFiles } from '../../forms/file/file.utils';\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { UiInputGroupComponent } from '../../forms/input-group/input-group.component';\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\n@Component({\n selector: 'ui-file-input',\n templateUrl: './file-input.component.html',\n imports: [\n UiInputComponent,\n UiInputGroupComponent,\n UiButtonComponent,\n NgIcon\n ],\n providers: [provideIcons({ heroArrowUp, heroXMark })]\n})\nexport class UiFileInputComponent {\n readonly value = model<File[]>([]);\n\n readonly id = input<string>('');\n readonly accept = input<string>('');\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly describedBy = input<string>('');\n\n /** Max size per file in bytes. */\n readonly maxSize = input<number | null>(null);\n\n readonly placeholder = input<string>('No file chosen');\n readonly buttonLabel = input<string>('Browse');\n\n readonly rejected = output<FileRejection[]>();\n\n private readonly picker = viewChild.required<ElementRef<HTMLInputElement>>(\n 'picker'\n );\n\n protected readonly hasRejection = signal(false);\n\n protected readonly summary = computed(() => {\n const files = this.value();\n\n return files.length > 1\n ? `${files.length} files`\n : files[0]?.name ?? '';\n });\n\n protected openPicker(): void {\n if (this.disabled()) {\n return;\n }\n\n const picker = this.picker().nativeElement;\n\n if (picker.showPicker) {\n picker.showPicker();\n } else {\n picker.click();\n }\n }\n\n protected handlePick(event: Event): void {\n const target = event.target as HTMLInputElement;\n const { accepted, rejected } = selectFiles(\n [...target.files ?? []],\n this.accept(),\n this.maxSize()\n );\n\n // reset so picking the same file again still fires change\n target.value = '';\n\n this.hasRejection.set(rejected.length > 0);\n\n if (rejected.length) {\n this.rejected.emit(rejected);\n }\n\n if (accepted.length) {\n this.value.set(accepted);\n }\n }\n\n protected clear(event: Event): void {\n // stop the input underneath from opening the picker\n event.stopPropagation();\n\n this.value.set([]);\n this.hasRejection.set(false);\n }\n}\n","<ui-input-group [validationState]=\"hasRejection() ? false : null\">\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"h-full\"\n [disabled]=\"disabled()\"\n (click)=\"openPicker()\"\n >\n <ng-icon name=\"heroArrowUpTray\" class=\"shrink-0\" />\n {{ buttonLabel() }}\n </ui-button>\n\n <input\n #picker\n type=\"file\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"handlePick($event)\"\n />\n\n <ui-input\n [value]=\"summary()\"\n [id]=\"id()\"\n [disabled]=\"disabled()\"\n [placeholder]=\"placeholder()\"\n [describedBy]=\"describedBy()\"\n classes=\"truncate cursor-pointer\"\n readonly\n (click)=\"openPicker()\"\n >\n <ng-template #trailing>\n @if (value().length && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8 self-stretch text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear files\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n</ui-input-group>\n","import {\n booleanAttribute,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n model,\n numberAttribute,\n output,\n untracked\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroMagnifyingGlass, heroXMark } from '@ng-icons/heroicons/outline';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { type UiLinkedTable, UiTableRegistry } from '../../generic/table/table.registry';\n\n\n@Component({\n selector: 'ui-search',\n templateUrl: './search.component.html',\n styleUrl: './search.component.css',\n imports: [UiInputComponent, NgIcon],\n providers: [provideIcons({ heroMagnifyingGlass, heroXMark })],\n host: { class: 'block' }\n})\nexport class UiSearchComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly registry = inject(UiTableRegistry);\n\n readonly value = model<string>('');\n\n readonly placeholder = input<string>('Search');\n readonly ariaLabel = input<string>('Search');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** How long typing has to pause before `searched` fires, in milliseconds. */\n readonly debounce = input(300, { transform: numberAttribute });\n\n /** The `tableId` of a ui-table to search, it can render before or after this. */\n readonly table = input<string | null>(null);\n\n /** The value once typing pauses, for running a search. Clearing fires straight away. */\n readonly searched = output<string>();\n\n private readonly linked = computed(() => {\n const id = this.table();\n\n return id ? this.registry.get(id) : null;\n });\n\n private timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n let previous: UiLinkedTable | null = null;\n\n effect(() => {\n const table = this.linked();\n const query = table?.query() ?? '';\n\n untracked(() => {\n const justLinked = table !== previous;\n\n previous = table;\n\n if (!table) {\n return;\n }\n\n if (justLinked && !query && this.value()) {\n table.query.set(this.value());\n\n return;\n }\n\n this.value.set(query);\n });\n });\n\n inject(DestroyRef).onDestroy(() => clearTimeout(this.timer));\n }\n\n protected onInput(value: string): void {\n this.value.set(value);\n this.linked()?.query.set(value);\n\n clearTimeout(this.timer);\n this.timer = setTimeout(() => this.searched.emit(value), this.debounce());\n }\n\n protected clear(): void {\n if (!this.value()) {\n return;\n }\n\n clearTimeout(this.timer);\n this.value.set('');\n this.linked()?.query.set('');\n this.searched.emit('');\n\n this.host.nativeElement.querySelector('input')?.focus();\n }\n}\n","<ui-input\n [value]=\"value()\"\n (valueChange)=\"onInput($event)\"\n [placeholder]=\"placeholder()\"\n [ariaLabel]=\"ariaLabel()\"\n [disabled]=\"disabled()\"\n [spellcheck]=\"false\"\n inputRole=\"searchbox\"\n autocomplete=\"off\"\n (keydown.escape)=\"clear()\"\n>\n <ng-template #leading>\n <ng-icon name=\"heroMagnifyingGlass\" class=\"ms-3 size-4 text-muted-foreground-1 shrink-0\" />\n </ng-template>\n\n <ng-template #trailing>\n @if (value() && !disabled()) {\n <button type=\"button\" class=\"ui-search-clear\" aria-label=\"Clear search\" (click)=\"clear()\">\n <ng-icon name=\"heroXMark\" size=\"16\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n</ui-input>\n","import { booleanAttribute, Component, input, model } from '@angular/core';\n\nimport { UiCheckboxComponent } from '../../forms/checkbox/checkbox.component';\n\n\n// restyles ui-checkbox into a track-and-thumb switch, same behaviour underneath\n@Component({\n selector: 'ui-switch',\n templateUrl: './switch.component.html',\n imports: [UiCheckboxComponent]\n})\nexport class UiSwitchComponent {\n readonly value = model.required<boolean>();\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly disabled = input(false, { transform: booleanAttribute });\n}\n","<label class=\"inline-flex items-center gap-2 cursor-pointer\" [class.opacity-50]=\"disabled()\">\n <span class=\"relative inline-flex items-center rounded-full focus-within:ring-2 focus-within:ring-primary-200/50\">\n <!--\n reuses ui-checkbox for the real state/behaviour, class-bound track/thumb below\n react to value() directly instead of peer-checked, since peer-* relies on the\n input and the styled element being real DOM siblings, which breaks once the\n input is nested inside ui-checkbox's own host element\n -->\n <ui-checkbox\n [(value)]=\"value\"\n [disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n classes=\"sr-only\"\n />\n\n <span\n class=\"w-9 h-5 rounded-full transition-colors\"\n [class.bg-primary-600]=\"value()\"\n [class.bg-surface-1]=\"!value()\"\n ></span>\n\n <span\n class=\"absolute left-0.5 size-4 rounded-full bg-white shadow transition-transform\"\n [class.translate-x-4]=\"value()\"\n ></span>\n </span>\n\n <ng-content />\n</label>\n","import type { DateRange, IsoDate } from '../../generic/calendar/calendar.types';\nimport type { DateRangePreset } from '../date-range-picker/date-range-picker.types';\n\n\nexport const TableFiltersBreakpoints = {\n sm: '40rem',\n md: '48rem',\n lg: '64rem',\n xl: '80rem',\n '2xl': '96rem'\n} as const;\n\n/** @see {@link TableFiltersBreakpoints} */\nexport type TableFiltersBreakpoint = keyof typeof TableFiltersBreakpoints;\n\nexport interface TableFacetOption {\n value: unknown;\n label: string;\n}\n\n/** Writes the picked value, or an array when `multiple`, under `id`. */\nexport interface TableOptionsFacet {\n id: string;\n label: string;\n kind: 'options';\n options: TableFacetOption[];\n\n multiple?: boolean;\n}\n\n/** Writes `{ start, end }` ISO dates under `id`. */\nexport interface TableDateRangeFacet {\n id: string;\n label: string;\n kind: 'dateRange';\n\n /** Quick picks, see date-range-presets.ts for ready made ones. */\n presets?: DateRangePreset[];\n placeholder?: string;\n min?: IsoDate | null;\n max?: IsoDate | null;\n}\n\nexport type TableFacet = TableOptionsFacet | TableDateRangeFacet;\n\nexport type TableFacetDateRange = DateRange;\n","import { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n untracked\n} from '@angular/core';\n\nimport { UiCheckboxComponent } from '../../forms/checkbox/checkbox.component';\nimport { UiRadioComponent } from '../../forms/radio/radio.component';\nimport { UiBadgeComponent } from '../../generic/badge/badge.component';\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport type { DateRange } from '../../generic/calendar/calendar.types';\nimport { UiDrawerComponent } from '../../generic/drawer/drawer.component';\nimport {\n type UiLinkedTable,\n UiTableRegistry\n} from '../../generic/table/table.registry';\nimport { UiDateRangePickerComponent } from '../date-range-picker/date-range-picker.component';\nimport {\n type TableDateRangeFacet,\n type TableFacet,\n type TableFacetOption,\n type TableFiltersBreakpoint,\n TableFiltersBreakpoints,\n type TableOptionsFacet\n} from './table-filters.types';\n\n\nlet nextId = 0;\n\ntype Filters = Record<string, unknown>;\n\ntype DateMode = 'any' | 'custom' | number;\n\n@Component({\n selector: 'ui-table-filters',\n templateUrl: './table-filters.component.html',\n styleUrl: './table-filters.component.css',\n imports: [\n NgTemplateOutlet,\n UiButtonComponent,\n UiBadgeComponent,\n UiDrawerComponent,\n UiCheckboxComponent,\n UiRadioComponent,\n UiDateRangePickerComponent\n ],\n host: { class: 'block' }\n})\nexport class UiTableFiltersComponent {\n private readonly registry = inject(UiTableRegistry);\n\n readonly facets = input.required<TableFacet[]>();\n\n /** The `tableId` of a ui-table to filter, it can render before or after this. */\n readonly table = input<string | null>(null);\n\n readonly value = model<Filters>({});\n\n /** Below this breakpoint the panel becomes a Filters button and a drawer. */\n readonly collapseBelow = input<TableFiltersBreakpoint>('lg');\n\n protected readonly idPrefix = `ui-table-filters-${nextId++}`;\n\n protected readonly anyDate: DateMode = 'any';\n protected readonly customDate: DateMode = 'custom';\n\n private readonly customDates = signal<ReadonlySet<string>>(new Set());\n\n private readonly linked = computed(() => {\n const id = this.table();\n\n return id ? this.registry.get(id) : null;\n });\n\n protected readonly appliedCount = computed(() =>\n this.facets().filter(facet => facet.id in this.value()).length\n );\n\n protected readonly anyApplied = computed(() => this.appliedCount() > 0);\n\n private readonly window = inject(DOCUMENT).defaultView;\n\n // two copies of the filters would share radio names\n protected readonly wide = signal(true);\n\n constructor() {\n effect(onCleanup => {\n const media = this.window?.matchMedia?.(\n `(min-width: ${TableFiltersBreakpoints[this.collapseBelow()]})`\n );\n\n if (!media) {\n return;\n }\n\n const onChange = (event: MediaQueryListEvent) =>\n this.wide.set(event.matches);\n\n this.wide.set(media.matches);\n media.addEventListener('change', onChange);\n onCleanup(() => media.removeEventListener('change', onChange));\n });\n\n let previous: UiLinkedTable | null = null;\n\n effect(() => {\n const table = this.linked();\n const filters = table?.filters() ?? {};\n\n untracked(() => {\n const justLinked = table !== previous;\n\n previous = table;\n\n if (!table) {\n return;\n }\n\n if (justLinked && this.anyApplied() && !this.hasAny(filters)) {\n table.filters.set({\n ...filters,\n ...this.ownFilters(this.value())\n });\n\n return;\n }\n\n this.value.set(filters);\n });\n });\n }\n\n protected groupName(facet: TableFacet): string {\n return `${this.idPrefix}-${facet.id}`;\n }\n\n protected choiceId(facet: TableFacet, choice: number | string): string {\n return `${this.groupName(facet)}-${choice}`;\n }\n\n protected picked(facet: TableOptionsFacet): unknown {\n return this.value()[facet.id] ?? null;\n }\n\n protected pick(facet: TableOptionsFacet, value: unknown): void {\n this.apply(facet.id, value ?? undefined);\n }\n\n protected isChecked(\n facet: TableOptionsFacet,\n option: TableFacetOption\n ): boolean {\n const applied = this.value()[facet.id];\n\n return Array.isArray(applied) && applied.includes(option.value);\n }\n\n protected check(\n facet: TableOptionsFacet,\n option: TableFacetOption,\n checked: boolean\n ): void {\n const applied = this.value()[facet.id];\n const picked = (Array.isArray(applied) ? applied : []).filter(value =>\n value !== option.value\n );\n const next = checked ? [...picked, option.value] : picked;\n\n this.apply(facet.id, next.length ? next : undefined);\n }\n\n protected range(facet: TableDateRangeFacet): DateRange {\n return (this.value()[facet.id] as DateRange | undefined) ??\n { start: null, end: null };\n }\n\n protected dateMode(facet: TableDateRangeFacet): DateMode {\n if (this.customDates().has(facet.id)) {\n return 'custom';\n }\n\n const applied = this.range(facet);\n\n if (!applied.start) {\n return 'any';\n }\n\n const index = (facet.presets ?? []).findIndex(preset => {\n const range = preset.range();\n\n return range.start === applied.start && range.end === applied.end;\n });\n\n return index === -1 ? 'custom' : index;\n }\n\n protected pickDate(facet: TableDateRangeFacet, mode: DateMode): void {\n this.setCustom(facet.id, mode === 'custom');\n\n if (mode === 'any') {\n this.apply(facet.id, undefined);\n } else if (mode !== 'custom') {\n this.apply(facet.id, facet.presets?.[mode]?.range());\n }\n }\n\n protected setRange(facet: TableDateRangeFacet, range: DateRange): void {\n this.apply(facet.id, range.start ? range : undefined);\n }\n\n protected clearAll(): void {\n this.customDates.set(new Set());\n this.write(this.withoutOwn(this.currentFilters()));\n }\n\n private setCustom(id: string, custom: boolean): void {\n this.customDates.update(ids => {\n const next = new Set(ids);\n\n if (custom) {\n next.add(id);\n } else {\n next.delete(id);\n }\n\n return next;\n });\n }\n\n private apply(id: string, applied: unknown): void {\n const next = { ...this.currentFilters() };\n\n if (applied === undefined) {\n delete next[id];\n } else {\n next[id] = applied;\n }\n\n this.write(next);\n }\n\n private write(filters: Filters): void {\n this.value.set(filters);\n this.linked()?.filters.set(filters);\n }\n\n private currentFilters(): Filters {\n return this.linked()?.filters() ?? this.value();\n }\n\n private ownFilters(filters: Filters): Filters {\n const ids = new Set(this.facets().map(facet => facet.id));\n\n return Object.fromEntries(\n Object.entries(filters).filter(([id]) => ids.has(id))\n );\n }\n\n private withoutOwn(filters: Filters): Filters {\n const ids = new Set(this.facets().map(facet => facet.id));\n\n return Object.fromEntries(\n Object.entries(filters).filter(([id]) => !ids.has(id))\n );\n }\n\n private hasAny(filters: Filters): boolean {\n return Object.keys(this.ownFilters(filters)).length > 0;\n }\n}\n","@if (wide()) {\n <div class=\"ui-table-filters-panel ui-table-filters-panel--card\">\n <ng-container *ngTemplateOutlet=\"body; context: { $implicit: true }\" />\n </div>\n} @else {\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"gap-x-2 h-9.5 py-0!\"\n (click)=\"drawer.isOpen.set(true)\"\n >\n Filters\n @if (appliedCount()) {\n <ui-badge appearance=\"soft\" size=\"xs\" class=\"ui-text-caption\">{{\n appliedCount()\n }}</ui-badge>\n }\n </ui-button>\n\n <ui-drawer #drawer label=\"Filters\">\n <button\n drawer-actions\n type=\"button\"\n class=\"ui-table-filters-clear ui-text-body-alt\"\n [class.invisible]=\"!anyApplied()\"\n (click)=\"clearAll()\"\n >\n Clear all\n </button>\n\n <div class=\"ui-table-filters-panel\">\n <ng-container\n *ngTemplateOutlet=\"body; context: { $implicit: false }\"\n />\n </div>\n </ui-drawer>\n}\n\n<ng-template #body let-showHeader>\n @if (showHeader) {\n <div class=\"ui-table-filters-header\">\n <span class=\"ui-table-filters-title ui-text-body\">\n Filters\n </span>\n\n <button\n type=\"button\"\n class=\"ui-table-filters-clear ui-text-body-alt\"\n [class.invisible]=\"!anyApplied()\"\n (click)=\"clearAll()\"\n >\n Clear all\n </button>\n </div>\n }\n\n @for (facet of facets(); track facet.id) {\n <fieldset class=\"ui-table-filters-facet\">\n <legend class=\"ui-table-filters-legend ui-text-body-alt\">\n {{ facet.label }}\n </legend>\n\n <div class=\"ui-table-filters-choices\">\n @switch (facet.kind) {\n @case ('options') {\n @if (facet.multiple) {\n @for (option of facet.options; track option.value; let index = $index) {\n <label\n class=\"ui-table-filters-choice ui-text-body-alt\"\n [for]=\"choiceId(facet, index)\"\n >\n <ui-checkbox\n [id]=\"choiceId(facet, index)\"\n [value]=\"isChecked(facet, option)\"\n (valueChange)=\"check(facet, option, $event)\"\n />\n <span class=\"truncate\">{{\n option.label\n }}</span>\n </label>\n }\n } @else {\n <label\n class=\"ui-table-filters-choice ui-text-body-alt\"\n [for]=\"choiceId(facet, 'any')\"\n >\n <ui-radio\n [id]=\"choiceId(facet, 'any')\"\n [value]=\"picked(facet)\"\n (valueChange)=\"pick(facet, $event)\"\n [option]=\"null\"\n [name]=\"groupName(facet)\"\n />\n <span class=\"truncate\">Any</span>\n </label>\n\n @for (option of facet.options; track option.value; let index = $index) {\n <label\n class=\"ui-table-filters-choice ui-text-body-alt\"\n [for]=\"choiceId(facet, index)\"\n >\n <ui-radio\n [id]=\"choiceId(facet, index)\"\n [value]=\"picked(facet)\"\n (valueChange)=\"pick(facet, $event)\"\n [option]=\"option.value\"\n [name]=\"groupName(facet)\"\n />\n <span class=\"truncate\">{{\n option.label\n }}</span>\n </label>\n }\n }\n }\n @case ('dateRange') {\n <label\n class=\"ui-table-filters-choice ui-text-body-alt\"\n [for]=\"choiceId(facet, 'any')\"\n >\n <ui-radio\n [id]=\"choiceId(facet, 'any')\"\n [value]=\"dateMode(facet)\"\n (valueChange)=\"pickDate(facet, $event)\"\n [option]=\"anyDate\"\n [name]=\"groupName(facet)\"\n />\n <span class=\"truncate\">Any time</span>\n </label>\n\n @for (preset of facet.presets ?? []; track preset.label; let index = $index) {\n <label\n class=\"ui-table-filters-choice ui-text-body-alt\"\n [for]=\"choiceId(facet, index)\"\n >\n <ui-radio\n [id]=\"choiceId(facet, index)\"\n [value]=\"dateMode(facet)\"\n (valueChange)=\"pickDate(facet, $event)\"\n [option]=\"index\"\n [name]=\"groupName(facet)\"\n />\n <span class=\"truncate\">{{ preset.label }}</span>\n </label>\n }\n\n <label\n class=\"ui-table-filters-choice ui-text-body-alt\"\n [for]=\"choiceId(facet, 'custom')\"\n >\n <ui-radio\n [id]=\"choiceId(facet, 'custom')\"\n [value]=\"dateMode(facet)\"\n (valueChange)=\"pickDate(facet, $event)\"\n [option]=\"customDate\"\n [name]=\"groupName(facet)\"\n />\n <span class=\"truncate\">Custom range</span>\n </label>\n\n @if (dateMode(facet) === 'custom') {\n <label\n class=\"sr-only\"\n [for]=\"groupName(facet) + '-range'\"\n >{{ facet.label }} range</label>\n <ui-date-range-picker\n class=\"ui-table-filters-range\"\n [id]=\"groupName(facet) + '-range'\"\n [value]=\"range(facet)\"\n (valueChange)=\"setRange(facet, $event)\"\n [placeholder]=\"facet.placeholder ?? 'Select dates'\"\n [min]=\"facet.min ?? null\"\n [max]=\"facet.max ?? null\"\n />\n }\n }\n }\n </div>\n </fieldset>\n }\n</ng-template>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, inject, input } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiAvatarComponent } from '../../generic/avatar/avatar.component';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport type {\n DropdownMenuButton,\n DropdownMenuCategory,\n DropdownMenuItem\n} from '../dropdown-menu/dropdown-menu.types';\n\n\n/** Give the dropdown it sits in `closeBehaviour=\"whenClickOutside\"`. */\n@Component({\n selector: 'ui-user-menu',\n templateUrl: './user-menu.component.html',\n styleUrl: './user-menu.component.css',\n imports: [\n NgTemplateOutlet,\n UiCardComponent,\n UiAvatarComponent,\n NgIcon\n ]\n})\nexport class UiUserMenuComponent {\n private readonly dropdown = inject(UiDropdownComponent, { optional: true });\n\n readonly name = input.required<string>();\n\n /** A second line under the name, e.g. an email address. */\n readonly detail = input<string>('');\n readonly src = input<string | null>(null);\n\n readonly items = input<DropdownMenuItem[]>([]);\n\n protected readonly menuItems = computed<DropdownMenuItem[]>(() =>\n this.items().map(item => {\n if ('divider' in item) {\n return item;\n }\n\n if ('children' in item) {\n return {\n ...item,\n children: item.children.map(child => this.closing(child))\n };\n }\n\n return this.closing(item);\n })\n );\n\n protected isDivider(item: DropdownMenuItem): boolean {\n return 'divider' in item;\n }\n\n protected group(item: DropdownMenuItem): DropdownMenuCategory | null {\n return 'children' in item ? item : null;\n }\n\n protected button(item: DropdownMenuItem): DropdownMenuButton | null {\n return 'onClick' in item ? item : null;\n }\n\n private closing(item: DropdownMenuButton): DropdownMenuButton {\n return {\n ...item,\n onClick: () => {\n this.dropdown?.close();\n item.onClick();\n }\n };\n }\n}\n","<ui-card radius=\"xl\" class=\"ui-user-menu\">\n <div class=\"ui-user-menu-person\">\n <ui-avatar [name]=\"name()\" [src]=\"src()\" size=\"lg\" />\n\n <div class=\"ui-user-menu-text\">\n <span class=\"ui-text-body ui-user-menu-name\">{{ name() }}</span>\n @if (detail()) {\n <span class=\"ui-text-body-alt ui-user-menu-detail\">{{\n detail()\n }}</span>\n }\n </div>\n </div>\n\n <ng-content />\n\n @if (menuItems().length) {\n <div class=\"ui-user-menu-items\">\n @for (item of menuItems(); track $index) {\n @if (isDivider(item)) {\n <div class=\"ui-user-menu-divider\" role=\"separator\"></div>\n } @else if (group(item); as category) {\n <span\n class=\"ui-user-menu-group ui-text-caption ui-user-menu-heading\"\n >{{ category.label }}</span>\n @for (child of category.children; track child.label) {\n <ng-container\n *ngTemplateOutlet=\"entryTemplate; context: { $implicit: child }\"\n />\n }\n } @else if (button(item); as entry) {\n <ng-container\n *ngTemplateOutlet=\"entryTemplate; context: { $implicit: entry }\"\n />\n }\n }\n </div>\n }\n</ui-card>\n\n<ng-template #entryTemplate let-entry>\n <button\n type=\"button\"\n class=\"ui-text-body-alt ui-user-menu-item\"\n (click)=\"entry.onClick()\"\n >\n @if (entry.icon) {\n <ng-icon\n [name]=\"entry.icon\"\n size=\"18\"\n strokeWidth=\"1.75\"\n class=\"shrink-0\"\n />\n }\n {{ entry.label }}\n </button>\n</ng-template>\n","import { DOCUMENT } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n effect,\n type EnvironmentProviders,\n inject,\n Injectable,\n InjectionToken,\n makeEnvironmentProviders,\n provideAppInitializer,\n signal\n} from '@angular/core';\n\n\n/** What the user picked, `system` follows the OS setting. */\nexport type UiThemePreference = 'system' | 'light' | 'dark';\n\nexport interface UiThemeConfig {\n storageKey: string;\n}\n\nexport const UI_THEME_CONFIG = new InjectionToken<UiThemeConfig>('UI_THEME_CONFIG', {\n providedIn: 'root',\n factory: () => ({ storageKey: 'ui-theme' })\n});\n\nconst PREFERENCES: readonly UiThemePreference[] = ['system', 'light', 'dark'];\n\n/**\n * Add this to `index.html`'s `<head>` so the stored theme applies before boot:\n *\n * ```html\n * <script>\n * try {\n * const preference = localStorage.getItem('ui-theme') ?? 'system';\n * const dark = preference === 'dark' ||\n * (preference === 'system' && matchMedia('(prefers-color-scheme: dark)').matches);\n * document.documentElement.classList.toggle('dark', dark);\n * } catch {}\n * </script>\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class UiThemeService {\n private readonly document = inject(DOCUMENT);\n private readonly storageKey = inject(UI_THEME_CONFIG).storageKey;\n private readonly media = this.document.defaultView?.matchMedia?.('(prefers-color-scheme: dark)');\n\n readonly preference = signal<UiThemePreference>(this.stored());\n\n private readonly systemDark = signal(this.media?.matches ?? false);\n\n readonly isDark = computed(() => {\n const preference = this.preference();\n\n return preference === 'dark' || (preference === 'system' && this.systemDark());\n });\n\n constructor() {\n const onChange = (event: MediaQueryListEvent) => this.systemDark.set(event.matches);\n\n this.media?.addEventListener('change', onChange);\n inject(DestroyRef).onDestroy(() => this.media?.removeEventListener('change', onChange));\n\n effect(() => {\n const root = this.document.documentElement;\n const dark = this.isDark();\n\n root.classList.toggle('dark', dark);\n root.style.colorScheme = dark ? 'dark' : 'light';\n });\n\n effect(() => {\n const preference = this.preference();\n\n try {\n this.document.defaultView?.localStorage.setItem(this.storageKey, preference);\n } catch {\n // storage can be blocked, the theme still applies for this visit\n }\n });\n }\n\n private stored(): UiThemePreference {\n try {\n const value = this.document.defaultView?.localStorage.getItem(this.storageKey);\n\n return PREFERENCES.includes(value as UiThemePreference) ? value as UiThemePreference : 'system';\n } catch {\n return 'system';\n }\n }\n}\n\nexport function provideUiTheme(config: Partial<UiThemeConfig> = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: UI_THEME_CONFIG, useValue: { storageKey: 'ui-theme', ...config } },\n provideAppInitializer(() => {\n inject(UiThemeService);\n })\n ]);\n}\n","import { booleanAttribute, Component, inject, input } from '@angular/core';\n\nimport { UiSegmentedComponent } from '../generic/segmented/segmented.component';\nimport type { SegmentedOption } from '../generic/segmented/segmented.types';\nimport { type UiThemePreference, UiThemeService } from './theme';\n\n\n@Component({\n selector: 'ui-theme-switch',\n imports: [UiSegmentedComponent],\n host: { '[class.block]': 'fill()' },\n template: `\n <ui-segmented\n [options]=\"options\"\n [(value)]=\"theme.preference\"\n [ariaLabel]=\"ariaLabel()\"\n [fill]=\"fill()\"\n />\n `\n})\nexport class UiThemeSwitchComponent {\n protected readonly theme = inject(UiThemeService);\n\n readonly ariaLabel = input<string>('Theme');\n\n readonly fill = input(false, { transform: booleanAttribute });\n\n protected readonly options: SegmentedOption<UiThemePreference>[] = [\n { value: 'system', label: 'System' },\n { value: 'light', label: 'Light' },\n { value: 'dark', label: 'Dark' }\n ];\n}\n"],"mappings":";;;;;;;;;AAQA,MAAa,cAAc;CACvB;CACA;CACA;AACM;AAKV,MAAa,aAAa,IAAI,eAAkC,cAAc;CAC1E,YAAY;CACZ,eAAe,OAAkB,SAAS,CAAC,CAAC,WAAU;AACzD,CAAA;AAGD,SAAgB,iBAAiB,SAAgC;CAC7D,OAAO;EACH,SAAS;EACT,YAAY;CACf;AACL;AAIA,MAAM,eAAe;AAErB,SAAgB,UAAU,UAAkB,QAAc;CACtD,OAAO,IAAI,KAAK,aAAa,QAAQ;EAAE,OAAO;EAAY;CAAQ,CAAE,CAAC,CAChE,cAAc,CAAC,CAAC,CAChB,KAAI,SACD,KAAK,SAAS,cAAc,KAAK,SAAS,YACpC,KAAK,QACL,YAAY,CACrB,CACA,QAAQ,OAAO,OAAO,WACnB,UAAU,gBAAgB,OAAO,QAAQ,OAAO,YAAY,CAC/D,CACA,KAAK,EAAE;AAChB;ACjCA,MAAa,qBAA+B;CACxC,UAAU;CACV,QAAQ;AACX;AAED,MAAa,YAAY,IAAI,eAAyB,aAAa;CAC/D,YAAY;CACZ,eAAe;AAClB,CAAA;AAED,SAAgB,gBAAgB,QAAyB;CACrD,OAAO;EACH,SAAS;EACT,UAAU;GAAE,GAAG;GAAoB,GAAG;EAAM;CAC/C;AACL;AAEA,MAAM,QAAQ,OAAO,OAAO;AAQ5B,SAAgB,oBAAoB,WAAoC;CACpE,OAAQ,UAAgD,UAAU;AACtE;AAGA,SAAgB,qBACZ,UAAoC,CAAA,GAAE;CAEtC,MAAM,EAAE,UAAU,WAAW,OAAO,SAAS;CAC7C,MAAM,UAAU,OAAO,UAAU;CACjC,MAAM,YAAY,IAAI,KAAK,aAAa,QAAQ;EAC5C,OAAO;EACP;EACA,GAAG;CACN,CAAA;CACD,MAAM,WAAW,UAAU,gBAAe;CAC1C,MAAM,OAAO,UAAU,SAAS,YAAY,UAAU,SAAS,MAAM;CAErE,MAAM,UAAU,UAAkB,UAAU,OAAO,KAAK;CAExD,OAAO,OAAO,QACT,UAAkB,QAAO,MAAO,YAAY,OAAO,KAAK,IAAI,MAC7D,GAAG,QAAQ;EAAE;EAAQ;CAAI,EAAE,CAAE;AAErC;ACzDA,IAAa,cAAb,MAAa,YAAW;CACX,SAAS,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAE/B,cAAA;EACI,MAAM,OAAO,OAAO,QAAQ,CAAC,CAAC;EAC9B,MAAM,aAAa,KAAK,OAAO,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC;EAElE,KAAI;EAEJ,IAAI,OAAO,qBAAqB,aAC5B;EAGJ,MAAM,WAAW,IAAI,iBAAiB,IAAI;EAE1C,SAAS,QAAQ,MAAM;GAAE,YAAY;GAAM,iBAAiB,CAAC,OAAO;EAAC,CAAE;EACvE,OAAO,UAAU,CAAC,CAAC,gBAAgB,SAAS,WAAU,CAAE;CAC5D;CAjBS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAW,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAX,OAAA,QAAA,GAAA,sBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAW,YADE;CAAM,CAAA;;AACnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAW,YAAA,CAAA;EADvB,MAAA;EAAW,MAAA,CAAA,EAAE,YAAY,OAAM,CAAE;;;;ACClC,MAAa,gBAAgB;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACM;AAGV,MAAa,qBAAqB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACM;AAGV,MAAa,mBAAmB,cAAc;AAG9C,MAAa,wBAAwB,cAAc,SAAS;AAY5D,MAAa,YAAsB;CAC/B,MAAM;CACN,OAAO;CACP,MAAM;CACN,SAAS;CACT,SAAS;AACZ;AAED,MAAa,iBAA2B;CACpC,MAAM;CACN,OAAO;CACP,MAAM;CACN,SAAS;CACT,SAAS;AACZ;AAED,SAAgB,SAAS,MAAa;CAClC,OAAO,OAAO,iBAAiB;AACnC;AAQA,SAAgB,YAAY,OAAe,OAAO,OAAK;CACnD,QAAQ,OAAO,qBAAqB,cAAA,CAAe,UAAU,SAAS,IAAI,CAAC,CAAC;AAChF;AAOA,SAAgB,iBAAiB,OAAe,QAAiB,OAAO,OAAK;CACzE,IAAI,UAAU,SAAS,cAAc,UAAU,QAAQ,uBACnD,OAAO;EAAE,QAAQ,YAAY,QAAQ,cAAc,QAAQ,IAAI;EAAG,QAAQ;CAAI;CAGlF,OAAO;EAAE,QAAQ,YAAY,OAAO,IAAI;EAAG,QAAQ;CAAK;AAC5D;ACrDA,IAAsB,kBAAtB,MAAsB,gBAAe;CACd,WAAW,OAAO,SAAS;CAC7B,UAAU,OAAO,UAAU;CAEzB,OAAO,OAAO,WAAW,CAAC,CAAC;CAC3B,MAAM,eAAe,SAAS,KAAK,KAAI,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CAErD,SAAS,MAAM,SAAyB,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACxC,aAAa,MAAM,SAAoB,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAGvC,YAAY,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEpC,SAAS,MAAmB,KAAI,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAGhC,iBAAiB,MAA2B,gBAAgB,KAAK,SAAS,MAAM,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAGlF,YAAY,MAAoC,QAAS;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAC9D,YAAW,UAAS,UAAU,SAAY,SAAY,iBAAiB,KAAK;CAAC,CAAA;CAIxE,gBAAgB,MAAc,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAEzC,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACpD,YAAY,MAAc,mBAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAG5C,YAAY,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGtD,UAAU,MAA2B,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAM1C,YAAY,MAAuB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAExC,wBAAwB,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,wBAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGlE,SAAS,MAA2B,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAG3C,eAAe,OAAiB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAGnC,WAAW,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAG5B,iBAA0B;CAE5B,QAAQ,eAAe,oBAAoB,KAAK,eAAc,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEhE,cAAc,eAC7B,KAAK,UAAS,KAAM,CAAC,CAAC,KAAK,MAAK,IAAK,KAAK,QAAO,IAAK,WACzD,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,SAAS,eAAe,KAAK,YAAW,MAAO,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACzD,YAAY,eAAe,KAAK,YAAW,MAAO,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAE3D,mBAAmB,eAAmC;EACrE,MAAM,QAAQ,KAAK,MAAK;EAExB,IAAI,CAAC,KAAK,OAAM,GACZ,OAAO,OAAO,UAAU,KAAK,eAAc;EAG/C,MAAM,OAAO,OAAO,QAAQ,UAAU,KAAK,SAAS,UAAU,KAAK,SAAS,MAAM;EAElF,aAAa;CACjB,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,aAAa,eAAc;EAC1C,MAAM,SAAS,KAAK,OAAM;EAE1B,OAAO,WAAW,SAAS,SAAS;CACxC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,UAAU,eACzB,CAAC,KAAK,OAAM,CAAE,CAAC,MAAK,SAAQ,KAAK,KAAK,MAAK,UAAS,UAAU,IAAI,CAAC,GACtE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,UAAU,eAAc;EACvC,MAAM,YAAY,KAAK,UAAS;EAEhC,OAAO,KAAK,OAAM,CAAE,CAAC,KAAI,SACrB,CAAC,CAAC,aAAa,CAAC,UAAU,SAAS,KAAK,IAAI,CAAC;CAErD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAGe,cAAc,eAC3B,KAAK,sBAAqB,IAAK,OAAO,KAAK,UAAS,GACvD,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,SAAS,eAAkC;EAC1D,MAAM,QAAQ,KAAK,YAAW;EAC9B,MAAM,QAAQ,KAAK,QAAO;EAE1B,OAAO,KAAK,OAAM,CAAE,CAAC,KAAK,MAAM,UAAS;GACrC,MAAM,SAAS,KAAK,kBAAkB,CAAC,CAAC,KAAK;GAE7C,IAAI,MAAM,QACN,OAAO;IAAE,QAAQ,KAAK,IAAG,CAAE,CAAC;IAAS;GAAM;GAG/C,MAAM,QAAQ,iBACV,QAAQ,MAAM,QAAQ,KAAK,IAAI,IAAI,OACnC,KAAK,gBACL,KAAK,KAAI,CAAE;GAGf,OAAO;IACH,QAAQ,KAAK,UAAU,MAAM;IAC7B,QAAQ,MAAM,UAAU;GAC3B;EACL,CAAC;CACL,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,UAAU,eACzB,KAAK,OAAM,CAAE,CAAC,KAAI,UAAS,MAAM,MAAM,GAC1C,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,SAAS,eACxB,KAAK,OAAM,CAAE,CAAC,KAAI,UAAS,MAAM,MAAM,GAC1C,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAGQ,cAAc,eAAiC;EACpD,MAAM,QAAQ,KAAK,YAAW;EAC9B,MAAM,QAAQ,KAAK,OAAM,CAAE,CACtB,KAAK,MAAM,WAAW;GACnB,MAAM,KAAK;GACX,GAAG,KAAK,OAAM,CAAE,CAAC;EACpB,EAAC,CAAC,CACF,QAAQ,GAAG,UAAU,CAAC,KAAK,QAAO,CAAE,CAAC,MAAM;EAEhD,OAAO,QACD,MAAM,MAAM,GAAG,MACb,MAAM,QAAQ,EAAE,IAAI,IAAI,MAAM,QAAQ,EAAE,IAAI,CAAC,IAE/C;CACV,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEO,aAAa,eAAc;EAChC,MAAM,QAAQ,KAAK,QAAO,CAAE,CAAC,OAAO,OAAO,CAAC,CAAC;EAE7C,OAAO,QAAQ,GAAG,MAAK,iBAAkB;CAC7C,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,YAAY,OAAgC;EAClD,OAAO,UAAU,QAAQ,UAAU,SAC7B,MACA,KAAK,iBAAgB,CAAE,CAAC,KAAK;CACvC;CA7JkB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAe,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAf,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAe,cAAA;EAAA,QAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,uBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;CAAA,CAAA;;AAAf,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAe,YAAA,CAAA,EADpC,MAAA,UAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiKD,SAAS,gBAAgB,QAAc;CACnC,MAAM,YAAY,IAAI,KAAK,aAAa,MAAM;CAE9C,QAAO,UAAS,UAAU,OAAO,KAAK;AAC1C;AC/LA,SAAgB,gBAAgB,KAAa;CACzC,OAAO,EAAE,OAAO;EAAE,QAAQ,IAAI;EAAO,UAAU;CAAM,EAAE;AAC3D;AAYA,SAAgB,iBAAiB,KAAa;CAC1C,MAAM,SAAS,gBAAgB,GAAG;CAElC,OAAO;EACH,OAAO;GACH,YAAY;GACZ,WAAW,IAAI;GACf,oBAAoB;GACpB,sBAAsB;GACtB,SAAS,EAAE,MAAM,MAAK;GACtB,MAAM,EAAE,SAAS,MAAK;GACtB,YAAY;IAAE,SAAS;IAAM,OAAO;GAAG;EAC1C;EACD,YAAY,EAAE,SAAS,MAAK;EAE5B,MAAM;GAAE,MAAM;GAAS,SAAS;EAAC;EACjC,MAAM;GACF,aAAa,IAAI;GACjB,iBAAiB;GACjB,SAAS;IAAE,KAAK;IAAG,OAAO;IAAG,QAAQ;IAAG,MAAM;GAAC;EAClD;EAED,QAAQ,EAAE,MAAM,MAAK;EACrB,OAAO;GACH,YAAY;IAAE,MAAM;IAAM,OAAO,IAAI;GAAI;GACzC,WAAW,EAAE,MAAM,MAAK;GACxB;EACH;EACD,OAAO;GACH,YAAY,EAAE,MAAM,MAAK;GACzB,WAAW,EAAE,MAAM,MAAK;GACxB;EACH;EACD,QAAQ;GACJ,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAS,EAAE;GACpC,QAAQ,EAAE,QAAQ,EAAE,MAAM,OAAM,EAAE;EACrC;CACJ;AACL;AAGA,SAAgB,kBAAkB,MAAoB,WAA8B;CAChF,OAAO,YAAY,UAAU,MAAM,SAAS,IAAoB;AACpE;AAEA,SAAgB,iBACZ,OACA,MACA,SAAS,IACT,OAAuC;CAEvC,MAAM,QAAQ,KAAK,KAAI,QAAO;;;6CAGW,IAAI,SAAS,kCAAkC,GAAE;oDAC1C,WAAW,IAAI,MAAM,EAAC;;kDAExB,WAAW,IAAI,IAAI,EAAC;cACxD,IAAI,UAAU,SAAY,KAAK,wCAAwC,WAAW,IAAI,KAAK,EAAC,SAAS;;KAE9G,CAAC,CAAC,KAAK,EAAE;CAEV,OAAO;;cAEG,QAAQ,uDAAuD,WAAW,KAAK,EAAC,UAAW,GAAE;cAC7F,MAAK;cACL,QAAQ;;0DAEoC,WAAW,MAAM,IAAI,EAAC;2DACrB,WAAW,MAAM,KAAK,EAAC;;gBAElE,GAAE;cACJ,SAAS,wDAAwD,WAAW,MAAM,EAAC,UAAW,GAAE;;;AAG9G;AAGA,SAAS,WAAW,MAAY;CAC5B,OAAO,KACF,QAAQ,MAAM,OAAO,CAAC,CACtB,QAAQ,MAAM,MAAM,CAAC,CACrB,QAAQ,MAAM,MAAM,CAAC,CACrB,QAAQ,MAAM,QAAQ,CAAC,CACvB,QAAQ,MAAM,OAAO;AAC9B;AAEA,SAAS,UAAU,MAAe,WAAkB;CAChD,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,SAAS,GAChD,OAAO,cAAc,SAAY,OAAO;CAG5C,MAAM,SAAkC,EAAE,GAAG,KAAI;CAEjD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,GAC/C,OAAO,OAAO,UAAU,KAAK,MAAM,KAAK;CAG5C,OAAO;AACX;AAEA,SAAS,cAAc,OAAc;CACjC,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC9E;ACjGA,IAAa,sBAAb,MAAa,oBAAmB;CACnB,QAAQ,MAAqB,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACpC,WAAW,MAAM,MAAI;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGpD,QAAQ,MAAM,GAAC;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,+BAAA,CAAA;EAAI,WAAW;CAAe,CAAA;CAEnC,cAAc,eAC7B,MAAM,KACF,EAAE,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAK,CAAE,CAAC,EAAC,IAC9C,GAAG,UAAU,KAAK,GAE1B,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,mBAAmB,eACxB;EACI;EACA,gBAAgB,KAAK,MAAK;EAC1B,KAAK,SAAQ,IAAK,0BAA0B;CAC/C,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAtBQ,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,YAAA,EAAA,eAAA,OAAA;GAAA,YAAA,EAAA,SAAA,qBAAA;EAAA;EAAA,UAAA;EAAA,UCzBhC;EAOA,QAAA,CAAA,s3BAAA;CAAA,CAAA;;ADkBa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAV/B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAa,MAGjB;IAEF,eAAe;IACf,WAAW;GACd;GAAA,UAAA;GAAA,QAAA,CAAA,s3BAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AECL,IAAa,yBAAb,MAAa,uBAAsB;CACtB,QAAQ,MAAyB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAGpC,OAAO,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAGxB,MAAM,MAAgC,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CAG3C,YAAY,MAAgE,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAGjF,SAAS,MAAgB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAG5B,aAAa,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGvD,cAAc,OAAM;CAEZ,UAAU,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACrC,UAAU,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAGrC,YAAY,eAAe,KAAK,QAAO,KAAM,KAAK,QAAO,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAG1D,aAAa,eAAc;EAC1C,MAAM,SAAS,KAAK,IAAG;EAEvB,IAAI,CAAC,QACD,OAAO,KAAK,MAAK;EAGrB,MAAM,SAAS,KAAK,UAAS;EAE7B,OAAO,SAAS,OAAO,OAAO,YAAW,CAAE,IAAI,OAAO,YAAW;CACrE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CACiB,YAAY,eAAe,KAAK,IAAG,CAAE,EAAE,WAAU,KAAM,KAAK,KAAI,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACrE,cAAc,eAAe,KAAK,IAAG,CAAE,EAAE,aAAY,KAAM,KAAK,OAAM,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEvE,eAAe,eAC9B,KAAK,WAAU,CAAE,CAAC,QAAO,SAAQ,CAAC,KAAK,YAAW,CAAE,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,QAC7E,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAED,cAAA;EACI,aAAY;GACR,MAAM,OAAO,KAAK,UAAS;GAE3B,gBAAe;IACX,KAAK,IAAG,CAAE,EAAE,SAAS,IAAI,IAAI;IAC7B,KAAK,YAAY,KAAK,IAAI;GAC9B,CAAC;EACL,CAAC;CACL;CAEU,MAAM,MAAmB;EAC/B,KAAK,QAAQ,IAAI,IAAI;CACzB;CAEU,MAAM,MAAmB;EAC/B,KAAK,QAAQ,IAAI,IAAI;CACzB;CAEU,SAAS,MAAqB;EACpC,OAAO,KAAK,YAAW,CAAE,CAAC,SAAS,KAAK,IAAI;CAChD;CAGU,SAAS,MAAqB;EACpC,OAAO,CAAC,KAAK,SAAS,IAAI,KAAK,KAAK,aAAY,MAAO;CAC3D;CAEU,OAAO,MAAqB;EAClC,IAAI,KAAK,SAAS,IAAI,GAClB;EAGJ,MAAM,SAAS,KAAK,YAAW;EAC/B,MAAM,OAAO,OAAO,SAAS,KAAK,IAAI,IAChC,OAAO,QAAO,SAAQ,SAAS,KAAK,IAAI,IACxC,CAAC,GAAG,QAAQ,KAAK,IAAI;EAE3B,MAAM,SAAS,KAAK,IAAG;EAEvB,IAAI,QACA,OAAO,aAAa,IAAI,IAAI;OAE5B,KAAK,OAAO,IAAI,IAAI;CAE5B;CA3FS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAsB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAtB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAsB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,QAAA;GAAA,aAAA;EAAA;EAAA,UAAA;EAAA,UCxBnC;EAyCA,QAAA,CAAA,unJAAA;CAAA,CAAA;;ADjBa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAsB,YAAA,CAAA;EALlC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAiB,UAAA;GAAA,QAAA,CAAA,unJAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEwB/B,IAAa,mBAAb,MAAa,iBAAgB;CAChB,UAAU,MAAM,SAAwB,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAGxC,YAAY,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAGpC,eAAe,MAAgB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAGlC,WAAW,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAE7B,SAAS,UAAU,SAChC,UACH,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACgB,QAAQ,OAA0B,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEhD,YAAY;CAEZ,aAAgC,CAAA;CAExC,cAAA;EAEI,gBAAgB,YAAW;GACvB,MAAM,EAAE,SAAS,SAAS,MAAM,OAAO;GAEvC,IAAI,KAAK,WACL;GAGJ,MAAM,QAAQ,IAAI,KACd,KAAK,OAAM,CAAE,CAAC,eACd,UAAU,KAAK,OAAO,CAAC;GAG1B,MAA2B,iBAAiB,iBAAgB;IACzD,KAAK,YAAY,KAAK;IACtB,KAAK,cAAa;GACtB,CAAC;GAED,KAAK,aAAa,KAAK,YAAW;GAClC,MAAM,MAAM,OAAM;GAClB,KAAK,MAAM,IAAI,KAAK;GACpB,KAAK,YAAY,KAAK;GACtB,KAAK,cAAa;EACtB,CAAC;EAGD,aAAY;GACR,MAAM,UAAU,KAAK,QAAO;GAC5B,MAAM,QAAQ,KAAK,MAAK;GAExB,IAAI,CAAC,OACD;GAIJ,MAAM,QAAQ,KAAK,YAAW;GAC9B,MAAM,YAAY,MAAM,WAAW,KAAK,WAAW,UAC/C,MAAM,MAAM,MAAM,UAAU,SAAS,KAAK,WAAW,MAAM,KAC3D,MAAM,OAAM,SAAQ,KAAK,WAAW,SAAS,IAAI,CAAC;GAEtD,KAAK,aAAa;GAClB,MAAM,cAAc,SAAS,OAAO,CAAC,SAAS;EAClD,CAAC;EAED,aAAY;GACR,KAAK,SAAQ;GAEb,IAAI,KAAK,MAAK,GACV,KAAK,cAAa;EAE1B,CAAC;EAED,aAAY;GACR,MAAM,QAAQ,KAAK,MAAK;GAExB,IAAI,OAAO;IACP,KAAK,YAAY,KAAK;IACtB,KAAK,cAAa;GACtB;EACJ,CAAC;EAED,OAAO,UAAU,CAAC,CAAC,gBAAe;GAC9B,KAAK,YAAY;GACjB,KAAK,MAAK,CAAE,EAAE,QAAO;EACzB,CAAC;CACL;CAEQ,YAAY,OAAiB;EACjC,MAAM,SAAS,KAAK,aAAY;EAGhC,IAAI,CAAC,KAAK,OAAM,CAAE,CAAC,cAAc,cAAc,sCAAsC,GACjF;EAGJ,KAAK,MAAM,QAAQ,KAAK,YAAW,GAAI;GACnC,IAAI,CAAC,MACD;GAGJ,IAAI,OAAO,SAAS,IAAI,GACpB,MAAM,WAAW,IAAI;QAErB,MAAM,WAAW,IAAI;EAE7B;CACJ;CAGQ,gBAAa;EACjB,MAAM,QAAQ,KAAK,YAAW;EAG9B,MAAM,WAAW,UAAU,KAAK,QAAQ;EACxC,MAAM,SACF,YACI,MAAM,SAAS,QAAQ,KACvB,CAAC,UAAU,KAAK,YAAY,CAAC,CAAC,SAAS,QAAQ,IAC7C,WACA;EACV,MAAM,SAAS,KAAK,OAAM,CAAE,CAAC,cAAc,iBAEzC,sCAAsC;EAExC,KAAK,MAAM,SAAS,QAAQ;GACxB,MAAM,OAAO,MAAM,OAAO,MAAM,aAAa,gBAAgB,CAAC;GAE9D,MAAM,UAAU,OACZ,0BACA,CAAC,CAAC,UAAU,SAAS,MAAM;EAEnC;CACJ;CAGQ,cAAW;EACf,MAAM,EAAE,SAAS,CAAA,GAAI,SAAS,CAAA,MAAO,UAAU,KAAK,OAAO;EAE3D,OAAO,OAAO,KAAK,MAAM,UACrB,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU,OACjD,KAAK,QAAQ,OACb,OAAO,UAAU,IAAI;CAEnC;CAjJS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,WAAA;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,QAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UAbf;;;;;;;;EAOT,UAAA;EAAA,QAAA,CAAA,6qJAAA;EAAA,eAAA,GAAA,kBAAA;CAAA,CAAA;;AAMQ,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAf5B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAU,UACV;;;;;;;;GAOT,eAGc,kBAAkB;GAAI,MAC/B,EAAE,OAAO,WAAU;GAAE,QAAA,CAAA,6qJAAA;EAAA,CAAA;CAevB,CAAA;CAAA,sBAAA,CAAA;CAAA,gBAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,UAAQ,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;ACbhB,IAAa,wBAAb,MAAa,sBAAqB;CACrB,UAAU,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAClC,aAAa,MAAM,SAAoB,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CACvC,SAAS,MAAM,SAAyB,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACxC,iBAAiB,MAAM,SAA+B,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CACtD,gBAAgB,MAAc,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CACzC,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGpD,SAAS,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,SAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAElD,QAAQ,OAAgC;EAC9C,OAAO,UAAU,QAAQ,UAAU;CACvC;CAEU,OAAO,OAAgC;EAC7C,OAAO,KAAK,QAAQ,KAAK,IAAI,KAAK,eAAc,CAAE,CAAC,KAAK,IAAI;CAChE;CAjBS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UAjCpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BT,UAAA;EAAA,QAAA,CAAA,wxDAAA;CAAA,CAAA;;AAGQ,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EAnCjC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAgB,UAChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BT,QAAA,CAAA,wxDAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACiCL,IAAa,wBAAb,MAAa,sBAAqB;CACrB,UAAU,MAAM,SAAwB,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACxC,YAAY,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACpC,aAAa,MAAM,SAAoB,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CACvC,SAAS,MAAM,SAAyB,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACxC,cAAc,MAAM,SAA6B,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CACjD,aAAa,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAC9B,eAAe,MAAgB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAClC,iBAAiB,MAAM,SAA+B,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CACtD,gBAAgB,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CACxC,SAAS,MAAM,SAAuB,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACtC,YAAY,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEpC,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACpD,QAAQ,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAClD,YAAY,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACtD,SAAS,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,SAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACnD,aAAa,MAAM,MAAI;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGtD,WAAW,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAE3B,OAAO,eAAe,KAAK,OAAM,MAAO,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAC/C,cAAc,eAAc;EAC3C,MAAM,SAAS,KAAK,OAAM;EAE1B,OAAO,WAAW,SAAS,OAAO;CACtC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CA3BO,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,cAAA;GAAA,UAAA;EAAA;EAAA,MAAA;GAAA,YAAA;IAAA,eAAA;IAAA,cAAA;IAAA,kBAAA;IAAA,gBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,UAAA;EAAA,UA7DpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8CT,UAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MAEG;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAAqB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACrB;IAAsB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,gBAAA,aAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACtB;IAAmB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;CAAA,CAAA;;AAUd,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EA/DjC,MAAA;EAAU,MAAA,CAAA;GACP,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CV,SAAS;IACL;IACA;IACA;IACA;GACH;GACD,MAAM;IACF,OAAO;IACP,iBAAiB;IACjB,gBAAgB;IAChB,oBAAoB;IACpB,kBAAkB;GACrB;EACJ,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzDD,MAAM,oBAAoB;AAE1B,MAAM,iBAAiB;AAGvB,SAAS,KAAK,QAAgB,KAAa;CACvC,MAAM,MAAM;CACZ,MAAM,OAAO,IAAI,KAAK,MAAM,CAAC,GAAG;CAChC,MAAM,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG;CAEnC,IAAI,CAAC,QAAQ,CAAC,IACV,OAAO,IAAI;CAGf,MAAM,WAAW,OAAe,OAAe,SAAS,MAAM,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE;CAKnF,OAAO,OAJO;EAAC;EAAG;EAAG;CAAC,CAAC,CAAC,KAAI,OACxB,KAAK,MAAM,QAAQ,MAAM,EAAE,IAAI,iBAAiB,QAAQ,IAAI,EAAE,IAAK,EAAmB,CAG5E,CAAA,CAAM,KAAK,IAAI,EAAC;AAClC;AAYA,IAAa,sBAAb,MAAa,4BAA4B,gBAAe;CAC3C,cAAc,MAA2B,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CACpD,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGpD,oBAAoB,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,oBAAA,CAAA,+BAAA,CAAA,CAAA;CAEpC,eAAe,eAA4B;EAC1D,MAAM,MAAM,KAAK,IAAG;EACpB,MAAM,OAAO,iBAAiB,GAAG;EACjC,MAAM,SAAS,gBAAgB,GAAG;EAClC,MAAM,aAAa,KAAK,YAAW,MAAO;EAC1C,MAAM,SAAS,KAAK,iBAAgB;EACpC,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,aAAa,KAAK,WAAU;EAClC,MAAM,UAAU,KAAK,QAAO;EAC5B,MAAM,SAAS,WAAW,QAAQ,KAAK,kBAAiB,KAAM,EAAE;EAGhE,MAAM,YAAY,GAAG,kBAAiB;EACtC,MAAM,cAAc,SACd,EAAE,MAAM,MAAK,IACb;GAAE,GAAG;GAAQ,YAAY,UAA2B,OAAO,OAAO,KAAK,CAAC;EAAC;EAqF/E,OAAO,kBAAkB;GAlFrB,GAAG;GACH,OAAO;IACH,GAAG,KAAK;IACR,MAAM;IACN,QAAQ,KAAK,WAAU;IACvB,SAAS,KAAK,QAAO;GACxB;GACD,QAAQ,SAAS,IACX,UACA,QAAQ,KAAI,YAAW,EAAE,qBACvB,mBAAmB,SACb,SACA,KAAK,QAAQ,GAAG,CAAC;GAE/B,QAAQ,OAAO,KAAI,UAAS;IACxB,MAAM,KAAK;IACX,MAAM,KAAK,UAAS,IAAK,KAAK,KAAK,UAAU,IAAI,IAAI,KAAK;GAC7D,EAAC;GACF,aAAa,EACT,KAAK;IACD;IAEA,cAAc,KAAK,QAAO,IAAK,IAAI;IACnC,yBAAyB;IACzB,aAAa;IACb,WAAW;GACd,EACJ;GAED,QAAQ;IAAE,MAAM;IAAM,OAAO;IAAG,QAAQ,CAAC,IAAI,OAAO;GAAC;GAErD,OAAO;IACH,GAAG,KAAK;IACR;IACA,QAAQ,aAAa,cAAc;GACtC;GACD,OAAO;IAAE,GAAG,KAAK;IAAO,QAAQ,aAAa,SAAS;GAAW;GACjE,MAAM;IACF,GAAG,KAAK;IAER,OAAO,EAAE,OAAO,EAAE,MAAM,WAAU,EAAE;IACpC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,WAAU,EAAE;GACxC;GACD,SAAS,KAAK,UAAS,IACjB,EAAE,SAAS,MAAK,IAChB,KAAK,QAAO,IACZ;IACE,QAAQ;IACR,WAAW;IACX,SAAS,EAAE,qBAAgD;KACvD,MAAM,OAAO,OACR,KAAK,MAAM,WAAW;MACnB,QAAQ,QAAQ;MAChB,MAAM,KAAK;MACX,KAAK,KAAK,KAAK,mBAAmB;KACrC,EAAC,CAAC,CACF,QAAO,QAAO,CAAC,KAAK,aAAY,CAAE,CAAC,SAAS,IAAI,IAAI,CAAC;KAC1D,MAAM,SAAS,KAAK,KAAI,QAAO,IAAI,GAAG,CAAC,CAAC,QAAO,UAAS,UAAU,IAAI;KAEtE,OAAO,iBACH,WAAW,mBAAmB,IAC9B,KAAK,KAAI,SAAQ;MAAE,GAAG;MAAK,OAAO,SAAS,SAAY,KAAK,YAAY,IAAI,GAAG;KAAC,EAAG,GACnF,IACA,SAAS,SAAY;MACjB,MAAM;MACN,OAAO,KAAK,YAAY,OAAO,SAAS,OAAO,QAAQ,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,IAAI;KAC/F,CAAA;IAET;GACH,IACC;IACE,QAAQ;IACR,WAAW;IACX,SAAS,EAAE,aAAa,qBACpB,iBAAiB,WAAW,mBAAmB,IAAI,CAAC;KAChD,QAAQ,QAAQ;KAChB,MAAM,OAAO,YAAY,EAAE,QAAQ;KACnC,OAAO,SAAS,SAAY,KAAK,YAAY,OAAO,YAAY,EAAE,KAAK,eAAe;IACzF,CAAA,CAAC;GACT;EAGgB,GAAS,KAAK,QAAO,CAAE;CACpD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CA7GO,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,mBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,uBAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UChDhC;EAmBA,cAAA,CAAA;GAAA,MAAA;GAAA,MD0Bc;GAAqB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA,CAAA,sBAAA,gBAAA;EAAA,CAAA;CAAA,CAAA;;AAGtB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAN/B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAc,SAEf,CAAC,qBAAqB;GAAC,MAC1B,EAAE,OAAO,uBAAsB;GAAE,UAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AE7C3C,MAAa,uBAAuB,CAAC,YAAY,YAAY;ACc7D,MAAM,kBAAkB;AAGxB,MAAM,mBAAmB;AAGzB,MAAM,kBAAkB;AAYxB,IAAa,uBAAb,MAAa,6BAA6B,gBAAe;CACzB,iBAAiB;CAEpC,QAAQ,MAAsB,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAGzC,aAAa,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGvD,gBAAgB,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAE1C,iBAAiB,MAAc,aAAY,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAEnC,uBAAuB,eAA2C;EAC/E,MAAM,OAAO,KAAK,cAAa;EAC/B,MAAM,aAAa,KAAK,WAAU;EAClC,MAAM,MAAM,KAAK,IAAG;EAGpB,IAAI,CAAC,QAAQ,CAAC,WAAW,SAAS,IAAI,GAClC,OAAO,EAAE,OAAO,CAAA,EAAE;EAGtB,OAAO,EACH,OAAO,CAAC;GACJ,GAAG;GACH,IAAI,WAAW,WAAW,SAAS;GACnC,WAAW,IAAI;GACf,SAAS;GACT,aAAa;GACb,OAAO;IACH,MAAM,KAAK,eAAc;IACzB,UAAU;IACV,aAAa;IACb,YAAY;IACZ,aAAa;IACb,SAAS;IACT,SAAS;IACT,OAAO;KACH,YAAY;KACZ,OAAO,IAAI;KACX,UAAU;IACb;GACJ;EACJ,CAAA,EACJ;CACL,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,uBAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,eAAe,eAA4B;EAC1D,MAAM,MAAM,KAAK,IAAG;EACpB,MAAM,OAAO,iBAAiB,GAAG;EACjC,MAAM,SAAS,gBAAgB,GAAG;EAClC,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,aAAa,KAAK,WAAU;EAClC,MAAM,UAAU,KAAK,QAAO;EAC5B,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,QAAQ,KAAK,QAAO;EAC1B,MAAM,SAAS,KAAK,OAAM;EAG1B,MAAM,QAAQ,OAAO,KAAK,GAAG,UAAU,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,OAAO,MAAM,EAAE,IAAI,OAAO,MAAM,EAAE,CAAC;EA+EhG,OAAO,kBAAkB;GA5ErB,GAAG;GACH,OAAO;IACH,GAAG,KAAK;IACR,MAAM;IACN,QAAQ,KAAK,WAAU;GAC1B;GACD,aAAa,KAAK,qBAAoB;GACtC,QAAQ,MAAM,KAAI,UAAS,QAAQ,MAAM;GACzC,QAAQ,MAAM,KAAI,WAAU;IACxB,MAAM,OAAO,MAAM,CAAC;IACpB,MAAM,KAAK,UAAS,IAAK,OAAO,MAAM,CAAC,KAAK,UAAU,IAAI,IAAI,OAAO,MAAM,CAAC;GAC/E,EAAC;GACF,QAAQ;IACJ,OAAO,KAAK,MAAK;IACjB,OAAO,MAAM,KAAI,UAAS,MAAM,SAAS,MAAM,CAAC;IAChD,WAAW,MAAM,KAAI,UAAS,OAAO,SAAS,IAAI,CAAC;IACnD,SAAS;GACZ;GAED,SAAS;IACL,MAAM,KAAK,WAAU,IAAK,IAAI;IAC9B,cAAc,IAAI;IAClB,aAAa;IACb,OAAO,EAAE,MAAM,EAAC;GACnB;GACD,OAAO;IACH,GAAG,KAAK;IACR;IACA,YAAY,WAAW,SAAS,kBAAkB,kBAAkB;IACpE,QAAQ;KAAE,GAAG;KAAQ,uBAAuB;KAAM,QAAQ;IAAC;IAC3D,YAAY;KACR,MAAM;KACN,OAAO;KACP,QAAQ;MAAE,OAAO,IAAI;MAAM,OAAO;MAAG,WAAW;KAAC;IACpD;IAED,SAAS,EAAE,SAAS,MAAK;GAC5B;GACD,OAAO;IACH,GAAG,KAAK;IACR,QAAQ,SAAS,EAAE,MAAM,MAAK,IAAK;KAAE,GAAG;KAAQ,WAAW,KAAK,iBAAgB;IAAE;GACrF;GACD,MAAM;IACF,GAAG,KAAK;IACR,OAAO,EAAE,OAAO,EAAE,MAAM,MAAK,EAAE;IAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,KAAI,EAAE;GACjC;GACD,SAAS,KAAK,UAAS,IAAK,EAAE,SAAS,MAAK,IAAK;IAC7C,QAAQ;IACR,WAAW;IAEX,SAAS,EAAE,qBAAgD;KACvD,MAAM,OAAO,OACR,KAAK,MAAM,WAAW;MACnB,QAAQ,QAAQ;MAChB,QAAQ,OAAO;MACf,MAAM,KAAK;MACX,KAAK,KAAK,KAAK,mBAAmB;MAClC,OAAO,MAAM;KAChB,EAAC,CAAC,CACF,QAAO,QAAO,CAAC,KAAK,aAAY,CAAE,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CACtD,MAAM,GAAG,MAAM,KAAK,aAAa,GAAG,CAAC,CAAC,CAAC,CACvC,KAAI,SAAQ;MAAE,GAAG;MAAK,OAAO,SAAS,SAAY,KAAK,YAAY,IAAI,GAAG;KAAC,EAAG;KAEnF,MAAM,QAAQ,KAAK,QAAO,QAAO,CAAC,IAAI,KAAK,CAAC,CAAC,SAAS;KACtD,MAAM,QAAQ,KAAK,SAAS;KAE5B,OAAO,iBACH,WAAW,mBAAmB,IAC9B,KAAK,MAAM,GAAG,KAAK,GACnB,QAAQ,IAAI,GAAG,MAAK,SAAU,EAAE;IAExC;GACH;EAGoB,GAAS,KAAK,QAAO,CAAE;CACpD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAGM,aACJ,GACA,GAAuD;EAEvD,IAAI,EAAE,UAAU,EAAE,OACd,OAAO,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,KAAK;EAG3C,MAAM,YAAY,KAAK,UAAS;EAEhC,IAAI,CAAC,EAAE,SAAS,WACZ,OAAO,UAAU,QAAQ,EAAE,IAAI,IAAI,UAAU,QAAQ,EAAE,IAAI;EAI/D,IAAI,CAAC,EAAE,SAAS,KAAK,OAAM,CAAE,CAAC,UAAU,iBACpC,OAAO;EAGX,QAAQ,EAAE,OAAO,cAAc,EAAE,OAAO;CAC5C;CAnKS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAoB,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAApB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAoB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,uBAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UCjCjC;EAmBA,cAAA,CAAA;GAAA,MAAA;GAAA,MDWc;GAAqB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA,CAAA,sBAAA,gBAAA;EAAA,CAAA;CAAA,CAAA;;AAGtB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EANhC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAe,SAEhB,CAAC,qBAAqB;GAAC,MAC1B,EAAE,OAAO,uBAAsB;GAAE,UAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AE9B3C,MAAa,kBAAkB;CAAC;CAAY;CAAU;AAAU;AC2BhE,IAAa,sBAAb,MAAa,4BAA4B,gBAAe;CAC3C,UAAU,MAAuB,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE/B,mBAAmB,IAAI,KAAK,aAAa,KAAK,SAAS,QAAQ;EAC5E,OAAO;EACP,uBAAuB;CAC1B,CAAA;CAGQ,aAAa,MAAc,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEzB,SAAS,eAAe,KAAK,OAAM,CAAE,CAAC,EAAE,EAAE,QAAQ,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAG5C,UAAU,eAClC,CAAC,KAAK,OAAM,CAAE,CAAC,MAAK,UAAS,UAAU,QAAQ,QAAQ,CAAC,GAC3D,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE2B,UAAU,eAAc;EAChD,MAAM,YAAY,KAAK,UAAS;EAEhC,OAAO,KAAK,WAAU,CAAE,CAAC,KAAI,SACzB,CAAC,CAAC,aAAa,CAAC,UAAU,SAAS,IAAI,CAAC;CAEhD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE0B,SAAS,eAAkC;EACnE,MAAM,YAAY,KAAK,UAAS;EAChC,MAAM,QAAQ,KAAK,QAAO;EAE1B,OAAO,KAAK,WAAU,CAAE,CAAC,KAAK,MAAM,UAChC,MAAM,SACA;GAAE,QAAQ,KAAK,IAAG,CAAE,CAAC;GAAS,QAAQ;EAAK,IAC3C,iBACE,YAAY,UAAU,QAAQ,IAAI,IAAI,OACtC,OACA,KAAK,KAAI,CAAE,CACd;CAEb,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEgB,cAAc,eAAc;EAC1C,MAAM,YAAY,KAAK,UAAS;EAChC,MAAM,QAAQ,KAAK,WAAU,CAAE,CAC1B,KAAK,MAAM,WAAW;GAAE;GAAM,GAAG,KAAK,OAAM,CAAE,CAAC;EAAM,EAAG,CAAC,CACzD,QAAQ,GAAG,UAAU,CAAC,KAAK,QAAO,CAAE,CAAC,MAAM;EAEhD,OAAO,YACD,MAAM,MAAM,GAAG,MACb,UAAU,QAAQ,EAAE,IAAI,IAAI,UAAU,QAAQ,EAAE,IAAI,CAAC,IAEvD;CACV,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAGe,SAAS,eAAc;EACpC,MAAM,SAAS,KAAK,aAAY;EAChC,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,UAAU,KAAK,QAAO;EAE5B,OAAO,KAAK,WAAU,CAAE,CACnB,KAAK,MAAM,WAAW;GACnB;GACA,OAAO,OAAO,UAAU;GACxB,QAAQ,QAAQ;EACnB,EAAC,CAAC,CACF,QAAO,UAAS,CAAC,OAAO,SAAS,MAAM,IAAI,CAAC;CACrD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,eAAe,eAA4B;EAC1D,MAAM,MAAM,KAAK,IAAG;EACpB,MAAM,OAAO,iBAAiB,GAAG;EACjC,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,QAAQ,KAAK,QAAO,MAAO;EACjC,MAAM,QAAQ,OAAO,QAAQ,KAAK,UAAU,MAAM,MAAM,OAAO,CAAC;EAChE,MAAM,YAAY,KAAK,UAAS;EAChC,MAAM,QAAQ,YAAY,CAAC;GAAE,MAAM;GAAI,OAAO;GAAG,QAAQ,IAAI;EAAI,CAAE,IAAI;EACvE,MAAM,aAAa;GACf,UAAU;GACV,OAAO,IAAI;GACX,SAAS;EACZ;EAyED,OAAO,kBAAkB;GAtErB,GAAG;GACH,OAAO;IACH,GAAG,KAAK;IACR,MAAM,QAAQ,UAAU;IACxB,QAAQ,KAAK,WAAU;GAC1B;GACD,QAAQ,MAAM,KAAI,UAAS,MAAM,MAAM;GACvC,QAAQ,MAAM,KAAI,UAAS,MAAM,IAAI;GACrC,QAAQ,MAAM,KAAI,UAAS,MAAM,KAAK;GAEtC,QAAQ;IAAE,MAAM;IAAM,OAAO;IAAG,QAAQ,CAAC,IAAI,OAAO;GAAC;GAErD,QAAQ;IACJ,GAAG,KAAK;IACR,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,SAAS,SAAQ,EAAE;GAC3D;GACD,aAAa,EACT,KAAK;IAED,eAAe;IACf,OAAO;KACH,MAAM;KACN,QAAQ;MACJ,MAAM;MACN,MAAM;MACN,OAAO;OACH,UAAU;OACV,YAAY;OACZ,OAAO,IAAI;OACX,SAAS;OACT,YAAY,UACR,KAAK,YAAY,OAAO,KAAK,CAAC;MACrC;MACD,OAAO;OACH,MAAM;OACN,YAAY;OACZ,OAAO,KAAK,WAAU;OACtB,GAAG;OACH,iBAAiB,KAAK,YAAY,KAAK;MAC1C;KACJ;IACJ;GACJ,EACJ;GACD,SAAS,YAAY,EAAE,SAAS,MAAK,IAAK;IAEtC,OAAO;IACP,iBAAiB;IACjB,SAAS,EAAE,kBAA2C;KAClD,MAAM,QAAQ,OAAO;KAErB,OAAO,QACD,iBACE,IACA,CAAC;MACG,QAAQ,MAAM;MACd,MAAM,MAAM;MACZ,OAAO,KAAK,OAAM,IAAK,SAAY,KAAK,YAAY,MAAM,KAAK;KAClE,CAAA,GACD,QACM,GACE,KAAK,iBAAiB,OAAO,MAAM,QAAQ,KAAK,EACpD,aACE,EAAE,IAEV;IACV;GACH;EAGoB,GAAS,KAAK,QAAO,CAAE;CACpD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CA3JO,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,uBAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UC5BhC;EAmBA,cAAA,CAAA;GAAA,MAAA;GAAA,MDMc;GAAqB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA,CAAA,sBAAA,gBAAA;EAAA,CAAA;CAAA,CAAA;;AAGtB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAN/B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAc,SAEf,CAAC,qBAAqB;GAAC,MAC1B,EAAE,OAAO,uBAAsB;GAAE,UAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;AEzB3C,MAAa,mBAAmB,CAAC,OAAO,OAAO;ACiB/C,IAAa,sBAAb,MAAa,oBAAmB;CACnB,QAAQ,MAAM,SAAmB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEjC,KAAK,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,KAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,OAAO,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAExB,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGrD,gBAAgB,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,gBAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAG1D,kBAAkB,MAAuB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAG9C,UAAU,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE3B,mBAAmB,eACxB,CACI,eACA,KAAK,QAAO,CACf,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAED,SAAM;EACF,KAAK,MAAM,IAAI,CAAC,KAAK,MAAK,CAAE;CAChC;CA7BS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,IAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,iBAAA;EAAA;EAAA,MAAA,EAAA,YAAA;GAAA,WAAA;GAAA,aAAA;EAAA,EAAA;EAAA,UAAA;EAAA,UClBhC;EAaA,QAAA,CAAA,27GAAA;CAAA,CAAA;;ADKa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAP/B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAa,MAIjB;IAAE,aAAa;IAAQ,eAAe;GAAM;GAAE,UAAA;GAAA,QAAA,CAAA,27GAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEbxD,MAAM,aAAa;CAAC;CAAK;CAAM;CAAM;AAAI;AAMzC,SAAgB,cAAc,MAAY,QAAc;CACpD,MAAM,SAAS,OACV,MAAM,GAAG,CAAC,CACV,KAAI,UAAS,MAAM,KAAI,CAAE,CAAC,YAAW,CAAE,CAAC,CACxC,OAAO,OAAO;CAEnB,IAAI,CAAC,OAAO,QACR,OAAO;CAGX,MAAM,OAAO,KAAK,KAAK,YAAW;CAClC,MAAM,OAAO,KAAK,KAAK,YAAW;CAElC,OAAO,OAAO,MAAK,UAAQ;EACvB,IAAI,MAAM,WAAW,GAAG,GACpB,OAAO,KAAK,SAAS,KAAK;EAG9B,IAAI,MAAM,SAAS,IAAI,GACnB,OAAO,KAAK,WAAW,MAAM,MAAM,GAAG,EAAE,CAAC;EAG7C,OAAO,SAAS;CACpB,CAAC;AACL;AAGA,SAAgB,YACZ,OACA,QACA,SAAsB;CAEtB,MAAM,WAAmB,CAAA;CACzB,MAAM,WAA4B,CAAA;CAElC,KAAK,MAAM,QAAQ,OACf,IAAI,CAAC,cAAc,MAAM,MAAM,GAC3B,SAAS,KAAK;EAAE;EAAM,QAAQ;CAAM,CAAE;MACnC,IAAI,YAAY,QAAQ,KAAK,OAAO,SACvC,SAAS,KAAK;EAAE;EAAM,QAAQ;CAAM,CAAE;MAEtC,SAAS,KAAK,IAAI;CAI1B,OAAO;EAAE;EAAU;CAAQ;AAC/B;AAGA,SAAgB,eAAe,OAAa;CACxC,IAAI,OAAO;CACX,IAAI,OAAO;CAEX,OAAO,QAAQ,QAAQ,OAAO,WAAW,SAAS,GAAG;EACjD,QAAQ;EACR;CACJ;CAIA,OAAO,GAFS,SAAS,IAAI,OAAO,KAAK,MAAM,OAAO,EAAE,IAAI,GAE3C,GAAI,WAAW;AACpC;ACzCA,IAAa,sBAAb,MAAa,oBAAmB;CACnB,QAAQ,MAAc,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEzB,KAAK,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,KAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,SAAS,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAC1B,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,YAAY,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAC7B,cAAc,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAG/B,UAAU,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEpC,QAAQ,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACzB,OAAO,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACxB,OAAO,MAAgB,mBAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEzC,WAAW,OAAM;CAET,SAAS,UAAU,SAChC,UACH,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAGO,YAAY;CAED,aAAa,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAC1B,eAAe,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAE5B,eAAe,eAC9B,KAAK,MAAK,MACT,KAAK,SAAQ,IACR,uCACA,wCACT,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,QAAQ,eACvB,KAAK,MAAK,CAAE,CAAC,KAAI,UAAS;EACtB,MAAM,KAAK;EACX,MAAM,eAAe,KAAK,IAAI;CACjC,EAAC,GACL,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAES,aAAU;EAChB,IAAI,KAAK,SAAQ,GACb;EAGJ,MAAM,SAAS,KAAK,OAAM,CAAE,CAAC;EAE7B,IAAI,OAAO,YACP,OAAO,WAAU;OAEjB,OAAO,MAAK;CAEpB;CAEU,cAAc,OAAoB;EACxC,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;GAC5C,MAAM,eAAc;GACpB,KAAK,WAAU;EACnB;CACJ;CAEU,WAAW,OAAY;EAC7B,MAAM,SAAS,MAAM;EAErB,KAAK,SAAS,CAAC,GAAG,OAAO,SAAS,CAAA,CAAE,CAAC;EAGrC,OAAO,QAAQ;CACnB;CAEU,gBAAgB,OAAgB;EACtC,MAAM,eAAc;EAEpB,IAAI,KAAK,SAAQ,GACb;EAGJ,KAAK;EACL,KAAK,WAAW,IAAI,IAAI;CAC5B;CAEU,eAAe,OAAgB;EAErC,MAAM,eAAc;EAEpB,IAAI,MAAM,cACN,MAAM,aAAa,aAAa,KAAK,SAAQ,IAAK,SAAS;CAEnE;CAEU,kBAAe;EACrB,KAAK,YAAY,KAAK,IAAI,GAAG,KAAK,YAAY,CAAC;EAE/C,IAAI,CAAC,KAAK,WACN,KAAK,WAAW,IAAI,KAAK;CAEjC;CAEU,WAAW,OAAgB;EACjC,MAAM,eAAc;EAEpB,KAAK,YAAY;EACjB,KAAK,WAAW,IAAI,KAAK;EAEzB,IAAI,CAAC,KAAK,SAAQ,GACd,KAAK,SAAS,CAAC,GAAG,MAAM,cAAc,SAAS,CAAA,CAAE,CAAC;CAE1D;CAEU,QAAK;EACX,KAAK,MAAM,IAAI,CAAA,CAAE;EACjB,KAAK,aAAa,IAAI,KAAK;CAC/B;CAEQ,SAAS,OAAa;EAC1B,IAAI,CAAC,MAAM,QACP;EAKJ,MAAM,EAAE,UAAU,aAAa,YADZ,KAAK,SAAQ,IAAK,QAAQ,MAAM,MAAM,GAAG,CAAC,GAGzD,KAAK,OAAM,GACX,KAAK,QAAO,CAAE;EAGlB,KAAK,aAAa,IAAI,SAAS,SAAS,CAAC;EAEzC,IAAI,SAAS,QACT,KAAK,SAAS,KAAK,QAAQ;EAG/B,IAAI,SAAS,QACT,KAAK,MAAM,IAAI,QAAQ;CAE/B;CA3IS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,IAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,UAAA;EAAA;EAAA,WALjB,CAAC,aAAa;GACrB;GACA;EACH,CAAA,CAAC;EAAC,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,QAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UC3BP;EA4EA,QAAA,CAAA,6jNAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDrDc;GAAM,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAMP,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAV/B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAa,SAGd,CAAC,MAAM;GAAC,WACN,CAAC,aAAa;IACrB;IACA;GACH,CAAA,CAAC;GAAC,UAAA;GAAA,QAAA,CAAA,6jNAAA;EAAA,CAAA;CAsBC,CAAA;CAAA,gBAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,IAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,UAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,UAAQ,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AExChB,IAAa,mBAAb,MAAa,iBAAgB;CAChB,QAAQ,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACzB,OAAO,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAKxB,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAKrD,QAAQ,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAIzB,MAAM,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CAOvB,SAAS,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAC1B,UAAU,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEpC,IAAc,UAAO;EACjB,OAAO,KAAK,IAAG,KAAM;CACzB;CAEA,IAAc,WAAQ;EAClB,OAAO,KAAK,OAAM,KAAM;CAC5B;CAEA,IAAc,YAAS;EACnB,OAAO,KAAK,QAAO,KAAM;CAC7B;CApCS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,QAAA;EAAA,UAAA;EAAA,UCT7B;EAgCA,QAAA,CAAA,mYAAA;CAAA,CAAA;;ADvBa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAN5B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAU,MAGd,EAAE,OAAO,QAAO;GAAE,UAAA;GAAA,QAAA,CAAA,mYAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEN5B,MAAa,uBAAuB,CAAC,QAAQ,MAAM;ACkCnD,IAAa,mBAAb,MAAa,iBAAgB;CAChB,QAAQ,MAAM,SAAqB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEnC,UAAU,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE3B,OAAO,MAAiB,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,KAAK,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,KAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,OAAO,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACxB,cAAc,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,eAAe,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,YAAY,MAAsB,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAErC,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGrD,kBAAkB,MAAuB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAG9C,MAAM,MAAuB,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,MAAM,MAAuB,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,OAAO,MAAuB,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACjC,UAAU,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC3B,YAAY,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACtC,YAAY,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEtC,YAAY,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACtD,aAAa,MAAM,MAAI;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGtD,aAAa,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAEvD,OAAO,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACxB,YAAY,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAC7B,cAAc,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAI/B,YAAY,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAC7B,eAAe,MAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAC1C,eAAe,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,uBAAuB,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,uBAAA,CAAA,+BAAA,CAAA,CAAA;CACjD,mBAAmB,MAAkC,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CACxD,eAAe,MAA8B,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEhD,UAAU,OAAM;CAChB,UAAU,OAAM;CAGhB,iBAAiB,aAAmC,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAC9D,kBAAkB,aAAmC,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAEtD,WAAW,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAExB,YAAY,eAC3B,KAAK,WAAU,KAAM,KAAK,KAAI,MAAO,YACxC,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,YAAY,eAC3B,KAAK,UAAS,KAAM,KAAK,SAAQ,IAAK,SAAS,KAAK,KAAI,GAC3D,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,mBAAmB,eACxB;EACI;EACA;EACA,KAAK,QAAO;CACf,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAES,YAAY,OAAY;EAC9B,MAAM,SAAS,MAAM;EAErB,KAAK,MAAM,IAAI,KAAK,WAAW,MAAM,CAAC;CAC1C;CAEU,YAAY,OAAiB;EACnC,KAAK,QAAQ,KAAK,KAAK;CAC3B;CAEU,WAAW,OAAiB;EAClC,KAAK,QAAQ,KAAK,KAAK;CAC3B;CAEQ,WAAW,SAAyB;EACxC,IAAI,KAAK,KAAI,MAAO,UAChB,OAAO,QAAQ;EAGnB,IAAI,CAAC,QAAQ,OACT,OAAO;EAGX,OAAO,QAAQ;CACnB;CAjGS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,IAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,sBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,kBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,iBAAA;GAAA,SAAA;GAAA,SAAA;EAAA;EAAA,WALd,CAAC,aAAa;GACrB;GACA;EACH,CAAA,CAAC;EAAC,SAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,SAAA;GAAA,aAAA;GAAA,UAAA;EAAA,GAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,UAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UCjCP;EAoDA,QAAA,CAAA,+/NAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDvBc;GAAgB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAM,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAMzB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAV5B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAU,SAGX,CAAC,kBAAkB,MAAM;GAAC,WACxB,CAAC,aAAa;IACrB;IACA;GACH,CAAA,CAAC;GAAC,UAAA;GAAA,QAAA,CAAA,+/NAAA;EAAA,CAAA;CAoD0D,CAAA;CAAA,gBAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,IAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,iBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,uBAAA;EAAA,CAAA;EAAA,KAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,KAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,sBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,kBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,SAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,SAAA;EAAA,CAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,WAAS,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,iBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CACR,YAAU,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AErF5E,MAAa,aAAa;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACM;AAMV,MAAa,aAAa;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACM;AASV,MAAa,yBAAyB;CAAC;CAAQ;CAAU;CAAQ;AAAM;AAMvE,MAAa,qBAAqB;CAAC;CAAW;CAAU;CAAQ;CAAQ;AAAM;AC/B9E,IAAa,wBAAb,MAAa,sBAAqB;CAArB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,MAAA,EAAA,gBAAA,mBAAA;EAAA,UAAA;EAAA,UAJpB;EAAgB,UAAA;EAAA,QAAA,CAAA,igCAAA;CAAA,CAAA;;AAIjB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EANjC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAgB,UAChB;GAAgB,MAEpB,EAAE,OAAO,mBAAkB;GAAE,QAAA,CAAA,igCAAA;EAAA,CAAA;;;ACDvC,IAAa,wBAAb,MAAa,sBAAqB;CACrB,SAAS,gBAAgB,kBAAgB;EAAA,GAAA,YAAA,EAAA,WAAA,SAAA,+BAAA,CAAA;EAAI,aAAa;CAAK,CAAA;CAG/D,kBAAkB,MAAuB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAEvD,cAAA;EACI,aAAY;GACR,MAAM,QAAQ,KAAK,gBAAe;GAElC,KAAK,MAAM,SAAS,KAAK,OAAM,GAC3B,MAAM,gBAAgB,IAAI,KAAK;EAEvC,CAAC;CACL;CAdS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,iBAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,SAAA,EAAA,iBAAA,wBAAA;EAAA,SAAA,CAAA;GAAA,cAAA;GAAA,WACI;GAAgB,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UAJxC;EAAgB,UAAA;EAAA,QAAA,CAAA,0gIAAA;CAAA,CAAA;;AAGjB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EALjC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAgB,UAChB;GAAgB,QAAA,CAAA,0gIAAA;EAAA,CAAA;CAIQ,CAAA;CAAA,sBAAA,CAAA;CAAA,gBAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,GAAA,iBAAA,gBAAgB,GAAA;IAAI,aAAa;IAAO,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,iBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,uBAAA;EAAA,CAAA;CAAA;AAAA,CAAA;ACM9E,IAAa,mBAAb,MAAa,iBAAgB;CAChB,QAAQ,MAAM,SAAqB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACnC,SAAS,MAAM,SAAqB,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEpC,KAAK,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,KAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,OAAO,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAExB,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGrD,kBAAkB,MAAuB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAE9C,cAAc,OAClB,GAAG,MAAM,MAAM,GACnB,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,UAAU,eACf,KAAK,YAAW,CAAE,CAAC,KAAK,MAAK,GAAI,KAAK,OAAM,CAAE,GACjD,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAED,SAAM;EACF,KAAK,MAAM,IAAI,KAAK,OAAM,CAAE;CAChC;CAvBS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,IAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,iBAAA;EAAA;EAAA,MAAA,EAAA,YAAA;GAAA,WAAA;GAAA,aAAA;EAAA,EAAA;EAAA,UAAA;EAAA,UClB7B;EASA,QAAA,CAAA,iGAAA;CAAA,CAAA;;ADSa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAP5B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAU,MAId;IAAE,aAAa;IAAQ,eAAe;GAAM;GAAE,UAAA;GAAA,QAAA,CAAA,iGAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AELxD,IAAa,mBAAb,MAAa,iBAAgB;CAChB,aAAa,MAAuB,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAC5C,SAAS,MAAmB,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACtC,OAAO,MAAiB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAE7B,mBAAmB,eACxB;EACI;EACA,aAAa,KAAK,OAAM,EAAE,GAAI,KAAK,WAAU;EAC7C,aAAa,KAAK,KAAI;CACzB,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAbQ,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,YAAA,EAAA,SAAA,qBAAA,EAAA;EAAA,UAAA;EAAA,UCX7B;EACA,QAAA,CAAA,g3GAAA;CAAA,CAAA;;ADUa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAN5B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAU,MAGd,EAAE,WAAW,qBAAoB;GAAE,UAAA;GAAA,QAAA,CAAA,g3GAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AER7C,MAAa,YAAY;CAAC;CAAQ;CAAM;CAAM;CAAM;AAAI;AAMxD,MAAa,gBAA4C;CACrD,MAAM;CACN,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACP;ACFD,IAAa,kBAAb,MAAa,gBAAe;CACf,SAAS,MAAkB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEhC,mBAAmB,eACxB,cAAc,KAAK,OAAM,IAC5B,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CALQ,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAe,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAf,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAe,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,QAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,MAAA,EAAA,YAAA,EAAA,SAAA,qBAAA,EAAA;EAAA,UAAA;EAAA,UAJd;EAAgB,UAAA;EAAA,QAAA,CAAA,gqEAAA;CAAA,CAAA;;AAIjB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAe,YAAA,CAAA;EAN3B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAS,UACT;GAAgB,MAEpB,EAAE,WAAW,qBAAoB;GAAE,QAAA,CAAA,gqEAAA;EAAA,CAAA;;;;;;;;;;;ACD7C,IAAa,sBAAb,MAAa,oBAAmB;CACnB,YACL,WACA,SACA,YACC,gBAAgB,WAAW,SAAS;EACrC,WAAW,QAAQ;EACnB,UAAU;EACV,YAAY;GACR,OAAO,QAAQ,MAAM;GACrB,KAAK,EAAG,SAAS,QAAQ,gBAAe,CAAE;GAC1C,MAAM,EAAE,SAAS,QAAQ,gBAAe,CAAE;EAC7C;CACJ,CAAA;CAEQ,SACL,WACA,SACA,WACC,WAAW,WAAW,SAAS,MAAM;CAnBjC,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,QAAA,GAAA,sBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,YADN;CAAM,CAAA;;AACnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAD/B,MAAA;EAAW,MAAA,CAAA,EAAE,YAAY,OAAM,CAAE;;;ACAlC,IAAa,iBAAb,MAAa,eAAc;CACN,UAAiC,CAAA;CAElD,cAAA;EACI,SAAS,iBAAiB,SAAS,KAAK,eAAe;EACvD,SAAS,iBAAiB,WAAW,KAAK,SAAS;EAEnD,OAAO,UAAU,CAAC,CAAC,gBAAe;GAC9B,SAAS,oBAAoB,SAAS,KAAK,eAAe;GAC1D,SAAS,oBAAoB,WAAW,KAAK,SAAS;EAC1D,CAAC;CACL;CAES,QAAQ,UAA8B;EAC3C,KAAK,OAAO,KAAK;EACjB,KAAK,QAAQ,KAAK,KAAK;CAC3B;CAES,UAAU,UAA8B;EAC7C,MAAM,QAAQ,KAAK,QAAQ,QAAQ,KAAK;EACxC,IAAI,UAAU,IAAM,KAAK,QAAQ,OAAO,OAAO,CAAC;CACpD;CAEiB,YAAY,KAAK,QAAQ,GAAG,EAAE;CAE9B,mBAAmB,UAChC,KAAK,IAAG,CAAE,EAAE,gBAAgB,KAAK;CAEpB,aAAa,UAC1B,KAAK,IAAG,CAAE,EAAE,UAAU,KAAK;CA7BtB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAd,OAAA,QAAA,GAAA,sBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,YADD;CAAM,CAAA;;AACnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAc,YAAA,CAAA;EAD1B,MAAA;EAAW,MAAA,CAAA,EAAE,YAAY,OAAM,CAAE;;;;ACiBlC,IAAa,qBAAb,MAAa,mBAAkB;CACV,aAAa,OAAO,mBAAmB;CACvC,QAAQ,OAAO,cAAc;CAErC,UAAU,MAAqC,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC/C,SAAS,MAAgC,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACzC,iBAAiB,MACtB,qBACH,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,SAAS,MAAM,SAAmC,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAElD,YAAY,MAAiB,gBAAe,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAC5C,SAAS,MAAc,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACzB,kBAAkB,MAAc,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAGlC,aAAa,MAAiC,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAE5D,cAAA;EACI,QAAO,cAAY;GACf,IAAI,CAAC,KAAK,OAAM,CAAE,CAAA,GAAM;GAExB,KAAK,MAAM,KAAK,IAAI;GACpB,gBAAgB,KAAK,MAAM,OAAO,IAAI,CAAC;EAC3C,CAAC;EAED,QAAO,cAAY;GACf,MAAM,SAAS,KAAK,OAAM;GAC1B,MAAM,UAAU,KAAK,QAAO;GAE5B,IAAI,CAAC,KAAK,OAAM,CAAE,CAAA,KAAM,CAAC,UAAU,CAAC,SAAW;GAE/C,MAAM,mBAAmB,OAAO;GAChC,MAAM,kBAAkB,QAAQ;GAEhC,MAAM,eAAc;IAChB,MAAM,aAAa,KAAK,WAAU;IAElC,IAAI,YAAY;KACZ,MAAM,QAAQ,GAAG,iBAAiB,YAAW;KAE7C,IAAI,eAAe,QAAQ;MACvB,gBAAgB,MAAM,WAAW;MACjC,gBAAgB,MAAM,WAAW;KACrC,OACI,gBAAgB,MAAM,cAAc;IAE5C;IAEA,OAAO,KAAK,WAAW,SACnB,kBACA,iBACA;KACI,WAAW,KAAK,UAAS;KACzB,QAAQ,KAAK,OAAM;KACnB,iBAAiB,KAAK,gBAAe;IACxC,CAAA,CACJ,CAAC,MAAM,EAAE,GAAG,QACT,OAAO,OAAO,gBAAgB,OAAO;KACjC,MAAM,GAAG,EAAC;KACV,KAAK,GAAG,EAAC;IACZ,CAAA,CAAC;GAEV;GAEA,OAAM;GAEN,UACI,KAAK,WAAW,MAAM,kBAAkB,iBAAiB,MAAM,CAAC;EAExE,CAAC;CACL;CAEiB,cAAc,KAAK,OAAM,CAAE,CAAC,IAAI,KAAK;CAE7C,mBAAmB,UAAqB;EAC7C,MAAM,YAAY,KAAK,eAAc;EACrC,IAAI,cAAc,QAAU;EAE5B,MAAM,SAAS,MAAM;EACrB,IAAI,EAAE,kBAAkB,OAAS;EAEjC,MAAM,gBAAgB,KAAK,OAAM,CAAE,EAAE;EACrC,MAAM,iBAAiB,KAAK,QAAO,CAAE,EAAE;EACvC,MAAM,iBAAiB,eAAe,SAAS,MAAM,KAAK;EAC1D,MAAM,kBAAkB,gBAAgB,SAAS,MAAM,KAAK;EAI5D,IAAI,kBAAkB,CAAC,iBAAmB;EAE1C,IAAI,cAAc,qBAAqB;GACnC,KAAK,MAAK;GACV;EACJ;EAEA,IAAI,CAAC,iBACD,KAAK,MAAK;CAElB;CAES,aAAa,UAAwB;EAC1C,IAAI,MAAM,QAAQ,UAAY,KAAK,MAAK;CAC5C;CAxGS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAkB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAlB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAkB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,qBAAA;EAAA,UAAA,CAAA,WAAA;EAAA,UAAA;EAAA,UAHjB;EAAgB,UAAA;CAAA,CAAA;;AAGjB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAkB,YAAA,CAAA;EAN9B,MAAA;EAAU,MAAA,CAAA;GACP,UAAU;GACV,UAAU;GACV,UAAU;GACV,MAAM,EAAE,OAAO,qBAAoB;EACtC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACfD,IAAa,sBAAb,MAAa,oBAAmB;CACnB,UAAU,OAAO,UAAuB;CADxC,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,MAAA,EAAA,gBAAA,gCAAA;EAAA,UAAA;CAAA,CAAA;;AAAnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAJ/B,MAAA;EAAU,MAAA,CAAA;GACP,UAAU;GACV,MAAM,EAAE,OAAO,gCAA+B;EACjD,CAAA;;;ACkBD,IAAa,sBAAb,MAAa,oBAAmB;CACT,SAAS,OAAO,UAAuB;CACjD,UAAU,aAAa,qBAAoB,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC3C,SAAS,MAAM,SAAmC,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAClD,YAAY,MAAiB,gBAAe,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAC5C,iBAAiB,MACtB,qBACH,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,SAAS,MAAc,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACzB,kBAAkB,MAAc,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAGlC,aAAa,MAAiC,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEnD,eAAe,KAAK,OAAM,CAAE,CAAC,QAAO,UAAS,CAAC,KAAK;CACnD,cAAc,KAAK,OAAM,CAAE,CAAC,IAAI,KAAK;CACrC,aAAa,KAAK,OAAM,CAAE,CAAC,IAAI,IAAI;CAjBnC,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,uBAAA;EAAA,SAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAEI;GAAmB,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA,CAAA,YAAA;EAAA,UAAA;EAAA,UC1BvD;EAWa,cAAA,CAAA;GAAA,MAAA;GAAA,MDUC;GAAkB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,UAAA,CAAA,WAAA;EAAA,CAAA;CAAA,CAAA;;AAGnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAP/B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAa,UACb;GAAY,SAEb,CAAC,kBAAkB;GAAC,MACvB,EAAE,OAAO,uBAAsB;GAAE,UAAA;EAAA,CAAA;CAIP,CAAA;CAAA,gBAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,GAAA,iBAAA,mBAAmB,GAAA,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,iBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AE+BvD,IAAI,WAAS;AAuBb,IAAa,oBAAb,MAAa,kBAAiB;CACjB,SAAS,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,YAAY,MAAiB,gBAAe,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAC5C,iBAAiB,MACtB,oBACH,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,aAAa,MAAM,SAAmC,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CACtD,QAAQ,OAAgB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAE3B,cAAc,MAAc,oBAAmB,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAG/C,KAAK,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,KAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,cAAc,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAE/B,WAAW,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAC5B,aAAa,MAAkB,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAGtC,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAErD,kBAAkB,MAAuB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAG9C,YAAY,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACtD,aAAa,MAAc,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAMlC,YAAY,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACtD,cAAc,OAAiC,UACpD,WAAW,MAAK,IACnB,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAGQ,UAAU,MAA+C,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAG9D,mBAAmB,MAAM,MAAI;EAAA,GAAA,YAAA,EAAA,WAAA,mBAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAG5D,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,kBAAkB,MAA6B,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAGtD,eAAe,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CACzC,eAAe,OAAiC,UACrD,GAAG,MAAK,YACX,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,cAAc,OAClB,GAAG,MAAM,MAAM,GACnB,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,cAAc,OACnB,SAAQ,GAAG,QACd,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,kBAAkB,OAAM;CAGxB,SAAS,OAAM;CAEf,eAAe,MAAoB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CACxC,gBAAgB,MAAe,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAClC,QAAQ,OAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAClB,UAAU,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACvB,UAAU,OAAO,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEtB,iBAAiB,aAExB,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CACF,kBAAkB,aAEzB,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAGH,cAAc,OAAO,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEvB,SAAS,aAAa;CAEtB,eAAe,eACpB,KAAK,SAAQ,IACP,KAAK,cAAa,CAAE,CAAC,SAAS,IAC9B,KAAK,aAAY,MAAO,MACjC,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,eAAe,eAAc;EAClC,MAAM,UAAU,KAAK,YAAW;EAEhC,IAAI,CAAC,KAAK,SAAQ,GAAI;GAClB,MAAM,WAAW,KAAK,aAAY;GAElC,OAAO,aAAa,OAAO,QAAQ,QAAQ,IAAI,KAAK,YAAW;EACnE;EAEA,MAAM,WAAW,KAAK,cAAa;EACnC,MAAM,eAAe,KAAK,aAAY;EAEtC,IAAI,CAAC,SAAS,QACV,OAAO,KAAK,YAAW;EAG3B,OAAO,iBAAiB,QAAQ,SAAS,SAAS,eAC5C,KAAK,aAAY,CAAE,CAAC,SAAS,MAAM,IACnC,SAAS,IAAI,OAAO,CAAC,CAAC,KAAK,IAAI;CACzC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEO,UAAU,eACf,KAAK,SAAQ,IAAK,CAAC,KAAK,cAAa,CAAE,CAAC,SAAS,KAAK,aAAY,MAAO,MAC5E,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAGQ,WAAW,eAChB,KAAK,SAAQ,KACb,KAAK,gBAAe,MAAO,UAC3B,KAAK,WAAU,MAAO,UACzB,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAGQ,cAAc,eAAc;EACjC,MAAM,QAAQ,KAAK,MAAK,CAAE,CAAC,KAAI;EAC/B,MAAM,UAAU,KAAK,YAAW;EAEhC,IAAI,CAAC,KAAK,UAAS,KAAM,CAAC,SAAS,KAAK,QAAO,GAC3C,OAAO;EAOX,OAJe,KAAK,MAAK,CAAE,CAAC,MAAK,SAC7B,QAAQ,IAAI,CAAC,CAAC,YAAW,MAAO,MAAM,YAAW,CAG9C,IAAS,OAAO;CAC3B,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEO,OAAO,eAAkC;EAC9C,MAAM,OAA2B,CAAA;EACjC,MAAM,UAAU,KAAK,QAAO;EAC5B,MAAM,UAAU,KAAK,YAAW;EAChC,MAAM,cAAc,KAAK,YAAW;EAEpC,IAAI,QAAQ;EACZ,IAAI;EAEJ,IAAI,KAAK,UAAS,KAAM,KAAK,aAAY,GACrC,KAAK,KAAK;GAAE,MAAM;GAAS,IAAI,KAAK,MAAM,KAAK;GAAG,OAAO;EAAO,CAAE;EAGtE,KAAK,MAAM,QAAQ,KAAK,MAAK,GAAI;GAC7B,IAAI,SAAS;IACT,MAAM,OAAO,QAAQ,IAAI;IAEzB,IAAI,SAAS,SAAS,MAClB,KAAK,KAAK;KACN,MAAM;KACN,IAAI,GAAG,KAAK,OAAM,SAAU,KAAK;KACjC,OAAO;IACV,CAAA;IAGL,QAAQ;GACZ;GAEA,KAAK,KAAK;IACN,MAAM;IACN,IAAI,KAAK,MAAM,KAAK;IACpB,OAAO;IACP;IACA,OAAO,QAAQ,IAAI;IACnB,UAAU,KAAK,WAAW,IAAI;GACjC,CAAA;EACL;EAEA,IAAI,aACA,KAAK,KAAK;GACN,MAAM;GACN,IAAI,KAAK,MAAM,KAAK;GACpB;GACA,OAAO;EACV,CAAA;EAGL,OAAO;CACX,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEe,WAAW,eACxB,KAAK,KAAI,CAAE,CAAC,QAAO,QAAO,IAAI,SAAS,OAAO,GACjD,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,WAAW,eAChB,KAAK,OAAM,IAAK,KAAK,SAAQ,CAAE,CAAC,KAAK,YAAW,EAAG,EAAE,MAAM,OAAO,MACrE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAEO,OAAO;CAGE,QAAQ,IAAI,QAAO;CAEnB,OAAO,OAAgC,UAAU;CACjD,WAAW,OAAO,QAAQ;CAC1B,aAAa,OAAO,UAAU;CAC9B,MAAM,OAAO,iBAAiB;CAE/C,cAAA;EAEI,aAAY;GACR,KAAK,WAAU;GACf,gBAAgB,KAAK,cAAa,CAAE;EACxC,CAAC;EAGD,aAAY;GACR,IAAI,CAAC,KAAK,OAAM,GACZ;GAGJ,gBAAe;IACX,MAAM,WAAW,KAAK,SAAQ,CAAE,CAAC,WAAU,QACvC,IAAI,SAAS,UAAU,IAAI,QAAQ;IAGvC,KAAK,YAAY,IACb,KAAK,iBAAgB,KAAM,YAAY,IAAI,WAAW,CAAC;IAG3D,sBAAqB;KACjB,IAAI,KAAK,iBAAgB,GACrB,KAAK,qBAAoB;KAG7B,IAAI,KAAK,WAAU,MAAO,YACtB,KAAK,YAAW,CAAE,EAAE,MAAK;IAEjC,GAAG,EAAE,UAAU,KAAK,SAAQ,CAAE;GAClC,CAAC;EACL,CAAC;EAGD,aAAa,KAAK,KAAK,CAAC,CAAC,KACrB,aAAa,GAAG,GAChB,KAAK,CAAC,GACN,mBAAmB,KAAK,UAAU,CAAC,CACtC,CAAC,gBAAgB,KAAK,cAAa,CAAE;EAGtC,KAAK,MAAM,KACP,gBAAgB,KAAK,UAAS,CAAE,GAChC,mBAAmB,KAAK,UAAU,CAAC,CACtC,CAAC,WAAU,WAAU,KAAK,YAAY,MAAM,CAAC;CAClD;CAEQ,YAAS;EACb,KAAK,QAAQ,IAAI,IAAI;EAQrB,OANgB,KAAK,WAAU,CAAE,CAAC,KAAK;GACnC,OAAO,KAAK,MAAK;GACjB,MAAM,KAAK;GACX,MAAM,KAAK,SAAQ;EACtB,CAEM,CAAA,CAAQ,KAAK,iBAAiB,GAAG,IAAI,CAAC,CAAC;CAClD;CAEQ,YAAY,QAA6C;EAC7D,KAAK,QAAQ,IAAI,KAAK;EAEtB,IAAI,QAAQ;GACR,KAAK,MAAM,QAAO,UAAS,CAAC,GAAG,OAAO,GAAG,OAAO,KAAK,CAAC;GACtD,KAAK,QAAQ,IAAI,OAAO,OAAO;EACnC;EAEA,KAAK,IAAI,aAAY;CACzB;CAEA,OAAI;EACA,IAAI,CAAC,KAAK,SAAQ,GACd,KAAK,OAAO,IAAI,IAAI;CAE5B;CAEA,SAAM;EACF,IAAI,KAAK,OAAM,GACX,KAAK,OAAO,IAAI,KAAK;OAErB,KAAK,KAAI;CAEjB;CAEA,OAAO,MAAW;EACd,KAAK,aAAa,IAAI,IAAI;EAC1B,KAAK,gBAAgB,KAAK,IAAI;CAClC;CAEA,WAAW,MAAW;EAClB,MAAM,UAAU,KAAK,YAAW;EAEhC,IAAI,SAAS,MACT,OAAO;EAGX,IAAI,KAAK,SAAQ,GACb,OAAO,KAAK,cAAa,CAAE,CAAC,MAAK,aAC7B,QAAQ,UAAU,IAAI,CAAC;EAI/B,MAAM,WAAW,KAAK,aAAY;EAElC,OAAO,aAAa,QAAQ,QAAQ,UAAU,IAAI;CACtD;CAEA,WAAW,MAAW;EAClB,MAAM,UAAU,KAAK,YAAW;EAEhC,KAAK,cAAc,QAAO,aACtB,KAAK,WAAW,IAAI,IACd,SAAS,QAAO,aAAY,CAAC,QAAQ,UAAU,IAAI,CAAC,IACpD,CAAC,GAAG,UAAU,IAAI,CAAC;CAEjC;CAEA,WAAW,MAAW;EAClB,MAAM,UAAU,KAAK,YAAW;EAEhC,KAAK,cAAc,QAAO,aACtB,SAAS,QAAO,aAAY,CAAC,QAAQ,UAAU,IAAI,CAAC,CAAC;CAE7D;CAEA,QAAK;EACD,IAAI,KAAK,SAAQ,GACb,KAAK,cAAc,IAAI,CAAA,CAAE;OACtB;GACH,KAAK,aAAa,IAAI,IAAI;GAC1B,KAAK,gBAAgB,KAAK,IAAI;EAClC;EAEA,KAAK,OAAO,IAAI,KAAK;EACrB,KAAK,aAAY;EAEjB,IAAI,KAAK,WAAU,MAAO,UACtB,KAAK,MAAM,IAAI,EAAE;CAEzB;CAEA,YAAY,MAAW;EAEnB,IAAI,KAAK,SAAQ,GAAI;GACjB,KAAK,WAAW,IAAI;GACpB;EACJ;EAEA,KAAK,OAAO,IAAI;EAChB,KAAK,OAAO,IAAI,KAAK;EACrB,KAAK,aAAY;EAKjB,IAAI,KAAK,WAAU,MAAO,UACtB,KAAK,MAAM,IAAI,EAAE;CAEzB;CAEA,WAAQ;EACJ,MAAM,QAAQ,KAAK,YAAW;EAE9B,IAAI,CAAC,OACD;EAGJ,KAAK,OAAO,KAAK,KAAK;EACtB,KAAK,MAAM,IAAI,EAAE;EAEjB,IAAI,CAAC,KAAK,SAAQ,GAAI;GAClB,KAAK,OAAO,IAAI,KAAK;GACrB,KAAK,aAAY;EACrB;CACJ;CAEA,UAAU,OAAoB;EAC1B,MAAM,QAAQ,KAAK,SAAQ,CAAE,CAAC;EAE9B,MAAM,cAAc,MAAM,QAAQ,OAAO,KAAK,WAAU,MAAO;EAE/D,QAAQ,MAAM,KAAd;GACI,KAAK;GACL,KAAK;IACD,MAAM,eAAc;IAEpB,IAAI,CAAC,KAAK,OAAM,GAAI;KAChB,KAAK,KAAI;KACT;IACJ;IAEA,KAAK,WAAW,MAAM,QAAQ,cAAc,IAAI,IAAI,KAAK;IACzD;GACJ,KAAK;GACL,KAAK;IACD,IAAI,KAAK,OAAM,KAAM,SAAS,KAAK,WAAU,MAAO,QAAQ;KACxD,MAAM,eAAc;KACpB,KAAK,UAAU,MAAM,QAAQ,SAAS,IAAI,QAAQ,CAAC;IACvD;IACA;GACJ,KAAK;GACL,KAAK;IACD,IAAI,MAAM,QAAQ,OAAO,CAAC,aACtB;IAGJ,MAAM,eAAc;IAEpB,IAAI,CAAC,KAAK,OAAM,GACZ,KAAK,KAAI;SAET,KAAK,WAAU;IAEnB;GACJ,KAAK;IAED,KAAK,aAAY;IACjB;EACR;CACJ;CAEA,WAAW,OAAiB;EACxB,MAAM,OAAO,MAAM;EAEnB,IAAI,KAAK,eAAc,MAAO,QAC1B;EAIJ,IACI,EAAE,gBAAgB,SAClB,CAAC,KAAK,KAAK,cAAc,SAAS,IAAI,GAEtC,KAAK,OAAO,IAAI,KAAK;CAE7B;CAEA,UAAU,OAAa;EACnB,KAAK,YAAY,IAAI,KAAK;EAE1B,sBAAsB,KAAK,qBAAoB,GAAI,EAC/C,UAAU,KAAK,SAClB,CAAA;CACL;CAEA,gBAAa;EACT,KAAK,OAAO;EACZ,KAAK,MAAM,IAAI,CAAA,CAAE;EACjB,KAAK,QAAQ,IAAI,IAAI;EAErB,KAAK,MAAM,KAAI;CACnB;CAEA,eAAY;EACR,IAAI,KAAK,QAAO,KAAM,CAAC,KAAK,QAAO,GAC/B;EAGJ,KAAK;EACL,KAAK,MAAM,KAAI;CACnB;CAEA,cAAc,OAAa;EAGvB,KAAK,MAAM,IAAI,KAAK;EACpB,KAAK,YAAY,IAAI,CAAC;EACtB,KAAK,KAAI;CACb;CAEA,SAAS,iBAA4B;EAKjC,IAJwB,gBAAgB,eAClC,gBAAgB,YAChB,gBAAgB,eAEA,IAClB,KAAK,aAAY;CAEzB;CAEQ,aAAU;EACd,MAAM,MAAM,KAAK,SAAQ,CAAE,CAAC,KAAK,YAAW;EAE5C,IAAI,CAAC,KACD;EAGJ,IAAI,IAAI,SAAS,SACb,KAAK,MAAK;OACP,IAAI,IAAI,SAAS,UACpB,KAAK,SAAQ;OACV,IAAI,IAAI,SAAS,QACpB,KAAK,YAAY,IAAI,IAAI;CAEjC;CAEQ,WAAW,MAAc,OAAa;EAC1C,IAAI,OACA,KAAK,WAAW,KAAK,YAAW,IAAK,OAAO,SAAS,KAAK;CAElE;CAEQ,uBAAoB;EACxB,MAAM,KAAK,KAAK,SAAQ;EAExB,IAAI,IACA,KAAK,KAAK,cACL,cAAc,IAAI,IAAI,CAAC,EACtB,eAAe,EAAE,OAAO,UAAS,CAAE;CAEjD;CAEQ,eAAY;EAKhB,CAJgB,KAAK,WAAU,MAAO,WAChC,KAAK,YAAW,IAChB,KAAK,KAAK,cAAc,cAA2B,YAAY,EAErE,EAAS,MAAK;CAClB;CAGQ,cAAW;EACf,OAAO,KAAK,KAAK,cAAc,cAAc,gBAAgB;CACjE;CAEQ,MAAM,OAAa;EACvB,OAAO,GAAG,KAAK,OAAM,GAAI;CAC7B;CAthBS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,IAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,kBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,iBAAA;GAAA,iBAAA;GAAA,QAAA;GAAA,cAAA;GAAA,eAAA;EAAA;EAAA,MAAA,EAAA,WAAA,EAAA,YAAA,qBAAA,EAAA;EAAA,WAPf,CAAC,aAAa;GACrB;GACA;GACA;GACA;EACH,CAAA,CAAC;EAAC,SAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,QAAA;GAAA,aAAA;GAAA,UAAA;EAAA,GAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,SAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UC9EP;EA+QA,QAAA,CAAA,utTAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MD/MQ;IAAmB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,UAAA,CAAA,YAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACnB;IAAmB,UAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACnB;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAAe,UAAA;IAAA,QAAA,CAAA,QAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACf;IAAM,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACN;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;CAAA,CAAA;;AAUX,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EArB7B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAW,SAGZ;IACL;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,MACK,EAAE,cAAc,qBAAoB;GAAE,WACjC,CAAC,aAAa;IACrB;IACA;IACA;IACA;GACH,CAAA,CAAC;GAAC,UAAA;GAAA,QAAA,CAAA,utTAAA;EAAA,CAAA;CA4ED,CAAA;CAAA,sBAAA,CAAA;CAAA,gBAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,IAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,iBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,uBAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,kBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,iBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,iBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,iBAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,QAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,oBAAA;EAAA,CAAA;EAAA,eAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,qBAAA;EAAA,CAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,UAAQ,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,iBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAGR,WAAS,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AEzIf,IAAa,wBAAb,MAAkC;CAET;CACA;CAFrB,YACqB,OACA,QAA+C;EAD/C,KAAA,QAAA;EACA,KAAA,SAAA;CAClB;CAEH,KACI,QAAkC;EAElC,MAAM,QAAQ,OAAO,MAAM,KAAI;EAE/B,MAAM,gBAAgB,QAChB,KAAK,MAAM,QAAO,SAAQ,KAAK,OAAO,MAAM,KAAK,CAAC,IAClD,KAAK;EAEX,MAAM,QAAQ,OAAO,OAAO,OAAO;EACnC,MAAM,MAAM,QAAQ,OAAO;EAE3B,OAAO,GAAG;GACN,OAAO,cAAc,MAAM,OAAO,GAAG;GACrC,SAAS,MAAM,cAAc;EAChC,CAAA;CACL;AACH;AAGD,IAAa,yBAAb,MAAmC;CAEV;CADrB,YACqB,OAE8B;EAF9B,KAAA,QAAA;CAGlB;CAEH,KACI,QAAkC;EAElC,OAAO,KAAK,MAAM,MAAM;CAC5B;AACH;ACpDD,MAAa,yBAAyB,CAAC,QAAQ,MAAM;ACWrD,IAAa,sBAAb,MAAa,oBAAmB;CACnB,QAAQ,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEhC,UAAU,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE3B,KAAK,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,KAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,OAAO,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACxB,cAAc,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAE/B,OAAO,MAAc,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACvB,SAAS,MAAsB,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAE1C,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGrD,kBAAkB,MAA0B,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAEjD,YAAY,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACtC,YAAY,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEtC,YAAY,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACtD,aAAa,MAAM,MAAI;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAEtD,YAAY,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAC7B,cAAc,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAE/B,UAAU,OAAM;CAChB,UAAU,OAAM;CAEhB,mBAAmB,eACxB;EACI;EACA;EACA,KAAK,QAAO;CACf,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAES,YAAY,OAAY;EAC9B,MAAM,SAAS,MAAM;EAErB,KAAK,MAAM,IAAI,OAAO,KAAK;CAC/B;CAEU,YAAY,OAAiB;EACnC,KAAK,QAAQ,KAAK,KAAK;CAC3B;CAEU,WAAW,OAAiB;EAClC,KAAK,QAAQ,KAAK,KAAK;CAC3B;CArDS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,IAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,iBAAA;GAAA,SAAA;GAAA,SAAA;EAAA;EAAA,UAAA;EAAA,UCjBhC;EAuBA,QAAA,CAAA,wlIAAA;CAAA,CAAA;;ADNa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAL/B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAa,UAAA;GAAA,QAAA,CAAA,wlIAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEZ3B,MAAa,wBAAwB;CACjC;CACA;CACA;CACA;AACM;ACcV,IAAa,mBAAb,MAAa,iBAAgB;CAChB,aAAa,MAAuB,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAC3C,SAAS,MAAmB,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEnC,OAAO,aAAmC,QAAM;EAAA,GAAA,YAAA,EAAA,WAAA,OAAA,+BAAA,CAAA;EACrD,aAAa;CAAK,CAAA;CAGb,mBAAmB,eACxB;EACI;EACA;EACA,aAAa,KAAK,WAAU;EAC5B,aAAa,KAAK,OAAM;CAC3B,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAjBQ,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,YAAA,EAAA,QAAA,QAAA;GAAA,YAAA,EAAA,SAAA,qBAAA;EAAA;EAAA,SAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,MAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UCpB7B;EACA,QAAA,CAAA,8tFAAA;CAAA,CAAA;;ADmBa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAT5B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAU,MAGd;IACF,MAAM;IACN,WAAW;GACd;GAAA,UAAA;GAAA,QAAA,CAAA,8tFAAA;EAAA,CAAA;CAMkD,CAAA;CAAA,gBAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,QAAM;IACrD,aAAa;IAChB,UAAA;GAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AE1BL,MAAa,eAAe;CACxB;CACA;CACA;CACA;AACH;AAED,MAAa,mBAAmB,CAC5B,QACA,UACM;ACKV,IAAa,oBAAb,MAAa,kBAAiB;CACjB,OAAO,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,MAAM,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,OAAO,MAAkB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEtB,YAAY,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAErC,YAAY,eAAc;EACzC,MAAM,MAAM,KAAK,IAAG;EAEpB,OAAO,CAAC,CAAC,OAAO,QAAQ,KAAK,UAAS;CAC1C,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,WAAW,eAAc;EACxC,MAAM,QAAQ,KAAK,KAAI,CAAE,CAAC,KAAI,CAAE,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO;EAI5D,SAHc,MAAM,EAAE,GAAG,MAAM,OAClB,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,EAAE,CAAC,KAAK,IAE7C,CAAM,YAAW;CACrC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAEO,mBAAmB,eACxB;EACI;EACA,cAAc,KAAK,KAAI;EACvB,KAAK,KAAI,MAAO,OAAO,qBAAqB;CAC/C,CAAA,CAAC,KAAK,GAAG,GACb,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAES,cAAW;EACjB,KAAK,UAAU,IAAI,KAAK,IAAG,CAAE;CACjC;CA/BS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,YAAA,EAAA,QAAA,MAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,SAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UCf9B;EAKA,QAAA,CAAA,gjCAAA;CAAA,CAAA;;ADUa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAV7B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAW,MAGf;IACF,MAAM;IACN,qBAAqB;IACrB,WAAW;GACd;GAAA,UAAA;GAAA,QAAA,CAAA,gjCAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEbL,MAAa,cAAc;CAAC;CAAM;CAAM;AAAI;ACA5C,MAAa,eAAe;CACxB;CACA;CACA;CACA;CACA;AACM;AAEV,MAAa,mBAAmB;CAC5B;CACA;CACA;AACM;AAEV,MAAa,aAAa;CACtB;CACA;CACA;CACA;AACM;ACDV,IAAa,oBAAb,MAAa,kBAAiB;CACjB,aAAa,MAAwB,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAC7C,SAAS,MAAoB,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACvC,OAAO,MAAkB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAC9B,UAAU,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE3B,OAAO,MAAkB,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAClC,YAAY,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAE7B,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAMpD,aAAa,eAAe,KAAK,SAAQ,KAAM,KAAK,QAAO,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAE9D,mBAAmB,eACxB;EACI;EACA,KAAK,2BAA0B;EAC/B,KAAK,YAAW;EAChB,KAAK,YAAW;EAChB,KAAK,QAAO;CACf,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAEgB,6BAA6B,eAAc;EACxD,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,aAAa,KAAK,WAAU;EAElC,OAAO,CAAC,QAAQ,UAAU,CAAC,CAAC,SAAS,MAAM,IACvC,KACA,cAAc,OAAM,GAAI;CAChC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,6BAAA,CAAA,+BAAA,CAAA,CAAA;CAEe,cAAc,eAAe,cAAc,KAAK,KAAI,KAAK,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEzD,cAAc,gBAAgB;EAC3C,IAAI;EACJ,IAAI;EACJ,IAAI;CACP,EAAA,CAAC,KAAK,KAAI,IAAK,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CA7CP,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UClB9B;EAqBA,QAAA,CAAA,isiBAAA;CAAA,CAAA;;ADHa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAL7B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAW,UAAA;GAAA,QAAA,CAAA,isiBAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEVzB,MAAa,gBAAgB;CACzB;CACA;CACA;CACA;CACA;CACA;AACM;AAOV,MAAa,oBAAoB;CAC7B;CACA;CACA;CACA;CACA;CACA;AACM;AAGV,MAAa,cAAc;CACvB;CACA;CACA;AACM;AAGV,MAAa,cAAc;CACvB;CACA;CACA;AACM;ACnBV,IAAa,yBAAb,MAAa,uBAAsB;CACtB,UAAU,gBAAgB,mBAAiB;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAChD,aAAa;CAAK,CAAA;CAFb,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAsB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAtB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAsB,cAAA;EAAA,UAAA;EAAA,MAAA,EAAA,gBAAA,cAAA;EAAA,SAAA,CAAA;GAAA,cAAA;GAAA,WACI;GAAiB,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UAJ1C;EAA2B,UAAA;CAAA,CAAA;;AAG5B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAsB,YAAA,CAAA;EALlC,MAAA;EAAU,MAAA,CAAA;GACP,UAAU;GACV,UAAU;GACV,MAAM,EAAE,OAAO,cAAa;EAC/B,CAAA;CAEsC,CAAA;CAAA,gBAAA,EAAA,SAAA,CAAA;EAAA,MAAA,GAAA;EAAA,MAAA,CAAA,GAAA,iBAAA,iBAAiB,GAAA;GAChD,aAAa;GAChB,UAAA;EAAA,CAAA;CAAA,CAAA,EAAA;AAAA,CAAA;ACpBL,MAAM,cAAc;AACpB,MAAM,eAAe;AAGrB,SAAgB,UAAU,MAAU;CAKhC,OAAO,GAJM,KAAK,YAIR,EAAI,GAHA,OAAO,KAAK,SAAQ,IAAK,CAAC,CAAC,CAAC,SAAS,GAAG,GAGpC,EAAK,GAFX,OAAO,KAAK,QAAO,CAAE,CAAC,CAAC,SAAS,GAAG,GAEpB;AAC/B;AAGA,SAAgB,aAAa,OAAiC;CAC1D,MAAM,QAAQ,QAAQ,YAAY,KAAK,KAAK,IAAI;CAEhD,IAAI,CAAC,OACD,OAAO;CAGX,MAAM,GAAG,MAAM,OAAO,OAAO,MAAM,IAAI,MAAM;CAC7C,MAAM,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG,GAAG;CAG1C,OAAO,KAAK,SAAQ,MAAO,QAAQ,IAAI,OAAO;AAClD;AAEA,SAAgB,QAAQ,MAAY,MAAY;CAC5C,OAAO,IAAI,KAAK,KAAK,YAAW,GAAI,KAAK,SAAQ,GAAI,KAAK,QAAO,IAAK,IAAI;AAC9E;AAGA,SAAgB,UAAU,MAAY,QAAc;CAChD,MAAM,SAAS,IAAI,KAAK,KAAK,YAAW,GAAI,KAAK,SAAQ,IAAK,QAAQ,CAAC;CACvE,MAAM,UAAU,YAAY,OAAO,YAAW,GAAI,OAAO,SAAQ,CAAE;CAEnE,OAAO,QAAQ,KAAK,IAAI,KAAK,QAAO,GAAI,OAAO,CAAC;CAEhD,OAAO;AACX;AAEA,SAAgB,YAAY,MAAc,OAAa;CACnD,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,QAAO;AAC/C;AAGA,SAAgB,iBACZ,OAAqC;CAErC,MAAM,OAAO,aAAa,OAAO,MAAM,GAAG,EAAE,CAAC;CAC7C,MAAM,OAAO,UAAU,OAAO,MAAM,IAAI,EAAE,CAAC;CAE3C,IAAI,QAAQ,MACR,KAAK,SAAS,KAAK,OAAO,KAAK,OAAO;CAG1C,OAAO;AACX;AAGA,SAAgB,UACZ,OAAgC;CAEhC,MAAM,QAAQ,QAAQ,aAAa,KAAK,KAAK,IAAI;CAEjD,OAAO,QAAQ;EAAE,OAAO,OAAO,MAAM,EAAE;EAAG,SAAS,OAAO,MAAM,EAAE;CAAC,IAAK;AAC5E;AAEA,SAAgB,OAAO,OAAe,SAAe;CACjD,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,SAAS,GAAG,GAAG,EAAC,GAAI,OAAO,OAAO,CAAC,CAAC,SAAS,GAAG,GAAG;AAC/E;AC5CA,MAAM,YAAY;AAClB,MAAM,aAAa;AACnB,MAAM,gBAAgB;AAStB,IAAa,sBAAb,MAAa,oBAAmB;CACX,OAAO,OAAgC,UAAU;CACjD,WAAW,OAAO,QAAQ;CAElC,OAAO,MAAoB,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAGpC,QAAQ,MAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAGnC,QAAQ,MAAiB;EAAE,OAAO;EAAM,KAAK;CAAI,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEpD,MAAM,MAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CACjC,MAAM,MAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CACjC,iBAAiB,YAAwC,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAE/D,YAAY,MAAiB,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,SAAS,MAAc,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAErB,QAAQ,0BAAU,IAAI,KAAI,CAAE;CAG9B,aAAa,eAC1B,KAAK,KAAI,MAAO,UAAU,KAAK,MAAK,CAAE,CAAC,QAAQ,KAAK,MAAK,GAC5D,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAGgB,aAAa,mBACpB,aAAa,KAAK,WAAU,CAAE,KAAK,aAAa,KAAK,KAAK,GACnE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAGgB,cAAc,OAAuB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAExC,YAAY,mBAC3B,KAAK,WAAU,CAAE,CAAC,SAAQ,GAC7B,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,WAAW,mBAC1B,KAAK,WAAU,CAAE,CAAC,YAAW,GAChC,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,aAAa,eAAc;EAC1C,MAAM,SAAS,IAAI,KAAK,eAAe,KAAK,OAAM,GAAI,EAClD,OAAO,OACV,CAAA;EAED,OAAO,MAAM,KACT,EAAE,QAAQ,GAAE,IACX,GAAG,UAAU,OAAO,OAAO,IAAI,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC;CAE7D,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,WAAW,eAAc;EACxC,MAAM,SAAS,IAAI,KAAK,eAAe,KAAK,OAAM,GAAI,EAClD,SAAS,QACZ,CAAA;EAGD,OAAO,MAAM,KACT,EAAE,QAAQ,EAAC,IACV,GAAG,UACA,OAAO,OACH,IAAI,KAAK,MAAM,GAAG,KAAK,KAAK,UAAS,IAAK,SAAS,CAAC,CAAC,CACxD,CACI,MAAM,GAAG,CAAC,CAAC;CAE5B,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,cAAc,eAC7B,IAAI,sBACA,MAAM,KAAK,EAAE,QAAQ,GAAE,IAAK,GAAG,UAAU,KAAK,SACxC,IAAI,GAEjB,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,aAAa,eAAc;EAC1C,MAAM,2BAAU,IAAI,KAAI,EAAE,CAAC,YAAW;EACtC,MAAM,WAAW,aAAa,KAAK,WAAU,CAAE,CAAC,EAAE,YAAW,KACzD;EACJ,MAAM,QAAQ,aAAa,KAAK,IAAG,CAAE,CAAC,EAAE,YAAW,KAC/C,KAAK,IAAI,UAAU,YAAY,QAAQ;EAC3C,MAAM,OAAO,aAAa,KAAK,IAAG,CAAE,CAAC,EAAE,YAAW,KAC9C,KAAK,IAAI,UAAU,eAAe,QAAQ;EAQ9C,OAAO,IAAI,sBALG,MAAM,KAChB,EAAE,QAAQ,OAAO,QAAQ,EAAC,IACzB,GAAG,UAAU,OAAO,KAGQ,SAAa,IAAI;CACtD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,gBAAgB,UAC/B,KAAK,WAAU,CAAE,CAAC;CAEH,OAAO,eAA6B;EACnD,MAAM,OAAO,KAAK,SAAQ;EAC1B,MAAM,QAAQ,KAAK,UAAS;EAC5B,MAAM,EAAE,OAAO,KAAK,eAAe,KAAK,YAAW;EACnD,MAAM,cAAc,IAAI,KAAK,eAAe,KAAK,OAAM,GAAI,EACvD,WAAW,OACd,CAAA;EAED,MAAM,QAAQ,IAAI,KAAK,MAAM,OAAO,CAAC;EAErC,MAAM,YAAY,QAAQ,OAAO,GADjB,MAAM,OAAM,IAAK,KAAK,UAAS,IAAK,KAAK,EACjB;EAExC,OAAO,MAAM,KAAK,EAAE,QAAQ,UAAS,IAAK,GAAG,UAAS;GAClD,MAAM,OAAO,QAAQ,WAAW,KAAK;GACrC,MAAM,MAAM,UAAU,IAAI;GAE1B,OAAO;IACH;IACA,KAAK,KAAK,QAAO;IACjB,OAAO,YAAY,OAAO,IAAI;IAC9B,WAAW,KAAK,SAAQ,MAAO;IAC/B,SAAS,QAAQ,KAAK;IACtB,YAAY,QAAQ,SAAS,QAAQ;IACrC,YAAY,KAAK,cAAc,GAAG;IAClC,WAAW,CAAC,CAAC,SACT,CAAC,CAAC,cACF,MAAM,SACN,MAAM;IACV,cAAc,CAAC,CAAC,cACZ,QAAQ,SACR,UAAU;IACd,YAAY,CAAC,CAAC,SACV,QAAQ,cACR,UAAU;GACjB;EACL,CAAC;CACL,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEe,cAAc,eAAc;EACzC,IAAI,KAAK,KAAI,MAAO,UAChB,OAAO;GAAE,OAAO,KAAK,MAAK;GAAI,KAAK;GAAM,YAAY;EAAI;EAG7D,MAAM,EAAE,OAAO,QAAQ,KAAK,MAAK;EACjC,MAAM,UAAU,KAAK,YAAW;EAKhC,OAAO;GAAE;GAAO;GAAK,YAAY,QAJjB,CAAC,OAAO,SAAS,WAAW,UAAU,QAChD,UACA;EAEyC;CACnD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAGiB,eAAe,eAAc;EAC5C,MAAM,SAAS,KAAK,WAAU;EAI9B,OAAO,UAHQ,OAAO,YAAW,MAAO,KAAK,SAAQ,KACjD,OAAO,SAAQ,MAAO,KAAK,UAAS,IAG3B,SAAS,IAAI,KAAK,KAAK,SAAQ,GAAI,KAAK,UAAS,GAAI,CAAC,CAAC;CAExE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,YAAY,eAAc;EACzC,MAAM,MAAM,KAAK,IAAG;EACpB,MAAM,iBAAiB,IAAI,KAAK,KAAK,SAAQ,GAAI,KAAK,UAAS,GAAI,CAAC;EAEpE,OAAO,CAAC,OAAO,UAAU,cAAc,KAAK;CAChD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,eAAe,eAAc;EAC5C,MAAM,MAAM,KAAK,IAAG;EACpB,MAAM,cAAc,IAAI,KAAK,KAAK,SAAQ,GAAI,KAAK,UAAS,IAAK,GAAG,CAAC;EAErE,OAAO,CAAC,OAAO,UAAU,WAAW,KAAK;CAC7C,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAGF,kBAAe;EACX,KAAK,KAAK,cACL,cACG,eAAe,KAAK,aAAY,EAAE,GAAI,CACzC,EACC,MAAK;CACf;CAEU,UAAU,QAAc;EAC9B,MAAM,SAAS,IAAI,KAAK,KAAK,SAAQ,GAAI,KAAK,UAAS,IAAK,QAAQ,CAAC;EAErE,KAAK,SAAS,IAAI,OAAO,YAAW,CAAE;EACtC,KAAK,UAAU,IAAI,OAAO,SAAQ,CAAE;CACxC;CAEU,OAAO,KAAgB;EAC7B,IAAI,IAAI,YACJ;EAGJ,IAAI,KAAK,KAAI,MAAO,UAAU;GAC1B,KAAK,MAAM,IAAI,IAAI,GAAG;GACtB;EACJ;EAEA,MAAM,EAAE,OAAO,QAAQ,KAAK,MAAK;EAGjC,IAAI,CAAC,SAAS,OAAO,IAAI,MAAM,OAC3B,KAAK,MAAM,IAAI;GAAE,OAAO,IAAI;GAAK,KAAK;EAAI,CAAE;OAE5C,KAAK,MAAM,IAAI;GAAE;GAAO,KAAK,IAAI;EAAG,CAAE;CAE9C;CAEU,QAAQ,MAAoB;EAClC,IAAI,KAAK,KAAI,MAAO,SAChB,KAAK,YAAY,IAAI,IAAI;CAEjC;CAEU,cAAc,OAAoB;EACxC,MAAM,UAAU,aAAa,KAAK,aAAY,CAAE;EAChD,MAAM,SAAS,KAAK,UAAU,OAAO,OAAO;EAE5C,IAAI,CAAC,QACD;EAGJ,MAAM,eAAc;EAEpB,KAAK,WAAW,IAAI,MAAM;EAC1B,KAAK,SAAS,IAAI,OAAO,YAAW,CAAE;EACtC,KAAK,UAAU,IAAI,OAAO,SAAQ,CAAE;EAEpC,sBAAsB,KAAK,gBAAe,GAAI,EAC1C,UAAU,KAAK,SAClB,CAAA;CACL;CAEQ,UAAU,OAAsB,SAAa;EACjD,MAAM,aAAa,QAAQ,OAAM,IAAK,KAAK,UAAS,IAAK,KAAK;EAE9D,QAAQ,MAAM,KAAd;GACI,KAAK,aACD,OAAO,QAAQ,SAAS,EAAE;GAC9B,KAAK,cACD,OAAO,QAAQ,SAAS,CAAC;GAC7B,KAAK,WACD,OAAO,QAAQ,SAAS,EAAE;GAC9B,KAAK,aACD,OAAO,QAAQ,SAAS,CAAC;GAC7B,KAAK,QACD,OAAO,QAAQ,SAAS,CAAC,SAAS;GACtC,KAAK,OACD,OAAO,QAAQ,SAAS,IAAI,SAAS;GACzC,KAAK,UACD,OAAO,UAAU,SAAS,MAAM,WAAW,MAAM,EAAE;GACvD,KAAK,YACD,OAAO,UAAU,SAAS,MAAM,WAAW,KAAK,CAAC;GACrD,SACI,OAAO;EACf;CACJ;CAEQ,cAAc,KAAY;EAC9B,MAAM,MAAM,KAAK,IAAG;EACpB,MAAM,MAAM,KAAK,IAAG;EAGpB,OAAQ,CAAC,CAAC,OAAO,MAAM,OAClB,CAAC,CAAC,OAAO,MAAM,OAChB,KAAK,eAAc,CAAE,CAAC,GAAG;CACjC;CA3QS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,OAAA;EAAA;EAAA,WAFjB,CAAC,aAAa;GAAE;GAAiB;EAAgB,CAAE,CAAC;EAAC,UAAA;EAAA,UCtCpE;EAqEA,QAAA,CAAA,slPAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDhCc;GAAM,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAiB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAG1B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAP/B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAa,SAGd,CAAC,QAAQ,iBAAiB;GAAC,WACzB,CAAC,aAAa;IAAE;IAAiB;GAAgB,CAAE,CAAC;GAAC,UAAA;GAAA,QAAA,CAAA,slPAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AErCpE,MAAa,aAAa,CAAC,GAAG,CAAC;AAyB/B,MAAa,gBAAgB,CAAC,UAAU,OAAO;AChB/C,IAAa,wBAAb,MAAa,sBAAqB;CAErB,UAAU,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAClC,WAAW,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAG5B,eAAe,MAAwB,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CANzC,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,QAAA;EAAA,UAAA;EAAA,UCVlC;CAqBA,CAAA;;ADXa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EALjC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAgB,MAEpB,EAAE,OAAO,QAAO;GAAE,UAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AER5B,MAAa,oBAAoB;CAAC;CAAG;CAAG;AAAC;ACQzC,IAAa,uBAAb,MAAa,qBAAoB;CAApB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAoB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAApB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAoB,cAAA;EAAA,UAAA;EAAA,MAAA,EAAA,gBAAA,kBAAA;EAAA,UAAA;EAAA,UAHnB;EAA2B,UAAA;CAAA,CAAA;;AAG5B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EALhC,MAAA;EAAU,MAAA,CAAA;GACP,UAAU;GACV,UAAU;GACV,MAAM,EAAE,OAAO,kBAAiB;EACnC,CAAA;;;ACOD,IAAa,8BAAb,MAAa,4BAA2B;CAC3B,SAAS,MAAM,SAAmB,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CADlC,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAA2B,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAA3B,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAA2B,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,QAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,SAAA,EAAA,QAAA,eAAA;EAAA,WAFzB,CAAC,aAAa,EAAE,UAAS,CAAE,CAAC;EAAC,UAAA;EAAA,UCZ5C;EAQA,cAAA,CAAA;GAAA,MAAA;GAAA,MDGc;GAAiB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAM,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAG1B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAA2B,YAAA,CAAA;EANvC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAoB,SAErB,CAAC,mBAAmB,MAAM;GAAC,WACzB,CAAC,aAAa,EAAE,UAAS,CAAE,CAAC;GAAC,UAAA;EAAA,CAAA;;;;;;;;;;;;;;AEA5C,IAAa,oBAAb,MAAa,kBAAiB;CACjB,SAAS,OAAgB,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,iBAAiB,MAAM,MAAI;EAAA,GAAA,YAAA,EAAA,WAAA,iBAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAE1D,QAAQ,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACzB,WAAW,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAL5B,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,WAAA,EAAA;EAAA,UAAA;EAAA,UCZ9B;EAuCA,QAAA,CAAA,olFAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MD9Bc;GAA2B,UAAA;GAAA,QAAA,CAAA,QAAA;GAAA,SAAA,CAAA,cAAA;EAAA,CAAA;CAAA,CAAA;;AAG5B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAP7B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAW,SAGZ,CAAC,2BAA2B;GAAC,MAChC,EAAE,gBAAgB,WAAU;GAAE,UAAA;GAAA,QAAA,CAAA,olFAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEuBxC,IAAa,qBAAb,MAAa,mBAAkB;CACR,SAAS,OAAO,UAAuB;CACvC,UAAU,UAAU,WAAS;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,MAAM;CAAU,CAAA;CAE3D,OAAO,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,YAAY,MAAiB,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACnC,UAAU,MAAwB,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC1C,UAAU,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE3B,SAAS,MAA+B,OAAO,KAAK,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAE5C,iBAAiB,eAChC,KAAK,QAAO,MAAO,UACb,qBACA,QACT,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,mBAAmB,eAClC;EAAC;EAAc;EAAmB,KAAK,QAAO;CAAE,CAAC,CAC5C,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAES,QAAQ,YAAmB;EACjC,IAAI,KAAK,QAAO,MAAO,SACnB,KAAK,OAAM,CAAE,CAAC,IAAI,UAAU;CAEpC;CAGU,QAAQ,WAAkB;EAChC,IAAI,CAAC,SAAS,OAAO,CAAC,CAAC,SAAS,KAAK,QAAO,CAAE,GAC1C,KAAK,OAAM,CAAE,CAAC,IAAI,SAAS;CAEnC;CAEU,UAAO;EACb,IAAI,KAAK,QAAO,MAAO,SACnB,KAAK,OAAM,CAAE,CAAC,QAAO,UAAS,CAAC,KAAK;CAE5C;CAxCS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAkB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAlB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAkB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,WAAA;IAAA,cAAA;IAAA,cAAA;IAAA,WAAA;IAAA,YAAA;IAAA,SAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,SAAA;GAAA,aAAA;GAAA,MAE+B;GAAU,UAAA;EAAA,CAAA;EAAA,UAAA,CAAA,WAAA;EAAA,UAAA;EAAA,UCnCxE;EAeA,QAAA,CAAA,s2EAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDQc;GAAkB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,UAAA,CAAA,WAAA;EAAA,CAAA;CAAA,CAAA;;AAUnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAkB,YAAA,CAAA;EAf9B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAY,UACZ;GAAW,SAGZ,CAAC,kBAAkB;GAAC,MACvB;IACF,OAAO;IACP,gBAAgB;IAChB,gBAAgB;IAChB,aAAa;IACb,cAAc;IACd,WAAW;GACd;GAAA,UAAA;GAAA,QAAA,CAAA,s2EAAA;EAAA,CAAA;CAIsC,CAAA;CAAA,gBAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,WAAS;IAAI,MAAM;IAAY,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AEnB1E,IAAa,iBAAb,MAAa,eAAc;CACd,QAAQ,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACzB,QAAQ,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACzB,OAAO,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACxB,OAAO,MAAiB,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACxB,eAAe,MAAwB,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAL9C,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAd,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAc,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,QAAA;EAAA,WAFZ,CAAC,aAAa,EAAE,uBAAsB,CAAE,CAAC;EAAC,UAAA;EAAA,UCdzD;EAmDA,cAAA;GAAA;IAAA,MAAA;IAAA,MDvCc;IAAe,UAAA;IAAA,QAAA,CAAA,QAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAM,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAkB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,UAAA,CAAA,WAAA;GAAA;EAAA;CAAA,CAAA;;AAI5C,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAc,YAAA,CAAA;EAP1B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAQ,SAET;IAAC;IAAiB;IAAQ;GAAkB;GAAC,MAChD,EAAE,OAAO,QAAO;GAAE,WACb,CAAC,aAAa,EAAE,uBAAsB,CAAE,CAAC;GAAC,UAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AETzD,MAAM,aAA8B;CAChC;CACA;CACA;AACH;AAOD,IAAa,qBAAb,MAAa,mBAAkB;CAClB,OAAO,MAAqB,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAE5B,UAAU,eACzB,WAAW,SAAS,KAAK,KAAI,CAAE,GAClC,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,iBAAiB,MAAM,KAAK,EAAE,QAAQ,GAAE,IAAK,GAAG,MAAM,CAAC;CAPjE,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAkB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAlB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAkB,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,MAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,UAAA;EAAA,UChB/B;EAuGA,QAAA,CAAA,i3IAAA;CAAA,CAAA;;ADvFa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAkB,YAAA,CAAA;EAL9B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAY,UAAA;GAAA,QAAA,CAAA,i3IAAA;EAAA,CAAA;;;;;;;;;;;AEZ1B,MAAa,mBAAmB;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACyB;ACiB7B,IAAa,mBAAb,MAAa,iBAAgB;CAChB,SAAS,MAAM,SAAmB,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAClC,iBAAiB,MACtB,oBACH,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CACQ,QAAQ,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACzB,OAAO,MAAiB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAC7B,UAAU,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE3B,gBAAgB,aACrB,UAAQ;EAAA,GAAA,YAAA,EAAA,WAAA,gBAAA,+BAAA,CAAA;EACN,aAAa;CAAK,CAAA;CAEf,gBAAgB,aACrB,UAAQ;EAAA,GAAA,YAAA,EAAA,WAAA,gBAAA,+BAAA,CAAA;EACN,aAAa;CAAK,CAAA;CAEf,eAAe,UACpB,SAAO;EAAA,GAAA,YAAA,EAAA,WAAA,eAAA,+BAAA,CAAA;EACL,MAAM;CAAuB,CAAA;CAG1B,mBAAmB,eACxB;EACI;EACA,aAAa,KAAK,KAAI;EACtB,KAAK,QAAO;CACf,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CA9BQ,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,QAAA,eAAA;EAAA,SAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,QAAA;GAAA,UAAA;EAAA,GAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,QAAA;GAAA,UAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,OAAA;GAAA,aAAA;GAAA,MAmBb;GAAU,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UCjD1B;EAsCA,QAAA,CAAA,4yBAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MDdQ;IAAkB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,UAAA,CAAA,WAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAClB;IAA2B,UAAA;IAAA,QAAA,CAAA,QAAA;IAAA,SAAA,CAAA,cAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAC3B;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAAe,UAAA;IAAA,QAAA,CAAA,QAAA;GAAA;EAAA;CAAA,CAAA;;AAGV,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAX5B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAU,SAGX;IACL;IACA;IACA;IACA;GACH;GAAA,UAAA;GAAA,QAAA,CAAA,4yBAAA;EAAA,CAAA;CAYG,CAAA;CAAA,gBAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,cAAA;EAAA,CAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,eAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,UAAQ;IACN,aAAa;IAAO,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,eAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAGtB,UAAQ;IACN,aAAa;IAAO,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAGtB,SAAO;IACL,MAAM;IAAyB,UAAA;GAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AE9BzC,IAAa,mBAAb,MAAa,iBAAgB;CACR,WAAW,OAAO,SAAS;CAC3B,UAAU,OAAO,UAAU;CAEnC,QAAQ,MAAM,SAAyB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAGvC,WAAW,MAAc,KAAK,SAAS,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAGhD,SAAS,MAAc,KAAK,SAAS,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAC5C,cAAc,MAAwB,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAG7C,eAAe,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,eAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGzD,aAAa,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGvD,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGpD,cAAc,MAAc,KAAI,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAGxB,SAAS,eAAc;EACpC,MAAM,QAAQ,KAAK,MAAK;EAExB,OAAO,UAAU,QAAQ,OAAO,MAAM,KAAK,IAAI,OAAO,SAAS;CACnE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,SAAS,eAAe,KAAK,QAAO,MAAO,aAAa,KAAK,OAAM,MAAO,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAE/E,OAAO,eAAe,UAAU,KAAK,SAAQ,GAAI,KAAK,OAAM,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEhE,YAAY,eAAc;EACzC,MAAM,SAAS,KAAK,OAAM;EAE1B,OAAO,WAAW,OAAO,KAAK,YAAW,IAAK,KAAK,OAAO,QAAQ,KAAK,QAAO,CAAE;CACpF,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,QAAQ,eAAc;EACrC,MAAM,SAAS,KAAK,OAAM;EAE1B,OAAO,KAAK,QAAO,KAAM,WAAW,QAAQ,CAAC,KAAK,OAAM,IAAK,KAAK,OAAO,QAAQ,KAAK,IAAI;CAC9F,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEO,mBAAmB,eACxB,CACI,YACA,KAAK,UAAS,CACjB,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAEgB,YAAY,eAAc;EACvC,MAAM,SAAS,KAAK,OAAM;EAE1B,IAAI,CAAC,KAAK,aAAY,KAAM,WAAW,QAAQ,KAAK,QAAO,MAAO,UAC9D,OAAO;EAGX,IAAI,SAAS,GACT,OAAO;EAGX,OAAO,SAAS,IAAI,uBAAuB;CAC/C,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEM,OAAO,QAAgB,SAAgB;EAC3C,OAAO,IAAI,KAAK,aAAa,KAAK,OAAM,GAAI;GACxC,OAAO;GACP,UAAU,KAAK,SAAQ;GACvB,aAAa,KAAK,YAAW;GAC7B,UAAU,UAAU,YAAY;GAChC,GAAI,KAAK,WAAU,KAAM;IAAE,uBAAuB;IAAG,uBAAuB;GAAC;EAChF,CAAA,CAAC,CAAC,OAAO,MAAM;CACpB;CA/ES,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,YAAA;GAAA,SAAA;GAAA,cAAA;EAAA,EAAA;EAAA,UAAA;EAAA,UCnB7B;EAIA,QAAA,CAAA,ikCAAA;CAAA,CAAA;;ADea,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAT5B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAU,MAGd;IACF,WAAW;IACX,gBAAgB;GACnB;GAAA,UAAA;GAAA,QAAA,CAAA,ikCAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEhBL,MAAa,oBAAoB;CAC7B;CACA;CACA;CACA;AACM;ACeV,IAAa,wBAAb,MAAa,sBAAqB;CAErB,OAAO,MAAc,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACvB,aAAa,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAErC,cAAc,eAAe,KAAK,KAAI,KAAM,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAC9C,aAAa,eAAe,KAAK,KAAI,KAAM,KAAK,WAAU,IAAK,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAGjE,QAAQ,eAAc;EAC3B,MAAM,QAAQ,KAAK,WAAU;EAC7B,MAAM,UAAU,KAAK,KAAI;EACzB,MAAM,QAA0B,CAAA;EAEhC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAC5B,MAAM,SAAS,MAAM,KAAK,MAAM,QAAQ;GACxC,MAAM,gBAAgB,KAAK,IAAI,IAAI,OAAO,KAAK;GAG/C,MAAM,eAAgB,MAAM,KAAK,YAAY,KACxC,MAAM,QAAQ,KAAK,YAAY,QAAQ;GAE5C,IAAI,UAAU,iBAAiB,cAC3B,MAAM,KAAK,CAAC;QACT,IAAI,MAAM,GAAG,EAAE,MAAM,YACxB,MAAM,KAAK,UAAU;EAE7B;EAEA,OAAO;CACX,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEF,UAAU,MAAY;EAClB,MAAM,QAAQ,QAAQ,OAAO;EAE7B,OAAO,SAAS,KAAK,KAAI,IAAK,GAAG,MAAK,kBAAmB;CAC7D;CAEA,SAAS,MAAY;EACjB,IAAI,OAAO,KAAK,QAAQ,KAAK,WAAU,GACnC;EAGJ,KAAK,KAAK,IAAI,IAAI;CACtB;CA5CS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,MAAA,aAAA;EAAA,MAAA;GAAA,YAAA;IAAA,QAAA;IAAA,cAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,WAFnB,CAAC,aAAa;GAAE;GAAiB;EAAgB,CAAE,CAAC;EAAC,UAAA;EAAA,UCnBpE;EAgCA,QAAA,CAAA,gsCAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDnBc;GAAiB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAM,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAQ1B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EAZjC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAe,SAGhB,CAAC,mBAAmB,MAAM;GAAC,MAC9B;IACF,MAAM;IACN,cAAc;IACd,OAAO;GACV;GAAA,WACU,CAAC,aAAa;IAAE;IAAiB;GAAgB,CAAE,CAAC;GAAC,UAAA;GAAA,QAAA,CAAA,gsCAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;AEWpE,IAAa,sBAAb,MAAa,oBAAmB;CACnB,QAAQ,MAAqB,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,MAAM,MAAc,KAAI,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CAExB,SAAS,MAAsB,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACzC,OAAO,MAAoB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,QAAQ,MAAqB,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACvC,cAAc,MAA2B,cAAa,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEtD,QAAQ,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACzB,gBAAgB,MAA6B,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CACpD,YAAY,OAChB,OAAO,QAAQ,GAAG,KAAK,MAAM,QAAQ,MAAM,GAAG,EAAC,IACnD,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAGQ,QAAQ,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAGlC,WAAW,MAAgC,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAGhD,YAAY,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEnB,kBAAkB,eAAe,KAAK,MAAK,MAAO,QAAQ,CAAC,KAAK,SAAQ,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAE3E,QAAQ,eAAc;EACrC,MAAM,WAAW,KAAK,SAAQ;EAE9B,OAAO,WACD,SAAS,QAAQ,KAAK,YAAY,MAAM,QAAQ,OAAO,CAAC,IACxD,KAAK,MAAK,KAAM;CAC1B,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAGiB,cAAc,eAC7B,KAAK,aAAa,KAAK,MAAK,IAAK,KAAK,IAAG,IAAK,GAAG,GACpD,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,QAAQ,eACvB,KAAK,gBAAe,IAAK,KAAK,KAAK,UAAS,CAAE,CAAC,KAAK,MAAK,GAAI,KAAK,IAAG,CAAE,GAC1E,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,eAAe,eAA6B;EAC3D,MAAM,WAAW,KAAK,SAAQ,KAAM,CAAA;EACpC,IAAI,OAAO;EAGX,OAAO,SAAS,KAAI,YAAU;GAC1B,MAAM,UAAU,KAAK,IAAI,KAAK,aAAa,QAAQ,QAAQ,KAAK,IAAG,IAAK,GAAG,GAAG,MAAM,IAAI;GAExF,QAAQ;GAER,OAAO;IACH;IACA,QAAQ,QAAQ,UAAU,KAAK,OAAM;IACrC,OAAO,QAAQ,SAAS,KAAK,UAAS,CAAE,CAAC,QAAQ,OAAO,KAAK,IAAG,CAAE;GACrE;EACL,CAAC;CACL,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,aAAa,eAAc;EAC1C,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAK,KAAM,CAAC,CAAC;EACvD,MAAM,SAAS,KAAK,MAAM,KAAK,YAAW,IAAK,MAAM,KAAK;EAE1D,OAAO,MAAM,KAAK,EAAE,QAAQ,MAAK,IAAK,GAAG,UAAU,QAAQ,MAAM;CACrE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAGiB,iBAAiB,eAChC,mBAAmB,KAAK,YAAW,EAAE,qCACxC,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,aAAa,eAAe,KAAK,YAAW,MAAO,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAE9D,cAAc,eAC7B;EACI;EACA,gBAAgB,KAAK,YAAW;EAChC,gBAAgB,KAAK,KAAI;EACzB,gBAAgB,KAAK,MAAK;EAC1B,KAAK,cAAa,MAAO,WAAW,8BAA8B;CACrE,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAES,YAAY,QAAsB;EACxC,OAAO;GACH;GACA,qBAAqB;GACrB,KAAK,gBAAe,IAAK,oCAAoC;EAChE,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CACjB;CAEQ,aAAa,SAAe;EAChC,OAAO,OAAO,SAAS,OAAO,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI;CAC5E;CAnGS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,YAAA,EAAA,oCAAA,iCAAA,EAAA;EAAA,UAAA;EAAA,UC9BhC;EAwEA,QAAA,CAAA,s5NAAA;CAAA,CAAA;;AD1Ca,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAR/B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAa,MAGjB,EACF,sCAAsC,iCACzC;GAAA,UAAA;GAAA,QAAA,CAAA,s5NAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AE3BL,MAAa,kBAAkB;CAC3B;CACA;CACA;CACA;CACA;AACM;AAMV,MAAa,gBAAgB;CAAC;CAAM;CAAM;CAAM;AAAI;AAMpD,MAAa,yBAAyB;CAAC;CAAQ;CAAU;CAAO;CAAO;AAAU;AAMjF,MAAa,iBAAiB;CAAC;CAAW;CAAU;AAAU;AAK9D,MAAa,uBAAuB,CAAC,cAAc,UAAU;ACzB7D,IAAI,WAAS;AAQb,IAAa,uBAAb,MAAa,qBAAoB;CACpB,UAAU,MAAM,SAAgC,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAChD,QAAQ,MAAM,SAAa,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAG3B,YAAY,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAGpC,OAAO,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,OAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAEvC,OAAO,gBAAgB;CAVjC,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAoB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAApB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAoB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,MAAA,EAAA,YAAA,EAAA,eAAA,SAAA,EAAA;EAAA,UAAA;EAAA,UCbjC;EAkBA,QAAA,CAAA,wxHAAA;CAAA,CAAA;;ADLa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EANhC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAc,MAGlB,EAAE,iBAAiB,SAAQ;GAAE,UAAA;GAAA,QAAA,CAAA,wxHAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEVvC,MAAa,iBAAiB;CAAC;CAAQ;CAAU;AAAM;ACQvD,IAAa,kBAAb,MAAa,gBAAe;CACf,QAAQ,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CADhC,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAe,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAf,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAe,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,OAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,MAAA,EAAA,gBAAA,gBAAA;EAAA,UAAA;EAAA,UCT5B;CAUA,CAAA;;ADDa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAe,YAAA,CAAA;EAL3B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAS,MAEb,EAAE,OAAO,gBAAe;GAAE,UAAA;EAAA,CAAA;;;;;;;;;;;AEApC,IAAa,iBAAb,MAAa,eAAc;CACvB,QAAQ,MAAM,SAAQ;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,+BAAA,CAAA;EAAW,OAAO;CAAO,CAAA;CAC/C,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,SAAS,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAHrB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAd,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAc,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,QAAA,eAAA;EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,YAAA,EAAA;EAAA,UAAA;CAAA,CAAA;;AAAd,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAc,YAAA,CAAA;EAJ1B,MAAA;EAAU,MAAA,CAAA;GACP,UAAU;GACV,MAAM,EAAE,YAAY,YAAW;EAClC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACqBD,IAAa,iBAAb,MAAa,eAAc;CACd,OAAO,gBAAgB,gBAAe,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACtC,gBAAgB,OAAe,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CACjC,UAAU,aAAmC,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEvD,aAAa,MAA2B,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEhD,yBAAyB,eAC9B,CACI,kBAAkB,KAAK,WAAU,KACjC,aACH,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,yBAAA,CAAA,+BAAA,CAAA,CAAA;CAED,cAAA;EACI,aAAY;GACR,MAAM,OAAO,KAAK,KAAI;GACtB,IAAI,CAAC,KAAK,UAAU,KAAK,MAAK,QAAO,IAAI,OAAM,CAAE,GAAK;GAEtD,KAAK,EAAE,CAAC,OAAO,IAAI,IAAI;EAC3B,CAAC;CACL;CAEA,OAAO,OAAa;EAChB,MAAM,OAAO,KAAK,KAAI;EAEtB,MAAM,SAAS,KAAK;EACpB,IAAI,CAAC,UAAU,OAAO,SAAQ,GAAM;EAEpC,KAAK,SAAS,KAAK,MAAM,IAAI,OAAO,IAAI,MAAM,KAAK,CAAC;CACxD;CAhCS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAd,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAc,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,YAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,MAAA,EAAA,gBAAA,QAAA;EAAA,SAAA,CAAA;GAAA,cAAA;GAAA,WACS;GAAc,UAAA;EAAA,GAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,SAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UC5BlD;EAuBA,QAAA,CAAA,u/FAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDCc;GAAiB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAgB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAGpC,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAc,YAAA,CAAA;EAP1B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAQ,SAGT,CAAC,mBAAmB,gBAAgB;GAAC,MACxC,EAAE,OAAO,QAAO;GAAE,UAAA;GAAA,QAAA,CAAA,u/FAAA;EAAA,CAAA;CAGQ,CAAA;CAAA,sBAAA,CAAA;CAAA,gBAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,GAAA,iBAAA,cAAc,GAAA,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAEQ,WAAS,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AErBnE,IAAa,kBAAb,MAAa,gBAAe;CACP,SAAS,uBAA2C,IAAI,IAAG,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAE/E,IAAI,IAAU;EACV,OAAO,KAAK,OAAM,CAAE,CAAC,IAAI,EAAE,KAAK;CACpC;CAEA,SAAS,IAAY,OAAoB;EACrC,MAAM,WAAW,KAAK,OAAM,CAAE,CAAC,IAAI,EAAE;EAErC,IAAI,UAAS,KAAM,YAAY,aAAa,OACxC,QAAQ,KAAK,uCAAuC,GAAE,wCAAyC;EAGnG,KAAK,OAAO,QAAO,WAAU,IAAI,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC;CAC/D;CAEA,WAAW,IAAY,OAAoB;EACvC,IAAI,KAAK,OAAM,CAAE,CAAC,IAAI,EAAE,MAAM,OAC1B;EAGJ,KAAK,OAAO,QAAO,WAAS;GACxB,MAAM,OAAO,IAAI,IAAI,MAAM;GAE3B,KAAK,OAAO,EAAE;GAEd,OAAO;EACX,CAAC;CACL;CA7BS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAe,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAf,OAAA,QAAA,GAAA,sBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAe,YADF;CAAM,CAAA;;AACnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAe,YAAA,CAAA;EAD3B,MAAA;EAAW,MAAA,CAAA,EAAE,YAAY,OAAM,CAAE;;;ACiDlC,MAAM,uBAAuB;AAC7B,MAAM,yBAAyB;AAoC/B,IAAa,mBAAb,MAAa,iBAAgB;CAChB,UAAU,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAG3B,UAAU,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEpC,UAAU,MAAM,SAA8B,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC9C,aAAa,MAAM,SAAgC,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEnD,eAAe,MAAc,uBAAsB,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CACnD,eAAe,MACpB,2CACH,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAIQ,QAAQ,OACZ,MAAM,UAAU,OACpB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,aAAa,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACvD,aAAa,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACvD,oBAAoB,MAAc,aAAY,GAAA,YAAA,CAAA,EAAA,WAAA,oBAAA,CAAA,+BAAA,CAAA,CAAA;CAC9C,YAAY,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACtD,WAAW,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAC5B,oBAAoB,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,oBAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAC9D,qBAAqB,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,qBAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAC/D,kBAAkB,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,kBAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAC5D,eAAe,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,eAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACzD,UAAU,MAA6B,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE1C,OAAO,MAA6B,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACzC,iBAAiB,sBAAoB,IAAI,IAAG,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAE/C,kBAAkB,OAAM;CACxB,gBAAgB,OAAM;CAEtB,OAAO,OAAc,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACxB,QAAQ,OAAO,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACjB,UAAU,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACvB,QAAQ,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAErB,QAAQ,OAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAClB,UAAU,OAAgC,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEnC,cAAc,OAAO,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CACvB,kBAAkB,uBAAoB,IAAI,IAAG,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAChD,iBAAiB,OAAwB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAC9C,eAAe,OAA+B,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CACjD,iBAAiB,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAC9B,iBAAiB,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAE9B,kBAAkB,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAC7C,mBAAmB,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAC9C,cAAc,OAAiC,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CACpD,kBAAkB,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAEvD,UAAU,eACf,CAAC,KAAK,QAAO,KAAM,CAAC,KAAK,MAAK,KAAM,KAAK,KAAI,CAAE,CAAC,WAAW,GAC9D,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,mBAAmB,eACxB;EACI;EACA;EACA,KAAK,QAAO;CACf,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,iBAAiB,eAAc;EAC9C,MAAM,QAAQ,KAAK,eAAc;EAEjC,IAAI,CAAC,OACD,OAAO,KAAK,QAAO;EAGvB,MAAM,OAAO,IAAI,IAAI,KAAK,QAAO,CAAE,CAAC,KAAI,WAAU,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACtE,MAAM,UAAU,MACX,KAAI,OAAM,KAAK,IAAI,EAAE,CAAC,CAAC,CACvB,QAAQ,WAAuC,CAAC,CAAC,MAAM;EAE5D,MAAM,UAAU,KAAK,QAAO,CAAE,CAAC,QAAO,WAClC,CAAC,MAAM,SAAS,OAAO,EAAE,CAAC;EAG9B,OAAO,CAAC,GAAG,SAAS,GAAG,OAAO;CAClC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,kBAAkB,eACjC,KAAK,eAAc,CAAE,CAAC,QAAO,WAAU,OAAO,aAAa,KAAK,GACnE,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,iBAAiB,eAChC,KAAK,eAAc,CAAE,CAAC,QAAO,WACzB,CAAC,KAAK,gBAAe,CAAE,CAAC,IAAI,OAAO,EAAE,CAAC,GAE7C,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAGkB,gBAAgB,eAAc;EAC7C,MAAM,UAAU,KAAK,eAAc;EAEnC,OAAO;GACH,GAAG,QAAQ,QAAO,WAAU,OAAO,QAAQ,MAAM;GACjD,GAAG,QAAQ,QAAO,WAAU,CAAC,OAAO,GAAG;GACvC,GAAG,QAAQ,QAAO,WAAU,OAAO,QAAQ,OAAO;EACrD;CACL,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAGiB,oBAAoB,eACnC,KAAK,eAAc,CAAE,CAAC,QAAO,WAAU,OAAO,UAAU,GAC3D,GAAA,YAAA,CAAA,EAAA,WAAA,oBAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,uBAAuB,eACtC,KAAK,kBAAiB,CAAE,CAAC,SAAS,GACrC,GAAA,YAAA,CAAA,EAAA,WAAA,uBAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,oBAAoB,eACnC,OAAO,KAAK,KAAK,QAAO,CAAE,CAAC,CAAC,QAC/B,GAAA,YAAA,CAAA,EAAA,WAAA,oBAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,aAAa,eAAe,KAAK,QAAO,CAAE,CAAC,SAAS,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CACtD,qBAAqB,eACpC,KAAK,IAAI,IAAI,KAAK,QAAO,CAAE,CAAC,SAAS,EAAE,GAC1C,GAAA,YAAA,CAAA,EAAA,WAAA,qBAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,aAAa,eAC5B,KAAK,UAAS,IACR,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,MAAK,IAAK,KAAK,SAAQ,CAAE,CAAC,IACrD,GACT,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,eAAe,eAAc;EAC5C,MAAM,QAAQ,KAAK,MAAK;EAExB,OAAO,UAAU,IAAI,aAAa,GAAG,MAAK;CAC9C,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,cAAc,eAAc;EAC3C,MAAM,OAAO,KAAK,KAAI;EAEtB,OAAO,KAAK,SAAS,KACjB,KAAK,OAAO,KAAK,UACb,KAAK,eAAc,CAAE,CAAC,IAAI,KAAK,MAAK,CAAE,CAAC,KAAK,KAAK,CAAC,CAAC;CAE/D,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,eAAe,eAAc;EAC5C,MAAM,OAAO,KAAK,KAAI;EACtB,MAAM,WAAW,KAAK,eAAc;EACpC,MAAM,QAAQ,KAAK,QAAQ,KAAK,UAC5B,SAAS,IAAI,KAAK,MAAK,CAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CACzC,CAAC;EAEF,OAAO,QAAQ,KAAK,QAAQ,KAAK;CACrC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEe,cAAc,eAAc;EACzC,MAAM,UAAkC,CAAA;EACxC,IAAI,SAAS,KAAK,WAAU,IAAK,yBAAyB;EAE1D,KACI,MAAM,UAAU,KAAK,cAAa,CAAE,CAAC,QAAO,MAAK,EAAE,QAAQ,MAAM,GACnE;GACE,QAAQ,OAAO,MAAM;GACrB,UAAU,KAAK,YAAY,MAAM;EACrC;EAEA,OAAO;CACX,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEe,eAAe,eAAc;EAC1C,MAAM,UAAkC,CAAA;EACxC,IAAI,SAAS;EAEb,MAAM,UAAU,KAAK,cAAa,CAAE,CAC/B,QAAO,MAAK,EAAE,QAAQ,OAAO,CAAC,CAC9B,MAAK,CAAE,CACP,QAAO;EAEZ,KAAK,MAAM,UAAU,SAAS;GAC1B,QAAQ,OAAO,MAAM;GACrB,UAAU,KAAK,YAAY,MAAM;EACrC;EAEA,OAAO;CACX,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAGe,QAAQ,IAAI,QAAO;CAEnB,aAAa,OAAO,UAAU;CAC9B,MAAM,OAAO,iBAAiB;CAC9B,WAAW,OAAO,eAAe;CAC/B,WAAW,OAAO,SAAS;CAEtC,cAAc;CACd,gBAAyC,CAAA;CAEzC,cAIG;CACH,kBAKG;CACM,oCAAoB,IAAI,IAAG;CAK5C,cAAA;EACI,QAAO,cAAY;GACf,MAAM,KAAK,KAAK,QAAO;GAEvB,IAAI,CAAC,IACD;GAIJ,gBAAgB,KAAK,SAAS,SAAS,IAAI,IAAI,CAAC;GAChD,gBAAgB,KAAK,SAAS,WAAW,IAAI,IAAI,CAAC;EACtD,CAAC;EAGD,aAAa,KAAK,KAAK,CAAC,CAAC,KACrB,aAAa,GAAG,GAChB,QAAO,UAAS,UAAU,KAAK,WAAW,GAC1C,mBAAmB,KAAK,UAAU,CAAC,CACtC,CAAC,gBAAgB,KAAK,eAAc,CAAE;EAEvC,aAAa,KAAK,OAAO,CAAC,CAAC,KACvB,aAAa,GAAG,GAChB,QAAO,YAAW,YAAY,KAAK,aAAa,GAChD,mBAAmB,KAAK,UAAU,CAAC,CACtC,CAAC,gBAAgB,KAAK,eAAc,CAAE;EAEvC,KAAK,MAAM,KACP,gBAAgB,KAAK,MAAK,CAAE,GAC5B,mBAAmB,KAAK,UAAU,CAAC,CACtC,CAAC,WAAU,WAAU,KAAK,YAAY,MAAM,CAAC;CAClD;CAEA,WAAQ;EACJ,KAAK,OAAM;CACf;CAEA,cAAW;EACP,SAAS,oBAAoB,eAAe,KAAK,YAAY;EAC7D,SAAS,oBAAoB,aAAa,KAAK,WAAW;EAC1D,SAAS,oBAAoB,eAAe,KAAK,gBAAgB;EACjE,SAAS,oBAAoB,aAAa,KAAK,eAAe;CAClE;CAEA,SAAM;EACF,KAAK,MAAM,KAAI;CACnB;CAEU,UAAU,QAA0B,KAAQ;EAClD,OAAO,OAAO,SAAS,GAAG;CAC9B;CAGU,cAAc,QAA0B,KAAQ;EACtD,OAAO,OAAO,SAAS,GAAG;CAC9B;CAEU,eAAe,QAA0B,KAAQ;EACvD,MAAM,QAAQ,OAAO,SAAS,GAAG;EAEjC,OAAO,UAAU,QAAQ,UAAU,SAAY,OAAO,OAAO,KAAK;CACtE;CAEU,mBAAmB,QAA0B,KAAQ;EAC3D,MAAM,QAAQ,OAAO,SAAS,GAAG;EAEjC,IAAI,UAAU,QAAQ,UAAU,QAC5B,OAAO;EAGX,QAAQ,OAAO,aAAf;GACI,KAAK,UACD,OAAO,IAAI,KAAK,aAAY,CAAE,CAAC,OAAO,OAAO,KAAK,CAAC;GACvD,KAAK,QACD,OAAO,IAAI,KAAK,eAAe,QAAW,EACtC,WAAW,SACd,CAAA,CAAC,CACG,OAAO,IAAI,KAAK,KAA+B,CAAC;GACzD,KAAK,QACD,OAAO,IAAI,KAAK,eAAe,QAAW,EACtC,WAAW,QACd,CAAA,CAAC,CACG,OAAO,IAAI,KAAK,KAA+B,CAAC;GACzD,SACI,OAAO,OAAO,KAAK;EAC3B;CACJ;CAEU,cAAc,OAAa;EACjC,KAAK,MAAM,IAAI,KAAK;CACxB;CAEU,YAAY,UAAgB;EAClC,OAAQ,KAAK,QAAO,CAAE,CAAC,aAAwB;CACnD;CAEU,cAAc,UAAkB,OAAa;EACnD,KAAK,UAAU,UAAU,KAAK;CAClC;CAEU,iBACN,QAAwB;EAExB,IAAI,aAAa,KAAK,kBAAkB,IAAI,OAAO,EAAE;EAErD,IAAI,CAAC,YAAY;GACb,aAAa,IAAI,sBACb,OAAO,iBAAiB,CAAA,IACvB,QAAQ,UACL,OAAO,MAAM,YAAW,CAAE,CAAC,SAAS,MAAM,YAAW,CAAE,CAAC;GAGhE,KAAK,kBAAkB,IAAI,OAAO,IAAI,UAAU;EACpD;EAEA,OAAO;CACX;CAEU,qBACN,QAAwB;EAExB,MAAM,QAAQ,KAAK,QAAO,CAAE,CAAC,OAAO;EAEpC,OAAO,OAAO,eAAe,MAAK,WAAU,OAAO,UAAU,KAAK,KAC9D;CACR;CAEU,kBAAkB,QAA+B;EACvD,OAAO,OAAO;CAClB;CAEU,eACN,UACA,QAAsC;EAEtC,KAAK,UAAU,UAAU,QAAQ,KAAK;CAC1C;CAEU,eAAY;EAClB,KAAK,QAAQ,IAAI,CAAA,CAAE;CACvB;CAEU,WAAW,QAAwB;EACzC,IAAI,CAAC,OAAO,UACR;EAGJ,MAAM,UAAU,KAAK,KAAI;EAEzB,IAAI,CAAC,WAAW,QAAQ,aAAa,OAAO,IACxC,KAAK,KAAK,IAAI;GAAE,UAAU,OAAO;GAAI,WAAW;EAAK,CAAE;OACpD,IAAI,QAAQ,cAAc,OAC7B,KAAK,KAAK,IAAI;GAAE,UAAU,OAAO;GAAI,WAAW;EAAM,CAAE;OAExD,KAAK,KAAK,IAAI,IAAI;EAGtB,KAAK,eAAc;CACvB;CAEU,SAAS,QAAwB;EACvC,MAAM,UAAU,KAAK,KAAI;EAEzB,IAAI,CAAC,WAAW,QAAQ,aAAa,OAAO,IACxC,OAAO;EAGX,OAAO,QAAQ,cAAc,QACvB,kBACA;CACV;CAEU,SAAS,MAAY;EAC3B,IAAI,OAAO,KAAK,QAAQ,KAAK,WAAU,GACnC;EAGJ,KAAK,YAAY,IAAI,IAAI;EACzB,KAAK,OAAM;CACf;CAEU,gBAAgB,QAAwB;EAC9C,OAAO,CAAC,KAAK,gBAAe,CAAE,CAAC,IAAI,OAAO,EAAE;CAChD;CAEU,uBAAuB,QAAwB;EACrD,KAAK,gBAAgB,QAAO,WAAS;GACjC,MAAM,OAAO,IAAI,IAAI,MAAM;GAE3B,IAAI,KAAK,IAAI,OAAO,EAAE,GAClB,KAAK,OAAO,OAAO,EAAE;QAErB,KAAK,IAAI,OAAO,EAAE;GAGtB,OAAO;EACX,CAAC;CACL;CAEU,cAAc,KAAU,OAAa;EAC3C,OAAO,KAAK,eAAc,CAAE,CAAC,IAAI,KAAK,MAAK,CAAE,CAAC,KAAK,KAAK,CAAC;CAC7D;CAEU,UAAU,KAAU,OAAa;EACvC,MAAM,KAAK,KAAK,MAAK,CAAE,CAAC,KAAK,KAAK;EAElC,KAAK,eAAe,QAAO,aAAW;GAClC,MAAM,OAAO,IAAI,IAAI,QAAQ;GAE7B,IAAI,KAAK,IAAI,EAAE,GACX,KAAK,OAAO,EAAE;QAEd,KAAK,IAAI,EAAE;GAGf,OAAO;EACX,CAAC;EAED,KAAK,oBAAmB;CAC5B;CAEU,kBAAe;EACrB,MAAM,iBAAiB,KAAK,YAAW;EAEvC,KAAK,eAAe,QAAO,aAAW;GAClC,MAAM,OAAO,IAAI,IAAI,QAAQ;GAE7B,KAAK,KAAI,CAAE,CAAC,SAAS,KAAK,UAAS;IAC/B,MAAM,KAAK,KAAK,MAAK,CAAE,CAAC,KAAK,KAAK;IAElC,IAAI,gBACA,KAAK,OAAO,EAAE;SAEd,KAAK,IAAI,EAAE;GAEnB,CAAC;GAED,OAAO;EACX,CAAC;EAED,KAAK,oBAAmB;CAC5B;CAEU,YAAY,QAAwB;EAC1C,OAAO,KAAK,aAAY,CAAE,CAAC,OAAO,OAC9B,OAAO,SACP;CACR;CAEU,SAAS,QAAwB;EACvC,OAAO,OAAO,QAAQ,UAAU,OAAO,QAAQ;CACnD;CAEU,WAAW,QAAwB;EACzC,OAAO,OAAO,QAAQ,SAAS,KAAK,YAAW,CAAE,CAAC,OAAO,MAAM;CACnE;CAEU,YAAY,QAAwB;EAC1C,OAAO,OAAO,QAAQ,UAAU,KAAK,aAAY,CAAE,CAAC,OAAO,MAAM;CACrE;CAEU,YAAY,OAAqB,QAAwB;EAC/D,MAAM,eAAc;EACpB,MAAM,gBAAe;EAErB,KAAK,cAAc;GACf,UAAU,OAAO;GACjB,QAAQ,MAAM;GACd,YAAY,KAAK,YAAY,MAAM;EACtC;EAED,SAAS,iBAAiB,eAAe,KAAK,YAAY;EAC1D,SAAS,iBAAiB,aAAa,KAAK,WAAW;CAC3D;CAEU,iBAAc;EACpB,OAAO,KAAK,gBAAe,KAAM,CAAC,KAAK,KAAI;CAC/C;CAKU,kBACN,OACA,QAAwB;EAExB,MAAM,eAAc;EAEpB,MAAM,aAAc,MAAM,cAA8B,QAAQ,IAAI;EACpE,MAAM,YAAY,YAAY,QAAQ,IAAI;EAE1C,IAAI,CAAC,cAAc,CAAC,WAChB;EAGJ,MAAM,WAAW,WAAW,sBAAqB;EACjD,MAAM,UAAU,UAAU,sBAAqB;EAE/C,KAAK,kBAAkB;GACnB,UAAU,OAAO;GACjB,gBAAgB,MAAM,UAAU,SAAS;GACzC,UAAU,QAAQ,OAAO,QAAQ,SAAS,SAAS,UAAU;GAC7D,eAAe,SAAS;EAC3B;EAED,KAAK,gBAAgB,IAAI,OAAO,EAAE;EAClC,KAAK,YAAY,IAAI;GACjB,OAAO,OAAO;GACd,GAAG,SAAS;GACZ,GAAG,KAAK,gBAAgB;GACxB,OAAO,SAAS;GAChB,QAAQ,KAAK,gBAAgB;EAChC,CAAA;EAED,SAAS,iBAAiB,eAAe,KAAK,gBAAgB;EAC9D,SAAS,iBAAiB,aAAa,KAAK,eAAe;CAC/D;CAEU,eAAe,OAAkB,OAAa;EACpD,KAAK,gBAAgB,IAAI,KAAK;EAC9B,MAAM,cAAc,QAAQ,cAAc,OAAO,KAAK,CAAC;CAC3D;CAEU,cAAc,OAAgB;EACpC,IAAI,KAAK,gBAAe,MAAO,MAC3B,MAAM,eAAc;CAE5B;CAEU,UAAU,OAAkB,OAAa;EAC/C,MAAM,eAAc;EAEpB,MAAM,OAAO,KAAK,gBAAe;EACjC,KAAK,gBAAgB,IAAI,IAAI;EAE7B,IAAI,SAAS,QAAQ,SAAS,OAC1B;EAGJ,MAAM,OAAO,CAAC,GAAG,KAAK,KAAI,CAAE;EAC5B,MAAM,CAAC,SAAS,KAAK,OAAO,MAAM,CAAC;EACnC,KAAK,OAAO,OAAO,GAAG,KAAK;EAE3B,KAAK,KAAK,IAAI,IAAI;EAClB,KAAK,cAAc,KAAK,IAAI;CAChC;CAEiB,gBAAgB,UAA6B;EAC1D,IAAI,CAAC,KAAK,aACN;EAMJ,MAAM,WAHS,KAAK,QAAO,CAAE,CAAC,MAAK,MAC/B,EAAE,OAAO,KAAK,YAAa,QAEd,CAAA,EAAQ,YAAY;EACrC,MAAM,QAAQ,MAAM,UAAU,KAAK,YAAY;EAC/C,MAAM,QAAQ,KAAK,IAAI,UAAU,KAAK,YAAY,aAAa,KAAK;EAEpE,KAAK,aAAa,QAAO,YAAW;GAChC,GAAG;IACF,KAAK,YAAa,WAAW;EACjC,EAAC;CACN;CAEiB,oBAAyB;EACtC,KAAK,cAAc;EACnB,SAAS,oBAAoB,eAAe,KAAK,YAAY;EAC7D,SAAS,oBAAoB,aAAa,KAAK,WAAW;CAC9D;CAEiB,oBAAoB,UAA6B;EAC9D,MAAM,QAAQ,KAAK;EAEnB,IAAI,CAAC,OACD;EAKJ,KAAK,YAAY,QAAO,YACpB,WAAW;GACP,GAAG;GACH,GAAG,MAAM,UAAU,MAAM;EAC5B,CAAA;EAKL,MAAM,YAFS,SAAS,iBAAiB,MAAM,SAAS,MAAM,OAC3C,CAAA,EAAQ,QAAqB,oBAAoB,EACnD,EAAY,QAAQ;EAErC,KAAK,iBAAiB,IAClB,YAAY,aAAa,MAAM,WAAW,WAAW,IAAI;CAEjE;CAEiB,wBAA6B;EAC1C,MAAM,QAAQ,KAAK;EACnB,MAAM,SAAS,KAAK,iBAAgB;EAEpC,KAAK,kBAAkB;EACvB,KAAK,gBAAgB,IAAI,IAAI;EAC7B,KAAK,iBAAiB,IAAI,IAAI;EAC9B,KAAK,YAAY,IAAI,IAAI;EAEzB,SAAS,oBAAoB,eAAe,KAAK,gBAAgB;EACjE,SAAS,oBAAoB,aAAa,KAAK,eAAe;EAE9D,IAAI,CAAC,SAAS,CAAC,UAAU,MAAM,aAAa,QACxC;EAGJ,MAAM,QAAQ,KAAK,eAAc,KAAM,KAAK,QAAO,CAAE,CAAC,KAAI,MAAK,EAAE,EAAE;EACnE,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ;EACzC,MAAM,KAAK,MAAM,QAAQ,MAAM;EAE/B,IAAI,SAAS,MAAM,OAAO,IACtB;EAQJ,MAAM,OAAO,CAAC,GAAG,KAAK;EACtB,KAAK,OAAO,MAAM,CAAC;EACnB,KAAK,OAAO,IAAI,GAAG,MAAM,QAAQ;EAEjC,KAAK,eAAe,IAAI,IAAI;CAChC;CAEQ,UAAU,UAAkB,OAAc;EAC9C,KAAK,QAAQ,QAAO,YAAU;GAC1B,MAAM,OAAO,EAAE,GAAG,QAAO;GAEzB,IAAI,OACA,KAAK,YAAY;QAEjB,OAAO,KAAK;GAGhB,OAAO;EACX,CAAC;CACL;CAEQ,iBAAc;EAClB,KAAK,YAAY,IAAI,CAAC;EACtB,KAAK,OAAM;CACf;CAEQ,sBAAmB;EACvB,MAAM,MAAM,KAAK,eAAc;EAC/B,MAAM,eAAe,KAAK,KAAI,CAAE,CAAC,QAAQ,KAAK,UAC1C,IAAI,IAAI,KAAK,MAAK,CAAE,CAAC,KAAK,KAAK,CAAC,CAAC;EAGrC,KAAK,gBAAgB,KAAK,YAAY;CAC1C;CAEQ,QAAK;EACT,KAAK,QAAQ,IAAI,IAAI;EACrB,KAAK,MAAM,IAAI,KAAK;EAEpB,MAAM,SAAoC;GACtC,MAAM,KAAK,YAAW;GACtB,MAAM,KAAK,UAAS,IAAK,KAAK,SAAQ,IAAK;GAC3C,OAAO,KAAK,MAAK;GACjB,MAAM,KAAK,KAAI;GACf,SAAS,KAAK,QAAO;EACxB;EAED,KAAK,cAAc,OAAO;EAC1B,KAAK,gBAAgB,OAAO;EAE5B,OAAO,KAAK,WAAU,CAAE,CAAC,KAAK,MAAM,CAAC,CAAC,KAAK,iBAAiB,GAAG,IAAI,CAAC,CAAC;CACzE;CAEQ,YAAY,QAA0C;EAC1D,KAAK,QAAQ,IAAI,KAAK;EAEtB,IAAI,QAAQ;GACR,KAAK,KAAK,IAAI,OAAO,KAAK;GAC1B,KAAK,MAAM,IAAI,OAAO,KAAK;EAC/B,OACI,KAAK,MAAM,IAAI,IAAI;EAGvB,KAAK,IAAI,aAAY;CACzB;CAlsBS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,mBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,mBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,oBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,MAAA;GAAA,gBAAA;GAAA,iBAAA;GAAA,eAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,QAAA;EAAA,WAVd,CAAC,aAAa;GACrB;GACA;GACA;GACA;GACA;GACA;GACA;EACH,CAAA,CAAC;EAAC,UAAA;EAAA,UC5FP;EA8WA,QAAA,CAAA,o7OAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MDrSQ;IAAM,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACN;IAAiB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACjB;IAAmB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,eAAA,uBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACnB;IAAmB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,UAAA,CAAA,YAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACnB;IAAmB,UAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACnB;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAAiB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACjB;IAAkB,UAAA;IAAA,QAAA,CAAA,MAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAClB;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;CAAA,CAAA;;AAaX,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EA1B5B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAU,SAGX;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,MACK,EAAE,OAAO,QAAO;GAAE,WACb,CAAC,aAAa;IACrB;IACA;IACA;IACA;IACA;IACA;IACA;GACH,CAAA,CAAC;GAAC,UAAA;GAAA,QAAA,CAAA,o7OAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AE/DP,IAAa,uBAAb,MAAiC;CAER;CACA;CAFrB,YACqB,OACA,UAA4C,CAAA,GAAE;EAD9C,KAAA,QAAA;EACA,KAAA,UAAA;CAClB;CAEH,KAAK,QAAiC;EAClC,IAAI,SAAS,KAAK;EAElB,MAAM,QAAQ,OAAO,MAAM,KAAI;EAE/B,IAAI,SAAS,KAAK,QAAQ,QACtB,SAAS,OAAO,QAAO,SAAQ,KAAK,QAAQ,OAAQ,MAAM,KAAK,CAAC;EAGpE,IAAI,OAAO,KAAK,OAAO,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,QACnD,SAAS,OAAO,QAAO,SAAQ,KAAK,QAAQ,OAAQ,MAAM,OAAO,OAAO,CAAC;EAG7E,IAAI,OAAO,QAAQ,KAAK,QAAQ,WAAW;GACvC,MAAM,EAAE,UAAU,cAAc,OAAO;GACvC,MAAM,SAAS,cAAc,QAAQ,IAAI;GAEzC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,GAAG,MAAK;IAC/B,MAAM,SAAS,KAAK,QAAQ,UAAW,GAAG,QAAQ;IAClD,MAAM,SAAS,KAAK,QAAQ,UAAW,GAAG,QAAQ;IAElD,IAAI,WAAW,QACX,OAAO;IAGX,OAAQ,SAAoB,SAAmB,SAAS,CAAC;GAC7D,CAAC;EACL;EAEA,MAAM,QAAQ,OAAO;EACrB,MAAM,QAAQ,OAAO,OAAO,IACxB,OAAO,MAAM,OAAO,OAAO,OAAO,MAAO,OAAO,OAAO,OAAO,OAAQ,OAAO,IAAI,IACjF;EAEJ,OAAO,GAAG;GAAE;GAAO;EAAK,CAAE;CAC9B;AACH;AAGD,IAAa,wBAAb,MAAkC;CAET;CADrB,YACqB,OAE2B;EAF3B,KAAA,QAAA;CAGlB;CAEH,KAAK,QAAiC;EAClC,OAAO,KAAK,MAAM,MAAM;CAC5B;AACH;AC9DD,MAAM,eAA8C;CAChD,MAAM;CACN,SAAS;CACT,SAAS;CACT,QAAQ;AACX;AAED,MAAM,iBAA8C;CAChD,MAAM;CACN,SAAS;CACT,SAAS;CACT,QAAQ;AACX;AAoBD,IAAa,mBAAb,MAAa,iBAAgB;CAChB,SAAS,MAAmB,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACnC,UAAU,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC3B,cAAc,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,cAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGxD,YAAY,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEtC,YAAY,OAAM;CAER,OAAO,eAAe,aAAa,KAAK,OAAM,IAAI,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAClD,aAAa,eAC5B,eAAe,KAAK,OAAM,IAC7B,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAGkB,OAAO,eACtB,KAAK,OAAM,MAAO,WAAW,UAAU,UAC1C,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEO,UAAU;CACV,UAAU;CAEV;CACA,YAAY;CACZ,YAAY;CAEpB,cAAA;EACI,QAAO,cAAY;GACf,MAAM,YAAY,KAAK,UAAS;GAEhC,IAAI,cAAc,MACd;GAGJ,KAAK,YAAY;GACjB,KAAK,YAAW;GAEhB,gBAAgB,KAAK,UAAS,CAAE;EACpC,CAAC;CACL;CAEU,WAAW,SAAgB;EACjC,KAAK,UAAU;EACf,KAAK,YAAW;CACpB;CAEU,WAAW,SAAgB;EACjC,KAAK,UAAU;EACf,KAAK,YAAW;CACpB;CAEQ,cAAW;EACf,IAAI,KAAK,WAAW,KAAK,SACrB,KAAK,UAAS;OACX,IAAI,KAAK,UAAS,MAAO,QAAQ,KAAK,UAAU,QACnD,KAAK,WAAU;CAEvB;CAEQ,aAAU;EACd,KAAK,YAAY,KAAK,IAAG;EACzB,KAAK,QAAQ,iBAAiB,KAAK,UAAU,KAAI,GAAI,KAAK,SAAS;CACvE;CAGQ,YAAS;EACb,IAAI,KAAK,UAAU,QACf;EAGJ,aAAa,KAAK,KAAK;EACvB,KAAK,QAAQ;EACb,KAAK,aAAa,KAAK,IAAG,IAAK,KAAK;CACxC;CA1ES,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,WAAA,YAAA;EAAA,MAAA,EAAA,WAAA;GAAA,cAAA;GAAA,cAAA;GAAA,WAAA;GAAA,YAAA;EAAA,EAAA;EAAA,WARd,CAAC,aAAa;GACrB;GACA;GACA;GACA;GACA;EACH,CAAA,CAAC;EAAC,UAAA;EAAA,UCpDP;EA+BA,cAAA,CAAA;GAAA,MAAA;GAAA,MDQc;GAAM,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAe,UAAA;GAAA,QAAA,CAAA,QAAA;EAAA,CAAA;CAAA,CAAA;;AAexB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAlB5B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAU,SAEX,CAAC,QAAQ,eAAe;GAAC,MAC5B;IACF,gBAAgB;IAChB,gBAAgB;IAChB,aAAa;IACb,cAAc;GACjB;GAAA,WACU,CAAC,aAAa;IACrB;IACA;IACA;IACA;IACA;GACH,CAAA,CAAC;GAAC,UAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AE9CP,IAAa,iBAAb,MAAa,eAAc;CACN,UAAU,OAAgB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACtC,SAAS;CAER,SAAS,KAAK,QAAQ,WAAU;CAEzC,KACI,SACA,UAAqC,CAAA,GAAE;EAEvC,MAAM,KAAK,KAAK;EAEhB,MAAM,QAAe;GACjB;GACA;GACA,iBAAiB;IACb,WAAW,QAAQ;IACnB,eAAe,KAAK,QAAQ,EAAE;GACjC;GACD,QAAQ,QAAQ,UAAU;GAC1B,aAAa,QAAQ,eAAe;GACpC,WAAW,QAAQ;EACtB;EAED,KAAK,QAAQ,QAAO,WAAU,CAAC,GAAG,QAAQ,KAAK,CAAC;EAEhD,OAAO;CACX;CAEA,QAAQ,IAAU;EACd,KAAK,QAAQ,QAAO,WAAU,OAAO,QAAO,UAAS,MAAM,OAAO,EAAE,CAAC;CACzE;CA/BS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAd,OAAA,QAAA,GAAA,sBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,YADD;CAAM,CAAA;;AACnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAc,YAAA,CAAA;EAD1B,MAAA;EAAW,MAAA,CAAA,EAAE,YAAY,OAAM,CAAE;;;ACFlC,MAAa,eAAe;CACxB;CACA;CACA;CACA;AACM;ACCV,MAAM,mBAAoD;CACtD,YAAY;CACZ,cACI;CACJ,aAAa;CACb,eAAe;CACf,iBAAiB;CACjB,gBAAgB;AACnB;AAQD,IAAa,qBAAb,MAAa,mBAAkB;CAClB,WAAW,MAAuB,gBAAe,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACjD,YAAY,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAE5B,eAAe,OAAO,cAAc;CAEpC,kBAAkB,eACjC,iBAAiB,KAAK,SAAQ,IACjC,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CARQ,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAkB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAlB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAkB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UCzB/B;EA+BA,QAAA,CAAA,meAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDRc;GAAgB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA,CAAA,WAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAgB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAEnC,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAkB,YAAA,CAAA;EAN9B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAY,SAGb,CAAC,kBAAkB,gBAAgB;GAAC,UAAA;GAAA,QAAA,CAAA,meAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;AEvBjD,MAAa,mBAAmB;CAC5B;CACA;CACA;CACA;CACA;CACA;AACM;ACGV,IAAa,oBAAb,MAAa,kBAAiB;CACjB,UAAU,aAAmC,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CADvD,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,UAAA;EAAA,SAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,SAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UCV9B;EAOA,QAAA,CAAA,mHAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDCc;GAAgB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAEjB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAN7B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAW,SAGZ,CAAC,gBAAgB;GAAC,UAAA;GAAA,QAAA,CAAA,mHAAA;EAAA,CAAA;CAG2B,CAAA;CAAA,gBAAA,EAAA,SAAA,CAAA;EAAA,MAAA,GAAA;EAAA,MAAA,CAAA,WAAS,EAAA,UAAA,KAAA,CAAA;CAAA,CAAA,EAAA;AAAA,CAAA;AESnE,IAAa,qBAAb,MAAa,mBAAkB;CAClB,SAAS,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAE9B,cAAc,eAAe,CAAC,KAAK,OAAM,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAE5C,eAAe,KAAK,OAAO,QAAO,WAAU,CAAC,MAAM;CALnD,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAkB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAlB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAkB,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,QAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,SAAA,EAAA,QAAA,eAAA;EAAA,MAAA;GAAA,WAAA,EAAA,2BAAA,oBAAA;GAAA,YAAA,EAAA,cAAA,WAAA;EAAA;EAAA,WAFhB,CAAC,aAAa;GAAE;GAAuB;EAAS,CAAE,CAAC;EAAC,UAAA,CAAA,WAAA;EAAA,UAAA;EAAA,UClBnE;EA4CA,QAAA,CAAA,0lHAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MD/Bc;GAAiB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAM,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAO1B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAkB,YAAA,CAAA;EAZ9B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAY,UACZ;GAAW,SAGZ,CAAC,mBAAmB,MAAM;GAAC,MAC9B;IACF,gBAAgB;IAChB,6BAA6B;GAChC;GAAA,WACU,CAAC,aAAa;IAAE;IAAuB;GAAS,CAAE,CAAC;GAAC,UAAA;GAAA,QAAA,CAAA,0lHAAA;EAAA,CAAA;;;;;;;;;;;;;;AEbnE,IAAI,WAAS;AAOb,IAAa,0BAAb,MAAa,wBAAuB;CACf,UAAU,OAAO,oBAAoB,EAAE,UAAU,KAAI,CAAE;CAE/D,QAAQ,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEtB,UAAU,oBAAoB;CAExC,cAAc,eAAe,KAAK,SAAS,YAAW,KAAM,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAPlE,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAuB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAvB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAuB,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,OAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,UAAA;EAAA,UCZpC;EAcA,QAAA,CAAA,66CAAA;CAAA,CAAA;;ADFa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAuB,YAAA,CAAA;EALnC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAkB,UAAA;GAAA,QAAA,CAAA,66CAAA;EAAA,CAAA;;;;;;;;;;;AEMhC,IAAa,yBAAb,MAAa,uBAAsB;CACd,UAAU,OAAO,oBAAoB,EAAE,UAAU,KAAI,CAAE;CAE/D,QAAQ,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,OAAO,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAExB,cAAc,eAAe,KAAK,UAAU,CAAC,KAAK,QAAQ,OAAM,IAAK,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAN3E,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAsB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAtB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAsB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UCdnC;EAuBA,QAAA,CAAA,kVAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDXc;GAAiB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAM,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAE1B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAsB,YAAA,CAAA;EANlC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAiB,SAGlB,CAAC,mBAAmB,MAAM;GAAC,UAAA;GAAA,QAAA,CAAA,kVAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;AEGxC,MAAM,cAAc;AAOpB,IAAa,oBAAb,MAAa,kBAAiB;CACjB,QAAQ,MAAc,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEhC,KAAK,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,KAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAE7C,SAAS,UAAU,SAChC,UACH,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,UAAU,eAAe,YAAY,KAAK,KAAK,MAAK,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAGxD,cAAc,eAAc;EAC3C,IAAI,CAAC,KAAK,QAAO,GACb,OAAO;EAGX,MAAM,MAAM,KAAK,MAAK,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,YAAW;EAE7C,OAAO,IAAI,WAAW,IAChB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,KAAI,SAAQ,OAAO,IAAI,CAAC,CAAC,KAAK,EAAE,IAC/C,MAAM;CAChB,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,aAAU;EAChB,MAAM,SAAS,KAAK,OAAM,CAAE,CAAC;EAE7B,IAAI,OAAO,YACP,OAAO,WAAU;OAEjB,OAAO,MAAK;CAEpB;CAEU,WAAW,OAAY;EAC7B,KAAK,MAAM,IAAK,MAAM,OAA4B,KAAK;CAC3D;CArCS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,IAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,QAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UCtB9B;EAqCA,cAAA;GAAA;IAAA,MAAA;IAAA,MDjBc;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAqB,UAAA;IAAA,QAAA,CAAA,iBAAA;IAAA,SAAA,CAAA,uBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAiB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;CAAA,CAAA;;AAE3D,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAL7B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAW,SAEZ;IAAC;IAAkB;IAAuB;GAAiB;GAAC,UAAA;EAAA,CAAA;CASjE,CAAA;CAAA,gBAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,IAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,UAAQ,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AELhB,IAAa,qBAAb,MAAa,mBAAkB;CAClB,QAAQ,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAClC,OAAO,MAAc,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACvB,MAAM,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CACrB,MAAM,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CACrB,cAAc,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAG/B,iBAAiB,aAAmC,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAC9D,kBAAkB,aAAmC,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAEzE,WAAQ;EACJ,IAAI,QAAQ,KAAK,MAAK,KAAM;EAE5B,SAAS,KAAK,KAAI;EAElB,MAAM,MAAM,KAAK,IAAG;EAEpB,IAAI,QAAQ,UAAa,QAAQ,KAC7B,QAAQ;EAGZ,KAAK,MAAM,IAAI,KAAK;CACxB;CAEA,aAAU;EACN,IAAI,QAAQ,KAAK,MAAK,KAAM;EAE5B,SAAS,KAAK,KAAI;EAElB,MAAM,MAAM,KAAK,IAAG;EAEpB,IAAI,QAAQ,UAAa,QAAQ,KAC7B,QAAQ;EAGZ,KAAK,MAAM,IAAI,KAAK;CACxB;CArCS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAkB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAlB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAkB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,WAFhB,CAAC,aAAa;GAAE;GAAU;EAAS,CAAE,CAAC;EAAC,SAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,SAAA;GAAA,aAAA;GAAA,UAAA;EAAA,GAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,UAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UCtBtD;EA8BA,cAAA;GAAA;IAAA,MAAA;IAAA,MDTc;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAM,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;CAAA,CAAA;;AAG3C,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAkB,YAAA,CAAA;EAN9B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAY,SAEb;IAAC;IAAkB;IAAkB;GAAM;GAAC,WAC1C,CAAC,aAAa;IAAE;IAAU;GAAS,CAAE,CAAC;GAAC,UAAA;EAAA,CAAA;CAUW,CAAA;CAAA,gBAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,KAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,KAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,WAAS,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,iBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CACR,YAAU,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AEF5E,MAAM,cAAY;CAAC;CAAS;CAAK;AAAW;AAgB5C,IAAa,6BAAb,MAAa,2BAA0B;CAClB,OAAO,OAAgC,UAAU;CACjD,WAAW,OAAO,QAAQ;CAElC,QAAQ,MAAiB;EAAE,OAAO;EAAM,KAAK;CAAI,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEpD,KAAK,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,KAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,cAAc,MAAc,gBAAe,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAC3C,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,YAAY,MAAM,MAAI;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,kBAAkB,MAAuB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAC9C,cAAc,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAE/B,MAAM,MAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CACjC,MAAM,MAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CACjC,iBAAiB,YAAwC,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAC/D,YAAY,MAAiB,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,SAAS,MAAc,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAG/B,SAAS,MAAkC,EAChD,WAAW,SACd,GAAC,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAGO,UAAU,MAAyB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE5B,SAAS,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAExB,WAAW,UAAU,qBAAoB,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAEvC,WAAW,eAAe,CAAC,CAAC,KAAK,MAAK,CAAE,CAAC,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAG/C,eAAe,eAC9B,KAAK,OAAM,IACL,KAAK,QAAO,CAAE,CAAC,KAAI,WAAU,KAAK,MAAM,OAAO,MAAK,CAAE,CAAC,IACvD,CAAA,GACT,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,eAAe,eAAc;EAC5C,MAAM,EAAE,OAAO,QAAQ,KAAK,MAAK;EAEjC,OAAO,KAAK,aAAY,CAAE,CAAC,WAAU,UACjC,MAAM,UAAU,SAAS,MAAM,QAAQ,GAAG;CAElD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,UAAU,eAAc;EACvC,MAAM,QAAQ,aAAa,KAAK,MAAK,CAAE,CAAC,KAAK;EAC7C,MAAM,MAAM,aAAa,KAAK,MAAK,CAAE,CAAC,GAAG;EACzC,MAAM,SAAS,IAAI,KAAK,eAAe,KAAK,OAAM,GAAI,KAAK,OAAM,CAAE;EAEnE,IAAI,CAAC,OACD,OAAO;EAIX,OAAO,MACD,OAAO,YAAY,OAAO,GAAG,IAC7B,GAAG,OAAO,OAAO,KAAK,EAAC;CACjC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,SAAM;EACZ,IAAI,CAAC,KAAK,SAAQ,GACd,KAAK,OAAO,QAAO,SAAQ,CAAC,IAAI;CAExC;CAEU,mBAAmB,OAAoB;EAC7C,IAAI,KAAK,SAAQ,KAAM,CAAC,YAAU,SAAS,MAAM,GAAG,GAChD;EAGJ,MAAM,eAAc;EACpB,KAAK,OAAO,IAAI,IAAI;EAEpB,sBAAsB,KAAK,SAAQ,CAAE,EAAE,gBAAe,GAAI,EACtD,UAAU,KAAK,SAClB,CAAA;CACL;CAEU,YAAY,OAAgB;EAElC,IAAI,MAAM,SAAS,MAAM,KAAK;GAC1B,KAAK,OAAO,IAAI,KAAK;GACrB,KAAK,WAAU;EACnB;CACJ;CAEU,aAAa,QAAuB;EAC1C,KAAK,MAAM,IAAI,KAAK,MAAM,OAAO,MAAK,CAAE,CAAC;EACzC,KAAK,OAAO,IAAI,KAAK;EACrB,KAAK,WAAU;CACnB;CAEU,mBAAmB,OAAoB;EAE7C,IAAI,MAAM,QAAQ,UACd,KAAK,WAAU;CAEvB;CAEU,MAAM,OAAY;EAExB,MAAM,gBAAe;EAErB,KAAK,MAAM,IAAI;GAAE,OAAO;GAAM,KAAK;EAAI,CAAE;EACzC,KAAK,WAAU;CACnB;CAGQ,MAAM,EAAE,OAAO,OAAgB;EACnC,MAAM,MAAM,KAAK,IAAG;EACpB,MAAM,MAAM,KAAK,IAAG;EAEpB,OAAO;GACH,OAAO,SAAS,OAAO,QAAQ,MAAM,MAAM;GAC3C,KAAK,OAAO,OAAO,MAAM,MAAM,MAAM;EACxC;CACL;CAEQ,aAAU;EACd,KAAK,KAAK,cAAc,cAAc,OAAO,CAAC,EAAE,MAAK;CACzD;CA5HS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAA0B,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAA1B,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAA0B,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,IAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,MAAA,EAAA,gBAAA,QAAA;EAAA,WAFxB,CAAC,aAAa;GAAE;GAAuB;EAAS,CAAE,CAAC;EAAC,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WA+BzB;GAAmB,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UC5E7D;EA6EA,QAAA,CAAA,q3HAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MDvCQ;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAAmB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,eAAA,aAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACnB;IAAmB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,UAAA,CAAA,YAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACnB;IAAmB,UAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACnB;IAAM,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;CAAA,CAAA;;AAKD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAA0B,YAAA,CAAA;EAdtC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAsB,SAGvB;IACL;IACA;IACA;IACA;IACA;GACH;GAAA,MACK,EAAE,OAAO,QAAO;GAAE,WACb,CAAC,aAAa;IAAE;IAAuB;GAAS,CAAE,CAAC;GAAC,UAAA;GAAA,QAAA,CAAA,q3HAAA;EAAA,CAAA;CA+BzB,CAAA;CAAA,gBAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,IAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,iBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,KAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,KAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,GAAA,iBAAA,mBAAmB,GAAA,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AEtE7D,MAAM,cAAa;CACf,MAAM,sBAAM,IAAI,KAAI;CAEpB,OAAO,IAAI,KAAK,IAAI,YAAW,GAAI,IAAI,SAAQ,GAAI,IAAI,QAAO,CAAE;AACpE;AAEA,MAAM,WAAW,OAAa,SAAe;CACzC,OAAO,UAAU,KAAK;CACtB,KAAK,UAAU,GAAG;AACrB;AAED,SAAgB,YAAY,QAAQ,SAAO;CACvC,OAAO;EAAE;EAAO,aAAa,QAAQ,MAAK,GAAI,MAAK,CAAE;CAAC;AAC1D;AAGA,SAAgB,eAAe,MAAc,QAAQ,QAAQ,KAAI,QAAO;CACpE,OAAO;EAAE;EAAO,aAAa,QAAQ,QAAQ,MAAK,GAAI,IAAI,IAAI,GAAG,MAAK,CAAE;CAAC;AAC7E;AAEA,SAAgB,eAAe,YAAuB,GAAG,QAAQ,aAAW;CACxE,OAAO;EACH;EACA,aAAY;GACR,MAAM,UAAU,MAAK,CAAE,CAAC,OAAM,IAAK,YAAY,KAAK;GACpD,MAAM,QAAQ,QAAQ,MAAK,GAAI,CAAC,MAAM;GAEtC,OAAO,QAAQ,OAAO,QAAQ,OAAO,CAAC,CAAC;EAC3C;CACH;AACL;AAGA,SAAgB,YAAY,SAAS,GAAG,QAAQ,SAAS,eAAe,cAAY;CAChF,OAAO;EACH;EACA,aAAY;GACR,MAAM,MAAM,MAAK;GAEjB,OAAO,QACH,IAAI,KAAK,IAAI,YAAW,GAAI,IAAI,SAAQ,IAAK,QAAQ,CAAC,GACtD,IAAI,KAAK,IAAI,YAAW,GAAI,IAAI,SAAQ,IAAK,SAAS,GAAG,CAAC,CAAC;EAEnE;CACH;AACL;AAGA,SAAgB,WAAW,SAAS,GAAG,QAAQ,SAAS,cAAc,aAAW;CAC7E,OAAO;EACH;EACA,aAAY;GACR,MAAM,OAAO,MAAK,CAAE,CAAC,YAAW,IAAK;GAErC,OAAO,QAAQ,IAAI,KAAK,MAAM,GAAG,CAAC,GAAG,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC;EAC/D;CACH;AACL;AAMA,SAAgB,oBACZ,YACA,UACA,SAAS,GACT,QAAQ,SAAS,wBAAwB,uBAAqB;CAE9D,OAAO;EACH;EACA,aAAY;GACR,MAAM,MAAM,MAAK;GAIjB,MAAM,YAAY,OAAO,IAHE,KAAK,IAAI,YAAW,GAAI,YAAY,QAGtC,IAAiB,IAAI,YAAW,IAAK,IAAI,YAAW,IAAK;GAClF,MAAM,QAAQ,IAAI,KAAK,YAAY,QAAQ,YAAY,QAAQ;GAC/D,MAAM,MAAM,QAAQ,IAAI,KAAK,YAAY,SAAS,GAAG,YAAY,QAAQ,GAAG,EAAE;GAE9E,OAAO,QAAQ,OAAO,GAAG;EAC7B;CACH;AACL;AAGA,SAAgB,wBAAwB,YAAuB,GAAC;CAC5D,OAAO;EACH,YAAW;EACX,eAAe,CAAC;EAChB,eAAe,EAAE;EACjB,eAAe,SAAS;EACxB,YAAY,CAAC;EACb,YAAY,EAAE;EACd,WAAW,CAAC;EACZ,WAAW,EAAE;CAChB;AACL;AC/EA,IAAa,wBAAb,MAAa,sBAAqB;CAErB,QAAQ,MAAc,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAE9B,aAAa,MAAc,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAC7B,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAE3C,QAAQ,eACvB,UAAU,KAAK,MAAK,CAAE,CAAC,EAAE,SAAS,GACrC,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,UAAU,eACzB,UAAU,KAAK,MAAK,CAAE,CAAC,EAAE,WAAW,GACvC,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,aAAa,IAAI,sBAChC,MAAM,KAAK,EAAE,QAAQ,GAAE,IAAK,GAAG,SAAS,IAAI,SACtC,IAAI;CAGK,eAAe,eAAc;EAC5C,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,WAAU,CAAE,CAAC;EAEtD,OAAO,IAAI,sBACP,MAAM,KACF,EAAE,QAAQ,KAAK,KAAK,KAAK,IAAI,EAAC,IAC7B,GAAG,UAAU,QAAQ,IAAI,SAExB,IAAI;CAElB,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,OAAO,UAAkB,OAAO,KAAK,CAAC,CAAC,SAAS,GAAG,GAAG;CAE/D,SAAS,OAAoB;EACnC,IAAI,UAAU,MACV,KAAK,MAAM,IAAI,OAAO,OAAO,KAAK,QAAO,CAAE,CAAC;CAEpD;CAEU,WAAW,SAAsB;EACvC,IAAI,YAAY,MACZ,KAAK,MAAM,IAAI,OAAO,KAAK,MAAK,GAAI,OAAO,CAAC;CAEpD;CA3CS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,MAAA,EAAA,gBAAA,mCAAA;EAAA,WAFnB,CAAC,aAAa,EAAE,UAAS,CAAE,CAAC;EAAC,UAAA;EAAA,UCtB5C;EAuBA,QAAA,CAAA,kJAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDHc;GAAiB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAM,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAI1B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EARjC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAgB,SAGjB,CAAC,mBAAmB,MAAM;GAAC,MAC9B,EAAE,OAAO,mCAAkC;GAAE,WACxC,CAAC,aAAa,EAAE,UAAS,CAAE,CAAC;GAAC,UAAA;GAAA,QAAA,CAAA,kJAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEe5C,MAAM,YAAY;CAAC;CAAS;CAAK;AAAW;AAmB5C,IAAa,wBAAb,MAAa,sBAAqB;CACb,OAAO,OAAgC,UAAU;CACjD,WAAW,OAAO,QAAQ;CAGlC,QAAQ,MAAoC,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEjD,KAAK,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,KAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,cAAc,MAAc,eAAc,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAC1C,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,YAAY,MAAM,MAAI;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,kBAAkB,MAAuB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAC9C,cAAc,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAE/B,MAAM,MAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CACjC,MAAM,MAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CACjC,iBAAiB,YAAwC,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAC/D,YAAY,MAAiB,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,SAAS,MAAc,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAE/B,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,aAAa,MAAc,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAG7B,cAAc,MAAc,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAGpC,SAAS,MAAyC,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAE7C,SAAS,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAExB,WAAW,UAAU,qBAAoB,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAEvC,WAAW,eAC1B,KAAK,MAAK,CAAE,EAAE,MAAM,GAAG,EAAE,KAAK,MACjC,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,WAAW,eAAc;EACxC,MAAM,OAAO,KAAK,MAAK,CAAE,EAAE,MAAM,IAAI,EAAE;EAEvC,OAAO,UAAU,IAAI,IAAI,OAAQ,KAAK,YAAW;CACrD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,UAAU,eAAc;EACvC,MAAM,OAAO,iBAAiB,KAAK,MAAK,CAAE;EAC1C,MAAM,SAAS,KAAK,OAAM,MAAO,KAAK,SAAQ,IACxC;GAAE,WAAW;GAAU,WAAW;EAAO,IACzC,EAAE,WAAW,SAAQ;EAE3B,OAAO,OACD,IAAI,KAAK,eAAe,KAAK,OAAM,GAAI,MAAM,CAAC,CAAC,OAAO,IAAI,IAC1D;CACV,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,SAAM;EACZ,IAAI,CAAC,KAAK,SAAQ,GACd,KAAK,OAAO,QAAO,SAAQ,CAAC,IAAI;CAExC;CAEU,mBAAmB,OAAoB;EAC7C,IAAI,KAAK,SAAQ,KAAM,CAAC,UAAU,SAAS,MAAM,GAAG,GAChD;EAGJ,MAAM,eAAc;EACpB,KAAK,OAAO,IAAI,IAAI;EAEpB,sBAAsB,KAAK,SAAQ,CAAE,EAAE,gBAAe,GAAI,EACtD,UAAU,KAAK,SAClB,CAAA;CACL;CAEU,WAAW,MAAoB;EACrC,IAAI,CAAC,MACD;EAGJ,IAAI,CAAC,KAAK,SAAQ,GAAI;GAClB,KAAK,MAAM,IAAI,IAAI;GACnB,KAAK,MAAK;GACV;EACJ;EAGA,KAAK,MAAM,IAAI,GAAG,KAAI,GAAI,KAAK,SAAQ,GAAI;CAC/C;CAEU,WAAW,MAAY;EAE7B,MAAM,OAAO,KAAK,SAAQ,KAAM,0BAAU,IAAI,KAAI,CAAE;EAEpD,KAAK,MAAM,IAAI,GAAG,KAAI,GAAI,MAAM;CACpC;CAEU,QAAK;EACX,KAAK,OAAO,IAAI,KAAK;EACrB,KAAK,WAAU;CACnB;CAEU,mBAAmB,OAAoB;EAE7C,IAAI,MAAM,QAAQ,UACd,KAAK,WAAU;CAEvB;CAEU,MAAM,OAAY;EAExB,MAAM,gBAAe;EAErB,KAAK,MAAM,IAAI,IAAI;EACnB,KAAK,WAAU;CACnB;CAEQ,aAAU;EACd,KAAK,KAAK,cAAc,cAAc,OAAO,CAAC,EAAE,MAAK;CACzD;CArHS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,IAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,MAAA,EAAA,gBAAA,QAAA;EAAA,WAFnB,CAAC,aAAa;GAAE;GAAc;EAAS,CAAE,CAAC;EAAC,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAiChB;GAAmB,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UCvF7D;EAwEA,QAAA,CAAA,2GAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MD5BQ;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAAmB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,eAAA,aAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACnB;IAAmB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,UAAA,CAAA,YAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACnB;IAAmB,UAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACnB;IAAiB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACjB;IAAqB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,aAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACrB;IAAM,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACN;IAAe,UAAA;IAAA,QAAA,CAAA,QAAA;GAAA;EAAA;CAAA,CAAA;;AAKV,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EAjBjC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAe,SAGhB;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,MACK,EAAE,OAAO,QAAO;GAAE,WACb,CAAC,aAAa;IAAE;IAAc;GAAS,CAAE,CAAC;GAAC,UAAA;GAAA,QAAA,CAAA,2GAAA;EAAA,CAAA;CAiChB,CAAA;CAAA,gBAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,IAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,iBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,KAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,KAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,GAAA,iBAAA,mBAAmB,GAAA,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AErE7D,IAAa,4BAAb,MAAa,0BAAyB;CACzB,SAAS,MAAoB,aAAY,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACzC,aAAa,MAAwB,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAC7C,OAAO,MAAc,mBAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACvC,SAAS,MAAM,SAAmB,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAJlC,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAyB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAzB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAyB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,QAAA,eAAA;EAAA,WAFvB,CAAC,aAAa,EAAE,gBAAe,CAAE,CAAC;EAAC,UAAA;EAAA,UChBlD;EAYA,cAAA,CAAA;GAAA,MAAA;GAAA,MDGc;GAAiB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAM,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAG1B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAyB,YAAA,CAAA;EANrC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAoB,SAErB,CAAC,mBAAmB,MAAM;GAAC,WACzB,CAAC,aAAa,EAAE,gBAAe,CAAE,CAAC;GAAC,UAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEFlD,IAAa,0BAAb,MAAa,wBAAuB;CACvB,QAAQ,MAAM,SAA8B,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAD5C,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAuB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAvB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAuB,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,OAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,UAAA;EAAA,UCdpC;EAqDA,cAAA;GAAA;IAAA,MAAA;IAAA,MDzCc;IAAiB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAe,UAAA;IAAA,QAAA,CAAA,QAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAM,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;CAAA,CAAA;;AAE3C,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAuB,YAAA,CAAA;EALnC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAkB,SAEnB;IAAC;IAAmB;IAAiB;GAAM;GAAC,UAAA;EAAA,CAAA;;;;;;;;;;;AEqBzD,IAAa,uBAAb,MAAa,qBAAoB;CACpB,QAAQ,MAAc,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEzB,KAAK,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,KAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,SAAS,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAC1B,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,cAAc,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAG/B,UAAU,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEpC,cAAc,MAAc,kBAAiB,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAC7C,cAAc,MAAc,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAErC,WAAW,OAAM;CAET,SAAS,UAAU,SAChC,UACH,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,eAAe,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAE5B,UAAU,eAAc;EACvC,MAAM,QAAQ,KAAK,MAAK;EAExB,OAAO,MAAM,SAAS,IAChB,GAAG,MAAM,OAAM,UACf,MAAM,EAAE,EAAE,QAAQ;CAC5B,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,aAAU;EAChB,IAAI,KAAK,SAAQ,GACb;EAGJ,MAAM,SAAS,KAAK,OAAM,CAAE,CAAC;EAE7B,IAAI,OAAO,YACP,OAAO,WAAU;OAEjB,OAAO,MAAK;CAEpB;CAEU,WAAW,OAAY;EAC7B,MAAM,SAAS,MAAM;EACrB,MAAM,EAAE,UAAU,aAAa,YAC3B,CAAC,GAAG,OAAO,SAAS,CAAA,CAAE,GACtB,KAAK,OAAM,GACX,KAAK,QAAO,CAAE;EAIlB,OAAO,QAAQ;EAEf,KAAK,aAAa,IAAI,SAAS,SAAS,CAAC;EAEzC,IAAI,SAAS,QACT,KAAK,SAAS,KAAK,QAAQ;EAG/B,IAAI,SAAS,QACT,KAAK,MAAM,IAAI,QAAQ;CAE/B;CAEU,MAAM,OAAY;EAExB,MAAM,gBAAe;EAErB,KAAK,MAAM,IAAI,CAAA,CAAE;EACjB,KAAK,aAAa,IAAI,KAAK;CAC/B;CAzES,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAoB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAApB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAoB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,IAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,UAAA;EAAA;EAAA,WAFlB,CAAC,aAAa;GAAE;GAAa;EAAS,CAAE,CAAC;EAAC,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,QAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UC/BzD;EAiDA,cAAA;GAAA;IAAA,MAAA;IAAA,MDvBQ;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAAqB,UAAA;IAAA,QAAA,CAAA,iBAAA;IAAA,SAAA,CAAA,uBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACrB;IAAiB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACjB;IAAM,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;CAAA,CAAA;;AAID,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EAXhC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAe,SAEhB;IACL;IACA;IACA;IACA;GACH;GAAA,WACU,CAAC,aAAa;IAAE;IAAa;GAAS,CAAE,CAAC;GAAC,UAAA;EAAA,CAAA;CAoBjD,CAAA;CAAA,gBAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,IAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,UAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,UAAQ,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AErBhB,IAAa,oBAAb,MAAa,kBAAiB;CACT,OAAO,OAAgC,UAAU;CACjD,WAAW,OAAO,eAAe;CAEzC,QAAQ,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEzB,cAAc,MAAc,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CACrC,YAAY,MAAc,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACnC,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGrD,WAAW,MAAM,KAAG;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAe,CAAA;CAGlD,QAAQ,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAGlC,WAAW,OAAM;CAET,SAAS,eAAc;EACpC,MAAM,KAAK,KAAK,MAAK;EAErB,OAAO,KAAK,KAAK,SAAS,IAAI,EAAE,IAAI;CACxC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEM;CAER,cAAA;EACI,IAAI,WAAiC;EAErC,aAAY;GACR,MAAM,QAAQ,KAAK,OAAM;GACzB,MAAM,QAAQ,OAAO,MAAK,KAAM;GAEhC,gBAAe;IACX,MAAM,aAAa,UAAU;IAE7B,WAAW;IAEX,IAAI,CAAC,OACD;IAGJ,IAAI,cAAc,CAAC,SAAS,KAAK,MAAK,GAAI;KACtC,MAAM,MAAM,IAAI,KAAK,MAAK,CAAE;KAE5B;IACJ;IAEA,KAAK,MAAM,IAAI,KAAK;GACxB,CAAC;EACL,CAAC;EAED,OAAO,UAAU,CAAC,CAAC,gBAAgB,aAAa,KAAK,KAAK,CAAC;CAC/D;CAEU,QAAQ,OAAa;EAC3B,KAAK,MAAM,IAAI,KAAK;EACpB,KAAK,OAAM,CAAE,EAAE,MAAM,IAAI,KAAK;EAE9B,aAAa,KAAK,KAAK;EACvB,KAAK,QAAQ,iBAAiB,KAAK,SAAS,KAAK,KAAK,GAAG,KAAK,SAAQ,CAAE;CAC5E;CAEU,QAAK;EACX,IAAI,CAAC,KAAK,MAAK,GACX;EAGJ,aAAa,KAAK,KAAK;EACvB,KAAK,MAAM,IAAI,EAAE;EACjB,KAAK,OAAM,CAAE,EAAE,MAAM,IAAI,EAAE;EAC3B,KAAK,SAAS,KAAK,EAAE;EAErB,KAAK,KAAK,cAAc,cAAc,OAAO,CAAC,EAAE,MAAK;CACzD;CA3ES,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,UAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,QAAA;EAAA,WAHf,CAAC,aAAa;GAAE;GAAqB;EAAS,CAAE,CAAC;EAAC,UAAA;EAAA,UC3BjE;EAuBA,QAAA,CAAA,w+EAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDGc;GAAgB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAM,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;CAAA,CAAA;;AAIzB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAR7B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAW,SAGZ,CAAC,kBAAkB,MAAM;GAAC,WACxB,CAAC,aAAa;IAAE;IAAqB;GAAS,CAAE,CAAC;GAAC,MACvD,EAAE,OAAO,QAAO;GAAE,UAAA;GAAA,QAAA,CAAA,w+EAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEjB5B,IAAa,oBAAb,MAAa,kBAAiB;CACjB,QAAQ,MAAM,SAAmB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEjC,KAAK,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,KAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,OAAO,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACxB,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CALrD,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,IAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,UAAA;EAAA,UCX9B;EA8BA,cAAA,CAAA;GAAA,MAAA;GAAA,MDrBc;GAAmB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA,CAAA,eAAA,uBAAA;EAAA,CAAA;CAAA,CAAA;;AAEpB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAL7B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAW,SAEZ,CAAC,mBAAmB;GAAC,UAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AELlC,MAAa,0BAA0B;CACnC,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;AACD;ACuBV,IAAI,SAAS;AAqBb,IAAa,0BAAb,MAAa,wBAAuB;CACf,WAAW,OAAO,eAAe;CAEzC,SAAS,MAAM,SAAwB,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAGvC,QAAQ,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAElC,QAAQ,MAAe,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAG1B,gBAAgB,MAA8B,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAEzC,WAAW,oBAAoB;CAE/B,UAAoB;CACpB,aAAuB;CAEzB,cAAc,uBAA4B,IAAI,IAAG,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEpD,SAAS,eAAc;EACpC,MAAM,KAAK,KAAK,MAAK;EAErB,OAAO,KAAK,KAAK,SAAS,IAAI,EAAE,IAAI;CACxC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,eAAe,eAC9B,KAAK,OAAM,CAAE,CAAC,QAAO,UAAS,MAAM,MAAM,KAAK,MAAK,CAAE,CAAC,CAAC,QAC3D,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,aAAa,eAAe,KAAK,aAAY,IAAK,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEtD,SAAS,OAAO,QAAQ,CAAC,CAAC;CAGxB,OAAO,OAAO,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEtC,cAAA;EACI,QAAO,cAAY;GACf,MAAM,QAAQ,KAAK,QAAQ,aACvB,eAAe,wBAAwB,KAAK,cAAa,GAAG,EAAG;GAGnE,IAAI,CAAC,OACD;GAGJ,MAAM,YAAY,UACd,KAAK,KAAK,IAAI,MAAM,OAAO;GAE/B,KAAK,KAAK,IAAI,MAAM,OAAO;GAC3B,MAAM,iBAAiB,UAAU,QAAQ;GACzC,gBAAgB,MAAM,oBAAoB,UAAU,QAAQ,CAAC;EACjE,CAAC;EAED,IAAI,WAAiC;EAErC,aAAY;GACR,MAAM,QAAQ,KAAK,OAAM;GACzB,MAAM,UAAU,OAAO,QAAO,KAAM,CAAA;GAEpC,gBAAe;IACX,MAAM,aAAa,UAAU;IAE7B,WAAW;IAEX,IAAI,CAAC,OACD;IAGJ,IAAI,cAAc,KAAK,WAAU,KAAM,CAAC,KAAK,OAAO,OAAO,GAAG;KAC1D,MAAM,QAAQ,IAAI;MACd,GAAG;MACH,GAAG,KAAK,WAAW,KAAK,MAAK,CAAE;KAClC,CAAA;KAED;IACJ;IAEA,KAAK,MAAM,IAAI,OAAO;GAC1B,CAAC;EACL,CAAC;CACL;CAEU,UAAU,OAAiB;EACjC,OAAO,GAAG,KAAK,SAAQ,GAAI,MAAM;CACrC;CAEU,SAAS,OAAmB,QAAuB;EACzD,OAAO,GAAG,KAAK,UAAU,KAAK,EAAC,GAAI;CACvC;CAEU,OAAO,OAAwB;EACrC,OAAO,KAAK,MAAK,CAAE,CAAC,MAAM,OAAO;CACrC;CAEU,KAAK,OAA0B,OAAc;EACnD,KAAK,MAAM,MAAM,IAAI,SAAS,MAAS;CAC3C;CAEU,UACN,OACA,QAAwB;EAExB,MAAM,UAAU,KAAK,MAAK,CAAE,CAAC,MAAM;EAEnC,OAAO,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,OAAO,KAAK;CAClE;CAEU,MACN,OACA,QACA,SAAgB;EAEhB,MAAM,UAAU,KAAK,MAAK,CAAE,CAAC,MAAM;EACnC,MAAM,UAAU,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAA,EAAA,CAAI,QAAO,UAC1D,UAAU,OAAO,KAAK;EAE1B,MAAM,OAAO,UAAU,CAAC,GAAG,QAAQ,OAAO,KAAK,IAAI;EAEnD,KAAK,MAAM,MAAM,IAAI,KAAK,SAAS,OAAO,MAAS;CACvD;CAEU,MAAM,OAA0B;EACtC,OAAQ,KAAK,MAAK,CAAE,CAAC,MAAM,OACvB;GAAE,OAAO;GAAM,KAAK;EAAI;CAChC;CAEU,SAAS,OAA0B;EACzC,IAAI,KAAK,YAAW,CAAE,CAAC,IAAI,MAAM,EAAE,GAC/B,OAAO;EAGX,MAAM,UAAU,KAAK,MAAM,KAAK;EAEhC,IAAI,CAAC,QAAQ,OACT,OAAO;EAGX,MAAM,SAAS,MAAM,WAAW,CAAA,EAAA,CAAI,WAAU,WAAS;GACnD,MAAM,QAAQ,OAAO,MAAK;GAE1B,OAAO,MAAM,UAAU,QAAQ,SAAS,MAAM,QAAQ,QAAQ;EAClE,CAAC;EAED,OAAO,UAAU,KAAK,WAAW;CACrC;CAEU,SAAS,OAA4B,MAAc;EACzD,KAAK,UAAU,MAAM,IAAI,SAAS,QAAQ;EAE1C,IAAI,SAAS,OACT,KAAK,MAAM,MAAM,IAAI,MAAS;OAC3B,IAAI,SAAS,UAChB,KAAK,MAAM,MAAM,IAAI,MAAM,UAAU,KAAK,EAAE,MAAK,CAAE;CAE3D;CAEU,SAAS,OAA4B,OAAgB;EAC3D,KAAK,MAAM,MAAM,IAAI,MAAM,QAAQ,QAAQ,MAAS;CACxD;CAEU,WAAQ;EACd,KAAK,YAAY,oBAAI,IAAI,IAAG,CAAE;EAC9B,KAAK,MAAM,KAAK,WAAW,KAAK,eAAc,CAAE,CAAC;CACrD;CAEQ,UAAU,IAAY,QAAe;EACzC,KAAK,YAAY,QAAO,QAAM;GAC1B,MAAM,OAAO,IAAI,IAAI,GAAG;GAExB,IAAI,QACA,KAAK,IAAI,EAAE;QAEX,KAAK,OAAO,EAAE;GAGlB,OAAO;EACX,CAAC;CACL;CAEQ,MAAM,IAAY,SAAgB;EACtC,MAAM,OAAO,EAAE,GAAG,KAAK,eAAc,EAAE;EAEvC,IAAI,YAAY,QACZ,OAAO,KAAK;OAEZ,KAAK,MAAM;EAGf,KAAK,MAAM,IAAI;CACnB;CAEQ,MAAM,SAAgB;EAC1B,KAAK,MAAM,IAAI,OAAO;EACtB,KAAK,OAAM,CAAE,EAAE,QAAQ,IAAI,OAAO;CACtC;CAEQ,iBAAc;EAClB,OAAO,KAAK,OAAM,CAAE,EAAE,QAAO,KAAM,KAAK,MAAK;CACjD;CAEQ,WAAW,SAAgB;EAC/B,MAAM,MAAM,IAAI,IAAI,KAAK,OAAM,CAAE,CAAC,KAAI,UAAS,MAAM,EAAE,CAAC;EAExD,OAAO,OAAO,YACV,OAAO,QAAQ,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;CAE7D;CAEQ,WAAW,SAAgB;EAC/B,MAAM,MAAM,IAAI,IAAI,KAAK,OAAM,CAAE,CAAC,KAAI,UAAS,MAAM,EAAE,CAAC;EAExD,OAAO,OAAO,YACV,OAAO,QAAQ,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;CAE9D;CAEQ,OAAO,SAAgB;EAC3B,OAAO,OAAO,KAAK,KAAK,WAAW,OAAO,CAAC,CAAC,CAAC,SAAS;CAC1D;CA5NS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAuB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAvB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAuB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,MAAA,EAAA,gBAAA,QAAA;EAAA,UAAA;EAAA,UCtDpC;EAsLA,QAAA,CAAA,0jEAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MD1IQ;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAAiB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACjB;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAAiB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACjB;IAAmB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,eAAA,uBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACnB;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,eAAA,uBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAA0B,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,aAAA;GAAA;EAAA;CAAA,CAAA;;AAIrB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAuB,YAAA,CAAA;EAfnC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAkB,SAGnB;IACL;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,MACK,EAAE,OAAO,QAAO;GAAE,UAAA;GAAA,QAAA,CAAA,0jEAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEzB5B,IAAa,sBAAb,MAAa,oBAAmB;CACX,WAAW,OAAO,qBAAqB,EAAE,UAAU,KAAI,CAAE;CAEjE,OAAO,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAG/B,SAAS,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAC1B,MAAM,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CAEhC,QAAQ,MAA0B,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAE3B,YAAY,eAC3B,KAAK,MAAK,CAAE,CAAC,KAAI,SAAO;EACpB,IAAI,aAAa,MACb,OAAO;EAGX,IAAI,cAAc,MACd,OAAO;GACH,GAAG;GACH,UAAU,KAAK,SAAS,KAAI,UAAS,KAAK,QAAQ,KAAK,CAAC;EAC3D;EAGL,OAAO,KAAK,QAAQ,IAAI;CAC5B,CAAC,GACJ,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAES,UAAU,MAAsB;EACtC,OAAO,aAAa;CACxB;CAEU,MAAM,MAAsB;EAClC,OAAO,cAAc,OAAO,OAAO;CACvC;CAEU,OAAO,MAAsB;EACnC,OAAO,aAAa,OAAO,OAAO;CACtC;CAEQ,QAAQ,MAAwB;EACpC,OAAO;GACH,GAAG;GACH,eAAc;IACV,KAAK,UAAU,MAAK;IACpB,KAAK,QAAO;GAChB;EACH;CACL;CAhDS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UC3BhC;EAyDA,QAAA,CAAA,g0JAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MDpCQ;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAAe,UAAA;IAAA,QAAA,CAAA,QAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACf;IAAiB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACjB;IAAM,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;CAAA,CAAA;;AAGD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAX/B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAc,SAGf;IACL;IACA;IACA;IACA;GACH;GAAA,UAAA;GAAA,QAAA,CAAA,g0JAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEHL,MAAa,kBAAkB,IAAI,eAA8B,mBAAmB;CAChF,YAAY;CACZ,gBAAgB,EAAE,YAAY,WAAU;AAC3C,CAAA;AAED,MAAM,cAA4C;CAAC;CAAU;CAAS;AAAM;AAiB5E,IAAa,iBAAb,MAAa,eAAc;CACN,WAAW,OAAO,QAAQ;CAC1B,aAAa,OAAO,eAAe,CAAC,CAAC;CACrC,QAAQ,KAAK,SAAS,aAAa,aAAa,8BAA8B;CAEtF,aAAa,OAA0B,KAAK,OAAM,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAE7C,aAAa,OAAO,KAAK,OAAO,WAAW,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEzD,SAAS,eAAc;EAC5B,MAAM,aAAa,KAAK,WAAU;EAElC,OAAO,eAAe,UAAW,eAAe,YAAY,KAAK,WAAU;CAC/E,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEF,cAAA;EACI,MAAM,YAAY,UAA+B,KAAK,WAAW,IAAI,MAAM,OAAO;EAElF,KAAK,OAAO,iBAAiB,UAAU,QAAQ;EAC/C,OAAO,UAAU,CAAC,CAAC,gBAAgB,KAAK,OAAO,oBAAoB,UAAU,QAAQ,CAAC;EAEtF,aAAY;GACR,MAAM,OAAO,KAAK,SAAS;GAC3B,MAAM,OAAO,KAAK,OAAM;GAExB,KAAK,UAAU,OAAO,QAAQ,IAAI;GAClC,KAAK,MAAM,cAAc,OAAO,SAAS;EAC7C,CAAC;EAED,aAAY;GACR,MAAM,aAAa,KAAK,WAAU;GAElC,IAAI;IACA,KAAK,SAAS,aAAa,aAAa,QAAQ,KAAK,YAAY,UAAU;GAC/E,QAAQ,CAER;EACJ,CAAC;CACL;CAEQ,SAAM;EACV,IAAI;GACA,MAAM,QAAQ,KAAK,SAAS,aAAa,aAAa,QAAQ,KAAK,UAAU;GAE7E,OAAO,YAAY,SAAS,KAA0B,IAAI,QAA6B;EAC3F,QAAQ;GACJ,OAAO;EACX;CACJ;CAhDS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAd,OAAA,QAAA,GAAA,sBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,YADD;CAAM,CAAA;;AACnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAc,YAAA,CAAA;EAD1B,MAAA;EAAW,MAAA,CAAA,EAAE,YAAY,OAAM,CAAE;;;;AAoDlC,SAAgB,eAAe,SAAiC,CAAA,GAAE;CAC9D,OAAO,yBAAyB,CAC5B;EAAE,SAAS;EAAiB,UAAU;GAAE,YAAY;GAAY,GAAG;EAAM;CAAE,GAC3E,4BAA2B;EACvB,OAAO,cAAc;CACzB,CAAC,CACJ,CAAA;AACL;AClFA,IAAa,yBAAb,MAAa,uBAAsB;CACZ,QAAQ,OAAO,cAAc;CAEvC,YAAY,MAAc,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAElC,OAAO,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,OAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAEvC,UAAgD;EAC/D;GAAE,OAAO;GAAU,OAAO;EAAQ;EAClC;GAAE,OAAO;GAAS,OAAO;EAAO;EAChC;GAAE,OAAO;GAAQ,OAAO;EAAM;CACjC;CAXQ,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAsB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAtB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAsB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,YAAA,EAAA,eAAA,SAAA,EAAA;EAAA,UAAA;EAAA,UATrB;;;;;;;;EAOT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MATS;GAAoB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA,CAAA,aAAA;EAAA,CAAA;CAAA,CAAA;;AAWrB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAsB,YAAA,CAAA;EAblC,MAAA;EAAU,MAAA,CAAA;GACP,UAAU;GACV,SAAS,CAAC,oBAAoB;GAC9B,MAAM,EAAE,iBAAiB,SAAQ;GACjC,UAAU;;;;;;;;EAQb,CAAA"}
|
|
1
|
+
{"version":3,"file":"area8975-ui.mjs","names":[],"sources":["../../../projects/ui/src/lib/format/privacy.ts","../../../projects/ui/src/lib/format/format.ts","../../../projects/ui/src/lib/theme/dark-class.ts","../../../projects/ui/src/lib/charts/chart/chart.palette.ts","../../../projects/ui/src/lib/charts/chart/axis-chart.base.ts","../../../projects/ui/src/lib/charts/chart/chart.options.ts","../../../projects/ui/src/lib/generic/skeleton/skeleton.component.ts","../../../projects/ui/src/lib/generic/skeleton/skeleton.component.html","../../../projects/ui/src/lib/charts/chart-legend/chart-legend.component.ts","../../../projects/ui/src/lib/charts/chart-legend/chart-legend.component.html","../../../projects/ui/src/lib/charts/chart/chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-table.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.component.ts","../../../projects/ui/src/lib/charts/bar-chart/bar-chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.template.html","../../../projects/ui/src/lib/charts/bar-chart/bar-chart.types.ts","../../../projects/ui/src/lib/charts/line-chart/line-chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.template.html","../../../projects/ui/src/lib/charts/line-chart/line-chart.types.ts","../../../projects/ui/src/lib/charts/pie-chart/pie-chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.template.html","../../../projects/ui/src/lib/charts/pie-chart/pie-chart.types.ts","../../../projects/ui/src/lib/forms/checkbox/checkbox.component.ts","../../../projects/ui/src/lib/forms/checkbox/checkbox.component.html","../../../projects/ui/src/lib/forms/file/file.utils.ts","../../../projects/ui/src/lib/forms/dropzone/dropzone.component.ts","../../../projects/ui/src/lib/forms/dropzone/dropzone.component.html","../../../projects/ui/src/lib/forms/field/field.component.ts","../../../projects/ui/src/lib/forms/field/field.component.html","../../../projects/ui/src/lib/forms/file/file.types.ts","../../../projects/ui/src/lib/forms/input/input.component.ts","../../../projects/ui/src/lib/forms/input/input.component.html","../../../projects/ui/src/lib/forms/input/input.types.ts","../../../projects/ui/src/lib/forms/input-addon/input-addon.component.ts","../../../projects/ui/src/lib/forms/input-group/input-group.component.ts","../../../projects/ui/src/lib/forms/radio/radio.component.ts","../../../projects/ui/src/lib/forms/radio/radio.component.html","../../../projects/ui/src/lib/generic/badge/badge.component.ts","../../../projects/ui/src/lib/generic/badge/badge.component.html","../../../projects/ui/src/lib/generic/card/card.types.ts","../../../projects/ui/src/lib/generic/card/card.component.ts","../../../projects/ui/src/lib/layout/overlay/overlay.positioner.ts","../../../projects/ui/src/lib/layout/overlay/overlay.stack.ts","../../../projects/ui/src/lib/layout/overlay/overlay.component.ts","../../../projects/ui/src/lib/generic/dropdown/dropdown.directives.ts","../../../projects/ui/src/lib/generic/dropdown/dropdown.component.ts","../../../projects/ui/src/lib/generic/dropdown/dropdown.component.html","../../../projects/ui/src/lib/forms/select/select.component.ts","../../../projects/ui/src/lib/forms/select/select.component.html","../../../projects/ui/src/lib/forms/select/select.datasource.ts","../../../projects/ui/src/lib/forms/select/select.types.ts","../../../projects/ui/src/lib/forms/textarea/textarea.component.ts","../../../projects/ui/src/lib/forms/textarea/textarea.component.html","../../../projects/ui/src/lib/forms/textarea/textarea.types.ts","../../../projects/ui/src/lib/generic/alert/alert.component.ts","../../../projects/ui/src/lib/generic/alert/alert.component.html","../../../projects/ui/src/lib/generic/alert/alert.types.ts","../../../projects/ui/src/lib/generic/avatar/avatar.component.ts","../../../projects/ui/src/lib/generic/avatar/avatar.component.html","../../../projects/ui/src/lib/generic/avatar/avatar.types.ts","../../../projects/ui/src/lib/generic/badge/badge.types.ts","../../../projects/ui/src/lib/generic/button/button.component.ts","../../../projects/ui/src/lib/generic/button/button.component.html","../../../projects/ui/src/lib/generic/button/button.types.ts","../../../projects/ui/src/lib/generic/button-group/button-group.component.ts","../../../projects/ui/src/lib/generic/calendar/calendar.utils.ts","../../../projects/ui/src/lib/generic/calendar/calendar.component.ts","../../../projects/ui/src/lib/generic/calendar/calendar.component.html","../../../projects/ui/src/lib/generic/calendar/calendar.types.ts","../../../projects/ui/src/lib/generic/card-header/card-header.component.ts","../../../projects/ui/src/lib/generic/card-header/card-header.component.html","../../../projects/ui/src/lib/generic/card-header/card-header.types.ts","../../../projects/ui/src/lib/generic/container/container.component.ts","../../../projects/ui/src/lib/presets/modal-close-btn/modal-close-btn.component.ts","../../../projects/ui/src/lib/presets/modal-close-btn/modal-close-btn.component.html","../../../projects/ui/src/lib/generic/drawer/drawer.component.ts","../../../projects/ui/src/lib/generic/drawer/drawer.component.html","../../../projects/ui/src/lib/generic/tooltip/tooltip.component.ts","../../../projects/ui/src/lib/generic/tooltip/tooltip.component.html","../../../projects/ui/src/lib/generic/kpi/kpi.component.ts","../../../projects/ui/src/lib/generic/kpi/kpi.component.html","../../../projects/ui/src/lib/generic/loading/loading.component.ts","../../../projects/ui/src/lib/generic/loading/loading.component.html","../../../projects/ui/src/lib/generic/loading/loading.types.ts","../../../projects/ui/src/lib/generic/modal/modal.component.ts","../../../projects/ui/src/lib/generic/modal/modal.component.html","../../../projects/ui/src/lib/generic/money/money.component.ts","../../../projects/ui/src/lib/generic/money/money.component.html","../../../projects/ui/src/lib/generic/money/money.types.ts","../../../projects/ui/src/lib/generic/pagination/pagination.component.ts","../../../projects/ui/src/lib/generic/pagination/pagination.component.html","../../../projects/ui/src/lib/generic/private/private.component.ts","../../../projects/ui/src/lib/generic/private/private.component.html","../../../projects/ui/src/lib/generic/progress/progress.component.ts","../../../projects/ui/src/lib/generic/progress/progress.component.html","../../../projects/ui/src/lib/generic/progress/progress.types.ts","../../../projects/ui/src/lib/generic/segmented/segmented.component.ts","../../../projects/ui/src/lib/generic/segmented/segmented.component.html","../../../projects/ui/src/lib/generic/skeleton/skeleton.types.ts","../../../projects/ui/src/lib/generic/stat/stat.component.ts","../../../projects/ui/src/lib/generic/stat/stat.component.html","../../../projects/ui/src/lib/generic/tab/tab.directive.ts","../../../projects/ui/src/lib/generic/tab/tab.component.ts","../../../projects/ui/src/lib/generic/tab/tab.component.html","../../../projects/ui/src/lib/generic/table/table.registry.ts","../../../projects/ui/src/lib/generic/table/table.component.ts","../../../projects/ui/src/lib/generic/table/table.component.html","../../../projects/ui/src/lib/generic/table/table.datasource.ts","../../../projects/ui/src/lib/generic/toast/toast.component.ts","../../../projects/ui/src/lib/generic/toast/toast.component.html","../../../projects/ui/src/lib/generic/toast/toast.service.ts","../../../projects/ui/src/lib/generic/toast/toast.types.ts","../../../projects/ui/src/lib/generic/toaster/toaster.component.ts","../../../projects/ui/src/lib/generic/toaster/toaster.component.html","../../../projects/ui/src/lib/generic/toaster/toaster.types.ts","../../../projects/ui/src/lib/layout/layout/layout.component.ts","../../../projects/ui/src/lib/layout/layout/layout.component.html","../../../projects/ui/src/lib/layout/sidebar/sidebar.component.ts","../../../projects/ui/src/lib/layout/sidebar/sidebar.component.html","../../../projects/ui/src/lib/layout/sidebar-group/sidebar-group.component.ts","../../../projects/ui/src/lib/layout/sidebar-group/sidebar-group.component.html","../../../projects/ui/src/lib/layout/sidebar-item/sidebar-item.component.ts","../../../projects/ui/src/lib/layout/sidebar-item/sidebar-item.component.html","../../../projects/ui/src/lib/presets/colour/colour.component.ts","../../../projects/ui/src/lib/presets/colour/colour.component.html","../../../projects/ui/src/lib/presets/counter/counter.component.ts","../../../projects/ui/src/lib/presets/counter/counter.component.html","../../../projects/ui/src/lib/presets/date-range-picker/date-range-picker.component.ts","../../../projects/ui/src/lib/presets/date-range-picker/date-range-picker.component.html","../../../projects/ui/src/lib/presets/date-range-picker/date-range-presets.ts","../../../projects/ui/src/lib/presets/time-select/time-select.component.ts","../../../projects/ui/src/lib/presets/time-select/time-select.component.html","../../../projects/ui/src/lib/presets/datepicker/datepicker.component.ts","../../../projects/ui/src/lib/presets/datepicker/datepicker.component.html","../../../projects/ui/src/lib/presets/dropdown-button/dropdown-button.component.ts","../../../projects/ui/src/lib/presets/dropdown-button/dropdown-button.component.html","../../../projects/ui/src/lib/presets/dropdown-menu/dropdown-menu.component.ts","../../../projects/ui/src/lib/presets/dropdown-menu/dropdown-menu.component.html","../../../projects/ui/src/lib/presets/file-input/file-input.component.ts","../../../projects/ui/src/lib/presets/file-input/file-input.component.html","../../../projects/ui/src/lib/presets/search/search.component.ts","../../../projects/ui/src/lib/presets/search/search.component.html","../../../projects/ui/src/lib/presets/switch/switch.component.ts","../../../projects/ui/src/lib/presets/switch/switch.component.html","../../../projects/ui/src/lib/presets/table-filters/table-filters.types.ts","../../../projects/ui/src/lib/presets/table-filters/table-filters.component.ts","../../../projects/ui/src/lib/presets/table-filters/table-filters.component.html","../../../projects/ui/src/lib/presets/user-menu/user-menu.component.ts","../../../projects/ui/src/lib/presets/user-menu/user-menu.component.html","../../../projects/ui/src/lib/theme/theme.ts","../../../projects/ui/src/lib/theme/theme-switch.component.ts"],"sourcesContent":["import {\n inject,\n InjectionToken,\n type Provider,\n type Signal,\n signal\n} from '@angular/core';\n\n\nexport const UiPrivacies = [\n 'visible',\n 'discreet',\n 'hidden'\n] as const;\n\n/** Discreet hides amounts but keeps their shape, hidden hides everything about them. */\nexport type UiPrivacy = typeof UiPrivacies[number];\n\nexport const UI_PRIVACY = new InjectionToken<Signal<UiPrivacy>>('UI_PRIVACY', {\n providedIn: 'root',\n factory: () => signal<UiPrivacy>('visible').asReadonly()\n});\n\n/** The factory runs in an injection context, so it can return a signal from an app service. */\nexport function provideUiPrivacy(privacy: () => Signal<UiPrivacy>): Provider {\n return {\n provide: UI_PRIVACY,\n useFactory: privacy\n };\n}\n\n// #region Privacy\n\n/** The fixed mask for private text, e.g. a transaction's description. */\nexport const PRIVATE_TEXT_MASK = '- - -';\n\n/** What screen readers hear in place of private text. */\nexport const PRIVATE_TEXT_LABEL = 'text hidden';\n\nconst PRIVACY_MASK = ` ${PRIVATE_TEXT_MASK}`;\n\nexport function maskMoney(currency: string, locale: string): string {\n return new Intl.NumberFormat(locale, { style: 'currency', currency })\n .formatToParts(0)\n .map(part =>\n part.type === 'currency' || part.type === 'literal'\n ? part.value\n : PRIVACY_MASK\n )\n .filter((value, index, values) =>\n value !== PRIVACY_MASK || values[index - 1] !== PRIVACY_MASK\n )\n .join('');\n}\n\nexport interface PrivateTextFormatter {\n /** The text, or `PRIVATE_TEXT_MASK`. For visible attributes like `title`. */\n (text: string | null | undefined): string;\n\n /** The text, or `PRIVATE_TEXT_LABEL`. For `aria-*`, so screen readers don't read out dashes. */\n label: (text: string | null | undefined) => string;\n}\n\n/** Needs an injection context. Reads `UI_PRIVACY` on every call, so a template or computed calling it follows the mode. */\nexport function injectPrivateText(): PrivateTextFormatter {\n const privacy = inject(UI_PRIVACY);\n\n const replace = (text: string | null | undefined, replacement: string) =>\n !text ? text ?? '' : privacy() === 'visible' ? text : replacement;\n\n return Object.assign(\n (text: string | null | undefined) => replace(text, PRIVATE_TEXT_MASK),\n { label: (text: string | null | undefined) => replace(text, PRIVATE_TEXT_LABEL) }\n );\n}\n// #endregion\n","import { inject, InjectionToken, type Provider } from '@angular/core';\n\nimport { maskMoney, UI_PRIVACY } from './privacy';\n\n\nexport interface UiFormat {\n /** ISO 4217 code, e.g. \"GBP\". */\n currency: string;\n\n /** BCP 47 tag, e.g. \"en-GB\". */\n locale: string;\n}\n\nexport const UI_FORMAT_DEFAULTS: UiFormat = {\n currency: 'GBP',\n locale: 'en-GB'\n};\n\nexport const UI_FORMAT = new InjectionToken<UiFormat>('UI_FORMAT', {\n providedIn: 'root',\n factory: () => UI_FORMAT_DEFAULTS\n});\n\nexport function provideUiFormat(format: Partial<UiFormat>): Provider {\n return {\n provide: UI_FORMAT,\n useValue: { ...UI_FORMAT_DEFAULTS, ...format }\n };\n}\n\nconst MONEY = Symbol('money');\n\nexport interface MoneyFormatterParts {\n format: (value: number) => string;\n mask: string;\n}\n\n/** The unmasked formatter and mask behind a formatter from `injectMoneyFormatter`, null for any other function. */\nexport function moneyFormatterParts(formatter: (value: number) => string): MoneyFormatterParts | null {\n return (formatter as { [MONEY]?: MoneyFormatterParts })[MONEY] ?? null;\n}\n\n/** Needs an injection context. Reads `UI_PRIVACY` on every call, so a template or computed calling it follows the mode. */\nexport function injectMoneyFormatter(\n options: Intl.NumberFormatOptions = {}\n): (value: number) => string {\n const { currency, locale } = inject(UI_FORMAT);\n const privacy = inject(UI_PRIVACY);\n const formatter = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n ...options\n });\n const resolved = formatter.resolvedOptions();\n const mask = maskMoney(resolved.currency ?? currency, resolved.locale);\n\n const format = (value: number) => formatter.format(value);\n\n return Object.assign(\n (value: number) => privacy() === 'visible' ? format(value) : mask,\n { [MONEY]: { format, mask } }\n );\n}\n","import { DOCUMENT } from '@angular/common';\nimport { DestroyRef, inject, Injectable, signal } from '@angular/core';\n\n\n@Injectable({ providedIn: 'root' })\nexport class UiDarkClass {\n readonly isDark = signal(false);\n\n constructor() {\n const root = inject(DOCUMENT).documentElement;\n const read = () => this.isDark.set(root.classList.contains('dark'));\n\n read();\n\n if (typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver(read);\n\n observer.observe(root, { attributes: true, attributeFilter: ['class'] });\n inject(DestroyRef).onDestroy(() => observer.disconnect());\n }\n}\n","/**\n * Categorical colours for chart series, in a fixed order that was checked for\n * colour blindness (adjacent pairs stay apart for protan, deutan and tritan).\n * Keep the order, a series takes the next slot, never a generated colour.\n */\nexport const CHART_PALETTE = [\n '#2a78d6', // blue\n '#eb6834', // orange\n '#1baf7a', // aqua\n '#eda100', // yellow\n '#e87ba4', // magenta\n '#008300', // green\n '#4a3aa7', // violet\n '#e34948' // red\n] as const;\n\n/** Violet and green are lightened to keep 3:1 contrast on a dark card. */\nexport const CHART_PALETTE_DARK = [\n '#2a78d6', // blue\n '#eb6834', // orange\n '#1baf7a', // aqua\n '#eda100', // yellow\n '#e87ba4', // magenta\n '#2e9e2e', // green\n '#8a7cf0', // violet\n '#e34948' // red\n] as const;\n\n/** Past eight series, fold the rest into \"Other\" instead of reusing a colour. */\nexport const CHART_MAX_SERIES = CHART_PALETTE.length;\n\n/** Lines can go to sixteen, the second eight reuse the colours dashed. */\nexport const CHART_MAX_LINE_SERIES = CHART_PALETTE.length * 2;\n\n/** Chart chrome, apex needs real colours so these can't be CSS variables. */\nexport interface ChartInk {\n text: string;\n muted: string;\n grid: string;\n surface: string;\n\n context: string;\n}\n\nexport const CHART_INK: ChartInk = {\n text: '#1e2939', // gray-800\n muted: '#6a7282', // gray-500\n grid: '#e5e7eb', // gray-200\n surface: '#ffffff',\n context: '#d1d5dc' // gray-300\n};\n\nexport const CHART_INK_DARK: ChartInk = {\n text: '#e5e5e5', // neutral-200\n muted: '#a1a1a1', // neutral-400\n grid: '#404040', // neutral-700\n surface: '#262626', // neutral-800\n context: '#525252' // neutral-600\n};\n\nexport function chartInk(dark: boolean): ChartInk {\n return dark ? CHART_INK_DARK : CHART_INK;\n}\n\nexport interface ChartSeriesStyle {\n colour: string;\n dashed: boolean;\n}\n\n/** Past the eighth slot a series goes grey, reusing a colour would make two series look the same. */\nexport function chartColour(index: number, dark = false): string {\n return (dark ? CHART_PALETTE_DARK : CHART_PALETTE)[index] ?? chartInk(dark).context;\n}\n\n/**\n * Colour plus line style for a slot. With `dashes` the ninth to sixteenth\n * slots reuse the colours as dashed lines, colour and dash together keep\n * them apart. Anything past that is grey.\n */\nexport function chartSeriesStyle(index: number, dashes: boolean, dark = false): ChartSeriesStyle {\n if (dashes && index >= CHART_PALETTE.length && index < CHART_MAX_LINE_SERIES) {\n return { colour: chartColour(index - CHART_PALETTE.length, dark), dashed: true };\n }\n\n return { colour: chartColour(index, dark), dashed: false };\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n inject,\n input,\n signal\n} from '@angular/core';\n\nimport { moneyFormatterParts, UI_FORMAT } from '../../format/format';\nimport { maskMoney, UI_PRIVACY, type UiPrivacy } from '../../format/privacy';\nimport { UiDarkClass } from '../../theme/dark-class';\nimport type {\n ChartLegendItem,\n ChartLegendPosition,\n ChartLegendSource\n} from '../chart-legend/chart-legend.types';\nimport {\n chartInk,\n type ChartSeriesStyle,\n chartSeriesStyle\n} from './chart.palette';\nimport type {\n ChartHeight,\n ChartOptions,\n ChartSeries,\n ChartValueFormatter\n} from './chart.types';\n\n\n/** Inputs every chart with categories along one axis and values up the other shares. */\n@Directive()\nexport abstract class UiAxisChartBase implements ChartLegendSource {\n protected readonly uiFormat = inject(UI_FORMAT);\n private readonly privacy = inject(UI_PRIVACY);\n\n protected readonly dark = inject(UiDarkClass).isDark;\n protected readonly ink = computed(() => chartInk(this.dark()));\n\n readonly series = input.required<ChartSeries[]>();\n readonly categories = input.required<string[]>();\n\n /** Says what the chart shows, e.g. \"Spending by month\". */\n readonly ariaLabel = input.required<string>();\n\n readonly height = input<ChartHeight>(300);\n\n /** Used on the value axis, the tooltip and the table, e.g. to show money. */\n readonly valueFormatter = input<ChartValueFormatter>(numberFormatter(this.uiFormat.locale));\n\n /** Masks the values in privacy mode. Defaults to whether `valueFormatter` came from `injectMoneyFormatter`. */\n readonly sensitive = input<boolean | undefined, unknown>(undefined, {\n transform: value => value === undefined ? undefined : booleanAttribute(value)\n });\n\n /** Heading for the category column in the data table. */\n readonly categoryLabel = input<string>('Category');\n\n readonly loading = input(false, { transform: booleanAttribute });\n readonly emptyText = input<string>('No data to show');\n\n /** Shows the data table under the chart instead of only to screen readers. */\n readonly showTable = input(false, { transform: booleanAttribute });\n\n /** Raw ApexCharts options merged over the defaults, for anything not covered here. */\n readonly options = input<ChartOptions | null>(null);\n\n /**\n * Only these series get palette colours, the rest go grey so the few that\n * matter stand out. The way to show more series than there are colours.\n */\n readonly highlight = input<string[] | null>(null);\n\n readonly highlightKeepsColours = input(false, { transform: booleanAttribute });\n\n /** `none` leaves the legend out, for when a `ui-chart-legend` is linked with `for`. */\n readonly legend = input<ChartLegendPosition>('auto');\n\n /** Series switched off in the legend. */\n readonly hiddenSeries = signal<string[]>([]);\n\n /** The series the legend is pointing at, the others fade while it's set. */\n readonly emphasis = signal<string | null>(null);\n\n /** Charts that draw lines can tell series apart by dashes too, bars can't. */\n protected readonly supportsDashes: boolean = false;\n\n private readonly money = computed(() => moneyFormatterParts(this.valueFormatter()));\n\n protected readonly privacyMode = computed<UiPrivacy>(() =>\n this.sensitive() ?? !!this.money() ? this.privacy() : 'visible'\n );\n\n protected readonly masked = computed(() => this.privacyMode() !== 'visible');\n protected readonly concealed = computed(() => this.privacyMode() === 'hidden');\n\n protected readonly displayFormatter = computed<ChartValueFormatter>(() => {\n const money = this.money();\n\n if (!this.masked()) {\n return money?.format ?? this.valueFormatter();\n }\n\n const mask = money?.mask ?? maskMoney(this.uiFormat.currency, this.uiFormat.locale);\n\n return () => mask;\n });\n\n protected readonly apexHeight = computed(() => {\n const height = this.height();\n\n return height === 'fill' ? '100%' : height;\n });\n\n protected readonly isEmpty = computed(() =>\n !this.series().some(item => item.data.some(value => value !== null))\n );\n\n protected readonly isMuted = computed(() => {\n const highlight = this.highlight();\n\n return this.series().map(item =>\n !!highlight && !highlight.includes(item.name)\n );\n });\n\n // highlighted series take slots in the order they're highlighted, so colours don't depend on data order\n private readonly colourOrder = computed(() =>\n this.highlightKeepsColours() ? null : this.highlight()\n );\n\n protected readonly styles = computed<ChartSeriesStyle[]>(() => {\n const order = this.colourOrder();\n const muted = this.isMuted();\n\n return this.series().map((item, index) => {\n const dashed = this.supportsDashes && !!item.dashed;\n\n if (muted[index]) {\n return { colour: this.ink().context, dashed };\n }\n\n const style = chartSeriesStyle(\n order ? order.indexOf(item.name) : index,\n this.supportsDashes,\n this.dark()\n );\n\n return {\n colour: item.colour ?? style.colour,\n dashed: style.dashed || dashed\n };\n });\n });\n\n protected readonly colours = computed(() =>\n this.styles().map(style => style.colour)\n );\n protected readonly dashed = computed(() =>\n this.styles().map(style => style.dashed)\n );\n\n /** Grey context series stay out of the legend, the note says how many there are. */\n readonly legendItems = computed<ChartLegendItem[]>(() => {\n const order = this.colourOrder();\n const items = this.series()\n .map((item, index) => ({\n name: item.name,\n ...this.styles()[index]\n }))\n .filter((_, index) => !this.isMuted()[index]);\n\n return order\n ? items.sort((a, b) =>\n order.indexOf(a.name) - order.indexOf(b.name)\n )\n : items;\n });\n\n readonly legendNote = computed(() => {\n const count = this.isMuted().filter(Boolean).length;\n\n return count ? `${count} more in grey` : '';\n });\n\n protected formatValue(value: number | null | undefined): string {\n return value === null || value === undefined\n ? '-'\n : this.displayFormatter()(value);\n }\n}\n\nfunction numberFormatter(locale: string): ChartValueFormatter {\n const formatter = new Intl.NumberFormat(locale);\n\n return value => formatter.format(value);\n}\n","import type { ChartInk } from './chart.palette';\nimport type { ChartOptions } from './chart.types';\n\n\n/** Axis text, muted so it sits behind the data. */\nexport function chartAxisLabels(ink: ChartInk) {\n return { style: { colors: ink.muted, fontSize: '12px' } };\n}\n\nexport interface ChartTooltipRow {\n colour: string;\n name: string;\n\n /** Left out in privacy mode, the row keeps its swatch and name. */\n value?: string;\n dashed?: boolean;\n}\n\n/** Defaults every chart starts from, quiet chrome so the data does the talking. */\nexport function baseChartOptions(ink: ChartInk): ChartOptions {\n const labels = chartAxisLabels(ink);\n\n return {\n chart: {\n fontFamily: 'inherit',\n foreColor: ink.muted,\n parentHeightOffset: 0,\n redrawOnParentResize: true,\n toolbar: { show: false },\n zoom: { enabled: false },\n animations: { enabled: true, speed: 300 }\n },\n dataLabels: { enabled: false },\n // apex fades fills and lines to 85% by default, which washes the palette out\n fill: { type: 'solid', opacity: 1 },\n grid: {\n borderColor: ink.grid,\n strokeDashArray: 0,\n padding: { top: 0, right: 8, bottom: 0, left: 8 }\n },\n // ui-chart-legend draws the legend, apex's own stays off\n legend: { show: false },\n xaxis: {\n axisBorder: { show: true, color: ink.grid },\n axisTicks: { show: false },\n labels\n },\n yaxis: {\n axisBorder: { show: false },\n axisTicks: { show: false },\n labels\n },\n states: {\n hover: { filter: { type: 'lighten' } },\n active: { filter: { type: 'none' } }\n }\n };\n}\n\n/** Plain objects merge key by key, arrays and everything else replace. */\nexport function mergeChartOptions(base: ChartOptions, overrides: ChartOptions | null): ChartOptions {\n return overrides ? deepMerge(base, overrides) as ChartOptions : base;\n}\n\nexport function chartTooltipHtml(\n title: string,\n rows: ChartTooltipRow[],\n footer = '',\n total?: { name: string; value: string }\n): string {\n const items = rows.map(row => `\n <div class=\"ui-chart-tooltip-row ui-text-body-alt\">\n <span\n class=\"ui-chart-tooltip-dot${row.dashed ? ' ui-chart-tooltip-dot--dashed' : ''}\"\n style=\"--ui-chart-tooltip-colour: ${escapeHtml(row.colour)}\"\n ></span>\n <span class=\"ui-chart-tooltip-name\">${escapeHtml(row.name)}</span>\n ${row.value === undefined ? '' : `<span class=\"ui-chart-tooltip-value\">${escapeHtml(row.value)}</span>`}\n </div>\n `).join('');\n\n return `\n <div class=\"ui-chart-tooltip\">\n ${title ? `<div class=\"ui-chart-tooltip-title ui-text-caption\">${escapeHtml(title)}</div>` : ''}\n ${items}\n ${total ? `\n <div class=\"ui-chart-tooltip-row ui-chart-tooltip-total ui-text-body-alt\">\n <span class=\"ui-chart-tooltip-name\">${escapeHtml(total.name)}</span>\n <span class=\"ui-chart-tooltip-value\">${escapeHtml(total.value)}</span>\n </div>\n ` : ''}\n ${footer ? `<div class=\"ui-chart-tooltip-footer ui-text-caption\">${escapeHtml(footer)}</div>` : ''}\n </div>\n `;\n}\n\n// tooltip HTML is built from data, so anything that came from outside gets escaped\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction deepMerge(base: unknown, overrides: unknown): unknown {\n if (!isPlainObject(base) || !isPlainObject(overrides)) {\n return overrides === undefined ? base : overrides;\n }\n\n const merged: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(overrides)) {\n merged[key] = deepMerge(base[key], value);\n }\n\n return merged;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n numberAttribute\n} from '@angular/core';\n\nimport type { SkeletonShape } from './skeleton.types';\n\n\n/**\n * A placeholder shown while content loads. Size it with classes on the\n * element, e.g. `class=\"w-48\"` for text or `class=\"size-12\"` for a circle.\n */\n@Component({\n selector: 'ui-skeleton',\n templateUrl: './skeleton.component.html',\n styleUrl: './skeleton.component.css',\n host: {\n // purely visual, the loading region should set aria-busy instead\n 'aria-hidden': 'true',\n '[class]': 'generatedClasses()'\n }\n})\nexport class UiSkeletonComponent {\n readonly shape = input<SkeletonShape>('text');\n readonly animated = input(true, { transform: booleanAttribute });\n\n /** Text only, stacks this many lines with a shorter last one. */\n readonly lines = input(1, { transform: numberAttribute });\n\n protected readonly lineIndexes = computed(() =>\n Array.from(\n { length: Math.max(1, Math.floor(this.lines())) },\n (_, index) => index\n )\n );\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-skeleton',\n `ui-skeleton--${this.shape()}`,\n this.animated() ? 'ui-skeleton--animated' : ''\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","@if (shape() === 'text') {\n @for (index of lineIndexes(); track index) {\n <span class=\"ui-skeleton-line\"></span>\n }\n} @else {\n <span class=\"ui-skeleton-block\"></span>\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n model,\n output,\n signal,\n untracked\n} from '@angular/core';\n\nimport type { ChartLegendItem, ChartLegendSource } from './chart-legend.types';\n\n\n/**\n * A row of colour keys naming what each colour means. Link it to a chart\n * with `for`, or pass `items` to use it next to anything coloured by series.\n */\n@Component({\n selector: 'ui-chart-legend',\n templateUrl: './chart-legend.component.html',\n styleUrl: './chart-legend.component.css'\n})\nexport class UiChartLegendComponent {\n readonly items = input<ChartLegendItem[]>([]);\n\n /** Small text after the items, e.g. how many series aren't listed. */\n readonly note = input<string>('');\n\n /** A chart to take items from and hide or fade series on, set its `legend` to `none`. */\n readonly for = input<ChartLegendSource | null>(null);\n\n /** Adjusts the linked chart's items, e.g. to relabel them. Keep each `name`. */\n readonly itemsWith = input<((items: ChartLegendItem[]) => ChartLegendItem[]) | null>(null);\n\n /** Names of items switched off, bound two-way when `toggleable`. */\n readonly hidden = model<string[]>([]);\n\n /** Lets each item be clicked to hide or show its series. */\n readonly toggleable = input(false, { transform: booleanAttribute });\n\n /** The item being hovered or focused, null when it leaves. Charts fade the other series. */\n readonly focusChange = output<string | null>();\n\n private readonly hovered = signal<string | null>(null);\n private readonly focused = signal<string | null>(null);\n\n // the pointer wins while it's over an item, keyboard focus is the fallback\n private readonly pointedAt = computed(() => this.hovered() ?? this.focused());\n\n // a linked chart wins over the plain inputs\n protected readonly shownItems = computed(() => {\n const source = this.for();\n\n if (!source) {\n return this.items();\n }\n\n const adjust = this.itemsWith();\n\n return adjust ? adjust(source.legendItems()) : source.legendItems();\n });\n protected readonly shownNote = computed(() => this.for()?.legendNote() ?? this.note());\n private readonly hiddenNames = computed(() => this.for()?.hiddenSeries() ?? this.hidden());\n\n protected readonly visibleCount = computed(() =>\n this.shownItems().filter(item => !this.hiddenNames().includes(item.name)).length\n );\n\n constructor() {\n effect(() => {\n const name = this.pointedAt();\n\n untracked(() => {\n this.for()?.emphasis.set(name);\n this.focusChange.emit(name);\n });\n });\n }\n\n protected hover(name: string | null): void {\n this.hovered.set(name);\n }\n\n protected focus(name: string | null): void {\n this.focused.set(name);\n }\n\n protected isHidden(item: ChartLegendItem): boolean {\n return this.hiddenNames().includes(item.name);\n }\n\n // the last one showing stays on, an empty chart helps nobody\n protected isLocked(item: ChartLegendItem): boolean {\n return !this.isHidden(item) && this.visibleCount() === 1;\n }\n\n protected toggle(item: ChartLegendItem): void {\n if (this.isLocked(item)) {\n return;\n }\n\n const hidden = this.hiddenNames();\n const next = hidden.includes(item.name)\n ? hidden.filter(name => name !== item.name)\n : [...hidden, item.name];\n\n const source = this.for();\n\n if (source) {\n source.hiddenSeries.set(next);\n } else {\n this.hidden.set(next);\n }\n }\n}\n","<ul class=\"ui-chart-legend\" role=\"list\">\n @for (item of shownItems(); track item.name) {\n <li\n (mouseenter)=\"hover(item.name)\"\n (mouseleave)=\"hover(null)\"\n (focusin)=\"focus(item.name)\"\n (focusout)=\"focus(null)\"\n >\n @if (toggleable()) {\n <button\n type=\"button\"\n class=\"ui-chart-legend-item ui-chart-legend-item--button ui-text-body-alt\"\n [attr.aria-pressed]=\"!isHidden(item)\"\n [attr.aria-disabled]=\"isLocked(item) || null\"\n [attr.data-hidden]=\"isHidden(item) ? '' : null\"\n (click)=\"toggle(item)\"\n >\n <span\n class=\"ui-chart-legend-key\"\n [class.ui-chart-legend-key--dashed]=\"item.dashed\"\n [style.--ui-chart-legend-colour]=\"item.colour\"\n ></span>\n {{ item.label ?? item.name }}\n </button>\n } @else {\n <span class=\"ui-chart-legend-item ui-text-body-alt\">\n <span\n class=\"ui-chart-legend-key\"\n [class.ui-chart-legend-key--dashed]=\"item.dashed\"\n [style.--ui-chart-legend-colour]=\"item.colour\"\n ></span>\n {{ item.label ?? item.name }}\n </span>\n }\n </li>\n }\n</ul>\n\n@if (shownNote()) {\n <span class=\"text-muted-foreground-1 ui-text-caption\">{{ shownNote() }}</span>\n}\n","import {\n afterNextRender,\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\n\nimport type ApexCharts from 'apexcharts';\n\nimport type { ChartOptions } from './chart.types';\n\n\n// missing from apex's types\ntype ApexChartsEvents = ApexCharts & {\n addEventListener(name: 'updated', handler: () => void): void;\n};\n\n\n/**\n * Draws raw ApexCharts options. The typed charts (bar, line and so on) are\n * built on this, reach for it directly only when they can't do what you need.\n */\n@Component({\n selector: 'ui-chart',\n template: `\n <div\n #canvas\n class=\"ui-chart-canvas\"\n role=\"img\"\n [attr.aria-label]=\"ariaLabel()\"\n ></div>\n `,\n styleUrl: './chart.component.css',\n // ApexCharts builds its own DOM, scoped styles would never reach the tooltip\n encapsulation: ViewEncapsulation.None,\n host: { class: 'ui-chart' }\n})\nexport class UiChartComponent {\n readonly options = input.required<ChartOptions>();\n\n /** What the chart shows, e.g. \"Spending by month\". Screen readers get this instead of the SVG. */\n readonly ariaLabel = input.required<string>();\n\n /** Series names to keep off the plot, e.g. switched off in the legend. */\n readonly hiddenSeries = input<string[]>([]);\n\n /** Fades every other series so this one stands out, e.g. while its legend item is hovered. */\n readonly emphasis = input<string | null>(null);\n\n private readonly canvas = viewChild.required<ElementRef<HTMLElement>>(\n 'canvas'\n );\n private readonly chart = signal<ApexCharts | null>(null);\n\n private destroyed = false;\n\n private drawnNames: (string | null)[] = [];\n\n constructor() {\n // loaded on first use so pages without charts don't pay for the library\n afterNextRender(async () => {\n const { default: Apex } = await import('apexcharts');\n\n if (this.destroyed) {\n return;\n }\n\n const chart = new Apex(\n this.canvas().nativeElement,\n untracked(this.options)\n );\n\n (chart as ApexChartsEvents).addEventListener('updated', () => {\n this.applyHidden(chart);\n this.applyEmphasis();\n });\n\n this.drawnNames = this.seriesNames();\n await chart.render();\n this.chart.set(chart);\n this.applyHidden(chart);\n this.applyEmphasis();\n });\n\n // later option changes update in place, so bars animate to their new size\n effect(() => {\n const options = this.options();\n const chart = this.chart();\n\n if (!chart) {\n return;\n }\n\n // apex animates a reorder by morphing lines into each other\n const names = this.seriesNames();\n const reordered = names.length === this.drawnNames.length &&\n names.some((name, index) => name !== this.drawnNames[index]) &&\n names.every(name => this.drawnNames.includes(name));\n\n this.drawnNames = names;\n chart.updateOptions(options, false, !reordered);\n });\n\n effect(() => {\n this.emphasis();\n\n if (this.chart()) {\n this.applyEmphasis();\n }\n });\n\n effect(() => {\n const chart = this.chart();\n\n if (chart) {\n this.applyHidden(chart);\n this.applyEmphasis();\n }\n });\n\n inject(DestroyRef).onDestroy(() => {\n this.destroyed = true;\n this.chart()?.destroy();\n });\n }\n\n private applyHidden(chart: ApexCharts): void {\n const hidden = this.hiddenSeries();\n\n // apex throws toggling a series it hasn't drawn, e.g. at zero width\n if (!this.canvas().nativeElement.querySelector('.apexcharts-inner .apexcharts-series')) {\n return;\n }\n\n for (const name of this.seriesNames()) {\n if (!name) {\n continue;\n }\n\n if (hidden.includes(name)) {\n chart.hideSeries(name);\n } else {\n chart.showSeries(name);\n }\n }\n }\n\n // done with a class rather than apex's own highlight, which has no clean way to undo\n private applyEmphasis(): void {\n const names = this.seriesNames();\n\n // a hidden series isn't drawn, fading everything towards it would leave nothing to see\n const emphasis = untracked(this.emphasis);\n const active =\n emphasis &&\n names.includes(emphasis) &&\n !untracked(this.hiddenSeries).includes(emphasis)\n ? emphasis\n : null;\n const groups = this.canvas().nativeElement.querySelectorAll<\n SVGGElement\n >('.apexcharts-series[data\\\\:realIndex]');\n\n for (const group of groups) {\n const name = names[Number(group.getAttribute('data:realIndex'))];\n\n group.classList.toggle(\n 'ui-chart-series--faded',\n !!active && name !== active\n );\n }\n }\n\n // pies pass plain numbers as series, their names live in labels\n private seriesNames(): (string | null)[] {\n const { series = [], labels = [] } = untracked(this.options);\n\n return series.map((item, index) =>\n typeof item === 'object' && item !== null && 'name' in item\n ? item.name ?? null\n : labels[index] ?? null\n );\n }\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\n\nimport type { ChartSeries, ChartValueFormatter } from './chart.types';\n\n\n/**\n * The numbers behind a chart as a table. Hidden visually by default so screen\n * readers still get the data, `visible` shows it for everyone.\n */\n@Component({\n selector: 'ui-chart-table',\n template: `\n <!-- sr-only on a wrapper, the table's own width would otherwise override it -->\n <div [class.sr-only]=\"!visible()\">\n <table class=\"ui-chart-table\">\n <caption class=\"sr-only\">{{ caption() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\" class=\"ui-text-caption\">{{ categoryLabel() }}</th>\n @for (item of series(); track item.name) {\n <th scope=\"col\" class=\"ui-text-caption\">{{ item.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (category of categories(); track $index; let row = $index) {\n <tr>\n <th scope=\"row\" class=\"ui-text-body-alt\">{{ category }}</th>\n @for (item of series(); track item.name) {\n <td class=\"ui-text-body-alt\">\n @if (masked() && isValue(item.data[row])) {\n <span aria-hidden=\"true\">{{ format(item.data[row]) }}</span>\n <span class=\"sr-only\">amount hidden</span>\n } @else {{{ format(item.data[row]) }}}\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n `,\n styleUrl: './chart-table.component.css'\n})\nexport class UiChartTableComponent {\n readonly caption = input.required<string>();\n readonly categories = input.required<string[]>();\n readonly series = input.required<ChartSeries[]>();\n readonly valueFormatter = input.required<ChartValueFormatter>();\n readonly categoryLabel = input<string>('Category');\n readonly visible = input(false, { transform: booleanAttribute });\n\n /** Values are masks, screen readers hear \"amount hidden\" instead. */\n readonly masked = input(false, { transform: booleanAttribute });\n\n protected isValue(value: number | null | undefined): value is number {\n return value !== null && value !== undefined;\n }\n\n protected format(value: number | null | undefined): string {\n return this.isValue(value) ? this.valueFormatter()(value) : '-';\n }\n}\n","import { booleanAttribute, Component, computed, input, model } from '@angular/core';\n\nimport { UiSkeletonComponent } from '../../generic/skeleton/skeleton.component';\nimport { UiChartLegendComponent } from '../chart-legend/chart-legend.component';\nimport type { ChartLegendItem } from '../chart-legend/chart-legend.types';\nimport { UiChartComponent } from './chart.component';\nimport type { ChartHeight, ChartOptions, ChartSeries, ChartValueFormatter } from './chart.types';\nimport { UiChartTableComponent } from './chart-table.component';\n\n\n/** The loading, empty and data table states around a chart, shared by every chart type. */\n@Component({\n selector: 'ui-chart-frame',\n template: `\n @if (loading()) {\n <div [style.height.px]=\"fixedHeight()\" [class.grow]=\"fill()\" aria-busy=\"true\">\n <span class=\"sr-only\">Loading chart</span>\n <ui-skeleton shape=\"rect\" class=\"size-full\" />\n </div>\n } @else if (empty()) {\n <div\n class=\"flex justify-center items-center border border-line-2 border-dashed rounded-lg text-muted-foreground-1 ui-text-body-alt\"\n [class.grow]=\"fill()\"\n [style.height.px]=\"fixedHeight()\"\n >\n {{ emptyText() }}\n </div>\n } @else {\n <!-- one series needs no legend, the chart's title already names it -->\n @if (showLegend() && (legendItems().length > 1 || legendNote())) {\n <ui-chart-legend\n class=\"mb-3 shrink-0\"\n [items]=\"legendItems()\"\n [note]=\"legendNote()\"\n [(hidden)]=\"hiddenSeries\"\n (focusChange)=\"emphasis.set($event)\"\n toggleable\n />\n }\n\n <ui-chart\n [class.grow]=\"fill()\"\n [class.min-h-0]=\"fill()\"\n [options]=\"options()\"\n [ariaLabel]=\"ariaLabel()\"\n [hiddenSeries]=\"hiddenSeries()\"\n [emphasis]=\"emphasis()\"\n />\n\n <ui-chart-table\n [caption]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [valueFormatter]=\"valueFormatter()\"\n [masked]=\"masked()\"\n [categoryLabel]=\"categoryLabel()\"\n [visible]=\"showTable()\"\n />\n }\n `,\n imports: [\n UiChartComponent,\n UiChartTableComponent,\n UiChartLegendComponent,\n UiSkeletonComponent\n ],\n host: {\n class: 'relative w-full min-w-0',\n '[class.block]': '!fill()',\n '[class.flex]': 'fill()',\n '[class.flex-col]': 'fill()',\n '[class.h-full]': 'fill()'\n }\n})\nexport class UiChartFrameComponent {\n readonly options = input.required<ChartOptions>();\n readonly ariaLabel = input.required<string>();\n readonly categories = input.required<string[]>();\n readonly series = input.required<ChartSeries[]>();\n readonly legendItems = input.required<ChartLegendItem[]>();\n readonly legendNote = input<string>('');\n readonly hiddenSeries = model<string[]>([]);\n readonly valueFormatter = input.required<ChartValueFormatter>();\n readonly categoryLabel = input.required<string>();\n readonly height = input.required<ChartHeight>();\n readonly emptyText = input.required<string>();\n\n readonly loading = input(false, { transform: booleanAttribute });\n readonly empty = input(false, { transform: booleanAttribute });\n readonly showTable = input(false, { transform: booleanAttribute });\n readonly masked = input(false, { transform: booleanAttribute });\n readonly showLegend = input(true, { transform: booleanAttribute });\n\n /** The series the legend is pointing at, the others fade while it's set. */\n readonly emphasis = model<string | null>(null);\n\n protected readonly fill = computed(() => this.height() === 'fill');\n protected readonly fixedHeight = computed(() => {\n const height = this.height();\n\n return height === 'fill' ? null : height;\n });\n}\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n chartAxisLabels,\n chartTooltipHtml,\n mergeChartOptions\n} from '../chart/chart.options';\nimport type { ChartInk } from '../chart/chart.palette';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { BarChartOrientation } from './bar-chart.types';\n\n\n// thin bars read better than slabs, whatever width is left over becomes air\nconst MAX_BAR_THICKNESS = 24;\n\nconst FADED_STRENGTH = 0.3;\n\n// apex can't parse color-mix(), so faded colours are blended here\nfunction fade(colour: string, ink: ChartInk): string {\n const hex = /^#([0-9a-f]{6})$/i;\n const from = hex.exec(colour)?.[1];\n const to = hex.exec(ink.surface)?.[1];\n\n if (!from || !to) {\n return ink.context;\n }\n\n const channel = (value: string, at: number) => parseInt(value.slice(at, at + 2), 16);\n const mixed = [0, 2, 4].map(at =>\n Math.round(channel(from, at) * FADED_STRENGTH + channel(to, at) * (1 - FADED_STRENGTH))\n );\n\n return `rgb(${mixed.join(', ')})`;\n}\n\n/**\n * Bars or columns for comparing amounts across categories. Several series\n * sit side by side, or on top of each other with `stacked`.\n */\n@Component({\n selector: 'ui-bar-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiBarChartComponent extends UiAxisChartBase {\n readonly orientation = input<BarChartOrientation>('vertical');\n readonly stacked = input(false, { transform: booleanAttribute });\n\n /** Picks out one category, e.g. the month a page is showing, and fades the rest. */\n readonly highlightCategory = input<string | null>(null);\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const ink = this.ink();\n const base = baseChartOptions(ink);\n const labels = chartAxisLabels(ink);\n const horizontal = this.orientation() === 'horizontal';\n const format = this.displayFormatter();\n const masked = this.masked();\n const series = this.series();\n const categories = this.categories();\n const colours = this.colours();\n const picked = categories.indexOf(this.highlightCategory() ?? '');\n\n // apex applies a px width to each bar, grouped or not\n const thickness = `${MAX_BAR_THICKNESS}px`;\n const valueLabels = masked\n ? { show: false }\n : { ...labels, formatter: (value: string | number) => format(Number(value)) };\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: 'bar',\n height: this.apexHeight(),\n stacked: this.stacked()\n },\n colors: picked < 0\n ? colours\n : colours.map(colour => ({ dataPointIndex }: { dataPointIndex: number }) =>\n dataPointIndex === picked\n ? colour\n : fade(colour, ink)\n ),\n series: series.map(item => ({\n name: item.name,\n data: this.concealed() ? item.data.map(() => null) : item.data\n })),\n plotOptions: {\n bar: {\n horizontal,\n // apex 4 ignores borderRadiusWhenStacked and rounds every segment, square reads cleaner\n borderRadius: this.stacked() ? 0 : 4,\n borderRadiusApplication: 'end',\n columnWidth: thickness,\n barHeight: thickness\n }\n },\n // a surface coloured gap between touching bars and stack segments\n stroke: { show: true, width: 2, colors: [ink.surface] },\n // horizontal bars swap the axes, values run along the bottom\n xaxis: {\n ...base.xaxis,\n categories,\n labels: horizontal ? valueLabels : labels\n },\n yaxis: { ...base.yaxis, labels: horizontal ? labels : valueLabels },\n grid: {\n ...base.grid,\n // gridlines run across the value axis only\n xaxis: { lines: { show: horizontal } },\n yaxis: { lines: { show: !horizontal } }\n },\n tooltip: this.concealed()\n ? { enabled: false }\n : this.stacked()\n ? {\n shared: true,\n intersect: false,\n custom: ({ dataPointIndex }: { dataPointIndex: number }) => {\n const rows = series\n .map((item, index) => ({\n colour: colours[index],\n name: item.name,\n raw: item.data[dataPointIndex] ?? null\n }))\n .filter(row => !this.hiddenSeries().includes(row.name));\n const values = rows.map(row => row.raw).filter(value => value !== null);\n\n return chartTooltipHtml(\n categories[dataPointIndex] ?? '',\n rows.map(row => ({ ...row, value: masked ? undefined : this.formatValue(row.raw) })),\n '',\n masked ? undefined : {\n name: 'Total',\n value: this.formatValue(values.length ? values.reduce((sum, value) => sum + value, 0) : null)\n }\n );\n }\n }\n : {\n shared: false,\n intersect: true,\n custom: ({ seriesIndex, dataPointIndex }: { seriesIndex: number; dataPointIndex: number }) =>\n chartTooltipHtml(categories[dataPointIndex] ?? '', [{\n colour: colours[seriesIndex],\n name: series[seriesIndex]?.name ?? '',\n value: masked ? undefined : this.formatValue(series[seriesIndex]?.data[dataPointIndex])\n }])\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"displayFormatter()\"\n [masked]=\"masked()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** vertical draws columns rising from the bottom, horizontal draws bars from the left. */\nexport const BarChartOrientations = ['vertical', 'horizontal'] as const;\n\n/** @see {@link BarChartOrientations} */\nexport type BarChartOrientation = typeof BarChartOrientations[number];\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n chartAxisLabels,\n chartTooltipHtml,\n mergeChartOptions\n} from '../chart/chart.options';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { LineChartCurve } from './line-chart.types';\n\n\n// past this many categories only some get a label, or they crowd into each other\nconst MAX_AXIS_LABELS = 8;\n\n// grey context rows past this are summed up, the table has the rest\nconst MAX_CONTEXT_ROWS = 5;\n\n// with more lines than this the tooltip lists them biggest first, the same order they sit in\nconst SORT_ROWS_AFTER = 8;\n\n/**\n * Lines for showing how values change over something ordered, usually time.\n * Hovering anywhere shows every series at that point.\n */\n@Component({\n selector: 'ui-line-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiLineChartComponent extends UiAxisChartBase {\n protected override readonly supportsDashes = true;\n\n readonly curve = input<LineChartCurve>('straight');\n\n /** Draws a dot on every point, not just the hovered one. Handy with few points. */\n readonly showPoints = input(false, { transform: booleanAttribute });\n\n /** Shades this category and everything after it as a forecast. */\n readonly projectedFrom = input<string | null>(null);\n\n readonly projectedLabel = input<string>('Projected');\n\n private readonly projectedAnnotations = computed<ChartOptions['annotations']>(() => {\n const from = this.projectedFrom();\n const categories = this.categories();\n const ink = this.ink();\n\n // apex crashes redrawing without annotations\n if (!from || !categories.includes(from)) {\n return { xaxis: [] };\n }\n\n return {\n xaxis: [{\n x: from,\n x2: categories[categories.length - 1],\n fillColor: ink.muted,\n opacity: 0.08,\n borderColor: 'transparent',\n label: {\n text: this.projectedLabel(),\n position: 'top',\n orientation: 'horizontal',\n textAnchor: 'start',\n borderWidth: 0,\n offsetX: 8,\n offsetY: 16,\n style: {\n background: 'transparent',\n color: ink.muted,\n fontSize: '12px'\n }\n }\n }]\n };\n });\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const ink = this.ink();\n const base = baseChartOptions(ink);\n const labels = chartAxisLabels(ink);\n const series = this.series();\n const categories = this.categories();\n const colours = this.colours();\n const dashed = this.dashed();\n const muted = this.isMuted();\n const masked = this.masked();\n\n // grey context lines go first so the highlighted ones are drawn on top\n const order = series.map((_, index) => index).sort((a, b) => Number(muted[b]) - Number(muted[a]));\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: 'line',\n height: this.apexHeight()\n },\n annotations: this.projectedAnnotations(),\n colors: order.map(index => colours[index]),\n series: order.map(index => ({\n name: series[index].name,\n data: this.concealed() ? series[index].data.map(() => null) : series[index].data\n })),\n stroke: {\n curve: this.curve(),\n width: order.map(index => muted[index] ? 1.5 : 2),\n dashArray: order.map(index => dashed[index] ? 6 : 0),\n lineCap: 'round'\n },\n // the surface ring keeps a dot readable where it sits on another line\n markers: {\n size: this.showPoints() ? 4 : 0,\n strokeColors: ink.surface,\n strokeWidth: 2,\n hover: { size: 5 }\n },\n xaxis: {\n ...base.xaxis,\n categories,\n tickAmount: categories.length > MAX_AXIS_LABELS ? MAX_AXIS_LABELS : undefined,\n labels: { ...labels, hideOverlappingLabels: true, rotate: 0 },\n crosshairs: {\n show: true,\n width: 1,\n stroke: { color: ink.grid, width: 1, dashArray: 0 }\n },\n // the tooltip already names the category\n tooltip: { enabled: false }\n },\n yaxis: {\n ...base.yaxis,\n labels: masked ? { show: false } : { ...labels, formatter: this.displayFormatter() }\n },\n grid: {\n ...base.grid,\n xaxis: { lines: { show: false } },\n yaxis: { lines: { show: true } }\n },\n tooltip: this.concealed() ? { enabled: false } : {\n shared: true,\n intersect: false,\n // read at hover time, so hiding a series doesn't rebuild the chart\n custom: ({ dataPointIndex }: { dataPointIndex: number }) => {\n const rows = series\n .map((item, index) => ({\n colour: colours[index],\n dashed: dashed[index],\n name: item.name,\n raw: item.data[dataPointIndex] ?? null,\n muted: muted[index]\n }))\n .filter(row => !this.hiddenSeries().includes(row.name))\n .sort((a, b) => this.tooltipOrder(a, b))\n .map(row => ({ ...row, value: masked ? undefined : this.formatValue(row.raw) }));\n\n const shown = rows.filter(row => !row.muted).length + MAX_CONTEXT_ROWS;\n const extra = rows.length - shown;\n\n return chartTooltipHtml(\n categories[dataPointIndex] ?? '',\n rows.slice(0, shown),\n extra > 0 ? `${extra} more` : ''\n );\n }\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n\n // highlighted rows first in highlight order, then the grey ones biggest first\n private tooltipOrder(\n a: { name: string; raw: number | null; muted: boolean },\n b: { name: string; raw: number | null; muted: boolean }\n ): number {\n if (a.muted !== b.muted) {\n return Number(a.muted) - Number(b.muted);\n }\n\n const highlight = this.highlight();\n\n if (!a.muted && highlight) {\n return highlight.indexOf(a.name) - highlight.indexOf(b.name);\n }\n\n // a handful keep the legend order, lots are easier to scan biggest first\n if (!a.muted && this.series().length <= SORT_ROWS_AFTER) {\n return 0;\n }\n\n return (b.raw ?? -Infinity) - (a.raw ?? -Infinity);\n }\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"displayFormatter()\"\n [masked]=\"masked()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** How points are joined, straight segments, a smooth curve, or steps. */\nexport const LineChartCurves = ['straight', 'smooth', 'stepline'] as const;\n\n/** @see {@link LineChartCurves} */\nexport type LineChartCurve = typeof LineChartCurves[number];\n","import { Component, computed, input } from '@angular/core';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n chartTooltipHtml,\n mergeChartOptions\n} from '../chart/chart.options';\nimport {\n type ChartSeriesStyle,\n chartSeriesStyle\n} from '../chart/chart.palette';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { PieChartVariant } from './pie-chart.types';\n\n\n/**\n * Slices for showing how a whole splits into parts. Each category is a\n * slice, only the first series is drawn. Best kept to a handful of slices,\n * fold the small ones into \"Other\".\n */\n@Component({\n selector: 'ui-pie-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiPieChartComponent extends UiAxisChartBase {\n readonly variant = input<PieChartVariant>('pie');\n\n private readonly percentFormatter = new Intl.NumberFormat(this.uiFormat.locale, {\n style: 'percent',\n maximumFractionDigits: 1\n });\n\n /** Shown above the total in the middle of a donut. */\n readonly totalLabel = input<string>('Total');\n\n protected readonly values = computed(() => this.series()[0]?.data ?? []);\n\n // slices are categories here, so highlight and colours work per category not per series\n protected override readonly isEmpty = computed(() =>\n !this.values().some(value => value !== null && value > 0)\n );\n\n protected override readonly isMuted = computed(() => {\n const highlight = this.highlight();\n\n return this.categories().map(name =>\n !!highlight && !highlight.includes(name)\n );\n });\n\n protected override readonly styles = computed<ChartSeriesStyle[]>(() => {\n const highlight = this.highlight();\n const muted = this.isMuted();\n\n return this.categories().map((name, index) =>\n muted[index]\n ? { colour: this.ink().context, dashed: false }\n : chartSeriesStyle(\n highlight ? highlight.indexOf(name) : index,\n false,\n this.dark()\n )\n );\n });\n\n override readonly legendItems = computed(() => {\n const highlight = this.highlight();\n const items = this.categories()\n .map((name, index) => ({ name, ...this.styles()[index] }))\n .filter((_, index) => !this.isMuted()[index]);\n\n return highlight\n ? items.sort((a, b) =>\n highlight.indexOf(a.name) - highlight.indexOf(b.name)\n )\n : items;\n });\n\n // apex can't hide a pie slice, so hidden ones are left out of the options instead\n private readonly slices = computed(() => {\n const hidden = this.hiddenSeries();\n const values = this.values();\n const colours = this.colours();\n\n return this.categories()\n .map((name, index) => ({\n name,\n value: values[index] ?? 0,\n colour: colours[index]\n }))\n .filter(slice => !hidden.includes(slice.name));\n });\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const ink = this.ink();\n const base = baseChartOptions(ink);\n const slices = this.slices();\n const donut = this.variant() === 'donut';\n const total = slices.reduce((sum, slice) => sum + slice.value, 0);\n const concealed = this.concealed();\n const drawn = concealed ? [{ name: '', value: 1, colour: ink.grid }] : slices;\n const centreText = {\n fontSize: '12px',\n color: ink.muted,\n offsetY: -4\n };\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: donut ? 'donut' : 'pie',\n height: this.apexHeight()\n },\n colors: drawn.map(slice => slice.colour),\n labels: drawn.map(slice => slice.name),\n series: drawn.map(slice => slice.value),\n // a surface coloured gap between slices\n stroke: { show: true, width: 2, colors: [ink.surface] },\n // lightening a grey slice turns it white, it looks like it's gone\n states: {\n ...base.states,\n hover: { filter: { type: concealed ? 'none' : 'darken' } }\n },\n plotOptions: {\n pie: {\n // clicking would pop a slice out, the legend does the toggling\n expandOnClick: false,\n donut: {\n size: '65%',\n labels: {\n show: donut,\n name: centreText,\n value: {\n fontSize: '20px',\n fontWeight: 600,\n color: ink.text,\n offsetY: 4,\n formatter: (value: string) =>\n this.formatValue(Number(value))\n },\n total: {\n show: true,\n showAlways: true,\n label: this.totalLabel(),\n ...centreText,\n formatter: () => this.formatValue(total)\n }\n }\n }\n }\n },\n tooltip: concealed ? { enabled: false } : {\n // apex makes pie tooltips dark and slice coloured, ours match the other charts\n theme: 'light',\n fillSeriesColor: false,\n custom: ({ seriesIndex }: { seriesIndex: number; }) => {\n const slice = slices[seriesIndex];\n\n return slice\n ? chartTooltipHtml(\n '',\n [{\n colour: slice.colour,\n name: slice.name,\n value: this.masked() ? undefined : this.formatValue(slice.value)\n }],\n total\n ? `${\n this.percentFormatter.format(slice.value / total)\n } of total`\n : ''\n )\n : '';\n }\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"displayFormatter()\"\n [masked]=\"masked()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** pie fills the whole circle, donut leaves a hole with the total in it. */\nexport const PieChartVariants = ['pie', 'donut'] as const;\n\n/** @see {@link PieChartVariants} */\nexport type PieChartVariant = typeof PieChartVariants[number];\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model\n} from '@angular/core';\n\nimport { InputValidation } from '../input/input.types';\n\n\n@Component({\n selector: 'ui-checkbox',\n templateUrl: './checkbox.component.html',\n styleUrl: './checkbox.component.css',\n // keep id/name off the host, same fix as ui-radio\n host: { '[attr.id]': 'null', '[attr.name]': 'null' }\n})\nexport class UiCheckboxComponent {\n readonly value = model.required<boolean>();\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n\n // shows a dash instead of a tick, purely visual, doesn't change value\n readonly indeterminate = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n // lets presets like ui-switch restyle the native input\n readonly classes = input<string>('');\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-checkbox',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n toggle(): void {\n this.value.set(!this.value());\n }\n}\n","<input\n type=\"checkbox\"\n [class]=\"generatedClasses()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [required]=\"required()\"\n [checked]=\"value()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (change)=\"toggle()\"\n/>\n","import type { FileRejection, FileSelection } from './file.types';\n\n\nconst SIZE_UNITS = ['B', 'KB', 'MB', 'GB'];\n\n/**\n * Checks a file against a native `accept` string, e.g. \".csv,image/*\".\n * Dropped files skip the browser's own accept check, so we do it ourselves.\n */\nexport function matchesAccept(file: File, accept: string): boolean {\n const tokens = accept\n .split(',')\n .map(token => token.trim().toLowerCase())\n .filter(Boolean);\n\n if (!tokens.length) {\n return true;\n }\n\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n\n return tokens.some(token => {\n if (token.startsWith('.')) {\n return name.endsWith(token);\n }\n\n if (token.endsWith('/*')) {\n return type.startsWith(token.slice(0, -1));\n }\n\n return type === token;\n });\n}\n\n/** Splits files into ones that pass the accept and size rules and ones that don't. */\nexport function selectFiles(\n files: File[],\n accept: string,\n maxSize: number | null\n): FileSelection {\n const accepted: File[] = [];\n const rejected: FileRejection[] = [];\n\n for (const file of files) {\n if (!matchesAccept(file, accept)) {\n rejected.push({ file, reason: 'type' });\n } else if (maxSize !== null && file.size > maxSize) {\n rejected.push({ file, reason: 'size' });\n } else {\n accepted.push(file);\n }\n }\n\n return { accepted, rejected };\n}\n\n/** Human readable size, e.g. 1536 -> \"1.5 KB\". */\nexport function formatFileSize(bytes: number): string {\n let size = bytes;\n let unit = 0;\n\n while (size >= 1024 && unit < SIZE_UNITS.length - 1) {\n size /= 1024;\n unit++;\n }\n\n const rounded = unit === 0 ? size : Math.round(size * 10) / 10;\n\n return `${rounded} ${SIZE_UNITS[unit]}`;\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n output,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { IconName, NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroArrowUpTray, heroDocument } from '@ng-icons/heroicons/outline';\n\nimport type { FileRejection } from '../file/file.types';\nimport { formatFileSize, selectFiles } from '../file/file.utils';\n\n\n@Component({\n selector: 'ui-dropzone',\n templateUrl: './dropzone.component.html',\n styleUrl: './dropzone.component.css',\n imports: [NgIcon],\n providers: [provideIcons({\n heroArrowUpTray,\n heroDocument\n })]\n})\nexport class UiDropzoneComponent {\n readonly value = model<File[]>([]);\n\n readonly id = input<string>('');\n readonly accept = input<string>('');\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string>('');\n readonly describedBy = input<string>('');\n\n /** Max size per file in bytes. */\n readonly maxSize = input<number | null>(null);\n\n readonly title = input<string>('');\n readonly hint = input<string>('');\n readonly icon = input<IconName>('heroArrowUpTray');\n\n readonly rejected = output<FileRejection[]>();\n\n private readonly picker = viewChild.required<ElementRef<HTMLInputElement>>(\n 'picker'\n );\n\n // dragenter/leave fire for every child, so count them instead of toggling\n private dragDepth = 0;\n\n protected readonly isDragging = signal(false);\n protected readonly hasRejection = signal(false);\n\n protected readonly displayTitle = computed(() =>\n this.title() ||\n (this.multiple()\n ? 'Drop files here or click to browse'\n : 'Drop a file here or click to browse')\n );\n\n protected readonly files = computed(() =>\n this.value().map(file => ({\n name: file.name,\n size: formatFileSize(file.size)\n }))\n );\n\n protected openPicker(): void {\n if (this.disabled()) {\n return;\n }\n\n const picker = this.picker().nativeElement;\n\n if (picker.showPicker) {\n picker.showPicker();\n } else {\n picker.click();\n }\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.openPicker();\n }\n }\n\n protected handlePick(event: Event): void {\n const target = event.target as HTMLInputElement;\n\n this.addFiles([...target.files ?? []]);\n\n // reset so picking the same file again still fires change\n target.value = '';\n }\n\n protected handleDragEnter(event: DragEvent): void {\n event.preventDefault();\n\n if (this.disabled()) {\n return;\n }\n\n this.dragDepth++;\n this.isDragging.set(true);\n }\n\n protected handleDragOver(event: DragEvent): void {\n // without this the browser won't allow the drop\n event.preventDefault();\n\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = this.disabled() ? 'none' : 'copy';\n }\n }\n\n protected handleDragLeave(): void {\n this.dragDepth = Math.max(0, this.dragDepth - 1);\n\n if (!this.dragDepth) {\n this.isDragging.set(false);\n }\n }\n\n protected handleDrop(event: DragEvent): void {\n event.preventDefault();\n\n this.dragDepth = 0;\n this.isDragging.set(false);\n\n if (!this.disabled()) {\n this.addFiles([...event.dataTransfer?.files ?? []]);\n }\n }\n\n protected clear(): void {\n this.value.set([]);\n this.hasRejection.set(false);\n }\n\n private addFiles(files: File[]): void {\n if (!files.length) {\n return;\n }\n\n // the native picker enforces this, but a drop can carry several files\n const candidates = this.multiple() ? files : files.slice(0, 1);\n const { accepted, rejected } = selectFiles(\n candidates,\n this.accept(),\n this.maxSize()\n );\n\n this.hasRejection.set(rejected.length > 0);\n\n if (rejected.length) {\n this.rejected.emit(rejected);\n }\n\n if (accepted.length) {\n this.value.set(accepted);\n }\n }\n}\n","<div\n class=\"ui-dropzone\"\n role=\"button\"\n [attr.id]=\"id() || null\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-disabled]=\"disabled() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.data-dragging]=\"isDragging() ? '' : null\"\n [attr.data-invalid]=\"hasRejection() ? '' : null\"\n (click)=\"openPicker()\"\n (keydown)=\"handleKeydown($event)\"\n (dragenter)=\"handleDragEnter($event)\"\n (dragover)=\"handleDragOver($event)\"\n (dragleave)=\"handleDragLeave()\"\n (drop)=\"handleDrop($event)\"\n>\n <span class=\"ui-dropzone-icon\">\n <ng-icon [name]=\"icon()\" size=\"24\" class=\"shrink-0\" />\n </span>\n\n <span class=\"text-foreground ui-text-body\">\n {{ displayTitle() }}\n </span>\n\n @if (hint()) {\n <span class=\"text-muted-foreground-1 ui-text-caption\">\n {{ hint() }}\n </span>\n }\n</div>\n\n<input\n #picker\n type=\"file\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"handlePick($event)\"\n/>\n\n@if (files().length) {\n <div class=\"ui-dropzone-files\">\n <ul class=\"ui-dropzone-list\">\n @for (file of files(); track $index) {\n <li class=\"ui-dropzone-file\">\n <ng-icon\n name=\"heroDocument\"\n class=\"text-muted-foreground-1 shrink-0\"\n />\n <span class=\"text-foreground truncate ui-text-body\">\n {{ file.name }}\n </span>\n <span\n class=\"ms-auto text-muted-foreground-1 shrink-0 ui-text-caption\"\n >\n {{ file.size }}\n </span>\n </li>\n }\n </ul>\n\n @if (!disabled()) {\n <button\n type=\"button\"\n class=\"ui-dropzone-clear ui-text-caption\"\n (click)=\"clear()\"\n >\n {{ files().length > 1 ? 'Remove files' : 'Remove file' }}\n </button>\n }\n </div>\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n\n@Component({\n selector: 'ui-field',\n templateUrl: './field.component.html',\n styleUrl: './field.component.css',\n host: { class: 'block' }\n})\nexport class UiFieldComponent {\n readonly label = input<string>('');\n readonly hint = input<string>('');\n\n /**\n * Shows a \"*\" marker next to the label.\n */\n readonly required = input(false, { transform: booleanAttribute });\n\n /**\n * An error message, shown instead of `hint` when present.\n */\n readonly error = input<string>('');\n\n // Pass the id of the control being labelled (e.g. the `ui-input`'s `id`)\n // so the label is properly associated with it for accessibility.\n readonly for = input<string>('');\n\n // Ids for the hint/error elements - pass both to the control's\n // `describedBy` (e.g. `ui-input`) so screen readers announce whichever\n // is showing. Safe to pass both even though only one renders at a\n // time - an aria-describedby token pointing at a nonexistent id is\n // simply ignored.\n readonly hintId = input<string>('');\n readonly errorId = input<string>('');\n\n protected get forAttr() {\n return this.for() || null;\n }\n\n protected get hintAttr() {\n return this.hintId() || null;\n }\n\n protected get errorAttr() {\n return this.errorId() || null;\n }\n}\n","@if (label()) {\n <label\n [attr.for]=\"forAttr\"\n class=\"ui-text-body ui-field-label\"\n >\n {{ label() }}\n\n @if (required()) {\n <span class=\"text-danger-500\" aria-hidden=\"true\">*</span>\n <span class=\"sr-only\">(required)</span>\n }\n </label>\n}\n\n<ng-content />\n\n@if (error()) {\n <div\n [attr.id]=\"errorAttr\"\n class=\"text-danger-600 ui-text-caption ui-field-hint\"\n role=\"alert\"\n >\n {{ error() }}\n </div>\n} @else if (hint()) {\n <div\n [attr.id]=\"hintAttr\"\n class=\"text-muted-foreground-1 ui-text-caption ui-field-hint\"\n >\n {{ hint() }}\n </div>\n}\n","/** Why a file was turned away by a file picker. */\nexport const FileRejectionReasons = ['type', 'size'] as const;\n\n/** @see {@link FileRejectionReasons} */\nexport type FileRejectionReason = typeof FileRejectionReasons[number];\n\nexport interface FileRejection {\n file: File;\n reason: FileRejectionReason;\n}\n\nexport interface FileSelection {\n accepted: File[];\n rejected: FileRejection[];\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n Component,\n computed,\n contentChild,\n input,\n model,\n output,\n signal,\n TemplateRef\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroEye, heroEyeSlash } from '@ng-icons/heroicons/outline';\n\nimport {\n type InputAriaAutocomplete,\n type InputAriaHasPopup,\n type InputMode,\n type InputType,\n type InputValidation\n} from './input.types';\n\n\n@Component({\n selector: 'ui-input',\n templateUrl: './input.component.html',\n styleUrl: './input.component.css',\n imports: [NgTemplateOutlet, NgIcon],\n providers: [provideIcons({\n heroEyeSlash,\n heroEye\n })]\n})\nexport class UiInputComponent<ValueType = string> {\n readonly value = model.required<ValueType>();\n\n readonly classes = input<string>('');\n\n readonly type = input<InputType>('text');\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n readonly autocomplete = input<string>('');\n readonly inputmode = input<InputMode | ''>('');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n // these values can be strings or numbers depending on the input type\n readonly min = input<string | number>('');\n readonly max = input<string | number>('');\n readonly step = input<string | number>('');\n readonly pattern = input<string>('');\n readonly minlength = input<number | null>(null);\n readonly maxlength = input<number | null>(null);\n\n readonly autofocus = input(false, { transform: booleanAttribute });\n readonly spellcheck = input(true, { transform: booleanAttribute });\n\n /** With `type=\"password\"`, adds a button to show and hide what's been typed. */\n readonly revealable = input(false, { transform: booleanAttribute });\n\n readonly list = input<string>('');\n readonly ariaLabel = input<string>('');\n readonly describedBy = input<string>('');\n\n // for inputs that drive a popup, e.g. a select's search box or a datepicker\n // not \"role\", a static role attribute would also land on the host element\n readonly inputRole = input<string>('');\n readonly ariaExpanded = input<boolean | null>(null);\n readonly ariaControls = input<string>('');\n readonly ariaActiveDescendant = input<string | null>(null);\n readonly ariaAutocomplete = input<InputAriaAutocomplete | ''>('');\n readonly ariaHasPopup = input<InputAriaHasPopup | ''>('');\n\n readonly focused = output<FocusEvent>();\n readonly blurred = output<FocusEvent>();\n\n // Leading/Trialing elements that appear inside of the input.\n readonly leadingElement = contentChild<TemplateRef<unknown>>('leading');\n readonly trailingElement = contentChild<TemplateRef<unknown>>('trailing');\n\n protected readonly revealed = signal(false);\n\n protected readonly canReveal = computed(() =>\n this.revealable() && this.type() === 'password'\n );\n\n protected readonly shownType = computed<InputType>(() =>\n this.canReveal() && this.revealed() ? 'text' : this.type()\n );\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-input',\n 'ui-text-body',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected handleInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n\n this.value.set(this.parseValue(target));\n }\n\n protected handleFocus(event: FocusEvent): void {\n this.focused.emit(event);\n }\n\n protected handleBlur(event: FocusEvent): void {\n this.blurred.emit(event);\n }\n\n private parseValue(element: HTMLInputElement): ValueType {\n if (this.type() !== 'number') {\n return element.value as ValueType;\n }\n\n if (!element.value) {\n return null as ValueType;\n }\n\n return element.valueAsNumber as ValueType;\n }\n}\n","<ng-container *ngTemplateOutlet=\"leadingElement()\"></ng-container>\n\n<input\n [value]=\"value()\"\n [class]=\"generatedClasses()\"\n [type]=\"shownType()\"\n [attr.id]=\"id() || null\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [autocomplete]=\"autocomplete()\"\n [attr.min]=\"min() === '' ? null : min()\"\n [attr.max]=\"max() === '' ? null : max()\"\n [attr.step]=\"step() === '' ? null : step()\"\n [attr.pattern]=\"pattern() || null\"\n [attr.inputmode]=\"inputmode() || null\"\n [attr.maxlength]=\"maxlength()\"\n [attr.minlength]=\"minlength()\"\n \n [attr.spellcheck]=\"spellcheck()\"\n [attr.list]=\"list() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.role]=\"inputRole() || null\"\n [attr.aria-expanded]=\"ariaExpanded()\"\n [attr.aria-controls]=\"ariaControls() || null\"\n [attr.aria-activedescendant]=\"ariaActiveDescendant()\"\n [attr.aria-autocomplete]=\"ariaAutocomplete() || null\"\n [attr.aria-haspopup]=\"ariaHasPopup() || null\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n/>\n\n<ng-container *ngTemplateOutlet=\"trailingElement()\"></ng-container>\n\n@if (canReveal()) {\n <button\n type=\"button\"\n class=\"ui-input-reveal\"\n [attr.aria-label]=\"revealed() ? 'Hide password' : 'Show password'\"\n [attr.aria-pressed]=\"revealed()\"\n [disabled]=\"disabled()\"\n (click)=\"revealed.set(!revealed())\"\n >\n <ng-icon [name]=\"revealed() ? 'heroEyeSlash' : 'heroEye'\" size=\"18\" class=\"shrink-0\" />\n </button>\n}\n","/** Native type values ui-input supports. File/checkbox/radio/range need their own components. */\nexport const InputTypes = [\n 'text',\n 'email',\n 'tel',\n 'url',\n 'search',\n 'password',\n 'number',\n 'date',\n 'time',\n 'datetime-local',\n 'month',\n 'week',\n 'color'\n] as const;\n\n/** @see {@link InputTypes} */\nexport type InputType = typeof InputTypes[number];\n\n/** Native inputmode values, hinting at the virtual keyboard to show. */\nexport const InputModes = [\n 'none',\n 'text',\n 'decimal',\n 'numeric',\n 'tel',\n 'search',\n 'email',\n 'url'\n] as const;\n\n/** @see {@link InputModes} */\nexport type InputMode = typeof InputModes[number];\n\n/** true is valid, false is invalid, null is not yet validated. */\nexport type InputValidation = boolean | null;\n\n/** Native aria-autocomplete values, for inputs that suggest as you type. */\nexport const InputAriaAutocompletes = ['none', 'inline', 'list', 'both'] as const;\n\n/** @see {@link InputAriaAutocompletes} */\nexport type InputAriaAutocomplete = typeof InputAriaAutocompletes[number];\n\n/** Native aria-haspopup values, for inputs that open something. */\nexport const InputAriaHasPopups = ['listbox', 'dialog', 'grid', 'menu', 'tree'] as const;\n\n/** @see {@link InputAriaHasPopups} */\nexport type InputAriaHasPopup = typeof InputAriaHasPopups[number];\n","import { Component } from '@angular/core';\n\n\n/**\n * A static and non-interactable text or symbol that can be combined with\n * a `ui-input` inside of a `ui-input-group`. Example: this could represent\n * a currency symbol or unit of measurement.\n */\n@Component({\n selector: 'ui-input-addon',\n template: `<ng-content />`,\n styleUrl: './input-addon.component.css',\n host: { class: 'ui-text-body-alt' }\n})\nexport class UiInputAddonComponent {}\n","import { Component, contentChildren, effect, model } from '@angular/core';\n\nimport { UiInputComponent } from '../input/input.component';\nimport { InputValidation } from '../input/input.types';\n\n\n@Component({\n selector: 'ui-input-group',\n template: '<ng-content />',\n styleUrl: './input-group.component.css'\n})\nexport class UiInputGroupComponent {\n readonly inputs = contentChildren(UiInputComponent, { descendants: false });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n constructor() {\n effect(() => {\n const state = this.validationState();\n\n for (const input of this.inputs()) {\n input.validationState.set(state);\n }\n });\n }\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model\n} from '@angular/core';\n\nimport { InputValidation } from '../input/input.types';\n\n\n@Component({\n selector: 'ui-radio',\n templateUrl: './radio.component.html',\n styleUrl: './radio.component.css',\n // unbind id and name attrs to not cause conflict with the native input\n host: { '[attr.id]': 'null', '[attr.name]': 'null' }\n})\nexport class UiRadioComponent<ValueType = unknown> {\n readonly value = model.required<ValueType>();\n readonly option = input.required<ValueType>();\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n readonly compareWith = input<(a: ValueType, b: ValueType) => boolean>(\n (a, b) => a === b\n );\n\n readonly checked = computed(() =>\n this.compareWith()(this.value(), this.option())\n );\n\n select(): void {\n this.value.set(this.option());\n }\n}\n","<input\n type=\"radio\"\n class=\"not-checked:bg-layer border-line-3 focus:ring-2 focus:ring-primary-200/50 size-4 text-primary-600\"\n [id]=\"id()\"\n [name]=\"name()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n (change)=\"select()\"\n/>\n","import { Component, computed, input } from '@angular/core';\n\nimport { BadgeAppearance, BadgeIntent, BadgeSize } from './badge.types';\n\n\n@Component({\n selector: 'ui-badge',\n templateUrl: './badge.component.html',\n styleUrl: './badge.component.css',\n host: { '[class]': 'generatedClasses()' }\n})\nexport class UiBadgeComponent {\n readonly appearance = input<BadgeAppearance>('solid');\n readonly intent = input<BadgeIntent>('primary');\n readonly size = input<BadgeSize>('md');\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-badge',\n `ui-badge--${this.intent()}-${this.appearance()}`,\n `ui-badge--${this.size()}`\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","<ng-content />\n","/** The radius that a card can hold. Maps directly to tailwindcss' rounded classes. */\nexport const CardRadii = ['none', 'sm', 'md', 'lg', 'xl'] as const;\n\n/** @see {@link CardRadii} */\nexport type CardRadius = typeof CardRadii[number];\n\n// Written out in full so tailwind picks them up\nexport const radiusClasses: Record<CardRadius, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl'\n};\n","import { Component, computed, input } from '@angular/core';\n\nimport { CardRadius, radiusClasses } from './card.types';\n\n\n@Component({\n selector: 'ui-card',\n template: '<ng-content />',\n styleUrl: './card.component.css',\n host: { '[class]': 'generatedClasses()' }\n})\nexport class UiCardComponent {\n readonly radius = input<CardRadius>('md');\n\n readonly generatedClasses = computed<string>(() =>\n radiusClasses[this.radius()]\n );\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { autoUpdate, computePosition, flip, offset, shift } from \"@floating-ui/dom\";\n\nimport { UiOverlayOptions } from \"./overlay.types\";\n\n\n@Injectable({ providedIn: \"root\" })\nexport class UiOverlayPositioner {\n readonly position = (\n reference: HTMLElement,\n overlay: HTMLElement,\n options: UiOverlayOptions\n ) => computePosition(reference, overlay, {\n placement: options.placement,\n strategy: \"fixed\",\n middleware: [\n offset(options.offset),\n flip({ padding: options.viewportPadding }),\n shift({ padding: options.viewportPadding })\n ]\n });\n\n readonly watch = (\n reference: HTMLElement,\n overlay: HTMLElement,\n update: () => void\n ) => autoUpdate(reference, overlay, update);\n}\n","import { DestroyRef, inject, Injectable } from '@angular/core';\n\nimport { UiOverlayStackEntry } from './overlay.types';\n\n\n/** Tracks open overlays so only the top one reacts to outside clicks and Escape. */\n@Injectable({ providedIn: 'root' })\nexport class UiOverlayStack {\n private readonly entries: UiOverlayStackEntry[] = [];\n\n constructor() {\n document.addEventListener('click', this.onDocumentClick);\n document.addEventListener('keydown', this.onKeyDown);\n\n inject(DestroyRef).onDestroy(() => {\n document.removeEventListener('click', this.onDocumentClick);\n document.removeEventListener('keydown', this.onKeyDown);\n });\n }\n\n readonly push = (entry: UiOverlayStackEntry) => {\n this.remove(entry);\n this.entries.push(entry);\n };\n\n readonly remove = (entry: UiOverlayStackEntry) => {\n const index = this.entries.indexOf(entry);\n if (index !== -1) { this.entries.splice(index, 1); }\n };\n\n private readonly top = () => this.entries.at(-1);\n\n private readonly onDocumentClick = (event: MouseEvent) =>\n this.top()?.onDocumentClick(event);\n\n private readonly onKeyDown = (event: KeyboardEvent) =>\n this.top()?.onKeyDown(event);\n}\n","import {\n Component,\n effect,\n ElementRef,\n inject,\n input,\n WritableSignal\n} from '@angular/core';\n\nimport { Placement } from '@floating-ui/dom';\n\nimport { DropdownMatchWidth } from '../../generic/dropdown/dropdown.types';\nimport { UiOverlayPositioner } from './overlay.positioner';\nimport { UiOverlayStack } from './overlay.stack';\nimport { UiOverlayCloseBehaviour, UiOverlayStackEntry } from './overlay.types';\n\n\n@Component({\n selector: 'ui-overlay',\n exportAs: 'uiOverlay',\n template: '<ng-content />',\n host: { style: 'display: contents;' }\n})\nexport class UiOverlayComponent implements UiOverlayStackEntry {\n private readonly positioner = inject(UiOverlayPositioner);\n private readonly stack = inject(UiOverlayStack);\n\n readonly content = input<ElementRef<HTMLInputElement>>();\n readonly anchor = input<ElementRef<HTMLElement>>();\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickAnywhere'\n );\n\n readonly isOpen = input.required<WritableSignal<boolean>>();\n\n readonly placement = input<Placement>('bottom-start');\n readonly offset = input<number>(0);\n readonly viewportPadding = input<number>(0);\n\n /** Forces this element to match the width of its anchor element. */\n readonly matchWidth = input<DropdownMatchWidth | null>(null);\n\n constructor() {\n effect(onCleanup => {\n if (!this.isOpen()()) { return; }\n\n this.stack.push(this);\n onCleanup(() => this.stack.remove(this));\n });\n\n effect(onCleanup => {\n const anchor = this.anchor();\n const content = this.content();\n\n if (!this.isOpen()() || !anchor || !content) { return; }\n\n const referenceElement = anchor.nativeElement;\n const floatingElement = content.nativeElement;\n\n const update = () => {\n const matchWidth = this.matchWidth();\n\n if (matchWidth) {\n const width = `${referenceElement.offsetWidth}px`;\n\n if (matchWidth === 'both') {\n floatingElement.style.maxWidth = width;\n floatingElement.style.minWidth = width;\n } else {\n floatingElement.style[matchWidth] = width;\n }\n }\n\n return this.positioner.position(\n referenceElement,\n floatingElement,\n {\n placement: this.placement(),\n offset: this.offset(),\n viewportPadding: this.viewportPadding()\n }\n ).then(({ x, y }) =>\n Object.assign(floatingElement.style, {\n left: `${x}px`,\n top: `${y}px`\n })\n );\n };\n\n update();\n\n onCleanup(\n this.positioner.watch(referenceElement, floatingElement, update)\n );\n });\n }\n\n private readonly close = () => this.isOpen().set(false);\n\n readonly onDocumentClick = (event: MouseEvent) => {\n const behaviour = this.closeBehaviour();\n if (behaviour === 'none') { return; }\n\n const target = event.target;\n if (!(target instanceof Node)) { return; }\n\n const anchorElement = this.anchor()?.nativeElement;\n const contentElement = this.content()?.nativeElement;\n const isInsideAnchor = anchorElement?.contains(target) ?? false;\n const isInsideContent = contentElement?.contains(target) ?? false;\n\n // Anchor can wrap the content too, so only treat a click as \"on the\n // anchor\" (e.g. the trigger button) when it's not inside the content.\n if (isInsideAnchor && !isInsideContent) { return; }\n\n if (behaviour === 'whenClickAnywhere') {\n this.close();\n return;\n }\n\n if (!isInsideContent) {\n this.close();\n }\n };\n\n readonly onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') { this.close(); }\n };\n}\n","import { Directive, ElementRef, inject } from \"@angular/core\";\n\n\n@Directive({\n selector: '[uiDropdownContent]',\n host: { style: \"position: fixed; z-index: 50;\" }\n})\nexport class UiDropdownDirective {\n readonly element = inject(ElementRef<HTMLElement>);\n}\n","import {\n Component,\n contentChild,\n ElementRef,\n inject,\n input,\n WritableSignal\n} from '@angular/core';\n\nimport { Placement } from '@floating-ui/dom';\n\nimport { UiOverlayComponent } from '../../layout/overlay/overlay.component';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiDropdownDirective } from './dropdown.directives';\nimport { DropdownMatchWidth } from './dropdown.types';\n\n\n@Component({\n selector: 'ui-dropdown',\n exportAs: 'uiDropdown',\n templateUrl: './dropdown.component.html',\n imports: [UiOverlayComponent],\n host: { class: 'inline-flex size-fit' }\n})\nexport class UiDropdownComponent {\n protected readonly anchor = inject(ElementRef<HTMLElement>);\n readonly content = contentChild(UiDropdownDirective);\n readonly isOpen = input.required<WritableSignal<boolean>>();\n readonly placement = input<Placement>('bottom-start');\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickAnywhere'\n );\n\n readonly offset = input<number>(0);\n readonly viewportPadding = input<number>(0);\n\n /** Gives the floating content a min-width matching the dropdown's own width. */\n readonly matchWidth = input<DropdownMatchWidth | null>(null);\n\n readonly toggle = () => this.isOpen().update(value => !value);\n readonly close = () => this.isOpen().set(false);\n readonly open = () => this.isOpen().set(true);\n}\n","<ui-overlay\n [isOpen]=\"isOpen()\"\n [closeBehaviour]=\"closeBehaviour()\"\n [content]=\"content()?.element\"\n [anchor]=\"anchor\"\n [placement]=\"placement()\"\n [offset]=\"offset()\"\n [viewportPadding]=\"viewportPadding()\"\n [matchWidth]=\"matchWidth()\"\n>\n <ng-content />\n</ui-overlay>","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n computed,\n contentChild,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n output,\n signal,\n TemplateRef,\n untracked\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\n\nimport { Placement } from '@floating-ui/dom';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport {\n heroCheck,\n heroChevronDown,\n heroPlus,\n heroXMark\n} from '@ng-icons/heroicons/outline';\nimport {\n catchError,\n debounceTime,\n Observable,\n of,\n skip,\n Subject,\n switchMap\n} from 'rxjs';\n\nimport { UiBadgeComponent } from '../../generic/badge/badge.component';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../../generic/dropdown/dropdown.directives';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiInputComponent } from '../input/input.component';\nimport { InputValidation } from '../input/input.types';\nimport { SelectDataSource, SelectDataSourceContent } from './select.datasource';\nimport {\n SearchMode,\n SelectMultipleDisplay,\n SelectOptionContext,\n SelectRow,\n SelectTriggerContext\n} from './select.types';\n\n\nlet nextId = 0;\n\n@Component({\n selector: 'ui-select',\n templateUrl: './select.component.html',\n styleUrl: './select.component.css',\n imports: [\n UiDropdownComponent,\n UiDropdownDirective,\n UiInputComponent,\n UiBadgeComponent,\n UiCardComponent,\n NgIcon,\n NgTemplateOutlet\n ],\n host: { '(focusout)': 'onFocusOut($event)' },\n providers: [provideIcons({\n heroChevronDown,\n heroXMark,\n heroCheck,\n heroPlus\n })]\n})\nexport class UiSelectComponent<Model = unknown> {\n readonly isOpen = signal(false);\n readonly placement = input<Placement>('bottom-start');\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickOutside'\n );\n\n readonly dataSource = input.required<SelectDataSource<Model>>();\n readonly items = signal<Model[]>([]);\n\n readonly placeholder = input<string>('Select an option');\n\n /** Goes on the trigger (or the inline search box), pass it to ui-field's `for`. */\n readonly id = input<string>('');\n readonly describedBy = input<string>('');\n\n readonly pageSize = input<number>(10);\n readonly searchMode = input<SearchMode>('none');\n\n // added: disabled state, previously had CSS but nothing set it\n readonly disabled = input(false, { transform: booleanAttribute });\n // added: validation styling to match ui-input\n readonly validationState = model<InputValidation>(null);\n\n // opt-in, most selects back a required value where clearing isn't valid\n readonly clearable = input(false, { transform: booleanAttribute });\n readonly clearLabel = input<string>('None');\n\n /**\n * Offers a \"Create\" row when a search matches nothing. Needs a\n * searchMode, the parent handles `create` and adds the new item.\n */\n readonly creatable = input(false, { transform: booleanAttribute });\n readonly createLabel = input<(query: string) => string>(query =>\n `Create \"${query}\"`\n );\n\n /** Puts a heading above each run of items in the same group. Expects items sorted by group. */\n readonly groupBy = input<((item: Model) => string | null) | null>(null);\n\n /** Scrolls the selected option into view when the list opens. */\n readonly scrollToSelected = input(true, { transform: booleanAttribute });\n\n /** Lets several items be picked, bound through `selectedItems`. */\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly multipleDisplay = input<SelectMultipleDisplay>('text');\n\n /** In text display, swaps the list of names for a count past this many. 0 always counts. */\n readonly counterAfter = input<number | null>(null);\n readonly counterLabel = input<(count: number) => string>(count =>\n `${count} selected`\n );\n\n readonly compareWith = input<(a: Model, b: Model) => boolean>(\n (a, b) => a === b\n );\n\n readonly displayWith = input<(item: Model) => string>(\n item => `${item}`\n );\n\n readonly selectionChange = output<Model | null>();\n\n /** Emits the search text when the \"Create\" row is picked. */\n readonly create = output<string>();\n // changed to a model so a selection can be bound in from outside\n readonly selectedItem = model<Model | null>(null);\n readonly selectedItems = model<Model[]>([]);\n readonly query = signal('');\n readonly loading = signal(false);\n readonly hasMore = signal(true);\n\n readonly optionTemplate = contentChild<\n TemplateRef<SelectOptionContext<Model>>\n >('option');\n readonly triggerTemplate = contentChild<\n TemplateRef<SelectTriggerContext<Model>>\n >('trigger');\n\n /** Index into the pickable rows, the one keyboard focus sits on. */\n readonly activeIndex = signal(0);\n\n readonly listId = `ui-select-${nextId++}`;\n\n readonly hasSelection = computed(() =>\n this.multiple()\n ? this.selectedItems().length > 0\n : this.selectedItem() !== null\n );\n\n readonly triggerLabel = computed(() => {\n const display = this.displayWith();\n\n if (!this.multiple()) {\n const selected = this.selectedItem();\n\n return selected !== null ? display(selected) : this.placeholder();\n }\n\n const selected = this.selectedItems();\n const counterAfter = this.counterAfter();\n\n if (!selected.length) {\n return this.placeholder();\n }\n\n return counterAfter !== null && selected.length > counterAfter\n ? this.counterLabel()(selected.length)\n : selected.map(display).join(', ');\n });\n\n readonly isEmpty = computed(() =>\n this.multiple() ? !this.selectedItems().length : this.selectedItem() === null\n );\n\n /** Tags only replace the trigger text when there's no inline search box. */\n readonly showTags = computed(() =>\n this.multiple() &&\n this.multipleDisplay() === 'tags' &&\n this.searchMode() !== 'inline'\n );\n\n /** The text to create from, or null when there's nothing to offer. */\n readonly createQuery = computed(() => {\n const query = this.query().trim();\n const display = this.displayWith();\n\n if (!this.creatable() || !query || this.loading()) {\n return null;\n }\n\n const exists = this.items().some(item =>\n display(item).toLowerCase() === query.toLowerCase()\n );\n\n return exists ? null : query;\n });\n\n readonly rows = computed<SelectRow<Model>[]>(() => {\n const rows: SelectRow<Model>[] = [];\n const groupBy = this.groupBy();\n const display = this.displayWith();\n const createQuery = this.createQuery();\n\n let index = 0;\n let group: string | null | undefined;\n\n if (this.clearable() && this.hasSelection()) {\n rows.push({ kind: 'clear', id: this.rowId(index), index: index++ });\n }\n\n for (const item of this.items()) {\n if (groupBy) {\n const next = groupBy(item);\n\n if (next !== group && next) {\n rows.push({\n kind: 'group',\n id: `${this.listId}-group-${rows.length}`,\n label: next\n });\n }\n\n group = next;\n }\n\n rows.push({\n kind: 'item',\n id: this.rowId(index),\n index: index++,\n item,\n label: display(item),\n selected: this.isSelected(item)\n });\n }\n\n if (createQuery) {\n rows.push({\n kind: 'create',\n id: this.rowId(index),\n index,\n query: createQuery\n });\n }\n\n return rows;\n });\n\n private readonly pickable = computed(() =>\n this.rows().filter(row => row.kind !== 'group')\n );\n\n readonly activeId = computed(() =>\n this.isOpen() ? this.pickable()[this.activeIndex()]?.id ?? null : null\n );\n\n private page = 0;\n\n // one shared stream for every fetch, so a new request cancels whatever was still in flight\n private readonly load$ = new Subject<void>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n\n constructor() {\n // reloads when a new data source comes in, e.g. after creating an item\n effect(() => {\n this.dataSource();\n untracked(() => this.loadFirstPage());\n });\n\n // start on the selected option, and bring it into view\n effect(() => {\n if (!this.isOpen()) {\n return;\n }\n\n untracked(() => {\n const selected = this.pickable().findIndex(row =>\n row.kind === 'item' && row.selected\n );\n\n this.activeIndex.set(\n this.scrollToSelected() && selected >= 0 ? selected : 0\n );\n\n afterNextRender(() => {\n if (this.scrollToSelected()) {\n this.scrollActiveIntoView();\n }\n\n if (this.searchMode() === 'dropdown') {\n this.searchInput()?.focus();\n }\n }, { injector: this.injector });\n });\n });\n\n // debounce the query signal itself instead of a separate subject\n toObservable(this.query).pipe(\n debounceTime(300),\n skip(1), // skip the initial value, the data source effect already loads that\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.loadFirstPage());\n\n // switchMap cancels the previous request, fixing stale responses overwriting newer ones\n this.load$.pipe(\n switchMap(() => this.fetchPage()),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(result => this.applyResult(result));\n }\n\n private fetchPage(): Observable<SelectDataSourceContent<Model> | null> {\n this.loading.set(true);\n\n const request = this.dataSource().load({\n query: this.query(),\n page: this.page,\n size: this.pageSize()\n });\n\n return request.pipe(catchError(() => of(null)));\n }\n\n private applyResult(result: SelectDataSourceContent<Model> | null): void {\n this.loading.set(false);\n\n if (result) {\n this.items.update(items => [...items, ...result.items]);\n this.hasMore.set(result.hasMore);\n }\n\n this.cdr.markForCheck();\n }\n\n open(): void {\n if (!this.disabled()) {\n this.isOpen.set(true);\n }\n }\n\n toggle(): void {\n if (this.isOpen()) {\n this.isOpen.set(false);\n } else {\n this.open();\n }\n }\n\n select(item: Model): void {\n this.selectedItem.set(item);\n this.selectionChange.emit(item);\n }\n\n isSelected(item: Model): boolean {\n const compare = this.compareWith();\n\n if (item === null) {\n return false;\n }\n\n if (this.multiple()) {\n return this.selectedItems().some(selected =>\n compare(selected, item)\n );\n }\n\n const selected = this.selectedItem();\n\n return selected !== null && compare(selected, item);\n }\n\n toggleItem(item: Model): void {\n const compare = this.compareWith();\n\n this.selectedItems.update(selected =>\n this.isSelected(item)\n ? selected.filter(existing => !compare(existing, item))\n : [...selected, item]\n );\n }\n\n removeItem(item: Model): void {\n const compare = this.compareWith();\n\n this.selectedItems.update(selected =>\n selected.filter(existing => !compare(existing, item))\n );\n }\n\n clear(): void {\n if (this.multiple()) {\n this.selectedItems.set([]);\n } else {\n this.selectedItem.set(null);\n this.selectionChange.emit(null);\n }\n\n this.isOpen.set(false);\n this.focusTrigger();\n\n if (this.searchMode() === 'inline') {\n this.query.set('');\n }\n }\n\n onItemClick(item: Model): void {\n // multiple stays open so several can be ticked in one go\n if (this.multiple()) {\n this.toggleItem(item);\n return;\n }\n\n this.select(item);\n this.isOpen.set(false);\n this.focusTrigger();\n\n // The behaviour of clearing the inline search flows better than\n // leaving it as is. Clicking into the input with a value already\n // selected will reveal the previous query which may be confusing.\n if (this.searchMode() === 'inline') {\n this.query.set('');\n }\n }\n\n onCreate(): void {\n const query = this.createQuery();\n\n if (!query) {\n return;\n }\n\n this.create.emit(query);\n this.query.set('');\n\n if (!this.multiple()) {\n this.isOpen.set(false);\n this.focusTrigger();\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n const count = this.pickable().length;\n // space types in search boxes, only the plain trigger treats it as a pick\n const isSpacePick = event.key === ' ' && this.searchMode() === 'none';\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n\n if (!this.isOpen()) {\n this.open();\n return;\n }\n\n this.moveActive(event.key === 'ArrowDown' ? 1 : -1, count);\n return;\n case 'Home':\n case 'End':\n if (this.isOpen() && count && this.searchMode() === 'none') {\n event.preventDefault();\n this.setActive(event.key === 'Home' ? 0 : count - 1);\n }\n return;\n case 'Enter':\n case ' ':\n if (event.key === ' ' && !isSpacePick) {\n return;\n }\n\n event.preventDefault();\n\n if (!this.isOpen()) {\n this.open();\n } else {\n this.pickActive();\n }\n return;\n case 'Escape':\n // the overlay closes itself, focus just needs a home\n this.focusTrigger();\n return;\n }\n }\n\n onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget;\n\n if (this.closeBehaviour() === 'none') {\n return;\n }\n\n // tabbing away closes it, moving between the trigger and the list doesn't\n if (\n !(next instanceof Node) ||\n !this.host.nativeElement.contains(next)\n ) {\n this.isOpen.set(false);\n }\n }\n\n setActive(index: number): void {\n this.activeIndex.set(index);\n\n afterNextRender(() => this.scrollActiveIntoView(), {\n injector: this.injector\n });\n }\n\n loadFirstPage(): void {\n this.page = 0;\n this.items.set([]);\n this.hasMore.set(true);\n\n this.load$.next();\n }\n\n loadNextPage(): void {\n if (this.loading() || !this.hasMore()) {\n return;\n }\n\n this.page++;\n this.load$.next();\n }\n\n onQueryChange(query: string): void {\n // sets straight away so the search box doesn't fight the user's typing, the\n // constructor's toObservable pipeline debounces the actual reload\n this.query.set(query);\n this.activeIndex.set(0);\n this.open();\n }\n\n onScroll(scrollContainer: HTMLElement): void {\n const remainingPixels = scrollContainer.scrollHeight\n - scrollContainer.scrollTop\n - scrollContainer.clientHeight;\n\n if (remainingPixels < 48) {\n this.loadNextPage();\n }\n }\n\n private pickActive(): void {\n const row = this.pickable()[this.activeIndex()];\n\n if (!row) {\n return;\n }\n\n if (row.kind === 'clear') {\n this.clear();\n } else if (row.kind === 'create') {\n this.onCreate();\n } else if (row.kind === 'item') {\n this.onItemClick(row.item);\n }\n }\n\n private moveActive(step: number, count: number): void {\n if (count) {\n this.setActive((this.activeIndex() + step + count) % count);\n }\n }\n\n private scrollActiveIntoView(): void {\n const id = this.activeId();\n\n if (id) {\n this.host.nativeElement\n .querySelector(`#${id}`)\n ?.scrollIntoView({ block: 'nearest' });\n }\n }\n\n private focusTrigger(): void {\n const trigger = this.searchMode() === 'inline'\n ? this.searchInput()\n : this.host.nativeElement.querySelector<HTMLElement>('.ui-select');\n\n trigger?.focus();\n }\n\n // the inline box or the one inside the dropdown, never both\n private searchInput(): HTMLInputElement | null {\n return this.host.nativeElement.querySelector('ui-input input');\n }\n\n private rowId(index: number): string {\n return `${this.listId}-${index}`;\n }\n}\n","<ui-dropdown\n [isOpen]=\"isOpen\"\n [placement]=\"placement()\"\n [closeBehaviour]=\"closeBehaviour()\"\n matchWidth=\"minWidth\"\n class=\"w-full\"\n>\n @if (searchMode() === 'inline') {\n <ui-input\n [value]=\"isOpen() ? query() : triggerLabel()\"\n (valueChange)=\"onQueryChange($event)\"\n [placeholder]=\"triggerLabel()\"\n [disabled]=\"disabled()\"\n [id]=\"id()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n [ariaControls]=\"listId\"\n [ariaActiveDescendant]=\"activeId()\"\n inputRole=\"combobox\"\n ariaAutocomplete=\"list\"\n ariaHasPopup=\"listbox\"\n class=\"border-0!\"\n classes=\"h-auto! py-1.5!\"\n autocomplete=\"off\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n >\n <ng-template #trailing>\n <ng-icon\n name=\"heroChevronDown\"\n class=\"mx-3 size-4 text-muted-foreground transition-transform duration-100 shrink-0\"\n [class.rotate-180]=\"isOpen()\"\n />\n </ng-template>\n </ui-input>\n } @else {\n <div\n class=\"ui-select-trigger\"\n [class.ui-select-trigger--tags]=\"showTags()\"\n >\n <button\n type=\"button\"\n class=\"flex justify-between items-center gap-2 px-3 py-1.5 text-left ui-select\"\n aria-haspopup=\"listbox\"\n [attr.id]=\"id() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"searchMode() === 'none' ? activeId() : null\"\n [disabled]=\"disabled()\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n >\n @if (showTags()) {\n <!-- the visible tags sit on top, this names the button for screen readers -->\n <span class=\"sr-only\">{{ triggerLabel() }}</span>\n } @else if (!multiple() && triggerTemplate() && selectedItem() !== null) {\n <span class=\"flex items-center gap-2 min-w-0 ui-text-body\">\n <ng-container\n *ngTemplateOutlet=\"triggerTemplate()!; context: { $implicit: selectedItem()! }\"\n />\n </span>\n } @else if (multiple()) {\n <span class=\"ui-text-body ui-select-label\" [class.text-muted-foreground-1]=\"isEmpty()\">\n <span\n class=\"ui-select-label-sizer\"\n aria-hidden=\"true\"\n >{{ placeholder() }}</span>\n <span class=\"ui-select-label-text\">{{\n triggerLabel()\n }}</span>\n </span>\n } @else {\n <span class=\"ui-text-body truncate\" [class.text-muted-foreground-1]=\"isEmpty()\">{{\n triggerLabel()\n }}</span>\n }\n\n <ng-icon\n name=\"heroChevronDown\"\n class=\"ms-auto size-4 text-muted-foreground transition-transform duration-100 shrink-0\"\n [class.rotate-180]=\"isOpen()\"\n />\n </button>\n\n @if (showTags()) {\n <span\n class=\"ui-text-body ui-select-tags-sizer\"\n aria-hidden=\"true\"\n >\n {{ placeholder() }}\n </span>\n\n <div class=\"ui-select-tags\">\n @for (item of selectedItems(); track $index) {\n <ui-badge\n intent=\"secondary\"\n appearance=\"soft\"\n size=\"xs\"\n class=\"ui-select-tag ui-text-caption\"\n >\n <span class=\"truncate\">{{\n displayWith()(item)\n }}</span>\n\n @if (!disabled()) {\n <button\n type=\"button\"\n class=\"ui-select-tag-remove\"\n [attr.aria-label]=\"'Remove ' + displayWith()(item)\"\n (click)=\"removeItem(item)\"\n >\n <ng-icon\n name=\"heroXMark\"\n class=\"size-3 shrink-0\"\n />\n </button>\n }\n </ui-badge>\n } @empty {\n <span\n class=\"text-muted-foreground-1 ui-text-body truncate\"\n >\n {{ placeholder() }}\n </span>\n }\n </div>\n }\n </div>\n }\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <ui-card radius=\"lg\" class=\"divide-y overflow-hidden\">\n @if (searchMode() === 'dropdown') {\n <div class=\"p-2\">\n <ui-input\n [value]=\"query()\"\n (valueChange)=\"onQueryChange($event)\"\n (keydown)=\"onKeydown($event)\"\n [ariaExpanded]=\"true\"\n [ariaControls]=\"listId\"\n [ariaActiveDescendant]=\"activeId()\"\n inputRole=\"combobox\"\n ariaAutocomplete=\"list\"\n ariaLabel=\"Search options\"\n autocomplete=\"off\"\n placeholder=\"Search...\"\n />\n </div>\n }\n\n <div\n #scrollContainer\n class=\"py-1 max-h-60 overflow-y-auto\"\n role=\"listbox\"\n [attr.id]=\"listId\"\n [attr.aria-multiselectable]=\"multiple() || null\"\n (scroll)=\"onScroll(scrollContainer)\"\n >\n @for (row of rows(); track row.id) {\n @switch (row.kind) {\n @case ('group') {\n <div\n class=\"ui-text-caption ui-select-group\"\n role=\"presentation\"\n >\n {{ row.label }}\n </div>\n }\n @case ('clear') {\n <button\n type=\"button\"\n role=\"option\"\n aria-selected=\"false\"\n tabindex=\"-1\"\n class=\"text-muted-foreground-1 ui-text-body-alt ui-select-option\"\n [attr.id]=\"row.id\"\n [attr.data-active]=\"row.index === activeIndex() ? '' : null\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"activeIndex.set(row.index)\"\n (click)=\"clear()\"\n >\n <span class=\"truncate\">{{\n clearLabel()\n }}</span>\n </button>\n }\n @case ('item') {\n <button\n type=\"button\"\n role=\"option\"\n tabindex=\"-1\"\n class=\"text-dropdown-item-foreground ui-text-body-alt ui-select-option\"\n [attr.id]=\"row.id\"\n [attr.aria-selected]=\"row.selected\"\n [attr.data-active]=\"row.index === activeIndex() ? '' : null\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"activeIndex.set(row.index)\"\n (click)=\"onItemClick(row.item)\"\n >\n @if (optionTemplate(); as template) {\n <span\n class=\"flex items-center gap-2 min-w-0 grow\"\n >\n <ng-container\n *ngTemplateOutlet=\"template; context: {\n $implicit: row.item,\n selected: row.selected,\n active: row.index === activeIndex()\n }\"\n />\n </span>\n } @else {\n <span class=\"truncate\">{{\n row.label\n }}</span>\n }\n\n @if (row.selected) {\n <ng-icon\n name=\"heroCheck\"\n class=\"size-4 text-primary-600! shrink-0\"\n strokeWidth=\"2.5\"\n />\n }\n </button>\n }\n @case ('create') {\n <button\n type=\"button\"\n role=\"option\"\n aria-selected=\"false\"\n tabindex=\"-1\"\n class=\"justify-start! text-primary-600 ui-text-body-alt ui-select-option\"\n [attr.id]=\"row.id\"\n [attr.data-active]=\"row.index === activeIndex() ? '' : null\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"activeIndex.set(row.index)\"\n (click)=\"onCreate()\"\n >\n <ng-icon\n name=\"heroPlus\"\n class=\"size-4 shrink-0\"\n />\n <span class=\"truncate\">{{\n createLabel()(row.query)\n }}</span>\n </button>\n }\n }\n }\n\n @if (loading()) {\n <div class=\"px-3 py-2 text-muted-foreground ui-text-body-alt text-center\">\n Loading...\n </div>\n }\n\n @if (!loading() && items().length === 0 && !createQuery()) {\n <div class=\"px-3 py-2 text-muted-foreground ui-text-body-alt text-center\">\n No results\n </div>\n }\n </div>\n </ui-card>\n </div>\n }\n</ui-dropdown>\n","import { Observable, of } from 'rxjs';\n\n\nexport interface SelectDataSourceParameters {\n query: string;\n page: number;\n size: number;\n}\n\nexport interface SelectDataSourceContent<Model> {\n items: Model[];\n hasMore: boolean;\n}\n\nexport interface SelectDataSource<Model> {\n load(\n params: SelectDataSourceParameters\n ): Observable<SelectDataSourceContent<Model>>;\n}\n\nexport class SelectLocalDataSource<Model> implements SelectDataSource<Model> {\n constructor(\n private readonly items: Model[],\n private readonly search: (item: Model, query: string) => boolean\n ) {}\n\n load(\n params: SelectDataSourceParameters\n ): Observable<SelectDataSourceContent<Model>> {\n const query = params.query.trim();\n\n const filteredItems = query\n ? this.items.filter(item => this.search(item, query))\n : this.items;\n\n const start = params.page * params.size;\n const end = start + params.size;\n\n return of({\n items: filteredItems.slice(start, end),\n hasMore: end < filteredItems.length\n });\n }\n}\n\n// wraps any fetch function, so no specific backend is baked in here\nexport class SelectRemoteDataSource<Model> implements SelectDataSource<Model> {\n constructor(\n private readonly fetch: (\n params: SelectDataSourceParameters\n ) => Observable<SelectDataSourceContent<Model>>\n ) {}\n\n load(\n params: SelectDataSourceParameters\n ): Observable<SelectDataSourceContent<Model>> {\n return this.fetch(params);\n }\n}\n","export type SearchMode =\n | 'none'\n | 'inline'\n | 'dropdown';\n\n/** How a multiple select shows its selection when closed. */\nexport const SelectMultipleDisplays = ['text', 'tags'] as const;\n\n/** @see {@link SelectMultipleDisplays} */\nexport type SelectMultipleDisplay = typeof SelectMultipleDisplays[number];\n\n/** Context for a projected `#option` template. */\nexport interface SelectOptionContext<Model> {\n $implicit: Model;\n selected: boolean;\n active: boolean;\n}\n\n/** Context for a projected `#trigger` template, single select only. */\nexport interface SelectTriggerContext<Model> {\n $implicit: Model;\n}\n\n/** One line in the open list. Groups are headings, the rest can be picked. */\nexport type SelectRow<Model> =\n | { kind: 'group'; id: string; label: string; }\n | { kind: 'clear'; id: string; index: number; }\n | { kind: 'create'; id: string; index: number; query: string; }\n | {\n kind: 'item';\n id: string;\n index: number;\n item: Model;\n label: string;\n selected: boolean;\n };\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model,\n output\n} from '@angular/core';\n\nimport { type TextareaResize, type TextareaValidation } from './textarea.types';\n\n\n@Component({\n selector: 'ui-textarea',\n templateUrl: './textarea.component.html',\n styleUrl: './textarea.component.css'\n})\nexport class UiTextareaComponent {\n readonly value = model.required<string>();\n\n readonly classes = input<string>('');\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n\n readonly rows = input<number>(3);\n readonly resize = input<TextareaResize>('vertical');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<TextareaValidation>(null);\n\n readonly minlength = input<number | null>(null);\n readonly maxlength = input<number | null>(null);\n\n readonly autofocus = input(false, { transform: booleanAttribute });\n readonly spellcheck = input(true, { transform: booleanAttribute });\n\n readonly ariaLabel = input<string>('');\n readonly describedBy = input<string>('');\n\n readonly focused = output<FocusEvent>();\n readonly blurred = output<FocusEvent>();\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-textarea',\n 'ui-text-body',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected handleInput(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n\n this.value.set(target.value);\n }\n\n protected handleFocus(event: FocusEvent): void {\n this.focused.emit(event);\n }\n\n protected handleBlur(event: FocusEvent): void {\n this.blurred.emit(event);\n }\n}\n","<textarea\n [value]=\"value()\"\n [class]=\"generatedClasses()\"\n [attr.id]=\"id() || null\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [rows]=\"rows()\"\n [style.resize]=\"resize()\"\n [attr.maxlength]=\"maxlength()\"\n [attr.minlength]=\"minlength()\"\n \n [attr.spellcheck]=\"spellcheck()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n></textarea>\n","/** Native resize values for the textarea element. */\nexport const TextareaResizeOptions = [\n 'none',\n 'both',\n 'horizontal',\n 'vertical'\n] as const;\n\n/** @see {@link TextareaResizeOptions} */\nexport type TextareaResize = typeof TextareaResizeOptions[number];\n\n/** true is valid, false is invalid, null is not yet validated. */\nexport type TextareaValidation = boolean | null;\n","import {\n Component,\n computed,\n contentChild,\n input,\n TemplateRef\n} from '@angular/core';\n\nimport { AlertAppearance, AlertIntent } from './alert.types';\n\n\n@Component({\n selector: 'ui-alert',\n templateUrl: './alert.component.html',\n styleUrl: './alert.component.css',\n host: {\n role: 'alert',\n '[class]': 'generatedClasses()'\n }\n})\nexport class UiAlertComponent {\n readonly appearance = input<AlertAppearance>('soft');\n readonly intent = input<AlertIntent>('info');\n\n readonly icon = contentChild<TemplateRef<unknown>>('icon', {\n descendants: false\n });\n\n readonly generatedClasses = computed(() =>\n [\n 'block',\n 'ui-alert',\n `ui-alert--${this.appearance()}`,\n `ui-alert--${this.intent()}`\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","<ng-content />\n","export const AlertIntents = [\n 'info',\n 'success',\n 'warning',\n 'danger'\n];\n\nexport const AlertAppearances = [\n 'soft',\n 'bordered'\n] as const;\n\nexport type AlertIntent = typeof AlertIntents[number];\nexport type AlertAppearance = typeof AlertAppearances[number];\n","import { Component, computed, input, signal } from '@angular/core';\n\nimport type { AvatarSize } from './avatar.types';\n\n\n@Component({\n selector: 'ui-avatar',\n templateUrl: './avatar.component.html',\n styleUrl: './avatar.component.css',\n host: {\n role: 'img',\n '[attr.aria-label]': 'name()',\n '[class]': 'generatedClasses()'\n }\n})\nexport class UiAvatarComponent {\n readonly name = input.required<string>();\n readonly src = input<string | null>(null);\n readonly size = input<AvatarSize>('md');\n\n private readonly failedSrc = signal<string | null>(null);\n\n protected readonly showImage = computed(() => {\n const src = this.src();\n\n return !!src && src !== this.failedSrc();\n });\n\n protected readonly initials = computed(() => {\n const words = this.name().trim().split(/\\s+/).filter(Boolean);\n const first = words[0]?.[0] ?? '';\n const last = words.length > 1 ? words[words.length - 1][0] : '';\n\n return (first + last).toUpperCase();\n });\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-avatar',\n `ui-avatar--${this.size()}`,\n this.size() === 'lg' ? 'ui-text-body-alt' : 'ui-text-caption'\n ].join(' ')\n );\n\n protected imageFailed(): void {\n this.failedSrc.set(this.src());\n }\n}\n","@if (showImage()) {\n <img class=\"ui-avatar-image\" [src]=\"src()\" alt=\"\" (error)=\"imageFailed()\" />\n} @else {\n <span aria-hidden=\"true\">{{ initials() }}</span>\n}\n","export const AvatarSizes = ['sm', 'md', 'lg'] as const;\n\n/** @see {@link AvatarSizes} */\nexport type AvatarSize = typeof AvatarSizes[number];\n","export const BadgeIntents = [\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger'\n] as const;\n\nexport const BadgeAppearances = [\n 'solid',\n 'outline',\n 'soft'\n] as const;\n\nexport const BadgeSizes = [\n 'xs',\n 'sm',\n 'md',\n 'lg'\n] as const;\n\nexport type BadgeIntent = typeof BadgeIntents[number];\nexport type BadgeAppearance = typeof BadgeAppearances[number];\nexport type BadgeSize = typeof BadgeSizes[number];\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport type {\n ButtonAppearance,\n ButtonIntent,\n ButtonSize,\n ButtonType\n} from './button.types';\n\n\n/**\n * A general-purpose button.\n */\n@Component({\n selector: 'ui-button',\n templateUrl: './button.component.html',\n styleUrl: './button.component.css'\n})\nexport class UiButtonComponent {\n readonly appearance = input<ButtonAppearance>('solid');\n readonly intent = input<ButtonIntent>('primary');\n readonly size = input<ButtonSize>('md');\n readonly classes = input<string>('');\n\n readonly type = input<ButtonType>('button');\n readonly ariaLabel = input<string>('');\n\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly loading = input(false, { transform: booleanAttribute });\n\n /**\n * Whether the underlying `<button>` element should be disabled - true when\n * `disabled` is set explicitly, or implicitly while `loading` is true.\n */\n readonly isDisabled = computed(() => this.disabled() || this.loading());\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-button',\n this.intentAndAppearanceClasses(),\n this.sizeClasses(),\n this.textClasses(),\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n private readonly intentAndAppearanceClasses = computed(() => {\n const intent = this.intent();\n const appearance = this.appearance();\n\n return [intent, appearance].includes('none') ?\n '' :\n `ui-button--${intent}-${appearance}`;\n });\n\n private readonly sizeClasses = computed(() => `ui-button--${this.size()}`);\n\n private readonly textClasses = computed(() => ({\n sm: 'ui-text-caption',\n md: 'ui-text-body',\n lg: 'ui-text-body'\n }[this.size()]));\n}\n","<button\n [type]=\"type()\"\n [disabled]=\"isDisabled()\"\n [class]=\"generatedClasses()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-busy]=\"loading() || null\"\n>\n <ng-content></ng-content>\n\n @if (loading()) {\n <span class=\"sr-only\">Loading</span>\n\n <span class=\"flex items-end justify-center\" aria-hidden=\"true\">\n <span class=\"ms-0.5 inline-flex items-end gap-px pb-px\">\n <span class=\"ui-button__loading-dot\">.</span>\n <span class=\"ui-button__loading-dot\">.</span>\n <span class=\"ui-button__loading-dot\">.</span>\n </span>\n </span>\n }\n</button>\n","/**\n * The semantic colour of a button. `\"none\"` opts out of intent/appearance\n * styling entirely - see `UiButtonComponent.intent`.\n */\nexport const ButtonIntents = [\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger',\n 'none'\n] as const;\n\n/**\n * The visual treatment of a button (fill, outline, etc.), combined with its\n * `intent` to select a variant class. `\"none\"` opts out of intent/appearance\n * styling entirely - see `UiButtonComponent.appearance`.\n */\nexport const ButtonAppearances = [\n 'solid',\n 'outline',\n 'ghost',\n 'white',\n 'link',\n 'none'\n] as const;\n\n/** The size of a button, controlling its padding and typography scale. */\nexport const ButtonSizes = [\n 'sm',\n 'md',\n 'lg'\n] as const;\n\n/** The native `type` attribute a button can render with. */\nexport const ButtonTypes = [\n 'button',\n 'submit',\n 'reset'\n] as const;\n\n/** @see {@link ButtonIntents} */\nexport type ButtonIntent = typeof ButtonIntents[number];\n\n/** @see {@link ButtonAppearances} */\nexport type ButtonAppearance = typeof ButtonAppearances[number];\n\n/** @see {@link ButtonSizes} */\nexport type ButtonSize = typeof ButtonSizes[number];\n\n/** @see {@link ButtonTypes} */\nexport type ButtonType = typeof ButtonTypes[number];\n","import { Component, contentChildren } from '@angular/core';\n\nimport { UiButtonComponent } from '../button/button.component';\n\n\n/**\n * @example\n * ```html\n * <ui-button-group>\n * <ui-button intent=\"secondary\" appearance=\"white\">First</ui-button>\n * <ui-button intent=\"secondary\" appearance=\"white\">Second</ui-button>\n * <ui-button intent=\"secondary\" appearance=\"white\">Last</ui-button>\n * </ui-button-group>\n * ```\n */\n@Component({\n selector: 'ui-button-group',\n template: '<ng-content></ng-content>',\n host: { class: 'inline-flex' }\n})\nexport class UiButtonGroupComponent {\n readonly buttons = contentChildren(UiButtonComponent, {\n descendants: false\n });\n}\n","import type { IsoDate, IsoDateTime } from './calendar.types';\n\n\nconst ISO_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst TIME_PATTERN = /^([01]\\d|2[0-3]):([0-5]\\d)$/;\n\n// dates are built from local parts so a timezone never shifts the day\nexport function toIsoDate(date: Date): IsoDate {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n}\n\n/** Local midnight for an ISO date, or null when it isn't a real date. */\nexport function parseIsoDate(value: IsoDate | null | undefined): Date | null {\n const match = value ? ISO_PATTERN.exec(value) : null;\n\n if (!match) {\n return null;\n }\n\n const [, year, month, day] = match.map(Number);\n const date = new Date(year, month - 1, day);\n\n // rejects things like 2026-02-31 rolling over into March\n return date.getMonth() === month - 1 ? date : null;\n}\n\nexport function addDays(date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\n}\n\n/** Moves by whole months, keeping the day where it can (31 Jan + 1 -> 28 Feb). */\nexport function addMonths(date: Date, months: number): Date {\n const target = new Date(date.getFullYear(), date.getMonth() + months, 1);\n const lastDay = daysInMonth(target.getFullYear(), target.getMonth());\n\n target.setDate(Math.min(date.getDate(), lastDay));\n\n return target;\n}\n\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\n/** Local date and time for \"2026-09-29T14:30\", a date-only string gives midnight. */\nexport function parseIsoDateTime(\n value: IsoDateTime | null | undefined\n): Date | null {\n const date = parseIsoDate(value?.slice(0, 10));\n const time = parseTime(value?.slice(11, 16));\n\n if (date && time) {\n date.setHours(time.hours, time.minutes);\n }\n\n return date;\n}\n\n/** \"14:30\" -> { hours: 14, minutes: 30 }, or null when it isn't a real time. */\nexport function parseTime(\n value: string | null | undefined\n): { hours: number; minutes: number } | null {\n const match = value ? TIME_PATTERN.exec(value) : null;\n\n return match ? { hours: Number(match[1]), minutes: Number(match[2]) } : null;\n}\n\nexport function toTime(hours: number, minutes: number): string {\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;\n}\n","import {\n afterNextRender,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n linkedSignal,\n model,\n signal\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroChevronLeft, heroChevronRight } from '@ng-icons/heroicons/outline';\n\nimport { UiSelectComponent } from '../../forms/select/select.component';\nimport { SelectLocalDataSource } from '../../forms/select/select.datasource';\nimport type {\n CalendarDay,\n CalendarMode,\n DateRange,\n IsoDate,\n WeekStart\n} from './calendar.types';\nimport { addDays, addMonths, parseIsoDate, toIsoDate } from './calendar.utils';\n\n\n// always six rows so the calendar doesn't jump in height between months\nconst GRID_DAYS = 42;\nconst YEARS_BACK = 100;\nconst YEARS_FORWARD = 10;\n\n@Component({\n selector: 'ui-calendar',\n templateUrl: './calendar.component.html',\n styleUrl: './calendar.component.css',\n imports: [NgIcon, UiSelectComponent],\n providers: [provideIcons({ heroChevronLeft, heroChevronRight })]\n})\nexport class UiCalendarComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n readonly mode = input<CalendarMode>('single');\n\n /** The picked date in single mode. */\n readonly value = model<IsoDate | null>(null);\n\n /** The picked start and end in range mode. */\n readonly range = model<DateRange>({ start: null, end: null });\n\n readonly min = input<IsoDate | null>(null);\n readonly max = input<IsoDate | null>(null);\n readonly isDateDisabled = input<(date: IsoDate) => boolean>(() => false);\n\n readonly weekStart = input<WeekStart>(1);\n readonly locale = input<string>('en-GB');\n\n protected readonly today = toIsoDate(new Date());\n\n // a string so picking a range end doesn't count as a change and jump the view\n private readonly anchorDate = computed(() =>\n this.mode() === 'range' ? this.range().start : this.value()\n );\n\n // the date keyboard focus sits on, follows the anchor until the user moves it\n private readonly activeDate = linkedSignal(\n () => parseIsoDate(this.anchorDate()) ?? parseIsoDate(this.today)!\n );\n\n // previews the end of a half picked range\n private readonly hoveredDate = signal<IsoDate | null>(null);\n\n protected readonly viewMonth = linkedSignal(() =>\n this.activeDate().getMonth()\n );\n protected readonly viewYear = linkedSignal(() =>\n this.activeDate().getFullYear()\n );\n\n protected readonly monthNames = computed(() => {\n const format = new Intl.DateTimeFormat(this.locale(), {\n month: 'long'\n });\n\n return Array.from(\n { length: 12 },\n (_, month) => format.format(new Date(2026, month, 1))\n );\n });\n\n protected readonly weekdays = computed(() => {\n const format = new Intl.DateTimeFormat(this.locale(), {\n weekday: 'short'\n });\n\n // 4 Jan 2026 is a Sunday\n return Array.from(\n { length: 7 },\n (_, index) =>\n format.format(\n new Date(2026, 0, 4 + (this.weekStart() + index) % 7)\n )\n .slice(0, 2)\n );\n });\n\n protected readonly monthSource = computed(() =>\n new SelectLocalDataSource(\n Array.from({ length: 12 }, (_, month) => month),\n () => true\n )\n );\n\n protected readonly yearSource = computed(() => {\n const current = new Date().getFullYear();\n const selected = parseIsoDate(this.anchorDate())?.getFullYear() ??\n current;\n const first = parseIsoDate(this.min())?.getFullYear() ??\n Math.min(current - YEARS_BACK, selected);\n const last = parseIsoDate(this.max())?.getFullYear() ??\n Math.max(current + YEARS_FORWARD, selected);\n\n // newest first, recent years are what people usually want\n const years = Array.from(\n { length: last - first + 1 },\n (_, index) => last - index\n );\n\n return new SelectLocalDataSource(years, () => true);\n });\n\n protected readonly displayMonth = (month: number) =>\n this.monthNames()[month];\n\n protected readonly days = computed<CalendarDay[]>(() => {\n const year = this.viewYear();\n const month = this.viewMonth();\n const { start, end, previewEnd } = this.rangeBounds();\n const labelFormat = new Intl.DateTimeFormat(this.locale(), {\n dateStyle: 'full'\n });\n\n const first = new Date(year, month, 1);\n const offset = (first.getDay() - this.weekStart() + 7) % 7;\n const gridStart = addDays(first, -offset);\n\n return Array.from({ length: GRID_DAYS }, (_, index) => {\n const date = addDays(gridStart, index);\n const iso = toIsoDate(date);\n\n return {\n iso,\n day: date.getDate(),\n label: labelFormat.format(date),\n isOutside: date.getMonth() !== month,\n isToday: iso === this.today,\n isSelected: iso === start || iso === end,\n isDisabled: this.isUnavailable(iso),\n isInRange: !!start &&\n !!previewEnd &&\n iso > start &&\n iso < previewEnd,\n isRangeStart: !!previewEnd &&\n iso === start &&\n start !== previewEnd,\n isRangeEnd: !!start &&\n iso === previewEnd &&\n start !== previewEnd\n };\n });\n });\n\n private readonly rangeBounds = computed(() => {\n if (this.mode() === 'single') {\n return { start: this.value(), end: null, previewEnd: null };\n }\n\n const { start, end } = this.range();\n const hovered = this.hoveredDate();\n const preview = !end && start && hovered && hovered > start\n ? hovered\n : null;\n\n return { start, end, previewEnd: end ?? preview };\n });\n\n /** Only one day is tabbable, arrow keys move between the rest. */\n protected readonly tabbableDate = computed(() => {\n const active = this.activeDate();\n const inView = active.getFullYear() === this.viewYear() &&\n active.getMonth() === this.viewMonth();\n\n return toIsoDate(\n inView ? active : new Date(this.viewYear(), this.viewMonth(), 1)\n );\n });\n\n protected readonly canGoBack = computed(() => {\n const min = this.min();\n const lastOfPrevious = new Date(this.viewYear(), this.viewMonth(), 0);\n\n return !min || toIsoDate(lastOfPrevious) >= min;\n });\n\n protected readonly canGoForward = computed(() => {\n const max = this.max();\n const firstOfNext = new Date(this.viewYear(), this.viewMonth() + 1, 1);\n\n return !max || toIsoDate(firstOfNext) <= max;\n });\n\n /** Moves focus onto the active day, e.g. when a datepicker opens. */\n focusActiveDate(): void {\n this.host.nativeElement\n .querySelector<HTMLButtonElement>(\n `[data-date=\"${this.tabbableDate()}\"]`\n )\n ?.focus();\n }\n\n protected showMonth(offset: number): void {\n const target = new Date(this.viewYear(), this.viewMonth() + offset, 1);\n\n this.viewYear.set(target.getFullYear());\n this.viewMonth.set(target.getMonth());\n }\n\n protected select(day: CalendarDay): void {\n if (day.isDisabled) {\n return;\n }\n\n if (this.mode() === 'single') {\n this.value.set(day.iso);\n return;\n }\n\n const { start, end } = this.range();\n\n // a fresh click starts over, picking before the start moves the start\n if (!start || end || day.iso < start) {\n this.range.set({ start: day.iso, end: null });\n } else {\n this.range.set({ start, end: day.iso });\n }\n }\n\n protected preview(date: IsoDate | null): void {\n if (this.mode() === 'range') {\n this.hoveredDate.set(date);\n }\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n const current = parseIsoDate(this.tabbableDate())!;\n const target = this.keyTarget(event, current);\n\n if (!target) {\n return;\n }\n\n event.preventDefault();\n\n this.activeDate.set(target);\n this.viewYear.set(target.getFullYear());\n this.viewMonth.set(target.getMonth());\n\n afterNextRender(() => this.focusActiveDate(), {\n injector: this.injector\n });\n }\n\n private keyTarget(event: KeyboardEvent, current: Date): Date | null {\n const dayOfWeek = (current.getDay() - this.weekStart() + 7) % 7;\n\n switch (event.key) {\n case 'ArrowLeft':\n return addDays(current, -1);\n case 'ArrowRight':\n return addDays(current, 1);\n case 'ArrowUp':\n return addDays(current, -7);\n case 'ArrowDown':\n return addDays(current, 7);\n case 'Home':\n return addDays(current, -dayOfWeek);\n case 'End':\n return addDays(current, 6 - dayOfWeek);\n case 'PageUp':\n return addMonths(current, event.shiftKey ? -12 : -1);\n case 'PageDown':\n return addMonths(current, event.shiftKey ? 12 : 1);\n default:\n return null;\n }\n }\n\n private isUnavailable(iso: IsoDate): boolean {\n const min = this.min();\n const max = this.max();\n\n // ISO dates sort the same as strings\n return (!!min && iso < min) ||\n (!!max && iso > max) ||\n this.isDateDisabled()(iso);\n }\n}\n","<div class=\"ui-calendar-header\">\n <button\n type=\"button\"\n class=\"ui-calendar-nav\"\n aria-label=\"Previous month\"\n [disabled]=\"!canGoBack()\"\n (click)=\"showMonth(-1)\"\n >\n <ng-icon name=\"heroChevronLeft\" class=\"shrink-0\" />\n </button>\n\n <div class=\"ui-calendar-selects\">\n <ui-select\n class=\"ui-calendar-month\"\n [dataSource]=\"monthSource()\"\n [displayWith]=\"displayMonth\"\n [pageSize]=\"12\"\n [(selectedItem)]=\"viewMonth\"\n />\n <ui-select\n class=\"ui-calendar-year\"\n [dataSource]=\"yearSource()\"\n [pageSize]=\"500\"\n [(selectedItem)]=\"viewYear\"\n />\n </div>\n\n <button\n type=\"button\"\n class=\"ui-calendar-nav\"\n aria-label=\"Next month\"\n [disabled]=\"!canGoForward()\"\n (click)=\"showMonth(1)\"\n >\n <ng-icon name=\"heroChevronRight\" class=\"shrink-0\" />\n </button>\n</div>\n\n<div class=\"ui-calendar-weekdays\" aria-hidden=\"true\">\n @for (weekday of weekdays(); track $index) {\n <span class=\"ui-calendar-weekday ui-text-caption\">{{ weekday }}</span>\n }\n</div>\n\n<div class=\"ui-calendar-grid\" (mouseleave)=\"preview(null)\">\n @for (day of days(); track day.iso) {\n <button\n type=\"button\"\n class=\"ui-calendar-day ui-text-body-alt\"\n [attr.data-date]=\"day.iso\"\n [attr.data-outside]=\"day.isOutside ? '' : null\"\n [attr.data-today]=\"day.isToday ? '' : null\"\n [attr.data-in-range]=\"day.isInRange ? '' : null\"\n [attr.data-range-start]=\"day.isRangeStart ? '' : null\"\n [attr.data-range-end]=\"day.isRangeEnd ? '' : null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-pressed]=\"day.isSelected\"\n [attr.aria-label]=\"day.label\"\n [tabindex]=\"day.iso === tabbableDate() ? 0 : -1\"\n [attr.aria-disabled]=\"day.isDisabled || null\"\n (click)=\"select(day)\"\n (keydown)=\"handleKeydown($event)\"\n (mouseenter)=\"preview(day.iso)\"\n (focus)=\"preview(day.iso)\"\n >\n {{ day.day }}\n </button>\n }\n</div>\n","/** Which day each calendar row starts on. 0 is Sunday, 1 is Monday. */\nexport const WeekStarts = [0, 1] as const;\n\n/** @see {@link WeekStarts} */\nexport type WeekStart = typeof WeekStarts[number];\n\n/** A date-only ISO string, e.g. \"2026-09-29\". */\nexport type IsoDate = string;\n\nexport interface CalendarDay {\n iso: IsoDate;\n day: number;\n label: string;\n isOutside: boolean;\n isToday: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n isInRange: boolean;\n isRangeStart: boolean;\n isRangeEnd: boolean;\n}\n\n/** A local date and time ISO string, e.g. \"2026-09-29T14:30\". */\nexport type IsoDateTime = string;\n\n/** Whether a calendar picks one date or a start and end. */\nexport const CalendarModes = ['single', 'range'] as const;\n\n/** @see {@link CalendarModes} */\nexport type CalendarMode = typeof CalendarModes[number];\n\nexport interface DateRange {\n start: IsoDate | null;\n end: IsoDate | null;\n}\n","import { Component, input } from '@angular/core';\n\nimport type { CardHeadingLevel } from './card-header.types';\n\n\n@Component({\n selector: 'ui-card-header',\n templateUrl: './card-header.component.html',\n host: { class: 'block' }\n})\nexport class UiCardHeaderComponent {\n // not `title`, that would also show the native tooltip\n readonly heading = input.required<string>();\n readonly subtitle = input<string>('');\n\n /** Pick the level that fits the page's outline, it doesn't change the look. */\n readonly headingLevel = input<CardHeadingLevel>(2);\n}\n","<header class=\"flex flex-wrap justify-between items-start gap-x-4 gap-y-3 mb-4\">\n <div class=\"min-w-0\">\n @switch (headingLevel()) {\n @case (3) {\n <h3 class=\"text-foreground ui-text-h4\">{{ heading() }}</h3>\n }\n @case (4) {\n <h4 class=\"text-foreground ui-text-h4\">{{ heading() }}</h4>\n }\n @default {\n <h2 class=\"text-foreground ui-text-h4\">{{ heading() }}</h2>\n }\n }\n\n @if (subtitle()) {\n <p class=\"mt-1 text-muted-foreground-1 ui-text-body-alt\">{{ subtitle() }}</p>\n }\n </div>\n\n <div class=\"flex flex-wrap empty:hidden items-center gap-2\"><ng-content /></div>\n</header>\n","export const CardHeadingLevels = [2, 3, 4] as const;\n\n/** @see {@link CardHeadingLevels} */\nexport type CardHeadingLevel = typeof CardHeadingLevels[number];\n","import { Component } from '@angular/core';\n\n\n@Component({\n selector: 'ui-container',\n template: '<ng-content></ng-content>',\n host: { class: 'block container' }\n})\nexport class UiContainerComponent {}\n","import { Component, model } from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroXMark } from '@ng-icons/heroicons/outline';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\n@Component({\n selector: 'ui-modal-close-btn',\n templateUrl: './modal-close-btn.component.html',\n imports: [UiButtonComponent, NgIcon],\n providers: [provideIcons({ heroXMark })]\n})\nexport class UiModalCloseButtonComponent {\n readonly isOpen = model.required<boolean>();\n}\n","<ui-button\n appearance=\"white\"\n intent=\"secondary\"\n classes=\"p-2! border-transparent! shadow-none!\"\n (click)=\"isOpen.set(false)\"\n>\n <ng-icon name=\"heroXMark\" strokeWidth=\"2.5\" />\n</ui-button>\n","import { booleanAttribute, Component, input, signal } from '@angular/core';\n\nimport { UiModalCloseButtonComponent } from '../../presets/modal-close-btn/modal-close-btn.component';\n\n\n@Component({\n selector: 'ui-drawer',\n templateUrl: './drawer.component.html',\n styleUrl: './drawer.component.css',\n imports: [UiModalCloseButtonComponent],\n host: { '[class.open]': 'isOpen()' }\n})\nexport class UiDrawerComponent {\n readonly isOpen = signal<boolean>(false);\n readonly enableBackdrop = input(true, { transform: booleanAttribute });\n\n readonly label = input<string>('');\n readonly subLabel = input<string>('');\n}\n","@if (enableBackdrop()) {\n <div\n class=\"absolute inset-0 bg-black/10 transition-opacity\"\n [class.opacity-0]=\"!isOpen()\"\n [class.pointer-events-none]=\"!isOpen()\"\n aria-hidden=\"true\"\n (click)=\"isOpen.set(false)\"\n >\n </div>\n}\n\n<aside\n class=\"right-0 absolute inset-y-0 bg-layer border-line-2 border-s w-100 max-w-full h-full transition-transform duration-200\"\n [class.translate-x-full]=\"!isOpen()\"\n>\n <div class=\"flex flex-col h-full\">\n <header\n class=\"flex justify-between px-5 py-2.5 border-line-2 border-b\"\n [class.items-start]=\"subLabel()\"\n [class.items-center]=\"!subLabel()\"\n >\n <div>\n <h3 class=\"font-semibold ui-text-h3\">{{ label() }}</h3>\n\n @if (subLabel()) {\n <h4 class=\"ui-text-body\">{{ subLabel() }}</h4>\n }\n </div>\n <div class=\"flex items-center gap-x-3 shrink-0\">\n <ng-content select=\"[drawer-actions]\" />\n <ui-modal-close-btn [(isOpen)]=\"isOpen\" />\n </div>\n </header>\n\n <div class=\"p-5 overflow-y-auto grow\">\n <ng-content />\n </div>\n </div>\n</aside>\n","import {\n Component,\n computed,\n ElementRef,\n inject,\n input,\n signal,\n viewChild,\n WritableSignal\n} from '@angular/core';\n\nimport { Placement } from '@floating-ui/dom';\n\nimport { UiOverlayComponent } from '../../layout/overlay/overlay.component';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiTooltipTrigger } from './tooltip.types';\n\n\n@Component({\n selector: 'ui-tooltip',\n exportAs: 'uiTooltip',\n templateUrl: './tooltip.component.html',\n styleUrl: './tooltip.component.css',\n imports: [UiOverlayComponent],\n host: {\n class: 'inline-flex size-fit',\n '(mouseenter)': 'onHover(true)',\n '(mouseleave)': 'onHover(false)',\n '(focusin)': 'onFocus(true)',\n '(focusout)': 'onFocus(false)',\n '(click)': 'onClick()'\n }\n})\nexport class UiTooltipComponent {\n protected readonly anchor = inject(ElementRef<HTMLElement>);\n protected readonly content = viewChild('content', { read: ElementRef });\n\n readonly text = input.required<string>();\n readonly placement = input<Placement>('top');\n readonly trigger = input<UiTooltipTrigger>('hover');\n readonly classes = input<string>('');\n\n readonly isOpen = input<WritableSignal<boolean>>(signal(false));\n\n protected readonly closeBehaviour = computed<UiOverlayCloseBehaviour>(() =>\n this.trigger() === 'click'\n ? 'whenClickOutside'\n : 'none'\n );\n\n protected readonly generatedClasses = computed(() =>\n ['ui-tooltip', 'ui-text-caption', this.classes()]\n .filter(Boolean)\n .join(' ')\n );\n\n protected onHover(isHovering: boolean) {\n if (this.trigger() === 'hover') {\n this.isOpen().set(isHovering);\n }\n }\n\n // Hover also listens to focus so keyboard users still get the tooltip\n protected onFocus(isFocused: boolean) {\n if (['hover', 'focus'].includes(this.trigger())) {\n this.isOpen().set(isFocused);\n }\n }\n\n protected onClick() {\n if (this.trigger() === 'click') {\n this.isOpen().update(value => !value);\n }\n }\n}\n","<ui-overlay\n [isOpen]=\"isOpen()\"\n [closeBehaviour]=\"closeBehaviour()\"\n [content]=\"content()\"\n [anchor]=\"anchor\"\n [placement]=\"placement()\"\n>\n <ng-content />\n\n @if (isOpen()()) {\n <div #content class=\"p-1.5\" style=\"position: fixed; z-index: 60\">\n <div role=\"tooltip\" [class]=\"generatedClasses()\">{{ text() }}</div>\n </div>\n }\n</ui-overlay>\n","import { Component, input } from '@angular/core';\n\nimport { IconName, NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroQuestionMarkCircle } from '@ng-icons/heroicons/outline';\n\nimport { UiCardComponent } from '../card/card.component';\nimport { UiTooltipComponent } from '../tooltip/tooltip.component';\n\n\n@Component({\n selector: 'ui-kpi',\n templateUrl: './kpi.component.html',\n imports: [UiCardComponent, NgIcon, UiTooltipComponent],\n host: { class: 'block' },\n providers: [provideIcons({ heroQuestionMarkCircle })]\n})\nexport class UiKpiComponent {\n readonly label = input<string>('');\n readonly value = input<string>('');\n readonly hint = input<string>('');\n readonly icon = input<IconName>();\n readonly iconPosition = input<'left' | 'right'>('left');\n}\n","<ui-card radius=\"xl\" class=\"h-full\">\n <div class=\"flex gap-x-4 p-4 md:p-5\">\n @if (icon() && iconPosition() === 'left') {\n <div class=\"flex justify-center items-center bg-surface rounded-lg size-12 shrink-0\">\n <ng-icon\n [name]=\"icon()\"\n size=\"32\"\n class=\"size-8 text-muted-foreground-2 shrink-0\"\n strokeWidth=\"1.5\"\n />\n </div>\n }\n\n <div class=\"grow\">\n <div class=\"flex items-center gap-x-2 text-muted-foreground-2\">\n <span class=\"font-semibold ui-text-h4 text-sm uppercase\">\n {{ label() }}\n </span>\n\n @if (hint()) {\n <ui-tooltip\n [text]=\"hint()\"\n placement=\"top\"\n trigger=\"hover\"\n >\n <ng-icon name=\"heroQuestionMarkCircle\" size=\"18\" />\n </ui-tooltip>\n }\n </div>\n\n <div class=\"flex flex-wrap items-center gap-2 mt-1\">\n <h3 class=\"font-semibold text-foreground ui-text-h2\">\n <!-- falls back to the plain value when nothing is projected -->\n <ng-content select=\"[kpi-value]\">{{ value() }}</ng-content>\n </h3>\n <ng-content select=\"[kpi-badge]\"></ng-content>\n </div>\n </div>\n\n @if (icon() && iconPosition() === 'right') {\n <div class=\"flex justify-center items-center bg-surface rounded-lg size-12 shrink-0\">\n <ng-icon\n [name]=\"icon()\"\n size=\"32\"\n class=\"size-8 text-muted-foreground-2 shrink-0\"\n strokeWidth=\"1.5\"\n />\n </div>\n }\n </div>\n</ui-card>\n","import { Component, computed, input } from '@angular/core';\n\nimport { UiLoadingType } from './loading.types';\n\n\nconst TEXT_TYPES: UiLoadingType[] = [\n 'blinking-caret',\n 'shimmer-text',\n 'loading-dots'\n];\n\n@Component({\n selector: 'ui-loading',\n templateUrl: './loading.component.html',\n styleUrl: './loading.component.css'\n})\nexport class UiLoadingComponent {\n readonly type = input<UiLoadingType>('spinner');\n\n protected readonly hasText = computed(() =>\n TEXT_TYPES.includes(this.type())\n );\n\n protected readonly throbberSpokes = Array.from({ length: 12 }, (_, i) => i);\n}\n","<div class=\"ui-loading\" role=\"status\">\n @switch (type()) {\n @case ('throbber') {\n <svg\n class=\"ui-loading--throbber\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n @for (i of throbberSpokes; track i) {\n <line\n x1=\"12\"\n y1=\"2.5\"\n x2=\"12\"\n y2=\"7\"\n [attr.transform]=\"'rotate(' + i * (360 / throbberSpokes.length) + ' 12 12)'\"\n [style.animation-delay.s]=\"i / throbberSpokes.length - 1\"\n />\n }\n </svg>\n }\n @case ('pulse-ring') {\n <span\n class=\"ui-loading--pulse-ring ui-loading--pulse\"\n aria-hidden=\"true\"\n ></span>\n }\n @case ('pulse-dot') {\n <span\n class=\"ui-loading--pulse ui-loading--pulse-dot\"\n aria-hidden=\"true\"\n ></span>\n }\n @case ('wave') {\n <span\n class=\"ui-loading--row ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3, 4, 5]; track i) {\n <span class=\"ui-loading--bar\"></span>\n }\n </span>\n }\n @case ('equaliser') {\n <span\n class=\"ui-loading--row ui-loading--stagger ui-loading--bars\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3, 4, 5]; track i) {\n <span class=\"ui-loading--bar\"></span>\n }\n </span>\n }\n @case ('terminal') {\n <span class=\"ui-loading--prompt\" aria-hidden=\"true\">></span>\n <span class=\"ui-loading--caret\" aria-hidden=\"true\"></span>\n }\n @case ('blinking-caret') {\n <span>Loading</span>\n <span class=\"ui-loading--caret\" aria-hidden=\"true\"></span>\n }\n @case ('shimmer-text') {\n <span class=\"ui-loading--shimmer\">Loading</span>\n }\n @case ('loading-dots') {\n <span>Loading</span>\n <span\n class=\"ui-loading--text-dots ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3]; track i) {\n <span class=\"ui-loading--text-dot\">.</span>\n }\n </span>\n }\n @case ('bouncing-dots') {\n <span\n class=\"ui-loading--row ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3]; track i) {\n <span class=\"ui-loading--dot ui-loading--dot-bounce\"></span>\n }\n </span>\n }\n @case ('fading-dots') {\n <span\n class=\"ui-loading--row ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3]; track i) {\n <span class=\"ui-loading--dot ui-loading--dot-fade\"></span>\n }\n </span>\n }\n @default {\n <span class=\"ui-loading--spinner\" aria-hidden=\"true\"></span>\n }\n }\n\n @if (!hasText()) {\n <span class=\"sr-only\">Loading</span>\n }\n</div>\n","export const UI_LOADING_TYPES = [\n 'spinner',\n 'throbber',\n 'pulse-ring',\n 'pulse-dot',\n 'wave',\n 'equaliser',\n 'terminal',\n 'blinking-caret',\n 'shimmer-text',\n 'loading-dots',\n 'bouncing-dots',\n 'fading-dots'\n] as const satisfies string[];\n\nexport type UiLoadingType = typeof UI_LOADING_TYPES[number];\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n contentChild,\n ElementRef,\n input,\n model,\n TemplateRef,\n viewChild\n} from '@angular/core';\n\nimport { UiOverlayComponent } from '../../layout/overlay/overlay.component';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiModalCloseButtonComponent } from '../../presets/modal-close-btn/modal-close-btn.component';\nimport { UiCardComponent } from '../card/card.component';\nimport { ModalSize } from './modal.types';\n\n\n@Component({\n selector: 'ui-modal',\n templateUrl: './modal.component.html',\n styleUrl: './modal.component.css',\n imports: [\n UiOverlayComponent,\n UiModalCloseButtonComponent,\n NgTemplateOutlet,\n UiCardComponent\n ]\n})\nexport class UiModalComponent {\n readonly isOpen = model.required<boolean>();\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickOutside'\n );\n readonly title = input<string>('');\n readonly size = input<ModalSize>('md');\n readonly classes = input<string>('');\n\n readonly headerElement = contentChild<TemplateRef<unknown>>(\n 'header',\n { descendants: false }\n );\n readonly footerElement = contentChild<TemplateRef<unknown>>(\n 'footer',\n { descendants: false }\n );\n readonly panelElement = viewChild(\n 'panel',\n { read: ElementRef<HTMLElement> }\n );\n\n readonly generatedClasses = computed<string>(() =>\n [\n 'ui-modal',\n `ui-modal--${this.size()}`,\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","@if (isOpen()) {\n <div\n class=\"group z-50 fixed inset-0 flex justify-center items-center bg-black/40 starting:opacity-0 p-4 transition-opacity duration-150 ease-out\"\n animate.leave=\"fs-modal--leaving opacity-0\"\n >\n <ui-overlay\n [isOpen]=\"isOpen\"\n [closeBehaviour]=\"closeBehaviour()\"\n [content]=\"panelElement()\"\n tabIndex=\"-1\"\n role=\"dialog\"\n aria-modal=\"true\"\n class=\"block max-w-full starting:scale-95 group-[.fs-modal--leaving]:scale-95 transition duration-150 ease-out\"\n >\n <ui-card #panel radius=\"xl\" [class]=\"generatedClasses()\">\n <div class=\"flex flex-col max-h-[calc(100dvh-2rem-2px)]\">\n <header class=\"flex justify-between items-center gap-x-5 p-5 border-neutral border-b shrink-0\">\n @if (headerElement()) {\n <ng-container *ngTemplateOutlet=\"headerElement()\" />\n } @else {\n <span class=\"ui-text-h3\">{{ title() }}</span>\n <ui-modal-close-btn [(isOpen)]=\"isOpen\" />\n }\n </header>\n <div class=\"flex-1 min-h-0 overflow-auto\">\n <ng-content />\n </div>\n\n @if (footerElement()) {\n <footer class=\"flex justify-end items-center gap-2.5 p-5 shrink-0\">\n <ng-container *ngTemplateOutlet=\"footerElement()\" />\n </footer>\n }\n </div>\n </ui-card>\n </ui-overlay>\n </div>\n}\n","import { booleanAttribute, Component, computed, inject, input } from '@angular/core';\n\nimport { UI_FORMAT } from '../../format/format';\nimport { maskMoney, UI_PRIVACY } from '../../format/privacy';\nimport type { MoneySignDisplay } from './money.types';\n\n\n/**\n * Formats a money value, e.g. -42.1 as \"-£42.10\".\n */\n@Component({\n selector: 'ui-money',\n templateUrl: './money.component.html',\n styleUrl: './money.component.css',\n host: {\n '[class]': 'generatedClasses()',\n '[attr.title]': 'title()'\n }\n})\nexport class UiMoneyComponent {\n private readonly defaults = inject(UI_FORMAT);\n private readonly privacy = inject(UI_PRIVACY);\n\n readonly value = input.required<number | null>();\n\n /** Defaults to the currency from `provideUiFormat`. */\n readonly currency = input<string>(this.defaults.currency);\n\n /** Defaults to the locale from `provideUiFormat`. */\n readonly locale = input<string>(this.defaults.locale);\n readonly signDisplay = input<MoneySignDisplay>('auto');\n\n /** Green for money in, red for money out. */\n readonly colourBySign = input(false, { transform: booleanAttribute });\n\n /** Rounds to whole units, e.g. \"£2,235\" for headline figures where pence are noise. */\n readonly wholeUnits = input(false, { transform: booleanAttribute });\n\n /** Short form like \"£12K\", the full amount goes in the title. */\n readonly compact = input(false, { transform: booleanAttribute });\n\n /** Shown when there's no value. */\n readonly placeholder = input<string>('-');\n\n // -0 would otherwise format as \"-£0.00\"\n private readonly amount = computed(() => {\n const value = this.value();\n\n return value === null || Number.isNaN(value) ? null : value || 0;\n });\n\n protected readonly masked = computed(() => this.privacy() !== 'visible' && this.amount() !== null);\n\n protected readonly mask = computed(() => maskMoney(this.currency(), this.locale()));\n\n protected readonly formatted = computed(() => {\n const amount = this.amount();\n\n return amount === null ? this.placeholder() : this.format(amount, this.compact());\n });\n\n protected readonly title = computed(() => {\n const amount = this.amount();\n\n return this.compact() && amount !== null && !this.masked() ? this.format(amount, false) : null;\n });\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-money',\n this.signClass()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n private readonly signClass = computed(() => {\n const amount = this.amount();\n\n if (!this.colourBySign() || amount === null || this.privacy() === 'hidden') {\n return '';\n }\n\n if (amount > 0) {\n return 'ui-money--positive';\n }\n\n return amount < 0 ? 'ui-money--negative' : '';\n });\n\n private format(amount: number, compact: boolean): string {\n return new Intl.NumberFormat(this.locale(), {\n style: 'currency',\n currency: this.currency(),\n signDisplay: this.signDisplay(),\n notation: compact ? 'compact' : 'standard',\n ...(this.wholeUnits() && { minimumFractionDigits: 0, maximumFractionDigits: 0 })\n }).format(amount);\n }\n}\n","@if (masked()) {\n <span aria-hidden=\"true\">{{ mask() }}</span>\n <span class=\"sr-only\">amount hidden</span>\n} @else {{{ formatted() }}}\n","/** Intl signDisplay values, controls when a + or - is shown. */\nexport const MoneySignDisplays = [\n 'auto',\n 'always',\n 'exceptZero',\n 'never'\n] as const;\n\n/** @see {@link MoneySignDisplays} */\nexport type MoneySignDisplay = typeof MoneySignDisplays[number];\n","import { Component, computed, input, model } from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroChevronLeft, heroChevronRight } from '@ng-icons/heroicons/outline';\n\nimport { UiButtonComponent } from '../button/button.component';\nimport type { PaginationItem } from './pagination.types';\n\n\n@Component({\n selector: 'ui-pagination',\n templateUrl: './pagination.component.html',\n styleUrl: './pagination.component.css',\n imports: [UiButtonComponent, NgIcon],\n host: {\n role: 'navigation',\n 'aria-label': 'Pagination',\n class: 'ui-pagination'\n },\n providers: [provideIcons({ heroChevronLeft, heroChevronRight })]\n})\nexport class UiPaginationComponent {\n // zero-based, same as the table\n readonly page = model<number>(0);\n readonly totalPages = input.required<number>();\n\n readonly isFirstPage = computed(() => this.page() <= 0);\n readonly isLastPage = computed(() => this.page() >= this.totalPages() - 1);\n\n // first, last and the pages either side of the current one, with gaps collapsed\n readonly items = computed(() => {\n const total = this.totalPages();\n const current = this.page();\n const items: PaginationItem[] = [];\n\n for (let i = 0; i < total; i++) {\n const isEdge = i === 0 || i === total - 1;\n const isNearCurrent = Math.abs(i - current) <= 1;\n\n // no point hiding a single page behind an ellipsis\n const hidesOnePage = (i === 1 && current === 3) ||\n (i === total - 2 && current === total - 4);\n\n if (isEdge || isNearCurrent || hidesOnePage) {\n items.push(i);\n } else if (items.at(-1) !== 'ellipsis') {\n items.push('ellipsis');\n }\n }\n\n return items;\n });\n\n pageLabel(page: number): string {\n const label = `Page ${page + 1}`;\n\n return page === this.page() ? `${label}, current page` : label;\n }\n\n goToPage(page: number): void {\n if (page < 0 || page >= this.totalPages()) {\n return;\n }\n\n this.page.set(page);\n }\n}\n","<ui-button\n appearance=\"none\"\n classes=\"ui-pagination--goto-btn ui-text-body\"\n [disabled]=\"isFirstPage()\"\n (click)=\"goToPage(page() - 1)\"\n>\n <ng-icon name=\"heroChevronLeft\" class=\"shrink-0\" />\n</ui-button>\n\n@for (item of items(); track $index) {\n @if (item === 'ellipsis') {\n <span class=\"ui-text-body ui-pagination-ellipsis\">…</span>\n } @else {\n <ui-button\n appearance=\"none\"\n classes=\"ui-pagination--goto-btn ui-text-body\"\n [class.active]=\"item === page()\"\n (click)=\"goToPage(item)\"\n >\n {{ item + 1 }}\n </ui-button>\n }\n}\n\n<ui-button\n appearance=\"none\"\n classes=\"ui-pagination--goto-btn ui-text-body\"\n [disabled]=\"isLastPage()\"\n (click)=\"goToPage(page() + 1)\"\n>\n <ng-icon name=\"heroChevronRight\" class=\"shrink-0\" />\n</ui-button>\n","import { Component, computed, inject, input } from '@angular/core';\n\nimport { PRIVATE_TEXT_LABEL, PRIVATE_TEXT_MASK, UI_PRIVACY } from '../../format/privacy';\n\n\n/**\n * Text that privacy mode masks, e.g. a transaction's description.\n */\n@Component({\n selector: 'ui-private',\n templateUrl: './private.component.html',\n styleUrl: './private.component.css',\n host: {\n '[class]': 'generatedClasses()'\n }\n})\nexport class UiPrivateComponent {\n private readonly privacy = inject(UI_PRIVACY);\n\n readonly text = input.required<string | null | undefined>();\n\n protected readonly mask = PRIVATE_TEXT_MASK;\n protected readonly label = PRIVATE_TEXT_LABEL;\n\n protected readonly masked = computed(() => this.privacy() !== 'visible' && !!this.text());\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-private',\n this.masked() && 'ui-private--masked'\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","@if (masked()) {\n <span aria-hidden=\"true\">{{ mask }}</span>\n <span class=\"sr-only\">{{ label }}</span>\n} @else {{{ text() }}}\n","import { Component, computed, input } from '@angular/core';\n\nimport type {\n ProgressIntent,\n ProgressLabelPosition,\n ProgressOrientation,\n ProgressSegment,\n ProgressShape,\n ProgressSize\n} from './progress.types';\n\n\ninterface SegmentView {\n percent: number;\n intent: ProgressIntent;\n label: string;\n}\n\n/**\n * A progress bar. Leave `value` null for work of unknown length, a value over\n * `max` fills the bar but the label still shows the real amount.\n */\n@Component({\n selector: 'ui-progress',\n templateUrl: './progress.component.html',\n styleUrl: './progress.component.css',\n host: {\n '[class.ui-progress-host--vertical]': 'orientation() === \"vertical\"'\n }\n})\nexport class UiProgressComponent {\n readonly value = input<number | null>(0);\n readonly max = input<number>(100);\n\n readonly intent = input<ProgressIntent>('primary');\n readonly size = input<ProgressSize>('md');\n readonly shape = input<ProgressShape>('rounded');\n readonly orientation = input<ProgressOrientation>('horizontal');\n\n readonly title = input<string>('');\n readonly labelPosition = input<ProgressLabelPosition>('none');\n readonly labelWith = input<(value: number, max: number) => string>(\n (value, max) => `${Math.round(value / max * 100)}%`\n );\n\n /** Splits the bar into this many blocks. */\n readonly steps = input<number | null>(null);\n\n /** Several fills stacked in one track, each with its own colour. */\n readonly segments = input<ProgressSegment[] | null>(null);\n\n /** Needed when there's no visible title. */\n readonly ariaLabel = input<string>('');\n\n protected readonly isIndeterminate = computed(() => this.value() === null && !this.segments());\n\n protected readonly total = computed(() => {\n const segments = this.segments();\n\n return segments\n ? segments.reduce((sum, segment) => sum + segment.value, 0)\n : this.value() ?? 0;\n });\n\n /** 0 to 100, what the bar actually draws. */\n protected readonly fillPercent = computed(() =>\n this.clampPercent(this.total() / this.max() * 100)\n );\n\n protected readonly label = computed(() =>\n this.isIndeterminate() ? '' : this.labelWith()(this.total(), this.max())\n );\n\n protected readonly segmentViews = computed<SegmentView[]>(() => {\n const segments = this.segments() ?? [];\n let used = 0;\n\n // later segments get squeezed once the track is full\n return segments.map(segment => {\n const percent = Math.min(this.clampPercent(segment.value / this.max() * 100), 100 - used);\n\n used += percent;\n\n return {\n percent,\n intent: segment.intent ?? this.intent(),\n label: segment.label ?? this.labelWith()(segment.value, this.max())\n };\n });\n });\n\n protected readonly stepStates = computed(() => {\n const steps = Math.max(1, Math.floor(this.steps() ?? 1));\n const filled = Math.round(this.fillPercent() / 100 * steps);\n\n return Array.from({ length: steps }, (_, index) => index < filled);\n });\n\n // keeps the floating label over the end of the fill without spilling off either side\n protected readonly floatingOffset = computed(() =>\n `clamp(0px, calc(${this.fillPercent()}% - 1.25rem), calc(100% - 2.5rem))`\n );\n\n protected readonly isVertical = computed(() => this.orientation() === 'vertical');\n\n protected readonly rootClasses = computed(() =>\n [\n 'ui-progress',\n `ui-progress--${this.orientation()}`,\n `ui-progress--${this.size()}`,\n `ui-progress--${this.shape()}`,\n this.labelPosition() === 'inside' ? 'ui-progress--label-inside' : ''\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected fillClasses(intent: ProgressIntent): string {\n return [\n 'ui-progress-fill',\n `ui-progress-fill--${intent}`,\n this.isIndeterminate() ? 'ui-progress-fill--indeterminate' : ''\n ]\n .filter(Boolean)\n .join(' ');\n }\n\n private clampPercent(percent: number): number {\n return Number.isFinite(percent) ? Math.min(100, Math.max(0, percent)) : 0;\n }\n}\n","<div [class]=\"rootClasses()\">\n @if (title() || labelPosition() === 'top') {\n <div class=\"ui-progress-header\">\n <span class=\"text-foreground ui-text-body-alt\">{{ title() }}</span>\n\n @if (labelPosition() === 'top') {\n <span class=\"text-foreground ui-text-body-alt\">{{ label() }}</span>\n }\n </div>\n }\n\n @if (labelPosition() === 'floating' && !isIndeterminate() && !isVertical()) {\n <div class=\"ui-progress-floating-row\" aria-hidden=\"true\">\n <span\n class=\"ui-progress-floating ui-text-caption\"\n [class]=\"'ui-progress-floating--' + intent()\"\n [style.margin-inline-start]=\"floatingOffset()\"\n >\n {{ label() }}\n </span>\n </div>\n }\n\n <div class=\"ui-progress-row\">\n <div\n class=\"ui-progress-track\"\n [class.ui-progress-track--steps]=\"steps()\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"isIndeterminate() ? null : total()\"\n [attr.aria-valuetext]=\"label() || null\"\n [attr.aria-label]=\"ariaLabel() || title() || null\"\n >\n @if (steps()) {\n @for (filled of stepStates(); track $index) {\n <span\n class=\"ui-progress-step\"\n [class]=\"filled ? 'ui-progress-fill--' + intent() : ''\"\n ></span>\n }\n } @else if (segments()) {\n @for (segment of segmentViews(); track $index) {\n <span\n [class]=\"fillClasses(segment.intent)\"\n [style.width.%]=\"isVertical() ? null : segment.percent\"\n [style.height.%]=\"isVertical() ? segment.percent : null\"\n [attr.title]=\"segment.label\"\n >\n @if (labelPosition() === 'inside') {\n <span class=\"ui-progress-inside-label ui-text-caption\">{{ segment.label }}</span>\n }\n </span>\n }\n } @else {\n <span\n [class]=\"fillClasses(intent())\"\n [style.width.%]=\"isVertical() || isIndeterminate() ? null : fillPercent()\"\n [style.height.%]=\"isVertical() && !isIndeterminate() ? fillPercent() : null\"\n >\n @if (labelPosition() === 'inside' && !isIndeterminate()) {\n <span class=\"ui-progress-inside-label ui-text-caption\">{{ label() }}</span>\n }\n </span>\n }\n </div>\n\n @if (labelPosition() === 'end' && !isIndeterminate()) {\n <span class=\"ui-progress-end text-foreground ui-text-body-alt\">{{ label() }}</span>\n }\n </div>\n</div>\n","/** Same names as badges, so a status reads the same wherever it shows. */\nexport const ProgressIntents = [\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger'\n] as const;\n\n/** @see {@link ProgressIntents} */\nexport type ProgressIntent = typeof ProgressIntents[number];\n\n/** Track thickness, md matches Preline's default and xl fits a label inside. */\nexport const ProgressSizes = ['sm', 'md', 'lg', 'xl'] as const;\n\n/** @see {@link ProgressSizes} */\nexport type ProgressSize = typeof ProgressSizes[number];\n\n/** Where the value label goes, if anywhere. */\nexport const ProgressLabelPositions = ['none', 'inside', 'end', 'top', 'floating'] as const;\n\n/** @see {@link ProgressLabelPositions} */\nexport type ProgressLabelPosition = typeof ProgressLabelPositions[number];\n\n/** rounded: both ends round, square: no rounding, straight: square track with a round fill. */\nexport const ProgressShapes = ['rounded', 'square', 'straight'] as const;\n\n/** @see {@link ProgressShapes} */\nexport type ProgressShape = typeof ProgressShapes[number];\n\nexport const ProgressOrientations = ['horizontal', 'vertical'] as const;\n\n/** @see {@link ProgressOrientations} */\nexport type ProgressOrientation = typeof ProgressOrientations[number];\n\n/** One part of a stacked bar, e.g. spending in one category. */\nexport interface ProgressSegment {\n value: number;\n intent?: ProgressIntent;\n label?: string;\n}\n","import { booleanAttribute, Component, input, model } from '@angular/core';\n\nimport type { SegmentedOption } from './segmented.types';\n\n\nlet nextId = 0;\n\n@Component({\n selector: 'ui-segmented',\n templateUrl: './segmented.component.html',\n styleUrl: './segmented.component.css',\n host: { '[class.block]': 'fill()' }\n})\nexport class UiSegmentedComponent<T> {\n readonly options = input.required<SegmentedOption<T>[]>();\n readonly value = model.required<T>();\n\n /** What the options choose between, e.g. \"How far back the charts go\". */\n readonly ariaLabel = input.required<string>();\n\n /** Stretches to the container's width with the options sharing it evenly. */\n readonly fill = input(false, { transform: booleanAttribute });\n\n protected readonly name = `ui-segmented-${nextId++}`;\n}\n","<div class=\"ui-segmented\" [class.ui-segmented--fill]=\"fill()\" role=\"radiogroup\" [attr.aria-label]=\"ariaLabel()\">\n @for (option of options(); track option.value) {\n <label\n class=\"ui-segmented-option ui-text-body-alt\"\n [class.ui-segmented-option--selected]=\"option.value === value()\"\n >\n <input\n type=\"radio\"\n class=\"sr-only\"\n [name]=\"name\"\n [checked]=\"option.value === value()\"\n [attr.aria-label]=\"option.ariaLabel || null\"\n (change)=\"value.set(option.value)\"\n />\n {{ option.label }}\n </label>\n }\n</div>\n","/** What a skeleton stands in for, lines of text, an avatar or a block. */\nexport const SkeletonShapes = ['text', 'circle', 'rect'] as const;\n\n/** @see {@link SkeletonShapes} */\nexport type SkeletonShape = typeof SkeletonShapes[number];\n","import { Component, input } from '@angular/core';\n\n\n/** Each stat is its own `dl`, so wrap a row of them in a plain div. */\n@Component({\n selector: 'ui-stat',\n templateUrl: './stat.component.html',\n host: { class: 'block min-w-0' }\n})\nexport class UiStatComponent {\n readonly label = input.required<string>();\n}\n","<dl>\n <dt class=\"text-muted-foreground-1 ui-text-body-alt\">{{ label() }}</dt>\n <dd class=\"flex flex-wrap items-center gap-x-2 gap-y-1 mt-1\">\n <span class=\"font-semibold text-foreground ui-text-h3\">\n <ng-content />\n </span>\n <ng-content select=\"[stat-change]\" />\n </dd>\n <dd class=\"empty:hidden mt-1 text-muted-foreground-1 ui-text-caption\"><ng-content select=\"[stat-note]\" /></dd>\n</dl>\n","import { booleanAttribute, Directive, input, model } from '@angular/core';\n\n\n@Directive({\n selector: '[uiTab]',\n host: { '[hidden]': '!active()' }\n})\nexport class UiTabDirective {\n label = input.required<string>({ alias: 'uiTab' });\n disabled = input(false, { transform: booleanAttribute });\n active = model<boolean>(false);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n contentChild,\n contentChildren,\n effect,\n input,\n signal,\n TemplateRef\n} from '@angular/core';\n\nimport { UiButtonComponent } from '../button/button.component';\nimport { UiTabDirective } from './tab.directive';\n\n\nexport type TabButtonAppearance =\n | 'solid'\n | 'underline';\n\n@Component({\n selector: 'ui-tab',\n templateUrl: './tab.component.html',\n styleUrl: './tab.component.css',\n imports: [UiButtonComponent, NgTemplateOutlet],\n host: { class: 'block' }\n})\nexport class UiTabComponent {\n readonly tabs = contentChildren(UiTabDirective);\n readonly selectedIndex = signal<number>(0);\n readonly actions = contentChild<TemplateRef<unknown>>('actions');\n\n readonly appearance = input<TabButtonAppearance>('solid');\n\n readonly generatedButtonClasses = computed(() =>\n [\n `ui-tab-button--${this.appearance()}`,\n 'font-medium'\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n constructor() {\n effect(() => {\n const tabs = this.tabs();\n if (!tabs.length || tabs.some(tab => tab.active())) { return; }\n\n tabs[0].active.set(true);\n });\n }\n\n select(index: number) {\n const tabs = this.tabs();\n\n const target = tabs[index];\n if (!target || target.disabled()) { return; }\n\n tabs.forEach((tab, i) => tab.active.set(i === index));\n }\n}\n","<div class=\"flex\" role=\"tablist\">\n <div class=\"flex justify-between w-full\">\n <nav class=\"flex gap-x-2.5\" role=\"tablist\">\n @for (tab of tabs(); track tab; let i = $index) {\n <ui-button\n role=\"tab\"\n appearance=\"none\"\n [classes]=\"generatedButtonClasses()\"\n [disabled]=\"tab.disabled()\"\n [class.active]=\"tab.active()\"\n (click)=\"select(i)\"\n >\n {{ tab.label() }}\n </ui-button>\n }\n </nav>\n <div class=\"flex gap-x-2.5\">\n <ng-container *ngTemplateOutlet=\"actions()\"></ng-container>\n </div>\n </div>\n</div>\n\n<ng-content></ng-content>\n","import { Injectable, isDevMode, signal, type WritableSignal } from '@angular/core';\n\n\nexport interface UiLinkedTable {\n readonly query: WritableSignal<string>;\n readonly filters: WritableSignal<Record<string, unknown>>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class UiTableRegistry {\n private readonly tables = signal<ReadonlyMap<string, UiLinkedTable>>(new Map());\n\n get(id: string): UiLinkedTable | null {\n return this.tables().get(id) ?? null;\n }\n\n register(id: string, table: UiLinkedTable): void {\n const existing = this.tables().get(id);\n\n if (isDevMode() && existing && existing !== table) {\n console.warn(`[ui-table] two tables share the id \"${id}\", controls will link to the newest one`);\n }\n\n this.tables.update(tables => new Map(tables).set(id, table));\n }\n\n unregister(id: string, table: UiLinkedTable): void {\n if (this.tables().get(id) !== table) {\n return;\n }\n\n this.tables.update(tables => {\n const next = new Map(tables);\n\n next.delete(id);\n\n return next;\n });\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n model,\n OnDestroy,\n OnInit,\n output,\n signal,\n untracked\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport {\n heroBars2,\n heroChevronDown,\n heroChevronUp,\n heroChevronUpDown,\n heroFunnel,\n heroMagnifyingGlass,\n heroViewColumns\n} from '@ng-icons/heroicons/outline';\nimport { catchError, debounceTime, filter, of, Subject, switchMap } from 'rxjs';\n\nimport { UI_FORMAT } from '../../format/format';\nimport { injectPrivateText } from '../../format/privacy';\nimport { UiCheckboxComponent } from '../../forms/checkbox/checkbox.component';\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { UiSelectComponent } from '../../forms/select/select.component';\nimport {\n SelectDataSource,\n SelectLocalDataSource\n} from '../../forms/select/select.datasource';\nimport { UiButtonComponent } from '../button/button.component';\nimport { UiDropdownComponent } from '../dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../dropdown/dropdown.directives';\nimport { UiLoadingComponent } from '../loading/loading.component';\nimport { UiMoneyComponent } from '../money/money.component';\nimport { UiPrivateComponent } from '../private/private.component';\nimport {\n type TableDataSource,\n type TableDataSourceContent,\n type TableDataSourceParameters\n} from './table.datasource';\nimport { UiTableRegistry } from './table.registry';\nimport {\n type TableColumn,\n type TableColumnFilterOption,\n type TableRowAction,\n type TableSortState\n} from './table.types';\n\n\nconst DEFAULT_COLUMN_WIDTH = 160;\nconst SELECTION_COLUMN_WIDTH = 44;\n\ninterface ColumnDragPreview {\n label: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n@Component({\n selector: 'ui-table',\n templateUrl: './table.component.html',\n styleUrl: './table.component.css',\n imports: [\n NgIcon,\n UiButtonComponent,\n UiCheckboxComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n UiInputComponent,\n UiSelectComponent,\n UiLoadingComponent,\n UiMoneyComponent,\n UiPrivateComponent\n ],\n host: { class: 'block' },\n providers: [provideIcons({\n heroMagnifyingGlass,\n heroFunnel,\n heroViewColumns,\n heroBars2,\n heroChevronUpDown,\n heroChevronUp,\n heroChevronDown\n })]\n})\nexport class UiTableComponent<Row = unknown> implements OnInit, OnDestroy {\n readonly classes = input<string>('');\n\n /** Lets controls elsewhere on the page link to this table, e.g. `<ui-search [table]=\"'transactions'\">`. */\n readonly tableId = input<string | null>(null);\n\n readonly columns = input.required<TableColumn<Row>[]>();\n readonly dataSource = input.required<TableDataSource<Row>>();\n\n readonly emptyMessage = input<string>('No data to display.');\n readonly errorMessage = input<string>(\n 'Something went wrong loading this data.'\n );\n\n // identifies a row across sorts/filters/pages, defaults to its position which\n // is only stable for an unsorted, unfiltered, unpaginated table\n readonly rowId = input<(row: Row, index: number) => unknown>(\n (_row, index) => index\n );\n\n readonly selectable = input(false, { transform: booleanAttribute });\n readonly searchable = input(false, { transform: booleanAttribute });\n readonly searchPlaceholder = input<string>('Search...');\n readonly paginated = input(false, { transform: booleanAttribute });\n readonly pageSize = input<number>(10);\n readonly toggleableColumns = input(false, { transform: booleanAttribute });\n readonly reorderableColumns = input(false, { transform: booleanAttribute });\n readonly reorderableRows = input(false, { transform: booleanAttribute });\n readonly stickyHeader = input(false, { transform: booleanAttribute });\n readonly actions = input<TableRowAction<Row>[]>([]);\n\n readonly sort = model<TableSortState | null>(null);\n readonly selectedRowIds = model<Set<unknown>>(new Set());\n\n readonly selectionChange = output<Row[]>();\n readonly rowsReordered = output<Row[]>();\n\n readonly rows = signal<Row[]>([]);\n readonly total = signal(0);\n readonly loading = signal(false);\n readonly error = signal(false);\n\n readonly query = signal('');\n readonly filters = signal<Record<string, unknown>>({});\n\n protected readonly currentPage = signal(0);\n protected readonly hiddenColumnIds = signal<Set<string>>(new Set());\n protected readonly columnOrderIds = signal<string[] | null>(null);\n protected readonly columnWidths = signal<Record<string, number>>({});\n protected readonly columnMenuOpen = signal(false);\n protected readonly filterMenuOpen = signal(false);\n\n protected readonly draggedColumnId = signal<string | null>(null);\n protected readonly dragOverColumnId = signal<string | null>(null);\n protected readonly dragPreview = signal<ColumnDragPreview | null>(null);\n protected readonly draggedRowIndex = signal<number | null>(null);\n\n readonly isEmpty = computed(() =>\n !this.loading() && !this.error() && this.rows().length === 0\n );\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-table',\n 'ui-text-body',\n this.hasSensitiveColumns() && 'ui-table--fixed',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected readonly orderedColumns = computed(() => {\n const order = this.columnOrderIds();\n\n if (!order) {\n return this.columns();\n }\n\n const byId = new Map(this.columns().map(column => [column.id, column]));\n const ordered = order\n .map(id => byId.get(id))\n .filter((column): column is TableColumn<Row> => !!column);\n\n const missing = this.columns().filter(column =>\n !order.includes(column.id)\n );\n\n return [...ordered, ...missing];\n });\n\n protected readonly hideableColumns = computed(() =>\n this.orderedColumns().filter(column => column.hideable !== false)\n );\n\n protected readonly visibleColumns = computed(() =>\n this.orderedColumns().filter(column =>\n !this.hiddenColumnIds().has(column.id)\n )\n );\n\n // pinned-left columns first, then unpinned, then pinned-right, so sticky offsets stack correctly\n protected readonly renderColumns = computed(() => {\n const columns = this.visibleColumns();\n\n return [\n ...columns.filter(column => column.pin === 'left'),\n ...columns.filter(column => !column.pin),\n ...columns.filter(column => column.pin === 'right')\n ];\n });\n\n // hidden columns stay filterable, the menu isn't tied to what's on screen\n protected readonly filterableColumns = computed(() =>\n this.orderedColumns().filter(column => column.filterable)\n );\n\n protected readonly hasFilterableColumns = computed(() =>\n this.filterableColumns().length > 0\n );\n\n protected readonly activeFilterCount = computed(() =>\n Object.keys(this.filters()).length\n );\n\n protected readonly hasActions = computed(() => this.actions().length > 0);\n\n private readonly hasSensitiveColumns = computed(() => this.columns().some(column => column.sensitive));\n\n protected readonly fixedWidth = computed(() =>\n this.hasSensitiveColumns()\n ? (this.selectable() ? SELECTION_COLUMN_WIDTH : 0) +\n this.renderColumns().reduce((total, column) => total + this.columnWidth(column), 0) +\n (this.hasActions() ? this.actionsColumnWidth() : 0)\n : null\n );\n protected readonly actionsColumnWidth = computed(() =>\n Math.max(60, this.actions().length * 40)\n );\n\n protected readonly totalPages = computed(() =>\n this.paginated()\n ? Math.max(1, Math.ceil(this.total() / this.pageSize()))\n : 1\n );\n\n protected readonly resultsLabel = computed(() => {\n const total = this.total();\n\n return total === 1 ? '1 result' : `${total} results`;\n });\n\n protected readonly allSelected = computed(() => {\n const rows = this.rows();\n\n return rows.length > 0 &&\n rows.every((row, index) =>\n this.selectedRowIds().has(this.rowId()(row, index))\n );\n });\n\n protected readonly someSelected = computed(() => {\n const rows = this.rows();\n const selected = this.selectedRowIds();\n const count = rows.filter((row, index) =>\n selected.has(this.rowId()(row, index))\n ).length;\n\n return count > 0 && count < rows.length;\n });\n\n private readonly leftOffsets = computed(() => {\n const offsets: Record<string, number> = {};\n let offset = this.selectable() ? SELECTION_COLUMN_WIDTH : 0;\n\n for (\n const column of this.renderColumns().filter(c => c.pin === 'left')\n ) {\n offsets[column.id] = offset;\n offset += this.columnWidth(column);\n }\n\n return offsets;\n });\n\n private readonly rightOffsets = computed(() => {\n const offsets: Record<string, number> = {};\n let offset = 0;\n\n const columns = this.renderColumns()\n .filter(c => c.pin === 'right')\n .slice()\n .reverse();\n\n for (const column of columns) {\n offsets[column.id] = offset;\n offset += this.columnWidth(column);\n }\n\n return offsets;\n });\n\n // one shared stream for every load, so a newer request cancels whatever was still in flight\n private readonly load$ = new Subject<void>();\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly registry = inject(UiTableRegistry);\n protected readonly uiFormat = inject(UI_FORMAT);\n private readonly privateText = injectPrivateText();\n\n private loadedQuery = '';\n private loadedFilters: Record<string, unknown> = {};\n\n private resizeState: {\n columnId: string;\n startX: number;\n startWidth: number;\n } | null = null;\n private columnDragState: {\n columnId: string;\n pointerOffsetX: number;\n previewY: number;\n previewHeight: number;\n } | null = null;\n private readonly filterDataSources = new Map<\n string,\n SelectDataSource<TableColumnFilterOption>\n >();\n\n constructor() {\n effect(onCleanup => {\n const id = this.tableId();\n\n if (!id) {\n return;\n }\n\n // registering reads the registry, tracked it would loop\n untracked(() => this.registry.register(id, this));\n onCleanup(() => this.registry.unregister(id, this));\n });\n\n // a query set before the first emission, e.g. by a linked search, still reloads\n toObservable(this.query).pipe(\n debounceTime(300),\n filter(query => query !== this.loadedQuery),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.resetAndReload());\n\n toObservable(this.filters).pipe(\n debounceTime(300),\n filter(filters => filters !== this.loadedFilters),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.resetAndReload());\n\n this.load$.pipe(\n switchMap(() => this.fetch()),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(result => this.applyResult(result));\n }\n\n ngOnInit(): void {\n this.reload();\n }\n\n ngOnDestroy(): void {\n document.removeEventListener('pointermove', this.onResizeMove);\n document.removeEventListener('pointerup', this.onResizeEnd);\n document.removeEventListener('pointermove', this.onColumnDragMove);\n document.removeEventListener('pointerup', this.onColumnDragEnd);\n }\n\n reload(): void {\n this.load$.next();\n }\n\n protected cellValue(column: TableColumn<Row>, row: Row): unknown {\n return column.accessor(row);\n }\n\n // ng-icon's `name` wants a string; displayType 'icon' is the caller's promise the accessor gives one\n protected cellIconValue(column: TableColumn<Row>, row: Row): string {\n return column.accessor(row) as string;\n }\n\n protected moneyCellValue(column: TableColumn<Row>, row: Row): number | null {\n const value = column.accessor(row);\n\n return value === null || value === undefined ? null : Number(value);\n }\n\n protected formattedCellValue(column: TableColumn<Row>, row: Row): string {\n const value = column.accessor(row);\n\n if (value === null || value === undefined) {\n return '';\n }\n\n switch (column.displayType) {\n case 'number':\n return new Intl.NumberFormat().format(Number(value));\n case 'date':\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium'\n })\n .format(new Date(value as string | number | Date));\n case 'time':\n return new Intl.DateTimeFormat(undefined, {\n timeStyle: 'short'\n })\n .format(new Date(value as string | number | Date));\n default:\n return String(value);\n }\n }\n\n protected onQueryChange(value: string): void {\n this.query.set(value);\n }\n\n protected filterValue(columnId: string): string {\n return (this.filters()[columnId] as string) ?? '';\n }\n\n protected onFilterInput(columnId: string, value: string): void {\n this.setFilter(columnId, value);\n }\n\n protected filterDataSource(\n column: TableColumn<Row>\n ): SelectDataSource<TableColumnFilterOption> {\n let dataSource = this.filterDataSources.get(column.id);\n\n if (!dataSource) {\n dataSource = new SelectLocalDataSource(\n column.filterOptions ?? [],\n (option, query) =>\n option.label.toLowerCase().includes(query.toLowerCase())\n );\n\n this.filterDataSources.set(column.id, dataSource);\n }\n\n return dataSource;\n }\n\n protected selectedFilterOption(\n column: TableColumn<Row>\n ): TableColumnFilterOption | null {\n const value = this.filters()[column.id];\n\n return column.filterOptions?.find(option => option.value === value) ??\n null;\n }\n\n protected filterOptionLabel(option: TableColumnFilterOption): string {\n return option.label;\n }\n\n protected readonly sensitiveFilterOptionLabel = (option: TableColumnFilterOption): string =>\n this.privateText(option.label);\n\n protected onFilterSelect(\n columnId: string,\n option: TableColumnFilterOption | null\n ): void {\n this.setFilter(columnId, option?.value);\n }\n\n protected clearFilters(): void {\n this.filters.set({});\n }\n\n protected toggleSort(column: TableColumn<Row>): void {\n if (!column.sortable) {\n return;\n }\n\n const current = this.sort();\n\n if (!current || current.columnId !== column.id) {\n this.sort.set({ columnId: column.id, direction: 'asc' });\n } else if (current.direction === 'asc') {\n this.sort.set({ columnId: column.id, direction: 'desc' });\n } else {\n this.sort.set(null);\n }\n\n this.resetAndReload();\n }\n\n protected sortIcon(column: TableColumn<Row>): string {\n const current = this.sort();\n\n if (!current || current.columnId !== column.id) {\n return 'heroChevronUpDown';\n }\n\n return current.direction === 'asc'\n ? 'heroChevronUp'\n : 'heroChevronDown';\n }\n\n protected goToPage(page: number): void {\n if (page < 0 || page >= this.totalPages()) {\n return;\n }\n\n this.currentPage.set(page);\n this.reload();\n }\n\n protected isColumnVisible(column: TableColumn<Row>): boolean {\n return !this.hiddenColumnIds().has(column.id);\n }\n\n protected toggleColumnVisibility(column: TableColumn<Row>): void {\n this.hiddenColumnIds.update(hidden => {\n const next = new Set(hidden);\n\n if (next.has(column.id)) {\n next.delete(column.id);\n } else {\n next.add(column.id);\n }\n\n return next;\n });\n }\n\n protected isRowSelected(row: Row, index: number): boolean {\n return this.selectedRowIds().has(this.rowId()(row, index));\n }\n\n protected toggleRow(row: Row, index: number): void {\n const id = this.rowId()(row, index);\n\n this.selectedRowIds.update(selected => {\n const next = new Set(selected);\n\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n\n return next;\n });\n\n this.emitSelectionChange();\n }\n\n protected toggleSelectAll(): void {\n const wasAllSelected = this.allSelected();\n\n this.selectedRowIds.update(selected => {\n const next = new Set(selected);\n\n this.rows().forEach((row, index) => {\n const id = this.rowId()(row, index);\n\n if (wasAllSelected) {\n next.delete(id);\n } else {\n next.add(id);\n }\n });\n\n return next;\n });\n\n this.emitSelectionChange();\n }\n\n protected columnWidth(column: TableColumn<Row>): number {\n return this.columnWidths()[column.id] ??\n column.width ??\n DEFAULT_COLUMN_WIDTH;\n }\n\n protected isPinned(column: TableColumn<Row>): boolean {\n return column.pin === 'left' || column.pin === 'right';\n }\n\n protected leftOffset(column: TableColumn<Row>): number | null {\n return column.pin === 'left' ? this.leftOffsets()[column.id] : null;\n }\n\n protected rightOffset(column: TableColumn<Row>): number | null {\n return column.pin === 'right' ? this.rightOffsets()[column.id] : null;\n }\n\n protected startResize(event: PointerEvent, column: TableColumn<Row>): void {\n event.preventDefault();\n event.stopPropagation();\n\n this.resizeState = {\n columnId: column.id,\n startX: event.clientX,\n startWidth: this.columnWidth(column)\n };\n\n document.addEventListener('pointermove', this.onResizeMove);\n document.addEventListener('pointerup', this.onResizeEnd);\n }\n\n protected canReorderRows(): boolean {\n return this.reorderableRows() && !this.sort();\n }\n\n // custom pointer-based drag instead of native HTML5 DnD, so the floating\n // preview can be pinned to the header row instead of following the cursor\n // wherever it goes, and so a drop indicator can show the exact landing spot\n protected onColumnDragStart(\n event: PointerEvent,\n column: TableColumn<Row>\n ): void {\n event.preventDefault();\n\n const headerCell = (event.currentTarget as HTMLElement).closest('th');\n const headerRow = headerCell?.closest('tr');\n\n if (!headerCell || !headerRow) {\n return;\n }\n\n const cellRect = headerCell.getBoundingClientRect();\n const rowRect = headerRow.getBoundingClientRect();\n\n this.columnDragState = {\n columnId: column.id,\n pointerOffsetX: event.clientX - cellRect.left,\n previewY: rowRect.top + (rowRect.height - cellRect.height) / 2,\n previewHeight: cellRect.height\n };\n\n this.draggedColumnId.set(column.id);\n this.dragPreview.set({\n label: column.header,\n x: cellRect.left,\n y: this.columnDragState.previewY,\n width: cellRect.width,\n height: this.columnDragState.previewHeight\n });\n\n document.addEventListener('pointermove', this.onColumnDragMove);\n document.addEventListener('pointerup', this.onColumnDragEnd);\n }\n\n protected onRowDragStart(event: DragEvent, index: number): void {\n this.draggedRowIndex.set(index);\n event.dataTransfer?.setData('text/plain', String(index));\n }\n\n protected onRowDragOver(event: DragEvent): void {\n if (this.draggedRowIndex() !== null) {\n event.preventDefault();\n }\n }\n\n protected onRowDrop(event: DragEvent, index: number): void {\n event.preventDefault();\n\n const from = this.draggedRowIndex();\n this.draggedRowIndex.set(null);\n\n if (from === null || from === index) {\n return;\n }\n\n const next = [...this.rows()];\n const [moved] = next.splice(from, 1);\n next.splice(index, 0, moved);\n\n this.rows.set(next);\n this.rowsReordered.emit(next);\n }\n\n private readonly onResizeMove = (event: PointerEvent): void => {\n if (!this.resizeState) {\n return;\n }\n\n const column = this.columns().find(c =>\n c.id === this.resizeState!.columnId\n );\n const minWidth = column?.minWidth ?? 60;\n const delta = event.clientX - this.resizeState.startX;\n const width = Math.max(minWidth, this.resizeState.startWidth + delta);\n\n this.columnWidths.update(widths => ({\n ...widths,\n [this.resizeState!.columnId]: width\n }));\n };\n\n private readonly onResizeEnd = (): void => {\n this.resizeState = null;\n document.removeEventListener('pointermove', this.onResizeMove);\n document.removeEventListener('pointerup', this.onResizeEnd);\n };\n\n private readonly onColumnDragMove = (event: PointerEvent): void => {\n const state = this.columnDragState;\n\n if (!state) {\n return;\n }\n\n // x tracks the pointer, y stays pinned to the header row - the preview\n // can never wander down into the body no matter where the pointer goes\n this.dragPreview.update(preview =>\n preview && {\n ...preview,\n x: event.clientX - state.pointerOffsetX\n }\n );\n\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const headerCell = target?.closest<HTMLElement>('th[data-column-id]');\n const columnId = headerCell?.dataset['columnId'];\n\n this.dragOverColumnId.set(\n columnId && columnId !== state.columnId ? columnId : null\n );\n };\n\n private readonly onColumnDragEnd = (): void => {\n const state = this.columnDragState;\n const overId = this.dragOverColumnId();\n\n this.columnDragState = null;\n this.draggedColumnId.set(null);\n this.dragOverColumnId.set(null);\n this.dragPreview.set(null);\n\n document.removeEventListener('pointermove', this.onColumnDragMove);\n document.removeEventListener('pointerup', this.onColumnDragEnd);\n\n if (!state || !overId || state.columnId === overId) {\n return;\n }\n\n const order = this.columnOrderIds() ?? this.columns().map(c => c.id);\n const from = order.indexOf(state.columnId);\n const to = order.indexOf(overId);\n\n if (from === -1 || to === -1) {\n return;\n }\n\n // dropped column takes the exact slot of the highlighted target, which\n // shifts over to make room - `to` is deliberately the target's index\n // from before removal, so splicing it into the now-shorter array lands\n // the dragged column exactly where the target was and pushes it aside,\n // rather than merely landing next to it\n const next = [...order];\n next.splice(from, 1);\n next.splice(to, 0, state.columnId);\n\n this.columnOrderIds.set(next);\n };\n\n private setFilter(columnId: string, value: unknown): void {\n this.filters.update(filters => {\n const next = { ...filters };\n\n if (value) {\n next[columnId] = value;\n } else {\n delete next[columnId];\n }\n\n return next;\n });\n }\n\n private resetAndReload(): void {\n this.currentPage.set(0);\n this.reload();\n }\n\n private emitSelectionChange(): void {\n const ids = this.selectedRowIds();\n const selectedRows = this.rows().filter((row, index) =>\n ids.has(this.rowId()(row, index))\n );\n\n this.selectionChange.emit(selectedRows);\n }\n\n private fetch() {\n this.loading.set(true);\n this.error.set(false);\n\n const params: TableDataSourceParameters = {\n page: this.currentPage(),\n size: this.paginated() ? this.pageSize() : 0,\n query: this.query(),\n sort: this.sort(),\n filters: this.filters()\n };\n\n this.loadedQuery = params.query;\n this.loadedFilters = params.filters;\n\n return this.dataSource().load(params).pipe(catchError(() => of(null)));\n }\n\n private applyResult(result: TableDataSourceContent<Row> | null): void {\n this.loading.set(false);\n\n if (result) {\n this.rows.set(result.items);\n this.total.set(result.total);\n } else {\n this.error.set(true);\n }\n\n this.cdr.markForCheck();\n }\n}\n","@if (searchable() || hasFilterableColumns() || toggleableColumns()) {\n <div class=\"ui-table-toolbar\">\n @if (searchable()) {\n <ui-input\n [value]=\"query()\"\n (valueChange)=\"onQueryChange($event)\"\n [placeholder]=\"searchPlaceholder()\"\n class=\"max-w-xs\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroMagnifyingGlass\"\n class=\"ms-3 size-4 text-muted-foreground-1\"\n />\n </ng-template>\n </ui-input>\n }\n\n @if (hasFilterableColumns()) {\n <ui-dropdown\n [isOpen]=\"filterMenuOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n >\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n (click)=\"filterMenuOpen.update(open => !open)\"\n >\n <ng-icon name=\"heroFunnel\" class=\"size-4\" />\n Filters\n @if (activeFilterCount()) {\n <span class=\"ui-table-filter-count ui-text-caption\">\n {{ activeFilterCount() }}\n </span>\n }\n </ui-button>\n\n @if (filterMenuOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"ui-table-filter-menu\">\n @for (column of filterableColumns(); track column.id) {\n <div class=\"flex flex-col gap-1\">\n <span\n class=\"text-muted-foreground-1 ui-text-caption\"\n >\n {{ column.header }}\n </span>\n\n @if (column.filterOptions) {\n <ui-select\n [dataSource]=\"filterDataSource(column)\"\n [selectedItem]=\"selectedFilterOption(column)\"\n (selectionChange)=\"onFilterSelect(column.id, $event)\"\n [displayWith]=\"column.sensitive ? sensitiveFilterOptionLabel : filterOptionLabel\"\n [clearable]=\"true\"\n clearLabel=\"All\"\n placeholder=\"All\"\n />\n } @else {\n <ui-input\n [value]=\"filterValue(column.id)\"\n (valueChange)=\"onFilterInput(column.id, $event)\"\n placeholder=\"Filter...\"\n [ariaLabel]=\"'Filter ' + column.header\"\n />\n }\n </div>\n }\n\n @if (activeFilterCount()) {\n <ui-button\n appearance=\"link\"\n intent=\"secondary\"\n class=\"text-end\"\n classes=\"self-end p-0! text-sm\"\n (click)=\"clearFilters()\"\n >\n Clear filters\n </ui-button>\n }\n </div>\n </div>\n }\n </ui-dropdown>\n }\n\n @if (toggleableColumns()) {\n <ui-dropdown\n [isOpen]=\"columnMenuOpen\"\n placement=\"bottom-end\"\n closeBehaviour=\"whenClickOutside\"\n class=\"ms-auto\"\n >\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n (click)=\"columnMenuOpen.update(open => !open)\"\n >\n <ng-icon name=\"heroViewColumns\" class=\"size-4\" />\n Columns\n </ui-button>\n\n @if (columnMenuOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"bg-layer shadow-xs py-1 border border-dropdown-divider rounded-lg min-w-40\">\n @for (column of hideableColumns(); track column.id) {\n <label\n class=\"flex items-center gap-2 hover:bg-dropdown-item-hover px-3 py-2 ui-text-body-alt cursor-pointer\"\n >\n <ui-checkbox\n [value]=\"isColumnVisible(column)\"\n (valueChange)=\"toggleColumnVisibility(column)\"\n />\n {{ column.header }}\n </label>\n }\n </div>\n </div>\n }\n </ui-dropdown>\n }\n </div>\n}\n\n<div class=\"ui-table-scroll\">\n <table [class]=\"generatedClasses()\" [style.width.px]=\"fixedWidth()\">\n <colgroup>\n @if (selectable()) {\n <col [style.width.px]=\"44\" />\n }\n\n @for (column of renderColumns(); track column.id) {\n <col [style.width.px]=\"columnWidth(column)\" />\n }\n\n @if (hasActions()) {\n <col [style.width.px]=\"actionsColumnWidth()\" />\n }\n </colgroup>\n\n <thead [class.ui-table-sticky]=\"stickyHeader()\">\n <tr>\n @if (selectable()) {\n <th class=\"text-center! ui-table-select-cell\">\n <ui-checkbox\n [value]=\"allSelected()\"\n [indeterminate]=\"someSelected()\"\n (valueChange)=\"toggleSelectAll()\"\n />\n </th>\n }\n\n @for (column of renderColumns(); track column.id) {\n <th\n scope=\"col\"\n [attr.data-column-id]=\"column.id\"\n [class.ui-table-pinned]=\"isPinned(column)\"\n [attr.data-pin]=\"column.pin || null\"\n [class.ui-table-column-dragging]=\"draggedColumnId() === column.id\"\n [class.ui-table-column-drag-over]=\"dragOverColumnId() === column.id\"\n [style.left.px]=\"leftOffset(column)\"\n [style.right.px]=\"rightOffset(column)\"\n >\n <div class=\"ui-table-th-content\">\n @if (reorderableColumns() && column.reorderable !== false) {\n <ng-icon\n name=\"heroBars2\"\n class=\"ui-table-drag-handle\"\n (pointerdown)=\"onColumnDragStart($event, column)\"\n />\n }\n\n @if (column.sortable) {\n <ui-button\n appearance=\"none\"\n classes=\"flex items-center gap-1 p-0! border-transparent! rounded-none! cursor-pointer hocus:text-foreground\"\n (click)=\"toggleSort(column)\"\n >\n <span\n class=\"font-medium text-muted-foreground-1 ui-text-caption uppercase\"\n >\n {{ column.header }}\n </span>\n <ng-icon\n [name]=\"sortIcon(column)\"\n class=\"ms-auto size-4 shrink-0\"\n />\n </ui-button>\n } @else {\n <span\n class=\"font-medium text-muted-foreground-1 ui-text-caption ui-text-caption uppercase\"\n >\n {{ column.header }}\n </span>\n }\n </div>\n\n @if (column.resizable) {\n <span\n class=\"ui-table-resize-handle\"\n (pointerdown)=\"startResize($event, column)\"\n ></span>\n }\n </th>\n }\n\n @if (hasActions()) {\n <th class=\"ui-table-actions-cell\"></th>\n }\n </tr>\n </thead>\n\n <tbody class=\"ui-text-body-alt\">\n @if (loading()) {\n <tr>\n <td\n [attr.colspan]=\"renderColumns().length + (selectable() ? 1 : 0) + (hasActions() ? 1 : 0)\"\n class=\"ui-table-status\"\n >\n <ui-loading type=\"loading-dots\" />\n </td>\n </tr>\n } @else if (error()) {\n <tr>\n <td\n [attr.colspan]=\"renderColumns().length + (selectable() ? 1 : 0) + (hasActions() ? 1 : 0)\"\n class=\"ui-table-status ui-table-status-error\"\n >\n {{ errorMessage() }}\n <ui-button\n appearance=\"link\"\n intent=\"danger\"\n classes=\"ms-1 p-0! text-sm underline\"\n (click)=\"reload()\"\n >\n Retry\n </ui-button>\n </td>\n </tr>\n } @else if (isEmpty()) {\n <tr>\n <td\n [attr.colspan]=\"renderColumns().length + (selectable() ? 1 : 0) + (hasActions() ? 1 : 0)\"\n class=\"ui-table-status\"\n >\n {{ emptyMessage() }}\n </td>\n </tr>\n } @else {\n @for (row of rows(); track rowId()(row, $index); let i = $index) {\n <tr\n [class.ui-table-row-selected]=\"isRowSelected(row, i)\"\n [class.ui-table-row-dragging]=\"draggedRowIndex() === i\"\n [draggable]=\"canReorderRows()\"\n (dragstart)=\"onRowDragStart($event, i)\"\n (dragover)=\"onRowDragOver($event)\"\n (drop)=\"onRowDrop($event, i)\"\n >\n @if (selectable()) {\n <td class=\"ui-table-select-cell\">\n <ui-checkbox\n [value]=\"isRowSelected(row, i)\"\n (valueChange)=\"toggleRow(row, i)\"\n />\n </td>\n }\n\n @for (column of renderColumns(); track column.id) {\n <td\n [class.ui-table-pinned]=\"isPinned(column)\"\n [attr.data-pin]=\"column.pin || null\"\n [style.left.px]=\"leftOffset(column)\"\n [style.right.px]=\"rightOffset(column)\"\n >\n @if (column.displayType === 'icon') {\n <ng-icon\n [name]=\"cellIconValue(column, row)\"\n class=\"size-4\"\n />\n } @else if (column.displayType === 'currency') {\n <ui-money\n [value]=\"moneyCellValue(column, row)\"\n [currency]=\"column.currency ?? uiFormat.currency\"\n placeholder=\"\"\n />\n } @else if (column.sensitive) {\n <ui-private [text]=\"formattedCellValue(column, row)\" />\n } @else {\n {{ formattedCellValue(column, row) }}\n }\n </td>\n }\n\n @if (hasActions()) {\n <td class=\"ui-table-actions-cell\">\n @for (action of actions(); track action.id) {\n <ui-button\n appearance=\"none\"\n classes=\"p-1.5! border-transparent! rounded-md! text-muted-foreground-1 cursor-pointer hocus:bg-surface hocus:text-foreground disabled:opacity-40! disabled:cursor-not-allowed\"\n [disabled]=\"!!action.disabled?.(row)\"\n [ariaLabel]=\"action.label\"\n [title]=\"action.label\"\n (click)=\"action.onClick(row)\"\n >\n <ng-icon\n [name]=\"action.icon\"\n class=\"size-4\"\n />\n </ui-button>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (dragPreview(); as preview) {\n <div\n class=\"ui-table-drag-preview ui-text-body-alt\"\n [style.left.px]=\"preview.x\"\n [style.top.px]=\"preview.y\"\n [style.width.px]=\"preview.width\"\n [style.height.px]=\"preview.height\"\n >\n <ng-icon name=\"heroBars2\" class=\"ui-table-drag-preview-icon\" />\n <span class=\"truncate\">{{ preview.label }}</span>\n </div>\n}\n\n@if (paginated()) {\n <div class=\"ui-table-footer\">\n <span class=\"text-muted-foreground-1 ui-text-caption\">{{\n resultsLabel()\n }}</span>\n\n <div class=\"ui-table-pagination\">\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n [disabled]=\"currentPage() === 0\"\n (click)=\"goToPage(currentPage() - 1)\"\n >\n Prev\n </ui-button>\n\n <span class=\"ui-text-body-alt\">Page {{ currentPage() + 1 }} of {{\n totalPages()\n }}</span>\n\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n [disabled]=\"currentPage() + 1 >= totalPages()\"\n (click)=\"goToPage(currentPage() + 1)\"\n >\n Next\n </ui-button>\n </div>\n </div>\n}\n","import { Observable, of } from 'rxjs';\n\nimport { type TableSortState } from './table.types';\n\n\nexport interface TableDataSourceParameters {\n page: number;\n /** 0 or less means \"no limit\", used when the table isn't paginated */\n size: number;\n query: string;\n sort: TableSortState | null;\n filters: Record<string, unknown>;\n}\n\nexport interface TableDataSourceContent<Row> {\n items: Row[];\n total: number;\n}\n\nexport interface TableDataSource<Row> {\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>>;\n}\n\nexport interface TableLocalDataSourceOptions<Row> {\n search?: (item: Row, query: string) => boolean;\n sortValue?: (item: Row, columnId: string) => unknown;\n filter?: (item: Row, filters: Record<string, unknown>) => boolean;\n}\n\nexport class TableLocalDataSource<Row> implements TableDataSource<Row> {\n constructor(\n private readonly items: Row[],\n private readonly options: TableLocalDataSourceOptions<Row> = {}\n ) {}\n\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>> {\n let result = this.items;\n\n const query = params.query.trim();\n\n if (query && this.options.search) {\n result = result.filter(item => this.options.search!(item, query));\n }\n\n if (Object.keys(params.filters).length && this.options.filter) {\n result = result.filter(item => this.options.filter!(item, params.filters));\n }\n\n if (params.sort && this.options.sortValue) {\n const { columnId, direction } = params.sort;\n const factor = direction === 'asc' ? 1 : -1;\n\n result = [...result].sort((a, b) => {\n const valueA = this.options.sortValue!(a, columnId);\n const valueB = this.options.sortValue!(b, columnId);\n\n if (valueA === valueB) {\n return 0;\n }\n\n return (valueA as never) > (valueB as never) ? factor : -factor;\n });\n }\n\n const total = result.length;\n const items = params.size > 0 ?\n result.slice(params.page * params.size, (params.page * params.size) + params.size) :\n result;\n\n return of({ items, total });\n }\n}\n\n// wraps any fetch function, so no specific backend is baked in here\nexport class TableRemoteDataSource<Row> implements TableDataSource<Row> {\n constructor(\n private readonly fetch: (\n params: TableDataSourceParameters\n ) => Observable<TableDataSourceContent<Row>>\n ) {}\n\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>> {\n return this.fetch(params);\n }\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n output\n} from '@angular/core';\n\nimport { IconType, NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroXMark } from '@ng-icons/heroicons/outline';\nimport {\n heroCheckCircleSolid,\n heroExclamationTriangleSolid,\n heroInformationCircleSolid,\n heroXCircleSolid\n} from '@ng-icons/heroicons/solid';\n\nimport { UiCardComponent } from '../card/card.component';\nimport { ToastIntent } from './toast.types';\n\n\nconst INTENT_ICONS: Record<ToastIntent, IconType> = {\n info: 'heroInformationCircleSolid',\n success: 'heroCheckCircleSolid',\n warning: 'heroExclamationTriangleSolid',\n danger: 'heroXCircleSolid'\n};\n\nconst INTENT_COLOURS: Record<ToastIntent, string> = {\n info: 'text-primary-600',\n success: 'text-success-600',\n warning: 'text-warning-600',\n danger: 'text-danger-600'\n};\n\n@Component({\n selector: 'ui-toast',\n templateUrl: './toast.component.html',\n imports: [NgIcon, UiCardComponent],\n host: {\n '(mouseenter)': 'setHovered(true)',\n '(mouseleave)': 'setHovered(false)',\n '(focusin)': 'setFocused(true)',\n '(focusout)': 'setFocused(false)'\n },\n providers: [provideIcons({\n heroInformationCircleSolid,\n heroCheckCircleSolid,\n heroExclamationTriangleSolid,\n heroXCircleSolid,\n heroXMark\n })]\n})\nexport class UiToastComponent {\n readonly intent = input<ToastIntent>('info');\n readonly classes = input<string>('');\n readonly dismissable = input(false, { transform: booleanAttribute });\n\n /** ms before the toast dismisses itself, paused while hovered or focused. null never times out. */\n readonly timeoutMs = input<number | null>(null);\n\n readonly dismissed = output<void>();\n\n protected readonly icon = computed(() => INTENT_ICONS[this.intent()]);\n protected readonly iconColour = computed(() =>\n INTENT_COLOURS[this.intent()]\n );\n\n // errors interrupt the screen reader, everything else waits its turn\n protected readonly role = computed(() =>\n this.intent() === 'danger' ? 'alert' : 'status'\n );\n\n private hovered = false;\n private focused = false;\n\n private timer?: ReturnType<typeof setTimeout>;\n private startedAt = 0;\n private remaining = 0;\n\n constructor() {\n effect(onCleanup => {\n const timeoutMs = this.timeoutMs();\n\n if (timeoutMs === null) {\n return;\n }\n\n this.remaining = timeoutMs;\n this.updateTimer();\n\n onCleanup(() => this.stopTimer());\n });\n }\n\n protected setHovered(hovered: boolean): void {\n this.hovered = hovered;\n this.updateTimer();\n }\n\n protected setFocused(focused: boolean): void {\n this.focused = focused;\n this.updateTimer();\n }\n\n private updateTimer(): void {\n if (this.hovered || this.focused) {\n this.stopTimer();\n } else if (this.timeoutMs() !== null && this.timer === undefined) {\n this.startTimer();\n }\n }\n\n private startTimer(): void {\n this.startedAt = Date.now();\n this.timer = setTimeout(() => this.dismissed.emit(), this.remaining);\n }\n\n // keeps whatever time was left so the countdown carries on after a pause\n private stopTimer(): void {\n if (this.timer === undefined) {\n return;\n }\n\n clearTimeout(this.timer);\n this.timer = undefined;\n this.remaining -= Date.now() - this.startedAt;\n }\n}\n","<ui-card\n radius=\"xl\"\n class=\"p-4 w-full max-w-xs\"\n [class]=\"classes()\"\n [attr.role]=\"role()\"\n tabindex=\"-1\"\n>\n <div class=\"flex gap-x-3\">\n <div class=\"inline-flex\" [class]=\"iconColour()\">\n <ng-icon\n [name]=\"icon()\"\n class=\"shrink-0\"\n size=\"24\"\n />\n </div>\n <div class=\"grow\">\n <p class=\"text-layer-foreground ui-text-body\">\n <ng-content />\n </p>\n </div>\n @if (dismissable()) {\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n (click)=\"dismissed.emit()\"\n >\n <ng-icon name=\"heroXMark\" />\n </button>\n }\n </div>\n</ui-card>\n","import { Injectable, signal } from '@angular/core';\n\nimport { Toast, ToastMessage, ToastOptions } from './toast.types';\n\n\n@Injectable({ providedIn: 'root' })\nexport class UiToastService {\n private readonly _toasts = signal<Toast[]>([]);\n private nextId = 0;\n\n readonly toasts = this._toasts.asReadonly();\n\n show<ContextType>(\n message: ToastMessage<ContextType>,\n options: ToastOptions<ContextType> = {}\n ): number {\n const id = this.nextId++;\n\n const toast: Toast = {\n id,\n message,\n templateContext: {\n $implicit: options.context,\n dismiss: () => this.dismiss(id)\n },\n intent: options.intent ?? 'info',\n dismissable: options.dismissable ?? true,\n timeoutMs: options.timeoutMs\n };\n\n this._toasts.update(toasts => [...toasts, toast]);\n\n return id;\n }\n\n dismiss(id: number): void {\n this._toasts.update(toasts => toasts.filter(toast => toast.id !== id));\n }\n}\n","import { TemplateRef } from '@angular/core';\n\n\nexport const ToastIntents = [\n 'info',\n 'success',\n 'warning',\n 'danger'\n] as const;\n\nexport type ToastIntent = typeof ToastIntents[number];\n\n/** What a toast template receives: `let-data` for the context, `let-dismiss=\"dismiss\"` to close it. */\nexport interface ToastTemplateContext<ContextType = unknown> {\n $implicit: ContextType;\n dismiss: () => void;\n}\n\nexport type ToastMessage<ContextType = unknown> =\n | string\n | TemplateRef<ToastTemplateContext<ContextType>>;\n\nexport interface Toast {\n id: number;\n message: ToastMessage;\n templateContext: ToastTemplateContext;\n intent: ToastIntent;\n dismissable: boolean;\n\n // null never times out, undefined falls back to the toaster's timeout\n timeoutMs?: number | null;\n}\n\nexport type ToastOptions<ContextType = unknown> =\n & Partial<\n Pick<Toast, 'intent' | 'dismissable' | 'timeoutMs'>\n >\n & {\n context?: ContextType;\n };\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, inject, input } from '@angular/core';\n\nimport { UiToastComponent } from '../toast/toast.component';\nimport { UiToastService } from '../toast/toast.service';\nimport { ToasterPosition } from './toaster.types';\n\n\n// top stacks are reversed so the newest toast is always nearest the edge\nconst POSITION_CLASSES: Record<ToasterPosition, string> = {\n 'top-left': 'top-0 left-0 items-start flex-col-reverse',\n 'top-center':\n 'top-0 left-1/2 -translate-x-1/2 items-center flex-col-reverse',\n 'top-right': 'top-0 right-0 items-end flex-col-reverse',\n 'bottom-left': 'bottom-0 left-0 items-start flex-col',\n 'bottom-center': 'bottom-0 left-1/2 -translate-x-1/2 items-center flex-col',\n 'bottom-right': 'bottom-0 right-0 items-end flex-col'\n};\n\n@Component({\n selector: 'ui-toaster',\n templateUrl: './toaster.component.html',\n styleUrl: './toaster.component.css',\n imports: [UiToastComponent, NgTemplateOutlet]\n})\nexport class UiToasterComponent {\n readonly position = input<ToasterPosition>('bottom-right');\n readonly timeoutMs = input<number | null>(null);\n\n protected readonly toastService = inject(UiToastService);\n\n protected readonly positionClasses = computed(() =>\n POSITION_CLASSES[this.position()]\n );\n}\n","<section\n class=\"z-50 box-content fixed flex px-4 py-2.5 w-full max-w-xs pointer-events-none\"\n [class]=\"positionClasses()\"\n aria-label=\"Notifications\"\n>\n @for (toast of toastService.toasts(); track toast.id) {\n <div\n class=\"ui-toaster--item\"\n animate.enter=\"ui-toaster--enter\"\n animate.leave=\"ui-toaster--leave\"\n >\n <div class=\"ui-toaster--item-inner\">\n <ui-toast\n class=\"block py-1.5 w-full pointer-events-auto\"\n [intent]=\"toast.intent\"\n [dismissable]=\"toast.dismissable\"\n [timeoutMs]=\"toast.timeoutMs === undefined ? timeoutMs() : toast.timeoutMs\"\n (dismissed)=\"toastService.dismiss(toast.id)\"\n >\n @if (typeof toast.message === 'string') {\n {{ toast.message }}\n } @else {\n <ng-container\n *ngTemplateOutlet=\"toast.message; context: toast.templateContext\"\n />\n }\n </ui-toast>\n </div>\n </div>\n }\n</section>\n","export const ToasterPositions = [\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-left',\n 'bottom-center',\n 'bottom-right'\n] as const;\n\nexport type ToasterPosition = typeof ToasterPositions[number];\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, contentChild, TemplateRef } from '@angular/core';\n\n\n@Component({\n selector: 'ui-layout',\n templateUrl: './layout.component.html',\n styleUrl: './layout.component.css',\n imports: [NgTemplateOutlet]\n})\nexport class UiLayoutComponent {\n readonly sidebar = contentChild<TemplateRef<unknown>>('sidebar');\n}\n","<div class=\"shrink-0\">\n <ng-container *ngTemplateOutlet=\"sidebar()\" />\n</div>\n\n<main class=\"relative min-w-0 overflow-y-auto grow\">\n <ng-content />\n</main>\n","import { Component, computed, model } from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroBars3, heroChevronDoubleLeft } from '@ng-icons/heroicons/outline';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\n@Component({\n selector: 'ui-sidebar',\n exportAs: 'uiSidebar',\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.css',\n imports: [UiButtonComponent, NgIcon],\n host: {\n '[class.open]': 'isOpen()',\n '(document:keydown.escape)': 'isOpen.set(false)'\n },\n providers: [provideIcons({ heroChevronDoubleLeft, heroBars3 })]\n})\nexport class UiSidebarComponent {\n readonly isOpen = model<boolean>(false);\n\n readonly isCollapsed = computed(() => !this.isOpen());\n\n readonly toggle = () => this.isOpen.update(isOpen => !isOpen);\n}\n","<div class=\"ui-sidebar-backdrop\" aria-hidden=\"true\" (click)=\"isOpen.set(false)\">\n</div>\n\n<aside class=\"ui-sidebar-panel\">\n <div class=\"ui-sidebar-content\">\n <ng-content />\n </div>\n\n <footer class=\"ui-sidebar-footer\">\n <div class=\"ui-sidebar-footer-content\">\n <ng-content select=\"[sidebar-footer]\" />\n </div>\n\n <ui-button\n appearance=\"ghost\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"justify-center size-10 p-0!\"\n [ariaLabel]=\"isOpen() ? 'Collapse sidebar' : 'Expand sidebar'\"\n (click)=\"toggle()\"\n >\n <ng-icon\n name=\"heroChevronDoubleLeft\"\n size=\"16\"\n strokeWidth=\"2\"\n class=\"duration-300 shrink-0\"\n [class.rotate-180]=\"!isOpen()\"\n />\n </ui-button>\n </footer>\n</aside>\n\n@if (!isOpen()) {\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n class=\"ui-sidebar-open-btn\"\n classes=\"p-3! rounded-full! shadow-lg!\"\n ariaLabel=\"Open sidebar\"\n (click)=\"isOpen.set(true)\"\n >\n <ng-icon name=\"heroBars3\" size=\"20\" strokeWidth=\"2\" class=\"shrink-0\" />\n </ui-button>\n}\n","import { Component, computed, inject, input } from '@angular/core';\n\nimport { UiSidebarComponent } from '../sidebar/sidebar.component';\n\n\nlet nextId = 0;\n\n@Component({\n selector: 'ui-sidebar-group',\n templateUrl: './sidebar-group.component.html',\n styleUrl: './sidebar-group.component.css'\n})\nexport class UiSidebarGroupComponent {\n private readonly sidebar = inject(UiSidebarComponent, { optional: true });\n\n readonly label = input.required<string>();\n\n protected readonly labelId = `ui-sidebar-group-${nextId++}`;\n\n readonly isCollapsed = computed(() => this.sidebar?.isCollapsed() ?? false);\n}\n","@if (isCollapsed()) {\n <div class=\"ui-sidebar-group-divider\" aria-hidden=\"true\"></div>\n} @else {\n <span class=\"ui-sidebar-group-label ui-text-caption\" [id]=\"labelId\">{{ label() }}</span>\n}\n\n<div\n class=\"ui-sidebar-group-items\"\n role=\"group\"\n [attr.aria-labelledby]=\"isCollapsed() ? null : labelId\"\n [attr.aria-label]=\"isCollapsed() ? label() : null\"\n>\n <ng-content />\n</div>\n","import { Component, computed, inject, input } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport { UiSidebarComponent } from '../sidebar/sidebar.component';\n\n\n@Component({\n selector: 'ui-sidebar-item',\n templateUrl: './sidebar-item.component.html',\n styleUrl: './sidebar-item.component.css',\n imports: [UiButtonComponent, NgIcon]\n})\nexport class UiSidebarItemComponent {\n private readonly sidebar = inject(UiSidebarComponent, { optional: true });\n\n readonly label = input.required<string>();\n readonly icon = input<string>('');\n\n readonly isCollapsed = computed(() => this.sidebar ? !this.sidebar.isOpen() : false);\n}\n","@if (!isCollapsed() || icon()) {\n <ui-button\n appearance=\"ghost\"\n intent=\"secondary\"\n class=\"block\"\n [classes]=\"isCollapsed()\n ? 'ui-sidebar-item ui-sidebar-item--collapsed'\n : 'ui-sidebar-item'\"\n [ariaLabel]=\"isCollapsed() ? label() : ''\"\n >\n @if (icon()) {\n <ng-icon [name]=\"icon()\" size=\"20\" class=\"shrink-0\" />\n }\n\n @if (!isCollapsed()) {\n <span class=\"truncate\">{{ label() }}</span>\n\n <span class=\"empty:hidden ms-auto\">\n <ng-content select=\"ui-badge\" />\n </span>\n }\n </ui-button>\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n viewChild\n} from '@angular/core';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { UiInputGroupComponent } from '../../forms/input-group/input-group.component';\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\nconst HEX_PATTERN = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\n@Component({\n selector: 'ui-colour',\n templateUrl: './colour.component.html',\n imports: [UiInputComponent, UiInputGroupComponent, UiButtonComponent]\n})\nexport class UiColourComponent {\n readonly value = model<string>('#000000');\n\n readonly id = input<string>('');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n private readonly picker = viewChild.required<ElementRef<HTMLInputElement>>(\n 'picker'\n );\n\n protected readonly isValid = computed(() => HEX_PATTERN.test(this.value()));\n\n // the native picker only understands lowercase #rrggbb\n protected readonly pickerValue = computed(() => {\n if (!this.isValid()) {\n return '#000000';\n }\n\n const hex = this.value().slice(1).toLowerCase();\n\n return hex.length === 3\n ? '#' + [...hex].map(char => char + char).join('')\n : '#' + hex;\n });\n\n protected openPicker(): void {\n const picker = this.picker().nativeElement;\n\n if (picker.showPicker) {\n picker.showPicker();\n } else {\n picker.click();\n }\n }\n\n protected handlePick(event: Event): void {\n this.value.set((event.target as HTMLInputElement).value);\n }\n}\n","<ui-input-group [validationState]=\"isValid() ? null : false\">\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"h-full\"\n ariaLabel=\"Pick colour\"\n [disabled]=\"disabled()\"\n (click)=\"openPicker()\"\n >\n <span\n class=\"border border-line-2 rounded size-5\"\n [style.background-color]=\"isValid() ? value() : 'transparent'\"\n ></span>\n </ui-button>\n\n <input\n #picker\n type=\"color\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"pickerValue()\"\n [disabled]=\"disabled()\"\n (input)=\"handlePick($event)\"\n />\n\n <ui-input\n [(value)]=\"value\"\n [id]=\"id()\"\n [disabled]=\"disabled()\"\n [maxlength]=\"7\"\n [spellcheck]=\"false\"\n autocomplete=\"off\"\n placeholder=\"#000000\"\n />\n</ui-input-group>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n contentChild,\n input,\n model,\n TemplateRef\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroMinus, heroPlus } from '@ng-icons/heroicons/outline';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\n\n\n// todo\n// this component is just a number input with custom step buttons\n\n@Component({\n selector: 'ui-counter',\n templateUrl: './counter.component.html',\n imports: [UiInputComponent, NgTemplateOutlet, NgIcon],\n providers: [provideIcons({ heroPlus, heroMinus })]\n})\nexport class UiCounterComponent {\n readonly value = model<number | null>(null);\n readonly step = input<number>(1);\n readonly max = input<number>();\n readonly min = input<number>();\n readonly placeholder = input<string>('');\n\n // Leading/Trialing elements that appear inside of the input.\n readonly leadingElement = contentChild<TemplateRef<unknown>>('leading');\n readonly trailingElement = contentChild<TemplateRef<unknown>>('trailing');\n\n onStepUp() {\n let value = this.value() ?? 0;\n\n value += this.step();\n\n const max = this.max();\n\n if (max !== undefined && value > max) {\n value = max;\n }\n\n this.value.set(value);\n }\n\n onStepDown() {\n let value = this.value() ?? 0;\n\n value -= this.step();\n\n const min = this.min();\n\n if (min !== undefined && value < min) {\n value = min;\n }\n\n this.value.set(value);\n }\n}\n","<ui-input\n [(value)]=\"value\"\n [placeholder]=\"placeholder()\"\n type=\"number\"\n classes=\"[&::-webkit-inner-spin-button]:m-0 [&::-webkit-outer-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [appearance:textfield]\"\n>\n <ng-template #leading>\n <ng-container *ngTemplateOutlet=\"leadingElement()\" />\n </ng-template>\n <ng-template #trailing>\n <ng-container *ngTemplateOutlet=\"trailingElement()\" />\n\n <div class=\"flex self-stretch ms-2\">\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8\"\n (click)=\"onStepUp()\"\n >\n <ng-icon name=\"heroPlus\" class=\"shrink-0\" />\n </button>\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8\"\n (click)=\"onStepDown()\"\n >\n <ng-icon name=\"heroMinus\" class=\"shrink-0\" />\n </button>\n </div>\n </ng-template>\n</ui-input>\n","import {\n afterNextRender,\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroCalendarDateRange, heroXMark } from '@ng-icons/heroicons/outline';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport type { InputValidation } from '../../forms/input/input.types';\nimport { UiCalendarComponent } from '../../generic/calendar/calendar.component';\nimport type {\n DateRange,\n IsoDate,\n WeekStart\n} from '../../generic/calendar/calendar.types';\nimport { parseIsoDate } from '../../generic/calendar/calendar.utils';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../../generic/dropdown/dropdown.directives';\nimport type { DateRangePreset } from './date-range-picker.types';\n\n\nconst OPEN_KEYS = ['Enter', ' ', 'ArrowDown'];\n\n@Component({\n selector: 'ui-date-range-picker',\n templateUrl: './date-range-picker.component.html',\n styleUrl: './date-range-picker.component.css',\n imports: [\n UiInputComponent,\n UiCalendarComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n NgIcon\n ],\n host: { class: 'block' },\n providers: [provideIcons({ heroCalendarDateRange, heroXMark })]\n})\nexport class UiDateRangePickerComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n readonly value = model<DateRange>({ start: null, end: null });\n\n readonly id = input<string>('');\n readonly placeholder = input<string>('Select dates');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(true, { transform: booleanAttribute });\n readonly validationState = input<InputValidation>(null);\n readonly describedBy = input<string>('');\n\n readonly min = input<IsoDate | null>(null);\n readonly max = input<IsoDate | null>(null);\n readonly isDateDisabled = input<(date: IsoDate) => boolean>(() => false);\n readonly weekStart = input<WeekStart>(1);\n readonly locale = input<string>('en-GB');\n\n /** Intl options for the dates shown in the input. */\n readonly format = input<Intl.DateTimeFormatOptions>({\n dateStyle: 'medium'\n });\n\n /** Quick picks beside the calendar, see date-range-presets.ts for ready made ones. */\n readonly presets = input<DateRangePreset[]>([]);\n\n protected readonly isOpen = signal(false);\n\n private readonly calendar = viewChild(UiCalendarComponent);\n\n protected readonly hasValue = computed(() => !!this.value().start);\n\n // worked out on open so \"today\" is never stale\n protected readonly presetRanges = computed(() =>\n this.isOpen()\n ? this.presets().map(preset => this.clamp(preset.range()))\n : []\n );\n\n protected readonly activePreset = computed(() => {\n const { start, end } = this.value();\n\n return this.presetRanges().findIndex(range =>\n range.start === start && range.end === end\n );\n });\n\n protected readonly display = computed(() => {\n const start = parseIsoDate(this.value().start);\n const end = parseIsoDate(this.value().end);\n const format = new Intl.DateTimeFormat(this.locale(), this.format());\n\n if (!start) {\n return '';\n }\n\n // formatRange shares the month/year, e.g. \"1 – 7 Sept 2026\"\n return end\n ? format.formatRange(start, end)\n : `${format.format(start)} – …`;\n });\n\n protected toggle(): void {\n if (!this.disabled()) {\n this.isOpen.update(open => !open);\n }\n }\n\n protected handleInputKeydown(event: KeyboardEvent): void {\n if (this.disabled() || !OPEN_KEYS.includes(event.key)) {\n return;\n }\n\n event.preventDefault();\n this.isOpen.set(true);\n\n afterNextRender(() => this.calendar()?.focusActiveDate(), {\n injector: this.injector\n });\n }\n\n protected handleRange(range: DateRange): void {\n // only close once both ends are picked\n if (range.start && range.end) {\n this.isOpen.set(false);\n this.focusInput();\n }\n }\n\n protected choosePreset(preset: DateRangePreset): void {\n this.value.set(this.clamp(preset.range()));\n this.isOpen.set(false);\n this.focusInput();\n }\n\n protected handlePanelKeydown(event: KeyboardEvent): void {\n // the overlay closes itself on escape, we just put focus back\n if (event.key === 'Escape') {\n this.focusInput();\n }\n }\n\n protected clear(event: Event): void {\n // stop the input underneath from opening the calendar\n event.stopPropagation();\n\n this.value.set({ start: null, end: null });\n this.focusInput();\n }\n\n // keeps presets inside min/max, e.g. \"This year\" stops at today when max is today\n private clamp({ start, end }: DateRange): DateRange {\n const min = this.min();\n const max = this.max();\n\n return {\n start: start && min && start < min ? min : start,\n end: end && max && end > max ? max : end\n };\n }\n\n private focusInput(): void {\n this.host.nativeElement.querySelector('input')?.focus();\n }\n}\n","<ui-dropdown\n [isOpen]=\"isOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n class=\"w-full\"\n>\n <ui-input\n [value]=\"display()\"\n [id]=\"id()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n ariaHasPopup=\"dialog\"\n [validationState]=\"validationState()\"\n classes=\"cursor-pointer\"\n autocomplete=\"off\"\n readonly\n (click)=\"toggle()\"\n (keydown)=\"handleInputKeydown($event)\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroCalendarDateRange\"\n class=\"ms-3 text-muted-foreground-1 shrink-0\"\n />\n </ng-template>\n\n <ng-template #trailing>\n @if (clearable() && hasValue() && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8 self-stretch text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear dates\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"ui-date-range-panel\">\n @if (presets().length) {\n <div class=\"ui-date-range-presets\" role=\"group\" aria-label=\"Quick ranges\">\n @for (preset of presets(); track preset.label; let index = $index) {\n <button\n type=\"button\"\n class=\"ui-date-range-preset ui-text-body-alt\"\n [attr.aria-pressed]=\"index === activePreset()\"\n (click)=\"choosePreset(preset)\"\n (keydown)=\"handlePanelKeydown($event)\"\n >\n {{ preset.label }}\n </button>\n }\n </div>\n }\n\n <ui-calendar\n class=\"p-3\"\n mode=\"range\"\n [(range)]=\"value\"\n [min]=\"min()\"\n [max]=\"max()\"\n [isDateDisabled]=\"isDateDisabled()\"\n [weekStart]=\"weekStart()\"\n [locale]=\"locale()\"\n (rangeChange)=\"handleRange($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n </div>\n </div>\n }\n</ui-dropdown>\n","import type { WeekStart } from '../../generic/calendar/calendar.types';\nimport { addDays, toIsoDate } from '../../generic/calendar/calendar.utils';\nimport type { DateRangePreset } from './date-range-picker.types';\n\n\n// everything is relative to the moment it's clicked, not when the page loaded\nconst today = () => {\n const now = new Date();\n\n return new Date(now.getFullYear(), now.getMonth(), now.getDate());\n};\n\nconst between = (start: Date, end: Date) => ({\n start: toIsoDate(start),\n end: toIsoDate(end)\n});\n\nexport function todayPreset(label = 'Today'): DateRangePreset {\n return { label, range: () => between(today(), today()) };\n}\n\n/** The last `days` days, counting today. */\nexport function lastDaysPreset(days: number, label = `Last ${days} days`): DateRangePreset {\n return { label, range: () => between(addDays(today(), 1 - days), today()) };\n}\n\nexport function thisWeekPreset(weekStart: WeekStart = 1, label = 'This week'): DateRangePreset {\n return {\n label,\n range: () => {\n const offset = (today().getDay() - weekStart + 7) % 7;\n const start = addDays(today(), -offset);\n\n return between(start, addDays(start, 6));\n }\n };\n}\n\n/** A calendar month, 0 is this month, -1 is last month. */\nexport function monthPreset(offset = 0, label = offset ? 'Last month' : 'This month'): DateRangePreset {\n return {\n label,\n range: () => {\n const now = today();\n\n return between(\n new Date(now.getFullYear(), now.getMonth() + offset, 1),\n new Date(now.getFullYear(), now.getMonth() + offset + 1, 0)\n );\n }\n };\n}\n\n/** A calendar year, 0 is this year, -1 is last year. */\nexport function yearPreset(offset = 0, label = offset ? 'Last year' : 'This year'): DateRangePreset {\n return {\n label,\n range: () => {\n const year = today().getFullYear() + offset;\n\n return between(new Date(year, 0, 1), new Date(year, 11, 31));\n }\n };\n}\n\n/**\n * A financial year starting on the given day, e.g. the UK tax year is\n * `financialYearPreset(3, 6)` for 6 April. 0 is the current one, -1 the one before.\n */\nexport function financialYearPreset(\n startMonth: number,\n startDay: number,\n offset = 0,\n label = offset ? 'Last financial year' : 'This financial year'\n): DateRangePreset {\n return {\n label,\n range: () => {\n const now = today();\n const thisYearsStart = new Date(now.getFullYear(), startMonth, startDay);\n\n // before this year's start date we're still in the one that began last year\n const startYear = now >= thisYearsStart ? now.getFullYear() : now.getFullYear() - 1;\n const start = new Date(startYear + offset, startMonth, startDay);\n const end = addDays(new Date(startYear + offset + 1, startMonth, startDay), -1);\n\n return between(start, end);\n }\n };\n}\n\n/** A sensible starting set, pass your own list to change it. */\nexport function defaultDateRangePresets(weekStart: WeekStart = 1): DateRangePreset[] {\n return [\n todayPreset(),\n lastDaysPreset(7),\n lastDaysPreset(30),\n thisWeekPreset(weekStart),\n monthPreset(0),\n monthPreset(-1),\n yearPreset(0),\n yearPreset(-1)\n ];\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroClock } from '@ng-icons/heroicons/outline';\n\nimport { UiSelectComponent } from '../../forms/select/select.component';\nimport { SelectLocalDataSource } from '../../forms/select/select.datasource';\nimport { parseTime, toTime } from '../../generic/calendar/calendar.utils';\n\n\n@Component({\n selector: 'ui-time-select',\n templateUrl: './time-select.component.html',\n styleUrl: './time-select.component.css',\n imports: [UiSelectComponent, NgIcon],\n host: { class: 'inline-flex items-center gap-x-1' },\n providers: [provideIcons({ heroClock })]\n})\nexport class UiTimeSelectComponent {\n /** 24 hour \"HH:mm\" string. */\n readonly value = model<string>('00:00');\n\n readonly minuteStep = input<number>(5);\n readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly hours = computed(() =>\n parseTime(this.value())?.hours ?? 0\n );\n protected readonly minutes = computed(() =>\n parseTime(this.value())?.minutes ?? 0\n );\n\n protected readonly hourSource = new SelectLocalDataSource(\n Array.from({ length: 24 }, (_, hour) => hour),\n () => true\n );\n\n protected readonly minuteSource = computed(() => {\n const step = Math.max(1, Math.floor(this.minuteStep()));\n\n return new SelectLocalDataSource(\n Array.from(\n { length: Math.ceil(60 / step) },\n (_, index) => index * step\n ),\n () => true\n );\n });\n\n protected readonly pad = (value: number) => String(value).padStart(2, '0');\n\n protected setHours(hours: number | null): void {\n if (hours !== null) {\n this.value.set(toTime(hours, this.minutes()));\n }\n }\n\n protected setMinutes(minutes: number | null): void {\n if (minutes !== null) {\n this.value.set(toTime(this.hours(), minutes));\n }\n }\n}\n","<ng-icon name=\"heroClock\" class=\"me-1 text-muted-foreground-1 shrink-0\" />\n\n<ui-select\n class=\"ui-time-select-part\"\n [dataSource]=\"hourSource\"\n [displayWith]=\"pad\"\n [pageSize]=\"24\"\n [selectedItem]=\"hours()\"\n [disabled]=\"disabled()\"\n (selectionChange)=\"setHours($event)\"\n/>\n\n<span class=\"text-muted-foreground-1\" aria-hidden=\"true\">:</span>\n\n<ui-select\n class=\"ui-time-select-part\"\n [dataSource]=\"minuteSource()\"\n [displayWith]=\"pad\"\n [pageSize]=\"60\"\n [selectedItem]=\"minutes()\"\n [disabled]=\"disabled()\"\n (selectionChange)=\"setMinutes($event)\"\n/>\n","import {\n afterNextRender,\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroCalendar, heroXMark } from '@ng-icons/heroicons/outline';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport type { InputValidation } from '../../forms/input/input.types';\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport { UiCalendarComponent } from '../../generic/calendar/calendar.component';\nimport type {\n IsoDate,\n IsoDateTime,\n WeekStart\n} from '../../generic/calendar/calendar.types';\nimport {\n parseIsoDateTime,\n parseTime,\n toIsoDate\n} from '../../generic/calendar/calendar.utils';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../../generic/dropdown/dropdown.directives';\nimport { UiTimeSelectComponent } from '../time-select/time-select.component';\n\n\nconst OPEN_KEYS = ['Enter', ' ', 'ArrowDown'];\n\n@Component({\n selector: 'ui-datepicker',\n templateUrl: './datepicker.component.html',\n styleUrl: './datepicker.component.css',\n imports: [\n UiInputComponent,\n UiCalendarComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n UiButtonComponent,\n UiTimeSelectComponent,\n NgIcon,\n UiCardComponent\n ],\n host: { class: 'block' },\n providers: [provideIcons({ heroCalendar, heroXMark })]\n})\nexport class UiDatepickerComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n /** \"2026-09-29\", or \"2026-09-29T14:30\" when `withTime` is on. */\n readonly value = model<IsoDate | IsoDateTime | null>(null);\n\n readonly id = input<string>('');\n readonly placeholder = input<string>('Select date');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(true, { transform: booleanAttribute });\n readonly validationState = input<InputValidation>(null);\n readonly describedBy = input<string>('');\n\n readonly min = input<IsoDate | null>(null);\n readonly max = input<IsoDate | null>(null);\n readonly isDateDisabled = input<(date: IsoDate) => boolean>(() => false);\n readonly weekStart = input<WeekStart>(1);\n readonly locale = input<string>('en-GB');\n\n readonly withTime = input(false, { transform: booleanAttribute });\n readonly minuteStep = input<number>(5);\n\n /** Time used when a date is picked before a time has been chosen. */\n readonly defaultTime = input<string>('00:00');\n\n /** Intl options for the value shown in the input. */\n readonly format = input<Intl.DateTimeFormatOptions | null>(null);\n\n protected readonly isOpen = signal(false);\n\n private readonly calendar = viewChild(UiCalendarComponent);\n\n protected readonly datePart = computed(() =>\n this.value()?.slice(0, 10) ?? null\n );\n\n protected readonly timePart = computed(() => {\n const time = this.value()?.slice(11, 16);\n\n return parseTime(time) ? time! : this.defaultTime();\n });\n\n protected readonly display = computed(() => {\n const date = parseIsoDateTime(this.value());\n const format = this.format() ?? (this.withTime()\n ? { dateStyle: 'medium', timeStyle: 'short' } as const\n : { dateStyle: 'medium' } as const);\n\n return date\n ? new Intl.DateTimeFormat(this.locale(), format).format(date)\n : '';\n });\n\n protected toggle(): void {\n if (!this.disabled()) {\n this.isOpen.update(open => !open);\n }\n }\n\n protected handleInputKeydown(event: KeyboardEvent): void {\n if (this.disabled() || !OPEN_KEYS.includes(event.key)) {\n return;\n }\n\n event.preventDefault();\n this.isOpen.set(true);\n\n afterNextRender(() => this.calendar()?.focusActiveDate(), {\n injector: this.injector\n });\n }\n\n protected handlePick(date: IsoDate | null): void {\n if (!date) {\n return;\n }\n\n if (!this.withTime()) {\n this.value.set(date);\n this.close();\n return;\n }\n\n // stays open so the time can be set too\n this.value.set(`${date}T${this.timePart()}`);\n }\n\n protected handleTime(time: string): void {\n // picking a time first puts it on today\n const date = this.datePart() ?? toIsoDate(new Date());\n\n this.value.set(`${date}T${time}`);\n }\n\n protected close(): void {\n this.isOpen.set(false);\n this.focusInput();\n }\n\n protected handlePanelKeydown(event: KeyboardEvent): void {\n // the overlay closes itself on escape, we just put focus back\n if (event.key === 'Escape') {\n this.focusInput();\n }\n }\n\n protected clear(event: Event): void {\n // stop the input underneath from opening the calendar\n event.stopPropagation();\n\n this.value.set(null);\n this.focusInput();\n }\n\n private focusInput(): void {\n this.host.nativeElement.querySelector('input')?.focus();\n }\n}\n","<ui-dropdown\n [isOpen]=\"isOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n class=\"w-full\"\n>\n <ui-input\n [value]=\"display()\"\n [id]=\"id()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n ariaHasPopup=\"dialog\"\n [validationState]=\"validationState()\"\n classes=\"cursor-pointer\"\n autocomplete=\"off\"\n readonly\n (click)=\"toggle()\"\n (keydown)=\"handleInputKeydown($event)\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroCalendar\"\n class=\"ms-3 text-muted-foreground-1 shrink-0\"\n />\n </ng-template>\n\n <ng-template #trailing>\n @if (clearable() && value() && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center self-stretch w-8 text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear date\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <ui-card radius=\"xl\" class=\"p-3\">\n <ui-calendar\n [value]=\"datePart()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [isDateDisabled]=\"isDateDisabled()\"\n [weekStart]=\"weekStart()\"\n [locale]=\"locale()\"\n (valueChange)=\"handlePick($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n\n @if (withTime()) {\n <div class=\"flex justify-between items-center gap-x-2 mt-3 pt-3 border-line-2 border-t\">\n <ui-time-select\n [value]=\"timePart()\"\n [minuteStep]=\"minuteStep()\"\n (valueChange)=\"handleTime($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n\n <ui-button size=\"sm\" (click)=\"close()\">Done</ui-button>\n </div>\n }\n </ui-card>\n </div>\n }\n</ui-dropdown>\n","import { Component, input, model } from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroChevronDown } from '@ng-icons/heroicons/outline';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport {\n ButtonAppearance,\n ButtonIntent\n} from '../../generic/button/button.types';\n\n\n@Component({\n selector: 'ui-dropdown-button',\n templateUrl: './dropdown-button.component.html',\n imports: [UiButtonComponent, NgIcon],\n providers: [provideIcons({ heroChevronDown })]\n})\nexport class UiDropdownButtonComponent {\n readonly intent = input<ButtonIntent>('secondary');\n readonly appearance = input<ButtonAppearance>('white');\n readonly icon = input<string>('heroChevronDown');\n readonly isOpen = model.required<boolean>();\n}\n","<ui-button\n [intent]=\"intent()\"\n [appearance]=\"appearance()\"\n (click)=\"isOpen.update(value => !value)\"\n>\n <ng-content />\n <ng-icon\n name=\"heroChevronDown\"\n class=\"size-4 transition-transform duration-100 shrink-0\"\n [class.rotate-180]=\"isOpen()\"\n />\n</ui-button>\n","import { Component, input } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { DropdownMenuItem } from './dropdown-menu.types';\n\n\n@Component({\n selector: 'ui-dropdown-menu',\n templateUrl: './dropdown-menu.component.html',\n imports: [UiButtonComponent, UiCardComponent, NgIcon]\n})\nexport class UiDropdownMenuComponent {\n readonly items = input.required<DropdownMenuItem[]>();\n}\n","<ui-card radius=\"lg\" class=\"divide-y w-3xs max-w-md\" role=\"menu\">\n @for (item of items(); track $index) {\n @if ('divider' in item) {\n <div class=\"my-1 border-border border-t\"></div>\n } @else if ('children' in item) {\n <div class=\"flex flex-col gap-y-0.5 p-1\">\n <span\n class=\"block px-4 pt-2 pb-1 font-medium text-muted-foreground ui-text-caption uppercase\"\n >\n {{ item.label }}\n </span>\n\n @for (child of item.children; track child.label) {\n <ui-button\n appearance=\"none\"\n classes=\"flex items-center gap-x-3.5 px-3 py-2 rounded-lg ui-text-body-alt text-dropdown-item-foreground hover:bg-dropdown-item-hover focus:bg-dropdown-item-focus w-full border-transparent focus:outline-hidden!\"\n (click)=\"child.onClick()\"\n >\n @if (child.icon) {\n <ng-icon\n [name]=\"child.icon\"\n size=\"18\"\n strokeWidth=\"1.5\"\n class=\"size-4 shrink-0\"\n />\n }\n\n {{ child.label }}\n </ui-button>\n }\n </div>\n } @else {\n <div class=\"p-1\">\n <ui-button\n appearance=\"none\"\n classes=\"flex items-center gap-x-3.5 px-3 py-2 rounded-lg ui-text-body-alt text-dropdown-item-foreground hover:bg-dropdown-item-hover focus:bg-dropdown-item-focus w-full border-transparent focus:outline-hidden!\"\n (click)=\"item.onClick()\"\n >\n @if (item.icon) {\n <ng-icon\n [name]=\"item.icon\"\n size=\"18\"\n strokeWidth=\"2\"\n class=\"size-4 shrink-0\"\n />\n }\n\n {{ item.label }}\n </ui-button>\n </div>\n }\n }\n</ui-card>\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n output,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroArrowUp, heroXMark } from '@ng-icons/heroicons/outline';\n\nimport type { FileRejection } from '../../forms/file/file.types';\nimport { selectFiles } from '../../forms/file/file.utils';\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { UiInputGroupComponent } from '../../forms/input-group/input-group.component';\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\n@Component({\n selector: 'ui-file-input',\n templateUrl: './file-input.component.html',\n imports: [\n UiInputComponent,\n UiInputGroupComponent,\n UiButtonComponent,\n NgIcon\n ],\n providers: [provideIcons({ heroArrowUp, heroXMark })]\n})\nexport class UiFileInputComponent {\n readonly value = model<File[]>([]);\n\n readonly id = input<string>('');\n readonly accept = input<string>('');\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly describedBy = input<string>('');\n\n /** Max size per file in bytes. */\n readonly maxSize = input<number | null>(null);\n\n readonly placeholder = input<string>('No file chosen');\n readonly buttonLabel = input<string>('Browse');\n\n readonly rejected = output<FileRejection[]>();\n\n private readonly picker = viewChild.required<ElementRef<HTMLInputElement>>(\n 'picker'\n );\n\n protected readonly hasRejection = signal(false);\n\n protected readonly summary = computed(() => {\n const files = this.value();\n\n return files.length > 1\n ? `${files.length} files`\n : files[0]?.name ?? '';\n });\n\n protected openPicker(): void {\n if (this.disabled()) {\n return;\n }\n\n const picker = this.picker().nativeElement;\n\n if (picker.showPicker) {\n picker.showPicker();\n } else {\n picker.click();\n }\n }\n\n protected handlePick(event: Event): void {\n const target = event.target as HTMLInputElement;\n const { accepted, rejected } = selectFiles(\n [...target.files ?? []],\n this.accept(),\n this.maxSize()\n );\n\n // reset so picking the same file again still fires change\n target.value = '';\n\n this.hasRejection.set(rejected.length > 0);\n\n if (rejected.length) {\n this.rejected.emit(rejected);\n }\n\n if (accepted.length) {\n this.value.set(accepted);\n }\n }\n\n protected clear(event: Event): void {\n // stop the input underneath from opening the picker\n event.stopPropagation();\n\n this.value.set([]);\n this.hasRejection.set(false);\n }\n}\n","<ui-input-group [validationState]=\"hasRejection() ? false : null\">\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"h-full\"\n [disabled]=\"disabled()\"\n (click)=\"openPicker()\"\n >\n <ng-icon name=\"heroArrowUpTray\" class=\"shrink-0\" />\n {{ buttonLabel() }}\n </ui-button>\n\n <input\n #picker\n type=\"file\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"handlePick($event)\"\n />\n\n <ui-input\n [value]=\"summary()\"\n [id]=\"id()\"\n [disabled]=\"disabled()\"\n [placeholder]=\"placeholder()\"\n [describedBy]=\"describedBy()\"\n classes=\"truncate cursor-pointer\"\n readonly\n (click)=\"openPicker()\"\n >\n <ng-template #trailing>\n @if (value().length && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8 self-stretch text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear files\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n</ui-input-group>\n","import {\n booleanAttribute,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n model,\n numberAttribute,\n output,\n untracked\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroMagnifyingGlass, heroXMark } from '@ng-icons/heroicons/outline';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { type UiLinkedTable, UiTableRegistry } from '../../generic/table/table.registry';\n\n\n@Component({\n selector: 'ui-search',\n templateUrl: './search.component.html',\n styleUrl: './search.component.css',\n imports: [UiInputComponent, NgIcon],\n providers: [provideIcons({ heroMagnifyingGlass, heroXMark })],\n host: { class: 'block' }\n})\nexport class UiSearchComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly registry = inject(UiTableRegistry);\n\n readonly value = model<string>('');\n\n readonly placeholder = input<string>('Search');\n readonly ariaLabel = input<string>('Search');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** How long typing has to pause before `searched` fires, in milliseconds. */\n readonly debounce = input(300, { transform: numberAttribute });\n\n /** The `tableId` of a ui-table to search, it can render before or after this. */\n readonly table = input<string | null>(null);\n\n /** The value once typing pauses, for running a search. Clearing fires straight away. */\n readonly searched = output<string>();\n\n private readonly linked = computed(() => {\n const id = this.table();\n\n return id ? this.registry.get(id) : null;\n });\n\n private timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n let previous: UiLinkedTable | null = null;\n\n effect(() => {\n const table = this.linked();\n const query = table?.query() ?? '';\n\n untracked(() => {\n const justLinked = table !== previous;\n\n previous = table;\n\n if (!table) {\n return;\n }\n\n if (justLinked && !query && this.value()) {\n table.query.set(this.value());\n\n return;\n }\n\n this.value.set(query);\n });\n });\n\n inject(DestroyRef).onDestroy(() => clearTimeout(this.timer));\n }\n\n protected onInput(value: string): void {\n this.value.set(value);\n this.linked()?.query.set(value);\n\n clearTimeout(this.timer);\n this.timer = setTimeout(() => this.searched.emit(value), this.debounce());\n }\n\n protected clear(): void {\n if (!this.value()) {\n return;\n }\n\n clearTimeout(this.timer);\n this.value.set('');\n this.linked()?.query.set('');\n this.searched.emit('');\n\n this.host.nativeElement.querySelector('input')?.focus();\n }\n}\n","<ui-input\n [value]=\"value()\"\n (valueChange)=\"onInput($event)\"\n [placeholder]=\"placeholder()\"\n [ariaLabel]=\"ariaLabel()\"\n [disabled]=\"disabled()\"\n [spellcheck]=\"false\"\n inputRole=\"searchbox\"\n autocomplete=\"off\"\n (keydown.escape)=\"clear()\"\n>\n <ng-template #leading>\n <ng-icon name=\"heroMagnifyingGlass\" class=\"ms-3 size-4 text-muted-foreground-1 shrink-0\" />\n </ng-template>\n\n <ng-template #trailing>\n @if (value() && !disabled()) {\n <button type=\"button\" class=\"ui-search-clear\" aria-label=\"Clear search\" (click)=\"clear()\">\n <ng-icon name=\"heroXMark\" size=\"16\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n</ui-input>\n","import { booleanAttribute, Component, input, model } from '@angular/core';\n\nimport { UiCheckboxComponent } from '../../forms/checkbox/checkbox.component';\n\n\n// restyles ui-checkbox into a track-and-thumb switch, same behaviour underneath\n@Component({\n selector: 'ui-switch',\n templateUrl: './switch.component.html',\n imports: [UiCheckboxComponent]\n})\nexport class UiSwitchComponent {\n readonly value = model.required<boolean>();\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly disabled = input(false, { transform: booleanAttribute });\n}\n","<label class=\"inline-flex items-center gap-2 cursor-pointer\" [class.opacity-50]=\"disabled()\">\n <span class=\"relative inline-flex items-center rounded-full focus-within:ring-2 focus-within:ring-primary-200/50\">\n <!--\n reuses ui-checkbox for the real state/behaviour, class-bound track/thumb below\n react to value() directly instead of peer-checked, since peer-* relies on the\n input and the styled element being real DOM siblings, which breaks once the\n input is nested inside ui-checkbox's own host element\n -->\n <ui-checkbox\n [(value)]=\"value\"\n [disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n classes=\"sr-only\"\n />\n\n <span\n class=\"w-9 h-5 rounded-full transition-colors\"\n [class.bg-primary-600]=\"value()\"\n [class.bg-surface-1]=\"!value()\"\n ></span>\n\n <span\n class=\"absolute left-0.5 size-4 rounded-full bg-white shadow transition-transform\"\n [class.translate-x-4]=\"value()\"\n ></span>\n </span>\n\n <ng-content />\n</label>\n","import type { DateRange, IsoDate } from '../../generic/calendar/calendar.types';\nimport type { DateRangePreset } from '../date-range-picker/date-range-picker.types';\n\n\nexport const TableFiltersBreakpoints = {\n sm: '40rem',\n md: '48rem',\n lg: '64rem',\n xl: '80rem',\n '2xl': '96rem'\n} as const;\n\n/** @see {@link TableFiltersBreakpoints} */\nexport type TableFiltersBreakpoint = keyof typeof TableFiltersBreakpoints;\n\nexport interface TableFacetOption {\n value: unknown;\n label: string;\n}\n\n/** Writes the picked value, or an array when `multiple`, under `id`. */\nexport interface TableOptionsFacet {\n id: string;\n label: string;\n kind: 'options';\n options: TableFacetOption[];\n\n multiple?: boolean;\n}\n\n/** Writes `{ start, end }` ISO dates under `id`. */\nexport interface TableDateRangeFacet {\n id: string;\n label: string;\n kind: 'dateRange';\n\n /** Quick picks, see date-range-presets.ts for ready made ones. */\n presets?: DateRangePreset[];\n placeholder?: string;\n min?: IsoDate | null;\n max?: IsoDate | null;\n}\n\nexport type TableFacet = TableOptionsFacet | TableDateRangeFacet;\n\nexport type TableFacetDateRange = DateRange;\n","import { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n untracked\n} from '@angular/core';\n\nimport { UiCheckboxComponent } from '../../forms/checkbox/checkbox.component';\nimport { UiRadioComponent } from '../../forms/radio/radio.component';\nimport { UiBadgeComponent } from '../../generic/badge/badge.component';\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport type { DateRange } from '../../generic/calendar/calendar.types';\nimport { UiDrawerComponent } from '../../generic/drawer/drawer.component';\nimport {\n type UiLinkedTable,\n UiTableRegistry\n} from '../../generic/table/table.registry';\nimport { UiDateRangePickerComponent } from '../date-range-picker/date-range-picker.component';\nimport {\n type TableDateRangeFacet,\n type TableFacet,\n type TableFacetOption,\n type TableFiltersBreakpoint,\n TableFiltersBreakpoints,\n type TableOptionsFacet\n} from './table-filters.types';\n\n\nlet nextId = 0;\n\ntype Filters = Record<string, unknown>;\n\ntype DateMode = 'any' | 'custom' | number;\n\n@Component({\n selector: 'ui-table-filters',\n templateUrl: './table-filters.component.html',\n styleUrl: './table-filters.component.css',\n imports: [\n NgTemplateOutlet,\n UiButtonComponent,\n UiBadgeComponent,\n UiDrawerComponent,\n UiCheckboxComponent,\n UiRadioComponent,\n UiDateRangePickerComponent\n ],\n host: { class: 'block' }\n})\nexport class UiTableFiltersComponent {\n private readonly registry = inject(UiTableRegistry);\n\n readonly facets = input.required<TableFacet[]>();\n\n /** The `tableId` of a ui-table to filter, it can render before or after this. */\n readonly table = input<string | null>(null);\n\n readonly value = model<Filters>({});\n\n /** Below this breakpoint the panel becomes a Filters button and a drawer. */\n readonly collapseBelow = input<TableFiltersBreakpoint>('lg');\n\n protected readonly idPrefix = `ui-table-filters-${nextId++}`;\n\n protected readonly anyDate: DateMode = 'any';\n protected readonly customDate: DateMode = 'custom';\n\n private readonly customDates = signal<ReadonlySet<string>>(new Set());\n\n private readonly linked = computed(() => {\n const id = this.table();\n\n return id ? this.registry.get(id) : null;\n });\n\n protected readonly appliedCount = computed(() =>\n this.facets().filter(facet => facet.id in this.value()).length\n );\n\n protected readonly anyApplied = computed(() => this.appliedCount() > 0);\n\n private readonly window = inject(DOCUMENT).defaultView;\n\n // two copies of the filters would share radio names\n protected readonly wide = signal(true);\n\n constructor() {\n effect(onCleanup => {\n const media = this.window?.matchMedia?.(\n `(min-width: ${TableFiltersBreakpoints[this.collapseBelow()]})`\n );\n\n if (!media) {\n return;\n }\n\n const onChange = (event: MediaQueryListEvent) =>\n this.wide.set(event.matches);\n\n this.wide.set(media.matches);\n media.addEventListener('change', onChange);\n onCleanup(() => media.removeEventListener('change', onChange));\n });\n\n let previous: UiLinkedTable | null = null;\n\n effect(() => {\n const table = this.linked();\n const filters = table?.filters() ?? {};\n\n untracked(() => {\n const justLinked = table !== previous;\n\n previous = table;\n\n if (!table) {\n return;\n }\n\n if (justLinked && this.anyApplied() && !this.hasAny(filters)) {\n table.filters.set({\n ...filters,\n ...this.ownFilters(this.value())\n });\n\n return;\n }\n\n this.value.set(filters);\n });\n });\n }\n\n protected groupName(facet: TableFacet): string {\n return `${this.idPrefix}-${facet.id}`;\n }\n\n protected choiceId(facet: TableFacet, choice: number | string): string {\n return `${this.groupName(facet)}-${choice}`;\n }\n\n protected picked(facet: TableOptionsFacet): unknown {\n return this.value()[facet.id] ?? null;\n }\n\n protected pick(facet: TableOptionsFacet, value: unknown): void {\n this.apply(facet.id, value ?? undefined);\n }\n\n protected isChecked(\n facet: TableOptionsFacet,\n option: TableFacetOption\n ): boolean {\n const applied = this.value()[facet.id];\n\n return Array.isArray(applied) && applied.includes(option.value);\n }\n\n protected check(\n facet: TableOptionsFacet,\n option: TableFacetOption,\n checked: boolean\n ): void {\n const applied = this.value()[facet.id];\n const picked = (Array.isArray(applied) ? applied : []).filter(value =>\n value !== option.value\n );\n const next = checked ? [...picked, option.value] : picked;\n\n this.apply(facet.id, next.length ? next : undefined);\n }\n\n protected range(facet: TableDateRangeFacet): DateRange {\n return (this.value()[facet.id] as DateRange | undefined) ??\n { start: null, end: null };\n }\n\n protected dateMode(facet: TableDateRangeFacet): DateMode {\n if (this.customDates().has(facet.id)) {\n return 'custom';\n }\n\n const applied = this.range(facet);\n\n if (!applied.start) {\n return 'any';\n }\n\n const index = (facet.presets ?? []).findIndex(preset => {\n const range = preset.range();\n\n return range.start === applied.start && range.end === applied.end;\n });\n\n return index === -1 ? 'custom' : index;\n }\n\n protected pickDate(facet: TableDateRangeFacet, mode: DateMode): void {\n this.setCustom(facet.id, mode === 'custom');\n\n if (mode === 'any') {\n this.apply(facet.id, undefined);\n } else if (mode !== 'custom') {\n this.apply(facet.id, facet.presets?.[mode]?.range());\n }\n }\n\n protected setRange(facet: TableDateRangeFacet, range: DateRange): void {\n this.apply(facet.id, range.start ? range : undefined);\n }\n\n protected clearAll(): void {\n this.customDates.set(new Set());\n this.write(this.withoutOwn(this.currentFilters()));\n }\n\n private setCustom(id: string, custom: boolean): void {\n this.customDates.update(ids => {\n const next = new Set(ids);\n\n if (custom) {\n next.add(id);\n } else {\n next.delete(id);\n }\n\n return next;\n });\n }\n\n private apply(id: string, applied: unknown): void {\n const next = { ...this.currentFilters() };\n\n if (applied === undefined) {\n delete next[id];\n } else {\n next[id] = applied;\n }\n\n this.write(next);\n }\n\n private write(filters: Filters): void {\n this.value.set(filters);\n this.linked()?.filters.set(filters);\n }\n\n private currentFilters(): Filters {\n return this.linked()?.filters() ?? this.value();\n }\n\n private ownFilters(filters: Filters): Filters {\n const ids = new Set(this.facets().map(facet => facet.id));\n\n return Object.fromEntries(\n Object.entries(filters).filter(([id]) => ids.has(id))\n );\n }\n\n private withoutOwn(filters: Filters): Filters {\n const ids = new Set(this.facets().map(facet => facet.id));\n\n return Object.fromEntries(\n Object.entries(filters).filter(([id]) => !ids.has(id))\n );\n }\n\n private hasAny(filters: Filters): boolean {\n return Object.keys(this.ownFilters(filters)).length > 0;\n }\n}\n","@if (wide()) {\n <div class=\"ui-table-filters-panel ui-table-filters-panel--card\">\n <ng-container *ngTemplateOutlet=\"body; context: { $implicit: true }\" />\n </div>\n} @else {\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"gap-x-2 h-9.5 py-0!\"\n (click)=\"drawer.isOpen.set(true)\"\n >\n Filters\n @if (appliedCount()) {\n <ui-badge appearance=\"soft\" size=\"xs\" class=\"ui-text-caption\">{{\n appliedCount()\n }}</ui-badge>\n }\n </ui-button>\n\n <ui-drawer #drawer label=\"Filters\">\n <button\n drawer-actions\n type=\"button\"\n class=\"ui-table-filters-clear ui-text-body-alt\"\n [class.invisible]=\"!anyApplied()\"\n (click)=\"clearAll()\"\n >\n Clear all\n </button>\n\n <div class=\"ui-table-filters-panel\">\n <ng-container\n *ngTemplateOutlet=\"body; context: { $implicit: false }\"\n />\n </div>\n </ui-drawer>\n}\n\n<ng-template #body let-showHeader>\n @if (showHeader) {\n <div class=\"ui-table-filters-header\">\n <span class=\"ui-table-filters-title ui-text-body\">\n Filters\n </span>\n\n <button\n type=\"button\"\n class=\"ui-table-filters-clear ui-text-body-alt\"\n [class.invisible]=\"!anyApplied()\"\n (click)=\"clearAll()\"\n >\n Clear all\n </button>\n </div>\n }\n\n @for (facet of facets(); track facet.id) {\n <fieldset class=\"ui-table-filters-facet\">\n <legend class=\"ui-table-filters-legend ui-text-body-alt\">\n {{ facet.label }}\n </legend>\n\n <div class=\"ui-table-filters-choices\">\n @switch (facet.kind) {\n @case ('options') {\n @if (facet.multiple) {\n @for (option of facet.options; track option.value; let index = $index) {\n <label\n class=\"ui-table-filters-choice ui-text-body-alt\"\n [for]=\"choiceId(facet, index)\"\n >\n <ui-checkbox\n [id]=\"choiceId(facet, index)\"\n [value]=\"isChecked(facet, option)\"\n (valueChange)=\"check(facet, option, $event)\"\n />\n <span class=\"truncate\">{{\n option.label\n }}</span>\n </label>\n }\n } @else {\n <label\n class=\"ui-table-filters-choice ui-text-body-alt\"\n [for]=\"choiceId(facet, 'any')\"\n >\n <ui-radio\n [id]=\"choiceId(facet, 'any')\"\n [value]=\"picked(facet)\"\n (valueChange)=\"pick(facet, $event)\"\n [option]=\"null\"\n [name]=\"groupName(facet)\"\n />\n <span class=\"truncate\">Any</span>\n </label>\n\n @for (option of facet.options; track option.value; let index = $index) {\n <label\n class=\"ui-table-filters-choice ui-text-body-alt\"\n [for]=\"choiceId(facet, index)\"\n >\n <ui-radio\n [id]=\"choiceId(facet, index)\"\n [value]=\"picked(facet)\"\n (valueChange)=\"pick(facet, $event)\"\n [option]=\"option.value\"\n [name]=\"groupName(facet)\"\n />\n <span class=\"truncate\">{{\n option.label\n }}</span>\n </label>\n }\n }\n }\n @case ('dateRange') {\n <label\n class=\"ui-table-filters-choice ui-text-body-alt\"\n [for]=\"choiceId(facet, 'any')\"\n >\n <ui-radio\n [id]=\"choiceId(facet, 'any')\"\n [value]=\"dateMode(facet)\"\n (valueChange)=\"pickDate(facet, $event)\"\n [option]=\"anyDate\"\n [name]=\"groupName(facet)\"\n />\n <span class=\"truncate\">Any time</span>\n </label>\n\n @for (preset of facet.presets ?? []; track preset.label; let index = $index) {\n <label\n class=\"ui-table-filters-choice ui-text-body-alt\"\n [for]=\"choiceId(facet, index)\"\n >\n <ui-radio\n [id]=\"choiceId(facet, index)\"\n [value]=\"dateMode(facet)\"\n (valueChange)=\"pickDate(facet, $event)\"\n [option]=\"index\"\n [name]=\"groupName(facet)\"\n />\n <span class=\"truncate\">{{ preset.label }}</span>\n </label>\n }\n\n <label\n class=\"ui-table-filters-choice ui-text-body-alt\"\n [for]=\"choiceId(facet, 'custom')\"\n >\n <ui-radio\n [id]=\"choiceId(facet, 'custom')\"\n [value]=\"dateMode(facet)\"\n (valueChange)=\"pickDate(facet, $event)\"\n [option]=\"customDate\"\n [name]=\"groupName(facet)\"\n />\n <span class=\"truncate\">Custom range</span>\n </label>\n\n @if (dateMode(facet) === 'custom') {\n <label\n class=\"sr-only\"\n [for]=\"groupName(facet) + '-range'\"\n >{{ facet.label }} range</label>\n <ui-date-range-picker\n class=\"ui-table-filters-range\"\n [id]=\"groupName(facet) + '-range'\"\n [value]=\"range(facet)\"\n (valueChange)=\"setRange(facet, $event)\"\n [placeholder]=\"facet.placeholder ?? 'Select dates'\"\n [min]=\"facet.min ?? null\"\n [max]=\"facet.max ?? null\"\n />\n }\n }\n }\n </div>\n </fieldset>\n }\n</ng-template>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, inject, input } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiAvatarComponent } from '../../generic/avatar/avatar.component';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport type {\n DropdownMenuButton,\n DropdownMenuCategory,\n DropdownMenuItem\n} from '../dropdown-menu/dropdown-menu.types';\n\n\n/** Give the dropdown it sits in `closeBehaviour=\"whenClickOutside\"`. */\n@Component({\n selector: 'ui-user-menu',\n templateUrl: './user-menu.component.html',\n styleUrl: './user-menu.component.css',\n imports: [\n NgTemplateOutlet,\n UiCardComponent,\n UiAvatarComponent,\n NgIcon\n ]\n})\nexport class UiUserMenuComponent {\n private readonly dropdown = inject(UiDropdownComponent, { optional: true });\n\n readonly name = input.required<string>();\n\n /** A second line under the name, e.g. an email address. */\n readonly detail = input<string>('');\n readonly src = input<string | null>(null);\n\n readonly items = input<DropdownMenuItem[]>([]);\n\n protected readonly menuItems = computed<DropdownMenuItem[]>(() =>\n this.items().map(item => {\n if ('divider' in item) {\n return item;\n }\n\n if ('children' in item) {\n return {\n ...item,\n children: item.children.map(child => this.closing(child))\n };\n }\n\n return this.closing(item);\n })\n );\n\n protected isDivider(item: DropdownMenuItem): boolean {\n return 'divider' in item;\n }\n\n protected group(item: DropdownMenuItem): DropdownMenuCategory | null {\n return 'children' in item ? item : null;\n }\n\n protected button(item: DropdownMenuItem): DropdownMenuButton | null {\n return 'onClick' in item ? item : null;\n }\n\n private closing(item: DropdownMenuButton): DropdownMenuButton {\n return {\n ...item,\n onClick: () => {\n this.dropdown?.close();\n item.onClick();\n }\n };\n }\n}\n","<ui-card radius=\"xl\" class=\"ui-user-menu\">\n <div class=\"ui-user-menu-person\">\n <ui-avatar [name]=\"name()\" [src]=\"src()\" size=\"lg\" />\n\n <div class=\"ui-user-menu-text\">\n <span class=\"ui-text-body ui-user-menu-name\">{{ name() }}</span>\n @if (detail()) {\n <span class=\"ui-text-body-alt ui-user-menu-detail\">{{\n detail()\n }}</span>\n }\n </div>\n </div>\n\n <ng-content />\n\n @if (menuItems().length) {\n <div class=\"ui-user-menu-items\">\n @for (item of menuItems(); track $index) {\n @if (isDivider(item)) {\n <div class=\"ui-user-menu-divider\" role=\"separator\"></div>\n } @else if (group(item); as category) {\n <span\n class=\"ui-user-menu-group ui-text-caption ui-user-menu-heading\"\n >{{ category.label }}</span>\n @for (child of category.children; track child.label) {\n <ng-container\n *ngTemplateOutlet=\"entryTemplate; context: { $implicit: child }\"\n />\n }\n } @else if (button(item); as entry) {\n <ng-container\n *ngTemplateOutlet=\"entryTemplate; context: { $implicit: entry }\"\n />\n }\n }\n </div>\n }\n</ui-card>\n\n<ng-template #entryTemplate let-entry>\n <button\n type=\"button\"\n class=\"ui-text-body-alt ui-user-menu-item\"\n (click)=\"entry.onClick()\"\n >\n @if (entry.icon) {\n <ng-icon\n [name]=\"entry.icon\"\n size=\"18\"\n strokeWidth=\"1.75\"\n class=\"shrink-0\"\n />\n }\n {{ entry.label }}\n </button>\n</ng-template>\n","import { DOCUMENT } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n effect,\n type EnvironmentProviders,\n inject,\n Injectable,\n InjectionToken,\n makeEnvironmentProviders,\n provideAppInitializer,\n signal\n} from '@angular/core';\n\n\n/** What the user picked, `system` follows the OS setting. */\nexport type UiThemePreference = 'system' | 'light' | 'dark';\n\nexport interface UiThemeConfig {\n storageKey: string;\n}\n\nexport const UI_THEME_CONFIG = new InjectionToken<UiThemeConfig>('UI_THEME_CONFIG', {\n providedIn: 'root',\n factory: () => ({ storageKey: 'ui-theme' })\n});\n\nconst PREFERENCES: readonly UiThemePreference[] = ['system', 'light', 'dark'];\n\n/**\n * Add this to `index.html`'s `<head>` so the stored theme applies before boot:\n *\n * ```html\n * <script>\n * try {\n * const preference = localStorage.getItem('ui-theme') ?? 'system';\n * const dark = preference === 'dark' ||\n * (preference === 'system' && matchMedia('(prefers-color-scheme: dark)').matches);\n * document.documentElement.classList.toggle('dark', dark);\n * } catch {}\n * </script>\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class UiThemeService {\n private readonly document = inject(DOCUMENT);\n private readonly storageKey = inject(UI_THEME_CONFIG).storageKey;\n private readonly media = this.document.defaultView?.matchMedia?.('(prefers-color-scheme: dark)');\n\n readonly preference = signal<UiThemePreference>(this.stored());\n\n private readonly systemDark = signal(this.media?.matches ?? false);\n\n readonly isDark = computed(() => {\n const preference = this.preference();\n\n return preference === 'dark' || (preference === 'system' && this.systemDark());\n });\n\n constructor() {\n const onChange = (event: MediaQueryListEvent) => this.systemDark.set(event.matches);\n\n this.media?.addEventListener('change', onChange);\n inject(DestroyRef).onDestroy(() => this.media?.removeEventListener('change', onChange));\n\n effect(() => {\n const root = this.document.documentElement;\n const dark = this.isDark();\n\n root.classList.toggle('dark', dark);\n root.style.colorScheme = dark ? 'dark' : 'light';\n });\n\n effect(() => {\n const preference = this.preference();\n\n try {\n this.document.defaultView?.localStorage.setItem(this.storageKey, preference);\n } catch {\n // storage can be blocked, the theme still applies for this visit\n }\n });\n }\n\n private stored(): UiThemePreference {\n try {\n const value = this.document.defaultView?.localStorage.getItem(this.storageKey);\n\n return PREFERENCES.includes(value as UiThemePreference) ? value as UiThemePreference : 'system';\n } catch {\n return 'system';\n }\n }\n}\n\nexport function provideUiTheme(config: Partial<UiThemeConfig> = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: UI_THEME_CONFIG, useValue: { storageKey: 'ui-theme', ...config } },\n provideAppInitializer(() => {\n inject(UiThemeService);\n })\n ]);\n}\n","import { booleanAttribute, Component, inject, input } from '@angular/core';\n\nimport { UiSegmentedComponent } from '../generic/segmented/segmented.component';\nimport type { SegmentedOption } from '../generic/segmented/segmented.types';\nimport { type UiThemePreference, UiThemeService } from './theme';\n\n\n@Component({\n selector: 'ui-theme-switch',\n imports: [UiSegmentedComponent],\n host: { '[class.block]': 'fill()' },\n template: `\n <ui-segmented\n [options]=\"options\"\n [(value)]=\"theme.preference\"\n [ariaLabel]=\"ariaLabel()\"\n [fill]=\"fill()\"\n />\n `\n})\nexport class UiThemeSwitchComponent {\n protected readonly theme = inject(UiThemeService);\n\n readonly ariaLabel = input<string>('Theme');\n\n readonly fill = input(false, { transform: booleanAttribute });\n\n protected readonly options: SegmentedOption<UiThemePreference>[] = [\n { value: 'system', label: 'System' },\n { value: 'light', label: 'Light' },\n { value: 'dark', label: 'Dark' }\n ];\n}\n"],"mappings":"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"}
|