@firestitch/report 18.0.2 → 18.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/data/report.data.d.ts +5 -2
- package/app/reports/dialogs/report-settings/report-settings-default.d.ts +2 -0
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +24 -1
- package/app/reports/interfaces/report.interface.d.ts +2 -0
- package/app/reports/report-filter-items.d.ts +12 -0
- package/esm2022/app/reports/data/report.data.mjs +7 -4
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +4 -4
- package/esm2022/app/reports/dialogs/report-settings/report-settings-default.mjs +22 -0
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +114 -15
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/report-filter-items.mjs +28 -28
- package/esm2022/app/reports/services/report-filter-state.service.mjs +11 -3
- package/fesm2022/{firestitch-report-echarts-Bgshq3H7.mjs → firestitch-report-echarts-DibqM0Fw.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-Bgshq3H7.mjs.map → firestitch-report-echarts-DibqM0Fw.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-DJ3o7KId.mjs → firestitch-report-firestitch-report-UX1baw15.mjs} +179 -53
- package/fesm2022/firestitch-report-firestitch-report-UX1baw15.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/firestitch-report-firestitch-report-DJ3o7KId.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestitch-report-firestitch-report-UX1baw15.mjs","sources":["../../src/app/reports/data/report.data.ts","../../src/app/reports/layout.ts","../../src/app/reports/report-filter-items.ts","../../src/app/reports/services/report-filter-state.service.ts","../../src/app/reports/option-builder.ts","../../src/app/reports/components/component-chart/component-chart.component.ts","../../src/app/reports/components/component-chart/component-chart.component.html","../../src/app/reports/format.ts","../../src/app/reports/components/component-kpi/component-kpi.component.ts","../../src/app/reports/components/component-kpi/component-kpi.component.html","../../src/app/reports/components/component-list/component-list.component.ts","../../src/app/reports/components/component-list/component-list.component.html","../../src/app/reports/components/report-component/report-component.component.ts","../../src/app/reports/components/report-component/report-component.component.html","../../src/app/reports/components/report-canvas/report-canvas.component.ts","../../src/app/reports/components/report-canvas/report-canvas.component.html","../../src/app/reports/dialogs/component-settings/component-settings.component.ts","../../src/app/reports/dialogs/component-settings/component-settings.component.html","../../src/app/reports/components/timezone-select/timezone-select.component.ts","../../src/app/reports/components/timezone-select/timezone-select.component.html","../../src/app/reports/dialogs/report-settings/report-settings-default.ts","../../src/app/reports/dialogs/report-settings/report-settings.component.ts","../../src/app/reports/dialogs/report-settings/report-settings.component.html","../../src/app/reports/interfaces/report.interface.ts","../../src/app/reports/export/report-export-collector.service.ts","../../src/app/reports/export/offscreen-chart.ts","../../src/app/reports/export/report-pdf.service.ts","../../src/app/reports/theme/palette.ts","../../src/app/reports/export/report-pptx.service.ts","../../src/app/reports/services/report.service.ts","../../src/app/reports/views/report/report.component.ts","../../src/app/reports/views/report/report.component.html","../../src/public_api.ts","../../src/firestitch-report.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\n\nimport { FsApi, RequestConfig } from '@firestitch/api';\n\nimport { Observable } from 'rxjs';\n\nimport {\n ComponentDataState,\n FilterGroupDefault,\n ReportFilterLevel,\n ResolvedFilterValue,\n} from '../interfaces/report.interface';\n\n\n// API gateway for the Reports module. Every endpoint hangs off [basePath],\n// which defaults to \"reports\" (the framework reports backend at /api/reports)\n// and can be repointed by the host so the package stays self-contained and portable.\n@Injectable({\n providedIn: 'root',\n})\nexport class ReportData<T = any> {\n private _api = inject(FsApi);\n\n // The API root for every reports endpoint. Defaults to the framework reports\n // context; set it once (e.g. from the host's report page) to mount elsewhere.\n public basePath = 'reports';\n\n // Build an endpoint path under the configured base, e.g. _path() => \"ai/reports\",\n // _path(`${id}/pages`) => \"ai/reports/123/pages\".\n private _path(suffix = ''): string {\n return suffix ? `${this.basePath}/${suffix}` : this.basePath;\n }\n\n public reports(query: any = {}, config: RequestConfig = {}): Observable<T> {\n return this._api.get(\n this._path(),\n query,\n {\n key: 'reports',\n ...config,\n },\n );\n }\n\n public create(name: string, config: RequestConfig = {}): Observable<T> {\n return this._api.post(\n this._path(),\n { name },\n {\n key: 'report',\n ...config,\n },\n );\n }\n\n public rename(reportId: number, name: string, config: RequestConfig = {}): Observable<T> {\n return this._api.put(\n this._path(`${reportId}`),\n { name },\n {\n key: 'report',\n ...config,\n },\n );\n }\n\n // Report settings: any subset of { name, pageSize, pageOrientation, layout,\n // styles } — styles carry the report's typographic config (e.g. heading size).\n public update(reportId: number, settings: Record<string, unknown>, config: RequestConfig = {}): Observable<T> {\n return this._api.put(\n this._path(`${reportId}`),\n settings,\n {\n key: 'report',\n ...config,\n },\n );\n }\n\n // Append a blank page to the report; resolves to the new page.\n public addPage(reportId: number, config: RequestConfig = {}): Observable<T> {\n return this._api.post(\n this._path(`${reportId}/pages`),\n {},\n {\n key: 'page',\n ...config,\n },\n );\n }\n\n // Component settings: any subset of { title, padding } — the human-facing\n // dialog edits; geometry (x/y/w/h/flowWidth) is persisted via savePositions\n // from the canvas instead.\n public updateComponent(\n reportId: number,\n componentId: number,\n settings: Record<string, unknown>,\n config: RequestConfig = {},\n ): Observable<T> {\n return this._api.put(\n this._path(`${reportId}/components/${componentId}/settings`),\n settings,\n {\n key: 'component',\n ...config,\n },\n );\n }\n\n public delete(reportId: number, config: RequestConfig = {}): Observable<T> {\n return this._api.delete(\n this._path(`${reportId}`),\n {},\n {\n key: 'report',\n ...config,\n },\n );\n }\n\n // The assembled structure: pages → components (+ their filters) and the\n // report's filter groups.\n public get(reportId: number, config: RequestConfig = {}): Observable<T> {\n return this._api.get(\n this._path(`${reportId}`),\n {},\n {\n key: 'report',\n ...config,\n },\n );\n }\n\n // Persist geometry for the moved components only — any subset of\n // { x, y, w, h } (inches), flowWidth (percent) and order (flow position).\n public savePositions(\n reportId: number,\n positions: ({ componentId: number } & Partial<{ x: number; y: number; w: number; h: number; flowWidth: number; order: number }>)[],\n config: RequestConfig = {},\n ): Observable<T> {\n return this._api.put(\n this._path(`${reportId}/components/positions`),\n { positions },\n {\n key: null,\n ...config,\n },\n );\n }\n\n // One component's data. The body carries everything session-scoped: the\n // resolved filter values and the component's own interaction state.\n public componentData(\n reportId: number,\n componentId: number,\n filters: ResolvedFilterValue[] = [],\n state: ComponentDataState = {},\n config: RequestConfig = {},\n ): Observable<T> {\n return this._api.post(\n this._path(`${reportId}/components/${componentId}/data`),\n { filters, state },\n {\n key: 'data',\n ...config,\n },\n );\n }\n\n // Exports the component's FULL filtered dataset to CSV server-side and\n // resolves to a presigned download URL. The backend streams percentage\n // progress while chunking; consume through FsProcess.download.\n public exportComponent(\n reportId: number,\n componentId: number,\n filters: ResolvedFilterValue[] = [],\n state: ComponentDataState = {},\n config: RequestConfig = {},\n ): Observable<T> {\n return this._api.post(\n this._path(`${reportId}/components/${componentId}/export`),\n { filters, state },\n {\n key: 'url',\n ...config,\n },\n );\n }\n\n // Distinct options for a select filter (drives multiselect controls).\n public filterOptions(reportId: number, filterId: number, config: RequestConfig = {}): Observable<T> {\n return this._api.get(\n this._path(`${reportId}/filters/${filterId}/options`),\n {},\n {\n key: 'options',\n ...config,\n },\n );\n }\n\n // The component SQL's filterable output columns — drives the column picker\n // in the filter UI so a column name is never typed by hand.\n public componentColumns(reportId: number, componentId: number, config: RequestConfig = {}): Observable<T> {\n return this._api.get(\n this._path(`${reportId}/components/${componentId}/columns`),\n {},\n {\n key: 'columns',\n ...config,\n },\n );\n }\n\n // Make one column filterable. `level` (component | report) places a new\n // group; `groupId` instead links into an existing group. A select filter's\n // options are derived from the component SQL when optionsSql is omitted.\n public addFilter(\n reportId: number,\n componentId: number,\n filter: { filterColumn: string; type?: string; label?: string; level?: string; optionsSql?: string; groupId?: number },\n config: RequestConfig = {},\n ): Observable<T> {\n return this._api.post(\n this._path(`${reportId}/components/${componentId}/filters`),\n filter,\n {\n key: 'filter',\n ...config,\n },\n );\n }\n\n // Update a filter — any subset of { label, optionsSql, enabled }.\n public updateFilter(\n reportId: number,\n filterId: number,\n changes: { label?: string; optionsSql?: string; enabled?: boolean },\n config: RequestConfig = {},\n ): Observable<T> {\n return this._api.put(\n this._path(`${reportId}/filters/${filterId}`),\n changes,\n {\n key: 'filter',\n ...config,\n },\n );\n }\n\n // Remove a filter (its group goes too when nothing else uses it).\n public deleteFilter(reportId: number, filterId: number, config: RequestConfig = {}): Observable<T> {\n return this._api.delete(\n this._path(`${reportId}/filters/${filterId}`),\n {},\n {\n key: 'filter',\n ...config,\n },\n );\n }\n\n // Update a filter group — its exposure level ('component' | 'report' | 'both')\n // and/or its default value (the value seeding the report bar on open). Send\n // `default: null` (or an empty default) to clear it. Only the keys provided\n // are changed.\n public updateFilterGroup(\n reportId: number,\n groupId: number,\n changes: { level?: ReportFilterLevel; default?: FilterGroupDefault | null },\n config: RequestConfig = {},\n ): Observable<T> {\n return this._api.put(\n this._path(`${reportId}/filtergroups/${groupId}`),\n changes,\n {\n key: 'filterGroup',\n ...config,\n },\n );\n }\n}\n","import { Report, ReportComponent, ReportPage } from './interfaces/report.interface';\n\n\n// Page padding for flow layout, inches — mirrored by the canvas CSS.\nexport const FLOW_PADDING = 0.25;\n\n// Default content padding around a component's body, inches (1/8\").\nexport const DEFAULT_COMPONENT_PADDING = 0.125;\n\n// Default report heading size, points (1/72\"). Applies to component titles.\nexport const DEFAULT_HEADING_SIZE = 16;\n\nexport interface ComponentGeometry {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n// Resolved geometry (inches) for every component on a page, in BOTH layout\n// modes — the single definition the PPT and PDF exports lay out from:\n//\n// Freeform: the stored x/y/w/h verbatim.\n// Flow: components in `order`, each flowWidth% of the content width,\n// wrapping into rows (a row breaks when the next component would\n// exceed 100%); row height = the tallest component in the row.\n// Matches the canvas's flex-wrap rendering.\nexport function pageGeometry(report: Report, page: ReportPage): Map<number, ComponentGeometry> {\n const geometry = new Map<number, ComponentGeometry>();\n\n if (report.layout !== 'flow') {\n for (const component of page.components) {\n geometry.set(component.id, {\n x: component.x, y: component.y, w: component.w, h: component.h,\n });\n }\n\n return geometry;\n }\n\n const contentW = report.pageWidth - FLOW_PADDING * 2;\n const sorted = [...page.components].sort((a, b) => (a.order - b.order) || (a.y - b.y) || (a.x - b.x));\n\n let cursorX = 0; // fraction of contentW consumed in the current row\n let rowTop = FLOW_PADDING;\n let rowHeight = 0;\n\n for (const component of sorted) {\n const fraction = Math.min(100, Math.max(10, component.flowWidth ?? 50)) / 100;\n\n // Wrap when this component doesn't fit the remainder (small tolerance for\n // 33.33+33.33+33.33 style splits).\n if (cursorX + fraction > 1.001) {\n rowTop += rowHeight;\n cursorX = 0;\n rowHeight = 0;\n }\n\n geometry.set(component.id, {\n x: FLOW_PADDING + cursorX * contentW,\n y: rowTop,\n w: fraction * contentW,\n h: component.h,\n });\n\n cursorX += fraction;\n rowHeight = Math.max(rowHeight, component.h);\n }\n\n return geometry;\n}\n","import { IFilterConfigItem, ItemType } from '@firestitch/filter';\n\nimport { format } from 'date-fns';\n\nimport { Observable, of } from 'rxjs';\nimport { map, shareReplay } from 'rxjs/operators';\n\nimport { ReportData } from './data/report.data';\nimport { FilterGroupValue, ReportFilterGroup } from './interfaces/report.interface';\n\n\n// A date-range boundary as the picked LOCAL calendar day (no time, no tz).\n// Date-range filters are calendar-day semantics, so the boundary must carry\n// only Y-M-D — never a timezone-bearing instant the backend would shift.\nexport function dateBoundString(value: Date | string | null | undefined): string | undefined {\n if (value instanceof Date) {\n return format(value, 'yyyy-MM-dd');\n }\n\n // Authored/relative defaults arrive as strings already in Y-M-D form;\n // keep just the date portion.\n return value ? String(value).slice(0, 10) : undefined;\n}\n\n\n// Maps a report filter GROUP to an fs-filter config item, and reads fs-filter\n// query values back into per-group FilterGroupValues. Shared by the report-bar\n// fs-filter and the per-component fs-filter so both render through the same\n// library and write into ReportFilterStateService identically. Items are named\n// `g<groupId>` so the query keys map straight back to the group.\n//\n// (Lists keep their own filters in FsList and name items `f<filterId>`; this is\n// the group-keyed path for charts/KPIs and the report bar.)\n\n// The query key fs-filter uses for a group's item(s).\nconst itemName = (group: ReportFilterGroup): string => `g${group.id}`;\n\n// A select group's distinct options, as { name, value } pairs. Options come from\n// the first member filter that declares them — members are the same data point,\n// so any member's list serves the group. The list is fetched once (the server\n// caps it) and replayed (shareReplay), so repeated reads never refetch. Shared\n// by the report-bar select control and the report-settings default picker so the\n// two never drift. Returns an empty list when no member provides options.\nexport function loadGroupOptions(\n group: ReportFilterGroup,\n reportData: ReportData,\n reportId: number,\n): Observable<{ name: string; value: unknown }[]> {\n const optionFilter = (group.filters ?? []).find((member) => member.hasOptions);\n if (!optionFilter) {\n return of([]);\n }\n\n return reportData.filterOptions(reportId, optionFilter.id)\n .pipe(\n map((options: unknown[]) => (options ?? [])\n .map((option) => ({ name: String(option), value: option }))),\n shareReplay({ bufferSize: 1, refCount: false }),\n );\n}\n\n// Case-insensitive name filter applied to a loaded option list — the typed\n// keyword has to be matched here because fs-autocomplete renders what we return\n// verbatim.\nexport function matchOptions(\n options$: Observable<{ name: string; value: unknown }[]>,\n keyword?: string,\n): Observable<{ name: string; value: unknown }[]> {\n const term = (keyword ?? '').trim().toLowerCase();\n\n return options$.pipe(map((options) => term\n ? options.filter((option) => option.name.toLowerCase().includes(term))\n : options));\n}\n\n// Build the fs-filter config item for a group, seeding its default from the\n// current session value so authored/relative defaults show selected on open.\nexport function filterItemForGroup(\n group: ReportFilterGroup,\n reportData: ReportData,\n reportId: number,\n initial?: FilterGroupValue,\n): IFilterConfigItem {\n const name = itemName(group);\n const label = group.label || group.filters?.[0]?.filterColumn || '';\n\n switch (group.type) {\n case 'dateRange':\n return {\n name,\n type: ItemType.DateRange,\n label: { from: `${label} From`, to: `${label} To` },\n default: (initial?.start || initial?.end)\n ? { from: initial.start ?? undefined, to: initial.end ?? undefined }\n : undefined,\n };\n\n case 'select': {\n // One shared, replayed option stream so typing never refetches.\n const options$ = loadGroupOptions(group, reportData, reportId);\n\n return {\n name,\n type: ItemType.AutoCompleteChips,\n label,\n fetchOnFocus: true,\n values: (keyword?: string) => matchOptions(options$, keyword),\n default: initial?.values?.length\n ? initial.values.map((value) => ({ name: String(value), value }))\n : undefined,\n };\n }\n\n case 'keyword':\n default:\n return {\n name,\n type: ItemType.Keyword,\n label,\n default: initial?.value,\n };\n }\n}\n\n// Read an fs-filter change query into per-group values. Returns one entry per\n// group with the value to store (or null to clear) — callers feed these to\n// ReportFilterStateService.setValue.\nexport function groupValuesFromQuery(\n query: Record<string, any>,\n groups: ReportFilterGroup[],\n): { groupId: number; value: FilterGroupValue | null }[] {\n return groups.map((group) => {\n const name = itemName(group);\n\n if (group.type === 'dateRange') {\n const start = query[`${name}From`];\n const end = query[`${name}To`];\n\n return {\n groupId: group.id,\n value: (start || end) ? { start: start || null, end: end || null } : null,\n };\n }\n\n if (group.type === 'select') {\n const values = selectQueryValues(query[name]);\n\n return { groupId: group.id, value: values.length ? { values } : null };\n }\n\n const keyword = String(query[name] ?? '').trim();\n\n return { groupId: group.id, value: keyword ? { value: keyword } : null };\n });\n}\n\n// fs-filter's AutoCompleteChips serialises a multi-select into ONE query value:\n// the selected values joined by \",\" (its `query` getter does `.map(value).join(',')`).\n// So a 2+ selection arrives as the string \"a,b\", not an array — splitting on \",\"\n// reverses that faithfully. Without this, a multi-select was sent as the single\n// value [\"a,b\"], producing `col IN ('a,b')` server-side, which matches nothing.\nfunction selectQueryValues(raw: unknown): unknown[] {\n if (Array.isArray(raw)) {\n return raw;\n }\n\n if (raw === null || raw === undefined || raw === '') {\n return [];\n }\n\n return String(raw).split(',');\n}\n","import { Injectable } from '@angular/core';\n\nimport { Observable, Subject } from 'rxjs';\nimport { filter as rxFilter } from 'rxjs/operators';\n\nimport {\n startOfMonth, startOfQuarter, startOfYear,\n subDays, subMonths,\n} from 'date-fns';\n\nimport {\n ChartGranularity,\n FilterGroupValue,\n Report,\n ReportComponent,\n ReportFilterGroup,\n ResolvedFilterValue,\n} from '../interfaces/report.interface';\nimport { dateBoundString } from '../report-filter-items';\n\n\n// Session filter state for the open report. Filter VALUES are never persisted\n// — this service holds them per filter GROUP (the propagation unit), resolves\n// them into per-component member-filter values for each data request, and\n// notifies the components whose groups changed so only they refetch.\n//\n// Also session-scoped: per-filter enable/disable toggles from a component's\n// filter menu (the `enabled` column is the authored default; a viewer's toggle\n// shouldn't write to the report).\n@Injectable()\nexport class ReportFilterStateService {\n\n private _values = new Map<number, FilterGroupValue>();\n private _groups = new Map<number, ReportFilterGroup>();\n private _sessionDisabled = new Set<number>();\n\n // The runtime Frequency control: a single session-wide bucket override for all\n // time-series charts. Unset = each chart uses its authored granularity. Never\n // persisted (it dies with this report view), and carried in the data request's\n // `state`, so it propagates through to the PDF/PowerPoint exports too.\n private _frequency: ChartGranularity | null = null;\n private _frequencyChanged$ = new Subject<void>();\n\n // Emits the group id that changed; components listen filtered to their own\n // group ids. null = everything changed (re-init).\n private _changed$ = new Subject<number | null>();\n\n // Seed groups + their defaults when a report loads. Existing session values\n // for still-existing groups survive a structure re-fetch (a chat edit\n // shouldn't reset the viewer's filters).\n public init(report: Report): void {\n this._groups.clear();\n\n const validIds = new Set<number>();\n for (const group of report.filterGroups ?? []) {\n this._groups.set(group.id, group);\n validIds.add(group.id);\n\n if (!this._values.has(group.id)) {\n const defaultValue = this._defaultValue(group);\n if (defaultValue) {\n this._values.set(group.id, defaultValue);\n }\n }\n }\n\n for (const groupId of [...this._values.keys()]) {\n if (!validIds.has(groupId)) {\n this._values.delete(groupId);\n }\n }\n\n this._changed$.next(null);\n }\n\n public value(groupId: number): FilterGroupValue | undefined {\n return this._values.get(groupId);\n }\n\n public setValue(groupId: number, value: FilterGroupValue | null): void {\n if (value === null) {\n this._values.delete(groupId);\n } else {\n this._values.set(groupId, value);\n }\n\n this._changed$.next(groupId);\n }\n\n // The active Frequency override, or null when the viewer hasn't chosen one.\n public frequency(): ChartGranularity | null {\n return this._frequency;\n }\n\n public setFrequency(frequency: ChartGranularity | null): void {\n this._frequency = frequency;\n this._frequencyChanged$.next();\n }\n\n // Fires whenever the Frequency changes — every time-series chart listens so it\n // refetches and re-buckets (the override isn't scoped to any filter group, so\n // changesFor() can't carry it).\n public frequencyChanges(): Observable<void> {\n return this._frequencyChanged$.asObservable();\n }\n\n public isFilterDisabled(filterId: number): boolean {\n return this._sessionDisabled.has(filterId);\n }\n\n public toggleFilter(filterId: number, groupId: number): void {\n if (this._sessionDisabled.has(filterId)) {\n this._sessionDisabled.delete(filterId);\n } else {\n this._sessionDisabled.add(filterId);\n }\n\n this._changed$.next(groupId);\n }\n\n // Notifications relevant to ONE component: any change to a group one of its\n // filters belongs to (or a full re-init).\n public changesFor(component: ReportComponent): Observable<number | null> {\n const groupIds = new Set((component.filters ?? []).map((filter) => filter.filterGroupId));\n\n return this._changed$.asObservable()\n .pipe(\n rxFilter((groupId) => groupId === null || groupIds.has(groupId)),\n );\n }\n\n // The group values resolved into this component's member-filter values —\n // what the data request carries. Disabled filters (authored or session) are\n // skipped entirely.\n public resolveForComponent(component: ReportComponent): ResolvedFilterValue[] {\n const resolved: ResolvedFilterValue[] = [];\n\n for (const filter of component.filters ?? []) {\n if (!filter.enabled || this._sessionDisabled.has(filter.id)) {\n continue;\n }\n\n const value = this._values.get(filter.filterGroupId);\n if (!value) {\n continue;\n }\n\n const entry: ResolvedFilterValue = { filterId: filter.id };\n\n if (value.start) {\n entry.start = dateBoundString(value.start);\n }\n if (value.end) {\n entry.end = dateBoundString(value.end);\n }\n if (value.values?.length) {\n entry.values = value.values;\n }\n if (value.value?.trim()) {\n entry.value = value.value.trim();\n }\n\n if (entry.start || entry.end || entry.values || entry.value) {\n resolved.push(entry);\n }\n }\n\n return resolved;\n }\n\n // A group's authored default, mapped to a session value by type. Relative\n // date presets resolve against \"now\" each time the report opens, so a saved\n // \"last 12 months\" stays relative; a fixed range, select values and keyword\n // text seed verbatim.\n private _defaultValue(group: ReportFilterGroup): FilterGroupValue | null {\n const groupDefault = group.config?.default;\n if (!groupDefault) {\n return null;\n }\n\n if (groupDefault.relative) {\n const range = this._relativeRange(groupDefault.relative);\n\n return range ? { start: range.start, end: range.end } : null;\n }\n\n if (groupDefault.start || groupDefault.end) {\n return {\n start: groupDefault.start ?? null,\n end: groupDefault.end ?? null,\n };\n }\n\n if (groupDefault.values?.length) {\n return { values: groupDefault.values };\n }\n\n if (groupDefault.value) {\n return { value: groupDefault.value };\n }\n\n return null;\n }\n\n private _relativeRange(relative: string): { start: Date; end: Date } | null {\n const now = new Date();\n\n switch (relative) {\n case 'last7Days':\n return { start: subDays(now, 7), end: now };\n case 'last30Days':\n return { start: subDays(now, 30), end: now };\n case 'last3Months':\n return { start: subMonths(now, 3), end: now };\n case 'last6Months':\n return { start: subMonths(now, 6), end: now };\n case 'last12Months':\n return { start: subMonths(now, 12), end: now };\n case 'thisMonth':\n return { start: startOfMonth(now), end: now };\n case 'thisQuarter':\n return { start: startOfQuarter(now), end: now };\n case 'thisYear':\n case 'yearToDate':\n return { start: startOfYear(now), end: now };\n default:\n return null;\n }\n }\n}\n","import type { EChartsOption, LegendComponentOption, SeriesOption } from 'echarts';\n\nimport { format, isValid, parseISO } from 'date-fns';\n\nimport { ChartConfig, ChartGranularity, ComponentData, LegendPosition, ReportComponent } from './interfaces/report.interface';\n\n\nconst BUCKET_GRANULARITIES: ChartGranularity[] = ['day', 'week', 'month', 'quarter', 'year'];\n\n\n// colorBy applies only to single-dimension bar charts, and only when splitBy\n// isn't already driving multiple series: it colors each bar by its category and\n// shows a legend (one series per category, overlapped to full width).\nexport function isColorBy(config: ChartConfig): boolean {\n return !!config.colorBy?.column && !config.splitBy?.column && (config.chartType ?? 'bar') === 'bar';\n}\n\n\n// Categories + named series extracted from a chart component's config + rows —\n// the one pivot (splitBy → series, measures → series) shared by the on-screen\n// ECharts option below AND the PowerPoint export's native chart data, so both\n// media plot identical numbers.\nexport interface ExtractedChartSeries {\n categories: string[];\n series: { name: string; values: (number | null)[] }[];\n}\n\nexport function extractChartSeries(component: ReportComponent, data: ComponentData): ExtractedChartSeries {\n const config = component.config as ChartConfig;\n const xColumn = config.xAxis?.column ?? data.columns[0];\n const splitColumn = config.splitBy?.column;\n // colorBy emits one series per category too (so each bar carries its own\n // color + legend entry), but the bars are overlapped to full width in\n // buildAxisOption rather than laid side-by-side. splitBy wins if both are set.\n const groupColumn = splitColumn || (isColorBy(config) ? config.colorBy?.column : undefined);\n const measures = config.measures?.length\n ? config.measures\n : [{ column: data.columns[data.columns.length - 1] }];\n\n const rawCategories = uniqueValues(data.rows, xColumn);\n const categories = rawCategories.map((category) => String(category ?? '—'));\n const series: ExtractedChartSeries['series'] = [];\n\n if (groupColumn) {\n // One series per group value (splitBy/colorBy), pivoted over the first measure.\n const measure = measures[0];\n for (const groupValue of uniqueValues(data.rows, groupColumn)) {\n const byCategory = new Map<unknown, unknown>();\n for (const row of data.rows) {\n if (row[groupColumn] === groupValue) {\n byCategory.set(row[xColumn], row[measure.column]);\n }\n }\n\n series.push({\n name: String(groupValue ?? '—'),\n values: rawCategories.map((category) => numeric(byCategory.get(category))),\n });\n }\n } else {\n for (const measure of measures) {\n const byCategory = new Map<unknown, unknown>();\n for (const row of data.rows) {\n byCategory.set(row[xColumn], row[measure.column]);\n }\n\n series.push({\n name: measure.label ?? measure.column,\n values: rawCategories.map((category) => numeric(byCategory.get(category))),\n });\n }\n }\n\n return { categories, series };\n}\n\n// The one pure mapping from our standard camelCase chart config + the data\n// endpoint's rows to an ECharts option. Everything visual that isn't in the\n// registered 'report' theme is decided here, so report standards have exactly\n// two homes.\nexport function buildChartOption(component: ReportComponent, data: ComponentData): EChartsOption {\n const config = component.config as ChartConfig;\n const chartType = config.chartType ?? 'bar';\n\n if (chartType === 'pie' || chartType === 'donut') {\n return buildPieOption(component, data, chartType === 'donut');\n }\n\n return buildAxisOption(component, data, chartType);\n}\n\nfunction buildAxisOption(\n component: ReportComponent,\n data: ComponentData,\n chartType: 'bar' | 'line' | 'area',\n): EChartsOption {\n const config = component.config as ChartConfig;\n const extracted = extractChartSeries(component, data);\n const horizontal = config.orientation === 'horizontal';\n const colorBy = isColorBy(config);\n\n // colorBy emits one series per category; overlapping them (barGap -100%) makes\n // each render at the full category-band width — one full-width, distinctly\n // colored bar per category — instead of side-by-side slivers. The layout props\n // are read from the first series of the coordinate system.\n const series: SeriesOption[] = extracted.series.map((extractedSeries, index) =>\n buildSeries(extractedSeries.name, extractedSeries.values, chartType, config.stacked, colorBy && index === 0));\n\n const granularity = bucketGranularity(data);\n const categoryAxis = {\n type: 'category' as const,\n data: extracted.categories,\n name: config.xAxis?.label,\n nameLocation: 'middle' as const,\n nameGap: granularity && spansMultipleYears(extracted.categories) ? 40 : 28,\n ...periodAxisLabel(granularity, extracted.categories),\n };\n const valueAxis = { type: 'value' as const };\n\n const legendPosition = resolveLegendPosition(config, series.length, colorBy);\n\n return {\n grid: axisGrid(legendPosition),\n legend: legendOption(legendPosition),\n // colorBy charts overlap N mostly-null series, so an axis tooltip would list\n // every category; an item tooltip shows just the hovered bar.\n tooltip: { trigger: colorBy ? 'item' : 'axis' },\n xAxis: horizontal ? valueAxis : categoryAxis,\n yAxis: horizontal ? categoryAxis : valueAxis,\n series,\n };\n}\n\n// Default legend placement when the config doesn't pin one: pie charts read\n// best with the slice key beside them (right); axis charts only need a legend\n// to tell multiple series apart, so a single-series chart hides it. An explicit\n// config.legend (including 'hidden') always wins. Shared with the PowerPoint\n// export so both media place the legend identically.\nexport function resolveLegendPosition(config: ChartConfig, seriesCount: number, colorBy = false): LegendPosition {\n if (config.legend) {\n return config.legend;\n }\n\n const pie = config.chartType === 'pie' || config.chartType === 'donut';\n\n // colorBy maps each bar's color to its category, so it needs a legend even\n // though it's a single measure.\n return pie || colorBy || seriesCount > 1 ? (pie ? 'right' : 'top') : 'hidden';\n}\n\nfunction legendOption(position: LegendPosition): LegendComponentOption {\n if (position === 'hidden') {\n return { show: false };\n }\n\n const base: LegendComponentOption = { type: 'scroll' };\n\n switch (position) {\n case 'bottom':\n return { ...base, bottom: 0 };\n case 'left':\n return { ...base, orient: 'vertical', left: 0, top: 'middle' };\n case 'right':\n return { ...base, orient: 'vertical', right: 0, top: 'middle' };\n default:\n return { ...base, top: 0 };\n }\n}\n\n// Reserve plot-edge room on whichever side the legend occupies so it never\n// overlaps the bars/lines; containLabel already accounts for the axis labels.\nfunction axisGrid(position: LegendPosition): EChartsOption['grid'] {\n const base = { left: 8, right: 16, top: 8, bottom: 8, containLabel: true };\n\n switch (position) {\n case 'bottom':\n return { ...base, bottom: 32 };\n case 'left':\n return { ...base, left: 96 };\n case 'right':\n return { ...base, right: 96 };\n case 'hidden':\n return base;\n default:\n return { ...base, top: 32 };\n }\n}\n\nfunction buildSeries(\n name: string,\n values: (number | null)[],\n chartType: 'bar' | 'line' | 'area',\n stacked?: boolean,\n overlap?: boolean,\n): SeriesOption {\n if (chartType === 'bar') {\n return {\n name,\n type: 'bar',\n data: values,\n stack: stacked ? 'total' : undefined,\n barMaxWidth: 48,\n // colorBy: overlap the per-category series so each bar renders full-width.\n ...(overlap ? { barGap: '-100%', barCategoryGap: '20%' } : {}),\n };\n }\n\n return {\n name,\n type: 'line',\n data: values,\n stack: stacked ? 'total' : undefined,\n smooth: true,\n symbolSize: 6,\n areaStyle: chartType === 'area' ? { opacity: 0.25 } : undefined,\n };\n}\n\nfunction buildPieOption(component: ReportComponent, data: ComponentData, donut: boolean): EChartsOption {\n const config = component.config as ChartConfig;\n const extracted = extractChartSeries(component, data);\n const values = extracted.series[0]?.values ?? [];\n const legendPosition = resolveLegendPosition(config, extracted.series.length);\n\n return {\n tooltip: { trigger: 'item' },\n legend: legendOption(legendPosition),\n series: [\n {\n type: 'pie',\n radius: donut ? ['45%', '72%'] : '72%',\n center: pieCenter(legendPosition),\n label: { show: false },\n data: extracted.categories.map((category, index) => ({\n name: category,\n value: values[index] ?? 0,\n })),\n },\n ],\n };\n}\n\n// Nudge the pie off-center toward the opposite edge from its legend so the two\n// don't collide; centered when the legend is hidden.\nfunction pieCenter(position: LegendPosition): [string, string] {\n switch (position) {\n case 'left':\n return ['60%', '50%'];\n case 'right':\n return ['40%', '50%'];\n case 'top':\n return ['50%', '58%'];\n case 'bottom':\n return ['50%', '46%'];\n default:\n return ['50%', '50%'];\n }\n}\n\nfunction uniqueValues(rows: Record<string, unknown>[], column: string): unknown[] {\n const seen = new Set<unknown>();\n const values: unknown[] = [];\n for (const row of rows) {\n const value = row[column];\n if (!seen.has(value)) {\n seen.add(value);\n values.push(value);\n }\n }\n\n return values;\n}\n\nfunction numeric(value: unknown): number | null {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n const parsed = Number(value);\n\n return Number.isFinite(parsed) ? parsed : null;\n}\n\n// The effective time bucket the rows were grouped into (from the data endpoint),\n// or null when the x-axis isn't a time axis — gates the compact period labels.\nfunction bucketGranularity(data: ComponentData): ChartGranularity | null {\n return data.granularity && BUCKET_GRANULARITIES.includes(data.granularity) ? data.granularity : null;\n}\n\n// Whether the period-start categories cross a year boundary. When they don't,\n// the year is pure noise on every label, so it's dropped entirely.\nexport function spansMultipleYears(categories: string[]): boolean {\n const years = new Set<number>();\n for (const category of categories) {\n const date = parseISO(category);\n if (isValid(date)) {\n years.add(date.getFullYear());\n }\n }\n\n return years.size > 1;\n}\n\n// A bucket's period-start split into its primary label and its year. Day/week\n// read as \"May 1\", month as \"May\", quarter as \"Q2\", year as \"2025\". Returns null\n// for a value that isn't a parseable date (left as-is by callers).\nfunction periodLabelParts(value: string, granularity: ChartGranularity): { primary: string; year: string } | null {\n const date = parseISO(value);\n if (!isValid(date)) {\n return null;\n }\n\n const year = String(date.getFullYear());\n switch (granularity) {\n case 'year':\n return { primary: year, year };\n case 'quarter':\n return { primary: `Q${Math.floor(date.getMonth() / 3) + 1}`, year };\n case 'month':\n return { primary: format(date, 'MMMM'), year };\n default: // day, week — the bucket start as a compact \"MMM d\"\n return { primary: format(date, 'MMM d'), year };\n }\n}\n\n// A compact single-line period label (year appended only when the data spans\n// years) — for media that can't do a styled second line, e.g. PowerPoint.\nexport function formatPeriodLabel(value: string, granularity: ChartGranularity, multiYear: boolean): string {\n const parts = periodLabelParts(value, granularity);\n if (!parts) {\n return value;\n }\n\n return multiYear && granularity !== 'year' ? `${parts.primary} ${parts.year}` : parts.primary;\n}\n\n// ECharts category-axis label config for a time bucket: the primary label on\n// line one, and — only when the data spans multiple years — the year on a small\n// gray second line, centered under the tick (year granularity needs no second\n// line, it already is the year). Empty for a non-time axis (labels as-is).\nfunction periodAxisLabel(granularity: ChartGranularity | null, categories: string[]): { axisLabel?: Record<string, unknown> } {\n if (!granularity) {\n return {};\n }\n\n const multiYear = spansMultipleYears(categories);\n\n return {\n axisLabel: {\n formatter: (value: string) => {\n const parts = periodLabelParts(value, granularity);\n if (!parts) {\n return value;\n }\n\n return multiYear && granularity !== 'year'\n ? `${parts.primary}\\n{yr|${parts.year}}`\n : parts.primary;\n },\n rich: { yr: { fontSize: 10, color: '#9aa0a6', lineHeight: 14 } },\n },\n };\n}\n","import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core';\n\nimport type { EChartsOption, ECharts } from 'echarts';\nimport { NgxEchartsDirective } from 'ngx-echarts';\n\nimport { ComponentData, ReportComponent } from '../../interfaces/report.interface';\nimport { buildChartOption } from '../../option-builder';\n\n\n// ECharts host for a chart component. Pure rendering: the parent owns the\n// data fetch; this maps (component config, rows) → option and exposes the\n// chart instance for resize + the future image exports (getDataURL needs the\n// canvas renderer registered in theme/echarts.ts).\n@Component({\n selector: 'app-report-component-chart',\n templateUrl: './component-chart.component.html',\n styleUrls: ['./component-chart.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n NgxEchartsDirective,\n ],\n})\nexport class ComponentChartComponent implements OnChanges {\n\n @Input() public component: ReportComponent;\n @Input() public data: ComponentData | null = null;\n\n public options: EChartsOption | null = null;\n\n private _chart: ECharts | null = null;\n\n public ngOnChanges(): void {\n this.options = this.component && this.data\n ? buildChartOption(this.component, this.data)\n : null;\n }\n\n public onChartInit(chart: ECharts): void {\n this._chart = chart;\n }\n\n // Called by the canvas when the box is resized in edit mode.\n public resize(): void {\n this._chart?.resize();\n }\n\n // High-res image for the (later-phase) PPT/PDF exports.\n public getDataURL(pixelRatio = 3): string | null {\n return this._chart?.getDataURL({\n type: 'png',\n pixelRatio,\n backgroundColor: '#ffffff',\n }) ?? null;\n }\n}\n","<div\n class=\"chart-host\"\n echarts\n [options]=\"options ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\">\n</div>\n","// Measure-value formatting shared by the KPI renderer and the exports — the\n// config's `format` (number | percent | currency) means the same thing on\n// screen, in PowerPoint and in PDF.\nexport function formatMeasureValue(value: unknown, format?: string): string {\n if (value === null || value === undefined || value === '') {\n return '—';\n }\n\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) {\n return String(value);\n }\n\n switch (format) {\n case 'percent':\n return `${new Intl.NumberFormat().format(numeric)}%`;\n case 'currency':\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency: 'USD',\n maximumFractionDigits: 0,\n }).format(numeric);\n default:\n return new Intl.NumberFormat().format(numeric);\n }\n}\n","import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core';\n\nimport { formatMeasureValue } from '../../format';\nimport { ComponentData, KpiConfig, ReportComponent } from '../../interfaces/report.interface';\n\n\n// A single big number: the component's measure aggregated over all (filtered)\n// rows server-side; this just formats the one cell.\n@Component({\n selector: 'app-report-component-kpi',\n templateUrl: './component-kpi.component.html',\n styleUrls: ['./component-kpi.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nexport class ComponentKpiComponent implements OnChanges {\n\n @Input() public component: ReportComponent;\n @Input() public data: ComponentData | null = null;\n\n public value = '—';\n public label = '';\n\n public ngOnChanges(): void {\n const config = (this.component?.config ?? {}) as KpiConfig;\n this.label = config.measure?.label ?? '';\n\n const row = this.data?.rows?.[0];\n if (!row) {\n this.value = '—';\n\n return;\n }\n\n const column = config.measure?.column ?? Object.keys(row)[0];\n this.value = formatMeasureValue(row[column], config.measure?.format);\n }\n}\n","<div class=\"kpi\">\n <div class=\"kpi-value\">{{ value }}</div>\n @if (label) {\n <div class=\"kpi-label\">{{ label }}</div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, DestroyRef, Input, OnInit, ViewChild, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DatePipe } from '@angular/common';\n\nimport { ItemType } from '@firestitch/filter';\nimport { FsListComponent, FsListConfig, FsListModule, PaginationStrategy } from '@firestitch/list';\n\nimport { Observable, map } from 'rxjs';\n\nimport { ReportData } from '../../data/report.data';\nimport {\n ComponentData,\n ComponentDataState,\n ListConfig,\n ReportComponent,\n ReportFilter,\n ReportFilterGroup,\n ResolvedFilterValue,\n} from '../../interfaces/report.interface';\nimport { dateBoundString } from '../../report-filter-items';\nimport { ReportFilterStateService } from '../../services/report-filter-state.service';\n\n\n// A list component: FsList + FsFilter rendered from the component's config and\n// its report_filters rows. The component's own filter bar carries its filters\n// whose group renders at the component level; report-level groups apply\n// through the shared filter-state service and merge into every request.\n// Paging and sorting are pushed into the SQL wrap server-side.\n@Component({\n selector: 'app-report-component-list',\n templateUrl: './component-list.component.html',\n styleUrls: ['./component-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n DatePipe,\n FsListModule,\n ],\n})\nexport class ComponentListComponent implements OnInit {\n\n @Input() public reportId: number;\n @Input() public component: ReportComponent;\n @Input() public groups: Map<number, ReportFilterGroup>;\n\n @ViewChild(FsListComponent)\n public listComponent: FsListComponent;\n\n public listConfig: FsListConfig;\n public columns: { column: string; label?: string; format?: string }[] = [];\n\n private _reportData = inject(ReportData);\n private _filterState = inject(ReportFilterStateService);\n private _destroyRef = inject(DestroyRef);\n\n public ngOnInit(): void {\n const config = (this.component.config ?? {}) as ListConfig;\n this.columns = config.columns ?? [];\n\n this._initListConfig(config);\n\n // Report-level filter changes that scope this component re-run the list.\n this._filterState.changesFor(this.component)\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this.listComponent?.reload());\n }\n\n private _initListConfig(config: ListConfig): void {\n this.listConfig = {\n // Inside a report component the list is a clean data pane — no status\n // bar, no reload button (filter changes already refetch).\n status: false,\n reload: false,\n // Never touch the URL or persist filter/paging state — report filtering\n // is session-only.\n queryParam: false,\n persist: false,\n sort: config.sort\n ? { value: config.sort.column, direction: config.sort.direction ?? 'asc' }\n : undefined,\n // Load-more: the list keeps a fixed, scrollable height and appends the\n // next page in place instead of swapping pages. The button is pinned to\n // the bottom of the scroll pane (see component SCSS).\n //\n // Uses the Offset strategy (offset + limit) rather than Many: in\n // @firestitch/list the pagination template resolves `hasManyStrategy`\n // BEFORE `loadMoreEnabled`, and Many renders a forward-only page pager —\n // so Many would suppress the load-more button entirely. Offset + loadMore\n // is the combination that actually renders and appends. `_fetch` already\n // derives `page` from `offset`, so the server-side wrap is unaffected.\n paging: {\n limit: config.pageSize ?? 25,\n strategy: PaginationStrategy.Offset,\n },\n loadMore: {\n enabled: true,\n label: 'Load more',\n buttonType: 'stroked',\n },\n filters: this._ownFilters().map((filter) => this._filterItem(filter)),\n fetch: (query: any) => this._fetch(query),\n };\n }\n\n // The filters this list renders in its own bar: its report_filters whose\n // group is component-level. Report-level groups render in the report bar.\n private _ownFilters(): ReportFilter[] {\n return (this.component.filters ?? [])\n .filter((filter) => {\n const group = this.groups?.get(filter.filterGroupId);\n\n return filter.enabled && (!group || group.level === 'component' || group.level === 'both');\n });\n }\n\n private _filterItem(filter: ReportFilter): any {\n const group = this.groups?.get(filter.filterGroupId);\n const name = `f${filter.id}`;\n const label = filter.label || group?.label || filter.filterColumn;\n\n switch (group?.type) {\n case 'dateRange':\n return {\n name,\n type: ItemType.DateRange,\n label: [`${label} From`, `${label} To`],\n };\n\n case 'select':\n return {\n name,\n type: ItemType.AutoCompleteChips,\n label,\n values: () => this._reportData.filterOptions(this.reportId, filter.id)\n .pipe(\n map((options: unknown[]) => (options ?? [])\n .map((option) => ({ name: String(option), value: option }))),\n ),\n };\n\n case 'keyword':\n default:\n return {\n name,\n type: ItemType.Keyword,\n label,\n };\n }\n }\n\n private _fetch(query: any): Observable<{ data: Record<string, unknown>[]; paging: any }> {\n // Many/load-more sends `offset` + `limit` (not `page`); derive the page so\n // the server-side wrap keeps working unchanged. Page strategy still sends\n // `page` directly.\n const pageSize = query.limit ?? 25;\n const page = query.page\n ?? (query.offset != null ? Math.floor(query.offset / pageSize) + 1 : 1);\n\n const state: ComponentDataState = {\n page,\n pageSize,\n };\n\n const order = String(query.order ?? '');\n if (order) {\n const [column, direction] = order.split(',');\n state.sort = { column, direction: direction === 'desc' ? 'desc' : 'asc' };\n }\n\n // Report-level values from the shared session state, merged with this\n // list's own filter-bar values (own values win per filter).\n const resolved = new Map<number, ResolvedFilterValue>();\n for (const value of this._filterState.resolveForComponent(this.component)) {\n resolved.set(value.filterId, value);\n }\n for (const value of this._barValues(query)) {\n resolved.set(value.filterId, value);\n }\n\n return this._reportData\n .componentData(this.reportId, this.component.id, [...resolved.values()], state)\n .pipe(\n map((data: ComponentData) => ({\n data: data.rows ?? [],\n paging: {\n limit: data.paging?.pageSize ?? state.pageSize,\n records: data.paging?.total ?? (data.rows?.length ?? 0),\n page: data.paging?.page ?? state.page,\n },\n })),\n );\n }\n\n // The list's own FsFilter values, read back out of the fetch query by the\n // `f<filterId>` naming convention.\n private _barValues(query: any): ResolvedFilterValue[] {\n const values: ResolvedFilterValue[] = [];\n\n for (const filter of this._ownFilters()) {\n const group = this.groups?.get(filter.filterGroupId);\n const name = `f${filter.id}`;\n\n if (group?.type === 'dateRange') {\n const from = dateBoundString(query[`${name}From`]);\n const to = dateBoundString(query[`${name}To`]);\n if (from || to) {\n values.push({ filterId: filter.id, start: from, end: to });\n }\n } else if (group?.type === 'select') {\n // fs-filter joins a multi-select into one \"a,b\" string; split it back\n // so each value binds separately (else `col IN ('a,b')` matches nothing).\n const selected = query[name];\n const selectedValues = Array.isArray(selected)\n ? selected\n : (selected ? String(selected).split(',') : []);\n if (selectedValues.length) {\n values.push({ filterId: filter.id, values: selectedValues });\n }\n } else {\n const keyword = String(query[name] ?? '').trim();\n if (keyword) {\n values.push({ filterId: filter.id, value: keyword });\n }\n }\n }\n\n return values;\n }\n}\n","<fs-list [config]=\"listConfig\">\n @for (column of columns; track column.column) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [sortable]=\"true\">\n <ng-template\n fs-list-cell\n let-row=\"row\">\n @if (column.format === 'date') {\n {{ row[column.column] | date: 'mediumDate' }}\n } @else {\n {{ row[column.column] }}\n }\n </ng-template>\n </fs-list-column>\n }\n</fs-list>\n","import {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, ElementRef,\n EventEmitter, HostBinding, Input, NgZone, OnChanges, OnInit, Output, SimpleChanges, ViewChild, inject,\n} from '@angular/core';\n\n\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { FilterConfig, FsFilterModule } from '@firestitch/filter';\nimport { FsProcess } from '@firestitch/process';\n\nimport { Subject, debounceTime } from 'rxjs';\n\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { ReportData } from '../../data/report.data';\nimport {\n ComponentData,\n ReportComponent as ReportComponentModel,\n ReportFilterGroup,\n ReportLayout,\n} from '../../interfaces/report.interface';\nimport { DEFAULT_COMPONENT_PADDING } from '../../layout';\nimport { filterItemForGroup, groupValuesFromQuery } from '../../report-filter-items';\nimport { ReportFilterStateService } from '../../services/report-filter-state.service';\nimport { ComponentChartComponent } from '../component-chart/component-chart.component';\nimport { ComponentKpiComponent } from '../component-kpi/component-kpi.component';\nimport { ComponentListComponent } from '../component-list/component-list.component';\nimport { CanvasSnapper, PX_PER_INCH } from '../report-canvas/report-canvas.component';\n\n\n// Freeform resize handles, named by compass direction.\nconst HANDLES = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'] as const;\ntype Handle = typeof HANDLES[number];\n\n// Flow width snaps to the useful fractions of a page row.\nconst FLOW_WIDTH_STOPS = [25, 33.33, 50, 66.67, 75, 100];\n\nconst MIN_W = 0.6; // inches\nconst MIN_H = 0.4; // inches\n\n// One component on the page: title bar, the type-specific body (chart | list\n// | kpi), a menu (settings, filter toggles, export) — and the editing\n// interactions:\n//\n// Freeform: click selects; the selection frame shows 8 resize handles;\n// dragging the body moves with smart alignment guides (via the canvas\n// snapper); everything works at any zoom (pixel deltas ÷ zoom·96 → inches).\n//\n// Flow: dragging reorders (drop position decided by the canvas); the E\n// handle resizes flowWidth % (snapping to 25/33/50/66/75/100), the S handle\n// resizes height in inches.\n//\n// Charts and KPIs fetch their own data here; lists fetch inside\n// ComponentListComponent through FsList paging.\n@Component({\n selector: 'app-report-component',\n templateUrl: './report-component.component.html',\n styleUrls: ['./report-component.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n MatIcon,\n MatIconButton,\n MatMenuModule,\n MatTooltip,\n FsFilterModule,\n ComponentChartComponent,\n ComponentKpiComponent,\n ComponentListComponent,\n ],\n})\nexport class ReportComponentComponent implements OnInit, OnChanges {\n\n @Input() public reportId: number;\n @Input() public component: ReportComponentModel;\n @Input() public groups: Map<number, ReportFilterGroup>;\n @Input() public editMode = false;\n @Input() public layout: ReportLayout = 'freeform';\n // The canvas zoom — converts on-screen pixel deltas back to inches.\n @Input() public zoom = 1;\n @Input() public snapper: CanvasSnapper | null = null;\n @Input() public selected = false;\n\n @Output() public selectComponent = new EventEmitter<number>();\n @Output() public positionChanged = new EventEmitter<{ componentId: number } & Record<string, number>>();\n @Output() public flowReorder = new EventEmitter<{ componentId: number; clientX: number; clientY: number }>();\n @Output() public openSettings = new EventEmitter<ReportComponentModel>();\n\n @ViewChild(ComponentChartComponent)\n public chartComponent: ComponentChartComponent;\n\n // Freeform resize handles by type: a fixed-height component (chart) gets all\n // eight (resize width AND height); an auto-height one (list/kpi) gets only the\n // side handles since its height fits its content and can't be set.\n public get resizeHandles(): readonly Handle[] {\n return this._heightAuto ? ['e', 'w'] : HANDLES;\n }\n\n // The component's header IS an fs-filter: heading template = its title (and\n // the drag handle), actions = the Settings / filter-toggles / Export menu,\n // items = its component-level filter groups (none for lists — they filter\n // through FsList). Rebuilt when a filter toggle changes which groups show.\n public filterConfig!: FilterConfig;\n\n public data: ComponentData | null = null;\n public loading = false;\n public error: string | null = null;\n\n private _refresh$ = new Subject<void>();\n private _reportData = inject(ReportData);\n private _filterState = inject(ReportFilterStateService);\n private _process = inject(FsProcess);\n private _destroyRef = inject(DestroyRef);\n private _cdRef = inject(ChangeDetectorRef);\n private _zone = inject(NgZone);\n private _host: ElementRef<HTMLElement> = inject(ElementRef);\n\n public ngOnInit(): void {\n this._buildFilterConfig();\n\n if (this.component.type !== 'list') {\n // Debounced so a rapid filter sweep fires one query, not one per change.\n this._refresh$\n .pipe(\n debounceTime(300),\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe(() => this._load());\n\n this._filterState.changesFor(this.component)\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this._refresh$.next());\n\n // A Frequency change re-buckets every time-series chart; it isn't scoped\n // to a filter group, so it rides its own stream.\n if (this._isTimeSeries) {\n this._filterState.frequencyChanges()\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this._refresh$.next());\n }\n\n this._load();\n }\n }\n\n // The report reloads (e.g. after the settings dialog adds/moves a filter)\n // hand this instance fresh `component`/`groups` inputs without re-running\n // ngOnInit. Rebuild the header config so the inline component-filter strip\n // reflects the new filters; the template recreates the fs-filter via\n // `filterKey` so it actually re-reads this config.\n public ngOnChanges(changes: SimpleChanges): void {\n const filtersChanged = (changes.component && !changes.component.firstChange)\n || (changes.groups && !changes.groups.firstChange);\n\n if (filtersChanged) {\n this._buildFilterConfig();\n }\n }\n\n // fs-filter reads its config only once at init, so the header is keyed on the\n // set of component-level filter groups: the block is recreated (re-reading\n // the rebuilt config) whenever that set changes.\n public get filterKey(): string {\n return this.componentFilterGroups.map((group) => `${group.id}:${group.level}`).join('|');\n }\n\n public get truncated(): boolean {\n return !!this.data?.truncated;\n }\n\n // Content padding (inches → px at 96/in; the canvas zoom scales the page as\n // a whole). Each edge defaults to 1/8\".\n public get bodyPadding(): string {\n const padding = this.component.config?.padding;\n const edge = (value: number | undefined) => `${(value ?? DEFAULT_COMPONENT_PADDING) * PX_PER_INCH}px`;\n\n return `${edge(padding?.top)} ${edge(padding?.right)} ${edge(padding?.bottom)} ${edge(padding?.left)}`;\n }\n\n // The component-level filter groups that should render as an inline control\n // strip on THIS component: a group is included when it's level=component and\n // has an enabled, session-on filter here. Report-level groups live in the\n // top bar instead; lists render their own filters through FsList, so they\n // never use this strip.\n public get componentFilterGroups(): ReportFilterGroup[] {\n if (this.component.type === 'list' || !this.groups) {\n return [];\n }\n\n const groupIds = new Set<number>();\n for (const filter of this.component.filters ?? []) {\n if (!filter.enabled || this._filterState.isFilterDisabled(filter.id)) {\n continue;\n }\n const group = this.groups.get(filter.filterGroupId);\n if (group && (group.level === 'component' || group.level === 'both')) {\n groupIds.add(group.id);\n }\n }\n\n return [...groupIds].map((id) => this.groups.get(id)).filter(Boolean);\n }\n\n public settings(): void {\n this.openSettings.emit(this.component);\n }\n\n public exportCsv(): void {\n const filters = this._filterState.resolveForComponent(this.component);\n\n this._process.download(\n `Exporting ${this.component.title ?? 'component'}`,\n this._reportData.exportComponent(this.reportId, this.component.id, filters),\n );\n }\n\n // Any interaction inside a component must never start a canvas pan (the\n // zoom-pan host listens for mousedown/touchstart at the container level).\n public stopCanvasPan(event: Event): void {\n event.stopPropagation();\n }\n\n public onComponentPointerDown(event: PointerEvent): void {\n event.stopPropagation();\n if (this.editMode && !this.selected) {\n this.selectComponent.emit(this.component.id);\n }\n }\n\n // ----- edit-mode gestures ---------------------------------------------------\n\n public onDragStart(event: PointerEvent): void {\n if (!this.editMode) {\n return;\n }\n\n this.selectComponent.emit(this.component.id);\n\n if (this.layout === 'flow') {\n this._flowDrag(event);\n\n return;\n }\n\n this._track(event, (deltaX, deltaY) => {\n let x = Math.max(0, this._origin.x + this._inches(deltaX));\n let y = Math.max(0, this._origin.y + this._inches(deltaY));\n\n if (this.snapper) {\n ({ x, y } = this.snapper.snapMove(this.component, x, y));\n }\n\n this.component.x = x;\n this.component.y = y;\n this._applyGeometry();\n }, () => this._emitGeometry());\n }\n\n public onResizeStart(event: PointerEvent, handle: Handle): void {\n if (!this.editMode) {\n return;\n }\n\n this.selectComponent.emit(this.component.id);\n\n if (this.layout === 'flow') {\n this._flowResize(event, handle);\n\n return;\n }\n\n this._track(event, (deltaX, deltaY) => {\n const dx = this._inches(deltaX);\n const dy = this._inches(deltaY);\n let { x, y, w, h } = this._origin;\n\n if (handle.includes('e')) {\n w = Math.max(MIN_W, this._origin.w + dx);\n }\n if (handle.includes('s')) {\n h = Math.max(MIN_H, this._origin.h + dy);\n }\n if (handle.includes('w')) {\n const clamped = Math.min(dx, this._origin.w - MIN_W);\n x = this._origin.x + clamped;\n w = this._origin.w - clamped;\n }\n if (handle.includes('n')) {\n const clamped = Math.min(dy, this._origin.h - MIN_H);\n y = this._origin.y + clamped;\n h = this._origin.h - clamped;\n }\n\n let geometry = { x, y, w, h };\n if (this.snapper) {\n geometry = this.snapper.snapResize(this.component, geometry, handle);\n }\n\n Object.assign(this.component, geometry);\n this._applyGeometry();\n this.chartComponent?.resize();\n }, () => this._emitGeometry());\n }\n\n // (Re)build the header fs-filter config: heading template renders the title\n // and items are this component's component-level filter groups. The actions\n // menu (Settings / Export CSV) is NOT here — it's a standalone kebab floated\n // top-right in the template, so its button height no longer drives the header\n // row's height (which would otherwise inflate the heading by ~40px).\n private _buildFilterConfig(): void {\n this.filterConfig = {\n // Never touch the URL or persist filter state — component filters are\n // session-only, owned by ReportFilterStateService.\n queryParam: false,\n persist: false,\n items: this.componentFilterGroups.map((group) =>\n filterItemForGroup(group, this._reportData, this.reportId, this._filterState.value(group.id))),\n change: (query) => {\n for (const { groupId, value } of groupValuesFromQuery(query ?? {}, this.componentFilterGroups)) {\n this._filterState.setValue(groupId, value);\n }\n },\n };\n }\n\n // Flow: only the east handle resizes (width %). Height is always auto in flow\n // (the box fits its content), so there's no south handle here.\n private _flowResize(event: PointerEvent, handle: Handle): void {\n const pageWidth = this._host.nativeElement.parentElement?.clientWidth || 1;\n\n this._track(event, (deltaX) => {\n if (handle.includes('e')) {\n const deltaPercent = (deltaX / this.zoom / pageWidth) * 100;\n const raw = Math.min(100, Math.max(10, this._origin.flowWidth + deltaPercent));\n this.component.flowWidth = this._snapFlowWidth(raw);\n this._host.nativeElement.style.width = `${this.component.flowWidth}%`;\n }\n }, () => {\n this.positionChanged.emit({\n componentId: this.component.id,\n flowWidth: this.component.flowWidth,\n });\n });\n }\n\n // Flow: drag lifts the component (ghost) and the canvas decides the drop\n // index from the pointer position.\n private _flowDrag(event: PointerEvent): void {\n const host = this._host.nativeElement;\n let lastClientX = event.clientX;\n let lastClientY = event.clientY;\n\n host.classList.add('flow-dragging');\n\n this._track(event, (deltaX, deltaY, e) => {\n lastClientX = e.clientX;\n lastClientY = e.clientY;\n host.style.transform = `translate(${deltaX / this.zoom}px, ${deltaY / this.zoom}px)`;\n }, () => {\n host.classList.remove('flow-dragging');\n host.style.transform = '';\n this.flowReorder.emit({\n componentId: this.component.id,\n clientX: lastClientX,\n clientY: lastClientY,\n });\n });\n }\n\n private _origin = { x: 0, y: 0, w: 0, h: 0, flowWidth: 50 };\n\n // Pointer-capture gesture loop: runs outside Angular, repaints imperatively,\n // and finishes back inside Angular (selection/persistence).\n private _track(\n event: PointerEvent,\n onMove: (deltaX: number, deltaY: number, e: PointerEvent) => void,\n onEnd: () => void,\n ): void {\n event.preventDefault();\n event.stopPropagation();\n\n const handle = event.target as HTMLElement;\n handle.setPointerCapture(event.pointerId);\n\n this._origin = {\n x: this.component.x,\n y: this.component.y,\n w: this.component.w,\n h: this.component.h,\n flowWidth: this.component.flowWidth ?? 50,\n };\n const startX = event.clientX;\n const startY = event.clientY;\n\n this._zone.runOutsideAngular(() => {\n const move = (e: PointerEvent) => onMove(e.clientX - startX, e.clientY - startY, e);\n const end = () => {\n handle.releasePointerCapture(event.pointerId);\n handle.removeEventListener('pointermove', move);\n handle.removeEventListener('pointerup', end);\n handle.removeEventListener('pointercancel', end);\n\n this._zone.run(() => {\n this.snapper?.clear();\n onEnd();\n this._cdRef.markForCheck();\n });\n };\n\n handle.addEventListener('pointermove', move);\n handle.addEventListener('pointerup', end);\n handle.addEventListener('pointercancel', end);\n });\n }\n\n private _emitGeometry(): void {\n this.component.x = this._round(this.component.x);\n this.component.y = this._round(this.component.y);\n this.component.w = this._round(Math.max(MIN_W, this.component.w));\n this.component.h = this._round(Math.max(MIN_H, this.component.h));\n this._applyGeometry();\n this.chartComponent?.resize();\n\n this.positionChanged.emit({\n componentId: this.component.id,\n x: this.component.x,\n y: this.component.y,\n w: this.component.w,\n h: this.component.h,\n });\n }\n\n // A chart on a time x-axis — the only component the runtime Frequency control\n // applies to.\n private get _isTimeSeries(): boolean {\n return this.component.type === 'chart' && this.component.config?.xAxis?.kind === 'time';\n }\n\n // Auto height (box fits its content) vs fixed (use `h` exactly). Derived from\n // type, server-side: lists and KPI tiles are auto; charts are always fixed so\n // they fit the box and never overflow.\n private get _heightAuto(): boolean {\n return this.component.autoHeight !== false;\n }\n\n // Drives the auto-only CSS default (empty-state baseline) so it never applies\n // to a fixed-height component.\n @HostBinding('class.height-auto')\n public get heightAuto(): boolean {\n return this._heightAuto;\n }\n\n // Screen pixels → inches at the current zoom.\n private _inches(pixels: number): number {\n return pixels / (this.zoom * PX_PER_INCH);\n }\n\n // Clean persisted values: hundredths of an inch.\n private _round(value: number): number {\n return Math.round(value * 100) / 100;\n }\n\n private _snapFlowWidth(value: number): number {\n for (const stop of FLOW_WIDTH_STOPS) {\n if (Math.abs(value - stop) < 3) {\n return stop;\n }\n }\n\n return Math.round(value * 10) / 10;\n }\n\n // The canvas positions the host via [style]; mid-gesture we set it directly\n // so OnPush never re-renders in the move loop.\n private _applyGeometry(): void {\n const style = this._host.nativeElement.style;\n style.left = `${this.component.x * PX_PER_INCH}px`;\n style.top = `${this.component.y * PX_PER_INCH}px`;\n style.width = `${this.component.w * PX_PER_INCH}px`;\n\n // Auto (list/kpi): no fixed height — the box sizes to its content. Fixed\n // (chart): `h` is the exact height. Mirrors the canvas [style] binding so\n // the mid-gesture paint matches the post-gesture re-render.\n if (this._heightAuto) {\n style.height = '';\n } else {\n style.height = `${this.component.h * PX_PER_INCH}px`;\n }\n }\n\n // ----- data ----------------------------------------------------------------\n\n private _load(): void {\n this.loading = true;\n this.error = null;\n this._cdRef.markForCheck();\n\n const filters = this._filterState.resolveForComponent(this.component);\n // Time-series charts carry the runtime Frequency override (if chosen) so the\n // backend re-buckets; everything else sends no interaction state here.\n const state = this._isTimeSeries && this._filterState.frequency()\n ? { frequency: this._filterState.frequency() }\n : {};\n\n this._reportData.componentData(this.reportId, this.component.id, filters, state)\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe({\n next: (data: ComponentData) => {\n this.data = data;\n this.loading = false;\n this._cdRef.markForCheck();\n },\n error: (error) => {\n this.loading = false;\n this.error = error?.error?.message ?? error?.message ?? 'Failed to load data';\n this._cdRef.markForCheck();\n },\n });\n }\n}\n","<div\n class=\"component-box\"\n [class.editing]=\"editMode\"\n [class.selected]=\"selected\"\n [style.padding]=\"bodyPadding\"\n (pointerdown)=\"onComponentPointerDown($event)\"\n (mousedown)=\"stopCanvasPan($event)\"\n (touchstart)=\"stopCanvasPan($event)\">\n <!-- The header is an fs-filter: heading template = title (and the edit-mode\n drag handle), actions = the menu, items = component-level filters.\n Lists carry no items here — they filter through FsList. fs-filter reads\n its config once, so the block is keyed on the component-filter set to be\n recreated when it changes. -->\n @for (key of [filterKey]; track key) {\n <fs-filter\n class=\"component-filter\"\n [config]=\"filterConfig\">\n <ng-template fsFilterHeading>\n <div\n class=\"component-title\"\n (pointerdown)=\"onDragStart($event)\">\n {{ component.title }}\n @if (truncated) {\n <mat-icon\n class=\"truncated-icon\"\n matTooltip=\"Showing a truncated result — refine the filters to see everything.\">\n warning_amber\n </mat-icon>\n }\n </div>\n </ng-template>\n </fs-filter>\n }\n <!-- The actions menu is floated top-right (absolute) rather than living in\n fs-filter's actions slot, so its ~40px button height no longer drives the\n header row's height. It overlays the box corner; the heading reserves\n right padding so a long title ellipsises before it. -->\n <button\n mat-icon-button\n class=\"component-menu\"\n [matMenuTriggerFor]=\"menu\"\n (pointerdown)=\"$event.stopPropagation()\"\n (mousedown)=\"stopCanvasPan($event)\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"settings()\">\n <mat-icon>tune</mat-icon>\n <span>Settings</span>\n </button>\n <button mat-menu-item (click)=\"exportCsv()\">\n <mat-icon>download</mat-icon>\n <span>Export CSV</span>\n </button>\n </mat-menu>\n <div class=\"component-body\">\n @if (component.type === 'list') {\n <app-report-component-list\n [reportId]=\"reportId\"\n [component]=\"component\"\n [groups]=\"groups\">\n </app-report-component-list>\n } @else if (loading) {\n <div class=\"component-state\">\n <div class=\"loading-shimmer\"></div>\n </div>\n } @else if (error) {\n <div class=\"component-state error\">\n {{ error }}\n </div>\n } @else if (!data?.rows?.length) {\n <div class=\"component-state\">\n No data\n </div>\n } @else if (component.type === 'kpi') {\n <app-report-component-kpi\n [component]=\"component\"\n [data]=\"data\">\n </app-report-component-kpi>\n } @else {\n <app-report-component-chart\n [component]=\"component\"\n [data]=\"data\">\n </app-report-component-chart>\n }\n <!-- In edit mode a transparent veil over the body makes the WHOLE\n component draggable (industry standard: you grab the object, not just\n its title bar) and keeps inner widgets from swallowing the gesture. -->\n @if (editMode) {\n <div\n class=\"drag-veil\"\n (pointerdown)=\"onDragStart($event)\">\n </div>\n }\n </div>\n</div>\n<!-- Handles live OUTSIDE the clipped box so they straddle its edges. -->\n@if (editMode && selected) {\n @if (layout === 'freeform') {\n @for (handle of resizeHandles; track handle) {\n <div\n class=\"handle handle-{{ handle }}\"\n (mousedown)=\"stopCanvasPan($event)\"\n (pointerdown)=\"onResizeStart($event, handle)\">\n </div>\n }\n } @else {\n <!-- Flow height is always auto (the box fits its content), so only the\n east handle (width %) is offered here. -->\n <div\n class=\"handle handle-e\"\n matTooltip=\"Width (% of page)\"\n (mousedown)=\"stopCanvasPan($event)\"\n (pointerdown)=\"onResizeStart($event, 'e')\">\n </div>\n }\n}","import {\n AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef,\n ElementRef, EventEmitter, Input, OnChanges, Output, ViewChild, inject,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { MatButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { FsZoomPanComponent, FsZoomPanModule } from '@firestitch/zoom-pan';\n\nimport { ReportData } from '../../data/report.data';\nimport { Report, ReportComponent, ReportFilterGroup, ReportPage } from '../../interfaces/report.interface';\nimport { DEFAULT_HEADING_SIZE, FLOW_PADDING } from '../../layout';\nimport { ReportComponentComponent } from '../report-component/report-component.component';\n\n\n// Screen density of the canvas: 96 CSS px per inch (the CSS reference pixel),\n// before zoom. All geometry stays in inches; only rendering multiplies by it.\nexport const PX_PER_INCH = 96;\n\n// One smart guide line, in page inches.\nexport interface GuideLine {\n orientation: 'v' | 'h';\n position: number;\n}\n\n// The snapping contract handed to each component's drag loop. Implemented by\n// the canvas because only it sees every component (alignment candidates) and\n// owns the guides overlay.\nexport interface CanvasSnapper {\n snapMove(component: ReportComponent, x: number, y: number): { x: number; y: number };\n snapResize(component: ReportComponent, geometry: { x: number; y: number; w: number; h: number }, handle: string): { x: number; y: number; w: number; h: number };\n clear(): void;\n}\n\n// The fixed-size page canvas — the PowerPoint model. Pages are tabs (only the\n// ACTIVE page's components exist → only they fetch); the page is a\n// pageWidth×pageHeight INCHES sheet rendered at 96px/in inside fs-zoom-pan\n// (wheel zoom, background drag pan, toolbar buttons).\n//\n// Freeform layout: components are absolutely positioned; dragging gets smart\n// alignment guides (edges + centers of siblings and the page) with snapping.\n// Flow layout: components flow into rows (flowWidth % of the content width),\n// drag reorders, east/south handles resize width%/height.\n@Component({\n selector: 'app-report-canvas',\n templateUrl: './report-canvas.component.html',\n styleUrls: ['./report-canvas.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n MatButton,\n MatIcon,\n MatTooltip,\n FsZoomPanModule,\n ReportComponentComponent,\n ],\n})\nexport class ReportCanvasComponent implements OnChanges, AfterViewInit {\n\n @Input() public report: Report;\n @Input() public editMode = false;\n\n // A component asked for its settings dialog — the page-level host opens it\n // (it owns MatDialog + the post-save reload).\n @Output() public componentSettings = new EventEmitter<ReportComponent>();\n\n // The report's structure changed here (a page was added) — the host re-fetches\n // it (it owns the assembled report + filter state).\n @Output() public reportChanged = new EventEmitter<void>();\n\n // The viewer dismissed edit mode from the on-canvas badge — the host owns the\n // editMode flag, so it flips it off (mirrors the menu's \"Done editing layout\").\n @Output() public editDone = new EventEmitter<void>();\n\n @ViewChild(FsZoomPanComponent)\n public zoomPan: FsZoomPanComponent;\n\n @ViewChild('viewport', { static: true })\n private _viewport: ElementRef<HTMLDivElement>;\n\n @ViewChild('guides', { static: false })\n private _guides: ElementRef<HTMLDivElement>;\n\n public readonly PX = PX_PER_INCH;\n public readonly flowPadding = FLOW_PADDING;\n\n public activePageIndex = 0;\n public zoom = 1;\n public groups = new Map<number, ReportFilterGroup>();\n public selectedComponentId: number | null = null;\n\n // The snapper handed to every component (stable identity for OnPush).\n public readonly snapper: CanvasSnapper = {\n snapMove: (component, x, y) => this._snapMove(component, x, y),\n snapResize: (component, geometry, handle) => this._snapResize(component, geometry, handle),\n clear: () => this._clearGuides(),\n };\n\n private _reportData = inject(ReportData);\n private _cdRef = inject(ChangeDetectorRef);\n private _destroyRef = inject(DestroyRef);\n private _fitted = false;\n private _previousPageCount = 0;\n\n public ngOnChanges(): void {\n this.groups = new Map((this.report?.filterGroups ?? []).map((group) => [group.id, group]));\n\n const pageCount = this.report?.pages?.length ?? 0;\n\n // A page was just added (the host re-fetched the report) — land on it.\n if (pageCount > this._previousPageCount && this._previousPageCount > 0) {\n this.activePageIndex = pageCount - 1;\n }\n this._previousPageCount = pageCount;\n\n if (this.activePageIndex >= pageCount) {\n this.activePageIndex = 0;\n }\n }\n\n // Report heading size in px (config is points; the canvas renders at\n // 96px/in, so points × 96/72). Inherited by component titles via a CSS var.\n public get headingSizePx(): number {\n const points = this.report?.config?.styles?.heading?.size ?? DEFAULT_HEADING_SIZE;\n\n return points * (PX_PER_INCH / 72);\n }\n\n public ngAfterViewInit(): void {\n // Fit the page to the viewport once on first render; after that the\n // viewer's zoom choice is respected across re-renders.\n setTimeout(() => this.zoomFit());\n }\n\n public get isFlow(): boolean {\n return this.report?.layout === 'flow';\n }\n\n public get activePage(): ReportPage | null {\n return this.report?.pages?.[this.activePageIndex] ?? null;\n }\n\n // Flow render order (the assembler already sorts, but a local reorder\n // mid-session must hold without a re-fetch).\n public get flowComponents(): ReportComponent[] {\n return [...(this.activePage?.components ?? [])].sort((a, b) => a.order - b.order);\n }\n\n public selectPage(index: number): void {\n this.activePageIndex = index;\n this.selectedComponentId = null;\n }\n\n // Append a blank page; the host re-fetches the report and ngOnChanges lands\n // the view on the new (last) page.\n public addPage(): void {\n if (!this.report) {\n return;\n }\n\n this._reportData.addPage(this.report.id)\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => this.reportChanged.emit());\n }\n\n public pageLabel(page: ReportPage, index: number): string {\n return page.name || `Page ${index + 1}`;\n }\n\n public selectComponent(componentId: number | null): void {\n this.selectedComponentId = componentId;\n this._cdRef.markForCheck();\n }\n\n public onCanvasPointerDown(): void {\n // Background click (pan start) deselects.\n if (this.selectedComponentId !== null) {\n this.selectComponent(null);\n }\n }\n\n // ----- zoom toolbar ---------------------------------------------------------\n\n public onZoomed(scale: number): void {\n this.zoom = scale;\n this._cdRef.markForCheck();\n }\n\n public zoomIn(): void {\n this.zoomPan?.zoomIn();\n }\n\n public zoomOut(): void {\n this.zoomPan?.zoomOut();\n }\n\n public zoomFit(): void {\n const viewport = this._viewport?.nativeElement;\n if (!viewport || !this.report?.pageWidth || !this.zoomPan) {\n return;\n }\n\n const fit = Math.min(\n (viewport.clientWidth - 32) / (this.report.pageWidth * PX_PER_INCH),\n (viewport.clientHeight - 32) / (this.report.pageHeight * PX_PER_INCH),\n );\n\n this.zoomPan.zoom(Math.min(1.5, Math.max(0.1, fit)));\n this.zoomPan.move(16, 16);\n this._fitted = true;\n }\n\n public zoomActual(): void {\n this.zoomPan?.zoom(1);\n }\n\n // ----- persistence ----------------------------------------------------------\n\n // A freeform drag/resize or a flow width resize landed — one PUT per gesture.\n public onPositionChanged(position: { componentId: number } & Record<string, number>): void {\n this._clearGuides();\n this._reportData.savePositions(this.report.id, [position as any])\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe();\n }\n\n // A flow drag dropped: reorder the page's components around the moved one\n // and persist every order in one PUT.\n public onFlowReorder(event: { componentId: number; clientX: number; clientY: number }): void {\n const page = this.activePage;\n if (!page) {\n return;\n }\n\n const ordered = this.flowComponents.filter((component) => component.id !== event.componentId);\n const moved = page.components.find((component) => component.id === event.componentId);\n if (!moved) {\n return;\n }\n\n const index = this._flowDropIndex(ordered, event.clientX, event.clientY);\n ordered.splice(index, 0, moved);\n\n const positions = ordered.map((component, order) => {\n component.order = order;\n\n return { componentId: component.id, order };\n });\n\n this._cdRef.markForCheck();\n this._reportData.savePositions(this.report.id, positions)\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe();\n }\n\n // Where the pointer landed among the flowed components: before the first\n // component whose center the pointer is above/left of.\n private _flowDropIndex(ordered: ReportComponent[], clientX: number, clientY: number): number {\n const hosts = Array.from(\n this._viewport.nativeElement.querySelectorAll<HTMLElement>('app-report-component'),\n ).filter((host) => !host.classList.contains('flow-dragging'));\n\n for (let index = 0; index < hosts.length && index < ordered.length; index++) {\n const rect = hosts[index].getBoundingClientRect();\n if (clientY < rect.top + rect.height / 2\n || (clientY < rect.bottom && clientX < rect.left + rect.width / 2)) {\n return index;\n }\n }\n\n return ordered.length;\n }\n\n // ----- smart guides ---------------------------------------------------------\n\n // Pixel feel of the snap, converted to inches at the current zoom.\n private get _snapThreshold(): number {\n return 8 / (PX_PER_INCH * Math.max(0.1, this.zoom));\n }\n\n private _snapMove(component: ReportComponent, x: number, y: number): { x: number; y: number } {\n const { vertical, horizontal } = this._candidates(component);\n const guides: GuideLine[] = [];\n\n const snappedX = this._snapAxis(\n [\n { offset: 0, value: x },\n { offset: component.w / 2, value: x + component.w / 2 },\n { offset: component.w, value: x + component.w },\n ],\n vertical,\n );\n if (snappedX !== null) {\n x = snappedX.base;\n guides.push({ orientation: 'v', position: snappedX.guide });\n }\n\n const snappedY = this._snapAxis(\n [\n { offset: 0, value: y },\n { offset: component.h / 2, value: y + component.h / 2 },\n { offset: component.h, value: y + component.h },\n ],\n horizontal,\n );\n if (snappedY !== null) {\n y = snappedY.base;\n guides.push({ orientation: 'h', position: snappedY.guide });\n }\n\n this._renderGuides(guides);\n\n return { x, y };\n }\n\n private _snapResize(\n component: ReportComponent,\n geometry: { x: number; y: number; w: number; h: number },\n handle: string,\n ): { x: number; y: number; w: number; h: number } {\n const { vertical, horizontal } = this._candidates(component);\n const guides: GuideLine[] = [];\n const result = { ...geometry };\n\n // Only the edges the handle moves participate in snapping.\n if (handle.includes('e')) {\n const snapped = this._nearest(geometry.x + geometry.w, vertical);\n if (snapped !== null) {\n result.w = snapped - geometry.x;\n guides.push({ orientation: 'v', position: snapped });\n }\n }\n if (handle.includes('w')) {\n const snapped = this._nearest(geometry.x, vertical);\n if (snapped !== null) {\n result.w = geometry.x + geometry.w - snapped;\n result.x = snapped;\n guides.push({ orientation: 'v', position: snapped });\n }\n }\n if (handle.includes('s')) {\n const snapped = this._nearest(geometry.y + geometry.h, horizontal);\n if (snapped !== null) {\n result.h = snapped - geometry.y;\n guides.push({ orientation: 'h', position: snapped });\n }\n }\n if (handle.includes('n')) {\n const snapped = this._nearest(geometry.y, horizontal);\n if (snapped !== null) {\n result.h = geometry.y + geometry.h - snapped;\n result.y = snapped;\n guides.push({ orientation: 'h', position: snapped });\n }\n }\n\n this._renderGuides(guides);\n\n return result;\n }\n\n // Alignment candidates: the page's edges + center, and every sibling's\n // edges + centers.\n private _candidates(moving: ReportComponent): { vertical: number[]; horizontal: number[] } {\n const vertical = [0, this.report.pageWidth / 2, this.report.pageWidth];\n const horizontal = [0, this.report.pageHeight / 2, this.report.pageHeight];\n\n for (const component of this.activePage?.components ?? []) {\n if (component.id === moving.id) {\n continue;\n }\n\n vertical.push(component.x, component.x + component.w / 2, component.x + component.w);\n horizontal.push(component.y, component.y + component.h / 2, component.y + component.h);\n }\n\n return { vertical, horizontal };\n }\n\n // Snap one axis: of the moving box's three lines (edge/center/edge), find\n // the closest candidate within threshold and return the adjusted base\n // coordinate plus the guide to draw.\n private _snapAxis(\n lines: { offset: number; value: number }[],\n candidates: number[],\n ): { base: number; guide: number } | null {\n let best: { base: number; guide: number; distance: number } | null = null;\n\n for (const line of lines) {\n for (const candidate of candidates) {\n const distance = Math.abs(candidate - line.value);\n if (distance <= this._snapThreshold && (!best || distance < best.distance)) {\n best = { base: candidate - line.offset, guide: candidate, distance };\n }\n }\n }\n\n return best ? { base: best.base, guide: best.guide } : null;\n }\n\n private _nearest(value: number, candidates: number[]): number | null {\n let best: number | null = null;\n let bestDistance = this._snapThreshold;\n\n for (const candidate of candidates) {\n const distance = Math.abs(candidate - value);\n if (distance <= bestDistance) {\n best = candidate;\n bestDistance = distance;\n }\n }\n\n return best;\n }\n\n // The guides overlay is drawn imperatively — the drag loop runs outside\n // Angular and repaints on every pointermove.\n private _renderGuides(guides: GuideLine[]): void {\n const host = this._guides?.nativeElement;\n if (!host) {\n return;\n }\n\n host.replaceChildren(...guides.map((guide) => {\n const line = document.createElement('div');\n line.className = `guide guide-${guide.orientation}`;\n if (guide.orientation === 'v') {\n line.style.left = `${guide.position * PX_PER_INCH}px`;\n } else {\n line.style.top = `${guide.position * PX_PER_INCH}px`;\n }\n\n return line;\n }));\n }\n\n private _clearGuides(): void {\n this._guides?.nativeElement?.replaceChildren();\n }\n}\n","<div class=\"canvas\">\n <div\n #viewport\n class=\"page-viewport\"\n (pointerdown)=\"onCanvasPointerDown()\">\n <fs-zoom-pan\n [zoomMin]=\"0.1\"\n [zoomMax]=\"3\"\n (zoomed)=\"onZoomed($event)\">\n @if (activePage; as page) {\n <div\n class=\"page\"\n [class.flow]=\"isFlow\"\n [class.editing]=\"editMode\"\n [style.width.px]=\"report.pageWidth * PX\"\n [style.height.px]=\"report.pageHeight * PX\"\n [style.padding.px]=\"isFlow ? flowPadding * PX : 0\"\n [style.--canvas-zoom]=\"zoom\"\n [style.--report-heading-size.px]=\"headingSizePx\">\n @if (isFlow) {\n @for (component of flowComponents; track component.id) {\n <app-report-component\n class=\"flow-item\"\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'flow'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.width.%]=\"component.flowWidth\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (flowReorder)=\"onFlowReorder($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n } @else {\n @for (component of page.components; track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'freeform'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n }\n\n <div\n #guides\n class=\"guides\">\n </div>\n\n @if (!page.components.length) {\n <div class=\"page-empty\">\n Ask the assistant to add a chart, list or KPI to this page.\n </div>\n }\n </div>\n }\n </fs-zoom-pan>\n\n @if (editMode) {\n <button\n mat-flat-button\n type=\"button\"\n color=\"primary\"\n class=\"edit-done\"\n matTooltip=\"Exit layout editing\"\n (click)=\"editDone.emit()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n }\n </div>\n\n <div class=\"canvas-toolbar\">\n <div class=\"page-tabs\">\n @if ((report?.pages?.length ?? 0) > 1) {\n @for (page of report.pages; track page.id; let index = $index) {\n <button\n type=\"button\"\n class=\"page-tab\"\n [class.active]=\"index === activePageIndex\"\n (click)=\"selectPage(index)\">\n {{ pageLabel(page, index) }}\n </button>\n }\n }\n <button\n type=\"button\"\n class=\"page-tab add-page\"\n matTooltip=\"Add page\"\n (click)=\"addPage()\">\n <mat-icon>add</mat-icon>\n Page\n </button>\n </div>\n\n <div class=\"zoom-controls\">\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom out\"\n (click)=\"zoomOut()\">\n <mat-icon>remove</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-label\"\n matTooltip=\"Zoom to 100%\"\n (click)=\"zoomActual()\">\n {{ (zoom * 100).toFixed(0) }}%\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom in\"\n (click)=\"zoomIn()\">\n <mat-icon>add</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Fit page\"\n (click)=\"zoomFit()\">\n <mat-icon>fit_screen</mat-icon>\n </button>\n </div>\n </div>\n</div>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\nimport { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field';\nimport { MatInput } from '@angular/material/input';\nimport { MatSlideToggle } from '@angular/material/slide-toggle';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { FsDialogModule } from '@firestitch/dialog';\nimport { FsFormModule } from '@firestitch/form';\nimport { FsLabelModule } from '@firestitch/label';\nimport { FsMessage } from '@firestitch/message';\nimport { FsTabsModule } from '@firestitch/tabs';\n\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\n\nimport { ReportData } from '../../data/report.data';\nimport {\n Report,\n ReportComponent,\n ReportFilter,\n ReportFilterGroup,\n ReportFilterLevel,\n ReportFilterType,\n ReportFilterableColumn,\n} from '../../interfaces/report.interface';\nimport { DEFAULT_COMPONENT_PADDING } from '../../layout';\n\n\n// One row of the Filters tab listing: a filterable column, the interface\n// inferred from its data, and where its filter is exposed (the two toggles).\ninterface FilterRow {\n column: string;\n type: ReportFilterType;\n label: string;\n report: boolean;\n component: boolean;\n}\n\n\n// Component settings, in tabs:\n// Settings — title and content padding. Position/size are tuned by dragging\n// on the canvas; height behaviour follows from the component type.\n// Filters — ONE listing of every filterable column on this component. Each\n// row carries two toggles: show in the report bar and/or show on this\n// component (both, either, or neither). The interface (date range vs value\n// picker) is inferred from the data, never chosen. Each toggle persists\n// immediately and refreshes the in-dialog list.\n// SQL / Config — read-only diagnostics.\n@Component({\n templateUrl: './component-settings.component.html',\n styleUrls: ['./component-settings.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n FormsModule,\n FsFormModule,\n FsDialogModule,\n FsLabelModule,\n FsTabsModule,\n MatTabsModule,\n MatDialogTitle,\n MatDialogContent,\n MatDialogActions,\n MatFormField,\n MatLabel,\n MatSuffix,\n MatInput,\n MatSlideToggle,\n MatTooltip,\n ],\n})\nexport class ComponentSettingsComponent implements OnInit {\n\n public component: ReportComponent;\n public report: Report;\n\n public selectedTab = 'settings';\n\n public title = '';\n\n public paddingTop = DEFAULT_COMPONENT_PADDING;\n public paddingRight = DEFAULT_COMPONENT_PADDING;\n public paddingBottom = DEFAULT_COMPONENT_PADDING;\n public paddingLeft = DEFAULT_COMPONENT_PADDING;\n\n public configJson = '';\n\n // ---- filter management state ----\n // One row per filterable column. The two booleans drive the toggles; we flip\n // them optimistically on click (so the UI never blinks while the request is\n // in flight) and reconcile from the server on reload.\n public rows: FilterRow[] = [];\n public columnsError: string | null = null;\n\n // The raw inputs the rows are built from.\n private _filterableColumns: ReportFilterableColumn[] = [];\n private _filters: ReportFilter[] = [];\n private _groupsById = new Map<number, ReportFilterGroup>();\n\n private readonly _typeLabels: Record<ReportFilterType, string> = {\n select: 'Pick values',\n dateRange: 'Date range',\n keyword: 'Search text',\n };\n\n // True once any filter mutation happened — the parent reloads the report so\n // the canvas + report bar reflect the change.\n private _changed = false;\n\n private readonly _data: { report: Report; component: ReportComponent } = inject(MAT_DIALOG_DATA);\n private readonly _dialogRef = inject<MatDialogRef<ComponentSettingsComponent>>(MatDialogRef);\n private readonly _reportData = inject(ReportData);\n private readonly _message = inject(FsMessage);\n private readonly _cdRef = inject(ChangeDetectorRef);\n\n public ngOnInit(): void {\n this.report = this._data.report;\n this.component = this._data.component;\n\n this.title = this.component.title ?? '';\n\n const padding = this.component.config?.padding;\n this.paddingTop = padding?.top ?? DEFAULT_COMPONENT_PADDING;\n this.paddingRight = padding?.right ?? DEFAULT_COMPONENT_PADDING;\n this.paddingBottom = padding?.bottom ?? DEFAULT_COMPONENT_PADDING;\n this.paddingLeft = padding?.left ?? DEFAULT_COMPONENT_PADDING;\n\n this.configJson = JSON.stringify(this.component.config ?? {}, null, 2);\n\n this._seedFilters(this.report, this.component.id);\n this._loadColumns();\n }\n\n public get hasChanges(): boolean {\n return this._changed;\n }\n\n // Human-friendly name for the inferred interface shown beside each column.\n public typeLabel(type: ReportFilterType): string {\n return this._typeLabels[type] ?? type;\n }\n\n public save = () => {\n const settings: Record<string, unknown> = {\n title: this.title,\n padding: {\n top: this.paddingTop,\n right: this.paddingRight,\n bottom: this.paddingBottom,\n left: this.paddingLeft,\n },\n };\n\n return this._reportData.updateComponent(this.report.id, this.component.id, settings)\n .pipe(\n tap(() => {\n this._message.success('Component saved');\n this._dialogRef.close(true);\n }),\n );\n };\n\n // Flip one exposure (report bar or this component) for a row. We update the\n // row's boolean first — so the toggle stays put with no blink — then persist\n // and reconcile on reload. Neither on → no filter (removed); either on → the\n // filter exists at the combined level. The interface type is inferred\n // server-side.\n public setExposure(row: FilterRow, target: 'report' | 'component', on: boolean): void {\n row[target] = on;\n\n const existing = this._filters.find((filter) => filter.filterColumn === row.column);\n\n if (!row.report && !row.component) {\n if (existing) {\n this._run(this._reportData.deleteFilter(this.report.id, existing.id));\n }\n\n return;\n }\n\n const level: ReportFilterLevel = row.report && row.component\n ? 'both'\n : (row.report ? 'report' : 'component');\n\n if (existing) {\n this._run(this._reportData.updateFilterGroup(this.report.id, existing.filterGroupId, { level }));\n } else {\n this._run(this._reportData.addFilter(this.report.id, this.component.id, {\n filterColumn: row.column,\n label: row.label,\n level,\n }));\n }\n }\n\n // Run a filter mutation, then reload to reconcile the optimistic state.\n private _run(request: Observable<unknown>): void {\n request.subscribe({\n next: () => this._afterMutation(),\n error: (error) => this._mutationError(error),\n });\n }\n\n // Build the row view-model from the loaded columns + filters/groups. Each\n // row's toggles reflect where its filter group is currently exposed.\n private _rebuildRows(): void {\n this.rows = this._filterableColumns.map((column) => {\n const filter = this._filters.find((candidate) => candidate.filterColumn === column.column);\n const level = filter ? this._groupsById.get(filter.filterGroupId)?.level : undefined;\n\n return {\n column: column.column,\n type: column.type,\n label: filter?.label\n || this._groupsById.get(filter?.filterGroupId ?? -1)?.label\n || this._humanize(column.column),\n report: level === 'report' || level === 'both',\n component: level === 'component' || level === 'both',\n };\n });\n }\n\n // After any filter mutation: re-fetch the report so the dialog's filter list\n // (and the parent canvas, on close) reflect the new groups/levels.\n private _afterMutation(): void {\n this._changed = true;\n\n this._reportData.get(this.report.id)\n .subscribe((report: Report) => {\n this.report = report;\n this._seedFilters(report, this.component.id);\n this._cdRef.markForCheck();\n });\n }\n\n private _mutationError(error: any): void {\n this._message.error(error?.error?.message ?? error?.message ?? 'Filter operation failed');\n // Re-seed from the server so the optimistic toggle snaps back to truth.\n this._afterMutation();\n }\n\n private _seedFilters(report: Report, componentId: number): void {\n this._groupsById = new Map((report.filterGroups ?? []).map((group) => [group.id, group]));\n\n const component = report.pages\n .flatMap((page) => page.components)\n .find((candidate) => candidate.id === componentId);\n\n this._filters = component?.filters ?? [];\n this._rebuildRows();\n }\n\n private _loadColumns(): void {\n this._reportData.componentColumns(this.report.id, this.component.id)\n .subscribe({\n next: (columns: ReportFilterableColumn[]) => {\n this._filterableColumns = columns ?? [];\n this._rebuildRows();\n this._cdRef.markForCheck();\n },\n error: (error) => {\n this.columnsError = error?.error?.message ?? 'Could not read the component columns';\n this._cdRef.markForCheck();\n },\n });\n }\n\n private _humanize(column: string): string {\n return column\n .replace(/[_\\-]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/\\b\\w/g, (character) => character.toUpperCase());\n }\n}\n","<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n {{ component.title || 'Component' }}\n </h1>\n <mat-dialog-content>\n <mat-tab-group [(selected)]=\"selectedTab\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Title\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"title\"\n name=\"title\">\n </mat-form-field>\n <div class=\"subheading-2\">\n Padding\n </div>\n <div class=\"geometry-row\">\n <mat-form-field>\n <mat-label>\n Top\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"0.05\"\n min=\"0\"\n [(ngModel)]=\"paddingTop\"\n name=\"paddingTop\">\n <span matTextSuffix>\n in\n </span>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Right\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"0.05\"\n min=\"0\"\n [(ngModel)]=\"paddingRight\"\n name=\"paddingRight\">\n <span matTextSuffix>\n in\n </span>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Bottom\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"0.05\"\n min=\"0\"\n [(ngModel)]=\"paddingBottom\"\n name=\"paddingBottom\">\n <span matTextSuffix>\n in\n </span>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Left\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"0.05\"\n min=\"0\"\n [(ngModel)]=\"paddingLeft\"\n name=\"paddingLeft\">\n <span matTextSuffix>\n in\n </span>\n </mat-form-field>\n </div>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"tab-body\">\n @if (columnsError) {\n <div class=\"filters-empty error\">\n {{ columnsError }}\n </div>\n } @else if (rows.length) {\n <!-- Every filterable column. Toggle where its control shows: in\n the report bar, on this component, both, or neither. The\n interface (date range vs value picker) follows the data. -->\n <table class=\"filter-table\">\n <thead>\n <tr>\n <th class=\"filter-col-name\">\n Filter\n </th>\n <th class=\"filter-col-type\">\n Type\n </th>\n <th class=\"filter-col-toggle\">\n Report bar\n </th>\n <th class=\"filter-col-toggle\">\n This component\n </th>\n </tr>\n </thead>\n <tbody>\n @for (row of rows; track row.column) {\n <tr>\n <td class=\"filter-col-name\">\n {{ row.label }}\n </td>\n <td class=\"filter-col-type\">\n {{ typeLabel(row.type) }}\n </td>\n <td class=\"filter-col-toggle\">\n <mat-slide-toggle\n [ngModel]=\"row.report\"\n (ngModelChange)=\"setExposure(row, 'report', $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n matTooltip=\"Show in the report bar\">\n </mat-slide-toggle>\n </td>\n <td class=\"filter-col-toggle\">\n <mat-slide-toggle\n [ngModel]=\"row.component\"\n (ngModelChange)=\"setExposure(row, 'component', $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n matTooltip=\"Show on this component\">\n </mat-slide-toggle>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <div class=\"filters-empty\">\n This component has no filterable columns yet — give it some SQL first.\n </div>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"SQL\"\n name=\"sql\">\n <div class=\"tab-body\">\n <pre class=\"code-block\">\n {{ component.sql }}\n </pre>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Config\"\n name=\"config\">\n <div class=\"tab-body\">\n <pre class=\"code-block\">\n {{ configJson }}\n </pre>\n </div>\n </mat-tab>\n </mat-tab-group>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions\n [save]=\"selectedTab === 'settings'\"\n [done]=\"selectedTab !== 'settings'\">\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>","import {\n ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output,\n} from '@angular/core';\nimport { ControlContainer, FormsModule, NgForm } from '@angular/forms';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatOption } from '@angular/material/core';\nimport { MatSelect } from '@angular/material/select';\n\nimport { guid } from '@firestitch/common';\nimport { FsFormModule } from '@firestitch/form';\n\n\n// Self-contained timezone picker for the report settings dialog. The IANA zone\n// list comes from the browser (Intl.supportedValuesOf), so the package carries no\n// dependency on any app timezone API. Defaults an empty value to the viewer's zone.\n@Component({\n selector: 'fs-ai-report-timezone-select',\n templateUrl: './timezone-select.component.html',\n styleUrls: ['./timezone-select.component.scss'],\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n MatFormField,\n MatLabel,\n MatSelect,\n MatOption,\n FormsModule,\n FsFormModule,\n ],\n})\nexport class TimezoneSelectComponent implements OnInit {\n\n @Input() public placeholder = 'Timezone';\n @Input() public required = false;\n @Input() public disabled = false;\n @Output() public timezoneChange = new EventEmitter<string>();\n\n @Input() public set timezone(value: string) {\n if (value && value !== this._timezone) {\n this._timezone = value;\n this.timezoneChange.emit(this.timezone);\n }\n }\n\n public get timezone(): string {\n return this._timezone;\n }\n\n public guid: string = guid();\n public timezones: string[] = [];\n\n private _browserTimezone: string = Intl.DateTimeFormat().resolvedOptions().timeZone;\n private _timezone: string = null;\n\n public ngOnInit(): void {\n this.timezones = this._supportedTimezones();\n\n if (!this.timezone) {\n this.timezone = this._browserTimezone;\n }\n }\n\n // The browser's IANA zone list where available; fall back to at least the\n // viewer's own zone so the control is never empty.\n private _supportedTimezones(): string[] {\n const intl = Intl as unknown as { supportedValuesOf?: (key: string) => string[] };\n\n return typeof intl.supportedValuesOf === 'function'\n ? intl.supportedValuesOf('timeZone')\n : [this._browserTimezone];\n }\n}\n","<mat-form-field class=\"full-width\">\n <mat-label>{{placeholder}}</mat-label>\n <mat-select\n [(ngModel)]=\"timezone\"\n [fsFormRequired]=\"required\"\n [disabled]=\"disabled\"\n name=\"timezone_select_{{ guid }}\">\n @for (item of timezones; track item) {\n <mat-option [value]=\"item\">{{ item }}</mat-option>\n }\n </mat-select>\n</mat-form-field>\n","import { format, parseISO } from 'date-fns';\n\n\n// Date-range defaults are stored as calendar-day strings (yyyy-MM-dd, no time,\n// no timezone) so the backend never shifts them; the date picker works in Date\n// objects. These two convert between the two forms — the only translation the\n// Filters tab needs for a fixed date range.\n\n// A stored yyyy-MM-dd boundary as a local Date for the picker, or null.\nexport function dateFromBound(value: string | null | undefined): Date | null {\n if (!value) {\n return null;\n }\n\n const date = parseISO(value.slice(0, 10));\n\n return isNaN(date.getTime()) ? null : date;\n}\n\n// A picked Date as a yyyy-MM-dd boundary for storage, or null. Uses the local\n// calendar day (format, not toISOString) so the boundary is the day the admin\n// picked, regardless of timezone.\nexport function dateToBound(value: Date | null | undefined): string | null {\n return value instanceof Date && !isNaN(value.getTime())\n ? format(value, 'yyyy-MM-dd')\n : null;\n}\n","import { ChangeDetectionStrategy, Component, DestroyRef, OnInit, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\n\nimport { MatButton } from '@angular/material/button';\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\nimport { MatFormField, MatLabel, MatHint, MatSuffix } from '@angular/material/form-field';\nimport { MatInput } from '@angular/material/input';\nimport { MatOption, MatSelect } from '@angular/material/select';\nimport { MatTabsModule } from '@angular/material/tabs';\n\nimport { FsAutocompleteChipsModule } from '@firestitch/autocomplete-chips';\nimport { FsDatePickerModule } from '@firestitch/datepicker';\nimport { FsDialogModule } from '@firestitch/dialog';\nimport { FsFormModule } from '@firestitch/form';\nimport { FsMessage, FsMessageModule } from '@firestitch/message';\nimport { FsPrompt } from '@firestitch/prompt';\nimport { FsTabsModule } from '@firestitch/tabs';\n\nimport { TimezoneSelectComponent } from '../../components/timezone-select/timezone-select.component';\n\nimport { Observable, forkJoin } from 'rxjs';\nimport { switchMap, tap } from 'rxjs/operators';\n\nimport { ReportData } from '../../data/report.data';\nimport {\n FilterGroupDefault,\n Report,\n ReportFilterGroup,\n} from '../../interfaces/report.interface';\nimport { DEFAULT_HEADING_SIZE } from '../../layout';\nimport { loadGroupOptions, matchOptions } from '../../report-filter-items';\nimport { dateFromBound, dateToBound } from './report-settings-default';\n\n\n// What the dialog hands back when it closes, so the page knows what happened\n// without sniffing magic strings. A dismissed dialog closes with `undefined`.\nexport interface ReportSettingsResult {\n action: 'saved' | 'deleted';\n}\n\n\n// One report-level filter in the Filters tab: its group, the inferred interface,\n// and an editable draft default. The draft fields used depend on the type\n// (dateRange → start/end Dates; select → values; keyword → text). `fetch` loads\n// the select options the same way the report bar does.\ninterface FilterDefaultRow {\n group: ReportFilterGroup;\n label: string;\n start: Date | null;\n end: Date | null;\n values: { name: string; value: unknown }[];\n value: string;\n fetch: (keyword?: string) => Observable<{ name: string; value: unknown }[]>;\n}\n\n\n// Report settings, in three tabs:\n// Settings — name + page setup (size, orientation, layout mode).\n// Styles — the report's typographic styles (sizes in POINTS, 1:1 with\n// PDF/PowerPoint); the Heading size to start.\n// Filters — the report-level filters and their DEFAULT values. A default\n// seeds the report bar on every open (for every viewer) but stays\n// user-changeable — it pre-fills the control, it doesn't lock it. This is the\n// fix for heavy reports opening blank and timing out: a default month +\n// organization scopes the landing page from the first load.\n@Component({\n templateUrl: './report-settings.component.html',\n styleUrls: ['./report-settings.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n FormsModule,\n FsFormModule,\n FsDialogModule,\n FsMessageModule,\n FsTabsModule,\n FsDatePickerModule,\n FsAutocompleteChipsModule,\n MatTabsModule,\n MatButton,\n MatDialogTitle,\n MatDialogContent,\n MatDialogActions,\n MatFormField,\n MatLabel,\n MatHint,\n MatSuffix,\n MatInput,\n MatSelect,\n MatOption,\n TimezoneSelectComponent,\n ],\n})\nexport class ReportSettingsComponent implements OnInit {\n\n public selectedTab = 'settings';\n\n public name = '';\n public pageSize: 'widescreen' | 'letter' = 'widescreen';\n public pageOrientation: 'landscape' | 'portrait' = 'landscape';\n public layout: 'freeform' | 'flow' = 'freeform';\n // Empty until the report has one; app-timezone-select then defaults it to the\n // viewer's browser zone (which Save persists, making the report's zone explicit).\n public timezone = '';\n public headingSize = DEFAULT_HEADING_SIZE;\n\n // The report-level filters and their editable default values (Filters tab).\n public readonly filterRows = signal<FilterDefaultRow[]>([]);\n\n private readonly _data: { report: Report } = inject(MAT_DIALOG_DATA);\n private readonly _dialogRef = inject<MatDialogRef<ReportSettingsComponent, ReportSettingsResult>>(MatDialogRef);\n private readonly _reportData = inject(ReportData);\n private readonly _message = inject(FsMessage);\n private readonly _prompt = inject(FsPrompt);\n private readonly _destroyRef = inject(DestroyRef);\n\n public ngOnInit(): void {\n const report = this._data.report;\n this.name = report.name;\n this.pageSize = report.pageSize;\n this.pageOrientation = report.pageOrientation;\n this.layout = report.layout ?? 'freeform';\n this.timezone = report.timezone ?? '';\n this.headingSize = report.config?.styles?.heading?.size ?? DEFAULT_HEADING_SIZE;\n\n this._buildFilterRows(report);\n }\n\n // Confirm and delete here, while the dialog is still open, then close with\n // a `deleted` result. The page reacts to the result; it no longer owns the\n // prompt or the API call.\n public delete(): void {\n this._prompt.confirm({\n title: 'Delete Report',\n template: `Delete \"${this._data.report.name}\"? This cannot be undone.`,\n })\n .pipe(\n switchMap(() => this._reportData.delete(this._data.report.id)),\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe(() => {\n this._message.success('Report deleted');\n this._dialogRef.close({ action: 'deleted' });\n });\n }\n\n public save = () => {\n const reportId = this._data.report.id;\n\n // Persist the report settings and each changed filter default together, so\n // the single Save covers all three tabs. The report reloads on the `saved`\n // result, re-seeding the bar from the new defaults.\n const settings$ = this._reportData.update(reportId, {\n name: this.name,\n pageSize: this.pageSize,\n pageOrientation: this.pageOrientation,\n layout: this.layout,\n timezone: this.timezone,\n styles: { heading: { size: this.headingSize } },\n });\n\n const defaults$ = this.filterRows()\n .filter((row) => this._defaultChanged(row))\n .map((row) => this._reportData.updateFilterGroup(reportId, row.group.id, {\n default: this._rowDefault(row),\n }));\n\n return forkJoin([settings$, ...defaults$])\n .pipe(\n tap(() => {\n this._message.success('Report settings saved');\n this._dialogRef.close({ action: 'saved' });\n }),\n );\n };\n\n // Build one editable row per report-level filter group (level report or both),\n // in bar order, seeding each draft from the group's stored default.\n private _buildFilterRows(report: Report): void {\n const reportId = report.id;\n\n const rows = (report.filterGroups ?? [])\n .filter((group) => group.level === 'report' || group.level === 'both')\n .sort((a, b) => a.order - b.order)\n .map((group): FilterDefaultRow => {\n const groupDefault = group.config?.default;\n\n return {\n group,\n label: group.label || group.filters?.[0]?.filterColumn || 'Filter',\n start: dateFromBound(groupDefault?.start),\n end: dateFromBound(groupDefault?.end),\n values: (groupDefault?.values ?? []).map((value) => ({ name: String(value), value })),\n value: groupDefault?.value ?? '',\n // fs-autocomplete-chips fetch: the group's distinct options, name-filtered.\n // Same loader the report bar uses, so the two never drift.\n fetch: (keyword?: string) =>\n matchOptions(loadGroupOptions(group, this._reportData, reportId), keyword),\n };\n });\n\n this.filterRows.set(rows);\n }\n\n // The draft default normalized to the wire shape for this row's type, or null\n // when empty (which clears the stored default).\n private _rowDefault(row: FilterDefaultRow): FilterGroupDefault | null {\n switch (row.group.type) {\n case 'dateRange': {\n const start = dateToBound(row.start);\n const end = dateToBound(row.end);\n\n return (start || end) ? { start: start ?? undefined, end: end ?? undefined } : null;\n }\n\n case 'select':\n return row.values.length ? { values: row.values.map((option) => option.value) } : null;\n\n case 'keyword':\n default: {\n const value = row.value.trim();\n\n return value ? { value } : null;\n }\n }\n }\n\n // Whether the row's draft differs from the group's stored default — only\n // changed rows are persisted on Save.\n private _defaultChanged(row: FilterDefaultRow): boolean {\n const before = JSON.stringify(this._normalize(row.group.config?.default ?? null));\n const after = JSON.stringify(this._normalize(this._rowDefault(row)));\n\n return before !== after;\n }\n\n // A stable comparison form: drop relative (not authored here) and undefined\n // keys so a no-op edit doesn't read as a change.\n private _normalize(value: FilterGroupDefault | null): FilterGroupDefault | null {\n if (!value) {\n return null;\n }\n\n const normalized: FilterGroupDefault = {};\n if (value.start) {\n normalized.start = value.start;\n }\n if (value.end) {\n normalized.end = value.end;\n }\n if (value.values?.length) {\n normalized.values = value.values;\n }\n if (value.value) {\n normalized.value = value.value;\n }\n if (value.relative) {\n normalized.relative = value.relative;\n }\n\n return Object.keys(normalized).length ? normalized : null;\n }\n}\n","<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n Report Settings\n </h1>\n <mat-dialog-content>\n <mat-tab-group [(selected)]=\"selectedTab\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"name\"\n name=\"name\"\n [fsFormRequired]=\"true\">\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Page Size\n </mat-label>\n <mat-select\n [(ngModel)]=\"pageSize\"\n name=\"pageSize\">\n <mat-option value=\"widescreen\">\n Widescreen (13.33\" × 7.5\")\n </mat-option>\n <mat-option value=\"letter\">\n Letter (11\" × 8.5\")\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Orientation\n </mat-label>\n <mat-select\n [(ngModel)]=\"pageOrientation\"\n name=\"pageOrientation\">\n <mat-option value=\"landscape\">\n Landscape\n </mat-option>\n <mat-option value=\"portrait\">\n Portrait\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Layout\n </mat-label>\n <mat-select\n [(ngModel)]=\"layout\"\n name=\"layout\">\n <mat-option value=\"freeform\">\n Freeform — position components anywhere on the page\n </mat-option>\n <mat-option value=\"flow\">\n Flow — components flow into rows by width %\n </mat-option>\n </mat-select>\n <mat-hint>\n Freeform is like PowerPoint; Flow is like a responsive dashboard.\n </mat-hint>\n </mat-form-field>\n <fs-ai-report-timezone-select [(timezone)]=\"timezone\"></fs-ai-report-timezone-select>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Styles\"\n name=\"styles\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Heading Size\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"1\"\n min=\"6\"\n max=\"96\"\n [(ngModel)]=\"headingSize\"\n name=\"headingSize\"\n [fsFormMin]=\"6\"\n [fsFormMax]=\"96\">\n <span matTextSuffix>\n pt\n </span>\n <mat-hint>\n Applies to component titles. Points map 1:1 to PDF and PowerPoint.\n </mat-hint>\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"fs-column tab-body\">\n @if (filterRows().length) {\n @for (row of filterRows(); track row.group.id) {\n @switch (row.group.type) {\n @case ('dateRange') {\n <div class=\"fs-row.gap-sm.align-center fs-flex\">\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Default From {{ row.label }}\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.start\"\n [name]=\"'start' + row.group.id\">\n </mat-form-field>\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Default To {{ row.label }}\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.end\"\n [name]=\"'end' + row.group.id\">\n </mat-form-field>\n </div>\n }\n @case ('select') {\n <fs-autocomplete-chips\n class=\"fs-flex\"\n [label]=\"'Default ' + row.label\"\n [fetch]=\"row.fetch\"\n [(ngModel)]=\"row.values\"\n [name]=\"'values' + row.group.id\"\n [multiple]=\"true\"\n [fetchOnFocus]=\"true\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n </fs-autocomplete-chips>\n }\n @default {\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Default {{ row.label }}\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"row.value\"\n [name]=\"'value' + row.group.id\">\n </mat-form-field>\n }\n }\n }\n } @else {\n <fs-message-info>\n This report has no report-level filters yet. Add a filter to a\n component (its settings → Filters) and show it in the report bar,\n then set its default here.\n </fs-message-info>\n }\n </div>\n </mat-tab>\n </mat-tab-group>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions>\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"delete()\">\n Delete\n </button>\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>","// The assembled report structure returned by GET /api/reports/:id — composed\n// server-side from the normalized tables (reports → report_pages →\n// report_components + report_filters, plus report_filter_groups). All keys are\n// camelCase; component `config` is the standard format the renderer maps to\n// ECharts options / FsList config.\n\n// Layout modes: Freeform = absolutely positioned components (drag anywhere);\n// Flow = components flow like rows, each taking flowWidth % of the page width.\nexport type ReportLayout = 'freeform' | 'flow';\n\nexport interface Report {\n id: number;\n name: string;\n pageSize: 'widescreen' | 'letter';\n pageOrientation: 'landscape' | 'portrait';\n layout: ReportLayout;\n // IANA timezone (e.g. America/New_York) anchoring date filtering + chart date\n // bucketing. null falls back to the account zone then UTC (resolved server-side).\n timezone: string | null;\n // Report-level config: typographic styles, etc. (camelCase JSON column).\n config: ReportConfig;\n // Canvas dimensions in INCHES (the report's native unit — PDFs and\n // PowerPoint are inch-based, so exports are dimensionally exact).\n pageWidth: number;\n pageHeight: number;\n pages: ReportPage[];\n filterGroups: ReportFilterGroup[];\n}\n\n// Report-level styling. Sizes are in POINTS (1/72\") — the report's typography\n// maps 1:1 to PDF (72pt/in) and PowerPoint (point font sizes), so a point\n// value is dimensionally exact on screen and in every export.\nexport interface ReportConfig {\n styles?: ReportStyles;\n}\n\nexport interface ReportStyles {\n heading?: { size?: number };\n}\n\n// Content padding around a component's body, in INCHES (the geometry unit).\nexport interface ComponentPadding {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n}\n\nexport interface ReportPage {\n id: number;\n name: string | null;\n order: number;\n components: ReportComponent[];\n}\n\nexport type ReportComponentType = 'chart' | 'list' | 'kpi';\n\nexport interface ReportComponent {\n id: number;\n type: ReportComponentType;\n title: string | null;\n // Geometry in INCHES. Freeform: absolute position on the page canvas.\n // Flow: only flowWidth/order apply; x/y are remembered for a switch back to\n // freeform.\n x: number;\n y: number;\n w: number;\n h: number;\n // Height mode, DERIVED from type server-side (not stored, read-only): lists\n // and KPI tiles are auto (the box sizes to its content, `h` ignored); charts\n // are always fixed (use `h`) so they fit the box and never overflow.\n autoHeight: boolean;\n // Flow layout: % of the page content width this component takes.\n flowWidth: number;\n // Flow layout ordering.\n order: number;\n sql: string | null;\n config: ChartConfig & ListConfig & KpiConfig & ComponentLayoutConfig & Record<string, unknown>;\n filters: ReportFilter[];\n}\n\n// Cross-type layout/style keys carried in a component's config (alongside the\n// type-specific chart/list/kpi keys).\nexport interface ComponentLayoutConfig {\n padding?: ComponentPadding;\n}\n\n// Where a chart's legend sits relative to the plot, or 'hidden' to drop it.\nexport type LegendPosition = 'top' | 'bottom' | 'left' | 'right' | 'hidden';\n\nexport type ChartGranularity = 'day' | 'week' | 'month' | 'quarter' | 'year';\n\n// The runtime Frequency control's choices — re-buckets every time-series chart\n// at view time, overriding each chart's authored granularity. 'year' reads as\n// \"Annually\" in the control.\nexport const FREQUENCY_OPTIONS: { value: ChartGranularity; name: string }[] = [\n { value: 'day', name: 'Day' },\n { value: 'week', name: 'Week' },\n { value: 'month', name: 'Month' },\n { value: 'quarter', name: 'Quarter' },\n { value: 'year', name: 'Annually' },\n];\n\nexport interface ChartConfig {\n chartType?: 'bar' | 'line' | 'area' | 'pie' | 'donut';\n // For kind 'time', the server buckets the raw datetime column to `granularity`\n // in the report's timezone (the SQL exposes the raw column, unbucketed).\n xAxis?: { column: string; kind?: 'category' | 'time'; granularity?: ChartGranularity; label?: string };\n measures?: ChartMeasure[];\n splitBy?: { column: string; label?: string };\n // Single-dimension bar charts only: color each bar by its own category and\n // show a legend, WITHOUT splitting into multiple series (which slivers the\n // bars). v1 expects colorBy.column === xAxis.column. Ignored when splitBy is\n // set or the chart isn't a bar chart.\n colorBy?: { column: string; label?: string };\n orientation?: 'vertical' | 'horizontal';\n stacked?: boolean;\n legend?: LegendPosition;\n sort?: ReportSort;\n limit?: number;\n}\n\nexport interface ChartMeasure {\n column: string;\n aggregation?: 'sum' | 'count' | 'avg' | 'min' | 'max';\n label?: string;\n format?: 'number' | 'percent' | 'currency';\n}\n\nexport interface ListConfig {\n columns?: { column: string; label?: string; format?: 'date' | 'number' }[];\n sort?: ReportSort;\n pageSize?: number;\n}\n\nexport interface KpiConfig {\n measure?: ChartMeasure;\n}\n\nexport interface ReportSort {\n column: string;\n direction?: 'asc' | 'desc';\n}\n\nexport type ReportFilterType = 'dateRange' | 'select' | 'keyword';\n\n// Where a filter group's control is exposed. A group can be shown on its\n// components, in the report bar, or BOTH at once (the two are independent\n// toggles in the UI); a column with neither exposed simply has no filter.\nexport type ReportFilterLevel = 'component' | 'report' | 'both';\n\n// One filterable output column of a component's SQL, with the filter interface\n// INFERRED from its data (the human never picks the interface — it follows the\n// column's type). Drives the Filters tab listing.\nexport interface ReportFilterableColumn {\n column: string;\n type: ReportFilterType;\n}\n\n// Ground truth: one filterable output column ON one component's SQL. Always a\n// member of a filter group — the unit that links equivalent filters across\n// components and decides where the control renders (component vs report bar).\nexport interface ReportFilter {\n id: number;\n componentId: number;\n filterGroupId: number;\n filterColumn: string;\n label: string | null;\n enabled: boolean;\n hasOptions: boolean;\n config: Record<string, unknown>;\n}\n\nexport interface ReportFilterGroup {\n id: number;\n label: string | null;\n type: ReportFilterType;\n level: ReportFilterLevel;\n order: number;\n config: { default?: FilterGroupDefault } & Record<string, unknown>;\n filters: ReportFilter[];\n}\n\n// A filter group's authored default — the value that seeds the report bar on\n// every open. Shape follows the group's type: dateRange uses start/end (a fixed\n// calendar-day range) or a relative preset; select uses values; keyword uses\n// value.\nexport interface FilterGroupDefault {\n relative?: string; // dateRange relative preset, e.g. last12Months, yearToDate\n start?: string; // dateRange fixed start (yyyy-MM-dd)\n end?: string; // dateRange fixed end (yyyy-MM-dd)\n values?: unknown[]; // select default picked values\n value?: string; // keyword default text\n}\n\n// The session value of a filter group (never persisted): shape depends on the\n// group's type.\nexport interface FilterGroupValue {\n start?: Date | string | null; // dateRange\n end?: Date | string | null; // dateRange\n values?: unknown[]; // select\n value?: string; // keyword\n}\n\n// One resolved filter sent with a component's data request.\nexport interface ResolvedFilterValue {\n filterId: number;\n start?: string;\n end?: string;\n values?: unknown[];\n value?: string;\n}\n\n// Per-component interaction state sent with the data request: lists send\n// sort/paging; time-series charts send the viewer's chosen Frequency, which\n// overrides the authored granularity for that request only.\nexport interface ComponentDataState {\n sort?: ReportSort;\n page?: number;\n pageSize?: number;\n frequency?: ChartGranularity;\n}\n\nexport interface ComponentData {\n columns: string[];\n rows: Record<string, unknown>[];\n paging?: { total: number; page: number; pageSize: number };\n truncated: boolean;\n // The effective time bucket the rows were grouped into (after any Frequency\n // override), or null for a non-time axis. Drives the compact x-axis labels.\n granularity?: ChartGranularity | null;\n}\n\nexport interface ReportListItem {\n id: number;\n name: string;\n}\n\n// The chat turn flags this context's backend adds (Reports\\AiView).\nexport interface ReportChatResponse {\n reportChanged?: boolean;\n reportRenamed?: boolean;\n}\n","import { Injectable, inject } from '@angular/core';\n\nimport { Observable, forkJoin, map, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\n\nimport { format } from 'date-fns';\n\nimport { ReportData } from '../data/report.data';\nimport {\n ComponentData,\n FREQUENCY_OPTIONS,\n Report,\n ReportComponent,\n ReportPage,\n} from '../interfaces/report.interface';\nimport { ReportFilterStateService } from '../services/report-filter-state.service';\n\n\nexport interface CollectedComponent {\n component: ReportComponent;\n data: ComponentData | null; // null = its query failed; exports show a note\n}\n\nexport interface CollectedPage {\n page: ReportPage;\n components: CollectedComponent[];\n}\n\nexport interface CollectedReport {\n report: Report;\n pages: CollectedPage[];\n // Human-readable lines describing the active filters, for the title slide/page.\n filterSummary: string[];\n}\n\n// Rows fetched for a list component's export table — enough to fill a\n// slide/page table; the cap note covers the rest.\nconst LIST_EXPORT_ROWS = 100;\n\n// Gathers everything an export needs: every component's data across ALL pages\n// (the canvas only renders the active page, so exports can't scrape the\n// screen), fetched fresh with the viewer's current filter state. One failed\n// component degrades to a note in the deck, never a failed export.\n@Injectable()\nexport class ReportExportCollectorService {\n\n private _reportData = inject(ReportData);\n private _filterState = inject(ReportFilterStateService);\n\n public collect(report: Report): Observable<CollectedReport> {\n const requests: Observable<CollectedComponent>[] = [];\n const slots: { pageIndex: number }[] = [];\n\n report.pages.forEach((page, pageIndex) => {\n for (const component of page.components) {\n slots.push({ pageIndex });\n requests.push(this._componentData(report, component));\n }\n });\n\n const all$ = requests.length ? forkJoin(requests) : of([] as CollectedComponent[]);\n\n return all$\n .pipe(\n map((collected) => {\n const pages: CollectedPage[] = report.pages.map((page) => ({ page, components: [] }));\n collected.forEach((item, index) => {\n pages[slots[index].pageIndex].components.push(item);\n });\n\n return {\n report,\n pages,\n filterSummary: this._filterSummary(report),\n };\n }),\n );\n }\n\n private _componentData(report: Report, component: ReportComponent): Observable<CollectedComponent> {\n const filters = this._filterState.resolveForComponent(component);\n // A time-series chart carries the viewer's Frequency override so the export\n // re-buckets exactly as the screen does; lists carry their export paging.\n const frequency = this._filterState.frequency();\n const isTimeSeries = component.type === 'chart' && component.config?.xAxis?.kind === 'time';\n const state = component.type === 'list'\n ? { page: 1, pageSize: LIST_EXPORT_ROWS }\n : (isTimeSeries && frequency ? { frequency } : {});\n\n return this._reportData.componentData(report.id, component.id, filters, state)\n .pipe(\n map((data: ComponentData) => ({ component, data })),\n catchError(() => of({ component, data: null })),\n );\n }\n\n // \"Report Period: Jun 12, 2025 – Jun 12, 2026\", \"Organization: A, B\" — one\n // line per filter group that has an active session value.\n private _filterSummary(report: Report): string[] {\n const lines: string[] = [];\n\n for (const group of report.filterGroups ?? []) {\n const value = this._filterState.value(group.id);\n if (!value) {\n continue;\n }\n\n const label = group.label || 'Filter';\n\n if (value.start || value.end) {\n lines.push(`${label}: ${this._date(value.start)} – ${this._date(value.end)}`);\n } else if (value.values?.length) {\n lines.push(`${label}: ${value.values.map((item) => String(item)).join(', ')}`);\n } else if (value.value?.trim()) {\n lines.push(`${label}: \"${value.value.trim()}\"`);\n }\n }\n\n const frequency = this._filterState.frequency();\n if (frequency) {\n const option = FREQUENCY_OPTIONS.find((item) => item.value === frequency);\n lines.push(`Frequency: ${option?.name ?? frequency}`);\n }\n\n return lines;\n }\n\n private _date(value: Date | string | null | undefined): string {\n if (!value) {\n return '…';\n }\n\n const date = value instanceof Date ? value : new Date(value);\n\n return Number.isNaN(date.getTime()) ? String(value) : format(date, 'MMM d, yyyy');\n }\n}\n","import { ComponentData, ReportComponent } from '../interfaces/report.interface';\nimport { buildChartOption } from '../option-builder';\n\n\n// Renders a chart to a PNG data URL WITHOUT it being on screen — the PDF\n// export needs every page's charts, but the canvas only renders the active\n// page. ECharts happily initializes against a detached element when given\n// explicit pixel dimensions; animations are disabled so getDataURL is\n// complete synchronously after setOption.\nexport async function renderChartImage(\n component: ReportComponent,\n data: ComponentData,\n width: number,\n height: number,\n pixelRatio = 3,\n): Promise<string> {\n // The same tree-shaken echarts build + 'report' theme the live canvas uses.\n const echarts = (await import('../theme/echarts')).default;\n\n const host = document.createElement('div');\n host.style.width = `${width}px`;\n host.style.height = `${height}px`;\n\n const chart = echarts.init(host, 'report', {\n renderer: 'canvas',\n width,\n height,\n });\n\n try {\n chart.setOption({\n ...buildChartOption(component, data),\n animation: false,\n });\n\n return chart.getDataURL({\n type: 'png',\n pixelRatio,\n backgroundColor: '#ffffff',\n });\n } finally {\n chart.dispose();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { format } from 'date-fns';\n\nimport { formatMeasureValue } from '../format';\nimport {\n ComponentData,\n KpiConfig,\n ListConfig,\n ReportComponent,\n} from '../interfaces/report.interface'; // ComponentData used in method signatures below\nimport { ComponentGeometry, pageGeometry } from '../layout';\nimport { renderChartImage } from './offscreen-chart';\nimport { CollectedComponent, CollectedReport } from './report-export-collector.service';\n\n\n// Inches → points (the PDF unit).\nconst PT = 72;\n\n// Component title strip height, points.\nconst TITLE_H = 18;\n// Approximate table row height, points — drives the rows-that-fit cap.\nconst TABLE_ROW_H = 16;\n\n// Builds the PDF client-side with jspdf. The report's unit is inches and PDFs\n// are points at exactly 72/inch, so each report page becomes one PDF page of\n// the exact physical size and components land at their precise positions.\n// Charts are rendered through an offscreen ECharts instance at 3× pixel\n// ratio — pixel-identical to the screen, crisp at print size — and tables are\n// drawn with jspdf-autotable. Both libraries load lazily into their own chunks.\n@Injectable()\nexport class ReportPdfService {\n\n public async export(collected: CollectedReport): Promise<void> {\n const { jsPDF } = await import('jspdf');\n const autoTable = (await import('jspdf-autotable')).default;\n\n const report = collected.report;\n const pageW = report.pageWidth * PT;\n const pageH = report.pageHeight * PT;\n\n const doc = new jsPDF({\n orientation: pageW >= pageH ? 'landscape' : 'portrait',\n unit: 'pt',\n format: [pageW, pageH],\n });\n\n this._titlePage(doc, collected, pageW, pageH);\n\n for (const collectedPage of collected.pages) {\n doc.addPage([pageW, pageH], pageW >= pageH ? 'landscape' : 'portrait');\n const geometry = pageGeometry(report, collectedPage.page);\n\n for (const item of collectedPage.components) {\n await this._renderComponent(doc, autoTable, item, geometry.get(item.component.id));\n }\n }\n\n doc.save(`${this._slug(report.name)}.pdf`);\n }\n\n private _titlePage(doc: any, collected: CollectedReport, pageW: number, pageH: number): void {\n doc.setFont('helvetica', 'bold');\n doc.setFontSize(28);\n doc.setTextColor('#1f2933');\n doc.text(collected.report.name, 40, pageH * 0.35);\n\n doc.setFont('helvetica', 'normal');\n doc.setFontSize(11);\n doc.setTextColor('#52606d');\n\n const lines = [\n format(new Date(), 'MMMM d, yyyy'),\n ...collected.filterSummary,\n ];\n doc.text(lines, 40, pageH * 0.35 + 26);\n }\n\n private async _renderComponent(doc: any, autoTable: any, item: CollectedComponent, geometry?: ComponentGeometry): Promise<void> {\n const component = item.component;\n // Geometry arrives in inches (flow layout pre-resolved); the PDF draws in\n // points.\n const inches = geometry ?? component;\n const x = inches.x * PT;\n const y = inches.y * PT;\n const w = inches.w * PT;\n const h = inches.h * PT;\n\n if (component.title) {\n doc.setFont('helvetica', 'bold');\n doc.setFontSize(9);\n doc.setTextColor('#1f2933');\n doc.text(component.title, x, y + 10, { maxWidth: w });\n }\n\n const bodyY = y + TITLE_H;\n const bodyH = Math.max(20, h - TITLE_H);\n\n if (!item.data || !item.data.rows?.length) {\n doc.setFont('helvetica', 'italic');\n doc.setFontSize(9);\n doc.setTextColor('#7b8794');\n doc.text(item.data ? 'No data' : 'Data unavailable', x + w / 2, bodyY + bodyH / 2, { align: 'center' });\n\n return;\n }\n\n switch (component.type) {\n case 'chart': {\n const image = await renderChartImage(component, item.data, w, bodyH);\n doc.addImage(image, 'PNG', x, bodyY, w, bodyH);\n break;\n }\n case 'list':\n this._renderTable(doc, autoTable, component, item.data, x, bodyY, w, bodyH);\n break;\n case 'kpi':\n this._renderKpi(doc, component, item.data, x, bodyY, w, bodyH);\n break;\n }\n }\n\n private _renderTable(\n doc: any,\n autoTable: any,\n component: ReportComponent,\n data: ComponentData,\n x: number, y: number, w: number, h: number,\n ): void {\n const config = component.config as ListConfig;\n const columns = config.columns?.length\n ? config.columns\n : data.columns.map((column) => ({ column, label: column }));\n\n const cap = Math.max(2, Math.floor(h / TABLE_ROW_H) - 1);\n const rows = data.rows.slice(0, cap);\n const remaining = (data.paging?.total ?? data.rows.length) - rows.length;\n\n const body = rows.map((row) => columns.map((column) => this._cell(row[column.column], column.format)));\n\n if (remaining > 0) {\n body.push([`… ${remaining} more row(s) — use the component's CSV export for the full dataset`]);\n }\n\n autoTable(doc, {\n head: [columns.map((column) => column.label || column.column)],\n body,\n startY: y,\n margin: { left: x },\n tableWidth: w,\n styles: { fontSize: 8, cellPadding: 3, textColor: '#1f2933' },\n headStyles: { fillColor: '#4e79a7', textColor: '#ffffff', fontStyle: 'bold' },\n alternateRowStyles: { fillColor: '#f5f7fa' },\n theme: 'grid',\n });\n }\n\n private _renderKpi(\n doc: any,\n component: ReportComponent,\n data: ComponentData,\n x: number, y: number, w: number, h: number,\n ): void {\n const config = component.config as KpiConfig;\n const row = data.rows[0] ?? {};\n const column = config.measure?.column ?? Object.keys(row)[0];\n const value = formatMeasureValue(row[column], config.measure?.format);\n\n doc.setFont('helvetica', 'bold');\n doc.setFontSize(26);\n doc.setTextColor('#1f2933');\n doc.text(value, x + w / 2, y + h / 2, { align: 'center' });\n\n if (config.measure?.label) {\n doc.setFont('helvetica', 'normal');\n doc.setFontSize(9);\n doc.setTextColor('#7b8794');\n doc.text(config.measure.label, x + w / 2, y + h / 2 + 16, { align: 'center' });\n }\n }\n\n private _cell(value: unknown, columnFormat?: string): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (columnFormat === 'date') {\n const date = new Date(String(value));\n\n return Number.isNaN(date.getTime()) ? String(value) : format(date, 'MMM d, yyyy');\n }\n\n if (columnFormat === 'number') {\n return formatMeasureValue(value, 'number');\n }\n\n return String(value);\n }\n\n private _slug(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'report';\n }\n}\n","// The report chart palette — one definition shared by the ECharts theme (on\n// screen), the PowerPoint export's native chart colors, and the PDF export,\n// so a series keeps its color across every medium.\nexport const REPORT_CHART_COLORS = [\n '4e79a7', 'f28e2b', 'e15759', '76b7b2', '59a14f',\n 'edc948', 'b07aa1', 'ff9da7', '9c755f', 'bab0ac',\n];\n\n// CSS-hex form for ECharts.\nexport const REPORT_CHART_COLORS_CSS = REPORT_CHART_COLORS.map((color) => `#${color}`);\n","import { Injectable } from '@angular/core';\n\nimport { format } from 'date-fns';\n\nimport { formatMeasureValue } from '../format';\nimport {\n ChartConfig,\n ComponentData,\n LegendPosition,\n ListConfig,\n KpiConfig,\n ReportComponent,\n} from '../interfaces/report.interface';\nimport { ComponentGeometry, pageGeometry } from '../layout';\nimport { extractChartSeries, formatPeriodLabel, isColorBy, resolveLegendPosition, spansMultipleYears } from '../option-builder';\nimport { REPORT_CHART_COLORS } from '../theme/palette';\nimport { CollectedComponent, CollectedReport } from './report-export-collector.service';\n\n\n// Component title strip height on the slide, inches.\nconst TITLE_H = 0.28;\n// Approximate table row height, inches — drives the rows-that-fit cap.\nconst TABLE_ROW_H = 0.26;\n\n// Our legend positions mapped to pptxgenjs's single-letter legendPos codes.\n// 'hidden' has no slot — showLegend is turned off instead — so it falls back\n// to top.\nconst PPTX_LEGEND_POS: Record<LegendPosition, 't' | 'b' | 'l' | 'r'> = {\n top: 't',\n bottom: 'b',\n left: 'l',\n right: 'r',\n hidden: 't',\n};\n\n// Builds the PowerPoint deck client-side with pptxgenjs. Charts are NATIVE\n// editable PowerPoint charts (slide.addChart writes real chart XML with an\n// embedded data workbook — \"Edit Data\" works), never images. The page IS the\n// slide: the report's unit is inches — exactly PowerPoint's unit — so the\n// layout and every component position transfer with no conversion at all.\n// pptxgenjs is loaded lazily so it lives in its own webpack chunk.\n@Injectable()\nexport class ReportPptxService {\n\n public async export(collected: CollectedReport): Promise<void> {\n const PptxGenJS = (await import('pptxgenjs')).default;\n\n const report = collected.report;\n const pageW = report.pageWidth;\n const pageH = report.pageHeight;\n\n const pptx = new PptxGenJS();\n pptx.defineLayout({ name: 'REPORT', width: pageW, height: pageH });\n pptx.layout = 'REPORT';\n pptx.title = report.name;\n\n this._titleSlide(pptx, collected, pageW, pageH);\n\n for (const collectedPage of collected.pages) {\n const slide = pptx.addSlide();\n const geometry = pageGeometry(report, collectedPage.page);\n\n for (const item of collectedPage.components) {\n this._renderComponent(pptx, slide, item, geometry.get(item.component.id));\n }\n }\n\n await pptx.writeFile({ fileName: `${this._slug(report.name)}.pptx` });\n }\n\n private _titleSlide(pptx: any, collected: CollectedReport, pageW: number, pageH: number): void {\n const slide = pptx.addSlide();\n\n slide.addText(collected.report.name, {\n x: 0.5, y: pageH * 0.3, w: pageW - 1, h: 0.8,\n fontSize: 30, bold: true, color: '1F2933',\n });\n\n const lines = [\n format(new Date(), 'MMMM d, yyyy'),\n ...collected.filterSummary,\n ];\n\n slide.addText(lines.join('\\n'), {\n x: 0.5, y: pageH * 0.3 + 0.9, w: pageW - 1, h: Math.max(0.4, lines.length * 0.25),\n fontSize: 12, color: '52606D',\n });\n }\n\n private _renderComponent(pptx: any, slide: any, item: CollectedComponent, geometry?: ComponentGeometry): void {\n const component = item.component;\n // Geometry is in inches — PowerPoint's native unit (flow layout arrives\n // pre-resolved into rows by pageGeometry).\n const { x, y, w, h } = geometry ?? component;\n\n if (component.title) {\n slide.addText(component.title, {\n x, y, w, h: TITLE_H,\n fontSize: 10, bold: true, color: '1F2933', valign: 'top',\n });\n }\n\n const bodyY = y + TITLE_H;\n const bodyH = Math.max(0.3, h - TITLE_H);\n\n if (!item.data || !item.data.rows?.length) {\n slide.addText(item.data ? 'No data' : 'Data unavailable', {\n x, y: bodyY, w, h: bodyH,\n fontSize: 10, italic: true, color: '7B8794', align: 'center', valign: 'middle',\n });\n\n return;\n }\n\n switch (component.type) {\n case 'chart':\n this._renderChart(pptx, slide, component, item.data, x, bodyY, w, bodyH);\n break;\n case 'list':\n this._renderTable(slide, component, item.data, x, bodyY, w, bodyH);\n break;\n case 'kpi':\n this._renderKpi(slide, component, item.data, x, bodyY, w, bodyH);\n break;\n }\n }\n\n private _renderChart(\n pptx: any,\n slide: any,\n component: ReportComponent,\n data: ComponentData,\n x: number, y: number, w: number, h: number,\n ): void {\n const config = component.config as ChartConfig;\n const chartType = config.chartType ?? 'bar';\n const extracted = extractChartSeries(component, data);\n\n const typeMap: Record<string, any> = {\n bar: pptx.ChartType.bar,\n line: pptx.ChartType.line,\n area: pptx.ChartType.area,\n pie: pptx.ChartType.pie,\n donut: pptx.ChartType.doughnut,\n };\n\n const pie = chartType === 'pie' || chartType === 'donut';\n const colorBy = isColorBy(config);\n\n // Compact period labels match the on-screen axis (year only when the data\n // spans years); PowerPoint can't do a styled second line, so it's inline.\n const granularity = data.granularity;\n const labels = granularity\n ? extracted.categories.map((category) =>\n formatPeriodLabel(category, granularity, spansMultipleYears(extracted.categories)))\n : extracted.categories;\n\n // Native chart data: one entry per series (pie charts take exactly one).\n // colorBy emits one series per category for the on-screen overlap; PowerPoint\n // has no equivalent overlap, so collapse them back into a single series (each\n // category's value sits at its own slot) — one full-width bar per category —\n // rather than letting PowerPoint cluster them into slivers.\n const chartData = colorBy\n ? [{\n name: config.measures?.[0]?.label ?? config.colorBy?.label ?? '',\n labels,\n values: extracted.categories.map((_, index) => extracted.series[index]?.values[index] ?? 0),\n }]\n : (pie ? extracted.series.slice(0, 1) : extracted.series)\n .map((series) => ({\n name: series.name,\n labels,\n values: series.values.map((value) => value ?? 0),\n }));\n\n // A single-series colorBy chart can't carry a per-category legend in a native\n // PowerPoint bar chart; the category axis labels identify each bar instead.\n const legendPosition = colorBy\n ? 'hidden'\n : resolveLegendPosition(config, extracted.series.length);\n\n slide.addChart(typeMap[chartType], chartData, {\n x, y, w, h,\n chartColors: REPORT_CHART_COLORS,\n showLegend: legendPosition !== 'hidden',\n legendPos: PPTX_LEGEND_POS[legendPosition],\n legendFontSize: 9,\n barDir: config.orientation === 'horizontal' ? 'bar' : 'col',\n barGrouping: config.stacked ? 'stacked' : 'clustered',\n holeSize: chartType === 'donut' ? 55 : undefined,\n catAxisLabelFontSize: 9,\n valAxisLabelFontSize: 9,\n showCatAxisTitle: !!config.xAxis?.label,\n catAxisTitle: config.xAxis?.label,\n catAxisTitleFontSize: 10,\n showValAxisTitle: !!config.measures?.[0]?.label && !pie,\n valAxisTitle: config.measures?.[0]?.label,\n valAxisTitleFontSize: 10,\n dataBorder: { pt: 0, color: 'FFFFFF' },\n });\n }\n\n private _renderTable(\n slide: any,\n component: ReportComponent,\n data: ComponentData,\n x: number, y: number, w: number, h: number,\n ): void {\n const config = component.config as ListConfig;\n const columns = config.columns?.length\n ? config.columns\n : data.columns.map((column) => ({ column, label: column }));\n\n const cap = Math.max(2, Math.floor(h / TABLE_ROW_H) - 1);\n const rows = data.rows.slice(0, cap);\n const remaining = (data.paging?.total ?? data.rows.length) - rows.length;\n\n const header = columns.map((column) => ({\n text: column.label || column.column,\n options: { bold: true, color: 'FFFFFF', fill: { color: '4E79A7' } },\n }));\n\n const body = rows.map((row) => columns.map((column) => ({\n text: this._cell(row[column.column], column.format),\n options: {},\n })));\n\n if (remaining > 0) {\n body.push([{\n text: `… ${remaining} more row(s) — use the component's CSV export for the full dataset`,\n options: { colspan: columns.length, italic: true, color: '7B8794' } as any,\n }]);\n }\n\n slide.addTable([header, ...body], {\n x, y, w,\n fontSize: 9,\n color: '1F2933',\n border: { type: 'solid', pt: 0.5, color: 'E4E7EB' },\n autoPage: false,\n rowH: TABLE_ROW_H,\n valign: 'middle',\n });\n }\n\n private _renderKpi(\n slide: any,\n component: ReportComponent,\n data: ComponentData,\n x: number, y: number, w: number, h: number,\n ): void {\n const config = component.config as KpiConfig;\n const row = data.rows[0] ?? {};\n const column = config.measure?.column ?? Object.keys(row)[0];\n const value = formatMeasureValue(row[column], config.measure?.format);\n\n slide.addText([\n { text: value, options: { fontSize: 28, bold: true, color: '1F2933', breakLine: true } },\n { text: config.measure?.label ?? '', options: { fontSize: 10, color: '7B8794' } },\n ], {\n x, y, w, h,\n align: 'center',\n valign: 'middle',\n });\n }\n\n private _cell(value: unknown, columnFormat?: string): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (columnFormat === 'date') {\n const date = new Date(String(value));\n\n return Number.isNaN(date.getTime()) ? String(value) : format(date, 'MMM d, yyyy');\n }\n\n if (columnFormat === 'number') {\n return formatMeasureValue(value, 'number');\n }\n\n return String(value);\n }\n\n private _slug(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'report';\n }\n}\n","import { Injectable, inject } from '@angular/core';\n\nimport { BehaviorSubject, Observable, of } from 'rxjs';\nimport { map, tap } from 'rxjs/operators';\n\nimport { ReportData } from '../data/report.data';\nimport { ReportListItem } from '../interfaces/report.interface';\n\n\n// Holds the report list in memory so the picker doesn't hit the API on every\n// focus. Loaded once when the page opens; create/rename/delete keep the cache\n// in sync.\n@Injectable({\n providedIn: 'root',\n})\nexport class ReportService {\n\n private _reportData = inject(ReportData);\n\n private _reports$ = new BehaviorSubject<ReportListItem[]>([]);\n\n public get reports$(): Observable<ReportListItem[]> {\n return this._reports$.asObservable();\n }\n\n public load(): Observable<ReportListItem[]> {\n return this._reportData.reports()\n .pipe(\n tap((reports: ReportListItem[]) => this._reports$.next(reports ?? [])),\n );\n }\n\n // Filters the cached list locally — what the autocomplete's [fetch] calls.\n public filter(keyword: string): Observable<ReportListItem[]> {\n const term = (keyword ?? '').trim().toLowerCase();\n const reports = this._reports$.getValue();\n\n if (!term) {\n return of(reports);\n }\n\n return of(reports.filter((report) => report.name.toLowerCase().includes(term)));\n }\n\n public create(name: string): Observable<ReportListItem> {\n return this._reportData.create(name)\n .pipe(\n tap((report: ReportListItem) => {\n this._reports$.next([...this._reports$.getValue(), report]);\n }),\n );\n }\n\n public rename(reportId: number, name: string): Observable<ReportListItem> {\n return this._reportData.rename(reportId, name)\n .pipe(\n tap((report: ReportListItem) => {\n this._reports$.next(\n this._reports$.getValue()\n .map((existing) => (existing.id === report.id ? report : existing)),\n );\n }),\n );\n }\n\n public delete(reportId: number): Observable<void> {\n return this._reportData.delete(reportId)\n .pipe(\n tap(() => {\n this._reports$.next(\n this._reports$.getValue().filter((report) => report.id !== reportId),\n );\n }),\n map(() => undefined),\n );\n }\n}\n","import {\n CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Component,\n DestroyRef, ElementRef, NgZone, ViewChild, inject,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIcon } from '@angular/material/icon';\n\nimport { FsAutocompleteChipsModule } from '@firestitch/autocomplete-chips';\nimport { FilterConfig, FsFilterModule, ItemType } from '@firestitch/filter';\nimport { FsMenuModule } from '@firestitch/menu';\nimport { FsProcess } from '@firestitch/process';\nimport { FsPrompt } from '@firestitch/prompt';\n\nimport { from } from 'rxjs';\nimport { finalize, switchMap } from 'rxjs/operators';\n\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { provideEchartsCore } from 'ngx-echarts';\n\nimport { FsAiChatComponent, FsAiChatResponse } from '@firestitch/ai';\n\nimport { ReportCanvasComponent } from '../../components/report-canvas/report-canvas.component';\nimport { ReportData } from '../../data/report.data';\nimport { ComponentSettingsComponent } from '../../dialogs/component-settings/component-settings.component';\nimport { ReportSettingsComponent, ReportSettingsResult } from '../../dialogs/report-settings/report-settings.component';\nimport { ReportExportCollectorService } from '../../export/report-export-collector.service';\nimport { ReportPdfService } from '../../export/report-pdf.service';\nimport { ReportPptxService } from '../../export/report-pptx.service';\nimport {\n ChartGranularity, FREQUENCY_OPTIONS, Report,\n ReportComponent as ReportComponentModel, ReportFilterGroup, ReportListItem,\n} from '../../interfaces/report.interface';\nimport { filterItemForGroup, groupValuesFromQuery } from '../../report-filter-items';\nimport { ReportFilterStateService } from '../../services/report-filter-state.service';\nimport { ReportService } from '../../services/report.service';\n\n\n// fs-filter query key for the runtime Frequency control (a render-layer bucket\n// override, not a filter group — so it's read straight off the query).\nconst FREQUENCY_ITEM = 'frequency';\n\n// The Reports page: AI chat on the left, the report canvas on the right —\n// a split-pane layout; the viewer is our own canvas (no iframe, no embed URLs).\n// The chat is always scoped to the selected report; its id rides on every\n// turn via [requestData].\n@Component({\n templateUrl: './report.component.html',\n styleUrls: ['./report.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n providers: [\n // Session filter state is per-open-report-page, not app-global; the export\n // services resolve filters through it, so they live at the same level.\n ReportFilterStateService,\n ReportExportCollectorService,\n ReportPptxService,\n ReportPdfService,\n // Tree-shaken ECharts core + the 'report' house theme, loaded lazily with\n // this route's chunk.\n provideEchartsCore({ echarts: () => import('../../theme/echarts').then((module) => module.default) }),\n ],\n imports: [\n FormsModule,\n FsAutocompleteChipsModule,\n FsFilterModule,\n FsMenuModule,\n FsAiChatComponent,\n MatIcon,\n ReportCanvasComponent,\n ],\n})\nexport class ReportComponent {\n\n // The single report the viewer and chat are focused on.\n public selected: ReportListItem | null = null;\n public report: Report | null = null;\n public loadingReports = true;\n public editMode = false;\n\n // The report toolbar IS an fs-filter: the picker rides in its heading\n // template, the menu becomes its actions, and report-level filter groups\n // become its items. Rebuilt whenever the loaded report (and thus its groups)\n // changes; the menu's show-guards keep working while no report is selected.\n public reportFilterConfig!: FilterConfig;\n\n @ViewChild('split', { static: true })\n private _split!: ElementRef<HTMLDivElement>;\n\n @ViewChild('chatPanel', { static: true, read: ElementRef })\n private _chatPanel!: ElementRef<HTMLElement>;\n\n public readonly introMessage = {\n text: '',\n };\n\n private _reportData = inject(ReportData);\n private _reportService = inject(ReportService);\n private _filterState = inject(ReportFilterStateService);\n private _exportCollector = inject(ReportExportCollectorService);\n private _pptxService = inject(ReportPptxService);\n private _pdfService = inject(ReportPdfService);\n private _process = inject(FsProcess);\n private _prompt = inject(FsPrompt);\n private _dialog = inject(MatDialog);\n private _destroyRef = inject(DestroyRef);\n private _cdRef = inject(ChangeDetectorRef);\n private _zone = inject(NgZone);\n\n constructor() {\n this._buildReportConfig();\n\n this._reportService.load()\n .pipe(\n finalize(() => {\n this.loadingReports = false;\n this._cdRef.markForCheck();\n }),\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe({ error: () => undefined });\n }\n\n public fetchReports = (keyword: string) => {\n return this._reportService.filter(keyword);\n };\n\n public reportChange(report: ReportListItem | null): void {\n this.report = null;\n this.editMode = false;\n this._buildReportConfig();\n\n if (report) {\n this._loadReport(report.id);\n }\n }\n\n public createReport(): void {\n this._prompt.input({\n title: 'Create Report',\n label: 'Name',\n commitLabel: 'Create',\n required: true,\n })\n .pipe(\n switchMap((name: string) => this._reportService.create(name)),\n takeUntilDestroyed(this._destroyRef),\n )\n .subscribe((report: ReportListItem) => {\n this.selected = report;\n this._cdRef.markForCheck();\n this._loadReport(report.id);\n });\n }\n\n public toggleEditMode(): void {\n this.editMode = !this.editMode;\n }\n\n // Report settings — name, page size, orientation, layout mode. The picker\n // list and structure both reload on save (a layout switch re-renders the\n // whole canvas).\n public reportSettings(): void {\n if (!this.report) {\n return;\n }\n\n this._dialog.open<ReportSettingsComponent, unknown, ReportSettingsResult>(ReportSettingsComponent, {\n data: { report: this.report },\n width: '460px',\n })\n .afterClosed()\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((result) => {\n // The dialog confirms + performs the delete itself; we just react to\n // what it reports back.\n if (result?.action === 'deleted') {\n this.selected = null;\n this.report = null;\n this._buildReportConfig();\n this._cdRef.markForCheck();\n\n return;\n }\n\n if (result?.action === 'saved' && this.selected) {\n this._loadReport(this.selected.id);\n this._refreshReportName(this.selected.id);\n }\n });\n }\n\n // Component settings — title, exact geometry, and the diagnostic views\n // (SQL, config, filter wiring).\n public componentSettings(component: ReportComponentModel): void {\n if (!this.report) {\n return;\n }\n\n this._dialog.open(ComponentSettingsComponent, {\n data: { report: this.report, component },\n width: '640px',\n })\n .afterClosed()\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe(() => {\n // Always reload: filter add/remove/level changes persist immediately\n // inside the dialog (no \"save\"), so the canvas + report bar must\n // refresh however the dialog was closed.\n if (this.selected) {\n this._loadReport(this.selected.id);\n }\n });\n }\n\n // The canvas changed the report's structure (added a page) — re-fetch so the\n // new page renders; the canvas lands the view on it.\n public onCanvasReportChanged(): void {\n if (this.selected) {\n this._loadReport(this.selected.id);\n }\n }\n\n // Export the report to PowerPoint, entirely client-side: every component's\n // data is fetched fresh with the current filter state (all pages, not just\n // the visible one), then pptxgenjs builds a deck of NATIVE editable charts —\n // page = slide, positions 1:1. The dock shows progress until the file saves.\n public exportPowerpoint(): void {\n if (!this.report) {\n return;\n }\n\n const report = this.report;\n this._process.run(\n 'Exporting PowerPoint',\n this._exportCollector.collect(report)\n .pipe(\n switchMap((collected) => from(this._pptxService.export(collected))),\n ),\n );\n }\n\n // Export to PDF, entirely client-side: same collection pass, charts rendered\n // through an offscreen ECharts instance at 3× pixel ratio (pixel-identical\n // to the screen), tables via jspdf-autotable — page = PDF page.\n public exportPdf(): void {\n if (!this.report) {\n return;\n }\n\n const report = this.report;\n this._process.run(\n 'Exporting PDF',\n this._exportCollector.collect(report)\n .pipe(\n switchMap((collected) => from(this._pdfService.export(collected))),\n ),\n );\n }\n\n // React to each chat turn (fs-chat handles the request + persistence); we\n // only care about the report side effects this context's backend flags.\n public onChatResponse(response: FsAiChatResponse): void {\n // The agent changed the report's structure — re-fetch it. Session filter\n // values survive (the filter-state service keeps values for groups that\n // still exist).\n if (response.reportChanged && this.selected) {\n this._loadReport(this.selected.id);\n }\n\n // A rename changes nothing structural — refresh the picker chip label.\n if (response.reportRenamed && this.selected) {\n this._refreshReportName(this.selected.id);\n }\n }\n\n // Drag the divider between the chat and canvas panes (pointer-capture loop\n // outside Angular).\n public onResizeStart(event: PointerEvent): void {\n event.preventDefault();\n\n const handle = event.target as HTMLElement;\n handle.setPointerCapture(event.pointerId);\n this._split.nativeElement.classList.add('resizing');\n\n this._zone.runOutsideAngular(() => {\n const move = (e: PointerEvent) => this._resizeTo(e.clientX);\n const end = () => {\n handle.releasePointerCapture(event.pointerId);\n handle.removeEventListener('pointermove', move);\n handle.removeEventListener('pointerup', end);\n handle.removeEventListener('pointercancel', end);\n this._split.nativeElement.classList.remove('resizing');\n };\n\n handle.addEventListener('pointermove', move);\n handle.addEventListener('pointerup', end);\n handle.addEventListener('pointercancel', end);\n });\n }\n\n private _resizeTo(clientX: number): void {\n const rect = this._split.nativeElement.getBoundingClientRect();\n if (rect.width === 0) {\n return;\n }\n\n const ratio = (clientX - rect.left) / rect.width;\n const clamped = Math.min(0.8, Math.max(0.2, ratio));\n this._chatPanel.nativeElement.style.flexBasis = `${clamped * 100}%`;\n }\n\n private _loadReport(reportId: number): void {\n this._reportData.get(reportId)\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((report: Report) => {\n this.report = report;\n this._filterState.init(report);\n this._buildReportConfig();\n this._cdRef.markForCheck();\n });\n }\n\n // Report-level filter groups in their saved order — the ones that render in\n // the toolbar (component-level groups render on their components).\n private _reportGroups(): ReportFilterGroup[] {\n return (this.report?.filterGroups ?? [])\n .filter((group) => group.level === 'report' || group.level === 'both')\n .sort((a, b) => a.order - b.order);\n }\n\n // Whether the loaded report has any report-level filters OR a time-series\n // chart (which earns the runtime Frequency control) — gates the toolbar\n // fs-filter so it isn't rendered (taking space) when there's nothing to show.\n public get reportHasFilters(): boolean {\n return this._reportGroups().length > 0 || this._hasTimeSeriesChart();\n }\n\n // fs-filter reads its config only once (at init) — re-binding does nothing.\n // The template keys the toolbar fs-filter on this signature so it's recreated\n // (and re-reads the rebuilt config) whenever the report-level filter set\n // changes, e.g. after the component settings dialog adds/moves a filter.\n public get reportFilterKey(): string {\n return [\n ...this._reportGroups().map((group) => `${group.id}:${group.level}:${group.label}`),\n this._hasTimeSeriesChart() ? 'frequency' : '',\n ].join('|');\n }\n\n // (Re)build the toolbar fs-filter config — report-level filter items, plus the\n // runtime Frequency control when the report has a time-series chart. The\n // report's actions live in the fs-menu beside the picker, not here. Only\n // built/used once a report is loaded (the template gates it on `report`).\n private _buildReportConfig(): void {\n const reportId = this.report?.id ?? null;\n\n const items = reportId\n ? this._reportGroups().map((group) =>\n filterItemForGroup(group, this._reportData, reportId, this._filterState.value(group.id)))\n : [];\n\n if (reportId && this._hasTimeSeriesChart()) {\n items.push({\n name: FREQUENCY_ITEM,\n type: ItemType.Select,\n label: 'Frequency',\n multiple: false,\n values: () => FREQUENCY_OPTIONS,\n default: this._filterState.frequency() ?? undefined,\n });\n }\n\n this.reportFilterConfig = {\n // Never touch the URL or persist filter state — report filters are\n // session-only, owned by ReportFilterStateService.\n queryParam: false,\n persist: false,\n items,\n change: (query) => {\n for (const { groupId, value } of groupValuesFromQuery(query ?? {}, this._reportGroups())) {\n this._filterState.setValue(groupId, value);\n }\n // Frequency isn't a filter group — it's a render-layer bucket override.\n this._filterState.setFrequency((query?.[FREQUENCY_ITEM] as ChartGranularity) || null);\n },\n };\n }\n\n // The report has at least one time-series chart (a chart whose x-axis is a\n // time axis) — the only kind the Frequency control affects.\n private _hasTimeSeriesChart(): boolean {\n return (this.report?.pages ?? []).some((page) =>\n page.components.some((component) =>\n component.type === 'chart' && component.config?.xAxis?.kind === 'time'));\n }\n\n private _refreshReportName(reportId: number): void {\n this._reportService.load()\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((reports: ReportListItem[]) => {\n const renamed = reports.find((report) => report.id === reportId);\n if (renamed) {\n this.selected = renamed;\n if (this.report) {\n this.report = { ...this.report, name: renamed.name };\n }\n this._cdRef.markForCheck();\n }\n });\n }\n}\n","<div\n #split\n class=\"report fs-row.align-start\">\n <fs-ai-chat\n #chatPanel\n class=\"chat\"\n style=\"min-height: 500px;\"\n basePath=\"reports\"\n [requestData]=\"{ reportId: selected?.id ?? null }\"\n [introMessage]=\"introMessage\"\n (response)=\"onChatResponse($event)\">\n </fs-ai-chat>\n <div\n class=\"resizer\"\n (pointerdown)=\"onResizeStart($event)\">\n </div>\n <div class=\"viewer fs-flex fs-column\">\n <div class=\"fs-row.align-center.gap-sm\">\n <fs-autocomplete-chips\n class=\"fs-flex\"\n [fetch]=\"fetchReports\"\n [(ngModel)]=\"selected\"\n [disabled]=\"loadingReports\"\n [padless]=\"true\"\n [multiple]=\"false\"\n [fetchOnFocus]=\"true\"\n (ngModelChange)=\"reportChange($event)\"\n placeholder=\"Report\"\n name=\"report\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n <ng-template\n fsAutocompleteChipsStatic\n (click)=\"createReport()\">\n Create Report\n </ng-template>\n </fs-autocomplete-chips>\n @if (report) {\n <fs-menu>\n <ng-template\n fs-menu-item\n (click)=\"reportSettings()\">\n <mat-icon>\n tune\n </mat-icon>\n Report settings\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"toggleEditMode()\">\n <mat-icon>\n {{ editMode ? 'lock' : 'open_with' }}\n </mat-icon>\n {{ editMode ? 'Done editing layout' : 'Edit layout' }}\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPowerpoint()\">\n <mat-icon>\n slideshow\n </mat-icon>\n Export PowerPoint\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPdf()\">\n <mat-icon>\n picture_as_pdf\n </mat-icon>\n Export PDF\n </ng-template>\n </fs-menu>\n }\n </div>\n @if (report) {\n <!-- Report-level filters only (the report's actions live in the menu\n above). fs-filter reads its config once at init, so it's keyed on the\n filter signature: when the report-level filter set changes the block\n is recreated and re-reads the rebuilt config. -->\n @if (reportHasFilters) {\n @for (key of [reportFilterKey]; track key) {\n <fs-filter [config]=\"reportFilterConfig\"></fs-filter>\n }\n }\n <app-report-canvas\n [report]=\"report\"\n [editMode]=\"editMode\"\n (componentSettings)=\"componentSettings($event)\"\n (reportChanged)=\"onCanvasReportChanged()\"\n (editDone)=\"toggleEditMode()\">\n </app-report-canvas>\n }\n </div>\n</div>","/*\n * Public API Surface of @firestitch/reports\n *\n * The AI-built report viewer/editor, its data gateway, session filter state and\n * renderer components. The host app only needs ReportComponent (route it) —\n * everything else is internal wiring. The AI chat is provided by @firestitch/ai.\n */\nexport { ReportComponent } from './app/reports/views/report/report.component';\nexport { ReportData } from './app/reports/data/report.data';\nexport { ReportService } from './app/reports/services/report.service';\nexport { ReportFilterStateService } from './app/reports/services/report-filter-state.service';\nexport * from './app/reports/interfaces/report.interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["rxFilter","map","i1","i2","i4","i5","i7","i8","MatOption","TITLE_H","TABLE_ROW_H","i3"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA;AACA;AACA;MAIa,UAAU,CAAA;AACb,IAAA,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;;;IAItB,QAAQ,GAAG,SAAS,CAAC;;;IAIpB,KAAK,CAAC,MAAM,GAAG,EAAE,EAAA;AACvB,QAAA,OAAO,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,QAAQ,CAAI,CAAA,EAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;KAC9D;AAEM,IAAA,OAAO,CAAC,KAAA,GAAa,EAAE,EAAE,SAAwB,EAAE,EAAA;AACxD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,KAAK,EAAE,EACZ,KAAK,EACL;AACE,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;AAEM,IAAA,MAAM,CAAC,IAAY,EAAE,MAAA,GAAwB,EAAE,EAAA;AACpD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,IAAI,CAAC,KAAK,EAAE,EACZ,EAAE,IAAI,EAAE,EACR;AACE,YAAA,GAAG,EAAE,QAAQ;AACb,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;AAEM,IAAA,MAAM,CAAC,QAAgB,EAAE,IAAY,EAAE,SAAwB,EAAE,EAAA;AACtE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,QAAQ,CAAE,CAAA,CAAC,EACzB,EAAE,IAAI,EAAE,EACR;AACE,YAAA,GAAG,EAAE,QAAQ;AACb,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;;;AAIM,IAAA,MAAM,CAAC,QAAgB,EAAE,QAAiC,EAAE,SAAwB,EAAE,EAAA;AAC3F,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAA,CAAE,CAAC,EACzB,QAAQ,EACR;AACE,YAAA,GAAG,EAAE,QAAQ;AACb,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;;AAGM,IAAA,OAAO,CAAC,QAAgB,EAAE,MAAA,GAAwB,EAAE,EAAA;AACzD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,IAAI,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAA,MAAA,CAAQ,CAAC,EAC/B,EAAE,EACF;AACE,YAAA,GAAG,EAAE,MAAM;AACX,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;;;;IAKM,eAAe,CACpB,QAAgB,EAChB,WAAmB,EACnB,QAAiC,EACjC,SAAwB,EAAE,EAAA;AAE1B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,QAAQ,CAAe,YAAA,EAAA,WAAW,WAAW,CAAC,EAC5D,QAAQ,EACR;AACE,YAAA,GAAG,EAAE,WAAW;AAChB,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;AAEM,IAAA,MAAM,CAAC,QAAgB,EAAE,MAAA,GAAwB,EAAE,EAAA;AACxD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CACrB,IAAI,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAA,CAAE,CAAC,EACzB,EAAE,EACF;AACE,YAAA,GAAG,EAAE,QAAQ;AACb,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;;;AAIM,IAAA,GAAG,CAAC,QAAgB,EAAE,MAAA,GAAwB,EAAE,EAAA;AACrD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAA,CAAE,CAAC,EACzB,EAAE,EACF;AACE,YAAA,GAAG,EAAE,QAAQ;AACb,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;;;AAIM,IAAA,aAAa,CAClB,QAAgB,EAChB,SAAkI,EAClI,SAAwB,EAAE,EAAA;AAE1B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,QAAQ,CAAuB,qBAAA,CAAA,CAAC,EAC9C,EAAE,SAAS,EAAE,EACb;AACE,YAAA,GAAG,EAAE,IAAI;AACT,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;;;AAIM,IAAA,aAAa,CAClB,QAAgB,EAChB,WAAmB,EACnB,OAAA,GAAiC,EAAE,EACnC,KAA4B,GAAA,EAAE,EAC9B,MAAA,GAAwB,EAAE,EAAA;QAE1B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,QAAQ,CAAe,YAAA,EAAA,WAAW,OAAO,CAAC,EACxD,EAAE,OAAO,EAAE,KAAK,EAAE,EAClB;AACE,YAAA,GAAG,EAAE,MAAM;AACX,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;;;;AAKM,IAAA,eAAe,CACpB,QAAgB,EAChB,WAAmB,EACnB,OAAA,GAAiC,EAAE,EACnC,KAA4B,GAAA,EAAE,EAC9B,MAAA,GAAwB,EAAE,EAAA;QAE1B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,QAAQ,CAAe,YAAA,EAAA,WAAW,SAAS,CAAC,EAC1D,EAAE,OAAO,EAAE,KAAK,EAAE,EAClB;AACE,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;;AAGM,IAAA,aAAa,CAAC,QAAgB,EAAE,QAAgB,EAAE,SAAwB,EAAE,EAAA;AACjF,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,QAAQ,CAAY,SAAA,EAAA,QAAQ,UAAU,CAAC,EACrD,EAAE,EACF;AACE,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;;;AAIM,IAAA,gBAAgB,CAAC,QAAgB,EAAE,WAAmB,EAAE,SAAwB,EAAE,EAAA;AACvF,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,QAAQ,CAAe,YAAA,EAAA,WAAW,UAAU,CAAC,EAC3D,EAAE,EACF;AACE,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;;;;IAKM,SAAS,CACd,QAAgB,EAChB,WAAmB,EACnB,MAAsH,EACtH,SAAwB,EAAE,EAAA;AAE1B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,QAAQ,CAAe,YAAA,EAAA,WAAW,UAAU,CAAC,EAC3D,MAAM,EACN;AACE,YAAA,GAAG,EAAE,QAAQ;AACb,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;;IAGM,YAAY,CACjB,QAAgB,EAChB,QAAgB,EAChB,OAAmE,EACnE,SAAwB,EAAE,EAAA;AAE1B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,QAAQ,CAAY,SAAA,EAAA,QAAQ,EAAE,CAAC,EAC7C,OAAO,EACP;AACE,YAAA,GAAG,EAAE,QAAQ;AACb,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;;AAGM,IAAA,YAAY,CAAC,QAAgB,EAAE,QAAgB,EAAE,SAAwB,EAAE,EAAA;AAChF,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CACrB,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,QAAQ,CAAY,SAAA,EAAA,QAAQ,EAAE,CAAC,EAC7C,EAAE,EACF;AACE,YAAA,GAAG,EAAE,QAAQ;AACb,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;;;;;IAMM,iBAAiB,CACtB,QAAgB,EAChB,OAAe,EACf,OAA2E,EAC3E,SAAwB,EAAE,EAAA;AAE1B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,QAAQ,CAAiB,cAAA,EAAA,OAAO,EAAE,CAAC,EACjD,OAAO,EACP;AACE,YAAA,GAAG,EAAE,aAAa;AAClB,YAAA,GAAG,MAAM;AACV,SAAA,CACF,CAAC;KACH;wGArQU,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAV,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFT,MAAM,EAAA,CAAA,CAAA;;4FAEP,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;AChBD;AACO,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC;AACO,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAE/C;AACO,MAAM,oBAAoB,GAAG,EAAE,CAAC;AASvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACgB,SAAA,YAAY,CAAC,MAAc,EAAE,IAAgB,EAAA;AAC3D,IAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEtD,IAAA,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE;AAC5B,QAAA,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;AACvC,YAAA,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE;gBACzB,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AAC/D,aAAA,CAAC,CAAC;SACJ;AAED,QAAA,OAAO,QAAQ,CAAC;KACjB;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,GAAG,YAAY,GAAG,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEtG,IAAA,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,MAAM,GAAG,YAAY,CAAC;IAC1B,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB,IAAA,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;;;AAI9E,QAAA,IAAI,OAAO,GAAG,QAAQ,GAAG,KAAK,EAAE;YAC9B,MAAM,IAAI,SAAS,CAAC;YACpB,OAAO,GAAG,CAAC,CAAC;YACZ,SAAS,GAAG,CAAC,CAAC;SACf;AAED,QAAA,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE;AACzB,YAAA,CAAC,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ;AACpC,YAAA,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,QAAQ,GAAG,QAAQ;YACtB,CAAC,EAAE,SAAS,CAAC,CAAC;AACf,SAAA,CAAC,CAAC;QAEH,OAAO,IAAI,QAAQ,CAAC;QACpB,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;KAC9C;AAED,IAAA,OAAO,QAAQ,CAAC;AAClB;;AC3DA;AACA;AACA;AACM,SAAU,eAAe,CAAC,KAAuC,EAAA;AACrE,IAAA,IAAI,KAAK,YAAY,IAAI,EAAE;AACzB,QAAA,OAAO,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;KACpC;;;AAID,IAAA,OAAO,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC;AACxD,CAAC;AAGD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA,MAAM,QAAQ,GAAG,CAAC,KAAwB,KAAa,CAAA,CAAA,EAAI,KAAK,CAAC,EAAE,CAAA,CAAE,CAAC;AAEtE;AACA;AACA;AACA;AACA;AACA;SACgB,gBAAgB,CAC9B,KAAwB,EACxB,UAAsB,EACtB,QAAgB,EAAA;IAEhB,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/E,IAAI,CAAC,YAAY,EAAE;AACjB,QAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;KACf;IAED,OAAO,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;AACvD,SAAA,IAAI,CACH,GAAG,CAAC,CAAC,OAAkB,KAAK,CAAC,OAAO,IAAI,EAAE;AACvC,SAAA,GAAG,CAAC,CAAC,MAAM,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAC9D,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAChD,CAAC;AACN,CAAC;AAED;AACA;AACA;AACgB,SAAA,YAAY,CAC1B,QAAwD,EACxD,OAAgB,EAAA;AAEhB,IAAA,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAElD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,IAAI;UACtC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACtE,UAAE,OAAO,CAAC,CAAC,CAAC;AAChB,CAAC;AAED;AACA;AACM,SAAU,kBAAkB,CAChC,KAAwB,EACxB,UAAsB,EACtB,QAAgB,EAChB,OAA0B,EAAA;AAE1B,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7B,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,YAAY,IAAI,EAAE,CAAC;AAEpE,IAAA,QAAQ,KAAK,CAAC,IAAI;AAChB,QAAA,KAAK,WAAW;YACd,OAAO;gBACL,IAAI;gBACJ,IAAI,EAAE,QAAQ,CAAC,SAAS;AACxB,gBAAA,KAAK,EAAE,EAAE,IAAI,EAAE,CAAG,EAAA,KAAK,CAAO,KAAA,CAAA,EAAE,EAAE,EAAE,CAAG,EAAA,KAAK,KAAK,EAAE;gBACnD,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,GAAG;AACtC,sBAAE,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,IAAI,SAAS,EAAE;AACpE,sBAAE,SAAS;aACd,CAAC;QAEJ,KAAK,QAAQ,EAAE;;YAEb,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YAE/D,OAAO;gBACL,IAAI;gBACJ,IAAI,EAAE,QAAQ,CAAC,iBAAiB;gBAChC,KAAK;AACL,gBAAA,YAAY,EAAE,IAAI;gBAClB,MAAM,EAAE,CAAC,OAAgB,KAAK,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC;AAC7D,gBAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;sBAC5B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACjE,sBAAE,SAAS;aACd,CAAC;SACH;AAED,QAAA,KAAK,SAAS,CAAC;AACf,QAAA;YACE,OAAO;gBACL,IAAI;gBACJ,IAAI,EAAE,QAAQ,CAAC,OAAO;gBACtB,KAAK;gBACL,OAAO,EAAE,OAAO,EAAE,KAAK;aACxB,CAAC;KACL;AACH,CAAC;AAED;AACA;AACA;AACgB,SAAA,oBAAoB,CAClC,KAA0B,EAC1B,MAA2B,EAAA;AAE3B,IAAA,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AAC1B,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAE7B,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,CAAA,IAAA,CAAM,CAAC,CAAC;YACnC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,CAAA,EAAA,CAAI,CAAC,CAAC;YAE/B,OAAO;gBACL,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI;aAC1E,CAAC;SACH;AAED,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;YAC3B,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAE9C,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;SACxE;AAED,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAEjD,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;AAC3E,KAAC,CAAC,CAAC;AACL,CAAC;AAED;AACA;AACA;AACA;AACA;AACA,SAAS,iBAAiB,CAAC,GAAY,EAAA;AACrC,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACtB,QAAA,OAAO,GAAG,CAAC;KACZ;AAED,IAAA,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE;AACnD,QAAA,OAAO,EAAE,CAAC;KACX;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAChC;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MAEa,wBAAwB,CAAA;AAE3B,IAAA,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;AAC9C,IAAA,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;AAC/C,IAAA,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;;;;;IAMrC,UAAU,GAA4B,IAAI,CAAC;AAC3C,IAAA,kBAAkB,GAAG,IAAI,OAAO,EAAQ,CAAC;;;AAIzC,IAAA,SAAS,GAAG,IAAI,OAAO,EAAiB,CAAC;;;;AAK1C,IAAA,IAAI,CAAC,MAAc,EAAA;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;AAErB,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,YAAY,IAAI,EAAE,EAAE;YAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAClC,YAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAEvB,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;gBAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC/C,IAAI,YAAY,EAAE;oBAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;iBAC1C;aACF;SACF;AAED,QAAA,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE;YAC9C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AAC1B,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aAC9B;SACF;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC3B;AAEM,IAAA,KAAK,CAAC,OAAe,EAAA;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KAClC;IAEM,QAAQ,CAAC,OAAe,EAAE,KAA8B,EAAA;AAC7D,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;SAC9B;aAAM;YACL,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SAClC;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KAC9B;;IAGM,SAAS,GAAA;QACd,OAAO,IAAI,CAAC,UAAU,CAAC;KACxB;AAEM,IAAA,YAAY,CAAC,SAAkC,EAAA;AACpD,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;AAC5B,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;KAChC;;;;IAKM,gBAAgB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,CAAC;KAC/C;AAEM,IAAA,gBAAgB,CAAC,QAAgB,EAAA;QACtC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;KAC5C;IAEM,YAAY,CAAC,QAAgB,EAAE,OAAe,EAAA;QACnD,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AACvC,YAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SACxC;aAAM;AACL,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;SACrC;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KAC9B;;;AAIM,IAAA,UAAU,CAAC,SAA0B,EAAA;QAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;AAE1F,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;aACjC,IAAI,CACHA,MAAQ,CAAC,CAAC,OAAO,KAAK,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CACjE,CAAC;KACL;;;;AAKM,IAAA,mBAAmB,CAAC,SAA0B,EAAA;QACnD,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAE3C,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE;AAC5C,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;gBAC3D,SAAS;aACV;AAED,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK,EAAE;gBACV,SAAS;aACV;YAED,MAAM,KAAK,GAAwB,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;AAE3D,YAAA,IAAI,KAAK,CAAC,KAAK,EAAE;gBACf,KAAK,CAAC,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aAC5C;AACD,YAAA,IAAI,KAAK,CAAC,GAAG,EAAE;gBACb,KAAK,CAAC,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACxC;AACD,YAAA,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE;AACxB,gBAAA,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;aAC7B;AACD,YAAA,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;aAClC;AAED,YAAA,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3D,gBAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACtB;SACF;AAED,QAAA,OAAO,QAAQ,CAAC;KACjB;;;;;AAMO,IAAA,aAAa,CAAC,KAAwB,EAAA;AAC5C,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;QAC3C,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,OAAO,IAAI,CAAC;SACb;AAED,QAAA,IAAI,YAAY,CAAC,QAAQ,EAAE;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAEzD,OAAO,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;SAC9D;QAED,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,GAAG,EAAE;YAC1C,OAAO;AACL,gBAAA,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,IAAI;AACjC,gBAAA,GAAG,EAAE,YAAY,CAAC,GAAG,IAAI,IAAI;aAC9B,CAAC;SACH;AAED,QAAA,IAAI,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE;AAC/B,YAAA,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;SACxC;AAED,QAAA,IAAI,YAAY,CAAC,KAAK,EAAE;AACtB,YAAA,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;SACtC;AAED,QAAA,OAAO,IAAI,CAAC;KACb;AAEO,IAAA,cAAc,CAAC,QAAgB,EAAA;AACrC,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,QAAQ,QAAQ;AACd,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC9C,YAAA,KAAK,YAAY;AACf,gBAAA,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC/C,YAAA,KAAK,aAAa;AAChB,gBAAA,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAChD,YAAA,KAAK,aAAa;AAChB,gBAAA,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAChD,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACjD,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAChD,YAAA,KAAK,aAAa;AAChB,gBAAA,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAClD,YAAA,KAAK,UAAU,CAAC;AAChB,YAAA,KAAK,YAAY;AACf,gBAAA,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC/C,YAAA;AACE,gBAAA,OAAO,IAAI,CAAC;SACf;KACF;wGAtMU,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;4GAAxB,wBAAwB,EAAA,CAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;;;ACtBX,MAAM,oBAAoB,GAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAG7F;AACA;AACA;AACM,SAAU,SAAS,CAAC,MAAmB,EAAA;IAC3C,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,KAAK,MAAM,KAAK,CAAC;AACtG,CAAC;AAYe,SAAA,kBAAkB,CAAC,SAA0B,EAAE,IAAmB,EAAA;AAChF,IAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAqB,CAAC;AAC/C,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACxD,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;;;;IAI3C,MAAM,WAAW,GAAG,WAAW,KAAK,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAC5F,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM;UACpC,MAAM,CAAC,QAAQ;AACjB,UAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAExD,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACvD,IAAA,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAmC,EAAE,CAAC;IAElD,IAAI,WAAW,EAAE;;AAEf,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC5B,QAAA,KAAK,MAAM,UAAU,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE;AAC7D,YAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;AAC/C,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;AAC3B,gBAAA,IAAI,GAAG,CAAC,WAAW,CAAC,KAAK,UAAU,EAAE;AACnC,oBAAA,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;iBACnD;aACF;YAED,MAAM,CAAC,IAAI,CAAC;AACV,gBAAA,IAAI,EAAE,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC;AAC/B,gBAAA,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3E,aAAA,CAAC,CAAC;SACJ;KACF;SAAM;AACL,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,YAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;AAC/C,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;AAC3B,gBAAA,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;aACnD;YAED,MAAM,CAAC,IAAI,CAAC;AACV,gBAAA,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM;AACrC,gBAAA,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3E,aAAA,CAAC,CAAC;SACJ;KACF;AAED,IAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC;AAED;AACA;AACA;AACA;AACgB,SAAA,gBAAgB,CAAC,SAA0B,EAAE,IAAmB,EAAA;AAC9E,IAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAqB,CAAC;AAC/C,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;IAE5C,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,OAAO,EAAE;QAChD,OAAO,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC;KAC/D;IAED,OAAO,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,eAAe,CACtB,SAA0B,EAC1B,IAAmB,EACnB,SAAkC,EAAA;AAElC,IAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAqB,CAAC;IAC/C,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACtD,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,KAAK,YAAY,CAAC;AACvD,IAAA,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;;;;;AAMlC,IAAA,MAAM,MAAM,GAAmB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,KAAK,KACzE,WAAW,CAAC,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC;AAEhH,IAAA,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAC5C,IAAA,MAAM,YAAY,GAAG;AACnB,QAAA,IAAI,EAAE,UAAmB;QACzB,IAAI,EAAE,SAAS,CAAC,UAAU;AAC1B,QAAA,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK;AACzB,QAAA,YAAY,EAAE,QAAiB;AAC/B,QAAA,OAAO,EAAE,WAAW,IAAI,kBAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE;AAC1E,QAAA,GAAG,eAAe,CAAC,WAAW,EAAE,SAAS,CAAC,UAAU,CAAC;KACtD,CAAC;AACF,IAAA,MAAM,SAAS,GAAG,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAC;AAE7C,IAAA,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE7E,OAAO;AACL,QAAA,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC;AAC9B,QAAA,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC;;;AAGpC,QAAA,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE;QAC/C,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,YAAY;QAC5C,KAAK,EAAE,UAAU,GAAG,YAAY,GAAG,SAAS;QAC5C,MAAM;KACP,CAAC;AACJ,CAAC;AAED;AACA;AACA;AACA;AACA;AACM,SAAU,qBAAqB,CAAC,MAAmB,EAAE,WAAmB,EAAE,OAAO,GAAG,KAAK,EAAA;AAC7F,IAAA,IAAI,MAAM,CAAC,MAAM,EAAE;QACjB,OAAO,MAAM,CAAC,MAAM,CAAC;KACtB;AAED,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK,IAAI,MAAM,CAAC,SAAS,KAAK,OAAO,CAAC;;;IAIvE,OAAO,GAAG,IAAI,OAAO,IAAI,WAAW,GAAG,CAAC,IAAI,GAAG,GAAG,OAAO,GAAG,KAAK,IAAI,QAAQ,CAAC;AAChF,CAAC;AAED,SAAS,YAAY,CAAC,QAAwB,EAAA;AAC5C,IAAA,IAAI,QAAQ,KAAK,QAAQ,EAAE;AACzB,QAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;KACxB;AAED,IAAA,MAAM,IAAI,GAA0B,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAEvD,QAAQ,QAAQ;AACd,QAAA,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAChC,QAAA,KAAK,MAAM;AACT,YAAA,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACjE,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAClE,QAAA;YACE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;KAC9B;AACH,CAAC;AAED;AACA;AACA,SAAS,QAAQ,CAAC,QAAwB,EAAA;IACxC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAE3E,QAAQ,QAAQ;AACd,QAAA,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACjC,QAAA,KAAK,MAAM;YACT,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAC/B,QAAA,KAAK,OAAO;YACV,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAChC,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,IAAI,CAAC;AACd,QAAA;YACE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;KAC/B;AACH,CAAC;AAED,SAAS,WAAW,CAClB,IAAY,EACZ,MAAyB,EACzB,SAAkC,EAClC,OAAiB,EACjB,OAAiB,EAAA;AAEjB,IAAA,IAAI,SAAS,KAAK,KAAK,EAAE;QACvB,OAAO;YACL,IAAI;AACJ,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;AACpC,YAAA,WAAW,EAAE,EAAE;;AAEf,YAAA,IAAI,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;SAC/D,CAAC;KACH;IAED,OAAO;QACL,IAAI;AACJ,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;AACpC,QAAA,MAAM,EAAE,IAAI;AACZ,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,SAAS,EAAE,SAAS,KAAK,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,SAAS;KAChE,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,SAA0B,EAAE,IAAmB,EAAE,KAAc,EAAA;AACrF,IAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAqB,CAAC;IAC/C,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACtD,IAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;AACjD,IAAA,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE9E,OAAO;AACL,QAAA,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;AAC5B,QAAA,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC;AACpC,QAAA,MAAM,EAAE;AACN,YAAA;AACE,gBAAA,IAAI,EAAE,KAAK;AACX,gBAAA,MAAM,EAAE,KAAK,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,KAAK;AACtC,gBAAA,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC;AACjC,gBAAA,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;AACtB,gBAAA,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,MAAM;AACnD,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAC1B,iBAAA,CAAC,CAAC;AACJ,aAAA;AACF,SAAA;KACF,CAAC;AACJ,CAAC;AAED;AACA;AACA,SAAS,SAAS,CAAC,QAAwB,EAAA;IACzC,QAAQ,QAAQ;AACd,QAAA,KAAK,MAAM;AACT,YAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACxB,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACxB,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACxB,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACxB,QAAA;AACE,YAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;KACzB;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAA+B,EAAE,MAAc,EAAA;AACnE,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAC;IAChC,MAAM,MAAM,GAAc,EAAE,CAAC;AAC7B,IAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACpB,YAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChB,YAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACpB;KACF;AAED,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAA;AAC7B,IAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE;AACzD,QAAA,OAAO,IAAI,CAAC;KACb;AAED,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAE7B,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AACjD,CAAC;AAED;AACA;AACA,SAAS,iBAAiB,CAAC,IAAmB,EAAA;IAC5C,OAAO,IAAI,CAAC,WAAW,IAAI,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACvG,CAAC;AAED;AACA;AACM,SAAU,kBAAkB,CAAC,UAAoB,EAAA;AACrD,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;AAChC,IAAA,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE;AACjC,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAChC,QAAA,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE;YACjB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;SAC/B;KACF;AAED,IAAA,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;AACxB,CAAC;AAED;AACA;AACA;AACA,SAAS,gBAAgB,CAAC,KAAa,EAAE,WAA6B,EAAA;AACpE,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7B,IAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAClB,QAAA,OAAO,IAAI,CAAC;KACb;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACxC,QAAQ,WAAW;AACjB,QAAA,KAAK,MAAM;AACT,YAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACjC,QAAA,KAAK,SAAS;YACZ,OAAO,EAAE,OAAO,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAA,EAAE,IAAI,EAAE,CAAC;AACtE,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;AACjD,QAAA;AACE,YAAA,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;KACnD;AACH,CAAC;AAED;AACA;SACgB,iBAAiB,CAAC,KAAa,EAAE,WAA6B,EAAE,SAAkB,EAAA;IAChG,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,KAAK,CAAC;KACd;IAED,OAAO,SAAS,IAAI,WAAW,KAAK,MAAM,GAAG,CAAA,EAAG,KAAK,CAAC,OAAO,CAAI,CAAA,EAAA,KAAK,CAAC,IAAI,CAAE,CAAA,GAAG,KAAK,CAAC,OAAO,CAAC;AAChG,CAAC;AAED;AACA;AACA;AACA;AACA,SAAS,eAAe,CAAC,WAAoC,EAAE,UAAoB,EAAA;IACjF,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,OAAO,EAAE,CAAC;KACX;AAED,IAAA,MAAM,SAAS,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAEjD,OAAO;AACL,QAAA,SAAS,EAAE;AACT,YAAA,SAAS,EAAE,CAAC,KAAa,KAAI;gBAC3B,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBACnD,IAAI,CAAC,KAAK,EAAE;AACV,oBAAA,OAAO,KAAK,CAAC;iBACd;AAED,gBAAA,OAAO,SAAS,IAAI,WAAW,KAAK,MAAM;sBACtC,GAAG,KAAK,CAAC,OAAO,CAAS,MAAA,EAAA,KAAK,CAAC,IAAI,CAAG,CAAA,CAAA;AACxC,sBAAE,KAAK,CAAC,OAAO,CAAC;aACnB;AACD,YAAA,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE;AACjE,SAAA;KACF,CAAC;AACJ;;ACjWA;AACA;AACA;AACA;MAWa,uBAAuB,CAAA;AAElB,IAAA,SAAS,CAAkB;IAC3B,IAAI,GAAyB,IAAI,CAAC;IAE3C,OAAO,GAAyB,IAAI,CAAC;IAEpC,MAAM,GAAmB,IAAI,CAAC;IAE/B,WAAW,GAAA;QAChB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI;cACtC,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC;cAC3C,IAAI,CAAC;KACV;AAEM,IAAA,WAAW,CAAC,KAAc,EAAA;AAC/B,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;KACrB;;IAGM,MAAM,GAAA;AACX,QAAA,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;KACvB;;IAGM,UAAU,CAAC,UAAU,GAAG,CAAC,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;AAC7B,YAAA,IAAI,EAAE,KAAK;YACX,UAAU;AACV,YAAA,eAAe,EAAE,SAAS;SAC3B,CAAC,IAAI,IAAI,CAAC;KACZ;wGA/BU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;4FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBpC,2KAQA,EAAA,MAAA,EAAA,CAAA,kFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDYI,mBAAmB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,cAAA,EAAA,YAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,4BAAA,EAAA,gCAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,wBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,uBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGV,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAVnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,mBAGrB,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EACP,OAAA,EAAA;wBACP,mBAAmB;AACpB,qBAAA,EAAA,QAAA,EAAA,2KAAA,EAAA,MAAA,EAAA,CAAA,kFAAA,CAAA,EAAA,CAAA;8BAIe,SAAS,EAAA,CAAA;sBAAxB,KAAK;gBACU,IAAI,EAAA,CAAA;sBAAnB,KAAK;;;AE1BR;AACA;AACA;AACgB,SAAA,kBAAkB,CAAC,KAAc,EAAE,MAAe,EAAA;AAChE,IAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE;AACzD,QAAA,OAAO,GAAG,CAAC;KACZ;AAED,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC7B,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;KACtB;IAED,QAAQ,MAAM;AACZ,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,CAAG,EAAA,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC;AACvD,QAAA,KAAK,UAAU;AACb,YAAA,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE;AACtC,gBAAA,KAAK,EAAE,UAAU;AACjB,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,qBAAqB,EAAE,CAAC;AACzB,aAAA,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,QAAA;YACE,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAClD;AACH;;ACnBA;AACA;MAQa,qBAAqB,CAAA;AAEhB,IAAA,SAAS,CAAkB;IAC3B,IAAI,GAAyB,IAAI,CAAC;IAE3C,KAAK,GAAG,GAAG,CAAC;IACZ,KAAK,GAAG,EAAE,CAAC;IAEX,WAAW,GAAA;QAChB,MAAM,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,EAAE,CAAc,CAAC;QAC3D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QAEzC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;YAEjB,OAAO;SACR;AAED,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACtE;wGArBU,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,2JCflC,mJAMA,EAAA,MAAA,EAAA,CAAA,wRAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FDSa,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAGnB,eAAA,EAAA,uBAAuB,CAAC,MAAM,cACnC,IAAI,EAAA,QAAA,EAAA,mJAAA,EAAA,MAAA,EAAA,CAAA,wRAAA,CAAA,EAAA,CAAA;8BAIA,SAAS,EAAA,CAAA;sBAAxB,KAAK;gBACU,IAAI,EAAA,CAAA;sBAAnB,KAAK;;;AEKR;AACA;AACA;AACA;AACA;MAYa,sBAAsB,CAAA;AAEjB,IAAA,QAAQ,CAAS;AACjB,IAAA,SAAS,CAAkB;AAC3B,IAAA,MAAM,CAAiC;AAGhD,IAAA,aAAa,CAAkB;AAE/B,IAAA,UAAU,CAAe;IACzB,OAAO,GAA0D,EAAE,CAAC;AAEnE,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACjC,IAAA,YAAY,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAChD,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAElC,QAAQ,GAAA;QACb,MAAM,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAe,CAAC;QAC3D,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;AAEpC,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;;QAG7B,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;AACzC,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAC1C,SAAS,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;KAClD;AAEO,IAAA,eAAe,CAAC,MAAkB,EAAA;QACxC,IAAI,CAAC,UAAU,GAAG;;;AAGhB,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,MAAM,EAAE,KAAK;;;AAGb,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,MAAM,CAAC,IAAI;AACf,kBAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,EAAE;AAC1E,kBAAE,SAAS;;;;;;;;;;;AAWb,YAAA,MAAM,EAAE;AACN,gBAAA,KAAK,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;gBAC5B,QAAQ,EAAE,kBAAkB,CAAC,MAAM;AACpC,aAAA;AACD,YAAA,QAAQ,EAAE;AACR,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,UAAU,EAAE,SAAS;AACtB,aAAA;AACD,YAAA,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACrE,KAAK,EAAE,CAAC,KAAU,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;SAC1C,CAAC;KACH;;;IAIO,WAAW,GAAA;QACjB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE;AACjC,aAAA,MAAM,CAAC,CAAC,MAAM,KAAI;AACjB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAErD,OAAO,MAAM,CAAC,OAAO,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;AAC7F,SAAC,CAAC,CAAC;KACN;AAEO,IAAA,WAAW,CAAC,MAAoB,EAAA;AACtC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AACrD,QAAA,MAAM,IAAI,GAAG,CAAA,CAAA,EAAI,MAAM,CAAC,EAAE,EAAE,CAAC;AAC7B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,EAAE,KAAK,IAAI,MAAM,CAAC,YAAY,CAAC;AAElE,QAAA,QAAQ,KAAK,EAAE,IAAI;AACjB,YAAA,KAAK,WAAW;gBACd,OAAO;oBACL,IAAI;oBACJ,IAAI,EAAE,QAAQ,CAAC,SAAS;oBACxB,KAAK,EAAE,CAAC,CAAG,EAAA,KAAK,OAAO,EAAE,CAAA,EAAG,KAAK,CAAA,GAAA,CAAK,CAAC;iBACxC,CAAC;AAEJ,YAAA,KAAK,QAAQ;gBACX,OAAO;oBACL,IAAI;oBACJ,IAAI,EAAE,QAAQ,CAAC,iBAAiB;oBAChC,KAAK;AACL,oBAAA,MAAM,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;AACnE,yBAAA,IAAI,CACHC,KAAG,CAAC,CAAC,OAAkB,KAAK,CAAC,OAAO,IAAI,EAAE;yBACvC,GAAG,CAAC,CAAC,MAAM,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAC/D;iBACJ,CAAC;AAEJ,YAAA,KAAK,SAAS,CAAC;AACf,YAAA;gBACE,OAAO;oBACL,IAAI;oBACJ,IAAI,EAAE,QAAQ,CAAC,OAAO;oBACtB,KAAK;iBACN,CAAC;SACL;KACF;AAEO,IAAA,MAAM,CAAC,KAAU,EAAA;;;;AAIvB,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;AACnC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;gBACjB,KAAK,CAAC,MAAM,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1E,QAAA,MAAM,KAAK,GAAuB;YAChC,IAAI;YACJ,QAAQ;SACT,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,KAAK,EAAE;AACT,YAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,KAAK,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC;SAC3E;;;AAID,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;AACxD,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACzE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;SACrC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YAC1C,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;SACrC;QAED,OAAO,IAAI,CAAC,WAAW;aACpB,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC;aAC9E,IAAI,CACHA,KAAG,CAAC,CAAC,IAAmB,MAAM;AAC5B,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;AACrB,YAAA,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,KAAK,CAAC,QAAQ;AAC9C,gBAAA,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;gBACvD,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI;AACtC,aAAA;SACF,CAAC,CAAC,CACJ,CAAC;KACL;;;AAIO,IAAA,UAAU,CAAC,KAAU,EAAA;QAC3B,MAAM,MAAM,GAA0B,EAAE,CAAC;QAEzC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;AACvC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AACrD,YAAA,MAAM,IAAI,GAAG,CAAA,CAAA,EAAI,MAAM,CAAC,EAAE,EAAE,CAAC;AAE7B,YAAA,IAAI,KAAK,EAAE,IAAI,KAAK,WAAW,EAAE;gBAC/B,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAA,IAAA,CAAM,CAAC,CAAC,CAAC;gBACnD,MAAM,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAA,EAAA,CAAI,CAAC,CAAC,CAAC;AAC/C,gBAAA,IAAI,IAAI,IAAI,EAAE,EAAE;AACd,oBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;iBAC5D;aACF;AAAM,iBAAA,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ,EAAE;;;AAGnC,gBAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,gBAAA,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC5C,sBAAE,QAAQ;uBACP,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;AAClD,gBAAA,IAAI,cAAc,CAAC,MAAM,EAAE;AACzB,oBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;iBAC9D;aACF;iBAAM;AACL,gBAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACjD,IAAI,OAAO,EAAE;AACX,oBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;iBACtD;aACF;SACF;AAED,QAAA,OAAO,MAAM,CAAC;KACf;wGA5LU,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,gNAMtB,eAAe,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7C5B,igBAkBA,EDiBI,MAAA,EAAA,CAAA,uwBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,QAAQ,4CACR,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,OAAA,EAAA,YAAA,EAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGH,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAXlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,mBAGpB,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EACP,OAAA,EAAA;wBACP,QAAQ;wBACR,YAAY;AACb,qBAAA,EAAA,QAAA,EAAA,igBAAA,EAAA,MAAA,EAAA,CAAA,uwBAAA,CAAA,EAAA,CAAA;8BAIe,QAAQ,EAAA,CAAA;sBAAvB,KAAK;gBACU,SAAS,EAAA,CAAA;sBAAxB,KAAK;gBACU,MAAM,EAAA,CAAA;sBAArB,KAAK;gBAGC,aAAa,EAAA,CAAA;sBADnB,SAAS;uBAAC,eAAe,CAAA;;;AEX5B;AACA,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAU,CAAC;AAGtE;AACA,MAAM,gBAAgB,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;AAEzD,MAAM,KAAK,GAAG,GAAG,CAAC;AAClB,MAAM,KAAK,GAAG,GAAG,CAAC;AAElB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MAkBa,wBAAwB,CAAA;AAEnB,IAAA,QAAQ,CAAS;AACjB,IAAA,SAAS,CAAuB;AAChC,IAAA,MAAM,CAAiC;IACvC,QAAQ,GAAG,KAAK,CAAC;IACjB,MAAM,GAAiB,UAAU,CAAC;;IAElC,IAAI,GAAG,CAAC,CAAC;IACT,OAAO,GAAyB,IAAI,CAAC;IACrC,QAAQ,GAAG,KAAK,CAAC;AAEhB,IAAA,eAAe,GAAG,IAAI,YAAY,EAAU,CAAC;AAC7C,IAAA,eAAe,GAAG,IAAI,YAAY,EAAoD,CAAC;AACvF,IAAA,WAAW,GAAG,IAAI,YAAY,EAA6D,CAAC;AAC5F,IAAA,YAAY,GAAG,IAAI,YAAY,EAAwB,CAAC;AAGlE,IAAA,cAAc,CAA0B;;;;AAK/C,IAAA,IAAW,aAAa,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC;KAChD;;;;;AAMM,IAAA,YAAY,CAAgB;IAE5B,IAAI,GAAyB,IAAI,CAAC;IAClC,OAAO,GAAG,KAAK,CAAC;IAChB,KAAK,GAAkB,IAAI,CAAC;AAE3B,IAAA,SAAS,GAAG,IAAI,OAAO,EAAQ,CAAC;AAChC,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACjC,IAAA,YAAY,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAChD,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7B,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACjC,IAAA,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACnC,IAAA,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACvB,IAAA,KAAK,GAA4B,MAAM,CAAC,UAAU,CAAC,CAAC;IAErD,QAAQ,GAAA;QACb,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE;;AAElC,YAAA,IAAI,CAAC,SAAS;AACX,iBAAA,IAAI,CACH,YAAY,CAAC,GAAG,CAAC,EACjB,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CACrC;iBACA,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAEjC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;AACzC,iBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;iBAC1C,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;;;AAI1C,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,gBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;AACjC,qBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;qBAC1C,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;aAC3C;YAED,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;KACF;;;;;;AAOM,IAAA,WAAW,CAAC,OAAsB,EAAA;AACvC,QAAA,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW;gBACrE,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAErD,IAAI,cAAc,EAAE;YAClB,IAAI,CAAC,kBAAkB,EAAE,CAAC;SAC3B;KACF;;;;AAKD,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAG,EAAA,KAAK,CAAC,EAAE,CAAA,CAAA,EAAI,KAAK,CAAC,KAAK,CAAA,CAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC1F;AAED,IAAA,IAAW,SAAS,GAAA;AAClB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;KAC/B;;;AAID,IAAA,IAAW,WAAW,GAAA;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;AAC/C,QAAA,MAAM,IAAI,GAAG,CAAC,KAAyB,KAAK,CAAA,EAAG,CAAC,KAAK,IAAI,yBAAyB,IAAI,WAAW,IAAI,CAAC;AAEtG,QAAA,OAAO,CAAG,EAAA,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAI,CAAA,EAAA,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;KACxG;;;;;;AAOD,IAAA,IAAW,qBAAqB,GAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAClD,YAAA,OAAO,EAAE,CAAC;SACX;AAED,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE;AACjD,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;gBACpE,SAAS;aACV;AACD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AACpD,YAAA,IAAI,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,EAAE;AACpE,gBAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;aACxB;SACF;QAED,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KACvE;IAEM,QAAQ,GAAA;QACb,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;KACxC;IAEM,SAAS,GAAA;AACd,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAEtE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACpB,CAAa,UAAA,EAAA,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,WAAW,CAAA,CAAE,EAClD,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,CAC5E,CAAC;KACH;;;AAIM,IAAA,aAAa,CAAC,KAAY,EAAA;QAC/B,KAAK,CAAC,eAAe,EAAE,CAAC;KACzB;AAEM,IAAA,sBAAsB,CAAC,KAAmB,EAAA;QAC/C,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YACnC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;SAC9C;KACF;;AAIM,IAAA,WAAW,CAAC,KAAmB,EAAA;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,OAAO;SACR;QAED,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAE7C,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE;AAC1B,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAEtB,OAAO;SACR;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,KAAI;YACpC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAE3D,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;gBAChB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;aAC1D;AAED,YAAA,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;AACrB,YAAA,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,cAAc,EAAE,CAAC;SACvB,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;KAChC;IAEM,aAAa,CAAC,KAAmB,EAAE,MAAc,EAAA;AACtD,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,OAAO;SACR;QAED,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAE7C,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE;AAC1B,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEhC,OAAO;SACR;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,KAAI;YACpC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAChC,YAAA,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;AAElC,YAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACxB,gBAAA,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;aAC1C;AACD,YAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACxB,gBAAA,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;aAC1C;AACD,YAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACxB,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;gBACrD,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC;gBAC7B,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC;aAC9B;AACD,YAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACxB,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;gBACrD,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC;gBAC7B,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC;aAC9B;YAED,IAAI,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAC9B,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,gBAAA,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;aACtE;YAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,cAAc,EAAE,CAAC;AACtB,YAAA,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;SAC/B,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;KAChC;;;;;;IAOO,kBAAkB,GAAA;QACxB,IAAI,CAAC,YAAY,GAAG;;;AAGlB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,KAC1C,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAChG,YAAA,MAAM,EAAE,CAAC,KAAK,KAAI;AAChB,gBAAA,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,oBAAoB,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,qBAAqB,CAAC,EAAE;oBAC9F,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;iBAC5C;aACF;SACF,CAAC;KACH;;;IAIO,WAAW,CAAC,KAAmB,EAAE,MAAc,EAAA;AACrD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,WAAW,IAAI,CAAC,CAAC;QAE3E,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,KAAI;AAC5B,YAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACxB,gBAAA,MAAM,YAAY,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,SAAS,IAAI,GAAG,CAAC;gBAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC;gBAC/E,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACpD,gBAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC;aACvE;SACF,EAAE,MAAK;AACN,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACxB,gBAAA,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE;AAC9B,gBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS;AACpC,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;;;AAIO,IAAA,SAAS,CAAC,KAAmB,EAAA;AACnC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;AACtC,QAAA,IAAI,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC;AAChC,QAAA,IAAI,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC;AAEhC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAEpC,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,KAAI;AACvC,YAAA,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC;AACxB,YAAA,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC;AACxB,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,UAAA,EAAa,MAAM,GAAG,IAAI,CAAC,IAAI,OAAO,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC;SACtF,EAAE,MAAK;AACN,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AACvC,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;AAC1B,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,gBAAA,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE;AAC9B,gBAAA,OAAO,EAAE,WAAW;AACpB,gBAAA,OAAO,EAAE,WAAW;AACrB,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;IAEO,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;;;AAIpD,IAAA,MAAM,CACZ,KAAmB,EACnB,MAAiE,EACjE,KAAiB,EAAA;QAEjB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;AAExB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;AAC3C,QAAA,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAE1C,IAAI,CAAC,OAAO,GAAG;AACb,YAAA,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AACnB,YAAA,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AACnB,YAAA,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AACnB,YAAA,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AACnB,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE;SAC1C,CAAC;AACF,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;AAC7B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;AAE7B,QAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAK;YAChC,MAAM,IAAI,GAAG,CAAC,CAAe,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;YACpF,MAAM,GAAG,GAAG,MAAK;AACf,gBAAA,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC9C,gBAAA,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAChD,gBAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAC7C,gBAAA,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AAEjD,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAK;AAClB,oBAAA,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;AACtB,oBAAA,KAAK,EAAE,CAAC;AACR,oBAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;AAC7B,iBAAC,CAAC,CAAC;AACL,aAAC,CAAC;AAEF,YAAA,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAC7C,YAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAC1C,YAAA,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AAChD,SAAC,CAAC,CAAC;KACJ;IAEO,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,cAAc,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;AAE9B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACxB,YAAA,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE;AAC9B,YAAA,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AACnB,YAAA,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AACnB,YAAA,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AACnB,YAAA,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AACpB,SAAA,CAAC,CAAC;KACJ;;;AAID,IAAA,IAAY,aAAa,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,KAAK,MAAM,CAAC;KACzF;;;;AAKD,IAAA,IAAY,WAAW,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,KAAK,KAAK,CAAC;KAC5C;;;AAID,IAAA,IACW,UAAU,GAAA;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC;KACzB;;AAGO,IAAA,OAAO,CAAC,MAAc,EAAA;QAC5B,OAAO,MAAM,IAAI,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC;KAC3C;;AAGO,IAAA,MAAM,CAAC,KAAa,EAAA;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;KACtC;AAEO,IAAA,cAAc,CAAC,KAAa,EAAA;AAClC,QAAA,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE;YACnC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE;AAC9B,gBAAA,OAAO,IAAI,CAAC;aACb;SACF;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;KACpC;;;IAIO,cAAc,GAAA;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,QAAA,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,WAAW,CAAA,EAAA,CAAI,CAAC;AACnD,QAAA,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,WAAW,CAAA,EAAA,CAAI,CAAC;AAClD,QAAA,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,WAAW,CAAA,EAAA,CAAI,CAAC;;;;AAKpD,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;SACnB;aAAM;AACL,YAAA,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,WAAW,CAAA,EAAA,CAAI,CAAC;SACtD;KACF;;IAIO,KAAK,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;AAE3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;;;QAGtE,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE;cAC7D,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE;cAC5C,EAAE,CAAC;AAEP,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC;AAC7E,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC1C,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,IAAmB,KAAI;AAC5B,gBAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACjB,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACrB,gBAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;aAC5B;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACrB,gBAAA,IAAI,CAAC,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,OAAO,IAAI,qBAAqB,CAAC;AAC9E,gBAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;aAC5B;AACF,SAAA,CAAC,CAAC;KACN;wGA/bU,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,6fAiBxB,uBAAuB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5FpC,ujIAoHC,EDnDG,MAAA,EAAA,CAAA,2sFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,OAAO,2IACP,aAAa,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAU,gRACV,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,uBAAuB,EACvB,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,qBAAqB,oGACrB,sBAAsB,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGb,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAjBpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,mBAGf,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EACP,OAAA,EAAA;wBACP,OAAO;wBACP,aAAa;wBACb,aAAa;wBACb,UAAU;wBACV,cAAc;wBACd,uBAAuB;wBACvB,qBAAqB;wBACrB,sBAAsB;AACvB,qBAAA,EAAA,QAAA,EAAA,ujIAAA,EAAA,MAAA,EAAA,CAAA,2sFAAA,CAAA,EAAA,CAAA;8BAIe,QAAQ,EAAA,CAAA;sBAAvB,KAAK;gBACU,SAAS,EAAA,CAAA;sBAAxB,KAAK;gBACU,MAAM,EAAA,CAAA;sBAArB,KAAK;gBACU,QAAQ,EAAA,CAAA;sBAAvB,KAAK;gBACU,MAAM,EAAA,CAAA;sBAArB,KAAK;gBAEU,IAAI,EAAA,CAAA;sBAAnB,KAAK;gBACU,OAAO,EAAA,CAAA;sBAAtB,KAAK;gBACU,QAAQ,EAAA,CAAA;sBAAvB,KAAK;gBAEW,eAAe,EAAA,CAAA;sBAA/B,MAAM;gBACU,eAAe,EAAA,CAAA;sBAA/B,MAAM;gBACU,WAAW,EAAA,CAAA;sBAA3B,MAAM;gBACU,YAAY,EAAA,CAAA;sBAA5B,MAAM;gBAGA,cAAc,EAAA,CAAA;sBADpB,SAAS;uBAAC,uBAAuB,CAAA;gBAwWvB,UAAU,EAAA,CAAA;sBADpB,WAAW;uBAAC,mBAAmB,CAAA;;;AEjblC;AACA;AACO,MAAM,WAAW,GAAG,EAAE,CAAC;AAiB9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MAea,qBAAqB,CAAA;AAEhB,IAAA,MAAM,CAAS;IACf,QAAQ,GAAG,KAAK,CAAC;;;AAIhB,IAAA,iBAAiB,GAAG,IAAI,YAAY,EAAmB,CAAC;;;AAIxD,IAAA,aAAa,GAAG,IAAI,YAAY,EAAQ,CAAC;;;AAIzC,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAQ,CAAC;AAG9C,IAAA,OAAO,CAAqB;AAG3B,IAAA,SAAS,CAA6B;AAGtC,IAAA,OAAO,CAA6B;IAE5B,EAAE,GAAG,WAAW,CAAC;IACjB,WAAW,GAAG,YAAY,CAAC;IAEpC,eAAe,GAAG,CAAC,CAAC;IACpB,IAAI,GAAG,CAAC,CAAC;AACT,IAAA,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC9C,mBAAmB,GAAkB,IAAI,CAAC;;AAGjC,IAAA,OAAO,GAAkB;AACvC,QAAA,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9D,QAAA,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC;AAC1F,QAAA,KAAK,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE;KACjC,CAAC;AAEM,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACjC,IAAA,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACnC,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACjC,OAAO,GAAG,KAAK,CAAC;IAChB,kBAAkB,GAAG,CAAC,CAAC;IAExB,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3F,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;;AAGlD,QAAA,IAAI,SAAS,GAAG,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE;AACtE,YAAA,IAAI,CAAC,eAAe,GAAG,SAAS,GAAG,CAAC,CAAC;SACtC;AACD,QAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;AAEpC,QAAA,IAAI,IAAI,CAAC,eAAe,IAAI,SAAS,EAAE;AACrC,YAAA,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;SAC1B;KACF;;;AAID,IAAA,IAAW,aAAa,GAAA;AACtB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,oBAAoB,CAAC;AAElF,QAAA,OAAO,MAAM,IAAI,WAAW,GAAG,EAAE,CAAC,CAAC;KACpC;IAEM,eAAe,GAAA;;;QAGpB,UAAU,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;KAClC;AAED,IAAA,IAAW,MAAM,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;KACvC;AAED,IAAA,IAAW,UAAU,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC;KAC3D;;;AAID,IAAA,IAAW,cAAc,GAAA;AACvB,QAAA,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;KACnF;AAEM,IAAA,UAAU,CAAC,KAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;KACjC;;;IAIM,OAAO,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO;SACR;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACrC,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAC1C,SAAS,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;KAC/C;IAEM,SAAS,CAAC,IAAgB,EAAE,KAAa,EAAA;QAC9C,OAAO,IAAI,CAAC,IAAI,IAAI,QAAQ,KAAK,GAAG,CAAC,CAAA,CAAE,CAAC;KACzC;AAEM,IAAA,eAAe,CAAC,WAA0B,EAAA;AAC/C,QAAA,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC;AACvC,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;KAC5B;IAEM,mBAAmB,GAAA;;AAExB,QAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,IAAI,EAAE;AACrC,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SAC5B;KACF;;AAIM,IAAA,QAAQ,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;KAC5B;IAEM,MAAM,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;KACxB;IAEM,OAAO,GAAA;AACZ,QAAA,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;KACzB;IAEM,OAAO,GAAA;AACZ,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;AAC/C,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACzD,OAAO;SACR;AAED,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,CAAC,QAAQ,CAAC,WAAW,GAAG,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC,EACnE,CAAC,QAAQ,CAAC,YAAY,GAAG,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,WAAW,CAAC,CACtE,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;KACrB;IAEM,UAAU,GAAA;AACf,QAAA,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;KACvB;;;AAKM,IAAA,iBAAiB,CAAC,QAA0D,EAAA;QACjF,IAAI,CAAC,YAAY,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,QAAe,CAAC,CAAC;AAC9D,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC1C,aAAA,SAAS,EAAE,CAAC;KAChB;;;AAIM,IAAA,aAAa,CAAC,KAAgE,EAAA;AACnF,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC;QAC9F,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC;QACtF,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;SACR;AAED,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACzE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAEhC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,KAAI;AACjD,YAAA,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;YAExB,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;AAC9C,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC;AACtD,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC1C,aAAA,SAAS,EAAE,CAAC;KAChB;;;AAIO,IAAA,cAAc,CAAC,OAA0B,EAAE,OAAe,EAAE,OAAe,EAAA;AACjF,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,gBAAgB,CAAc,sBAAsB,CAAC,CACnF,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;QAE9D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,qBAAqB,EAAE,CAAC;YAClD,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;AACnC,oBAAC,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE;AACpE,gBAAA,OAAO,KAAK,CAAC;aACd;SACF;QAED,OAAO,OAAO,CAAC,MAAM,CAAC;KACvB;;;AAKD,IAAA,IAAY,cAAc,GAAA;AACxB,QAAA,OAAO,CAAC,IAAI,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KACrD;AAEO,IAAA,SAAS,CAAC,SAA0B,EAAE,CAAS,EAAE,CAAS,EAAA;AAChE,QAAA,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAgB,EAAE,CAAC;AAE/B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAC7B;AACE,YAAA,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;AACvB,YAAA,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE;AACvD,YAAA,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE;SAChD,EACD,QAAQ,CACT,CAAC;AACF,QAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;AACrB,YAAA,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;AAClB,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;SAC7D;AAED,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAC7B;AACE,YAAA,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;AACvB,YAAA,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE;AACvD,YAAA,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE;SAChD,EACD,UAAU,CACX,CAAC;AACF,QAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;AACrB,YAAA,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;AAClB,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;SAC7D;AAED,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAE3B,QAAA,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KACjB;AAEO,IAAA,WAAW,CACjB,SAA0B,EAC1B,QAAwD,EACxD,MAAc,EAAA;AAEd,QAAA,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAgB,EAAE,CAAC;AAC/B,QAAA,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;;AAG/B,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACxB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACjE,YAAA,IAAI,OAAO,KAAK,IAAI,EAAE;gBACpB,MAAM,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;AAChC,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;aACtD;SACF;AACD,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACxB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACpD,YAAA,IAAI,OAAO,KAAK,IAAI,EAAE;AACpB,gBAAA,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC;AAC7C,gBAAA,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC;AACnB,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;aACtD;SACF;AACD,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACxB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACnE,YAAA,IAAI,OAAO,KAAK,IAAI,EAAE;gBACpB,MAAM,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;AAChC,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;aACtD;SACF;AACD,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACxB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACtD,YAAA,IAAI,OAAO,KAAK,IAAI,EAAE;AACpB,gBAAA,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC;AAC7C,gBAAA,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC;AACnB,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;aACtD;SACF;AAED,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAE3B,QAAA,OAAO,MAAM,CAAC;KACf;;;AAIO,IAAA,WAAW,CAAC,MAAuB,EAAA;AACzC,QAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACvE,QAAA,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE3E,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE,EAAE;YACzD,IAAI,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,EAAE;gBAC9B,SAAS;aACV;YAED,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACrF,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;SACxF;AAED,QAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;KACjC;;;;IAKO,SAAS,CACf,KAA0C,EAC1C,UAAoB,EAAA;QAEpB,IAAI,IAAI,GAA6D,IAAI,CAAC;AAE1E,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;AAClC,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AAClD,gBAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,cAAc,KAAK,CAAC,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE;AAC1E,oBAAA,IAAI,GAAG,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;iBACtE;aACF;SACF;QAED,OAAO,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC;KAC7D;IAEO,QAAQ,CAAC,KAAa,EAAE,UAAoB,EAAA;QAClD,IAAI,IAAI,GAAkB,IAAI,CAAC;AAC/B,QAAA,IAAI,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC;AAEvC,QAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC;AAC7C,YAAA,IAAI,QAAQ,IAAI,YAAY,EAAE;gBAC5B,IAAI,GAAG,SAAS,CAAC;gBACjB,YAAY,GAAG,QAAQ,CAAC;aACzB;SACF;AAED,QAAA,OAAO,IAAI,CAAC;KACb;;;AAIO,IAAA,aAAa,CAAC,MAAmB,EAAA;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;YAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,SAAS,GAAG,CAAA,YAAA,EAAe,KAAK,CAAC,WAAW,EAAE,CAAC;AACpD,YAAA,IAAI,KAAK,CAAC,WAAW,KAAK,GAAG,EAAE;AAC7B,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAA,EAAA,CAAI,CAAC;aACvD;iBAAM;AACL,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAA,EAAA,CAAI,CAAC;aACtD;AAED,YAAA,OAAO,IAAI,CAAC;SACb,CAAC,CAAC,CAAC;KACL;IAEO,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC;KAChD;wGA7XU,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAiBrB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,kBAAkB,EC7E/B,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,opJAgJA,ED3FI,MAAA,EAAA,CAAA,ilFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,SAAS,EACT,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,OAAO,EACP,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAU,EACV,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,qOACf,wBAAwB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGf,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAdjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,mBAGZ,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EACP,OAAA,EAAA;wBACP,SAAS;wBACT,OAAO;wBACP,UAAU;wBACV,eAAe;wBACf,wBAAwB;AACzB,qBAAA,EAAA,QAAA,EAAA,opJAAA,EAAA,MAAA,EAAA,CAAA,ilFAAA,CAAA,EAAA,CAAA;8BAIe,MAAM,EAAA,CAAA;sBAArB,KAAK;gBACU,QAAQ,EAAA,CAAA;sBAAvB,KAAK;gBAIW,iBAAiB,EAAA,CAAA;sBAAjC,MAAM;gBAIU,aAAa,EAAA,CAAA;sBAA7B,MAAM;gBAIU,QAAQ,EAAA,CAAA;sBAAxB,MAAM;gBAGA,OAAO,EAAA,CAAA;sBADb,SAAS;uBAAC,kBAAkB,CAAA;gBAIrB,SAAS,EAAA,CAAA;sBADhB,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;gBAI/B,OAAO,EAAA,CAAA;sBADd,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;;;AExCxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MAwBa,0BAA0B,CAAA;AAE9B,IAAA,SAAS,CAAkB;AAC3B,IAAA,MAAM,CAAS;IAEf,WAAW,GAAG,UAAU,CAAC;IAEzB,KAAK,GAAG,EAAE,CAAC;IAEX,UAAU,GAAG,yBAAyB,CAAC;IACvC,YAAY,GAAG,yBAAyB,CAAC;IACzC,aAAa,GAAG,yBAAyB,CAAC;IAC1C,WAAW,GAAG,yBAAyB,CAAC;IAExC,UAAU,GAAG,EAAE,CAAC;;;;;IAMhB,IAAI,GAAgB,EAAE,CAAC;IACvB,YAAY,GAAkB,IAAI,CAAC;;IAGlC,kBAAkB,GAA6B,EAAE,CAAC;IAClD,QAAQ,GAAmB,EAAE,CAAC;AAC9B,IAAA,WAAW,GAAG,IAAI,GAAG,EAA6B,CAAC;AAE1C,IAAA,WAAW,GAAqC;AAC/D,QAAA,MAAM,EAAE,aAAa;AACrB,QAAA,SAAS,EAAE,YAAY;AACvB,QAAA,OAAO,EAAE,aAAa;KACvB,CAAC;;;IAIM,QAAQ,GAAG,KAAK,CAAC;AAER,IAAA,KAAK,GAAmD,MAAM,CAAC,eAAe,CAAC,CAAC;AAChF,IAAA,UAAU,GAAG,MAAM,CAA2C,YAAY,CAAC,CAAC;AAC5E,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACjC,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7B,IAAA,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE7C,QAAQ,GAAA;QACb,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAEtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;QAExC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,GAAG,IAAI,yBAAyB,CAAC;QAC5D,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,KAAK,IAAI,yBAAyB,CAAC;QAChE,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,MAAM,IAAI,yBAAyB,CAAC;QAClE,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,IAAI,IAAI,yBAAyB,CAAC;AAE9D,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAEvE,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,YAAY,EAAE,CAAC;KACrB;AAED,IAAA,IAAW,UAAU,GAAA;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC;KACtB;;AAGM,IAAA,SAAS,CAAC,IAAsB,EAAA;QACrC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;KACvC;IAEM,IAAI,GAAG,MAAK;AACjB,QAAA,MAAM,QAAQ,GAA4B;YACxC,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,YAAA,OAAO,EAAE;gBACP,GAAG,EAAE,IAAI,CAAC,UAAU;gBACpB,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,MAAM,EAAE,IAAI,CAAC,aAAa;gBAC1B,IAAI,EAAE,IAAI,CAAC,WAAW;AACvB,aAAA;SACF,CAAC;AAEF,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC;AACjF,aAAA,IAAI,CACH,GAAG,CAAC,MAAK;AACP,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACzC,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC7B,CAAC,CACH,CAAC;AACN,KAAC,CAAC;;;;;;AAOK,IAAA,WAAW,CAAC,GAAc,EAAE,MAA8B,EAAE,EAAW,EAAA;AAC5E,QAAA,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,YAAY,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpF,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE;YACjC,IAAI,QAAQ,EAAE;gBACZ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;aACvE;YAED,OAAO;SACR;QAED,MAAM,KAAK,GAAsB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS;AAC1D,cAAE,MAAM;AACR,eAAG,GAAG,CAAC,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAC;QAE1C,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;SAClG;aAAM;YACL,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE;gBACtE,YAAY,EAAE,GAAG,CAAC,MAAM;gBACxB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,KAAK;AACN,aAAA,CAAC,CAAC,CAAC;SACL;KACF;;AAGO,IAAA,IAAI,CAAC,OAA4B,EAAA;QACvC,OAAO,CAAC,SAAS,CAAC;AAChB,YAAA,IAAI,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE;YACjC,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC7C,SAAA,CAAC,CAAC;KACJ;;;IAIO,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,YAAY,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3F,MAAM,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;YAErF,OAAO;gBACL,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,EAAE,KAAK;AACf,uBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK;AACxD,uBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;AAClC,gBAAA,MAAM,EAAE,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM;AAC9C,gBAAA,SAAS,EAAE,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,MAAM;aACrD,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;;;IAIO,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACjC,aAAA,SAAS,CAAC,CAAC,MAAc,KAAI;AAC5B,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAC7C,YAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;AAC7B,SAAC,CAAC,CAAC;KACN;AAEO,IAAA,cAAc,CAAC,KAAU,EAAA;AAC/B,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,OAAO,IAAI,yBAAyB,CAAC,CAAC;;QAE1F,IAAI,CAAC,cAAc,EAAE,CAAC;KACvB;IAEO,YAAY,CAAC,MAAc,EAAE,WAAmB,EAAA;AACtD,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAE1F,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK;aAC3B,OAAO,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC;AAClC,aAAA,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;QAErD,IAAI,CAAC,QAAQ,GAAG,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,YAAY,EAAE,CAAC;KACrB;IAEO,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AACjE,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,OAAiC,KAAI;AAC1C,gBAAA,IAAI,CAAC,kBAAkB,GAAG,OAAO,IAAI,EAAE,CAAC;gBACxC,IAAI,CAAC,YAAY,EAAE,CAAC;AACpB,gBAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;aAC5B;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;gBACf,IAAI,CAAC,YAAY,GAAG,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,sCAAsC,CAAC;AACpF,gBAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;aAC5B;AACF,SAAA,CAAC,CAAC;KACN;AAEO,IAAA,SAAS,CAAC,MAAc,EAAA;AAC9B,QAAA,OAAO,MAAM;AACV,aAAA,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;AACvB,aAAA,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;AACpB,aAAA,IAAI,EAAE;AACN,aAAA,OAAO,CAAC,OAAO,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;KAC7D;wGA1MU,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,EC3EvC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,6hMAqLO,ED3HH,MAAA,EAAA,CAAA,khCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,cAAA,EAAA,WAAA,EAAA,SAAA,EAAA,eAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,YAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,WAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,6BAAA,EAAA,QAAA,EAAA,gaAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,MAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,maACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,YAAY,EACZ,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAQ,EACR,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,SAAS,EACT,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAQ,EACR,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,cAAc,0UACd,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGD,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAvBtC,SAAS;AAGS,YAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACnC,UAAA,EAAA,IAAI,EACP,OAAA,EAAA;wBACP,WAAW;wBACX,YAAY;wBACZ,cAAc;wBACd,aAAa;wBACb,YAAY;wBACZ,aAAa;wBACb,cAAc;wBACd,gBAAgB;wBAChB,gBAAgB;wBAChB,YAAY;wBACZ,QAAQ;wBACR,SAAS;wBACT,QAAQ;wBACR,cAAc;wBACd,UAAU;AACX,qBAAA,EAAA,QAAA,EAAA,6hMAAA,EAAA,MAAA,EAAA,CAAA,khCAAA,CAAA,EAAA,CAAA;;;AE7DH;AACA;AACA;MAiBa,uBAAuB,CAAA;IAElB,WAAW,GAAG,UAAU,CAAC;IACzB,QAAQ,GAAG,KAAK,CAAC;IACjB,QAAQ,GAAG,KAAK,CAAC;AAChB,IAAA,cAAc,GAAG,IAAI,YAAY,EAAU,CAAC;IAE7D,IAAoB,QAAQ,CAAC,KAAa,EAAA;QACxC,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE;AACrC,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACzC;KACF;AAED,IAAA,IAAW,QAAQ,GAAA;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;KACvB;IAEM,IAAI,GAAW,IAAI,EAAE,CAAC;IACtB,SAAS,GAAa,EAAE,CAAC;IAExB,gBAAgB,GAAW,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;IAC5E,SAAS,GAAW,IAAI,CAAC;IAE1B,QAAQ,GAAA;AACb,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;AAE5C,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;SACvC;KACF;;;IAIO,mBAAmB,GAAA;QACzB,MAAM,IAAI,GAAG,IAAoE,CAAC;AAElF,QAAA,OAAO,OAAO,IAAI,CAAC,iBAAiB,KAAK,UAAU;AACjD,cAAE,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;AACpC,cAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KAC7B;wGAxCU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;4FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/BpC,6XAYA,EAAA,MAAA,EAAA,CAAA,2BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDWI,YAAY,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,QAAQ,EACR,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,SAAS,EACT,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,SAAS,EACT,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,kWACX,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,UAAA,EAAA,uBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EATC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYxD,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAhBnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,8BAA8B,iBAGzB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAClD,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,QAAQ;wBACR,SAAS;wBACT,SAAS;wBACT,WAAW;wBACX,YAAY;AACb,qBAAA,EAAA,QAAA,EAAA,6XAAA,EAAA,MAAA,EAAA,CAAA,2BAAA,CAAA,EAAA,CAAA;8BAIe,WAAW,EAAA,CAAA;sBAA1B,KAAK;gBACU,QAAQ,EAAA,CAAA;sBAAvB,KAAK;gBACU,QAAQ,EAAA,CAAA;sBAAvB,KAAK;gBACW,cAAc,EAAA,CAAA;sBAA9B,MAAM;gBAEa,QAAQ,EAAA,CAAA;sBAA3B,KAAK;;;AEnCR;AACA;AACA;AACA;AAEA;AACM,SAAU,aAAa,CAAC,KAAgC,EAAA;IAC5D,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,IAAI,CAAC;KACb;AAED,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAE1C,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAC7C,CAAC;AAED;AACA;AACA;AACM,SAAU,WAAW,CAAC,KAA8B,EAAA;IACxD,OAAO,KAAK,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;AACrD,UAAE,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC;UAC3B,IAAI,CAAC;AACX;;AC+BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MA6Ba,uBAAuB,CAAA;IAE3B,WAAW,GAAG,UAAU,CAAC;IAEzB,IAAI,GAAG,EAAE,CAAC;IACV,QAAQ,GAA4B,YAAY,CAAC;IACjD,eAAe,GAA6B,WAAW,CAAC;IACxD,MAAM,GAAwB,UAAU,CAAC;;;IAGzC,QAAQ,GAAG,EAAE,CAAC;IACd,WAAW,GAAG,oBAAoB,CAAC;;AAG1B,IAAA,UAAU,GAAG,MAAM,CAAqB,EAAE,CAAC,CAAC;AAE3C,IAAA,KAAK,GAAuB,MAAM,CAAC,eAAe,CAAC,CAAC;AACpD,IAAA,UAAU,GAAG,MAAM,CAA8D,YAAY,CAAC,CAAC;AAC/F,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACjC,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7B,IAAA,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC3B,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAE3C,QAAQ,GAAA;AACb,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AACjC,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAChC,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC;QAC1C,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,oBAAoB,CAAC;AAEhF,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;KAC/B;;;;IAKM,MAAM,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AACnB,YAAA,KAAK,EAAE,eAAe;YACtB,QAAQ,EAAE,WAAW,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAA2B,yBAAA,CAAA;SACvE,CAAC;AACC,aAAA,IAAI,CACH,SAAS,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAC9D,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CACrC;aACA,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACxC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AAC/C,SAAC,CAAC,CAAC;KACN;IAEM,IAAI,GAAG,MAAK;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;;;;QAKtC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE;YAClD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE;AAChD,SAAA,CAAC,CAAC;AAEH,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,aAAA,MAAM,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AAC1C,aAAA,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE;AACvE,YAAA,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAC/B,SAAA,CAAC,CAAC,CAAC;QAEN,OAAO,QAAQ,CAAC,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC;AACvC,aAAA,IAAI,CACH,GAAG,CAAC,MAAK;AACP,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;YAC/C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;SAC5C,CAAC,CACH,CAAC;AACN,KAAC,CAAC;;;AAIM,IAAA,gBAAgB,CAAC,MAAc,EAAA;AACrC,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;QAE3B,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE;AACpC,aAAA,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC;AACrE,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;AACjC,aAAA,GAAG,CAAC,CAAC,KAAK,KAAsB;AAC/B,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;YAE3C,OAAO;gBACL,KAAK;AACL,gBAAA,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,YAAY,IAAI,QAAQ;AAClE,gBAAA,KAAK,EAAE,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC;AACzC,gBAAA,GAAG,EAAE,aAAa,CAAC,YAAY,EAAE,GAAG,CAAC;AACrC,gBAAA,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACrF,gBAAA,KAAK,EAAE,YAAY,EAAE,KAAK,IAAI,EAAE;;;gBAGhC,KAAK,EAAE,CAAC,OAAgB,KACtB,YAAY,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;aAC7E,CAAC;AACJ,SAAC,CAAC,CAAC;AAEL,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KAC3B;;;AAIO,IAAA,WAAW,CAAC,GAAqB,EAAA;AACvC,QAAA,QAAQ,GAAG,CAAC,KAAK,CAAC,IAAI;YACpB,KAAK,WAAW,EAAE;gBAChB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACrC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEjC,OAAO,CAAC,KAAK,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,IAAI,CAAC;aACrF;AAED,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC;AAEzF,YAAA,KAAK,SAAS,CAAC;YACf,SAAS;gBACP,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAE/B,OAAO,KAAK,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;aACjC;SACF;KACF;;;AAIO,IAAA,eAAe,CAAC,GAAqB,EAAA;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC;AAClF,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAErE,OAAO,MAAM,KAAK,KAAK,CAAC;KACzB;;;AAIO,IAAA,UAAU,CAAC,KAAgC,EAAA;QACjD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,IAAI,CAAC;SACb;QAED,MAAM,UAAU,GAAuB,EAAE,CAAC;AAC1C,QAAA,IAAI,KAAK,CAAC,KAAK,EAAE;AACf,YAAA,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;SAChC;AACD,QAAA,IAAI,KAAK,CAAC,GAAG,EAAE;AACb,YAAA,UAAU,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;SAC5B;AACD,QAAA,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE;AACxB,YAAA,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;SAClC;AACD,QAAA,IAAI,KAAK,CAAC,KAAK,EAAE;AACf,YAAA,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;SAChC;AACD,QAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,UAAU,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;SACtC;AAED,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;KAC3D;wGAxKU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,wEC9FpC,w+MAwLO,EAAA,MAAA,EAAA,CAAA,yDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhHH,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,wqDACZ,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,MAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,6BAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,oBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,gPAClB,yBAAyB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,MAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,YAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,6BAAA,EAAA,QAAA,EAAA,sDAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACzB,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,SAAS,EACT,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,cAAc,+HACd,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,gBAAgB,EAChB,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,YAAY,4LACZ,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,OAAO,EACP,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,SAAS,qHACT,QAAQ,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,SAAS,EACT,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,WAAS,qJACT,uBAAuB,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGd,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA5BnC,SAAS;AAGS,YAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACnC,UAAA,EAAA,IAAI,EACP,OAAA,EAAA;wBACP,WAAW;wBACX,YAAY;wBACZ,cAAc;wBACd,eAAe;wBACf,YAAY;wBACZ,kBAAkB;wBAClB,yBAAyB;wBACzB,aAAa;wBACb,SAAS;wBACT,cAAc;wBACd,gBAAgB;wBAChB,gBAAgB;wBAChB,YAAY;wBACZ,QAAQ;wBACR,OAAO;wBACP,SAAS;wBACT,QAAQ;wBACR,SAAS;wBACTA,WAAS;wBACT,uBAAuB;AACxB,qBAAA,EAAA,QAAA,EAAA,w+MAAA,EAAA,MAAA,EAAA,CAAA,yDAAA,CAAA,EAAA,CAAA;;;AE5FH;AACA;AACA;AACA;AACA;AAwFA;AACA;AACA;AACa,MAAA,iBAAiB,GAAgD;AAC5E,IAAA,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;AAC7B,IAAA,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;AAC/B,IAAA,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;AACjC,IAAA,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AACrC,IAAA,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;;;ACjErC;AACA;AACA,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B;AACA;AACA;AACA;MAEa,4BAA4B,CAAA;AAE/B,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACjC,IAAA,YAAY,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAEjD,IAAA,OAAO,CAAC,MAAc,EAAA;QAC3B,MAAM,QAAQ,GAAqC,EAAE,CAAC;QACtD,MAAM,KAAK,GAA4B,EAAE,CAAC;QAE1C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,KAAI;AACvC,YAAA,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;AACvC,gBAAA,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;AAC1B,gBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;aACvD;AACH,SAAC,CAAC,CAAC;AAEH,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,EAA0B,CAAC,CAAC;AAEnF,QAAA,OAAO,IAAI;AACR,aAAA,IAAI,CACHP,KAAG,CAAC,CAAC,SAAS,KAAI;YAChB,MAAM,KAAK,GAAoB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACtF,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAChC,gBAAA,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtD,aAAC,CAAC,CAAC;YAEH,OAAO;gBACL,MAAM;gBACN,KAAK;AACL,gBAAA,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;aAC3C,CAAC;SACH,CAAC,CACH,CAAC;KACL;IAEO,cAAc,CAAC,MAAc,EAAE,SAA0B,EAAA;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;;;QAGjE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;AAChD,QAAA,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,KAAK,MAAM,CAAC;AAC5F,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,KAAK,MAAM;cACnC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE;AACzC,eAAG,YAAY,IAAI,SAAS,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;AAErD,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC;AAC3E,aAAA,IAAI,CACHA,KAAG,CAAC,CAAC,IAAmB,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EACnD,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAChD,CAAC;KACL;;;AAIO,IAAA,cAAc,CAAC,MAAc,EAAA;QACnC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,YAAY,IAAI,EAAE,EAAE;AAC7C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC,KAAK,EAAE;gBACV,SAAS;aACV;AAED,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC;YAEtC,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,EAAE;gBAC5B,KAAK,CAAC,IAAI,CAAC,CAAG,EAAA,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA,GAAA,EAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAE,CAAA,CAAC,CAAC;aAC/E;AAAM,iBAAA,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE;AAC/B,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC;aAChF;AAAM,iBAAA,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;AAC9B,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,KAAK,CAAM,GAAA,EAAA,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA,CAAA,CAAG,CAAC,CAAC;aACjD;SACF;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QAChD,IAAI,SAAS,EAAE;AACb,YAAA,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;YAC1E,KAAK,CAAC,IAAI,CAAC,CAAc,WAAA,EAAA,MAAM,EAAE,IAAI,IAAI,SAAS,CAAE,CAAA,CAAC,CAAC;SACvD;AAED,QAAA,OAAO,KAAK,CAAC;KACd;AAEO,IAAA,KAAK,CAAC,KAAuC,EAAA;QACnD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,GAAG,CAAC;SACZ;AAED,QAAA,MAAM,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAE7D,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;KACnF;wGA3FU,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;4GAA5B,4BAA4B,EAAA,CAAA,CAAA;;4FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADxC,UAAU;;;ACvCX;AACA;AACA;AACA;AACA;AACO,eAAe,gBAAgB,CACpC,SAA0B,EAC1B,IAAmB,EACnB,KAAa,EACb,MAAc,EACd,UAAU,GAAG,CAAC,EAAA;;IAGd,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,0CAAkB,CAAC,EAAE,OAAO,CAAC;IAE3D,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAG,EAAA,KAAK,IAAI,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAG,EAAA,MAAM,IAAI,CAAC;IAElC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE;AACzC,QAAA,QAAQ,EAAE,QAAQ;QAClB,KAAK;QACL,MAAM;AACP,KAAA,CAAC,CAAC;AAEH,IAAA,IAAI;QACF,KAAK,CAAC,SAAS,CAAC;AACd,YAAA,GAAG,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC;AACpC,YAAA,SAAS,EAAE,KAAK;AACjB,SAAA,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,UAAU,CAAC;AACtB,YAAA,IAAI,EAAE,KAAK;YACX,UAAU;AACV,YAAA,eAAe,EAAE,SAAS;AAC3B,SAAA,CAAC,CAAC;KACJ;YAAS;QACR,KAAK,CAAC,OAAO,EAAE,CAAC;KACjB;AACH;;AC3BA;AACA,MAAM,EAAE,GAAG,EAAE,CAAC;AAEd;AACA,MAAMQ,SAAO,GAAG,EAAE,CAAC;AACnB;AACA,MAAMC,aAAW,GAAG,EAAE,CAAC;AAEvB;AACA;AACA;AACA;AACA;AACA;MAEa,gBAAgB,CAAA;IAEpB,MAAM,MAAM,CAAC,SAA0B,EAAA;QAC5C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,OAAO,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,CAAC,MAAM,OAAO,iBAAiB,CAAC,EAAE,OAAO,CAAC;AAE5D,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;AAChC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;AACpC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;AAErC,QAAA,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC;YACpB,WAAW,EAAE,KAAK,IAAI,KAAK,GAAG,WAAW,GAAG,UAAU;AACtD,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;AACvB,SAAA,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAE9C,QAAA,KAAK,MAAM,aAAa,IAAI,SAAS,CAAC,KAAK,EAAE;YAC3C,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,IAAI,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC,CAAC;YACvE,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;AAE1D,YAAA,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,UAAU,EAAE;gBAC3C,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;aACpF;SACF;AAED,QAAA,GAAG,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,IAAA,CAAM,CAAC,CAAC;KAC5C;AAEO,IAAA,UAAU,CAAC,GAAQ,EAAE,SAA0B,EAAE,KAAa,EAAE,KAAa,EAAA;AACnF,QAAA,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACjC,QAAA,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AACpB,QAAA,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AAC5B,QAAA,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;AAElD,QAAA,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AACnC,QAAA,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AACpB,QAAA,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AAE5B,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,cAAc,CAAC;YAClC,GAAG,SAAS,CAAC,aAAa;SAC3B,CAAC;AACF,QAAA,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;KACxC;IAEO,MAAM,gBAAgB,CAAC,GAAQ,EAAE,SAAc,EAAE,IAAwB,EAAE,QAA4B,EAAA;AAC7G,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;;AAGjC,QAAA,MAAM,MAAM,GAAG,QAAQ,IAAI,SAAS,CAAC;AACrC,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;AACxB,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;AACxB,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;AACxB,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;AAExB,QAAA,IAAI,SAAS,CAAC,KAAK,EAAE;AACnB,YAAA,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACjC,YAAA,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACnB,YAAA,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AAC5B,YAAA,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;SACvD;AAED,QAAA,MAAM,KAAK,GAAG,CAAC,GAAGD,SAAO,CAAC;AAC1B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAGA,SAAO,CAAC,CAAC;AAExC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE;AACzC,YAAA,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AACnC,YAAA,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACnB,YAAA,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AAC5B,YAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,GAAG,kBAAkB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAExG,OAAO;SACR;AAED,QAAA,QAAQ,SAAS,CAAC,IAAI;YACpB,KAAK,OAAO,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AACrE,gBAAA,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBAC/C,MAAM;aACP;AACD,YAAA,KAAK,MAAM;gBACT,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBAC5E,MAAM;AACR,YAAA,KAAK,KAAK;AACR,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBAC/D,MAAM;SACT;KACF;AAEO,IAAA,YAAY,CAClB,GAAQ,EACR,SAAc,EACd,SAA0B,EAC1B,IAAmB,EACnB,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAA;AAE1C,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAoB,CAAC;AAC9C,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM;cAClC,MAAM,CAAC,OAAO;cACd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAE9D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAGC,aAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AACzD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACrC,QAAA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;AAEzE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAEvG,QAAA,IAAI,SAAS,GAAG,CAAC,EAAE;YACjB,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,SAAS,CAAA,kEAAA,CAAoE,CAAC,CAAC,CAAC;SACjG;QAED,SAAS,CAAC,GAAG,EAAE;AACb,YAAA,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI;AACJ,YAAA,MAAM,EAAE,CAAC;AACT,YAAA,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;AACnB,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE;AAC7D,YAAA,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE;AAC7E,YAAA,kBAAkB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE;AAC5C,YAAA,KAAK,EAAE,MAAM;AACd,SAAA,CAAC,CAAC;KACJ;AAEO,IAAA,UAAU,CAChB,GAAQ,EACR,SAA0B,EAC1B,IAAmB,EACnB,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAA;AAE1C,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAmB,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/B,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,QAAA,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAEtE,QAAA,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACjC,QAAA,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AACpB,QAAA,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;AAE3D,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE;AACzB,YAAA,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AACnC,YAAA,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACnB,YAAA,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AAC5B,YAAA,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;SAChF;KACF;IAEO,KAAK,CAAC,KAAc,EAAE,YAAqB,EAAA;QACjD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,YAAA,OAAO,EAAE,CAAC;SACX;AAED,QAAA,IAAI,YAAY,KAAK,MAAM,EAAE;YAC3B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAErC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;SACnF;AAED,QAAA,IAAI,YAAY,KAAK,QAAQ,EAAE;AAC7B,YAAA,OAAO,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;SAC5C;AAED,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;KACtB;AAEO,IAAA,KAAK,CAAC,IAAY,EAAA;QACxB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC;KAC3F;wGA1KU,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;4GAAhB,gBAAgB,EAAA,CAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;;;AC9BX;AACA;AACA;AACO,MAAM,mBAAmB,GAAG;AACjC,IAAA,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;AAChD,IAAA,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;CACjD,CAAC;AAEF;AACa,MAAA,uBAAuB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,CAAA,CAAE;;ACUrF;AACA,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB;AACA,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB;AACA;AACA;AACA,MAAM,eAAe,GAAkD;AACrE,IAAA,GAAG,EAAE,GAAG;AACR,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,MAAM,EAAE,GAAG;CACZ,CAAC;AAEF;AACA;AACA;AACA;AACA;AACA;MAEa,iBAAiB,CAAA;IAErB,MAAM,MAAM,CAAC,SAA0B,EAAA;QAC5C,MAAM,SAAS,GAAG,CAAC,MAAM,OAAO,WAAW,CAAC,EAAE,OAAO,CAAC;AAEtD,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;AAChC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC;AAC/B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;AAEhC,QAAA,MAAM,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;AACvB,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QAEzB,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAEhD,QAAA,KAAK,MAAM,aAAa,IAAI,SAAS,CAAC,KAAK,EAAE;AAC3C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;AAE1D,YAAA,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,UAAU,EAAE;gBAC3C,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;aAC3E;SACF;AAED,QAAA,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAG,EAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAO,KAAA,CAAA,EAAE,CAAC,CAAC;KACvE;AAEO,IAAA,WAAW,CAAC,IAAS,EAAE,SAA0B,EAAE,KAAa,EAAE,KAAa,EAAA;AACrF,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAE9B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE;AACnC,YAAA,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG;YAC5C,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ;AAC1C,SAAA,CAAC,CAAC;AAEH,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,cAAc,CAAC;YAClC,GAAG,SAAS,CAAC,aAAa;SAC3B,CAAC;QAEF,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAC9B,YAAA,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;AACjF,YAAA,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ;AAC9B,SAAA,CAAC,CAAC;KACJ;AAEO,IAAA,gBAAgB,CAAC,IAAS,EAAE,KAAU,EAAE,IAAwB,EAAE,QAA4B,EAAA;AACpG,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;;;AAGjC,QAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,IAAI,SAAS,CAAC;AAE7C,QAAA,IAAI,SAAS,CAAC,KAAK,EAAE;AACnB,YAAA,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE;AAC7B,gBAAA,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO;AACnB,gBAAA,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK;AACzD,aAAA,CAAC,CAAC;SACJ;AAED,QAAA,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC;AAC1B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;AAEzC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE;AACzC,YAAA,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,GAAG,kBAAkB,EAAE;gBACxD,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK;AACxB,gBAAA,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ;AAC/E,aAAA,CAAC,CAAC;YAEH,OAAO;SACR;AAED,QAAA,QAAQ,SAAS,CAAC,IAAI;AACpB,YAAA,KAAK,OAAO;gBACV,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBACzE,MAAM;AACR,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBACnE,MAAM;AACR,YAAA,KAAK,KAAK;AACR,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBACjE,MAAM;SACT;KACF;AAEO,IAAA,YAAY,CAClB,IAAS,EACT,KAAU,EACV,SAA0B,EAC1B,IAAmB,EACnB,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAA;AAE1C,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAqB,CAAC;AAC/C,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;QAC5C,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAEtD,QAAA,MAAM,OAAO,GAAwB;AACnC,YAAA,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG;AACvB,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;AACzB,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;AACzB,YAAA,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG;AACvB,YAAA,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ;SAC/B,CAAC;QAEF,MAAM,GAAG,GAAG,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,OAAO,CAAC;AACzD,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;;;AAIlC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,MAAM,MAAM,GAAG,WAAW;cACtB,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,KAClC,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,kBAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;AACrF,cAAE,SAAS,CAAC,UAAU,CAAC;;;;;;QAOzB,MAAM,SAAS,GAAG,OAAO;AACvB,cAAE,CAAC;AACD,oBAAA,IAAI,EAAE,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;oBAChE,MAAM;oBACN,MAAM,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;iBAC5F,CAAC;cACA,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM;AACrD,iBAAA,GAAG,CAAC,CAAC,MAAM,MAAM;gBAChB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM;AACN,gBAAA,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC;AACjD,aAAA,CAAC,CAAC,CAAC;;;QAIR,MAAM,cAAc,GAAG,OAAO;AAC5B,cAAE,QAAQ;cACR,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3D,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE;AAC5C,YAAA,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACV,YAAA,WAAW,EAAE,mBAAmB;YAChC,UAAU,EAAE,cAAc,KAAK,QAAQ;AACvC,YAAA,SAAS,EAAE,eAAe,CAAC,cAAc,CAAC;AAC1C,YAAA,cAAc,EAAE,CAAC;AACjB,YAAA,MAAM,EAAE,MAAM,CAAC,WAAW,KAAK,YAAY,GAAG,KAAK,GAAG,KAAK;YAC3D,WAAW,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,GAAG,WAAW;YACrD,QAAQ,EAAE,SAAS,KAAK,OAAO,GAAG,EAAE,GAAG,SAAS;AAChD,YAAA,oBAAoB,EAAE,CAAC;AACvB,YAAA,oBAAoB,EAAE,CAAC;AACvB,YAAA,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK;AACvC,YAAA,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK;AACjC,YAAA,oBAAoB,EAAE,EAAE;AACxB,YAAA,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG;YACvD,YAAY,EAAE,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,KAAK;AACzC,YAAA,oBAAoB,EAAE,EAAE;YACxB,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;AACvC,SAAA,CAAC,CAAC;KACJ;AAEO,IAAA,YAAY,CAClB,KAAU,EACV,SAA0B,EAC1B,IAAmB,EACnB,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAA;AAE1C,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAoB,CAAC;AAC9C,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM;cAClC,MAAM,CAAC,OAAO;cACd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAE9D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AACzD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACrC,QAAA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QAEzE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM;AACtC,YAAA,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM;AACnC,YAAA,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;AACpE,SAAA,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM;AACtD,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC;AACnD,YAAA,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC,CAAC,CAAC;AAEL,QAAA,IAAI,SAAS,GAAG,CAAC,EAAE;YACjB,IAAI,CAAC,IAAI,CAAC,CAAC;oBACT,IAAI,EAAE,CAAK,EAAA,EAAA,SAAS,CAAoE,kEAAA,CAAA;AACxF,oBAAA,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAS;AAC3E,iBAAA,CAAC,CAAC,CAAC;SACL;QAED,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE;YAChC,CAAC,EAAE,CAAC,EAAE,CAAC;AACP,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE;AACnD,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,MAAM,EAAE,QAAQ;AACjB,SAAA,CAAC,CAAC;KACJ;AAEO,IAAA,UAAU,CAChB,KAAU,EACV,SAA0B,EAC1B,IAAmB,EACnB,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAA;AAE1C,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAmB,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/B,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,QAAA,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEtE,KAAK,CAAC,OAAO,CAAC;YACZ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;YACxF,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;SAClF,EAAE;AACD,YAAA,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACV,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,MAAM,EAAE,QAAQ;AACjB,SAAA,CAAC,CAAC;KACJ;IAEO,KAAK,CAAC,KAAc,EAAE,YAAqB,EAAA;QACjD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,YAAA,OAAO,EAAE,CAAC;SACX;AAED,QAAA,IAAI,YAAY,KAAK,MAAM,EAAE;YAC3B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAErC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;SACnF;AAED,QAAA,IAAI,YAAY,KAAK,QAAQ,EAAE;AAC7B,YAAA,OAAO,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;SAC5C;AAED,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;KACtB;AAEO,IAAA,KAAK,CAAC,IAAY,EAAA;QACxB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC;KAC3F;wGApPU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;4GAAjB,iBAAiB,EAAA,CAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;;;AChCX;AACA;AACA;MAIa,aAAa,CAAA;AAEhB,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAEjC,IAAA,SAAS,GAAG,IAAI,eAAe,CAAmB,EAAE,CAAC,CAAC;AAE9D,IAAA,IAAW,QAAQ,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;KACtC;IAEM,IAAI,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;aAC9B,IAAI,CACH,GAAG,CAAC,CAAC,OAAyB,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CACvE,CAAC;KACL;;AAGM,IAAA,MAAM,CAAC,OAAe,EAAA;AAC3B,QAAA,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QAE1C,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;SACpB;QAED,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjF;AAEM,IAAA,MAAM,CAAC,IAAY,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;AACjC,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,MAAsB,KAAI;AAC7B,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;SAC7D,CAAC,CACH,CAAC;KACL;IAEM,MAAM,CAAC,QAAgB,EAAE,IAAY,EAAA;QAC1C,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;AAC3C,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,MAAsB,KAAI;YAC7B,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;iBACtB,GAAG,CAAC,CAAC,QAAQ,MAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC,CACtE,CAAC;SACH,CAAC,CACH,CAAC;KACL;AAEM,IAAA,MAAM,CAAC,QAAgB,EAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;AACrC,aAAA,IAAI,CACH,GAAG,CAAC,MAAK;YACP,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,CACrE,CAAC;SACH,CAAC,EACF,GAAG,CAAC,MAAM,SAAS,CAAC,CACrB,CAAC;KACL;wGA5DU,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cAFZ,MAAM,EAAA,CAAA,CAAA;;4FAEP,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACyBD;AACA;AACA,MAAM,cAAc,GAAG,WAAW,CAAC;AAEnC;AACA;AACA;AACA;MA4Ba,eAAe,CAAA;;IAGnB,QAAQ,GAA0B,IAAI,CAAC;IACvC,MAAM,GAAkB,IAAI,CAAC;IAC7B,cAAc,GAAG,IAAI,CAAC;IACtB,QAAQ,GAAG,KAAK,CAAC;;;;;AAMjB,IAAA,kBAAkB,CAAgB;AAGjC,IAAA,MAAM,CAA8B;AAGpC,IAAA,UAAU,CAA2B;AAE7B,IAAA,YAAY,GAAG;AAC7B,QAAA,IAAI,EAAE,EAAE;KACT,CAAC;AAEM,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACjC,IAAA,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AACvC,IAAA,YAAY,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAChD,IAAA,gBAAgB,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;AACxD,IAAA,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACzC,IAAA,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACvC,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7B,IAAA,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC3B,IAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAC5B,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACjC,IAAA,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACnC,IAAA,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAE/B,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAE1B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;AACvB,aAAA,IAAI,CACH,QAAQ,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;AAC5B,YAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;SAC5B,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CACrC;aACA,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,SAAS,EAAE,CAAC,CAAC;KAC1C;AAEM,IAAA,YAAY,GAAG,CAAC,OAAe,KAAI;QACxC,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC7C,KAAC,CAAC;AAEK,IAAA,YAAY,CAAC,MAA6B,EAAA;AAC/C,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAC7B;KACF;IAEM,YAAY,GAAA;AACjB,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AACjB,YAAA,KAAK,EAAE,eAAe;AACtB,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,WAAW,EAAE,QAAQ;AACrB,YAAA,QAAQ,EAAE,IAAI;SACf,CAAC;aACC,IAAI,CACH,SAAS,CAAC,CAAC,IAAY,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAC7D,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CACrC;AACA,aAAA,SAAS,CAAC,CAAC,MAAsB,KAAI;AACpC,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;AAC3B,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC9B,SAAC,CAAC,CAAC;KACN;IAEM,cAAc,GAAA;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;KAChC;;;;IAKM,cAAc,GAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO;SACR;AAED,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAyD,uBAAuB,EAAE;AACjG,YAAA,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AAC7B,YAAA,KAAK,EAAE,OAAO;SACf,CAAC;AACC,aAAA,WAAW,EAAE;AACb,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC1C,aAAA,SAAS,CAAC,CAAC,MAAM,KAAI;;;AAGpB,YAAA,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS,EAAE;AAChC,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrB,gBAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC1B,gBAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBAE3B,OAAO;aACR;YAED,IAAI,MAAM,EAAE,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAC/C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACnC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;aAC3C;AACH,SAAC,CAAC,CAAC;KACN;;;AAIM,IAAA,iBAAiB,CAAC,SAA+B,EAAA;AACtD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO;SACR;AAED,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE;YAC5C,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE;AACxC,YAAA,KAAK,EAAE,OAAO;SACf,CAAC;AACC,aAAA,WAAW,EAAE;AACb,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAC1C,SAAS,CAAC,MAAK;;;;AAId,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;aACpC;AACH,SAAC,CAAC,CAAC;KACN;;;IAIM,qBAAqB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SACpC;KACF;;;;;IAMM,gBAAgB,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO;SACR;AAED,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,sBAAsB,EACtB,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;aAClC,IAAI,CACH,SAAS,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CACpE,CACJ,CAAC;KACH;;;;IAKM,SAAS,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,OAAO;SACR;AAED,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,eAAe,EACf,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;aAClC,IAAI,CACH,SAAS,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CACnE,CACJ,CAAC;KACH;;;AAIM,IAAA,cAAc,CAAC,QAA0B,EAAA;;;;QAI9C,IAAI,QAAQ,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC3C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SACpC;;QAGD,IAAI,QAAQ,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC3C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SAC3C;KACF;;;AAIM,IAAA,aAAa,CAAC,KAAmB,EAAA;QACtC,KAAK,CAAC,cAAc,EAAE,CAAC;AAEvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;AAC3C,QAAA,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAEpD,QAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAK;AAChC,YAAA,MAAM,IAAI,GAAG,CAAC,CAAe,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,MAAK;AACf,gBAAA,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC9C,gBAAA,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAChD,gBAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAC7C,gBAAA,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;gBACjD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACzD,aAAC,CAAC;AAEF,YAAA,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAC7C,YAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAC1C,YAAA,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AAChD,SAAC,CAAC,CAAC;KACJ;AAEO,IAAA,SAAS,CAAC,OAAe,EAAA;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;AAC/D,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE;YACpB,OAAO;SACR;AAED,QAAA,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC;AACjD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,CAAG,EAAA,OAAO,GAAG,GAAG,GAAG,CAAC;KACrE;AAEO,IAAA,WAAW,CAAC,QAAgB,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC3B,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC1C,aAAA,SAAS,CAAC,CAAC,MAAc,KAAI;AAC5B,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACrB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC1B,YAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;AAC7B,SAAC,CAAC,CAAC;KACN;;;IAIO,aAAa,GAAA;QACnB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE;AACpC,aAAA,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC;AACrE,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;KACtC;;;;AAKD,IAAA,IAAW,gBAAgB,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;KACtE;;;;;AAMD,IAAA,IAAW,eAAe,GAAA;QACxB,OAAO;YACL,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,GAAG,KAAK,CAAC,EAAE,CAAA,CAAA,EAAI,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,KAAK,CAAC,KAAK,CAAA,CAAE,CAAC;YACnF,IAAI,CAAC,mBAAmB,EAAE,GAAG,WAAW,GAAG,EAAE;AAC9C,SAAA,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACb;;;;;IAMO,kBAAkB,GAAA;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,IAAI,CAAC;QAEzC,MAAM,KAAK,GAAG,QAAQ;AACpB,cAAE,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAC/B,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;cACzF,EAAE,CAAC;AAEP,QAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE;YAC1C,KAAK,CAAC,IAAI,CAAC;AACT,gBAAA,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,QAAQ,CAAC,MAAM;AACrB,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,MAAM,EAAE,MAAM,iBAAiB;gBAC/B,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,SAAS;AACpD,aAAA,CAAC,CAAC;SACJ;QAED,IAAI,CAAC,kBAAkB,GAAG;;;AAGxB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,OAAO,EAAE,KAAK;YACd,KAAK;AACL,YAAA,MAAM,EAAE,CAAC,KAAK,KAAI;AAChB,gBAAA,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,oBAAoB,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE;oBACxF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;iBAC5C;;AAED,gBAAA,IAAI,CAAC,YAAY,CAAC,YAAY,CAAE,KAAK,GAAG,cAAc,CAAsB,IAAI,IAAI,CAAC,CAAC;aACvF;SACF,CAAC;KACH;;;IAIO,mBAAmB,GAAA;QACzB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,KAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,KAC7B,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC;KAC9E;AAEO,IAAA,kBAAkB,CAAC,QAAgB,EAAA;AACzC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;AACvB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC1C,aAAA,SAAS,CAAC,CAAC,OAAyB,KAAI;AACvC,YAAA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;YACjE,IAAI,OAAO,EAAE;AACX,gBAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;AACxB,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,oBAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;iBACtD;AACD,gBAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;aAC5B;AACH,SAAC,CAAC,CAAC;KACN;wGAjVU,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EArBf,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,SAAA,EAAA;;;YAGT,wBAAwB;YACxB,4BAA4B;YAC5B,iBAAiB;YACjB,gBAAgB;;;YAGhB,kBAAkB,CAAC,EAAE,OAAO,EAAE,MAAM,OAAO,0CAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AACtG,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EA4B6C,UAAU,EC3F1D,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,q/FAgGM,ED/BF,MAAA,EAAA,CAAA,mxCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,kWACX,yBAAyB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,MAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,YAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,6BAAA,EAAA,QAAA,EAAA,sDAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kCAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACzB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,iBAAiB,EACjB,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,OAAO,2IACP,qBAAqB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,EAAA,eAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGZ,eAAe,EAAA,UAAA,EAAA,CAAA;kBA3B3B,SAAS;sCAGS,uBAAuB,CAAC,MAAM,EACnC,UAAA,EAAA,IAAI,WACP,CAAC,sBAAsB,CAAC,EACtB,SAAA,EAAA;;;wBAGT,wBAAwB;wBACxB,4BAA4B;wBAC5B,iBAAiB;wBACjB,gBAAgB;;;wBAGhB,kBAAkB,CAAC,EAAE,OAAO,EAAE,MAAM,OAAO,0CAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;qBACtG,EACQ,OAAA,EAAA;wBACP,WAAW;wBACX,yBAAyB;wBACzB,cAAc;wBACd,YAAY;wBACZ,iBAAiB;wBACjB,OAAO;wBACP,qBAAqB;AACtB,qBAAA,EAAA,QAAA,EAAA,q/FAAA,EAAA,MAAA,EAAA,CAAA,mxCAAA,CAAA,EAAA,CAAA;wDAiBO,MAAM,EAAA,CAAA;sBADb,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;gBAI5B,UAAU,EAAA,CAAA;sBADjB,SAAS;uBAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;;;AE3F5D;;;;;;AAMG;;ACNH;;AAEG;;;;"}
|