@datarecce/ui 0.1.6 → 0.1.9

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../recce-source/js/src/lib/api/cacheKeys.ts","../recce-source/js/src/lib/const.ts","../recce-source/js/src/lib/api/axiosClient.ts","../recce-source/js/src/lib/api/instanceInfo.ts","../recce-source/js/src/lib/hooks/useRecceInstanceInfo.tsx","../recce-source/js/src/components/ui/toaster.tsx","../recce-source/js/src/lib/hooks/useCheckToast.tsx","../recce-source/js/src/lib/hooks/useClipBoardToast.tsx","../recce-source/js/src/components/lineage/LineageViewContext.tsx","../recce-source/js/src/lib/api/track.ts","../recce-source/js/src/components/lineage/useValueDiffAlertDialog.tsx"],"names":["createContext","useContext","trk","useState","useCallback","nodeCount","jsxs","jsx","Stack"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAO,IAAM,SAAA,GAAY;AAAA,EACvB,QAAA,EAAU,CAAC,KAAA,KAAkB,CAAC,aAAa,KAAK,CAAA;AAAA,EAChD,OAAA,EAAS,MAAM,CAAC,SAAS,CAAA;AAAA,EACzB,MAAA,EAAQ,MAAM,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,EAC/B,KAAA,EAAO,CAAC,OAAA,KAAoB,CAAC,UAAU,OAAO,CAAA;AAAA,EAC9C,aAAa,CAAC,OAAA,KAAoB,CAAC,QAAA,EAAU,SAAS,QAAQ,CAAA;AAAA,EAC9D,IAAA,EAAM,MAAM,CAAC,MAAM,CAAA;AAAA,EACnB,GAAA,EAAK,CAAC,KAAA,KAAkB,CAAC,QAAQ,KAAK,CAAA;AAAA,EACtC,cAAA,EAAgB,MAAM,CAAC,iBAAiB,CAAA;AAAA,EACxC,IAAA,EAAM,MAAM,CAAC,MAAM,CAAA;AAAA,EACnB,YAAA,EAAc,MAAM,CAAC,eAAe,CAAA;AAAA,EACpC,IAAA,EAAM,MAAM,CAAC,MAAM;AACrB,CAAA;;;ACZA,IAAI,MAAA,GAAS,QAAQ,GAAA,CAAI,mBAAA;AACzB,MAAA,KAAW,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,EAAA;AAE7D,IAAM,cAAA,GAAiB,MAAA;AAEZ,QAAQ,GAAA,CAAI;;;ACDvB,IAAM,WAAA,GAAc,MAAM,MAAA,CAAO;AAAA,EACtC,OAAA,EAAS;AACX,CAAC,CAAA;AAE+B,IAAI,WAAA;;;ACQpC,eAAsB,oBAAA,GAAmD;AACvE,EAAA,OAAA,CACE,MAAM,WAAA,CAAY,GAAA;AAAA,IAChB;AAAA,GACF,EACA,IAAA;AACJ;;;AClBO,IAAM,uBAAuB,MAAM;AACxC,EAAA,OAAO,QAAA,CAA4B;AAAA,IACjC,QAAA,EAAU,UAAU,YAAA,EAAa;AAAA,IACjC,OAAA,EAAS;AAAA,GACV,CAAA;AACH;ACsCuB,cAA0C,IAAI;AAErE,IAAI,cAAA,GAAiB,CAAA;AAmHrB,IAAM,SAAA,uBAAkD,GAAA,EAAI;AAErD,IAAM,OAAA,GAAU;AAAA,EACrB,MAAA,EAAQ,CAAC,OAAA,KAAkC;AACzC,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,EAAA,IAAM,CAAA,MAAA,EAAS,EAAE,cAAc,CAAA,CAAA;AAClD,IAAA,SAAA,CAAU,OAAA;AAAA,MAAQ,CAAC,QAAA,KACjB,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,EAAA,EAAG,EAAG;AAAA,KAC1D;AACA,IAAA,OAAO,EAAA;AAAA,EACT,CAAA;AAAA,EACA,OAAA,EAAS,CAAC,OAAA,KACR,OAAA,CAAQ,MAAA,CAAO,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,EAChD,KAAA,EAAO,CAAC,OAAA,KACN,OAAA,CAAQ,MAAA,CAAO,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,EAC9C,OAAA,EAAS,CAAC,OAAA,KACR,OAAA,CAAQ,MAAA,CAAO,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,EAChD,IAAA,EAAM,CAAC,OAAA,KACL,OAAA,CAAQ,MAAA,CAAO,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,EAC7C,OAAA,EAAS,CAAC,OAAA,KACR,OAAA,CAAQ,MAAA,CAAO,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,EAChD,OAAA,EAAS,CAAC,EAAA,KAAe;AACvB,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,CAAC,CAAA;AAAA,EACnE,CAAA;AAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,EAAA,KAAe;AACtB,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,CAAC,CAAA;AAAA,EACnE,CAAA;AAAA,EACA,MAAA,EAAQ,CAAC,EAAA,EAAY,OAAA,KAAmC;AACtD,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa,QAAA,CAAS,EAAE,MAAM,QAAA,EAAU,EAAA,EAAI,OAAA,EAAS,CAAC,CAAA;AAAA,EAC3E,CAAA;AAAA,EACA,SAAA,EAAW,CAAC,QAAA,KAA0C;AACpD,IAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,IAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,EACxC;AACF,CAAA;;;ACpMO,SAAS,aAAA,GAAgB;AAC9B,EAAA,SAAS,qBAAA,GAAwB;AAC/B,IAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,MACb,KAAA,EAAO,oBAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AACA,EAAA,OAAO;AAAA,IACL;AAAA,GACF;AACF;;;ACXO,SAAS,iBAAA,GAAoB;AAClC,EAAA,SAAS,aAAa,OAAA,EAAiB;AACrC,IAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,MACb,WAAA,EAAa,OAAA;AAAA,MACb,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,SAAA,CAAU,OAAe,KAAA,EAAgB;AAChD,IAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,MACb,KAAA;AAAA,MACA,WAAA,EAAa,OAAO,KAAK,CAAA;AAAA,MACzB,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA;AAAA,GACF;AACF;AC2CO,IAAM,kBAAA,GAAqBA,cAEhC,MAAS,CAAA;AAYJ,IAAM,wBAAwB,MAA0C;AAC7E,EAAA,OAAOC,WAAW,kBAAkB,CAAA;AACtC;AC7EA,SAAS,KAAA,CACP,UAAA,EAEA,eAAA,EACA,YAAA,EACyB;AAEzB,EAA2B;AACzB,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,UAAA,EAAY,eAAA,EAAiB,YAAY,CAAA;AAAA,EACrE;AACA,EAAA,OAAOC,OAAA,CAAI,UAAA,EAAY,eAAA,EAAiB,YAAY,CAAA;AACtD;AAqLO,IAAM,cAAA,GAAiB;AAAA,EAK5B,UAAA,EAAY,YAMd,CAAA;AA6BO,IAAM,kBAAA,GAAqB;AAAA,EAChC,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAUO,SAAS,uBAAuB,KAAA,EAA+B;AACpE,EAAA,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAC1C;AC/OA,SAAS,uBAAA,GAA0B;AACjC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,CAAC,CAAA;AAC5C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GACtCA,QAAAA,EAAmC;AACrC,EAAA,MAAM,SAAA,GAAY,OAA0B,IAAI,CAAA;AAEhD,EAAA,MAAM,OAAA,GAAUC,WAAAA,CAAY,CAACC,UAAAA,KAAsB;AACjD,IAAA,YAAA,CAAaA,UAAS,CAAA;AACtB,IAAA,OAAO,IAAI,OAAA,CAAiB,CAAC,OAAA,KAAY;AACvC,MAAA,iBAAA,CAAkB,MAAM,OAAO,CAAA;AAC/B,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,sBAAA,CAAuB;AAAA,MACrB,QAAQ,cAAA,CAAe,UAAA;AAAA,MACvB,OAAO,kBAAA,CAAmB;AAAA,KAC3B,CAAA;AACD,IAAA,cAAA,GAAiB,IAAI,CAAA;AACrB,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,sBAAA,CAAuB;AAAA,MACrB,QAAQ,cAAA,CAAe,UAAA;AAAA,MACvB,OAAO,kBAAA,CAAmB;AAAA,KAC3B,CAAA;AACD,IAAA,cAAA,GAAiB,KAAK,CAAA;AACtB,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,uCACJC,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA,EAAS,YAAA;AAAA,MACT,QAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAS,IAAA;AAAA,MACT,iBAAA,EAAgB,+BAAA;AAAA,MAEhB,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAG,+BAAA;AAAA,YACH,EAAA,EAAI,EAAE,QAAA,EAAU,UAAA,EAAY,YAAY,MAAA,EAAO;AAAA,YAChD,QAAA,EAAA;AAAA,cAAA,gBAAA;AAAA,cACgB,SAAA;AAAA,cAAU;AAAA;AAAA;AAAA,SAC3B;AAAA,wBACAC,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAW,OAAA;AAAA,YACX,OAAA,EAAS,YAAA;AAAA,YACT,EAAA,EAAI;AAAA,cACF,QAAA,EAAU,UAAA;AAAA,cACV,KAAA,EAAO,CAAA;AAAA,cACP,GAAA,EAAK,CAAA;AAAA,cACL,KAAA,EAAO;AAAA,aACT;AAAA,YAEA,QAAA,kBAAAA,IAAC,OAAA,EAAA,EAAQ;AAAA;AAAA,SACX;AAAA,wBACAA,GAAAA,CAAC,aAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAACC,MAAAA,EAAA,EAAM,OAAA,EAAQ,MAAA,EACb,QAAA,kBAAAF,IAAAA,CAAC,GAAA,EAAA,EAAI,QAAA,EAAA;AAAA,UAAA,iCAAA;AAAA,UAC6B,SAAA;AAAA,UAAU;AAAA,SAAA,EAE5C,GACF,CAAA,EACF,CAAA;AAAA,wBACAA,IAAAA,CAAC,aAAA,EAAA,EAAc,IAAI,EAAE,GAAA,EAAK,KAAI,EAC5B,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,SAAA;AAAA,cACL,OAAA,EAAS,YAAA;AAAA,cACT,OAAA,EAAQ,UAAA;AAAA,cACR,KAAA,EAAM,SAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,UAAA;AAAA,cACN,OAAA,EAAQ,WAAA;AAAA,cACR,OAAA,EAAS,aAAA;AAAA,cACT,EAAA,EAAI,EAAE,EAAA,EAAI,GAAA,EAAI;AAAA,cACf,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAGF,EAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAa,oBAAA,EAAqB;AACtD;AAEA,IAAO,+BAAA,GAAQ","file":"hooks.mjs","sourcesContent":["export const cacheKeys = {\n rowCount: (model: string) => [\"row_count\", model],\n lineage: () => [\"lineage\"],\n checks: () => [\"checks\", \"list\"],\n check: (checkId: string) => [\"checks\", checkId],\n checkEvents: (checkId: string) => [\"checks\", checkId, \"events\"],\n runs: () => [\"runs\"],\n run: (runId: string) => [\"runs\", runId],\n runsAggregated: () => [\"runs_aggregated\"],\n flag: () => [\"flag\"],\n instanceInfo: () => [\"instance_info\"],\n user: () => [\"user\"],\n};\n","let apiUrl = process.env.NEXT_PUBLIC_API_URL;\napiUrl ??= typeof window !== \"undefined\" ? window.location.origin : \"\";\n\nexport const PUBLIC_API_URL = apiUrl;\n\nlet cloudWebUrl = process.env.NEXT_PUBLIC_CLOUD_WEB_URL;\ncloudWebUrl ??= \"https://cloud.datarecce.io\";\n\nexport const PUBLIC_CLOUD_WEB_URL = cloudWebUrl;\n","import { QueryClient } from \"@tanstack/react-query\";\nimport axios from \"axios\";\nimport { PUBLIC_API_URL } from \"@/lib/const\";\n\nexport const axiosClient = axios.create({\n baseURL: PUBLIC_API_URL,\n});\n\nexport const reactQueryClient = new QueryClient();\n","import { AxiosResponse } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\n\nexport interface RecceInstanceInfo {\n server_mode: \"server\" | \"preview\" | \"read-only\";\n single_env: boolean;\n authed: boolean;\n cloud_instance: boolean;\n lifetime_expired_at?: Date;\n idle_timeout?: number;\n share_url?: string;\n session_id?: string;\n organization_name?: string;\n web_url?: string;\n}\n\nexport async function getRecceInstanceInfo(): Promise<RecceInstanceInfo> {\n return (\n await axiosClient.get<never, AxiosResponse<RecceInstanceInfo>>(\n \"/api/instance-info\",\n )\n ).data;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { cacheKeys } from \"../api/cacheKeys\";\nimport { getRecceInstanceInfo, RecceInstanceInfo } from \"../api/instanceInfo\";\n\nexport const useRecceInstanceInfo = () => {\n return useQuery<RecceInstanceInfo>({\n queryKey: cacheKeys.instanceInfo(),\n queryFn: getRecceInstanceInfo,\n });\n};\n","\"use client\";\n\nimport Alert from \"@mui/material/Alert\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useState,\n} from \"react\";\n\n/**\n * Toast types and interfaces\n */\nexport interface ToastOptions {\n id?: string;\n title?: string;\n description?: ReactNode;\n type?: \"success\" | \"error\" | \"warning\" | \"info\" | \"loading\";\n duration?: number;\n closable?: boolean;\n action?: {\n label: string;\n onClick: () => void;\n };\n}\n\ninterface ToastState extends ToastOptions {\n id: string;\n open: boolean;\n}\n\ninterface ToasterContextValue {\n toast: (options: ToastOptions) => string;\n success: (options: Omit<ToastOptions, \"type\">) => string;\n error: (options: Omit<ToastOptions, \"type\">) => string;\n warning: (options: Omit<ToastOptions, \"type\">) => string;\n info: (options: Omit<ToastOptions, \"type\">) => string;\n loading: (options: Omit<ToastOptions, \"type\">) => string;\n dismiss: (id: string) => void;\n update: (id: string, options: Partial<ToastOptions>) => void;\n}\n\nconst ToasterContext = createContext<ToasterContextValue | null>(null);\n\nlet toastIdCounter = 0;\n\n/**\n * Simple toaster implementation using MUI Snackbar\n */\nexport function ToasterProvider({ children }: { children: ReactNode }) {\n const [toasts, setToasts] = useState<ToastState[]>([]);\n\n const createToast = useCallback((options: ToastOptions): string => {\n const id = options.id || `toast-${++toastIdCounter}`;\n const newToast: ToastState = {\n id,\n open: true,\n duration: options.type === \"loading\" ? null : (options.duration ?? 5000),\n closable: options.closable ?? true,\n ...options,\n } as ToastState;\n\n setToasts((prev) => {\n // Remove existing toast with same id\n const filtered = prev.filter((t) => t.id !== id);\n return [...filtered, newToast];\n });\n\n return id;\n }, []);\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) =>\n prev.map((t) => (t.id === id ? { ...t, open: false } : t)),\n );\n // Remove after animation\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, 300);\n }, []);\n\n const update = useCallback((id: string, options: Partial<ToastOptions>) => {\n setToasts((prev) =>\n prev.map((t) => (t.id === id ? { ...t, ...options } : t)),\n );\n }, []);\n\n const contextValue: ToasterContextValue = {\n toast: createToast,\n success: (opts) => createToast({ ...opts, type: \"success\" }),\n error: (opts) => createToast({ ...opts, type: \"error\" }),\n warning: (opts) => createToast({ ...opts, type: \"warning\" }),\n info: (opts) => createToast({ ...opts, type: \"info\" }),\n loading: (opts) => createToast({ ...opts, type: \"loading\" }),\n dismiss,\n update,\n };\n\n return (\n <ToasterContext.Provider value={contextValue}>\n {children}\n {toasts.map((toast) => (\n <Snackbar\n key={toast.id}\n open={toast.open}\n autoHideDuration={toast.duration}\n onClose={() => toast.closable && dismiss(toast.id)}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n >\n <Alert\n severity={toast.type === \"loading\" ? \"info\" : toast.type || \"info\"}\n onClose={toast.closable ? () => dismiss(toast.id) : undefined}\n icon={\n toast.type === \"loading\" ? (\n <CircularProgress size={20} color=\"inherit\" />\n ) : undefined\n }\n sx={{ width: \"100%\", minWidth: 300 }}\n >\n <Stack spacing={0.5}>\n {toast.title && (\n <Typography variant=\"subtitle2\" fontWeight=\"bold\">\n {toast.title}\n </Typography>\n )}\n {toast.description && (\n <Typography variant=\"body2\" component=\"div\">\n {toast.description}\n </Typography>\n )}\n </Stack>\n </Alert>\n </Snackbar>\n ))}\n </ToasterContext.Provider>\n );\n}\n\n/**\n * Hook to use the toaster\n */\nexport function useToaster(): ToasterContextValue {\n const context = useContext(ToasterContext);\n if (!context) {\n throw new Error(\"useToaster must be used within ToasterProvider\");\n }\n return context;\n}\n\n/**\n * Standalone toaster instance for use outside React context\n * Uses a simple event-based system\n */\ninterface ToastEvent {\n type: \"create\" | \"dismiss\" | \"update\";\n options?: ToastOptions;\n id?: string;\n}\n\nconst listeners: Set<(event: ToastEvent) => void> = new Set();\n\nexport const toaster = {\n create: (options: ToastOptions): string => {\n const id = options.id || `toast-${++toastIdCounter}`;\n listeners.forEach((listener) =>\n listener({ type: \"create\", options: { ...options, id } }),\n );\n return id;\n },\n success: (options: Omit<ToastOptions, \"type\">) =>\n toaster.create({ ...options, type: \"success\" }),\n error: (options: Omit<ToastOptions, \"type\">) =>\n toaster.create({ ...options, type: \"error\" }),\n warning: (options: Omit<ToastOptions, \"type\">) =>\n toaster.create({ ...options, type: \"warning\" }),\n info: (options: Omit<ToastOptions, \"type\">) =>\n toaster.create({ ...options, type: \"info\" }),\n loading: (options: Omit<ToastOptions, \"type\">) =>\n toaster.create({ ...options, type: \"loading\" }),\n dismiss: (id: string) => {\n listeners.forEach((listener) => listener({ type: \"dismiss\", id }));\n },\n // Alias for dismiss (for backward compatibility)\n remove: (id: string) => {\n listeners.forEach((listener) => listener({ type: \"dismiss\", id }));\n },\n update: (id: string, options: Partial<ToastOptions>) => {\n listeners.forEach((listener) => listener({ type: \"update\", id, options }));\n },\n subscribe: (listener: (event: ToastEvent) => void) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n};\n\n/**\n * Toaster component that renders toasts from the standalone toaster\n */\nexport function Toaster() {\n const [toasts, setToasts] = useState<ToastState[]>([]);\n\n // Subscribe to toast events\n useState(() => {\n const unsubscribe = toaster.subscribe((event) => {\n if (event.type === \"create\" && event.options) {\n const newToast: ToastState = {\n id: event.options.id || `toast-${++toastIdCounter}`,\n open: true,\n duration:\n event.options.type === \"loading\"\n ? undefined\n : (event.options.duration ?? 5000),\n closable: event.options.closable ?? true,\n ...event.options,\n } as ToastState;\n setToasts((prev) => {\n const filtered = prev.filter((t) => t.id !== newToast.id);\n return [...filtered, newToast];\n });\n } else if (event.type === \"dismiss\" && event.id) {\n const id = event.id;\n setToasts((prev) =>\n prev.map((t) => (t.id === id ? { ...t, open: false } : t)),\n );\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, 300);\n } else if (event.type === \"update\" && event.id && event.options) {\n setToasts((prev) =>\n prev.map((t) => (t.id === event.id ? { ...t, ...event.options } : t)),\n );\n }\n });\n return unsubscribe;\n });\n\n const handleClose = (id: string) => {\n setToasts((prev) =>\n prev.map((t) => (t.id === id ? { ...t, open: false } : t)),\n );\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, 300);\n };\n\n return (\n <>\n {toasts.map((toast) => (\n <Snackbar\n key={toast.id}\n open={toast.open}\n autoHideDuration={toast.duration}\n onClose={() => toast.closable && handleClose(toast.id)}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n >\n <Alert\n severity={toast.type === \"loading\" ? \"info\" : toast.type || \"info\"}\n onClose={toast.closable ? () => handleClose(toast.id) : undefined}\n icon={\n toast.type === \"loading\" ? (\n <CircularProgress size={20} color=\"inherit\" />\n ) : undefined\n }\n sx={{ width: \"100%\", minWidth: 300 }}\n >\n <Stack spacing={0.5}>\n {toast.title && (\n <Typography variant=\"subtitle2\" fontWeight=\"bold\">\n {toast.title}\n </Typography>\n )}\n {toast.description && (\n <Typography variant=\"body2\" component=\"div\">\n {toast.description}\n </Typography>\n )}\n </Stack>\n </Alert>\n </Snackbar>\n ))}\n </>\n );\n}\n","import { toaster } from \"@/components/ui/toaster\";\n\nexport function useCheckToast() {\n function markedAsApprovedToast() {\n toaster.create({\n title: \"Marked as approved\",\n type: \"success\",\n duration: 2000,\n });\n }\n return {\n markedAsApprovedToast,\n };\n}\n","import { toaster } from \"@/components/ui/toaster\";\n\nexport function useClipBoardToast() {\n function successToast(message: string) {\n toaster.create({\n description: message,\n type: \"info\",\n duration: 5000,\n closable: true,\n });\n }\n\n function failToast(title: string, error: unknown) {\n toaster.create({\n title: title,\n description: String(error),\n type: \"error\",\n duration: 5000,\n closable: true,\n });\n }\n\n return {\n successToast,\n failToast,\n };\n}\n","import React, { createContext, useContext } from \"react\";\nimport { CllInput, ColumnLineageData } from \"@/lib/api/cll\";\nimport { LineageDiffViewOptions } from \"@/lib/api/lineagecheck\";\nimport { Run } from \"@/lib/api/types\";\nimport { LineageGraphNode, LineageGraphNodes } from \"./lineage\";\n\ntype NewType = LineageDiffViewOptions;\ntype ActionMode = \"per_node\" | \"multi_nodes\";\n\ninterface NodeAction {\n mode: ActionMode;\n status?: \"pending\" | \"running\" | \"success\" | \"failure\" | \"skipped\";\n skipReason?: string;\n run?: Run;\n}\n\nexport interface ActionState {\n mode: ActionMode;\n status: \"pending\" | \"running\" | \"canceling\" | \"canceled\" | \"completed\";\n currentRun?: Partial<Run>;\n completed: number;\n total: number;\n actions: Record<string, NodeAction>;\n}\n\nexport interface LineageViewContextType {\n interactive: boolean;\n nodes: LineageGraphNodes[];\n focusedNode?: LineageGraphNode;\n selectedNodes: LineageGraphNode[];\n cll: ColumnLineageData | undefined;\n\n // context menu\n showContextMenu: (event: React.MouseEvent, node: LineageGraphNodes) => void;\n\n // filter\n viewOptions: LineageDiffViewOptions;\n onViewOptionsChanged: (options: NewType) => void;\n\n // Multi nodes selection\n selectMode: \"selecting\" | \"action_result\" | undefined;\n selectNode: (nodeId: string) => void;\n selectParentNodes: (nodeId: string, degree?: number) => void;\n selectChildNodes: (nodeId: string, degree?: number) => void;\n deselect: () => void;\n\n // node state\n isNodeHighlighted: (nodeId: string) => boolean;\n isNodeSelected: (nodeId: string) => boolean;\n isEdgeHighlighted: (source: string, target: string) => boolean;\n getNodeAction: (nodeId: string) => NodeAction;\n getNodeColumnSet: (nodeId: string) => Set<string>;\n isNodeShowingChangeAnalysis: (nodeId: string) => boolean;\n\n //actions\n runRowCount: () => Promise<void>;\n runRowCountDiff: () => Promise<void>;\n runValueDiff: () => Promise<void>;\n addLineageDiffCheck: (viewMode?: string) => void;\n addSchemaDiffCheck: () => void;\n cancel: () => void;\n actionState: ActionState;\n\n // Column Level Lineage\n centerNode: (nodeId: string) => void;\n showColumnLevelLineage: (cll?: CllInput) => Promise<void>;\n resetColumnLevelLineage: (previous?: boolean) => Promise<void>;\n}\n\nexport const LineageViewContext = createContext<\n LineageViewContextType | undefined\n>(undefined);\n\nexport const useLineageViewContextSafe = (): LineageViewContextType => {\n const context = useContext(LineageViewContext);\n if (!context) {\n throw new Error(\n \"useLineageViewContext must be used within a LineageViewProvider\",\n );\n }\n return context;\n};\n\nexport const useLineageViewContext = (): LineageViewContextType | undefined => {\n return useContext(LineageViewContext);\n};\n","import {\n AmplitudeReturn,\n BaseEvent,\n EventOptions,\n Result,\n} from \"@amplitude/analytics-core\";\nimport { initAll, track as trk } from \"@amplitude/unified\";\n\nfunction track(\n eventInput: string | BaseEvent,\n // biome-ignore lint/suspicious/noExplicitAny: Amplitude library uses any for event properties\n eventProperties?: Record<string, any> | undefined,\n eventOptions?: EventOptions | undefined,\n): AmplitudeReturn<Result> {\n // If Amplitude isn't initialized, log to console instead\n if (!amplitudeInitialized) {\n console.log(\"[Tracking]\", eventInput, eventProperties, eventOptions);\n }\n return trk(eventInput, eventProperties, eventOptions);\n}\n\nlet amplitudeInitialized = false;\n\nexport function trackInit() {\n function getCookie(key: string) {\n const b = document.cookie.match(\"(^|;)\\\\s*\" + key + \"\\\\s*=\\\\s*([^;]+)\");\n return b ? b.pop() : \"\";\n }\n\n const userId =\n process.env.NODE_ENV === \"development\"\n ? \"web_dev\"\n : getCookie(\"recce_user_id\");\n const apiKey = process.env.AMPLITUDE_API_KEY;\n if (userId && apiKey) {\n try {\n void initAll(apiKey, {\n analytics: {\n userId,\n autocapture: true,\n },\n sessionReplay: {\n sampleRate: 1,\n },\n });\n amplitudeInitialized = true;\n } catch (e) {\n console.error(e);\n }\n }\n\n // Log when Amplitude is not initialized (for development/debugging)\n if (!amplitudeInitialized) {\n console.log(\n \"[Tracking] Amplitude not initialized (missing API key or user ID). Events will be logged to console instead.\",\n );\n }\n}\n\ninterface MultiNodeActionProps {\n type:\n | \"row_count\"\n | \"row_count_diff\"\n | \"value_diff\"\n | \"schema_diff\"\n | \"lineage_diff\";\n selected: \"single\" | \"multi\" | \"none\";\n}\n\nexport function trackMultiNodesAction(props: MultiNodeActionProps) {\n track(\"[Web] multi_nodes_action\", props);\n}\n\ninterface HistoryActionProps {\n name: \"show\" | \"hide\" | \"click_run\" | \"add_to_checklist\" | \"go_to_check\";\n}\n\nexport function trackHistoryAction(props: HistoryActionProps) {\n track(\"[Web] history_action\", props);\n}\n\ninterface PreviewChangeProps {\n action: \"explore\" | \"run\" | \"close\";\n node?: string;\n status?: \"success\" | \"failure\";\n}\n\nexport function trackPreviewChange(props: PreviewChangeProps) {\n track(\"[Experiment] preview_change\", props);\n}\n\ninterface PreviewChangeFeedbackProps {\n feedback: \"like\" | \"dislike\" | \"form\";\n node?: string;\n}\n\nexport function trackPreviewChangeFeedback(props: PreviewChangeFeedbackProps) {\n track(\"[Experiment] preview_change\", props);\n}\n\ninterface SingleEnvironmentProps {\n action:\n | \"onboarding\"\n | \"external_link\"\n | \"preview_changes\"\n | `target_base_added`;\n from?: \"onboarding\" | \"preview_changes\";\n node?: string;\n}\n\nexport function trackSingleEnvironment(props: SingleEnvironmentProps) {\n track(\"[Experiment] single_environment\", props);\n}\n\nexport function getExperimentTrackingBreakingChangeEnabled() {\n return false;\n}\n\ninterface ColumnLevelLineageProps {\n action: \"view\";\n source: \"schema_column\" | \"changed_column\" | \"cll_column\";\n}\n\nexport function trackColumnLevelLineage(props: ColumnLevelLineageProps) {\n track(\"[Web] column_level_lineage\", props);\n}\n\ninterface ShareStateProps {\n name: \"enable\" | \"create\" | \"copy\";\n}\n\nexport function trackShareState(props: ShareStateProps) {\n track(\"[Web] share_state\", props);\n}\n\ninterface StateActionProps {\n name: \"import\" | \"export\";\n}\n\nexport function trackStateAction(props: StateActionProps) {\n track(\"[Web] state_action\", props);\n}\n\ninterface CopyToClipboardProps {\n from: \"run\" | \"check\" | \"lineage_view\";\n type: string;\n}\n\nexport function trackCopyToClipboard(props: CopyToClipboardProps) {\n track(\"[Click] copy_to_clipboard\", props);\n}\n\ninterface TrackNavProps {\n from: string;\n to: string;\n}\n\nexport function trackNavigation(props: TrackNavProps) {\n track(\"[Web] navigation_change\", props);\n}\n\nexport interface LineageViewRenderProps {\n node_count: number;\n view_mode: string;\n impact_radius_enabled: boolean;\n cll_column_active?: boolean;\n right_sidebar_open: boolean;\n [status: string]: number | string | boolean | undefined;\n}\n\nexport function trackLineageViewRender(props: LineageViewRenderProps) {\n track(\"[Web] lineage_view_render\", props);\n}\n\nexport interface EnvironmentConfigProps {\n review_mode: boolean;\n adapter_type: string | null;\n has_git_info: boolean;\n has_pr_info: boolean;\n // Adapter-specific (shape varies by adapter_type)\n base?: {\n schema_count?: number;\n dbt_version?: string | null;\n timestamp?: string | null;\n has_env?: boolean;\n };\n current?: {\n schema_count?: number;\n dbt_version?: string | null;\n timestamp?: string | null;\n has_env?: boolean;\n };\n schemas_match?: boolean;\n}\n\nexport function trackEnvironmentConfig(props: EnvironmentConfigProps) {\n track(\"[Web] environment_config\", props);\n}\n\n// Explore action types\nexport const EXPLORE_ACTION = {\n ROW_COUNT: \"row_count\",\n ROW_COUNT_DIFF: \"row_count_diff\",\n PROFILE: \"profile\",\n PROFILE_DIFF: \"profile_diff\",\n VALUE_DIFF: \"value_diff\",\n SCHEMA_DIFF: \"schema_diff\",\n LINEAGE_DIFF: \"lineage_diff\",\n QUERY: \"query\",\n HISTOGRAM_DIFF: \"histogram_diff\",\n TOP_K_DIFF: \"top_k_diff\",\n} as const;\n\n// Explore action sources\nexport const EXPLORE_SOURCE = {\n LINEAGE_VIEW_TOP_BAR: \"lineage_view_top_bar\",\n LINEAGE_VIEW_CONTEXT_MENU: \"lineage_view_context_menu\",\n NODE_KEBAB_MENU: \"node_kebab_menu\",\n NODE_SIDEBAR_SINGLE_ENV: \"node_sidebar_single_env\",\n NODE_SIDEBAR_MULTI_ENV: \"node_sidebar_multi_env\",\n SCHEMA_ROW_COUNT_BUTTON: \"schema_row_count_button\",\n SCHEMA_COLUMN_MENU: \"schema_column_menu\",\n} as const;\n\nexport type ExploreActionType =\n (typeof EXPLORE_ACTION)[keyof typeof EXPLORE_ACTION];\nexport type ExploreSourceType =\n (typeof EXPLORE_SOURCE)[keyof typeof EXPLORE_SOURCE];\n\ninterface ExploreActionProps {\n action: ExploreActionType;\n source: ExploreSourceType;\n node_count?: number;\n}\n\nexport function trackExploreAction(props: ExploreActionProps) {\n track(\"[Web] explore_action\", props);\n}\n\n// Explore action form events\nexport const EXPLORE_FORM_EVENT = {\n EXECUTE: \"execute\",\n CANCEL: \"cancel\",\n} as const;\n\nexport type ExploreFormEventType =\n (typeof EXPLORE_FORM_EVENT)[keyof typeof EXPLORE_FORM_EVENT];\n\ninterface ExploreActionFormProps {\n action: ExploreActionType;\n event: ExploreFormEventType;\n}\n\nexport function trackExploreActionForm(props: ExploreActionFormProps) {\n track(\"[Web] explore_action_form\", props);\n}\n\n// Helper to check if a run type is an explore action\nexport function isExploreAction(type: string): type is ExploreActionType {\n return Object.values(EXPLORE_ACTION).includes(type as ExploreActionType);\n}\n\n// Lineage selection action types\nexport const LINEAGE_SELECTION_ACTION = {\n SELECT_PARENT_NODES: \"select_parent_nodes\",\n SELECT_CHILD_NODES: \"select_child_nodes\",\n SELECT_ALL_UPSTREAM: \"select_all_upstream\",\n SELECT_ALL_DOWNSTREAM: \"select_all_downstream\",\n} as const;\n\nexport type LineageSelectionActionType =\n (typeof LINEAGE_SELECTION_ACTION)[keyof typeof LINEAGE_SELECTION_ACTION];\n\ninterface LineageSelectionProps {\n action: LineageSelectionActionType;\n node_count?: number;\n}\n\nexport function trackLineageSelection(props: LineageSelectionProps) {\n track(\"[Web] lineage_selection\", props);\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport React, { useCallback, useRef, useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport {\n EXPLORE_ACTION,\n EXPLORE_FORM_EVENT,\n trackExploreActionForm,\n} from \"@/lib/api/track\";\n\nfunction useValueDiffAlertDialog() {\n const [open, setOpen] = useState(false);\n const [nodeCount, setNodeCount] = useState(0);\n const [resolvePromise, setResolvePromise] =\n useState<(value: boolean) => void>();\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n const confirm = useCallback((nodeCount: number) => {\n setNodeCount(nodeCount);\n return new Promise<boolean>((resolve) => {\n setResolvePromise(() => resolve);\n setOpen(true);\n });\n }, []);\n\n const handleConfirm = () => {\n trackExploreActionForm({\n action: EXPLORE_ACTION.VALUE_DIFF,\n event: EXPLORE_FORM_EVENT.EXECUTE,\n });\n resolvePromise?.(true);\n setOpen(false);\n };\n\n const handleCancel = () => {\n trackExploreActionForm({\n action: EXPLORE_ACTION.VALUE_DIFF,\n event: EXPLORE_FORM_EVENT.CANCEL,\n });\n resolvePromise?.(false);\n setOpen(false);\n };\n\n const ValueDiffAlertDialog = (\n <MuiDialog\n open={open}\n onClose={handleCancel}\n maxWidth=\"md\"\n fullWidth\n aria-labelledby=\"value-diff-alert-dialog-title\"\n >\n <DialogTitle\n id=\"value-diff-alert-dialog-title\"\n sx={{ fontSize: \"1.125rem\", fontWeight: \"bold\" }}\n >\n Value Diff on {nodeCount} nodes\n </DialogTitle>\n <IconButton\n aria-label=\"close\"\n onClick={handleCancel}\n sx={{\n position: \"absolute\",\n right: 8,\n top: 8,\n color: \"grey.500\",\n }}\n >\n <IoClose />\n </IconButton>\n <DialogContent>\n <Stack spacing=\"20px\">\n <Box>\n Value diff will be executed on {nodeCount} nodes in the Lineage,\n which can add extra costs to your bill.\n </Box>\n </Stack>\n </DialogContent>\n <DialogActions sx={{ gap: 0.5 }}>\n <Button\n ref={cancelRef}\n onClick={handleCancel}\n variant=\"outlined\"\n color=\"neutral\"\n >\n Cancel\n </Button>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n onClick={handleConfirm}\n sx={{ ml: 1.5 }}\n >\n Execute\n </Button>\n </DialogActions>\n </MuiDialog>\n );\n\n return { confirm, AlertDialog: ValueDiffAlertDialog };\n}\n\nexport default useValueDiffAlertDialog;\n"]}
1
+ {"version":3,"sources":["../recce-source/js/src/lib/api/cacheKeys.ts","../recce-source/js/src/lib/const.ts","../recce-source/js/src/lib/api/axiosClient.ts","../recce-source/js/src/lib/api/instanceInfo.ts","../recce-source/js/src/lib/hooks/useRecceInstanceInfo.tsx","../recce-source/js/src/components/ui/toaster.tsx","../recce-source/js/src/lib/hooks/useCheckToast.tsx","../recce-source/js/src/lib/hooks/useClipBoardToast.tsx","../recce-source/js/src/components/lineage/LineageViewContext.tsx","../recce-source/js/src/lib/api/track.ts","../recce-source/js/src/components/lineage/useValueDiffAlertDialog.tsx","../recce-source/js/src/components/lineage/lineage.ts","../recce-source/js/src/constants/urls.ts","../recce-source/js/src/lib/utils/formatTime.ts","../recce-source/js/src/components/lineage/ServerDisconnectedModalContent.tsx","../recce-source/js/src/lib/hooks/RecceInstanceContext.tsx","../recce-source/js/src/lib/api/flag.ts","../recce-source/js/src/lib/api/info.ts","../recce-source/js/src/lib/api/types.ts","../recce-source/js/src/lib/api/runs.ts","../recce-source/js/src/lib/api/keepAlive.ts","../recce-source/js/src/lib/hooks/useIdleDetection.tsx","../recce-source/js/src/lib/hooks/IdleTimeoutContext.tsx","../recce-source/js/src/lib/hooks/useRecceServerFlag.tsx","../recce-source/js/src/lib/hooks/LineageGraphContext.tsx","../recce-source/js/src/components/icons/index.tsx","../recce-source/js/src/components/run/RunModal.tsx","../recce-source/js/src/lib/hooks/useModelColumns.tsx","../recce-source/js/src/components/histogram/HistogramDiffForm.tsx","../recce-source/js/src/utils/formatters.tsx","../recce-source/js/src/components/charts/SquareIcon.tsx","../recce-source/js/src/components/charts/HistogramChart.tsx","../recce-source/js/src/components/screenshot/ScreenshotBox.tsx","../recce-source/js/src/components/histogram/HistogramDiffResultView.tsx","../recce-source/js/src/components/profile/ProfileDiffForm.tsx","../recce-source/js/src/lib/dataGrid/shared/columnBuilders.ts","../recce-source/js/src/components/valuediff/shared.ts","../recce-source/js/src/components/ui/dataGrid/DataFrameColumnGroupHeader.tsx","../recce-source/js/src/components/ui/dataGrid/DataFrameColumnHeader.tsx","../recce-source/js/src/lib/mergeKeys.ts","../recce-source/js/src/utils/transforms.ts","../recce-source/js/src/lib/dataGrid/shared/gridUtils.ts","../recce-source/js/src/components/ui/dataGrid/defaultRenderCell.tsx","../recce-source/js/src/components/ui/mui-theme.ts","../recce-source/js/src/components/query/DiffText.tsx","../recce-source/js/src/components/ui/dataGrid/inlineRenderCell.tsx","../recce-source/js/src/lib/dataGrid/shared/toDiffColumn.tsx","../recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.tsx","../recce-source/js/src/lib/dataGrid/shared/rowBuilders.ts","../recce-source/js/src/lib/dataGrid/shared/simpleColumnBuilder.tsx","../recce-source/js/src/lib/dataGrid/shared/validation.ts","../recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.ts","../recce-source/js/src/lib/dataGrid/generators/toDataGrid.ts","../recce-source/js/src/components/rowcount/delta.ts","../recce-source/js/src/lib/dataGrid/generators/rowCountUtils.ts","../recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.ts","../recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.ts","../recce-source/js/src/components/ui/dataGrid/schemaCells.tsx","../recce-source/js/src/components/ui/dataGrid/valueDiffCells.tsx","../recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.ts","../recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.ts","../recce-source/js/src/lib/dataGrid/dataGridFactory.ts","../recce-source/js/src/components/data-grid/agGridTheme.ts","../recce-source/js/src/components/data-grid/ScreenshotDataGrid.tsx","../recce-source/js/src/components/query/ToggleSwitch.tsx","../recce-source/js/src/components/run/RunToolbar.tsx","../recce-source/js/src/components/profile/ProfileDiffResultView.tsx","../recce-source/js/src/components/query/ChangedOnlyCheckbox.tsx","../recce-source/js/src/components/query/QueryDiffResultView.tsx","../recce-source/js/src/components/query/QueryResultView.tsx","../recce-source/js/src/components/rowcount/RowCountDiffResultView.tsx","../recce-source/js/src/components/top-k/TopKDiffForm.tsx","../recce-source/js/src/components/charts/TopKSummaryList.tsx","../recce-source/js/src/components/top-k/TopKDiffResultView.tsx","../recce-source/js/src/components/valuediff/ValueDiffDetailResultView.tsx","../recce-source/js/src/components/valuediff/ValueDiffForm.tsx","../recce-source/js/src/components/valuediff/ValueDiffResultView.tsx","../recce-source/js/src/components/run/registry.ts","../recce-source/js/src/lib/hooks/useAppRouter.ts","../recce-source/js/src/lib/hooks/RecceActionContext.tsx","../recce-source/js/src/lib/hooks/RecceCheckContext.tsx","../recce-source/js/src/lib/hooks/RecceQueryContext.tsx","../recce-source/js/src/lib/api/state.ts","../recce-source/js/src/lib/hooks/RecceShareStateContext.tsx","../recce-source/js/src/lib/hooks/RecceContextProvider.tsx"],"names":["createContext","useContext","trk","useState","useCallback","nodeCount","jsxs","MuiDialog","DialogTitle","jsx","IconButton","DialogContent","Stack","Box","DialogActions","Button","Fragment","Typography","isDebugEnabled","useRef","useEffect","useQuery","status","useMemo","lineage","stateMetadata","IoClose","_","error","ChartJS","Chart","forwardRef","ReactSelect","MenuItem","VscPinned","VscPin","Menu","Tooltip","createIndexColumn","createPrimaryKeyColumn","React","isPrimaryKey","VscKey","PiDotsThreeVertical","ListSubheader","createColumnNameRenderer","pinnedColumns","displayMode","FormControlLabel","Checkbox","primaryKeys","changedOnly","PiWarning","FormControl","FormLabel","NativeSelect","MuiTooltip","CategoryScale","BarElement","LinearScale","Link","TextField","usePathname","useQueryClient","runId"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAO,IAAM,SAAA,GAAY;AAAA,EACvB,QAAA,EAAU,CAAC,KAAA,KAAkB,CAAC,aAAa,KAAK,CAAA;AAAA,EAChD,OAAA,EAAS,MAAM,CAAC,SAAS,CAAA;AAAA,EACzB,MAAA,EAAQ,MAAM,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,EAC/B,KAAA,EAAO,CAAC,OAAA,KAAoB,CAAC,UAAU,OAAO,CAAA;AAAA,EAC9C,aAAa,CAAC,OAAA,KAAoB,CAAC,QAAA,EAAU,SAAS,QAAQ,CAAA;AAAA,EAC9D,IAAA,EAAM,MAAM,CAAC,MAAM,CAAA;AAAA,EACnB,GAAA,EAAK,CAAC,KAAA,KAAkB,CAAC,QAAQ,KAAK,CAAA;AAAA,EACtC,cAAA,EAAgB,MAAM,CAAC,iBAAiB,CAAA;AAAA,EACxC,IAAA,EAAM,MAAM,CAAC,MAAM,CAAA;AAAA,EACnB,YAAA,EAAc,MAAM,CAAC,eAAe,CAAA;AAAA,EACpC,IAAA,EAAM,MAAM,CAAC,MAAM;AACrB,CAAA;;;ACZA,IAAI,MAAA,GAAS,QAAQ,GAAA,CAAI,mBAAA;AACzB,MAAA,KAAW,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,EAAA;AAE7D,IAAM,cAAA,GAAiB,MAAA;AAEZ,QAAQ,GAAA,CAAI;;;ACDvB,IAAM,WAAA,GAAc,MAAM,MAAA,CAAO;AAAA,EACtC,OAAA,EAAS;AACX,CAAC,CAAA;AAE+B,IAAI,WAAA;;;ACQpC,eAAsB,oBAAA,GAAmD;AACvE,EAAA,OAAA,CACE,MAAM,WAAA,CAAY,GAAA;AAAA,IAChB;AAAA,GACF,EACA,IAAA;AACJ;;;AClBO,IAAM,uBAAuB,MAAM;AACxC,EAAA,OAAO,QAAA,CAA4B;AAAA,IACjC,QAAA,EAAU,UAAU,YAAA,EAAa;AAAA,IACjC,OAAA,EAAS;AAAA,GACV,CAAA;AACH;ACsCuB,cAA0C,IAAI;AAErE,IAAI,cAAA,GAAiB,CAAA;AAmHrB,IAAM,SAAA,uBAAkD,GAAA,EAAI;AAErD,IAAM,OAAA,GAAU;AAAA,EACrB,MAAA,EAAQ,CAAC,OAAA,KAAkC;AACzC,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,EAAA,IAAM,CAAA,MAAA,EAAS,EAAE,cAAc,CAAA,CAAA;AAClD,IAAA,SAAA,CAAU,OAAA;AAAA,MAAQ,CAAC,QAAA,KACjB,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,EAAA,EAAG,EAAG;AAAA,KAC1D;AACA,IAAA,OAAO,EAAA;AAAA,EACT,CAAA;AAAA,EACA,OAAA,EAAS,CAAC,OAAA,KACR,OAAA,CAAQ,MAAA,CAAO,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,EAChD,KAAA,EAAO,CAAC,OAAA,KACN,OAAA,CAAQ,MAAA,CAAO,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,EAC9C,OAAA,EAAS,CAAC,OAAA,KACR,OAAA,CAAQ,MAAA,CAAO,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,EAChD,IAAA,EAAM,CAAC,OAAA,KACL,OAAA,CAAQ,MAAA,CAAO,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,EAC7C,OAAA,EAAS,CAAC,OAAA,KACR,OAAA,CAAQ,MAAA,CAAO,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,EAChD,OAAA,EAAS,CAAC,EAAA,KAAe;AACvB,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,CAAC,CAAA;AAAA,EACnE,CAAA;AAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,EAAA,KAAe;AACtB,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,CAAC,CAAA;AAAA,EACnE,CAAA;AAAA,EACA,MAAA,EAAQ,CAAC,EAAA,EAAY,OAAA,KAAmC;AACtD,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa,QAAA,CAAS,EAAE,MAAM,QAAA,EAAU,EAAA,EAAI,OAAA,EAAS,CAAC,CAAA;AAAA,EAC3E,CAAA;AAAA,EACA,SAAA,EAAW,CAAC,QAAA,KAA0C;AACpD,IAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,IAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,EACxC;AACF,CAAA;;;ACpMO,SAAS,aAAA,GAAgB;AAC9B,EAAA,SAAS,qBAAA,GAAwB;AAC/B,IAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,MACb,KAAA,EAAO,oBAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AACA,EAAA,OAAO;AAAA,IACL;AAAA,GACF;AACF;;;ACXO,SAAS,iBAAA,GAAoB;AAClC,EAAA,SAAS,aAAa,OAAA,EAAiB;AACrC,IAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,MACb,WAAA,EAAa,OAAA;AAAA,MACb,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,SAAA,CAAU,OAAe,KAAA,EAAgB;AAChD,IAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,MACb,KAAA;AAAA,MACA,WAAA,EAAa,OAAO,KAAK,CAAA;AAAA,MACzB,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA;AAAA,GACF;AACF;AC2CO,IAAM,kBAAA,GAAqBA,cAEhC,MAAS,CAAA;AAYJ,IAAM,wBAAwB,MAA0C;AAC7E,EAAA,OAAOC,WAAW,kBAAkB,CAAA;AACtC;AC7EA,SAAS,KAAA,CACP,UAAA,EAEA,eAAA,EACA,YAAA,EACyB;AAEzB,EAA2B;AACzB,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,UAAA,EAAY,eAAA,EAAiB,YAAY,CAAA;AAAA,EACrE;AACA,EAAA,OAAOC,OAAA,CAAI,UAAA,EAAY,eAAA,EAAiB,YAAY,CAAA;AACtD;AA2FO,SAAS,uBAAuB,KAAA,EAA+B;AACpE,EAAA,KAAA,CAAM,mCAAmC,KAAK,CAAA;AAChD;AAwFO,IAAM,cAAA,GAAiB;AAAA,EAC5B,SAAA,EAAW,WAAA;AAAA,EACX,cAAA,EAAgB,gBAAA;AAAA,EAChB,OAAA,EAAS,SAAA;AAAA,EACT,YAAA,EAAc,cAAA;AAAA,EACd,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,YAAA,EAAc,cAAA;AAAA,EACd,KAAA,EAAO,OAAA;AAAA,EACP,cAAA,EAAgB,gBAAA;AAAA,EAChB,UAAA,EAAY;AACd,CAAA;AA6BO,IAAM,kBAAA,GAAqB;AAAA,EAChC,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAUO,SAAS,uBAAuB,KAAA,EAA+B;AACpE,EAAA,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAC1C;AAGO,SAAS,gBAAgB,IAAA,EAAyC;AACvE,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,cAAc,CAAA,CAAE,SAAS,IAAyB,CAAA;AACzE;ACpPA,SAAS,uBAAA,GAA0B;AACjC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,CAAC,CAAA;AAC5C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GACtCA,QAAAA,EAAmC;AACrC,EAAA,MAAM,SAAA,GAAY,OAA0B,IAAI,CAAA;AAEhD,EAAA,MAAM,OAAA,GAAUC,WAAAA,CAAY,CAACC,UAAAA,KAAsB;AACjD,IAAA,YAAA,CAAaA,UAAS,CAAA;AACtB,IAAA,OAAO,IAAI,OAAA,CAAiB,CAAC,OAAA,KAAY;AACvC,MAAA,iBAAA,CAAkB,MAAM,OAAO,CAAA;AAC/B,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,sBAAA,CAAuB;AAAA,MACrB,QAAQ,cAAA,CAAe,UAAA;AAAA,MACvB,OAAO,kBAAA,CAAmB;AAAA,KAC3B,CAAA;AACD,IAAA,cAAA,GAAiB,IAAI,CAAA;AACrB,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,sBAAA,CAAuB;AAAA,MACrB,QAAQ,cAAA,CAAe,UAAA;AAAA,MACvB,OAAO,kBAAA,CAAmB;AAAA,KAC3B,CAAA;AACD,IAAA,cAAA,GAAiB,KAAK,CAAA;AACtB,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,uCACJC,IAAAA;AAAA,IAACC,UAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA,EAAS,YAAA;AAAA,MACT,QAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAS,IAAA;AAAA,MACT,iBAAA,EAAgB,+BAAA;AAAA,MAEhB,QAAA,EAAA;AAAA,wBAAAD,IAAAA;AAAA,UAACE,YAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAG,+BAAA;AAAA,YACH,EAAA,EAAI,EAAE,QAAA,EAAU,UAAA,EAAY,YAAY,MAAA,EAAO;AAAA,YAChD,QAAA,EAAA;AAAA,cAAA,gBAAA;AAAA,cACgB,SAAA;AAAA,cAAU;AAAA;AAAA;AAAA,SAC3B;AAAA,wBACAC,GAAAA;AAAA,UAACC,WAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAW,OAAA;AAAA,YACX,OAAA,EAAS,YAAA;AAAA,YACT,EAAA,EAAI;AAAA,cACF,QAAA,EAAU,UAAA;AAAA,cACV,KAAA,EAAO,CAAA;AAAA,cACP,GAAA,EAAK,CAAA;AAAA,cACL,KAAA,EAAO;AAAA,aACT;AAAA,YAEA,QAAA,kBAAAD,IAAC,OAAA,EAAA,EAAQ;AAAA;AAAA,SACX;AAAA,wBACAA,GAAAA,CAACE,cAAA,EAAA,EACC,QAAA,kBAAAF,GAAAA,CAACG,MAAAA,EAAA,EAAM,OAAA,EAAQ,MAAA,EACb,QAAA,kBAAAN,IAAAA,CAACO,KAAA,EAAA,EAAI,QAAA,EAAA;AAAA,UAAA,iCAAA;AAAA,UAC6B,SAAA;AAAA,UAAU;AAAA,SAAA,EAE5C,GACF,CAAA,EACF,CAAA;AAAA,wBACAP,IAAAA,CAACQ,cAAA,EAAA,EAAc,IAAI,EAAE,GAAA,EAAK,KAAI,EAC5B,QAAA,EAAA;AAAA,0BAAAL,GAAAA;AAAA,YAACM,OAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,SAAA;AAAA,cACL,OAAA,EAAS,YAAA;AAAA,cACT,OAAA,EAAQ,UAAA;AAAA,cACR,KAAA,EAAM,SAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAN,GAAAA;AAAA,YAACM,OAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,UAAA;AAAA,cACN,OAAA,EAAQ,WAAA;AAAA,cACR,OAAA,EAAS,aAAA;AAAA,cACT,EAAA,EAAI,EAAE,EAAA,EAAI,GAAA,EAAI;AAAA,cACf,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAGF,EAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAa,oBAAA,EAAqB;AACtD;AAEA,IAAO,+BAAA,GAAQ;ACdR,SAAS,iBAAA,CACd,IAAA,EACA,OAAA,EACA,IAAA,EACc;AACd,EAAA,MAAM,QAA0C,EAAC;AACjD,EAAA,MAAM,QAA0C,EAAC;AACjD,EAAA,MAAM,SAAA,GAAY,CAChB,GAAA,EACA,IAAA,KACqB;AACrB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,GAAA;AAAA,MACJ,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,GAAA;AAAA,QACJ,IAAA,EAAM,GAAA;AAAA,QACN,IAAA;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACX;AAAA,QACA,SAAS,EAAC;AAAA,QACV,UAAU;AAAC,OACb;AAAA,MACA,IAAA,EAAM;AAAA;AAAA,KAER;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,MAAW,CAAC,KAAK,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACxD,IAAA,KAAA,CAAM,GAAG,CAAA,GAAI,SAAA,CAAU,GAAA,EAAK,MAAM,CAAA;AAClC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,QAAA;AAC5B,MAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAA,GAAO,QAAA,CAAS,IAAA;AAChC,MAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,YAAA,GAAe,QAAA,CAAS,aAAA;AACxC,MAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,YAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,KAAK,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC3D,IAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAmC;AAC9C,MAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAA,GAAO,MAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,GAAG,CAAA,GAAI,SAAA,CAAU,GAAA,EAAK,SAAS,CAAA;AAAA,IACvC;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,KAAK,OAAA,GAAU,OAAA,CAAQ,MAAM,GAAG,CAAA;AAChD,MAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAA,GAAO,QAAA,CAAS,IAAA;AAChC,MAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,YAAA,GAAe,QAAA,CAAS,aAAA;AACxC,MAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,YAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,OAAO,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AAC9D,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,SAAA,GAAY,MAAM,KAAK,CAAA;AAC7B,MAAA,MAAM,UAAA,GAAa,MAAM,MAAM,CAAA;AAC/B,MAAA,MAAM,EAAA,GAAK,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAE7B,MAAA,IAAI,CAAC,SAAA,IAAa,CAAC,UAAA,EAAY;AAE7B,QAAA;AAAA,MACF;AACA,MAAA,KAAA,CAAM,EAAE,CAAA,GAAI;AAAA,QACV,EAAA;AAAA,QACA,QAAQ,UAAA,CAAW,EAAA;AAAA,QACnB,QAAQ,SAAA,CAAU,EAAA;AAAA,QAClB,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM;AAAA;AACR,OACF;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,EAAE,CAAA;AAErB,MAAA,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,GAAI,IAAA;AACjC,MAAA,UAAA,CAAW,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,GAAI,IAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,OAAO,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA,EAAG;AACjE,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,SAAA,GAAY,MAAM,KAAK,CAAA;AAC7B,MAAA,MAAM,UAAA,GAAa,MAAM,MAAM,CAAA;AAC/B,MAAA,MAAM,EAAA,GAAK,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAE7B,MAAA,IAAI,CAAC,SAAA,IAAa,CAAC,UAAA,EAAY;AAE7B,QAAA;AAAA,MACF;AACA,MAAA,MAAM,YAAA,GAAe,MAAM,EAAE,CAAA;AAC7B,MAAA,IAAI,YAAA,EAAc,IAAA,IAAQ,KAAA,CAAM,EAAE,EAAE,IAAA,EAAM;AACxC,QAAA,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,IAAA,GAAO,MAAA;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,EAAE,CAAA,GAAI;AAAA,UACV,EAAA;AAAA,UACA,QAAQ,UAAA,CAAW,EAAA;AAAA,UACnB,QAAQ,SAAA,CAAU,EAAA;AAAA,UAClB,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM;AAAA;AACR,SACF;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,EAAE,CAAA;AAErB,MAAA,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,GAAI,IAAA;AACjC,MAAA,UAAA,CAAW,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,GAAI,IAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,MAAM,cAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/C,IAAA,MAAM,QAAA,GAAW,OAAO,GAAG,CAAA;AAC3B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,eAAe,QAAA,CAAS,aAAA;AAClC,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,IAAA,CAAK,KAAK,MAAA,GAAS;AAAA,UACjB,QAAA,EAAU,SAAS,MAAA,CAAO,QAAA;AAAA,UAC1B,OAAA,EAAS,SAAS,MAAA,CAAO;AAAA,SAC3B;AAAA,MACF;AACA,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AAAA,IACtB,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AACpC,MAAA,IAAA,CAAK,KAAK,YAAA,GAAe,SAAA;AACzB,MAAA,WAAA,CAAY,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW;AACvC,MAAA,IAAA,CAAK,KAAK,YAAA,GAAe,OAAA;AACzB,MAAA,WAAA,CAAY,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAM,QAAA,EAAU,QAAA;AACjD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAS,QAAA,EAAU,QAAA;AAEpD,MAAA,IAAI,SAAA,IAAa,SAAA,IAAa,SAAA,KAAc,SAAA,EAAW;AACrD,QAAA,IAAA,CAAK,KAAK,YAAA,GAAe,UAAA;AACzB,QAAA,WAAA,CAAY,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,GAAG,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC5C,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC7B,QAAA,IAAA,CAAK,KAAK,YAAA,GAAe,SAAA;AAAA,MAC3B,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW;AACvC,QAAA,IAAA,CAAK,KAAK,YAAA,GAAe,OAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,IAAA,EAAM,KAAK,iBAAA,IAAqB,MAAA;AAAA,MAChC,OAAA,EAAS,QAAQ,iBAAA,IAAqB;AAAA,KACxC;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM,KAAK,gBAAA,IAAoB,MAAA;AAAA,MAC/B,OAAA,EAAS,QAAQ,gBAAA,IAAoB;AAAA;AACvC,GACF;AACF;;;AC9PO,IAAM,0BAAA,GAA6B,iCAAA;;;ACe1C,SAAS,kBAAkB,YAAA,EAAsC;AAC/D,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AACvC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,IAAI,CAAA;AAAA,IAChC,OAAA,EAAS,IAAA,CAAK,KAAA,CAAO,OAAA,GAAU,OAAQ,EAAE,CAAA;AAAA,IACzC,SAAS,OAAA,GAAU;AAAA,GACrB;AACF;AAMA,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,OAAA,EAAS,SAAQ,EAA2B;AAC1E,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,GAAG,KAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAA,GAAW,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,IAAI,OAAA,CAAQ,QAAA,GAAW,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EAC/F;AACA,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,OAAA,CAAQ,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC1D;AAYA,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,OAAA,EAAS,SAAQ,EAA2B;AAC1E,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,KAAK,CAAA,KAAA,EAAQ,UAAU,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAAA,EACrD;AAGA,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,OAAO,CAAA,IAAA,EAAO,YAAY,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAAA,EACxD;AAIA,EAAA,IAAI,UAAU,CAAA,KAAM,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,UAAU,CAAA,CAAA,EAAI;AACtD,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,OAAO,CAAA,OAAA,EAAU,YAAY,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAAA,EAC3D;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAQO,SAAS,cAAA,CACd,YAAA,EACA,KAAA,GAAyB,SAAA,EACjB;AACR,EAAA,MAAM,UAAA,GAAa,kBAAkB,YAAY,CAAA;AAEjD,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA,OAAO,cAAc,UAAU,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,cAAc,UAAU,CAAA;AACjC;AClEO,SAAS,8BAAA,CAA+B;AAAA,EAC7C,OAAA;AAAA,EACA;AACF,CAAA,EAAwC;AACtC,EAAA,MAAM,aAAA,GACJ,WAAA,KAAgB,MAAA,IAAa,WAAA,KAAgB,QAAQ,WAAA,GAAc,CAAA;AAErE,EAAA,uBACET,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAP,GAAAA,CAACD,YAAAA,EAAA,EAAY,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,oBAChCC,IAACE,cAAAA,EAAA,EACE,0CACCL,IAAAA,CAACW,aAAA,EAAW,QAAA,EAAA;AAAA,MAAA,+BAAA;AAAA,MACoB,eAAe,WAAW,CAAA;AAAA,MAAE;AAAA,KAAA,EAE5D,oBAEAR,GAAAA,CAACQ,WAAAA,EAAA,EAAW,iGAGZ,CAAA,EAEJ,CAAA;AAAA,oBACAR,GAAAA,CAACK,cAAAA,EAAA,EACC,QAAA,kBAAAL,GAAAA;AAAA,MAACM,OAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAQ,WAAA;AAAA,QACR,SAAS,MAAM;AACb,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,qCAAA,CAAsC;AAAA,EACpD,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,wBAAA;AAAA,MACP,IAAA,EAAM,qEAAA;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACR;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,KAAA,EAAO,0BAAA;AAAA,MACP,IAAA,EAAM,mFAAA;AAAA,MACN,MAAA,EAAQ,YAAA;AAAA,MACR,IAAA,EAAM;AAAA;AACR,GACF;AAEA,EAAA,MAAM,OAAA,GAAU,SAAS,IAAI,CAAA;AAE7B,EAAA,uBACET,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAP,GAAAA,CAACD,YAAAA,EAAA,EAAa,QAAA,EAAA,OAAA,CAAQ,KAAA,EAAM,CAAA;AAAA,oBAC5BC,GAAAA,CAACE,cAAAA,EAAA,EACC,QAAA,kBAAAF,IAACQ,WAAAA,EAAA,EAAY,QAAA,EAAA,OAAA,CAAQ,IAAA,EAAK,CAAA,EAC5B,CAAA;AAAA,oBACAR,GAAAA,CAACK,cAAAA,EAAA,EACE,QAAA,EAAA,IAAA,KAAS,WAAA,mBACRL,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,QAAA,EAAQ,MACpC,QAAA,kBAAAA,GAAAA,CAACM,OAAAA,EAAA,EAAO,KAAA,EAAM,UAAA,EAAW,OAAA,EAAQ,WAAA,EAC9B,QAAA,EAAA,OAAA,CAAQ,MAAA,EACX,CAAA,EACF,CAAA,mBAEAN,GAAAA;AAAA,MAACM,OAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAQ,WAAA;AAAA,QACR,SAAS,MAAM,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAAA,QAEhD,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,KACX,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;ACvFA,IAAM,qBAAA,GAA6C;AAAA,EACjD,IAAA,EAAM,IAAA;AAAA,EACN,iBAAA,EAAmB,KAAA;AAAA,EACnB,sBAAA,EAAwB,KAAA;AAAA,EACxB,sBAAA,EAAwB,KAAA;AAAA,EACxB,sBAAA,EAAwB,KAAA;AAAA,EACxB,oBAAA,EAAsB,KAAA;AAAA,EACtB,yBAAA,EAA2B,KAAA;AAAA,EAC3B,yBAAA,EAA2B,KAAA;AAAA,EAC3B,YAAA,EAAc;AAChB,CAAA;AAWA,IAAM,YAAA,GAAiC;AAAA,EACrC,SAAA,EAAW,KAAA;AAAA,EACX,MAAA,EAAQ,KAAA;AAAA,EACR,iBAAA,EAAmB,MAAA;AAAA,EACnB,cAAA,EAAgB,qBAAA;AAAA,EAChB,QAAA,EAAU,MAAA;AAAA,EACV,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,YAAA,GAAef,cAAgC,YAAY,CAAA;AAE1D,SAAS,yBAAA,CAA0B;AAAA,EACxC;AACF,CAAA,EAEG;AACD,EAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,SAAA,KAAc,oBAAA,EAAqB;AAC/D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIG,QAAAA;AAAA,IAC1C;AAAA,GACF;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAkB,KAAK,CAAA;AACzD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAkB,KAAK,CAAA;AACnD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,QAAAA,EAAe;AACjE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,EAAiB;AACjD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA,EAAiB;AACnD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,YAAY,CAAA;AAGrE,EAAA,IAAI,CAAC,SAAA,IAAa,YAAA,IAAgB,YAAA,KAAiB,gBAAA,EAAkB;AACnE,IAAA,mBAAA,CAAoB,YAAY,CAAA;AAEhC,IAAA,YAAA,CAAa,aAAa,UAAU,CAAA;AACpC,IAAA,SAAA,CAAU,aAAa,MAAM,CAAA;AAC7B,IAAA,WAAA,CAAY,aAAa,SAAS,CAAA;AAClC,IAAA,YAAA,CAAa,aAAa,UAAU,CAAA;AAEpC,IAAA,IAAI,aAAa,mBAAA,EAAqB;AACpC,MAAA,oBAAA,CAAqB,IAAI,IAAA,CAAK,YAAA,CAAa,mBAAmB,CAAC,CAAA;AAC/D,MAAA,OAAA,CAAQ,GAAA,CAAI,qBAAA,EAAuB,YAAA,CAAa,mBAAmB,CAAA;AAAA,IACrE;AAGA,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,qBAAA,EAAsB;AAC3C,IAAA,IAAI,YAAA,CAAa,gBAAgB,WAAA,EAAa;AAC5C,MAAA,OAAA,CAAQ,IAAA,GAAO,WAAA;AACf,MAAA,OAAA,CAAQ,iBAAA,GAAoB,IAAA;AAC5B,MAAA,OAAA,CAAQ,sBAAA,GAAyB,IAAA;AACjC,MAAA,OAAA,CAAQ,sBAAA,GAAyB,IAAA;AACjC,MAAA,OAAA,CAAQ,sBAAA,GAAyB,IAAA;AACjC,MAAA,OAAA,CAAQ,oBAAA,GAAuB,IAAA;AAC/B,MAAA,OAAA,CAAQ,yBAAA,GAA4B,IAAA;AACpC,MAAA,OAAA,CAAQ,yBAAA,GAA4B,IAAA;AACpC,MAAA,OAAA,CAAQ,YAAA,GAAe,IAAA;AAAA,IACzB,CAAA,MAAA,IAAW,YAAA,CAAa,WAAA,KAAgB,SAAA,EAAW;AACjD,MAAA,OAAA,CAAQ,IAAA,GAAO,eAAA;AACf,MAAA,OAAA,CAAQ,iBAAA,GAAoB,IAAA;AAC5B,MAAA,OAAA,CAAQ,sBAAA,GAAyB,IAAA;AACjC,MAAA,OAAA,CAAQ,sBAAA,GAAyB,IAAA;AACjC,MAAA,OAAA,CAAQ,sBAAA,GAAyB,KAAA;AACjC,MAAA,OAAA,CAAQ,oBAAA,GAAuB,IAAA;AAC/B,MAAA,OAAA,CAAQ,yBAAA,GAA4B,KAAA;AACpC,MAAA,OAAA,CAAQ,yBAAA,GAA4B,KAAA;AACpC,MAAA,OAAA,CAAQ,YAAA,GAAe,IAAA;AAAA,IACzB;AACA,IAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,MAAA,OAAA,CAAQ,sBAAA,GAAyB,IAAA;AACjC,MAAA,OAAA,CAAQ,YAAA,GAAe,IAAA;AAAA,IACzB;AACA,IAAA,IAAI,aAAa,cAAA,EAAgB;AAC/B,MAAA,OAAA,CAAQ,YAAA,GAAe,IAAA;AAAA,IACzB;AACA,IAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA,EAC3B;AAEA,EAAA,uBACEM,GAAAA;AAAA,IAAC,YAAA,CAAa,QAAA;AAAA,IAAb;AAAA,MACC,KAAA,EAAO;AAAA,QACL,cAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA,iBAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAEO,IAAM,uBAAA,GAA0B,MAAMR,UAAAA,CAAW,YAAY;;;ACxHpE,eAAsB,aAAA,GAA2C;AAC/D,EAAA,OAAA,CACE,MAAM,WAAA,CAAY,GAAA,CAA4C,WAAW,CAAA,EACzE,IAAA;AACJ;AAaA,eAAsB,yBAAA,GAA2C;AAC/D,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,CAAY,IAAA;AAAA,MAChB;AAAA,KACF;AAAA,EACF,SAAS,MAAA,EAAQ;AAAA,EAEjB;AACF;AC0IA,eAAsB,aAAA,GAA2C;AAC/D,EAAA,OAAA,CACE,MAAM,WAAA,CAAY,GAAA,CAA4C,CAAA,SAAA,CAAW,CAAA,EACzE,IAAA;AACJ;AAeA,eAAsB,aAAa,KAAA,EAAyC;AAC1E,EAAA,OAAA,CACE,MAAM,WAAA,CAAY,GAAA;AAAA,IAChB,cAAc,KAAK,CAAA;AAAA,GACrB,EACA,IAAA;AACJ;;;ACaO,SAAS,WAAW,GAAA,EAAkD;AAC3E,EAAA,OAAO,IAAI,IAAA,KAAS,OAAA;AACtB;AAEO,SAAS,eACd,GAAA,EAC6C;AAC7C,EAAA,OAAO,IAAI,IAAA,KAAS,YAAA;AACtB;AAEO,SAAS,eACd,GAAA,EAC6C;AAC7C,EAAA,OAAO,IAAI,IAAA,KAAS,YAAA;AACtB;AAEO,SAAS,eACd,GAAA,EAC6C;AAC7C,EAAA,OAAO,IAAI,IAAA,KAAS,YAAA;AACtB;AAEO,SAAS,qBACd,GAAA,EACoD;AACpD,EAAA,OAAO,IAAI,IAAA,KAAS,mBAAA;AACtB;AAQO,SAAS,aACd,GAAA,EAC0C;AAC1C,EAAA,OAAO,IAAI,IAAA,KAAS,SAAA;AACtB;AAEO,SAAS,iBACd,GAAA,EAC+C;AAC/C,EAAA,OAAO,IAAI,IAAA,KAAS,cAAA;AACtB;AAEO,SAAS,cACd,GAAA,EAC4C;AAC5C,EAAA,OAAO,IAAI,IAAA,KAAS,WAAA;AACtB;AAEO,SAAS,kBACd,GAAA,EACiD;AACjD,EAAA,OAAO,IAAI,IAAA,KAAS,gBAAA;AACtB;AAcO,SAAS,mBACd,GAAA,EACiD;AACjD,EAAA,OAAO,IAAI,IAAA,KAAS,gBAAA;AACtB;;;AClPA,eAAsB,SAAA,CACpB,IAAA,EACA,MAAA,EACA,OAAA,EACA;AACA,EAAA,MAAM,WAAA,GAAc,SAAS,UAAA,GAAa,EAAE,GAAG,OAAA,CAAQ,UAAA,KAAe,EAAC;AAKvE,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,IAAA,CAGjC,WAAA,EAAa;AAAA,IACb,IAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAQ,OAAA,EAAS,MAAA;AAAA,IACjB;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAA,CAAS,IAAA;AAClB;AAsDA,eAAsB,UAAA,CACpB,IAAA,EACA,MAAA,EACA,KAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,IAAA;AAAA,IACjC,CAAA,gBAAA,CAAA;AAAA,IACA;AAAA,MACE,IAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,OAAO,QAAA,CAAS,IAAA;AAClB;AAmBA,eAAsB,aAAA,GAAyC;AAE7D,EAAA,MAAM,WAAW,MAAM,WAAA,CAAY,IAAA,CAGjC,CAAA,mBAAA,CAAA,EAAuB,EAAE,CAAA;AAE3B,EAAA,OAAO,QAAA,CAAS,IAAA;AAClB;;;ACzJA,SAAS,cAAA,GAA0B;AAEjC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,CAAE,MAAA,CAAe,gBAAA;AAC5D;AAMA,IAAM,6BAA6B,CAAA,GAAI,GAAA;AAOvC,IAAI,iBAAA,GAAoB,CAAA;AACxB,IAAI,SAAA,GAAY,KAAA;AAIhB,IAAI,kBAAA,GAA+C,IAAA;AAM5C,SAAS,qBAAqB,QAAA,EAA0C;AAC7E,EAAA,kBAAA,GAAqB,QAAA;AACvB;AAYA,eAAsB,aAAA,GAAkC;AACtD,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,MAAM,UAAU,GAAA,GAAM,iBAAA;AAGtB,EAAA,IAAI,UAAU,0BAAA,EAA4B;AACxC,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AAEF,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,MAAM,WAAA,CAAY,KAAK,iBAAiB,CAAA;AAExC,IAAA,iBAAA,GAAoB,KAAK,GAAA,EAAI;AAE7B,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,kBAAA,CAAmB,iBAAiB,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AAEd,IAAA,IAAI,gBAAe,EAAG;AACpB,MAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,MAAA,OAAA,CAAQ,IAAI,6BAAA,EAA+B;AAAA,QACzC,KAAA,EAAO,YAAA;AAAA,QACP,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,uBAAA,EAAyB;AAAA,OAC1B,CAAA;AAAA,IACH;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,SAAA,GAAY,KAAA;AAAA,EACd;AACF;AAMO,SAAS,oBAAA,GAA+B;AAC7C,EAAA,OAAO,iBAAA;AACT;ACnFA,SAASiB,eAAAA,GAA0B;AAEjC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,CAAE,MAAA,CAAe,gBAAA;AAC5D;AAKA,SAAS,QAAA,CAAS,SAAiB,IAAA,EAAgC;AACjE,EAAA,IAAIA,iBAAe,EAAG;AACpB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAA,CAAQ,GAAA,CAAI,SAAS,IAAI,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,IACrB;AAAA,EACF;AACF;AAKA,IAAM,qBAAA,GAAwB;AAAA;AAAA,EAE5B,eAAA,EAAiB,CAAC,OAAA,EAAS,WAAA,EAAa,WAAW,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3D,iBAAA,EAAmB;AACrB,CAAA;AAeO,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,SAAA,EAAW,OAAA,KAAY,oBAAA,EAAqB;AACxE,EAAA,MAAM,qBAAqB,kBAAA,EAAmB;AAC9C,EAAA,MAAM,cAAA,GAAiB,oBAAoB,cAAA,IAAkB,KAAA;AAG7D,EAAA,MAAM,cAAc,YAAA,EAAc,YAAA;AAClC,EAAA,MAAM,SAAA,GACJ,WAAA,KAAgB,MAAA,IAAa,WAAA,GAAc,KAAK,CAAC,cAAA;AAGnD,EAAA,QAAA,CAAS,gCAAA,EAAkC;AAAA,IACzC,SAAA;AAAA,IACA,OAAA;AAAA,IACA,gBAAgB,WAAA,KAAgB,MAAA;AAAA,IAChC,WAAA,EACE,WAAA,KAAgB,MAAA,GAAY,CAAA,EAAG,WAAW,CAAA,CAAA,CAAA,GAAM,gBAAA;AAAA,IAClD,cAAA;AAAA,IACA;AAAA,GACD,CAAA;AAOD,EAAA,MAAM,gBAAA,GAAmBd,YAAY,YAAY;AAC/C,IAAA,IAAI,SAAS,MAAA,EAAQ;AAErB,IAAA,MAAM,IAAA,GAAO,MAAM,aAAA,EAAc;AAEjC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,QAAA,CAAS,+CAAA,EAAiD;AAAA,QACxD,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACnC,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAML,EAAA,MAAM,cAAA,GAAiBA,WAAAA;AAAA,IACrB,CAAC,KAAA,KAAiB;AAChB,MAAA,IAAI,SAAA,IAAa,CAAC,QAAA,CAAS,MAAA,EAAQ;AACjC,QAAA,QAAA,CAAS,oCAAA,EAAsC;AAAA,UAC7C,OAAO,KAAA,CAAM,IAAA;AAAA,UACb,SAAA,EAAW,CAAC,QAAA,CAAS;AAAA,SACtB,CAAA;AAGD,QAAA,KAAK,gBAAA,EAAiB;AAAA,MACxB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAW,gBAAgB;AAAA,GAC9B;AAMA,EAAA,MAAM,sBAAA,GAAyBA,YAAY,MAAM;AAC/C,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACpB,MAAA,QAAA,CAAS,oCAAA,EAAsC;AAAA,QAC7C,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACnC,CAAA;AAGD,MAAA,KAAK,gBAAA,EAAiB;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAIhC,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,IACvB,MACE,QAAA,CAAS,cAAA,EAAgB,qBAAA,CAAsB,iBAAA,EAAmB;AAAA,MAChE,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,IACH,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,QAAA,CAAS,2BAAA,EAA6B;AAAA,QACpC,WAAA;AAAA,QACA,QACE,WAAA,KAAgB,MAAA,GACZ,uCAAA,GACA,WAAA,KAAgB,IACd,mBAAA,GACA;AAAA,OACT,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,8BAAA,EAAgC;AAAA,MACvC,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,GAAG,WAAW,CAAA,CAAA,CAAA;AAAA,MAC3B,aAAA,EAAe,CAAA,EAAG,qBAAA,CAAsB,iBAAiB,CAAA,EAAA,CAAA;AAAA,MACzD,WAAA,EAAa,kBAAA;AAAA,MACb,eAAA,EAAiB,qBAAA,CAAsB,eAAA,CAAgB,IAAA,CAAK,IAAI;AAAA,KACjE,CAAA;AAGD,IAAA,qBAAA,CAAsB,eAAA,CAAgB,OAAA,CAAQ,CAAC,SAAA,KAAc;AAC3D,MAAA,MAAA,CAAO,iBAAiB,SAAA,EAAW,gBAAA,EAAkB,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,IACxE,CAAC,CAAA;AAGD,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,sBAAsB,CAAA;AAGpE,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,qDAAqD,CAAA;AAC9D,MAAA,qBAAA,CAAsB,eAAA,CAAgB,OAAA,CAAQ,CAAC,SAAA,KAAc;AAC3D,QAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,gBAAgB,CAAA;AAAA,MACxD,CAAC,CAAA;AACD,MAAA,QAAA,CAAS,mBAAA,CAAoB,oBAAoB,sBAAsB,CAAA;AACvE,MAAA,gBAAA,CAAiB,MAAA,EAAO;AAAA,IAC1B,CAAA;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,gBAAA,EAAkB,sBAAA,EAAwB,WAAW,CAAC,CAAA;AACvE;AC9IA,IAAM,kBAAA,GAAqBJ,aAAAA;AAAA,EACzB;AACF,CAAA;AAQO,SAAS,mBAAA,CAAoB,EAAE,QAAA,EAAS,EAA4B;AACzE,EAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAa,GAAI,oBAAA,EAAqB;AAEpD,EAAA,MAAM,iBAAA,GAAoBmB,MAAAA,CAAe,IAAA,CAAK,GAAA,EAAK,CAAA;AACnD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIhB,SAAwB,IAAI,CAAA;AAC5E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1D,EAAA,MAAM,WAAA,GAAc,cAAc,YAAA,IAAgB,IAAA;AAClD,EAAA,MAAM,SAAA,GAAY,WAAA,KAAgB,IAAA,IAAQ,WAAA,GAAc,CAAA;AAIxD,EAAA,MAAM,YAAA,GAAegB,OAAO,SAAS,CAAA;AACrC,EAAAC,UAAU,MAAM;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AAAA,EACzB,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,oBAAA,CAAqB,CAAC,SAAA,KAAsB;AAE1C,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,iBAAA,CAAkB,OAAA,GAAU,SAAA;AAAA,MAC9B;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,MAAM,cAAc,oBAAA,EAAqB;AACzC,IAAA,IAAI,cAAc,CAAA,EAAG;AACnB,MAAA,iBAAA,CAAkB,OAAA,GAAU,WAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,IAC3B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,eAAA,GAAkBhB,YAAY,MAAM;AACxC,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,YAAY,MAAM;AAExC,IAAA,iBAAA,CAAkB,KAAK,CAAA;AAEvB,IAAA,iBAAA,CAAkB,OAAA,GAAU,KAAK,GAAA,EAAI;AAAA,EACvC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAgB,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,WAAA,KAAgB,IAAA,EAAM;AACtC,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,kBAAkB,MAAM;AAC5B,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,cAAA,GAAA,CAAkB,GAAA,GAAM,iBAAA,CAAkB,OAAA,IAAW,GAAA;AAC3D,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,cAAc,CAAA;AAC1D,MAAA,mBAAA,CAAoB,SAAS,CAAA;AAAA,IAC/B,CAAA;AAGA,IAAA,eAAA,EAAgB;AAGhB,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,eAAA,EAAiB,GAAI,CAAA;AAEpD,IAAA,OAAO,MAAM;AACX,MAAA,aAAA,CAAc,UAAU,CAAA;AAAA,IAC1B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,WAAA,EAAa,cAAc,CAAC,CAAA;AAE3C,EAAA,uBACEd,IAAAA;AAAA,IAAC,kBAAA,CAAmB,QAAA;AAAA,IAAnB;AAAA,MACC,KAAA,EAAO;AAAA,QACL,gBAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAG,IAAC,YAAA,EAAA,EAAa,CAAA;AAAA,QACb;AAAA;AAAA;AAAA,GACH;AAEJ;AAMA,SAAS,YAAA,GAAe;AACtB,EAAA,gBAAA,EAAiB;AACjB,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,OAAA,GAAUR,WAAW,kBAAkB,CAAA;AAC7C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,kBAAA,GAAoD;AAClE,EAAA,OAAOA,UAAAA,CAAW,kBAAkB,CAAA,IAAK,IAAA;AAC3C;AC5KO,IAAM,qBAAqB,MAAM;AACtC,EAAA,OAAOoB,QAAAA,CAA2B;AAAA,IAChC,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACzB,OAAA,EAAS;AAAA,GACV,CAAA;AACH,CAAA;ACiEA,IAAM,2BAAA,GAAuD;AAAA,EAC3D,mBAAmB,MAAM,IAAA;AAAA,EACzB,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,mBAAA,GAAsBrB,cAAc,2BAA2B,CAAA;AAsCrE,SAAS,iBAAA,GAAoB;AAC3B,EAAA,MAAM,CAAC,uBAAA,EAAyB,0BAA0B,CAAA,GAAIG,SAE5D,MAAS,CAAA;AAGX,EAAA,MAAM,MAAMgB,MAAAA,CAIT;AAAA,IACD,EAAA,EAAI,MAAA;AAAA,IACJ,MAAA,EAAQ,SAAA;AAAA,IACR,uBAAA,EAAyB;AAAA,GAC1B,CAAA;AAED,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIhB,SAA+B,SAAS,CAAA;AACpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAA2B,MAAS,CAAA;AAGtE,EAAAiB,UAAU,MAAM;AACd,IAAA,GAAA,CAAI,QAAQ,MAAA,GAAS,MAAA;AAAA,EACvB,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAAA,UAAU,MAAM;AACd,IAAA,GAAA,CAAI,QAAQ,uBAAA,GAA0B,uBAAA;AAAA,EACxC,CAAA,EAAG,CAAC,uBAAuB,CAAC,CAAA;AAE5B,EAAA,MAAM,cAAc,cAAA,EAAe;AAEnC,EAAA,MAAM,gBAAA,GAAmBhB,YAAY,MAAM;AACzC,IAAA,KAAK,YAAY,iBAAA,CAAkB,EAAE,UAAU,SAAA,CAAU,OAAA,IAAW,CAAA;AACpE,IAAA,KAAK,YAAY,iBAAA,CAAkB,EAAE,UAAU,SAAA,CAAU,MAAA,IAAU,CAAA;AACnE,IAAA,KAAK,YAAY,iBAAA,CAAkB,EAAE,UAAU,SAAA,CAAU,IAAA,IAAQ,CAAA;AAAA,EACnE,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,OAAA,GAAUA,YAAY,MAAM;AAChC,IAAA,SAAS,sBAAsB,GAAA,EAAqB;AAClD,MAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,iBAAA,EAAmB,SAAS,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,KAAK,IAAI,SAAA,CAAU,GAAG,qBAAA,CAAsB,cAAc,CAAC,CAAA,OAAA,CAAS,CAAA;AAC1E,IAAA,GAAA,CAAI,QAAQ,EAAA,GAAK,EAAA;AAEjB,IAAA,EAAA,CAAG,SAAS,MAAM;AAChB,MAAA,EAAA,CAAG,KAAK,MAAM,CAAA;AAAA,IAChB,CAAA;AAGA,IAAA,EAAA,CAAG,SAAA,GAAY,CAAC,KAAA,KAAU;AACxB,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,KAAW,cAAA,EAAgB;AACzC,UAAA,gBAAA,EAAiB;AAAA,QACnB;AACA,QAAA,SAAA,CAAU,WAAW,CAAA;AACrB,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAc,CAAA;AAC5C,QAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC9B,UAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAQ,GAAI,IAAA,CAAK,KAAA;AACpC,UAAA,MAAM,CAAC,YAAY,QAAQ,CAAA,GAAI,QAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,CAAA;AAC1D,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,CAAE,IAAA;AAClC,UAAA,MAAM,UAAU,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,IAAI,IAAI,SAAS,CAAA,CAAA;AAClD,UAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,uBAAA,IAA2B,IAAA,EAAM;AAC/C,YAAA,0BAAA;AAAA,cACE,QAAQ,MAAA,CAAO;AAAA,gBACb,EAAA,EAAI,OAAA;AAAA,gBACJ,aAAa,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA,EAAI,IAAI,IAAI,SAAS,CAAA,CAAA;AAAA,gBACxD,IAAA,EAAM,MAAA;AAAA,gBACN,QAAA,EAAU,GAAA;AAAA,gBACV,QAAA,EAAU;AAAA,eACX;AAAA,aACH;AAAA,UACF;AACA,UAAA,gBAAA,EAAiB;AAAA,QACnB,CAAA,MAAA,IAAW,IAAA,CAAK,OAAA,KAAY,UAAA,EAAY;AACtC,UAAA,YAAA,CAAa,UAAU,CAAA;AAAA,QACzB,CAAA,MAAO;AAEL,UAAA,MAAM,EAAE,IAAI,KAAA,EAAO,WAAA,EAAa,QAAAkB,OAAAA,EAAQ,QAAA,KAAa,IAAA,CAAK,KAAA;AAC1D,UAAA,0BAAA;AAAA,YACE,QAAQ,MAAA,CAAO;AAAA,cACb,IAAI,EAAA,IAAM,WAAA;AAAA,cACV,KAAA;AAAA,cACA,WAAA;AAAA,cACA,MAAMA,OAAAA,IAAU,MAAA;AAAA,cAChB,UAAU,QAAA,IAAY,GAAA;AAAA,cACtB,QAAA,EAAU;AAAA,aACX;AAAA,WACH;AAAA,QACF;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AACA,IAAA,EAAA,CAAG,OAAA,GAAU,CAAC,GAAA,KAAQ;AACpB,MAAA,OAAA,CAAQ,KAAA,CAAM,gDAAgD,GAAG,CAAA;AAAA,IACnE,CAAA;AACA,IAAA,EAAA,CAAG,UAAU,MAAM;AACjB,MAAA,SAAA,CAAU,CAACA,OAAAA,KAAW;AACpB,QAAA,IAAIA,YAAW,WAAA,EAAa;AAC1B,UAAA,OAAO,cAAA;AAAA,QACT;AACA,QAAA,OAAOA,OAAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,GAAA,CAAI,QAAQ,EAAA,GAAK,MAAA;AAAA,IACnB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAAF,UAAU,MAAM;AACd,IAAA,MAAM,SAAS,GAAA,CAAI,OAAA;AACnB,IAAA,OAAA,EAAQ;AACR,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAO,EAAA,EAAI;AACb,QAAA,MAAA,CAAO,GAAG,KAAA,EAAM;AAAA,MAClB;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO;AAAA,IACL,gBAAA,EAAkB,MAAA;AAAA,IAClB,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAMO,SAAS,2BAAA,CAA4B,EAAE,QAAA,EAAS,EAAsB;AAC3E,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,MACE,cAAA,EAAe;AAEnB,EAAA,MAAM,kBAAkBC,QAAAA,CAAS;AAAA,IAC/B,QAAA,EAAU,UAAU,OAAA,EAAQ;AAAA,IAC5B,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,MAAM,qBAAqBA,QAAAA,CAAS;AAAA,IAClC,QAAA,EAAU,UAAU,cAAA,EAAe;AAAA,IACnC,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,MAAM,YAAA,GAAeE,QAAQ,MAAM;AACjC,IAAA,MAAMC,QAAAA,GAAU,gBAAgB,IAAA,EAAM,OAAA;AACtC,IAAA,IAAI,CAACA,UAAS,IAAA,EAAM;AAClB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,kBAAkBA,QAAAA,CAAQ,IAAA,EAAMA,QAAAA,CAAQ,OAAA,EAASA,SAAQ,IAAI,CAAA;AAAA,EACtE,CAAA,EAAG,CAAC,eAAA,CAAgB,IAAI,CAAC,CAAA;AAEzB,EAAA,MAAM,YAAA,GAAe,gBAAgB,KAAA,EAAO,OAAA;AAC5C,EAAA,MAAM;AAAA,IACJ,cAAA,EAAgBC,cAAAA;AAAA,IAChB,OAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA,EAAM,UAAA;AAAA,IACN,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,UAAA;AAAA,IACb,UAAA,EAAY,SAAA;AAAA,IACZ,SAAA,EAAW,QAAA;AAAA,IACX,QAAA,EAAU,QAAA;AAAA,IACV,YAAA,EAAc,WAAA;AAAA,IACd,GAAA;AAAA,IACA,YAAA,EAAc,WAAA;AAAA,IACd,aAAA,EAAe;AAAA,GACjB,GAAI,gBAAgB,IAAA,IAAQ;AAAA,IAC1B,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,MAAM,OAAA,GAAU,SAAS,IAAA,CAAK,iBAAA;AAC9B,EAAA,MAAM,UAAA,GAAa,SAAS,OAAA,CAAQ,iBAAA;AAEpC,EAAA,MAAM,OAAA,GAAmB;AAAA,IACvB,aAAA,EAAAA,cAAAA;AAAA,IACA,WAAA;AAAA,IACA,GAAA;AAAA,IACA,WAAA;AAAA,IACA,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,EAAE,gBAAA,EAAkB,OAAA,EAAS,SAAA,KAAc,iBAAA,EAAkB;AAGnE,EAAAL,UAAU,MAAM;AACd,IAAA,IAAI,qBAAqB,cAAA,EAAgB;AAEvC,MAAA,eAAA,EAAgB;AAAA,IAClB,CAAA,MAAA,IAAW,qBAAqB,WAAA,EAAa;AAE3C,MAAA,eAAA,EAAgB;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,eAAA,EAAiB,eAAe,CAAC,CAAA;AAEvD,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,KAAc,kBAAA,EAAmB;AACtD,EAAA,MAAM,EAAE,cAAA,EAAgB,QAAA,EAAS,GAAI,uBAAA,EAAwB;AAC7D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIjB,SAAkB,KAAK,CAAA;AACvE,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GACpDA,SAAkB,KAAK,CAAA;AACzB,EAAA,MAAM,cAAc,cAAA,EAAe;AAEnC,EAAA,MAAM,iBAAA,GAAoBC,WAAAA;AAAA,IACxB,CAAC,IAAA,KAAiB;AAChB,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,IAAA;AAAA,MAC/B;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAGA,EAAA,MAAM,kBAAA,GACJ,CAAC,SAAA,IACD,SAAA,KAAc,cACd,KAAA,EAAO,qBAAA,KAA0B,QACjC,KAAA,CAAM,kBAAA;AAGR,EAAA,IAAI,uBAAuB,qBAAA,EAAuB;AAChD,IAAA,wBAAA,CAAyB,kBAAkB,CAAA;AAC3C,IAAA,mBAAA,CAAoB,kBAAkB,CAAA;AAAA,EACxC;AAGA,EAAAgB,UAAU,MAAM;AACd,IAAA,IAAI,sBAAsB,gBAAA,EAAkB;AAC1C,MAAA,sBAAA,CAAuB,EAAE,MAAA,EAAQ,mBAAA,EAAqB,CAAA;AAAA,IACxD;AAAA,EACF,CAAA,EAAG,CAAC,kBAAA,EAAoB,gBAAgB,CAAC,CAAA;AAEzC,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,IAAA,KAAK,yBAAA,EAA0B;AAC/B,IAAA,KAAK,YAAY,iBAAA,CAAkB,EAAE,UAAU,SAAA,CAAU,IAAA,IAAQ,CAAA;AAAA,EACnE,CAAA;AAEA,EAAA,uBACEd,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAP,GAAAA;AAAA,MAAC,mBAAA,CAAoB,QAAA;AAAA,MAApB;AAAA,QACC,KAAA,EAAO;AAAA,UACL,YAAA;AAAA,UACA,mBAAmB,MAAM;AACvB,YAAA,KAAK,mBAAmB,OAAA,EAAQ;AAAA,UAClC,CAAA;AAAA,UACA,OAAA;AAAA,UACA,UAAA;AAAA,UACA,SAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,WAAA;AAAA,UACA,KAAA,EAAO,YAAA;AAAA,UACP,YAAA;AAAA,UACA,iBAAA;AAAA,UACA,WAAW,eAAA,CAAgB,SAAA;AAAA,UAC3B,gBAAgB,kBAAA,CAAmB,IAAA;AAAA,UACnC,uBAAuB,MAAM;AAC3B,YAAA,KAAK,mBAAmB,OAAA,EAAQ;AAAA,UAClC;AAAA,SACF;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,oBAEAA,GAAAA;AAAA,MAACF,UAAAA;AAAA,MAAA;AAAA,QACC,MAAM,gBAAA,KAAqB,cAAA;AAAA,QAC3B,SAAS,MAAM,MAAA;AAAA,QAEd,QAAA,EAAA,QAAA,IAAY,cAAA,CAAe,IAAA,KAAS,IAAA,mBACnCE,GAAAA;AAAA,UAAC,qCAAA;AAAA,UAAA;AAAA,YACC,QAAA;AAAA,YACA,MAAM,cAAA,CAAe;AAAA;AAAA,4BAGvBA,GAAAA;AAAA,UAAC,8BAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,WAAA;AAAA;AAAA;AAAA,cAGE,SAAA,IACA,WAAA,KAAgB,IAAA,IAChB,gBAAA,KAAqB,IAAA,IACrB,gBAAA,IAAoB,CAAA,GAChB,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,gBAAgB,CAAA,GAC1C;AAAA;AAAA;AAAA;AAER;AAAA,KAEJ;AAAA,IAEC,KAAA,EAAO,yCACNH,IAAAA,CAACC,YAAA,EAAU,IAAA,EAAM,gBAAA,EAAkB,OAAA,EAAS,mBAAA,EAC1C,QAAA,EAAA;AAAA,sBAAAE,GAAAA,CAACD,YAAAA,EAAA,EAAY,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,sBAC9BC,GAAAA;AAAA,QAACC,WAAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAW,OAAA;AAAA,UACX,OAAA,EAAS,mBAAA;AAAA,UACT,EAAA,EAAI;AAAA,YACF,QAAA,EAAU,UAAA;AAAA,YACV,KAAA,EAAO,CAAA;AAAA,YACP,GAAA,EAAK,CAAA;AAAA,YACL,KAAA,EAAO;AAAA,WACT;AAAA,UAEA,QAAA,kBAAAD,GAAAA,CAACiB,OAAAA,EAAA,EAAQ;AAAA;AAAA,OACX;AAAA,sBACAjB,IAACE,cAAAA,EAAA,EACC,0BAAAF,GAAAA,CAACQ,WAAAA,EAAA,EAAW,QAAA,EAAA,kCAAA,EAAgC,CAAA,EAC9C,CAAA;AAAA,sBACAR,GAAAA,CAACK,cAAAA,EAAA,EACC,QAAA,kBAAAL,GAAAA;AAAA,QAACM,OAAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,UAAA;AAAA,UACN,OAAA,EAAQ,WAAA;AAAA,UACR,OAAA,EAAS,mBAAA;AAAA,UACV,QAAA,EAAA;AAAA;AAAA,OAED,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEO,IAAM,sBAAA,GAAyB,MAAMd,UAAAA,CAAW,mBAAmB;AAEnE,IAAM,oBAAoB,MAAM;AACrC,EAAA,MAAM,EAAE,cAAA,EAAgB,qBAAA,EAAsB,GAAI,sBAAA,EAAuB;AACzE,EAAA,OAAO,CAAC,gBAAgB,qBAAqB,CAAA;AAI/C;ACnVO,IAAM,QAAA,GAAW,CAAC,KAAA,KAAyC;AAChE,EAAA,uBACEQ,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAM,4BAAA;AAAA,MACL,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,4hBAAA;AAAA,UACF,IAAA,EAAK;AAAA;AAAA;AACP;AAAA,GACF;AAEJ,CAAA;AC3GA,IAAM,mBAAA,GAAsB,CAAC,IAAA,KAAiC;AAC5D,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,UAAA,EAAY,wDAAA;AAAA,IACZ,YAAA,EAAc,0DAAA;AAAA,IACd,cAAA,EACE,4DAAA;AAAA,IACF,UAAA,EAAY;AAAA,GACd;AACA,EAAA,OAAO,MAAA,CAAO,IAAI,CAAA,IAAK,IAAA;AACzB,CAAA;AAEO,IAAM,WAAW,CAAC;AAAA,EACvB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA,EAAQ,aAAA;AAAA,EACR;AACF,CAAA,KAAqB;AACnB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIN,QAAAA;AAAA,IAC1B,iBAAiB;AAAC,GACpB;AACA,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAA6B,IAAI,CAAA;AACjE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,gBAAA,GAAmB,oBAAoB,IAAI,CAAA;AACjD,EAAA,MAAM,cAAA,GAAiBgB,OAAO,KAAK,CAAA;AAEnC,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,cAAA,CAAe,OAAA,IAAW,eAAA,CAAgB,IAAI,CAAA,EAAG;AACpD,MAAA,sBAAA,CAAuB;AAAA,QACrB,MAAA,EAAQ,IAAA;AAAA,QACR,OAAO,kBAAA,CAAmB;AAAA,OAC3B,CAAA;AAAA,IACH;AACA,IAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AACzB,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,uBACEb,IAAAA;AAAA,IAACC,UAAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,WAAA;AAAA,MACT,QAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAO,OAAA;AAAA,MACP,SAAA,EAAW;AAAA,QACT,KAAA,EAAO,EAAE,EAAA,EAAI,EAAE,QAAQ,KAAA,EAAO,SAAA,EAAW,SAAQ;AAAE,OACrD;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,IAAAA,CAACE,cAAA,EAAY,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAS,EACtD,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAAO,GAAA;AAAA,UACP,gBAAA,oBACCF,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAP,GAAAA;AAAA,cAACC,WAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,YAAA,EAAW,sDAAA;AAAA,gBACX,YAAA,EAAc,CAAC,CAAA,KAAM,WAAA,CAAY,EAAE,aAAa,CAAA;AAAA,gBAChD,YAAA,EAAc,MAAM,WAAA,CAAY,IAAI,CAAA;AAAA,gBACpC,OAAA,EAAS,MAAM,MAAA,CAAO,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAAA,gBAErD,QAAA,kBAAAD,GAAAA,CAACI,KAAAA,EAAA,EAAI,SAAA,EAAW,UAAU,EAAA,EAAI,EAAE,QAAA,EAAU,MAAA,EAAO,EAAG;AAAA;AAAA,aACtD;AAAA,4BACAJ,GAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,gBACtB,QAAA;AAAA,gBACA,OAAA,EAAS,MAAM,WAAA,CAAY,IAAI,CAAA;AAAA,gBAC/B,YAAA,EAAc;AAAA,kBACZ,QAAA,EAAU,QAAA;AAAA,kBACV,UAAA,EAAY;AAAA,iBACd;AAAA,gBACA,eAAA,EAAiB;AAAA,kBACf,QAAA,EAAU,KAAA;AAAA,kBACV,UAAA,EAAY;AAAA,iBACd;AAAA,gBACA,mBAAA,EAAmB,IAAA;AAAA,gBACnB,EAAA,EAAI,EAAE,aAAA,EAAe,MAAA,EAAO;AAAA,gBAC5B,SAAA,EAAW;AAAA,kBACT,KAAA,EAAO;AAAA,oBACL,IAAI,EAAE,OAAA,EAAS,SAAS,KAAA,EAAO,OAAA,EAAS,GAAG,CAAA;AAAE;AAC/C,iBACF;AAAA,gBAEA,QAAA,kBAAAH,KAACW,WAAAA,EAAA,EAAW,IAAI,EAAE,QAAA,EAAU,YAAW,EAAG,QAAA,EAAA;AAAA,kBAAA,OAAA;AAAA,kBAClC,GAAA;AAAA,kCACNR,GAAAA;AAAA,oBAAC,IAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAM,gBAAA;AAAA,sBACN,MAAA,EAAO,QAAA;AAAA,sBACP,EAAA,EAAI;AAAA,wBACF,cAAA,EAAgB,WAAA;AAAA,wBAChB,KAAA,EAAO,OAAA;AAAA,wBACP,SAAA,EAAW,EAAE,KAAA,EAAO,cAAA;AAAe,uBACrC;AAAA,sBACD,QAAA,EAAA;AAAA;AAAA,mBAED;AAAA,kBAAQ,GAAA;AAAA,kBAAI;AAAA,iBAAA,EAEd;AAAA;AAAA;AACF,WAAA,EACF;AAAA,SAAA,EAEJ,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAACC,WAAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAW,OAAA;AAAA,YACX,OAAA,EAAS,WAAA;AAAA,YACT,EAAA,EAAI;AAAA,cACF,QAAA,EAAU,UAAA;AAAA,cACV,KAAA,EAAO,CAAA;AAAA,cACP,GAAA,EAAK,CAAA;AAAA,cACL,KAAA,EAAO;AAAA,aACT;AAAA,YAEA,QAAA,kBAAAD,GAAAA,CAACiB,OAAAA,EAAA,EAAQ;AAAA;AAAA,SACX;AAAA,wBACAjB,GAAAA;AAAA,UAACE,cAAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI;AAAA,cACF,CAAA,EAAG,CAAA;AAAA,cACH,QAAA,EAAU,MAAA;AAAA,cACV,SAAA,EAAW,qBAAA;AAAA,cACX,YAAA,EAAc;AAAA,aAChB;AAAA,YAEA,QAAA,kBAAAF,GAAAA,CAACI,KAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,QAAA,EAAS,EAC1B,QAAA,EAAA,OAAA,oBACCJ,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,MAAA;AAAA,gBACA,eAAA,EAAiB,SAAA;AAAA,gBACjB;AAAA;AAAA,aACF,EAEJ;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA,CAACK,cAAAA,EAAA,EACC,QAAA,kBAAAL,GAAAA,CAACG,MAAAA,EAAA,EAAM,SAAA,EAAU,KAAA,EAAM,OAAA,EAAQ,MAAA,EAC7B,QAAA,kBAAAH,GAAAA;AAAA,UAACM,OAAAA;AAAA,UAAA;AAAA,YACC,UAAU,CAAC,gBAAA;AAAA,YACX,KAAA,EAAM,UAAA;AAAA,YACN,OAAA,EAAQ,WAAA;AAAA,YACR,SAAS,MAAM;AACb,cAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,cAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG;AACzB,gBAAA,sBAAA,CAAuB;AAAA,kBACrB,MAAA,EAAQ,IAAA;AAAA,kBACR,OAAO,kBAAA,CAAmB;AAAA,iBAC3B,CAAA;AAAA,cACH;AACA,cAAA,SAAA,CAAU,MAAM,MAA2B,CAAA;AAAA,YAC7C,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA,WAGH,CAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ,CAAA;ACvLO,SAAS,eAAe,IAAA,EAAwB;AACrD,EAAA,SAAS,WAAW,QAAA,EAAgC;AAClD,IAAA,OAAO,QAAA,EAAU,OAAA,GACb,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,IAAI,IACvD,EAAC;AAAA,EACP;AAEA,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,KAAK,IAAI,CAAA;AAClD,EAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,KAAK,OAAO,CAAA;AAExD,EAAA,OAAO,YAAA,CAAa,aAAa,cAAc,CAAA;AACjD;AAEO,SAAS,YAAA,CACd,aACA,cAAA,EACA;AACA,EAAA,MAAM,QAA0B,EAAC;AACjC,EAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC9B,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAA,CAAO,IAAI,CAAA,EAAG;AAC9C,MAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,IACnB;AAAA,EACF,CAAC,CAAA;AACD,EAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,MAAA,KAAW;AACjC,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAA,CAAO,IAAI,CAAA,EAAG;AAC9C,MAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,IACnB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,KAAA;AACT;AAEA,IAAM,eAAA,GAAkB,CAAC,KAAA,KAA8B;AACrD,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,sBAAA,EAAuB;AAEhD,EAAA,MAAM,IAAA,GAAOY,EAAA,CAAE,IAAA,CAAK,YAAA,EAAc,KAAA,EAAO;AAAA,IACvC,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM;AAAA;AACR,GACD,CAAA;AAED,EAAA,MAAM,WAAA,GAAcJ,QAAQ,MAAM;AAChC,IAAA,OAAO,IAAA,GAAO,cAAA,CAAe,IAAI,CAAA,GAAI,EAAC;AAAA,EACxC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIpB,QAAAA,CAA2B,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,QAAAA,EAAiB;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAkB,IAAI,CAAA;AACxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,CAA2B,EAAE,CAAA;AAC3E,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,QAAAA,CAAS,MAAM,EAAE,CAAA;AAErD,EAAA,MAAM,iBAAiB,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAS,WAAA,GAAc,MAAA;AAEpE,EAAA,MAAM,SAAA,GAAYC,YAAY,YAAY;AACxC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,IAAA,CAAK,EAAE,CAAA;AACvC,MAAA,MAAM,YAAY,IAAA,CAAK,KAAA;AACvB,MAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,WAAW,CAAC,SAAA,CAAU,QAAQ,OAAA,EAAS;AACzD,QAAA,UAAA,CAAW,EAAE,CAAA;AACb,QAAA;AAAA,MACF;AACA,MAAA,aAAA,CAAc,SAAA,CAAU,QAAQ,WAAW,CAAA;AAC3C,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,KAAK,OAAO,CAAA;AACxD,MAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,QAAQ,OAAO,CAAA;AAC9D,MAAA,UAAA,CAAW,YAAA,CAAa,WAAA,EAAa,cAAc,CAAC,CAAA;AAAA,IACtD,SAASwB,MAAAA,EAAO;AACd,MAAA,QAAA,CAASA,MAAc,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAA,IAAI,WAAA,KAAgB,eAAA,IAAmB,IAAA,EAAM,EAAA,KAAO,UAAA,EAAY;AAC9D,IAAA,kBAAA,CAAmB,WAAW,CAAA;AAC9B,IAAA,aAAA,CAAc,MAAM,EAAE,CAAA;AAEtB,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,UAAA,CAAW,WAAW,CAAA;AACtB,MAAA,aAAA,CAAc,cAAc,CAAA;AAC5B,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA,MAAA,IAAW,IAAA,EAAM,EAAA,KAAO,MAAA,EAAW;AACjC,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EAEF;AAGA,EAAAR,UAAU,MAAM;AACd,IAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,IAAK,IAAA,EAAM,OAAO,MAAA,EAAW;AAGtD,MAAA,SAAA,EAAU,CAAE,KAAA,CAAM,CAAC,CAAA,KAAe;AAEhC,QAAA,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,MACjB,CAAC,CAAA;AACD,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,IAAA,EAAM,EAAA,EAAI,WAAW,CAAC,CAAA;AAErC,EAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,SAAA,EAAW,KAAA,EAAM;AACjD,CAAA;AAEA,IAAO,uBAAA,GAAQ,eAAA;ACxGf,SAAS,iBAAiB,UAAA,EAAoB;AAC5C,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,MAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,IAAA,EAAK,CAAE,WAAA,EAAY;AAGrD,EAAA,IAAI,eAAA,CAAgB,QAAA,CAAS,cAAc,CAAA,EAAG;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,KAAA,GAAQ,2DAAA;AACd,EAAA,OAAO,KAAA,CAAM,KAAK,cAAc,CAAA;AAClC;AAEA,SAAS,kBAAkB,UAAA,EAAoB;AAC7C,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,SAAA;AAAA;AAAA,IACA,YAAA;AAAA;AAAA,IACA,KAAA;AAAA;AAAA,IACA,WAAA;AAAA;AAAA,IACA;AAAA;AAAA,GACF;AACA,EAAA,OAAO,gBAAA,CAAiB,QAAA,CAAS,UAAA,CAAW,WAAA,EAAa,CAAA;AAC3D;AAEA,SAAS,eAAe,UAAA,EAAoB;AAC1C,EAAA,MAAM,kBAAA,GAAqB;AAAA,IACzB,MAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA;AAAA,IACA,UAAA;AAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA;AAAA,IACA,0BAAA;AAAA,IACA,gCAAA;AAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA;AAAA,GACF;AACA,EAAA,OAAO,kBAAA,CAAmB,QAAA,CAAS,UAAA,CAAW,WAAA,EAAa,CAAA;AAC7D;AAYO,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM;AAAA,IACJ,OAAA,EAAS,UAAA;AAAA,IACT,SAAA;AAAA,IACA;AAAA,GACF,GAAI,uBAAA,CAAgB,MAAA,CAAO,KAAK,CAAA;AAChC,EAAA,MAAM,UAAU,UAAA,CAAW,MAAA;AAAA,IACzB,CAAC,CAAA,KACC,CAAC,gBAAA,CAAiB,EAAE,IAAI,CAAA,IACxB,CAAC,iBAAA,CAAkB,EAAE,IAAI,CAAA,IACzB,CAAC,cAAA,CAAe,EAAE,IAAI;AAAA,GAC1B;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAOX,GAAAA,CAACI,KAAAA,EAAA,EAAI,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,IAAK,KAAA,EAAO;AACpC,IAAA,uBACEJ,GAAAA,CAACI,KAAAA,EAAA,EAAI,QAAA,EAAA,oEAAA,EAGL,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEJ,GAAAA,CAACI,KAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,EAAG,MAAA,EAAO,EACnB,QAAA,kBAAAP,KAAC,WAAA,EAAA,EAAY,SAAA,EAAS,MAAC,QAAA,EAAU,OAAA,CAAQ,WAAW,CAAA,EAClD,QAAA,EAAA;AAAA,oBAAAG,IAAC,SAAA,EAAA,EAAU,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,IAAK,QAAA,EAAA,sCAAA,EAE1B,CAAA;AAAA,oBACAH,IAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAO,MAAA,CAAO,WAAA;AAAA,QACd,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,MAAM,UAAA,GAAa,EAAE,MAAA,CAAO,KAAA;AAC5B,UAAA,mBAAA,CAAoB,CAAC,CAAC,UAAU,CAAA;AAChC,UAAA,MAAM,UAAA,GACJ,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,EAAG,IAAA,IAAQ,EAAA;AACtD,UAAA,eAAA,CAAgB;AAAA,YACd,GAAG,MAAA;AAAA,YACH,WAAA,EAAa,UAAA;AAAA,YACb,WAAA,EAAa;AAAA,WACd,CAAA;AAAA,QACH,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAG,GAAAA,CAAC,YAAO,KAAA,EAAM,EAAA,EACX,kBAAQ,MAAA,KAAW,CAAA,GAChB,kBACA,gCAAA,EACN,CAAA;AAAA,UACC,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZH,IAAAA,CAAC,QAAA,EAAA,EAAoB,KAAA,EAAO,CAAA,CAAE,IAAA,EAAM,SAAA,EAAU,mBAAA,EAC3C,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,IAAA;AAAA,YAAK,KAAA;AAAA,YAAI,CAAA,CAAE;AAAA,WAAA,EAAA,EADH,CAAA,CAAE,IAEf,CACD;AAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;ACpGO,SAAS,YAAA,CACd,GAAA,EACA,OAAA,GAAU,OAAA,EACV,OAAA,EACA;AACA,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,GAAA;AACpC,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,SAAS,OAAO,CAAA,CAAE,OAAO,GAAG,CAAA;AAC3D;AAMO,SAAS,qBAAqB,GAAA,EAAa;AAEhD,EAAA,MAAM,YAAA,GAAe,GAAA,GAAM,CAAA,IAAK,GAAA,IAAO,IAAA;AAEvC,EAAA,MAAM,YAAA,GAAe,GAAA,GAAM,CAAA,IAAK,GAAA,IAAO,KAAA;AAEvC,EAAA,MAAM,YAAY,CAAC,MAAA,GAAS,GAAA,KAC1B,YAAA,CAAa,QAAQ,OAAA,EAAS;AAAA,IAC5B,KAAA,EAAO,SAAA;AAAA,IACP,qBAAA,EAAuB;AAAA,GACxB,CAAA;AAEH,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,MAAA,GAAS,UAAU,IAAK,CAAA;AAC9B,IAAA,OAAO,IAAI,MAAM,CAAA,CAAA;AAAA,EACnB,WAAW,YAAA,EAAc;AACvB,IAAA,MAAM,MAAA,GAAS,UAAU,KAAK,CAAA;AAC9B,IAAA,OAAO,IAAI,MAAM,CAAA,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,SAAA,EAAU;AACnB;AAqFO,SAAS,0BAA0B,KAAA,EAAwB;AAEhE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAAA,OACjC;AAEH,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAEtC,IAAA,MAAM,aAAa,EAAA,IAAM,EAAA;AACzB,IAAA,MAAM,WAAW,EAAA,IAAM,CAAA;AACvB,IAAA,MAAM,UAAU,EAAA,IAAM,CAAA;AACtB,IAAA,MAAM,UAAU,EAAA,IAAM,CAAA;AACtB,IAAA,MAAM,WAAW,EAAA,IAAM,EAAA;AACvB,IAAA,MAAM,eAAe,EAAA,IAAM,EAAA;AAE3B,IAAA,MAAM,qBAAqB,eAAA,IAAmB,UAAA;AAC9C,IAAA,MAAM,qBAAqB,eAAA,IAAmB,CAAA;AAC9C,IAAA,MAAM,cAAc,eAAA,IAAmB,QAAA;AACvC,IAAA,MAAM,aAAa,eAAA,IAAmB,OAAA;AACtC,IAAA,MAAM,aAAa,eAAA,IAAmB,OAAA;AACtC,IAAA,MAAM,mBAAmB,eAAA,IAAmB,QAAA;AAC5C,IAAA,MAAM,mBAAmB,eAAA,IAAmB,YAAA;AAG5C,IAAA,IAAI,gBAAA,IAAoB,gBAAA;AACtB,MAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,QACpC,KAAA,EAAO,MAAA;AAAA,QACP,IAAA,EAAM,OAAA;AAAA;AAAA,QACN,WAAA,EAAa,QAAA;AAAA,QACb,qBAAA,EAAuB,mBAAmB,CAAA,GAAI;AAAA,OAC/C,EACE,MAAA,CAAO,KAAA,GAAQ,IAAM,CAAA,CACrB,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,SAAA,IAEZ,UAAA,IAAc,cAAc,WAAA,EAAa;AAChD,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,IAAA,EAAM,UAAA,GAAa,OAAA,GAAU,UAAA,GAAa,OAAA,GAAU,QAAA;AAAA,QACpD,IAAA,EAAM,UAAA,GAAa,GAAA,GAAM,UAAA,GAAa,GAAA,GAAM;AAAA,OAC9C;AACA,MAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,QACpC,KAAA,EAAO,MAAA;AAAA,QACP,IAAA,EAAM,OAAA;AAAA;AAAA,QACN,WAAA,EAAa,QAAA;AAAA,QACb,qBAAA,EAAuB;AAAA,OACxB,CAAA,CACE,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,CAC1B,OAAA,CAAQ,GAAA,EAAK,MAAA,CAAO,IAAI,CAAA;AAAA,IAC7B,CAAA,MAAA,IAES,kBAAA;AACP,MAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,QACpC,qBAAA,EAAuB;AAAA,OACxB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA;AAGf,MAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,QACpC,qBAAA,EAAuB,qBAAqB,CAAA,GAAI,CAAA;AAAA,QAChD,QAAA,EACE,kBAAA,IAAsB,eAAA,KAAoB,CAAA,GACtC,UAAA,GACA;AAAA,OACP,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,EACnB;AACF;AChOO,IAAM,iBAAA,GAAoB,SAAA;AAC1B,IAAM,cAAA,GAAiB,SAAA;AACvB,IAAM,4BAAA,GAA+B,GAAG,iBAAiB,CAAA,EAAA,CAAA;AACzD,IAAM,yBAAA,GAA4B,GAAG,cAAc,CAAA,EAAA,CAAA;AAEnD,SAAS,UAAA,CAAW,EAAE,KAAA,EAAM,EAAsB;AACvD,EAAA,uBACEG,GAAAA;AAAA,IAACI,KAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,cAAA;AAAA,QACT,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,KAAA;AAAA,QACT,EAAA,EAAI,CAAA;AAAA,QACJ,YAAA,EAAc;AAAA;AAChB;AAAA,GACF;AAEJ;ACMO,IAAM,UAAA,GAAa,YAAA;AACnB,IAAM,UAAA,GAAa,aAAA;AACnB,IAAM,WAAA,GAAc,aAAA;AAuBpB,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY;AACd,CAAA,EAAwB;AACtB,EAAAgB,KAAA,CAAQ,QAAA;AAAA,IACN,UAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,eAAe,wBAAA,CAAyB,IAAA,EAAM,QAAA,EAAU,EAAE,WAAW,CAAA;AAI3E,EAAA,MAAM,SAAA,GAAY,sBAAsB,IAAI,CAAA;AAG5C,EAAA,uBACEpB,GAAAA,CAACqB,OAAA,EAAA,EAAM,IAAA,EAAK,KAAA,EAAM,OAAA,EAAS,YAAA,EAAc,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,EAAC,EAAG,CAAA;AAE3E;AAEA,SAAS,wBAAA,CACP,IAAA,EACA,QAAA,EACA,KAAA,EACA,OACA,IAAA,EACA;AACA,EAAA,MAAM,aAAa,IAAA,KAAS,UAAA;AAC5B,EAAA,MAAM,EAAE,MAAA,GAAS,EAAC,EAAE,GAAI,IAAA;AACxB,EAAA,MAAM,OAAA,GAAyC,UAAA,GAC3C,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,QAAA,CAAS,CAAC,CAAA,EAAG,CAAC,CAAqB,CAAA,GACzD,MAAA;AACJ,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,IAAA,EAAM,OAAA;AAAA,IACN,eAAA,EAAiB,KAAA;AAAA,IACjB,WAAA,EAAa,KAAA;AAAA,IACb,oBAAA,EAAsB,KAAA;AAAA,IACtB,WAAA,EAAa,CAAA;AAAA,IACb,kBAAA,EAAoB,CAAA;AAAA;AAAA,IACpB,aAAA,EAAe,CAAA;AAAA;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AACF;AAEO,SAAS,sBACd,IAAA,EACkB;AAClB,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS,GAAI,IAAA;AACrC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA;AACxB,EAAA,MAAM,cAAA,GAAiB,wBAAA;AAAA,IACrB,IAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,4BAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,WAAA,GAAc,wBAAA;AAAA,IAClB,IAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,SAAA,GAAY,QAAA,CACf,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,sBAAA,CAAuB,QAAA,EAAU,CAAC,CAAC,CAAA,CACjD,KAAA,CAAM,GAAG,EAAE,CAAA;AAEd,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,CAAC,cAAA,EAAgB,WAAW;AAAA,GACxC;AACF;AAEO,SAAS,wBAAA,CACd,MACA,QAAA,GAAW,KAAA,EACX,EAAE,GAAG,eAAA,EAAgB,GAAyB,EAAC,EAC1B;AACrB,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,MAAM,OAAA,GAAU,CAAA,EAAG,UAAS,GAAI,IAAA;AACzD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA;AACxB,EAAA,MAAM,aAAa,IAAA,KAAS,UAAA;AAC5B,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,IAAA;AAAA,IACZ,mBAAA,EAAqB,KAAA;AAAA,IACrB,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM,KAAA;AAAA,QACN,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM;AAAA;AACR,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA;AAAA,QAEN,SAAA,EAAW,KAAA;AAAA,QACX,SAAA,EAAW;AAAA,UACT,MAAM,CAAC,EAAE,SAAA,EAAW,YAAA,EAAc,CAAA,EAAG;AACnC,YAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,QAAA,EAAU,SAAS,CAAA;AAEzD,YAAA,MAAM,MAAA,GAAS,UAAA,GACX,UAAA,GACA,IAAA,KAAS,WACP,UAAA,GACA,WAAA;AAEN,YAAA,OAAO,GAAG,MAAM;AAAA,EAAK,MAAM,CAAA,CAAA;AAAA,UAC7B,CAAA;AAAA,UACA,KAAA,CAAM,EAAE,YAAA,EAAc,SAAA,EAAW,SAAS,EAAE,KAAA,IAAQ,EAAG;AACrD,YAAA,MAAM,MAAA,GAAS,YAAA,KAAiB,CAAA,GAAI,OAAA,CAAQ,SAAS,IAAA,CAAK,MAAA;AAC1D,YAAA,MAAM,cAAA,GAAiB,oBAAA;AAAA,cACrB,MAAA,CAAO,SAAS,CAAA,GAAI;AAAA,aACtB;AACA,YAAA,MAAM,KAAA,GAAQ,OAAO,SAAS,CAAA;AAC9B,YAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,KAAK,KAAK,cAAc,CAAA,CAAA,CAAA;AAAA,UAC9C;AAAA;AACF;AACF,KACF;AAAA,IACA,MAAA,EAAQ,SAAA,CAAU,IAAA,EAAM,QAAQ,CAAA;AAAA,IAChC,GAAG;AAAA,GACL;AACF;AAIA,SAAS,SAAA,CACP,EAAE,QAAA,EAAU,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAA,EAAG,IAAA,EAAM,QAAA,EAAS,EAC7C,QAAA,GAAW,KAAA,EACX;AACA,EAAA,MAAM,aAAa,IAAA,KAAS,UAAA;AAC5B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA;AACxB,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,GAAG,QAAQ,MAAA,EAAQ,GAAG,KAAK,MAAM,CAAA;AAE3D,EAAA,MAAM,SAAA,GAAY,QAAA,CACf,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,sBAAA,CAAuB,QAAA,EAAU,CAAC,CAAC,CAAA,CACjD,KAAA,CAAM,GAAG,EAAE,CAAA;AAGd,EAAA,MAAM,UAAA,GAA2B;AAAA,IAC/B,SAAS,CAAC,QAAA;AAAA,IACV,IAAA,EAAM,YAAA;AAAA;AAAA,IACN,GAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,MAAM;AAAC,KACT;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS;AAAA,KACX;AAAA,IACA,IAAA,EAAM,EAAE,OAAA,EAAS,KAAA,EAAM;AAAA,IACvB,KAAA,EAAO;AAAA,MACL,WAAA,EAAa,EAAA;AAAA,MACb,WAAA,EAAa,EAAA;AAAA,MACb,aAAA,EAAe;AAAA;AACjB,GACF;AAIA,EAAA,MAAM,cAAA,GAA+B;AAAA,IACnC,SAAS,CAAC,QAAA;AAAA,IACV,IAAA,EAAM,UAAA;AAAA;AAAA,IACN,IAAA,EAAM,EAAE,OAAA,EAAS,KAAA,EAAM;AAAA,IACvB,KAAA,EAAO;AAAA,MACL,QAAA,CAAS,KAAK,KAAA,EAAO;AACnB,QAAA,OAAO,UAAU,KAAK,CAAA;AAAA,MACxB;AAAA,KACF;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AACA,EAAA,MAAM,UAAA,GAAa,aAAa,UAAA,GAAa,cAAA;AAE7C,EAAA,MAAM,UAAA,GAA2B;AAAA,IAC/B,SAAS,CAAC,QAAA;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,GAAA,EAAK,QAAA;AAAA;AAAA,IACL,QAAQ,EAAE,IAAA,EAAM,CAAC,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,IACvB,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO;AAAA,KACT;AAAA,IACA,KAAA,EAAO;AAAA,MACL,aAAA,EAAe,CAAA;AAAA,MACf,QAAA,EAAU,SAAU,GAAA,EAAK;AAEvB,QAAA,OAAO,0BAA0B,GAAG,CAAA;AAAA,MACtC;AAAA,KACF;AAAA,IACA,WAAA,EAAa;AAAA,GACf;AACA,EAAA,OAAO,EAAE,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,UAAA,EAAW;AACxC;AAIA,SAAS,sBAAA,CAAuB,UAAoB,YAAA,EAAsB;AACxE,EAAA,MAAM,SAAA,GAAY,SAAS,YAAY,CAAA;AACvC,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,YAAA,GAAe,CAAC,CAAA;AAEzC,EAAA,MAAM,cAAA,GAAiB,0BAA0B,SAAS,CAAA;AAC1D,EAAA,MAAM,YAAA,GAAe,0BAA0B,OAAO,CAAA;AAEtD,EAAA,OAAO,CAAA,EAAG,cAAc,CAAA,GAAA,EAAM,YAAY,CAAA,CAAA;AAC5C;AChQO,IAAM,aAAA,GAAgB,UAAA;AAAA,EAC3B,CACE;AAAA,IACE,eAAA,GAAkB,OAAA;AAAA,IAClB,SAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,uBACErB,GAAAA;AAAA,MAACI,KAAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACC,GAAG,SAAA;AAAA,QACJ,EAAA,EAAI,EAAE,SAAA,EAAW,MAAA,EAAQ,WAAW,QAAA,EAAU,GAAG,UAAU,EAAA,EAAG;AAAA,QAE9D,QAAA,kBAAAJ,GAAAA;AAAA,UAACI,KAAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI;AAAA,cACF,eAAA;AAAA,cACA,MAAA,EAAQ,MAAA;AAAA,cACR;AAAA,aACF;AAAA,YAEC;AAAA;AAAA;AACH;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AC5BA,SAAS,wBAAA,CACP,EAAE,GAAA,EAAI,EACN,GAAA,EACA;AACA,EAAA,IAAI,CAAC,kBAAA,CAAmB,GAAG,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,EAAA,MAAM,IAAA,GAAO,IAAI,MAAA,EAAQ,IAAA;AACzB,EAAA,MAAM,OAAA,GAAU,IAAI,MAAA,EAAQ,OAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,IAAI,MAAA,EAAQ,GAAA;AACxB,EAAA,MAAM,GAAA,GAAM,IAAI,MAAA,EAAQ,GAAA;AACxB,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,MAAA,EAAQ,SAAA,IAAa,EAAC;AAE3C,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,OAAA,EAAS;AACrB,IAAA,uBAAOJ,GAAAA,CAAC,KAAA,EAAA,EAAI,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,EACxB;AAEA,EAAA,uBACEA,GAAAA,CAACI,KAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAO,EAClE,QAAA,kBAAAJ,GAAAA,CAAC,aAAA,EAAA,EAAc,GAAA,EAAU,MAAA,EAAO,MAAA,EAC9B,QAAA,kBAAAH,IAAAA,CAACO,KAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,OAAM,EAC/C,QAAA,EAAA;AAAA,oBAAAJ,IAACI,KAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EAAG,CAAA;AAAA,oBACtBJ,GAAAA,CAACI,KAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,CAAA,EAAG,CAAA,IAC1C,QAAA,kBAAAJ,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM;AAAA,UACJ,OAAO,CAAA,MAAA,EAAS,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,WAAW,CAAA,CAAA;AAAA,UAClD,IAAA,EAAM,GAAA,CAAI,MAAA,EAAQ,WAAA,IAAe,EAAA;AAAA,UACjC,QAAA,EAAU,CAAC,IAAA,EAAM,OAAO,CAAA;AAAA,UACxB,GAAA;AAAA,UACA,GAAA;AAAA,UACA,SAAS,IAAA,CAAK,KAAA;AAAA,UACd;AAAA;AACF;AAAA,KACF,EACF,CAAA;AAAA,oBACAA,IAACI,KAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EAAG;AAAA,GAAA,EACxB,GACF,CAAA,EACF,CAAA;AAEJ;AAEO,IAAM,uBAAA,GAA0BkB,WAAW,wBAAwB,CAAA;AC3BnE,SAAS,eAAA,CAAgB;AAAA,EAC9B,MAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI5B,QAAAA;AAAA,IAClC,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,QAAQ,MAAA,KAAW;AAAA,GAC/C;AAEA,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,OAAM,GAAI,uBAAA,CAAgB,OAAO,KAAK,CAAA;AAElE,EAAAiB,UAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,CAAC,CAAC,KAAK,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,KAAA,EAAO,mBAAmB,CAAC,CAAA;AAE/B,EAAA,MAAM,cAAc,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAE7C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAOX,GAAAA,CAACI,KAAAA,EAAA,EAAI,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,IAAK,KAAA,EAAO;AACrC,IAAA,uBACEJ,GAAAA,CAACI,KAAAA,EAAA,EAAI,QAAA,EAAA,oEAAA,EAGL,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEP,IAAAA,CAACM,MAAAA,EAAA,EAAM,OAAA,EAAS,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,UAAA,EAAY,EAAA,EAAI,OAAA,EAAQ,EAClD,QAAA,EAAA;AAAA,oBAAAN,IAAAA,CAACO,OAAA,EACC,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAACQ,WAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,IAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,OAAA,EAE3C,CAAA;AAAA,sBACAR,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAK,OAAA;AAAA,UACL,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,WAAW,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,MAAK;AAAE;AAAA;AACzC,KAAA,EACF,CAAA;AAAA,oBACAH,IAAAA,CAACO,KAAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAACQ,WAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,IAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,SAAA,EAE3C,CAAA;AAAA,sBACAR,GAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,yBACEA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,UAAA;AAAA,cACT,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,aAAA,CAAc,CAAA,CAAE,OAAO,OAAO,CAAA;AAC9B,gBAAA,eAAA,CAAgB;AAAA,kBACd,GAAG,MAAA;AAAA,kBACH,OAAA,EAAS;AAAA,iBACV,CAAA;AAAA,cACH,CAAA;AAAA,cACA,IAAA,EAAK;AAAA;AAAA,WACP;AAAA,UAEF,KAAA,EAAM,aAAA;AAAA,UACN,EAAA,EAAI,EAAE,EAAA,EAAI,MAAA;AAAO;AAAA,OACnB;AAAA,MACC,CAAC,8BACAA,GAAAA;AAAA,QAACuB,YAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAO,IAAA;AAAA,UACP,SAAA,EAAU,mBAAA;AAAA,UACV,iBAAA,EAAmB,KAAA;AAAA,UACnB,OAAA,EAAS,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE,CAAE,CAAA;AAAA,UACxD,QAAQ,MAAA,CAAO,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YACxC,KAAA,EAAO,CAAA;AAAA,YACP,KAAA,EAAO;AAAA,WACT,CAAE,CAAA;AAAA,UACF,QAAA,EAAU,CAAC,QAAA,KAAuC;AAChD,YAAA,IAAI,IAAA;AACJ,YAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAClC,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,GAC3B,EAAC;AACL,YAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,cAAA,IAAA,GAAO,MAAA;AAAA,YACT,CAAA,MAAO;AACL,cAAA,IAAA,GAAO,OAAA;AAAA,YACT;AACA,YAAA,eAAA,CAAgB;AAAA,cACd,GAAG,MAAA;AAAA,cACH,OAAA,EAAS;AAAA,aACV,CAAA;AAAA,UACH,CAAA;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,SAAA,EAAW,CAAC,IAAA,MAA8B;AAAA,cACxC,GAAG,IAAA;AAAA,cACH,KAAA,EAAO;AAAA,aACT,CAAA;AAAA,YACA,OAAA,EAAS,CAAC,IAAA,MAA8B;AAAA,cACtC,GAAG,IAAA;AAAA,cACH,SAAA,EAAW;AAAA,aACb;AAAA;AACF;AAAA;AACF,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;;;ACvBO,SAAS,mBAAA,CACd,YAAA,EACA,WAAA,EACA,eAAA,EACS;AACT,EAAA,IAAI,CAAC,WAAA,IAAe,CAAC,eAAA,EAAiB;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OACE,YAAA,KAAiB,OAAA,IACjB,YAAA,KAAiB,SAAA,IACjB,YAAA,KAAiB,UAAA;AAErB;AAKO,SAAS,kBAAA,CACd,YACA,WAAA,EACS;AACT,EAAA,OAAO,WAAA,CAAY,SAAS,UAAU,CAAA;AACxC;AAKO,SAAS,cAAA,CACd,YACA,aAAA,EACS;AACT,EAAA,OAAO,aAAA,CAAc,SAAS,UAAU,CAAA;AAC1C;AAKO,SAAS,gBAAA,CACd,YACA,cAAA,EACS;AACT,EAAA,OAAO,cAAA,CAAe,SAAS,UAAU,CAAA;AAC3C;AASA,SAAS,UAAA,CACP,WACA,IAAA,EACmE;AACnE,EAAA,OAAO,UAAU,IAAI,CAAA;AACvB;AAiBO,SAAS,kBAAkB,MAAA,EAA2C;AAC3E,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,WAAA,GAAc,KAAA;AAAA,IACd,QAAA;AAAA,IACA,iBAAiB,EAAC;AAAA,IAClB,UAAA,GAAa;AAAA,GACf,GAAI,MAAA;AAEJ,EAAA,MAAM,eAAA,GAAA,CAAmB,QAAA,EAAU,QAAA,IAAY,CAAA,IAAK,CAAA;AACpD,EAAA,MAAM,UAA0B,EAAC;AAGjC,EAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC5B,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,SAAA,EAAW,IAAI,CAAA;AAEtC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAAA,MACvE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,GAAA,EAAK,IAAA;AAAA,MACL,IAAA;AAAA,MACA,YAAY,GAAA,CAAI,OAAA;AAAA,MAChB,cAAc,GAAA,CAAI,MAAA;AAAA,MAClB,gBAAA,EAAkB,kBAAkB,IAAI,CAAA;AAAA,MACxC,MAAA,EAAQ,IAAA;AAAA,MACR,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC9B,IAAA,IAAI,kBAAA,CAAmB,IAAA,EAAM,WAAW,CAAA,EAAG;AAC3C,IAAA,IAAI,gBAAA,CAAiB,IAAA,EAAM,cAAc,CAAA,EAAG;AAE5C,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,SAAA,EAAW,IAAI,CAAA;AAEtC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAAA,MAClE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,GAAA,EAAK,IAAA;AAAA,MACL,IAAA;AAAA,MACA,YAAY,GAAA,CAAI,OAAA;AAAA,MAChB,cAAc,GAAA,CAAI,MAAA;AAAA,MAClB,gBAAA,EAAkB,kBAAkB,IAAI,CAAA;AAAA,MACxC,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,GAAG,CAAA,KAAM;AACjD,IAAA,IAAI,kBAAA,CAAmB,IAAA,EAAM,WAAW,CAAA,EAAG;AAC3C,IAAA,IAAI,cAAA,CAAe,IAAA,EAAM,aAAa,CAAA,EAAG;AACzC,IAAA,IAAI,gBAAA,CAAiB,IAAA,EAAM,cAAc,CAAA,EAAG;AAE5C,IAAA,IAAI,CAAC,mBAAA,CAAoB,GAAA,CAAI,MAAA,EAAQ,WAAA,EAAa,eAAe,CAAA,EAAG;AAClE,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,GAAA,EAAK,IAAA;AAAA,MACL,IAAA;AAAA,MACA,YAAY,GAAA,CAAI,OAAA;AAAA,MAChB,cAAc,GAAA,CAAI,MAAA;AAAA,MAClB,gBAAA,EAAkB,kBAAkB,IAAI;AAAA,KACzC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,wBACd,MAAA,EACgB;AAChB,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,iBAAiB,EAAC;AAAA,IAClB,UAAA,GAAa;AAAA,GACf,GAAI,MAAA;AAEJ,EAAA,MAAM,UAA0B,EAAC;AAGjC,EAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC5B,IAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAE1B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAAA,MACvE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,GAAA,EAAK,IAAA;AAAA,MACL,IAAA;AAAA,MACA,YAAY,GAAA,CAAI,OAAA;AAAA,MAChB,gBAAA,EAAkB,kBAAkB,IAAI,CAAA;AAAA,MACxC,MAAA,EAAQ,IAAA;AAAA,MACR,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC9B,IAAA,IAAI,WAAA,CAAY,QAAA,CAAS,IAAI,CAAA,EAAG;AAChC,IAAA,IAAI,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA,EAAG;AAEnC,IAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAE1B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAAA,MAClE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,IAAA;AAAA,MACA,YAAY,GAAA,CAAI,OAAA;AAAA,MAChB,gBAAA,EAAkB,kBAAkB,IAAI,CAAA;AAAA,MACxC,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,GAAG,CAAA,KAAM;AACjD,IAAA,IAAI,WAAA,CAAY,QAAA,CAAS,IAAI,CAAA,EAAG;AAChC,IAAA,IAAI,aAAA,CAAc,QAAA,CAAS,IAAI,CAAA,EAAG;AAClC,IAAA,IAAI,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA,EAAG;AAEnC,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,IAAA;AAAA,MACA,YAAY,GAAA,CAAI,OAAA;AAAA,MAChB,gBAAA,EAAkB,kBAAkB,IAAI;AAAA,KACzC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACT;;;ACtVO,SAAS,4BAAA,CACd,SACA,0BAAA,EAC0C;AAC1C,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,gBAAA;AAAA,MACP,SAAS,MAAM;AACb,QAAA,0BAAA,CAA2B,EAAE,CAAC,OAAO,GAAG,OAAO,CAAA;AAAA,MACjD;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,uBAAA;AAAA,MACP,SAAS,MAAM;AACb,QAAA,0BAAA,CAA2B,EAAE,CAAC,OAAO,GAAG,GAAG,CAAA;AAAA,MAC7C;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,oBAAA;AAAA,MACP,SAAS,MAAM;AACb,QAAA,0BAAA,CAA2B,EAAE,CAAC,OAAO,GAAG,WAAW,CAAA;AAAA,MACrD;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,sBAAA;AAAA,MACP,SAAS,MAAM;AACb,QAAA,0BAAA,CAA2B,EAAE,CAAC,OAAO,GAAG,SAAS,CAAA;AAAA,MACnD;AAAA;AACF,GACF;AACF;ACkDO,SAAS,0BAAA,CAA2B;AAAA,EACzC,IAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAc,EAAC;AAAA,EACf,kBAAA;AAAA,EACA,gBAAgB,EAAC;AAAA,EACjB,qBAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI7B,SAA6B,IAAI,CAAA;AACjE,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAQ,CAAA;AAEjC,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAmC;AAC1D,IAAA,WAAA,CAAY,MAAM,aAAa,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,EAClB,CAAA;AAGA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,uBAAOM,GAAAA,CAAAO,QAAAA,EAAA,EAAE,CAAA;AAAA,EACX;AAGA,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,QAAA,CAAS,IAAI,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,QAAA,CAAS,IAAI,CAAA;AAG5C,EAAA,MAAM,OAAA,GAAU,YAAA,KAAiB,OAAA,IAAW,YAAA,KAAiB,SAAA;AAG7D,EAAA,IAAI,gBAA0D,EAAC;AAC/D,EAAA,IAAI,0BAAA,EAA4B;AAC9B,IAAA,aAAA,GAAgB,4BAAA;AAAA,MACd,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACzB,IAAA,MAAM,iBAAiB,WAAA,CAAY,MAAA,CAAO,CAAC,IAAA,KAAS,SAAS,IAAI,CAAA;AACjE,IAAA,kBAAA,CAAmB,cAAc,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACzB,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,GAAG,WAAA,CAAY,MAAA,CAAO,CAAC,IAAA,KAAS,SAAS,OAAO,CAAA;AAAA,MAChD;AAAA,KACF;AACA,IAAA,kBAAA,CAAmB,cAAc,CAAA;AAAA,EACnC,CAAA;AAGA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,qBAAA,EAAuB;AAC5B,IAAA,MAAM,mBAAmB,aAAA,CAAc,MAAA,CAAO,CAAC,IAAA,KAAS,SAAS,IAAI,CAAA;AACrE,IAAA,qBAAA,CAAsB,gBAAgB,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI,CAAC,qBAAA,EAAuB;AAC5B,IAAA,MAAM,gBAAA,GAAmB,CAAC,GAAG,aAAA,EAAe,IAAI,CAAA;AAChD,IAAA,qBAAA,CAAsB,gBAAgB,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,uBACEV,IAAAA;AAAA,IAACO,KAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,YAAY,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,MACxE,SAAA,EAAU,aAAA;AAAA,MAGT,QAAA,EAAA;AAAA,QAAA,IAAA,oBAAQJ,IAAC,MAAA,EAAA,EAAO,CAAA;AAAA,wBAGjBA,GAAAA;AAAA,UAACI,KAAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI;AAAA,cACF,IAAA,EAAM,CAAA;AAAA,cACN,QAAA,EAAU,QAAA;AAAA,cACV,YAAA,EAAc,UAAA;AAAA,cACd,UAAA,EAAY;AAAA,aACd;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAGC,OAAA,IAAW,sCACVJ,GAAAA;AAAA,UAACI,KAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,OAAO,QAAA,GAAW,MAAA;AAAA,YAC7B,SAAA,EAAW,OAAO,YAAA,GAAe,UAAA;AAAA,YACjC,EAAA,EAAI;AAAA,cACF,OAAA,EAAS,OAAO,OAAA,GAAU,MAAA;AAAA,cAC1B,MAAA,EAAQ;AAAA,aACV;AAAA,YACA,OAAA,EAAS,OAAO,cAAA,GAAiB;AAAA;AAAA,SACnC;AAAA,QAID,CAAC,IAAA,IAAQ,qBAAA,oBACRJ,GAAAA;AAAA,UAACI,KAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,WAAW,SAAA,GAAY,MAAA;AAAA,YAClC,SAAA,EAAW,WAAW,YAAA,GAAe,UAAA;AAAA,YACrC,EAAA,EAAI;AAAA,cACF,OAAA,EAAS,WAAW,OAAA,GAAU,MAAA;AAAA,cAC9B,MAAA,EAAQ;AAAA,aACV;AAAA,YACA,OAAA,EAAS,WAAW,WAAA,GAAc;AAAA;AAAA,SACpC;AAAA,QAID,CAAC,IAAA,IAAQ,UAAA,KAAe,QAAA,IAAY,aAAA,CAAc,SAAS,CAAA,oBAC1DP,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAP,GAAAA;AAAA,YAACC,WAAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAW,SAAA;AAAA,cACX,IAAA,EAAK,OAAA;AAAA,cACL,SAAA,EAAU,kBAAA;AAAA,cACV,OAAA,EAAS,eAAA;AAAA,cAET,QAAA,kBAAAD,IAAC,gBAAA,EAAA,EAAiB;AAAA;AAAA,WACpB;AAAA,0BACAA,GAAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAoB,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,eAAA,EAChD,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,qBAClBA,GAAAA;AAAA,YAACwB,SAAA;AAAA,YAAA;AAAA,cAEC,SAAS,MAAM;AACb,gBAAA,CAAA,CAAE,OAAA,EAAQ;AACV,gBAAA,eAAA,EAAgB;AAAA,cAClB,CAAA;AAAA,cAEC,QAAA,EAAA,CAAA,CAAE;AAAA,aAAA;AAAA,YANE,CAAA,CAAE;AAAA,WAQV,CAAA,EACH;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;ACzMO,SAAS,qBAAA,CAAsB;AAAA,EACpC,IAAA;AAAA,EACA,gBAAgB,EAAC;AAAA,EACjB,wBAAwB,MAAM;AAC5B,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA+B;AAC7B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI9B,SAA6B,IAAI,CAAA;AACjE,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAQ,CAAA;AAEjC,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAmC;AAC1D,IAAA,WAAA,CAAY,MAAM,aAAa,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,IAAI,gBAA0D,EAAC;AAC/D,EAAA,IAAI,0BAAA,EAA4B;AAC9B,IAAA,aAAA,GAAgB,4BAAA;AAAA,MACd,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,QAAA,CAAS,IAAI,CAAA;AAE5C,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAM,mBAAmB,aAAA,CAAc,MAAA,CAAO,CAAC,IAAA,KAAS,SAAS,IAAI,CAAA;AACrE,IAAA,qBAAA,CAAsB,gBAAgB,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,MAAM,gBAAA,GAAmB,CAAC,GAAG,aAAA,EAAe,IAAI,CAAA;AAChD,IAAA,qBAAA,CAAsB,gBAAgB,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,uBACEG,IAAAA;AAAA,IAACO,KAAAA;AAAA,IAAA;AAAA,MACC,IAAI,EAAE,OAAA,EAAS,QAAQ,UAAA,EAAY,QAAA,EAAU,OAAO,MAAA,EAAO;AAAA,MAC3D,SAAA,EAAU,aAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAACI,OAAA,EAAI,EAAA,EAAI,EAAE,IAAA,EAAM,CAAA,IAAM,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,wBAE5BJ,GAAAA;AAAA,UAACI,KAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,WAAWqB,SAAAA,GAAYC,MAAAA;AAAA,YAClC,SAAA,EAAW,WAAW,YAAA,GAAe,UAAA;AAAA,YACrC,EAAA,EAAI;AAAA,cACF,OAAA,EAAS,WAAW,OAAA,GAAU,MAAA;AAAA,cAC9B,MAAA,EAAQ;AAAA,aACV;AAAA,YACA,OAAA,EAAS,WAAW,WAAA,GAAc;AAAA;AAAA,SACpC;AAAA,QACC,UAAA,KAAe,QAAA,oBACd7B,IAAAA,CAAAU,UAAA,EACE,QAAA,EAAA;AAAA,0BAAAP,GAAAA;AAAA,YAACC,WAAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAW,SAAA;AAAA,cACX,IAAA,EAAK,OAAA;AAAA,cACL,SAAA,EAAU,SAAA;AAAA,cACV,EAAA,EAAI;AAAA,gBACF,CAAA,EAAG;AAAA,eACL;AAAA,cACA,OAAA,EAAS,eAAA;AAAA,cAET,QAAA,kBAAAD,IAAC,mBAAA,EAAA,EAAoB;AAAA;AAAA,WACvB;AAAA,0BACAA,GAAAA,CAAC2B,IAAAA,EAAA,EAAK,QAAA,EAAoB,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,eAAA,EAChD,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,sBAClB3B,GAAAA;AAAA,YAACwB,SAAAA;AAAA,YAAA;AAAA,cAEC,SAAS,MAAM;AACb,gBAAA,CAAA,CAAE,OAAA,EAAQ;AACV,gBAAA,eAAA,EAAgB;AAAA,cAClB,CAAA;AAAA,cAEC,QAAA,EAAA,CAAA,CAAE;AAAA,aAAA;AAAA,YANE,CAAA,CAAE;AAAA,WAQV,CAAA,EACH;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;;;AChHO,SAAS,SAAA,CAAU,OAAiB,KAAA,EAAiB;AAE1D,EAAA,MAAM,IAAA,GAAO,CAAC,GAAG,KAAK,CAAA;AACtB,EAAA,MAAM,IAAA,GAAO,CAAC,GAAG,KAAK,CAAA;AAEtB,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AACzC,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,WAAW,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG;AACpC,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,WAAW,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,CAAK,CAAC,CAAA,EAAG;AAC9B,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AACpB,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,WAAW,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG;AACjC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAA;AAChC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,QAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG;AAC9B,UAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,QACtB;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AACpB,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,IAAA,CAAK,MAAA,CAAO,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AACpB,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACpB,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1B,MAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,IAClB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACpB,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1B,MAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,IAClB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AAIO,SAAS,mBAAA,CACd,OACA,KAAA,EAC6B;AAC7B,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AACrC,EAAA,MAAM,SAAiD,EAAC;AAExD,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AACzB,MAAA,MAAA,CAAO,IAAI,CAAA,GAAI,OAAA;AAAA,IACjB,CAAA,MAAA,IAAW,CAAC,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AAChC,MAAA,MAAA,CAAO,IAAI,CAAA,GAAI,SAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AAAA,IACjB;AAAA,EACF;AAGA,EAAA,MAAM,eAAmD,EAAC;AAC1D,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,IAAA,YAAA,CAAa,IAAI,CAAA,GAAI,KAAA;AAAA,EACvB,CAAC,CAAA;AACD,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,MAAM,IAAA,GAAO,aAAa,IAAI,CAAA;AAC9B,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,IAAA,GAAO,IAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAI,CAAA,GAAI,WAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACnFO,SAAS,sBAAsB,SAAA,EAAuC;AAC3E,EAAA,OAAO,SAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,KAAA,MAAW;AAAA,IACzC,GAAG,UAAU,OAAA,CAAQ,MAAA;AAAA,MACnB,CAAC,GAAA,EAAK,MAAA,EAAQ,QAAA,KAAa;AACzB,QAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA;AAC9B,QAAA,OAAO,GAAA;AAAA,MACT,CAAA;AAAA,MACA;AAAC,KACH;AAAA,IACA,QAAA,EAAU,MAAA;AAAA,IACV,QAAQ,KAAA,GAAQ;AAAA,GAClB,CAAE,CAAA;AACJ;AAEO,SAAS,YAAY,GAAA,EAAqB;AAE/C,EAAA,MAAM,MAAA,GAAS,OAAO,GAAG,CAAA;AAGzB,EAAA,IAAI,CAAC,KAAA,CAAM,MAAM,CAAA,IAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,OAAO,mBAAmB,GAAG,CAAA;AAC/B;AAMO,SAAS,mBAAmB,GAAA,EAAqB;AACtD,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC7B,IAAA,IAAA,GAAA,CAAQ,IAAA,IAAQ,KAAK,IAAA,GAAO,IAAA;AAC5B,IAAA,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,EAChB;AAGA,EAAA,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AACtB;AAEO,SAAS,kBAAA,CACd,KACA,GAAA,EACwB;AACxB,EAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AAGjC,EAAA,IAAI,YAAY,GAAA,EAAK;AACnB,IAAA,OAAO,IAAI,QAAmB,CAAA;AAAA,EAChC;AAGA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAY,KAAM,QAAQ,CAAA;AAI1E,EAAA,OAAO,QAAA,GAAW,GAAA,CAAI,QAAQ,CAAA,GAAI,MAAA;AACpC;;;AChBO,SAAS,eAAe,EAAA,EAA+C;AAC5E,EAAA,MAAM,SAAyC,EAAC;AAChD,EAAA,EAAA,CAAG,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AACjC,IAAA,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,GAAI;AAAA,MACjB,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,KAAA;AAAA,MACA,SAAS,GAAA,CAAI;AAAA,KACf;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,qBACd,EAAA,EACgC;AAChC,EAAA,MAAM,SAAyC,EAAC;AAEhD,EAAA,EAAA,CAAG,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AACjC,IAAA,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,GAAI;AAAA,MAChB,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,KAAA;AAAA,MACA,SAAS,GAAA,CAAI;AAAA,KACf;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,IAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,IAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,EACnE;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,oBAAA,CACd,MACA,OAAA,EACqC;AACrC,EAAA,MAAM,SAA8C,EAAC;AAErD,EAAA,MAAM,SAAA,GAAY,mBAAA;AAAA,IAChB,KAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,GAAG,CAAA;AAAA,IACjC,QAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,GAAG;AAAA,GACtC;AAEA,EAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,MAAM,CAAA,KAAM;AACnD,IAAA,MAAM,UAAA,GAAa,KAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,GAAG,CAAA;AACzD,IAAA,MAAM,aAAA,GAAgB,QAAQ,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,GAAG,CAAA;AAC/D,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI;AAAA,MACZ,MAAA;AAAA,MACA,aAAA,EAAe,YAAY,GAAA,IAAO,SAAA;AAAA,MAClC,gBAAA,EAAkB,eAAe,GAAA,IAAO,SAAA;AAAA,MACxC,OAAA,EAAS,UAAA,EAAY,IAAA,IAAQ,aAAA,EAAe,IAAA,IAAQ,SAAA;AAAA,MACpD,GAAA,EAAK,UAAA,EAAY,GAAA,IAAO,aAAA,EAAe,GAAA,IAAO;AAAA,KAChD;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AASO,SAAS,mBAAA,CACd,SACA,WAAA,EACU;AACV,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,QAAQ,OAAA,CAAQ,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAQ,GAAG,CAAA;AAEnD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,GAAG,CAAA,UAAA,CAAY,CAAA;AAAA,IAC3C;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,kBAAA,CACd,OAAA,EACA,WAAA,EACA,GAAA,EACQ;AACR,EAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,IAAA,OAAO,MAAA,CAAO,IAAI,MAAM,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,GAAG,CAAA;AAE7C,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,GAAG,CAAA,UAAA,CAAY,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,IAAA,MAAA,CAAO,KAAK,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AACxB;AA0EO,SAAS,kBAAA,CAAmB,KAAA,EAAe,WAAA,GAAc,CAAA,EAAW;AAEzE,EAAA,MAAM,kBAAkB,MAAA,CAAO,EAAA,CAAG,KAAA,EAAO,EAAE,IAAI,CAAA,GAAI,KAAA;AAEnD,EAAA,MAAM,MAAA,GACJ,YAAA,CAAa,eAAA,EAAiB,OAAA,EAAS;AAAA,IACrC,qBAAA,EAAuB,WAAA;AAAA,IACvB,YAAA,EAAc;AAAA,GACa,CAAA,IAAK,MAAA,CAAO,KAAK,CAAA;AAGhD,EAAA,OAAO,MAAA,KAAW,OAAO,GAAA,GAAM,MAAA;AACjC;AAEO,SAAS,mBAAA,CACd,OACA,UAAA,EACQ;AAER,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAG;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,KAAA,GAAQ,IAAI,QAAA,GAAM,SAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA;AAEf,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AAEA,EAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAElC,IAAA,OAAO,kBAAA,CAAmB,OAAO,UAAU,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,IAAA,OACE,YAAA,CAAa,OAAO,MAAA,EAAQ;AAAA,MAC1B,KAAA,EAAO,SAAA;AAAA,MACP,qBAAA,EAAuB;AAAA,KACxB,CAAA,IAAK,MAAA,CAAO,KAAK,CAAA;AAAA,EAEtB;AAGA,EAAA,OAAO,kBAAA,CAAmB,OAAO,CAAC,CAAA;AACpC;AAKO,SAAS,eAAA,CACd,GAAA,EACA,GAAA,EACA,UAAA,EACA,gBAAA,EACmB;AACnB,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,GAAA,EAAK,GAAG,CAAA;AAEzC,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,CAAC,KAAK,IAAI,CAAA;AAAA,EACnB;AAEA,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,OAAA,GAAU,KAAA;AAGd,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAE9B,IAAA,aAAA,GAAgB,MAAM,QAAA,EAAS;AAAA,EACjC,CAAA,MAAA,IAAW,UAAU,EAAA,EAAI;AACvB,IAAA,aAAA,GAAgB,SAAA;AAChB,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AACpC,IAAA,aAAA,GAAgB,mBAAA,CAAoB,OAAO,gBAAgB,CAAA;AAAA,EAC7D,CAAA,MAAO;AACL,IAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,MAAA,aAAA,GAAgB,mBAAA,CAAoB,UAAA,CAAW,KAAK,CAAA,EAAG,gBAAgB,CAAA;AAAA,IACzE,CAAA,MAAO;AACL,MAAA,aAAA,GAAgB,OAAO,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,eAAe,OAAO,CAAA;AAChC;AAkCO,SAAS,mBACd,YAAA,EACoB;AACpB,EAAA,IAAI,YAAA,KAAiB,SAAS,OAAO,mBAAA;AACrC,EAAA,IAAI,YAAA,KAAiB,WAAW,OAAO,qBAAA;AACvC,EAAA,OAAO,MAAA;AACT;AC9UO,IAAM,iBAAA,GAAoB,CAC/B,MAAA,KACG;AACH,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,EAAA,MAAM,aAAa,MAAA,EAAQ,UAAA;AAC3B,EAAA,MAAM,mBAAmB,MAAA,EAAQ,gBAAA;AACjC,EAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,IAAS,EAAA;AAEnC,EAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAC,aAAA,EAAe,OAAO,CAAA,GAAI,eAAA;AAAA,IAC/B,MAAA,CAAO,IAAA;AAAA,IACP,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACExB,GAAAA;AAAA,IAACQ,WAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,MAAA;AAAA,MACV,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,GAAU,SAAS,SAAA,EAAU;AAAA,MAE5C,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ,CAAA;ACzCA,IAAM,MAAA,GAAS;AAAA,EACb,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,SAAA;AAAA,IACJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACP;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACP;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,SAAA;AAAA,IACJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACP;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,SAAA;AAAA,IACJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACP;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,SAAA;AAAA,IACJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACP;AAAA,EACA,GAAA,EAAK;AAAA,IACH,EAAA,EAAI,SAAA;AAAA,IACJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACP;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACP;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,SAAA;AAAA,IACJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACP;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,SAAA;AAAA,IACJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK;AAAA;AAET,CAAA;AAGA,IAAM,cAAA,GAAiB;AAAA,EACrB,OAAA,EAAS,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAAA,EACzB,UAAA,EAAY,MAAA,CAAO,QAAA,CAAS,GAAG;AACjC,CAAA;AAkBA,SAAS,yBAAA,CACP,WACA,UAAA,EACA;AACA,EAAA,OAAO;AAAA;AAAA,IAEL;AAAA,MACE,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,WAAA,EAAqB;AAAA,MACzD,KAAA,EAAO;AAAA,QACL,eAAA,EAAiB,WAAW,GAAG,CAAA;AAAA,QAC/B,KAAA,EAAO,SAAA;AAAA,QACP,SAAA,EAAW;AAAA,UACT,eAAA,EAAiB,WAAW,GAAG;AAAA;AACjC;AACF,KACF;AAAA;AAAA,IAEA;AAAA,MACE,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,UAAA,EAAoB;AAAA,MACxD,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,WAAW,GAAG,CAAA;AAAA,QAC3B,KAAA,EAAO,WAAW,GAAG,CAAA;AAAA,QACrB,SAAA,EAAW;AAAA,UACT,WAAA,EAAa,WAAW,GAAG,CAAA;AAAA,UAC3B,eAAA,EAAiB,CAAA,EAAG,UAAA,CAAW,EAAE,CAAC,CAAA,EAAA;AAAA;AACpC;AACF,KACF;AAAA;AAAA,IAEA;AAAA,MACE,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,MAAA,EAAgB;AAAA,MACpD,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,WAAW,GAAG,CAAA;AAAA,QACrB,SAAA,EAAW;AAAA,UACT,eAAA,EAAiB,CAAA,EAAG,UAAA,CAAW,EAAE,CAAC,CAAA,EAAA;AAAA;AACpC;AACF;AACF,GACF;AACF;AAKA,SAAS,0BAAA,CACP,WACA,UAAA,EACA;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAU;AAAA,IAC1B,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,WAAW,GAAG;AAAA;AACvB,GACF;AACF;AAKA,SAAS,uBAAA,CACP,WACA,UAAA,EACA;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAU;AAAA,IAC1B,KAAA,EAAO;AAAA,MACL,mBAAA,EAAqB;AAAA,QACnB,eAAA,EAAiB,WAAW,GAAG,CAAA;AAAA,QAC/B,KAAA,EAAO;AAAA;AACT;AACF,GACF;AACF;AAKA,SAAS,uBAAA,CACP,WACA,UAAA,EACA;AACA,EAAA,OAAO;AAAA;AAAA,IAEL;AAAA,MACE,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,QAAA,EAAkB;AAAA,MACtD,KAAA,EAAO;AAAA,QACL,eAAA,EAAiB,WAAW,GAAG,CAAA;AAAA,QAC/B,KAAA,EAAO,SAAA;AAAA,QACP,SAAA,EAAW;AAAA,UACT,eAAA,EAAiB,WAAW,GAAG;AAAA;AACjC;AACF,KACF;AAAA;AAAA,IAEA;AAAA,MACE,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,UAAA,EAAoB;AAAA,MACxD,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,WAAW,GAAG,CAAA;AAAA,QAC3B,KAAA,EAAO,WAAW,GAAG;AAAA;AACvB;AACF,GACF;AACF;AAGA,IAAM,mBAAA,GAAsB;AAAA,EAC1B,GAAG,yBAAA,CAA0B,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,EACxD,GAAG,yBAAA,CAA0B,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,EAChD,GAAG,yBAAA,CAA0B,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,EAClD,GAAG,yBAAA,CAA0B,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,EAClD,GAAG,yBAAA,CAA0B,KAAA,EAAO,MAAA,CAAO,GAAG,CAAA;AAAA,EAC9C,GAAG,yBAAA,CAA0B,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,EAChD,GAAG,yBAAA,CAA0B,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,EACtD,GAAG,yBAAA,CAA0B,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA;AAAA,EAElD;AAAA,IACE,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAoB,SAAS,WAAA,EAAqB;AAAA,IAClE,KAAA,EAAO;AAAA,MACL,eAAA,EAAiB,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MACnC,KAAA,EAAO,SAAA;AAAA,MACP,WAAW,EAAE,eAAA,EAAiB,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAE;AACpD,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAoB,SAAS,UAAA,EAAoB;AAAA,IACjE,KAAA,EAAO;AAAA,MACL,WAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA;AAAA,MAC/B,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MACzB,SAAA,EAAW;AAAA,QACT,WAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,QAC/B,eAAA,EAAiB,MAAA,CAAO,OAAA,CAAQ,GAAG;AAAA;AACrC;AACF,GACF;AAAA,EACA;AAAA,IACE,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAoB,SAAS,MAAA,EAAgB;AAAA,IAC7D,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MACzB,WAAW,EAAE,eAAA,EAAiB,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAE;AACpD;AAEJ,CAAA;AAGA,IAAM,qBAAA,GAAwB;AAAA,EAC5B,0BAAA,CAA2B,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,EACtD,0BAAA,CAA2B,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,EAC9C,0BAAA,CAA2B,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,EAChD,0BAAA,CAA2B,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,EAChD,0BAAA,CAA2B,KAAA,EAAO,MAAA,CAAO,GAAG,CAAA;AAAA,EAC5C,0BAAA,CAA2B,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,EAC9C,0BAAA,CAA2B,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,EACpD,0BAAA,CAA2B,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,EAChD,0BAAA,CAA2B,SAAA,EAAW,MAAA,CAAO,OAAO;AACtD,CAAA;AAGA,IAAM,kBAAA,GAAqB;AAAA,EACzB,uBAAA,CAAwB,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,EACnD,uBAAA,CAAwB,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,EAC3C,uBAAA,CAAwB,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,EAC7C,uBAAA,CAAwB,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,EAC7C,uBAAA,CAAwB,KAAA,EAAO,MAAA,CAAO,GAAG,CAAA;AAAA,EACzC,uBAAA,CAAwB,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,EAC3C,uBAAA,CAAwB,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,EACjD,uBAAA,CAAwB,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,EAC7C,uBAAA,CAAwB,SAAA,EAAW,MAAA,CAAO,OAAO;AACnD,CAAA;AAGA,IAAM,iBAAA,GAAoB;AAAA,EACxB,GAAG,uBAAA,CAAwB,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,EACtD,GAAG,uBAAA,CAAwB,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,EAC9C,GAAG,uBAAA,CAAwB,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,EAChD,GAAG,uBAAA,CAAwB,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,EAChD,GAAG,uBAAA,CAAwB,KAAA,EAAO,MAAA,CAAO,GAAG,CAAA;AAAA,EAC5C,GAAG,uBAAA,CAAwB,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,EAC9C,GAAG,uBAAA,CAAwB,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,EACpD,GAAG,uBAAA,CAAwB,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,EAChD,GAAG,uBAAA,CAAwB,SAAA,EAAW,MAAA,CAAO,OAAO;AACtD,CAAA;AAGA,IAAM,kBAAA,GAAiD;AAAA;AAAA,EAErD,SAAA,EAAW;AAAA,IACT,YAAA,EAAc;AAAA,MACZ,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA;AAAA,IAEA,QAAA,EAAU;AAAA;AAAA,MAER;AAAA,QACE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,QAAA,EAAU,SAAA;AAAA,UACV,UAAA,EAAY,GAAA;AAAA,UACZ,YAAA,EAAc,CAAA;AAAA,UACd,SAAA,EAAW,OAAA;AAAA,UACX,UAAA,EAAY;AAAA;AACd,OACF;AAAA;AAAA,MAEA,GAAG;AAAA,KACL;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,aAAA,EAAe,MAAA;AAAA,QACf,UAAA,EAAY,GAAA;AAAA,QACZ,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,SAAA,EAAW;AAAA,QACT,OAAA,EAAS,iBAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,UAAA,EAAY;AAAA,QACV,OAAA,EAAS,aAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,SAAA,EAAW;AAAA,QACT,OAAA,EAAS,gBAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACZ;AAAA;AAAA,MAEA,SAAA,EAAW;AAAA,QACT,SAAA,EAAW;AAAA,UACT,SAAA,EAAW;AAAA;AACb,OACF;AAAA;AAAA,MAEA,QAAA,EAAU;AAAA,QACR,WAAA,EAAa,KAAA;AAAA,QACb,SAAA,EAAW;AAAA,UACT,WAAA,EAAa;AAAA;AACf,OACF;AAAA;AAAA,MAEA,IAAA,EAAM;AAAA,QACJ,SAAA,EAAW;AAAA,UACT,eAAA,EAAiB;AAAA;AACnB;AACF;AACF,GACF;AAAA;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,SAAA,EAAW;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAAA,MACA,UAAA,EAAY;AAAA,QACV,OAAA,EAAS;AAAA,OACX;AAAA,MACA,SAAA,EAAW;AAAA,QACT,OAAA,EAAS;AAAA;AACX;AACF,GACF;AAAA;AAAA,EAEA,YAAA,EAAc;AAAA,IACZ,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,UAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACR;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,0BAAA,EAA4B;AAAA,UAC1B,YAAA,EAAc;AAAA;AAChB;AACF;AACF,GACF;AAAA;AAAA,EAEA,gBAAA,EAAkB;AAAA,IAChB,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,CAAA;AAAA,QACd,0CAAA,EAA4C;AAAA,UAC1C,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,GAAG;AAAA,SAClC;AAAA,QACA,gDAAA,EAAkD;AAAA,UAChD,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA;AAAA,UAChC,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,WAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,GAAG;AAAA;AACjC;AACF,GACF;AAAA;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,KACT;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc;AAAA;AAChB;AACF,GACF;AAAA;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA;AACT,GACF;AAAA;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,cAAA,EAAgB;AAAA,MACd,KAAA,EAAO;AAAA,QACL,YAAA,EAAc;AAAA;AAChB;AACF,GACF;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,UAAA,EAAY,GAAA;AAAA,QACZ,QAAA,EAAU;AAAA;AACZ;AACF,GACF;AAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,cAAA,EAAgB;AAAA,MACd,KAAA,EAAO,CAAC,EAAE,KAAA,EAAM,MAAO;AAAA,QACrB,YAAA,EAAc,CAAA;AAAA,QACd,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,OAC5B;AAAA;AACF,GACF;AAAA,EACA,WAAA,EAAa;AAAA,IACX,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,QAAA,EAAU,UAAA;AAAA,QACV,OAAA,EAAS,gBAAA;AAAA,QACT,SAAA,EAAW;AAAA,UACT,eAAA,EAAiB,MAAA,CAAO,OAAA,CAAQ,GAAG;AAAA,SACrC;AAAA,QACA,gBAAA,EAAkB;AAAA,UAChB,eAAA,EAAiB,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,UACnC,SAAA,EAAW;AAAA,YACT,eAAA,EAAiB,MAAA,CAAO,QAAA,CAAS,GAAG;AAAA;AACtC;AACF;AACF;AACF,GACF;AAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU;AAAA;AAAA,MAER;AAAA,QACE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,EAAA;AAAA,UACR,QAAA,EAAU;AAAA;AACZ,OACF;AAAA;AAAA,MAEA,GAAG;AAAA,KACL;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,CAAA;AAAA,QACd,UAAA,EAAY;AAAA,OACd;AAAA,MACA,SAAA,EAAW;AAAA,QACT,MAAA,EAAQ,EAAA;AAAA,QACR,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,UAAA,EAAY;AAAA,QACV,MAAA,EAAQ,EAAA;AAAA,QACR,QAAA,EAAU;AAAA;AACZ;AACF,GACF;AAAA;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,cAAA,EAAgB;AAAA,MACd,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,QACnC,QAAA,EAAU,SAAA;AAAA,QACV,OAAA,EAAS,gBAAA;AAAA,QACT,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,GAAG;AAAA;AAC3B;AACF,GACF;AAAA;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,eAAA,EAAiB,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AAAA,QAChC,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,GAAG;AAAA,OACzB;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,eAAA,EAAiB,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AAAA,QAChC,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,GAAG;AAAA,OACzB;AAAA,MACA,aAAA,EAAe;AAAA,QACb,eAAA,EAAiB,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,QAC9B,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,GAAG;AAAA,OACvB;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,eAAA,EAAiB,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,QACnC,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,GAAG;AAAA;AAC5B;AACF,GACF;AAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,cAAA,EAAgB;AAAA,MACd,SAAA,EAAW;AAAA,QACT,MAAA,EAAQ;AAAA;AACV;AACF,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,aAAA,EAAe,MAAA;AAAA,QACf,UAAA,EAAY,GAAA;AAAA,QACZ,SAAA,EAAW;AAAA;AACb;AACF,GACF;AAAA;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,UAAA,EAAY;AAAA;AACd;AACF,GACF;AAAA;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,kBAAA;AAAA,IACV,cAAA,EAAgB;AAAA,MACd,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,GAAA;AAAA,QACZ,QAAA,EAAU;AAAA;AACZ;AACF,GACF;AAAA;AAAA,EAEA,mBAAA,EAAqB;AAAA,IACnB,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,KACT;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,YAAA,EAAc;AAAA,MACZ,SAAA,EAAW,OAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACd;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA;AAAA,QAC1B,mBAAA,EAAqB,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA;AAAA,QACxC,SAAA,EAAW;AAAA,UACT,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,GAAG;AAAA;AAC5B;AACF;AACF,GACF;AAAA;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,cAAA,EAAgB;AAAA,MACd,OAAA,EAAS;AAAA,QACP,YAAA,EAAc;AAAA;AAChB;AACF,GACF;AAAA;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,cAAA,EAAgB;AAAA,MACd,KAAA,EAAO,CAAC,EAAE,KAAA,EAAM,MAAO;AAAA,QACrB,YAAA,EAAc,CAAA;AAAA,QACd,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,OAC5B;AAAA;AACF,GACF;AAAA;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,WAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,GAAG;AAAA;AACjC;AACF,GACF;AAAA;AAAA,EAEA,cAAA,EAAgB;AAAA,IACd,cAAA,EAAgB;AAAA,MACd,SAAA,EAAW;AAAA,QACT,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,GAAG;AAAA;AAC3B;AACF;AAEJ,CAAA;AAGA,IAAM,gBAAA,GAAiC;AAAA,EACrC,OAAA,EAAS;AAAA,IACP,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA;AAAA,MACzB,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA;AAAA,MAC1B,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA;AAAA,MACzB,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,MACrB,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,MACtB,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,MACrB,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAAA,MACtB,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAAA,MACvB,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAAA,MACtB,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAAA,MACtB,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAAA,MACvB,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAAA,MACtB,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAAA,MACpB,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAAA,MACrB,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAAA,MACpB,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,MACrB,GAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MACvB,GAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MACvB,GAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MACvB,GAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MACvB,GAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MACvB,GAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MACvB,GAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MACvB,GAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MACvB,GAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,GAAG;AAAA;AACzB,GACF;AAAA,EACA,UAAA,EAAY;AAAA,IACV,UAAA,EACE,oHAAA;AAAA;AAAA,IAEF,eAAA,EAAiB,GAAA;AAAA,IACjB,iBAAA,EAAmB,GAAA;AAAA,IACnB,gBAAA,EAAkB,GAAA;AAAA,IAClB,cAAA,EAAgB,GAAA;AAAA;AAAA,IAEhB,EAAA,EAAI;AAAA,MACF,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,SAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAAA,IACA,EAAA,EAAI;AAAA,MACF,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,UAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAAA,IACA,EAAA,EAAI;AAAA,MACF,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAAA,IACA,EAAA,EAAI;AAAA,MACF,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,SAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAAA,IACA,EAAA,EAAI;AAAA,MACF,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,UAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAAA,IACA,EAAA,EAAI;AAAA,MACF,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAAA,IACA,KAAA,EAAO;AAAA,MACL,QAAA,EAAU,UAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAAA,IACA,KAAA,EAAO;AAAA,MACL,QAAA,EAAU,SAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,aAAA,EAAe,MAAA;AAAA;AAAA,MACf,UAAA,EAAY;AAAA;AACd,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,YAAA,EAAc;AAAA;AAAA,GAChB;AAAA,EACA,OAAA,EAAS,CAAA;AAAA;AAAA,EACT,UAAA,EAAY;AACd,CAAA;AAGA,IAAM,iBAAA,GAAkC;AAAA,EACtC,GAAG,gBAAA;AAAA,EACH,OAAA,EAAS;AAAA,IACP,GAAG,gBAAA,CAAiB,OAAA;AAAA,IACpB,IAAA,EAAM,OAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,SAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MAC3B,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,GAAG;AAAA;AAC/B;AAEJ,CAAA;AAGA,IAAM,gBAAA,GAAiC;AAAA,EACrC,GAAG,gBAAA;AAAA,EACH,OAAA,EAAS;AAAA,IACP,GAAG,gBAAA,CAAiB,OAAA;AAAA,IACpB,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MAC3B,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,GAAG;AAAA,KAC3B;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,MAC1B,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,GAAG;AAAA;AAC/B;AAEJ,CAAA;AAGO,IAAM,UAAA,GAAa,YAAY,iBAAiB,CAAA;AAChD,IAAM,SAAA,GAAY,YAAY,gBAAgB,CAAA;AAwCrD,SAAS,mBAAmB,UAAA,EAAkD;AAC5E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAW,GAAG,CAAA;AAAA,IACpB,KAAA,EAAO,WAAW,GAAG,CAAA;AAAA,IACrB,IAAA,EAAM,WAAW,GAAG,CAAA;AAAA,IACpB,YAAA,EAAc;AAAA,GAChB;AACF;AAGA,IAAM,sBAAA,GAAyB;AAAA,EAC7B,KAAA,EAAO,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA;AAAA,EACtC,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA;AAAA,IACzB,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,IACzB,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA;AAAA,IACzB,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,IAAA,EAAM,kBAAA,CAAmB,MAAA,CAAO,IAAI,CAAA;AAAA,EACpC,KAAA,EAAO,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA;AAAA,EACtC,KAAA,EAAO,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA;AAAA,EACtC,GAAA,EAAK,kBAAA,CAAmB,MAAA,CAAO,GAAG,CAAA;AAAA,EAClC,IAAA,EAAM,kBAAA,CAAmB,MAAA,CAAO,IAAI,CAAA;AAAA,EACpC,OAAA,EAAS,kBAAA,CAAmB,MAAA,CAAO,OAAO,CAAA;AAAA,EAC1C,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,IACxB,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA;AAAA,IACzB,IAAA,EAAM,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,IACxB,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,SAAS,cAAA,CAAe,OAAA;AAAA,EACxB,YAAY,cAAA,CAAe;AAC7B,CAAA;AAGA,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,sBAAsB,CAAA;AACxD,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,OAAA,EAAS,sBAAsB,CAAA;AC92BhD,IAAM,WAAW,CAAC;AAAA,EACvB,KAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAAqB;AACnB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAId,SAAS,KAAK,CAAA;AAGhD,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,YAAY,CAAA,CAAE,GAAG,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,YAAY,CAAA,CAAE,GAAG,CAAA;AAExC,EAAA,uBACEG,IAAAA;AAAA,IAACO,KAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,CAAA,EAAG,SAAA;AAAA,QACH,QAAA,EAAU,MAAA;AAAA,QACV,QAAA,EAAU,OAAA;AAAA,QACV,QAAA,EAAU,QAAA;AAAA,QACV,YAAA,EAAc,UAAA;AAAA,QACd,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS,OAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAK,KAAA;AAAA,QACL,YAAA,EAAc,KAAA;AAAA,QACd,QAAA;AAAA,QACA,UAAA,EAAY,SAAS,CAAA,GAAI;AAAA,OAC3B;AAAA,MACA,cAAc,MAAM;AAClB,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB,CAAA;AAAA,MACA,cAAc,MAAM;AAClB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,GAAAA;AAAA,UAACI,KAAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI;AAAA,cACF,QAAA,EAAU,QAAA;AAAA,cACV,YAAA,EAAc,UAAA;AAAA,cACd,KAAA,EAAO,UAAU,MAAA,GAAS;AAAA,aAC5B;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBAEAJ,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,MAAA;AAAA,YACA,OAAA;AAAA,YACA;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ,CAAA;AASA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM,CAAC,UAAA,EAAY,eAAe,CAAA,GAAI,kBAAA,EAAmB;AACzD,EAAA,MAAM,aAAA,GAAgB,QAAQ,UAAU,CAAA;AAExC,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,uBAAOA,GAAAA,CAAAO,QAAAA,EAAA,EAAE,CAAA;AAAA,EACX;AAEA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,uBAAOP,GAAAA,CAAAO,QAAAA,EAAA,EAAE,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,EACjB;AAEA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,uBAAOP,GAAAA,CAAAO,QAAAA,EAAA,EAAE,CAAA;AAAA,EACX;AAEA,EAAA,uBACEP,GAAAA;AAAA,IAACC,WAAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,MAAA;AAAA,MACX,IAAA,EAAK,OAAA;AAAA,MACL,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,MACpC,EAAA,EAAI;AAAA,QACF,QAAA,EAAU,MAAA;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,CAAA,EAAG;AAAA,OACL;AAAA,MAEA,QAAA,kBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,MAAA,EAAO;AAAA;AAAA,GACtB;AAEJ;ACpEO,IAAM,gBAAA,GAAmB,CAC9B,MAAA,KACG;AACH,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,EAAA,MAAM,aAAa,MAAA,EAAQ,UAAA;AAC3B,EAAA,MAAM,mBAAmB,MAAA,EAAQ,gBAAA;AACjC,EAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,IAAS,EAAA;AAEnC,EAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAM,MAAA,CAAO,IAAA;AACnB,EAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA,CAAG,WAAA,EAAY;AACjD,EAAA,MAAM,UAAA,GAAa,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,CAAG,WAAA,EAAY;AAGvD,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,OAAO,CAAA,IAAK,CAAC,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,UAAU,CAAA,EAAG;AACnE,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,OAAO,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,UAAU,CAAA;AAEhD,EAAA,MAAM,CAAC,SAAA,EAAW,WAAW,CAAA,GAAI,eAAA;AAAA,IAC/B,GAAA;AAAA,IACA,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA,CAAG,WAAA,EAAY;AAAA,IACjC,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,CAAC,YAAA,EAAc,cAAc,CAAA,GAAI,eAAA;AAAA,IACrC,GAAA;AAAA,IACA,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,CAAG,WAAA,EAAY;AAAA,IACpC,UAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,GAAA,CAAI,OAAO,CAAA,KAAM,GAAA,CAAI,UAAU,CAAA,EAAG;AACpC,IAAA,uBACEA,GAAAA;AAAA,MAACQ,WAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,MAAA;AAAA,QACV,KAAA,EAAO,EAAE,KAAA,EAAO,cAAA,GAAiB,SAAS,SAAA,EAAU;AAAA,QAEnD,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAGA,EAAA,MAAM,cAAc,gBAAA,KAAqB,OAAA;AAGzC,EAAA,IACE,gBACC,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,SAAA,CAAA,IAC3C,WACA,UAAA,EACA;AAEA,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,OAAO,CAAC,CAAA;AACrC,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,UAAU,CAAC,CAAA;AAG3C,IAAA,IAAI,OAAO,QAAA,CAAS,OAAO,KAAK,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,EAAG;AAC3D,MAAA,MAAM,YAAY,UAAA,GAAa,OAAA;AAC/B,MAAA,MAAM,aAAA,GAAgB,OAAA,KAAY,CAAA,GAAK,SAAA,GAAY,UAAW,GAAA,GAAM,CAAA;AAGpE,MAAA,MAAM,gBAAA,GAAmB,mBAAmB,UAAU,CAAA;AACtD,MAAA,MAAM,cAAA,GAAiB,mBAAmB,SAAS,CAAA;AACnD,MAAA,MAAM,YAAY,CAAA,CAAA,EAAI,SAAA,IAAa,IAAI,GAAA,GAAM,EAAE,GAAG,cAAc,CAAA,CAAA,CAAA;AAGhE,MAAA,MAAM,WAAA,GAAc,SAAS,OAAO;AAAA,SAAA,EAAc,UAAU;AAAA,QAAA,EAC1D,SAAA,IAAa,CAAA,GAAI,GAAA,GAAM,EACzB,CAAA,EAAG,SAAS,CAAA,EAAA,EAAK,aAAA,IAAiB,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,aAAA,CAAc,OAAA;AAAA,QAC7D;AAAA,OACD,CAAA,EAAA,CAAA;AAED,MAAA,uBACER,GAAAA;AAAA,QAAC4B,QAAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,WAAA;AAAA,UACP,SAAA,EAAW;AAAA,YACT,SAAS,EAAE,EAAA,EAAI,EAAE,UAAA,EAAY,YAAW;AAAE,WAC5C;AAAA,UACA,UAAA,EAAY,GAAA;AAAA,UACZ,SAAA,EAAU,KAAA;AAAA,UAEV,QAAA,kBAAA/B,IAAAA;AAAA,YAACO,KAAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAI,KAAA;AAAA,cACJ,OAAA,EAAQ,MAAA;AAAA,cACR,UAAA,EAAW,QAAA;AAAA,cACX,UAAA,EAAW,QAAA;AAAA,cACX,MAAA,EAAO,MAAA;AAAA,cAEP,QAAA,EAAA;AAAA,gCAAAJ,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO,gBAAA;AAAA,oBACP,YAAA,EAAa,OAAA;AAAA,oBACb,OAAA,EAAS;AAAA;AAAA,iBACX;AAAA,gCACAA,GAAAA;AAAA,kBAACQ,WAAAA;AAAA,kBAAA;AAAA,oBACC,QAAA,EAAS,SAAA;AAAA,oBACT,KAAA,EAAO,SAAA,IAAa,CAAA,GAAI,WAAA,GAAc,SAAA;AAAA,oBAErC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA;AACF;AAAA,OACF;AAAA,IAEJ;AAAA,EACF;AAGA,EAAA,uBACEX,IAAAA;AAAA,IAACO,KAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,GAAA,EAAK,KAAA;AAAA,QACL,UAAA,EAAY,QAAA;AAAA,QACZ,UAAA,EAAY,QAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACV;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,OAAA,oBACCJ,IAAC,QAAA,EAAA,EAAS,KAAA,EAAO,WAAW,YAAA,EAAa,KAAA,EAAM,SAAS,WAAA,EAAa,CAAA;AAAA,QAEtE,8BACCA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,YAAA;AAAA,YACP,YAAA,EAAa,OAAA;AAAA,YACb,OAAA,EAAS;AAAA;AAAA;AACX;AAAA;AAAA,GAEJ;AAEJ,CAAA;AAQO,SAAS,SAAS,IAAA,EAA4B;AACnD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAChC,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,CAAA;AACT;ACtIO,SAAS,mBAAA,CACd,YACA,YAAA,EACgE;AAChE,EAAA,OAAO,CAAC,MAAA,KAA2C;AACjD,IAAA,MAAM,MAAM,MAAA,CAAO,IAAA;AACnB,IAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AAEjB,IAAA,MAAM,YAAY,GAAA,CAAI,QAAA;AAEtB,IAAA,IAAI,SAAA,KAAc,WAAW,OAAO,mBAAA;AACpC,IAAA,IAAI,SAAA,KAAc,SAAS,OAAO,iBAAA;AAClC,IAAA,IAAI,YAAA,KAAiB,WAAW,YAAA,KAAiB,SAAA;AAC/C,MAAA,OAAO,MAAA;AAET,IAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,UAAU,CAAA,CAAA,CAAG,WAAA,EAAY;AAClD,IAAA,MAAM,UAAA,GAAa,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA,CAAG,WAAA,EAAY;AAExD,IAAA,IAAI,CAACkB,GAAE,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG,GAAA,CAAI,UAAU,CAAC,CAAA,EAAG;AAC7C,MAAA,OAAO,mBAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AASO,SAAS,sBAAA,CACd,YACA,YAAA,EACgE;AAChE,EAAA,OAAO,CAAC,MAAA,KAA2C;AACjD,IAAA,MAAM,MAAM,MAAA,CAAO,IAAA;AACnB,IAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AAEjB,IAAA,MAAM,YAAY,GAAA,CAAI,QAAA;AAEtB,IAAA,IAAI,SAAA,KAAc,WAAW,OAAO,mBAAA;AACpC,IAAA,IAAI,SAAA,KAAc,SAAS,OAAO,iBAAA;AAClC,IAAA,IAAI,YAAA,KAAiB,WAAW,YAAA,KAAiB,SAAA;AAC/C,MAAA,OAAO,MAAA;AAET,IAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,UAAU,CAAA,CAAA,CAAG,WAAA,EAAY;AAClD,IAAA,MAAM,UAAA,GAAa,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA,CAAG,WAAA,EAAY;AAExD,IAAA,IAAI,CAACA,GAAE,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG,GAAA,CAAI,UAAU,CAAC,CAAA,EAAG;AAC7C,MAAA,OAAO,iBAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AA4CO,SAAS,aAAa,MAAA,EAA4C;AACvE,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,GAAY,MAAA;AAAA,IACZ,YAAA,GAAe,SAAA;AAAA,IACf,cAAc;AAAC,GACjB,GAAI,MAAA;AAEJ,EAAA,MAAM,eAAA,GAAkB,mBAAmB,YAAY,CAAA;AAGvD,EAAA,MAAM,eAAA,GAAkB,sBACtBlB,GAAAA;AAAA,IAAC,0BAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAGF,EAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,eAAA;AAAA,MACb,eAAA;AAAA,MACA,YAAA,EAAc,gBAAA;AAAA,MACd,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,mBAAA,CAAoB,IAAA,EAAM,YAAY,CAAA;AAC5D,EAAA,MAAM,gBAAA,GAAmB,sBAAA,CAAuB,IAAA,EAAM,YAAY,CAAA;AAElE,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,IAAA;AAAA,IACZ,WAAA,EAAa,eAAA;AAAA,IACb,oBAAA,EAAsB,eAAA;AAAA,IACtB,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR;AAAA,QACE,KAAA,EAAO,SAAS,IAAI,CAAA,CAAA;AAAA,QACpB,UAAA,EAAY,SAAA;AAAA,QACZ,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,aAAA;AAAA,QACX,YAAA,EAAc,iBAAA;AAAA,QACd,UAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA;AAAA,QACE,KAAA,EAAO,YAAY,IAAI,CAAA,CAAA;AAAA,QACvB,UAAA,EAAY,YAAA;AAAA,QACZ,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,gBAAA;AAAA,QACX,YAAA,EAAc,iBAAA;AAAA,QACd,UAAA;AAAA,QACA;AAAA;AACF;AACF,GACF;AACF;AC7IA,SAAS,iBAAA,GAA0C;AACjD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,QAAA;AAAA,IACP,UAAA,EAAY,EAAA;AAAA,IACZ,KAAA,EAAO,EAAA;AAAA,IACP,QAAA,EAAU,GAAA;AAAA,IACV,SAAA,EAAW,cAAA;AAAA,IACX,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,GACV;AACF;AAUA,SAAS,sBAAA,CACP,QACA,WAAA,EACsB;AACtB,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,UAAA,EAAY,YAAA,EAAc,kBAAiB,GAAI,MAAA;AAElE,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,GAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,eAAA,EAAiB,sBACfA,GAAAA;AAAA,MAAC,0BAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,cAAc,YAAA,IAAgB,EAAA;AAAA,QAC9B,UAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,IAEF,MAAA,EAAQ,MAAA;AAAA,IACR,SAAA,EAAW,CAAC,MAAA,KAA2C;AACrD,MAAA,IAAI,MAAA,CAAO,MAAM,QAAA,EAAU;AACzB,QAAA,OAAO,CAAA,YAAA,EAAe,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAA;AAAA,MAC5C;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IACA,YAAA,EAAc,iBAAA;AAAA,IACd,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAOA,SAAS,gBAAA,CACP,MAAA,EACA,WAAA,EACA,WAAA,EACA,WACA,YAAA,EACsB;AACtB,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,YAAA,EAAc,kBAAiB,GAAI,MAAA;AAE7D,EAAA,OAAO,YAAA,CAAa;AAAA,IAClB,IAAA;AAAA,IACA,cAAc,YAAA,IAAgB,EAAA;AAAA,IAC9B,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AA6DO,SAAS,2BACd,MAAA,EACkC;AAClC,EAAA,MAAM;AAAA,IACJ,OAAA,EAAS,aAAA;AAAA,IACT,WAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAA,GAAqB;AAAA,GACvB,GAAI,MAAA;AAEJ,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,IAAI,iBAAA,GAAoB,KAAA;AAGxB,EAAA,MAAM,iBAAiB,aAAA,CAAc,IAAA,CAAK,CAAC,GAAA,KAAQ,IAAI,YAAY,CAAA;AAGnE,EAAA,IAAI,CAAC,kBAAkB,kBAAA,EAAoB;AACzC,IAAA,OAAA,CAAQ,IAAA,CAAK,mBAAmB,CAAA;AAChC,IAAA,iBAAA,GAAoB,IAAA;AAAA,EACtB;AAGA,EAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,IAAA,IAAI,UAAU,YAAA,EAAc;AAE1B,MAAA,OAAA,CAAQ,IAAA,CAAK,sBAAA,CAAuB,SAAA,EAAW,WAAW,CAAC,CAAA;AAAA,IAC7D,CAAA,MAAO;AAEL,MAAA,MAAM,UAAA,GAAa,gBAAA;AAAA,QACjB,SAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAIA,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,GAAG,UAAA;AAAA,QACH,MAAA,EAAQ,SAAA,CAAU,MAAA,GAAS,MAAA,GAAS;AAAA,OACrC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,SAAS,iBAAA,EAAkB;AACtC;AC5PA,SAAS,sBACP,KAAA,EAC8B;AAC9B,EAAA,OAAO,eAAA,IAAmB,SAAS,kBAAA,IAAsB,KAAA;AAC3D;AAoEA,SAAS,YAAA,CAAa,YAAoB,WAAA,EAAgC;AACxE,EAAA,OAAO,WAAA,CAAY,SAAS,UAAU,CAAA;AACxC;AAOA,SAAS,kBAAkB,KAAA,EAGzB;AACA,EAAA,IAAI,qBAAA,CAAsB,KAAK,CAAA,EAAG;AAChC,IAAA,OAAO;AAAA,MACL,SAAS,KAAA,CAAM,aAAA;AAAA,MACf,YAAY,KAAA,CAAM;AAAA,KACpB;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,SAAS,KAAA,CAAM,GAAA;AAAA,IACf,YAAY,KAAA,CAAM;AAAA,GACpB;AACF;AAWA,SAAS,iBAAA,CACP,SAAA,EACA,SAAA,EACA,OAAA,EACA,QACA,WAAA,EACM;AACN,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACvB,IAAA,MAAM,SAAS,GAAA,CAAI,GAAA;AACnB,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,EAAQ,WAAW,CAAA;AAE7C,IAAA,IAAI,IAAA,EAAM;AAER,MAAA,SAAA,CAAU,OAAO,MAAM,CAAA,CAAE,aAAa,CAAA,GAAI,UAAU,MAAM,CAAA;AAAA,IAC5D,CAAA,MAAO;AAEL,MAAA,SAAA,CAAU,CAAA,EAAG,MAAM,CAAA,EAAG,MAAM,GAAG,WAAA,EAAa,CAAA,GAAI,SAAA,CAAU,MAAM,CAAA;AAAA,IAClE;AAAA,EACF,CAAC,CAAA;AACH;AAQA,SAAS,mBAAA,CACP,OAAA,EACA,UAAA,EACA,SAAA,EACA,WAAA,EACS;AACT,EAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAEtD,IAAA,IAAI,SAAS,OAAA,EAAS;AAGtB,IAAA,IAAI,YAAA,CAAa,IAAA,EAAM,WAAW,CAAA,EAAG;AAErC,IAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAW,GAAI,kBAAkB,MAAM,CAAA;AAGxD,IAAA,IAAI,OAAA,KAAY,SAAA,IAAa,UAAA,KAAe,SAAA,EAAW;AAEvD,IAAA,MAAM,SAAA,GAAY,QAAQ,OAAO,CAAA;AACjC,IAAA,MAAM,YAAA,GAAe,WAAW,UAAU,CAAA;AAE1C,IAAA,IAAI,CAACkB,EAAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,YAAY,CAAA,EAAG;AACvC,MAAA,UAAA,GAAa,IAAA;AAEb,MAAA,MAAA,CAAO,MAAA,GAAS,UAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AA8CO,SAAS,cACd,MAAA,EACqB;AACrB,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA,GAAc;AAAA,GAChB,GAAI,MAAA;AAGJ,EAAA,MAAM,SAAA,GAAY,mBAAA;AAAA,IAChB,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IACnB,MAAA,CAAO,KAAK,UAAU;AAAA,GACxB;AAEA,EAAA,MAAM,QAAA,GAAqB;AAAA,IACzB,KAAA,EAAO,CAAA;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAGA,EAAA,IAAI,IAAA,GAAO,OAAO,OAAA,CAAQ,SAAS,EAAE,GAAA,CAAI,CAAC,CAAC,GAAG,CAAA,KAAM;AAClD,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAG,CAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,WAAW,GAAG,CAAA;AAGjC,IAAA,MAAM,GAAA,GAAqB;AAAA,MACzB,MAAA,EAAQ,YAAY,GAAG,CAAA;AAAA,MACvB,QAAA,EAAU;AAAA,KACZ;AAGA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,iBAAA,CAAkB,GAAA,EAAK,OAAA,EAAS,WAAA,EAAa,QAAA,EAAU,WAAW,CAAA;AAAA,IACpE;AAGA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,iBAAA;AAAA,QACE,GAAA;AAAA,QACA,UAAA;AAAA,QACA,cAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,MAAA,QAAA,CAAS,KAAA,EAAA;AAAA,IACX,CAAA,MAAA,IAAW,CAAC,UAAA,EAAY;AACtB,MAAA,GAAA,CAAI,QAAA,GAAW,SAAA;AACf,MAAA,QAAA,CAAS,OAAA,EAAA;AAAA,IACX,CAAA,MAAO;AAEL,MAAA,MAAM,UAAA,GAAa,mBAAA;AAAA,QACjB,OAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,GAAA,CAAI,QAAA,GAAW,UAAA;AACf,QAAA,QAAA,CAAS,QAAA,EAAA;AAAA,MACX;AAAA,IACF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,IAAA,GAAO,IAAA,CAAK,MAAA;AAAA,MACV,CAAC,QACC,GAAA,CAAI,QAAA,KAAa,WACjB,GAAA,CAAI,QAAA,KAAa,SAAA,IACjB,GAAA,CAAI,QAAA,KAAa;AAAA,KACrB;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAC1B;AC7OA,SAASW,kBAAAA,GAA4C;AACnD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,QAAA;AAAA,IACP,UAAA,EAAY,EAAA;AAAA,IACZ,KAAA,EAAO,EAAA;AAAA,IACP,SAAA,EAAW,cAAA;AAAA,IACX,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,GACV;AACF;AAUA,SAASC,uBAAAA,CACP,QACA,WAAA,EACwB;AACxB,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,UAAA,EAAY,kBAAiB,GAAI,MAAA;AAEpD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,GAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,eAAA,EAAiB,sBACf9B,GAAAA;AAAA,MAAC,0BAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,YAAA,EAAa,EAAA;AAAA,QACb,UAAA;AAAA,QACA,eAAe,WAAA,CAAY,aAAA;AAAA,QAC3B,uBAAuB,WAAA,CAAY,qBAAA;AAAA,QACnC,4BAA4B,WAAA,CAAY;AAAA;AAAA,KAC1C;AAAA,IAEF,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,iBAAA;AAAA,IACd,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAOA,SAAS,mBAAA,CACP,QACA,WAAA,EACwB;AACxB,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,UAAA,EAAY,kBAAiB,GAAI,MAAA;AAEpD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,GAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,eAAA,EAAiB,sBACfA,GAAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,UAAA;AAAA,QACA,eAAe,WAAA,CAAY,aAAA;AAAA,QAC3B,uBAAuB,WAAA,CAAY,qBAAA;AAAA,QACnC,4BAA4B,WAAA,CAAY;AAAA;AAAA,KAC1C;AAAA,IAEF,YAAA,EAAc,iBAAA;AAAA,IACd,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAqCO,SAAS,6BACd,MAAA,EACoC;AACpC,EAAA,MAAM;AAAA,IACJ,OAAA,EAAS,aAAA;AAAA,IACT,WAAA;AAAA,IACA,kBAAA,GAAqB;AAAA,GACvB,GAAI,MAAA;AAEJ,EAAA,MAAM,UAAoC,EAAC;AAC3C,EAAA,IAAI,iBAAA,GAAoB,KAAA;AAGxB,EAAA,MAAM,iBAAiB,aAAA,CAAc,IAAA,CAAK,CAAC,GAAA,KAAQ,IAAI,YAAY,CAAA;AAGnE,EAAA,IAAI,CAAC,kBAAkB,kBAAA,EAAoB;AACzC,IAAA,OAAA,CAAQ,IAAA,CAAK6B,oBAAmB,CAAA;AAChC,IAAA,iBAAA,GAAoB,IAAA;AAAA,EACtB;AAGA,EAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,IAAA,IAAI,UAAU,YAAA,EAAc;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAKC,uBAAAA,CAAuB,SAAA,EAAW,WAAW,CAAC,CAAA;AAAA,IAC7D,CAAA,MAAO;AACL,MAAA,MAAM,aAAA,GAAgB,mBAAA,CAAoB,SAAA,EAAW,WAAW,CAAA;AAIhE,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,GAAG,aAAA;AAAA,QACH,MAAA,EAAQ,SAAA,CAAU,MAAA,GAAS,MAAA,GAAS;AAAA,OACrC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,SAAS,iBAAA,EAAkB;AACtC;;;ACnNO,IAAM,uBAAA,GAAN,cAAsC,KAAA,CAAM;AAAA,EACjD,WAAA,CACE,OAAA,EACgB,OAAA,EACA,OAAA,EAChB;AACA,IAAA,KAAA,CAAM,UAAU,CAAA,CAAA,EAAI,OAAO,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA;AAHnC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AAAA,EACd;AACF,CAAA;AAcO,SAAS,iBAAA,CACd,EAAA,EACA,IAAA,GAAO,WAAA,EACD;AAEN,EAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,IAAA,EAAM;AACnC,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAI,uBAAA;AAAA,MACR,CAAA,wBAAA,EAA2B,OAAO,EAAE,CAAA,CAAA;AAAA,MACpC;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,EAAE,aAAa,EAAA,CAAA,EAAK;AACtB,IAAA,MAAM,IAAI,uBAAA,CAAwB,4BAAA,EAA8B,IAAA,EAAM;AAAA,MACpE,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,EAAE;AAAA,KAC7B,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,OAAO,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,uBAAA;AAAA,MACR,CAAA,gCAAA,EAAmC,OAAO,EAAA,CAAG,OAAO,CAAA,CAAA;AAAA,MACpD;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,EAAE,UAAU,EAAA,CAAA,EAAK;AACnB,IAAA,MAAM,IAAI,uBAAA,CAAwB,yBAAA,EAA2B,IAAA,EAAM;AAAA,MACjE,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,EAAE;AAAA,KAC7B,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,IAAI,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,uBAAA;AAAA,MACR,CAAA,6BAAA,EAAgC,OAAO,EAAA,CAAG,IAAI,CAAA,CAAA;AAAA,MAC9C;AAAA,KACF;AAAA,EACF;AAGA,EAAA,eAAA,CAAgB,EAAA,CAAG,SAAS,IAAI,CAAA;AAGhC,EAAA,IAAI,EAAA,CAAG,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACtB,IAAA,2BAAA,CAA4B,IAAI,IAAI,CAAA;AAAA,EACtC;AACF;AASO,SAAS,eAAA,CACd,OAAA,EACA,OAAA,GAAU,WAAA,EACJ;AACN,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AAC9B,IAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,MAAA,MAAM,IAAI,uBAAA;AAAA,QACR,mBAAmB,KAAK,CAAA,iBAAA,CAAA;AAAA,QACxB,OAAA;AAAA,QACA,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,GAAA,CAAI,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,QAAQ,EAAA,EAAI;AACjD,MAAA,MAAM,IAAI,uBAAA;AAAA,QACR,mBAAmB,KAAK,CAAA,mDAAA,EAAsD,KAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAC,CAAA,CAAA;AAAA,QACrG,OAAA;AAAA,QACA,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU;AAChC,MAAA,MAAM,IAAI,uBAAA;AAAA,QACR,WAAW,GAAA,CAAI,GAAG,CAAA,2CAAA,EAA8C,OAAO,IAAI,IAAI,CAAA,CAAA;AAAA,QAC/E,OAAA;AAAA,QACA,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU;AAChC,MAAA,MAAM,IAAI,uBAAA;AAAA,QACR,WAAW,GAAA,CAAI,GAAG,CAAA,2CAAA,EAA8C,OAAO,IAAI,IAAI,CAAA,CAAA;AAAA,QAC/E,OAAA;AAAA,QACA,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;AASO,SAAS,2BAAA,CACd,EAAA,EACA,OAAA,GAAU,WAAA,EACJ;AACN,EAAA,MAAM,WAAA,GAAc,GAAG,OAAA,CAAQ,MAAA;AAE/B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAErB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,uBAAA;AAAA,QACR,gBAAgB,CAAC,CAAA,gBAAA,CAAA;AAAA,QACjB,OAAA;AAAA,QACA,EAAE,GAAA,EAAK,OAAA,EAAS,OAAO,GAAA;AAAI,OAC7B;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,WAAW,WAAA,EAAa;AAC9B,MAAA,MAAM,IAAI,uBAAA;AAAA,QACR,OAAO,CAAC,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,wBAAwB,WAAW,CAAA,eAAA,CAAA;AAAA,QAC7D,OAAA;AAAA,QACA;AAAA,UACE,QAAA,EAAU,CAAA;AAAA,UACV,WAAW,GAAA,CAAI,MAAA;AAAA,UACf,WAAA;AAAA,UACA,SAAS,EAAA,CAAG,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,EAAE,GAAG;AAAA;AACtC,OACF;AAAA,IACF;AAAA,EACF;AACF;AAcO,SAAS,wBAAA,CACd,WAAA,EACA,OAAA,EACA,OAAA,GAII,EAAC,EACC;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAW,KAAA;AAAA,IACX,eAAA,GAAkB,KAAA;AAAA,IAClB,OAAA,GAAU;AAAA,GACZ,GAAI,OAAA;AAGJ,EAAA,IAAI,QAAA,KAAa,CAAC,WAAA,IAAe,WAAA,CAAY,WAAW,CAAA,CAAA,EAAI;AAC1D,IAAA,MAAM,IAAI,uBAAA;AAAA,MACR,kDAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAC5C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AAC3C,EAAA,MAAM,eAAA,GAAkB,kBACpB,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA,GACrC,UAAA;AAEJ,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,MAAM,QAAA,GAAW,eAAA,GAAkB,EAAA,CAAG,WAAA,EAAY,GAAI,EAAA;AACtD,IAAA,MAAM,KAAA,GAAQ,kBACV,eAAA,CAAgB,QAAA,CAAS,QAAQ,CAAA,GACjC,UAAA,CAAW,SAAS,EAAE,CAAA;AAE1B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,uBAAA;AAAA,QACR,uBAAuB,EAAE,CAAA,sBAAA,CAAA;AAAA,QACzB,OAAA;AAAA,QACA;AAAA,UACE,YAAA,EAAc,EAAA;AAAA,UACd,gBAAA,EAAkB,UAAA;AAAA,UAClB;AAAA;AACF,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,MAAM,UAAA,GAAa,eAAA,GAAkB,EAAA,CAAG,WAAA,EAAY,GAAI,EAAA;AACxD,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,uBAAA;AAAA,QACR,2BAA2B,EAAE,CAAA,CAAA,CAAA;AAAA,QAC7B,OAAA;AAAA,QACA,EAAE,WAAA;AAAY,OAChB;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAI,UAAU,CAAA;AAAA,EACrB;AACF;AASO,SAAS,wBAAA,CACd,IACA,OAAA,EACM;AACN,EAAA,iBAAA,CAAkB,IAAI,WAAW,CAAA;AAEjC,EAAA,IAAI,EAAA,IAAM,SAAS,WAAA,EAAa;AAC9B,IAAA,wBAAA,CAAyB,OAAA,CAAQ,WAAA,EAAa,EAAA,CAAG,OAAA,EAAS;AAAA,MACxD,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AACF;AAKO,SAAS,4BAAA,CACd,IAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,iBAAA,CAAkB,MAAM,MAAM,CAAA;AAC9B,EAAA,iBAAA,CAAkB,SAAS,SAAS,CAAA;AAGpC,EAAA,IAAI,OAAA,EAAS,WAAA,IAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1D,IAAA,MAAM,WAAA,GAAc,IAAA,EAAM,OAAA,IAAW,EAAC;AACtC,IAAA,MAAM,cAAA,GAAiB,OAAA,EAAS,OAAA,IAAW,EAAC;AAC5C,IAAA,MAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,MAC5B,GAAG,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AAAA,MAC/B,GAAG,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,GAAG;AAAA,KACnC,CAAA;AAED,IAAA,KAAA,MAAW,EAAA,IAAM,QAAQ,WAAA,EAAa;AACpC,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAI,uBAAA;AAAA,UACR,uBAAuB,EAAE,CAAA,+CAAA,CAAA;AAAA,UACzB,gBAAA;AAAA,UACA;AAAA,YACE,YAAA,EAAc,EAAA;AAAA,YACd,aAAa,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AAAA,YACzC,gBAAgB,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,GAAG;AAAA;AACjD,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAOO,SAAS,6BAAA,CACd,IACA,WAAA,EACM;AAEN,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,MAAM,IAAI,wBAAwB,sCAAsC,CAAA;AAAA,EAC1E;AAGA,EAAA,iBAAA,CAAkB,EAAE,CAAA;AAGpB,EAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAI,uBAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAGA,EAAA,wBAAA,CAAyB,WAAA,EAAa,GAAG,OAAA,EAAS;AAAA,IAChD,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,MAAM,aAAa,EAAA,CAAG,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AAC9C,EAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG;AAChC,IAAA,MAAM,IAAI,uBAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG;AAChC,IAAA,MAAM,IAAI,uBAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;;;ACrUO,SAAS,cAAA,CACd,KAAA,EACA,QAAA,EACA,OAAA,EACA;AACA,EAAA,4BAAA,CAA6B,KAAA,EAAO,UAAU,OAAO,CAAA;AACrD,EAAA,MAAM,IAAA,GAAO,SAAS,EAAE,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AAC9C,EAAA,MAAM,OAAA,GAAU,YAAY,EAAE,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AACpD,EAAA,MAAM,WAAA,GAAc,OAAA,EAAS,WAAA,IAAe,EAAC;AAC7C,EAAA,MAAM,aAAA,GAAgB,OAAA,EAAS,aAAA,IAAiB,EAAC;AACjD,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,KAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,cAAA;AAC5C,EAAA,MAAM,iBAAA,GAAoB,OAAA,EAAS,iBAAA,IAAqB,EAAC;AAEzD,EAAA,MAAM,QAAA,GAAW,sBAAsB,IAAI,CAAA;AAC3C,EAAA,MAAM,WAAA,GAAc,sBAAsB,OAAO,CAAA;AAGjD,EAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,IAAA,EAAM,OAAO,CAAA;AAGpD,EAAA,MAAM,UAAyC,EAAC;AAChD,EAAA,MAAM,aAA4C,EAAC;AACnD,EAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,EAAA,IAAI,kBAAA,GAAqB,KAAA;AAEzB,EAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA,GAAI,GAAA;AAAA,IAChC,CAAC,CAAA;AACD,IAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC3B,MAAA,UAAA,CAAW,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA,GAAI,GAAA;AAAA,IACnC,CAAC,CAAA;AAAA,EACH,CAAA,MAAO;AAEL,IAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,IAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAChE,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACxB,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,YAAY,GAAG,CAAA;AAC5D,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,eAAA,GAAkB,IAAA;AAAA,MACpB;AACA,MAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,MAAM,aAAA,GAAgB,mBAAA,CAAoB,OAAA,CAAQ,OAAA,EAAS,WAAW,CAAA;AACtE,IAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC3B,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,OAAA,CAAQ,OAAA,EAAS,eAAe,GAAG,CAAA;AAClE,MAAA,IAAI,OAAO,UAAA,EAAY;AACrB,QAAA,kBAAA,GAAqB,IAAA;AAAA,MACvB;AACA,MAAA,UAAA,CAAW,GAAG,CAAA,GAAI,GAAA;AAAA,IACpB,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,aAAA,CAAc;AAAA,IACvC,OAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAa,IAAA,CAAK,OAAA;AAAA,IAClB,gBAAgB,OAAA,CAAQ,OAAA;AAAA,IACxB,SAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,gBAAgB,iBAAA,CAAkB;AAAA,IACtC,SAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA,EAAgB,CAAC,OAAO,CAAA;AAAA,IACxB,UAAA,EAAY;AAAA;AAAA,GACb,CAAA;AAGD,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,0BAAA,CAA2B;AAAA,IAC7C,OAAA,EAAS,aAAA;AAAA,IACT,WAAA;AAAA,IACA,kBAAA,EAAoB,IAAA;AAAA;AAAA,IACpB,WAAW,OAAA,EAAS,SAAA;AAAA,IACpB,cAAc,OAAA,EAAS,YAAA;AAAA,IACvB,WAAA,EAAa;AAAA,MACX,WAAA;AAAA,MACA,aAAA;AAAA,MACA,oBAAoB,OAAA,EAAS,kBAAA;AAAA,MAC7B,uBAAuB,OAAA,EAAS,qBAAA;AAAA,MAChC,4BAA4B,OAAA,EAAS;AAAA;AACvC,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,IAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACvGO,SAAS,UAAA,CAAW,QAAmB,OAAA,EAA+B;AAC3E,EAAA,wBAAA,CAAyB,QAAQ,OAAO,CAAA;AAExC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,EAAC;AAC5C,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,aAAA,IAAiB,EAAC;AAChD,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,iBAAA,IAAqB,EAAC;AAGxD,EAAA,MAAM,SAAA,GAAY,eAAe,MAAM,CAAA;AAGvC,EAAA,MAAM,gBAAgB,uBAAA,CAAwB;AAAA,IAC5C,SAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,4BAAA,CAA6B;AAAA,IAC/C,OAAA,EAAS,aAAA;AAAA,IACT,WAAA,EAAa;AAAA,MACX,aAAA;AAAA,MACA,uBAAuB,OAAA,CAAQ,qBAAA;AAAA,MAC/B,4BAA4B,OAAA,CAAQ;AAAA,KACtC;AAAA,IACA,kBAAA,EAAoB;AAAA,GACrB,CAAA;AAED,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,qBAAA,CAAsB,MAAM,CAAA,EAAE;AACxD;;;AClEO,SAAS,qBAAA,CAAsB,MAAc,OAAA,EAAiB;AACnE,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,MAAM,CAAA,GAAA,CAAM,OAAA,GAAU,IAAA,IAAQ,IAAA,GAAQ,GAAA;AACtC,IAAA,OAAO,IAAI,CAAA,IAAK,GAAA,GAAM,EAAE,OAAA,CAAQ,CAAC,IAAI,QAAQ,CAAA,CAAA,CAAA;AAAA,EAC/C,CAAA,MAAA,IAAW,OAAO,OAAA,EAAS;AACzB,IAAA,MAAM,CAAA,GAAA,CAAM,IAAA,GAAO,OAAA,IAAW,IAAA,GAAQ,GAAA;AACtC,IAAA,OAAO,IAAI,CAAA,IAAK,GAAA,GAAM,EAAE,OAAA,CAAQ,CAAC,IAAI,QAAQ,CAAA,CAAA,CAAA;AAAA,EAC/C,CAAA,MAAO;AACL,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AC4BO,SAAS,cAAA,CACd,MACA,OAAA,EACQ;AACR,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,OAAA,KAAY,IAAA,EAAM;AACrC,IAAA,OAAO,IAAA,KAAS,OAAA,GAAU,qBAAA,CAAsB,IAAA,EAAM,OAAO,CAAA,GAAI,GAAA;AAAA,EACnE;AAEA,EAAA,IAAI,IAAA,KAAS,SAAS,OAAO,KAAA;AAC7B,EAAA,IAAI,IAAA,KAAS,MAAM,OAAO,OAAA;AAC1B,EAAA,IAAI,OAAA,KAAY,MAAM,OAAO,SAAA;AAE7B,EAAA,OAAO,KAAA;AACT;AAYO,SAAS,8BACd,MAAA,EACW;AACX,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AAErC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,MAC1C,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAa,MAAM,QAAA,EAAS;AAAA,MACjD,EAAE,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,cAAA,EAAgB,MAAM,QAAA,EAAS;AAAA,MACvD,EAAE,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,MAAM,MAAA;AAAO,KAC9C;AAAA,IACA,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,KAAM;AACpC,MAAA,MAAM,OAAO,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,IAAA;AAC7D,MAAA,MAAM,UAAU,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,IAAA;AAChE,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,EAAM,OAAO,CAAA;AAE1C,MAAA,OAAO,CAAC,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA;AAAA,IACpC,CAAC;AAAA,GACH;AACF;AAQO,SAAS,0BAA0B,MAAA,EAAmC;AAC3E,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AAErC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,MAC1C,EAAE,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,MAAM,QAAA;AAAS,KACtD;AAAA,IACA,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,KAAM;AACpC,MAAA,MAAM,UAAU,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,IAAA;AAChE,MAAA,OAAO,CAAC,MAAM,OAAO,CAAA;AAAA,IACvB,CAAC;AAAA,GACH;AACF;AAaO,SAAS,qBAAA,CACd,MACA,OAAA,EAC8C;AAC9C,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,OAAA,KAAY,IAAA,EAAM,OAAO,OAAA;AAC9C,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,OAAA,KAAY,IAAA,EAAM,OAAO,SAAA;AAC9C,EAAA,IAAI,SAAS,IAAA,IAAQ,OAAA,KAAY,IAAA,IAAQ,IAAA,KAAS,SAAS,OAAO,UAAA;AAClE,EAAA,OAAO,MAAA;AACT;;;ACtFO,SAAS,mBACd,MAAA,EACwB;AAExB,EAAA,MAAM,SAAA,GAAY,0BAA0B,MAAM,CAAA;AAGlD,EAAA,MAAM,OAAA,GAAU,sBAAsB,SAAS,CAAA;AAG/C,EAAA,MAAM,IAAA,GAAwB,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IAClD,GAAG,GAAA;AAAA,IACH,OAAA,EAAS,IAAI,OAAA,IAAW,KAAA;AAAA,IACxB,QAAA,EAAU;AAAA,GACZ,CAAE,CAAA;AAGF,EAAA,MAAM,OAAA,GAAmC;AAAA,IACvC;AAAA,MACE,KAAA,EAAO,MAAA;AAAA,MACP,UAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,KAAA,EAAO,SAAA;AAAA,MACP,UAAA,EAAY,WAAA;AAAA,MACZ,SAAA,EAAW;AAAA;AACb,GACF;AAEA,EAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AACzB;;;ACnCA,SAAS,2BAAA,GAEe;AACtB,EAAA,OAAO,CAAC,MAAA,KAA2C;AACjD,IAAA,MAAM,MAAM,MAAA,CAAO,IAAA;AACnB,IAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AAEjB,IAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AAGpB,IAAA,MAAM,SAAA,GAAY,IAAA,KAAS,KAAA,GAAQ,IAAA,GAAO,IAAA;AAC1C,IAAA,MAAM,YAAA,GAAe,OAAA,KAAY,KAAA,GAAQ,IAAA,GAAO,OAAA;AAGhD,IAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IACE,SAAA,KAAc,QACb,OAAO,SAAA,KAAc,YACpB,OAAO,YAAA,KAAiB,QAAA,IACxB,SAAA,GAAY,YAAA,EACd;AACA,MAAA,OAAO,iBAAA;AAAA,IACT;AAGA,IAAA,IACE,YAAA,KAAiB,QAChB,OAAO,SAAA,KAAc,YACpB,OAAO,YAAA,KAAiB,QAAA,IACxB,SAAA,GAAY,YAAA,EACd;AACA,MAAA,OAAO,mBAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AAkBO,SAAS,uBACd,MAAA,EAC4B;AAE5B,EAAA,MAAM,SAAA,GAAY,8BAA8B,MAAM,CAAA;AAGtD,EAAA,MAAM,OAAA,GAAU,sBAAsB,SAAS,CAAA;AAG/C,EAAA,MAAM,IAAA,GAAwB,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjD,IAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AAEpB,IAAA,OAAO;AAAA,MACL,GAAG,GAAA;AAAA;AAAA,MAEH,MAAM,IAAA,IAAQ,KAAA;AAAA,MACd,SAAS,OAAA,IAAW,KAAA;AAAA,MACpB,QAAA,EAAU,qBAAA;AAAA,QACR,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,IAAA;AAAA,QAClC,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU;AAAA;AAC1C,KACF;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAM,YAAY,2BAAA,EAA4B;AAG9C,EAAA,MAAM,OAAA,GAAmC;AAAA,IACvC;AAAA,MACE,KAAA,EAAO,MAAA;AAAA,MACP,UAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,MAAA;AAAA,MACP,UAAA,EAAY,WAAA;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,SAAA;AAAA,MACP,UAAA,EAAY,cAAA;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX;AAAA,KACF;AAAA,IACA;AAAA,MACE,KAAA,EAAO,OAAA;AAAA,MACP,UAAA,EAAY,OAAA;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX;AAAA;AACF,GACF;AAEA,EAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AACzB;AChFO,SAAS,gBACd,MAAA,EACiB;AACjB,EAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAM,MAAA,CAAO,IAAA;AAEnB,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,GAAA;AACpC,EAAA,MAAM,YAAY,YAAA,KAAiB,MAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,YACV,SAAA,KAAc,MAAA,GACZ,YACA,GAAA,GACF,YAAA,KAAiB,SACf,YAAA,GACA,GAAA;AACN,EAAA,uBAAO9B,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AACtB;AAGO,IAAM,uBAAA,GAA0B+B,OAAAA,CAAM,IAAA,CAAK,eAAe,CAAA;AACjE,uBAAA,CAAwB,WAAA,GAAc,yBAAA;AAS/B,SAAS,eACd,MAAA,EACiB;AACjB,EAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAM,MAAA,CAAO,IAAA;AAEnB,EAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,SAAA,EAAW,cAAa,GAAI,GAAA;AAC3D,EAAA,MAAM,UAAU,SAAA,KAAc,MAAA;AAC9B,EAAA,MAAM,YAAY,YAAA,KAAiB,MAAA;AACnC,EAAA,MAAM,aAAA,GAAgB,CAAC,OAAA,IAAW,CAAC,aAAa,QAAA,KAAa,WAAA;AAE7D,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,uBACElC,KAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAG,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,+BAAA;AAAA,UACV,KAAA,EAAO,cAAc,QAAQ,CAAA,CAAA;AAAA,UAE5B,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,sBACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,6BAAA;AAAA,UACV,KAAA,EAAO,iBAAiB,WAAW,CAAA,CAAA;AAAA,UAElC,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,SAAA,GAAY,WAAW,WAAA,EAAY,CAAA;AACnD;AAGO,IAAM,sBAAA,GAAyB+B,OAAAA,CAAM,IAAA,CAAK,cAAc,CAAA;AAC/D,sBAAA,CAAuB,WAAA,GAAc,wBAAA;AC5F9B,SAAS,uBAAA,CAAwB;AAAA,EACtC,UAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAC/B,EAAA,MAAMC,aAAAA,GAAe,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA;AAEpD,EAAA,uBACEhC,GAAAA;AAAA,IAACI,KAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,cAAA,EAAgB,QAAA;AAAA,QAChB,UAAA,EAAY,QAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACV;AAAA,MAEC,QAAA,EAAA4B,aAAAA,oBAAgBhC,GAAAA,CAACiC,QAAA,EAAO;AAAA;AAAA,GAC3B;AAEJ;AA0BO,SAAS,uBAAA,CAAwB;AAAA,EACtC,MAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAC/B,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,qBAAA,EAAsB;AAC5C,EAAA,MAAM,EAAE,cAAA,EAAe,GAAI,uBAAA,EAAwB;AACnD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIvC,SAA6B,IAAI,CAAA;AACjE,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAQ,CAAA;AAEjC,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAmC;AAC1D,IAAA,WAAA,CAAY,MAAM,aAAa,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,CAC5B,cAAA,EACA,OAAA,KACG;AACH,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,GAAG,MAAA;AAAA,MACH,GAAG;AAAA,KACL;AAEA,IAAA,SAAA,CAAU,mBAAA,EAAqB,WAAW,OAAO,CAAA;AAAA,EACnD,CAAA;AAEA,EAAA,uBACEG,KAACO,KAAAA,EAAA,EAAI,IAAI,EAAE,OAAA,EAAS,QAAO,EACzB,QAAA,EAAA;AAAA,oBAAAJ,GAAAA;AAAA,MAACI,KAAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,QAAA,EAAU,QAAA;AAAA,UACV,YAAA,EAAc,UAAA;AAAA,UACd,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBACAJ,IAACI,KAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EAAG,CAAA;AAAA,oBAEtBJ,GAAAA;AAAA,MAACC,WAAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,gBAAA;AAAA,QACX,SAAA,EAAU,kBAAA;AAAA,QACV,IAAA,EAAK,OAAA;AAAA,QACL,UAAU,cAAA,CAAe,oBAAA;AAAA,QACzB,OAAA,EAAS,eAAA;AAAA,QAET,QAAA,kBAAAD,GAAAA,CAACkC,mBAAAA,EAAA,EAAoB;AAAA;AAAA,KACvB;AAAA,oBACArC,IAAAA;AAAA,MAAC8B,IAAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,eAAA;AAAA,QACT,SAAA,EAAW;AAAA,UACT,MAAM,EAAE,EAAA,EAAI,EAAE,UAAA,EAAY,QAAO;AAAE,SACrC;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA3B,GAAAA,CAACmC,cAAAA,EAAA,EAAc,EAAA,EAAI,EAAE,UAAU,KAAA,EAAO,UAAA,EAAY,MAAA,EAAO,EAAG,QAAA,EAAA,QAAA,EAE5D,CAAA;AAAA,0BACAnC,GAAAA;AAAA,YAACwB,SAAAA;AAAA,YAAA;AAAA,cACC,SAAS,MAAM;AACb,gBAAA,qBAAA,CAAsB,EAAC,EAAG,EAAE,QAAA,EAAU,MAAM,CAAA;AAC5C,gBAAA,eAAA,EAAgB;AAAA,cAClB,CAAA;AAAA,cACA,EAAA,EAAI,EAAE,QAAA,EAAU,MAAA,EAAO;AAAA,cACxB,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACA3B,IAAAA;AAAA,YAAC2B,SAAAA;AAAA,YAAA;AAAA,cACC,SAAS,MAAM;AACb,gBAAA,qBAAA,CAAsB,EAAE,SAAS,CAAC,MAAM,GAAE,EAAG,EAAE,QAAA,EAAU,KAAA,EAAO,CAAA;AAChE,gBAAA,eAAA,EAAgB;AAAA,cAClB,CAAA;AAAA,cACA,EAAA,EAAI,EAAE,QAAA,EAAU,MAAA,EAAO;AAAA,cACxB,QAAA,EAAA;AAAA,gBAAA,8BAAA;AAAA,gBACmC,MAAA;AAAA,gBAAO;AAAA;AAAA;AAAA;AAC3C;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAyBO,SAAS,kBAAA,CAAmB,EAAE,KAAA,EAAM,EAA4B;AACrE,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,IAAI,KAAA,GAAQ,MAAA,IAAU,KAAA,GAAQ,CAAA,EAAG;AAC/B,MAAA,YAAA,GAAe,UAAA;AAAA,IACjB,CAAA,MAAA,IAAW,KAAA,GAAQ,IAAA,IAAU,KAAA,GAAQ,CAAA,EAAG;AACtC,MAAA,YAAA,GAAe,SAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,YAAA,GAAe,CAAA,EAAA,CAAI,KAAA,GAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,IAC5C;AAAA,EACF;AAEA,EAAA,uBAAOxB,IAACI,KAAAA,EAAA,EAAI,IAAI,EAAE,SAAA,EAAW,OAAA,EAAQ,EAAI,QAAA,EAAA,YAAA,EAAa,CAAA;AACxD;AAYO,SAAS,kCACd,WAAA,EACiE;AACjE,EAAA,OAAO,CAAC,MAAA,KAAW;AACjB,IAAA,MAAM,MAAM,MAAA,CAAO,IAAA;AACnB,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,uBACEJ,GAAAA;AAAA,MAAC,uBAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,QAC3B;AAAA;AAAA,KACF;AAAA,EAEJ,CAAA;AACF;AAQO,SAASoC,0BACd,MAAA,EACqE;AACrE,EAAA,OAAO,CAAC,UAAA,KAAe;AACrB,IAAA,MAAM,MAAM,UAAA,CAAW,IAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAA,EAAQ,KAAA,IAAS,EAAA;AAC1C,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,uBACEpC,IAAC,uBAAA,EAAA,EAAwB,MAAA,EAAQ,OAAO,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG,MAAA,EAAgB,CAAA;AAAA,EAEzE,CAAA;AACF;AAQO,SAAS,yBACd,MAAA,EACiB;AACjB,EAAA,MAAM,MAAM,MAAA,CAAO,IAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,EAAQ,KAAA,IAAS,EAAA;AACtC,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,uBAAOA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,KAAA,EAAO,GAAA,CAAI,KAAK,CAAA,EAAa,CAAA;AAC1D;;;AC3NA,IAAM,yBAAA,GAAkD;AAAA,EACtD,EAAE,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,QAAA,EAAU,MAAM,MAAA,EAAO;AAAA,EACzC,EAAE,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,SAAA,EAAW,MAAM,QAAA,EAAS;AAAA,EAC5C,EAAE,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,WAAA,EAAa,MAAM,QAAA;AACvC,CAAA;AAUA,SAAS,oBACP,MAAA,EACoB;AACpB,EAAA,MAAM,MAAM,MAAA,CAAO,IAAA;AACnB,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,EAAA,OAAO,KAAA,IAAS,IAAA,IAAQ,KAAA,GAAQ,CAAA,GAAI,oBAAA,GAAuB,MAAA;AAC7D;AASA,IAAM,WAAA,GAAc;AAAA,EAClB,qBAAA,EAAuB,WAAA;AAAA,EACvB,WAAA,EAAa,GAAA;AAAA,EACb,aAAA,EAAe,GAAA;AAAA,EACf,eAAA,EAAiB;AACnB,CAAA;AASA,SAAS,uBAAA,CACP,aACA,MAAA,EACyB;AACzB,EAAA,OAAO;AAAA;AAAA,IAEL;AAAA,MACE,OAAO,WAAA,CAAY,qBAAA;AAAA,MACnB,UAAA,EAAY,EAAA;AAAA,MACZ,KAAA,EAAO,EAAA;AAAA,MACP,QAAA,EAAU,EAAA;AAAA,MACV,YAAA,EAAc,kCAAkC,WAAW;AAAA,KAC7D;AAAA;AAAA,IAEA;AAAA,MACE,OAAO,WAAA,CAAY,WAAA;AAAA,MACnB,UAAA,EAAY,QAAA;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX,YAAA,EAAcoC,0BAAyB,MAAM,CAAA;AAAA,MAC7C,SAAA,EAAW;AAAA,KACb;AAAA;AAAA,IAEA;AAAA,MACE,OAAO,WAAA,CAAY,aAAA;AAAA,MACnB,UAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA;AAAA,IAEA;AAAA,MACE,OAAO,WAAA,CAAY,eAAA;AAAA,MACnB,UAAA,EAAY,WAAA;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX,YAAA,EAAc,wBAAA;AAAA,MACd,SAAA,EAAW;AAAA;AACb,GACF;AACF;AAsBO,SAAS,eAAA,CACd,QACA,OAAA,EACqB;AACrB,EAAA,MAAM,EAAE,QAAO,GAAI,OAAA;AAGnB,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,WAAW,IAChD,MAAA,CAAO,WAAA,GACP,CAAC,MAAA,CAAO,WAAW,CAAA;AAIvB,EAAA,MAAM,mBAAA,GAAiC;AAAA,IACrC,GAAG,MAAA,CAAO,IAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AAGA,EAAA,MAAM,OAAA,GAAU,uBAAA,CAAwB,WAAA,EAAa,MAAM,CAAA;AAG3D,EAAA,MAAM,IAAA,GAAO,sBAAsB,mBAAmB,CAAA;AAEtD,EAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AACzB;ACzJO,SAAS,eAAA,CACd,EAAA,EACA,WAAA,EACA,OAAA,EACA;AACA,EAAA,6BAAA,CAA8B,IAAI,WAAW,CAAA;AAC7C,EAAA,MAAM,aAAA,GAAgB,OAAA,EAAS,aAAA,IAAiB,EAAC;AACjD,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,KAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,QAAA;AAC5C,EAAA,MAAM,iBAAA,GAAoB,OAAA,EAAS,iBAAA,IAAqB,EAAC;AACzD,EAAA,MAAM,eAAA,GAAkB,sBAAsB,EAAE,CAAA;AAGhD,EAAA,MAAM,SAAA,GAAY,qBAAqB,EAAE,CAAA;AAGzC,EAAA,MAAM,UAAqD,EAAC;AAC5D,EAAA,MAAM,aAAwD,EAAC;AAG/D,EAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,EAAA,CAAG,OAAA,EAAS,WAAW,CAAA;AAGlE,EAAA,MAAM,SAAA,GAAY,UAAU,IAAA,CAAK,GAAA;AACjC,EAAA,MAAM,YAAA,GAAe,UAAU,IAAA,CAAK,GAAA;AAEpC,EAAA,eAAA,CAAgB,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAE/B,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,EAAA,CAAG,OAAA,EAAS,gBAAgB,GAAG,CAAA;AAG9D,IAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAElB,MAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,GAAA;AAAA,IAC/B;AAEA,IAAA,IAAI,GAAA,CAAI,YAAY,CAAA,EAAG;AACrB,MAAA,UAAA,CAAW,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,GAAA;AAAA,IAClC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,aAAA,CAAc;AAAA,IACvC,OAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAa,EAAA,CAAG,OAAA;AAAA,IAChB,gBAAgB,EAAA,CAAG,OAAA;AAAA,IACnB,SAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,gBAAgB,iBAAA,CAAkB;AAAA,IACtC,SAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA,EAAgB,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA;AAAA,IAC/B,UAAA,EAAY;AAAA,GACb,CAAA;AAGD,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,0BAAA,CAA2B;AAAA,IAC7C,OAAA,EAAS,aAAA;AAAA,IACT,WAAA;AAAA,IACA,kBAAA,EAAoB,KAAA;AAAA,IACpB,WAAW,OAAA,EAAS,SAAA;AAAA,IACpB,cAAc,OAAA,EAAS,YAAA;AAAA,IACvB,WAAA,EAAa;AAAA,MACX,WAAA;AAAA,MACA,aAAA;AAAA,MACA,uBAAuB,OAAA,EAAS,qBAAA;AAAA,MAChC,4BAA4B,OAAA,EAAS;AAAA;AACvC,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACKA,SAAS,kBAAkB,GAAA,EAAgC;AACzD,EAAA,IAAI,UAAA,CAAW,GAAG,CAAA,IAAK,cAAA,CAAe,GAAG,CAAA,EAAG;AAC1C,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AACxB,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,IAAI,MAAA,EAAO;AAAA,EAC7C;AAEA,EAAA,IAAI,cAAA,CAAe,GAAG,CAAA,EAAG;AACvB,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AAExB,IAAA,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,IAAQ,GAAA,CAAI,QAAQ,YAAA,EAAc;AAC/C,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,mBAAA;AAAA,QACN,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,WAAA,EAAa,IAAI,MAAA,CAAO;AAAA,OAC1B;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,qBAAA,EAAuB,MAAA,EAAQ,IAAI,MAAA,EAAO;AAAA,EAC3D;AAEA,EAAA,IAAI,cAAA,CAAe,GAAG,CAAA,EAAG;AACvB,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,IAAU,CAAC,GAAA,CAAI,QAAQ,OAAO,IAAA;AACvC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,QAAQ,GAAA,CAAI;AAAA,KACd;AAAA,EACF;AAEA,EAAA,IAAI,oBAAA,CAAqB,GAAG,CAAA,EAAG;AAC7B,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,IAAU,CAAC,GAAA,CAAI,MAAA,EAAQ,aAAa,OAAO,IAAA;AACpD,IAAA,MAAM,UAAA,GAAa,IAAI,MAAA,CAAO,WAAA;AAC9B,IAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,GAAI,UAAA,GAAa,CAAC,UAAU,CAAA;AACxE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,mBAAA;AAAA,MACN,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,CAAa,GAAG,CAAA,EAAG;AACrB,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,OAAO,IAAA;AACjC,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAI,MAAA,EAAO;AAAA,EAC/C;AAEA,EAAA,IAAI,gBAAA,CAAiB,GAAG,CAAA,EAAG;AACzB,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AACxB,IAAA,OAAO,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAA,EAAQ,IAAI,MAAA,EAAO;AAAA,EACpD;AAEA,EAAA,IAAI,aAAA,CAAc,GAAG,CAAA,EAAG;AACtB,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AACxB,IAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,IAAI,MAAA,EAAO;AAAA,EACjD;AAEA,EAAA,IAAI,iBAAA,CAAkB,GAAG,CAAA,EAAG;AAC1B,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AACxB,IAAA,OAAO,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAA,EAAQ,IAAI,MAAA,EAAO;AAAA,EACtD;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,qBAAqB,MAAA,EAAmC;AAC/D,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,IAAA;AAAA,IACpC,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,aAAY,KAAM;AAAA,GAClC;AACA,EAAA,OAAO,OAAO,IAAA,IAAQ,aAAA;AACxB;AA8BO,SAAS,cAAA,CACd,GAAA,EACA,OAAA,GAA2B,EAAC,EACL;AACvB,EAAA,MAAM,QAAA,GAAW,kBAAkB,GAAG,CAAA;AACtC,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,QAAQ,SAAS,IAAA;AAAM,IACrB,KAAK,OAAA;AACH,MAAA,OAAO,UAAA,CAAW,SAAS,MAAA,EAAQ;AAAA,QACjC,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,eAAe,OAAA,CAAQ,aAAA;AAAA,QACvB,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,QAC3B,oBAAoB,OAAA,CAAQ,kBAAA;AAAA,QAC5B,uBAAuB,OAAA,CAAQ,qBAAA;AAAA,QAC/B,4BAA4B,OAAA,CAAQ;AAAA,OACrC,CAAA;AAAA,IAEH,KAAK,qBAAA;AACH,MAAA,OAAO,cAAA;AAAA,QACL,SAAS,MAAA,CAAO,IAAA;AAAA,QAChB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB;AAAA,OACF;AAAA,IAEF,KAAK,mBAAA;AACH,MAAA,IAAI,CAAC,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM;AACzB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,eAAA,CAAgB,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM,SAAS,WAAA,EAAa;AAAA,QACjE,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,eAAe,OAAA,CAAQ,aAAA;AAAA,QACvB,uBAAuB,OAAA,CAAQ,qBAAA;AAAA,QAC/B,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,QAC3B,4BAA4B,OAAA,CAAQ;AAAA,OACrC,CAAA;AAAA,IAEH,KAAK,YAAA;AACH,MAAA,OAAO,gBAAgB,QAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,QAAA,CAAS,QAAQ,CAAA;AAAA,IAErE,KAAK,mBAAA;AACH,MAAA,OAAO,eAAA,CAAgB,QAAA,CAAS,MAAA,EAAQ,QAAA,CAAS,WAAA,EAAa;AAAA,QAC5D,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,eAAe,OAAA,CAAQ,aAAA;AAAA,QACvB,uBAAuB,OAAA,CAAQ,qBAAA;AAAA,QAC/B,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,QAC3B,4BAA4B,OAAA,CAAQ;AAAA,OACrC,CAAA;AAAA,IAEH,KAAK,SAAA,EAAW;AACd,MAAA,IAAI,CAAC,QAAA,CAAS,MAAA,CAAO,OAAA,EAAS;AAC5B,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,QAAA,CAAS,MAAM,CAAA;AACvD,MAAA,OAAO,UAAA,CAAW,QAAA,CAAS,MAAA,CAAO,OAAA,EAAS;AAAA,QACzC,WAAA,EAAa,CAAC,UAAU,CAAA;AAAA,QACxB,eAAe,OAAA,CAAQ,aAAA;AAAA,QACvB,uBAAuB,OAAA,CAAQ,qBAAA;AAAA,QAC/B,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,QAC3B,4BAA4B,OAAA,CAAQ;AAAA,OACrC,CAAA;AAAA,IACH;AAAA,IAEA,KAAK,cAAA,EAAgB;AACnB,MAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,QAAA,CAAS,MAAM,CAAA;AACvD,MAAA,OAAO,eAAe,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM,QAAA,CAAS,OAAO,OAAA,EAAS;AAAA,QACnE,WAAA,EAAa,CAAC,UAAU,CAAA;AAAA,QACxB,eAAe,OAAA,CAAQ,aAAA;AAAA,QACvB,uBAAuB,OAAA,CAAQ,qBAAA;AAAA,QAC/B,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,QAC3B,4BAA4B,OAAA,CAAQ;AAAA,OACrC,CAAA;AAAA,IACH;AAAA,IAEA,KAAK,WAAA;AACH,MAAA,OAAO,kBAAA,CAAmB,SAAS,MAAM,CAAA;AAAA,IAE3C,KAAK,gBAAA;AACH,MAAA,OAAO,sBAAA,CAAuB,SAAS,MAAM,CAAA;AAAA,IAE/C;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;ACvSA,IAAM,eAAA,GACJ,8EAAA;AAGK,IAAM,mBAAA,GAAsB,YAAY,UAAA,CAAW;AAAA,EACxD,eAAA,EAAiB,SAAA;AAAA,EACjB,qBAAA,EAAuB,SAAA;AAAA,EACvB,aAAA,EAAe,SAAA;AAAA,EACf,WAAA,EAAa,SAAA;AAAA,EACb,eAAA,EAAiB,SAAA;AAAA,EACjB,UAAA,EAAY,WAAA;AAAA,EACZ,QAAA,EAAU,EAAA;AAAA,EACV,gBAAA,EAAkB,eAAA;AAAA,EAClB,cAAA,EAAgB,EAAA;AAAA,EAChB,gBAAA,EAAkB,GAAA;AAAA,EAClB,qBAAA,EAAuB;AACzB,CAAC,CAAA;AAGiC,YAAY,UAAA,CAAW;AAAA,EACvD,eAAA,EAAiB,SAAA;AAAA,EACjB,qBAAA,EAAuB,SAAA;AAAA,EACvB,aAAA,EAAe,SAAA;AAAA,EACf,WAAA,EAAa,SAAA;AAAA,EACb,eAAA,EAAiB,SAAA;AAAA,EACjB,UAAA,EAAY,WAAA;AAAA,EACZ,QAAA,EAAU,EAAA;AAAA,EACV,gBAAA,EAAkB,eAAA;AAAA,EAClB,cAAA,EAAgB,EAAA;AAAA,EAChB,gBAAA,EAAkB,GAAA;AAAA,EAClB,qBAAA,EAAuB;AACzB,CAAC;ACLD,cAAA,CAAe,eAAA,CAAgB,CAAC,kBAAkB,CAAC,CAAA;AA0C5C,SAAS,iBAAA,CAAkB,EAAE,YAAA,EAAa,EAA2B;AAC1E,EAAA,uBACEpC,GAAAA;AAAA,IAACI,KAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,MAAA,EAAQ,MAAA;AAAA,QACR,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,OAAA,EAAS,UAAA;AAAA,QACT,SAAA,EAAW,QAAA;AAAA,QACX,UAAA,EAAY;AAAA,OACd;AAAA,MAEA,QAAA,kBAAAJ,GAAAA,CAACQ,WAAAA,EAAA,EAAW,EAAA,EAAI,EAAE,UAAA,EAAY,GAAA,EAAI,EAC/B,QAAA,EAAA,YAAA,IAAgB,SAAA,EACnB;AAAA;AAAA,GACF;AAEJ;AAkCA,SAAS,mBAAA,CACP;AAAA,EACE,KAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,YAAA,GAAe,EAAA;AAAA,EACf,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AAEA,EAAA,MAAM,YAAA,GAAeE,OAAuB,IAAI,CAAA;AAEhD,EAAA,MAAM,UAAA,GAAaA,OAAqC,IAAI,CAAA;AAG5D,EAAA,mBAAA;AAAA,IACE,GAAA;AAAA,IACA,OAAO;AAAA,MACL,KAAK,UAAA,CAAW,OAAA;AAAA,MAChB,SAAS,YAAA,CAAa;AAAA,KACxB,CAAA;AAAA,IACA;AAAC,GACH;AAGA,EAAA,MAAM,KAAA,GAAQI,OAAAA,CAAQ,MAAM,mBAAA,EAAqB,EAAE,CAAA;AAGnD,EAAA,MAAM,qBAAqB,UAAA,IAAc,OAAA;AACzC,EAAA,MAAM,kBAAkB,OAAA,IAAW,IAAA;AACnC,EAAA,MAAM,wBAAwB,aAAA,IAAiB,oBAAA;AAG/C,EAAA,MAAM,mBAAA,GAAsBA,OAAAA;AAAA,IAC1B,OAAO;AAAA,MACL,SAAA,EAAW,IAAA;AAAA,MACX,eAAA,EAAiB,IAAA;AAAA,MACjB,GAAG;AAAA,KACL,CAAA;AAAA,IACA,CAAC,qBAAqB;AAAA,GACxB;AAGA,EAAA,MAAM,sBAAA,GAAyBA,QAAQ,MAAM;AAC3C,IAAA,IAAI,CAAC,SAAA,EAAW,cAAA,EAAgB,OAAO,MAAA;AACvC,IAAA,OAAO,MAAM,SAAA,CAAU,cAAA;AAAA,EACzB,CAAA,EAAG,CAAC,SAAA,EAAW,cAAc,CAAC,CAAA;AAG9B,EAAA,MAAM,gBAAA,GAAmBA,QAAQ,MAAM;AACrC,IAAA,IAAI,UAAU,OAAO,QAAA;AACrB,IAAA,OAAO,CAAC,MAAA,KAAkC;AACxC,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,MAAA,IAAI,IAAA,EAAM,aAAa,MAAA,EAAW;AAChC,QAAA,OAAO,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,MAC7B;AAEA,MAAA,MAAM,KAAA,GAAS,OAAO,IAAA,EAA2C,QAAA;AACjE,MAAA,OAAO,MAAA,CAAO,KAAA,IAAS,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,IACtC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAKb,EAAA,MAAM,OAAA,GAAUA,QAAQ,MAAM;AAC5B,IAAA,IAAI,CAAC,oBAAoB,OAAO,MAAA;AAChC,IAAA,MAAM,eAAe,kBAAA,CAClB,MAAA;AAAA,MACC,CAAC,GAAA,KAA8B,OAAA,IAAW,GAAA,IAAO,IAAI,MAAA,KAAW;AAAA,KAClE,CACC,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,CAAA,CACtB,IAAA,EAAK,CACL,IAAA,CAAK,GAAG,CAAA;AACX,IAAA,OAAO,QAAQ,YAAY,CAAA,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAEvB,EAAA,uBACEd,GAAAA;AAAA,IAACI,KAAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA,EACE,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,kBAAA,CAAA,GAAuB,mBAAA;AAAA,MAEjD,EAAA,EAAI;AAAA;AAAA;AAAA,QAGF,IAAA,EAAM,CAAA;AAAA,QACN,SAAA,EAAW,CAAA;AAAA,QACX,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,QAAA;AAAA,QACV,oBAAA,EAAsB;AAAA,UACpB,MAAA,EAAQ,MAAA;AAAA,UACR,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,cAAA,EAAgB;AAAA,UACd,YAAA,EAAc;AAAA,SAChB;AAAA,QACA,WAAA,EAAa;AAAA,UACX,YAAA,EAAc;AAAA,SAChB;AAAA,QACA,YAAA,EAAc;AAAA,UACZ,WAAA,EAAa;AAAA,SACf;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,WAAA,EAAa;AAAA,SACf;AAAA;AAAA,QAEA,oBAAA,EAAsB;AAAA,UACpB,eAAA,EAAiB,oBAAA;AAAA,UACjB,KAAA,EAAO;AAAA,SACT;AAAA,QACA,sBAAA,EAAwB;AAAA,UACtB,eAAA,EAAiB,oBAAA;AAAA,UACjB,KAAA,EAAO;AAAA,SACT;AAAA,QACA,uBAAA,EAAyB;AAAA,UACvB,eAAA,EAAiB,oBAAA;AAAA,UACjB,KAAA,EAAO;AAAA,SACT;AAAA;AAAA,QAEA,sBAAA,EAAwB;AAAA,UACtB,eAAA,EAAiB,oBAAA;AAAA,UACjB,KAAA,EAAO;AAAA,SACT;AAAA,QACA,wBAAA,EAA0B;AAAA,UACxB,eAAA,EAAiB,oBAAA;AAAA,UACjB,KAAA,EAAO;AAAA,SACT;AAAA;AAAA,QAEA,iBAAA,EAAmB;AAAA,UACjB,KAAA,EAAO,oBAAA;AAAA,UACP,SAAA,EAAW;AAAA,SACb;AAAA;AAAA,QAEA,2CAAA,EAA6C;AAAA,UAC3C,eAAA,EAAiB;AAAA;AACnB,OACF;AAAA,MAEA,QAAA,kBAAAJ,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UAEC,KAAA;AAAA,UACA,UAAA,EAAY,kBAAA;AAAA,UACZ,OAAA,EAAS,eAAA;AAAA,UACT,QAAA,EAAU,gBAAA;AAAA,UACV,SAAA;AAAA,UACA,YAAA;AAAA,UACA,aAAA,EAAe,mBAAA;AAAA,UACf,iBAAA,EAAmB,IAAA;AAAA,UACnB,yBAAA,EAA2B,KAAA;AAAA,UAC3B,WAAA,EAAa,KAAA;AAAA,UACb,QAAA,EAAS,mBAAA;AAAA,UACT,sBAAA;AAAA,UACA,WAAA,EAAa,CAAC,KAAA,KAAU;AACtB,YAAA,UAAA,CAAW,UAAU,KAAA,CAAM,GAAA;AAAA,UAC7B,CAAA;AAAA,UACC,GAAG;AAAA,SAAA;AAAA,QAhBC;AAAA;AAiBP;AAAA,GACF;AAEJ;AAEO,IAAM,kBAAA,GAAqBsB,WAAW,mBAAmB,CAAA;ACpSzD,IAAM,eAAe,CAAC;AAAA,EAC3B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAAyB;AACvB,EAAA,uBACEzB,IAAAA,CAAC,WAAA,EAAA,EAAY,OAAA,EAAQ,UAAA,EAAW,IAAA,EAAK,QAAA,EAAS,EAAA,EAAI,EAAE,YAAA,EAAc,CAAA,EAAE,EAClE,QAAA,EAAA;AAAA,oBAAAG,GAAAA;AAAA,MAACM,OAAAA;AAAA,MAAA;AAAA,QACC,SAAS,MAAM;AACb,UAAA,QAAA,CAAS,KAAK,CAAA;AAAA,QAChB,CAAA;AAAA,QACA,EAAA,EAAI;AAAA,UACF,KAAA,EAAO,CAAC,KAAA,GAAQ,OAAA,GAAU,UAAA;AAAA,UAC1B,OAAA,EAAS,CAAC,KAAA,GAAQ,OAAA,GAAU;AAAA,SAC9B;AAAA,QAEC,QAAA,EAAA,OAAA,IAAW;AAAA;AAAA,KACd;AAAA,oBACAN,GAAAA;AAAA,MAACM,OAAAA;AAAA,MAAA;AAAA,QACC,SAAS,MAAM;AACb,UAAA,QAAA,CAAS,IAAI,CAAA;AAAA,QACf,CAAA;AAAA,QACA,EAAA,EAAI;AAAA,UACF,KAAA,EAAO,QAAQ,OAAA,GAAU,UAAA;AAAA,UACzB,OAAA,EAAS,QAAQ,OAAA,GAAU;AAAA,SAC7B;AAAA,QAEC,QAAA,EAAA,MAAA,IAAU;AAAA;AAAA;AACb,GAAA,EACF,CAAA;AAEJ,CAAA;AAOO,IAAM,wBAAwB,CAAC;AAAA,EACpC,WAAA;AAAA,EACA;AACF,CAAA,KAAiC;AAC/B,EAAA,uBACET,IAAAA,CAAAU,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,WAAA,KAAgB,QAAA,oBACfV,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAP,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,MAAA;AAAA,UACN,YAAA,EAAa,KAAA;AAAA,UACb,OAAA,EAAS,KAAA;AAAA,UACT,QAAA,EAAS,MAAA;AAAA,UACT,MAAA,EAAM;AAAA;AAAA,OACR;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,SAAA;AAAA,UACN,YAAA,EAAa,OAAA;AAAA,UACb,OAAA,EAAS,KAAA;AAAA,UACT,QAAA,EAAS,MAAA;AAAA,UACT,MAAA,EAAM;AAAA;AAAA;AACR,KAAA,EACF,CAAA;AAAA,oBAEFA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAO,WAAA,KAAgB,cAAA;AAAA,QACvB,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,oBAAA,CAAqB,KAAA,GAAQ,iBAAiB,QAAQ,CAAA;AAAA,QACxD,CAAA;AAAA,QACA,OAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAO;AAAA;AAAA;AACT,GAAA,EACF,CAAA;AAEJ,CAAA;ACpEO,IAAM,aAAa,CAAC;AAAA,EACzB,QAAA;AAAA,EACA;AACF,CAAA,KAAwC;AACtC,EAAA,uBACEH,IAAAA;AAAA,IAACO,KAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,YAAA,EAAc,qBAAA;AAAA,QACd,cAAA,EAAgB,UAAA;AAAA,QAChB,GAAA,EAAK,KAAA;AAAA,QACL,UAAA,EAAY,QAAA;AAAA,QACZ,EAAA,EAAI,MAAA;AAAA,QACJ,OAAA,EAAS,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,IAAI,WAAA,GAAc;AAAA,OAC3D;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,GAAAA;AAAA,UAACI,KAAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI;AAAA,cACF,OAAA,EAAS,MAAA;AAAA,cACT,aAAA,EAAe,QAAA;AAAA,cACf,UAAA,EAAY,YAAA;AAAA,cACZ,GAAA,EAAK;AAAA,aACP;AAAA,YAEC,oBAAU,GAAA,CAAI,CAAC,4BACdP,IAAAA,CAACO,OAAA,EACC,QAAA,EAAA;AAAA,8BAAAJ,GAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAM,WAAA,EAAY,CAAA;AAAA,cAAE,GAAA;AAAA,cAAE;AAAA,aAAA,EAAA,EADzBkB,GAAE,QAAA,CAAS,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAElC,CACD;AAAA;AAAA,SACH;AAAA,wBACAlB,GAAAA,CAACI,KAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,IAAA,EAAM,CAAA,EAAG,SAAA,EAAW,MAAA,EAAO,EAAG,CAAA;AAAA,QACxC;AAAA;AAAA;AAAA,GACH;AAEJ,CAAA;AC9BA,IAAM,+BAA+B,CACnC,EAAE,KAAK,WAAA,EAAa,oBAAA,IAEpB,GAAA,KACG;AACH,EAAA,IAAI,CAAC,gBAAA,CAAiB,GAAG,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC3D;AACA,EAAA,MAAM,aAAA,GAAgBU,OAAAA;AAAA,IACpB,MAAM,WAAA,EAAa,cAAA,IAAkB,EAAC;AAAA,IACtC,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,WAAA,GAAcA,OAAAA;AAAA,IAClB,MAAM,aAAa,YAAA,IAAgB,QAAA;AAAA,IACnC,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,iBAAA,GAAoBA,OAAAA;AAAA,IACxB,OAAO;AAAA,MACL,mBAAA,EAAqB,SAAA;AAAA,MACrB,mBAAA,EAAqB,SAAA;AAAA,MACrB,GAAG,WAAA,EAAa;AAAA,KAClB,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,QAAA,GAAWA,QAAQ,MAAM;AAC7B,IAAA,MAAM,0BAAA,GAA6B,CACjC,IAAA,KACG;AACH,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,GAAI,WAAA,EAAa,iBAAA,IAAqB,EAAC;AAAA,QACvC,GAAG;AAAA,OACL;AACA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB;AAAA,UACnB,GAAG,WAAA;AAAA,UACH,iBAAA,EAAmB;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,0BAAA,GAA6B,CAACuB,cAAAA,KAA4B;AAC9D,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB;AAAA,UACnB,GAAG,WAAA;AAAA,UACH,cAAA,EAAgBA;AAAA,SACjB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,OACE,eAAe,GAAA,EAAK;AAAA,MAClB,aAAA;AAAA,MACA,qBAAA,EAAuB,0BAAA;AAAA,MACvB,WAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACD,KAAK,EAAE,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AAAA,EAElC,CAAA,EAAG;AAAA,IACD,GAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACjC,IAAA,uBACErC,GAAAA;AAAA,MAACI,KAAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,MAAA,EAAQ;AAAA,SACV;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,EAEJ;AAEA,EAAA,uBACEP,IAAAA;AAAA,IAACO,KAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,OAAA,EAAS,oBAAA;AAAA,QACT,MAAA,EAAQ;AAAA,OACV;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,UAAA,EAAA,EAAW,GAAA,EACV,QAAA,kBAAAA,GAAAA;AAAA,UAAC,qBAAA;AAAA,UAAA;AAAA,YACC,WAAA;AAAA,YACA,oBAAA,EAAsB,CAACsC,YAAAA,KAAgB;AACrC,cAAA,IAAI,oBAAA,EAAsB;AACxB,gBAAA,oBAAA,CAAqB;AAAA,kBACnB,GAAG,WAAA;AAAA,kBACH,YAAA,EAAcA;AAAA,iBACf,CAAA;AAAA,cACH;AAAA,YACF;AAAA;AAAA,SACF,EACF,CAAA;AAAA,wBACAtC,GAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,OAAO,EAAE,SAAA,EAAW,QAAQ,SAAA,EAAW,MAAA,EAAQ,UAAU,MAAA,EAAO;AAAA,YAChE,SAAS,QAAA,CAAS,OAAA;AAAA,YAClB,MAAM,QAAA,CAAS,IAAA;AAAA,YACf,sBAAsB,EAAE,SAAA,EAAW,MAAM,QAAA,EAAU,GAAA,EAAK,UAAU,EAAA,EAAG;AAAA,YACrE,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,GACF;AAEJ,CAAA;AAEA,IAAM,2BAA2B,CAC/B,EAAE,KAAK,WAAA,EAAa,oBAAA,IAEpB,GAAA,KACG;AACH,EAAA,IAAI,CAAC,YAAA,CAAa,GAAG,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC3D;AACA,EAAA,MAAM,aAAA,GAAgBc,OAAAA;AAAA,IACpB,MAAM,WAAA,EAAa,cAAA,IAAkB,EAAC;AAAA,IACtC,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,iBAAA,GAAoBA,OAAAA;AAAA,IACxB,OAAO;AAAA,MACL,mBAAA,EAAqB,SAAA;AAAA,MACrB,mBAAA,EAAqB,SAAA;AAAA,MACrB,GAAG,WAAA,EAAa;AAAA,KAClB,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,QAAA,GAAWA,QAAQ,MAAM;AAC7B,IAAA,MAAM,0BAAA,GAA6B,CACjC,IAAA,KACG;AACH,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,GAAI,WAAA,EAAa,iBAAA,IAAqB,EAAC;AAAA,QACvC,GAAG;AAAA,OACL;AACA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB;AAAA,UACnB,GAAG,WAAA;AAAA,UACH,iBAAA,EAAmB;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,0BAAA,GAA6B,CAACuB,cAAAA,KAA4B;AAC9D,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB;AAAA,UACnB,GAAG,WAAA;AAAA,UACH,cAAA,EAAgBA;AAAA,SACjB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,OACE,eAAe,GAAA,EAAK;AAAA,MAClB,aAAA;AAAA,MACA,qBAAA,EAAuB,0BAAA;AAAA,MACvB,iBAAA;AAAA,MACA;AAAA,KACD,KAAK,EAAE,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AAAA,EAElC,CAAA,EAAG;AAAA,IACD,GAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACjC,IAAA,uBACErC,GAAAA;AAAA,MAACI,KAAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,MAAA,EAAQ;AAAA,SACV;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,EAEJ;AAEA,EAAA,uBACEJ,GAAAA;AAAA,IAACI,KAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,OAAA,EAAS,oBAAA;AAAA,QACT,MAAA,EAAQ;AAAA,OACV;AAAA,MAEA,QAAA,kBAAAJ,GAAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,OAAO,EAAE,SAAA,EAAW,QAAQ,SAAA,EAAW,MAAA,EAAQ,UAAU,MAAA,EAAO;AAAA,UAChE,SAAS,QAAA,CAAS,OAAA;AAAA,UAClB,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,sBAAsB,EAAE,SAAA,EAAW,MAAM,QAAA,EAAU,GAAA,EAAK,UAAU,EAAA,EAAG;AAAA,UACrE,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,GACF;AAEJ,CAAA;AAEO,IAAM,qBAAA,GAAwBsB,WAAW,4BAA4B,CAAA;AACrE,IAAM,iBAAA,GAAoBA,WAAW,wBAAwB,CAAA;ACtO7D,IAAM,sBAAsB,CAAC;AAAA,EAClC,WAAA;AAAA,EACA;AACF,CAAA,KAAgC;AAC9B,EAAA,uBACEtB,GAAAA;AAAA,IAACuC,gBAAAA;AAAA,IAAA;AAAA,MACC,yBACEvC,GAAAA;AAAA,QAACwC,QAAAA;AAAA,QAAA;AAAA,UACC,SAAS,WAAA,IAAe,KAAA;AAAA,UACxB,UAAU,MAAM;AACd,YAAA,QAAA,EAAS;AAAA,UACX,CAAA;AAAA,UACA,IAAA,EAAK;AAAA;AAAA,OACP;AAAA,MAEF,KAAA,EAAM,cAAA;AAAA,MACN,SAAA,EAAW;AAAA,QACT,UAAA,EAAY,EAAE,OAAA,EAAS,OAAA;AAAQ;AACjC;AAAA,GACF;AAEJ,CAAA;ACEA,IAAM,6BAA6B,CACjC;AAAA,EACE,GAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,oBAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAEA,GAAA,KACG;AACH,EAAA,MAAM,WAAA,GAAc1B,OAAAA;AAAA,IAClB,MAAM,WAAA,EAAa,YAAA,IAAgB,EAAC;AAAA,IACpC,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,WAAA,GAAcA,OAAAA;AAAA,IAClB,MAAM,aAAa,YAAA,IAAgB,KAAA;AAAA,IACnC,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,aAAA,GAAgBA,OAAAA;AAAA,IACpB,MAAM,WAAA,EAAa,cAAA,IAAkB,EAAC;AAAA,IACtC,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,WAAA,GAAcA,OAAAA;AAAA,IAClB,MAAM,aAAa,YAAA,IAAgB,QAAA;AAAA,IACnC,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,iBAAA,GAAoBA,OAAAA;AAAA,IACxB,MAAM,WAAA,EAAa,iBAAA,IAAqB,EAAC;AAAA,IACzC,CAAC,WAAW;AAAA,GACd;AACA,EAAA,IAAI,GAAA,CAAI,SAAS,YAAA,EAAc;AAC7B,IAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,EACzE;AAEA,EAAA,MAAM,QAAA,GAAWA,QAAQ,MAAM;AAC7B,IAAA,MAAM,0BAAA,GAA6B,CACjC,IAAA,KACG;AACH,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,GAAI,WAAA,EAAa,iBAAA,IAAqB,EAAC;AAAA,QACvC,GAAG;AAAA,OACL;AACA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB;AAAA,UACnB,GAAG,WAAA;AAAA,UACH,iBAAA,EAAmB;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,uBAAA,GAA0B,CAAC2B,YAAAA,KAA0B;AACzD,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB;AAAA,UACnB,GAAG,WAAA;AAAA,UACH,YAAA,EAAcA;AAAA,SACf,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,0BAAA,GAA6B,CAACJ,cAAAA,KAA4B;AAC9D,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB;AAAA,UACnB,GAAG,WAAA;AAAA,UACH,cAAA,EAAgBA;AAAA,SACjB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AACA,IAAA,MAAM,OAAA,GAA2B;AAAA,MAC/B,WAAA;AAAA,MACA,kBAAA,EAAoB,uBAAA;AAAA,MACpB,aAAA;AAAA,MACA,qBAAA,EAAuB,0BAAA;AAAA,MACvB,iBAAA;AAAA,MACA,0BAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,cAAA,CAAe,GAAA,EAAK,OAAO,CAAA,IAAK,EAAE,SAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AAAA,EACjE,CAAA,EAAG;AAAA,IACD,GAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,WAAA,GAAcvB,QAAQ,MAAM;AAChC,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAEpC,IAAA,IAAI,QAAA,CAAS,eAAA,IAAmB,QAAA,CAAS,kBAAA,EAAoB;AAC3D,MAAA,OAAO,6BAA6B,MAAM,CAAA,oDAAA,CAAA;AAAA,IAC5C,CAAA,MAAA,IAAW,SAAS,eAAA,EAAiB;AACnC,MAAA,OAAO,6BAA6B,MAAM,CAAA,uCAAA,CAAA;AAAA,IAC5C,CAAA,MAAA,IAAW,SAAS,kBAAA,EAAoB;AACtC,MAAA,OAAO,6BAA6B,MAAM,CAAA,0CAAA,CAAA;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,QAAA,CAAS,iBAAiB,QAAA,CAAS,kBAAA,EAAoB,WAAW,CAAC,CAAA;AAEvE,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,KAAA,IAAS,CAAA;AAC5C,EAAA,MAAM,YAAA,GACJ,KAAA,GAAQ,CAAA,KAAM,GAAA,CAAI,QAAQ,OAAA,EAAS,IAAA,IAAQ,GAAA,CAAI,MAAA,EAAQ,MAAM,IAAA,CAAA,GACzD,CAAA,0CAAA,EAA6C,KAAA,CAAM,cAAA,EAAgB,CAAA,mHAAA,CAAA,GACnE,IAAA;AAEN,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,QAAA,CAAS,KAAK,WAAW,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACjC,IAAA,uBACEd,GAAAA;AAAA,MAACI,KAAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,MAAA,EAAQ;AAAA,SACV;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,EAEJ;AAEA,EAAA,uBACEP,IAAAA;AAAA,IAACO,KAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,OAAA,EAAS,oBAAA;AAAA,QACT,MAAA,EAAQ;AAAA,OACV;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAP,IAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,WAAA;AAAA,YACA,oBAAA;AAAA,YACA,QAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAG,GAAAA;AAAA,gBAAC,qBAAA;AAAA,gBAAA;AAAA,kBACC,WAAA;AAAA,kBACA,oBAAA,EAAsB,CAACsC,YAAAA,KAAgB;AACrC,oBAAA,IAAI,oBAAA,EAAsB;AACxB,sBAAA,oBAAA,CAAqB;AAAA,wBACnB,GAAG,WAAA;AAAA,wBACH,YAAA,EAAcA;AAAA,uBACf,CAAA;AAAA,oBACH;AAAA,kBACF;AAAA;AAAA,eACF;AAAA,8BAEAtC,GAAAA;AAAA,gBAAC,mBAAA;AAAA,gBAAA;AAAA,kBACC,aAAa,WAAA,EAAa,YAAA;AAAA,kBAC1B,UAAU,MAAM;AACd,oBAAA,MAAM0C,YAAAA,GAAc,CAAC,WAAA,EAAa,YAAA;AAClC,oBAAA,IAAI,oBAAA,EAAsB;AACxB,sBAAA,oBAAA,CAAqB;AAAA,wBACnB,GAAG,WAAA;AAAA,wBACH,YAAA,EAAcA;AAAA,uBACf,CAAA;AAAA,oBACH;AAAA,kBACF;AAAA;AAAA;AACF;AAAA;AAAA,SACF;AAAA,wBACA1C,GAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,OAAO,EAAE,SAAA,EAAW,QAAQ,SAAA,EAAW,MAAA,EAAQ,UAAU,MAAA,EAAO;AAAA,YAChE,SAAS,QAAA,CAAS,OAAA;AAAA,YAClB,MAAM,QAAA,CAAS,IAAA;AAAA,YACf,SAAA,EAAW;AAAA,cACT,cAAA,kBACEA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,cAAa,oBAAA,EAAqB;AAAA,aAEzD;AAAA,YACA,oBAAA,EAAsB;AAAA,cACpB,SAAA,EAAW,IAAA;AAAA,cACX,QAAA,EAAU,GAAA;AAAA,cACV,QAAA,EAAU;AAAA,aACZ;AAAA,YACA,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,GACF;AAEJ,CAAA;AAEA,IAAM,iCAAiC,CACrC;AAAA,EACE,GAAA;AAAA,EACA,WAAA;AAAA,EACA,oBAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EACA,GAAA,KACG;AACH,EAAA,IAAI,GAAA,CAAI,SAAS,YAAA,EAAc;AAC7B,IAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,EACzE;AACA,EAAA,MAAM,WAAA,GAAcc,OAAAA;AAAA,IAClB,MAAM,aAAa,YAAA,IAAgB,KAAA;AAAA,IACnC,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,aAAA,GAAgBA,OAAAA;AAAA,IACpB,MAAM,WAAA,EAAa,cAAA,IAAkB,EAAC;AAAA,IACtC,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,WAAA,GAAcA,OAAAA;AAAA,IAClB,MAAM,aAAa,YAAA,IAAgB,QAAA;AAAA,IACnC,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,iBAAA,GAAoBA,OAAAA;AAAA,IACxB,MAAM,WAAA,EAAa,iBAAA,IAAqB,EAAC;AAAA,IACzC,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,QAAA,GAAWA,QAAQ,MAAM;AAC7B,IAAA,MAAM,0BAAA,GAA6B,CACjC,IAAA,KACG;AACH,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,GAAI,WAAA,EAAa,iBAAA,IAAqB,EAAC;AAAA,QACvC,GAAG;AAAA,OACL;AACA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB;AAAA,UACnB,GAAG,WAAA;AAAA,UACH,iBAAA,EAAmB;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,0BAAA,GAA6B,CAACuB,cAAAA,KAA4B;AAC9D,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB;AAAA,UACnB,GAAG,WAAA;AAAA,UACH,cAAA,EAAgBA;AAAA,SACjB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,OACE,eAAe,GAAA,EAAK;AAAA,MAClB,WAAA;AAAA,MACA,aAAA;AAAA,MACA,qBAAA,EAAuB,0BAAA;AAAA,MACvB,SAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACD,KAAK,EAAE,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AAAA,EAElC,CAAA,EAAG;AAAA,IACD,GAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,KAAA,IAAS,CAAA;AACzC,EAAA,MAAM,YAAA,GACJ,KAAA,GAAQ,CAAA,IAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,IAAA,GAC3B,CAAA,0CAAA,EAA6C,KAAA,CAAM,cAAA,EAAgB,CAAA,mHAAA,CAAA,GACnE,IAAA;AAEN,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACjC,IAAA,uBACErC,GAAAA;AAAA,MAACI,KAAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,MAAA,EAAQ;AAAA,SACV;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,EAEJ;AAEA,EAAA,IAAI,WAAA,IAAe,QAAA,CAAS,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC7C,IAAA,uBACEP,IAAAA;AAAA,MAACO,KAAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,OAAA,EAAS,MAAA;AAAA,UACT,aAAA,EAAe,QAAA;AAAA,UACf,OAAA,EAAS,oBAAA;AAAA,UACT,MAAA,EAAQ;AAAA,SACV;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAJ,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,GAAA;AAAA,cACA,WAAA;AAAA,cACA,oBAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,0BACAA,GAAAA;AAAA,YAACI,KAAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI;AAAA,gBACF,OAAA,EAAS,MAAA;AAAA,gBACT,UAAA,EAAY,QAAA;AAAA,gBACZ,cAAA,EAAgB,QAAA;AAAA,gBAChB,MAAA,EAAQ;AAAA,eACV;AAAA,cACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACEP,IAAAA;AAAA,IAACO,KAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,OAAA,EAAS,oBAAA;AAAA,QACT,MAAA,EAAQ;AAAA,OACV;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAP,IAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,WAAA;AAAA,YACA,oBAAA;AAAA,YACA,QAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAG,GAAAA;AAAA,gBAAC,qBAAA;AAAA,gBAAA;AAAA,kBACC,WAAA;AAAA,kBACA,oBAAA,EAAsB,CAACsC,YAAAA,KAAgB;AACrC,oBAAA,IAAI,oBAAA,EAAsB;AACxB,sBAAA,oBAAA,CAAqB;AAAA,wBACnB,GAAG,WAAA;AAAA,wBACH,YAAA,EAAcA;AAAA,uBACf,CAAA;AAAA,oBACH;AAAA,kBACF;AAAA;AAAA,eACF;AAAA,8BAEAtC,GAAAA;AAAA,gBAAC,mBAAA;AAAA,gBAAA;AAAA,kBACC,aAAa,WAAA,EAAa,YAAA;AAAA,kBAC1B,UAAU,MAAM;AACd,oBAAA,MAAM0C,YAAAA,GAAc,CAAC,WAAA,EAAa,YAAA;AAClC,oBAAA,IAAI,oBAAA,EAAsB;AACxB,sBAAA,oBAAA,CAAqB;AAAA,wBACnB,GAAG,WAAA;AAAA,wBACH,YAAA,EAAcA;AAAA,uBACf,CAAA;AAAA,oBACH;AAAA,kBACF;AAAA;AAAA;AACF;AAAA;AAAA,SACF;AAAA,wBACA1C,GAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,OAAO,EAAE,SAAA,EAAW,QAAQ,SAAA,EAAW,MAAA,EAAQ,UAAU,MAAA,EAAO;AAAA,YAChE,SAAS,QAAA,CAAS,OAAA;AAAA,YAClB,MAAM,QAAA,CAAS,IAAA;AAAA,YACf,SAAA,EAAW;AAAA,cACT,cAAA,kBACEA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,cAAa,oBAAA,EAAqB;AAAA,aAEzD;AAAA,YACA,oBAAA,EAAsB;AAAA,cACpB,SAAA,EAAW,IAAA;AAAA,cACX,QAAA,EAAU,GAAA;AAAA,cACV,QAAA,EAAU;AAAA,aACZ;AAAA,YACA,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,GACF;AAEJ,CAAA;AAGA,IAAM,0BAAA,GAA6BsB,WAAW,0BAA0B,CAAA;AACxE,IAAM,8BAAA,GAAiCA,UAAAA;AAAA,EACrC;AACF,CAAA;AAEO,IAAM,mBAAA,GAAsBA,UAAAA;AAAA,EACjC,CAAC,OAAiC,GAAA,KAAsC;AACtE,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,YAAA;AACJ,IAAA,IACE,MAAM,GAAA,CAAI,MAAA,IACT,KAAA,CAAM,GAAA,CAAI,OAAoC,aAAA,EAC/C;AAEA,MAAA,SAAA,GAAY,UAAA;AACZ,MAAA,YAAA,GAAe,QAAA;AAAA,IACjB;AACA,IAAA,IACE,KAAA,CAAM,GAAA,CAAI,MAAA,IACV,MAAA,IAAU,KAAA,CAAM,GAAA,CAAI,MAAA,IACpB,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,IAAA,IAAQ,IAAA,EACzB;AACA,MAAA,uBACEtB,GAAAA;AAAA,QAAC,8BAAA;AAAA,QAAA;AAAA,UACE,GAAG,KAAA;AAAA,UACJ,GAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA;AAAA,OACF;AAAA,IAEJ,CAAA,MAAO;AACL,MAAA,uBACEA,GAAAA;AAAA,QAAC,0BAAA;AAAA,QAAA;AAAA,UACE,GAAG,KAAA;AAAA,UACJ,GAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA;AAAA,OACF;AAAA,IAEJ;AAAA,EACF;AACF,CAAA;ACxbA,IAAM,yBAAyB,CAC7B;AAAA,EACE,GAAA;AAAA,EACA,WAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA,EACA,GAAA,KACG;AACH,EAAA,IAAI,EAAE,UAAA,CAAW,GAAG,CAAA,IAAK,cAAA,CAAe,GAAG,CAAA,CAAA,EAAI;AAC7C,IAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,EAC1C;AACA,EAAA,MAAM,aAAA,GAAgBc,OAAAA;AAAA,IACpB,MAAM,WAAA,EAAa,cAAA,IAAkB,EAAC;AAAA,IACtC,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,iBAAA,GAAoBA,OAAAA;AAAA,IACxB,MAAM,WAAA,EAAa,iBAAA,IAAqB,EAAC;AAAA,IACzC,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,YAAY,GAAA,CAAI,MAAA;AACtB,EAAA,MAAM,QAAA,GAAWA,QAAQ,MAAM;AAC7B,IAAA,MAAM,0BAAA,GAA6B,CACjC,IAAA,KACG;AACH,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,GAAI,WAAA,EAAa,iBAAA,IAAqB,EAAC;AAAA,QACvC,GAAG;AAAA,OACL;AACA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB;AAAA,UACnB,GAAG,WAAA;AAAA,UACH,iBAAA,EAAmB;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,0BAAA,GAA6B,CAACuB,cAAAA,KAA4B;AAC9D,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB;AAAA,UACnB,GAAG,WAAA;AAAA,UACH,cAAA,EAAgBA;AAAA,SACjB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AACA,IAAA,OACE,eAAe,GAAA,EAAK;AAAA,MAClB,aAAA;AAAA,MACA,qBAAA,EAAuB,0BAAA;AAAA,MACvB,iBAAA;AAAA,MACA;AAAA,KACD,KAAK,EAAE,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AAAA,EAElC,CAAA,EAAG;AAAA,IACD,GAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACjC,IAAA,uBACErC,GAAAA;AAAA,MAACI,KAAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB;AAAA,SAClB;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,EAEJ;AAEA,EAAA,MAAM,KAAA,GAAQ,SAAA,GAAa,SAAA,CAAU,KAAA,IAAS,CAAA,GAAK,CAAA;AACnD,EAAA,MAAM,OAAA,GACJ,QAAQ,CAAA,IAAK,SAAA,EAAW,OACpB,CAAA,0CAAA,EAA6C,KAAA,CAAM,cAAA,EAAgB,CAAA,mHAAA,CAAA,GACnE,IAAA;AACN,EAAA,MAAM,aAAa,gBAAA,IAAoB,OAAA;AAEvC,EAAA,uBACEP,IAAAA,CAACM,MAAAA,EAAA,EAAM,EAAA,EAAI,EAAE,OAAA,EAAS,oBAAA,EAAsB,MAAA,EAAQ,MAAA,EAAO,EACxD,QAAA,EAAA;AAAA,IAAA,UAAA,oBACCN,IAAAA;AAAA,MAACM,MAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,KAAA;AAAA,QACV,EAAA,EAAI;AAAA,UACF,YAAA,EAAc,qBAAA;AAAA,UACd,UAAA,EAAY,QAAA;AAAA,UACZ,GAAA,EAAK,KAAA;AAAA,UACL,EAAA,EAAI,MAAA;AAAA,UACJ,OAAA,EAAS,UAAU,WAAA,GAAc;AAAA,SACnC;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,OAAA,oBACCN,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAP,GAAAA;AAAA,cAACI,KAAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWuC,SAAAA;AAAA,gBACX,EAAA,EAAI,EAAE,KAAA,EAAO,WAAA,EAAa,WAAW,QAAA;AAAS;AAAA,aAChD;AAAA,YAAG,GAAA;AAAA,4BACH3C,GAAAA,CAACI,KAAAA,EAAA,EAAK,QAAA,EAAA,OAAA,EAAQ;AAAA,WAAA,EAChB,CAAA;AAAA,0BAGFJ,GAAAA,CAACI,KAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,QAAA,EAAU,CAAA,EAAG,SAAA,EAAW,MAAA,EAAO,EAAG,CAAA;AAAA,UAC5C,oCACCJ,GAAAA;AAAA,YAACM,OAAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,EAAE,EAAA,EAAI,KAAA,EAAM;AAAA,cAChB,IAAA,EAAK,OAAA;AAAA,cACL,KAAA,EAAM,UAAA;AAAA,cACN,OAAA,EAAQ,WAAA;AAAA,cACR,SAAS,MAAM;AACb,gBAAA,gBAAA,CAAiB,GAAG,CAAA;AAAA,cACtB,CAAA;AAAA,cACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,KAEJ;AAAA,oBAEFN,GAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAO,EAAE,SAAA,EAAW,QAAQ,SAAA,EAAW,MAAA,EAAQ,UAAU,MAAA,EAAO;AAAA,QAChE,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,WAAW,EAAE,cAAA,kBAAgBA,GAAAA,CAAC,qBAAkB,CAAA,EAAG;AAAA,QACnD,oBAAA,EAAsB;AAAA,UACpB,SAAA,EAAW,IAAA;AAAA,UACX,QAAA,EAAU,GAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,SAAA,EAAU;AAAA;AAAA;AACZ,GAAA,EACF,CAAA;AAEJ,CAAA;AAEO,IAAM,eAAA,GAAkBsB,WAAW,sBAAsB,CAAA;AC/IhE,SAAS,kBACP,EAAE,GAAA,EAAK,SAAA,EAAW,YAAA,IAClB,GAAA,EACA;AACA,EAAA,IAAI,CAAC,SAAA,CAAU,GAAG,CAAA,EAAG;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,YAAY,CAAA,CAAE,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,QAAA,GAAWR,QAAQ,MAAM;AAC7B,IAAA,OAAO,cAAA,CAAe,GAAG,CAAA,IAAK,EAAE,SAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AAAA,EACxD,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,uBACEd,GAAAA;AAAA,MAACI,KAAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,OAAA,EAAS,kBAAA;AAAA,UACT,MAAA,EAAQ;AAAA,SACV;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,EAEJ;AAEA,EAAA,uBACEJ,GAAAA,CAACI,KAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,MAAA,EAAQ,MAAA,IAC3D,QAAA,kBAAAJ,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,MAAA;AAAA,QACX,SAAA,EAAW,MAAA;AAAA,QACX,QAAA,EAAU,MAAA;AAAA,QACV,QAAA,EAAU,UAAA;AAAA,QACV,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,WAAW,EAAE,cAAA,kBAAgBA,GAAAA,CAAC,qBAAkB,CAAA,EAAG;AAAA,MACnD,SAAA,EAAU;AAAA;AAAA,GACZ,EACF,CAAA;AAEJ;AAEA,IAAM,gBAAA,GAAmBsB,WAAW,iBAAiB,CAAA;AAMrD,SAAS,uBAAA,CACP,EAAE,GAAA,EAAI,EACN,GAAA,EACA;AACA,EAAA,uBACEtB,GAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA,EAAW,iBAAA;AAAA,MACX,YAAA,EAAa;AAAA;AAAA,GACf;AAEJ;AAEA,SAAS,mBAAA,CACP,EAAE,GAAA,EAAI,EACN,GAAA,EACA;AACA,EAAA,uBACEA,GAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA,EAAW,aAAA;AAAA,MACX,YAAA,EAAa;AAAA;AAAA,GACf;AAEJ;AAEO,IAAM,sBAAA,GAAyBsB,WAAW,uBAAuB,CAAA;AACjE,IAAM,kBAAA,GAAqBA,WAAW,mBAAmB,CAAA;AC7FzD,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,OAAM,GAAI,uBAAA,CAAgB,OAAO,KAAK,CAAA;AAClE,EAAA,MAAM,cAAc,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAE7C,EAAAX,UAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,CAAC,CAAC,MAAA,CAAO,WAAW,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,MAAA,EAAQ,mBAAmB,CAAC,CAAA;AAEhC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAOX,GAAAA,CAACI,KAAAA,EAAA,EAAI,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,IAAK,KAAA,EAAO;AACrC,IAAA,uBACEJ,GAAAA,CAACI,KAAAA,EAAA,EAAI,QAAA,EAAA,oEAAA,EAGL,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEJ,GAAAA,CAACI,KAAAA,EAAA,EAAI,IAAI,EAAE,CAAA,EAAG,MAAA,EAAO,EACnB,QAAA,kBAAAP,IAAAA,CAAC+C,WAAAA,EAAA,EAAY,WAAS,IAAA,EACpB,QAAA,EAAA;AAAA,oBAAA5C,GAAAA,CAAC6C,WAAA,EAAU,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,IAAK,QAAA,EAAA,6BAAA,EAA2B,CAAA;AAAA,oBACrDhD,IAAAA;AAAA,MAACiD,YAAAA;AAAA,MAAA;AAAA,QACC,OAAO,MAAA,CAAO,WAAA;AAAA,QACd,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,MAAM,MAAA,GAAS,EAAE,MAAA,CAAO,KAAA;AACxB,UAAA,eAAA,CAAgB,EAAE,GAAG,MAAA,EAAQ,WAAA,EAAa,QAAQ,CAAA;AAAA,QACpD,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA9C,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,UAC7B,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,qBAChBA,GAAAA,CAAC,QAAA,EAAA,EAAe,KAAA,EAAO,CAAA,EAAG,SAAA,EAAU,mBAAA,EACjC,QAAA,EAAA,CAAA,EAAA,EADU,CAEb,CACD;AAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;ACnCO,IAAM,cAAA,GAAiB,SAAA;AAiB9B,SAAS,kBAAA,CACP,MACA,eAAA,EACW;AACX,EAAA,MAAM,UAAA,GAAa,eAAA,GAAkB,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,MAAA;AACtD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAG,UAAU,CAAA;AAC9C,EAAA,MAAM,iBAAA,GACJ,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,EAAO,IAAA,KAAS,KAAA,GAAQ,IAAA,EAAM,CAAC,CAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAG,UAAU,CAAA;AAE9C,EAAA,OAAO,MAAA,CAAO,OAAO,CAAC,iBAAiB,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,KAAU;AAC1D,IAAA,MAAM,gBAAA,GAAmB,UAAU,MAAA,CAAO,MAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,gBAAA,GAAmB,iBAAA,GAAoB,MAAA,CAAO,KAAK,CAAA;AAEjE,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,cAAA,GAAiB,KAAA;AAErB,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,KAAA,GAAQ,UAAA;AACR,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB,CAAA,MAAA,IAAW,KAAK,IAAA,EAAM;AACpB,MAAA,KAAA,GAAQ,QAAA;AACR,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB,WAAW,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,WAAW,CAAA,EAAG;AAClD,MAAA,KAAA,GAAQ,SAAA;AACR,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,OAAO,CAAC,CAAA;AAAA,IAClB;AAEA,IAAA,OAAO;AAAA,MACL,gBAAA;AAAA,MACA,cAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA,EAAc,0BAA0B,KAAK,CAAA;AAAA,MAC7C,YAAA,EAAc,oBAAA,CAAqB,KAAA,GAAQ,IAAA,CAAK,MAAM,CAAA,IAAK;AAAA,KAC7D;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACxB,IAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACEA,GAAAA;AAAA,IAAC+C,QAAA;AAAA,IAAA;AAAA,MACC,KAAA,kBACElD,IAAAA,CAACO,KAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAP,IAAAA,CAACW,aAAA,EACC,QAAA,EAAA;AAAA,0BAAAR,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,iBAAA,EAAmB,CAAA;AAAA,UAAE,WAAA;AAAA,UAC9B,OAAA,CAAQ,KAAA;AAAA,UAAM,IAAA;AAAA,UAAG,OAAA,CAAQ,YAAA;AAAA,UAAa;AAAA,SAAA,EAClD,CAAA;AAAA,wBACAH,IAAAA,CAACW,WAAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAR,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,cAAA,EAAgB,CAAA;AAAA,UAAE,QAAA;AAAA,UAC9B,IAAA,CAAK,KAAA;AAAA,UAAM,IAAA;AAAA,UAAG,IAAA,CAAK,YAAA;AAAA,UAAa;AAAA,SAAA,EACzC;AAAA,OAAA,EACF,CAAA;AAAA,MAEF,KAAA,EAAK,IAAA;AAAA,MAEL,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAS;AAAA;AAAA,GAClB;AAEJ;AAEO,SAAS,mBAAA,CAAoB;AAAA,EAClC,QAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAEhB,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,QAAA,CAAS,OAAA,EAAS,eAAe,CAAA;AACrE,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,QAAA,CAAS,IAAA,EAAM,eAAe,CAAA;AAE/D,EAAA,uBACEH,IAAAA,CAACO,KAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAE,EACtC,QAAA,EAAA;AAAA,oBAAAP,IAAAA,CAACO,KAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,aAAA,EAAe,KAAA,EAAM,EACrE,QAAA,EAAA;AAAA,sBAAAJ,IAACI,KAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EAAG,CAAA;AAAA,sBACtBP,IAAAA;AAAA,QAACW,WAAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,IAAA;AAAA,UACV,IAAI,EAAE,QAAA,EAAU,YAAY,CAAA,EAAG,CAAA,EAAG,OAAO,MAAA,EAAO;AAAA,UAEhD,QAAA,EAAA;AAAA,4BAAAR,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,cAAA,EAAgB,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA,OACvC;AAAA,sBACAH,IAAAA;AAAA,QAACW,WAAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,IAAA;AAAA,UACV,IAAI,EAAE,QAAA,EAAU,YAAY,CAAA,EAAG,CAAA,EAAG,OAAO,MAAA,EAAO;AAAA,UAEhD,QAAA,EAAA;AAAA,4BAAAR,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,iBAAA,EAAmB,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA,OAC1C;AAAA,sBACAA,IAACI,KAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EAAG;AAAA,KAAA,EACxB,CAAA;AAAA,IACC,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,KAAU;AAChC,MAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,MAAA,IACE,QAAQ,gBAAA,IACR,OAAA,CAAQ,UAAU,CAAA,IAClB,IAAA,CAAK,UAAU,CAAA,EACf;AAEA,QAAA,uBAAOJ,GAAAA,CAAAO,QAAAA,EAAA,EAAE,CAAA;AAAA,MACX;AACA,MAAA,uBACEV,IAAAA,CAACU,UAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,gBAAA,EAAA,EAAiB,IAAA,EAAY,OAAA,EAC5B,QAAA,kBAAAH,IAAAA;AAAA,UAACO,KAAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI;AAAA,cACF,OAAA,EAAS,MAAA;AAAA,cACT,UAAA,EAAY,QAAA;AAAA,cACZ,KAAA,EAAO,MAAA;AAAA,cACP,SAAA,EAAW,EAAE,OAAA,EAAS,cAAA,EAAe;AAAA,cACrC,EAAA,EAAI;AAAA,aACN;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAJ,GAAAA;AAAA,gBAACQ,WAAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAI;AAAA,oBACF,KAAA,EAAO,MAAA;AAAA,oBACP,QAAA,EAAU,UAAA;AAAA,oBACV,KAAA,EAAO,OAAA,CAAQ,cAAA,GAAiB,UAAA,GAAa,SAAA;AAAA,oBAC7C,QAAA,EAAU,QAAA;AAAA,oBACV,YAAA,EAAc,UAAA;AAAA,oBACd,UAAA,EAAY;AAAA,mBACd;AAAA,kBAEC,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,eACX;AAAA,8BACAX,IAAAA;AAAA,gBAACO,KAAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAI;AAAA,oBACF,OAAA,EAAS,MAAA;AAAA,oBACT,KAAA,EAAO,KAAA;AAAA,oBACP,aAAA,EAAe;AAAA,mBACjB;AAAA,kBAGA,QAAA,EAAA;AAAA,oCAAAP,IAAAA,CAACO,OAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAM,EACxC,QAAA,EAAA;AAAA,sCAAAJ,GAAAA;AAAA,wBAAC,mBAAA;AAAA,wBAAA;AAAA,0BACC,WAAW,OAAA,CAAQ,KAAA;AAAA,0BACnB,WAAW,OAAA,CAAQ,KAAA;AAAA,0BACnB,MAAA,EAAQ,SAAS,OAAA,CAAQ,MAAA;AAAA,0BACzB,KAAA,EAAO;AAAA;AAAA,uBACT;AAAA,sCACAA,GAAAA;AAAA,wBAACQ,WAAAA;AAAA,wBAAA;AAAA,0BACC,EAAA,EAAI;AAAA,4BACF,EAAA,EAAI,GAAA;AAAA,4BACJ,EAAA,EAAI,CAAA;AAAA,4BACJ,QAAA,EAAU,UAAA;AAAA,4BACV,KAAA,EAAO;AAAA,2BACT;AAAA,0BAEC,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,uBACX;AAAA,sCACAR,GAAAA;AAAA,wBAACQ,WAAAA;AAAA,wBAAA;AAAA,0BACC,EAAA,EAAI;AAAA,4BACF,KAAA,EAAO,UAAA;AAAA,4BACP,QAAA,EAAU,UAAA;AAAA,4BACV,KAAA,EAAO;AAAA,2BACT;AAAA,0BAEC,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA;AACX,qBAAA,EACF,CAAA;AAAA,oCAEAX,IAAAA,CAACO,KAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAM,EACxC,QAAA,EAAA;AAAA,sCAAAJ,GAAAA;AAAA,wBAAC,mBAAA;AAAA,wBAAA;AAAA,0BACC,WAAW,IAAA,CAAK,KAAA;AAAA,0BAChB,WAAW,IAAA,CAAK,KAAA;AAAA,0BAChB,MAAA,EAAQ,SAAS,IAAA,CAAK,MAAA;AAAA,0BACtB,KAAA,EAAO;AAAA;AAAA,uBACT;AAAA,sCACAA,GAAAA;AAAA,wBAACQ,WAAAA;AAAA,wBAAA;AAAA,0BACC,EAAA,EAAI;AAAA,4BACF,EAAA,EAAI,GAAA;AAAA,4BACJ,EAAA,EAAI,CAAA;AAAA,4BACJ,QAAA,EAAU,UAAA;AAAA,4BACV,KAAA,EAAO;AAAA,2BACT;AAAA,0BAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,uBACR;AAAA,sCACAR,GAAAA;AAAA,wBAACQ,WAAAA;AAAA,wBAAA;AAAA,0BACC,EAAA,EAAI;AAAA,4BACF,KAAA,EAAO,UAAA;AAAA,4BACP,QAAA,EAAU,UAAA;AAAA,4BACV,KAAA,EAAO;AAAA,2BACT;AAAA,0BAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACR,qBAAA,EACF;AAAA;AAAA;AAAA;AACF;AAAA;AAAA,SACF,EACF,CAAA;AAAA,wBACAR,IAAC,OAAA,EAAA,EAAQ;AAAA,OAAA,EAAA,EAzFI,QAAQ,KA0FvB,CAAA;AAAA,IAEJ,CAAC;AAAA,GAAA,EACH,CAAA;AAEJ;AAoHO,SAAS,mBAAA,CAAoB;AAAA,EAClC,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,KAAA,GAAQ;AACV,CAAA,EAA6B;AAC3B,EAAAoB,KAAAA,CAAQ,QAAA,CAAS4B,aAAAA,EAAeC,UAAAA,EAAYC,WAAW,CAAA;AACvD,EAAA,MAAM,eAAe,qBAAA,CAAsB,SAAA,EAAW,MAAA,EAAQ,EAAE,WAAW,CAAA;AAC3E,EAAA,MAAM,YAAY,kBAAA,CAAmB;AAAA,IACnC,SAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,uBAAOlD,IAAC,GAAA,EAAA,EAAI,IAAA,EAAM,WAAW,OAAA,EAAS,YAAA,EAAc,OAAA,EAAS,EAAC,EAAG,CAAA;AACnE;AAKO,SAAS,qBAAA,CACd,OACA,MAAA,EACA,EAAE,GAAG,eAAA,EAAgB,GAAyB,EAAC,EAC1B;AACrB,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,IAAA;AAAA,IACZ,mBAAA,EAAqB,KAAA;AAAA,IACrB,SAAA,EAAW,GAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN,CAAA,EAAG;AAAA,QACD,OAAA,EAAS,KAAA;AAAA,QACT,GAAA,EAAK,MAAA;AAAA,QACL,IAAA,EAAM,EAAE,OAAA,EAAS,KAAA;AAAM,OACzB;AAAA,MACA,CAAA,EAAG;AAAA,QACD,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,OAAA,EAAS;AAAA,MACP,OAAA,EAAS;AAAA,QACP,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,GAAG;AAAA,GACL;AACF;AAIO,SAAS,kBAAA,CAAmB;AAAA,EACjC,SAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,EAA6E;AAC3E,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,CAAC,SAAS,CAAA;AAAA;AAAA,IAClB,QAAA,EAAU;AAAA,MACR;AAAA,QACE,SAAA,EAAW,GAAA;AAAA,QACX,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA;AAAA,QAChB,eAAA,EAAiB,KAAA;AAAA,QACjB,oBAAA,EAAsB,KAAA;AAAA,QACtB,WAAA,EAAa,CAAA;AAAA,QACb,WAAA,EAAa,KAAA;AAAA,QACb,aAAA,EAAe,CAAA;AAAA,QACf,kBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AACF;ACjaA,IAAM,yBAAA,GAA4B,CAChC,EAAE,GAAA,IACF,GAAA,KACG;AACH,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIN,SAAkB,IAAI,CAAA;AAEpE,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AAEnB,EAAA,MAAM,WAAW,MAAA,CAAO,IAAA;AACxB,EAAA,MAAM,cAAc,MAAA,CAAO,OAAA;AAE3B,EAAA,uBACEG,IAAAA,CAACO,KAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAO,EAClE,QAAA,EAAA;AAAA,oBAAAP,IAAAA,CAAC,aAAA,EAAA,EAAc,GAAA,EAAU,SAAA,EAAW,MAAA,EAClC,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAACW,WAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,IAAA;AAAA,UACR,IAAI,EAAE,EAAA,EAAI,GAAG,SAAA,EAAW,QAAA,EAAU,OAAO,UAAA,EAAW;AAAA,UACrD,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,YACQ,MAAA,CAAO,KAAA;AAAA,YAAM,GAAA;AAAA,YAAE,MAAA,CAAO;AAAA;AAAA;AAAA,OAC/B;AAAA,sBACAX,IAAAA,CAACM,MAAAA,EAAA,EAAM,SAAA,EAAU,KAAA,EAAM,YAAW,QAAA,EAChC,QAAA,EAAA;AAAA,wBAAAH,IAACI,KAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EAAG,CAAA;AAAA,wBACtBJ,GAAAA;AAAA,UAAC,mBAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,MAAA;AAAA,YACV,MAAA,EAAQ,YAAY,MAAA,IAAU,CAAA;AAAA,YAC9B;AAAA;AAAA,SACF;AAAA,wBACAA,IAACI,KAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EAAG;AAAA,OAAA,EACxB;AAAA,KAAA,EACF,CAAA;AAAA,oBACAJ,IAACI,KAAAA,EAAA,EAAI,IAAI,EAAE,IAAA,EAAM,GAAE,EAAG,CAAA;AAAA,IAAA,CACpB,QAAA,CAAS,OAAO,MAAA,GAAS,EAAA,IAAM,YAAY,MAAA,CAAO,MAAA,GAAS,uBAC3DJ,GAAAA,CAACI,OAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAG,CAAA,EAAG,cAAA,EAAgB,OAAA,EAAQ,EACxD,QAAA,kBAAAJ,GAAAA;AAAA,MAACmD,IAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,QAAA;AAAA,QACV,SAAS,MAAM;AACb,UAAA,kBAAA,CAAmB,CAAC,SAAA,KAAc,CAAC,SAAS,CAAA;AAAA,QAC9C,CAAA;AAAA,QACA,EAAA,EAAI,EAAE,KAAA,EAAO,eAAA,EAAiB,QAAQ,SAAA,EAAU;AAAA,QAE/C,4BAAkB,iBAAA,GAAoB;AAAA;AAAA,KACzC,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAA;AAEO,IAAM,kBAAA,GAAqB7B,WAAW,yBAAyB,CAAA;ACvCtE,IAAM,mCAAmC,CACvC;AAAA,EACE,GAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAEA,GAAA,KACG;AACH,EAAA,IAAI,CAAC,oBAAA,CAAqB,GAAG,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,WAAA,GAAcR,OAAAA;AAAA,IAClB,MAAM,aAAa,YAAA,IAAgB,KAAA;AAAA,IACnC,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,aAAA,GAAgBA,OAAAA;AAAA,IACpB,MAAM,WAAA,EAAa,cAAA,IAAkB,EAAC;AAAA,IACtC,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,WAAA,GAAcA,OAAAA;AAAA,IAClB,MAAM,aAAa,YAAA,IAAgB,QAAA;AAAA,IACnC,CAAC,WAAW;AAAA,GACd;AACA,EAAA,MAAM,iBAAA,GAAoBA,OAAAA;AAAA,IACxB,MAAM,WAAA,EAAa,iBAAA,IAAqB,EAAC;AAAA,IACzC,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,QAAA,GAAWA,QAAQ,MAAM;AAC7B,IAAA,MAAM,0BAAA,GAA6B,CACjC,IAAA,KACG;AACH,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,GAAI,WAAA,EAAa,iBAAA,IAAqB,EAAC;AAAA,QACvC,GAAG;AAAA,OACL;AACA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB;AAAA,UACnB,GAAG,WAAA;AAAA,UACH,iBAAA,EAAmB;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,0BAAA,GAA6B,CAACuB,cAAAA,KAA4B;AAC9D,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB;AAAA,UACnB,GAAG,WAAA;AAAA,UACH,cAAA,EAAgBA;AAAA,SACjB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,OACE,eAAe,GAAA,EAAK;AAAA,MAClB,WAAA;AAAA,MACA,aAAA;AAAA,MACA,qBAAA,EAAuB,0BAAA;AAAA,MACvB,iBAAA;AAAA,MACA,0BAAA;AAAA,MACA;AAAA,KACD,KAAK,EAAE,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AAAA,EAElC,CAAA,EAAG;AAAA,IACD,GAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,EAAQ,KAAA,IAAS,CAAA;AACnC,EAAA,MAAM,OAAA,GACJ,KAAA,GAAQ,CAAA,IAAK,GAAA,CAAI,MAAA,EAAQ,OACrB,CAAA,0CAAA,EAA6C,KAAA,CAAM,cAAA,EAAgB,CAAA,mHAAA,CAAA,GACnE,IAAA;AAEN,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,EACvB;AAEA,EAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACjC,IAAA,uBACErC,GAAAA;AAAA,MAACI,KAAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,MAAA,EAAQ;AAAA,SACV;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,EAEJ;AAEA,EAAA,IAAI,WAAA,IAAe,QAAA,CAAS,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC7C,IAAA,uBACEP,IAAAA;AAAA,MAACO,KAAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,OAAA,EAAS,MAAA;AAAA,UACT,aAAA,EAAe,QAAA;AAAA,UACf,OAAA,EAAS,oBAAA;AAAA,UACT,MAAA,EAAQ;AAAA,SACV;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAJ,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,GAAA;AAAA,cACA,WAAA;AAAA,cACA,oBAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,0BACAA,GAAAA;AAAA,YAACI,KAAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI;AAAA,gBACF,OAAA,EAAS,MAAA;AAAA,gBACT,UAAA,EAAY,QAAA;AAAA,gBACZ,cAAA,EAAgB,QAAA;AAAA,gBAChB,MAAA,EAAQ;AAAA,eACV;AAAA,cACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACEP,IAAAA;AAAA,IAACO,KAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,OAAA,EAAS,oBAAA;AAAA,QACT,MAAA,EAAQ;AAAA,OACV;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAP,IAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,WAAA;AAAA,YACA,oBAAA;AAAA,YACA,QAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAG,GAAAA;AAAA,gBAAC,qBAAA;AAAA,gBAAA;AAAA,kBACC,WAAA;AAAA,kBACA,oBAAA,EAAsB,CAACsC,YAAAA,KAAgB;AACrC,oBAAA,IAAI,oBAAA,EAAsB;AACxB,sBAAA,oBAAA,CAAqB;AAAA,wBACnB,GAAG,WAAA;AAAA,wBACH,YAAA,EAAcA;AAAA,uBACf,CAAA;AAAA,oBACH;AAAA,kBACF;AAAA;AAAA,eACF;AAAA,8BAEAtC,GAAAA;AAAA,gBAAC,mBAAA;AAAA,gBAAA;AAAA,kBACC,aAAa,WAAA,EAAa,YAAA;AAAA,kBAC1B,UAAU,MAAM;AACd,oBAAA,MAAM0C,YAAAA,GAAc,CAAC,WAAA,EAAa,YAAA;AAClC,oBAAA,IAAI,oBAAA,EAAsB;AACxB,sBAAA,oBAAA,CAAqB;AAAA,wBACnB,GAAG,WAAA;AAAA,wBACH,YAAA,EAAcA;AAAA,uBACf,CAAA;AAAA,oBACH;AAAA,kBACF;AAAA;AAAA;AACF;AAAA;AAAA,SACF;AAAA,wBACA1C,GAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,OAAO,EAAE,SAAA,EAAW,QAAQ,SAAA,EAAW,MAAA,EAAQ,UAAU,MAAA,EAAO;AAAA,YAChE,SAAS,QAAA,CAAS,OAAA;AAAA,YAClB,MAAM,QAAA,CAAS,IAAA;AAAA,YACf,SAAA,EAAW;AAAA,cACT,cAAA,kBACEA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,cAAa,oBAAA,EAAqB;AAAA,aAEzD;AAAA,YACA,sBAAsB,EAAE,SAAA,EAAW,MAAM,QAAA,EAAU,GAAA,EAAK,UAAU,EAAA,EAAG;AAAA,YACrE,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,GACF;AAEJ,CAAA;AAEO,IAAM,yBAAA,GAA4BsB,UAAAA;AAAA,EACvC;AACF,CAAA;ACzLO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI5B,QAAAA;AAAA,IAClC,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,QAAQ,MAAA,KAAW;AAAA,GAC/C;AAEA,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAE1B,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,UAAA,EAAY,cAAA;AAAA,IACZ,SAAA;AAAA,IACA;AAAA,GACF,GAAI,uBAAA,CAAgB,MAAA,CAAO,KAAK,CAAA;AAEhC,EAAAiB,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,cAAc,cAAA,EAAgB;AACjC,MAAA,eAAA,CAAgB;AAAA,QACd,GAAG,MAAA;AAAA,QACH,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,cAAA,EAAgB,MAAA,EAAQ,eAAe,CAAC,CAAA;AAExD,EAAAA,UAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,CAAC,EAAE,UAAA,IAAc,KAAA,CAAM,CAAA;AAAA,EAC7C,CAAA,EAAG,CAAC,UAAA,EAAY,KAAA,EAAO,mBAAmB,CAAC,CAAA;AAE3C,EAAA,MAAM,cAAc,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAG7C,EAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,UAAU,IACxC,UAAA,GACA,UAAA,GACE,CAAC,UAAU,CAAA,GACX,MAAA;AAEN,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAOX,GAAAA,CAACI,KAAAA,EAAA,EAAI,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,IAAK,KAAA,EAAO;AACrC,IAAA,uBACEJ,GAAAA,CAACI,KAAAA,EAAA,EAAI,QAAA,EAAA,oEAAA,EAGL,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEP,IAAAA,CAACM,MAAAA,EAAA,EAAM,OAAA,EAAS,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,UAAA,EAAY,EAAA,EAAI,OAAA,EAAQ,EAClD,QAAA,EAAA;AAAA,oBAAAN,IAAAA,CAACO,OAAA,EACC,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAACQ,WAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,IAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,OAAA,EAE3C,CAAA;AAAA,sBACAR,GAAAA;AAAA,QAACoD,SAAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAK,OAAA;AAAA,UACL,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,WAAW,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,MAAK;AAAE;AAAA;AACzC,KAAA,EACF,CAAA;AAAA,oBACAvD,IAAAA,CAACO,KAAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAACQ,WAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,IAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,aAAA,EAE3C,CAAA;AAAA,sBACAR,GAAAA;AAAA,QAACuB,YAAAA;AAAA,QAAA;AAAA,UACC,WAAA,EAAY,oBAAA;AAAA,UACZ,SAAA,EAAU,mBAAA;AAAA,UACV,OAAA,EAAO,IAAA;AAAA,UACP,iBAAA,EAAmB,KAAA;AAAA,UACnB,OAAA,EAAS,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE,CAAE,CAAA;AAAA,UACxD,KAAA,EAAA,CAAQ,WAAA,IAAe,EAAC,EACrB,MAAA,CAAO,CAAC,CAAA,KAAmB,CAAA,KAAM,MAAS,CAAA,CAC1C,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YACX,KAAA,EAAO,CAAA;AAAA,YACP,KAAA,EAAO;AAAA,WACT,CAAE,CAAA;AAAA,UACJ,QAAA,EAAU,CAAC,OAAA,KAAsC;AAC/C,YAAA,MAAM,eAAe,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,UAAU,EAAC;AACzD,YAAA,eAAA,CAAgB;AAAA,cACd,GAAG,MAAA;AAAA,cACH,WAAA,EACE,YAAA,CAAa,MAAA,IAAU,CAAA,GACnB,YAAA,CAAa,CAAC,CAAA,CAAE,KAAA,GAChB,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK;AAAA,aACtC,CAAA;AAAA,UACH,CAAA;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,SAAA,EAAW,CAAC,IAAA,MAA8B;AAAA,cACxC,GAAG,IAAA;AAAA,cACH,KAAA,EAAO;AAAA,aACT,CAAA;AAAA,YACA,OAAA,EAAS,CAAC,IAAA,MAA8B;AAAA,cACtC,GAAG,IAAA;AAAA,cACH,SAAA,EAAW;AAAA,aACb;AAAA;AACF;AAAA;AACF,KAAA,EACF,CAAA;AAAA,oBACA1B,IAAAA,CAACO,KAAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAACQ,WAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,IAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,SAAA,EAE3C,CAAA;AAAA,sBACAR,GAAAA;AAAA,QAACuC,gBAAAA;AAAA,QAAA;AAAA,UACC,yBACEvC,GAAAA;AAAA,YAACwC,QAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,UAAA;AAAA,cACT,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,aAAA,CAAc,CAAA,CAAE,OAAO,OAAO,CAAA;AAC9B,gBAAA,eAAA,CAAgB;AAAA,kBACd,GAAG,MAAA;AAAA,kBACH,OAAA,EAAS;AAAA,iBACV,CAAA;AAAA,cACH,CAAA;AAAA,cACA,IAAA,EAAK;AAAA;AAAA,WACP;AAAA,UAEF,KAAA,EAAM,aAAA;AAAA,UACN,EAAA,EAAI,EAAE,EAAA,EAAI,MAAA;AAAO;AAAA,OACnB;AAAA,MACC,CAAC,8BACAxC,GAAAA;AAAA,QAACuB,YAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAO,IAAA;AAAA,UACP,SAAA,EAAU,mBAAA;AAAA,UACV,iBAAA,EAAmB,KAAA;AAAA,UACnB,OAAA,EAAS,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE,CAAE,CAAA;AAAA,UACxD,QAAQ,MAAA,CAAO,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YACxC,KAAA,EAAO,CAAA;AAAA,YACP,KAAA,EAAO;AAAA,WACT,CAAE,CAAA;AAAA,UACF,QAAA,EAAU,CAAC,QAAA,KAAuC;AAChD,YAAA,IAAI,IAAA;AACJ,YAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAClC,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,GAC3B,EAAC;AACL,YAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,cAAA,IAAA,GAAO,MAAA;AAAA,YACT,CAAA,MAAO;AACL,cAAA,IAAA,GAAO,OAAA;AAAA,YACT;AACA,YAAA,eAAA,CAAgB;AAAA,cACd,GAAG,MAAA;AAAA,cACH,OAAA,EAAS;AAAA,aACV,CAAA;AAAA,UACH,CAAA;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,SAAA,EAAW,CAAC,IAAA,MAA8B;AAAA,cACxC,GAAG,IAAA;AAAA,cACH,KAAA,EAAO;AAAA,aACT,CAAA;AAAA,YACA,OAAA,EAAS,CAAC,IAAA,MAA8B;AAAA,cACtC,GAAG,IAAA;AAAA,cACH,SAAA,EAAW;AAAA,aACb;AAAA;AACF;AAAA;AACF,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AC3KA,SAAS,oBAAA,CACP,EAAE,GAAA,EAAI,EACN,GAAA,EACA;AACA,EAAA,IAAI,CAAC,cAAA,CAAe,GAAG,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,EAC/C;AAEA,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AAEnB,EAAA,MAAM,QAAA,GAAW,eAAe,GAAG,CAAA;AAEnC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,QAAA;AAE1B,EAAA,uBACE1B,IAAAA;AAAA,IAACO,KAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,GAAA,EAAK,KAAA;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,MAAA,EAAQ;AAAA,OACV;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAP,KAACO,KAAAA,EAAA,EAAI,IAAI,EAAE,EAAA,EAAI,QAAO,EAAG,QAAA,EAAA;AAAA,UAAA,SAAA;AAAA,UACf,MAAA,CAAO,KAAA;AAAA,UAAM,IAAA;AAAA,UAAG,OAAO,OAAA,CAAQ,KAAA;AAAA,UAAM,UAAA;AAAA,UAC5C,OAAO,OAAA,CAAQ,KAAA,GAAQ,OAAO,OAAA,CAAQ,KAAA,GAAQ,OAAO,OAAA,CAAQ,OAAA;AAAA,UAAS,GAAA;AAAA,UAAI,UAAA;AAAA,UAClE,OAAO,OAAA,CAAQ,KAAA;AAAA,UAAM,UAAA;AAAA,UAAS,OAAO,OAAA,CAAQ,OAAA;AAAA,UAAQ;AAAA,SAAA,EAChE,CAAA;AAAA,wBAEAJ,GAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,KAAA,EAAO;AAAA,cACL,SAAA,EAAW,MAAA;AAAA,cACX,SAAA,EAAW,MAAA;AAAA,cACX,QAAA,EAAU,MAAA;AAAA,cACV,WAAA,EAAa;AAAA,aACf;AAAA,YACA,OAAA;AAAA,YACA,IAAA;AAAA,YACA,WAAW,EAAE,cAAA,kBAAgBA,GAAAA,CAAC,qBAAkB,CAAA,EAAG;AAAA,YACnD,oBAAA,EAAsB,EAAE,SAAA,EAAW,IAAA,EAAK;AAAA,YACxC,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,GACF;AAEJ;AAEO,IAAM,mBAAA,GAAsBsB,WAAW,oBAAoB,CAAA;;;ACoDlE,IAAM,QAAA,GAAwB;AAAA,EAC5B,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,cAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,aAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,OAAA;AAAA,IACP,IAAA,EAAM,KAAA;AAAA,IACN,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,IAAA,EAAM,KAAA;AAAA,IACN,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,IAAA,EAAM,KAAA;AAAA,IACN,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,IAAA,EAAM,uBAAA;AAAA,IACN,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,uBAAA;AAAA,IACN,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,aAAA,EAAe,iBAAA;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,cAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,aAAA,EAAe,qBAAA;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,IAAA,EAAM,qBAAA;AAAA,IACN,aAAA,EAAe,mBAAA;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,KAAA,EAAO,mBAAA;AAAA,IACP,IAAA,EAAM,qBAAA;AAAA,IACN,aAAA,EAAe,yBAAA;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,aAAA,EAAe,kBAAA;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,gBAAA;AAAA,IACN,aAAA,EAAe,uBAAA;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,IAAA,EAAM;AAAA;AAAA,GAER;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM;AAAA;AAAA;AAGV,CAAA;AAEO,IAAM,aAAA,GAAgB,CAC3B,OAAA,KACmB;AACnB,EAAA,OAAO,SAAS,OAAO,CAAA;AACzB,CAAA;AC5KO,SAAS,cAAA,GAGd;AACA,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,WAAW,WAAA,EAAY;AAG7B,EAAA,MAAM,WAAA,GAAc3B,WAAAA;AAAA,IAClB,CAAC,IAAY,OAAA,KAA8B;AACzC,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,MAAA,CAAO,QAAQ,EAAA,EAAI,EAAE,QAAQ,OAAA,EAAS,MAAA,IAAU,MAAM,CAAA;AAAA,MACxD,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,KAAK,EAAA,EAAI,EAAE,QAAQ,OAAA,EAAS,MAAA,IAAU,MAAM,CAAA;AAAA,MACrD;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,OAAO,CAAC,UAAU,WAAW,CAAA;AAC/B;ACZO,IAAM,qBAAqBJ,aAAAA,CAAsC;AAAA,EACtE,WAAW,MAAM;AACf,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA,EACA,SAAA,EAAW,CAAC,KAAA,KAAkB;AAC5B,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA,EACA,eAAA,EAAiB,KAAA;AAAA,EACjB,gBAAgB,MAAM;AACpB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA,EACA,aAAA,EAAe,KAAA;AAAA,EACf,cAAc,MAAM;AAClB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA,EACA,aAAa,MAAM;AACjB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA,EACA,cAAA,EAAgB,CAAC,CAAA,KAAM;AACrB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA,EACA,gBAAgB,MAAM;AACpB,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAC,CAAA;AAMD,IAAM,mBAAA,GAAsB,CAAC,OAAA,KAAwB;AACnD,EAAA,MAAM,WAAW8D,WAAAA,EAAY;AAG7B,EAAA1C,UAAU,MAAM;AACd,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AACxB,CAAA;AAYO,SAAS,0BAAA,CAA2B;AAAA,EACzC;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIjB,QAAAA,EAA4B;AAGxD,EAAA,MAAM,CAAC,WAAA,EAAa,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,cAAcC,WAAAA,CAAY,MAAM,aAAa,IAAI,CAAA,EAAG,EAAE,CAAA;AAC5D,EAAA,MAAM,eAAeA,WAAAA,CAAY,MAAM,aAAa,KAAK,CAAA,EAAG,EAAE,CAAA;AAG9D,EAAA,MAAM,CAAC,eAAA,EAAiB,gBAAgB,CAAA,GAAID,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,mBAAmBC,WAAAA,CAAY,MAAM,iBAAiB,IAAI,CAAA,EAAG,EAAE,CAAA;AACrE,EAAA,MAAM,iBAAiBA,WAAAA,CAAY,MAAM,iBAAiB,KAAK,CAAA,EAAG,EAAE,CAAA;AAGpE,EAAA,MAAM,CAAC,aAAA,EAAe,cAAc,CAAA,GAAID,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,cAAcC,WAAAA,CAAY,MAAM,eAAe,IAAI,CAAA,EAAG,EAAE,CAAA;AAC9D,EAAA,MAAM,eAAeA,WAAAA,CAAY,MAAM,eAAe,KAAK,CAAA,EAAG,EAAE,CAAA;AAEhE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,QAAAA,EAAiB;AAC3C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,cAAA,EAAe;AAC/C,EAAA,MAAM,cAAc4D,cAAAA,EAAe;AAEnC,EAAA,MAAM,SAAA,GAAY3D,WAAAA;AAAA,IAChB,OAAO4D,QAAe,cAAA,KAA6B;AACjD,MAAA,QAAA,CAASA,MAAK,CAAA;AACd,MAAA,gBAAA,EAAiB;AAEjB,MAAA,IAAI,mBAAmB,KAAA,EAAO;AAC5B,QAAA,MAAM,YAAY,iBAAA,CAAkB,EAAE,UAAU,SAAA,CAAU,IAAA,IAAQ,CAAA;AAAA,MACpE;AAAA,IACF,CAAA;AAAA,IACA,CAAC,kBAAkB,WAAW;AAAA,GAChC;AAEA,EAAA,MAAM,cAAA,GAAiB5D,YAAY,MAAM;AACvC,IAAA,QAAA,CAAS,MAAS,CAAA;AAClB,IAAA,cAAA,EAAe;AAAA,EACjB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,MAAM,SAAA,GAAYA,WAAAA;AAAA,IAChB,OACE,IAAA,EACA,MAAA,EACA,OAAA,KACG;AACH,MAAA,IAAI;AACF,QAAA,MAAM,2BAAU,IAAI,IAAA,EAAK,EAAE,OAAA,GAAU,QAAA,EAAS;AAC9C,QAAA,IAAI,OAAA,GAAU,KAAA,CAAA;AACd,QAAA,IAAI,SAAS,QAAA,EAAU;AACrB,UAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAW,IAAA,EAAM,QAAQ,CAAC,CAAA;AAC7C,UAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,YAAA,OAAA,GAAU,KAAK,CAAC,CAAA;AAAA,UAClB;AAAA,QACF;AAEA,QAAA,MAAM,GAAA,GAAM,cAAc,IAAI,CAAA;AAC9B,QAAA,MAAM,gBAAgB,GAAA,CAAI,aAAA;AAG1B,QAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,GAAA;AAC3B,QAAA,IAAI,kBAAkB,KAAA,CAAA,EAAW;AAC/B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,IAAI,CAAA,4BAAA,CAA8B,CAAA;AAAA,QAChE;AAEA,QAAA,IAAI,OAAA,IAAW,KAAA,CAAA,IAAa,CAAC,OAAA,EAAS,QAAA,EAAU;AAC9C,UAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,SAAA,CAAU,MAAM,MAAA,EAAQ;AAAA,YAC/C,MAAA,EAAQ,IAAA;AAAA,YACR,YAAY,OAAA,EAAS;AAAA,WACtB,CAAA;AACD,UAAA,MAAM,UAAU,MAAM,CAAA;AACtB,UAAA,MAAM,YAAY,iBAAA,CAAkB,EAAE,UAAU,SAAA,CAAU,IAAA,IAAQ,CAAA;AAClE,UAAA,IAAI,QAAA,CAAS,UAAA,CAAW,UAAU,CAAA,EAAG;AACnC,YAAA,WAAA,CAAY,UAAU,CAAA;AAAA,UACxB;AAAA,QACF,CAAA,MAAO;AACL,UAAA,SAAA,CAAU;AAAA,YACR,OAAA;AAAA,YACA,KAAA;AAAA,YACA,IAAA;AAAA,YACA,MAAA;AAAA,YACA,OAAA;AAAA,YACA,OAAA;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,WAAA,EAAY;AAAA,QACd;AAAA,MACF,SAAS,CAAA,EAAY;AACnB,QAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,UACb,KAAA,EAAO,wBAAA;AAAA,UACP,WAAA,EAAa,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA;AAAA,UAC9C,IAAA,EAAM,OAAA;AAAA,UACN,QAAA,EAAU,GAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,SAAA,EAAW,QAAA,EAAU,aAAa,WAAW;AAAA,GAC7D;AACA,EAAA,mBAAA,CAAoB,YAAY,CAAA;AAEhC,EAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,EAAe,MAAA,KAA0B;AACpE,IAAA,IAAI;AACF,MAAA,YAAA,EAAa;AACb,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,SAAA,CAAU,MAAM,MAAA,EAAQ;AAAA,QAC/C,MAAA,EAAQ,IAAA;AAAA,QACR,UAAA,EAAY,QAAQ,OAAA,EAAS;AAAA,OAC9B,CAAA;AACD,MAAA,MAAM,UAAU,MAAM,CAAA;AAAA,IACxB,SAAS,CAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,QACb,KAAA,EAAO,wBAAA;AAAA,QACP,WAAA,EAAa,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA;AAAA,QAC9C,IAAA,EAAM,OAAA;AAAA,QACN,QAAA,EAAU,GAAA;AAAA,QACV,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,uBACEE,IAAAA;AAAA,IAAC,kBAAA,CAAmB,QAAA;AAAA,IAAnB;AAAA,MACC,KAAA,EAAO;AAAA,QACL,SAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,eAAA;AAAA,QACA,cAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,MAAA,oBACCG,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,MAAA,EAAQ,WAAA;AAAA,YACR,OAAA,EAAS,YAAA;AAAA,YACT,SAAA,EAAW,aAAA;AAAA,YACX,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,YAAY,MAAA,CAAO,OAAA;AAAA,YACnB,SACE,MAAA,CAAO,OAAA,EAAS,YAAY,MAAA,CAAO,OAAA,GAC/B,OAAO,OAAA,GACP;AAAA,WAAA;AAAA,UAXD,MAAA,CAAO;AAAA,SAad;AAAA,QAED;AAAA;AAAA;AAAA,GACH;AAEJ;AAEO,IAAM,qBAAA,GAAwB,MAAMR,UAAAA,CAAW,kBAAkB;ACrPxE,IAAM,oBAAoBD,aAAAA,CAA4B;AAAA,EACpD,qBAAA,EAAuB,EAAA;AAAA,EACvB,0BAA0B,MAAM;AAC9B,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAC,CAAA;AAEM,SAAS,yBAAA,CAA0B,EAAE,QAAA,EAAS,EAAsB;AACzE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIwC,OAAAA,CAAM,SAAiB,EAAE,CAAA;AACnE,EAAA,uBACE/B,GAAAA;AAAA,IAAC,iBAAA,CAAkB,QAAA;AAAA,IAAlB;AAAA,MACC,KAAA,EAAO;AAAA,QACL,wBAAA,EAA0B,gBAAA;AAAA,QAC1B,qBAAA,EAAuB;AAAA,OACzB;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAEO,IAAM,oBAAA,GAAuB,MAAMR,UAAAA,CAAW,iBAAiB;ACnB/D,IAAM,eAAA,GAAkB,oCAAA;AAE/B,IAAM,mBAAA,GAAoC;AAAA,EACxC,QAAA,EAAU,eAAA;AAAA,EACV,aAAa,MAAM;AACjB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA,EACA,WAAA,EAAa,MAAA;AAAA,EACb,gBAAgB,MAAM;AACpB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA,EACA,eAAA,EAAiB,KAAA;AAAA,EACjB,kBAAkB,MAAM;AACtB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA,EACA,YAAA,EAAc,eAAA;AAAA,EACd,iBAAiB,MAAM;AACrB,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,iBAAA,GAAoBD,cAAc,mBAAmB,CAAA;AAMpD,SAAS,yBAAA,CAA0B,EAAE,QAAA,EAAS,EAAsB;AACzE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIwC,OAAAA,CAAM,SAAiB,eAAe,CAAA;AACtE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAClCA,OAAAA,CAAM,SAAiB,eAAe,CAAA;AACxC,EAAA,MAAM,CAAC,eAAA,EAAiB,gBAAgB,CAAA,GAAIA,OAAAA,CAAM,SAAkB,KAAK,CAAA;AACzE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAM,QAAA,EAA+B;AAC3E,EAAA,uBACE/B,GAAAA;AAAA,IAAC,iBAAA,CAAkB,QAAA;AAAA,IAAlB;AAAA,MACC,KAAA,EAAO;AAAA,QACL,WAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA;AAAA,QACA,WAAA;AAAA,QACA,eAAA;AAAA,QACA,gBAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAEO,IAAM,oBAAA,GAAuB,MAAMR,UAAAA,CAAW,iBAAiB;AAOtE,IAAM,2BAAA,GAAoD;AAAA,EACxD,iBAAiB,EAAC;AAAA,EAClB,oBAAoB,MAAM;AACxB,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,oBAAA,GAAuBD,cAAc,2BAA2B,CAAA;AAM/D,SAAS,4BAAA,CAA6B;AAAA,EAC3C;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,IAAIwC,OAAAA,CAAM,QAAA,CAAmB,EAAE,CAAA;AACzE,EAAA,uBACE/B,GAAAA;AAAA,IAAC,oBAAA,CAAqB,QAAA;AAAA,IAArB;AAAA,MACC,KAAA,EAAO,EAAE,eAAA,EAAiB,kBAAA,EAAmB;AAAA,MAE5C;AAAA;AAAA,GACH;AAEJ;AAEO,IAAM,uBAAA,GAA0B,MAAMR,UAAAA,CAAW,oBAAoB;ACU5E,eAAsB,UAAA,GAA0C;AAC9D,EAAA,OAAA,CACE,MAAM,WAAA,CAAY,IAAA;AAAA,IAChB;AAAA,GACF,EACA,IAAA;AACJ;ACvGA,IAAM,UAAA,GAAaD,cAA2C,MAAS,CAAA;AAEhE,SAAS,8BAAA,CAA+B;AAAA,EAC7C;AACF,CAAA,EAEG;AACD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIG,QAAAA,EAAiB;AACjD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,QAAAA,EAAiB;AAE3C,EAAA,MAAM,mBAAmB,YAAY;AACnC,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,MAAS,CAAA;AAClB,IAAA,WAAA,CAAY,MAAS,CAAA;AACrB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,UAAA,EAAW;AAClC,MAAA,IAAI,QAAA,CAAS,WAAW,SAAA,EAAW;AACjC,QAAA,QAAA,CAAS,SAAS,OAAO,CAAA;AACzB,QAAA;AAAA,MACF;AACA,MAAA,WAAA,CAAY,SAAS,SAAS,CAAA;AAAA,IAChC,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAU,IAAc,OAAO,CAAA;AAAA,IACjC,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEM,GAAAA;AAAA,IAAC,UAAA,CAAW,QAAA;AAAA,IAAX;AAAA,MACC,KAAA,EAAO,EAAE,QAAA,EAAU,SAAA,EAAW,OAAO,gBAAA,EAAiB;AAAA,MAErD;AAAA;AAAA,GACH;AAEJ;AAEO,IAAM,4BAA4B,MAAM;AAC7C,EAAA,MAAM,OAAA,GAAUR,WAAW,UAAU,CAAA;AACrC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;ACzCe,SAAR,oBAAA,CAAsC,EAAE,QAAA,EAAS,EAAsB;AAC5E,EAAA,uBACEQ,GAAAA,CAAC,yBAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,8BAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,yBAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,2BAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,4BAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,0BAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,yBAAA,EAAA,EACE,QAAA,EACH,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA;AAEJ","file":"hooks.mjs","sourcesContent":["export const cacheKeys = {\n rowCount: (model: string) => [\"row_count\", model],\n lineage: () => [\"lineage\"],\n checks: () => [\"checks\", \"list\"],\n check: (checkId: string) => [\"checks\", checkId],\n checkEvents: (checkId: string) => [\"checks\", checkId, \"events\"],\n runs: () => [\"runs\"],\n run: (runId: string) => [\"runs\", runId],\n runsAggregated: () => [\"runs_aggregated\"],\n flag: () => [\"flag\"],\n instanceInfo: () => [\"instance_info\"],\n user: () => [\"user\"],\n};\n","let apiUrl = process.env.NEXT_PUBLIC_API_URL;\napiUrl ??= typeof window !== \"undefined\" ? window.location.origin : \"\";\n\nexport const PUBLIC_API_URL = apiUrl;\n\nlet cloudWebUrl = process.env.NEXT_PUBLIC_CLOUD_WEB_URL;\ncloudWebUrl ??= \"https://cloud.datarecce.io\";\n\nexport const PUBLIC_CLOUD_WEB_URL = cloudWebUrl;\n","import { QueryClient } from \"@tanstack/react-query\";\nimport axios from \"axios\";\nimport { PUBLIC_API_URL } from \"@/lib/const\";\n\nexport const axiosClient = axios.create({\n baseURL: PUBLIC_API_URL,\n});\n\nexport const reactQueryClient = new QueryClient();\n","import { AxiosResponse } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\n\nexport interface RecceInstanceInfo {\n server_mode: \"server\" | \"preview\" | \"read-only\";\n single_env: boolean;\n authed: boolean;\n cloud_instance: boolean;\n lifetime_expired_at?: Date;\n idle_timeout?: number;\n share_url?: string;\n session_id?: string;\n organization_name?: string;\n web_url?: string;\n}\n\nexport async function getRecceInstanceInfo(): Promise<RecceInstanceInfo> {\n return (\n await axiosClient.get<never, AxiosResponse<RecceInstanceInfo>>(\n \"/api/instance-info\",\n )\n ).data;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { cacheKeys } from \"../api/cacheKeys\";\nimport { getRecceInstanceInfo, RecceInstanceInfo } from \"../api/instanceInfo\";\n\nexport const useRecceInstanceInfo = () => {\n return useQuery<RecceInstanceInfo>({\n queryKey: cacheKeys.instanceInfo(),\n queryFn: getRecceInstanceInfo,\n });\n};\n","\"use client\";\n\nimport Alert from \"@mui/material/Alert\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useState,\n} from \"react\";\n\n/**\n * Toast types and interfaces\n */\nexport interface ToastOptions {\n id?: string;\n title?: string;\n description?: ReactNode;\n type?: \"success\" | \"error\" | \"warning\" | \"info\" | \"loading\";\n duration?: number;\n closable?: boolean;\n action?: {\n label: string;\n onClick: () => void;\n };\n}\n\ninterface ToastState extends ToastOptions {\n id: string;\n open: boolean;\n}\n\ninterface ToasterContextValue {\n toast: (options: ToastOptions) => string;\n success: (options: Omit<ToastOptions, \"type\">) => string;\n error: (options: Omit<ToastOptions, \"type\">) => string;\n warning: (options: Omit<ToastOptions, \"type\">) => string;\n info: (options: Omit<ToastOptions, \"type\">) => string;\n loading: (options: Omit<ToastOptions, \"type\">) => string;\n dismiss: (id: string) => void;\n update: (id: string, options: Partial<ToastOptions>) => void;\n}\n\nconst ToasterContext = createContext<ToasterContextValue | null>(null);\n\nlet toastIdCounter = 0;\n\n/**\n * Simple toaster implementation using MUI Snackbar\n */\nexport function ToasterProvider({ children }: { children: ReactNode }) {\n const [toasts, setToasts] = useState<ToastState[]>([]);\n\n const createToast = useCallback((options: ToastOptions): string => {\n const id = options.id || `toast-${++toastIdCounter}`;\n const newToast: ToastState = {\n id,\n open: true,\n duration: options.type === \"loading\" ? null : (options.duration ?? 5000),\n closable: options.closable ?? true,\n ...options,\n } as ToastState;\n\n setToasts((prev) => {\n // Remove existing toast with same id\n const filtered = prev.filter((t) => t.id !== id);\n return [...filtered, newToast];\n });\n\n return id;\n }, []);\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) =>\n prev.map((t) => (t.id === id ? { ...t, open: false } : t)),\n );\n // Remove after animation\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, 300);\n }, []);\n\n const update = useCallback((id: string, options: Partial<ToastOptions>) => {\n setToasts((prev) =>\n prev.map((t) => (t.id === id ? { ...t, ...options } : t)),\n );\n }, []);\n\n const contextValue: ToasterContextValue = {\n toast: createToast,\n success: (opts) => createToast({ ...opts, type: \"success\" }),\n error: (opts) => createToast({ ...opts, type: \"error\" }),\n warning: (opts) => createToast({ ...opts, type: \"warning\" }),\n info: (opts) => createToast({ ...opts, type: \"info\" }),\n loading: (opts) => createToast({ ...opts, type: \"loading\" }),\n dismiss,\n update,\n };\n\n return (\n <ToasterContext.Provider value={contextValue}>\n {children}\n {toasts.map((toast) => (\n <Snackbar\n key={toast.id}\n open={toast.open}\n autoHideDuration={toast.duration}\n onClose={() => toast.closable && dismiss(toast.id)}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n >\n <Alert\n severity={toast.type === \"loading\" ? \"info\" : toast.type || \"info\"}\n onClose={toast.closable ? () => dismiss(toast.id) : undefined}\n icon={\n toast.type === \"loading\" ? (\n <CircularProgress size={20} color=\"inherit\" />\n ) : undefined\n }\n sx={{ width: \"100%\", minWidth: 300 }}\n >\n <Stack spacing={0.5}>\n {toast.title && (\n <Typography variant=\"subtitle2\" fontWeight=\"bold\">\n {toast.title}\n </Typography>\n )}\n {toast.description && (\n <Typography variant=\"body2\" component=\"div\">\n {toast.description}\n </Typography>\n )}\n </Stack>\n </Alert>\n </Snackbar>\n ))}\n </ToasterContext.Provider>\n );\n}\n\n/**\n * Hook to use the toaster\n */\nexport function useToaster(): ToasterContextValue {\n const context = useContext(ToasterContext);\n if (!context) {\n throw new Error(\"useToaster must be used within ToasterProvider\");\n }\n return context;\n}\n\n/**\n * Standalone toaster instance for use outside React context\n * Uses a simple event-based system\n */\ninterface ToastEvent {\n type: \"create\" | \"dismiss\" | \"update\";\n options?: ToastOptions;\n id?: string;\n}\n\nconst listeners: Set<(event: ToastEvent) => void> = new Set();\n\nexport const toaster = {\n create: (options: ToastOptions): string => {\n const id = options.id || `toast-${++toastIdCounter}`;\n listeners.forEach((listener) =>\n listener({ type: \"create\", options: { ...options, id } }),\n );\n return id;\n },\n success: (options: Omit<ToastOptions, \"type\">) =>\n toaster.create({ ...options, type: \"success\" }),\n error: (options: Omit<ToastOptions, \"type\">) =>\n toaster.create({ ...options, type: \"error\" }),\n warning: (options: Omit<ToastOptions, \"type\">) =>\n toaster.create({ ...options, type: \"warning\" }),\n info: (options: Omit<ToastOptions, \"type\">) =>\n toaster.create({ ...options, type: \"info\" }),\n loading: (options: Omit<ToastOptions, \"type\">) =>\n toaster.create({ ...options, type: \"loading\" }),\n dismiss: (id: string) => {\n listeners.forEach((listener) => listener({ type: \"dismiss\", id }));\n },\n // Alias for dismiss (for backward compatibility)\n remove: (id: string) => {\n listeners.forEach((listener) => listener({ type: \"dismiss\", id }));\n },\n update: (id: string, options: Partial<ToastOptions>) => {\n listeners.forEach((listener) => listener({ type: \"update\", id, options }));\n },\n subscribe: (listener: (event: ToastEvent) => void) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n};\n\n/**\n * Toaster component that renders toasts from the standalone toaster\n */\nexport function Toaster() {\n const [toasts, setToasts] = useState<ToastState[]>([]);\n\n // Subscribe to toast events\n useState(() => {\n const unsubscribe = toaster.subscribe((event) => {\n if (event.type === \"create\" && event.options) {\n const newToast: ToastState = {\n id: event.options.id || `toast-${++toastIdCounter}`,\n open: true,\n duration:\n event.options.type === \"loading\"\n ? undefined\n : (event.options.duration ?? 5000),\n closable: event.options.closable ?? true,\n ...event.options,\n } as ToastState;\n setToasts((prev) => {\n const filtered = prev.filter((t) => t.id !== newToast.id);\n return [...filtered, newToast];\n });\n } else if (event.type === \"dismiss\" && event.id) {\n const id = event.id;\n setToasts((prev) =>\n prev.map((t) => (t.id === id ? { ...t, open: false } : t)),\n );\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, 300);\n } else if (event.type === \"update\" && event.id && event.options) {\n setToasts((prev) =>\n prev.map((t) => (t.id === event.id ? { ...t, ...event.options } : t)),\n );\n }\n });\n return unsubscribe;\n });\n\n const handleClose = (id: string) => {\n setToasts((prev) =>\n prev.map((t) => (t.id === id ? { ...t, open: false } : t)),\n );\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, 300);\n };\n\n return (\n <>\n {toasts.map((toast) => (\n <Snackbar\n key={toast.id}\n open={toast.open}\n autoHideDuration={toast.duration}\n onClose={() => toast.closable && handleClose(toast.id)}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n >\n <Alert\n severity={toast.type === \"loading\" ? \"info\" : toast.type || \"info\"}\n onClose={toast.closable ? () => handleClose(toast.id) : undefined}\n icon={\n toast.type === \"loading\" ? (\n <CircularProgress size={20} color=\"inherit\" />\n ) : undefined\n }\n sx={{ width: \"100%\", minWidth: 300 }}\n >\n <Stack spacing={0.5}>\n {toast.title && (\n <Typography variant=\"subtitle2\" fontWeight=\"bold\">\n {toast.title}\n </Typography>\n )}\n {toast.description && (\n <Typography variant=\"body2\" component=\"div\">\n {toast.description}\n </Typography>\n )}\n </Stack>\n </Alert>\n </Snackbar>\n ))}\n </>\n );\n}\n","import { toaster } from \"@/components/ui/toaster\";\n\nexport function useCheckToast() {\n function markedAsApprovedToast() {\n toaster.create({\n title: \"Marked as approved\",\n type: \"success\",\n duration: 2000,\n });\n }\n return {\n markedAsApprovedToast,\n };\n}\n","import { toaster } from \"@/components/ui/toaster\";\n\nexport function useClipBoardToast() {\n function successToast(message: string) {\n toaster.create({\n description: message,\n type: \"info\",\n duration: 5000,\n closable: true,\n });\n }\n\n function failToast(title: string, error: unknown) {\n toaster.create({\n title: title,\n description: String(error),\n type: \"error\",\n duration: 5000,\n closable: true,\n });\n }\n\n return {\n successToast,\n failToast,\n };\n}\n","import React, { createContext, useContext } from \"react\";\nimport { CllInput, ColumnLineageData } from \"@/lib/api/cll\";\nimport { LineageDiffViewOptions } from \"@/lib/api/lineagecheck\";\nimport { Run } from \"@/lib/api/types\";\nimport { LineageGraphNode, LineageGraphNodes } from \"./lineage\";\n\ntype NewType = LineageDiffViewOptions;\ntype ActionMode = \"per_node\" | \"multi_nodes\";\n\ninterface NodeAction {\n mode: ActionMode;\n status?: \"pending\" | \"running\" | \"success\" | \"failure\" | \"skipped\";\n skipReason?: string;\n run?: Run;\n}\n\nexport interface ActionState {\n mode: ActionMode;\n status: \"pending\" | \"running\" | \"canceling\" | \"canceled\" | \"completed\";\n currentRun?: Partial<Run>;\n completed: number;\n total: number;\n actions: Record<string, NodeAction>;\n}\n\nexport interface LineageViewContextType {\n interactive: boolean;\n nodes: LineageGraphNodes[];\n focusedNode?: LineageGraphNode;\n selectedNodes: LineageGraphNode[];\n cll: ColumnLineageData | undefined;\n\n // context menu\n showContextMenu: (event: React.MouseEvent, node: LineageGraphNodes) => void;\n\n // filter\n viewOptions: LineageDiffViewOptions;\n onViewOptionsChanged: (options: NewType) => void;\n\n // Multi nodes selection\n selectMode: \"selecting\" | \"action_result\" | undefined;\n selectNode: (nodeId: string) => void;\n selectParentNodes: (nodeId: string, degree?: number) => void;\n selectChildNodes: (nodeId: string, degree?: number) => void;\n deselect: () => void;\n\n // node state\n isNodeHighlighted: (nodeId: string) => boolean;\n isNodeSelected: (nodeId: string) => boolean;\n isEdgeHighlighted: (source: string, target: string) => boolean;\n getNodeAction: (nodeId: string) => NodeAction;\n getNodeColumnSet: (nodeId: string) => Set<string>;\n isNodeShowingChangeAnalysis: (nodeId: string) => boolean;\n\n //actions\n runRowCount: () => Promise<void>;\n runRowCountDiff: () => Promise<void>;\n runValueDiff: () => Promise<void>;\n addLineageDiffCheck: (viewMode?: string) => void;\n addSchemaDiffCheck: () => void;\n cancel: () => void;\n actionState: ActionState;\n\n // Column Level Lineage\n centerNode: (nodeId: string) => void;\n showColumnLevelLineage: (cll?: CllInput) => Promise<void>;\n resetColumnLevelLineage: (previous?: boolean) => Promise<void>;\n}\n\nexport const LineageViewContext = createContext<\n LineageViewContextType | undefined\n>(undefined);\n\nexport const useLineageViewContextSafe = (): LineageViewContextType => {\n const context = useContext(LineageViewContext);\n if (!context) {\n throw new Error(\n \"useLineageViewContext must be used within a LineageViewProvider\",\n );\n }\n return context;\n};\n\nexport const useLineageViewContext = (): LineageViewContextType | undefined => {\n return useContext(LineageViewContext);\n};\n","import {\n AmplitudeReturn,\n BaseEvent,\n EventOptions,\n Result,\n} from \"@amplitude/analytics-core\";\nimport { initAll, track as trk } from \"@amplitude/unified\";\n\nfunction track(\n eventInput: string | BaseEvent,\n // biome-ignore lint/suspicious/noExplicitAny: Amplitude library uses any for event properties\n eventProperties?: Record<string, any> | undefined,\n eventOptions?: EventOptions | undefined,\n): AmplitudeReturn<Result> {\n // If Amplitude isn't initialized, log to console instead\n if (!amplitudeInitialized) {\n console.log(\"[Tracking]\", eventInput, eventProperties, eventOptions);\n }\n return trk(eventInput, eventProperties, eventOptions);\n}\n\nlet amplitudeInitialized = false;\n\nexport function trackInit() {\n function getCookie(key: string) {\n const b = document.cookie.match(\"(^|;)\\\\s*\" + key + \"\\\\s*=\\\\s*([^;]+)\");\n return b ? b.pop() : \"\";\n }\n\n const userId =\n process.env.NODE_ENV === \"development\"\n ? \"web_dev\"\n : getCookie(\"recce_user_id\");\n const apiKey = process.env.AMPLITUDE_API_KEY;\n if (userId && apiKey) {\n try {\n void initAll(apiKey, {\n analytics: {\n userId,\n autocapture: true,\n },\n sessionReplay: {\n sampleRate: 1,\n },\n });\n amplitudeInitialized = true;\n } catch (e) {\n console.error(e);\n }\n }\n\n // Log when Amplitude is not initialized (for development/debugging)\n if (!amplitudeInitialized) {\n console.log(\n \"[Tracking] Amplitude not initialized (missing API key or user ID). Events will be logged to console instead.\",\n );\n }\n}\n\ninterface MultiNodeActionProps {\n type:\n | \"row_count\"\n | \"row_count_diff\"\n | \"value_diff\"\n | \"schema_diff\"\n | \"lineage_diff\";\n selected: \"single\" | \"multi\" | \"none\";\n}\n\nexport function trackMultiNodesAction(props: MultiNodeActionProps) {\n track(\"[Web] multi_nodes_action\", props);\n}\n\ninterface HistoryActionProps {\n name: \"show\" | \"hide\" | \"click_run\" | \"add_to_checklist\" | \"go_to_check\";\n}\n\nexport function trackHistoryAction(props: HistoryActionProps) {\n track(\"[Web] history_action\", props);\n}\n\ninterface PreviewChangeProps {\n action: \"explore\" | \"run\" | \"close\";\n node?: string;\n status?: \"success\" | \"failure\";\n}\n\nexport function trackPreviewChange(props: PreviewChangeProps) {\n track(\"[Experiment] preview_change\", props);\n}\n\ninterface PreviewChangeFeedbackProps {\n feedback: \"like\" | \"dislike\" | \"form\";\n node?: string;\n}\n\nexport function trackPreviewChangeFeedback(props: PreviewChangeFeedbackProps) {\n track(\"[Experiment] preview_change\", props);\n}\n\ninterface SingleEnvironmentProps {\n action:\n | \"onboarding\"\n | \"external_link\"\n | \"preview_changes\"\n | `target_base_added`;\n from?: \"onboarding\" | \"preview_changes\";\n node?: string;\n}\n\nexport function trackSingleEnvironment(props: SingleEnvironmentProps) {\n track(\"[Experiment] single_environment\", props);\n}\n\nexport function getExperimentTrackingBreakingChangeEnabled() {\n return false;\n}\n\ninterface ColumnLevelLineageProps {\n action: \"view\";\n source: \"schema_column\" | \"changed_column\" | \"cll_column\";\n}\n\nexport function trackColumnLevelLineage(props: ColumnLevelLineageProps) {\n track(\"[Web] column_level_lineage\", props);\n}\n\ninterface ShareStateProps {\n name: \"enable\" | \"create\" | \"copy\";\n}\n\nexport function trackShareState(props: ShareStateProps) {\n track(\"[Web] share_state\", props);\n}\n\ninterface StateActionProps {\n name: \"import\" | \"export\";\n}\n\nexport function trackStateAction(props: StateActionProps) {\n track(\"[Web] state_action\", props);\n}\n\ninterface CopyToClipboardProps {\n from: \"run\" | \"check\" | \"lineage_view\";\n type: string;\n}\n\nexport function trackCopyToClipboard(props: CopyToClipboardProps) {\n track(\"[Click] copy_to_clipboard\", props);\n}\n\ninterface TrackNavProps {\n from: string;\n to: string;\n}\n\nexport function trackNavigation(props: TrackNavProps) {\n track(\"[Web] navigation_change\", props);\n}\n\nexport interface LineageViewRenderProps {\n node_count: number;\n view_mode: string;\n impact_radius_enabled: boolean;\n cll_column_active?: boolean;\n right_sidebar_open: boolean;\n [status: string]: number | string | boolean | undefined;\n}\n\nexport function trackLineageViewRender(props: LineageViewRenderProps) {\n track(\"[Web] lineage_view_render\", props);\n}\n\nexport interface EnvironmentConfigProps {\n review_mode: boolean;\n adapter_type: string | null;\n has_git_info: boolean;\n has_pr_info: boolean;\n // Adapter-specific (shape varies by adapter_type)\n base?: {\n schema_count?: number;\n dbt_version?: string | null;\n timestamp?: string | null;\n has_env?: boolean;\n };\n current?: {\n schema_count?: number;\n dbt_version?: string | null;\n timestamp?: string | null;\n has_env?: boolean;\n };\n schemas_match?: boolean;\n}\n\nexport function trackEnvironmentConfig(props: EnvironmentConfigProps) {\n track(\"[Web] environment_config\", props);\n}\n\n// Explore action types\nexport const EXPLORE_ACTION = {\n ROW_COUNT: \"row_count\",\n ROW_COUNT_DIFF: \"row_count_diff\",\n PROFILE: \"profile\",\n PROFILE_DIFF: \"profile_diff\",\n VALUE_DIFF: \"value_diff\",\n SCHEMA_DIFF: \"schema_diff\",\n LINEAGE_DIFF: \"lineage_diff\",\n QUERY: \"query\",\n HISTOGRAM_DIFF: \"histogram_diff\",\n TOP_K_DIFF: \"top_k_diff\",\n} as const;\n\n// Explore action sources\nexport const EXPLORE_SOURCE = {\n LINEAGE_VIEW_TOP_BAR: \"lineage_view_top_bar\",\n LINEAGE_VIEW_CONTEXT_MENU: \"lineage_view_context_menu\",\n NODE_KEBAB_MENU: \"node_kebab_menu\",\n NODE_SIDEBAR_SINGLE_ENV: \"node_sidebar_single_env\",\n NODE_SIDEBAR_MULTI_ENV: \"node_sidebar_multi_env\",\n SCHEMA_ROW_COUNT_BUTTON: \"schema_row_count_button\",\n SCHEMA_COLUMN_MENU: \"schema_column_menu\",\n} as const;\n\nexport type ExploreActionType =\n (typeof EXPLORE_ACTION)[keyof typeof EXPLORE_ACTION];\nexport type ExploreSourceType =\n (typeof EXPLORE_SOURCE)[keyof typeof EXPLORE_SOURCE];\n\ninterface ExploreActionProps {\n action: ExploreActionType;\n source: ExploreSourceType;\n node_count?: number;\n}\n\nexport function trackExploreAction(props: ExploreActionProps) {\n track(\"[Web] explore_action\", props);\n}\n\n// Explore action form events\nexport const EXPLORE_FORM_EVENT = {\n EXECUTE: \"execute\",\n CANCEL: \"cancel\",\n} as const;\n\nexport type ExploreFormEventType =\n (typeof EXPLORE_FORM_EVENT)[keyof typeof EXPLORE_FORM_EVENT];\n\ninterface ExploreActionFormProps {\n action: ExploreActionType;\n event: ExploreFormEventType;\n}\n\nexport function trackExploreActionForm(props: ExploreActionFormProps) {\n track(\"[Web] explore_action_form\", props);\n}\n\n// Helper to check if a run type is an explore action\nexport function isExploreAction(type: string): type is ExploreActionType {\n return Object.values(EXPLORE_ACTION).includes(type as ExploreActionType);\n}\n\n// Lineage selection action types\nexport const LINEAGE_SELECTION_ACTION = {\n SELECT_PARENT_NODES: \"select_parent_nodes\",\n SELECT_CHILD_NODES: \"select_child_nodes\",\n SELECT_ALL_UPSTREAM: \"select_all_upstream\",\n SELECT_ALL_DOWNSTREAM: \"select_all_downstream\",\n} as const;\n\nexport type LineageSelectionActionType =\n (typeof LINEAGE_SELECTION_ACTION)[keyof typeof LINEAGE_SELECTION_ACTION];\n\ninterface LineageSelectionProps {\n action: LineageSelectionActionType;\n node_count?: number;\n}\n\nexport function trackLineageSelection(props: LineageSelectionProps) {\n track(\"[Web] lineage_selection\", props);\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport React, { useCallback, useRef, useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport {\n EXPLORE_ACTION,\n EXPLORE_FORM_EVENT,\n trackExploreActionForm,\n} from \"@/lib/api/track\";\n\nfunction useValueDiffAlertDialog() {\n const [open, setOpen] = useState(false);\n const [nodeCount, setNodeCount] = useState(0);\n const [resolvePromise, setResolvePromise] =\n useState<(value: boolean) => void>();\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n const confirm = useCallback((nodeCount: number) => {\n setNodeCount(nodeCount);\n return new Promise<boolean>((resolve) => {\n setResolvePromise(() => resolve);\n setOpen(true);\n });\n }, []);\n\n const handleConfirm = () => {\n trackExploreActionForm({\n action: EXPLORE_ACTION.VALUE_DIFF,\n event: EXPLORE_FORM_EVENT.EXECUTE,\n });\n resolvePromise?.(true);\n setOpen(false);\n };\n\n const handleCancel = () => {\n trackExploreActionForm({\n action: EXPLORE_ACTION.VALUE_DIFF,\n event: EXPLORE_FORM_EVENT.CANCEL,\n });\n resolvePromise?.(false);\n setOpen(false);\n };\n\n const ValueDiffAlertDialog = (\n <MuiDialog\n open={open}\n onClose={handleCancel}\n maxWidth=\"md\"\n fullWidth\n aria-labelledby=\"value-diff-alert-dialog-title\"\n >\n <DialogTitle\n id=\"value-diff-alert-dialog-title\"\n sx={{ fontSize: \"1.125rem\", fontWeight: \"bold\" }}\n >\n Value Diff on {nodeCount} nodes\n </DialogTitle>\n <IconButton\n aria-label=\"close\"\n onClick={handleCancel}\n sx={{\n position: \"absolute\",\n right: 8,\n top: 8,\n color: \"grey.500\",\n }}\n >\n <IoClose />\n </IconButton>\n <DialogContent>\n <Stack spacing=\"20px\">\n <Box>\n Value diff will be executed on {nodeCount} nodes in the Lineage,\n which can add extra costs to your bill.\n </Box>\n </Stack>\n </DialogContent>\n <DialogActions sx={{ gap: 0.5 }}>\n <Button\n ref={cancelRef}\n onClick={handleCancel}\n variant=\"outlined\"\n color=\"neutral\"\n >\n Cancel\n </Button>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n onClick={handleConfirm}\n sx={{ ml: 1.5 }}\n >\n Execute\n </Button>\n </DialogActions>\n </MuiDialog>\n );\n\n return { confirm, AlertDialog: ValueDiffAlertDialog };\n}\n\nexport default useValueDiffAlertDialog;\n","import dagre from \"@dagrejs/dagre\";\nimport { Edge, Node, Position } from \"@xyflow/react\";\nimport { ColumnLineageData } from \"@/lib/api/cll\";\nimport {\n CatalogMetadata,\n LineageData,\n LineageDataFromMetadata,\n LineageDiffData,\n ManifestMetadata,\n NodeData,\n} from \"@/lib/api/info\";\nimport { getNeighborSet } from \"./graph\";\n\nexport const COLUMN_HEIGHT = 20;\n/**\n * The types for internal data structures.\n */\n\ntype LineageFrom = \"both\" | \"base\" | \"current\";\n\nexport type LineageGraphNode = Node<\n {\n id: string;\n name: string;\n from: LineageFrom;\n data: {\n base?: NodeData;\n current?: NodeData;\n };\n changeStatus?: \"added\" | \"removed\" | \"modified\";\n change?: {\n category: \"breaking\" | \"non_breaking\" | \"partial_breaking\" | \"unknown\";\n columns: Record<string, \"added\" | \"removed\" | \"modified\"> | null;\n };\n resourceType?: string;\n packageName?: string;\n parents: Record<string, LineageGraphEdge>;\n children: Record<string, LineageGraphEdge>;\n },\n \"lineageGraphNode\"\n>;\n\nexport type LineageGraphColumnNode = Node<\n {\n node: LineageGraphNode[\"data\"];\n column: string;\n type: string;\n transformationType?: string;\n changeStatus?: \"added\" | \"removed\" | \"modified\";\n },\n \"lineageGraphColumnNode\"\n>;\n\nexport type LineageGraphEdge = Edge<\n {\n from: LineageFrom;\n changeStatus?: \"added\" | \"removed\";\n },\n \"lineageGraphEdge\"\n>;\n\nexport type LineageGraphNodes = LineageGraphNode | LineageGraphColumnNode;\n\nexport interface LineageGraph {\n nodes: Record<string, LineageGraphNode>;\n\n edges: Record<string, LineageGraphEdge>;\n modifiedSet: string[];\n\n manifestMetadata: {\n base?: ManifestMetadata;\n current?: ManifestMetadata;\n };\n catalogMetadata: {\n base?: CatalogMetadata;\n current?: CatalogMetadata;\n };\n}\n\nexport function isLineageGraphNode(\n node: LineageGraphNodes,\n): node is LineageGraphNode {\n return node.type === \"lineageGraphNode\";\n}\n\nexport function isLineageGraphColumnNode(\n node: LineageGraphNodes,\n): node is LineageGraphColumnNode {\n return node.type === \"lineageGraphColumnNode\";\n}\n\nexport type NodeColumnSetMap = Record<string, Set<string>>;\n\nexport function buildLineageGraph(\n base: LineageDataFromMetadata,\n current: LineageDataFromMetadata,\n diff?: LineageDiffData,\n): LineageGraph {\n const nodes: Record<string, LineageGraphNode> = {};\n const edges: Record<string, LineageGraphEdge> = {};\n const buildNode = (\n key: string,\n from: \"base\" | \"current\",\n ): LineageGraphNode => {\n return {\n id: key,\n data: {\n id: key,\n name: key,\n from,\n data: {\n base: undefined,\n current: undefined,\n },\n parents: {},\n children: {},\n },\n type: \"lineageGraphNode\",\n // Return as LineageGraphNode for now\n } as LineageGraphNode;\n };\n\n for (const [key, nodeData] of Object.entries(base.nodes)) {\n nodes[key] = buildNode(key, \"base\");\n if (nodeData) {\n nodes[key].data.data.base = nodeData;\n nodes[key].data.name = nodeData.name;\n nodes[key].data.resourceType = nodeData.resource_type;\n nodes[key].data.packageName = nodeData.package_name;\n }\n }\n\n for (const [key, nodeData] of Object.entries(current.nodes)) {\n if (nodes[key] as LineageGraphNode | undefined) {\n nodes[key].data.from = \"both\";\n } else {\n nodes[key] = buildNode(key, \"current\");\n }\n if (nodeData) {\n nodes[key].data.data.current = current.nodes[key];\n nodes[key].data.name = nodeData.name;\n nodes[key].data.resourceType = nodeData.resource_type;\n nodes[key].data.packageName = nodeData.package_name;\n }\n }\n\n for (const [child, parents] of Object.entries(base.parent_map)) {\n for (const parent of parents) {\n const childNode = nodes[child] as LineageGraphNode | undefined;\n const parentNode = nodes[parent] as LineageGraphNode | undefined;\n const id = `${parent}_${child}`;\n\n if (!childNode || !parentNode) {\n // Skip the edge if the node is not found\n continue;\n }\n edges[id] = {\n id,\n source: parentNode.id,\n target: childNode.id,\n data: {\n from: \"base\",\n },\n };\n const edge = edges[id];\n\n childNode.data.parents[parent] = edge;\n parentNode.data.children[child] = edge;\n }\n }\n\n for (const [child, parents] of Object.entries(current.parent_map)) {\n for (const parent of parents) {\n const childNode = nodes[child] as LineageGraphNode | undefined;\n const parentNode = nodes[parent] as LineageGraphNode | undefined;\n const id = `${parent}_${child}`;\n\n if (!childNode || !parentNode) {\n // Skip the edge if the node is not found\n continue;\n }\n const existingEdge = edges[id] as LineageGraphEdge | undefined;\n if (existingEdge?.data && edges[id].data) {\n edges[id].data.from = \"both\";\n } else {\n edges[id] = {\n id,\n source: parentNode.id,\n target: childNode.id,\n data: {\n from: \"current\",\n },\n };\n }\n const edge = edges[id];\n\n childNode.data.parents[parent] = edge;\n parentNode.data.children[child] = edge;\n }\n }\n\n const modifiedSet: string[] = [];\n\n for (const [key, node] of Object.entries(nodes)) {\n const diffNode = diff?.[key];\n if (diffNode) {\n node.data.changeStatus = diffNode.change_status;\n if (diffNode.change) {\n node.data.change = {\n category: diffNode.change.category,\n columns: diffNode.change.columns,\n };\n }\n modifiedSet.push(key);\n } else if (node.data.from === \"base\") {\n node.data.changeStatus = \"removed\";\n modifiedSet.push(node.id);\n } else if (node.data.from === \"current\") {\n node.data.changeStatus = \"added\";\n modifiedSet.push(node.id);\n } else {\n const checksum1 = node.data.data.base?.checksum?.checksum;\n const checksum2 = node.data.data.current?.checksum?.checksum;\n\n if (checksum1 && checksum2 && checksum1 !== checksum2) {\n node.data.changeStatus = \"modified\";\n modifiedSet.push(node.id);\n }\n }\n }\n\n for (const [, edge] of Object.entries(edges)) {\n if (edge.data) {\n if (edge.data.from === \"base\") {\n edge.data.changeStatus = \"removed\";\n } else if (edge.data.from === \"current\") {\n edge.data.changeStatus = \"added\";\n }\n }\n }\n\n return {\n nodes,\n edges,\n modifiedSet,\n manifestMetadata: {\n base: base.manifest_metadata ?? undefined,\n current: current.manifest_metadata ?? undefined,\n },\n catalogMetadata: {\n base: base.catalog_metadata ?? undefined,\n current: current.catalog_metadata ?? undefined,\n },\n };\n}\n\nexport function selectUpstream(\n lineageGraph: LineageGraph,\n nodeIds: string[],\n degree = 1000,\n) {\n return getNeighborSet(\n nodeIds,\n (key) => {\n const maybeNodes = lineageGraph.nodes as unknown as Record<\n string,\n LineageGraphNode | undefined\n >;\n if (maybeNodes[key] === undefined) {\n return [];\n }\n return Object.keys(lineageGraph.nodes[key].data.parents);\n },\n degree,\n );\n}\n\nexport function selectDownstream(\n lineageGraph: LineageGraph,\n nodeIds: string[],\n degree = 1000,\n) {\n return getNeighborSet(\n nodeIds,\n (key) => {\n if (\n (lineageGraph.nodes[key] as LineageGraphNode | undefined) === undefined\n ) {\n return [];\n }\n return Object.keys(lineageGraph.nodes[key].data.children);\n },\n degree,\n );\n}\n\nexport function toReactFlow(\n lineageGraph: LineageGraph,\n options?: {\n selectedNodes?: string[];\n cll?: ColumnLineageData;\n },\n): [LineageGraphNodes[], LineageGraphEdge[], NodeColumnSetMap] {\n const nodes: LineageGraphNodes[] = [];\n const edges: LineageGraphEdge[] = [];\n const { selectedNodes, cll } = options ?? {};\n\n const nodeColumnSetMap: NodeColumnSetMap = {};\n\n function getWeight(from?: string) {\n if (from === \"base\") {\n return 0;\n } else if (from === \"current\") {\n return 2;\n } else {\n return 1;\n }\n }\n\n function compareFn(\n a: LineageGraphNode | LineageGraphEdge,\n b: LineageGraphNode | LineageGraphEdge,\n ) {\n const weightA = getWeight(a.data?.from);\n const weightB = getWeight(b.data?.from);\n\n if (weightA < weightB) {\n return -1;\n } else if (weightA > weightB) {\n return 1;\n }\n return 0;\n }\n\n const filterSet =\n selectedNodes !== undefined ? new Set(selectedNodes) : undefined;\n const sortedNodes = Object.values(lineageGraph.nodes).sort(compareFn);\n for (const node of sortedNodes) {\n if (filterSet && !filterSet.has(node.id)) {\n continue;\n }\n\n // add column nodes\n const nodeColumnSet = new Set<string>();\n let columnIndex = 0;\n if (cll) {\n const maybeCurrent = cll.current as unknown as\n | ColumnLineageData[\"current\"]\n | undefined;\n const parentMap = maybeCurrent?.parent_map[node.id] ?? new Set<string>();\n\n for (const parentKey of parentMap) {\n const source = parentKey;\n const target = node.id;\n\n edges.push({\n id: `m2c_${source}_${target}`,\n source,\n target,\n style: {\n zIndex: 9999,\n },\n });\n }\n\n for (const columnName of Object.keys(\n node.data.data.current?.columns ?? {},\n )) {\n const columnKey = `${node.id}_${columnName}`;\n const maybeCurrent = cll.current as unknown as\n | ColumnLineageData[\"current\"]\n | undefined;\n const column = maybeCurrent?.columns[columnKey];\n const parentMap =\n maybeCurrent?.parent_map[columnKey] ?? new Set<string>();\n\n if (column == null) {\n continue;\n }\n\n nodes.push({\n id: columnKey,\n position: { x: 10, y: 70 + columnIndex * COLUMN_HEIGHT },\n parentId: node.id,\n extent: \"parent\",\n draggable: false,\n className: \"no-track-pii-safe\",\n data: {\n node: node.data,\n column: column.name,\n type: column.type,\n transformationType: column.transformation_type,\n changeStatus: column.change_status,\n },\n style: {\n zIndex: 9999,\n },\n type: \"lineageGraphColumnNode\",\n targetPosition: Position.Left,\n sourcePosition: Position.Right,\n } as LineageGraphColumnNode);\n\n for (const parentColumn of parentMap) {\n const source = parentColumn;\n const target = columnKey;\n\n edges.push({\n id: `${source}_${target}`,\n source,\n target,\n style: {\n zIndex: 9999,\n },\n });\n }\n\n columnIndex++;\n nodeColumnSet.add(column.name);\n }\n }\n\n nodeColumnSetMap[node.id] = nodeColumnSet;\n\n let height = 60;\n if (columnIndex > 0) {\n height += 20 + columnIndex * COLUMN_HEIGHT;\n }\n\n nodes.unshift({\n id: node.id,\n position: { x: 0, y: 0 },\n width: 300,\n height: height,\n className: \"no-track-pii-safe\",\n data: {\n ...node.data,\n },\n type: \"lineageGraphNode\",\n targetPosition: Position.Left,\n sourcePosition: Position.Right,\n style: {\n width: 300,\n height: height,\n },\n } as LineageGraphNode);\n }\n\n const sortedEdges = Object.values(lineageGraph.edges).sort(compareFn);\n for (const edge of sortedEdges) {\n if (\n filterSet &&\n (!filterSet.has(edge.source) || !filterSet.has(edge.target))\n ) {\n continue;\n }\n\n edges.push({\n id: edge.id,\n type: \"lineageGraphEdge\",\n source: edge.source,\n target: edge.target,\n data: {\n ...edge.data,\n },\n } as LineageGraphEdge);\n }\n\n layout(nodes, edges);\n\n return [nodes, edges, nodeColumnSetMap];\n}\n\nexport const layout = (\n nodes: LineageGraphNodes[],\n edges: LineageGraphEdge[],\n direction = \"LR\",\n) => {\n const dagreGraph = new dagre.graphlib.Graph();\n dagreGraph.setDefaultEdgeLabel(() => ({}));\n\n dagreGraph.setGraph({ rankdir: direction, ranksep: 50, nodesep: 30 });\n\n nodes.forEach((node) => {\n if (!isLineageGraphNode(node)) {\n return;\n }\n let width = 300;\n let height = 60;\n if (node.style?.height && node.style.width) {\n width = parseInt(String(node.style.width), 10);\n height = parseInt(String(node.style.height), 10);\n }\n dagreGraph.setNode(node.id, { width, height });\n });\n\n edges.forEach((edge) => {\n dagreGraph.setEdge(edge.source, edge.target);\n });\n\n dagre.layout(dagreGraph);\n\n nodes.forEach((node) => {\n if (!isLineageGraphNode(node)) {\n return;\n }\n\n const nodeWidth = node.style?.width ?? 300;\n const nodeHeight = node.style?.height ?? 60;\n\n const nodeWithPosition = dagreGraph.node(node.id);\n\n // We are shifting the dagre node position (anchor=center center) to the top left\n // so it matches the React Flow node anchor point (top left).\n node.position = {\n x: nodeWithPosition.x - Number(nodeWidth) / 2,\n y: nodeWithPosition.y - Number(nodeHeight) / 2,\n };\n\n return node;\n });\n};\n","export const RECCE_SUPPORT_CALENDAR_URL = \"https://cal.com/team/recce/chat\";\n","/**\n * Time formatting utilities for idle timeout display\n */\n\nexport type TimeFormatStyle = \"compact\" | \"verbose\";\n\ninterface TimeComponents {\n hours: number;\n minutes: number;\n seconds: number;\n}\n\n/**\n * Break down seconds into hours, minutes, seconds\n */\nfunction getTimeComponents(totalSeconds: number): TimeComponents {\n const seconds = Math.floor(totalSeconds);\n return {\n hours: Math.floor(seconds / 3600),\n minutes: Math.floor((seconds % 3600) / 60),\n seconds: seconds % 60,\n };\n}\n\n/**\n * Format time in compact style (MM:SS or HH:MM:SS)\n * Used for countdown badges where space is limited\n */\nfunction formatCompact({ hours, minutes, seconds }: TimeComponents): string {\n if (hours > 0) {\n return `${hours}:${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`;\n }\n return `${minutes}:${seconds.toString().padStart(2, \"0\")}`;\n}\n\n/**\n * Format time in verbose style (human-readable)\n * Used for messages where clarity is more important than brevity\n *\n * Examples:\n * - Less than 1 minute: \"30 seconds\"\n * - Exact minutes: \"5 mins\"\n * - Minutes with seconds: \"2 mins 30 seconds\"\n * - With hours: \"1 hour 30 mins\"\n */\nfunction formatVerbose({ hours, minutes, seconds }: TimeComponents): string {\n const parts: string[] = [];\n\n // Add hours if present\n if (hours > 0) {\n parts.push(`${hours} hour${hours !== 1 ? \"s\" : \"\"}`);\n }\n\n // Add minutes if present (or if hours present and minutes > 0)\n if (minutes > 0) {\n parts.push(`${minutes} min${minutes !== 1 ? \"s\" : \"\"}`);\n }\n\n // Add seconds only if no hours (keep message concise for long durations)\n // or if it's the only component\n if (hours === 0 && (parts.length === 0 || seconds > 0)) {\n parts.push(`${seconds} second${seconds !== 1 ? \"s\" : \"\"}`);\n }\n\n return parts.join(\" \");\n}\n\n/**\n * Format seconds into human-readable time string\n *\n * @param totalSeconds - Total seconds to format\n * @param style - \"compact\" for MM:SS, \"verbose\" for human-readable\n */\nexport function formatDuration(\n totalSeconds: number,\n style: TimeFormatStyle = \"verbose\",\n): string {\n const components = getTimeComponents(totalSeconds);\n\n if (style === \"compact\") {\n return formatCompact(components);\n }\n return formatVerbose(components);\n}\n","import Button from \"@mui/material/Button\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport Typography from \"@mui/material/Typography\";\nimport NextLink from \"next/link\";\nimport React from \"react\";\nimport { RECCE_SUPPORT_CALENDAR_URL } from \"@/constants/urls\";\nimport { RecceFeatureMode } from \"@/lib/hooks/RecceInstanceContext\";\nimport { formatDuration } from \"@/lib/utils/formatTime\";\n\ninterface ServerDisconnectedModalContentProps {\n connect: () => void;\n /** If provided, indicates the server was idle for this many seconds before timeout */\n idleSeconds?: number | null;\n}\n\nexport function ServerDisconnectedModalContent({\n connect,\n idleSeconds,\n}: ServerDisconnectedModalContentProps) {\n const isIdleTimeout =\n idleSeconds !== undefined && idleSeconds !== null && idleSeconds > 0;\n\n return (\n <>\n <DialogTitle>Server Disconnected</DialogTitle>\n <DialogContent>\n {isIdleTimeout ? (\n <Typography>\n The server has been idle for {formatDuration(idleSeconds)} and was\n automatically stopped. Please restart the Recce server to continue.\n </Typography>\n ) : (\n <Typography>\n The server connection has been lost. Please restart the Recce server\n and try again.\n </Typography>\n )}\n </DialogContent>\n <DialogActions>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n onClick={() => {\n connect();\n }}\n >\n Retry\n </Button>\n </DialogActions>\n </>\n );\n}\n\nexport function RecceInstanceDisconnectedModalContent({\n shareUrl,\n mode,\n}: {\n shareUrl: string;\n mode: Exclude<RecceFeatureMode, null>;\n}) {\n const contents = {\n \"read only\": {\n title: \"Share Instance Expired\",\n body: \"This Share Instance has expired. Please restart the share instance.\",\n action: \"Restart\",\n link: shareUrl,\n },\n \"metadata only\": {\n title: \"Preview Instance Expired\",\n body: \"This Preview Instance has expired. To browse more, please book a meeting with us.\",\n action: \"Contact us\",\n link: RECCE_SUPPORT_CALENDAR_URL,\n },\n };\n\n const content = contents[mode];\n\n return (\n <>\n <DialogTitle>{content.title}</DialogTitle>\n <DialogContent>\n <Typography>{content.body}</Typography>\n </DialogContent>\n <DialogActions>\n {mode === \"read only\" ? (\n <NextLink href={content.link} passHref>\n <Button color=\"iochmara\" variant=\"contained\">\n {content.action}\n </Button>\n </NextLink>\n ) : (\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n onClick={() => window.open(content.link, \"_blank\")}\n >\n {content.action}\n </Button>\n )}\n </DialogActions>\n </>\n );\n}\n","import { createContext, useContext, useState } from \"react\";\nimport { useRecceInstanceInfo } from \"./useRecceInstanceInfo\";\n\nexport type RecceFeatureMode = \"read only\" | \"metadata only\" | null;\n\ninterface RecceFeatureToggles {\n mode: RecceFeatureMode;\n disableSaveToFile: boolean;\n disableExportStateFile: boolean;\n disableImportStateFile: boolean;\n disableUpdateChecklist: boolean;\n disableDatabaseQuery: boolean;\n disableViewActionDropdown: boolean;\n disableNodeActionDropdown: boolean;\n disableShare: boolean;\n}\n\nconst defaultFeatureToggles: RecceFeatureToggles = {\n mode: null,\n disableSaveToFile: false,\n disableExportStateFile: false,\n disableImportStateFile: false,\n disableUpdateChecklist: false,\n disableDatabaseQuery: false,\n disableViewActionDropdown: false,\n disableNodeActionDropdown: false,\n disableShare: false,\n};\n\ninterface InstanceInfoType {\n singleEnv: boolean;\n authed: boolean;\n featureToggles: RecceFeatureToggles;\n lifetimeExpiredAt?: Date;\n shareUrl?: string;\n sessionId?: string;\n}\n\nconst defaultValue: InstanceInfoType = {\n singleEnv: false,\n authed: false,\n lifetimeExpiredAt: undefined,\n featureToggles: defaultFeatureToggles,\n shareUrl: undefined,\n sessionId: undefined,\n};\n\nconst InstanceInfo = createContext<InstanceInfoType>(defaultValue);\n\nexport function RecceInstanceInfoProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const { data: instanceInfo, isLoading } = useRecceInstanceInfo();\n const [featureToggles, setFeatureToggles] = useState<RecceFeatureToggles>(\n defaultFeatureToggles,\n );\n const [singleEnv, setSingleEnv] = useState<boolean>(false);\n const [authed, setAuthed] = useState<boolean>(false);\n const [lifetimeExpiredAt, setLifetimeExpiredAt] = useState<Date>();\n const [shareUrl, setShareUrl] = useState<string>();\n const [sessionId, setSessionId] = useState<string>();\n const [prevInstanceInfo, setPrevInstanceInfo] = useState(instanceInfo);\n\n // Adjust state during render when instanceInfo changes\n if (!isLoading && instanceInfo && instanceInfo !== prevInstanceInfo) {\n setPrevInstanceInfo(instanceInfo);\n\n setSingleEnv(instanceInfo.single_env);\n setAuthed(instanceInfo.authed);\n setShareUrl(instanceInfo.share_url);\n setSessionId(instanceInfo.session_id);\n\n if (instanceInfo.lifetime_expired_at) {\n setLifetimeExpiredAt(new Date(instanceInfo.lifetime_expired_at));\n console.log(\"lifetime expired at\", instanceInfo.lifetime_expired_at);\n }\n\n // Set feature toggles based on instanceInfo\n const toggles = { ...defaultFeatureToggles };\n if (instanceInfo.server_mode === \"read-only\") {\n toggles.mode = \"read only\";\n toggles.disableSaveToFile = true;\n toggles.disableExportStateFile = true;\n toggles.disableImportStateFile = true;\n toggles.disableUpdateChecklist = true;\n toggles.disableDatabaseQuery = true;\n toggles.disableViewActionDropdown = true;\n toggles.disableNodeActionDropdown = true;\n toggles.disableShare = true;\n } else if (instanceInfo.server_mode === \"preview\") {\n toggles.mode = \"metadata only\";\n toggles.disableSaveToFile = true;\n toggles.disableExportStateFile = true;\n toggles.disableImportStateFile = true;\n toggles.disableUpdateChecklist = false;\n toggles.disableDatabaseQuery = true;\n toggles.disableViewActionDropdown = false;\n toggles.disableNodeActionDropdown = false;\n toggles.disableShare = true;\n }\n if (instanceInfo.single_env) {\n toggles.disableUpdateChecklist = true;\n toggles.disableShare = true;\n }\n if (instanceInfo.cloud_instance) {\n toggles.disableShare = true;\n }\n setFeatureToggles(toggles);\n }\n\n return (\n <InstanceInfo.Provider\n value={{\n featureToggles,\n singleEnv,\n authed,\n lifetimeExpiredAt,\n shareUrl,\n sessionId,\n }}\n >\n {children}\n </InstanceInfo.Provider>\n );\n}\n\nexport const useRecceInstanceContext = () => useContext(InstanceInfo);\n","import { AxiosResponse } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\n\nexport interface RecceServerFlags {\n single_env_onboarding: boolean;\n show_relaunch_hint: boolean;\n}\n\nexport async function getServerFlag(): Promise<RecceServerFlags> {\n return (\n await axiosClient.get<never, AxiosResponse<RecceServerFlags>>(\"/api/flag\")\n ).data;\n}\n\n// This was used for showing onboarding guide. Check DRC-1320 for more detials\nexport async function markOnboardingCompleted(): Promise<void> {\n try {\n await axiosClient.post<never, AxiosResponse<never>>(\n \"/api/onboarding/completed\",\n );\n } catch (_error) {\n // skip any errors\n }\n}\n\nexport async function markRelaunchHintCompleted(): Promise<void> {\n try {\n await axiosClient.post<never, AxiosResponse<never>>(\n \"/api/relaunch-hint/completed\",\n );\n } catch (_error) {\n // skip any errors\n }\n}\n","import { AxiosError, AxiosResponse } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\n\n/**\n * The data from the API\n */\nexport interface NodeColumnData {\n name: string;\n type: string;\n transformation_type?: string;\n change_status?: \"added\" | \"removed\" | \"modified\";\n not_null?: boolean;\n unique?: boolean;\n}\nexport interface NodeData {\n id: string;\n unique_id: string;\n name: string;\n schema?: string;\n checksum?: {\n name: string;\n checksum: string;\n };\n raw_code?: string;\n resource_type?: string;\n package_name?: string;\n columns?: Record<string, NodeColumnData | undefined>;\n primary_key?: string;\n}\n\n// https://docs.getdbt.com/reference/artifacts/dbt-artifacts#common-metadata\ninterface ArtifactMetadata {\n dbt_version: string;\n dbt_schema_version: string;\n generated_at: string;\n adapter_type: string;\n env: Record<string, string>;\n invocation_id: string;\n}\nexport interface ManifestMetadata extends ArtifactMetadata {\n project_id?: string;\n project_name?: string;\n user_id?: string;\n}\nexport interface SQLMeshInfo {\n base_env: string;\n current_env: string;\n}\n\nexport type CatalogMetadata = ArtifactMetadata;\n\nexport interface LineageData {\n metadata: {\n pr_url: string;\n git_branch?: string;\n };\n nodes: Record<string, NodeData>;\n parent_map: Record<string, string[]>;\n manifest_metadata?: ManifestMetadata | null;\n catalog_metadata?: CatalogMetadata | null;\n}\n\nexport interface LineageDataFromMetadata extends Omit<LineageData, \"nodes\"> {\n nodes: Record<string, NodeData | undefined>;\n}\n\nexport type LineageDiffData = Record<\n string,\n {\n change_status: \"added\" | \"removed\" | \"modified\";\n change: {\n category: \"breaking\" | \"non_breaking\" | \"partial_breaking\" | \"unknown\";\n columns: Record<string, \"added\" | \"removed\" | \"modified\"> | null;\n } | null;\n }\n>;\n\ninterface LineageOutput {\n error?: string;\n data?: LineageData;\n}\n\nexport async function getLineage(base = false): Promise<LineageData> {\n const response = await axiosClient.get<LineageData>(\n `/api/lineage?base=${base}`,\n );\n return response.data;\n}\n\nexport async function getLineageWithError(\n base = false,\n): Promise<LineageOutput> {\n try {\n const data = await getLineage(base);\n return { data };\n } catch (err: unknown) {\n if (err instanceof AxiosError) {\n const data = err.response?.data as Record<string, unknown> | undefined;\n const detail = data?.detail as string | undefined;\n if (detail) {\n return { error: detail };\n } else {\n return { error: err.message };\n }\n } else if (err instanceof Error) {\n return { error: err.message };\n } else {\n return { error: \"An unknown error occurred\" };\n }\n }\n}\n\nexport interface LineageDiffResult {\n base?: LineageData;\n current?: LineageData;\n base_error?: string;\n current_error?: string;\n}\n\nexport async function getLineageDiff(): Promise<LineageDiffResult> {\n const [base, current] = await Promise.all([\n getLineageWithError(true),\n getLineageWithError(false),\n ]);\n\n return {\n base: base.data,\n current: current.data,\n base_error: base.error,\n current_error: current.error,\n };\n}\n\nexport interface stateMetadata {\n schema_version: string;\n recce_version: string;\n generated_at: string;\n}\n\nexport interface gitInfo {\n branch?: string;\n}\n\nexport interface pullRequestInfo {\n id?: string | number;\n title?: string;\n url?: string;\n branch?: string;\n base_branch?: string;\n}\n\nexport interface ServerInfoResult {\n state_metadata: stateMetadata;\n adapter_type: string;\n review_mode: boolean;\n cloud_mode: boolean;\n file_mode: boolean;\n filename?: string;\n git?: gitInfo;\n pull_request?: pullRequestInfo;\n sqlmesh?: SQLMeshInfo;\n lineage: {\n base: LineageData;\n current: LineageData;\n diff: LineageDiffData;\n };\n demo: boolean;\n codespace: boolean;\n support_tasks: Record<string, boolean>;\n}\n\nexport async function getServerInfo(): Promise<ServerInfoResult> {\n return (\n await axiosClient.get<never, AxiosResponse<ServerInfoResult>>(`/api/info`)\n ).data;\n}\n\nexport interface ModelInfoResult {\n model: {\n base: {\n columns?: Record<string, NodeColumnData>;\n primary_key?: string;\n };\n current: {\n columns?: Record<string, NodeColumnData>;\n primary_key?: string;\n };\n };\n}\n\nexport async function getModelInfo(model: string): Promise<ModelInfoResult> {\n return (\n await axiosClient.get<never, AxiosResponse<ModelInfoResult>>(\n `/api/model/${model}`,\n )\n ).data;\n}\n","// ============================================================================\n// Base Types\n// ============================================================================\n\nexport type AxiosQueryParams = Record<\n string,\n string | string[] | number | number[] | undefined\n>;\n\nexport type RowDataTypes = number | string | boolean | null | undefined;\nexport type RowData = RowDataTypes[];\n\nexport type RowObjectType = Record<string, RowDataTypes> & {\n __status: \"added\" | \"removed\" | \"modified\" | undefined;\n _index?: number;\n};\n\nexport type ColumnType =\n | \"number\"\n | \"integer\"\n | \"text\"\n | \"boolean\"\n | \"date\"\n | \"datetime\"\n | \"timedelta\"\n | \"unknown\";\n\nexport type ColumnRenderMode = \"raw\" | \"percent\" | \"delta\" | 2;\nexport interface DataFrame {\n columns: {\n key: string;\n name: string;\n type: ColumnType;\n }[];\n data: RowData[];\n limit?: number;\n more?: boolean;\n}\n\n// ============================================================================\n// Run Types - Strict enum without string union\n// ============================================================================\n\n// ============================================================================\n// Inline Param Definitions (defined here to avoid circular dependencies)\n// ============================================================================\n\n// Import types that are defined in other files\nimport { RunType } from \"@/components/run/registry\";\nimport type {\n QueryDiffParams,\n QueryDiffResult,\n QueryResult,\n QueryRunParams,\n} from \"./adhocQuery\";\nimport type { LineageDiffResult } from \"./info\";\nimport type {\n HistogramDiffParams,\n HistogramDiffResult,\n ProfileDiffParams,\n ProfileDiffResult,\n TopKDiffParams,\n TopKDiffResult,\n} from \"./profile\";\nimport type {\n RowCountDiffParams,\n RowCountDiffResult,\n RowCountParams,\n RowCountResult,\n} from \"./rowcount\";\nimport type {\n ValueDiffDetailParams,\n ValueDiffDetailResult,\n ValueDiffParams,\n ValueDiffResult,\n} from \"./valuediff\";\n\n// Define params that don't have their own files yet\nexport interface SchemaDiffParams {\n node_id?: string | string[];\n select?: string;\n exclude?: string;\n packages?: string[];\n view_mode?: \"all\" | \"changed_models\";\n}\n\nexport interface LineageDiffParams {\n select?: string;\n exclude?: string;\n packages?: string[];\n view_mode?: \"all\" | \"changed_models\";\n}\n\n// ============================================================================\n// Run - Discriminated Union Type\n// ============================================================================\n\nexport type RunParamTypes =\n | QueryRunParams\n | QueryDiffParams\n | ValueDiffParams\n | SchemaDiffParams\n | ProfileDiffParams\n | RowCountParams\n | RowCountDiffParams\n | LineageDiffParams\n | TopKDiffParams\n | HistogramDiffParams\n | undefined;\n\ninterface BaseRun {\n type: RunType;\n run_id: string;\n run_at: string;\n name?: string;\n check_id?: string;\n progress?: {\n message?: string;\n percentage?: number;\n };\n error?: string;\n status?: \"finished\" | \"failed\" | \"cancelled\" | \"running\";\n}\n\nexport type Run =\n | (BaseRun & {\n type: \"simple\";\n params?: undefined;\n result?: undefined;\n })\n | (BaseRun & {\n type: \"sandbox\";\n params?: undefined;\n result?: undefined;\n })\n | (BaseRun & {\n type: \"query\";\n params?: QueryRunParams;\n result?: QueryResult;\n })\n | (BaseRun & {\n type: \"query_base\";\n params?: QueryRunParams;\n result?: QueryResult;\n })\n | (BaseRun & {\n type: \"query_diff\";\n params?: QueryDiffParams;\n result?: QueryDiffResult;\n })\n | (BaseRun & {\n type: \"value_diff\";\n params?: ValueDiffParams;\n result?: ValueDiffResult;\n })\n | (BaseRun & {\n type: \"value_diff_detail\";\n params?: ValueDiffDetailParams;\n result?: ValueDiffDetailResult;\n })\n | (BaseRun & {\n type: \"schema_diff\";\n params?: SchemaDiffParams;\n result?: undefined;\n })\n | (BaseRun & {\n type: \"profile\";\n params?: ProfileDiffParams;\n result?: ProfileDiffResult;\n })\n | (BaseRun & {\n type: \"profile_diff\";\n params?: ProfileDiffParams;\n result?: ProfileDiffResult;\n })\n | (BaseRun & {\n type: \"row_count\";\n params?: RowCountParams;\n result?: RowCountResult;\n })\n | (BaseRun & {\n type: \"row_count_diff\";\n params?: RowCountDiffParams;\n result?: RowCountDiffResult;\n })\n | (BaseRun & {\n type: \"lineage_diff\";\n params?: LineageDiffParams;\n result?: LineageDiffResult;\n })\n | (BaseRun & {\n type: \"top_k_diff\";\n params?: TopKDiffParams;\n result?: TopKDiffResult;\n })\n | (BaseRun & {\n type: \"histogram_diff\";\n params?: HistogramDiffParams;\n result?: HistogramDiffResult;\n });\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isSimpleRun(run: Run): run is Extract<Run, { type: \"simple\" }> {\n return run.type === \"simple\";\n}\n\nexport function isQueryRun(run: Run): run is Extract<Run, { type: \"query\" }> {\n return run.type === \"query\";\n}\n\nexport function isQueryBaseRun(\n run: Run,\n): run is Extract<Run, { type: \"query_base\" }> {\n return run.type === \"query_base\";\n}\n\nexport function isQueryDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"query_diff\" }> {\n return run.type === \"query_diff\";\n}\n\nexport function isValueDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"value_diff\" }> {\n return run.type === \"value_diff\";\n}\n\nexport function isValueDiffDetailRun(\n run: Run,\n): run is Extract<Run, { type: \"value_diff_detail\" }> {\n return run.type === \"value_diff_detail\";\n}\n\nexport function isSchemaDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"schema_diff\" }> {\n return run.type === \"schema_diff\";\n}\n\nexport function isProfileRun(\n run: Run,\n): run is Extract<Run, { type: \"profile\" }> {\n return run.type === \"profile\";\n}\n\nexport function isProfileDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"profile_diff\" }> {\n return run.type === \"profile_diff\";\n}\n\nexport function isRowCountRun(\n run: Run,\n): run is Extract<Run, { type: \"row_count\" }> {\n return run.type === \"row_count\";\n}\n\nexport function isRowCountDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"row_count_diff\" }> {\n return run.type === \"row_count_diff\";\n}\n\nexport function isLineageDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"lineage_diff\" }> {\n return run.type === \"lineage_diff\";\n}\n\nexport function isTopKDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"top_k_diff\" }> {\n return run.type === \"top_k_diff\";\n}\n\nexport function isHistogramDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"histogram_diff\" }> {\n return run.type === \"histogram_diff\";\n}\n","import { AxiosResponse } from \"axios\";\nimport { RunType } from \"@/components/run/registry\";\nimport { axiosClient } from \"./axiosClient\";\nimport { getExperimentTrackingBreakingChangeEnabled } from \"./track\";\nimport { AxiosQueryParams, isQueryRun, Run, RunParamTypes } from \"./types\";\n\nexport interface SubmitRunTrackProps {\n breaking_change_analysis?: boolean;\n source?: \"lineage_model_node\" | \"lineage_column_node\";\n [key: string]: unknown;\n}\n\nexport interface SubmitOptions {\n nowait?: boolean;\n trackProps?: SubmitRunTrackProps;\n}\n\ninterface SubmitRunBody {\n type: RunType;\n params?: Record<string, unknown>;\n nowait?: boolean;\n track_props: SubmitRunTrackProps;\n}\n\nfunction mutateAddKey(run: Run): Run {\n if (run.result == null) {\n // no result, don't do anything\n return run;\n }\n if (isQueryRun(run)) {\n run.result.columns = run.result.columns.map((c) => {\n if (c.key) {\n return c;\n }\n c.key = c.name;\n return c;\n });\n }\n return run;\n}\n\nexport async function submitRun(\n type: RunType,\n params?: RunParamTypes,\n options?: SubmitOptions,\n) {\n const track_props = options?.trackProps ? { ...options.trackProps } : {};\n if (getExperimentTrackingBreakingChangeEnabled()) {\n track_props.breaking_change_analysis = true;\n }\n\n const response = await axiosClient.post<\n SubmitRunBody,\n AxiosResponse<Run | Pick<Run, \"run_id\">>\n >(\"/api/runs\", {\n type,\n params,\n nowait: options?.nowait,\n track_props,\n });\n\n return response.data;\n}\n\nexport async function getRun(runId: string) {\n const response = await axiosClient.get<never, AxiosResponse<Run>>(\n `/api/runs/${runId}`,\n );\n return response.data;\n}\n\ninterface WaitRunBody {\n params: {\n timeout?: number;\n };\n}\n\nexport async function waitRun(runId: string, timeout?: number) {\n const response = await axiosClient.get<WaitRunBody, AxiosResponse<Run>>(\n `/api/runs/${runId}/wait`,\n {\n params: {\n timeout,\n },\n },\n );\n\n return mutateAddKey(response.data);\n}\n\nexport async function cancelRun(runId: string) {\n return await axiosClient.post<never, AxiosResponse<never>>(\n `/api/runs/${runId}/cancel`,\n );\n}\n\nexport async function submitRunFromCheck(\n checkId: string,\n options?: SubmitOptions,\n) {\n const response = await axiosClient.post<\n { nowait?: boolean },\n AxiosResponse<Run | Pick<Run, \"run_id\">>\n >(`/api/checks/${checkId}/run`, {\n nowait: options?.nowait,\n });\n\n return response.data;\n}\n\ninterface SearchRunsBody {\n type: string;\n params: Record<string, unknown>;\n limit?: number;\n}\n\nexport async function searchRuns(\n type: string,\n params?: AxiosQueryParams,\n limit?: number,\n) {\n const response = await axiosClient.post<SearchRunsBody, AxiosResponse<Run[]>>(\n `/api/runs/search`,\n {\n type,\n params,\n limit,\n },\n );\n\n return response.data;\n}\n\nexport async function listRuns(): Promise<Run[]> {\n const response = await axiosClient.get<never, AxiosResponse<Run[]>>(\n \"/api/runs\",\n );\n return response.data;\n}\n\nexport type RunsAggregated = Record<\n string,\n Record<\n \"row_count_diff\" | \"value_diff\" | \"row_count\",\n {\n run_id: string;\n result: unknown;\n }\n >\n>;\nexport async function aggregateRuns(): Promise<RunsAggregated> {\n // input should be AggregateRunsIn\n const response = await axiosClient.post<\n unknown,\n AxiosResponse<RunsAggregated>\n >(`/api/runs/aggregate`, {});\n\n return response.data;\n}\n","import { axiosClient } from \"./axiosClient\";\n\n/**\n * Check if debug logging is enabled via window.RECCE_DEBUG_IDLE\n */\nfunction isDebugEnabled(): boolean {\n // biome-ignore lint/suspicious/noExplicitAny: window flag for debug logging\n return typeof window !== \"undefined\" && !!(window as any).RECCE_DEBUG_IDLE;\n}\n\n/**\n * Minimum interval between keep-alive API calls (3 seconds)\n * This prevents excessive API calls while still maintaining responsive idle detection\n */\nconst MIN_KEEP_ALIVE_INTERVAL_MS = 3 * 1000;\n\n/**\n * State for axios-layer throttling\n * - lastKeepAliveTime: timestamp of last SUCCESSFUL keep-alive sent to server\n * - isSending: lock to prevent concurrent API calls\n */\nlet lastKeepAliveTime = 0;\nlet isSending = false;\n\n/** Callback to notify listeners when keep-alive is successfully sent */\ntype KeepAliveCallback = (timestamp: number) => void;\nlet onKeepAliveSuccess: KeepAliveCallback | null = null;\n\n/**\n * Register a callback to be notified when keep-alive is successfully sent\n * Used by IdleTimeoutContext to track server sync time\n */\nexport function setKeepAliveCallback(callback: KeepAliveCallback | null): void {\n onKeepAliveSuccess = callback;\n}\n\n/**\n * Send a keep-alive signal to the server to reset the idle timeout timer.\n * This prevents the server from shutting down due to inactivity.\n *\n * Includes built-in throttling at the axios layer:\n * - Minimum 3 seconds between API calls\n * - Prevents concurrent API calls with a lock\n *\n * @returns true if keep-alive was sent, false if throttled/skipped\n */\nexport async function sendKeepAlive(): Promise<boolean> {\n const now = Date.now();\n const elapsed = now - lastKeepAliveTime;\n\n // Throttle: skip if called within minimum interval\n if (elapsed < MIN_KEEP_ALIVE_INTERVAL_MS) {\n return false;\n }\n\n // Prevent concurrent sends\n if (isSending) {\n return false;\n }\n\n try {\n // Acquire lock inside try to ensure finally always releases it\n isSending = true;\n await axiosClient.post(\"/api/keep-alive\");\n // Update timestamp only on SUCCESS\n lastKeepAliveTime = Date.now();\n // Notify listeners\n if (onKeepAliveSuccess) {\n onKeepAliveSuccess(lastKeepAliveTime);\n }\n return true;\n } catch (error) {\n // Silent fail - don't disrupt user experience if keep-alive fails\n if (isDebugEnabled()) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n console.log(\"[Keep-Alive] Failed to send\", {\n error: errorMessage,\n timestamp: new Date().toISOString(),\n willRetryOnNextActivity: true,\n });\n }\n return false;\n } finally {\n isSending = false;\n }\n}\n\n/**\n * Get the last successful keep-alive timestamp\n * This represents the last time the server confirmed it received our keep-alive\n */\nexport function getLastKeepAliveTime(): number {\n return lastKeepAliveTime;\n}\n\n/**\n * Reset all module state (for testing purposes)\n */\nexport function resetKeepAliveState(): void {\n lastKeepAliveTime = 0;\n isSending = false;\n onKeepAliveSuccess = null;\n}\n","import throttle from \"lodash/throttle\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { sendKeepAlive } from \"@/lib/api/keepAlive\";\nimport { useIdleTimeoutSafe } from \"./IdleTimeoutContext\";\nimport { useRecceInstanceInfo } from \"./useRecceInstanceInfo\";\n\n/**\n * Check if debug logging is enabled via window.RECCE_DEBUG_IDLE\n * Enable in browser console: window.RECCE_DEBUG_IDLE = true\n * Disable: delete window.RECCE_DEBUG_IDLE\n */\nfunction isDebugEnabled(): boolean {\n // biome-ignore lint/suspicious/noExplicitAny: window flag for debug logging\n return typeof window !== \"undefined\" && !!(window as any).RECCE_DEBUG_IDLE;\n}\n\n/**\n * Log function that only outputs when debug is enabled\n */\nfunction debugLog(message: string, data?: Record<string, unknown>) {\n if (isDebugEnabled()) {\n if (data) {\n console.log(message, data);\n } else {\n console.log(message);\n }\n }\n}\n\n/**\n * Configuration for idle detection behavior\n */\nconst IDLE_DETECTION_CONFIG = {\n /** Events to listen for user activity */\n ACTIVITY_EVENTS: [\"focus\", \"mousemove\", \"keydown\", \"scroll\"] as const,\n /**\n * Throttle event handler execution to reduce JS overhead (150ms).\n * Uses lodash.throttle with { leading: true, trailing: true } to ensure\n * immediate response on first activity (leading) and also capture the final\n * event in a burst (trailing), which is important for user experience.\n */\n EVENT_THROTTLE_MS: 150,\n} as const;\n\n/**\n * Hook to detect user activity and send keep-alive signals to prevent server idle timeout.\n *\n * This hook:\n * - Listens for user activities (focus, mouse, keyboard, scroll)\n * - Sends keep-alive requests (throttled at axios layer to minimum 3 seconds)\n * - Pauses when the tab is inactive (using Page Visibility API)\n * - Immediately sends a keep-alive when tab becomes active\n * - Only activates when idle_timeout is configured on the server\n *\n * Note: The countdown in IdleTimeoutContext is based on successful keep-alive\n * API calls, not on user activity. This ensures accurate server state tracking.\n */\nexport function useIdleDetection() {\n const { data: instanceInfo, isLoading, isError } = useRecceInstanceInfo();\n const idleTimeoutContext = useIdleTimeoutSafe();\n const isDisconnected = idleTimeoutContext?.isDisconnected ?? false;\n\n // Only enable idle detection if idle_timeout is configured and not disconnected\n const idleTimeout = instanceInfo?.idle_timeout;\n const isEnabled =\n idleTimeout !== undefined && idleTimeout > 0 && !isDisconnected;\n\n // Debug: Log instance info state when debug is enabled\n debugLog(\"[Idle Detection] Instance info\", {\n isLoading,\n isError,\n hasIdleTimeout: idleTimeout !== undefined,\n idleTimeout:\n idleTimeout !== undefined ? `${idleTimeout}s` : \"not configured\",\n isDisconnected,\n isEnabled,\n });\n\n /**\n * Send keep-alive signal to server\n * Throttling is handled at the axios layer (minimum 3 seconds between API calls)\n * The successful send will notify IdleTimeoutContext to reset countdown\n */\n const sendKeepAliveNow = useCallback(async () => {\n if (document.hidden) return;\n\n const sent = await sendKeepAlive();\n\n if (sent) {\n debugLog(\"[Idle Detection] Keep-alive sent successfully\", {\n timestamp: new Date().toISOString(),\n });\n }\n }, []);\n\n /**\n * Handle any user activity event\n * Attempts to send keep-alive (axios layer handles throttling)\n */\n const handleActivity = useCallback(\n (event: Event) => {\n if (isEnabled && !document.hidden) {\n debugLog(\"[Idle Detection] Activity detected\", {\n event: event.type,\n tabActive: !document.hidden,\n });\n\n // Send keep-alive API call (axios layer handles throttling)\n void sendKeepAliveNow();\n }\n },\n [isEnabled, sendKeepAliveNow],\n );\n\n /**\n * Handle tab visibility changes\n * When tab becomes active, attempt to send keep-alive\n */\n const handleVisibilityChange = useCallback(() => {\n if (!isEnabled) return;\n\n if (!document.hidden) {\n debugLog(\"[Idle Detection] Tab became active\", {\n timestamp: new Date().toISOString(),\n });\n\n // Send keep-alive (axios layer handles throttling)\n void sendKeepAliveNow();\n }\n }, [isEnabled, sendKeepAliveNow]);\n\n // Create throttled handler using lodash to reduce JS overhead from high-frequency events\n // useMemo ensures stable reference and proper cleanup\n const throttledHandler = useMemo(\n () =>\n throttle(handleActivity, IDLE_DETECTION_CONFIG.EVENT_THROTTLE_MS, {\n leading: true,\n trailing: true,\n }),\n [handleActivity],\n );\n\n useEffect(() => {\n if (!isEnabled) {\n debugLog(\"[Idle Detection] Disabled\", {\n idleTimeout: idleTimeout,\n reason:\n idleTimeout === undefined\n ? \"idle_timeout not configured on server\"\n : idleTimeout === 0\n ? \"idle_timeout is 0\"\n : \"disconnected\",\n });\n return;\n }\n\n debugLog(\"[Idle Detection] Initialized\", {\n enabled: true,\n idleTimeout: `${idleTimeout}s`,\n eventThrottle: `${IDLE_DETECTION_CONFIG.EVENT_THROTTLE_MS}ms`,\n apiThrottle: \"3s (axios layer)\",\n monitoredEvents: IDLE_DETECTION_CONFIG.ACTIVITY_EVENTS.join(\", \"),\n });\n\n // Register activity event listeners with throttled handler\n IDLE_DETECTION_CONFIG.ACTIVITY_EVENTS.forEach((eventType) => {\n window.addEventListener(eventType, throttledHandler, { passive: true });\n });\n\n // Register visibility change listener (not throttled - immediate response needed)\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n\n // Cleanup function\n return () => {\n debugLog(\"[Idle Detection] Cleanup - removing event listeners\");\n IDLE_DETECTION_CONFIG.ACTIVITY_EVENTS.forEach((eventType) => {\n window.removeEventListener(eventType, throttledHandler);\n });\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n throttledHandler.cancel(); // Cancel any pending throttled calls\n };\n }, [isEnabled, throttledHandler, handleVisibilityChange, idleTimeout]);\n}\n","\"use client\";\n\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n getLastKeepAliveTime,\n setKeepAliveCallback,\n} from \"@/lib/api/keepAlive\";\nimport { useIdleDetection } from \"./useIdleDetection\";\nimport { useRecceInstanceInfo } from \"./useRecceInstanceInfo\";\n\n/**\n * Context for sharing idle timeout state across components\n *\n * IMPORTANT: The countdown is based on the last SUCCESSFUL keep-alive API call,\n * NOT on user activity. This ensures the countdown accurately reflects the\n * server's idle timeout state.\n */\ninterface IdleTimeoutContextType {\n /** Remaining seconds until timeout (null if idle timeout not enabled) */\n remainingSeconds: number | null;\n /** Idle timeout value from server in seconds (null if not configured) */\n idleTimeout: number | null;\n /** Whether idle timeout is enabled */\n isEnabled: boolean;\n /** Mark as disconnected - stops countdown and keep-alive */\n setDisconnected: () => void;\n /** Reset connection state - restarts countdown and keep-alive after successful reconnect */\n resetConnection: () => void;\n /** Whether the connection is disconnected */\n isDisconnected: boolean;\n}\n\nconst IdleTimeoutContext = createContext<IdleTimeoutContextType | undefined>(\n undefined,\n);\n\n/**\n * Provider for idle timeout state\n *\n * The countdown is based on lastServerSyncTime (when keep-alive API was last\n * successfully sent), not on user activity. This provides accurate server state.\n */\nexport function IdleTimeoutProvider({ children }: { children: ReactNode }) {\n const { data: instanceInfo } = useRecceInstanceInfo();\n // Track the last time we successfully synced with server (keep-alive sent)\n const lastServerSyncRef = useRef<number>(Date.now());\n const [remainingSeconds, setRemainingSeconds] = useState<number | null>(null);\n const [isDisconnected, setIsDisconnected] = useState(false);\n\n const idleTimeout = instanceInfo?.idle_timeout ?? null;\n const isEnabled = idleTimeout !== null && idleTimeout > 0;\n\n // Register callback to receive keep-alive success notifications\n // Use ref to track enabled state to avoid race condition in callback\n const isEnabledRef = useRef(isEnabled);\n useEffect(() => {\n isEnabledRef.current = isEnabled;\n }, [isEnabled]);\n\n useEffect(() => {\n if (!isEnabled) {\n setKeepAliveCallback(null);\n return;\n }\n\n setKeepAliveCallback((timestamp: number) => {\n // Check current enabled state to avoid updating after disabled\n if (isEnabledRef.current) {\n lastServerSyncRef.current = timestamp;\n }\n });\n\n // Initialize with current keep-alive time if available\n const currentTime = getLastKeepAliveTime();\n if (currentTime > 0) {\n lastServerSyncRef.current = currentTime;\n }\n\n return () => {\n setKeepAliveCallback(null);\n };\n }, [isEnabled]);\n\n const setDisconnected = useCallback(() => {\n setIsDisconnected(true);\n }, []);\n\n const resetConnection = useCallback(() => {\n // Reset disconnected state\n setIsDisconnected(false);\n // Reset server sync time to now (server just restarted, timer reset)\n lastServerSyncRef.current = Date.now();\n }, []);\n\n // Update remaining seconds every second based on server sync time\n useEffect(() => {\n if (!isEnabled || idleTimeout === null) {\n setRemainingSeconds(null);\n return;\n }\n\n // Stop updating countdown if disconnected\n if (isDisconnected) {\n return;\n }\n\n const updateCountdown = () => {\n const now = Date.now();\n const elapsedSeconds = (now - lastServerSyncRef.current) / 1000;\n const remaining = Math.max(0, idleTimeout - elapsedSeconds);\n setRemainingSeconds(remaining);\n };\n\n // Initial update\n updateCountdown();\n\n // Set up interval for updates\n const intervalId = setInterval(updateCountdown, 1000);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [isEnabled, idleTimeout, isDisconnected]);\n\n return (\n <IdleTimeoutContext.Provider\n value={{\n remainingSeconds,\n idleTimeout,\n isEnabled,\n setDisconnected,\n resetConnection,\n isDisconnected,\n }}\n >\n <IdleDetector />\n {children}\n </IdleTimeoutContext.Provider>\n );\n}\n\n/**\n * Internal component that activates idle detection\n * Placed inside provider so it has access to context\n */\nfunction IdleDetector() {\n useIdleDetection();\n return null;\n}\n\n/**\n * Hook to access idle timeout context\n * @throws Error if used outside IdleTimeoutProvider\n */\nexport function useIdleTimeout() {\n const context = useContext(IdleTimeoutContext);\n if (!context) {\n throw new Error(\"useIdleTimeout must be used within IdleTimeoutProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access idle timeout context, returns null if outside provider\n * Used internally by useIdleDetection to avoid circular dependency\n */\nexport function useIdleTimeoutSafe(): IdleTimeoutContextType | null {\n return useContext(IdleTimeoutContext) ?? null;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { cacheKeys } from \"../api/cacheKeys\";\nimport { getServerFlag, RecceServerFlags } from \"../api/flag\";\n\nexport const useRecceServerFlag = () => {\n return useQuery<RecceServerFlags>({\n queryKey: cacheKeys.flag(),\n queryFn: getServerFlag,\n });\n};\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Typography from \"@mui/material/Typography\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport path from \"path\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport { buildLineageGraph, LineageGraph } from \"@/components/lineage/lineage\";\nimport {\n RecceInstanceDisconnectedModalContent,\n ServerDisconnectedModalContent,\n} from \"@/components/lineage/ServerDisconnectedModalContent\";\nimport { toaster } from \"@/components/ui/toaster\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { cacheKeys } from \"../api/cacheKeys\";\nimport { markRelaunchHintCompleted } from \"../api/flag\";\nimport {\n getServerInfo,\n gitInfo,\n ManifestMetadata,\n pullRequestInfo,\n SQLMeshInfo,\n stateMetadata,\n} from \"../api/info\";\nimport { aggregateRuns, RunsAggregated } from \"../api/runs\";\nimport { trackSingleEnvironment } from \"../api/track\";\nimport { PUBLIC_API_URL } from \"../const\";\nimport { useIdleTimeout } from \"./IdleTimeoutContext\";\nimport { useRecceServerFlag } from \"./useRecceServerFlag\";\n\nexport interface EnvInfo {\n stateMetadata?: stateMetadata;\n adapterType?: string;\n git?: gitInfo;\n pullRequest?: pullRequestInfo;\n dbt?: {\n base: ManifestMetadata | undefined | null;\n current: ManifestMetadata | undefined | null;\n };\n sqlmesh?: SQLMeshInfo | null;\n}\n\nexport interface LineageGraphContextType {\n lineageGraph?: LineageGraph;\n envInfo?: EnvInfo;\n reviewMode?: boolean;\n cloudMode?: boolean;\n fileMode?: boolean;\n fileName?: string;\n isDemoSite: boolean;\n isCodespace?: boolean;\n isLoading?: boolean;\n error?: string;\n supportTasks?: Record<string, boolean>;\n retchLineageGraph?: () => void;\n isActionAvailable: (actionName: string) => boolean;\n\n runsAggregated?: RunsAggregated;\n refetchRunsAggregated?: () => void;\n}\n\nconst defaultLineageGraphsContext: LineageGraphContextType = {\n isActionAvailable: () => true,\n isDemoSite: false,\n};\n\nconst LineageGraphContext = createContext(defaultLineageGraphsContext);\n\ntype LineageWatcherStatus = \"pending\" | \"connected\" | \"disconnected\";\ntype EnvWatcherStatus = undefined | \"relaunch\";\n\ninterface WebSocketRefreshEvent {\n eventType: \"created\" | \"updated\" | \"deleted\";\n srcPath: string;\n}\n\ninterface WebSocketBroadcastEvent {\n id: string;\n title?: string;\n description: string;\n status?: \"info\" | \"warning\" | \"success\" | \"error\";\n position?:\n | \"top\"\n | \"top-right\"\n | \"top-left\"\n | \"bottom\"\n | \"bottom-right\"\n | \"bottom-left\";\n duration?: number;\n}\n\ntype WebSocketPayload =\n | {\n command: \"refresh\";\n event: WebSocketRefreshEvent;\n }\n | {\n command: \"relaunch\";\n }\n | {\n command: \"broadcast\";\n event: WebSocketBroadcastEvent;\n };\n\nfunction useLineageWatcher() {\n const [artifactsUpdatedToastId, setArtifactsUpdatedToastId] = useState<\n string | undefined\n >(undefined);\n\n // use ref so that the callbacks can access the latest values\n const ref = useRef<{\n ws: WebSocket | undefined;\n status: LineageWatcherStatus;\n artifactsUpdatedToastId: string | undefined;\n }>({\n ws: undefined,\n status: \"pending\",\n artifactsUpdatedToastId: undefined,\n });\n\n const [status, setStatus] = useState<LineageWatcherStatus>(\"pending\");\n const [envStatus, setEnvStatus] = useState<EnvWatcherStatus>(undefined);\n\n // Update ref in useEffect to avoid updating during render\n useEffect(() => {\n ref.current.status = status;\n }, [status]);\n\n // Keep artifactsUpdatedToastId in sync with ref\n useEffect(() => {\n ref.current.artifactsUpdatedToastId = artifactsUpdatedToastId;\n }, [artifactsUpdatedToastId]);\n\n const queryClient = useQueryClient();\n\n const invalidateCaches = useCallback(() => {\n void queryClient.invalidateQueries({ queryKey: cacheKeys.lineage() });\n void queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n void queryClient.invalidateQueries({ queryKey: cacheKeys.runs() });\n }, [queryClient]);\n\n const connect = useCallback(() => {\n function httpUrlToWebSocketUrl(url: string): string {\n return url.replace(/(http)(s)?:\\/\\//, \"ws$2://\");\n }\n\n const ws = new WebSocket(`${httpUrlToWebSocketUrl(PUBLIC_API_URL)}/api/ws`);\n ref.current.ws = ws;\n\n ws.onopen = () => {\n ws.send(\"ping\"); // server will respond with 'pong'\n };\n\n // Handling websocket messages from the server\n ws.onmessage = (event) => {\n if (event.data === \"pong\") {\n if (ref.current.status === \"disconnected\") {\n invalidateCaches();\n }\n setStatus(\"connected\");\n return;\n }\n try {\n const data = JSON.parse(event.data as string) as WebSocketPayload;\n if (data.command === \"refresh\") {\n const { eventType, srcPath } = data.event;\n const [targetName, fileName] = srcPath.split(\"/\").slice(-2);\n const name = path.parse(fileName).name;\n const eventId = `${targetName}-${name}-${eventType}`;\n if (ref.current.artifactsUpdatedToastId == null) {\n setArtifactsUpdatedToastId(\n toaster.create({\n id: eventId,\n description: `Detected ${targetName} ${name} ${eventType}`,\n type: \"info\",\n duration: 5000,\n closable: true,\n }),\n );\n }\n invalidateCaches();\n } else if (data.command === \"relaunch\") {\n setEnvStatus(\"relaunch\");\n } else {\n // Handle broadcast events\n const { id, title, description, status, duration } = data.event;\n setArtifactsUpdatedToastId(\n toaster.create({\n id: id || \"broadcast\",\n title,\n description,\n type: status ?? \"info\",\n duration: duration ?? 5000,\n closable: true,\n }),\n );\n }\n } catch (err) {\n console.error(err);\n }\n };\n ws.onerror = (err) => {\n console.error(\"An error occurred during Handling WebSockets\", err);\n };\n ws.onclose = () => {\n setStatus((status) => {\n if (status === \"connected\") {\n return \"disconnected\";\n }\n return status;\n });\n\n ref.current.ws = undefined;\n };\n }, [invalidateCaches]);\n\n useEffect(() => {\n const refObj = ref.current;\n connect();\n return () => {\n if (refObj.ws) {\n refObj.ws.close();\n }\n };\n }, [connect]);\n\n return {\n connectionStatus: status,\n connect,\n envStatus: envStatus,\n };\n}\n\ninterface LineageGraphProps {\n children: React.ReactNode;\n}\n\nexport function LineageGraphContextProvider({ children }: LineageGraphProps) {\n const {\n idleTimeout,\n remainingSeconds,\n isEnabled,\n setDisconnected,\n resetConnection,\n } = useIdleTimeout();\n\n const queryServerInfo = useQuery({\n queryKey: cacheKeys.lineage(),\n queryFn: getServerInfo,\n });\n\n const queryRunAggregated = useQuery({\n queryKey: cacheKeys.runsAggregated(),\n queryFn: aggregateRuns,\n });\n\n const lineageGraph = useMemo(() => {\n const lineage = queryServerInfo.data?.lineage;\n if (!lineage?.base) {\n return undefined;\n }\n\n return buildLineageGraph(lineage.base, lineage.current, lineage.diff);\n }, [queryServerInfo.data]);\n\n const errorMessage = queryServerInfo.error?.message;\n const {\n state_metadata: stateMetadata,\n lineage,\n sqlmesh,\n demo: isDemoSite,\n codespace: isCodespace,\n review_mode: reviewMode,\n cloud_mode: cloudMode,\n file_mode: fileMode,\n filename: fileName,\n adapter_type: adapterType,\n git,\n pull_request: pullRequest,\n support_tasks: supportTasks,\n } = queryServerInfo.data ?? {\n demo: false,\n };\n\n const dbtBase = lineage?.base.manifest_metadata;\n const dbtCurrent = lineage?.current.manifest_metadata;\n\n const envInfo: EnvInfo = {\n stateMetadata,\n adapterType,\n git,\n pullRequest,\n dbt: {\n base: dbtBase,\n current: dbtCurrent,\n },\n sqlmesh,\n };\n\n const { connectionStatus, connect, envStatus } = useLineageWatcher();\n\n // Handle connection status changes for idle timeout\n useEffect(() => {\n if (connectionStatus === \"disconnected\") {\n // Stop countdown and keep-alive when disconnected\n setDisconnected();\n } else if (connectionStatus === \"connected\") {\n // Reset countdown when reconnected (e.g., after Retry)\n resetConnection();\n }\n }, [connectionStatus, setDisconnected, resetConnection]);\n\n const { data: flags, isLoading } = useRecceServerFlag();\n const { featureToggles, shareUrl } = useRecceInstanceContext();\n const [relaunchHintOpen, setRelaunchHintOpen] = useState<boolean>(false);\n const [prevRelaunchCondition, setPrevRelaunchCondition] =\n useState<boolean>(false);\n const queryClient = useQueryClient();\n\n const isActionAvailable = useCallback(\n (name: string) => {\n if (supportTasks) {\n return supportTasks[name] ?? true; // default to true if action not found in supportTasks\n }\n // If the supportTasks does not be provided, all actions are available\n return true;\n },\n [supportTasks],\n );\n\n // Calculate if modal should be open (during render)\n const shouldShowRelaunch =\n !isLoading &&\n envStatus === \"relaunch\" &&\n flags?.single_env_onboarding === true &&\n flags.show_relaunch_hint;\n\n // Adjust state during render when condition changes\n if (shouldShowRelaunch !== prevRelaunchCondition) {\n setPrevRelaunchCondition(shouldShowRelaunch);\n setRelaunchHintOpen(shouldShowRelaunch);\n }\n\n // Track side effect only when modal opens (remains in effect)\n useEffect(() => {\n if (shouldShowRelaunch && relaunchHintOpen) {\n trackSingleEnvironment({ action: \"target_base_added\" });\n }\n }, [shouldShowRelaunch, relaunchHintOpen]);\n\n const handleRelaunchClose = () => {\n setRelaunchHintOpen(false);\n void markRelaunchHintCompleted();\n void queryClient.invalidateQueries({ queryKey: cacheKeys.flag() });\n };\n\n return (\n <>\n <LineageGraphContext.Provider\n value={{\n lineageGraph,\n retchLineageGraph: () => {\n void queryRunAggregated.refetch();\n },\n envInfo,\n reviewMode,\n cloudMode,\n fileMode,\n fileName,\n isDemoSite,\n isCodespace,\n error: errorMessage,\n supportTasks,\n isActionAvailable,\n isLoading: queryServerInfo.isLoading,\n runsAggregated: queryRunAggregated.data,\n refetchRunsAggregated: () => {\n void queryRunAggregated.refetch();\n },\n }}\n >\n {children}\n </LineageGraphContext.Provider>\n\n <MuiDialog\n open={connectionStatus === \"disconnected\"}\n onClose={() => void 0}\n >\n {shareUrl && featureToggles.mode !== null ? (\n <RecceInstanceDisconnectedModalContent\n shareUrl={shareUrl}\n mode={featureToggles.mode}\n />\n ) : (\n <ServerDisconnectedModalContent\n connect={connect}\n idleSeconds={\n // Only show idle time if disconnected due to idle timeout\n // (idle timeout enabled AND remaining time was near zero)\n isEnabled &&\n idleTimeout !== null &&\n remainingSeconds !== null &&\n remainingSeconds <= 5\n ? idleTimeout - Math.max(0, remainingSeconds)\n : undefined\n }\n />\n )}\n </MuiDialog>\n\n {flags?.single_env_onboarding && (\n <MuiDialog open={relaunchHintOpen} onClose={handleRelaunchClose}>\n <DialogTitle>Target-base Added</DialogTitle>\n <IconButton\n aria-label=\"close\"\n onClick={handleRelaunchClose}\n sx={{\n position: \"absolute\",\n right: 8,\n top: 8,\n color: \"grey.500\",\n }}\n >\n <IoClose />\n </IconButton>\n <DialogContent>\n <Typography>Please restart the Recce server.</Typography>\n </DialogContent>\n <DialogActions>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n onClick={handleRelaunchClose}\n >\n Got it!\n </Button>\n </DialogActions>\n </MuiDialog>\n )}\n </>\n );\n}\n\nexport const useLineageGraphContext = () => useContext(LineageGraphContext);\n\nexport const useRunsAggregated = () => {\n const { runsAggregated, refetchRunsAggregated } = useLineageGraphContext();\n return [runsAggregated, refetchRunsAggregated] as [\n RunsAggregated | undefined,\n () => void,\n ];\n};\n","import React from \"react\";\n\nexport const IconSync = (props: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g clipPath=\"url(#clip0_1479_25070)\">\n <path\n d=\"M15.625 0.25H14.759C14.5484 0.25 14.3791 0.423375 14.3841 0.633937L14.4575 3.71441C13.0691 1.62634 10.6955 0.25 8 0.25C4.21291 0.25 1.06041 2.96638 0.38425 6.557C0.340875 6.78728 0.518875 7 0.753219 7H1.64622C1.82353 7 1.97566 6.87556 2.013 6.70222C2.60753 3.9415 5.05991 1.875 8 1.875C10.4858 1.875 12.6232 3.35256 13.5836 5.47819L9.63394 5.38416C9.42341 5.37916 9.25 5.54844 9.25 5.75906V6.625C9.25 6.83209 9.41791 7 9.625 7H15.625C15.8321 7 16 6.83209 16 6.625V0.625C16 0.417906 15.8321 0.25 15.625 0.25ZM15.2468 9H14.3538C14.1765 9 14.0243 9.12444 13.987 9.29778C13.3925 12.0585 10.9401 14.125 8 14.125C5.51419 14.125 3.37681 12.6474 2.41637 10.5218L6.36606 10.6158C6.57659 10.6208 6.75 10.4516 6.75 10.2409V9.375C6.75 9.16791 6.58209 9 6.375 9H0.375C0.167906 9 0 9.16791 0 9.375V15.375C0 15.5821 0.167906 15.75 0.375 15.75H1.24097C1.45156 15.75 1.62088 15.5766 1.61588 15.3661L1.54253 12.2856C2.93087 14.3737 5.3045 15.75 8 15.75C11.7871 15.75 14.9396 13.0336 15.6158 9.443C15.6591 9.21272 15.4811 9 15.2468 9Z\"\n fill=\"currentColor\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1479_25070\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n};\nexport const IconExport = (props: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g clipPath=\"url(#clip0_1479_25102)\">\n <path\n d=\"M-1.88399 8.72062L0.358816 6.46094C0.594752 6.22344 1.00006 6.39031 1.00006 6.725V8.2525H4.00005V4.12438C4.00005 3.7275 4.16161 3.34313 4.44286 3.06219L7.06441 0.440625C7.34566 0.159375 7.72691 0 8.12347 0H14.5003C15.3281 0.003125 16 0.675 16 1.50281V14.5003C16 15.3281 15.3281 16 14.5003 16H5.50223C4.67411 16 4.00005 15.3281 4.00005 14.5003V11.2522H5.50005V14.5003H14.5003V1.50281H9.50128V4.75219C9.50128 5.16781 9.1669 5.50187 8.75128 5.50187H5.50005V8.25219H10.625C10.8322 8.25219 11 8.42 11 8.62719V9.37719C11 9.58438 10.8322 9.75219 10.625 9.75219H1.00006V11.2797C1.00006 11.6144 0.594752 11.7813 0.358816 11.5438L-1.88399 9.28406C-2.03867 9.12813 -2.03867 8.87656 -1.88399 8.72062ZM8.0016 4.00219V1.62469L5.62379 4.00219H8.0016Z\"\n fill=\"currentColor\"\n />\n </g>\n <g clipPath=\"url(#clip1_1479_25102)\">\n <path\n d=\"M0.103056 8.72062L2.09667 6.46094C2.30639 6.22344 2.66667 6.39031 2.66667 6.725V8.2525H5.33333V4.12438C5.33333 3.7275 5.47694 3.34313 5.72694 3.06219L8.05722 0.440625C8.30722 0.159375 8.64611 0 8.99861 0H14.6669C15.4028 0.003125 16 0.675 16 1.50281V14.5003C16 15.3281 15.4028 16 14.6669 16H6.66861C5.9325 16 5.33333 15.3281 5.33333 14.5003V11.2522H6.66667V14.5003H14.6669V1.50281H10.2233V4.75219C10.2233 5.16781 9.92611 5.50187 9.55667 5.50187H6.66667V8.25219H11.2222C11.4064 8.25219 11.5556 8.42 11.5556 8.62719V9.37719C11.5556 9.58438 11.4064 9.75219 11.2222 9.75219H2.66667V11.2797C2.66667 11.6144 2.30639 11.7813 2.09667 11.5438L0.103056 9.28406C-0.0344448 9.12813 -0.0344448 8.87656 0.103056 8.72062ZM8.89028 4.00219V1.62469L6.77666 4.00219H8.89028Z\"\n fill=\"currentColor\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1479_25102\">\n <rect\n width=\"13\"\n height=\"16\"\n fill=\"white\"\n transform=\"matrix(-1 0 0 1 16 0)\"\n />\n </clipPath>\n <clipPath id=\"clip1_1479_25102\">\n <rect width=\"3\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n};\n\nexport const IconImport = (props: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g clipPath=\"url(#clip0_1426_8619)\">\n <path\n d=\"M15.5572 3.06188L12.9356 0.440625C12.6544 0.159375 12.2731 0 11.8766 0H5.49969C4.67188 0.003125 4 0.675 4 1.50281V8.25219H0.375C0.167812 8.25219 0 8.42 0 8.62719V9.37719C0 9.58438 0.167812 9.75219 0.375 9.75219H9V11.2797C9 11.6144 9.40531 11.7812 9.64125 11.5437L11.8841 9.28406C12.0388 9.12813 12.0388 8.87656 11.8841 8.72062L9.64125 6.46094C9.40531 6.22344 9 6.39031 9 6.725V8.2525H5.49969V1.50281H10.4987V4.75219C10.4987 5.16781 10.8331 5.50187 11.2487 5.50187H14.5V14.5003H5.49969V11.2522H4V14.5003C4 15.3281 4.67188 16 5.49969 16H14.4978C15.3259 16 16 15.3281 16 14.5003V4.12406C16 3.7275 15.8384 3.34313 15.5572 3.06188ZM11.9984 4.00219V1.62469L14.3763 4.00219H11.9984Z\"\n fill=\"black\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1426_8619\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n};\n\nexport const IconSave = (props: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M14.5607 4.06066L11.9393 1.43934C11.658 1.15804 11.2765 1 10.8787 1H2.5C1.67156 1 1 1.67156 1 2.5V13.5C1 14.3284 1.67156 15 2.5 15H13.5C14.3284 15 15 14.3284 15 13.5V5.12131C15 4.72349 14.842 4.34196 14.5607 4.06066ZM9.5 2.5V5H5.5V2.5H9.5ZM13.3125 13.5H2.6875C2.63777 13.5 2.59008 13.4802 2.55492 13.4451C2.51975 13.4099 2.5 13.3622 2.5 13.3125V2.6875C2.5 2.63777 2.51975 2.59008 2.55492 2.55492C2.59008 2.51975 2.63777 2.5 2.6875 2.5H4V5.75C4 6.16422 4.33578 6.5 4.75 6.5H10.25C10.6642 6.5 11 6.16422 11 5.75V2.62131L13.4451 5.06641C13.4625 5.08382 13.4763 5.10449 13.4857 5.12724C13.4952 5.14999 13.5 5.17438 13.5 5.199V13.3125C13.5 13.3622 13.4802 13.4099 13.4451 13.4451C13.4099 13.4802 13.3622 13.5 13.3125 13.5ZM8 7.25C6.48366 7.25 5.25 8.48366 5.25 10C5.25 11.5163 6.48366 12.75 8 12.75C9.51634 12.75 10.75 11.5163 10.75 10C10.75 8.48366 9.51634 7.25 8 7.25ZM8 11.25C7.31075 11.25 6.75 10.6892 6.75 10C6.75 9.31075 7.31075 8.75 8 8.75C8.68925 8.75 9.25 9.31075 9.25 10C9.25 10.6892 8.68925 11.25 8 11.25Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\nexport const IconEdit = (props: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg\n width=\"17\"\n height=\"16\"\n viewBox=\"0 0 17 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M15.9143 1.75812L14.7422 0.585938C14.3515 0.195312 13.8397 0 13.3278 0C12.8159 0 12.304 0.195312 11.9137 0.585625L9.58593 2.91344L8.5 3.99938L0.901592 11.5975L0.504719 15.1669C0.454719 15.6163 0.80878 16 1.24847 16C1.27628 16 1.3044 15.9984 1.33253 15.9953L4.89939 15.6012L12.5006 8L13.5862 6.91437L15.914 4.58656C16.6953 3.80531 16.6953 2.53906 15.9143 1.75812ZM4.21095 14.1684L2.09909 14.4016L2.3344 12.2863L9.56062 5.06L10.53 4.09062L12.4094 5.97L11.44 6.93937L4.21095 14.1684ZM14.8534 3.52562L13.4697 4.90938L11.5906 3.03L12.9744 1.64625C13.1019 1.51875 13.2506 1.49969 13.3278 1.49969C13.405 1.49969 13.554 1.51875 13.6812 1.64625L14.8534 2.81844C15.0484 3.01375 15.0484 3.33094 14.8534 3.52562Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n\nexport const IconInfo = (props: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M7.26326 6.5462H8.71794V12.3642H7.26326V6.5462ZM7.9906 3.1102C7.43278 3.1102 6.97888 3.5641 6.97888 4.12192C6.97888 4.67974 7.43278 5.13364 7.9906 5.13364C8.54842 5.13364 9.00232 4.67974 9.00232 4.12192C9.00232 3.5641 8.54842 3.1102 7.9906 3.1102ZM16 8C16 12.411 12.411 16 8 16C3.589 16 0 12.411 0 8C0 3.589 3.589 0 8 0C12.411 0 16 3.589 16 8ZM14.5453 8C14.5453 4.3906 11.6093 1.4546 7.99992 1.4546C4.39052 1.4546 1.45452 4.3914 1.45452 8.0006C1.45452 11.6098 4.39052 14.546 7.99992 14.546C11.6093 14.546 14.5453 11.6092 14.5453 8.0006V8Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Link from \"@mui/material/Link\";\nimport MuiPopover from \"@mui/material/Popover\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { ComponentType, useRef, useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport { IconInfo } from \"@/components/icons\";\nimport { RunFormParamTypes, RunType } from \"@/components/run/registry\";\nimport {\n EXPLORE_FORM_EVENT,\n isExploreAction,\n trackExploreActionForm,\n} from \"@/lib/api/track\";\nimport { Run } from \"@/lib/api/types\";\nimport { RunFormProps } from \"./types\";\n\ninterface RunModalProps {\n isOpen: boolean;\n onClose: () => void;\n onExecute: (type: RunType, params: RunFormParamTypes) => void;\n title: string;\n type: RunType;\n params?: RunFormParamTypes;\n initialRun?: Run;\n RunForm?: ComponentType<RunFormProps<RunFormParamTypes>>;\n}\n\nconst getDocumentationUrl = (type: RunType): string | null => {\n const urlMap: Record<string, string> = {\n value_diff: \"https://docs.datarecce.io/features/lineage/#value-diff\",\n profile_diff: \"https://docs.datarecce.io/features/lineage/#profile-diff\",\n histogram_diff:\n \"https://docs.datarecce.io/features/lineage/#histogram-diff\",\n top_k_diff: \"https://docs.datarecce.io/features/lineage/#top-k-diff\",\n };\n return urlMap[type] || null;\n};\n\nexport const RunModal = ({\n isOpen,\n onClose,\n onExecute,\n type,\n title,\n params: defaultParams,\n RunForm,\n}: RunModalProps) => {\n const [params, setParams] = useState<Partial<RunFormParamTypes>>(\n defaultParams ?? {},\n );\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const [isReadyToExecute, setIsReadyToExecute] = useState(false);\n const documentationUrl = getDocumentationUrl(type);\n const executeClicked = useRef(false);\n\n const handleClose = () => {\n if (!executeClicked.current && isExploreAction(type)) {\n trackExploreActionForm({\n action: type,\n event: EXPLORE_FORM_EVENT.CANCEL,\n });\n }\n executeClicked.current = false; // Reset for next open\n onClose();\n };\n\n return (\n <MuiDialog\n open={isOpen}\n onClose={handleClose}\n maxWidth=\"sm\"\n fullWidth\n scroll=\"paper\"\n slotProps={{\n paper: { sx: { height: \"75%\", minHeight: \"400px\" } },\n }}\n >\n <DialogTitle sx={{ display: \"flex\", alignItems: \"center\" }}>\n {title}{\" \"}\n {documentationUrl && (\n <>\n <IconButton\n size=\"small\"\n aria-label=\"Click this button to learn more about the SQL behind\"\n onMouseEnter={(e) => setAnchorEl(e.currentTarget)}\n onMouseLeave={() => setAnchorEl(null)}\n onClick={() => window.open(documentationUrl, \"_blank\")}\n >\n <Box component={IconInfo} sx={{ fontSize: \"16px\" }} />\n </IconButton>\n <MuiPopover\n open={Boolean(anchorEl)}\n anchorEl={anchorEl}\n onClose={() => setAnchorEl(null)}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"right\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n disableRestoreFocus\n sx={{ pointerEvents: \"none\" }}\n slotProps={{\n paper: {\n sx: { bgcolor: \"black\", color: \"white\", p: 1 },\n },\n }}\n >\n <Typography sx={{ fontSize: \"0.875rem\" }}>\n Click{\" \"}\n <Link\n href={documentationUrl}\n target=\"_blank\"\n sx={{\n textDecoration: \"underline\",\n color: \"white\",\n \"&:hover\": { color: \"iochmara.300\" },\n }}\n >\n here\n </Link>{\" \"}\n to learn more about the SQL behind\n </Typography>\n </MuiPopover>\n </>\n )}\n </DialogTitle>\n <IconButton\n aria-label=\"close\"\n onClick={handleClose}\n sx={{\n position: \"absolute\",\n right: 8,\n top: 8,\n color: \"grey.500\",\n }}\n >\n <IoClose />\n </IconButton>\n <DialogContent\n sx={{\n p: 0,\n overflow: \"auto\",\n borderTop: \"1px solid lightgray\",\n borderBottom: \"1px solid lightgray\",\n }}\n >\n <Box sx={{ contain: \"layout\" }}>\n {RunForm && (\n <RunForm\n params={params}\n onParamsChanged={setParams}\n setIsReadyToExecute={setIsReadyToExecute}\n />\n )}\n </Box>\n </DialogContent>\n <DialogActions>\n <Stack direction=\"row\" spacing=\"10px\">\n <Button\n disabled={!isReadyToExecute}\n color=\"iochmara\"\n variant=\"contained\"\n onClick={() => {\n executeClicked.current = true;\n if (isExploreAction(type)) {\n trackExploreActionForm({\n action: type,\n event: EXPLORE_FORM_EVENT.EXECUTE,\n });\n }\n onExecute(type, params as RunFormParamTypes);\n }}\n >\n Execute\n </Button>\n </Stack>\n </DialogActions>\n </MuiDialog>\n );\n};\n","import _ from \"lodash\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { LineageGraphNode } from \"@/components/lineage/lineage\";\nimport { getModelInfo, NodeColumnData, NodeData } from \"../api/info\";\nimport { useLineageGraphContext } from \"./LineageGraphContext\";\n\nexport function extractColumns(node: LineageGraphNode) {\n function getColumns(nodeData: NodeData | undefined) {\n return nodeData?.columns\n ? Object.values(nodeData.columns).filter((c) => c != null)\n : [];\n }\n\n const baseColumns = getColumns(node.data.data.base);\n const currentColumns = getColumns(node.data.data.current);\n\n return unionColumns(baseColumns, currentColumns);\n}\n\nexport function unionColumns(\n baseColumns: NodeColumnData[],\n currentColumns: NodeColumnData[],\n) {\n const union: NodeColumnData[] = [];\n baseColumns.forEach((column) => {\n if (!union.some((c) => c.name === column.name)) {\n union.push(column);\n }\n });\n currentColumns.forEach((column) => {\n if (!union.some((c) => c.name === column.name)) {\n union.push(column);\n }\n });\n\n return union;\n}\n\nconst useModelColumns = (model: string | undefined) => {\n const { lineageGraph } = useLineageGraphContext();\n\n const node = _.find(lineageGraph?.nodes, {\n data: {\n name: model,\n },\n });\n\n const nodeColumns = useMemo(() => {\n return node ? extractColumns(node) : [];\n }, [node]);\n\n const [columns, setColumns] = useState<NodeColumnData[]>([]);\n const [primaryKey, setPrimaryKey] = useState<string>();\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | null>(null);\n const [prevNodeColumns, setPrevNodeColumns] = useState<NodeColumnData[]>([]);\n const [prevNodeId, setPrevNodeId] = useState(node?.id);\n\n const nodePrimaryKey = node ? node.data.data.current?.primary_key : undefined;\n\n const fetchData = useCallback(async () => {\n if (!node) {\n return;\n }\n try {\n const data = await getModelInfo(node.id);\n const modelInfo = data.model;\n if (!modelInfo.base.columns || !modelInfo.current.columns) {\n setColumns([]);\n return;\n }\n setPrimaryKey(modelInfo.current.primary_key);\n const baseColumns = Object.values(modelInfo.base.columns);\n const currentColumns = Object.values(modelInfo.current.columns);\n setColumns(unionColumns(baseColumns, currentColumns));\n } catch (error) {\n setError(error as Error);\n }\n }, [node]);\n\n // Adjust state during render when node changes\n if (nodeColumns !== prevNodeColumns || node?.id !== prevNodeId) {\n setPrevNodeColumns(nodeColumns);\n setPrevNodeId(node?.id);\n\n if (nodeColumns.length > 0) {\n setColumns(nodeColumns);\n setPrimaryKey(nodePrimaryKey);\n setIsLoading(false);\n } else if (node?.id === undefined) {\n setColumns([]);\n setIsLoading(false);\n }\n // Note: fetchData case is handled separately in effect below\n }\n\n // Fetch data effect - only runs when we need to fetch\n useEffect(() => {\n if (nodeColumns.length === 0 && node?.id !== undefined) {\n // fetchData() is a legitimate side effect, leaving\n // eslint-disable-next-line react-hooks/set-state-in-effect\n fetchData().catch((e: unknown) => {\n // error is already handled in fetchData()\n console.error(e);\n });\n setIsLoading(false);\n }\n }, [fetchData, node?.id, nodeColumns]);\n\n return { columns, primaryKey, isLoading, error };\n};\n\nexport default useModelColumns;\n","import Box from \"@mui/material/Box\";\nimport FormControl from \"@mui/material/FormControl\";\nimport FormLabel from \"@mui/material/FormLabel\";\nimport NativeSelect from \"@mui/material/NativeSelect\";\nimport { HistogramDiffParams } from \"@/lib/api/profile\";\nimport useModelColumns from \"@/lib/hooks/useModelColumns\";\nimport { RunFormProps } from \"../run/types\";\n\nfunction isStringDataType(columnType: string) {\n const stringDataTypes = [\n \"CHAR\",\n \"VARCHAR\",\n \"TINYTEXT\",\n \"TEXT\",\n \"MEDIUMTEXT\",\n \"LONGTEXT\",\n \"NCHAR\",\n \"NVARCHAR\",\n \"VARCHAR2\",\n \"NVARCHAR2\",\n \"CLOB\",\n \"NCLOB\",\n \"VARCHAR(MAX)\",\n \"XML\",\n \"JSON\",\n ];\n // Normalize columnType by removing spaces and converting to uppercase\n const normalizedType = columnType.trim().toUpperCase();\n\n // Check if columnType is in the predefined list\n if (stringDataTypes.includes(normalizedType)) {\n return true;\n }\n\n // Match types that have a length specification (e.g., VARCHAR(255))\n const regex = /^(VARCHAR|NVARCHAR|VARCHAR2|NVARCHAR2|CHAR|NCHAR)\\(\\d+\\)$/;\n return regex.test(normalizedType);\n}\n\nfunction isBooleanDataType(columnType: string) {\n const booleanDataTypes = [\n \"BOOLEAN\", // PostgreSQL, SQLite, and others with native boolean support\n \"TINYINT(1)\", // MySQL/MariaDB uses TINYINT(1) to represent boolean values\n \"BIT\", // SQL Server and others use BIT to represent boolean values, where 1 is true and 0 is false\n \"NUMBER(1)\", // Oracle uses NUMBER(1) where 1 is true and 0 is false, as it does not have a native BOOLEAN type\n \"BOOL\", // Snowflake and PostgreSQL also support BOOL as an alias for BOOLEAN\n ];\n return booleanDataTypes.includes(columnType.toUpperCase());\n}\n\nfunction isDateTimeType(columnType: string) {\n const sql_datetime_types = [\n \"DATE\",\n \"DATETIME\",\n \"TIMESTAMP\",\n \"TIME\",\n \"YEAR\", // Specific to MySQL/MariaDB\n \"DATETIME2\",\n \"SMALLDATETIME\",\n \"DATETIMEOFFSET\", // Specific to SQL Server\n \"INTERVAL\", // Common in PostgreSQL and Oracle\n \"TIMESTAMPTZ\",\n \"TIMETZ\", // Specific to PostgreSQL\n \"TIMESTAMP WITH TIME ZONE\",\n \"TIMESTAMP WITH LOCAL TIME ZONE\", // Oracle\n \"TIMESTAMP_LTZ\",\n \"TIMESTAMP_NTZ\",\n \"TIMESTAMP_TZ\", // Specific to Snowflake\n ];\n return sql_datetime_types.includes(columnType.toUpperCase());\n}\n\ntype HistogramDiffEditProps = RunFormProps<HistogramDiffParams>;\n\nexport function supportsHistogramDiff(columnType: string) {\n return (\n !isStringDataType(columnType) &&\n !isBooleanDataType(columnType) &&\n !isDateTimeType(columnType)\n );\n}\n\nexport function HistogramDiffForm({\n params,\n onParamsChanged,\n setIsReadyToExecute,\n}: HistogramDiffEditProps) {\n const {\n columns: allColumns,\n isLoading,\n error,\n } = useModelColumns(params.model);\n const columns = allColumns.filter(\n (c) =>\n !isStringDataType(c.type) &&\n !isBooleanDataType(c.type) &&\n !isDateTimeType(c.type),\n );\n\n if (isLoading) {\n return <Box>Loading...</Box>;\n }\n\n if (allColumns.length === 0 || error) {\n return (\n <Box>\n Error: Please provide the &apos;catalog.json&apos; to list column\n candidates\n </Box>\n );\n }\n\n return (\n <Box sx={{ m: \"16px\" }}>\n <FormControl fullWidth disabled={columns.length === 0}>\n <FormLabel sx={{ mb: 1 }}>\n Pick a column to show Histogram Diff\n </FormLabel>\n <NativeSelect\n value={params.column_name}\n onChange={(e) => {\n const columnName = e.target.value;\n setIsReadyToExecute(!!columnName);\n const columnType =\n columns.find((c) => c.name === columnName)?.type ?? \"\";\n onParamsChanged({\n ...params,\n column_name: columnName,\n column_type: columnType,\n });\n }}\n >\n <option value=\"\">\n {columns.length !== 0\n ? \"Select column\"\n : \"No numeric column is available\"}\n </option>\n {columns.map((c) => (\n <option key={c.name} value={c.name} className=\"no-track-pii-safe\">\n {c.name} : {c.type}\n </option>\n ))}\n </NativeSelect>\n </FormControl>\n </Box>\n );\n}\n","import { formatInTimeZone } from \"@jeromefitz/date-fns-tz\";\nimport { TopKResult } from \"@/lib/api/profile\";\n\nconst NO_VALUE = \"-\";\n\n/**\n * \"Formatters\" -- these are your data formatting that returns a formatted value for UI presentation (e.g. number, string, falsey)\n */\n\n/**\n * Source: https://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript\n * @param bytes\n * @param decimals\n * @returns a string that matches nearest byte unit (e.g. kb, mb, gb, etc)\n */\nexport function formatBytes(bytes?: number, decimals = 2) {\n if (bytes === undefined) return;\n if (!bytes) return \"0 Bytes\";\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n}\n/**\n * @param dateStr ISO date string\n * @returns a formatted date string in 'yyyy/MM/dd HH:mm:ss'\n */\nexport function formatReportTime(dateStr?: string) {\n if (!dateStr) return;\n const date = new Date(dateStr);\n const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n return formatInTimeZone(date, userTimezone, \"yyyy-MM-dd HH:mm:ss zzz\");\n}\n\n/**\n *\n * @param num number type input\n * @param locales locale string\n * @param options\n * @returns a formatted string number, based on locale & options\n */\nexport function formatNumber(\n num: number | string | undefined,\n locales = \"en-US\",\n options?: Intl.NumberFormatOptions,\n) {\n if (typeof num !== \"number\") return num;\n return new Intl.NumberFormat(locales, options).format(num);\n}\n\n/**\n * @param num fractional number type input\n * @returns a formatted percentage string, based on its percentage proximity to either ends (<0.1% and >99.9%)\n */\nexport function formatIntervalMinMax(num: number) {\n // * should show <0.1 % if the value is between (0%, 0.1%]\n const isLowerBound = num > 0 && num <= 0.001;\n // * should show >99.9% if the value is between [99.9%, 100%) .\n const isUpperBound = num < 1 && num >= 0.999;\n\n const formatter = (newArg = num) =>\n formatNumber(newArg, \"en-US\", {\n style: \"percent\",\n minimumFractionDigits: 1,\n });\n\n if (isLowerBound) {\n const result = formatter(0.001);\n return `<${result}`;\n } else if (isUpperBound) {\n const result = formatter(0.999);\n return `>${result}`;\n }\n return formatter();\n}\n\n// SR side: No need for object record handling\n// CR side: needs record handling\nexport function formatTestExpectedOrActual(value?: unknown): unknown {\n if (!value) {\n return NO_VALUE;\n }\n\n // Needed due to comparison's get assertions DS\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n // return Object.keys(value).map((key) =>\n // typeof value[key] === 'string' ? value[key] : JSON.stringify(value[key]),\n // );\n }\n\n return value;\n}\n\n/**\n show the most common values (aka Mode)\n * give null if type invalids\n * skip null value\n * show top 2 if the values share the same counting, examples:\n (more than 2) a:100, b:100, c:100 => a, b, ...\n (2) a:100, b:100 => a\n (2) null:100, a:100, b:100 => a, b\n (2) null:101, a:100, b:100 => a, b\n (2) a:100, b:100 => a, b\n (1) a:100 => a\n (1) a:100, b:99, c:99 => a\n */\nexport function formatTopKMetrics(topK?: TopKResult): {\n topValues?: string;\n topCounts?: string;\n} {\n if (!topK) return {};\n const { counts, values } = topK;\n const topValues = `${values[0]}`;\n const topCounts = `${counts[0]}`;\n\n return {\n topValues,\n topCounts,\n };\n}\n\n/**\n * A method to handle falsey non-numbers (relevant for comparison reports with column shifts, where base/target values can be undefined)\n * @param value {string | number} any value that will be checked as number\n * @param fn {function} any function to format the valid number\n * @param emptyLabel {string} the return value if falsey value\n */\nexport function formatColumnValueWith(\n value: string | number,\n fn: (input: number) => string,\n emptyLabel: string = NO_VALUE,\n): string {\n if (typeof value === \"string\") return value;\n return isNaN(value) ? emptyLabel : fn(value);\n}\n\n/**\n *\n * @param input string to check for truncation with '...'\n * @param end position at which to truncate\n * @returns original or tooltip-wrapped truncated string\n */\nexport function formatTruncateString(input: string, end: number) {\n const shouldTruncate = input.length >= end;\n return shouldTruncate ? input.slice(0, end) + \"...\" : input;\n}\n/**\n * base < -2 => 2dp, scientific (small decimals)\n * base < 0 => 3dp (big decimals)\n * base < 3 => 2dp (ones, tens, hundreds)\n * base < 6 => 1dp, K (thousands)\n * base < 9 => 1dp, M (millions)\n * base < 12 => 1dp, T (trillions)\n * base < 15 => 1dp, B (billions)\n * base >= 15 => 0dp, B (billions)\n * @param input\n * @returns a formatted number by abbreviation, based on its order of magnitude\n */\nexport function formatAsAbbreviatedNumber(input: number | string) {\n // type guard for numbers (e.g. datetime strings)\n if (typeof input !== \"number\") return input;\n else {\n // convert negatives\n const inputAsPositive = Math.abs(input);\n\n const twoDecimal = 10 ** -2;\n const thousand = 10 ** 3;\n const million = 10 ** 6;\n const billion = 10 ** 9;\n const trillion = 10 ** 12;\n const trillionPlus = 10 ** 15;\n\n const isLargeFractionals = inputAsPositive >= twoDecimal;\n const isOnesTensHundreds = inputAsPositive >= 1;\n const isThousands = inputAsPositive >= thousand;\n const isMillions = inputAsPositive >= million;\n const isBillions = inputAsPositive >= billion;\n const isSmallTrillions = inputAsPositive >= trillion;\n const isLargeTrillions = inputAsPositive >= trillionPlus;\n\n // format as 'T' and beyond (trillions+)\n if (isLargeTrillions || isSmallTrillions)\n return new Intl.NumberFormat(\"en-US\", {\n style: \"unit\",\n unit: \"liter\", //just a placeholder\n unitDisplay: \"narrow\",\n maximumFractionDigits: isLargeTrillions ? 0 : 2,\n })\n .format(input / 1.0e12)\n .replace(\"L\", \"T\");\n // format as 'B', 'M', 'K' (billions to thousands)\n else if (isBillions || isMillions || isThousands) {\n const lookup = {\n base: isBillions ? billion : isMillions ? million : thousand,\n unit: isBillions ? \"B\" : isMillions ? \"M\" : \"K\",\n };\n return new Intl.NumberFormat(\"en-US\", {\n style: \"unit\",\n unit: \"liter\", //just a placeholder\n unitDisplay: \"narrow\",\n maximumFractionDigits: 1,\n })\n .format(input / lookup.base)\n .replace(\"L\", lookup.unit);\n }\n // format as unlabeled (1 to 999)\n else if (isOnesTensHundreds)\n return new Intl.NumberFormat(\"en-US\", {\n maximumFractionDigits: 2,\n }).format(input);\n // format as fractionals (< 1)\n else\n return new Intl.NumberFormat(\"en-US\", {\n maximumFractionDigits: isLargeFractionals ? 3 : 2,\n notation:\n isLargeFractionals || inputAsPositive === 0\n ? \"standard\"\n : \"scientific\",\n }).format(input);\n }\n}\n\n/**\n * formats as 'Category' instead of 'category' or 'CATEGORY'\n */\nexport function formatTitleCase(input?: string) {\n if (!input) return NO_VALUE;\n const start = input.slice(0, 1).toUpperCase();\n const rest = input.slice(1).toLowerCase();\n return `${start}${rest}`;\n}\n","import Box from \"@mui/material/Box\";\n\nexport const CURRENT_BAR_COLOR = \"#63B3ED\";\nexport const BASE_BAR_COLOR = \"#F6AD55\";\nexport const CURRENT_BAR_COLOR_WITH_ALPHA = `${CURRENT_BAR_COLOR}A5`;\nexport const BASE_BAR_COLOR_WITH_ALPHA = `${BASE_BAR_COLOR}A5`;\n\nexport function SquareIcon({ color }: { color: string }) {\n return (\n <Box\n sx={{\n display: \"inline-block\",\n width: \"10px\",\n height: \"10px\",\n bgcolor: color,\n mr: 1,\n borderRadius: \"4px\",\n }}\n />\n );\n}\n","import {\n AnimationOptions,\n BarElement,\n CategoryScale,\n ChartData,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n ScaleOptions,\n TimeSeriesScale,\n Title,\n Tooltip,\n} from \"chart.js\";\nimport { Chart } from \"react-chartjs-2\";\nimport { HistogramResult } from \"@/lib/api/profile\";\nimport {\n formatAsAbbreviatedNumber,\n formatIntervalMinMax,\n} from \"@/utils/formatters\";\nimport {\n BASE_BAR_COLOR_WITH_ALPHA,\n CURRENT_BAR_COLOR_WITH_ALPHA,\n} from \"./SquareIcon\";\n\nexport const INFO_VAL_COLOR = \"#63B3ED\";\nexport const DATE_RANGE = \"Date Range\";\nexport const TEXTLENGTH = \"Text Length\";\nexport const VALUE_RANGE = \"Value Range\";\n\n/**\n * Histogram Chart that can display generic data types such as Numeric, Datetime, Integer\n * X: The Min/Max of the labels range is the scaled width of charting area\n * Y: The Min/Max of the counts range is the scaled height of charting area\n * Counts: Abbreviated based on K, Mn, Bn, Tr (see formatters)\n */\n\ninterface HistogramChartProps {\n data: {\n title: string;\n type: string;\n samples?: number;\n min?: string | number;\n max?: string | number;\n binEdges: number[];\n datasets: HistogramResult[];\n };\n animation?: AnimationOptions<\"bar\">[\"animation\"];\n hideAxis?: boolean;\n}\n\nexport function HistogramChart({\n data,\n hideAxis = false,\n animation = false,\n}: HistogramChartProps) {\n ChartJS.register(\n BarElement,\n TimeSeriesScale,\n LinearScale,\n CategoryScale,\n Title,\n Legend,\n Tooltip,\n );\n\n const chartOptions = getHistogramChartOptions(data, hideAxis, { animation });\n\n // Histograms are a mix between bar and scatter options (union)\n // uses cartesian x,y coordinates to plot and infer labels\n const chartData = getHistogramChartData(data);\n\n //infer `any` to allow for union data configurations & options\n return (\n <Chart type=\"bar\" options={chartOptions} data={chartData} plugins={[]} />\n );\n}\n\nfunction getHistogramChartDataset(\n type: string,\n binEdges: number[],\n label: string,\n color: string,\n data: HistogramResult,\n) {\n const isDatetime = type === \"datetime\";\n const { counts = [] } = data;\n const newData: (number | [number, number])[] = isDatetime\n ? counts.map((v, i) => [binEdges[i], v] as [number, number])\n : counts;\n return {\n label,\n data: newData,\n backgroundColor: color,\n borderColor: color,\n hoverBackgroundColor: color,\n borderWidth: 0,\n categoryPercentage: 1, // tells bar to fill \"bin area\"\n barPercentage: 1, //tells bar to fill \"bar area\"\n xAxisID: \"x\",\n };\n}\n\nexport function getHistogramChartData(\n data: HistogramChartProps[\"data\"],\n): ChartData<\"bar\"> {\n const { datasets, type, binEdges } = data;\n const [base, current] = datasets;\n const currentDataset = getHistogramChartDataset(\n type,\n binEdges,\n \"Current\",\n CURRENT_BAR_COLOR_WITH_ALPHA,\n current,\n );\n const baseDataset = getHistogramChartDataset(\n type,\n binEdges,\n \"Base\",\n BASE_BAR_COLOR_WITH_ALPHA,\n base,\n );\n\n const newLabels = binEdges\n .map((v, i) => formatDisplayedBinItem(binEdges, i))\n .slice(0, -1); // exclude last\n\n return {\n labels: newLabels,\n datasets: [currentDataset, baseDataset],\n };\n}\n\nexport function getHistogramChartOptions(\n data: HistogramChartProps[\"data\"],\n hideAxis = false,\n { ...configOverrides }: ChartOptions<\"bar\"> = {},\n): ChartOptions<\"bar\"> {\n const { title, datasets, type, samples = 0, binEdges } = data;\n const [base, current] = datasets;\n const isDatetime = type === \"datetime\";\n return {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n reverse: true,\n },\n title: {\n display: true,\n text: title,\n font: {\n size: 20,\n },\n },\n tooltip: {\n mode: \"index\",\n // position: 'nearest',\n intersect: false,\n callbacks: {\n title([{ dataIndex, datasetIndex }]) {\n const result = formatDisplayedBinItem(binEdges, dataIndex);\n\n const prefix = isDatetime\n ? DATE_RANGE\n : type === \"string\"\n ? TEXTLENGTH\n : VALUE_RANGE;\n\n return `${prefix}\\n${result}`;\n },\n label({ datasetIndex, dataIndex, dataset: { label } }) {\n const counts = datasetIndex === 0 ? current.counts : base.counts;\n const percentOfTotal = formatIntervalMinMax(\n counts[dataIndex] / samples,\n );\n const count = counts[dataIndex];\n return `${label}: ${count} (${percentOfTotal})`;\n },\n },\n },\n },\n scales: getScales(data, hideAxis),\n ...configOverrides,\n };\n}\n/**\n * get x, y scales for histogram (dynamic based on datetime or not)\n */\nfunction getScales(\n { datasets, min = 0, max = 0, type, binEdges }: HistogramChartProps[\"data\"],\n hideAxis = false,\n) {\n const isDatetime = type === \"datetime\";\n const [base, current] = datasets;\n const maxCount = Math.max(...current.counts, ...base.counts);\n\n const newLabels = binEdges\n .map((v, i) => formatDisplayedBinItem(binEdges, i))\n .slice(0, -1); // exclude last\n\n //swap x-scale when histogram is datetime\n const xScaleDate: ScaleOptions = {\n display: !hideAxis,\n type: \"timeseries\", // each datum is spread w/ equal distance\n min,\n max,\n adapters: {\n date: {},\n },\n time: {\n minUnit: \"day\",\n },\n grid: { display: false },\n ticks: {\n minRotation: 30,\n maxRotation: 30,\n maxTicksLimit: 8,\n },\n };\n /**\n * NOTE: Category doesn't accept (min/max) -- will distort scales!\n */\n const xScaleCategory: ScaleOptions = {\n display: !hideAxis,\n type: \"category\", //Linear doesn't understand bins!\n grid: { display: false },\n ticks: {\n callback(val, index) {\n return newLabels[index];\n },\n },\n stacked: true,\n };\n const xScaleBase = isDatetime ? xScaleDate : xScaleCategory;\n\n const yScaleBase: ScaleOptions = {\n display: !hideAxis,\n type: \"linear\",\n max: maxCount, //NOTE: do not add `min` since if they are equal nothing gets displayed sometimes\n border: { dash: [2, 2] },\n grid: {\n color: \"lightgray\",\n },\n ticks: {\n maxTicksLimit: 8,\n callback: function (val) {\n //slow, but necessary since chart-data is a number and can be hard to display\n return formatAsAbbreviatedNumber(val);\n },\n },\n beginAtZero: true,\n };\n return { x: xScaleBase, y: yScaleBase };\n}\n/**\n * @returns a formatted, abbreviated, histogram bin display text\n */\nfunction formatDisplayedBinItem(binEdges: number[], currentIndex: number) {\n const startEdge = binEdges[currentIndex];\n const endEdge = binEdges[currentIndex + 1];\n\n const formattedStart = formatAsAbbreviatedNumber(startEdge);\n const formattedEnd = formatAsAbbreviatedNumber(endEdge);\n\n return `${formattedStart} - ${formattedEnd}`;\n}\n","import type { BoxProps } from \"@mui/material/Box\";\nimport Box from \"@mui/material/Box\";\nimport { forwardRef, Ref } from \"react\";\n\ninterface ScreenshotBoxProps extends BoxProps {\n backgroundColor?: string;\n blockSize?: string;\n children?: React.ReactNode;\n}\n\nexport const ScreenshotBox = forwardRef(\n (\n {\n backgroundColor = \"white\",\n blockSize,\n children,\n ...restProps\n }: ScreenshotBoxProps,\n ref: Ref<HTMLDivElement>,\n ) => {\n return (\n <Box\n ref={ref}\n {...restProps}\n sx={{ overflowY: \"auto\", overflowX: \"hidden\", ...restProps.sx }}\n >\n <Box\n sx={{\n backgroundColor,\n height: \"100%\",\n blockSize,\n }}\n >\n {children}\n </Box>\n </Box>\n );\n },\n);\n","import Box from \"@mui/material/Box\";\nimport { forwardRef, Ref } from \"react\";\nimport { HistogramDiffParams } from \"@/lib/api/profile\";\nimport { isHistogramDiffRun } from \"@/lib/api/types\";\nimport { HistogramChart } from \"../charts/HistogramChart\";\nimport { RunResultViewProps } from \"../run/types\";\nimport { ScreenshotBox } from \"../screenshot/ScreenshotBox\";\n\ntype HistogramDiffResultViewProp = RunResultViewProps;\n\nfunction _HistogramDiffResultView(\n { run }: HistogramDiffResultViewProp,\n ref: Ref<HTMLDivElement>,\n) {\n if (!isHistogramDiffRun(run)) {\n throw new Error(\"Run type must be histogram_diff\");\n }\n\n const params = run.params as HistogramDiffParams;\n const base = run.result?.base;\n const current = run.result?.current;\n const min = run.result?.min;\n const max = run.result?.max;\n const binEdges = run.result?.bin_edges ?? [];\n\n if (!base || !current) {\n return <div>Loading...</div>;\n }\n\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n <ScreenshotBox ref={ref} height=\"100%\">\n <Box sx={{ display: \"flex\", flexDirection: \"row\" }}>\n <Box sx={{ flex: 1 }} />\n <Box sx={{ width: \"80%\", height: \"35vh\", m: 4 }}>\n <HistogramChart\n data={{\n title: `Model ${params.model}.${params.column_name}`,\n type: run.params?.column_type ?? \"\",\n datasets: [base, current],\n min: min,\n max: max,\n samples: base.total,\n binEdges: binEdges,\n }}\n />\n </Box>\n <Box sx={{ flex: 1 }} />\n </Box>\n </ScreenshotBox>\n </Box>\n );\n}\n\nexport const HistogramDiffResultView = forwardRef(_HistogramDiffResultView);\n","import Box from \"@mui/material/Box\";\nimport Checkbox from \"@mui/material/Checkbox\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\nimport Stack from \"@mui/material/Stack\";\nimport TextField from \"@mui/material/TextField\";\nimport Typography from \"@mui/material/Typography\";\nimport { useEffect, useState } from \"react\";\nimport ReactSelect, {\n type CSSObjectWithLabel,\n type MultiValue,\n} from \"react-select\";\nimport useModelColumns from \"@/lib/hooks/useModelColumns\";\nimport { RunFormProps } from \"../run/types\";\n\ninterface ColumnOption {\n label: string;\n value: string;\n}\n\nexport interface ProfileDiffFormParams {\n model: string;\n primary_key?: string | (string | undefined)[];\n columns?: string[];\n}\n\ntype ProfileDiffFormProp = RunFormProps<ProfileDiffFormParams>;\n\nexport function ProfileDiffForm({\n params,\n onParamsChanged,\n setIsReadyToExecute,\n}: ProfileDiffFormProp) {\n const [allColumns, setAllColumns] = useState<boolean>(\n !params.columns || params.columns.length === 0,\n );\n\n const model = params.model;\n\n const { columns, isLoading, error } = useModelColumns(params.model);\n\n useEffect(() => {\n setIsReadyToExecute(!!model);\n }, [model, setIsReadyToExecute]);\n\n const columnNames = columns.map((c) => c.name);\n\n if (isLoading) {\n return <Box>Loading...</Box>;\n }\n\n if (columnNames.length === 0 || error) {\n return (\n <Box>\n Error: Please provide the &apos;catalog.json&apos; to list column\n candidates\n </Box>\n );\n }\n\n return (\n <Stack spacing={5} sx={{ m: \"8px 24px\", pb: \"200px\" }}>\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n Model\n </Typography>\n <TextField\n fullWidth\n size=\"small\"\n value={params.model}\n slotProps={{ input: { readOnly: true } }}\n />\n </Box>\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n Columns\n </Typography>\n <FormControlLabel\n control={\n <Checkbox\n checked={allColumns}\n onChange={(e) => {\n setAllColumns(e.target.checked);\n onParamsChanged({\n ...params,\n columns: undefined,\n });\n }}\n size=\"small\"\n />\n }\n label=\"All columns\"\n sx={{ mb: \"10px\" }}\n />\n {!allColumns && (\n <ReactSelect\n isMulti\n className=\"no-track-pii-safe\"\n closeMenuOnSelect={false}\n options={columnNames.map((c) => ({ label: c, value: c }))}\n value={(params.columns ?? []).map((c) => ({\n label: c,\n value: c,\n }))}\n onChange={(newValue: MultiValue<ColumnOption>) => {\n let cols: string[] | undefined;\n const newCols = Array.isArray(newValue)\n ? newValue.map((v) => v.value)\n : [];\n if (newCols.length === 0) {\n cols = undefined;\n } else {\n cols = newCols;\n }\n onParamsChanged({\n ...params,\n columns: cols,\n });\n }}\n styles={{\n container: (base: CSSObjectWithLabel) => ({\n ...base,\n width: \"100%\",\n }),\n control: (base: CSSObjectWithLabel) => ({\n ...base,\n minHeight: \"40px\",\n }),\n }}\n />\n )}\n </Box>\n </Stack>\n );\n}\n","/**\n * @file columnBuilders.ts\n * @description Column configuration utilities for data grids\n *\n * Provides helper functions for building column configurations.\n * Note: React components for headers are kept in diffColumnBuilder.tsx\n * to maintain separation between pure logic and React components.\n */\n\nimport { ColumnRenderMode, ColumnType } from \"@/lib/api/types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ColumnConfig {\n key: string;\n name: string;\n columnType: ColumnType;\n columnStatus?: string;\n columnRenderMode?: ColumnRenderMode;\n frozen?: boolean;\n isPrimaryKey?: boolean;\n}\n\nexport interface ColumnOrderConfig {\n primaryKeys: string[];\n pinnedColumns: string[];\n allColumns: string[];\n excludeColumns?: string[];\n}\n\nexport interface GridColumnsConfig {\n columnMap: Record<\n string,\n { key: string; colType: ColumnType; status?: string }\n >;\n primaryKeys: string[];\n pinnedColumns: string[];\n columnsRenderMode: Record<string, ColumnRenderMode>;\n changedOnly?: boolean;\n rowStats?: { added: number; removed: number; modified: number };\n excludeColumns?: string[];\n /**\n * When true, throws an error if a primary key or pinned column is not found\n * in the columnMap. When false (default), silently skips missing columns.\n *\n * - querydiff: uses false (lenient, handles schema differences)\n * - valuediff: uses true (strict, PKs must exist)\n */\n strictMode?: boolean;\n}\n\n// ============================================================================\n// Column Order Builder\n// ============================================================================\n\n/**\n * Determines the order of columns based on primary keys, pinned columns,\n * and remaining columns.\n *\n * @returns Array of column names in the correct display order\n */\nexport function buildColumnOrder(config: ColumnOrderConfig): string[] {\n const {\n primaryKeys,\n pinnedColumns,\n allColumns,\n excludeColumns = [],\n } = config;\n\n const order: string[] = [];\n const added = new Set<string>();\n\n const isExcluded = (key: string) => excludeColumns.includes(key);\n\n // Add primary keys first\n primaryKeys.forEach((key) => {\n if (!added.has(key) && !isExcluded(key)) {\n order.push(key);\n added.add(key);\n }\n });\n\n // Add pinned columns\n pinnedColumns.forEach((key) => {\n if (!added.has(key) && !isExcluded(key)) {\n order.push(key);\n added.add(key);\n }\n });\n\n // Add remaining columns\n allColumns.forEach((key) => {\n if (!added.has(key) && !isExcluded(key)) {\n order.push(key);\n added.add(key);\n }\n });\n\n return order;\n}\n\n// ============================================================================\n// Column Filtering Helpers\n// ============================================================================\n\n/**\n * Checks if a column should be included based on changedOnly filter\n */\nexport function shouldIncludeColumn(\n columnStatus: string | undefined,\n changedOnly: boolean,\n hasModifiedRows: boolean,\n): boolean {\n if (!changedOnly || !hasModifiedRows) {\n return true;\n }\n\n return (\n columnStatus === \"added\" ||\n columnStatus === \"removed\" ||\n columnStatus === \"modified\"\n );\n}\n\n/**\n * Checks if a column is a primary key (exact matching)\n */\nexport function isPrimaryKeyColumn(\n columnName: string,\n primaryKeys: string[],\n): boolean {\n return primaryKeys.includes(columnName);\n}\n\n/**\n * Checks if a column is pinned (exact matching)\n */\nexport function isPinnedColumn(\n columnName: string,\n pinnedColumns: string[],\n): boolean {\n return pinnedColumns.includes(columnName);\n}\n\n/**\n * Checks if a column should be excluded from display (exact matching)\n */\nexport function isExcludedColumn(\n columnName: string,\n excludeColumns: string[],\n): boolean {\n return excludeColumns.includes(columnName);\n}\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\n/**\n * Finds a column in the columnMap (exact matching)\n */\nfunction findColumn(\n columnMap: GridColumnsConfig[\"columnMap\"],\n name: string,\n): { key: string; colType: ColumnType; status?: string } | undefined {\n return columnMap[name];\n}\n\n// ============================================================================\n// Column Configuration Helpers\n// ============================================================================\n\n/**\n * Gets the list of columns to display for a diff grid\n *\n * @description Builds an ordered list of column configurations:\n * 1. Primary key columns (frozen)\n * 2. Pinned columns\n * 3. Remaining columns (filtered by changedOnly if applicable)\n *\n * @throws {Error} When strictMode is true and a primary key or pinned column\n * is not found in the columnMap\n */\nexport function getDisplayColumns(config: GridColumnsConfig): ColumnConfig[] {\n const {\n columnMap,\n primaryKeys,\n pinnedColumns,\n columnsRenderMode,\n changedOnly = false,\n rowStats,\n excludeColumns = [],\n strictMode = false,\n } = config;\n\n const hasModifiedRows = (rowStats?.modified ?? 0) > 0;\n const columns: ColumnConfig[] = [];\n\n // Add primary key columns first\n primaryKeys.forEach((name) => {\n const col = findColumn(columnMap, name);\n\n if (!col) {\n if (strictMode) {\n throw new Error(`Primary key column \"${name}\" not found in columnMap`);\n }\n return;\n }\n\n columns.push({\n key: name,\n name,\n columnType: col.colType,\n columnStatus: col.status,\n columnRenderMode: columnsRenderMode[name],\n frozen: true,\n isPrimaryKey: true,\n });\n });\n\n // Add pinned columns\n pinnedColumns.forEach((name) => {\n if (isPrimaryKeyColumn(name, primaryKeys)) return;\n if (isExcludedColumn(name, excludeColumns)) return;\n\n const col = findColumn(columnMap, name);\n\n if (!col) {\n if (strictMode) {\n throw new Error(`Pinned column \"${name}\" not found in columnMap`);\n }\n return;\n }\n\n columns.push({\n key: name,\n name,\n columnType: col.colType,\n columnStatus: col.status,\n columnRenderMode: columnsRenderMode[name],\n frozen: true,\n });\n });\n\n // Add remaining columns\n Object.entries(columnMap).forEach(([name, col]) => {\n if (isPrimaryKeyColumn(name, primaryKeys)) return;\n if (isPinnedColumn(name, pinnedColumns)) return;\n if (isExcludedColumn(name, excludeColumns)) return;\n\n if (!shouldIncludeColumn(col.status, changedOnly, hasModifiedRows)) {\n return;\n }\n\n columns.push({\n key: name,\n name,\n columnType: col.colType,\n columnStatus: col.status,\n columnRenderMode: columnsRenderMode[name],\n });\n });\n\n return columns;\n}\n\n/**\n * Gets the list of columns for a simple (non-diff) grid\n */\nexport function getSimpleDisplayColumns(\n config: Omit<GridColumnsConfig, \"changedOnly\" | \"rowStats\">,\n): ColumnConfig[] {\n const {\n columnMap,\n primaryKeys,\n pinnedColumns,\n columnsRenderMode,\n excludeColumns = [],\n strictMode = false,\n } = config;\n\n const columns: ColumnConfig[] = [];\n\n // Add primary key columns first\n primaryKeys.forEach((name) => {\n const col = columnMap[name];\n\n if (!col) {\n if (strictMode) {\n throw new Error(`Primary key column \"${name}\" not found in columnMap`);\n }\n return;\n }\n\n columns.push({\n key: name,\n name,\n columnType: col.colType,\n columnRenderMode: columnsRenderMode[name],\n frozen: true,\n isPrimaryKey: true,\n });\n });\n\n // Add pinned columns\n pinnedColumns.forEach((name) => {\n if (primaryKeys.includes(name)) return;\n if (excludeColumns.includes(name)) return;\n\n const col = columnMap[name];\n\n if (!col) {\n if (strictMode) {\n throw new Error(`Pinned column \"${name}\" not found in columnMap`);\n }\n return;\n }\n\n columns.push({\n key: col.key,\n name,\n columnType: col.colType,\n columnRenderMode: columnsRenderMode[name],\n frozen: true,\n });\n });\n\n // Add remaining columns\n Object.entries(columnMap).forEach(([name, col]) => {\n if (primaryKeys.includes(name)) return;\n if (pinnedColumns.includes(name)) return;\n if (excludeColumns.includes(name)) return;\n\n columns.push({\n key: col.key,\n name,\n columnType: col.colType,\n columnRenderMode: columnsRenderMode[name],\n });\n });\n\n return columns;\n}\n","import { ColumnRenderMode } from \"../../lib/api/types\";\n\nexport function columnPrecisionSelectOptions(\n colName: string,\n onColumnsRenderModeChanged: (col: Record<string, ColumnRenderMode>) => void,\n): { value: string; onClick: () => void }[] {\n return [\n {\n value: \"Show raw value\",\n onClick: () => {\n onColumnsRenderModeChanged({ [colName]: \"raw\" });\n },\n },\n {\n value: \"Show 2 decimal points\",\n onClick: () => {\n onColumnsRenderModeChanged({ [colName]: 2 });\n },\n },\n {\n value: \"Show as percentage\",\n onClick: () => {\n onColumnsRenderModeChanged({ [colName]: \"percent\" });\n },\n },\n {\n value: \"Show with net change\",\n onClick: () => {\n onColumnsRenderModeChanged({ [colName]: \"delta\" });\n },\n },\n ];\n}\n","/**\n * @file DataFrameColumnGroupHeader.tsx\n * @description Column group header component for DataGrid with pin/primary key controls\n *\n * Provides interactive column header with:\n * - Primary key indicator and toggle\n * - Pin/unpin column functionality\n * - Number column precision options menu\n */\n\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport { MouseEvent, useState } from \"react\";\nimport {\n VscClose,\n VscKebabVertical,\n VscKey,\n VscPin,\n VscPinned,\n} from \"react-icons/vsc\";\nimport { columnPrecisionSelectOptions } from \"@/components/valuediff/shared\";\nimport { ColumnRenderMode, ColumnType } from \"@/lib/api/types\";\n\n/**\n * Props for the DataFrameColumnGroupHeader component\n */\nexport interface DataFrameColumnGroupHeaderProps {\n /** Column name to display */\n name: string;\n /** Column diff status: 'added', 'removed', 'modified', or empty string */\n columnStatus: string;\n /** Column data type for determining available options */\n columnType: ColumnType;\n /** List of current primary key column names */\n primaryKeys?: string[];\n /** Callback when primary keys change (enables PK toggle functionality) */\n onPrimaryKeyChange?: (primaryKeys: string[]) => void;\n /** List of currently pinned column names */\n pinnedColumns?: string[];\n /** Callback when pinned columns change */\n onPinnedColumnsChange?: (pinnedColumns: string[]) => void;\n /** Callback when column render mode changes */\n onColumnsRenderModeChanged?: (col: Record<string, ColumnRenderMode>) => void;\n}\n\n/**\n * Column group header with interactive controls\n *\n * @description Renders a column header with:\n * - Primary key icon (VscKey) when column is a primary key\n * - Primary key add/remove toggle (when onPrimaryKeyChange is provided and column can be a PK)\n * - Pin/unpin toggle (when onPinnedColumnsChange is provided and column is not a PK)\n * - Precision options menu for number columns\n *\n * Uses exact string matching for primary keys and pinned columns.\n * Backend normalization ensures column names match user-specified keys.\n *\n * @example\n * // Query diff mode with PK toggle\n * <DataFrameColumnGroupHeader\n * name=\"user_id\"\n * columnStatus=\"\"\n * columnType=\"number\"\n * primaryKeys={['user_id']}\n * onPrimaryKeyChange={setPrimaryKeys}\n * pinnedColumns={[]}\n * onPinnedColumnsChange={setPinnedColumns}\n * />\n *\n * @example\n * // Value diff mode (display-only PK indicator)\n * <DataFrameColumnGroupHeader\n * name=\"user_id\"\n * columnStatus=\"modified\"\n * columnType=\"number\"\n * primaryKeys={['user_id']}\n * pinnedColumns={[]}\n * onPinnedColumnsChange={setPinnedColumns}\n * />\n */\nexport function DataFrameColumnGroupHeader({\n name,\n columnStatus,\n columnType,\n primaryKeys = [],\n onPrimaryKeyChange,\n pinnedColumns = [],\n onPinnedColumnsChange,\n onColumnsRenderModeChanged,\n}: DataFrameColumnGroupHeaderProps) {\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const menuOpen = Boolean(anchorEl);\n\n const handleMenuClick = (event: MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n // Skip rendering for index column\n if (name === \"index\") {\n return <></>;\n }\n\n // Determine if column is a primary key or pinned (exact matching)\n const isPK = primaryKeys.includes(name);\n const isPinned = pinnedColumns.includes(name);\n\n // Column can be a PK only if it's not added/removed (for diff scenarios)\n const canBePk = columnStatus !== \"added\" && columnStatus !== \"removed\";\n\n // Build precision options for number columns\n let selectOptions: { value: string; onClick: () => void }[] = [];\n if (onColumnsRenderModeChanged) {\n selectOptions = columnPrecisionSelectOptions(\n name,\n onColumnsRenderModeChanged,\n );\n }\n\n // Primary key handlers\n const handleRemovePk = () => {\n if (!onPrimaryKeyChange) return;\n const newPrimaryKeys = primaryKeys.filter((item) => item !== name);\n onPrimaryKeyChange(newPrimaryKeys);\n };\n\n const handleAddPk = () => {\n if (!onPrimaryKeyChange) return;\n const newPrimaryKeys = [\n ...primaryKeys.filter((item) => item !== \"index\"),\n name,\n ];\n onPrimaryKeyChange(newPrimaryKeys);\n };\n\n // Pin/unpin handlers\n const handleUnpin = () => {\n if (!onPinnedColumnsChange) return;\n const newPinnedColumns = pinnedColumns.filter((item) => item !== name);\n onPinnedColumnsChange(newPinnedColumns);\n };\n\n const handlePin = () => {\n if (!onPinnedColumnsChange) return;\n const newPinnedColumns = [...pinnedColumns, name];\n onPinnedColumnsChange(newPinnedColumns);\n };\n\n return (\n <Box\n sx={{ display: \"flex\", alignItems: \"center\", gap: \"10px\", width: \"100%\" }}\n className=\"grid-header\"\n >\n {/* Primary key icon */}\n {isPK && <VscKey />}\n\n {/* Column name */}\n <Box\n sx={{\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {name}\n </Box>\n\n {/* Primary key toggle (only when onPrimaryKeyChange is provided) */}\n {canBePk && onPrimaryKeyChange && (\n <Box\n component={isPK ? VscClose : VscKey}\n className={isPK ? \"close-icon\" : \"key-icon\"}\n sx={{\n display: isPK ? \"block\" : \"none\",\n cursor: \"pointer\",\n }}\n onClick={isPK ? handleRemovePk : handleAddPk}\n />\n )}\n\n {/* Pin/unpin toggle (only for non-PK columns when callback is provided) */}\n {!isPK && onPinnedColumnsChange && (\n <Box\n component={isPinned ? VscPinned : VscPin}\n className={isPinned ? \"unpin-icon\" : \"pin-icon\"}\n sx={{\n display: isPinned ? \"block\" : \"none\",\n cursor: \"pointer\",\n }}\n onClick={isPinned ? handleUnpin : handlePin}\n />\n )}\n\n {/* Precision menu for number columns (only for non-PK columns) */}\n {!isPK && columnType === \"number\" && selectOptions.length > 0 && (\n <>\n <IconButton\n aria-label=\"Options\"\n size=\"small\"\n className=\"!size-4 !min-w-4\"\n onClick={handleMenuClick}\n >\n <VscKebabVertical />\n </IconButton>\n <Menu anchorEl={anchorEl} open={menuOpen} onClose={handleMenuClose}>\n {selectOptions.map((o) => (\n <MenuItem\n key={o.value}\n onClick={() => {\n o.onClick();\n handleMenuClose();\n }}\n >\n {o.value}\n </MenuItem>\n ))}\n </Menu>\n </>\n )}\n </Box>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport { MouseEvent, useState } from \"react\";\nimport { PiDotsThreeVertical } from \"react-icons/pi\";\nimport { VscPin, VscPinned } from \"react-icons/vsc\";\nimport { columnPrecisionSelectOptions } from \"@/components/valuediff/shared\";\nimport { ColumnRenderMode, ColumnType } from \"@/lib/api/types\";\n\n/**\n * Props for the DataFrameColumnHeader component\n */\nexport interface DataFrameColumnHeaderProps {\n /** Column name to display */\n name: string;\n /** Column data type for determining available options */\n columnType: ColumnType;\n /** List of currently pinned column names */\n pinnedColumns?: string[];\n /** Callback when pinned columns change */\n onPinnedColumnsChange?: (pinnedColumns: string[]) => void;\n /** Callback when column render mode changes */\n onColumnsRenderModeChanged?: (col: Record<string, ColumnRenderMode>) => void;\n}\n\nexport function DataFrameColumnHeader({\n name,\n pinnedColumns = [],\n onPinnedColumnsChange = () => {\n return void 0;\n },\n columnType,\n onColumnsRenderModeChanged,\n}: DataFrameColumnHeaderProps) {\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const menuOpen = Boolean(anchorEl);\n\n const handleMenuClick = (event: MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n let selectOptions: { value: string; onClick: () => void }[] = [];\n if (onColumnsRenderModeChanged) {\n selectOptions = columnPrecisionSelectOptions(\n name,\n onColumnsRenderModeChanged,\n );\n }\n\n const isPinned = pinnedColumns.includes(name);\n\n const handleUnpin = () => {\n const newPinnedColumns = pinnedColumns.filter((item) => item !== name);\n onPinnedColumnsChange(newPinnedColumns);\n };\n\n const handlePin = () => {\n const newPinnedColumns = [...pinnedColumns, name];\n onPinnedColumnsChange(newPinnedColumns);\n };\n\n return (\n <Box\n sx={{ display: \"flex\", alignItems: \"center\", width: \"100%\" }}\n className=\"grid-header\"\n >\n <Box sx={{ flex: 1 }}>{name}</Box>\n\n <Box\n component={isPinned ? VscPinned : VscPin}\n className={isPinned ? \"unpin-icon\" : \"pin-icon\"}\n sx={{\n display: isPinned ? \"block\" : \"none\",\n cursor: \"pointer\",\n }}\n onClick={isPinned ? handleUnpin : handlePin}\n />\n {columnType === \"number\" && (\n <>\n <IconButton\n aria-label=\"Options\"\n size=\"small\"\n className=\"size-6!\"\n sx={{\n p: 0,\n }}\n onClick={handleMenuClick}\n >\n <PiDotsThreeVertical />\n </IconButton>\n <Menu anchorEl={anchorEl} open={menuOpen} onClose={handleMenuClose}>\n {selectOptions.map((o) => (\n <MenuItem\n key={o.value}\n onClick={() => {\n o.onClick();\n handleMenuClose();\n }}\n >\n {o.value}\n </MenuItem>\n ))}\n </Menu>\n </>\n )}\n </Box>\n );\n}\n","export function mergeKeys(_base: string[], _curr: string[]) {\n // Merge keys from base, target tables. Unlike default union, it preserves the order for column rename, added, removed.\n const base = [..._base];\n const curr = [..._curr];\n\n const results: string[] = [];\n while (base.length > 0 && curr.length > 0) {\n if (results.includes(base[0])) {\n base.shift();\n } else if (results.includes(curr[0])) {\n curr.shift();\n } else if (base[0] === curr[0]) {\n results.push(base[0]);\n base.shift();\n curr.shift();\n } else if (curr.includes(base[0])) {\n const idx = curr.indexOf(base[0]);\n for (let i = 0; i < idx; i++) {\n if (!results.includes(curr[i])) {\n results.push(curr[i]);\n }\n }\n results.push(base[0]);\n base.shift();\n curr.splice(0, idx + 1);\n } else {\n results.push(base[0]);\n base.shift();\n }\n }\n\n base.forEach((key) => {\n if (!results.includes(key)) {\n results.push(key);\n }\n });\n\n curr.forEach((key) => {\n if (!results.includes(key)) {\n results.push(key);\n }\n });\n\n return results;\n}\n\ntype MergeStatus = \"added\" | \"removed\" | \"reordered\" | undefined;\n\nexport function mergeKeysWithStatus(\n _base: string[],\n _curr: string[],\n): Record<string, MergeStatus> {\n const merged = mergeKeys(_base, _curr);\n const result: ReturnType<typeof mergeKeysWithStatus> = {};\n\n for (const item of merged) {\n if (!_base.includes(item)) {\n result[item] = \"added\";\n } else if (!_curr.includes(item)) {\n result[item] = \"removed\";\n } else {\n result[item] = undefined;\n }\n }\n\n // reorder case\n const baseIndexMap: Record<string, number | undefined> = {};\n _base.forEach((item, index) => {\n baseIndexMap[item] = index;\n });\n let last = -1;\n for (const item of merged) {\n const curr = baseIndexMap[item];\n if (curr == null) {\n continue;\n }\n\n if (curr > last) {\n last = curr;\n } else {\n result[item] = \"reordered\";\n }\n }\n\n return result;\n}\n","import { DataFrame, RowDataTypes, RowObjectType } from \"@/lib/api/types\";\n\nexport function dataFrameToRowObjects(dataFrame: DataFrame): RowObjectType[] {\n return dataFrame.data.map((row, index) => ({\n ...dataFrame.columns.reduce<Record<string, RowDataTypes>>(\n (obj, column, colIndex) => {\n obj[column.key] = row[colIndex];\n return obj;\n },\n {},\n ),\n __status: undefined,\n _index: index + 1,\n }));\n}\n\nexport function keyToNumber(key: string): number {\n // Try to parse as a number first\n const parsed = Number(key);\n\n // Check if it's a valid number (not NaN, not Infinity)\n if (!isNaN(parsed) && isFinite(parsed)) {\n return parsed;\n }\n\n // If not a number, hash the string to a stable numeric value\n return hashStringToNumber(key);\n}\n\n/**\n * Hashes a string to a stable numeric value using a simple hash algorithm\n * Based on the Java String.hashCode() implementation\n */\nexport function hashStringToNumber(str: string): number {\n let hash = 0;\n\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n\n // Return absolute value to ensure positive numbers\n return Math.abs(hash);\n}\n\nexport function getCaseInsensitive<T extends RowObjectType>(\n obj: T,\n key: string,\n): T[keyof T] | undefined {\n const lowerKey = key.toLowerCase();\n\n // First try lowercase\n if (lowerKey in obj) {\n return obj[lowerKey as keyof T];\n }\n\n // Fall back to case-insensitive search\n const foundKey = Object.keys(obj).find((k) => k.toLowerCase() === lowerKey) as\n | keyof T\n | undefined;\n\n return foundKey ? obj[foundKey] : undefined;\n}\n\n// Get the value of an object at a given path, case-insensitively\nexport function getValueAtPath<T = RowDataTypes>(\n obj: Record<string, T | undefined>,\n path: string,\n): T | undefined {\n let col = obj[path.toLowerCase()];\n if (!col) {\n // try upper-case match\n col = obj[path.toUpperCase()];\n }\n if (!col) {\n // try fallback with strict casing match\n col = obj[path];\n }\n return col;\n}\n","/**\n * @file gridUtils.ts\n * @description Shared utilities for data grid generation\n *\n * This module contains common functions used across all grid generation methods.\n */\n\nimport _ from \"lodash\";\nimport {\n ColumnRenderMode,\n ColumnType,\n DataFrame,\n RowObjectType,\n} from \"@/lib/api/types\";\nimport { mergeKeysWithStatus } from \"@/lib/mergeKeys\";\nimport { formatNumber } from \"@/utils/formatters\";\nimport { getCaseInsensitive } from \"@/utils/transforms\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ColumnMapEntry {\n key: string;\n colType: ColumnType;\n status?: string;\n index?: number;\n}\n\nexport interface MergeColumnMapEntry extends ColumnMapEntry {\n baseColumnKey: string;\n currentColumnKey: string;\n}\n\nexport interface RowStats {\n added: number;\n removed: number;\n modified: number;\n}\n\n// ============================================================================\n// Column Map Builders\n// ============================================================================\n\n/**\n * Builds a column map from a single DataFrame\n */\nexport function buildColumnMap(df: DataFrame): Record<string, ColumnMapEntry> {\n const result: Record<string, ColumnMapEntry> = {};\n df.columns.forEach((col, index) => {\n result[col.name] = {\n key: col.key,\n index,\n colType: col.type,\n };\n });\n return result;\n}\n\n/**\n * Builds a column map for joined data (with in_a/in_b columns)\n *\n * NOTE: Backend now guarantees in_a/in_b are always lowercase,\n * so we only need to register them as-is.\n *\n * @throws {Error} If required in_a or in_b columns are missing\n */\nexport function buildJoinedColumnMap(\n df: DataFrame,\n): Record<string, ColumnMapEntry> {\n const result: Record<string, ColumnMapEntry> = {};\n\n df.columns.forEach((col, index) => {\n result[col.key] = {\n key: col.key,\n index,\n colType: col.type,\n };\n });\n\n // Verify required columns exist (while backend guarantees \"in_a\" and \"in_b\" as lowercase, we need to verify their presence)\n if (!result.in_a) {\n throw new Error(\"Joined DataFrame missing required 'in_a' column\");\n }\n if (!result.in_b) {\n throw new Error(\"Joined DataFrame missing required 'in_b' column\");\n }\n\n return result;\n}\n\n/**\n * Builds a merged column map from two DataFrames\n * Tracks status (added/removed/unchanged) for each column\n */\nexport function buildMergedColumnMap(\n base: DataFrame,\n current: DataFrame,\n): Record<string, MergeColumnMapEntry> {\n const result: Record<string, MergeColumnMapEntry> = {};\n\n const mapStatus = mergeKeysWithStatus(\n base.columns.map((col) => col.key),\n current.columns.map((col) => col.key),\n ) as Record<string, string>;\n\n Object.entries(mapStatus).forEach(([key, status]) => {\n const baseColumn = base.columns.find((c) => c.key === key);\n const currentColumn = current.columns.find((c) => c.key === key);\n result[key] = {\n status,\n baseColumnKey: baseColumn?.key ?? \"unknown\",\n currentColumnKey: currentColumn?.key ?? \"unknown\",\n colType: baseColumn?.type ?? currentColumn?.type ?? \"unknown\",\n key: baseColumn?.key ?? currentColumn?.key ?? \"unknown\",\n };\n });\n\n return result;\n}\n\n// ============================================================================\n// Primary Key Utilities\n// ============================================================================\n\n/**\n * Validates that all primary keys exist in the columns (exact matching)\n */\nexport function validatePrimaryKeys(\n columns: DataFrame[\"columns\"],\n primaryKeys: string[],\n): string[] {\n const keys: string[] = [];\n for (const key of primaryKeys) {\n const found = columns.find((col) => col.key === key);\n\n if (!found) {\n throw new Error(`Column ${key} not found`);\n }\n keys.push(found.key);\n }\n return keys;\n}\n\n/**\n * Generates a unique key string from primary key values in a row (exact matching)\n */\nexport function getPrimaryKeyValue(\n columns: DataFrame[\"columns\"],\n primaryKeys: string[],\n row: RowObjectType,\n): string {\n if (primaryKeys.length === 0) {\n return String(row._index);\n }\n\n const result: string[] = [];\n for (const key of primaryKeys) {\n const col = columns.find((c) => c.key === key);\n\n if (!col) {\n throw new Error(`Primary Column ${key} not found`);\n }\n\n const value = row[key];\n result.push(`${col.name}=${value}`);\n }\n return result.join(\"|\");\n}\n\n// ============================================================================\n// Row Status Detection\n// ============================================================================\n\n/**\n * Determines the status of a row (added/removed/modified/unchanged)\n *\n * Supports two modes:\n * 1. Separate rows: baseRow and currentRow are different objects\n * 2. Merged rows: baseRow === currentRow, with values stored as base__key and current__key\n */\nexport function determineRowStatus(\n baseRow: RowObjectType | undefined,\n currentRow: RowObjectType | undefined,\n columnMap: Record<string, ColumnMapEntry>,\n primaryKeys: string[],\n): \"added\" | \"removed\" | \"modified\" | undefined {\n if (!baseRow) return \"added\";\n if (!currentRow) return \"removed\";\n\n // Check if this is a merged row (same object passed for both)\n const isMergedRow = baseRow === currentRow;\n\n // Check for modifications in non-PK columns\n for (const [name, column] of Object.entries(columnMap)) {\n if (name === \"index\") continue;\n\n if (primaryKeys.includes(name)) continue;\n\n let baseVal: unknown;\n let currentVal: unknown;\n\n if (isMergedRow) {\n // Merged row: compare base__key vs current__key\n const baseKey = `base__${column.key}`;\n const currentKey = `current__${column.key}`;\n baseVal = baseRow[baseKey];\n currentVal = currentRow[currentKey];\n } else {\n // Separate rows: compare same key in different row objects\n baseVal = baseRow[column.key];\n currentVal = currentRow[column.key];\n }\n\n if (!_.isEqual(baseVal, currentVal)) {\n return \"modified\";\n }\n }\n\n return undefined;\n}\n\n// ============================================================================\n// Value Rendering Utilities\n// ============================================================================\n\n/**\n * Formats a numeric value based on render mode\n *\n * Handles special values:\n * - NaN: Returns \"NaN\" (no formatting applied)\n * - Infinity: Returns \"∞\" or \"-∞\" (no formatting applied)\n */\n/**\n * Formats a number with up to maxDecimals decimal places, without trailing zeros\n * Uses banker's rounding (round half to even) for unbiased rounding.\n *\n * e.g., formatSmartDecimal(123, 2) => \"123\"\n * formatSmartDecimal(123.4, 2) => \"123.4\"\n * formatSmartDecimal(123.456, 2) => \"123.46\"\n * formatSmartDecimal(123.445, 2) => \"123.44\" (banker's rounding)\n */\nexport function formatSmartDecimal(value: number, maxDecimals = 2): string {\n // Normalize -0 to 0 (Intl.NumberFormat renders -0 as \"-0\" per ECMA-402)\n const normalizedValue = Object.is(value, -0) ? 0 : value;\n\n const result =\n formatNumber(normalizedValue, \"en-US\", {\n maximumFractionDigits: maxDecimals,\n roundingMode: \"halfEven\",\n } as Intl.NumberFormatOptions) ?? String(value);\n\n // Normalize \"-0\" to \"0\" (can happen when small negative numbers round to zero)\n return result === \"-0\" ? \"0\" : result;\n}\n\nexport function columnRenderedValue(\n value: number,\n renderMode?: ColumnRenderMode,\n): string {\n // Handle special numeric values first\n if (Number.isNaN(value)) {\n return \"NaN\";\n }\n\n if (!Number.isFinite(value)) {\n return value > 0 ? \"∞\" : \"-∞\";\n }\n\n const locale = \"en-US\";\n\n if (renderMode === \"raw\") {\n return String(value);\n }\n\n if (typeof renderMode === \"number\") {\n // Smart formatting: up to N decimals, no trailing zeros\n return formatSmartDecimal(value, renderMode);\n }\n\n if (renderMode === \"percent\") {\n return (\n formatNumber(value, locale, {\n style: \"percent\",\n maximumFractionDigits: 2,\n }) ?? String(value)\n );\n }\n\n // Default: smart 2-decimal formatting\n return formatSmartDecimal(value, 2);\n}\n\n/**\n * Converts a row value to a rendered string with gray-out indicator\n */\nexport function toRenderedValue(\n row: RowObjectType,\n key: string,\n columnType?: ColumnType,\n columnRenderMode?: ColumnRenderMode,\n): [string, boolean] {\n const value = getCaseInsensitive(row, key);\n\n if (value == null) {\n return [\"-\", true];\n }\n\n let renderedValue: string;\n let grayOut = false;\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof value === \"boolean\") {\n // workaround for https://github.com/adazzle/react-data-grid/issues/882\n renderedValue = value.toString();\n } else if (value === \"\") {\n renderedValue = \"(empty)\";\n grayOut = true;\n } else if (typeof value === \"number\") {\n renderedValue = columnRenderedValue(value, columnRenderMode);\n } else {\n if (columnType === \"number\") {\n renderedValue = columnRenderedValue(parseFloat(value), columnRenderMode);\n } else {\n renderedValue = String(value);\n }\n }\n\n return [renderedValue, grayOut];\n}\n\n// ============================================================================\n// Cell Class Utilities\n// ============================================================================\n\n/**\n * Gets the CSS class for a cell based on row and column status\n */\nexport function getCellClass(\n row: RowObjectType,\n columnStatus: string | undefined,\n columnKey: string,\n isBase: boolean,\n): string | undefined {\n const rowStatus = row.__status;\n\n if (rowStatus === \"removed\") return \"diff-cell-removed\";\n if (rowStatus === \"added\") return \"diff-cell-added\";\n if (columnStatus === \"added\" || columnStatus === \"removed\") return undefined;\n\n const baseKey = `base__${columnKey}`.toLowerCase();\n const currentKey = `current__${columnKey}`.toLowerCase();\n\n if (!_.isEqual(row[baseKey], row[currentKey])) {\n return isBase ? \"diff-cell-removed\" : \"diff-cell-added\";\n }\n\n return undefined;\n}\n\n/**\n * Gets the CSS class for a header cell based on column status\n */\nexport function getHeaderCellClass(\n columnStatus: string | undefined,\n): string | undefined {\n if (columnStatus === \"added\") return \"diff-header-added\";\n if (columnStatus === \"removed\") return \"diff-header-removed\";\n return undefined;\n}\n","/**\n * @file defaultRenderCell.tsx\n * @description Default cell renderer for DataGrid columns\n *\n * Renders a cell value with optional column type formatting and gray-out styling.\n * Used for standard (non-diff) cell rendering in data grids.\n *\n * NOTE: Imports directly from gridUtils.ts to avoid circular dependency\n * with toDiffColumn.tsx which imports this component.\n */\n\nimport Typography from \"@mui/material/Typography\";\nimport type { ColDef, ICellRendererParams } from \"ag-grid-community\";\nimport { ColumnRenderMode, ColumnType, RowObjectType } from \"@/lib/api/types\";\n// Import directly from gridUtils to avoid circular dependency\nimport { toRenderedValue } from \"@/lib/dataGrid/shared/gridUtils\";\n\n/**\n * Extended column definition with optional type metadata\n */\nexport type ColDefWithMetadata<TData = RowObjectType> = ColDef<TData> & {\n columnType?: ColumnType;\n columnRenderMode?: ColumnRenderMode;\n};\n\n/**\n * Default cell renderer for data grid columns\n *\n * @description Extracts cell value from the row and renders it with appropriate\n * formatting based on the column type and render mode. Supports numeric\n * formatting (raw, integer, percent) and handles null/empty values with gray styling.\n *\n * @param params - AG Grid cell renderer params containing row data and column definition\n * @returns Rendered cell content as a Text component\n */\nexport const defaultRenderCell = (\n params: ICellRendererParams<RowObjectType>,\n) => {\n const colDef = params.colDef as ColDefWithMetadata;\n const columnType = colDef?.columnType;\n const columnRenderMode = colDef?.columnRenderMode;\n const fieldName = colDef?.field ?? \"\";\n\n if (!params.data) {\n return null;\n }\n\n const [renderedValue, grayOut] = toRenderedValue(\n params.data,\n fieldName,\n columnType,\n columnRenderMode,\n );\n\n return (\n <Typography\n component=\"span\"\n style={{ color: grayOut ? \"gray\" : \"inherit\" }}\n >\n {renderedValue}\n </Typography>\n );\n};\n","\"use client\";\n\nimport { createTheme, type ThemeOptions } from \"@mui/material/styles\";\n\n/**\n * MUI Theme Configuration for Recce\n *\n * This theme mirrors the existing Chakra UI theme tokens from theme.ts\n * to ensure visual consistency during the migration period.\n *\n * Color palette mappings:\n * - iochmara (custom blue) -> primary\n * - cyan -> secondary\n * - brand (orange) -> custom palette\n * - green -> success\n * - amber -> warning\n * - red -> error\n * - neutral -> grey\n */\n\n// Custom color palettes matching Chakra theme tokens\nconst colors = {\n iochmara: {\n 50: \"#EAF3FB\",\n 100: \"#C4DDF3\",\n 200: \"#9EC6EB\",\n 300: \"#79B0E2\",\n 400: \"#5599D8\",\n 500: \"#3182CE\",\n 600: \"#2A6CA7\",\n 700: \"#225581\",\n 800: \"#193E5C\",\n 900: \"#102638\",\n 950: \"#060E14\",\n },\n cyan: {\n 50: \"#ECFEFF\",\n 100: \"#CFFAFE\",\n 200: \"#A5F3FC\",\n 300: \"#67E8F9\",\n 400: \"#22D3EE\",\n 500: \"#06B6D4\",\n 600: \"#0891B2\",\n 700: \"#0E7490\",\n 800: \"#155E75\",\n 900: \"#164E63\",\n 950: \"#083344\",\n },\n neutral: {\n 50: \"#FAFAFA\",\n 100: \"#F5F5F5\",\n 200: \"#E5E5E5\",\n 300: \"#D4D4D4\",\n 400: \"#A3A3A3\",\n 500: \"#737373\",\n 600: \"#525252\",\n 700: \"#404040\",\n 800: \"#262626\",\n 900: \"#171717\",\n 950: \"#0A0A0A\",\n },\n amber: {\n 50: \"#FFFBEB\",\n 100: \"#FEF3C7\",\n 200: \"#FDE68A\",\n 300: \"#FCD34D\",\n 400: \"#FBBF24\",\n 500: \"#F59E0B\",\n 600: \"#D97706\",\n 700: \"#B45309\",\n 800: \"#92400E\",\n 900: \"#78350F\",\n 950: \"#431407\",\n },\n green: {\n 50: \"#F0FDF4\",\n 100: \"#DCFCE7\",\n 200: \"#BBF7D0\",\n 300: \"#86EFAC\",\n 400: \"#4ADE80\",\n 500: \"#22C55E\",\n 600: \"#16A34A\",\n 700: \"#15803D\",\n 800: \"#166534\",\n 900: \"#14532D\",\n 950: \"#052E16\",\n },\n red: {\n 50: \"#FEF2F2\",\n 100: \"#FEE2E2\",\n 200: \"#FECACA\",\n 300: \"#FCA5A5\",\n 400: \"#F87171\",\n 500: \"#EF4444\",\n 600: \"#DC2626\",\n 700: \"#B91C1C\",\n 800: \"#991B1B\",\n 900: \"#7F1D1D\",\n 950: \"#450A0A\",\n },\n rose: {\n 50: \"#FFF1F2\",\n 100: \"#FFE4E6\",\n 200: \"#FECDD3\",\n 300: \"#FDA4AF\",\n 400: \"#FB7185\",\n 500: \"#F43F5E\",\n 600: \"#E11D48\",\n 700: \"#BE123C\",\n 800: \"#9F1239\",\n 900: \"#881337\",\n 950: \"#4C0519\",\n },\n fuchsia: {\n 50: \"#FDF4FF\",\n 100: \"#FAE8FF\",\n 200: \"#F5D0FE\",\n 300: \"#F0ABFC\",\n 400: \"#E879F9\",\n 500: \"#D946EF\",\n 600: \"#C026D3\",\n 700: \"#A21CAF\",\n 800: \"#86198F\",\n 900: \"#701A75\",\n 950: \"#4A044E\",\n },\n brand: {\n 50: \"#FFDED5\",\n 100: \"#FFC1B0\",\n 200: \"#FFA58C\",\n 300: \"#FF8967\",\n 400: \"#FF6E42\",\n 500: \"#FD541E\",\n 600: \"#F04104\",\n 700: \"#C93A06\",\n 800: \"#A23206\",\n 900: \"#7C2906\",\n 950: \"#571E05\",\n },\n};\n\n// Semantic color tokens matching Chakra's semantic tokens\nconst semanticColors = {\n envBase: colors.amber[500],\n envCurrent: colors.iochmara[500],\n};\n\n// Custom color names type\ntype CustomColorName =\n | \"brand\"\n | \"iochmara\"\n | \"cyan\"\n | \"amber\"\n | \"green\"\n | \"red\"\n | \"rose\"\n | \"fuchsia\"\n | \"neutral\";\n\n/**\n * Helper to generate button color variants for a given color\n * Creates contained, outlined, and text variant styles\n */\nfunction createButtonColorVariants<T extends CustomColorName>(\n colorName: T,\n colorScale: (typeof colors)[keyof typeof colors],\n) {\n return [\n // Contained variant (solid)\n {\n props: { color: colorName, variant: \"contained\" as const },\n style: {\n backgroundColor: colorScale[500],\n color: \"#FFFFFF\",\n \"&:hover\": {\n backgroundColor: colorScale[600],\n },\n },\n },\n // Outlined variant\n {\n props: { color: colorName, variant: \"outlined\" as const },\n style: {\n borderColor: colorScale[500],\n color: colorScale[600],\n \"&:hover\": {\n borderColor: colorScale[600],\n backgroundColor: `${colorScale[50]}80`,\n },\n },\n },\n // Text variant (ghost)\n {\n props: { color: colorName, variant: \"text\" as const },\n style: {\n color: colorScale[600],\n \"&:hover\": {\n backgroundColor: `${colorScale[50]}80`,\n },\n },\n },\n ];\n}\n\n/**\n * Helper to generate CircularProgress color variants\n */\nfunction createProgressColorVariant<T extends CustomColorName>(\n colorName: T,\n colorScale: (typeof colors)[keyof typeof colors],\n) {\n return {\n props: { color: colorName },\n style: {\n color: colorScale[500],\n },\n };\n}\n\n/**\n * Helper to generate Badge color variants\n */\nfunction createBadgeColorVariant<T extends CustomColorName>(\n colorName: T,\n colorScale: (typeof colors)[keyof typeof colors],\n) {\n return {\n props: { color: colorName },\n style: {\n \"& .MuiBadge-badge\": {\n backgroundColor: colorScale[500],\n color: \"#FFFFFF\",\n },\n },\n };\n}\n\n/**\n * Helper to generate Chip color variants\n */\nfunction createChipColorVariants<T extends CustomColorName>(\n colorName: T,\n colorScale: (typeof colors)[keyof typeof colors],\n) {\n return [\n // Filled variant\n {\n props: { color: colorName, variant: \"filled\" as const },\n style: {\n backgroundColor: colorScale[500],\n color: \"#FFFFFF\",\n \"&:hover\": {\n backgroundColor: colorScale[600],\n },\n },\n },\n // Outlined variant\n {\n props: { color: colorName, variant: \"outlined\" as const },\n style: {\n borderColor: colorScale[500],\n color: colorScale[600],\n },\n },\n ];\n}\n\n// Generate all button color variants\nconst buttonColorVariants = [\n ...createButtonColorVariants(\"iochmara\", colors.iochmara),\n ...createButtonColorVariants(\"cyan\", colors.cyan),\n ...createButtonColorVariants(\"amber\", colors.amber),\n ...createButtonColorVariants(\"green\", colors.green),\n ...createButtonColorVariants(\"red\", colors.red),\n ...createButtonColorVariants(\"rose\", colors.rose),\n ...createButtonColorVariants(\"fuchsia\", colors.fuchsia),\n ...createButtonColorVariants(\"brand\", colors.brand),\n // Neutral uses darker shades for better visibility\n {\n props: { color: \"neutral\" as const, variant: \"contained\" as const },\n style: {\n backgroundColor: colors.neutral[700],\n color: \"#FFFFFF\",\n \"&:hover\": { backgroundColor: colors.neutral[800] },\n },\n },\n {\n props: { color: \"neutral\" as const, variant: \"outlined\" as const },\n style: {\n borderColor: colors.neutral[300], // Lighter border (neutral.light)\n color: colors.neutral[900],\n \"&:hover\": {\n borderColor: colors.neutral[400],\n backgroundColor: colors.neutral[100],\n },\n },\n },\n {\n props: { color: \"neutral\" as const, variant: \"text\" as const },\n style: {\n color: colors.neutral[700],\n \"&:hover\": { backgroundColor: colors.neutral[100] },\n },\n },\n];\n\n// Generate all CircularProgress color variants\nconst progressColorVariants = [\n createProgressColorVariant(\"iochmara\", colors.iochmara),\n createProgressColorVariant(\"cyan\", colors.cyan),\n createProgressColorVariant(\"amber\", colors.amber),\n createProgressColorVariant(\"green\", colors.green),\n createProgressColorVariant(\"red\", colors.red),\n createProgressColorVariant(\"rose\", colors.rose),\n createProgressColorVariant(\"fuchsia\", colors.fuchsia),\n createProgressColorVariant(\"brand\", colors.brand),\n createProgressColorVariant(\"neutral\", colors.neutral),\n];\n\n// Generate all Badge color variants\nconst badgeColorVariants = [\n createBadgeColorVariant(\"iochmara\", colors.iochmara),\n createBadgeColorVariant(\"cyan\", colors.cyan),\n createBadgeColorVariant(\"amber\", colors.amber),\n createBadgeColorVariant(\"green\", colors.green),\n createBadgeColorVariant(\"red\", colors.red),\n createBadgeColorVariant(\"rose\", colors.rose),\n createBadgeColorVariant(\"fuchsia\", colors.fuchsia),\n createBadgeColorVariant(\"brand\", colors.brand),\n createBadgeColorVariant(\"neutral\", colors.neutral),\n];\n\n// Generate all Chip color variants\nconst chipColorVariants = [\n ...createChipColorVariants(\"iochmara\", colors.iochmara),\n ...createChipColorVariants(\"cyan\", colors.cyan),\n ...createChipColorVariants(\"amber\", colors.amber),\n ...createChipColorVariants(\"green\", colors.green),\n ...createChipColorVariants(\"red\", colors.red),\n ...createChipColorVariants(\"rose\", colors.rose),\n ...createChipColorVariants(\"fuchsia\", colors.fuchsia),\n ...createChipColorVariants(\"brand\", colors.brand),\n ...createChipColorVariants(\"neutral\", colors.neutral),\n];\n\n// Component overrides to match Chakra UI defaults\nconst componentOverrides: ThemeOptions[\"components\"] = {\n // Button overrides\n MuiButton: {\n defaultProps: {\n disableElevation: true, // Match Chakra's flat button style\n },\n // Size and color variants\n variants: [\n // Size variant: xsmall\n {\n props: { size: \"xsmall\" },\n style: {\n padding: \"0 0.5rem\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n borderRadius: 4,\n minHeight: \"unset\",\n lineHeight: 1.5,\n },\n },\n // Color variants for all custom colors\n ...buttonColorVariants,\n ],\n styleOverrides: {\n root: {\n textTransform: \"none\",\n fontWeight: 500,\n borderRadius: 6,\n },\n sizeSmall: {\n padding: \"0.25rem 0.75rem\",\n fontSize: \"0.875rem\",\n },\n sizeMedium: {\n padding: \"0.5rem 1rem\",\n fontSize: \"1rem\",\n },\n sizeLarge: {\n padding: \"0.75rem 1.5rem\",\n fontSize: \"1.125rem\",\n },\n // Contained variant (solid in Chakra)\n contained: {\n \"&:hover\": {\n boxShadow: \"none\",\n },\n },\n // Outlined variant (outline in Chakra)\n outlined: {\n borderWidth: \"1px\",\n \"&:hover\": {\n borderWidth: \"1px\",\n },\n },\n // Text variant (ghost in Chakra)\n text: {\n \"&:hover\": {\n backgroundColor: \"rgba(0, 0, 0, 0.04)\",\n },\n },\n },\n },\n // IconButton overrides\n MuiIconButton: {\n styleOverrides: {\n root: {\n borderRadius: 6,\n },\n sizeSmall: {\n padding: 4,\n },\n sizeMedium: {\n padding: 8,\n },\n sizeLarge: {\n padding: 12,\n },\n },\n },\n // TextField overrides\n MuiTextField: {\n defaultProps: {\n variant: \"outlined\",\n size: \"small\",\n },\n styleOverrides: {\n root: {\n \"& .MuiOutlinedInput-root\": {\n borderRadius: 6,\n },\n },\n },\n },\n // Input overrides\n MuiOutlinedInput: {\n styleOverrides: {\n root: {\n borderRadius: 6,\n \"&:hover .MuiOutlinedInput-notchedOutline\": {\n borderColor: colors.iochmara[400],\n },\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {\n borderColor: colors.iochmara[500],\n borderWidth: 2,\n },\n },\n notchedOutline: {\n borderColor: colors.neutral[300],\n },\n },\n },\n // Checkbox overrides\n MuiCheckbox: {\n defaultProps: {\n color: \"primary\",\n },\n styleOverrides: {\n root: {\n borderRadius: 4,\n },\n },\n },\n // Switch overrides\n MuiSwitch: {\n defaultProps: {\n color: \"primary\",\n },\n },\n // Dialog overrides\n MuiDialog: {\n styleOverrides: {\n paper: {\n borderRadius: 8,\n },\n },\n },\n MuiDialogTitle: {\n styleOverrides: {\n root: {\n fontWeight: 600,\n fontSize: \"1.125rem\",\n },\n },\n },\n // Menu overrides\n MuiMenu: {\n styleOverrides: {\n paper: ({ theme }) => ({\n borderRadius: 8,\n boxShadow: theme.shadows[3],\n }),\n },\n },\n MuiMenuItem: {\n styleOverrides: {\n root: {\n fontSize: \"0.875rem\",\n padding: \"0.5rem 0.75rem\",\n \"&:hover\": {\n backgroundColor: colors.neutral[100],\n },\n \"&.Mui-selected\": {\n backgroundColor: colors.iochmara[50],\n \"&:hover\": {\n backgroundColor: colors.iochmara[100],\n },\n },\n },\n },\n },\n // Chip overrides (Tag in Chakra)\n MuiChip: {\n variants: [\n // Size variant: xsmall\n {\n props: { size: \"xsmall\" },\n style: {\n height: 20,\n fontSize: \"0.625rem\",\n },\n },\n // Color variants for all custom colors\n ...chipColorVariants,\n ],\n styleOverrides: {\n root: {\n borderRadius: 6,\n fontWeight: 500,\n },\n sizeSmall: {\n height: 24,\n fontSize: \"0.75rem\",\n },\n sizeMedium: {\n height: 32,\n fontSize: \"0.875rem\",\n },\n },\n },\n // Tooltip overrides\n MuiTooltip: {\n styleOverrides: {\n tooltip: {\n backgroundColor: colors.neutral[800],\n fontSize: \"0.75rem\",\n padding: \"0.25rem 0.5rem\",\n borderRadius: 4,\n },\n arrow: {\n color: colors.neutral[800],\n },\n },\n },\n // Alert overrides\n MuiAlert: {\n styleOverrides: {\n root: {\n borderRadius: 6,\n },\n standardSuccess: {\n backgroundColor: colors.green[50],\n color: colors.green[800],\n },\n standardWarning: {\n backgroundColor: colors.amber[50],\n color: colors.amber[800],\n },\n standardError: {\n backgroundColor: colors.red[50],\n color: colors.red[800],\n },\n standardInfo: {\n backgroundColor: colors.iochmara[50],\n color: colors.iochmara[800],\n },\n },\n },\n // Tabs overrides\n MuiTabs: {\n styleOverrides: {\n indicator: {\n height: 2,\n },\n },\n },\n MuiTab: {\n styleOverrides: {\n root: {\n textTransform: \"none\",\n fontWeight: 500,\n minHeight: 48,\n },\n },\n },\n // Avatar overrides\n MuiAvatar: {\n styleOverrides: {\n root: {\n fontWeight: 500,\n },\n },\n },\n // Badge overrides\n MuiBadge: {\n variants: badgeColorVariants,\n styleOverrides: {\n badge: {\n fontWeight: 500,\n fontSize: \"0.75rem\",\n },\n },\n },\n // CircularProgress (Spinner in Chakra)\n MuiCircularProgress: {\n defaultProps: {\n color: \"primary\",\n },\n variants: progressColorVariants,\n },\n // Link overrides\n MuiLink: {\n defaultProps: {\n underline: \"hover\",\n fontWeight: 500,\n },\n styleOverrides: {\n root: {\n color: colors.iochmara[600],\n textDecorationColor: colors.iochmara[300],\n \"&:hover\": {\n color: colors.iochmara[700],\n },\n },\n },\n },\n // Paper overrides\n MuiPaper: {\n styleOverrides: {\n rounded: {\n borderRadius: 8,\n },\n },\n },\n // Popover overrides\n MuiPopover: {\n styleOverrides: {\n paper: ({ theme }) => ({\n borderRadius: 8,\n boxShadow: theme.shadows[3],\n }),\n },\n },\n // Divider overrides\n MuiDivider: {\n styleOverrides: {\n root: {\n borderColor: colors.neutral[200],\n },\n },\n },\n // Breadcrumbs overrides\n MuiBreadcrumbs: {\n styleOverrides: {\n separator: {\n color: colors.neutral[400],\n },\n },\n },\n};\n\n// Base theme options\nconst baseThemeOptions: ThemeOptions = {\n palette: {\n primary: {\n main: colors.iochmara[500],\n light: colors.iochmara[300],\n dark: colors.iochmara[600],\n contrastText: \"#FFFFFF\",\n },\n secondary: {\n main: colors.cyan[500],\n light: colors.cyan[400],\n dark: colors.cyan[600],\n contrastText: \"#FFFFFF\",\n },\n success: {\n main: colors.green[500],\n light: colors.green[400],\n dark: colors.green[600],\n contrastText: \"#FFFFFF\",\n },\n warning: {\n main: colors.amber[500],\n light: colors.amber[400],\n dark: colors.amber[600],\n contrastText: \"#FFFFFF\",\n },\n error: {\n main: colors.red[500],\n light: colors.red[400],\n dark: colors.red[600],\n contrastText: \"#FFFFFF\",\n },\n grey: {\n 50: colors.neutral[50],\n 100: colors.neutral[100],\n 200: colors.neutral[200],\n 300: colors.neutral[300],\n 400: colors.neutral[400],\n 500: colors.neutral[500],\n 600: colors.neutral[600],\n 700: colors.neutral[700],\n 800: colors.neutral[800],\n 900: colors.neutral[900],\n },\n },\n typography: {\n fontFamily:\n 'ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"',\n // Match Chakra's default font weights\n fontWeightLight: 300,\n fontWeightRegular: 400,\n fontWeightMedium: 500,\n fontWeightBold: 700,\n // Typography variants\n h1: {\n fontWeight: 700,\n fontSize: \"2.25rem\",\n lineHeight: 1.2,\n },\n h2: {\n fontWeight: 700,\n fontSize: \"1.875rem\",\n lineHeight: 1.2,\n },\n h3: {\n fontWeight: 600,\n fontSize: \"1.5rem\",\n lineHeight: 1.3,\n },\n h4: {\n fontWeight: 600,\n fontSize: \"1.25rem\",\n lineHeight: 1.4,\n },\n h5: {\n fontWeight: 600,\n fontSize: \"1.125rem\",\n lineHeight: 1.4,\n },\n h6: {\n fontWeight: 600,\n fontSize: \"1rem\",\n lineHeight: 1.5,\n },\n body1: {\n fontSize: \"0.875rem\",\n lineHeight: 1.5,\n },\n body2: {\n fontSize: \"0.75rem\",\n lineHeight: 1.5,\n },\n button: {\n textTransform: \"none\", // Match Chakra's default (no uppercase)\n fontWeight: 500,\n },\n },\n shape: {\n borderRadius: 6, // Base border radius value (used by MUI's spacing multiplier)\n },\n spacing: 4, // Base spacing unit (used by MUI's spacing multiplier)\n components: componentOverrides,\n};\n\n// Light theme\nconst lightThemeOptions: ThemeOptions = {\n ...baseThemeOptions,\n palette: {\n ...baseThemeOptions.palette,\n mode: \"light\",\n background: {\n default: \"#FFFFFF\",\n paper: \"#FFFFFF\",\n },\n text: {\n primary: colors.neutral[900],\n secondary: colors.neutral[600],\n },\n },\n};\n\n// Dark theme\nconst darkThemeOptions: ThemeOptions = {\n ...baseThemeOptions,\n palette: {\n ...baseThemeOptions.palette,\n mode: \"dark\",\n background: {\n default: colors.neutral[900],\n paper: colors.neutral[800],\n },\n text: {\n primary: colors.neutral[50],\n secondary: colors.neutral[400],\n },\n },\n};\n\n// Create themes\nexport const lightTheme = createTheme(lightThemeOptions);\nexport const darkTheme = createTheme(darkThemeOptions);\n\n// Default export (light theme)\nexport const muiTheme = lightTheme;\n\n// Export color palette for use in custom components\nexport { colors, semanticColors };\n\n// Augment MUI theme to include custom palette colors\ndeclare module \"@mui/material/styles\" {\n interface Palette {\n brand: Palette[\"primary\"];\n iochmara: Palette[\"primary\"];\n cyan: Palette[\"primary\"];\n amber: Palette[\"primary\"];\n green: Palette[\"primary\"];\n red: Palette[\"primary\"];\n rose: Palette[\"primary\"];\n fuchsia: Palette[\"primary\"];\n neutral: Palette[\"primary\"];\n envBase: string;\n envCurrent: string;\n }\n\n interface PaletteOptions {\n brand?: PaletteOptions[\"primary\"];\n iochmara?: PaletteOptions[\"primary\"];\n cyan?: PaletteOptions[\"primary\"];\n amber?: PaletteOptions[\"primary\"];\n green?: PaletteOptions[\"primary\"];\n red?: PaletteOptions[\"primary\"];\n rose?: PaletteOptions[\"primary\"];\n fuchsia?: PaletteOptions[\"primary\"];\n neutral?: PaletteOptions[\"primary\"];\n envBase?: string;\n envCurrent?: string;\n }\n}\n\n// Helper to create palette color from color scale\nfunction createPaletteColor(colorScale: (typeof colors)[keyof typeof colors]) {\n return {\n main: colorScale[500],\n light: colorScale[300],\n dark: colorScale[600],\n contrastText: \"#FFFFFF\",\n };\n}\n\n// Add custom colors to the theme palettes\nconst customPaletteAdditions = {\n brand: createPaletteColor(colors.brand),\n iochmara: {\n main: colors.iochmara[500],\n light: colors.iochmara[50],\n dark: colors.iochmara[700],\n contrastText: \"#FFFFFF\",\n },\n cyan: createPaletteColor(colors.cyan),\n amber: createPaletteColor(colors.amber),\n green: createPaletteColor(colors.green),\n red: createPaletteColor(colors.red),\n rose: createPaletteColor(colors.rose),\n fuchsia: createPaletteColor(colors.fuchsia),\n neutral: {\n main: colors.neutral[500],\n light: colors.neutral[300], // Lighter shade for borders\n dark: colors.neutral[600],\n contrastText: \"#FFFFFF\",\n },\n envBase: semanticColors.envBase,\n envCurrent: semanticColors.envCurrent,\n};\n\n// Apply custom palette to both themes\nObject.assign(lightTheme.palette, customPaletteAdditions);\nObject.assign(darkTheme.palette, customPaletteAdditions);\n\n/**\n * Semantic variant mappings from Chakra-style tokens to scale values\n * These map semantic names to numeric scale values in the color palette\n */\nconst semanticVariantMap: Record<string, number> = {\n solid: 600, // Dark, for text/icons\n subtle: 50, // Light, for backgrounds\n muted: 200, // Slightly muted\n emphasized: 500, // Standard emphasis\n focusRing: 400, // Focus ring color\n light: 300, // Light variant (for neutral.light borders)\n};\n\n/**\n * Color aliases - map Chakra color names to our color palette\n */\nconst colorAliases: Record<string, keyof typeof colors> = {\n orange: \"amber\", // Chakra's orange maps to our amber\n gray: \"neutral\", // Gray is an alias for neutral\n};\n\n/**\n * Token lookup function to mimic Chakra UI's token API\n * Usage: token(\"colors.green.solid\") => \"#16A34A\"\n */\nexport function token(path: string): string | undefined {\n const parts = path.split(\".\");\n\n // Handle \"colors.X.Y\" paths\n if (parts[0] === \"colors\" && parts.length >= 3) {\n let colorName = parts[1];\n const variant = parts[2];\n\n // Apply color aliases (e.g., orange -> amber, gray -> neutral)\n if (colorName in colorAliases) {\n colorName = colorAliases[colorName];\n }\n\n // Handle \"colors.white\" and other special cases\n if (colorName === \"white\") return \"#FFFFFF\";\n if (colorName === \"black\") return \"#000000\";\n\n // Try semantic colors first\n if (colorName in semanticColors) {\n const semantic = semanticColors[colorName as keyof typeof semanticColors];\n if (typeof semantic === \"object\" && variant in semantic) {\n return (semantic as Record<string, string>)[variant];\n }\n }\n\n // Then try base colors\n if (colorName in colors) {\n const color = colors[colorName as keyof typeof colors];\n\n // First check for numeric scale (e.g., \"500\")\n if (typeof color === \"object\" && variant in color) {\n return (color as Record<string, string>)[variant];\n }\n\n // Then check for semantic variant mapping (e.g., \"solid\" -> 600)\n if (variant in semanticVariantMap) {\n const scaleValue = semanticVariantMap[variant];\n if (typeof color === \"object\" && scaleValue in color) {\n return (color as Record<string, string>)[scaleValue];\n }\n }\n }\n }\n\n return undefined;\n}\n","import Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport { ReactNode, useState } from \"react\";\nimport { PiCopy } from \"react-icons/pi\";\nimport { useCopyToClipboard } from \"usehooks-ts\";\nimport { colors } from \"@/components/ui/mui-theme\";\n\ninterface DiffTextProps {\n value: string;\n colorPalette: \"red\" | \"green\";\n grayOut?: boolean;\n noCopy?: boolean;\n fontSize?: string;\n}\n\nexport const DiffText = ({\n value,\n colorPalette,\n grayOut,\n noCopy,\n fontSize,\n}: DiffTextProps) => {\n const [isHovered, setIsHovered] = useState(false);\n\n // Get the color values from the theme colors\n const textColor = colors[colorPalette][800];\n const bgColor = colors[colorPalette][100];\n\n return (\n <Box\n sx={{\n display: \"flex\",\n p: \"2px 5px\",\n minWidth: \"30px\",\n maxWidth: \"200px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n color: textColor,\n bgcolor: bgColor,\n alignItems: \"center\",\n gap: \"2px\",\n borderRadius: \"8px\",\n fontSize,\n flexShrink: noCopy ? 0 : \"inherit\",\n }}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n >\n <Box\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n color: grayOut ? \"gray\" : \"inherit\",\n }}\n >\n {value}\n </Box>\n\n <CopyControl\n value={value}\n noCopy={noCopy}\n grayOut={grayOut}\n isHovered={isHovered}\n />\n </Box>\n );\n};\n\ninterface CopyControlProps {\n value: string;\n grayOut?: boolean;\n noCopy?: boolean;\n isHovered: boolean;\n}\n\nfunction CopyControl({\n value,\n noCopy,\n grayOut,\n isHovered,\n}: CopyControlProps): ReactNode {\n const [copiedText, copyToClipboard] = useCopyToClipboard();\n const hasCopiedText = Boolean(copiedText);\n\n if (noCopy || grayOut) {\n return <></>;\n }\n\n if (hasCopiedText) {\n return <>Copied</>;\n }\n\n if (!isHovered) {\n return <></>;\n }\n\n return (\n <IconButton\n aria-label=\"Copy\"\n size=\"small\"\n onClick={() => copyToClipboard(value)}\n sx={{\n minWidth: \"10px\",\n height: \"10px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n p: 0,\n }}\n >\n <PiCopy size=\"10px\" />\n </IconButton>\n );\n}\n","/**\n * @file inlineRenderCell.tsx\n * @description Inline diff cell renderer for DataGrid columns\n *\n * Renders base and current values side-by-side when they differ,\n * or a single value when unchanged. Used for inline diff display mode.\n *\n * NOTE: Imports directly from gridUtils.ts to avoid circular dependency\n * with toDiffColumn.tsx which imports this component.\n */\n\nimport Box from \"@mui/material/Box\";\nimport Tooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport type { ColDef, ICellRendererParams } from \"ag-grid-community\";\nimport { DiffText } from \"@/components/query/DiffText\";\nimport {\n ColumnRenderMode,\n ColumnType,\n RowDataTypes,\n RowObjectType,\n} from \"@/lib/api/types\";\n// Import directly from gridUtils to avoid circular dependency\nimport {\n formatSmartDecimal,\n toRenderedValue,\n} from \"@/lib/dataGrid/shared/gridUtils\";\n\n/**\n * Extended column definition with optional type metadata\n */\ntype ColDefWithMetadata = ColDef<RowObjectType> & {\n columnType?: ColumnType;\n columnRenderMode?: ColumnRenderMode;\n};\n\n/**\n * Inline diff cell renderer for comparing base and current values\n *\n * @description Renders cell values in inline diff mode:\n * - If base and current values are equal, shows single value\n * - If values differ, shows both with red (base/removed) and green (current/added) styling\n * - Handles missing values gracefully\n *\n * The component uses DiffText for styled diff display with copy functionality.\n *\n * @param params - AG Grid cell renderer params containing row data and column definition\n * @returns Rendered cell content showing diff or single value\n */\nexport const inlineRenderCell = (\n params: ICellRendererParams<RowObjectType>,\n) => {\n const colDef = params.colDef as ColDefWithMetadata;\n const columnType = colDef?.columnType;\n const columnRenderMode = colDef?.columnRenderMode;\n const columnKey = colDef?.field ?? \"\";\n\n if (!params.data) {\n return null;\n }\n\n const row = params.data;\n const baseKey = `base__${columnKey}`.toLowerCase();\n const currentKey = `current__${columnKey}`.toLowerCase();\n\n // Handle case where neither base nor current values exist\n if (!Object.hasOwn(row, baseKey) && !Object.hasOwn(row, currentKey)) {\n return \"-\";\n }\n\n const hasBase = Object.hasOwn(row, baseKey);\n const hasCurrent = Object.hasOwn(row, currentKey);\n\n const [baseValue, baseGrayOut] = toRenderedValue(\n row,\n `base__${columnKey}`.toLowerCase(),\n columnType,\n columnRenderMode,\n );\n\n const [currentValue, currentGrayOut] = toRenderedValue(\n row,\n `current__${columnKey}`.toLowerCase(),\n columnType,\n columnRenderMode,\n );\n\n // No change - render single value\n if (row[baseKey] === row[currentKey]) {\n return (\n <Typography\n component=\"span\"\n style={{ color: currentGrayOut ? \"gray\" : \"inherit\" }}\n >\n {currentValue}\n </Typography>\n );\n }\n\n // Check if we're using delta display mode\n const isDeltaMode = columnRenderMode === \"delta\";\n\n // For delta modes, calculate the change for numeric columns\n if (\n isDeltaMode &&\n (columnType === \"number\" || columnType === \"integer\") &&\n hasBase &&\n hasCurrent\n ) {\n // Parse values to numbers (they may be strings from the API)\n const baseNum = asNumber(row[baseKey]);\n const currentNum = asNumber(row[currentKey]);\n\n // Only show delta if both values are valid numbers\n if (Number.isFinite(baseNum) && Number.isFinite(currentNum)) {\n const netChange = currentNum - baseNum;\n const changePercent = baseNum !== 0 ? (netChange / baseNum) * 100 : 0;\n\n // Format current value and delta with smart decimals (up to 2, no trailing zeros)\n const formattedCurrent = formatSmartDecimal(currentNum);\n const formattedDelta = formatSmartDecimal(netChange);\n const deltaText = `(${netChange >= 0 ? \"+\" : \"\"}${formattedDelta})`;\n\n // Build tooltip text showing full precision\n const tooltipText = `Base: ${baseNum}\\nCurrent: ${currentNum}\\nChange: ${\n netChange >= 0 ? \"+\" : \"\"\n }${netChange} (${changePercent >= 0 ? \"+\" : \"\"}${changePercent.toFixed(\n 2,\n )}%)`;\n\n return (\n <Tooltip\n title={tooltipText}\n slotProps={{\n tooltip: { sx: { whiteSpace: \"pre-line\" } },\n }}\n enterDelay={300}\n placement=\"top\"\n >\n <Box\n gap=\"5px\"\n display=\"flex\"\n alignItems=\"center\"\n lineHeight=\"normal\"\n height=\"100%\"\n >\n <DiffText\n value={formattedCurrent}\n colorPalette=\"green\"\n grayOut={currentGrayOut}\n />\n <Typography\n fontSize=\"0.75rem\"\n color={netChange >= 0 ? \"green.600\" : \"red.600\"}\n >\n {deltaText}\n </Typography>\n </Box>\n </Tooltip>\n );\n }\n }\n\n // Values differ - render inline diff with base (red) and current (green)\n return (\n <Box\n sx={{\n display: \"flex\",\n gap: \"5px\",\n alignItems: \"center\",\n lineHeight: \"normal\",\n height: \"100%\",\n }}\n >\n {hasBase && (\n <DiffText value={baseValue} colorPalette=\"red\" grayOut={baseGrayOut} />\n )}\n {hasCurrent && (\n <DiffText\n value={currentValue}\n colorPalette=\"green\"\n grayOut={currentGrayOut}\n />\n )}\n </Box>\n );\n};\n\n/*\n * Converts row data values to a number\n *\n * @param data - The row data value (number, string, or other type)\n * @returns The numeric value, or 0 if conversion fails or value is not numeric\n */\nexport function asNumber(data: RowDataTypes): number {\n if (typeof data === \"number\") return data;\n if (typeof data === \"string\") {\n const n = Number.parseFloat(data);\n return Number.isNaN(n) ? 0 : n;\n }\n return 0;\n}\n","/**\n * @file toDiffColumn.tsx\n * @description Shared column builder for diff grids (querydiff and valuediff)\n *\n * Provides a unified function to create column definitions for data diff grids,\n * supporting both inline and side-by-side display modes.\n */\n\nimport type { CellClassParams, ColDef, ColGroupDef } from \"ag-grid-community\";\nimport _ from \"lodash\";\nimport {\n DataFrameColumnGroupHeader,\n type DataFrameColumnGroupHeaderProps,\n defaultRenderCell,\n inlineRenderCell,\n} from \"@/components/ui/dataGrid\";\nimport { ColumnRenderMode, ColumnType, RowObjectType } from \"@/lib/api/types\";\nimport { getHeaderCellClass } from \"./gridUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Configuration for building a diff column\n */\nexport interface DiffColumnConfig {\n /** Column name */\n name: string;\n /** Column diff status: 'added', 'removed', 'modified', or empty */\n columnStatus: string;\n /** Column data type */\n columnType: ColumnType;\n /** How to render numeric values */\n columnRenderMode?: ColumnRenderMode;\n /** Display mode: inline shows diff in single cell, side_by_side shows two columns */\n displayMode: \"inline\" | \"side_by_side\";\n /** Title for base column in side_by_side mode */\n baseTitle?: string;\n /** Title for current column in side_by_side mode */\n currentTitle?: string;\n /** Props to pass to DataFrameColumnGroupHeader */\n headerProps?: Partial<DataFrameColumnGroupHeaderProps>;\n}\n\n/**\n * Extended column type with metadata\n */\nexport type DiffColumnResult = (\n | ColDef<RowObjectType>\n | ColGroupDef<RowObjectType>\n) & {\n columnType?: ColumnType;\n columnRenderMode?: ColumnRenderMode;\n};\n\n// ============================================================================\n// Cell Class Factories\n// ============================================================================\n\n/**\n * Creates a cell class function for base column cells\n *\n * @param columnName - The column name (used for value comparison)\n * @param columnStatus - The column's diff status\n * @returns Function that returns CSS class based on row status and value diff\n */\nexport function createCellClassBase(\n columnName: string,\n columnStatus: string,\n): (params: CellClassParams<RowObjectType>) => string | undefined {\n return (params: CellClassParams<RowObjectType>) => {\n const row = params.data;\n if (!row) return undefined;\n\n const rowStatus = row.__status;\n\n if (rowStatus === \"removed\") return \"diff-cell-removed\";\n if (rowStatus === \"added\") return \"diff-cell-added\";\n if (columnStatus === \"added\" || columnStatus === \"removed\")\n return undefined;\n\n const baseKey = `base__${columnName}`.toLowerCase();\n const currentKey = `current__${columnName}`.toLowerCase();\n\n if (!_.isEqual(row[baseKey], row[currentKey])) {\n return \"diff-cell-removed\";\n }\n\n return undefined;\n };\n}\n\n/**\n * Creates a cell class function for current column cells\n *\n * @param columnName - The column name (used for value comparison)\n * @param columnStatus - The column's diff status\n * @returns Function that returns CSS class based on row status and value diff\n */\nexport function createCellClassCurrent(\n columnName: string,\n columnStatus: string,\n): (params: CellClassParams<RowObjectType>) => string | undefined {\n return (params: CellClassParams<RowObjectType>) => {\n const row = params.data;\n if (!row) return undefined;\n\n const rowStatus = row.__status;\n\n if (rowStatus === \"removed\") return \"diff-cell-removed\";\n if (rowStatus === \"added\") return \"diff-cell-added\";\n if (columnStatus === \"added\" || columnStatus === \"removed\")\n return undefined;\n\n const baseKey = `base__${columnName}`.toLowerCase();\n const currentKey = `current__${columnName}`.toLowerCase();\n\n if (!_.isEqual(row[baseKey], row[currentKey])) {\n return \"diff-cell-added\";\n }\n\n return undefined;\n };\n}\n\n// ============================================================================\n// Main Column Builder\n// ============================================================================\n\n/**\n * Creates a diff column definition for use in data grids\n *\n * @description Builds a column configuration that supports both inline and\n * side-by-side diff display modes. In inline mode, differences are shown\n * within a single cell. In side-by-side mode, base and current values\n * appear in separate child columns.\n *\n * @param config - Column configuration options\n * @returns Column definition compatible with AG Grid\n *\n * @example\n * // Inline mode for querydiff\n * const column = toDiffColumn({\n * name: 'price',\n * columnStatus: 'modified',\n * columnType: 'number',\n * displayMode: 'inline',\n * headerProps: {\n * primaryKeys: ['id'],\n * onPrimaryKeyChange: setPrimaryKeys,\n * }\n * });\n *\n * @example\n * // Side-by-side mode for valuediff\n * const column = toDiffColumn({\n * name: 'Amount',\n * columnStatus: '',\n * columnType: 'number',\n * displayMode: 'side_by_side',\n * baseTitle: 'Before',\n * currentTitle: 'After',\n * headerProps: {\n * primaryKeys: ['id'],\n * }\n * });\n */\nexport function toDiffColumn(config: DiffColumnConfig): DiffColumnResult {\n const {\n name,\n columnStatus,\n columnType,\n columnRenderMode,\n displayMode,\n baseTitle = \"Base\",\n currentTitle = \"Current\",\n headerProps = {},\n } = config;\n\n const headerCellClass = getHeaderCellClass(columnStatus);\n\n // Build the header component\n const headerComponent = () => (\n <DataFrameColumnGroupHeader\n name={name}\n columnStatus={columnStatus}\n columnType={columnType}\n {...headerProps}\n />\n );\n\n if (displayMode === \"inline\") {\n return {\n field: name,\n headerName: name,\n headerClass: headerCellClass,\n headerComponent,\n cellRenderer: inlineRenderCell,\n columnType,\n columnRenderMode,\n };\n }\n\n // Side-by-side mode with base/current child columns\n const cellClassBase = createCellClassBase(name, columnStatus);\n const cellClassCurrent = createCellClassCurrent(name, columnStatus);\n\n return {\n headerName: name,\n headerClass: headerCellClass,\n headerGroupComponent: headerComponent,\n columnType,\n columnRenderMode,\n children: [\n {\n field: `base__${name}`,\n headerName: baseTitle,\n headerClass: headerCellClass,\n cellClass: cellClassBase,\n cellRenderer: defaultRenderCell,\n columnType,\n columnRenderMode,\n } as ColDef<RowObjectType>,\n {\n field: `current__${name}`,\n headerName: currentTitle,\n headerClass: headerCellClass,\n cellClass: cellClassCurrent,\n cellRenderer: defaultRenderCell,\n columnType,\n columnRenderMode,\n } as ColDef<RowObjectType>,\n ],\n };\n}\n","/**\n * @file diffColumnBuilder.tsx\n * @description Builds AG Grid column definitions from ColumnConfig[]\n *\n * This module transforms the pure data structures from columnBuilders.ts\n * into actual column definitions with React components for headers.\n */\n\nimport type { CellClassParams, ColDef, ColGroupDef } from \"ag-grid-community\";\nimport {\n DataFrameColumnGroupHeader,\n type DataFrameColumnGroupHeaderProps,\n defaultRenderCell,\n} from \"@/components/ui/dataGrid\";\nimport { ColumnRenderMode, ColumnType, RowObjectType } from \"@/lib/api/types\";\nimport { ColumnConfig } from \"./columnBuilders\";\nimport { toDiffColumn } from \"./toDiffColumn\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Extended column type with metadata (matches existing pattern)\n */\nexport type DiffColumnDefinition = (\n | ColDef<RowObjectType>\n | ColGroupDef<RowObjectType>\n) & {\n columnType?: ColumnType;\n columnRenderMode?: ColumnRenderMode;\n};\n\n/**\n * Configuration for building diff column definitions\n */\nexport interface BuildDiffColumnDefinitionsConfig {\n /**\n * Column configurations from getDisplayColumns()\n */\n columns: ColumnConfig[];\n\n /**\n * Display mode for diff columns\n * - \"inline\": Single column with inline diff rendering\n * - \"side_by_side\": Column group with base/current sub-columns\n */\n displayMode: \"inline\" | \"side_by_side\";\n\n /**\n * Props to pass to DataFrameColumnGroupHeader for all columns\n */\n headerProps: Partial<DataFrameColumnGroupHeaderProps>;\n\n /**\n * Title for base column in side_by_side mode\n */\n baseTitle?: string;\n\n /**\n * Title for current column in side_by_side mode\n */\n currentTitle?: string;\n\n /**\n * Whether to add index column when no primary keys exist\n * Only applies when columns array has no isPrimaryKey entries\n * @default false\n */\n allowIndexFallback?: boolean;\n}\n\n/**\n * Result from building diff column definitions\n */\nexport interface BuildDiffColumnDefinitionsResult {\n /**\n * The generated column definitions ready for AG Grid\n */\n columns: DiffColumnDefinition[];\n\n /**\n * Whether an index fallback column was added\n */\n usedIndexFallback: boolean;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Creates the index fallback column used when no primary keys are specified\n */\nfunction createIndexColumn(): DiffColumnDefinition {\n return {\n field: \"_index\",\n headerName: \"\",\n width: 50,\n maxWidth: 100,\n cellClass: \"index-column\",\n resizable: false,\n pinned: \"left\",\n };\n}\n\n/**\n * Creates a primary key column definition\n *\n * Primary key columns are:\n * - Pinned left (sticky left)\n * - Have a special cellClass based on row status\n * - Use defaultRenderCell (no base__/current__ prefixing)\n */\nfunction createPrimaryKeyColumn(\n config: ColumnConfig,\n headerProps: Partial<DataFrameColumnGroupHeaderProps>,\n): DiffColumnDefinition {\n const { key, name, columnType, columnStatus, columnRenderMode } = config;\n\n return {\n field: key,\n headerName: name,\n headerComponent: () => (\n <DataFrameColumnGroupHeader\n name={name}\n columnStatus={columnStatus ?? \"\"}\n columnType={columnType}\n {...headerProps}\n />\n ),\n pinned: \"left\",\n cellClass: (params: CellClassParams<RowObjectType>) => {\n if (params.data?.__status) {\n return `diff-header-${params.data.__status}`;\n }\n return undefined;\n },\n cellRenderer: defaultRenderCell,\n columnType,\n columnRenderMode,\n };\n}\n\n/**\n * Creates a diff column definition (non-PK column)\n *\n * Uses toDiffColumn() to handle inline vs side_by_side modes\n */\nfunction createDiffColumn(\n config: ColumnConfig,\n displayMode: \"inline\" | \"side_by_side\",\n headerProps: Partial<DataFrameColumnGroupHeaderProps>,\n baseTitle?: string,\n currentTitle?: string,\n): DiffColumnDefinition {\n const { name, columnType, columnStatus, columnRenderMode } = config;\n\n return toDiffColumn({\n name,\n columnStatus: columnStatus ?? \"\",\n columnType,\n columnRenderMode,\n displayMode,\n baseTitle,\n currentTitle,\n headerProps,\n });\n}\n\n// ============================================================================\n// Main Function\n// ============================================================================\n\n/**\n * Builds AG Grid column definitions from ColumnConfig array\n *\n * @description Transforms pure column configuration objects into actual\n * column definitions with React JSX headers. Handles:\n *\n * - Primary key columns (pinned, special cellClass)\n * - Diff columns (via toDiffColumn for inline/side_by_side modes)\n * - Index fallback (when no PKs and allowIndexFallback is true)\n *\n * @example\n * ```tsx\n * // Get column configs from shared utility\n * const columnConfigs = getDisplayColumns({\n * columnMap,\n * primaryKeys,\n * pinnedColumns,\n * columnsRenderMode,\n * changedOnly,\n * rowStats,\n * excludeColumns: [\"in_a\", \"in_b\"],\n * });\n *\n * // Build actual column definitions\n * const { columns } = buildDiffColumnDefinitions({\n * columns: columnConfigs,\n * displayMode: \"inline\",\n * headerProps: {\n * primaryKeys,\n * pinnedColumns,\n * onPinnedColumnsChange,\n * },\n * });\n * ```\n *\n * @example\n * ```tsx\n * // With index fallback for querydiff when no PKs\n * const { columns, usedIndexFallback } = buildDiffColumnDefinitions({\n * columns: columnConfigs,\n * displayMode: \"side_by_side\",\n * allowIndexFallback: true,\n * headerProps: {\n * primaryKeys: [],\n * pinnedColumns,\n * onPrimaryKeyChange,\n * onPinnedColumnsChange,\n * },\n * });\n *\n * if (usedIndexFallback) {\n * // Index-based matching was used\n * }\n * ```\n */\nexport function buildDiffColumnDefinitions(\n config: BuildDiffColumnDefinitionsConfig,\n): BuildDiffColumnDefinitionsResult {\n const {\n columns: columnConfigs,\n displayMode,\n headerProps,\n baseTitle,\n currentTitle,\n allowIndexFallback = false,\n } = config;\n\n const columns: DiffColumnDefinition[] = [];\n let usedIndexFallback = false;\n\n // Check if we have any primary key columns\n const hasPrimaryKeys = columnConfigs.some((col) => col.isPrimaryKey);\n\n // Add index fallback if no PKs and allowed\n if (!hasPrimaryKeys && allowIndexFallback) {\n columns.push(createIndexColumn());\n usedIndexFallback = true;\n }\n\n // Build column definitions\n for (const colConfig of columnConfigs) {\n if (colConfig.isPrimaryKey) {\n // Primary key column - pinned with special cellClass\n columns.push(createPrimaryKeyColumn(colConfig, headerProps));\n } else {\n // Regular diff column - uses toDiffColumn for inline/side_by_side\n const diffColumn = createDiffColumn(\n colConfig,\n displayMode,\n headerProps,\n baseTitle,\n currentTitle,\n );\n\n // Set pinned property - \"left\" for frozen columns, undefined to explicitly unpin\n // Setting undefined is important to override AG Grid's internal pinned state\n columns.push({\n ...diffColumn,\n pinned: colConfig.frozen ? \"left\" : undefined,\n });\n }\n }\n\n return { columns, usedIndexFallback };\n}\n","/**\n * @file rowBuilders.ts\n * @description Shared row building utilities for diff grids\n *\n * Provides unified row generation logic for both querydiff (dual DataFrames)\n * and valuediff (joined DataFrame with in_a/in_b) scenarios.\n */\n\nimport _ from \"lodash\";\nimport { DataFrame, RowObjectType } from \"@/lib/api/types\";\nimport { mergeKeysWithStatus } from \"@/lib/mergeKeys\";\nimport { keyToNumber } from \"@/utils/transforms\";\nimport { ColumnMapEntry, MergeColumnMapEntry, RowStats } from \"./gridUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Union type for column map entries (supports both querydiff and valuediff)\n */\nexport type DiffColumnMapEntry = ColumnMapEntry | MergeColumnMapEntry;\n\n/**\n * Type guard to check if entry is a MergeColumnMapEntry (has separate base/current keys)\n */\nfunction isMergeColumnMapEntry(\n entry: DiffColumnMapEntry,\n): entry is MergeColumnMapEntry {\n return \"baseColumnKey\" in entry && \"currentColumnKey\" in entry;\n}\n\n/**\n * Configuration for building diff rows\n */\nexport interface BuildDiffRowsConfig {\n /**\n * Map of primary key values to base row data\n * Keys should already be normalized (e.g., lowercased if case-insensitive)\n */\n baseMap: Record<string, RowObjectType | undefined>;\n\n /**\n * Map of primary key values to current row data\n * Keys should already be normalized (e.g., lowercased if case-insensitive)\n */\n currentMap: Record<string, RowObjectType | undefined>;\n\n /**\n * Column definitions for base data\n * Used to iterate and extract values from base rows\n */\n baseColumns: DataFrame[\"columns\"];\n\n /**\n * Column definitions for current data\n * Used to iterate and extract values from current rows\n * For joined data (valuediff), this is the same as baseColumns\n */\n currentColumns: DataFrame[\"columns\"];\n\n /**\n * Column map for tracking column metadata and status\n * This object WILL BE MUTATED to update column.status when modifications are detected\n */\n columnMap: Record<string, DiffColumnMapEntry>;\n\n /**\n * List of primary key column names\n * These columns are stored directly on the row (not prefixed with base__/current__)\n */\n primaryKeys: string[];\n\n /**\n * Whether to filter out unchanged rows\n * When true, only rows with status \"added\", \"removed\", or \"modified\" are returned\n */\n changedOnly?: boolean;\n}\n\n/**\n * Result from building diff rows\n */\nexport interface BuildDiffRowsResult {\n /** The generated rows with __status and prefixed column values */\n rows: RowObjectType[];\n\n /** Statistics about row changes */\n rowStats: RowStats;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Checks if a column name is a primary key (exact matching)\n */\nfunction isPrimaryKey(columnName: string, primaryKeys: string[]): boolean {\n return primaryKeys.includes(columnName);\n}\n\n/**\n * Gets the column key to use for value comparison\n * For MergeColumnMapEntry, uses baseColumnKey/currentColumnKey\n * For ColumnMapEntry, uses the single key\n */\nfunction getComparisonKeys(entry: DiffColumnMapEntry): {\n baseKey: string;\n currentKey: string;\n} {\n if (isMergeColumnMapEntry(entry)) {\n return {\n baseKey: entry.baseColumnKey,\n currentKey: entry.currentColumnKey,\n };\n }\n return {\n baseKey: entry.key,\n currentKey: entry.key,\n };\n}\n\n/**\n * Populates row values from a source row for the given columns\n *\n * @param targetRow - The row object to populate\n * @param sourceRow - The source row to extract values from\n * @param columns - Column definitions to iterate\n * @param prefix - Prefix to add to column keys (e.g., \"base__\" or \"current__\")\n * @param primaryKeys - Primary key column names (stored without prefix)\n */\nfunction populateRowValues(\n targetRow: RowObjectType,\n sourceRow: RowObjectType,\n columns: DataFrame[\"columns\"],\n prefix: string,\n primaryKeys: string[],\n): void {\n columns.forEach((col) => {\n const colKey = col.key;\n const isPK = isPrimaryKey(colKey, primaryKeys);\n\n if (isPK) {\n // Primary keys stored directly (not prefixed)\n targetRow[String(colKey).toLowerCase()] = sourceRow[colKey];\n } else {\n // Non-PK columns are prefixed\n targetRow[`${prefix}${colKey}`.toLowerCase()] = sourceRow[colKey];\n }\n });\n}\n\n/**\n * Detects if a row has been modified by comparing base and current values\n * Also mutates columnMap entries to mark modified columns\n *\n * @returns true if any non-PK column value differs\n */\nfunction detectModifications(\n baseRow: RowObjectType,\n currentRow: RowObjectType,\n columnMap: Record<string, DiffColumnMapEntry>,\n primaryKeys: string[],\n): boolean {\n let isModified = false;\n\n for (const [name, column] of Object.entries(columnMap)) {\n // Skip index column\n if (name === \"index\") continue;\n\n // Skip primary key columns\n if (isPrimaryKey(name, primaryKeys)) continue;\n\n const { baseKey, currentKey } = getComparisonKeys(column);\n\n // Skip if either key is unknown (column added/removed in schema)\n if (baseKey === \"unknown\" || currentKey === \"unknown\") continue;\n\n const baseValue = baseRow[baseKey];\n const currentValue = currentRow[currentKey];\n\n if (!_.isEqual(baseValue, currentValue)) {\n isModified = true;\n // Mutate column status to track which columns have modifications\n column.status = \"modified\";\n }\n }\n\n return isModified;\n}\n\n// ============================================================================\n// Main Function\n// ============================================================================\n\n/**\n * Builds diff rows from base and current row maps\n *\n * @description This function unifies the row generation logic from both\n * `toDataDiffGrid` (querydiff) and `toValueDiffGrid` (valuediff).\n *\n * Key behaviors:\n * - Merges base and current row keys to determine all unique rows\n * - Creates row objects with `_index` and `__status` fields\n * - Prefixes non-PK columns with `base__` or `current__` (lowercased)\n * - Stores PK columns directly without prefix\n * - Detects added/removed/modified status\n * - Mutates columnMap to mark modified columns\n * - Optionally filters to changed rows only\n *\n * @example\n * ```typescript\n * // For querydiff (two separate DataFrames)\n * const result = buildDiffRows({\n * baseMap,\n * currentMap,\n * baseColumns: base.columns,\n * currentColumns: current.columns,\n * columnMap: mergedColumnMap,\n * primaryKeys: [\"id\"],\n * changedOnly: false,\n * });\n *\n * // For valuediff (joined DataFrame)\n * const result = buildDiffRows({\n * baseMap,\n * currentMap,\n * baseColumns: df.columns,\n * currentColumns: df.columns, // Same columns for both\n * columnMap: joinedColumnMap,\n * primaryKeys: [\"id\"],\n * changedOnly: true,\n * });\n * ```\n */\nexport function buildDiffRows(\n config: BuildDiffRowsConfig,\n): BuildDiffRowsResult {\n const {\n baseMap,\n currentMap,\n baseColumns,\n currentColumns,\n columnMap,\n primaryKeys,\n changedOnly = false,\n } = config;\n\n // Merge base and current keys to get all unique row identifiers\n const mergedMap = mergeKeysWithStatus(\n Object.keys(baseMap),\n Object.keys(currentMap),\n );\n\n const rowStats: RowStats = {\n added: 0,\n removed: 0,\n modified: 0,\n };\n\n // Build rows from merged keys\n let rows = Object.entries(mergedMap).map(([key]) => {\n const baseRow = baseMap[key];\n const currentRow = currentMap[key];\n\n // Initialize row with index and undefined status\n const row: RowObjectType = {\n _index: keyToNumber(key),\n __status: undefined,\n };\n\n // Populate base values\n if (baseRow) {\n populateRowValues(row, baseRow, baseColumns, \"base__\", primaryKeys);\n }\n\n // Populate current values\n if (currentRow) {\n populateRowValues(\n row,\n currentRow,\n currentColumns,\n \"current__\",\n primaryKeys,\n );\n }\n\n // Determine row status\n if (!baseRow) {\n row.__status = \"added\";\n rowStats.added++;\n } else if (!currentRow) {\n row.__status = \"removed\";\n rowStats.removed++;\n } else {\n // Both rows exist - check for modifications\n const isModified = detectModifications(\n baseRow,\n currentRow,\n columnMap,\n primaryKeys,\n );\n\n if (isModified) {\n row.__status = \"modified\";\n rowStats.modified++;\n }\n }\n\n return row;\n });\n\n // Filter to changed rows if requested\n if (changedOnly) {\n rows = rows.filter(\n (row) =>\n row.__status === \"added\" ||\n row.__status === \"removed\" ||\n row.__status === \"modified\",\n );\n }\n\n return { rows, rowStats };\n}\n","/**\n * @file simpleColumnBuilder.tsx\n * @description Builds AG Grid column definitions for simple (non-diff) grids\n *\n * This module transforms the pure data structures from columnBuilders.ts\n * into actual column definitions with React components for headers.\n *\n * Unlike diffColumnBuilder.tsx, this handles simple grids without:\n * - Base/current value comparison\n * - Inline vs side-by-side display modes\n * - Column status (added/removed/modified)\n */\n\nimport type { ColDef, ColGroupDef } from \"ag-grid-community\";\nimport {\n DataFrameColumnGroupHeader,\n DataFrameColumnHeader,\n defaultRenderCell,\n} from \"@/components/ui/dataGrid\";\nimport { ColumnRenderMode, ColumnType, RowObjectType } from \"@/lib/api/types\";\nimport { ColumnConfig } from \"./columnBuilders\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Extended column type with metadata (matches existing pattern)\n */\nexport type SimpleColumnDefinition = (\n | ColDef<RowObjectType>\n | ColGroupDef<RowObjectType>\n) & {\n columnType?: ColumnType;\n columnRenderMode?: ColumnRenderMode;\n};\n\n/**\n * Configuration for building simple column definitions\n */\nexport interface BuildSimpleColumnDefinitionsConfig {\n /**\n * Column configurations from getSimpleDisplayColumns()\n */\n columns: ColumnConfig[];\n\n /**\n * Props to pass to column headers\n */\n headerProps: {\n pinnedColumns?: string[];\n onPinnedColumnsChange?: (pinnedColumns: string[]) => void;\n onColumnsRenderModeChanged?: (\n cols: Record<string, ColumnRenderMode>,\n ) => void;\n };\n\n /**\n * Whether to add index column when no primary keys exist\n * Only applies when columns array has no isPrimaryKey entries\n * @default true\n */\n allowIndexFallback?: boolean;\n}\n\n/**\n * Result from building simple column definitions\n */\nexport interface BuildSimpleColumnDefinitionsResult {\n /**\n * The generated column definitions ready for AG Grid\n */\n columns: SimpleColumnDefinition[];\n\n /**\n * Whether an index fallback column was added\n */\n usedIndexFallback: boolean;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Creates the index fallback column used when no primary keys are specified\n */\nfunction createIndexColumn(): SimpleColumnDefinition {\n return {\n field: \"_index\",\n headerName: \"\",\n width: 50,\n cellClass: \"index-column\",\n resizable: false,\n pinned: \"left\",\n };\n}\n\n/**\n * Creates a primary key column definition\n *\n * Primary key columns are:\n * - Pinned left (sticky left)\n * - Use DataFrameColumnGroupHeader (with columnStatus=\"\")\n * - Use defaultRenderCell\n */\nfunction createPrimaryKeyColumn(\n config: ColumnConfig,\n headerProps: BuildSimpleColumnDefinitionsConfig[\"headerProps\"],\n): SimpleColumnDefinition {\n const { key, name, columnType, columnRenderMode } = config;\n\n return {\n field: key,\n headerName: name,\n headerComponent: () => (\n <DataFrameColumnGroupHeader\n name={name}\n columnStatus=\"\"\n columnType={columnType}\n pinnedColumns={headerProps.pinnedColumns}\n onPinnedColumnsChange={headerProps.onPinnedColumnsChange}\n onColumnsRenderModeChanged={headerProps.onColumnsRenderModeChanged}\n />\n ),\n pinned: \"left\",\n cellRenderer: defaultRenderCell,\n columnType,\n columnRenderMode,\n };\n}\n\n/**\n * Creates a regular (non-PK) column definition\n *\n * Regular columns use DataFrameColumnHeader (simpler, no PK toggle)\n */\nfunction createRegularColumn(\n config: ColumnConfig,\n headerProps: BuildSimpleColumnDefinitionsConfig[\"headerProps\"],\n): SimpleColumnDefinition {\n const { key, name, columnType, columnRenderMode } = config;\n\n return {\n field: key,\n headerName: name,\n headerComponent: () => (\n <DataFrameColumnHeader\n name={name}\n columnType={columnType}\n pinnedColumns={headerProps.pinnedColumns}\n onPinnedColumnsChange={headerProps.onPinnedColumnsChange}\n onColumnsRenderModeChanged={headerProps.onColumnsRenderModeChanged}\n />\n ),\n cellRenderer: defaultRenderCell,\n columnType,\n columnRenderMode,\n };\n}\n\n// ============================================================================\n// Main Function\n// ============================================================================\n\n/**\n * Builds AG Grid column definitions from ColumnConfig array\n *\n * @description Transforms pure column configuration objects into actual\n * column definitions with React JSX headers. Handles:\n *\n * - Primary key columns (pinned, use DataFrameColumnGroupHeader)\n * - Regular columns (use DataFrameColumnHeader)\n * - Index fallback (when no PKs and allowIndexFallback is true)\n *\n * @example\n * ```tsx\n * // Get column configs from shared utility\n * const columnConfigs = getSimpleDisplayColumns({\n * columnMap,\n * primaryKeys,\n * pinnedColumns,\n * columnsRenderMode,\n * });\n *\n * // Build actual column definitions\n * const { columns } = buildSimpleColumnDefinitions({\n * columns: columnConfigs,\n * headerProps: {\n * pinnedColumns,\n * onPinnedColumnsChange,\n * onColumnsRenderModeChanged,\n * },\n * });\n * ```\n */\nexport function buildSimpleColumnDefinitions(\n config: BuildSimpleColumnDefinitionsConfig,\n): BuildSimpleColumnDefinitionsResult {\n const {\n columns: columnConfigs,\n headerProps,\n allowIndexFallback = true,\n } = config;\n\n const columns: SimpleColumnDefinition[] = [];\n let usedIndexFallback = false;\n\n // Check if we have any primary key columns\n const hasPrimaryKeys = columnConfigs.some((col) => col.isPrimaryKey);\n\n // Add index fallback if no PKs and allowed\n if (!hasPrimaryKeys && allowIndexFallback) {\n columns.push(createIndexColumn());\n usedIndexFallback = true;\n }\n\n // Build column definitions\n for (const colConfig of columnConfigs) {\n if (colConfig.isPrimaryKey) {\n columns.push(createPrimaryKeyColumn(colConfig, headerProps));\n } else {\n const regularColumn = createRegularColumn(colConfig, headerProps);\n\n // Set pinned property - \"left\" for frozen columns, undefined to explicitly unpin\n // Setting undefined is important to override AG Grid's internal pinned state\n columns.push({\n ...regularColumn,\n pinned: colConfig.frozen ? \"left\" : undefined,\n });\n }\n }\n\n return { columns, usedIndexFallback };\n}\n","/**\n * @file validation.ts\n * @description Input validation utilities for data grid generation\n *\n * Provides clear, actionable error messages for common issues:\n * - Malformed DataFrame structure\n * - Column-data misalignment\n * - Missing required fields\n *\n * These validations run at entry points (toDataGrid, toDataDiffGrid, toValueDiffGrid)\n * to fail fast with helpful messages rather than cryptic runtime errors.\n */\n\nimport { DataFrame } from \"@/lib/api/types\";\n\n// ============================================================================\n// Custom Error Class\n// ============================================================================\n\n/**\n * Custom error class for data grid validation failures.\n * Provides structured error information for debugging.\n */\nexport class DataGridValidationError extends Error {\n constructor(\n message: string,\n public readonly context?: string,\n public readonly details?: Record<string, unknown>,\n ) {\n super(context ? `[${context}] ${message}` : message);\n this.name = \"DataGridValidationError\";\n }\n}\n\n// ============================================================================\n// DataFrame Validation\n// ============================================================================\n\n/**\n * Validates that a DataFrame has the required structure.\n * Does NOT throw for undefined/null - those are valid (represent empty data).\n *\n * @param df - The DataFrame to validate\n * @param name - Name for error messages (e.g., \"base\", \"current\")\n * @throws DataGridValidationError if structure is invalid\n */\nexport function validateDataFrame(\n df: DataFrame | undefined | null,\n name = \"DataFrame\",\n): void {\n // undefined/null is valid - represents empty/missing data\n if (df === undefined || df === null) {\n return;\n }\n\n // Must be an object\n if (typeof df !== \"object\") {\n throw new DataGridValidationError(\n `Expected an object, got ${typeof df}`,\n name,\n );\n }\n\n // Must have columns array\n if (!(\"columns\" in df)) {\n throw new DataGridValidationError(\"Missing 'columns' property\", name, {\n receivedKeys: Object.keys(df),\n });\n }\n\n if (!Array.isArray(df.columns)) {\n throw new DataGridValidationError(\n `'columns' must be an array, got ${typeof df.columns}`,\n name,\n );\n }\n\n // Must have data array\n if (!(\"data\" in df)) {\n throw new DataGridValidationError(\"Missing 'data' property\", name, {\n receivedKeys: Object.keys(df),\n });\n }\n\n if (!Array.isArray(df.data)) {\n throw new DataGridValidationError(\n `'data' must be an array, got ${typeof df.data}`,\n name,\n );\n }\n\n // Validate column structure\n validateColumns(df.columns, name);\n\n // Validate column-data alignment (only if there's data)\n if (df.data.length > 0) {\n validateColumnDataAlignment(df, name);\n }\n}\n\n/**\n * Validates that columns have required properties.\n *\n * @param columns - Array of column definitions\n * @param context - Context for error messages\n * @throws DataGridValidationError if any column is malformed\n */\nexport function validateColumns(\n columns: DataFrame[\"columns\"],\n context = \"DataFrame\",\n): void {\n columns.forEach((col, index) => {\n if (!col || typeof col !== \"object\") {\n throw new DataGridValidationError(\n `Column at index ${index} is not an object`,\n context,\n { column: col },\n );\n }\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof col.key !== \"string\" || col.key === \"\") {\n throw new DataGridValidationError(\n `Column at index ${index} has invalid 'key': expected non-empty string, got ${JSON.stringify(col.key)}`,\n context,\n { column: col },\n );\n }\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof col.name !== \"string\") {\n throw new DataGridValidationError(\n `Column '${col.key}' has invalid 'name': expected string, got ${typeof col.name}`,\n context,\n { column: col },\n );\n }\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof col.type !== \"string\") {\n throw new DataGridValidationError(\n `Column '${col.key}' has invalid 'type': expected string, got ${typeof col.type}`,\n context,\n { column: col },\n );\n }\n });\n}\n\n/**\n * Validates that data rows match column count.\n *\n * @param df - The DataFrame to validate\n * @param context - Context for error messages\n * @throws DataGridValidationError if misalignment detected\n */\nexport function validateColumnDataAlignment(\n df: DataFrame,\n context = \"DataFrame\",\n): void {\n const columnCount = df.columns.length;\n\n for (let i = 0; i < df.data.length; i++) {\n const row = df.data[i];\n\n if (!Array.isArray(row)) {\n throw new DataGridValidationError(\n `Row at index ${i} is not an array`,\n context,\n { row, rowType: typeof row },\n );\n }\n\n if (row.length !== columnCount) {\n throw new DataGridValidationError(\n `Row ${i} has ${row.length} values but expected ${columnCount} (column count)`,\n context,\n {\n rowIndex: i,\n rowLength: row.length,\n columnCount,\n columns: df.columns.map((c) => c.key),\n },\n );\n }\n }\n}\n\n// ============================================================================\n// Primary Key Validation\n// ============================================================================\n\n/**\n * Validates primary key configuration.\n *\n * @param primaryKeys - Array of primary key column names\n * @param columns - Available columns to check against\n * @param options - Validation options\n * @throws DataGridValidationError if validation fails\n */\nexport function validatePrimaryKeyConfig(\n primaryKeys: string[] | undefined,\n columns: DataFrame[\"columns\"],\n options: {\n required?: boolean;\n caseInsensitive?: boolean;\n context?: string;\n } = {},\n): void {\n const {\n required = false,\n caseInsensitive = false,\n context = \"primaryKeys\",\n } = options;\n\n // Check if required\n if (required && (!primaryKeys || primaryKeys.length === 0)) {\n throw new DataGridValidationError(\n \"Primary keys are required but none were provided\",\n context,\n );\n }\n\n // If no PKs provided and not required, that's fine\n if (!primaryKeys || primaryKeys.length === 0) {\n return;\n }\n\n // Validate each PK exists\n const columnKeys = columns.map((c) => c.key);\n const columnKeysLower = caseInsensitive\n ? columnKeys.map((k) => k.toLowerCase())\n : columnKeys;\n\n for (const pk of primaryKeys) {\n const pkToFind = caseInsensitive ? pk.toLowerCase() : pk;\n const found = caseInsensitive\n ? columnKeysLower.includes(pkToFind)\n : columnKeys.includes(pk);\n\n if (!found) {\n throw new DataGridValidationError(\n `Primary key column '${pk}' not found in columns`,\n context,\n {\n requestedKey: pk,\n availableColumns: columnKeys,\n caseInsensitive,\n },\n );\n }\n }\n\n // Check for duplicate PKs\n const seen = new Set<string>();\n for (const pk of primaryKeys) {\n const normalized = caseInsensitive ? pk.toLowerCase() : pk;\n if (seen.has(normalized)) {\n throw new DataGridValidationError(\n `Duplicate primary key: '${pk}'`,\n context,\n { primaryKeys },\n );\n }\n seen.add(normalized);\n }\n}\n\n// ============================================================================\n// Convenience Validators for Entry Points\n// ============================================================================\n\n/**\n * Validates inputs for toDataGrid (single DataFrame).\n */\nexport function validateToDataGridInputs(\n df: DataFrame | undefined,\n options?: { primaryKeys?: string[] },\n): void {\n validateDataFrame(df, \"dataframe\");\n\n if (df && options?.primaryKeys) {\n validatePrimaryKeyConfig(options.primaryKeys, df.columns, {\n context: \"toDataGrid\",\n });\n }\n}\n\n/**\n * Validates inputs for toDataDiffGrid (base + current DataFrames).\n */\nexport function validateToDataDiffGridInputs(\n base: DataFrame | undefined,\n current: DataFrame | undefined,\n options?: { primaryKeys?: string[] },\n): void {\n validateDataFrame(base, \"base\");\n validateDataFrame(current, \"current\");\n\n // If PKs provided, they should exist in at least one of the DataFrames\n if (options?.primaryKeys && options.primaryKeys.length > 0) {\n const baseColumns = base?.columns ?? [];\n const currentColumns = current?.columns ?? [];\n const allColumnKeys = new Set([\n ...baseColumns.map((c) => c.key),\n ...currentColumns.map((c) => c.key),\n ]);\n\n for (const pk of options.primaryKeys) {\n if (!allColumnKeys.has(pk)) {\n throw new DataGridValidationError(\n `Primary key column '${pk}' not found in either base or current DataFrame`,\n \"toDataDiffGrid\",\n {\n requestedKey: pk,\n baseColumns: baseColumns.map((c) => c.key),\n currentColumns: currentColumns.map((c) => c.key),\n },\n );\n }\n }\n }\n}\n\n/**\n * Validates inputs for toValueDiffGrid\n *\n * @throws {DataGridValidationError} If validation fails\n */\nexport function validateToValueDiffGridInputs(\n df: DataFrame | undefined,\n primaryKeys: string[],\n): void {\n // Validate DataFrame exists\n if (!df) {\n throw new DataGridValidationError(\"DataFrame is required for value diff\");\n }\n\n // Validate DataFrame structure\n validateDataFrame(df);\n\n // Validate primary keys are provided (valuediff requires PKs)\n if (!primaryKeys || primaryKeys.length === 0) {\n throw new DataGridValidationError(\n \"Primary keys are required for value diff\",\n );\n }\n\n // Validate primary keys exist in columns (exact matching)\n validatePrimaryKeyConfig(primaryKeys, df.columns, {\n required: true,\n context: \"toValueDiffGrid\",\n });\n\n // Validate in_a/in_b columns exist (lowercase, guaranteed by backend)\n const columnKeys = df.columns.map((c) => c.key);\n if (!columnKeys.includes(\"in_a\")) {\n throw new DataGridValidationError(\n \"Value diff DataFrame must include lowercase 'in_a' column\",\n );\n }\n if (!columnKeys.includes(\"in_b\")) {\n throw new DataGridValidationError(\n \"Value diff DataFrame must include lowercase 'in_b' column\",\n );\n }\n}\n","/**\n * @file toDataDiffGrid.ts\n * @description Query diff grid generation and rendering components\n *\n * REFACTORED: Now uses shared utilities from @/lib/dataGrid/shared\n */\n\nimport \"src/components/query/styles.css\";\nimport { ColumnRenderMode, DataFrame, RowObjectType } from \"@/lib/api/types\";\nimport {\n buildDiffColumnDefinitions,\n buildDiffRows,\n buildMergedColumnMap,\n getDisplayColumns,\n getPrimaryKeyValue,\n validatePrimaryKeys,\n validateToDataDiffGridInputs,\n} from \"@/lib/dataGrid/shared\";\nimport { dataFrameToRowObjects } from \"@/utils/transforms\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface QueryDataDiffGridOptions {\n primaryKeys?: string[];\n onPrimaryKeyChange?: (primaryKeys: string[]) => void;\n pinnedColumns?: string[];\n onPinnedColumnsChange?: (pinnedColumns: string[]) => void;\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n onColumnsRenderModeChanged?: (col: Record<string, ColumnRenderMode>) => void;\n changedOnly?: boolean;\n baseTitle?: string;\n currentTitle?: string;\n displayMode?: \"side_by_side\" | \"inline\";\n}\n\n// ============================================================================\n// Main Grid Generation Function\n// ============================================================================\n\nexport function toDataDiffGrid(\n _base?: DataFrame,\n _current?: DataFrame,\n options?: QueryDataDiffGridOptions,\n) {\n validateToDataDiffGridInputs(_base, _current, options);\n const base = _base ?? { columns: [], data: [] };\n const current = _current ?? { columns: [], data: [] };\n const primaryKeys = options?.primaryKeys ?? [];\n const pinnedColumns = options?.pinnedColumns ?? [];\n const changedOnly = options?.changedOnly ?? false;\n const displayMode = options?.displayMode ?? \"side_by_side\";\n const columnsRenderMode = options?.columnsRenderMode ?? {};\n\n const baseData = dataFrameToRowObjects(base);\n const currentData = dataFrameToRowObjects(current);\n\n // REFACTORED: Use shared utility\n const columnMap = buildMergedColumnMap(base, current);\n\n // Build row maps indexed by primary key\n const baseMap: Record<string, RowObjectType> = {};\n const currentMap: Record<string, RowObjectType> = {};\n let invalidPKeyBase = false;\n let invalidPKeyCurrent = false;\n\n if (primaryKeys.length === 0) {\n baseData.forEach((row) => {\n baseMap[String(row._index)] = row;\n });\n currentData.forEach((row) => {\n currentMap[String(row._index)] = row;\n });\n } else {\n // REFACTORED: Use shared utility\n const basePKKeys = validatePrimaryKeys(base.columns, primaryKeys);\n baseData.forEach((row) => {\n const key = getPrimaryKeyValue(base.columns, basePKKeys, row);\n if (key in baseMap) {\n invalidPKeyBase = true;\n }\n baseMap[key] = row;\n });\n\n const currentPKKeys = validatePrimaryKeys(current.columns, primaryKeys);\n currentData.forEach((row) => {\n const key = getPrimaryKeyValue(current.columns, currentPKKeys, row);\n if (key in currentMap) {\n invalidPKeyCurrent = true;\n }\n currentMap[key] = row;\n });\n }\n\n const { rows, rowStats } = buildDiffRows({\n baseMap,\n currentMap,\n baseColumns: base.columns,\n currentColumns: current.columns,\n columnMap,\n primaryKeys,\n changedOnly,\n });\n\n // Get column configurations (pure data)\n const columnConfigs = getDisplayColumns({\n columnMap,\n primaryKeys,\n pinnedColumns,\n columnsRenderMode,\n changedOnly,\n rowStats,\n excludeColumns: [\"index\"],\n strictMode: false, // querydiff is lenient with missing columns\n });\n\n // Build column definitions with JSX\n const { columns } = buildDiffColumnDefinitions({\n columns: columnConfigs,\n displayMode,\n allowIndexFallback: true, // querydiff adds _index when no PKs\n baseTitle: options?.baseTitle,\n currentTitle: options?.currentTitle,\n headerProps: {\n primaryKeys,\n pinnedColumns,\n onPrimaryKeyChange: options?.onPrimaryKeyChange,\n onPinnedColumnsChange: options?.onPinnedColumnsChange,\n onColumnsRenderModeChanged: options?.onColumnsRenderModeChanged,\n },\n });\n\n return {\n columns,\n rows,\n invalidPKeyBase,\n invalidPKeyCurrent,\n };\n}\n","/**\n * @file toDataGrid.tsx\n * @description Simple data grid generation for single DataFrame display\n *\n * Unlike toDataDiffGrid and toValueDiffGrid, this handles non-diff scenarios\n * where we just display a single DataFrame without base/current comparison.\n *\n * REFACTORED: Now uses shared utilities from @/lib/dataGrid/shared\n */\n\nimport { ColumnRenderMode, DataFrame } from \"@/lib/api/types\";\nimport {\n buildColumnMap,\n buildSimpleColumnDefinitions,\n getSimpleDisplayColumns,\n validateToDataGridInputs,\n} from \"@/lib/dataGrid/shared\";\nimport { dataFrameToRowObjects } from \"@/utils/transforms\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface QueryDataGridOptions {\n primaryKeys?: string[];\n onPrimaryKeyChange?: (primaryKeys: string[]) => void;\n pinnedColumns?: string[];\n onPinnedColumnsChange?: (pinnedColumns: string[]) => void;\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n onColumnsRenderModeChanged?: (col: Record<string, ColumnRenderMode>) => void;\n}\n\n// ============================================================================\n// Main Grid Generation Function\n// ============================================================================\n\nexport function toDataGrid(result: DataFrame, options: QueryDataGridOptions) {\n validateToDataGridInputs(result, options);\n\n const primaryKeys = options.primaryKeys ?? [];\n const pinnedColumns = options.pinnedColumns ?? [];\n const columnsRenderMode = options.columnsRenderMode ?? {};\n\n // REFACTORED: Use shared utility for column map\n const columnMap = buildColumnMap(result);\n\n // REFACTORED: Use shared utility for column configuration\n const columnConfigs = getSimpleDisplayColumns({\n columnMap,\n primaryKeys,\n pinnedColumns,\n columnsRenderMode,\n });\n\n // REFACTORED: Use shared utility for column definitions with JSX\n const { columns } = buildSimpleColumnDefinitions({\n columns: columnConfigs,\n headerProps: {\n pinnedColumns,\n onPinnedColumnsChange: options.onPinnedColumnsChange,\n onColumnsRenderModeChanged: options.onColumnsRenderModeChanged,\n },\n allowIndexFallback: true,\n });\n\n return { columns, rows: dataFrameToRowObjects(result) };\n}\n","export function deltaPercentageString(base: number, current: number) {\n if (base < current) {\n const p = ((current - base) / base) * 100;\n return `+${p >= 0.1 ? p.toFixed(1) : \" <0.1 \"}%`;\n } else if (base > current) {\n const p = ((base - current) / base) * 100;\n return `-${p >= 0.1 ? p.toFixed(1) : \" <0.1 \"}%`;\n } else {\n return \"0 %\";\n }\n}\n","/**\n * @file rowCountUtils.ts\n * @description Utilities for converting row count results to DataFrame format\n */\n\nimport { deltaPercentageString } from \"@/components/rowcount/delta\";\nimport { RowCountDiffResult, RowCountResult } from \"@/lib/api/rowcount\";\nimport { DataFrame } from \"@/lib/api/types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Extended row data for row count diff grid\n */\nexport interface RowCountDiffRowData {\n name: string;\n base: number | null;\n current: number | null;\n delta: string;\n}\n\n/**\n * Extended row data for row count grid (single env)\n */\nexport interface RowCountRowData {\n name: string;\n current: number | null;\n}\n\n// ============================================================================\n// Delta Calculation\n// ============================================================================\n\n/**\n * Calculates the delta string for row count comparison\n */\nexport function calculateDelta(\n base: number | null,\n current: number | null,\n): string {\n if (base !== null && current !== null) {\n return base !== current ? deltaPercentageString(base, current) : \"=\";\n }\n\n if (base === current) return \"N/A\";\n if (base === null) return \"Added\";\n if (current === null) return \"Removed\";\n\n return \"N/A\";\n}\n\n// ============================================================================\n// Data Conversion\n// ============================================================================\n\n/**\n * Converts RowCountDiffResult to DataFrame format\n *\n * @param result - The row count diff result from the backend\n * @returns DataFrame with name, base, current, and delta columns\n */\nexport function rowCountDiffResultToDataFrame(\n result: RowCountDiffResult,\n): DataFrame {\n const entries = Object.entries(result);\n\n return {\n columns: [\n { key: \"name\", name: \"Name\", type: \"text\" },\n { key: \"base\", name: \"Base Rows\", type: \"number\" },\n { key: \"current\", name: \"Current Rows\", type: \"number\" },\n { key: \"delta\", name: \"Delta\", type: \"text\" },\n ],\n data: entries.map(([name, counts]) => {\n const base = typeof counts.base === \"number\" ? counts.base : null;\n const current = typeof counts.curr === \"number\" ? counts.curr : null;\n const delta = calculateDelta(base, current);\n\n return [name, base, current, delta];\n }),\n };\n}\n\n/**\n * Converts RowCountResult to DataFrame format\n *\n * @param result - The row count result from the backend\n * @returns DataFrame with name and current columns\n */\nexport function rowCountResultToDataFrame(result: RowCountResult): DataFrame {\n const entries = Object.entries(result);\n\n return {\n columns: [\n { key: \"name\", name: \"Name\", type: \"text\" },\n { key: \"current\", name: \"Row Count\", type: \"number\" },\n ],\n data: entries.map(([name, counts]) => {\n const current = typeof counts.curr === \"number\" ? counts.curr : null;\n return [name, current];\n }),\n };\n}\n\n// ============================================================================\n// Row Status Determination\n// ============================================================================\n\n/**\n * Determines the diff status for a row count entry\n *\n * @param base - Base row count (null if not present)\n * @param current - Current row count (null if not present)\n * @returns Status string: \"added\" | \"removed\" | \"modified\" | undefined\n */\nexport function getRowCountDiffStatus(\n base: number | null,\n current: number | null,\n): \"added\" | \"removed\" | \"modified\" | undefined {\n if (base === null && current !== null) return \"added\";\n if (base !== null && current === null) return \"removed\";\n if (base !== null && current !== null && base !== current) return \"modified\";\n return undefined;\n}\n","/**\n * @file toRowCountDataGrid.ts\n * @description Grid generator for Row Count view (single environment)\n *\n * Generates columns and rows for displaying row counts\n * in a single environment context.\n */\n\nimport type { ColDef, ColGroupDef } from \"ag-grid-community\";\nimport { RowCountResult } from \"@/lib/api/rowcount\";\nimport { RowObjectType } from \"@/lib/api/types\";\nimport { dataFrameToRowObjects } from \"@/utils/transforms\";\nimport { rowCountResultToDataFrame } from \"./rowCountUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RowCountDataGridResult {\n columns: (ColDef<RowObjectType> | ColGroupDef<RowObjectType>)[];\n rows: RowObjectType[];\n}\n\n// ============================================================================\n// Main Generator Function\n// ============================================================================\n\n/**\n * Generates grid data for Row Count view (single environment)\n *\n * @param result - The RowCountResult from the backend\n * @returns Grid columns and rows ready for RecceDataGrid\n *\n * @example\n * ```tsx\n * const { columns, rows } = toRowCountDataGrid(run.result);\n * return <RecceDataGrid columnDefs={columns} rowData={rows} />;\n * ```\n */\nexport function toRowCountDataGrid(\n result: RowCountResult,\n): RowCountDataGridResult {\n // Convert to DataFrame format\n const dataFrame = rowCountResultToDataFrame(result);\n\n // Convert DataFrame to row objects\n const rawRows = dataFrameToRowObjects(dataFrame);\n\n // Transform rows (display \"N/A\" for null values)\n const rows: RowObjectType[] = rawRows.map((row) => ({\n ...row,\n current: row.current ?? \"N/A\",\n __status: undefined,\n }));\n\n // Build columns (simple, no diff styling)\n const columns: ColDef<RowObjectType>[] = [\n {\n field: \"name\",\n headerName: \"Name\",\n resizable: true,\n },\n {\n field: \"current\",\n headerName: \"Row Count\",\n resizable: true,\n },\n ];\n\n return { columns, rows };\n}\n","/**\n * @file toRowCountDiffDataGrid.ts\n * @description Grid generator for Row Count Diff view\n *\n * Generates columns and rows for displaying row count comparisons\n * between base and current environments across multiple models.\n */\n\nimport type { CellClassParams, ColDef, ColGroupDef } from \"ag-grid-community\";\nimport { RowCountDiffResult } from \"@/lib/api/rowcount\";\nimport { RowObjectType } from \"@/lib/api/types\";\nimport { dataFrameToRowObjects } from \"@/utils/transforms\";\nimport {\n getRowCountDiffStatus,\n rowCountDiffResultToDataFrame,\n} from \"./rowCountUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RowCountDiffDataGridResult {\n columns: (ColDef<RowObjectType> | ColGroupDef<RowObjectType>)[];\n rows: RowObjectType[];\n}\n\n// ============================================================================\n// Cell Class Function\n// ============================================================================\n\n/**\n * Creates a cell class function for row count diff cells\n *\n * Returns appropriate diff-cell-* class based on row status\n */\nfunction createRowCountDiffCellClass(): (\n params: CellClassParams<RowObjectType>,\n) => string | undefined {\n return (params: CellClassParams<RowObjectType>) => {\n const row = params.data;\n if (!row) return undefined;\n\n const base = row.base as number | string | null;\n const current = row.current as number | string | null;\n\n // Handle \"N/A\" string values\n const baseValue = base === \"N/A\" ? null : base;\n const currentValue = current === \"N/A\" ? null : current;\n\n // Both null or equal - no styling\n if (baseValue === currentValue) {\n return undefined;\n }\n\n // Current increased or newly added\n if (\n baseValue === null ||\n (typeof baseValue === \"number\" &&\n typeof currentValue === \"number\" &&\n baseValue < currentValue)\n ) {\n return \"diff-cell-added\";\n }\n\n // Current decreased or removed\n if (\n currentValue === null ||\n (typeof baseValue === \"number\" &&\n typeof currentValue === \"number\" &&\n baseValue > currentValue)\n ) {\n return \"diff-cell-removed\";\n }\n\n return undefined;\n };\n}\n\n// ============================================================================\n// Main Generator Function\n// ============================================================================\n\n/**\n * Generates grid data for Row Count Diff view\n *\n * @param result - The RowCountDiffResult from the backend\n * @returns Grid columns and rows ready for RecceDataGrid\n *\n * @example\n * ```tsx\n * const { columns, rows } = toRowCountDiffDataGrid(run.result);\n * return <RecceDataGrid columnDefs={columns} rowData={rows} />;\n * ```\n */\nexport function toRowCountDiffDataGrid(\n result: RowCountDiffResult,\n): RowCountDiffDataGridResult {\n // Convert to DataFrame format\n const dataFrame = rowCountDiffResultToDataFrame(result);\n\n // Convert DataFrame to row objects\n const rawRows = dataFrameToRowObjects(dataFrame);\n\n // Add __status to each row based on base/current comparison\n const rows: RowObjectType[] = rawRows.map((row) => {\n const base = row.base as number | null;\n const current = row.current as number | null;\n\n return {\n ...row,\n // Display \"N/A\" for null values\n base: base ?? \"N/A\",\n current: current ?? \"N/A\",\n __status: getRowCountDiffStatus(\n typeof base === \"number\" ? base : null,\n typeof current === \"number\" ? current : null,\n ),\n };\n });\n\n // Create cell class function\n const cellClass = createRowCountDiffCellClass();\n\n // Build columns\n const columns: ColDef<RowObjectType>[] = [\n {\n field: \"name\",\n headerName: \"Name\",\n resizable: true,\n cellClass,\n },\n {\n field: \"base\",\n headerName: \"Base Rows\",\n resizable: true,\n cellClass,\n },\n {\n field: \"current\",\n headerName: \"Current Rows\",\n resizable: true,\n cellClass,\n },\n {\n field: \"delta\",\n headerName: \"Delta\",\n resizable: true,\n cellClass,\n },\n ];\n\n return { columns, rows };\n}\n","/**\n * @file schemaCells.tsx\n * @description Cell components and render functions for Schema grid views\n */\n\nimport type { ICellRendererParams } from \"ag-grid-community\";\nimport React from \"react\";\nimport { ColumnNameCell } from \"@/components/schema/ColumnNameCell\";\nimport { NodeData } from \"@/lib/api/info\";\nimport { RowObjectType } from \"@/lib/api/types\";\nimport type {\n SchemaDiffRow,\n SchemaRow,\n} from \"@/lib/dataGrid/generators/toSchemaDataGrid\";\n\n// ============================================================================\n// Render Functions for toSchemaDataGrid.ts\n// ============================================================================\n\n/**\n * Creates a cellRenderer function for schema diff column names\n */\nexport function createColumnNameRenderer(\n node: NodeData,\n cllRunningMap?: Map<string, boolean>,\n showMenu?: boolean,\n): (params: ICellRendererParams<SchemaDiffRow>) => React.ReactNode {\n return (params) => {\n const row = params.data;\n if (!row) return null;\n return (\n <ColumnNameCell\n model={node}\n row={row}\n cllRunning={cllRunningMap?.get(row.name) ?? false}\n showMenu={showMenu}\n />\n );\n };\n}\n\n/**\n * Creates a cellRenderer function for single-env schema column names\n */\nexport function createSingleEnvColumnNameRenderer(\n node: NodeData,\n cllRunningMap?: Map<string, boolean>,\n showMenu?: boolean,\n): (params: ICellRendererParams<SchemaRow>) => React.ReactNode {\n return (params) => {\n const row = params.data;\n if (!row) return null;\n return (\n <ColumnNameCell\n model={node}\n row={row}\n cllRunning={cllRunningMap?.get(row.name) ?? false}\n singleEnv\n showMenu={showMenu}\n />\n );\n };\n}\n\n// ============================================================================\n// Merged Column Render Functions for Compressed Schema View\n// ============================================================================\n\n/**\n * Renders the merged index column.\n * Shows currentIndex for normal/added rows, baseIndex for removed rows.\n */\nexport function renderIndexCell(\n params: ICellRendererParams<RowObjectType>,\n): React.ReactNode {\n if (!params.data) {\n return null;\n }\n const row = params.data;\n\n const { baseIndex, currentIndex } = row;\n const isRemoved = currentIndex === undefined;\n const value = isRemoved\n ? baseIndex !== undefined\n ? baseIndex\n : \"-\"\n : currentIndex !== undefined\n ? currentIndex\n : \"-\";\n return <span>{value}</span>;\n}\n\n// Memoized version for performance optimization\nexport const MemoizedRenderIndexCell = React.memo(renderIndexCell);\nMemoizedRenderIndexCell.displayName = \"MemoizedRenderIndexCell\";\n\n/**\n * Renders the merged type column with badges for type changes.\n * - Type changed: shows red badge (base) + green badge (current) inline\n * - Added row: shows currentType\n * - Removed row: shows baseType\n * - No change: shows currentType (same as baseType)\n */\nexport function renderTypeCell(\n params: ICellRendererParams<RowObjectType>,\n): React.ReactNode {\n if (!params.data) {\n return null;\n }\n const row = params.data;\n\n const { baseType, currentType, baseIndex, currentIndex } = row;\n const isAdded = baseIndex === undefined;\n const isRemoved = currentIndex === undefined;\n const isTypeChanged = !isAdded && !isRemoved && baseType !== currentType;\n\n if (isTypeChanged) {\n return (\n <span>\n <span\n className=\"type-badge type-badge-removed\"\n title={`Base type: ${baseType}`}\n >\n {baseType}\n </span>\n <span\n className=\"type-badge type-badge-added\"\n title={`Current type: ${currentType}`}\n >\n {currentType}\n </span>\n </span>\n );\n }\n\n // For added rows, show currentType; for removed rows, show baseType\n return <span>{isRemoved ? baseType : currentType}</span>;\n}\n\n// Memoized version for performance optimization\nexport const MemoizedRenderTypeCell = React.memo(renderTypeCell);\nMemoizedRenderTypeCell.displayName = \"MemoizedRenderTypeCell\";\n","/**\n * @file valueDiffCells.tsx\n * @description Cell components and render functions for Value Diff summary grid\n *\n * Provides specialized cell renderers for the value diff summary view:\n * - PrimaryKeyIndicatorCell: Shows key icon for primary key columns\n * - ValueDiffColumnNameCell: Column name with context menu for drill-down\n * - MatchedPercentCell: Formatted percentage display\n *\n * Also exports render functions for use in toValueDataGrid.ts generator.\n */\n\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport ListSubheader from \"@mui/material/ListSubheader\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport type { ICellRendererParams } from \"ag-grid-community\";\nimport React, { MouseEvent, useState } from \"react\";\nimport { PiDotsThreeVertical } from \"react-icons/pi\";\nimport { VscKey } from \"react-icons/vsc\";\nimport { RowObjectType } from \"@/lib/api/types\";\nimport { ValueDiffParams } from \"@/lib/api/valuediff\";\nimport {\n RecceActionOptions,\n useRecceActionContext,\n} from \"@/lib/hooks/RecceActionContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\n\n// ============================================================================\n// PrimaryKeyIndicatorCell\n// ============================================================================\n\nexport interface PrimaryKeyIndicatorCellProps {\n /** The column name to check */\n columnName: string;\n /** List of primary key column names */\n primaryKeys: string[];\n}\n\n/**\n * Cell component that displays a key icon for primary key columns\n *\n * @example\n * <PrimaryKeyIndicatorCell\n * columnName=\"user_id\"\n * primaryKeys={[\"user_id\", \"order_id\"]}\n * />\n */\nexport function PrimaryKeyIndicatorCell({\n columnName,\n primaryKeys,\n}: PrimaryKeyIndicatorCellProps) {\n const isPrimaryKey = primaryKeys.includes(columnName);\n\n return (\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n height: \"100%\",\n }}\n >\n {isPrimaryKey && <VscKey />}\n </Box>\n );\n}\n\n// ============================================================================\n// ValueDiffColumnNameCell\n// ============================================================================\n\nexport interface ValueDiffColumnNameCellProps {\n /** The column name to display */\n column: string;\n /** Parameters from the value_diff run */\n params: ValueDiffParams;\n}\n\n/**\n * Cell component for column names with context menu for drill-down actions\n *\n * @description Renders the column name with a context menu that provides:\n * - \"Show mismatched values...\" - Opens form to configure detail view\n * - \"Show mismatched values for '{column}'\" - Directly shows mismatches for this column\n *\n * @example\n * <ValueDiffColumnNameCell\n * column=\"email\"\n * params={{ model: \"users\", primary_key: \"id\" }}\n * />\n */\nexport function ValueDiffColumnNameCell({\n params,\n column,\n}: ValueDiffColumnNameCellProps) {\n const { runAction } = useRecceActionContext();\n const { featureToggles } = useRecceInstanceContext();\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const menuOpen = Boolean(anchorEl);\n\n const handleMenuClick = (event: MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n const handleValueDiffDetail = (\n paramsOverride?: Partial<ValueDiffParams>,\n options?: RecceActionOptions,\n ) => {\n const newParams = {\n ...params,\n ...paramsOverride,\n };\n\n runAction(\"value_diff_detail\", newParams, options);\n };\n\n return (\n <Box sx={{ display: \"flex\" }}>\n <Box\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {column}\n </Box>\n <Box sx={{ flex: 1 }} />\n\n <IconButton\n aria-label=\"Column options\"\n className=\"row-context-menu\"\n size=\"small\"\n disabled={featureToggles.disableDatabaseQuery}\n onClick={handleMenuClick}\n >\n <PiDotsThreeVertical />\n </IconButton>\n <Menu\n anchorEl={anchorEl}\n open={menuOpen}\n onClose={handleMenuClose}\n slotProps={{\n list: { sx: { lineHeight: \"20px\" } },\n }}\n >\n <ListSubheader sx={{ fontSize: \"8pt\", lineHeight: \"20px\" }}>\n Action\n </ListSubheader>\n <MenuItem\n onClick={() => {\n handleValueDiffDetail({}, { showForm: true });\n handleMenuClose();\n }}\n sx={{ fontSize: \"10pt\" }}\n >\n Show mismatched values...\n </MenuItem>\n <MenuItem\n onClick={() => {\n handleValueDiffDetail({ columns: [column] }, { showForm: false });\n handleMenuClose();\n }}\n sx={{ fontSize: \"10pt\" }}\n >\n Show mismatched values for &apos;{column}&apos;\n </MenuItem>\n </Menu>\n </Box>\n );\n}\n\n// ============================================================================\n// MatchedPercentCell\n// ============================================================================\n\nexport interface MatchedPercentCellProps {\n /** The percentage value (0-1 scale) */\n value: number | undefined | null;\n}\n\n/**\n * Cell component for displaying match percentage with special formatting\n *\n * @description Formats the percentage value with special handling for edge cases:\n * - Values > 99.99% but < 100%: Shows \"~99.99 %\"\n * - Values > 0% but < 0.01%: Shows \"~0.01 %\"\n * - null/undefined: Shows \"N/A\"\n * - Other values: Shows \"XX.XX %\"\n *\n * @example\n * <MatchedPercentCell value={0.9542} /> // \"95.42 %\"\n * <MatchedPercentCell value={0.99999} /> // \"~99.99 %\"\n * <MatchedPercentCell value={null} /> // \"N/A\"\n */\nexport function MatchedPercentCell({ value }: MatchedPercentCellProps) {\n let displayValue = \"N/A\";\n\n if (value != null) {\n if (value > 0.9999 && value < 1) {\n displayValue = \"~99.99 %\";\n } else if (value < 0.0001 && value > 0) {\n displayValue = \"~0.01 %\";\n } else {\n displayValue = `${(value * 100).toFixed(2)} %`;\n }\n }\n\n return <Box sx={{ textAlign: \"right\" }}>{displayValue}</Box>;\n}\n\n// ============================================================================\n// Render Functions for toValueDataGrid.ts\n// ============================================================================\n\n/**\n * Creates a cellRenderer function for the primary key indicator column\n *\n * @param primaryKeys - List of primary key column names\n * @returns A cellRenderer function compatible with AG Grid\n */\nexport function createPrimaryKeyIndicatorRenderer(\n primaryKeys: string[],\n): (params: ICellRendererParams<RowObjectType>) => React.ReactNode {\n return (params) => {\n const row = params.data;\n if (!row) return null;\n return (\n <PrimaryKeyIndicatorCell\n columnName={String(row[\"0\"])}\n primaryKeys={primaryKeys}\n />\n );\n };\n}\n\n/**\n * Creates a cellRenderer function for the column name column\n *\n * @param params - ValueDiffParams from the run\n * @returns A cellRenderer function compatible with AG Grid\n */\nexport function createColumnNameRenderer(\n params: ValueDiffParams,\n): (cellParams: ICellRendererParams<RowObjectType>) => React.ReactNode {\n return (cellParams) => {\n const row = cellParams.data;\n const field = cellParams.colDef?.field ?? \"\";\n if (!row) return null;\n return (\n <ValueDiffColumnNameCell column={String(row[field])} params={params} />\n );\n };\n}\n\n/**\n * cellRenderer function for the matched percentage column\n *\n * @param params - ICellRendererParams from AG Grid\n * @returns React node displaying formatted percentage\n */\nexport function renderMatchedPercentCell(\n params: ICellRendererParams<RowObjectType>,\n): React.ReactNode {\n const row = params.data;\n const field = params.colDef?.field ?? \"\";\n if (!row) return null;\n return <MatchedPercentCell value={row[field] as number} />;\n}\n","/**\n * @file toValueDataGrid.ts\n * @description Grid generator for Value Diff summary view\n *\n * Generates columns and rows for displaying column-level match statistics\n * from a value_diff run. This shows a summary table where each row\n * represents a column's match count and percentage.\n *\n * NOTE: This is different from toValueDiffGrid which handles row-level diffs.\n * This generator is for the summary view showing column match statistics.\n *\n * This file is intentionally .ts (not .tsx) - all JSX rendering is delegated\n * to valueDiffCells.tsx via render functions.\n */\n\nimport type { CellClassParams, ColDef, ColGroupDef } from \"ag-grid-community\";\nimport {\n createColumnNameRenderer,\n createPrimaryKeyIndicatorRenderer,\n renderMatchedPercentCell,\n} from \"@/components/ui/dataGrid/valueDiffCells\";\nimport { DataFrame, RowObjectType } from \"@/lib/api/types\";\nimport { ValueDiffParams, ValueDiffResult } from \"@/lib/api/valuediff\";\nimport { dataFrameToRowObjects } from \"@/utils/transforms\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for generating the value data grid\n */\nexport interface ValueDataGridOptions {\n /** Parameters from the value_diff run */\n params: ValueDiffParams;\n}\n\n/**\n * Result structure for the value data grid\n */\nexport interface ValueDataGridResult {\n columns: (ColDef<RowObjectType> | ColGroupDef<RowObjectType>)[];\n rows: RowObjectType[];\n}\n\n// ============================================================================\n// Column Schema Definition\n// ============================================================================\n\n/**\n * Schema definition for the value diff summary DataFrame\n *\n * This defines the expected structure of the data from the backend.\n * Using explicit schema avoids the \"basicColumns\" type fix pattern.\n */\nconst VALUE_DIFF_SUMMARY_SCHEMA: DataFrame[\"columns\"] = [\n { key: \"0\", name: \"Column\", type: \"text\" },\n { key: \"1\", name: \"Matched\", type: \"number\" },\n { key: \"2\", name: \"Matched %\", type: \"number\" },\n];\n\n// ============================================================================\n// Cell Class Functions\n// ============================================================================\n\n/**\n * Cell class function for matched columns\n * Applies \"diff-cell-modified\" class when match percentage is less than 100%\n */\nfunction getMatchedCellClass(\n params: CellClassParams<RowObjectType>,\n): string | undefined {\n const row = params.data;\n if (!row) return undefined;\n const value = row[\"2\"] as unknown as number | undefined;\n return value != null && value < 1 ? \"diff-cell-modified\" : undefined;\n}\n\n// ============================================================================\n// Column Definitions\n// ============================================================================\n\n/**\n * Column keys used in the value diff summary grid\n */\nconst COLUMN_KEYS = {\n PRIMARY_KEY_INDICATOR: \"__is_pk__\",\n COLUMN_NAME: \"0\",\n MATCHED_COUNT: \"1\",\n MATCHED_PERCENT: \"2\",\n} as const;\n\n/**\n * Creates column definitions for the value diff summary grid\n *\n * @param primaryKeys - Array of primary key column names\n * @param params - ValueDiffParams from the run\n * @returns Array of column definitions\n */\nfunction createColumnDefinitions(\n primaryKeys: string[],\n params: ValueDiffParams,\n): ColDef<RowObjectType>[] {\n return [\n // Primary key indicator column\n {\n field: COLUMN_KEYS.PRIMARY_KEY_INDICATOR,\n headerName: \"\",\n width: 30,\n maxWidth: 30,\n cellRenderer: createPrimaryKeyIndicatorRenderer(primaryKeys),\n },\n // Column name column with context menu\n {\n field: COLUMN_KEYS.COLUMN_NAME,\n headerName: \"Column\",\n resizable: true,\n cellRenderer: createColumnNameRenderer(params),\n cellClass: \"cell-show-context-menu\",\n },\n // Matched count column\n {\n field: COLUMN_KEYS.MATCHED_COUNT,\n headerName: \"Matched\",\n resizable: true,\n cellClass: getMatchedCellClass,\n },\n // Matched percentage column\n {\n field: COLUMN_KEYS.MATCHED_PERCENT,\n headerName: \"Matched %\",\n resizable: true,\n cellRenderer: renderMatchedPercentCell,\n cellClass: getMatchedCellClass,\n },\n ];\n}\n\n// ============================================================================\n// Main Generator Function\n// ============================================================================\n\n/**\n * Generates grid configuration for value diff summary view\n *\n * @description Creates columns and rows for displaying column-level match\n * statistics. Each row represents a column from the compared data with\n * its match count and percentage.\n *\n * @param result - The value diff result containing summary data\n * @param options - Configuration options including params\n * @returns Grid columns and rows ready for ScreenshotDataGrid\n *\n * @example\n * const { columns, rows } = toValueDataGrid(result, {\n * params: run.params,\n * });\n */\nexport function toValueDataGrid(\n result: ValueDiffResult,\n options: ValueDataGridOptions,\n): ValueDataGridResult {\n const { params } = options;\n\n // Extract primary keys as array\n const primaryKeys = Array.isArray(params.primary_key)\n ? params.primary_key\n : [params.primary_key];\n\n // Apply schema to DataFrame for proper type handling\n // This ensures dataFrameToRowObjects has type information available\n const dataFrameWithSchema: DataFrame = {\n ...result.data,\n columns: VALUE_DIFF_SUMMARY_SCHEMA,\n };\n\n // Build columns using render functions from valueDiffCells\n const columns = createColumnDefinitions(primaryKeys, params);\n\n // Convert DataFrame to row objects\n const rows = dataFrameToRowObjects(dataFrameWithSchema);\n\n return { columns, rows };\n}\n","/**\n * @file toValueDiffGrid.ts\n * @description Value diff grid generation for joined data (with in_a/in_b columns)\n *\n * REFACTORED: Uses shared utilities from @/lib/dataGrid/shared\n *\n * NOTE: Backend guarantees:\n * - in_a/in_b columns are always lowercase\n * - primary_keys match actual column casing\n * Therefore, exact string matching is used everywhere.\n */\n\nimport \"src/components/query/styles.css\";\nimport { DataFrame, RowObjectType } from \"@/lib/api/types\";\nimport { QueryDataDiffGridOptions } from \"@/lib/dataGrid/generators/toDataDiffGrid\";\nimport {\n buildDiffColumnDefinitions,\n buildDiffRows,\n buildJoinedColumnMap,\n getDisplayColumns,\n getPrimaryKeyValue,\n validatePrimaryKeys,\n validateToValueDiffGridInputs,\n} from \"@/lib/dataGrid/shared\";\nimport { dataFrameToRowObjects } from \"@/utils/transforms\";\n\n// ============================================================================\n// Main Grid Generation Function\n// ============================================================================\n\nexport function toValueDiffGrid(\n df: DataFrame,\n primaryKeys: string[],\n options?: QueryDataDiffGridOptions,\n) {\n validateToValueDiffGridInputs(df, primaryKeys);\n const pinnedColumns = options?.pinnedColumns ?? [];\n const changedOnly = options?.changedOnly ?? false;\n const displayMode = options?.displayMode ?? \"inline\";\n const columnsRenderMode = options?.columnsRenderMode ?? {};\n const transformedData = dataFrameToRowObjects(df);\n\n // Build column map (expects lowercase in_a/in_b from backend)\n const columnMap = buildJoinedColumnMap(df);\n\n // Build row maps based on in_a/in_b columns\n const baseMap: Record<string, RowObjectType | undefined> = {};\n const currentMap: Record<string, RowObjectType | undefined> = {};\n\n // Validate primary keys exist (exact matching - backend provides correct casing)\n const primaryKeyKeys = validatePrimaryKeys(df.columns, primaryKeys);\n\n // in_a/in_b are guaranteed lowercase from backend\n const inBaseKey = columnMap.in_a.key;\n const inCurrentKey = columnMap.in_b.key;\n\n transformedData.forEach((row) => {\n // Generate primary key value (exact matching)\n const key = getPrimaryKeyValue(df.columns, primaryKeyKeys, row);\n\n // Access in_a/in_b directly (guaranteed lowercase from backend)\n if (row[inBaseKey]) {\n // Store with lowercase key for internal indexing\n baseMap[key.toLowerCase()] = row;\n }\n\n if (row[inCurrentKey]) {\n currentMap[key.toLowerCase()] = row;\n }\n });\n\n const { rows, rowStats } = buildDiffRows({\n baseMap,\n currentMap,\n baseColumns: df.columns,\n currentColumns: df.columns,\n columnMap,\n primaryKeys,\n changedOnly,\n });\n\n // Get column configurations for display\n const columnConfigs = getDisplayColumns({\n columnMap,\n primaryKeys,\n pinnedColumns,\n columnsRenderMode,\n changedOnly,\n rowStats,\n excludeColumns: [\"in_a\", \"in_b\"], // Only lowercase needed\n strictMode: true,\n });\n\n // Build column definitions with JSX\n const { columns } = buildDiffColumnDefinitions({\n columns: columnConfigs,\n displayMode,\n allowIndexFallback: false,\n baseTitle: options?.baseTitle,\n currentTitle: options?.currentTitle,\n headerProps: {\n primaryKeys,\n pinnedColumns,\n onPinnedColumnsChange: options?.onPinnedColumnsChange,\n onColumnsRenderModeChanged: options?.onColumnsRenderModeChanged,\n },\n });\n\n return {\n columns,\n rows,\n };\n}\n","/**\n * @file dataGridFactory.ts\n * @description Abstract factory for creating data grid configurations\n *\n * This file provides a unified interface for generating grid data\n * for different run types (query, query_diff, value_diff, value_diff_detail, profile, profile_diff)\n *\n * It wraps the existing implementations:\n * - toDataGrid for single DataFrame display\n * - toDataDiffGrid for comparing two DataFrames\n * - toValueDiffGrid for joined diff data (with in_a/in_b columns)\n * - toValueDataGrid for value_diff summary (column match statistics)\n */\n\nimport type { ColDef, ColGroupDef } from \"ag-grid-community\";\nimport { QueryDiffResult } from \"@/lib/api/adhocQuery\";\nimport { NodeData } from \"@/lib/api/info\";\nimport { ProfileDiffResult } from \"@/lib/api/profile\";\nimport { RowCountDiffResult, RowCountResult } from \"@/lib/api/rowcount\";\nimport {\n ColumnRenderMode,\n ColumnType,\n DataFrame,\n isProfileDiffRun,\n isProfileRun,\n isQueryBaseRun,\n isQueryDiffRun,\n isQueryRun,\n isRowCountDiffRun,\n isRowCountRun,\n isValueDiffDetailRun,\n isValueDiffRun,\n RowObjectType,\n Run,\n} from \"@/lib/api/types\";\nimport { ValueDiffParams, ValueDiffResult } from \"@/lib/api/valuediff\";\n// Import existing implementations\nimport { toDataDiffGrid } from \"@/lib/dataGrid/generators/toDataDiffGrid\";\nimport { toDataGrid } from \"@/lib/dataGrid/generators/toDataGrid\";\nimport { toRowCountDataGrid } from \"@/lib/dataGrid/generators/toRowCountDataGrid\";\nimport { toRowCountDiffDataGrid } from \"@/lib/dataGrid/generators/toRowCountDiffDataGrid\";\nimport {\n mergeColumns,\n type SchemaDataGridOptions,\n type SchemaDataGridResult,\n type SingleEnvSchemaDataGridResult,\n toSchemaDataGrid,\n toSingleEnvDataGrid,\n} from \"@/lib/dataGrid/generators/toSchemaDataGrid\";\nimport { toValueDataGrid } from \"@/lib/dataGrid/generators/toValueDataGrid\";\nimport { toValueDiffGrid } from \"@/lib/dataGrid/generators/toValueDiffGrid\";\n\n// ============================================================================\n// Types & Interfaces\n// ============================================================================\n\n/**\n * Common options shared across all grid types\n */\nexport interface BaseGridOptions {\n primaryKeys?: string[];\n pinnedColumns?: string[];\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n onPrimaryKeyChange?: (primaryKeys: string[]) => void;\n onPinnedColumnsChange?: (pinnedColumns: string[]) => void;\n onColumnsRenderModeChanged?: (cols: Record<string, ColumnRenderMode>) => void;\n}\n\n/**\n * Additional options for diff grids\n */\nexport interface DiffGridOptions extends BaseGridOptions {\n changedOnly?: boolean;\n displayMode?: \"inline\" | \"side_by_side\";\n baseTitle?: string;\n currentTitle?: string;\n}\n\n/**\n * Standard output structure for all grid generation functions\n */\nexport interface DataGridResult {\n columns: ((ColDef<RowObjectType> | ColGroupDef<RowObjectType>) & {\n columnType?: ColumnType;\n columnRenderMode?: ColumnRenderMode;\n })[];\n rows: RowObjectType[];\n invalidPKeyBase?: boolean;\n invalidPKeyCurrent?: boolean;\n}\n\n/**\n * Discriminated union for run result data\n */\ntype RunResultData =\n | { kind: \"query\"; result: DataFrame }\n | { kind: \"query_diff_separate\"; result: QueryDiffResult }\n | {\n kind: \"query_diff_joined\";\n result: QueryDiffResult;\n primaryKeys: string[];\n }\n | { kind: \"value_diff\"; result: ValueDiffResult; params: ValueDiffParams }\n | { kind: \"value_diff_detail\"; result: DataFrame; primaryKeys: string[] }\n | { kind: \"profile\"; result: ProfileDiffResult }\n | { kind: \"profile_diff\"; result: ProfileDiffResult }\n // NEW: Add row count types\n | { kind: \"row_count\"; result: RowCountResult }\n | { kind: \"row_count_diff\"; result: RowCountDiffResult };\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Determines the appropriate grid generation strategy based on run type and data\n */\nfunction determineDataKind(run: Run): RunResultData | null {\n if (isQueryRun(run) || isQueryBaseRun(run)) {\n if (!run.result) return null;\n return { kind: \"query\", result: run.result };\n }\n\n if (isQueryDiffRun(run)) {\n if (!run.result) return null;\n // If the result has a `diff` field, it's pre-joined data\n if (run.result.diff && run.params?.primary_keys) {\n return {\n kind: \"query_diff_joined\",\n result: run.result,\n primaryKeys: run.params.primary_keys,\n };\n }\n // Otherwise, it's separate base/current DataFrames\n return { kind: \"query_diff_separate\", result: run.result };\n }\n\n if (isValueDiffRun(run)) {\n if (!run.result || !run.params) return null;\n return {\n kind: \"value_diff\",\n result: run.result,\n params: run.params,\n };\n }\n\n if (isValueDiffDetailRun(run)) {\n if (!run.result || !run.params?.primary_key) return null;\n const primaryKey = run.params.primary_key;\n const primaryKeys = Array.isArray(primaryKey) ? primaryKey : [primaryKey];\n return {\n kind: \"value_diff_detail\",\n result: run.result,\n primaryKeys,\n };\n }\n\n if (isProfileRun(run)) {\n if (!run.result?.current) return null;\n return { kind: \"profile\", result: run.result };\n }\n\n if (isProfileDiffRun(run)) {\n if (!run.result) return null;\n return { kind: \"profile_diff\", result: run.result };\n }\n\n if (isRowCountRun(run)) {\n if (!run.result) return null;\n return { kind: \"row_count\", result: run.result };\n }\n\n if (isRowCountDiffRun(run)) {\n if (!run.result) return null;\n return { kind: \"row_count_diff\", result: run.result };\n }\n\n return null;\n}\n\n/**\n * Extracts the primary key field name from profile data\n */\nfunction getProfilePrimaryKey(result: ProfileDiffResult): string {\n const field = result.current?.columns.find(\n (f) => f.name.toLowerCase() === \"column_name\",\n );\n return field?.name ?? \"column_name\";\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Creates grid data from a Run object and options\n *\n * This is the main entry point that abstracts away the different\n * data transformations needed for different run types.\n *\n * @param run - The Run object containing result data\n * @param options - Grid configuration options\n * @returns DataGridResult with columns and rows, or null if invalid\n *\n * @example\n * ```tsx\n * const gridData = createDataGrid(run, {\n * primaryKeys: ['id'],\n * pinnedColumns: ['name'],\n * changedOnly: true,\n * displayMode: 'inline',\n * });\n *\n * if (gridData) {\n * return <ScreenshotDataGrid columns={gridData.columns} rows={gridData.rows} />;\n * }\n * ```\n */\nexport function createDataGrid(\n run: Run,\n options: DiffGridOptions = {},\n): DataGridResult | null {\n const dataKind = determineDataKind(run);\n if (!dataKind) return null;\n\n switch (dataKind.kind) {\n case \"query\":\n return toDataGrid(dataKind.result, {\n primaryKeys: options.primaryKeys,\n pinnedColumns: options.pinnedColumns,\n columnsRenderMode: options.columnsRenderMode,\n onPrimaryKeyChange: options.onPrimaryKeyChange,\n onPinnedColumnsChange: options.onPinnedColumnsChange,\n onColumnsRenderModeChanged: options.onColumnsRenderModeChanged,\n });\n\n case \"query_diff_separate\":\n return toDataDiffGrid(\n dataKind.result.base,\n dataKind.result.current,\n options,\n );\n\n case \"query_diff_joined\":\n if (!dataKind.result.diff) {\n return null;\n }\n return toValueDiffGrid(dataKind.result.diff, dataKind.primaryKeys, {\n changedOnly: options.changedOnly,\n pinnedColumns: options.pinnedColumns,\n onPinnedColumnsChange: options.onPinnedColumnsChange,\n baseTitle: options.baseTitle,\n currentTitle: options.currentTitle,\n displayMode: options.displayMode,\n columnsRenderMode: options.columnsRenderMode,\n onColumnsRenderModeChanged: options.onColumnsRenderModeChanged,\n });\n\n case \"value_diff\":\n return toValueDataGrid(dataKind.result, { params: dataKind.params });\n\n case \"value_diff_detail\":\n return toValueDiffGrid(dataKind.result, dataKind.primaryKeys, {\n changedOnly: options.changedOnly,\n pinnedColumns: options.pinnedColumns,\n onPinnedColumnsChange: options.onPinnedColumnsChange,\n displayMode: options.displayMode,\n columnsRenderMode: options.columnsRenderMode,\n onColumnsRenderModeChanged: options.onColumnsRenderModeChanged,\n });\n\n case \"profile\": {\n if (!dataKind.result.current) {\n return null;\n }\n const primaryKey = getProfilePrimaryKey(dataKind.result);\n return toDataGrid(dataKind.result.current, {\n primaryKeys: [primaryKey],\n pinnedColumns: options.pinnedColumns,\n onPinnedColumnsChange: options.onPinnedColumnsChange,\n columnsRenderMode: options.columnsRenderMode,\n onColumnsRenderModeChanged: options.onColumnsRenderModeChanged,\n });\n }\n\n case \"profile_diff\": {\n const primaryKey = getProfilePrimaryKey(dataKind.result);\n return toDataDiffGrid(dataKind.result.base, dataKind.result.current, {\n primaryKeys: [primaryKey],\n pinnedColumns: options.pinnedColumns,\n onPinnedColumnsChange: options.onPinnedColumnsChange,\n displayMode: options.displayMode,\n columnsRenderMode: options.columnsRenderMode,\n onColumnsRenderModeChanged: options.onColumnsRenderModeChanged,\n });\n }\n\n case \"row_count\":\n return toRowCountDataGrid(dataKind.result);\n\n case \"row_count_diff\":\n return toRowCountDiffDataGrid(dataKind.result);\n\n default:\n return null;\n }\n}\n\n/**\n * Input types for the data-only factory function\n */\nexport type DataGridInput =\n | { type: \"single\"; dataframe: DataFrame }\n | { type: \"dual\"; base?: DataFrame; current?: DataFrame }\n | { type: \"joined\"; dataframe: DataFrame; primaryKeys: string[] }\n | {\n type: \"schema_diff\";\n base?: NodeData[\"columns\"];\n current?: NodeData[\"columns\"];\n }\n | { type: \"schema_single\"; columns?: NodeData[\"columns\"] };\n\n/**\n * Union of all possible grid results from createDataGridFromData\n */\nexport type DataGridFromDataResult =\n | DataGridResult\n | SchemaDataGridResult\n | SingleEnvSchemaDataGridResult;\n\n/**\n * Alternative factory that accepts raw data instead of Run objects\n * Useful for testing or when you have data outside the Run structure\n *\n * @overload For DataFrame inputs, returns DataGridResult\n * @overload For schema inputs, returns schema-specific result types\n */\nexport function createDataGridFromData(\n input:\n | { type: \"joined\"; dataframe: DataFrame; primaryKeys: string[] }\n | { type: \"dual\"; base?: DataFrame; current?: DataFrame }\n | { type: \"single\"; dataframe: DataFrame },\n options?: DiffGridOptions,\n): DataGridResult;\nexport function createDataGridFromData(\n input: {\n type: \"schema_diff\";\n base?: NodeData[\"columns\"];\n current?: NodeData[\"columns\"];\n },\n options?: SchemaDataGridOptions,\n): SchemaDataGridResult;\nexport function createDataGridFromData(\n input: { type: \"schema_single\"; columns?: NodeData[\"columns\"] },\n options?: SchemaDataGridOptions,\n): SingleEnvSchemaDataGridResult;\nexport function createDataGridFromData(\n input: DataGridInput,\n options?: DiffGridOptions | SchemaDataGridOptions,\n): DataGridFromDataResult {\n switch (input.type) {\n case \"single\":\n return toDataGrid(input.dataframe, (options ?? {}) as DiffGridOptions);\n\n case \"dual\":\n return toDataDiffGrid(\n input.base,\n input.current,\n (options ?? {}) as DiffGridOptions,\n );\n\n case \"joined\":\n return toValueDiffGrid(\n input.dataframe,\n input.primaryKeys,\n (options ?? {}) as DiffGridOptions,\n );\n\n case \"schema_diff\": {\n const schemaDiff = mergeColumns(input.base, input.current);\n return toSchemaDataGrid(\n schemaDiff,\n (options ?? {}) as SchemaDataGridOptions,\n );\n }\n\n case \"schema_single\":\n return toSingleEnvDataGrid(\n input.columns,\n (options ?? {}) as SchemaDataGridOptions,\n );\n }\n}\n\n// Re-export the underlying functions for backward compatibility\nexport { toDataGrid, toDataDiffGrid, toValueDiffGrid };\nexport { mergeColumns, toSchemaDataGrid, toSingleEnvDataGrid };\n","/**\n * @file agGridTheme.ts\n * @description AG Grid theme configuration for Recce data grids\n *\n * Provides light and dark themes that match the existing react-data-grid styling\n * using AG Grid's themeQuartz as a base.\n */\n\nimport { themeQuartz } from \"ag-grid-community\";\n\n// System font stack for headers\nconst systemFontStack =\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\n\n// Light theme matching current rdg-light styling\nexport const recceGridThemeLight = themeQuartz.withParams({\n backgroundColor: \"#ffffff\",\n headerBackgroundColor: \"#f5f5f5\",\n rowHoverColor: \"#ffffff\",\n borderColor: \"#e0e0e0\",\n foregroundColor: \"#1e1e1e\",\n fontFamily: \"monospace\",\n fontSize: 13,\n headerFontFamily: systemFontStack,\n headerFontSize: 13,\n headerFontWeight: 700,\n cellHorizontalPadding: 8,\n});\n\n// Dark theme matching current rdg-dark styling\nexport const recceGridThemeDark = themeQuartz.withParams({\n backgroundColor: \"#1e1e1e\",\n headerBackgroundColor: \"#252526\",\n rowHoverColor: \"#1e1e1e\",\n borderColor: \"#3c3c3c\",\n foregroundColor: \"#e0e0e0\",\n fontFamily: \"monospace\",\n fontSize: 13,\n headerFontFamily: systemFontStack,\n headerFontSize: 13,\n headerFontWeight: 700,\n cellHorizontalPadding: 8,\n});\n","/**\n * @file ScreenshotDataGrid.tsx\n * @description AG Grid wrapper component for Recce data grids\n *\n * This component wraps the AG Grid and provides a consistent interface\n * for all data grid views in the application. It handles:\n * - Theme switching (light/dark)\n * - PII tracking safety classes\n * - Default grid configurations\n * - Backward compatibility with existing column/row data formats\n */\n\n\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport type {\n ColDef,\n ColGroupDef,\n GetRowIdParams,\n GridReadyEvent,\n} from \"ag-grid-community\";\nimport { AllCommunityModule, ModuleRegistry } from \"ag-grid-community\";\nimport { AgGridReact, type AgGridReactProps } from \"ag-grid-react\";\nimport \"./agGridStyles.css\";\nimport Typography from \"@mui/material/Typography\";\nimport React, {\n type CSSProperties,\n forwardRef,\n type Ref,\n useImperativeHandle,\n useMemo,\n useRef,\n} from \"react\";\nimport { RowObjectType } from \"@/lib/api/types\";\nimport { recceGridThemeLight } from \"./agGridTheme\";\n\n// Register AG Grid modules once\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/**\n * Handle type for accessing AG Grid API and DOM element (for screenshots)\n */\nexport interface DataGridHandle {\n api: GridReadyEvent[\"api\"] | null;\n /** DOM element for screenshot functionality */\n element: HTMLElement | null;\n}\n\n/**\n * Props for ScreenshotDataGrid component\n *\n * Supports both new AG Grid style props (columnDefs/rowData) and\n * legacy react-data-grid style props (columns/rows) for backward compatibility\n */\nexport interface ScreenshotDataGridProps<TData = RowObjectType>\n extends Omit<AgGridReactProps<TData>, \"theme\" | \"rowClass\"> {\n /** Container style */\n style?: CSSProperties;\n /** Additional CSS class for container */\n className?: string;\n /** Empty state renderer (legacy) */\n renderers?: {\n noRowsFallback?: React.ReactNode;\n };\n /** Legacy: Column definitions (maps to columnDefs) */\n columns?: (ColDef<TData> | ColGroupDef<TData>)[];\n /** Legacy: Row data (maps to rowData) */\n rows?: TData[];\n /** Legacy: Default column options (maps to defaultColDef) */\n defaultColumnOptions?: ColDef<TData>;\n}\n\n/**\n * Empty rows renderer component\n */\ninterface EmptyRowsRendererProps {\n emptyMessage?: string;\n}\n\nexport function EmptyRowsRenderer({ emptyMessage }: EmptyRowsRendererProps) {\n return (\n <Box\n sx={{\n display: \"flex\",\n height: \"35px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n bgcolor: \"grey.100\",\n textAlign: \"center\",\n gridColumn: \"1/-1\",\n }}\n >\n <Typography sx={{ fontWeight: 600 }}>\n {emptyMessage ?? \"No rows\"}\n </Typography>\n </Box>\n );\n}\n\n/**\n * AG Grid wrapper component for Recce (Screenshot-capable)\n *\n * @description Provides a themed AG Grid with default configurations:\n * - Automatic light/dark theme switching\n * - Row hover highlighting disabled by default\n * - Cell focus suppressed for cleaner UX\n * - PII-safe tracking class applied to all rows\n *\n * Backward compatible with react-data-grid API:\n * - `columns` prop maps to `columnDefs`\n * - `rows` prop maps to `rowData`\n * - `defaultColumnOptions` maps to `defaultColDef`\n * - `renderers.noRowsFallback` maps to `noRowsOverlayComponent`\n *\n * @example\n * ```tsx\n * // New AG Grid style\n * <ScreenshotDataGrid\n * columnDefs={columns}\n * rowData={rows}\n * style={{ height: '400px' }}\n * />\n *\n * // Legacy react-data-grid style\n * <ScreenshotDataGrid\n * columns={columns}\n * rows={rows}\n * renderers={{ noRowsFallback: <EmptyRowsRenderer /> }}\n * />\n * ```\n */\nfunction _ScreenshotDataGrid<TData = RowObjectType>(\n {\n style,\n className,\n columnDefs,\n rowData,\n columns,\n rows,\n getRowId,\n rowHeight = 32,\n headerHeight = 36,\n defaultColDef,\n defaultColumnOptions,\n renderers,\n ...props\n }: ScreenshotDataGridProps<TData>,\n ref: Ref<DataGridHandle>,\n) {\n // Container ref for screenshot functionality\n const containerRef = useRef<HTMLDivElement>(null);\n // AG Grid API ref\n const gridApiRef = useRef<GridReadyEvent[\"api\"] | null>(null);\n\n // Expose both API and DOM element through ref\n useImperativeHandle(\n ref,\n () => ({\n api: gridApiRef.current,\n element: containerRef.current,\n }),\n [],\n );\n\n // Use light theme (dark mode can be added later with useColorScheme)\n const theme = useMemo(() => recceGridThemeLight, []);\n\n // Support both new and legacy props\n const resolvedColumnDefs = columnDefs ?? columns;\n const resolvedRowData = rowData ?? rows;\n const resolvedDefaultColDef = defaultColDef ?? defaultColumnOptions;\n\n // Merge default column options\n const mergedDefaultColDef = useMemo<ColDef<TData>>(\n () => ({\n resizable: true,\n suppressMovable: true,\n ...resolvedDefaultColDef,\n }),\n [resolvedDefaultColDef],\n );\n\n // Custom overlay component when no rows\n const noRowsOverlayComponent = useMemo(() => {\n if (!renderers?.noRowsFallback) return undefined;\n return () => renderers.noRowsFallback;\n }, [renderers?.noRowsFallback]);\n\n // Generate row ID from __rowKey if available\n const resolvedGetRowId = useMemo(() => {\n if (getRowId) return getRowId;\n return (params: GetRowIdParams<TData>) => {\n const data = params.data as RowObjectType;\n if (data?.__rowKey !== undefined) {\n return String(data.__rowKey);\n }\n // Use rowIndex from the data or generate a random ID\n const index = (params.data as unknown as { rowIndex?: number })?.rowIndex;\n return String(index ?? Math.random());\n };\n }, [getRowId]);\n\n // Generate a key based on pinned columns to force AG Grid to remount when pinned columns change\n // This is necessary because AG Grid maintains internal column state that may not update\n // when columnDefs change\n const gridKey = useMemo(() => {\n if (!resolvedColumnDefs) return \"grid\";\n const pinnedFields = resolvedColumnDefs\n .filter(\n (col): col is ColDef<TData> => \"field\" in col && col.pinned === \"left\",\n )\n .map((col) => col.field)\n .sort()\n .join(\",\");\n return `grid-${pinnedFields}`;\n }, [resolvedColumnDefs]);\n\n return (\n <Box\n ref={containerRef}\n className={\n className ? `${className} no-track-pii-safe` : \"no-track-pii-safe\"\n }\n sx={{\n // Use flex: 1 and minHeight: 0 for proper sizing in flex containers\n // This allows AG Grid to fill available space and scroll internally\n flex: 1,\n minHeight: 0,\n width: \"100%\",\n overflow: \"hidden\",\n \"& .ag-root-wrapper\": {\n border: \"none\",\n height: \"100%\",\n },\n \"& .ag-header\": {\n borderBottom: \"1px solid var(--ag-border-color)\",\n },\n \"& .ag-row\": {\n borderBottom: \"1px solid var(--ag-border-color)\",\n },\n \"& .ag-cell\": {\n borderRight: \"1px solid var(--ag-border-color)\",\n },\n \"& .ag-header-cell\": {\n borderRight: \"1px solid var(--ag-border-color)\",\n },\n // Diff cell styling\n \"& .diff-cell-added\": {\n backgroundColor: \"#cefece !important\",\n color: \"black\",\n },\n \"& .diff-cell-removed\": {\n backgroundColor: \"#ffc5c5 !important\",\n color: \"black\",\n },\n \"& .diff-cell-modified\": {\n backgroundColor: \"#ffc5c5 !important\",\n color: \"black\",\n },\n // Diff header styling\n \"& .diff-header-added\": {\n backgroundColor: \"#15803d !important\",\n color: \"white\",\n },\n \"& .diff-header-removed\": {\n backgroundColor: \"#f43f5e !important\",\n color: \"white\",\n },\n // Index column styling\n \"& .index-column\": {\n color: \"rgb(128, 128, 128)\",\n textAlign: \"right\",\n },\n // Frozen/pinned column styling\n \"& .ag-pinned-left-cols-container .ag-cell\": {\n backgroundColor: \"#f5f5f5\",\n },\n }}\n >\n <AgGridReact<TData>\n key={gridKey}\n theme={theme}\n columnDefs={resolvedColumnDefs}\n rowData={resolvedRowData}\n getRowId={resolvedGetRowId}\n rowHeight={rowHeight}\n headerHeight={headerHeight}\n defaultColDef={mergedDefaultColDef}\n suppressCellFocus={true}\n suppressRowHoverHighlight={false}\n animateRows={false}\n rowClass=\"no-track-pii-safe\"\n noRowsOverlayComponent={noRowsOverlayComponent}\n onGridReady={(event) => {\n gridApiRef.current = event.api;\n }}\n {...props}\n />\n </Box>\n );\n}\n\nexport const ScreenshotDataGrid = forwardRef(_ScreenshotDataGrid) as <\n TData = RowObjectType,\n>(\n props: ScreenshotDataGridProps<TData> & { ref?: Ref<DataGridHandle> },\n) => React.ReactNode;\n\n// Re-export AG Grid types for convenience\nexport type { ColDef, ColGroupDef, GetRowIdParams, GridReadyEvent };\n\n// For backward compatibility, also export as DataGridHandle\nexport type { DataGridHandle as RecceDataGridHandle };\n","import Button from \"@mui/material/Button\";\nimport ButtonGroup from \"@mui/material/ButtonGroup\";\nimport { DiffText } from \"./DiffText\";\n\ninterface ToggleSwitchProps {\n value: boolean;\n onChange: (value: boolean) => void;\n textOn?: string;\n textOff?: string;\n}\nexport const ToggleSwitch = ({\n value,\n onChange,\n textOn,\n textOff,\n}: ToggleSwitchProps) => {\n return (\n <ButtonGroup variant=\"outlined\" size=\"xsmall\" sx={{ borderRadius: 1 }}>\n <Button\n onClick={() => {\n onChange(false);\n }}\n sx={{\n color: !value ? \"black\" : \"grey.400\",\n bgcolor: !value ? \"white\" : \"grey.50\",\n }}\n >\n {textOff ?? \"Off\"}\n </Button>\n <Button\n onClick={() => {\n onChange(true);\n }}\n sx={{\n color: value ? \"black\" : \"grey.400\",\n bgcolor: value ? \"white\" : \"grey.50\",\n }}\n >\n {textOn ?? \"On\"}\n </Button>\n </ButtonGroup>\n );\n};\n\ninterface DiffDislayModeSwitchProps {\n displayMode: \"inline\" | \"side_by_side\";\n onDisplayModeChanged: (displayMode: \"inline\" | \"side_by_side\") => void;\n}\n\nexport const DiffDisplayModeSwitch = ({\n displayMode,\n onDisplayModeChanged,\n}: DiffDislayModeSwitchProps) => {\n return (\n <>\n {displayMode === \"inline\" && (\n <>\n <DiffText\n value=\"Base\"\n colorPalette=\"red\"\n grayOut={false}\n fontSize=\"10pt\"\n noCopy\n />\n <DiffText\n value=\"Current\"\n colorPalette=\"green\"\n grayOut={false}\n fontSize=\"10pt\"\n noCopy\n />\n </>\n )}\n <ToggleSwitch\n value={displayMode === \"side_by_side\"}\n onChange={(value) => {\n onDisplayModeChanged(value ? \"side_by_side\" : \"inline\");\n }}\n textOff=\"Inline\"\n textOn=\"Side by side\"\n />\n </>\n );\n};\n","import Box from \"@mui/material/Box\";\nimport _ from \"lodash\";\nimport { ReactNode } from \"react\";\nimport { PiWarning } from \"react-icons/pi\";\nimport { RunResultViewProps } from \"./types\";\n\nexport interface DiffViewOptions {\n changed_only?: boolean;\n}\n\ninterface RunToolbarProps<VO> extends RunResultViewProps<VO> {\n warnings?: string[];\n children?: ReactNode;\n}\n\nexport const RunToolbar = ({\n warnings,\n children,\n}: RunToolbarProps<DiffViewOptions>) => {\n return (\n <Box\n sx={{\n display: \"flex\",\n borderBottom: \"1px solid lightgray\",\n justifyContent: \"flex-end\",\n gap: \"5px\",\n alignItems: \"center\",\n px: \"10px\",\n bgcolor: warnings && warnings.length > 0 ? \"amber.100\" : \"inherit\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: 0,\n }}\n >\n {warnings?.map((warning) => (\n <Box key={_.uniqueId(`-${warning}`)}>\n <PiWarning color=\"amber.600\" /> {warning}\n </Box>\n ))}\n </Box>\n <Box sx={{ flex: 1, minHeight: \"32px\" }} />\n {children}\n </Box>\n );\n};\n","import Box from \"@mui/material/Box\";\nimport { forwardRef, Ref, useMemo } from \"react\";\nimport { ProfileDiffViewOptions } from \"@/lib/api/profile\";\nimport {\n ColumnRenderMode,\n isProfileDiffRun,\n isProfileRun,\n} from \"@/lib/api/types\";\nimport { createDataGrid } from \"@/lib/dataGrid/dataGridFactory\";\nimport {\n type DataGridHandle,\n ScreenshotDataGrid,\n} from \"../data-grid/ScreenshotDataGrid\";\nimport { DiffDisplayModeSwitch } from \"../query/ToggleSwitch\";\nimport { RunToolbar } from \"../run/RunToolbar\";\nimport { RunResultViewProps } from \"../run/types\";\n\ntype ProfileDiffResultViewProp = RunResultViewProps<ProfileDiffViewOptions>;\n\nconst PrivateProfileDiffResultView = (\n { run, viewOptions, onViewOptionsChanged }: ProfileDiffResultViewProp,\n\n ref: Ref<DataGridHandle>,\n) => {\n if (!isProfileDiffRun(run)) {\n throw new Error(\"Only run type profile_diff is supported\");\n }\n const pinnedColumns = useMemo(\n () => viewOptions?.pinned_columns ?? [],\n [viewOptions],\n );\n const displayMode = useMemo(\n () => viewOptions?.display_mode ?? \"inline\",\n [viewOptions],\n );\n // Default proportion columns to percentage display\n const columnsRenderMode = useMemo(\n () => ({\n distinct_proportion: \"percent\" as ColumnRenderMode,\n not_null_proportion: \"percent\" as ColumnRenderMode,\n ...viewOptions?.columnsRenderMode,\n }),\n [viewOptions],\n );\n\n const gridData = useMemo(() => {\n const onColumnsRenderModeChanged = (\n cols: Record<string, ColumnRenderMode>,\n ) => {\n const newRenderModes = {\n ...(viewOptions?.columnsRenderMode ?? {}),\n ...cols,\n };\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n columnsRenderMode: newRenderModes,\n });\n }\n };\n\n const handlePinnedColumnsChanged = (pinnedColumns: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n pinned_columns: pinnedColumns,\n });\n }\n };\n\n return (\n createDataGrid(run, {\n pinnedColumns,\n onPinnedColumnsChange: handlePinnedColumnsChanged,\n displayMode,\n columnsRenderMode,\n onColumnsRenderModeChanged,\n }) ?? { columns: [], rows: [] }\n );\n }, [\n run,\n pinnedColumns,\n displayMode,\n viewOptions,\n onViewOptionsChanged,\n columnsRenderMode,\n ]);\n\n if (gridData.columns.length === 0) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n No data\n </Box>\n );\n }\n\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n bgcolor: \"rgb(249, 249, 249)\",\n height: \"100%\",\n }}\n >\n <RunToolbar run={run}>\n <DiffDisplayModeSwitch\n displayMode={displayMode}\n onDisplayModeChanged={(displayMode) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n display_mode: displayMode,\n });\n }\n }}\n />\n </RunToolbar>\n <ScreenshotDataGrid\n ref={ref}\n style={{ blockSize: \"auto\", maxHeight: \"100%\", overflow: \"auto\" }}\n columns={gridData.columns}\n rows={gridData.rows}\n defaultColumnOptions={{ resizable: true, maxWidth: 800, minWidth: 35 }}\n className=\"rdg-light\"\n />\n </Box>\n );\n};\n\nconst PrivateProfileResultView = (\n { run, viewOptions, onViewOptionsChanged }: ProfileDiffResultViewProp,\n\n ref: Ref<DataGridHandle>,\n) => {\n if (!isProfileRun(run)) {\n throw new Error(\"Only run type profile_diff is supported\");\n }\n const pinnedColumns = useMemo(\n () => viewOptions?.pinned_columns ?? [],\n [viewOptions],\n );\n // Default proportion columns to percentage display\n const columnsRenderMode = useMemo(\n () => ({\n distinct_proportion: \"percent\" as ColumnRenderMode,\n not_null_proportion: \"percent\" as ColumnRenderMode,\n ...viewOptions?.columnsRenderMode,\n }),\n [viewOptions],\n );\n\n const gridData = useMemo(() => {\n const onColumnsRenderModeChanged = (\n cols: Record<string, ColumnRenderMode>,\n ) => {\n const newRenderModes = {\n ...(viewOptions?.columnsRenderMode ?? {}),\n ...cols,\n };\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n columnsRenderMode: newRenderModes,\n });\n }\n };\n\n const handlePinnedColumnsChanged = (pinnedColumns: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n pinned_columns: pinnedColumns,\n });\n }\n };\n\n return (\n createDataGrid(run, {\n pinnedColumns,\n onPinnedColumnsChange: handlePinnedColumnsChanged,\n columnsRenderMode,\n onColumnsRenderModeChanged,\n }) ?? { columns: [], rows: [] }\n );\n }, [\n run,\n pinnedColumns,\n viewOptions,\n onViewOptionsChanged,\n columnsRenderMode,\n ]);\n\n if (gridData.columns.length === 0) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n No data\n </Box>\n );\n }\n\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n bgcolor: \"rgb(249, 249, 249)\",\n height: \"100%\",\n }}\n >\n <ScreenshotDataGrid\n ref={ref}\n style={{ blockSize: \"auto\", maxHeight: \"100%\", overflow: \"auto\" }}\n columns={gridData.columns}\n rows={gridData.rows}\n defaultColumnOptions={{ resizable: true, maxWidth: 800, minWidth: 35 }}\n className=\"rdg-light\"\n />\n </Box>\n );\n};\n\nexport const ProfileDiffResultView = forwardRef(PrivateProfileDiffResultView);\nexport const ProfileResultView = forwardRef(PrivateProfileResultView);\n","import Checkbox from \"@mui/material/Checkbox\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\n\ninterface ChangedOnlyCheckboxProps {\n changedOnly?: boolean;\n onChange: () => void;\n}\nexport const ChangedOnlyCheckbox = ({\n changedOnly,\n onChange,\n}: ChangedOnlyCheckboxProps) => {\n return (\n <FormControlLabel\n control={\n <Checkbox\n checked={changedOnly ?? false}\n onChange={() => {\n onChange();\n }}\n size=\"small\"\n />\n }\n label=\"Changed only\"\n slotProps={{\n typography: { variant: \"body2\" },\n }}\n />\n );\n};\n","import Box from \"@mui/material/Box\";\nimport { ForwardedRef, forwardRef, Ref, useMemo } from \"react\";\nimport {\n QueryDiffViewOptions,\n QueryPreviewChangeParams,\n} from \"@/lib/api/adhocQuery\";\n\nimport \"./styles.css\";\nimport { ColumnRenderMode, Run } from \"@/lib/api/types\";\nimport {\n createDataGrid,\n DiffGridOptions,\n} from \"@/lib/dataGrid/dataGridFactory\";\nimport {\n type DataGridHandle,\n EmptyRowsRenderer,\n ScreenshotDataGrid,\n} from \"../data-grid/ScreenshotDataGrid\";\nimport { RunToolbar } from \"../run/RunToolbar\";\nimport { RunResultViewProps } from \"../run/types\";\nimport { ChangedOnlyCheckbox } from \"./ChangedOnlyCheckbox\";\nimport { DiffDisplayModeSwitch } from \"./ToggleSwitch\";\n\nexport interface QueryDiffResultViewProps\n extends RunResultViewProps<QueryDiffViewOptions> {\n onAddToChecklist?: (run: Run) => void;\n baseTitle?: string;\n currentTitle?: string;\n}\n\nconst PrivateQueryDiffResultView = (\n {\n run,\n onAddToChecklist,\n viewOptions,\n onViewOptionsChanged,\n baseTitle,\n currentTitle,\n }: QueryDiffResultViewProps,\n\n ref: Ref<DataGridHandle>,\n) => {\n const primaryKeys = useMemo(\n () => viewOptions?.primary_keys ?? [],\n [viewOptions],\n );\n const changedOnly = useMemo(\n () => viewOptions?.changed_only ?? false,\n [viewOptions],\n );\n const pinnedColumns = useMemo(\n () => viewOptions?.pinned_columns ?? [],\n [viewOptions],\n );\n const displayMode = useMemo(\n () => viewOptions?.display_mode ?? \"inline\",\n [viewOptions],\n );\n const columnsRenderMode = useMemo(\n () => viewOptions?.columnsRenderMode ?? {},\n [viewOptions],\n );\n if (run.type !== \"query_diff\") {\n throw new Error(\"QueryDiffResult view should be rendered as query_diff\");\n }\n\n const gridData = useMemo(() => {\n const onColumnsRenderModeChanged = (\n cols: Record<string, ColumnRenderMode>,\n ) => {\n const newRenderModes = {\n ...(viewOptions?.columnsRenderMode ?? {}),\n ...cols,\n };\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n columnsRenderMode: newRenderModes,\n });\n }\n };\n\n const handlePrimaryKeyChanged = (primaryKeys: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n primary_keys: primaryKeys,\n });\n }\n };\n\n const handlePinnedColumnsChanged = (pinnedColumns: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n pinned_columns: pinnedColumns,\n });\n }\n };\n const options: DiffGridOptions = {\n changedOnly,\n onPrimaryKeyChange: handlePrimaryKeyChanged,\n pinnedColumns,\n onPinnedColumnsChange: handlePinnedColumnsChanged,\n columnsRenderMode,\n onColumnsRenderModeChanged,\n baseTitle,\n currentTitle,\n displayMode,\n };\n\n return createDataGrid(run, options) ?? { columns: [], rows: [] };\n }, [\n run,\n viewOptions,\n changedOnly,\n pinnedColumns,\n displayMode,\n onViewOptionsChanged,\n baseTitle,\n currentTitle,\n columnsRenderMode,\n ]);\n\n const warningPKey = useMemo(() => {\n const pkName = primaryKeys.join(\", \");\n\n if (gridData.invalidPKeyBase && gridData.invalidPKeyCurrent) {\n return `Warning: The primary key '${pkName}' is not unique in the base and current environments`;\n } else if (gridData.invalidPKeyBase) {\n return `Warning: The primary key '${pkName}' is not unique in the base environment`;\n } else if (gridData.invalidPKeyCurrent) {\n return `Warning: The primary key '${pkName}' is not unique in the current environment`;\n }\n }, [gridData.invalidPKeyBase, gridData.invalidPKeyCurrent, primaryKeys]);\n\n const limit = run.result?.current?.limit ?? 0;\n const warningLimit =\n limit > 0 && (run.result?.current?.more || run.result?.base?.more)\n ? `Warning: Displayed results are limited to ${limit.toLocaleString()} records. To ensure complete data retrieval, consider applying a LIMIT or WHERE clause to constrain the result set.`\n : null;\n\n const warnings: string[] = [];\n if (warningPKey) {\n warnings.push(warningPKey);\n }\n if (warningLimit) {\n warnings.push(warningLimit);\n }\n\n if (gridData.columns.length === 0) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n No data\n </Box>\n );\n }\n\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n bgcolor: \"rgb(249, 249, 249)\",\n height: \"100%\",\n }}\n >\n <RunToolbar\n run={run}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n warnings={warnings}\n >\n <DiffDisplayModeSwitch\n displayMode={displayMode}\n onDisplayModeChanged={(displayMode) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n display_mode: displayMode,\n });\n }\n }}\n />\n\n <ChangedOnlyCheckbox\n changedOnly={viewOptions?.changed_only}\n onChange={() => {\n const changedOnly = !viewOptions?.changed_only;\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n changed_only: changedOnly,\n });\n }\n }}\n />\n </RunToolbar>\n <ScreenshotDataGrid\n ref={ref}\n style={{ blockSize: \"auto\", maxHeight: \"100%\", overflow: \"auto\" }}\n columns={gridData.columns}\n rows={gridData.rows}\n renderers={{\n noRowsFallback: (\n <EmptyRowsRenderer emptyMessage=\"No mismatched rows\" />\n ),\n }}\n defaultColumnOptions={{\n resizable: true,\n maxWidth: 800,\n minWidth: 35,\n }}\n className=\"rdg-light\"\n />\n </Box>\n );\n};\n\nconst PrivateQueryDiffJoinResultView = (\n {\n run,\n viewOptions,\n onViewOptionsChanged,\n baseTitle,\n currentTitle,\n }: QueryDiffResultViewProps,\n ref: Ref<DataGridHandle>,\n) => {\n if (run.type !== \"query_diff\") {\n throw new Error(\"QueryDiffResult view should be rendered as query_diff\");\n }\n const changedOnly = useMemo(\n () => viewOptions?.changed_only ?? false,\n [viewOptions],\n );\n const pinnedColumns = useMemo(\n () => viewOptions?.pinned_columns ?? [],\n [viewOptions],\n );\n const displayMode = useMemo(\n () => viewOptions?.display_mode ?? \"inline\",\n [viewOptions],\n );\n const columnsRenderMode = useMemo(\n () => viewOptions?.columnsRenderMode ?? {},\n [viewOptions],\n );\n\n const gridData = useMemo(() => {\n const onColumnsRenderModeChanged = (\n cols: Record<string, ColumnRenderMode>,\n ) => {\n const newRenderModes = {\n ...(viewOptions?.columnsRenderMode ?? {}),\n ...cols,\n };\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n columnsRenderMode: newRenderModes,\n });\n }\n };\n\n const handlePinnedColumnsChanged = (pinnedColumns: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n pinned_columns: pinnedColumns,\n });\n }\n };\n\n return (\n createDataGrid(run, {\n changedOnly,\n pinnedColumns,\n onPinnedColumnsChange: handlePinnedColumnsChanged,\n baseTitle,\n currentTitle,\n displayMode,\n columnsRenderMode,\n onColumnsRenderModeChanged,\n }) ?? { columns: [], rows: [] }\n );\n }, [\n run,\n viewOptions,\n changedOnly,\n pinnedColumns,\n displayMode,\n onViewOptionsChanged,\n baseTitle,\n currentTitle,\n columnsRenderMode,\n ]);\n\n const limit = run.result?.diff?.limit ?? 0;\n const warningLimit =\n limit > 0 && run.result?.diff?.more\n ? `Warning: Displayed results are limited to ${limit.toLocaleString()} records. To ensure complete data retrieval, consider applying a LIMIT or WHERE clause to constrain the result set.`\n : null;\n\n const warnings: string[] = [];\n if (warningLimit) {\n warnings.push(warningLimit);\n }\n\n if (gridData.columns.length === 0) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n No data\n </Box>\n );\n }\n\n if (changedOnly && gridData.rows.length === 0) {\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n bgcolor: \"rgb(249, 249, 249)\",\n height: \"100%\",\n }}\n >\n <RunToolbar\n run={run}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n warnings={warnings}\n />\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n No change\n </Box>\n </Box>\n );\n }\n\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n bgcolor: \"rgb(249, 249, 249)\",\n height: \"100%\",\n }}\n >\n <RunToolbar\n run={run}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n warnings={warnings}\n >\n <DiffDisplayModeSwitch\n displayMode={displayMode}\n onDisplayModeChanged={(displayMode) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n display_mode: displayMode,\n });\n }\n }}\n />\n\n <ChangedOnlyCheckbox\n changedOnly={viewOptions?.changed_only}\n onChange={() => {\n const changedOnly = !viewOptions?.changed_only;\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n changed_only: changedOnly,\n });\n }\n }}\n />\n </RunToolbar>\n <ScreenshotDataGrid\n ref={ref}\n style={{ blockSize: \"auto\", maxHeight: \"100%\", overflow: \"auto\" }}\n columns={gridData.columns}\n rows={gridData.rows}\n renderers={{\n noRowsFallback: (\n <EmptyRowsRenderer emptyMessage=\"No mismatched rows\" />\n ),\n }}\n defaultColumnOptions={{\n resizable: true,\n maxWidth: 800,\n minWidth: 35,\n }}\n className=\"rdg-light\"\n />\n </Box>\n );\n};\n\n// Create the forwardRef components here, at module level\nconst QueryDiffResultViewWithRef = forwardRef(PrivateQueryDiffResultView);\nconst QueryDiffJoinResultViewWithRef = forwardRef(\n PrivateQueryDiffJoinResultView,\n);\n\nexport const QueryDiffResultView = forwardRef(\n (props: QueryDiffResultViewProps, ref: ForwardedRef<DataGridHandle>) => {\n let baseTitle;\n let currentTitle;\n if (\n props.run.params &&\n (props.run.params as QueryPreviewChangeParams).current_model\n ) {\n // Configure the base and current titles under Sandbox Editor\n baseTitle = \"Original\";\n currentTitle = \"Editor\";\n }\n if (\n props.run.result &&\n \"diff\" in props.run.result &&\n props.run.result.diff != null\n ) {\n return (\n <QueryDiffJoinResultViewWithRef\n {...props}\n ref={ref}\n baseTitle={baseTitle}\n currentTitle={currentTitle}\n />\n );\n } else {\n return (\n <QueryDiffResultViewWithRef\n {...props}\n ref={ref}\n baseTitle={baseTitle}\n currentTitle={currentTitle}\n />\n );\n }\n },\n);\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Stack from \"@mui/material/Stack\";\nimport React, { forwardRef, Ref, useMemo } from \"react\";\nimport { PiWarning } from \"react-icons/pi\";\nimport { QueryViewOptions } from \"@/lib/api/adhocQuery\";\nimport {\n ColumnRenderMode,\n isQueryBaseRun,\n isQueryRun,\n Run,\n} from \"@/lib/api/types\";\nimport { createDataGrid } from \"@/lib/dataGrid/dataGridFactory\";\nimport {\n type DataGridHandle,\n EmptyRowsRenderer,\n ScreenshotDataGrid,\n} from \"../data-grid/ScreenshotDataGrid\";\nimport { RunResultViewProps } from \"../run/types\";\n\ninterface QueryResultViewProp extends RunResultViewProps<QueryViewOptions> {\n onAddToChecklist?: (run: Run) => void;\n}\n\nconst PrivateQueryResultView = (\n {\n run,\n viewOptions,\n onViewOptionsChanged,\n onAddToChecklist,\n }: QueryResultViewProp,\n ref: Ref<DataGridHandle>,\n) => {\n if (!(isQueryRun(run) || isQueryBaseRun(run))) {\n throw new Error(\"run type must be query\");\n }\n const pinnedColumns = useMemo(\n () => viewOptions?.pinned_columns ?? [],\n [viewOptions],\n );\n const columnsRenderMode = useMemo(\n () => viewOptions?.columnsRenderMode ?? {},\n [viewOptions],\n );\n\n const dataframe = run.result;\n const gridData = useMemo(() => {\n const onColumnsRenderModeChanged = (\n cols: Record<string, ColumnRenderMode>,\n ) => {\n const newRenderModes = {\n ...(viewOptions?.columnsRenderMode ?? {}),\n ...cols,\n };\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n columnsRenderMode: newRenderModes,\n });\n }\n };\n\n const handlePinnedColumnsChanged = (pinnedColumns: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n pinned_columns: pinnedColumns,\n });\n }\n };\n return (\n createDataGrid(run, {\n pinnedColumns,\n onPinnedColumnsChange: handlePinnedColumnsChanged,\n columnsRenderMode,\n onColumnsRenderModeChanged,\n }) ?? { columns: [], rows: [] }\n );\n }, [\n run,\n pinnedColumns,\n viewOptions,\n onViewOptionsChanged,\n columnsRenderMode,\n ]);\n\n if (gridData.columns.length === 0) {\n return (\n <Box\n sx={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n No data\n </Box>\n );\n }\n\n const limit = dataframe ? (dataframe.limit ?? 0) : 0;\n const warning =\n limit > 0 && dataframe?.more\n ? `Warning: Displayed results are limited to ${limit.toLocaleString()} records. To ensure complete data retrieval, consider applying a LIMIT or WHERE clause to constrain the result set.`\n : null;\n const showTopBar = onAddToChecklist ?? warning;\n\n return (\n <Stack sx={{ bgcolor: \"rgb(249, 249, 249)\", height: \"100%\" }}>\n {showTopBar && (\n <Stack\n direction=\"row\"\n sx={{\n borderBottom: \"1px solid lightgray\",\n alignItems: \"center\",\n gap: \"5px\",\n px: \"10px\",\n bgcolor: warning ? \"amber.100\" : \"inherit\",\n }}\n >\n {warning && (\n <>\n <Box\n component={PiWarning}\n sx={{ color: \"amber.600\", alignSelf: \"center\" }}\n />{\" \"}\n <Box>{warning}</Box>\n </>\n )}\n\n <Box sx={{ flexGrow: 1, minHeight: \"32px\" }} />\n {onAddToChecklist && (\n <Button\n sx={{ my: \"5px\" }}\n size=\"small\"\n color=\"iochmara\"\n variant=\"contained\"\n onClick={() => {\n onAddToChecklist(run);\n }}\n >\n Add to Checklist\n </Button>\n )}\n </Stack>\n )}\n <ScreenshotDataGrid\n ref={ref}\n style={{ blockSize: \"auto\", maxHeight: \"100%\", overflow: \"auto\" }}\n columns={gridData.columns}\n rows={gridData.rows}\n renderers={{ noRowsFallback: <EmptyRowsRenderer /> }}\n defaultColumnOptions={{\n resizable: true,\n maxWidth: 800,\n minWidth: 35,\n }}\n className=\"rdg-light\"\n />\n </Stack>\n );\n};\n\nexport const QueryResultView = forwardRef(PrivateQueryResultView);\n","import Box from \"@mui/material/Box\";\nimport { forwardRef, Ref, useMemo } from \"react\";\nimport { isRowCountDiffRun, isRowCountRun, Run } from \"@/lib/api/types\";\nimport { createDataGrid } from \"@/lib/dataGrid/dataGridFactory\";\nimport {\n type DataGridHandle,\n EmptyRowsRenderer,\n ScreenshotDataGrid,\n} from \"../data-grid/ScreenshotDataGrid\";\nimport { RunResultViewProps } from \"../run/types\";\n\n// ============================================================================\n// Shared Component\n// ============================================================================\n\ninterface RowCountGridViewProps {\n run: Run;\n typeGuard: (run: Run) => boolean;\n expectedType: string;\n}\n\nfunction _RowCountGridView(\n { run, typeGuard, expectedType }: RowCountGridViewProps,\n ref: Ref<DataGridHandle>,\n) {\n if (!typeGuard(run)) {\n throw new Error(`Run type must be ${expectedType}`);\n }\n\n const gridData = useMemo(() => {\n return createDataGrid(run) ?? { columns: [], rows: [] };\n }, [run]);\n\n if (gridData.rows.length === 0) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n bgcolor: \"rgb(249,249,249)\",\n height: \"100%\",\n }}\n >\n No nodes matched\n </Box>\n );\n }\n\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n <ScreenshotDataGrid\n ref={ref}\n style={{\n blockSize: \"auto\",\n maxHeight: \"100%\",\n overflow: \"auto\",\n fontSize: \"0.875rem\",\n borderWidth: 1,\n }}\n columns={gridData.columns}\n rows={gridData.rows}\n renderers={{ noRowsFallback: <EmptyRowsRenderer /> }}\n className=\"rdg-light\"\n />\n </Box>\n );\n}\n\nconst RowCountGridView = forwardRef(_RowCountGridView);\n\n// ============================================================================\n// Exported Components\n// ============================================================================\n\nfunction _RowCountDiffResultView(\n { run }: RunResultViewProps,\n ref: Ref<DataGridHandle>,\n) {\n return (\n <RowCountGridView\n ref={ref}\n run={run}\n typeGuard={isRowCountDiffRun}\n expectedType=\"row_count_diff\"\n />\n );\n}\n\nfunction _RowCountResultView(\n { run }: RunResultViewProps,\n ref: Ref<DataGridHandle>,\n) {\n return (\n <RowCountGridView\n ref={ref}\n run={run}\n typeGuard={isRowCountRun}\n expectedType=\"row_count\"\n />\n );\n}\n\nexport const RowCountDiffResultView = forwardRef(_RowCountDiffResultView);\nexport const RowCountResultView = forwardRef(_RowCountResultView);\n","import Box from \"@mui/material/Box\";\nimport FormControl from \"@mui/material/FormControl\";\nimport FormLabel from \"@mui/material/FormLabel\";\nimport NativeSelect from \"@mui/material/NativeSelect\";\nimport { useEffect } from \"react\";\nimport { TopKDiffParams } from \"@/lib/api/profile\";\nimport useModelColumns from \"@/lib/hooks/useModelColumns\";\nimport { RunFormProps } from \"../run/types\";\n\ntype TopKDiffFormProps = RunFormProps<TopKDiffParams>;\n\nexport function TopKDiffForm({\n params,\n onParamsChanged,\n setIsReadyToExecute,\n}: TopKDiffFormProps) {\n const { columns, isLoading, error } = useModelColumns(params.model);\n const columnNames = columns.map((c) => c.name);\n\n useEffect(() => {\n setIsReadyToExecute(!!params.column_name);\n }, [params, setIsReadyToExecute]);\n\n if (isLoading) {\n return <Box>Loading...</Box>;\n }\n\n if (columnNames.length === 0 || error) {\n return (\n <Box>\n Error: Please provide the &apos;catalog.json&apos; to list column\n candidates\n </Box>\n );\n }\n\n return (\n <Box sx={{ m: \"16px\" }}>\n <FormControl fullWidth>\n <FormLabel sx={{ mb: 1 }}>Pick a column to show top-k</FormLabel>\n <NativeSelect\n value={params.column_name}\n onChange={(e) => {\n const column = e.target.value;\n onParamsChanged({ ...params, column_name: column });\n }}\n >\n <option value=\"\">Select column</option>\n {columnNames.map((c) => (\n <option key={c} value={c} className=\"no-track-pii-safe\">\n {c}\n </option>\n ))}\n </NativeSelect>\n </FormControl>\n </Box>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Divider from \"@mui/material/Divider\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport {\n AnimationOptions,\n BarElement,\n CategoryScale,\n ChartData,\n Chart as ChartJS,\n ChartOptions,\n LinearScale,\n} from \"chart.js\";\nimport { Fragment } from \"react\";\nimport { Bar } from \"react-chartjs-2\";\nimport { TopKDiffResult, TopKResult } from \"@/lib/api/profile\";\nimport {\n formatAsAbbreviatedNumber,\n formatIntervalMinMax,\n} from \"@/utils/formatters\";\nimport { BASE_BAR_COLOR, CURRENT_BAR_COLOR, SquareIcon } from \"./SquareIcon\";\n\nexport const INFO_VAL_COLOR = \"#63B3ED\";\n\ninterface BarChartProps {\n topKDiff: TopKDiffResult;\n valids: number;\n isDisplayTopTen: boolean;\n}\n\ninterface Summary {\n label: string;\n count: number;\n displayCount: string;\n displayRatio: string;\n isLastItemOthers: boolean;\n isSpecialLabel: boolean;\n}\n\nfunction prepareSummaryList(\n topK: TopKResult,\n isDisplayTopTen: boolean,\n): Summary[] {\n const endAtIndex = isDisplayTopTen ? 10 : topK.counts.length;\n const counts = topK.counts.slice(0, endAtIndex);\n const remainingSumCount =\n topK.valids - counts.reduce((accum, curr) => accum + curr, 0);\n const values = topK.values.slice(0, endAtIndex);\n\n return values.concat([remainingSumCount]).map((v, index) => {\n const isLastItemOthers = index === counts.length;\n const count = isLastItemOthers ? remainingSumCount : counts[index];\n\n let label: string;\n let isSpecialLabel = false;\n\n if (isLastItemOthers) {\n label = \"(others)\";\n isSpecialLabel = true;\n } else if (v == null) {\n label = \"(null)\";\n isSpecialLabel = true;\n } else if (typeof v === \"string\" && v.length === 0) {\n label = \"(empty)\";\n isSpecialLabel = true;\n } else {\n label = String(v);\n }\n\n return {\n isLastItemOthers,\n isSpecialLabel,\n label,\n count: count,\n displayCount: formatAsAbbreviatedNumber(count),\n displayRatio: formatIntervalMinMax(count / topK.valids) ?? \"N/A\",\n };\n });\n}\n\nfunction TopKChartTooltip({\n base,\n current,\n children,\n}: {\n base: Summary;\n current: Summary;\n children?: React.ReactNode;\n}) {\n return (\n <MuiTooltip\n title={\n <Box>\n <Typography>\n <SquareIcon color={CURRENT_BAR_COLOR} />\n Current: {current.count} ({current.displayRatio})\n </Typography>\n <Typography>\n <SquareIcon color={BASE_BAR_COLOR} />\n Base: {base.count} ({base.displayRatio})\n </Typography>\n </Box>\n }\n arrow\n >\n <span>{children}</span>\n </MuiTooltip>\n );\n}\n\nexport function TopKSummaryBarChart({\n topKDiff,\n isDisplayTopTen,\n}: BarChartProps) {\n // const [isDisplayTopTen, setIsDisplayTopTen] = useState<boolean>(true);\n const currents = prepareSummaryList(topKDiff.current, isDisplayTopTen);\n const bases = prepareSummaryList(topKDiff.base, isDisplayTopTen);\n\n return (\n <Box sx={{ width: \"100%\", px: 20, py: 2 }}>\n <Box sx={{ display: \"flex\", alignItems: \"center\", flexDirection: \"row\" }}>\n <Box sx={{ flex: 1 }} />\n <Typography\n component=\"h3\"\n sx={{ fontSize: \"0.875rem\", p: 1, color: \"gray\" }}\n >\n <SquareIcon color={BASE_BAR_COLOR} /> Base\n </Typography>\n <Typography\n component=\"h3\"\n sx={{ fontSize: \"0.875rem\", p: 1, color: \"gray\" }}\n >\n <SquareIcon color={CURRENT_BAR_COLOR} /> Current\n </Typography>\n <Box sx={{ flex: 1 }} />\n </Box>\n {currents.map((current, index) => {\n const base = bases[index];\n if (\n current.isLastItemOthers &&\n current.count === 0 &&\n base.count === 0\n ) {\n // skip rendering the others if both are empty\n return <></>;\n }\n return (\n <Fragment key={current.label}>\n <TopKChartTooltip base={base} current={current}>\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n \"&:hover\": { bgcolor: \"action.hover\" },\n px: 2,\n }}\n >\n <Typography\n sx={{\n width: \"10em\",\n fontSize: \"0.875rem\",\n color: current.isSpecialLabel ? \"grey.400\" : \"inherit\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {current.label}\n </Typography>\n <Box\n sx={{\n display: \"flex\",\n width: \"70%\",\n flexDirection: \"column\",\n }}\n >\n {/* Current Top-K */}\n <Box sx={{ display: \"flex\", height: \"1em\" }}>\n <CategoricalBarChart\n topkCount={current.count}\n topkLabel={current.label}\n valids={topKDiff.current.valids}\n color={CURRENT_BAR_COLOR}\n />\n <Typography\n sx={{\n ml: 2.5,\n mr: 1,\n fontSize: \"0.875rem\",\n width: \"6em\",\n }}\n >\n {current.displayCount}\n </Typography>\n <Typography\n sx={{\n color: \"grey.400\",\n fontSize: \"0.875rem\",\n width: \"4em\",\n }}\n >\n {current.displayRatio}\n </Typography>\n </Box>\n {/* Base Top-K */}\n <Box sx={{ display: \"flex\", height: \"1em\" }}>\n <CategoricalBarChart\n topkCount={base.count}\n topkLabel={base.label}\n valids={topKDiff.base.valids}\n color={BASE_BAR_COLOR}\n />\n <Typography\n sx={{\n ml: 2.5,\n mr: 1,\n fontSize: \"0.875rem\",\n width: \"6em\",\n }}\n >\n {base.displayCount}\n </Typography>\n <Typography\n sx={{\n color: \"grey.400\",\n fontSize: \"0.875rem\",\n width: \"4em\",\n }}\n >\n {base.displayRatio}\n </Typography>\n </Box>\n </Box>\n </Box>\n </TopKChartTooltip>\n <Divider />\n </Fragment>\n );\n })}\n </Box>\n );\n}\n\ninterface Props {\n topk: TopKResult;\n valids: number;\n isDisplayTopTen: boolean;\n}\n\n/**\n * A list of each topk summary item (categorical)\n * Last list item will show 'others' when there are leftover values, which is the count difference of valids and displayed topk items\n */\nexport function TopKSummaryList({ topk, valids, isDisplayTopTen }: Props) {\n const endAtIndex = isDisplayTopTen ? 10 : topk.counts.length;\n const displayList = topk.counts.slice(0, endAtIndex);\n const remainingSumCount =\n valids - displayList.reduce((accum, curr) => accum + curr, 0);\n\n return (\n <Box sx={{ width: \"100%\" }}>\n {displayList.concat([remainingSumCount]).map((v, index) => {\n const isLastItemOthers = index === displayList.length;\n const topkCount = isLastItemOthers ? remainingSumCount : v;\n const catName = String(topk.values[index]);\n const topkLabel = isLastItemOthers ? \"(others)\" : catName || \"(empty)\";\n const displayTopkCount = formatAsAbbreviatedNumber(topkCount);\n const displayTopkRatio = formatIntervalMinMax(topkCount / valids);\n return (\n <Fragment key={topkLabel}>\n {!isLastItemOthers || topkCount > 0 ? (\n <>\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n \"&:hover\": { bgcolor: \"action.hover\" },\n px: 1.5,\n }}\n >\n <MuiTooltip title={topkLabel} placement=\"top-start\">\n <Typography\n sx={{\n width: \"14em\",\n fontSize: \"0.875rem\",\n color:\n isLastItemOthers || catName.length === 0\n ? \"grey.400\"\n : \"inherit\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {topkLabel}\n </Typography>\n </MuiTooltip>\n <Box sx={{ display: \"flex\", height: \"2em\", width: \"10em\" }}>\n <CategoricalBarChart\n topkCount={topkCount}\n topkLabel={topkLabel}\n valids={valids}\n />\n </Box>\n <MuiTooltip title={displayTopkCount} placement=\"top-start\">\n <Typography\n sx={{\n ml: 2.5,\n mr: 1,\n fontSize: \"0.875rem\",\n width: \"4em\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {displayTopkCount}\n </Typography>\n </MuiTooltip>\n <MuiTooltip title={displayTopkRatio} placement=\"top-start\">\n <Typography\n sx={{\n color: \"grey.400\",\n fontSize: \"0.875rem\",\n width: \"4em\",\n }}\n >\n {displayTopkRatio}\n </Typography>\n </MuiTooltip>\n </Box>\n <Divider />\n </>\n ) : (\n <></>\n )}\n </Fragment>\n );\n })}\n </Box>\n );\n}\n\n/**\n * Props for creating a CategoricalBarChart Component\n */\nexport interface CategoricalBarChartProps {\n topkCount: number;\n topkLabel: number | string;\n valids: number;\n animation?: AnimationOptions<\"bar\">[\"animation\"];\n color?: string;\n}\n/**\n * A Singular horizontal progress bar chart that visualizes categorical dataset, plotted 1:1 category group\n */\nexport function CategoricalBarChart({\n topkCount,\n topkLabel,\n valids,\n animation = false,\n color = INFO_VAL_COLOR,\n}: CategoricalBarChartProps) {\n ChartJS.register(CategoryScale, BarElement, LinearScale);\n const chartOptions = getCatBarChartOptions(topkCount, valids, { animation });\n const chartData = getCatBarChartData({\n topkCount,\n topkLabel,\n color,\n });\n\n return <Bar data={chartData} options={chartOptions} plugins={[]} />;\n}\n\n/**\n * @returns merged Chart.js option object for categorical 'bar'\n */\nexport function getCatBarChartOptions(\n count: CategoricalBarChartProps[\"topkCount\"],\n valids: number,\n { ...configOverrides }: ChartOptions<\"bar\"> = {},\n): ChartOptions<\"bar\"> {\n return {\n responsive: true,\n maintainAspectRatio: false,\n indexAxis: \"y\",\n scales: {\n x: {\n display: false,\n max: valids,\n grid: { display: false },\n },\n y: {\n display: false,\n },\n },\n plugins: {\n tooltip: {\n enabled: false,\n },\n },\n ...configOverrides,\n };\n}\n/**\n * @returns merged Chart.js data object for categorical 'bar'\n */\nexport function getCatBarChartData({\n topkLabel,\n topkCount,\n color = INFO_VAL_COLOR,\n}: Omit<CategoricalBarChartProps, \"animation\" | \"valids\">): ChartData<\"bar\"> {\n return {\n labels: [topkLabel], // showing top cats\n datasets: [\n {\n indexAxis: \"y\",\n data: [topkCount], // showing top cats\n backgroundColor: color,\n hoverBackgroundColor: color,\n borderWidth: 0,\n borderColor: color,\n barPercentage: 1,\n categoryPercentage: 0.6,\n },\n ],\n };\n}\n","import Box from \"@mui/material/Box\";\nimport Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { forwardRef, Ref, useState } from \"react\";\nimport { TopKDiffParams, TopKDiffResult } from \"@/lib/api/profile\";\nimport { TopKSummaryBarChart } from \"../charts/TopKSummaryList\";\nimport { RunResultViewProps } from \"../run/types\";\nimport { ScreenshotBox } from \"../screenshot/ScreenshotBox\";\n\ntype TopKDiffResultViewProp = RunResultViewProps;\n\nconst PrivateTopKDiffResultView = (\n { run }: TopKDiffResultViewProp,\n ref: Ref<HTMLDivElement>,\n) => {\n const [isDisplayTopTen, setIsDisplayTopTen] = useState<boolean>(true);\n // TODO: Implement TopKDiffResultView\n const result = run.result as TopKDiffResult;\n const params = run.params as TopKDiffParams;\n\n const baseTopK = result.base;\n const currentTopK = result.current;\n\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n <ScreenshotBox ref={ref} blockSize={\"auto\"}>\n <Typography\n variant=\"h5\"\n sx={{ pt: 4, textAlign: \"center\", color: \"grey.600\" }}\n >\n Model {params.model}.{params.column_name}\n </Typography>\n <Stack direction=\"row\" alignItems=\"center\">\n <Box sx={{ flex: 1 }} />\n <TopKSummaryBarChart\n topKDiff={result}\n valids={currentTopK.valids || 0}\n isDisplayTopTen={isDisplayTopTen}\n />\n <Box sx={{ flex: 1 }} />\n </Stack>\n </ScreenshotBox>\n <Box sx={{ flex: 1 }} />\n {(baseTopK.values.length > 10 || currentTopK.values.length > 10) && (\n <Box sx={{ display: \"flex\", p: 5, justifyContent: \"start\" }}>\n <Link\n component=\"button\"\n onClick={() => {\n setIsDisplayTopTen((prevState) => !prevState);\n }}\n sx={{ color: \"iochmara.main\", cursor: \"pointer\" }}\n >\n {isDisplayTopTen ? \"View More Items\" : \"View Only Top-10\"}\n </Link>\n </Box>\n )}\n </Box>\n );\n};\n\nexport const TopKDiffResultView = forwardRef(PrivateTopKDiffResultView);\n","import Box from \"@mui/material/Box\";\nimport { forwardRef, Ref, useMemo } from \"react\";\n\nimport \"../query/styles.css\";\nimport { ColumnRenderMode, isValueDiffDetailRun, Run } from \"@/lib/api/types\";\nimport { ValueDiffDetailViewOptions } from \"@/lib/api/valuediff\";\nimport { createDataGrid } from \"@/lib/dataGrid/dataGridFactory\";\nimport {\n type DataGridHandle,\n EmptyRowsRenderer,\n ScreenshotDataGrid,\n} from \"../data-grid/ScreenshotDataGrid\";\nimport { ChangedOnlyCheckbox } from \"../query/ChangedOnlyCheckbox\";\nimport { DiffDisplayModeSwitch } from \"../query/ToggleSwitch\";\nimport { RunToolbar } from \"../run/RunToolbar\";\nimport { RunResultViewProps } from \"../run/types\";\n\nexport interface ValueDiffDetailResultViewProps\n extends RunResultViewProps<ValueDiffDetailViewOptions> {\n onAddToChecklist?: (run: Run) => void;\n}\n\nconst PrivateValueDiffDetailResultView = (\n {\n run,\n onAddToChecklist,\n viewOptions,\n onViewOptionsChanged,\n }: ValueDiffDetailResultViewProps,\n\n ref: Ref<DataGridHandle>,\n) => {\n if (!isValueDiffDetailRun(run)) {\n throw new Error(\"run type must be value_diff_detail\");\n }\n const changedOnly = useMemo(\n () => viewOptions?.changed_only ?? false,\n [viewOptions],\n );\n const pinnedColumns = useMemo(\n () => viewOptions?.pinned_columns ?? [],\n [viewOptions],\n );\n const displayMode = useMemo(\n () => viewOptions?.display_mode ?? \"inline\",\n [viewOptions],\n );\n const columnsRenderMode = useMemo(\n () => viewOptions?.columnsRenderMode ?? {},\n [viewOptions],\n );\n\n const gridData = useMemo(() => {\n const onColumnsRenderModeChanged = (\n cols: Record<string, ColumnRenderMode>,\n ) => {\n const newRenderModes = {\n ...(viewOptions?.columnsRenderMode ?? {}),\n ...cols,\n };\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n columnsRenderMode: newRenderModes,\n });\n }\n };\n\n const handlePinnedColumnsChanged = (pinnedColumns: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n pinned_columns: pinnedColumns,\n });\n }\n };\n\n return (\n createDataGrid(run, {\n changedOnly,\n pinnedColumns,\n onPinnedColumnsChange: handlePinnedColumnsChanged,\n columnsRenderMode,\n onColumnsRenderModeChanged,\n displayMode,\n }) ?? { columns: [], rows: [] }\n );\n }, [\n run,\n viewOptions,\n changedOnly,\n pinnedColumns,\n displayMode,\n onViewOptionsChanged,\n columnsRenderMode,\n ]);\n\n const limit = run.result?.limit ?? 0;\n const warning =\n limit > 0 && run.result?.more\n ? `Warning: Displayed results are limited to ${limit.toLocaleString()} records. To ensure complete data retrieval, consider applying a LIMIT or WHERE clause to constrain the result set.`\n : null;\n\n const warnings: string[] = [];\n if (warning) {\n warnings.push(warning);\n }\n\n if (gridData.columns.length === 0) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n No data\n </Box>\n );\n }\n\n if (changedOnly && gridData.rows.length === 0) {\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n bgcolor: \"rgb(249, 249, 249)\",\n height: \"100%\",\n }}\n >\n <RunToolbar\n run={run}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n warnings={warnings}\n />\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n No change\n </Box>\n </Box>\n );\n }\n\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n bgcolor: \"rgb(249, 249, 249)\",\n height: \"100%\",\n }}\n >\n <RunToolbar\n run={run}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n warnings={warnings}\n >\n <DiffDisplayModeSwitch\n displayMode={displayMode}\n onDisplayModeChanged={(displayMode) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n display_mode: displayMode,\n });\n }\n }}\n />\n\n <ChangedOnlyCheckbox\n changedOnly={viewOptions?.changed_only}\n onChange={() => {\n const changedOnly = !viewOptions?.changed_only;\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n changed_only: changedOnly,\n });\n }\n }}\n />\n </RunToolbar>\n <ScreenshotDataGrid\n ref={ref}\n style={{ blockSize: \"auto\", maxHeight: \"100%\", overflow: \"auto\" }}\n columns={gridData.columns}\n rows={gridData.rows}\n renderers={{\n noRowsFallback: (\n <EmptyRowsRenderer emptyMessage=\"No mismatched rows\" />\n ),\n }}\n defaultColumnOptions={{ resizable: true, maxWidth: 800, minWidth: 35 }}\n className=\"rdg-light\"\n />\n </Box>\n );\n};\n\nexport const ValueDiffDetailResultView = forwardRef(\n PrivateValueDiffDetailResultView,\n);\n","import Box from \"@mui/material/Box\";\nimport Checkbox from \"@mui/material/Checkbox\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\nimport Stack from \"@mui/material/Stack\";\nimport TextField from \"@mui/material/TextField\";\nimport Typography from \"@mui/material/Typography\";\nimport { useEffect, useState } from \"react\";\nimport ReactSelect, {\n type CSSObjectWithLabel,\n type MultiValue,\n} from \"react-select\";\nimport useModelColumns from \"@/lib/hooks/useModelColumns\";\nimport { RunFormProps } from \"../run/types\";\n\ninterface ColumnOption {\n label: string;\n value: string;\n}\n\nexport interface ValueDiffFormParams {\n model: string;\n primary_key?: string | (string | undefined)[];\n columns?: string[];\n}\n\ntype ValueDiffFormProp = RunFormProps<ValueDiffFormParams>;\n\nexport function ValueDiffForm({\n params,\n onParamsChanged,\n setIsReadyToExecute,\n}: ValueDiffFormProp) {\n const [allColumns, setAllColumns] = useState<boolean>(\n !params.columns || params.columns.length === 0,\n );\n\n const model = params.model;\n const primaryKey = params.primary_key;\n\n const {\n columns,\n primaryKey: nodePrimaryKey,\n isLoading,\n error,\n } = useModelColumns(params.model);\n\n useEffect(() => {\n if (!primaryKey && nodePrimaryKey) {\n onParamsChanged({\n ...params,\n primary_key: nodePrimaryKey,\n });\n }\n }, [primaryKey, nodePrimaryKey, params, onParamsChanged]);\n\n useEffect(() => {\n setIsReadyToExecute(!!(primaryKey && model));\n }, [primaryKey, model, setIsReadyToExecute]);\n\n const columnNames = columns.map((c) => c.name);\n\n // primaryKey can be an array or string, map to array\n const primaryKeys = Array.isArray(primaryKey)\n ? primaryKey\n : primaryKey\n ? [primaryKey]\n : undefined;\n\n if (isLoading) {\n return <Box>Loading...</Box>;\n }\n\n if (columnNames.length === 0 || error) {\n return (\n <Box>\n Error: Please provide the &apos;catalog.json&apos; to list column\n candidates\n </Box>\n );\n }\n\n return (\n <Stack spacing={5} sx={{ m: \"8px 24px\", pb: \"200px\" }}>\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n Model\n </Typography>\n <TextField\n fullWidth\n size=\"small\"\n value={params.model}\n slotProps={{ input: { readOnly: true } }}\n />\n </Box>\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n Primary key\n </Typography>\n <ReactSelect\n placeholder=\"Select primary key\"\n className=\"no-track-pii-safe\"\n isMulti\n closeMenuOnSelect={false}\n options={columnNames.map((c) => ({ label: c, value: c }))}\n value={(primaryKeys ?? [])\n .filter((c): c is string => c !== undefined)\n .map((c) => ({\n label: c,\n value: c,\n }))}\n onChange={(options: MultiValue<ColumnOption>) => {\n const optionsArray = Array.isArray(options) ? options : [];\n onParamsChanged({\n ...params,\n primary_key:\n optionsArray.length == 1\n ? optionsArray[0].value\n : optionsArray.map((v) => v.value),\n });\n }}\n styles={{\n container: (base: CSSObjectWithLabel) => ({\n ...base,\n width: \"100%\",\n }),\n control: (base: CSSObjectWithLabel) => ({\n ...base,\n minHeight: \"40px\",\n }),\n }}\n />\n </Box>\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n Columns\n </Typography>\n <FormControlLabel\n control={\n <Checkbox\n checked={allColumns}\n onChange={(e) => {\n setAllColumns(e.target.checked);\n onParamsChanged({\n ...params,\n columns: undefined,\n });\n }}\n size=\"small\"\n />\n }\n label=\"All columns\"\n sx={{ mb: \"10px\" }}\n />\n {!allColumns && (\n <ReactSelect\n isMulti\n className=\"no-track-pii-safe\"\n closeMenuOnSelect={false}\n options={columnNames.map((c) => ({ label: c, value: c }))}\n value={(params.columns ?? []).map((c) => ({\n label: c,\n value: c,\n }))}\n onChange={(newValue: MultiValue<ColumnOption>) => {\n let cols: string[] | undefined;\n const newCols = Array.isArray(newValue)\n ? newValue.map((v) => v.value)\n : [];\n if (newCols.length === 0) {\n cols = undefined;\n } else {\n cols = newCols;\n }\n onParamsChanged({\n ...params,\n columns: cols,\n });\n }}\n styles={{\n container: (base: CSSObjectWithLabel) => ({\n ...base,\n width: \"100%\",\n }),\n control: (base: CSSObjectWithLabel) => ({\n ...base,\n minHeight: \"40px\",\n }),\n }}\n />\n )}\n </Box>\n </Stack>\n );\n}\n","/**\n * @file ValueDiffResultView.tsx\n * @description View component for displaying value diff summary results\n *\n * Shows a summary table of column-level match statistics from a value_diff run.\n * Each row represents a column with its match count and percentage.\n */\n\nimport Box from \"@mui/material/Box\";\nimport React, { forwardRef, Ref } from \"react\";\nimport { isValueDiffRun } from \"@/lib/api/types\";\nimport { ValueDiffParams, ValueDiffResult } from \"@/lib/api/valuediff\";\nimport { createDataGrid } from \"@/lib/dataGrid\";\nimport {\n type DataGridHandle,\n EmptyRowsRenderer,\n ScreenshotDataGrid,\n} from \"../data-grid/ScreenshotDataGrid\";\nimport { RunResultViewProps } from \"../run/types\";\n\ntype ValueDiffResultViewProp = RunResultViewProps;\n\nfunction _ValueDiffResultView(\n { run }: ValueDiffResultViewProp,\n ref: Ref<DataGridHandle>,\n) {\n if (!isValueDiffRun(run)) {\n throw new Error(\"Run type must be value_diff\");\n }\n\n const result = run.result as ValueDiffResult;\n const params = run.params as ValueDiffParams;\n\n const gridData = createDataGrid(run);\n\n if (!gridData) {\n return null;\n }\n\n const { columns, rows } = gridData;\n\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"5px\",\n pt: \"5px\",\n height: \"100%\",\n }}\n >\n <Box sx={{ px: \"16px\" }}>\n Model: {params.model}, {result.summary.total} total (\n {result.summary.total - result.summary.added - result.summary.removed}{\" \"}\n common, {result.summary.added} added, {result.summary.removed} removed)\n </Box>\n\n <ScreenshotDataGrid\n ref={ref}\n style={{\n blockSize: \"auto\",\n maxHeight: \"100%\",\n overflow: \"auto\",\n borderBlock: \"1px solid lightgray\",\n }}\n columns={columns}\n rows={rows}\n renderers={{ noRowsFallback: <EmptyRowsRenderer /> }}\n defaultColumnOptions={{ resizable: true }}\n className=\"rdg-light\"\n />\n </Box>\n );\n}\n\nexport const ValueDiffResultView = forwardRef(_ValueDiffResultView);\n","import React, {\n ComponentType,\n ForwardRefExoticComponent,\n RefAttributes,\n} from \"react\";\nimport { IconType } from \"react-icons\";\nimport { LuChartBarBig } from \"react-icons/lu\";\nimport { MdFormatListNumberedRtl, MdSchema } from \"react-icons/md\";\nimport {\n TbAlignBoxLeftStretch,\n TbBrandStackshare,\n TbChartHistogram,\n TbEyeEdit,\n TbEyeSearch,\n TbSql,\n} from \"react-icons/tb\";\nimport { DiffViewOptions } from \"@/components/run/RunToolbar\";\nimport { QueryDiffViewOptions, QueryViewOptions } from \"@/lib/api/adhocQuery\";\nimport { LineageDiffViewOptions } from \"@/lib/api/lineagecheck\";\nimport {\n HistogramDiffParams,\n ProfileDiffViewOptions,\n TopKDiffParams,\n} from \"@/lib/api/profile\";\nimport { AxiosQueryParams } from \"@/lib/api/types\";\nimport { ValueDiffDetailViewOptions } from \"@/lib/api/valuediff\";\nimport { type DataGridHandle } from \"../data-grid/ScreenshotDataGrid\";\nimport { HistogramDiffForm } from \"../histogram/HistogramDiffForm\";\nimport { HistogramDiffResultView } from \"../histogram/HistogramDiffResultView\";\nimport {\n ProfileDiffForm,\n ProfileDiffFormParams,\n} from \"../profile/ProfileDiffForm\";\nimport {\n ProfileDiffResultView,\n ProfileResultView,\n} from \"../profile/ProfileDiffResultView\";\nimport { QueryDiffResultView } from \"../query/QueryDiffResultView\";\nimport { QueryResultView } from \"../query/QueryResultView\";\nimport {\n RowCountDiffResultView,\n RowCountResultView,\n} from \"../rowcount/RowCountDiffResultView\";\nimport { TopKDiffForm } from \"../top-k/TopKDiffForm\";\nimport { TopKDiffResultView } from \"../top-k/TopKDiffResultView\";\nimport { ValueDiffDetailResultView } from \"../valuediff/ValueDiffDetailResultView\";\nimport { ValueDiffForm, ValueDiffFormParams } from \"../valuediff/ValueDiffForm\";\nimport { ValueDiffResultView } from \"../valuediff/ValueDiffResultView\";\nimport { RunFormProps, RunResultViewProps } from \"./types\";\n\nexport type ViewOptionTypes =\n | LineageDiffViewOptions\n | DiffViewOptions\n | QueryViewOptions\n | QueryDiffViewOptions\n | ProfileDiffViewOptions\n | ValueDiffDetailViewOptions;\n\nexport type RunType =\n | \"simple\"\n | \"query\"\n | \"query_base\"\n | \"query_diff\"\n | \"value_diff\"\n | \"value_diff_detail\"\n | \"schema_diff\"\n | \"profile\"\n | \"profile_diff\"\n | \"row_count\"\n | \"row_count_diff\"\n | \"lineage_diff\"\n | \"top_k_diff\"\n | \"histogram_diff\"\n | \"sandbox\";\n\nexport type RefTypes = React.Ref<DataGridHandle> | React.Ref<HTMLDivElement>;\nexport type RunFormParamTypes =\n | ProfileDiffFormParams\n | ValueDiffFormParams\n | TopKDiffParams\n | HistogramDiffParams\n | AxiosQueryParams;\n\nexport interface RegistryEntry<PT = RefTypes, VO = ViewOptionTypes> {\n title: string;\n icon: IconType;\n RunResultView?: ForwardRefExoticComponent<\n RunResultViewProps<VO> & RefAttributes<PT>\n >;\n RunForm?: ComponentType<RunFormProps<RunFormParamTypes>>;\n}\n\ninterface RunRegistry {\n query: RegistryEntry<DataGridHandle, QueryViewOptions>;\n query_base: RegistryEntry<DataGridHandle, QueryViewOptions>;\n query_diff: RegistryEntry<DataGridHandle, QueryDiffViewOptions>;\n row_count: RegistryEntry<DataGridHandle>;\n row_count_diff: RegistryEntry<DataGridHandle>;\n profile: RegistryEntry<DataGridHandle, ProfileDiffViewOptions>;\n profile_diff: RegistryEntry<DataGridHandle, ProfileDiffViewOptions>;\n value_diff: RegistryEntry<DataGridHandle>;\n value_diff_detail: RegistryEntry<DataGridHandle, ValueDiffDetailViewOptions>;\n top_k_diff: RegistryEntry<HTMLDivElement>;\n histogram_diff: RegistryEntry<HTMLDivElement>;\n lineage_diff: RegistryEntry<never>; // No RunResultView\n schema_diff: RegistryEntry<never>; // No RunResultView\n sandbox: RegistryEntry<never>; // No RunResultView\n simple: RegistryEntry<never>; // No RunResultView\n}\n\nexport function runTypeHasRef(runType: RunType) {\n const typeHasRef = [\n \"query\",\n \"query_base\",\n \"query_diff\",\n \"row_count\",\n \"row_count_diff\",\n \"profile\",\n \"profile_diff\",\n \"value_diff\",\n \"value_diff_detail\",\n \"top_k_diff\",\n \"histogram_diff\",\n ];\n return typeHasRef.includes(runType);\n}\n\nconst registry: RunRegistry = {\n lineage_diff: {\n title: \"Lineage Diff\",\n icon: TbBrandStackshare,\n },\n schema_diff: {\n title: \"Schema Diff\",\n icon: MdSchema,\n },\n query: {\n title: \"Query\",\n icon: TbSql,\n RunResultView: QueryResultView,\n },\n query_base: {\n title: \"Query Base\",\n icon: TbSql,\n RunResultView: QueryResultView,\n },\n query_diff: {\n title: \"Query Diff\",\n icon: TbSql,\n RunResultView: QueryDiffResultView,\n },\n row_count: {\n title: \"Row Count\",\n icon: MdFormatListNumberedRtl,\n RunResultView: RowCountResultView,\n },\n row_count_diff: {\n title: \"Row Count Diff\",\n icon: MdFormatListNumberedRtl,\n RunResultView: RowCountDiffResultView,\n },\n profile: {\n title: \"Profile\",\n icon: TbEyeSearch,\n RunResultView: ProfileResultView,\n RunForm: ProfileDiffForm,\n },\n profile_diff: {\n title: \"Profile Diff\",\n icon: TbEyeSearch,\n RunResultView: ProfileDiffResultView,\n RunForm: ProfileDiffForm,\n },\n value_diff: {\n title: \"Value Diff\",\n icon: TbAlignBoxLeftStretch,\n RunResultView: ValueDiffResultView,\n RunForm: ValueDiffForm,\n },\n value_diff_detail: {\n title: \"Value Diff Detail\",\n icon: TbAlignBoxLeftStretch,\n RunResultView: ValueDiffDetailResultView,\n RunForm: ValueDiffForm,\n },\n top_k_diff: {\n title: \"Top-K Diff\",\n icon: LuChartBarBig,\n RunResultView: TopKDiffResultView,\n RunForm: TopKDiffForm,\n },\n histogram_diff: {\n title: \"Histogram Diff\",\n icon: TbChartHistogram,\n RunResultView: HistogramDiffResultView,\n RunForm: HistogramDiffForm,\n },\n sandbox: {\n title: \"Sandbox\",\n icon: TbEyeEdit,\n // No specific RunResultView for sandbox, use QueryDiffResultView\n },\n simple: {\n title: \"Simple\",\n icon: TbEyeEdit,\n // No specific RunResultView for simple, use undefined\n },\n};\n\nexport const findByRunType = <T extends RunType>(\n runType: T,\n): RunRegistry[T] => {\n return registry[runType];\n};\n","/**\n * useAppRouter - Navigation utilities for Next.js App Router\n *\n * Provides a similar API to Wouter's useLocation for easier migration.\n * This hook combines Next.js's useRouter, usePathname, useParams,\n * and useSearchParams into a unified interface.\n *\n * IMPORTANT: useSearchParams() triggers Suspense boundaries in Next.js.\n * To avoid full-page loading states, useAppLocation() only returns the\n * pathname by default. Use useAppLocationWithSearch() if you need\n * search params included in the location string.\n */\n\n\"use client\";\n\nimport {\n useParams,\n usePathname,\n useRouter,\n useSearchParams,\n} from \"next/navigation\";\nimport { useCallback, useMemo } from \"react\";\n\ninterface NavigateOptions {\n replace?: boolean;\n scroll?: boolean;\n}\n\n/**\n * Hook that provides Wouter-compatible location API using Next.js App Router\n *\n * NOTE: This returns only the pathname (not search params) to avoid\n * triggering Suspense boundaries on every navigation.\n *\n * @returns [pathname, setLocation] tuple similar to Wouter's useLocation\n *\n * @example\n * const [location, setLocation] = useAppLocation();\n * setLocation(\"/checks?id=123\"); // Navigate to new path with query\n * setLocation(\"/checks\", { replace: true }); // Replace current history entry\n */\nexport function useAppLocation(): [\n string,\n (to: string, options?: NavigateOptions) => void,\n] {\n const router = useRouter();\n const pathname = usePathname();\n\n // Navigation function compatible with Wouter's setLocation\n const setLocation = useCallback(\n (to: string, options?: NavigateOptions) => {\n if (options?.replace) {\n router.replace(to, { scroll: options?.scroll ?? true });\n } else {\n router.push(to, { scroll: options?.scroll ?? true });\n }\n },\n [router],\n );\n\n return [pathname, setLocation];\n}\n\n/**\n * Hook that includes search params in the location string.\n *\n * WARNING: This hook uses useSearchParams() which triggers Suspense.\n * Only use this in components that are wrapped in a <Suspense> boundary,\n * or in leaf components where suspension is acceptable.\n *\n * @returns [fullLocation, setLocation] tuple with search params included\n */\nexport function useAppLocationWithSearch(): [\n string,\n (to: string, options?: NavigateOptions) => void,\n] {\n const router = useRouter();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n // Construct full location string including search params\n const location = useMemo(() => {\n const search = searchParams?.toString();\n return search ? `${pathname}?${search}` : pathname;\n }, [pathname, searchParams]);\n\n // Navigation function compatible with Wouter's setLocation\n const setLocation = useCallback(\n (to: string, options?: NavigateOptions) => {\n if (options?.replace) {\n router.replace(to, { scroll: options?.scroll ?? true });\n } else {\n router.push(to, { scroll: options?.scroll ?? true });\n }\n },\n [router],\n );\n\n return [location, setLocation];\n}\n\n/**\n * Hook to check if current path matches a pattern\n * Similar to Wouter's useRoute\n *\n * @param pattern - The route pattern to match (e.g., \"/checks/:checkId\")\n * @returns [isMatch, params] tuple\n *\n * @example\n * const [isMatch, params] = useAppRoute(\"/checks/:checkId\");\n * if (isMatch) {\n * console.log(params.checkId); // \"abc-123\"\n * }\n */\nexport function useAppRoute(\n pattern: string,\n): [boolean, Record<string, string>] {\n const pathname = usePathname();\n const params = useParams();\n\n const isMatch = useMemo(() => {\n // Convert Next.js dynamic route pattern to regex\n // /checks/[checkId] -> /checks/:checkId -> /checks/([^/]+)\n const regexPattern = pattern\n .replace(/:\\w+/g, \"([^/]+)\") // :param -> capture group\n .replace(/\\*/g, \".*\"); // * -> wildcard\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(pathname);\n }, [pattern, pathname]);\n\n // Convert Next.js params to plain object\n const paramsObj = useMemo(() => {\n if (!params) return {};\n return Object.fromEntries(\n Object.entries(params).map(([key, value]) => [\n key,\n Array.isArray(value) ? value.join(\"/\") : value,\n ]),\n );\n }, [params]);\n\n return [isMatch, paramsObj as Record<string, string>];\n}\n\n/**\n * Imperative navigation function for use outside React components\n * Use sparingly - prefer useAppLocation hook in components\n *\n * @example\n * // In an event handler or utility function\n * import { navigateTo } from \"@/lib/hooks/useAppRouter\";\n * navigateTo(\"/checks?id=123\");\n */\nexport function navigateTo(path: string, replace = false): void {\n if (typeof window !== \"undefined\") {\n if (replace) {\n window.history.replaceState(null, \"\", path);\n } else {\n window.history.pushState(null, \"\", path);\n }\n // Trigger Next.js to recognize the navigation\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n}\n\n/**\n * Hook for programmatic navigation with more options\n * Provides direct access to Next.js router methods\n *\n * NOTE: Does not include searchParams to avoid Suspense.\n * Use useSearchParams() directly in components that need it.\n */\nexport function useAppNavigation() {\n const router = useRouter();\n const pathname = usePathname();\n const params = useParams();\n\n return {\n /** Current pathname */\n pathname,\n /** Current route params */\n params: params as Record<string, string>,\n /** Navigate to a new path */\n push: router.push,\n /** Replace current history entry */\n replace: router.replace,\n /** Go back in history */\n back: router.back,\n /** Go forward in history */\n forward: router.forward,\n /** Refresh the current route */\n refresh: router.refresh,\n /** Prefetch a route for faster navigation */\n prefetch: router.prefetch,\n };\n}\n\n// Re-export Next.js hooks for convenience\nexport { useRouter, usePathname, useParams, useSearchParams };\n","import { useQueryClient } from \"@tanstack/react-query\";\nimport { usePathname } from \"next/navigation\";\nimport React, {\n ComponentType,\n createContext,\n Dispatch,\n SetStateAction,\n useCallback,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport { RunModal } from \"@/components/run/RunModal\";\nimport {\n findByRunType,\n RegistryEntry,\n RunFormParamTypes,\n RunType,\n} from \"@/components/run/registry\";\nimport { RunFormProps } from \"@/components/run/types\";\nimport { toaster } from \"@/components/ui/toaster\";\nimport { useAppLocation } from \"@/lib/hooks/useAppRouter\";\nimport { cacheKeys } from \"../api/cacheKeys\";\nimport { SubmitRunTrackProps, searchRuns, submitRun } from \"../api/runs\";\nimport { AxiosQueryParams, Run, RunParamTypes } from \"../api/types\";\n\nexport interface RecceActionOptions {\n showForm: boolean;\n showLast?: boolean;\n trackProps?: SubmitRunTrackProps;\n}\n\nexport interface RecceActionContextType {\n runAction: (\n type: RunType,\n params?: AxiosQueryParams,\n actionOptions?: RecceActionOptions,\n ) => void;\n runId?: string;\n showRunId: (runId: string, refreshHistory?: boolean) => void;\n isRunResultOpen: boolean;\n closeRunResult: () => void;\n isHistoryOpen: boolean;\n closeHistory: () => void;\n showHistory: () => void;\n setHistoryOpen: Dispatch<SetStateAction<boolean>>;\n clearRunResult: () => void;\n}\n\nexport const RecceActionContext = createContext<RecceActionContextType>({\n runAction: () => {\n return void 0;\n },\n showRunId: (runId: string) => {\n return void 0;\n },\n isRunResultOpen: false,\n closeRunResult: () => {\n return void 0;\n },\n isHistoryOpen: false,\n closeHistory: () => {\n return void 0;\n },\n showHistory: () => {\n return void 0;\n },\n setHistoryOpen: (v) => {\n return void 0;\n },\n clearRunResult: () => {\n return void 0;\n },\n});\n\ninterface RecceActionContextProviderProps {\n children: React.ReactNode;\n}\n\nconst useCloseModalEffect = (onClose: () => void) => {\n const pathname = usePathname();\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: Specifically run in location changes\n useEffect(() => {\n onClose();\n }, [onClose, pathname]);\n};\n\ninterface RunActionInternal {\n session: string;\n title: string;\n type: RunType;\n params?: RunFormParamTypes;\n lastRun?: Run;\n options?: RecceActionOptions;\n RunForm?: ComponentType<RunFormProps<RunFormParamTypes>>;\n}\n\nexport function RecceActionContextProvider({\n children,\n}: RecceActionContextProviderProps) {\n const [action, setAction] = useState<RunActionInternal>();\n\n // Modal state\n const [isModalOpen, setModalOpen] = useState(false);\n const onModalOpen = useCallback(() => setModalOpen(true), []);\n const onModalClose = useCallback(() => setModalOpen(false), []);\n\n // Run result pane state\n const [isRunResultOpen, setRunResultOpen] = useState(false);\n const onResultPaneOpen = useCallback(() => setRunResultOpen(true), []);\n const closeRunResult = useCallback(() => setRunResultOpen(false), []);\n\n // History state\n const [isHistoryOpen, setHistoryOpen] = useState(false);\n const showHistory = useCallback(() => setHistoryOpen(true), []);\n const closeHistory = useCallback(() => setHistoryOpen(false), []);\n\n const [runId, setRunId] = useState<string>();\n const [location, setLocation] = useAppLocation();\n const queryClient = useQueryClient();\n\n const showRunId = useCallback(\n async (runId: string, refreshHistory?: boolean) => {\n setRunId(runId);\n onResultPaneOpen();\n\n if (refreshHistory !== false) {\n await queryClient.invalidateQueries({ queryKey: cacheKeys.runs() });\n }\n },\n [onResultPaneOpen, queryClient],\n );\n\n const clearRunResult = useCallback(() => {\n setRunId(undefined);\n closeRunResult();\n }, [closeRunResult]);\n\n const runAction = useCallback(\n async (\n type: RunType,\n params?: AxiosQueryParams,\n options?: RecceActionOptions,\n ) => {\n try {\n const session = new Date().getTime().toString();\n let lastRun = undefined;\n if (options?.showLast) {\n const runs = await searchRuns(type, params, 1);\n if (runs.length === 1) {\n lastRun = runs[0];\n }\n }\n\n const run = findByRunType(type);\n const RunResultView = run.RunResultView as\n | RegistryEntry[\"RunResultView\"]\n | undefined;\n const { title, RunForm } = run;\n if (RunResultView === undefined) {\n throw new Error(`Run type ${type} does not have a result view`);\n }\n\n if (RunForm == undefined || !options?.showForm) {\n const { run_id } = await submitRun(type, params, {\n nowait: true,\n trackProps: options?.trackProps,\n });\n await showRunId(run_id);\n await queryClient.invalidateQueries({ queryKey: cacheKeys.runs() });\n if (location.startsWith(\"/lineage\")) {\n setLocation(\"/lineage\");\n }\n } else {\n setAction({\n session,\n title,\n type,\n params,\n lastRun,\n options,\n RunForm,\n });\n onModalOpen();\n }\n } catch (e: unknown) {\n toaster.create({\n title: \"Failed to submit a run\",\n description: e instanceof Error ? e.message : undefined,\n type: \"error\",\n duration: 5000,\n closable: true,\n });\n }\n },\n [onModalOpen, showRunId, location, setLocation, queryClient],\n );\n useCloseModalEffect(onModalClose);\n\n const handleExecute = async (type: RunType, params: RunParamTypes) => {\n try {\n onModalClose();\n const { run_id } = await submitRun(type, params, {\n nowait: true,\n trackProps: action?.options?.trackProps,\n });\n await showRunId(run_id);\n } catch (e: unknown) {\n toaster.create({\n title: \"Failed to submit a run\",\n description: e instanceof Error ? e.message : undefined,\n type: \"error\",\n duration: 5000,\n closable: true,\n });\n }\n };\n\n return (\n <RecceActionContext.Provider\n value={{\n runAction,\n runId,\n showRunId,\n isRunResultOpen,\n closeRunResult,\n isHistoryOpen,\n closeHistory,\n showHistory,\n setHistoryOpen,\n clearRunResult,\n }}\n >\n {action && (\n <RunModal\n key={action.session}\n isOpen={isModalOpen}\n onClose={onModalClose}\n onExecute={handleExecute}\n title={action.title}\n type={action.type}\n params={action.params}\n initialRun={action.lastRun}\n RunForm={\n action.options?.showForm && action.RunForm\n ? action.RunForm\n : undefined\n }\n />\n )}\n {children}\n </RecceActionContext.Provider>\n );\n}\n\nexport const useRecceActionContext = () => useContext(RecceActionContext);\n","import React, { createContext, useContext } from \"react\";\n\nexport interface CheckContext {\n latestSelectedCheckId: string;\n setLatestSelectedCheckId: (selectCheckId: string) => void;\n}\n\ninterface CheckContextProps {\n children: React.ReactNode;\n}\n\nconst RecceCheckContext = createContext<CheckContext>({\n latestSelectedCheckId: \"\",\n setLatestSelectedCheckId: () => {\n return void 0;\n },\n});\n\nexport function RecceCheckContextProvider({ children }: CheckContextProps) {\n const [selectCheckId, setSelectCheckId] = React.useState<string>(\"\");\n return (\n <RecceCheckContext.Provider\n value={{\n setLatestSelectedCheckId: setSelectCheckId,\n latestSelectedCheckId: selectCheckId,\n }}\n >\n {children}\n </RecceCheckContext.Provider>\n );\n}\n\nexport const useRecceCheckContext = () => useContext(RecceCheckContext);\n","import React, { createContext, useContext } from \"react\";\n\nexport interface QueryContext {\n sqlQuery: string;\n setSqlQuery: (sqlQuery: string) => void;\n primaryKeys: string[] | undefined;\n setPrimaryKeys: (primaryKeys: string[] | undefined) => void;\n isCustomQueries: boolean;\n setCustomQueries: (isCustomQueries: boolean) => void;\n baseSqlQuery?: string;\n setBaseSqlQuery?: (baseSqlQuery: string) => void;\n}\n\nexport const defaultSqlQuery = 'select * from {{ ref(\"mymodel\") }}';\n\nconst defaultQueryContext: QueryContext = {\n sqlQuery: defaultSqlQuery,\n setSqlQuery: () => {\n return void 0;\n },\n primaryKeys: undefined,\n setPrimaryKeys: () => {\n return void 0;\n },\n isCustomQueries: false,\n setCustomQueries: () => {\n return void 0;\n },\n baseSqlQuery: defaultSqlQuery,\n setBaseSqlQuery: () => {\n return void 0;\n },\n};\n\nconst RecceQueryContext = createContext(defaultQueryContext);\n\ninterface QueryContextProps {\n children: React.ReactNode;\n}\n\nexport function RecceQueryContextProvider({ children }: QueryContextProps) {\n const [sqlQuery, setSqlQuery] = React.useState<string>(defaultSqlQuery);\n const [baseSqlQuery, setBaseSqlQuery] =\n React.useState<string>(defaultSqlQuery);\n const [isCustomQueries, setCustomQueries] = React.useState<boolean>(false);\n const [primaryKeys, setPrimaryKeys] = React.useState<string[] | undefined>();\n return (\n <RecceQueryContext.Provider\n value={{\n setSqlQuery,\n sqlQuery,\n setPrimaryKeys,\n primaryKeys,\n isCustomQueries,\n setCustomQueries,\n baseSqlQuery,\n setBaseSqlQuery,\n }}\n >\n {children}\n </RecceQueryContext.Provider>\n );\n}\n\nexport const useRecceQueryContext = () => useContext(RecceQueryContext);\n\nexport interface RowCountStateContext {\n isNodesFetching: string[];\n setIsNodesFetching: (nodes: string[]) => void;\n}\n\nconst defaultRowCountStateContext: RowCountStateContext = {\n isNodesFetching: [],\n setIsNodesFetching: () => {\n return void 0;\n },\n};\n\nconst RowCountStateContext = createContext(defaultRowCountStateContext);\n\ninterface RowCountStateContextProps {\n children: React.ReactNode;\n}\n\nexport function RowCountStateContextProvider({\n children,\n}: RowCountStateContextProps) {\n const [isNodesFetching, setIsNodesFetching] = React.useState<string[]>([]);\n return (\n <RowCountStateContext.Provider\n value={{ isNodesFetching, setIsNodesFetching }}\n >\n {children}\n </RowCountStateContext.Provider>\n );\n}\n\nexport const useRowCountStateContext = () => useContext(RowCountStateContext);\n","import { AxiosResponse, isAxiosError } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\n\nexport interface SaveAsInput {\n filename: string;\n overwrite?: boolean;\n}\n\nexport interface ImportedState {\n runs: number;\n checks: number;\n}\n\nexport async function saveAs(input: SaveAsInput): Promise<void> {\n return (\n await axiosClient.post<SaveAsInput, AxiosResponse<void>>(\n \"/api/save-as\",\n input,\n )\n ).data;\n}\n\nexport async function rename(input: SaveAsInput): Promise<void> {\n return (\n await axiosClient.post<SaveAsInput, AxiosResponse<void>>(\n \"/api/rename\",\n input,\n )\n ).data;\n}\n\nexport async function exportState(): Promise<string> {\n return (await axiosClient.post<never, AxiosResponse<string>>(\"/api/export\"))\n .data;\n}\n\ninterface ImportStateBody {\n file: File;\n checks_only: \"true\" | \"false\";\n}\n\nexport async function importState(\n file: File,\n checksOnly?: boolean,\n): Promise<ImportedState> {\n const formData = new FormData();\n formData.append(\"file\", file);\n formData.append(\"checks_only\", (!!checksOnly).toString());\n\n return (\n await axiosClient.post<ImportStateBody, AxiosResponse<ImportedState>>(\n \"/api/import\",\n formData,\n )\n ).data;\n}\n\nexport async function isStateSyncing(): Promise<boolean> {\n const response = await axiosClient.get<never, AxiosResponse<boolean>>(\n \"/api/sync\",\n );\n return response.status === 208;\n}\n\nexport interface SyncStateInput {\n method?: \"overwrite\" | \"revert\" | \"merge\";\n}\nexport interface SyncStateResponse {\n status: \"accepted\" | \"conflict\" | \"syncing\";\n}\n\nexport async function syncState(\n input: SyncStateInput,\n): Promise<SyncStateResponse> {\n try {\n const response = await axiosClient.post<\n SyncStateInput,\n AxiosResponse<SyncStateResponse>\n >(\"/api/sync\", input);\n\n if (response.status === 202) {\n return {\n status: \"accepted\",\n };\n }\n if (response.status === 208) {\n return {\n status: \"syncing\",\n };\n }\n } catch (error) {\n if (isAxiosError(error)) {\n if (error.response?.status === 409) {\n // 409 conflict case\n return { status: \"conflict\" };\n }\n }\n }\n throw new Error(\"Failed to sync state\");\n}\n\nexport interface ShareStateResponse {\n status: string;\n message: string;\n share_url?: string;\n}\n\nexport async function shareState(): Promise<ShareStateResponse> {\n return (\n await axiosClient.post<never, AxiosResponse<ShareStateResponse>>(\n \"/api/share\",\n )\n ).data;\n}\n","import React, { createContext, useContext, useState } from \"react\";\nimport { shareState } from \"@/lib/api/state\";\n\ninterface ShareStateProps {\n shareUrl?: string;\n isLoading: boolean;\n error?: string;\n handleShareClick: () => Promise<void>;\n}\n\nconst ShareState = createContext<ShareStateProps | undefined>(undefined);\n\nexport function RecceShareStateContextProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const [shareUrl, setShareUrl] = useState<string>();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string>();\n\n const handleShareClick = async () => {\n setIsLoading(true);\n setError(undefined);\n setShareUrl(undefined);\n try {\n const response = await shareState();\n if (response.status !== \"success\") {\n setError(response.message);\n return;\n }\n setShareUrl(response.share_url);\n } catch (err) {\n setError((err as Error).message);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <ShareState.Provider\n value={{ shareUrl, isLoading, error, handleShareClick }}\n >\n {children}\n </ShareState.Provider>\n );\n}\n\nexport const useRecceShareStateContext = () => {\n const context = useContext(ShareState);\n if (!context) {\n throw new Error(\n \"useRecceShareStateContext must be used within a RecceShareStateContextProvider\",\n );\n }\n return context;\n};\n","import React from \"react\";\nimport { LineageGraphContextProvider } from \"./LineageGraphContext\";\nimport { RecceActionContextProvider } from \"./RecceActionContext\";\nimport { RecceCheckContextProvider } from \"./RecceCheckContext\";\nimport { RecceInstanceInfoProvider } from \"./RecceInstanceContext\";\nimport {\n RecceQueryContextProvider,\n RowCountStateContextProvider,\n} from \"./RecceQueryContext\";\nimport { RecceShareStateContextProvider } from \"./RecceShareStateContext\";\n\ninterface RecceContextProps {\n children: React.ReactNode;\n}\n\nexport default function RecceContextProvider({ children }: RecceContextProps) {\n return (\n <RecceInstanceInfoProvider>\n <RecceShareStateContextProvider>\n <RecceQueryContextProvider>\n <LineageGraphContextProvider>\n <RowCountStateContextProvider>\n <RecceActionContextProvider>\n <RecceCheckContextProvider>\n {children}\n </RecceCheckContextProvider>\n </RecceActionContextProvider>\n </RowCountStateContextProvider>\n </LineageGraphContextProvider>\n </RecceQueryContextProvider>\n </RecceShareStateContextProvider>\n </RecceInstanceInfoProvider>\n );\n}\n"]}