{"version":3,"file":"sitecore-content-sdk-angular.mjs","sources":["../../src/lib/tokens.ts","../../src/loaders/loader-registry.token.ts","../../src/server/constants.ts","../../src/loaders/client-loader-data.service.ts","../../src/loaders/models.ts","../../src/server/cache/models.ts","../../src/server/cache/utils.ts","../../src/server/cache/cache-tags.ts","../../src/server/cache/cache-key.ts","../../src/server/server-loader-runner.ts","../../src/editing/constants.ts","../../src/server/utils.ts","../../src/server/middleware/utils.ts","../../src/server/middleware/loader-data-service-middleware.ts","../../src/server/middleware/sitecore-edge-webhook-revalidation.ts","../../src/server/middleware/sitecore-revalidate-middleware.ts","../../src/debug.ts","../../src/server/middleware/editing-config-middleware.ts","../../src/server/middleware/editing-render-middleware.ts","../../src/server/middleware/sitemap-middleware.ts","../../src/server/middleware/robots-middleware.ts","../../src/loaders/constants.ts","../../src/server/middleware/multisite-middleware.ts","../../src/i18n/locale-utils.ts","../../src/server/middleware/personalize-middleware.ts","../../src/server/middleware/redirects-middleware.ts","../../src/server/middleware/bot-tracking-middleware.ts","../../src/loaders/utils.ts","../../src/loaders/route-loader-utils.ts","../../src/loaders/router-error-handling.ts","../../src/loaders/server-loader-runner.token.ts","../../src/loaders/loader-resolver.ts","../../src/loaders/route-matcher.ts","../../src/loaders/pre-loader-data.service.ts","../../src/loaders/context-helpers.ts","../../src/lib/analytics/sitecore-analytics.ts","../../src/lib/analytics/sitecore-analytics.browser.ts","../../src/lib/analytics/sitecore-analytics.server.ts","../../src/lib/providers.ts","../../src/server/provide-server-loader-runner.ts","../../src/server/editing/get-editing-preview-data.ts","../../src/server/cache/unstorage-loader-cache.ts","../../src/server/cache/loader-cache.ts","../../src/server/index.ts","../../src/lib/sitecore-context.service.ts","../../src/lib/sc-editing-scripts.component.ts","../../src/i18n/sitecore-translate-loader.ts","../../src/i18n/locale-url-serializer.ts","../../src/components/types.ts","../../src/components/tokens.ts","../../src/components/placeholder/placeholder-utils.ts","../../src/components/sc-missing-component.component.ts","../../src/components/sc-hidden-rendering.component.ts","../../src/components/placeholder/placeholder-tokens.ts","../../src/components/placeholder/sc-placeholder.component.ts","../../src/components/sc-form.component.ts","../../src/components/field-directives/metadata-chrome.component.ts","../../src/components/field-directives/base-field.directive.ts","../../src/components/default-empty-text-field.component.ts","../../src/components/field-directives/sc-text.directive.ts","../../src/components/default-empty-image-field.component.ts","../../src/components/field-directives/utils.ts","../../src/components/field-directives/sc-image.directive.ts","../../src/components/field-directives/link-field-utils.ts","../../src/components/field-directives/sc-link.directive.ts","../../src/components/field-directives/link-hover-prefetch.ts","../../src/components/field-directives/sc-router-link.directive.ts","../../src/components/field-directives/sc-rich-text.directive.ts","../../src/public-api.ts","../../src/sitecore-content-sdk-angular.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport type { SitecoreClient } from '@sitecore-content-sdk/content/client';\r\nimport type { AngularSitecoreConfig } from '../config/define-config';\r\n\r\n/**\r\n * Injection token for the Sitecore configuration.\r\n * Provided by `provideSitecoreAngular({ sitecoreConfig, sitecoreClient })`. Inject this to read config app-wide.\r\n * `AngularSitecoreConfig` extends `SitecoreConfig`, so consumers that previously typed the\r\n * value as `SitecoreConfig` remain structurally compatible.\r\n * @public\r\n */\r\nexport const SITECORE_CONFIG_TOKEN = new InjectionToken<AngularSitecoreConfig>(\r\n  'SITECORE_CONFIG_TOKEN'\r\n);\r\n\r\n/**\r\n * Injection token for the SitecoreClient instance.\r\n * Provided by `provideSitecoreAngular({ sitecoreConfig, sitecoreClient })` with the app-supplied client instance.\r\n * @public\r\n */\r\nexport const SITECORE_CLIENT_TOKEN = new InjectionToken<SitecoreClient>('SITECORE_CLIENT_TOKEN');\r\n\r\nexport const NOT_FOUND_ROUTE_TOKEN = new InjectionToken<string>('NOT_FOUND_ROUTE_TOKEN');\r\n\r\n/**\r\n * Injection token for the error route.\r\n * @public\r\n */\r\nexport const ERROR_ROUTE_TOKEN = new InjectionToken<string>('ERROR_ROUTE_TOKEN');\r\n","import { InjectionToken, Provider } from '@angular/core';\r\nimport type { LoaderFn } from './models';\r\n\r\n/**\r\n * Optional endpoint path for loader data fetch (e.g. '/_data' or '/api/data').\r\n * When null or undefined, LOADER_DATA_ENDPOINT is used.\r\n * @public\r\n */\r\nexport const FETCH_DATA_ENDPOINT = new InjectionToken<string | null | undefined>(\r\n  'FETCH_DATA_ENDPOINT'\r\n);\r\n\r\n/**\r\n * Cross-boundary loader registry — maps loader IDs to loader functions.\r\n * The same registry is used for SSR, CSR (`/_data`), and route resolvers.\r\n * There is no separate server vs client loader set.\r\n * @public\r\n */\r\nexport type LoaderRegistry = Record<string, LoaderFn>;\r\n\r\nexport const LOADER_REGISTRY = new InjectionToken<LoaderRegistry>('LOADER_REGISTRY');\r\n\r\n/**\r\n * Registers the app's loader registry for DI. Pass the loaders your app uses\r\n * (e.g. page, '404', '500'). Use the **same object** with\r\n *createLoaderDataServiceMiddleware in `server.ts` so SSR and CSR\r\n * navigations resolve the same loader functions.\r\n * @param {LoaderRegistry} loaders - Map of loader id to loader function\r\n * @public\r\n */\r\nexport const provideLoaderRegistry = (loaders: LoaderRegistry): Provider[] => {\r\n  return [\r\n    {\r\n      provide: LOADER_REGISTRY,\r\n      useValue: { ...loaders },\r\n    },\r\n  ];\r\n};\r\n\r\n/**\r\n * Symbol used to tag resolver functions with their loader ID.\r\n * This allows the prefetch service to identify loader resolvers in the route tree.\r\n * @internal\r\n */\r\nexport const LOADER_ID = Symbol('loaderId');\r\n","/**\r\n * Default path for the data endpoint used by loaders.\r\n * This path will be requested by the client-side loader resolver to fetch data for the current route.\r\n * @public\r\n */\r\nexport const LOADER_DATA_ENDPOINT = '/_data';\r\n","import { inject, Injectable, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { LoaderPayload, LoaderApiResponse } from './models';\r\nimport { LOADER_DATA_ENDPOINT } from '../server/constants';\r\nimport { FETCH_DATA_ENDPOINT } from './loader-registry.token';\r\n\r\n/**\r\n * Staging key for prefetched loader responses (browser-only, consume-once).\r\n * @param {string} loaderId - Loader identifier\r\n * @param {string} url - Request URL\r\n * @returns Staging key string\r\n */\r\nfunction requestKey(loaderId: string, url: string): string {\r\n  return `loader:${loaderId}:${url}`;\r\n}\r\n\r\n/**\r\n * Loader data client for browser loader data resolution. POSTs to the `/_data` endpoint and holds\r\n * short-lived prefetched responses for parallel navigation prefetching.\r\n * Not aware of the server-side {@link LoaderCache}.\r\n * @public\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class ClientLoaderDataService {\r\n  private readonly prefetchedResponses = new Map<string, LoaderApiResponse>();\r\n  private readonly pending = new Map<string, Promise<LoaderApiResponse>>();\r\n  private readonly http = inject(HttpClient);\r\n  private readonly platformId = inject(PLATFORM_ID);\r\n  private readonly fetchDataEndpoint =\r\n    inject(FETCH_DATA_ENDPOINT, { optional: true }) ?? LOADER_DATA_ENDPOINT;\r\n\r\n  /**\r\n   * Prefetch loader data for the given request without consuming staged responses.\r\n   * If a request is already pending for this key, does nothing (avoids two overlapping HTTP\r\n   * calls for the identical in-flight ask). Otherwise starts a fetch and stores the result for\r\n   * a later getData() call, overwriting any existing staged entry with the fresh one.\r\n   *\r\n   * By default (`force: false`) also skips the fetch when a response is already staged and\r\n   * unconsumed. Pass `force: true` to always re-ask regardless of an existing staged entry —\r\n   * used by hover prefetch, since hover is a fresh, repeatable signal of intent that a\r\n   * possibly-stale staged answer shouldn't suppress.\r\n   * @param {LoaderPayload} loaderRequest - The loader data request\r\n   * @param {object} [options] - Prefetch options\r\n   * @param {boolean} [options.force] - When true, bypass the staged-response check (still coalesces concurrent in-flight requests)\r\n   */\r\n  prefetch(loaderRequest: LoaderPayload, options?: { force?: boolean }): void {\r\n    if (!isPlatformBrowser(this.platformId)) {\r\n      return;\r\n    }\r\n    const key = requestKey(loaderRequest.loaderId, loaderRequest.url);\r\n    if (this.pending.has(key)) {\r\n      return;\r\n    }\r\n    if (!options?.force && this.prefetchedResponses.has(key)) {\r\n      return;\r\n    }\r\n    const promise = this.fetchData(loaderRequest);\r\n    this.pending.set(key, promise);\r\n    promise.then(() => {\r\n      // Result is already stored in prefetchedResponses by fetchData\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Get data for the given request, using staged prefetched responses or fetching if needed.\r\n   * If a request is already pending for this URL/loader combination,\r\n   * waits for it to complete instead of making a duplicate request.\r\n   * Consumes (removes) staged responses after retrieval.\r\n   * @param {LoaderPayload} request - The loader data request\r\n   * @returns {Promise<LoaderApiResponse>} Promise resolving to the API response\r\n   */\r\n  async getData(request: LoaderPayload): Promise<LoaderApiResponse> {\r\n    if (!isPlatformBrowser(this.platformId)) {\r\n      return {\r\n        kind: 'error',\r\n        status: 500,\r\n        message: 'ClientLoaderDataService only works in browser',\r\n      };\r\n    }\r\n\r\n    const key = requestKey(request.loaderId, request.url);\r\n\r\n    const staged = this.prefetchedResponses.get(key);\r\n    if (staged !== undefined) {\r\n      this.prefetchedResponses.delete(key);\r\n      return staged;\r\n    }\r\n\r\n    // Wait for pending loader data request if one exists\r\n    const pendingRequest = this.pending.get(key);\r\n    if (pendingRequest) {\r\n      return pendingRequest;\r\n    }\r\n\r\n    // Make new request; add to pending so concurrent callers reuse the same promise\r\n    const pendingFetchData = this.fetchData(request);\r\n    this.pending.set(key, pendingFetchData);\r\n    return pendingFetchData;\r\n  }\r\n\r\n  /**\r\n   * Fetch data from the configured data endpoint.\r\n   * Callers (getData, prefetch) add the returned promise to pending; it is removed\r\n   * in finally when the promise settles.\r\n   * @param {LoaderPayload} request - The loader data request\r\n   * @returns {Promise<LoaderApiResponse>} Promise resolving to the API response\r\n   */\r\n  private async fetchData(request: LoaderPayload): Promise<LoaderApiResponse> {\r\n    const key = requestKey(request.loaderId, request.url);\r\n    const endpoint = this.fetchDataEndpoint;\r\n    const reqBody: LoaderPayload = {\r\n      loaderId: request.loaderId,\r\n      url: request.url,\r\n      routeParams: request.routeParams ?? {},\r\n      query: request.query ?? {},\r\n      cacheOptions: request.cacheOptions,\r\n    };\r\n\r\n    try {\r\n      const resp = await firstValueFrom(\r\n        this.http.post<LoaderApiResponse>(endpoint, reqBody, { cache: 'no-store' })\r\n      );\r\n      if (!resp) {\r\n        const message = `No response from ${endpoint}`;\r\n        return { kind: 'error', status: 500, message } as LoaderApiResponse;\r\n      }\r\n      if (resp.kind === 'data') {\r\n        this.prefetchedResponses.set(key, resp);\r\n      } else if (resp.kind === 'redirect') {\r\n        this.prefetchedResponses.set(key, resp);\r\n      }\r\n      return resp;\r\n    } catch (error) {\r\n      const message = error instanceof Error ? error.message : 'Fetch failed';\r\n      return { kind: 'error', status: 500, message } as LoaderApiResponse;\r\n    } finally {\r\n      this.pending.delete(key);\r\n    }\r\n  }\r\n}\r\n","import type { Params } from '@angular/router';\r\nimport { EditingPreviewData } from '@sitecore-content-sdk/content/editing';\r\nexport const DEFAULT_NOT_FOUND_ROUTE = '/404';\r\nexport const DEFAULT_ERROR_ROUTE = '/500';\r\n\r\n/**\r\n * Content SDK request params like site name, variant ids\r\n * @public\r\n */\r\nexport interface CsdkRequestParams {\r\n  /** Site name. Resolved from the request hostname */\r\n  siteName?: string;\r\n  /** Variant id. Either resovled from route or set to default variant id name */\r\n  variantId?: string;\r\n  /** Component variant IDs */\r\n  componentVariantIds?: string[];\r\n}\r\n/**\r\n * Request data from the incoming HTTP request.\r\n * Used for request-dependent operations in loaders.\r\n * @public\r\n */\r\nexport interface CsdkRequestData {\r\n  /**\r\n   * The hostname from the request (without port)\r\n   */\r\n  hostname?: string;\r\n  /**\r\n   * Cookies from the request\r\n   */\r\n  cookies?: Record<string, string>;\r\n  /**\r\n   * Query parameters from the request\r\n   */\r\n  query?: Record<string, string | string[] | undefined>;\r\n  /**\r\n   * Headers from the request\r\n   */\r\n  headers?: Record<string, string | string[] | undefined>;\r\n  /**\r\n   * Referrer from the request\r\n   */\r\n  referrer?: string;\r\n  /**\r\n   * Preview/editing data for Content SDK\r\n   */\r\n  scPreviewData?: EditingPreviewData;\r\n  /** Content SDK request params */\r\n  scParams?: CsdkRequestParams;\r\n}\r\n\r\n/**\r\n * Context provided to loader functions.\r\n * Contains information about the current request including URL, params, query, and request context.\r\n * @public\r\n */\r\nexport type LoaderContext = {\r\n  /**\r\n   * The current URL path\r\n   */\r\n  url: string;\r\n  /**\r\n   * Route parameters from all matched segments.\r\n   *\r\n   * When locales are configured and the route tree uses `scLocaleMatcher`, the matched\r\n   * locale is exposed as `params.locale`. The resolver also defaults `params.locale` to\r\n   * `defaultLanguage` from `sitecore.config` when no locale segment was matched — loaders\r\n   * can rely on a concrete `params.locale` regardless of URL shape.\r\n   */\r\n  routeParams: Params;\r\n  /**\r\n   * Query string parameters\r\n   */\r\n  query: Record<string, string | string[]>;\r\n  /**\r\n   * Server-only: the incoming request\r\n   */\r\n  req?: Request;\r\n  /** Content SDK request params like site name, variant ids */\r\n  scParams: Omit<CsdkRequestParams, 'siteName'> & { siteName: string };\r\n  /**\r\n   * Server-only: request data extracted from the incoming HTTP request\r\n   * (hostname, headers, cookies, editing preview data). Absent during prerender.\r\n   */\r\n  csdkRequestData?: CsdkRequestData;\r\n};\r\n\r\n/**\r\n * Payload for loader resolution.\r\n * @public\r\n */\r\nexport type LoaderPayload = {\r\n  /**\r\n   * The loader ID\r\n   */\r\n  loaderId: string;\r\n  /**\r\n   * The requst URL\r\n   */\r\n  url: string;\r\n  /**\r\n   * The ANgular request route parameters\r\n   */\r\n  routeParams: Params;\r\n  /**\r\n   * The request query parameters\r\n   */\r\n  query: Record<string, any>;\r\n  /**\r\n   * Per-route cache overrides supplied at the `loaderResolver(id, cacheOptions)`\r\n   * call site. The browser includes them in the `/_data` POST body so the same\r\n   * per-route policy applies on CSR navigations.\r\n   */\r\n  cacheOptions?: LoaderCacheConfig;\r\n};\r\n\r\nexport type LoaderRunnerInit = LoaderPayload & {\r\n  /**\r\n   * Supplemental Content SDK request data\r\n   */\r\n  csdkRequestData: CsdkRequestData | null;\r\n};\r\n\r\nexport type LoaderRedirectResult = {\r\n  loaderRedirectTarget: string;\r\n  status?: number;\r\n};\r\n\r\n/**\r\n * Type guard for redirect results returned by loaders.\r\n * @param {unknown} v - Value to check\r\n * @internal\r\n */\r\nexport function isLoaderRedirectResult(v: unknown): v is LoaderRedirectResult {\r\n  return (\r\n    typeof v === 'object' &&\r\n    v !== null &&\r\n    'loaderRedirectTarget' in v &&\r\n    typeof (v as LoaderRedirectResult).loaderRedirectTarget === 'string'\r\n  );\r\n}\r\n\r\nexport type LoaderApiResponse =\r\n  | { kind: 'data'; data: any }\r\n  | { kind: 'redirect'; redirect: LoaderRedirectResult }\r\n  | { kind: 'error'; status: number; message: string }\r\n  | { kind: 'notFound'; status: number };\r\n\r\n/**\r\n * Result returned by loader resolution on the server (SSR and `/_data` endpoint).\r\n * Uses the shared cross-boundary loader registry; not a separate server loader set.\r\n * @public\r\n */\r\nexport type LoaderDataResult =\r\n  | { kind: 'data'; data: unknown }\r\n  | { kind: 'redirect'; redirect: LoaderRedirectResult }\r\n  | { kind: 'error'; status: number; message: string; cause?: unknown };\r\n\r\n/**\r\n * Loader function type.\r\n * A loader is an async function that receives context, can be applied in route resolvers and can return:\r\n * - data - any data that can be serialized and stored in the transfer state\r\n * - redirect - a redirect to be applied to the router\r\n * - throw error - an error that occurred during the retrieval of the data\r\n * @public\r\n */\r\nexport type LoaderFn<T = unknown> = (ctx: LoaderContext) => Promise<T> | T | LoaderRedirectResult;\r\n\r\nexport class NotFoundNavigationError extends Error {\r\n  constructor(message = 'Not Found') {\r\n    super(message);\r\n  }\r\n}\r\n\r\nexport class LoaderHttpError extends Error {\r\n  constructor(public status: number, message = 'Content SDK Loader Error') {\r\n    super(message);\r\n  }\r\n}\r\n\r\n/**\r\n * Base browser-safe config type for loader cache.\r\n *\r\n * `revalidate` is in seconds. A positive value caches the entry for that many\r\n * seconds; `0` or a negative value means \"never expire\" (rely on explicit\r\n * invalidation). There is no `'infinite'` sentinel.\r\n * @public\r\n */\r\nexport interface LoaderCacheConfig extends PerRouteLoaderCacheConfig {\r\n  /** Default site name for tag helpers and admin tooling. Defaults to `'default'`. */\r\n  defaultSiteName?: string;\r\n  /**\r\n   * Site names used by revalidation middleware to fan out dictionary loader tags\r\n   * (`sc:loader:dictionary:<site>:<locale>`) on every webhook call.\r\n   */\r\n  sites?: string[];\r\n  /** Fallback locale for tag helpers when a site entry has no `language`. Defaults to `'en'`. */\r\n  defaultLocale?: string;\r\n}\r\n\r\n/**\r\n * Per-route cache configuration.\r\n * @public\r\n */\r\nexport interface PerRouteLoaderCacheConfig {\r\n  /** TTL in seconds. Positive → expires after N seconds; `0` or negative → never expires. */\r\n  revalidate?: number;\r\n  /** Master switch — when false, every call falls through to the raw loader. */\r\n  enabled?: boolean;\r\n  /**\r\n   * Custom tags applied to every entry this loader writes. Merged with built-in\r\n   * OSR tags (self-key, `sc:site`, `sc:locale`, and `sc:item` for page loaders).\r\n   */\r\n  tags?: string[];\r\n}\r\n\r\n/**\r\n * Metadata returned by cache.entries() — sufficient for an admin UI without\r\n * shipping the cached values themselves (which can be large).\r\n * @public\r\n */\r\nexport interface LoaderCacheEntryInfo {\r\n  key: string;\r\n  tags: string[];\r\n  storedAt: number;\r\n  expiresAt: number | null;\r\n  stale: boolean;\r\n}\r\n\r\n/**\r\n * Three-outcome read result for stale-while-revalidate\r\n *\r\n * - `hit` — entry is fresh; serve cached value without running the loader.\r\n * - `stale` — entry expired or was invalidated; serve cached value and refresh in the background.\r\n * - `miss` — no entry; run the loader synchronously.\r\n * @public\r\n */\r\nexport type LoaderCacheReadResult =\r\n  /** Fresh cache entry within TTL and not marked stale. */\r\n  | { kind: 'hit'; value: unknown; cacheKey: string }\r\n  /** Expired or invalidated entry; value is served while a background refresh runs. */\r\n  | { kind: 'stale'; value: unknown; cacheKey: string }\r\n  /** No entry stored for the requested cache key. */\r\n  | { kind: 'miss'; cacheKey: string };\r\n\r\n/**\r\n * Persisted cache entry shape. Stored under the composite cache key built by\r\n * buildCacheKey(); see cache-key.ts.\r\n * @public\r\n */\r\nexport interface LoaderCacheEntry {\r\n  value: unknown;\r\n  tags: string[];\r\n  storedAt: number;\r\n  expiresAt: number | null; // null = never expire\r\n  /** When true (or TTL expired), entry is served stale while refreshing. */\r\n  stale: boolean;\r\n}\r\n\r\n/**\r\n * Tag-based invalidation input.\r\n * Marks matching entries stale via the tag index; does not delete them (SWR semantics).\r\n * @public\r\n */\r\nexport interface InvalidateInput {\r\n  /** Non-empty list of OSR tags (for example `sc:item:…`, `sc:site:…`, or a cache key self-tag). */\r\n  tags?: string[];\r\n}\r\n\r\n/**\r\n * Server-only cache instance. Constructed once in `server.ts` via\r\n * `createLoaderCache` (see `server/cache`) and passed by reference to middleware factories\r\n * (`createLoaderDataServiceMiddleware`, `createCacheAdminMiddleware`,\r\n * `createSitecoreRevalidateMiddleware`; see `server/middleware`) and to Angular SSR through\r\n * `angularApp.handle(req, { cache })`.\r\n *\r\n * Implementations maintain a sidecar tag index so `LoaderCache.invalidate`\r\n * can mark entries stale without scanning every key.\r\n * @public\r\n */\r\nexport interface LoaderCache {\r\n  /** Global default TTL in seconds from {@link LoaderCacheConfig.revalidate}. */\r\n  get ttl(): number;\r\n  /** Resolved configuration (useful for admin UI and diagnostics). */\r\n  get config(): Readonly<LoaderCacheConfig>;\r\n  /**\r\n   * Reads a cache entry and classifies it as hit, stale, or miss.\r\n   * @param key - OSR-aligned cache key (for example `sc:loader:page:demo:en:default:about`).\r\n   */\r\n  get(key: string): Promise<LoaderCacheReadResult>;\r\n  /**\r\n   * Stores an entry and links it to the supplied tag set.\r\n   * @param key - Cache key to write.\r\n   * @param value - Loader payload to persist.\r\n   * @param ttlSeconds - TTL in seconds; `0` or negative means never expire.\r\n   * @param tags - Tag index pointers written alongside the entry (self-key, site, locale, item, etc.).\r\n   */\r\n  set(key: string, value: unknown, ttlSeconds: number, tags: string[]): Promise<void>;\r\n  /**\r\n   * Marks every entry linked to any of the supplied tags as stale.\r\n   * @param filter - Tag list to resolve through the tag index.\r\n   * @returns Number of entries marked stale (includes entries already stale).\r\n   */\r\n  invalidate(filter: InvalidateInput): Promise<number>;\r\n  /** Removes a single entry and unlinks it from the tag index. */\r\n  delete(key: string): Promise<boolean>;\r\n  /** Removes every entry and clears the tag index. */\r\n  flush(): Promise<void>;\r\n  /** Returns lightweight metadata for admin tooling (values are omitted). */\r\n  entries(): Promise<LoaderCacheEntryInfo[]>;\r\n  /** Whether caching is enabled globally. Per-route overrides may still opt in. */\r\n  enabled(): boolean;\r\n}\r\n","import { Driver } from 'unstorage';\r\nimport { LoaderCacheConfig } from '../../loaders/models';\r\n\r\n/** Default global revalidate TTL (seconds) when {@link LoaderCacheConfig.revalidate} is omitted. @internal */\r\nexport const DEFAULT_CACHE_TTL = 300;\r\n\r\n/**\r\n * Identity dimensions of a cache key. Derived from {@link LoaderContext} by {@link buildCacheKey}.\r\n * @internal\r\n */\r\nexport interface CacheKeyDimensions {\r\n  /** Site name from route params (defaults to sitecoreConfig.defaultSite). */\r\n  site: string;\r\n  /** Locale from route params (defaults to `'en'`). */\r\n  locale: string;\r\n  /** Loader id (`page`, `dictionary`, etc.). */\r\n  loaderId: string;\r\n  /** Sanitized path segment from the loader URL; home route uses `'_'`. */\r\n  pathKey: string;\r\n  /** Personalization variant segment (defaults to `'default'`). */\r\n  variantId?: string;\r\n  /** Component variant ids from request context */\r\n  componentVariantIds?: string[];\r\n}\r\n\r\n/**\r\n * Global config for the loader cache. Consumed by `createLoaderCache()` in\r\n * the app's `server.ts`.\r\n *\r\n * Moved to separate file to avoid accidental `unstorage` imports in browser-safe code.\r\n *\r\n * Drivers are imported and instantiated in the app (e.g.\r\n * `fsDriver({ base: './.cache/loaders' })`) — the package does not own driver\r\n * selection. When `driver` is omitted, the cache falls back to its built-in\r\n * in-memory implementation.\r\n * @public\r\n */\r\nexport interface GlobalLoaderCacheConfig extends LoaderCacheConfig {\r\n  /**\r\n   * Unstorage `Driver` instance. Pass an imported driver — the cache wraps it\r\n   * with `createStorage({ driver })` internally. Omit for the in-memory default.\r\n   */\r\n  driver?: Driver;\r\n}\r\n","import {\r\n  LoaderCacheConfig,\r\n  LoaderCacheReadResult,\r\n  LoaderCacheEntry,\r\n  LoaderContext,\r\n} from '../../loaders/models';\r\nimport { GlobalLoaderCacheConfig, CacheKeyDimensions, DEFAULT_CACHE_TTL } from './models';\r\n\r\n/**\r\n * Removes the query string from a URL path.\r\n * @param {string} url - URL or path that may include `?query`.\r\n * @returns {string} Pathname without query string.\r\n * @internal\r\n */\r\nfunction stripQuery(url: string): string {\r\n  const i = url.indexOf('?');\r\n  return i === -1 ? url : url.slice(0, i);\r\n}\r\n\r\n/**\r\n * Converts a loader URL to the `pathKey` segment used in OSR-aligned cache keys.\r\n * Strips query strings, trims slashes, sanitizes segments, and removes a leading\r\n * locale prefix when it matches `params.locale`. Home resolves to `'_'`.\r\n * @param {string} url - Loader URL (may include query string).\r\n * @param {string} [locale] - Optional locale used to strip a leading `/locale` prefix.\r\n * @returns {string} Sanitized path key (`'_'` for home).\r\n * @example\r\n * ```ts\r\n * urlToPathKey('/'); // '_'\r\n * urlToPathKey('/About Us'); // 'about_us'\r\n * urlToPathKey('/en/about', 'en'); // 'about'\r\n * ```\r\n * @internal\r\n */\r\nexport function urlToPathKey(url: string, locale?: string): string {\r\n  const pathname = stripQuery(url || '/').replace(/^\\/+|\\/+$/g, '');\r\n  let segments = pathname ? pathname.split('/').filter(Boolean) : [];\r\n  if (locale && segments[0]?.toLowerCase() === locale.toLowerCase()) {\r\n    segments = segments.slice(1);\r\n  }\r\n  if (segments.length === 0) {\r\n    return '_';\r\n  }\r\n  return segments.map((segment) => sanitizeSitecoreCacheSegment(segment)).join('/');\r\n}\r\n\r\n/**\r\n * Derives {@link CacheKeyDimensions} from a loader context.\r\n * Used by {@link buildCacheKey} and admin tooling.\r\n * @param {string} loaderId - Loader id being resolved.\r\n * @param {LoaderContext} ctx - Loader context (URL + route params).\r\n * @returns {CacheKeyDimensions} Parsed cache key dimensions.\r\n * @internal\r\n */\r\nexport function dimensionsFromContext(loaderId: string, ctx: LoaderContext): CacheKeyDimensions {\r\n  const params = (ctx.routeParams ?? {}) as Record<string, unknown>;\r\n  const site = ctx.scParams.siteName;\r\n  const variantId = ctx.scParams.variantId;\r\n  const componentVariantIds = ctx.scParams.componentVariantIds;\r\n  const locale = (params?.locale as string) || 'en';\r\n  const pathKey = urlToPathKey(ctx.url || '/', locale);\r\n\r\n  return {\r\n    site,\r\n    locale,\r\n    variantId,\r\n    componentVariantIds,\r\n    loaderId,\r\n    pathKey,\r\n  };\r\n}\r\n\r\n/**\r\n * Strips `driver` from {@link GlobalLoaderCacheConfig} before passing config to backends.\r\n * @param {GlobalLoaderCacheConfig} config - Global cache config from {@link createLoaderCache}.\r\n * @returns {LoaderCacheConfig} Backend-safe config without the unstorage driver instance.\r\n * @internal\r\n */\r\nexport function resolveConfig(config: GlobalLoaderCacheConfig): LoaderCacheConfig {\r\n  const clonedConfig = { ...config };\r\n  delete clonedConfig.driver;\r\n  return clonedConfig;\r\n}\r\n\r\n/**\r\n * Applies defaults for every {@link LoaderCacheConfig} field.\r\n * @param {LoaderCacheConfig} [config] - Partial config from `createLoaderCache()` or a backend constructor.\r\n * @returns {Required<LoaderCacheConfig>} Fully populated config used by cache backends.\r\n * @internal\r\n */\r\nexport function applyLoaderCacheConfigDefaults(\r\n  config: LoaderCacheConfig = {}\r\n): Required<LoaderCacheConfig> {\r\n  return {\r\n    revalidate: config.revalidate ?? DEFAULT_CACHE_TTL,\r\n    enabled: config.enabled ?? true,\r\n    defaultSiteName: config.defaultSiteName ?? 'default',\r\n    tags: config.tags ?? [],\r\n    sites: config.sites ?? [],\r\n    defaultLocale: config.defaultLocale ?? 'en',\r\n  };\r\n}\r\n\r\n/**\r\n * Maps a stored entry to the three-outcome read result used by {@link ServerLoaderRunner}.\r\n * @param {string} cacheKey - Key being read.\r\n * @param {LoaderCacheEntry | null | undefined} entry - Stored entry, if any.\r\n * @param {number} [now] - Current timestamp for TTL comparison (defaults to `Date.now()`).\r\n * @returns {LoaderCacheReadResult} Hit, stale, or miss classification.\r\n * @internal\r\n */\r\nexport function evaluateCacheRead(\r\n  cacheKey: string,\r\n  entry: LoaderCacheEntry | null | undefined,\r\n  now = Date.now()\r\n): LoaderCacheReadResult {\r\n  if (!entry) {\r\n    return { kind: 'miss', cacheKey };\r\n  }\r\n  if (entry.stale || (entry.expiresAt !== null && entry.expiresAt <= now)) {\r\n    return { kind: 'stale', value: entry.value, cacheKey };\r\n  }\r\n  return { kind: 'hit', value: entry.value, cacheKey };\r\n}\r\n\r\n/**\r\n * Sanitizes a segment for Sitecore cache keys and tags (lowercase, separators → `_`).\r\n * @param {string} value - Raw segment from site, locale, path, or loader id.\r\n * @returns {string} Sanitized segment safe for keys and tags.\r\n * @internal\r\n */\r\nexport function sanitizeSitecoreCacheSegment(value: string): string {\r\n  return value\r\n    .trim()\r\n    .toLowerCase()\r\n    .replace(/[/:\\s]+/g, '_');\r\n}\r\n\r\n/**\r\n * Normalizes a Sitecore item GUID for cache keys/tags (lowercase, no braces).\r\n * @param {string} itemId - Raw Sitecore item id or GUID.\r\n * @returns {string} Normalized id segment.\r\n * @internal\r\n */\r\nexport function normalizeSitecoreItemIdForCacheKey(itemId: string): string {\r\n  return itemId.trim().toLowerCase().replace(/[{}]/g, '');\r\n}\r\n\r\n/**\r\n * Deduplicates strings while preserving first-seen order.\r\n * @param {string[]} values - Tag or key candidates.\r\n * @returns {string[]} Deduplicated list.\r\n * @internal\r\n */\r\nexport function dedupeCacheStrings(values: string[]): string[] {\r\n  const dedupedSet = new Set<string>(values);\r\n  return Array.from(dedupedSet);\r\n}\r\n","import type { RouteData } from '@sitecore-content-sdk/content/layout';\r\nimport type { Page } from '@sitecore-content-sdk/content/client';\r\nimport {\r\n  normalizeSitecoreItemIdForCacheKey,\r\n  sanitizeSitecoreCacheSegment,\r\n  dedupeCacheStrings,\r\n} from './utils';\r\nimport type { CacheKeyDimensions } from './models';\r\n\r\n/**\r\n * Sitecore OSR namespace prefix shared with other frameworks (`sc:`).\r\n * All loader cache keys and invalidation tags use this prefix.\r\n * @internal\r\n */\r\nexport const SITECORE_CONTENT_CACHE_TAG_PREFIX = 'sc';\r\n\r\n/**\r\n * Parameters for {@link buildSitecoreItemCacheTag}.\r\n * @internal\r\n */\r\nexport type BuildSitecoreItemCacheTagParams = {\r\n  /** Sitecore item GUID or content id. */\r\n  itemId: string;\r\n  /** Locale/culture for the item tag. */\r\n  locale: string;\r\n  /** Optional published version; omitted values produce a `latest` suffix. */\r\n  version?: number;\r\n};\r\n\r\n/**\r\n * Builds an item-scoped revalidation tag: `sc:item:<id>:<locale>:<version>`.\r\n * @param {BuildSitecoreItemCacheTagParams} params - Item id, locale, and optional version.\r\n * @returns {string} Sitecore item cache tag.\r\n * @internal\r\n */\r\nexport function buildSitecoreItemCacheTag(params: BuildSitecoreItemCacheTagParams): string {\r\n  const id = normalizeSitecoreItemIdForCacheKey(params.itemId);\r\n  const locale = sanitizeSitecoreCacheSegment(params.locale);\r\n  const ver =\r\n    params.version !== undefined && Number.isFinite(params.version)\r\n      ? `v${Math.trunc(params.version)}`\r\n      : 'latest';\r\n  return `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:item:${id}:${locale}:${ver}`;\r\n}\r\n\r\n/**\r\n * Parameters for {@link buildSitecoreDictionaryCacheTag} and related dictionary tag helpers.\r\n * @internal\r\n */\r\nexport type SitecoreDictionaryCacheTagParams = {\r\n  /** Site name segment. */\r\n  site: string;\r\n  /** Locale segment. */\r\n  locale: string;\r\n};\r\n\r\n/**\r\n * Site entry used when fanning out dictionary loader tags from webhook middleware.\r\n * @internal\r\n */\r\nexport type LoaderDictionaryCacheSiteInfo = {\r\n  /** Site name. */\r\n  name: string;\r\n  /** Optional site language; falls back to `baseLocale` when blank. */\r\n  language?: string;\r\n};\r\n\r\n/**\r\n * Parameters for {@link buildLoaderDictionaryCacheTagsFromSites}.\r\n * @internal\r\n */\r\nexport type BuildLoaderDictionaryCacheTagsFromSitesParams = {\r\n  /** Sites to emit dictionary loader tags for. */\r\n  sites: readonly LoaderDictionaryCacheSiteInfo[];\r\n  /** Locale used when a site entry has no `language`. */\r\n  baseLocale: string;\r\n};\r\n\r\n/**\r\n * Builds a dictionary cache tag: `sc:dict:<site>:<locale>`.\r\n * Used for dictionary loader entries and cross-stack webhook fan-out.\r\n * @param {SitecoreDictionaryCacheTagParams} params - Site and locale segments.\r\n * @returns {string} Dictionary cache tag.\r\n * @internal\r\n */\r\nexport function buildSitecoreDictionaryCacheTag(params: SitecoreDictionaryCacheTagParams): string {\r\n  const site = sanitizeSitecoreCacheSegment(params.site);\r\n  const locale = sanitizeSitecoreCacheSegment(params.locale);\r\n  return `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:dict:${site}:${locale}`;\r\n}\r\n\r\n/**\r\n * Builds an item tag from layout route data when `itemId` is present.\r\n * Returns `null` when the route has no item id (non-content routes).\r\n * @param {RouteData | null | undefined} route - Layout route metadata.\r\n * @param {string} fallbackLocale - Locale used when `route.itemLanguage` is absent.\r\n * @returns {string | null} Item cache tag, or `null` when no item id is available.\r\n * @internal\r\n */\r\nexport function buildSitecoreItemCacheTagFromRouteData(\r\n  route: RouteData | null | undefined,\r\n  fallbackLocale: string\r\n): string | null {\r\n  if (!route?.itemId) {\r\n    return null;\r\n  }\r\n  const locale = route.itemLanguage\r\n    ? sanitizeSitecoreCacheSegment(route.itemLanguage)\r\n    : sanitizeSitecoreCacheSegment(fallbackLocale);\r\n  const id = normalizeSitecoreItemIdForCacheKey(route.itemId);\r\n  const ver =\r\n    route.itemVersion !== undefined && Number.isFinite(route.itemVersion)\r\n      ? `v${Math.trunc(route.itemVersion)}`\r\n      : 'latest';\r\n  return `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:item:${id}:${locale}:${ver}`;\r\n}\r\n\r\n/**\r\n * Builds loader-cache dictionary self-tags for webhook fan-out across sites.\r\n * Produces `sc:loader:dictionary:<site>:<locale>` tags, deduped in first-seen order.\r\n * When a site has no `language`, `baseLocale` is used.\r\n * @param {BuildLoaderDictionaryCacheTagsFromSitesParams} params - Sites and fallback locale.\r\n * @returns {string[]} Deduplicated loader dictionary cache tags.\r\n * @internal\r\n */\r\nexport function buildLoaderDictionaryCacheTagsFromSites(\r\n  params: BuildLoaderDictionaryCacheTagsFromSitesParams\r\n): string[] {\r\n  const seen = new Set<string>();\r\n  const out: string[] = [];\r\n  for (const site of params.sites) {\r\n    const locale = site.language?.trim() ? site.language : params.baseLocale;\r\n    const tag = buildLoaderDictionaryCacheTag({ site: site.name, locale });\r\n    if (!seen.has(tag)) {\r\n      seen.add(tag);\r\n      out.push(tag);\r\n    }\r\n  }\r\n  return out;\r\n}\r\n\r\n/**\r\n * Loader-cache self-tag for the dictionary loader: `sc:loader:dictionary:<site>:<locale>`.\r\n * @param {SitecoreDictionaryCacheTagParams} params - Site and locale segments.\r\n * @returns {string} Loader dictionary self-tag (same shape as the cache key).\r\n * @internal\r\n */\r\nexport function buildLoaderDictionaryCacheTag(params: SitecoreDictionaryCacheTagParams): string {\r\n  const site = sanitizeSitecoreCacheSegment(params.site);\r\n  const locale = sanitizeSitecoreCacheSegment(params.locale);\r\n  return `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:loader:dictionary:${site}:${locale}`;\r\n}\r\n\r\n/**\r\n * Site-wide fan-out tag: `sc:site:<site>`.\r\n * Invalidating this tag marks every cached entry for the site stale.\r\n * @param {string} site - Site name segment.\r\n * @returns {string} Site fan-out cache tag.\r\n * @internal\r\n */\r\nexport function buildSitecoreSiteCacheTag(site: string): string {\r\n  return `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:site:${sanitizeSitecoreCacheSegment(site)}`;\r\n}\r\n\r\n/**\r\n * Locale-wide fan-out tag: `sc:locale:<locale>`.\r\n * @param {string} locale - Locale segment.\r\n * @returns {string} Locale fan-out cache tag.\r\n * @internal\r\n */\r\nexport function buildSitecoreLocaleCacheTag(locale: string): string {\r\n  return `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:locale:${sanitizeSitecoreCacheSegment(locale)}`;\r\n}\r\n\r\n/**\r\n * Builds the full tag set written alongside a loader cache entry.\r\n * Always includes self-tag, `sc:site:<site>`, and `sc:locale:<locale>`. Conditionally adds\r\n * `sc:item:…` for page loaders and `sc:dict:…` for dictionary loaders. Custom tags are deduped.\r\n * @param {string} loaderId - Loader that produced the value.\r\n * @param {CacheKeyDimensions} dimensions - Key dimensions from {@link buildCacheKey}.\r\n * @param {string} cacheKey - Stored cache key (also used as a self-tag).\r\n * @param {unknown} [loaderValue] - Loader payload (page layout is inspected for item tags).\r\n * @param {string[]} [customTags] - Optional per-route tags from `loaderResolver(id, { tags })`.\r\n * @returns {string[]} Tag set to persist with the cache entry.\r\n * @internal\r\n */\r\nexport function buildLoaderCacheTags(\r\n  loaderId: string,\r\n  dimensions: CacheKeyDimensions,\r\n  cacheKey: string,\r\n  loaderValue?: unknown,\r\n  customTags: string[] = []\r\n): string[] {\r\n  const tags: string[] = [\r\n    cacheKey,\r\n    buildSitecoreSiteCacheTag(dimensions.site),\r\n    buildSitecoreLocaleCacheTag(dimensions.locale),\r\n    ...customTags,\r\n  ];\r\n\r\n  if (loaderId === 'page') {\r\n    const itemTag = buildPageItemTag(loaderValue, dimensions.locale);\r\n    if (itemTag) {\r\n      tags.push(itemTag);\r\n    }\r\n  }\r\n\r\n  if (loaderId === 'dictionary') {\r\n    tags.push(\r\n      buildSitecoreDictionaryCacheTag({ site: dimensions.site, locale: dimensions.locale })\r\n    );\r\n  }\r\n\r\n  return dedupeCacheStrings(tags);\r\n}\r\n\r\n/**\r\n * Extracts a page item tag from a loader payload when layout route data is present.\r\n * @param {unknown} value - Loader result (expected to be a page shape).\r\n * @param {string} fallbackLocale - Locale used when route language is absent.\r\n * @returns {string | null} Item cache tag, or `null` when no item id is available.\r\n * @internal\r\n */\r\nfunction buildPageItemTag(value: unknown, fallbackLocale: string): string | null {\r\n  if (!value || typeof value !== 'object') {\r\n    return null;\r\n  }\r\n  const page = value as Page;\r\n  return buildSitecoreItemCacheTagFromRouteData(page.layout?.sitecore?.route, fallbackLocale);\r\n}\r\n","import type { LoaderContext } from '../../loaders/models';\r\nimport { CacheKeyDimensions } from './models';\r\nimport { dimensionsFromContext } from './utils';\r\nimport { sanitizeSitecoreCacheSegment } from './utils';\r\nimport { SITECORE_CONTENT_CACHE_TAG_PREFIX } from './cache-tags';\r\n\r\n/** Prefix for OSR-aligned loader cache keys (`sc:loader:…`). @internal */\r\nexport const CACHE_KEY_PREFIX = `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:loader`;\r\n\r\n/**\r\n * Compose the canonical cache key and dimension tuple for a loader invocation.\r\n * @param {string} loaderId - Registered loader id (`page`, `dictionary`, etc.).\r\n * @param {LoaderContext} ctx - Loader context (URL, route params, query).\r\n * @returns {{ key: string, dimensions: CacheKeyDimensions }} Cache key and parsed dimensions.\r\n * @example\r\n * ```ts\r\n * buildCacheKey('page', { url: '/about', params: { site: 'demo', locale: 'en' }, query: {} });\r\n * // → { key: 'sc:loader:page:demo:en:default:about', dimensions: { … } }\r\n * ```\r\n * @internal\r\n */\r\nexport function buildCacheKey(\r\n  loaderId: string,\r\n  ctx: LoaderContext\r\n): { key: string; dimensions: CacheKeyDimensions } {\r\n  const dimensions = dimensionsFromContext(loaderId, ctx);\r\n  const key = serializeLoaderCacheKey(dimensions);\r\n  return { key, dimensions };\r\n}\r\n\r\n/**\r\n * Serializes cache key dimensions into the public `sc:loader:…` format.\r\n * Dispatches to {@link buildPageCacheKey}, {@link buildDictionaryCacheKey}, or\r\n * {@link buildGenericLoaderCacheKey} based on `dimensions.loaderId`.\r\n * @param {CacheKeyDimensions} dimensions - Parsed cache key dimensions.\r\n * @returns {string} OSR-aligned cache key.\r\n * @internal\r\n */\r\nexport function serializeLoaderCacheKey(dimensions: CacheKeyDimensions): string {\r\n  if (dimensions.loaderId === 'page') {\r\n    return buildPageCacheKey(dimensions);\r\n  }\r\n  if (dimensions.loaderId === 'dictionary') {\r\n    return buildDictionaryCacheKey(dimensions);\r\n  }\r\n  return buildGenericLoaderCacheKey(dimensions);\r\n}\r\n\r\n/**\r\n * Page loader key: `sc:loader:page:<site>:<locale>:<variantId>:<pathKey>`.\r\n * @param {CacheKeyDimensions} dimensions - Parsed cache key dimensions.\r\n * @returns {string} Page loader cache key.\r\n * @internal\r\n */\r\nexport function buildPageCacheKey(dimensions: CacheKeyDimensions): string {\r\n  const site = sanitizeSitecoreCacheSegment(dimensions.site);\r\n  const locale = sanitizeSitecoreCacheSegment(dimensions.locale);\r\n  const variantIdSection = dimensions.variantId\r\n    ? `:${sanitizeSitecoreCacheSegment(dimensions.variantId)}`\r\n    : '';\r\n  return `${CACHE_KEY_PREFIX}:page:${site}:${locale}${variantIdSection}:${dimensions.pathKey}`;\r\n}\r\n\r\n/**\r\n * Dictionary loader key: `sc:loader:dictionary:<site>:<locale>` (one entry per site/locale).\r\n * @param {CacheKeyDimensions} dimensions - Parsed cache key dimensions.\r\n * @returns {string} Dictionary loader cache key.\r\n * @internal\r\n */\r\nexport function buildDictionaryCacheKey(dimensions: CacheKeyDimensions): string {\r\n  const site = sanitizeSitecoreCacheSegment(dimensions.site);\r\n  const locale = sanitizeSitecoreCacheSegment(dimensions.locale);\r\n  return `${CACHE_KEY_PREFIX}:dictionary:${site}:${locale}`;\r\n}\r\n\r\n/**\r\n * Generic loader key: `sc:loader:<loaderId>:<site>:<locale>:<variantId>:<pathKey>`.\r\n * Used for loaders other than `page` and `dictionary` (for example `404`, `500`).\r\n * @param {CacheKeyDimensions} dimensions - Parsed cache key dimensions.\r\n * @returns {string} Generic loader cache key.\r\n * @internal\r\n */\r\nexport function buildGenericLoaderCacheKey(dimensions: CacheKeyDimensions): string {\r\n  const loaderId = sanitizeSitecoreCacheSegment(dimensions.loaderId);\r\n  const site = sanitizeSitecoreCacheSegment(dimensions.site);\r\n  const locale = sanitizeSitecoreCacheSegment(dimensions.locale);\r\n  const variantIdSection = dimensions.variantId\r\n    ? `:${sanitizeSitecoreCacheSegment(dimensions.variantId)}`\r\n    : '';\r\n  return `${CACHE_KEY_PREFIX}:${loaderId}:${site}:${locale}${variantIdSection}:${dimensions.pathKey}`;\r\n}\r\n","import {\r\n  LoaderRunnerInit,\r\n  LoaderContext,\r\n  isLoaderRedirectResult,\r\n  LoaderCache,\r\n  LoaderDataResult,\r\n} from '../loaders/models';\r\nimport { LoaderRegistry } from '../loaders/loader-registry.token';\r\nimport { buildCacheKey } from './cache/cache-key';\r\nimport { buildLoaderCacheTags } from './cache/cache-tags';\r\nimport { AngularSitecoreConfig } from '../config/define-config';\r\n\r\n/**\r\n * Server-side cache aware loader data resolver.\r\n * LoaderResolver is exposed to both server and browser. This layer ensures browser safety and acts as connecting layer to cache.\r\n *\r\n * Resolution order when a {@link LoaderCache} is attached:\r\n * 1. **hit** — return cached value immediately.\r\n * 2. **stale** — return cached value immediately and schedule a background refresh\r\n *    (coalesced per cache key via `pendingCacheOps`).\r\n * 3. **miss** — run the loader, persist the result with OSR tags, return data.\r\n *\r\n * Redirect responses are never cached. Per-route LoaderCacheConfig overrides\r\n * from `loaderResolver(id, cacheOptions)` control TTL, tags, and opt-in caching when\r\n * the global cache is disabled.\r\n * @public\r\n */\r\nexport class ServerLoaderRunner {\r\n  /** Process-wide coalescing for stale-while-revalidate background refreshes. */\r\n  private static readonly pendingCacheOps = new Set<string>();\r\n\r\n  /**\r\n   * @param {LoaderRegistry} registry - Same loader map as `provideLoaderRegistry` / `/_data` middleware.\r\n   * @param {AngularSitecoreConfig} config - Resolved Sitecore configuration (drives default site/locale).\r\n   * @param {LoaderCache | undefined} cache - Optional cache instance from createLoaderCache.\r\n   */\r\n  constructor(\r\n    private readonly registry: LoaderRegistry,\r\n    private readonly config: AngularSitecoreConfig,\r\n    private readonly cache?: LoaderCache\r\n  ) {}\r\n\r\n  /**\r\n   * Resolve loader data with optional cache read-through and SWR refresh.\r\n   * @param {LoaderRunnerInit} init - Loader id, URL, params, server-derived request data, and cache overrides.\r\n   * @returns {Promise<LoaderDataResult>} Data, redirect, or error result for the middleware / SSR resolver.\r\n   */\r\n  async resolve(init: LoaderRunnerInit): Promise<LoaderDataResult> {\r\n    const { loaderId, url, routeParams, query, cacheOptions, csdkRequestData } = init;\r\n    const loader = this.registry[loaderId];\r\n    if (!loader) {\r\n      return { kind: 'error', status: 500, message: `No loader registered for id \"${loaderId}\"` };\r\n    }\r\n\r\n    const resolvedScParams = csdkRequestData?.scParams ?? {};\r\n\r\n    // Multisite middleware never resolves site for editing requests (it skips `/api/*`\r\n    // entirely), so the scPreviewData is the only source of the site name here.\r\n    const siteName =\r\n      resolvedScParams.siteName || csdkRequestData?.scPreviewData?.site || this.config.defaultSite;\r\n\r\n    const scParams = {\r\n      ...resolvedScParams,\r\n      siteName,\r\n    };\r\n\r\n    // ctx carries everything the loader and cache key need; only loaderId travels\r\n    // alongside it, so the init object is not passed any further.\r\n    const ctx: LoaderContext = {\r\n      url,\r\n      routeParams,\r\n      query,\r\n      scParams,\r\n      csdkRequestData: csdkRequestData ?? undefined,\r\n    };\r\n\r\n    const cacheable = this.cache && (cacheOptions?.enabled ?? this.cache.enabled());\r\n\r\n    if (cacheable) {\r\n      const { key } = buildCacheKey(loaderId, ctx);\r\n      const read = await this.cache.get(key);\r\n\r\n      if (read.kind === 'hit') {\r\n        return { kind: 'data', data: read.value };\r\n      }\r\n\r\n      if (read.kind === 'stale') {\r\n        this.scheduleBackgroundRefresh(loaderId, ctx, key, cacheOptions);\r\n        return { kind: 'data', data: read.value };\r\n      }\r\n    }\r\n\r\n    return this.runLoader({ loaderId, ctx, cacheable: !!cacheable, cacheOptions });\r\n  }\r\n\r\n  /**\r\n   * Fire-and-forget SWR refresh; skipped when a refresh is already in flight for the key.\r\n   * @param {string} loaderId - The loader id\r\n   * @param {LoaderContext} ctx - The loader context\r\n   * @param {string} cacheKey - The cache key\r\n   * @param {LoaderRunnerInit['cacheOptions']} cacheOptions - The cache options\r\n   */\r\n  private scheduleBackgroundRefresh(\r\n    loaderId: string,\r\n    ctx: LoaderContext,\r\n    cacheKey: string,\r\n    cacheOptions: LoaderRunnerInit['cacheOptions']\r\n  ): void {\r\n    if (ServerLoaderRunner.pendingCacheOps.has(cacheKey)) {\r\n      return;\r\n    }\r\n    ServerLoaderRunner.pendingCacheOps.add(cacheKey);\r\n    void this.runLoader({\r\n      loaderId,\r\n      ctx,\r\n      cacheable: true,\r\n      cacheOptions,\r\n      knownCacheKey: cacheKey,\r\n    }).then(\r\n      () => {\r\n        ServerLoaderRunner.pendingCacheOps.delete(cacheKey);\r\n      },\r\n      () => {\r\n        ServerLoaderRunner.pendingCacheOps.delete(cacheKey);\r\n      }\r\n    );\r\n  }\r\n\r\n  private async runLoader({\r\n    loaderId,\r\n    ctx,\r\n    cacheable,\r\n    cacheOptions,\r\n    knownCacheKey,\r\n  }: {\r\n    loaderId: string;\r\n    ctx: LoaderContext;\r\n    cacheable: boolean;\r\n    cacheOptions?: LoaderRunnerInit['cacheOptions'];\r\n    knownCacheKey?: string;\r\n  }): Promise<LoaderDataResult> {\r\n    const loader = this.registry[loaderId]!;\r\n\r\n    let value: unknown;\r\n    try {\r\n      value = await loader(ctx);\r\n    } catch (err) {\r\n      const message = err instanceof Error ? err.message : 'Loader failed';\r\n      return {\r\n        kind: 'error',\r\n        status: 500,\r\n        message,\r\n        ...(err instanceof Error ? { cause: err } : {}),\r\n      };\r\n    }\r\n\r\n    if (isLoaderRedirectResult(value)) {\r\n      return { kind: 'redirect', redirect: value };\r\n    }\r\n\r\n    if (cacheable && this.cache) {\r\n      const { key, dimensions } = buildCacheKey(loaderId, ctx);\r\n      const cacheKey = knownCacheKey ?? key;\r\n      const tags = buildLoaderCacheTags(\r\n        loaderId,\r\n        dimensions,\r\n        cacheKey,\r\n        value,\r\n        cacheOptions?.tags ?? []\r\n      );\r\n      const ttl = cacheOptions?.revalidate ?? this.cache.ttl;\r\n      try {\r\n        await this.cache.set(cacheKey, value, ttl, tags);\r\n      } catch (err) {\r\n        console.warn(\r\n          '[sitecore-loader-cache] background refresh failed to write cache entry:',\r\n          err instanceof Error ? err.message : err\r\n        );\r\n      }\r\n    }\r\n\r\n    return { kind: 'data', data: value };\r\n  }\r\n}\r\n","/**\r\n * Header used to propagate editing preview parameters from the editing render\r\n * middleware to the page loader via the rewritten Angular SSR request.\r\n * @public\r\n */\r\nexport const EDITING_PARAMS_HEADER = 'x-sitecore-editing-params';\r\n","import { EDITING_PARAMS_HEADER } from '../editing/constants';\r\n\r\n/**\r\n * Reads `process.env` when running under Node; otherwise returns an empty object.\r\n * process.env is only available on the server in Angular\r\n * @param {string} name - The name of the environment variable to read.\r\n * @returns {Record<string, string | undefined>} Environment map for merging into config.\r\n * @internal\r\n */\r\nexport function readProcessEnv(name: string) {\r\n  // Use globalThis so we do not need @types/node (lib tsconfig uses \"types\": []).\r\n  const env = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process\r\n    ?.env;\r\n  if (env) {\r\n    return env[name];\r\n  }\r\n  return undefined;\r\n}\r\n\r\n/**\r\n * A middleware path pattern: a `string` (matched exactly) or a `RegExp` (matched with `.test`).\r\n * @public\r\n */\r\nexport type PathPattern = string | RegExp;\r\n\r\n/**\r\n * Matches a request path against a single pattern.\r\n * A `string` pattern is compared for exact equality; a `RegExp` pattern is tested against the path.\r\n * @param {string} path - The request path to test (query string already stripped).\r\n * @param {PathPattern} pattern - Exact string or regular expression.\r\n * @returns {boolean} True if the path matches the pattern.\r\n * @internal\r\n */\r\nexport function matches(path: string, pattern: PathPattern): boolean {\r\n  return typeof pattern === 'string' ? path === pattern : pattern.test(path);\r\n}\r\n\r\n/**\r\n * Check if a request is in editing/preview mode, via the editing params header set by\r\n * {@link createEditingRenderMiddleware} on the render request.\r\n * @param {Record<string, string | string[] | undefined>} headers - Request headers\r\n * @returns {boolean} True if editing or preview mode is active\r\n * @internal\r\n */\r\nexport function isEditingPreview(\r\n  headers: Record<string, string | string[] | undefined> = {}\r\n): boolean {\r\n  return !!headers[EDITING_PARAMS_HEADER];\r\n}\r\n","import { LOADER_DATA_ENDPOINT } from '../constants';\r\nimport type { CsdkRequestData, LoaderPayload, LoaderRunnerInit } from '../../loaders/models';\r\nimport { extractRequestData } from '../../loaders/utils';\r\nimport type { ExpressRequest, ExpressResponse, MiddlewareMatcher } from './models';\r\nimport { analyticsServerAdapter } from '@sitecore-content-sdk/analytics-core';\r\nimport { matches, type PathPattern } from '../utils';\r\n\r\n/**\r\n * Whether the request is a browser loader navigation to the `/_data` endpoint (rather than a\r\n * regular SSR page request). Such requests carry their routing data in the loader payload, not in\r\n * `req.path`/`req.query`.\r\n * @param {ExpressRequest} req - Incoming request.\r\n * @param {string} [dataEndpoint] - Loader data endpoint (default `/_data`).\r\n * @returns {boolean} True for `/_data` requests.\r\n * @public\r\n */\r\nexport function isDataLoaderRequest(\r\n  req: ExpressRequest,\r\n  dataEndpoint = LOADER_DATA_ENDPOINT\r\n): boolean {\r\n  return req.path === dataEndpoint;\r\n}\r\n\r\n/**\r\n * Parses a `/_data` request (POST body or GET query) into a {@link LoaderRunnerInit}, or a\r\n * validation error. `csdkRequestData` is always server-derived via {@link extractRequestData}, so\r\n * request-data-shaped values in the payload can't spoof site/variant resolution.\r\n * @param {ExpressRequest} req - Incoming `/_data` request.\r\n * @returns {LoaderRunnerInit | { status: number; message: string }} Parsed payload or error.\r\n * @public\r\n */\r\nexport function parseLoaderRequest(\r\n  req: ExpressRequest\r\n): LoaderRunnerInit | { status: number; message: string } {\r\n  if (req.method === 'POST') {\r\n    const body = req.body as LoaderPayload;\r\n    if (!body?.loaderId) return { status: 400, message: 'Missing loaderId' };\r\n    return { ...body, csdkRequestData: extractRequestData(req) };\r\n  }\r\n  if (req.method === 'GET') {\r\n    const loaderId = String(req.query?.loaderId ?? '');\r\n    if (!loaderId) return { status: 400, message: 'Missing loaderId' };\r\n    const query: Record<string, string> = {};\r\n    for (const [key, value] of Object.entries(req.query ?? {})) {\r\n      if (key !== 'loaderId' && key !== 'url' && typeof value === 'string') query[key] = value;\r\n    }\r\n    return {\r\n      loaderId,\r\n      url: String(req.query?.url ?? ''),\r\n      routeParams: {},\r\n      query,\r\n      csdkRequestData: extractRequestData(req) ?? null,\r\n    };\r\n  }\r\n  return { status: 405, message: 'Method not allowed' };\r\n}\r\n\r\n/**\r\n * Normalized request inputs the multisite and personalize middlewares resolve against.\r\n * @public\r\n */\r\nexport interface MiddlewareRequest {\r\n  /** Target route path (query string stripped). */\r\n  path: string;\r\n  /** Target route query parameters. */\r\n  query: Record<string, string | string[] | undefined>;\r\n  /** Server-derived request data: hostname, headers, cookies, scParams, preview data. */\r\n  data: CsdkRequestData;\r\n  /** Referrer URL from the request. */\r\n  referrer?: string;\r\n}\r\n\r\n/**\r\n * Resolves the inputs the multisite/personalize middlewares should use, hiding the difference\r\n * between regular page requests and browser loader navigations. For `/_data` requests the route and\r\n * query come from the loader payload (via {@link parseLoaderRequest}); otherwise from the request\r\n * itself. Headers/cookies/hostname always come from {@link extractRequestData}, so resolution reads\r\n * the same shape either way and can then enrich `req.scParams` with site/variants.\r\n * @param {ExpressRequest} req - Incoming request.\r\n * @param {string} [dataEndpoint] - Loader data endpoint (default `/_data`).\r\n * @returns {MiddlewareRequest} Normalized path/query/data.\r\n * @public\r\n */\r\nexport function getMiddlewareRequest(\r\n  req: ExpressRequest,\r\n  dataEndpoint = LOADER_DATA_ENDPOINT\r\n): MiddlewareRequest {\r\n  const referrer = (req.headers?.referer as string | undefined) ?? req.referrer;\r\n  if (isDataLoaderRequest(req, dataEndpoint)) {\r\n    const parsed = parseLoaderRequest(req);\r\n    if ('loaderId' in parsed) {\r\n      return {\r\n        path: (parsed.url || req.path).split('?')[0],\r\n        query: parsed.query ?? {},\r\n        referrer,\r\n        data: parsed.csdkRequestData ?? extractRequestData(req),\r\n      };\r\n    }\r\n  }\r\n  return {\r\n    path: req.path,\r\n    query: req.query ?? {},\r\n    referrer,\r\n    data: extractRequestData(req),\r\n  };\r\n}\r\n\r\n/**\r\n * Server adapter request/response types derived from {@link analyticsServerAdapter}.\r\n * Avoids importing `@types/node` at middleware call sites that use {@link CsdkExpressRequest}.\r\n */\r\nexport type NodeAdapterRequest = Parameters<typeof analyticsServerAdapter>[0];\r\nexport type NodeAdapterResponse = Parameters<typeof analyticsServerAdapter>[1];\r\n\r\n/**\r\n * Express req/res are Node `IncomingMessage`/`ServerResponse` at runtime; cast for cookie adapters.\r\n * @param {ExpressRequest} req - Content SDK Express request\r\n * @param {ExpressResponse} res - Content SDK Express response\r\n * @returns {NodeAdapterRequest & NodeAdapterResponse} The Node adapter request and response\r\n */\r\nexport function toNodeAdapterPair(\r\n  req: ExpressRequest,\r\n  res: ExpressResponse\r\n): { req: NodeAdapterRequest; res: NodeAdapterResponse } {\r\n  return {\r\n    req: req as unknown as NodeAdapterRequest,\r\n    res: res as unknown as NodeAdapterResponse,\r\n  };\r\n}\r\n\r\n/**\r\n * Default patterns excluded from all middlewares. These are routes that never carry Sitecore\r\n * layout data, so site/variant resolution would only waste an Edge/CDP call.\r\n * @internal\r\n */\r\nconst DEFAULT_EXCLUDE_PATTERNS: PathPattern[] = [\r\n  /^\\/api(\\/|$)/, // API routes\r\n  /^\\/sitecore(\\/|$)/, // Sitecore-specific routes\r\n  /\\.[^/]+$/, // static files (final path segment has an extension, e.g. /assets/logo.png)\r\n];\r\n\r\n/**\r\n * Determine whether a middleware should process a request based on path matching.\r\n * Applies the default exclusions (API routes, Sitecore routes, static files) and then any custom\r\n * `excludePaths` / `includePaths` from the matcher. Editing/preview gating is handled separately by\r\n * each middleware (see {@link isEditingPreview}), not here.\r\n *\r\n * Precedence: default exclusions and `excludePaths` always win; when `includePaths` is provided the\r\n * path must additionally match at least one include pattern. Each pattern is a `string` (exact\r\n * match) or a `RegExp`.\r\n * @param {string} path - The normalized request path (query string stripped).\r\n * @param {MiddlewareMatcher} [matcher] - Custom include/exclude patterns.\r\n * @returns {boolean} True if the middleware should process this request.\r\n * @public\r\n */\r\nexport function shouldProcessPath(path: string, matcher?: MiddlewareMatcher): boolean {\r\n  if (\r\n    DEFAULT_EXCLUDE_PATTERNS.some((pattern) => matches(path, pattern)) ||\r\n    (matcher?.excludePaths && matcher.excludePaths.some((pattern) => matches(path, pattern))) ||\r\n    (matcher?.includePaths && !matcher.includePaths.some((pattern) => matches(path, pattern)))\r\n  ) {\r\n    return false;\r\n  }\r\n  return true;\r\n}\r\n","import {\r\n  LoaderApiResponse,\r\n  NotFoundNavigationError,\r\n  LoaderHttpError,\r\n  LoaderDataResult,\r\n  LoaderCache,\r\n} from '../../loaders/models';\r\nimport {\r\n  ExpressMiddleware,\r\n  ExpressNextFunction,\r\n  ExpressRequest,\r\n  ExpressResponse,\r\n} from './models';\r\nimport { LOADER_DATA_ENDPOINT } from '../constants';\r\nimport { ServerLoaderRunner } from '../server-loader-runner';\r\nimport { parseLoaderRequest } from './utils';\r\nimport { AngularSitecoreConfig } from '../../config/define-config';\r\nimport { LoaderRegistry } from '../../loaders/loader-registry.token';\r\n\r\n/**\r\n * Options for the Express data handler\r\n * @public\r\n */\r\nexport interface LoaderDataServiceOptions {\r\n  /**\r\n   * The shared loader registry (same object as provideLoaderRegistry).\r\n   */\r\n  loaders: LoaderRegistry;\r\n  /**\r\n   * Optional loader cache. When supplied, /_data responses go through\r\n   * cache-aside; omit to run loaders directly on every request.\r\n   */\r\n  cache: LoaderCache;\r\n  /**\r\n   * The endpoint path for the data handler.\r\n   * @default '/_data'\r\n   */\r\n  endpoint?: string;\r\n}\r\n\r\n/**\r\n * Map loader resolution result to wire-level API response.\r\n * @param {LoaderDataResult} result - Loader result from the shared registry\r\n * @returns {LoaderApiResponse} Wire envelope for the client\r\n */\r\nfunction toApiResponse(result: LoaderDataResult): LoaderApiResponse {\r\n  if (result.kind === 'redirect') {\r\n    return {\r\n      kind: 'redirect',\r\n      redirect: {\r\n        loaderRedirectTarget: result.redirect.loaderRedirectTarget,\r\n        status: result.redirect.status,\r\n      },\r\n    };\r\n  }\r\n\r\n  if (result.kind === 'error') {\r\n    const cause = result.cause;\r\n    if (cause instanceof NotFoundNavigationError) {\r\n      return { kind: 'notFound', status: 404 };\r\n    }\r\n    if (cause instanceof LoaderHttpError) {\r\n      return { kind: 'error', status: cause.status, message: cause.message };\r\n    }\r\n    return { kind: 'error', status: result.status, message: result.message };\r\n  }\r\n\r\n  return { kind: 'data', data: result.data };\r\n}\r\n\r\n/**\r\n * Send the loader response to Express\r\n * @param {ExpressResponse} res - Express response\r\n * @param {LoaderApiResponse} result - Loader API payload to JSON-encode\r\n */\r\nfunction sendResponse(res: ExpressResponse, result: LoaderApiResponse): void {\r\n  res.json(result);\r\n}\r\n\r\n/**\r\n * Create an Express middleware for the data endpoint.\r\n * This middleware handles both GET and POST requests at the configured endpoint path.\r\n *\r\n * The endpoint path must match the client: provide the same value to the Angular app via\r\n * FETCH_DATA_ENDPOINT (e.g. in app.config.ts). There is no Angular DI in Node/Express,\r\n * so you pass the endpoint here when calling this function (e.g. from server.ts).\r\n * @param {AngularSitecoreConfig} config - Resolved Sitecore configuration (drives default site/locale).\r\n * @param {LoaderDataServiceOptions} options - Handler options: loaders, cache, and optional endpoint (defaults to {@link LOADER_DATA_ENDPOINT})\r\n * @returns Express middleware that handles the data endpoint\r\n * @example\r\n * ```typescript\r\n * import { createExpressDataMiddleware, LOADER_DATA_ENDPOINT } from '@sitecore-content-sdk/angular';\r\n *\r\n * // Pass the same LOADERS object used with provideLoaderRegistry(LOADERS)\r\n * app.use(createExpressDataMiddleware({ loaders: LOADERS }));\r\n *\r\n * // Or pass the same endpoint you provide to the Angular app (FETCH_DATA_ENDPOINT)\r\n * const dataEndpoint = process.env.DATA_ENDPOINT ?? LOADER_DATA_ENDPOINT;\r\n * app.use(createExpressDataMiddleware({ loaders: LOADERS, endpoint: dataEndpoint }));\r\n * ```\r\n * @public\r\n */\r\nexport function createLoaderDataServiceMiddleware(\r\n  config: AngularSitecoreConfig,\r\n  options: LoaderDataServiceOptions\r\n): ExpressMiddleware {\r\n  const { loaders, cache, endpoint = LOADER_DATA_ENDPOINT } = options;\r\n  const serverLoaderRunner = new ServerLoaderRunner(loaders, config, cache);\r\n\r\n  return async (\r\n    req: ExpressRequest,\r\n    res: ExpressResponse,\r\n    next: ExpressNextFunction\r\n  ): Promise<void> => {\r\n    if (req.path !== endpoint) {\r\n      next();\r\n      return;\r\n    }\r\n    try {\r\n      const parsed = parseLoaderRequest(req);\r\n      if ('loaderId' in parsed) {\r\n        const result = toApiResponse(await serverLoaderRunner.resolve(parsed));\r\n        sendResponse(res, result);\r\n      } else {\r\n        res\r\n          .status(parsed.status)\r\n          .json({ kind: 'error', status: parsed.status, message: parsed.message });\r\n      }\r\n    } catch (error) {\r\n      const message = error instanceof Error ? error.message : 'Internal server error';\r\n      res.status(500).json({ kind: 'error', status: 500, message });\r\n    }\r\n  };\r\n}\r\n\r\n/** @public */\r\nexport const createExpressDataMiddleware = createLoaderDataServiceMiddleware;\r\n","import { buildSitecoreItemCacheTag, SITECORE_CONTENT_CACHE_TAG_PREFIX } from '../cache/cache-tags';\r\nimport { dedupeCacheStrings } from '../cache/utils';\r\n\r\n/**\r\n * One content change entry as commonly seen in Experience Edge / Content Operations payloads.\r\n * @public\r\n */\r\nexport type SitecoreEdgeRevalidateUpdate = {\r\n  identifier?: string;\r\n  entity_definition?: string;\r\n  operation?: string;\r\n  entity_culture?: string;\r\n};\r\n\r\n/**\r\n * Request body shape for webhook-driven revalidation.\r\n * @public\r\n */\r\nexport type SitecoreEdgeRevalidateRequestBody = {\r\n  invocation_id?: string;\r\n  updates?: SitecoreEdgeRevalidateUpdate[];\r\n  continues?: boolean;\r\n  tags?: string[];\r\n};\r\n\r\n/**\r\n * Strips Experience Edge style suffixes from an `identifier`.\r\n * @param {string} identifier - Raw identifier from a webhook update row.\r\n * @public\r\n */\r\nexport function extractSitecoreEdgeContentId(identifier: string): string {\r\n  if (!identifier || typeof identifier !== 'string') {\r\n    return '';\r\n  }\r\n  const trimmed = identifier.trim();\r\n  return trimmed.replace(/-(?:media|layout)$/i, '');\r\n}\r\n\r\nconst FULL_TAG_PREFIX = `${SITECORE_CONTENT_CACHE_TAG_PREFIX}:`;\r\n\r\n/**\r\n * Options for {@link collectSitecoreTagsFromEdgeRevalidateRequestBody}.\r\n * @public\r\n */\r\nexport type CollectSitecoreTagsFromEdgeBodyOptions = {\r\n  defaultLocale: string;\r\n};\r\n\r\n/**\r\n * Maps an Experience Edge webhook JSON body to Sitecore cache tag strings.\r\n *\r\n * Accepts fully qualified `sc:…` tags in `body.tags`, raw content identifiers\r\n * (with optional `-media`/`-layout` suffixes), and `updates[]` rows with\r\n * `identifier` + `entity_culture`.\r\n * @param {SitecoreEdgeRevalidateRequestBody | null | undefined} body - Parsed webhook JSON body.\r\n * @param {CollectSitecoreTagsFromEdgeBodyOptions} options - Locale fallback when an update omits `entity_culture`.\r\n * @returns {string[]} Deduplicated Sitecore cache tags ready for `LoaderCache.invalidate`.\r\n * @public\r\n */\r\nexport function collectSitecoreTagsFromEdgeRevalidateRequestBody(\r\n  body: SitecoreEdgeRevalidateRequestBody | null | undefined,\r\n  options: CollectSitecoreTagsFromEdgeBodyOptions\r\n): string[] {\r\n  const { defaultLocale } = options;\r\n  const out: string[] = [];\r\n\r\n  for (const tag of body?.tags ?? []) {\r\n    if (typeof tag !== 'string') {\r\n      continue;\r\n    }\r\n    if (!tag) {\r\n      continue;\r\n    }\r\n    if (tag.startsWith(FULL_TAG_PREFIX)) {\r\n      out.push(tag);\r\n    } else {\r\n      const id = extractSitecoreEdgeContentId(tag);\r\n      if (id) {\r\n        out.push(buildSitecoreItemCacheTag({ itemId: id, locale: defaultLocale }));\r\n      }\r\n    }\r\n  }\r\n\r\n  for (const u of body?.updates ?? []) {\r\n    const id = extractSitecoreEdgeContentId(u?.identifier ?? '');\r\n    if (!id) {\r\n      continue;\r\n    }\r\n    const locale = u?.entity_culture?.trim() || defaultLocale;\r\n    out.push(buildSitecoreItemCacheTag({ itemId: id, locale }));\r\n  }\r\n\r\n  return dedupeCacheStrings(out).filter(Boolean);\r\n}\r\n","import type { SiteInfo } from '@sitecore-content-sdk/content/site';\r\nimport { ExpressMiddleware, ExpressNextFunction, ExpressRequest, ExpressResponse } from './models';\r\nimport { LoaderCache } from '../../loaders/models';\r\nimport { buildLoaderDictionaryCacheTagsFromSites } from '../cache/cache-tags';\r\nimport { dedupeCacheStrings } from '../cache/utils';\r\nimport {\r\n  collectSitecoreTagsFromEdgeRevalidateRequestBody,\r\n  type SitecoreEdgeRevalidateRequestBody,\r\n} from './sitecore-edge-webhook-revalidation';\r\nimport { readProcessEnv } from '../utils';\r\nconst DEFAULT_SECRET_ENV_VAR = 'SITECORE_REVALIDATE_SECRET';\r\nconst DEFAULT_SECRET_HEADER = 'x-revalidate-secret';\r\nconst DEFAULT_ENDPOINT = '/api/revalidate';\r\n\r\n/**\r\n * Returns a non-empty trimmed secret, or `undefined` when unset or whitespace-only.\r\n * @param {string | undefined} secretOption - Explicit secret from handler options.\r\n * @param {string | undefined} envValue - Secret from `process.env` (e.g. `SITECORE_REVALIDATE_SECRET`).\r\n * @returns {string | undefined} The resolved secret\r\n * @internal\r\n */\r\nexport function resolveConfiguredRevalidateSecret(\r\n  secretOption: string | undefined,\r\n  envValue: string | undefined\r\n): string | undefined {\r\n  const raw = secretOption !== undefined ? secretOption : envValue;\r\n  const trimmed = raw?.trim();\r\n  return trimmed || undefined;\r\n}\r\n\r\n/**\r\n * Options for {@link createSitecoreRevalidateMiddleware}.\r\n * @public\r\n */\r\nexport interface SitecoreRevalidateMiddlewareOptions {\r\n  /** Shared cache instance from createLoaderCache call */\r\n  cache: LoaderCache;\r\n  /** Default: `process.env.SITECORE_REVALIDATE_SECRET` */\r\n  secret?: string;\r\n  /** Locale fallback when an update has no `entity_culture`; default `'en'`. */\r\n  defaultLocale?: string;\r\n  /**\r\n   * When set, every webhook also marks stale one\r\n   * `sc:loader:dictionary:<site>:<locale>` entry per site (dictionary fan-out).\r\n   */\r\n  sites?: SiteInfo[];\r\n  /** Endpoint path; default `/api/revalidate`. */\r\n  endpoint?: string;\r\n}\r\n\r\n/**\r\n * Express middleware aligned with other frameworks' `createSitecoreRevalidateRouteHandler`.\r\n *\r\n * Handles `POST /api/revalidate` (configurable via `endpoint`):\r\n * - Authenticates with `SITECORE_REVALIDATE_SECRET` / `x-revalidate-secret` when configured.\r\n * - Parses Experience Edge webhook bodies via {@link collectSitecoreTagsFromEdgeRevalidateRequestBody}.\r\n * - Optionally appends dictionary loader tags for each configured site.\r\n * - Calls `LoaderCache.invalidate` (marks entries stale; does not delete).\r\n *\r\n * Response shape: `{ revalidated, tagsCount, marked, invocation_id, continues, durationMs }`.\r\n * @param {SitecoreRevalidateMiddlewareOptions} options - The options for the middleware\r\n * @returns {ExpressMiddleware} The middleware function\r\n * @public\r\n */\r\nexport function createSitecoreRevalidateMiddleware(\r\n  options: SitecoreRevalidateMiddlewareOptions\r\n): ExpressMiddleware {\r\n  const { cache, secret, defaultLocale = 'en', sites, endpoint = DEFAULT_ENDPOINT } = options;\r\n\r\n  const dictionaryTags =\r\n    sites !== undefined\r\n      ? buildLoaderDictionaryCacheTagsFromSites({ sites, baseLocale: defaultLocale })\r\n      : [];\r\n\r\n  return async (req: ExpressRequest, res: ExpressResponse, next: ExpressNextFunction) => {\r\n    if (req.method !== 'POST' || req.path !== endpoint) {\r\n      next();\r\n      return;\r\n    }\r\n\r\n    const startTimestamp = Date.now();\r\n\r\n    try {\r\n      const configuredSecret = resolveConfiguredRevalidateSecret(\r\n        secret,\r\n        readProcessEnv(DEFAULT_SECRET_ENV_VAR)\r\n      );\r\n\r\n      const headers = req.headers as Record<string, string | string[] | undefined>;\r\n      const providedSecret = headers[DEFAULT_SECRET_HEADER];\r\n      const headerValue = Array.isArray(providedSecret) ? providedSecret[0] : providedSecret;\r\n      if (headerValue !== configuredSecret) {\r\n        res.status(401).json({ error: 'Unauthorized.' });\r\n        return;\r\n      }\r\n\r\n      const body = req.body;\r\n      if (typeof body !== 'object' || body === null || Array.isArray(body)) {\r\n        res.status(400).json({ error: 'Request body must be a JSON object.' });\r\n        return;\r\n      }\r\n\r\n      const webhookBody = body as SitecoreEdgeRevalidateRequestBody;\r\n\r\n      const tags = dedupeCacheStrings([\r\n        ...collectSitecoreTagsFromEdgeRevalidateRequestBody(webhookBody, { defaultLocale }),\r\n        ...dictionaryTags,\r\n      ]);\r\n\r\n      if (tags.length === 0) {\r\n        res.status(400).json({\r\n          error:\r\n            'Provide non-empty `updates` (with identifiers) and/or `tags` that resolve to at least one cache tag.',\r\n        });\r\n        return;\r\n      }\r\n\r\n      const marked = await cache.invalidate({ tags });\r\n\r\n      res.status(200).json({\r\n        revalidated: true,\r\n        tagsCount: tags.length,\r\n        marked,\r\n        invocation_id: webhookBody.invocation_id ?? null,\r\n        continues: webhookBody.continues ?? false,\r\n        durationMs: Date.now() - startTimestamp,\r\n      });\r\n    } catch (error) {\r\n      console.error('Sitecore revalidate middleware failed:', error);\r\n      res.status(500).json({ error: 'Internal Server Error.' });\r\n    }\r\n  };\r\n}\r\n","import { debug as coreDebug, Debugger } from '@sitecore-content-sdk/core';\r\nimport { debug as contentDebug } from '@sitecore-content-sdk/content';\r\n\r\n/**\r\n * Unified debug object containing all debug namespaces from referenced content-sdk packages.\r\n * @public\r\n */\r\nconst debug: Record<string, Debugger> = {\r\n  ...coreDebug,\r\n  ...contentDebug,\r\n};\r\n\r\nexport default debug;\r\n","import {\r\n  EDITING_ALLOWED_ORIGINS,\r\n  QUERY_PARAM_EDITING_SECRET,\r\n} from '@sitecore-content-sdk/content/editing';\r\nimport { EditMode } from '@sitecore-content-sdk/content/layout';\r\nimport { getEnforcedCorsHeaders } from '@sitecore-content-sdk/core/tools';\r\nimport type { Metadata } from '@sitecore-content-sdk/core/node-tools';\r\nimport { ExpressMiddleware, ExpressNextFunction, ExpressRequest, ExpressResponse } from './models';\r\nimport type { ComponentMap } from '../../components/types';\r\nimport { readProcessEnv } from '../utils';\r\nimport debug from '../../debug';\r\n\r\nconst DEFAULT_ENDPOINT = '/api/editing/config';\r\nconst EMPTY_METADATA: Metadata = { packages: {} };\r\n\r\n/**\r\n * Factory that dynamically imports application metadata (typically\r\n * `.sitecore/metadata.json` emitted by `sitecore-tools`).\r\n * @public\r\n */\r\nexport type MetadataImportFn = () => Promise<{ default: Metadata } | Metadata>;\r\n\r\n/**\r\n * Options for {@link createEditingConfigMiddleware}.\r\n * @public\r\n */\r\nexport interface CreateEditingConfigMiddlewareOptions {\r\n  /**\r\n   * Component map registered with the Angular app\r\n   * (the same map provided to `SITECORE_COMPONENT_MAP`).\r\n   */\r\n  components: ComponentMap;\r\n  /**\r\n   * Inline metadata. When set, {@link metadataImport} is ignored.\r\n   * When neither `metadata` nor `metadataImport` is provided, the middleware\r\n   * responds with `{ packages: {} }`.\r\n   */\r\n  metadata?: Metadata;\r\n  /**\r\n   * Optional dynamic import for metadata (e.g. from `.sitecore/metadata.json`).\r\n   * Use {@link createSitecoreMetadataImport} to build the conventional path\r\n   * relative to `server.ts`. Import failures fall back to empty packages.\r\n   */\r\n  metadataImport?: MetadataImportFn;\r\n  /**\r\n   * Editing secret to validate. Defaults to the `SITECORE_EDITING_SECRET`\r\n   * environment variable.\r\n   */\r\n  editingSecret?: string;\r\n  /** Endpoint path; default `/api/editing/config`. */\r\n  endpoint?: string;\r\n}\r\n\r\n/**\r\n * Builds a dynamic import factory for `.sitecore/metadata.json` relative to the\r\n * server entry module (`import.meta.url`).\r\n * @param {string} serverModuleUrl - Pass `import.meta.url` from `server.ts`.\r\n * @param {string} [relativePath] - Path relative to the server module.\r\n * @returns {MetadataImportFn} Import factory for {@link createEditingConfigMiddleware}.\r\n * @public\r\n */\r\nexport function createSitecoreMetadataImport(\r\n  serverModuleUrl: string,\r\n  relativePath = '../.sitecore/metadata.json'\r\n): MetadataImportFn {\r\n  const metadataUrl = new URL(relativePath, serverModuleUrl).href;\r\n  return () => import(/* @vite-ignore */ metadataUrl);\r\n}\r\n\r\n/**\r\n * Resolves the configured editing secret with fallback to env.\r\n * @param {string | undefined} option - Explicit secret from middleware options.\r\n * @returns {string | undefined} Resolved secret value.\r\n * @internal\r\n */\r\nexport function resolveConfiguredEditingSecret(option: string | undefined): string | undefined {\r\n  const raw = option !== undefined ? option : readProcessEnv('SITECORE_EDITING_SECRET');\r\n  const trimmed = raw?.trim();\r\n  return trimmed || undefined;\r\n}\r\n\r\n/**\r\n * Normalizes a dynamic import result into {@link Metadata}.\r\n * @param {unknown} module - Imported module value.\r\n * @returns {Metadata} Parsed metadata or empty packages.\r\n * @internal\r\n */\r\nexport function normalizeImportedMetadata(module: unknown): Metadata {\r\n  if (!module || typeof module !== 'object') {\r\n    return EMPTY_METADATA;\r\n  }\r\n  const record = module as { default?: Metadata; packages?: Metadata['packages'] };\r\n  const data = record.default ?? record;\r\n  return {\r\n    packages: { ...(data.packages ?? {}) },\r\n  };\r\n}\r\n\r\n/**\r\n * Express middleware that serves the editing config endpoint\r\n * (default path: `/api/editing/config`). Returns the registered component names,\r\n * package versions, and the configured edit mode.\r\n * @param {CreateEditingConfigMiddlewareOptions} options - Middleware options.\r\n * @returns {ExpressMiddleware} The middleware function.\r\n * @public\r\n */\r\nexport function createEditingConfigMiddleware(\r\n  options: CreateEditingConfigMiddlewareOptions\r\n): ExpressMiddleware {\r\n  const {\r\n    components,\r\n    metadata: inlineMetadata,\r\n    metadataImport,\r\n    endpoint = DEFAULT_ENDPOINT,\r\n  } = options;\r\n\r\n  let cachedMetadata: Metadata | undefined = inlineMetadata;\r\n  let metadataLoadPromise: Promise<Metadata> | undefined;\r\n\r\n  const resolveMetadata = (): Promise<Metadata> => {\r\n    if (cachedMetadata) {\r\n      return Promise.resolve(cachedMetadata);\r\n    }\r\n    if (!metadataLoadPromise) {\r\n      metadataLoadPromise = (async () => {\r\n        if (!metadataImport) {\r\n          cachedMetadata = EMPTY_METADATA;\r\n          return cachedMetadata;\r\n        }\r\n        try {\r\n          const loaded = await metadataImport();\r\n          cachedMetadata = normalizeImportedMetadata(loaded);\r\n          debug.editing('metadata import succeeded: %o', {\r\n            packages: Object.keys(cachedMetadata.packages).length,\r\n          });\r\n        } catch (err) {\r\n          debug.editing('metadata import failed, using empty packages: %o', err);\r\n          cachedMetadata = EMPTY_METADATA;\r\n        }\r\n        return cachedMetadata;\r\n      })();\r\n    }\r\n    return metadataLoadPromise;\r\n  };\r\n\r\n  return async (req: ExpressRequest, res: ExpressResponse, next: ExpressNextFunction) => {\r\n    if (req.path !== endpoint) {\r\n      next();\r\n      return;\r\n    }\r\n\r\n    debug.editing('editing config middleware start: %o', {\r\n      method: req.method,\r\n      query: req.query,\r\n      headers: req.headers,\r\n    });\r\n\r\n    const corsHeaders = getEnforcedCorsHeaders({\r\n      requestMethod: req.method,\r\n      headers: (req.headers ?? {}) as Record<string, string | string[] | undefined>,\r\n      allowedOrigins: EDITING_ALLOWED_ORIGINS,\r\n    });\r\n\r\n    if (!corsHeaders) {\r\n      debug.editing(\r\n        'invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable'\r\n      );\r\n      res.status(401).json({ message: 'Invalid origin' });\r\n      return;\r\n    }\r\n\r\n    if (typeof res.setHeader === 'function') {\r\n      Object.keys(corsHeaders).forEach((key) => {\r\n        res.setHeader!(key, corsHeaders[key]);\r\n      });\r\n    }\r\n\r\n    const query = (req.query ?? {}) as Record<string, string | string[] | undefined>;\r\n    const secretParam = query[QUERY_PARAM_EDITING_SECRET];\r\n    const secret = Array.isArray(secretParam) ? secretParam[0] : secretParam;\r\n    const configuredSecret = resolveConfiguredEditingSecret(options.editingSecret);\r\n\r\n    if (!configuredSecret || secret !== configuredSecret) {\r\n      debug.editing('invalid editing secret - sent \"%s\" expected \"%s\"', secret, configuredSecret);\r\n      res.status(401).json({ message: 'Missing or invalid editing secret' });\r\n      return;\r\n    }\r\n\r\n    if (req.method === 'OPTIONS') {\r\n      debug.editing('preflight request');\r\n      res.status(204);\r\n      if (typeof res.send === 'function') {\r\n        res.send(null);\r\n      } else {\r\n        res.json(null);\r\n      }\r\n      return;\r\n    }\r\n\r\n    const metadata = await resolveMetadata();\r\n\r\n    debug.editing('editing config response: %o', {\r\n      components: components.size,\r\n      packages: Object.keys(metadata.packages).length,\r\n    });\r\n\r\n    res.status(200).json({\r\n      components: Array.from(components.keys()),\r\n      packages: { ...metadata.packages },\r\n      editMode: EditMode.Metadata,\r\n    });\r\n  };\r\n}\r\n","import {\r\n  EDITING_ALLOWED_ORIGINS,\r\n  EditingPreviewData,\r\n  QUERY_PARAM_EDITING_SECRET,\r\n} from '@sitecore-content-sdk/content/editing';\r\nimport { DEFAULT_VARIANT } from '@sitecore-content-sdk/content/personalize';\r\nimport { getAllowedOriginsFromEnv, getEnforcedCorsHeaders } from '@sitecore-content-sdk/core/tools';\r\nimport { ExpressMiddleware, ExpressNextFunction, ExpressRequest, ExpressResponse } from './models';\r\nimport { readProcessEnv } from '../utils';\r\nimport { resolveConfiguredEditingSecret } from './editing-config-middleware';\r\nimport debug from '../../debug';\r\nimport { EDITING_PARAMS_HEADER } from '../../editing/constants';\r\n\r\nconst DEFAULT_ENDPOINT = '/api/editing/render';\r\n\r\n/**\r\n * Specification for an additional query parameter to forward into the editing\r\n * preview data.\r\n * @public\r\n */\r\nexport interface AllowedQueryParam {\r\n  name: string;\r\n  required?: boolean;\r\n}\r\n\r\n/**\r\n * Resolver function: receives the names of every query parameter on the\r\n * incoming editing request and returns the list of parameters to forward.\r\n * @public\r\n */\r\nexport type AllowedQueryParamsResolver = (\r\n  queryParams: string[]\r\n) => Array<AllowedQueryParam | string>;\r\n\r\n/**\r\n * Allowed query parameters configuration for {@link createEditingRenderMiddleware}.\r\n * Either an array of parameter names / specs, or a resolver function.\r\n * @public\r\n */\r\nexport type AllowedQueryParams = Array<AllowedQueryParam | string> | AllowedQueryParamsResolver;\r\n\r\n/**\r\n * Options for {@link createEditingRenderMiddleware}.\r\n * @public\r\n */\r\nexport interface CreateEditingRenderMiddlewareOptions {\r\n  /**\r\n   * Editing secret to validate. Defaults to the `SITECORE_EDITING_SECRET`\r\n   * environment variable.\r\n   */\r\n  editingSecret?: string;\r\n  /** Endpoint path; default `/api/editing/render`. */\r\n  endpoint?: string;\r\n  /**\r\n   * Allows apps to remap the editor's `route` query parameter to their own URL\r\n   * shape (e.g. injecting a locale prefix).\r\n   * @param {string} itemPath - Decoded route from the query parameter.\r\n   * @param {EditingPreviewData} previewData - Preview data parsed from the request.\r\n   * @returns {string} The route the Angular SSR engine should render.\r\n   */\r\n  resolvePageUrl?: (itemPath: string, previewData: EditingPreviewData) => string;\r\n  /**\r\n   * Extra query parameters propagated into the editing preview data\r\n   * (e.g. deployment-protection bypass tokens).\r\n   */\r\n  allowedQueryParams?: AllowedQueryParams;\r\n}\r\n\r\n/**\r\n * Editing-aware request. The render middleware attaches `scEditing` to allow\r\n * downstream code to detect the editing branch without reparsing headers.\r\n * @public\r\n */\r\nexport interface ExpressEditingRequest extends ExpressRequest {\r\n  scEditing?: EditingPreviewData;\r\n}\r\n\r\nconst REQUIRED_PARAMS = ['sc_site', 'sc_itemid', 'sc_lang', 'route', 'mode'] as const;\r\n\r\n/**\r\n * Build the {@link EditingPreviewData} payload from the request query string.\r\n * @param {Record<string, string | undefined>} query - Query parameters.\r\n * @param {Record<string, unknown>} allowedQueryParams - Extra forwarded parameters.\r\n * @returns {EditingPreviewData} Preview data for `SitecoreClient.getPreview`.\r\n * @internal\r\n */\r\nfunction buildPreviewData(\r\n  query: Record<string, string | undefined>,\r\n  allowedQueryParams: Record<string, unknown>\r\n): EditingPreviewData {\r\n  const variantId = query.sc_variant ?? DEFAULT_VARIANT;\r\n  return {\r\n    site: String(query.sc_site ?? ''),\r\n    itemId: String(query.sc_itemid ?? ''),\r\n    language: String(query.sc_lang ?? ''),\r\n    mode: String(query.mode ?? '') as EditingPreviewData['mode'],\r\n    variantId,\r\n    version: query.sc_version,\r\n    layoutKind: query.sc_layoutKind as EditingPreviewData['layoutKind'],\r\n    ...(query.sc_previewTime && { previewTime: query.sc_previewTime }),\r\n    ...allowedQueryParams,\r\n  };\r\n}\r\n\r\n/**\r\n * Resolve the list of additional query parameters to forward and the names of\r\n * any required ones that are missing.\r\n * @param {Record<string, string | string[] | undefined>} queryParams - Incoming query.\r\n * @param {AllowedQueryParams} [allowedParams] - Configuration.\r\n * @returns {{ allowedQueryParams: Record<string, unknown>; missingAllowedParams: string[] }} Result.\r\n * @internal\r\n */\r\nfunction resolveAllowedQueryParams(\r\n  queryParams: Record<string, string | string[] | undefined>,\r\n  allowedParams?: AllowedQueryParams\r\n): { allowedQueryParams: Record<string, unknown>; missingAllowedParams: string[] } {\r\n  const list =\r\n    typeof allowedParams === 'function'\r\n      ? allowedParams(Object.keys(queryParams))\r\n      : Array.isArray(allowedParams)\r\n      ? allowedParams\r\n      : [];\r\n\r\n  const allowedQueryParams: Record<string, unknown> = {};\r\n  const missingAllowedParams: string[] = [];\r\n\r\n  for (const param of list) {\r\n    const name = typeof param === 'string' ? param : param.name;\r\n    const required = typeof param === 'string' ? false : param.required;\r\n    const value = queryParams[name];\r\n    if (value !== undefined) {\r\n      allowedQueryParams[name] = value;\r\n    } else if (required) {\r\n      missingAllowedParams.push(name);\r\n    }\r\n  }\r\n\r\n  return { allowedQueryParams, missingAllowedParams };\r\n}\r\n\r\n/**\r\n * Build the `Content-Security-Policy` value (`frame-ancestors …`) so the\r\n * editor iframe can frame our pages.\r\n * @returns {string} CSP header value.\r\n * @internal\r\n */\r\nfunction buildCSPHeader(): string {\r\n  return `frame-ancestors 'self' ${[...getAllowedOriginsFromEnv(), ...EDITING_ALLOWED_ORIGINS].join(\r\n    ' '\r\n  )}`;\r\n}\r\n\r\n/**\r\n * Express middleware that handles the editing render endpoint\r\n * (default path: `/api/editing/render`). On a valid editor request, it\r\n * validates CORS + secret + required params, stashes the preview data on the\r\n * request, sets the CSP header, rewrites `req.url` to the target route, and\r\n * hands the request off to the Angular SSR pipeline via `next()`.\r\n *\r\n * No internal HTTP fetch is performed - the editing\r\n * payload travels alongside the Express request through the existing\r\n * middleware chain.\r\n * @param {CreateEditingRenderMiddlewareOptions} [options] - Middleware options.\r\n * @returns {ExpressMiddleware} The middleware function.\r\n * @public\r\n */\r\nexport function createEditingRenderMiddleware(\r\n  options?: CreateEditingRenderMiddlewareOptions\r\n): ExpressMiddleware {\r\n  const endpoint = options?.endpoint ?? DEFAULT_ENDPOINT;\r\n\r\n  return async (req: ExpressRequest, res: ExpressResponse, next: ExpressNextFunction) => {\r\n    if (req.path !== endpoint) {\r\n      next();\r\n      return;\r\n    }\r\n\r\n    try {\r\n      debug.editing('editing render middleware start: %o', {\r\n        method: req.method,\r\n        query: req.query,\r\n        headers: req.headers,\r\n      });\r\n\r\n      const corsHeaders = getEnforcedCorsHeaders({\r\n        requestMethod: req.method,\r\n        headers: (req.headers ?? {}) as Record<string, string | string[] | undefined>,\r\n        allowedOrigins: EDITING_ALLOWED_ORIGINS,\r\n      });\r\n\r\n      if (!corsHeaders) {\r\n        debug.editing(\r\n          'invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable'\r\n        );\r\n        const origin = (req.headers ?? {}).origin;\r\n        res.status(401).json({ error: `Requests from origin ${origin} not allowed` });\r\n        return;\r\n      }\r\n\r\n      if (typeof res.setHeader === 'function') {\r\n        Object.keys(corsHeaders).forEach((key) => {\r\n          res.setHeader!(key, corsHeaders[key]);\r\n        });\r\n      }\r\n\r\n      const query = (req.query ?? {}) as Record<string, string | string[] | undefined>;\r\n      const secretParam = query[QUERY_PARAM_EDITING_SECRET];\r\n      const secret = Array.isArray(secretParam) ? secretParam[0] : secretParam;\r\n      const configuredSecret =\r\n        resolveConfiguredEditingSecret(options?.editingSecret) ??\r\n        readProcessEnv('SITECORE_EDITING_SECRET');\r\n\r\n      if (!configuredSecret || secret !== configuredSecret) {\r\n        debug.editing('invalid editing secret - sent \"%s\" expected \"%s\"', secret, configuredSecret);\r\n        res.status(401).json({ error: 'Missing or invalid secret' });\r\n        return;\r\n      }\r\n\r\n      if (req.method === 'OPTIONS') {\r\n        debug.editing('preflight request');\r\n        res.status(204);\r\n        if (typeof res.send === 'function') {\r\n          res.send(null);\r\n        } else {\r\n          res.json(null);\r\n        }\r\n        return;\r\n      }\r\n\r\n      if (req.method !== 'GET') {\r\n        debug.editing('invalid method - sent %s expected GET', req.method);\r\n        if (typeof res.setHeader === 'function') {\r\n          res.setHeader('Allow', 'GET');\r\n        }\r\n        res.status(405).json({ error: `Invalid request method '${req.method}'` });\r\n        return;\r\n      }\r\n\r\n      const startTimestamp = Date.now();\r\n\r\n      const flatQuery: Record<string, string | undefined> = {};\r\n      for (const [key, value] of Object.entries(query)) {\r\n        flatQuery[key] = Array.isArray(value) ? value[0] : value;\r\n      }\r\n\r\n      const missingRequired = REQUIRED_PARAMS.filter((p) => !flatQuery[p]);\r\n      const { allowedQueryParams, missingAllowedParams } = resolveAllowedQueryParams(\r\n        query,\r\n        options?.allowedQueryParams\r\n      );\r\n\r\n      if (missingRequired.length || missingAllowedParams.length) {\r\n        const missing = [...missingRequired, ...missingAllowedParams];\r\n        debug.editing('missing required query parameters: %o', missing);\r\n        res.status(400).json({\r\n          error: `Missing required query parameters: ${missing.join(', ')}`,\r\n        });\r\n        return;\r\n      }\r\n\r\n      const previewData = buildPreviewData(flatQuery, allowedQueryParams);\r\n\r\n      if (typeof res.setHeader === 'function') {\r\n        res.setHeader('Content-Security-Policy', buildCSPHeader());\r\n      }\r\n\r\n      const decodedRoute = flatQuery.route ?? '';\r\n      const targetRoute =\r\n        options?.resolvePageUrl?.(decodedRoute, previewData) ??\r\n        `/${previewData.language}${decodedRoute.startsWith('/') ? '' : '/'}${decodedRoute}`;\r\n      const encodedRoute = encodeURI(targetRoute);\r\n\r\n      debug.editing('rewriting request to page route %s', targetRoute);\r\n\r\n      const editingReq = req as ExpressEditingRequest;\r\n      editingReq.scEditing = previewData;\r\n      if (!editingReq.headers) {\r\n        editingReq.headers = {};\r\n      }\r\n      editingReq.headers[EDITING_PARAMS_HEADER] = JSON.stringify(previewData);\r\n\r\n      editingReq.url = encodedRoute;\r\n      // Preserve method as GET for downstream Angular SSR.\r\n      editingReq.method = 'GET';\r\n\r\n      debug.editing('editing render middleware end in %dms: %o', Date.now() - startTimestamp, {\r\n        route: targetRoute,\r\n      });\r\n\r\n      next();\r\n    } catch (err) {\r\n      const message = err instanceof Error ? err.message : String(err);\r\n      debug.editing('editing render middleware error: %o', err);\r\n      // eslint-disable-next-line no-console\r\n      console.error('[editing-render] failed to handle editing request', err);\r\n      res.status(500).json({ error: message });\r\n    }\r\n  };\r\n}\r\n","import type { SitecoreClient, SitemapXmlOptions } from '@sitecore-content-sdk/content/client';\r\nimport type { SiteInfo } from '@sitecore-content-sdk/content/site';\r\nimport { SiteResolver } from '@sitecore-content-sdk/content/site';\r\nimport { constants } from '@sitecore-content-sdk/core';\r\nimport { ExpressMiddleware, ExpressRequest, ExpressResponse } from './models';\r\nimport debug from '../../debug';\r\n\r\nconst { ERROR_MESSAGES } = constants;\r\n\r\n/** @public */\r\nexport interface CreateSitemapMiddlewareOptions {\r\n  client: SitecoreClient;\r\n  sites: SiteInfo[];\r\n}\r\n\r\n/**\r\n * Sitemap handler for Express. Mount at `/sitemap.xml` and `/sitemap-:id.xml`.\r\n * @param {CreateSitemapMiddlewareOptions} options - Middleware options.\r\n * @public\r\n */\r\nexport function createSitemapMiddleware(\r\n  options: CreateSitemapMiddlewareOptions\r\n): ExpressMiddleware {\r\n  const { client, sites } = options;\r\n  const siteResolver = new SiteResolver(sites);\r\n\r\n  return async (req: ExpressRequest, res: ExpressResponse): Promise<void> => {\r\n    const idFromQuery = Array.isArray(req.query?.id) ? req.query.id[0] : req.query?.id;\r\n    const id = req.params?.id ?? idFromQuery ?? undefined;\r\n    const headers = req.headers ?? {};\r\n    const reqHost = headers['x-forwarded-host'] || headers.host || '';\r\n    const reqProtocol = headers['x-forwarded-proto'] || 'https';\r\n    const site = siteResolver.getByHost(String(reqHost));\r\n\r\n    const sitemapOptions: SitemapXmlOptions = {\r\n      reqHost: String(reqHost),\r\n      reqProtocol: String(reqProtocol),\r\n      id,\r\n      siteName: site.name,\r\n    };\r\n\r\n    const startTimestamp = Date.now();\r\n\r\n    debug.sitemap('sitemap middleware start: %o', sitemapOptions);\r\n\r\n    try {\r\n      const xmlContent = await client.getSiteMap(sitemapOptions);\r\n\r\n      debug.sitemap('sitemap middleware end in %dms', Date.now() - startTimestamp);\r\n\r\n      res.setHeader?.('Content-Type', 'text/xml;charset=utf-8');\r\n      res.send?.(xmlContent);\r\n    } catch (error) {\r\n      debug.sitemap('sitemap middleware error: %o', error);\r\n\r\n      if (error instanceof Error && error.message === 'REDIRECT_404') {\r\n        res.redirect?.('/404');\r\n      } else {\r\n        res.status(500).send?.(`Internal Server Error. ${ERROR_MESSAGES.CONTACT_SUPPORT}`);\r\n      }\r\n    }\r\n  };\r\n}\r\n","import type { SitecoreClient } from '@sitecore-content-sdk/content/client';\r\nimport type { SiteInfo } from '@sitecore-content-sdk/content/site';\r\nimport { SiteResolver } from '@sitecore-content-sdk/content/site';\r\nimport { constants } from '@sitecore-content-sdk/core';\r\nimport { ExpressMiddleware, ExpressRequest, ExpressResponse } from './models';\r\nimport debug from '../../debug';\r\n\r\nconst { ERROR_MESSAGES } = constants;\r\n\r\n/** @public */\r\nexport interface CreateRobotsMiddlewareOptions {\r\n  client: SitecoreClient;\r\n  sites: SiteInfo[];\r\n}\r\n\r\n/**\r\n * Robots.txt handler for Express. Mount at `/robots.txt`.\r\n * @param {CreateRobotsMiddlewareOptions} options - Middleware options.\r\n * @public\r\n */\r\nexport function createRobotsMiddleware(\r\n  options: CreateRobotsMiddlewareOptions\r\n): ExpressMiddleware {\r\n  const { client, sites } = options;\r\n  const siteResolver = new SiteResolver(sites);\r\n\r\n  return async (req: ExpressRequest, res: ExpressResponse): Promise<void> => {\r\n    res.setHeader?.('Content-Type', 'text/plain');\r\n\r\n    const headers = req.headers ?? {};\r\n    const hostName =\r\n      headers['x-forwarded-host'] || String(headers.host ?? '').split(':')[0] || 'localhost';\r\n    const site = siteResolver.getByHost(String(hostName));\r\n\r\n    const startTimestamp = Date.now();\r\n\r\n    debug.robots('robots middleware start: %o', { hostName, siteName: site.name });\r\n\r\n    try {\r\n      const robotsContent = await client.getRobots(site.name);\r\n\r\n      debug.robots('robots middleware end in %dms', Date.now() - startTimestamp);\r\n\r\n      if (!robotsContent) {\r\n        res.status(404).send?.('User-agent: *\\nDisallow: /');\r\n        return;\r\n      }\r\n      res.status(200).send?.(robotsContent);\r\n    } catch (error) {\r\n      debug.robots('robots middleware error: %o', error);\r\n\r\n      res.status(500).send?.(`Internal Server Error. ${ERROR_MESSAGES.CONTACT_SUPPORT}`);\r\n    }\r\n  };\r\n}\r\n","/**\r\n * Request header carrying the middleware-resolved Content SDK request params\r\n * (site name, variant ids) from Express middlewares to the loader pipeline.\r\n * Custom Express request properties don't survive Angular's conversion of the\r\n * incoming request to a web `Request` (the SSR `REQUEST` token), so the params\r\n * also ride this header — the same mechanism `x-sitecore-editing-params` uses.\r\n * @public\r\n */\r\nexport const SC_PARAMS_HEADER = 'x-sitecore-params';\r\n","import {\r\n  getHostnameFromHostHeader,\r\n  SITE_KEY,\r\n  SiteInfo,\r\n  SiteResolver,\r\n} from '@sitecore-content-sdk/content/site';\r\nimport {\r\n  ExpressMiddleware,\r\n  ExpressNextFunction,\r\n  ExpressResponse,\r\n  CookieOptions,\r\n  BaseMiddlewareOptions,\r\n  ExpressRequest,\r\n  CsdkExpressRequest,\r\n} from './models';\r\nimport { SC_PARAMS_HEADER } from '../../loaders/constants';\r\nimport debug from '../../debug';\r\nimport { getMiddlewareRequest, shouldProcessPath } from './utils';\r\nimport { isEditingPreview } from '../utils';\r\nimport { AngularSitecoreConfig } from '../../config';\r\n\r\n/**\r\n * Configuration options for the multisite middleware.\r\n * @public\r\n */\r\nexport type MultisiteMiddlewareOptions = BaseMiddlewareOptions &\r\n  AngularSitecoreConfig['multisite'] & {\r\n    /** Sites to resolve the site from */\r\n    sites?: SiteInfo[];\r\n    /** Default site to use if no site is resolved */\r\n    defaultSite?: string;\r\n  };\r\n\r\nconst hostnameMatcher = /(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}/;\r\n\r\n/**\r\n * Get the hostname from the request.\r\n * @param {ExpressRequest} req - The request.\r\n * @returns {string} The hostname.\r\n */\r\nexport function getHostname(req: ExpressRequest): string {\r\n  return getHostnameFromHostHeader(\r\n    (req.headers?.['x-forwarded-host'] as string | undefined) ||\r\n      (req.headers?.host as string | undefined) ||\r\n      hostnameMatcher.exec(req.url ?? '')?.[0] ||\r\n      '*'\r\n  );\r\n}\r\n\r\n/**\r\n * Create the multisite middleware.\r\n * @param {MultisiteMiddlewareOptions} options - The options.\r\n * @returns {ExpressMiddleware} The multisite middleware.\r\n */\r\nexport function createMultisiteMiddleware(options: MultisiteMiddlewareOptions): ExpressMiddleware {\r\n  const siteResolver = new SiteResolver(options.sites ?? []);\r\n  return (req: ExpressRequest, res: ExpressResponse, next: ExpressNextFunction) => {\r\n    try {\r\n      // For browser loader navigations (/_data) routing data comes from the loader payload, not\r\n      // the request; getMiddlewareRequest normalizes both into path/query/data.\r\n      const { path, query, data } = getMiddlewareRequest(req as CsdkExpressRequest);\r\n\r\n      if (options.enabled === false) {\r\n        debug.multisite('multisite middleware disabled');\r\n        return next();\r\n      }\r\n\r\n      if (isEditingPreview(data.headers)) {\r\n        debug.multisite('skipped (editing/preview mode)');\r\n        return next();\r\n      }\r\n\r\n      if (!shouldProcessPath(path, options.matcher)) {\r\n        debug.multisite(\r\n          'multisite middleware skipped (path does not match provided include/exclude patterns)'\r\n        );\r\n        return next();\r\n      }\r\n\r\n      if (options.skip?.(req)) {\r\n        debug.multisite('multisite middleware skipped (skip predicate)');\r\n        return next();\r\n      }\r\n      const startTimestamp = Date.now();\r\n      debug.multisite('multisite middleware start: %o', {\r\n        path,\r\n        headers: data.headers,\r\n        cookies: data.cookies,\r\n        query,\r\n      });\r\n      let resolvedSite: string;\r\n      const hostname = data.hostname || getHostname(req);\r\n\r\n      resolvedSite =\r\n        (query[SITE_KEY] as string | undefined) ||\r\n        (query.site as string | undefined) ||\r\n        (options.useCookieResolution &&\r\n          options.useCookieResolution(req) &&\r\n          (data.cookies?.[SITE_KEY] as string | undefined)) ||\r\n        siteResolver.getByHost(hostname).name;\r\n\r\n      if (!resolvedSite) {\r\n        resolvedSite = options.defaultSite ?? '';\r\n      }\r\n      (req as CsdkExpressRequest).scParams = {\r\n        ...((req as CsdkExpressRequest).scParams || {}),\r\n        siteName: resolvedSite,\r\n      };\r\n      // Also ride the params on a header so they survive Angular's conversion of the\r\n      // Express request to a web Request on the SSR path (same mechanism as editing params).\r\n      req.headers = req.headers ?? {};\r\n      req.headers[SC_PARAMS_HEADER] = JSON.stringify((req as CsdkExpressRequest).scParams);\r\n      debug.multisite('multisite middleware end in %dms: %o', Date.now() - startTimestamp, {\r\n        resolvedSite,\r\n      });\r\n      if (res.cookie) {\r\n        const defaultCookieAttributes = {\r\n          secure: true,\r\n          httpOnly: true,\r\n          sameSite: 'none',\r\n        } as CookieOptions;\r\n        res.cookie(SITE_KEY, resolvedSite, defaultCookieAttributes);\r\n      } else {\r\n        debug.multisite(\r\n          'could not set site cookie, response does not support cookies. Enable cookieParser in your server configuration to changes this.'\r\n        );\r\n      }\r\n    } catch (error) {\r\n      console.log('Multisite middleware failed:');\r\n      console.log(error);\r\n    }\r\n    next();\r\n  };\r\n}\r\n","import type { UrlMatcher, UrlMatchResult, UrlSegment } from '@angular/router';\r\n\r\n/**\r\n * Result of locale extraction from a URL path.\r\n * @public\r\n */\r\nexport interface LocaleExtractionResult {\r\n  /** Configured locale found at the start of the path, or `null` when absent. */\r\n  locale: string | null;\r\n  /** Remainder of the path after the locale segment (always starts with `/`). */\r\n  nonLocalePath: string;\r\n  /** Query or fragment string found at the end of the path, or `null` when absent. */\r\n  queryFragment?: string;\r\n}\r\n\r\n/**\r\n * Parses a normalized pathname into its first segment, remainder path, and query/fragment suffix.\r\n * Groups: (1) first segment, (2) rest of path including leading slash, (3) ?query and/or #fragment.\r\n */\r\nconst PATH_PARTS_REGEX = /^\\/([^/?#]*)(\\/[^?#]*)?([?#].*)?$/;\r\n\r\n/**\r\n * Extracts a configured locale from the first segment of a URL pathname.\r\n * Returns `{ locale: null, nonLocalePath: pathname, queryFragment: query or fragment string }` when the first segment is not a configured locale.\r\n * @param {string} pathname - URL pathname, with or without leading `/`.\r\n * @param {string[]} locales - Configured locales.\r\n * @returns {LocaleExtractionResult} Detected locale and the rest of the path.\r\n * @public\r\n */\r\nexport function splitLocaleFromPath(pathname: string, locales: string[]): LocaleExtractionResult {\r\n  if (!pathname) {\r\n    return { locale: null, nonLocalePath: '/' };\r\n  }\r\n  const normalized = pathname.startsWith('/') ? pathname : `/${pathname}`;\r\n  const [, firstSegment = '', restPath = '', queryFragment = undefined] =\r\n    normalized.match(PATH_PARTS_REGEX) ?? [];\r\n\r\n  if (firstSegment && locales.includes(firstSegment)) {\r\n    return { locale: firstSegment, nonLocalePath: restPath || '/', queryFragment };\r\n  }\r\n  return { locale: null, nonLocalePath: `/${firstSegment}${restPath}`, queryFragment };\r\n}\r\n\r\n/**\r\n * Creates an Angular {@link UrlMatcher} that consumes a configured-locale segment from\r\n * the start of a route. When the first URL segment matches one of scConfig's `locales`, it is consumed\r\n * and exposed as the `locale` route param. Otherwise zero segments are consumed and the\r\n * route still matches (so error routes and the catchall handle both prefixed and unprefixed\r\n * URLs from the same route tree).\r\n * @param {string[]} locales - Configured locales.\r\n * @returns {UrlMatcher} Angular URL matcher for locale-prefixed route trees.\r\n * @public\r\n */\r\nexport function scLocaleMatcher(locales: string[]): UrlMatcher {\r\n  return (segments: UrlSegment[]): UrlMatchResult => {\r\n    if (segments.length > 0 && locales.includes(segments[0].path)) {\r\n      return { consumed: [segments[0]], posParams: { locale: segments[0] } };\r\n    }\r\n    return { consumed: [] };\r\n  };\r\n}\r\n\r\n/**\r\n * Resolves the initial URL pathname from the current execution environment.\r\n * Returns `'/'` when neither REQUEST nor `window.location` is available.\r\n * @param {Request | null} req - SSR REQUEST token value, when present.\r\n * @param {boolean} isBrowser - Whether the current platform is the browser.\r\n * @returns {string} URL pathname suitable for locale extraction.\r\n */\r\nexport function resolveCurrentPath(req: Request | null, isBrowser: boolean): string {\r\n  if (req) {\r\n    try {\r\n      return new URL(req.url).pathname;\r\n    } catch {\r\n      // fall through to browser/default\r\n    }\r\n  }\r\n  if (isBrowser && typeof window !== 'undefined' && window.location) {\r\n    return window.location.pathname;\r\n  }\r\n  return '/';\r\n}\r\n","import {\r\n  CdpHelper,\r\n  DEFAULT_VARIANT,\r\n  getGroomedVariantIds,\r\n  PersonalizeInfo,\r\n  PersonalizeService,\r\n} from '@sitecore-content-sdk/content/personalize';\r\nimport { SITE_KEY } from '@sitecore-content-sdk/content/site';\r\nimport { SitecoreConfig } from '@sitecore-content-sdk/content/config';\r\nimport { createGraphQLClientFactory } from '@sitecore-content-sdk/content/client';\r\nimport { initContentSdk } from '@sitecore-content-sdk/core';\r\nimport { analyticsPlugin, analyticsServerAdapter } from '@sitecore-content-sdk/analytics-core';\r\nimport { BOT_DETECTION_COOKIE } from '@sitecore-content-sdk/analytics-core/internal';\r\nimport {\r\n  personalize,\r\n  personalizeServerPlugin,\r\n  personalizeServerAdapter,\r\n} from '@sitecore-content-sdk/personalize';\r\nimport {\r\n  CsdkExpressRequest,\r\n  ExpressMiddleware,\r\n  ExpressNextFunction,\r\n  ExpressResponse,\r\n  BaseMiddlewareOptions,\r\n  ExpressRequest,\r\n} from './models';\r\nimport { splitLocaleFromPath } from '../../i18n/locale-utils';\r\nimport { SC_PARAMS_HEADER } from '../../loaders/constants';\r\nimport { getMiddlewareRequest, shouldProcessPath, toNodeAdapterPair } from './utils';\r\nimport debug from '../../debug';\r\nimport { isEditingPreview } from '../utils';\r\n\r\n/**\r\n * Object model of Experience Context data\r\n * @public\r\n */\r\nexport type ExperienceParams = {\r\n  referrer: string;\r\n  utm: {\r\n    [key: string]: string | undefined;\r\n    campaign: string | undefined;\r\n    source: string | undefined;\r\n    medium: string | undefined;\r\n    content: string | undefined;\r\n  };\r\n};\r\n\r\n/**\r\n * Represents the geolocation data used for personalization\r\n * @public\r\n */\r\nexport type PersonalizeGeoData = {\r\n  city?: string;\r\n  country?: string;\r\n  region?: string;\r\n};\r\n\r\n/**\r\n * Configuration for the personalize middleware\r\n * @public\r\n */\r\nexport type PersonalizeMiddlewareOptions = BaseMiddlewareOptions &\r\n  Partial<SitecoreConfig['personalize']> &\r\n  Partial<SitecoreConfig['api']['edge']> & {\r\n    /** Locales used to extract the language from the request path */\r\n    locales?: string[];\r\n    /** Fallback language when the request path has no locale prefix. Default is `'en'` */\r\n    defaultLanguage?: string;\r\n    /** Fallback site name when not resolved by the multisite middleware or site cookie */\r\n    defaultSite?: string;\r\n    /** Override the personalize service instance */\r\n    personalizeService?: PersonalizeService;\r\n    /** Get extra UTM parameters from the request */\r\n    getExtraUtmParams?: (req: ExpressRequest) => Partial<ExperienceParams['utm']>;\r\n    /** Extract geolocation data from the request */\r\n    extractGeoDataCb?: (req: ExpressRequest) => Promise<PersonalizeGeoData> | PersonalizeGeoData;\r\n    /**\r\n     * Skip personalization for bot requests marked by the bot tracking middleware. Default `true`.\r\n     */\r\n    skipForBot?: boolean;\r\n  };\r\n\r\ntype PersonalizeExecution = {\r\n  friendlyId: string;\r\n  variantIds: string[];\r\n};\r\n\r\nconst isPrefetch = (req: ExpressRequest): boolean =>\r\n  [req.headers?.purpose, req.headers?.['sec-purpose']].some(\r\n    (header) => typeof header === 'string' && header.includes('prefetch')\r\n  );\r\n\r\nconst getExperienceParams = (\r\n  query: Record<string, string | string[] | undefined>,\r\n  referrer: string,\r\n  extraUtmParams: Partial<ExperienceParams['utm']> = {}\r\n): ExperienceParams => {\r\n  const utmParam = (name: string) => {\r\n    const value = query[name];\r\n    return (Array.isArray(value) ? value[0] : value) || undefined;\r\n  };\r\n  return {\r\n    referrer,\r\n    utm: {\r\n      campaign: utmParam('utm_campaign'),\r\n      content: utmParam('utm_content'),\r\n      medium: utmParam('utm_medium'),\r\n      source: utmParam('utm_source'),\r\n      ...extraUtmParams,\r\n    },\r\n  };\r\n};\r\n\r\n/**\r\n * Aggregates personalize executions (friendly id + variant ids) for the route,\r\n * grouping page-level (\"<VariantID>\") and component-level (\"<ComponentID>_<VariantID>\") variants.\r\n * @param {PersonalizeInfo} personalizeInfo the route personalize information\r\n * @param {string} language the language\r\n * @param {string} [scope] optional Sitecore Personalize scope\r\n * @returns {PersonalizeExecution[]} An array of personalize executions\r\n */\r\nconst getPersonalizeExecutions = (\r\n  personalizeInfo: PersonalizeInfo,\r\n  language: string,\r\n  scope?: string\r\n): PersonalizeExecution[] =>\r\n  personalizeInfo.variantIds.reduce<PersonalizeExecution[]>((results, variantId) => {\r\n    const isComponentVariant = variantId.includes('_');\r\n    const componentId = variantId.split('_')[0];\r\n    const friendlyId = isComponentVariant\r\n      ? CdpHelper.getComponentFriendlyId(personalizeInfo.pageId, componentId, language, scope)\r\n      : CdpHelper.getPageFriendlyId(personalizeInfo.pageId, language, scope);\r\n    const execution = results.find((x) => x.friendlyId === friendlyId);\r\n    if (execution) {\r\n      execution.variantIds.push(variantId);\r\n    } else {\r\n      results.push({\r\n        friendlyId,\r\n        // The default/control variant (\"<ComponentID>_default\") is also a valid execution result\r\n        variantIds: isComponentVariant\r\n          ? [`${componentId}${DEFAULT_VARIANT}`, variantId]\r\n          : [variantId],\r\n      });\r\n    }\r\n    return results;\r\n  }, []);\r\n\r\n/**\r\n * Middleware to support Sitecore Personalize.\r\n * Identifies page/component variants for the request via Sitecore CDP and populates\r\n * `req.scParams.variantId` and `req.scParams.componentVariantIds` for downstream layout personalization.\r\n * @param {PersonalizeMiddlewareOptions} options personalize middleware options\r\n * @returns {ExpressMiddleware} Express middleware\r\n * @public\r\n */\r\nexport function createPersonalizeMiddleware(\r\n  options: PersonalizeMiddlewareOptions\r\n): ExpressMiddleware {\r\n  const personalizeService =\r\n    options.personalizeService ??\r\n    (options.contextId || options.clientContextId\r\n      ? new PersonalizeService({\r\n          clientFactory: createGraphQLClientFactory({\r\n            api: {\r\n              edge: {\r\n                contextId: options.contextId as string,\r\n                clientContextId: options.clientContextId,\r\n                edgeUrl: options.edgeUrl,\r\n              },\r\n            },\r\n          }),\r\n          timeout: options.edgeTimeout,\r\n          scope: options.scope,\r\n          fetch: fetch,\r\n        })\r\n      : null);\r\n\r\n  if (!personalizeService) {\r\n    console.warn(\r\n      '[PersonalizeMiddleware] Personalize middleware requires Edge configuration (contextId/clientContextId). ' +\r\n        'Personalize features will be disabled. This is expected in local container development.'\r\n    );\r\n  }\r\n\r\n  return async (req: ExpressRequest, res: ExpressResponse, next: ExpressNextFunction) => {\r\n    try {\r\n      // `enabled` defaults to true: omitting it keeps the middleware on (see BaseMiddlewareOptions).\r\n      if (options.enabled === false || !personalizeService) {\r\n        debug.personalize('personalize middleware disabled or not configured');\r\n        return next();\r\n      }\r\n      // For browser loader navigations (/_data) routing data comes from the loader payload, not\r\n      // the request; getMiddlewareRequest normalizes both into path/query/data.\r\n      const { path, query, data } = getMiddlewareRequest(req);\r\n\r\n      if (isEditingPreview(data.headers)) {\r\n        debug.personalize('skipped (editing/preview mode)');\r\n        return next();\r\n      }\r\n\r\n      if (!shouldProcessPath(path, options.matcher)) {\r\n        debug.personalize('personalize middleware skipped (path does not match)');\r\n        return next();\r\n      }\r\n\r\n      if (options.skip?.(req)) {\r\n        debug.personalize('personalize middleware skipped (skip predicate)');\r\n        return next();\r\n      }\r\n\r\n      // Skip personalization for bot requests marked by the bot tracking middleware.\r\n      if ((options.skipForBot ?? true) && data.cookies?.[BOT_DETECTION_COOKIE]) {\r\n        debug.personalize('skipped (bot request)');\r\n        return next();\r\n      }\r\n\r\n      const startTimestamp = Date.now();\r\n      const { locale, nonLocalePath } = splitLocaleFromPath(path, options.locales ?? []);\r\n      const language = locale || options.defaultLanguage || 'en';\r\n      const siteName =\r\n        (req as CsdkExpressRequest).scParams?.siteName ||\r\n        data.cookies?.[SITE_KEY] ||\r\n        options.defaultSite;\r\n      const hostHeader = data.headers?.['x-forwarded-host'] ?? data.headers?.host;\r\n      const hostname =\r\n        (Array.isArray(hostHeader) ? hostHeader[0] : hostHeader)?.split(':')[0] || 'localhost';\r\n\r\n      debug.personalize('personalize middleware start: %o', {\r\n        path: nonLocalePath,\r\n        language,\r\n        siteName,\r\n        hostname,\r\n        headers: req.headers,\r\n      });\r\n\r\n      if (!siteName) {\r\n        debug.personalize('skipped (site could not be resolved)');\r\n        return next();\r\n      }\r\n\r\n      // Get personalization info from Experience Edge\r\n      const personalizeInfo = await personalizeService.getPersonalizeInfo(\r\n        nonLocalePath,\r\n        language,\r\n        siteName\r\n      );\r\n      if (!personalizeInfo) {\r\n        // Likely an invalid route / language\r\n        debug.personalize('skipped (personalize info not found)');\r\n        return next();\r\n      }\r\n      if (personalizeInfo.variantIds.length === 0) {\r\n        debug.personalize('skipped (no personalization configured)');\r\n        return next();\r\n      }\r\n\r\n      if (isPrefetch(req)) {\r\n        // Personalized, but this is a prefetch request.\r\n        // Don't execute a personalize request; otherwise, the metrics for component A/B experiments would be inaccurate.\r\n        // Disable caching to force revalidation on navigation (personalization WILL be influenced).\r\n        debug.personalize('skipped (prefetch)');\r\n        res.setHeader?.('x-proxy-cache', 'no-cache');\r\n        res.setHeader?.('Cache-Control', 'no-store, must-revalidate');\r\n        return next();\r\n      }\r\n\r\n      // Express req/res are http.IncomingMessage/ServerResponse at runtime; the minimal\r\n      // Express interfaces don't declare that, so cast for the cookie-based server adapters.\r\n      const { req: httpReq, res: httpRes } = toNodeAdapterPair(req as CsdkExpressRequest, res);\r\n      await initContentSdk({\r\n        config: {\r\n          contextId: options.contextId as string,\r\n          edgeUrl: options.edgeUrl,\r\n          siteName,\r\n        },\r\n        plugins: [\r\n          analyticsPlugin({\r\n            options: {\r\n              enableCookie: true,\r\n              cookieDomain: hostname,\r\n            },\r\n            // personalize middleware will only run on server for Angular and we explicitly use server adapters\r\n            adapter: analyticsServerAdapter(httpReq, httpRes),\r\n          }),\r\n          personalizeServerPlugin({\r\n            options: {\r\n              enablePersonalizeCookie: true,\r\n            },\r\n            adapter: personalizeServerAdapter(httpReq, httpRes),\r\n          }),\r\n        ],\r\n      });\r\n\r\n      const geo = options.extractGeoDataCb ? await options.extractGeoDataCb(req) : undefined;\r\n      const params = getExperienceParams(\r\n        query,\r\n        (data.referrer as string) || (data.headers?.referer as string) || '',\r\n        options.getExtraUtmParams?.(req)\r\n      );\r\n      const executions = getPersonalizeExecutions(personalizeInfo, language, options.scope);\r\n      const identifiedVariantIds: string[] = [];\r\n\r\n      await Promise.all(\r\n        executions.map(async (execution) => {\r\n          debug.personalize('executing experience for %s %o', execution.friendlyId, params);\r\n          const personalization = (await personalize(\r\n            {\r\n              channel: options.channel || 'WEB',\r\n              currency: options.currency ?? 'USD',\r\n              friendlyId: execution.friendlyId,\r\n              params,\r\n              language,\r\n              pageVariantIds: execution.variantIds,\r\n              ...(geo && { geo }),\r\n            },\r\n            { timeout: options.cdpTimeout }\r\n          )) as { variantId?: string } | null;\r\n          const variantId = personalization?.variantId;\r\n          if (!variantId) return;\r\n          if (!execution.variantIds.includes(variantId)) {\r\n            debug.personalize('invalid variant %s', variantId);\r\n          } else {\r\n            identifiedVariantIds.push(variantId);\r\n          }\r\n        })\r\n      );\r\n\r\n      if (identifiedVariantIds.length === 0) {\r\n        debug.personalize('skipped (no variant(s) identified)');\r\n        return next();\r\n      }\r\n\r\n      const { variantId, componentVariantIds } = getGroomedVariantIds(identifiedVariantIds);\r\n      (req as CsdkExpressRequest).scParams = {\r\n        ...((req as CsdkExpressRequest).scParams || {}),\r\n        variantId,\r\n        componentVariantIds,\r\n      };\r\n      // Also ride the params on a header so they survive Angular's conversion of the\r\n      // Express request to a web Request on the SSR path (same mechanism as editing params).\r\n      req.headers = req.headers ?? {};\r\n      req.headers[SC_PARAMS_HEADER] = JSON.stringify((req as CsdkExpressRequest).scParams);\r\n\r\n      debug.personalize('personalize middleware end in %dms: %o', Date.now() - startTimestamp, {\r\n        variantId,\r\n        componentVariantIds,\r\n      });\r\n    } catch (error) {\r\n      console.log('Personalize middleware failed:');\r\n      console.log(error);\r\n    }\r\n    next();\r\n  };\r\n}\r\n","import {\r\n  breakDownPath,\r\n  isAbsoluteTarget,\r\n  matchFromRedirectMapRedirect,\r\n  matchRedirectItemRedirect,\r\n  processAbsoluteUrlTarget,\r\n  processRelativeUrlTarget,\r\n  resolveRedirectTarget,\r\n  RedirectResult,\r\n  RedirectsService,\r\n  REDIRECT_TYPE_301,\r\n  REDIRECT_TYPE_302,\r\n  REDIRECT_TYPE_SERVER_TRANSFER,\r\n  SITE_KEY,\r\n  SiteInfo,\r\n  SiteResolver,\r\n} from '@sitecore-content-sdk/content/site';\r\nimport { createGraphQLClientFactory } from '@sitecore-content-sdk/content/client';\r\nimport {\r\n  BaseMiddlewareOptions,\r\n  CsdkExpressRequest,\r\n  ExpressMiddleware,\r\n  ExpressNextFunction,\r\n  ExpressRequest,\r\n  ExpressResponse,\r\n} from './models';\r\nimport { getMiddlewareRequest, isDataLoaderRequest, shouldProcessPath } from './utils';\r\nimport { splitLocaleFromPath } from '../../i18n/locale-utils';\r\nimport { isEditingPreview } from '../utils';\r\nimport type { LoaderApiResponse, LoaderPayload } from '../../loaders/models';\r\nimport debug from '../../debug';\r\nimport { AngularSitecoreConfig } from '../../config';\r\n\r\n/**\r\n * Configuration for the redirects middleware.\r\n * @public\r\n */\r\nexport type RedirectsMiddlewareOptions = BaseMiddlewareOptions &\r\n  Partial<AngularSitecoreConfig['api']['edge']> &\r\n  Partial<AngularSitecoreConfig['api']['local']> &\r\n  AngularSitecoreConfig['redirects'] &\r\n  Pick<AngularSitecoreConfig['angular'], 'locales'> & {\r\n    /** Fallback language when the request path has no locale prefix. Default is `'en'`. */\r\n    defaultLanguage?: string;\r\n    /** Fallback site name when not resolved by the multisite middleware or site cookie. */\r\n    defaultSite?: string;\r\n    /** Sites used to resolve the site's default language for the `$siteLang` token. */\r\n    sites?: SiteInfo[];\r\n    /** Override the redirects service instance (e.g. for testing). */\r\n    redirectsService?: RedirectsService;\r\n  };\r\n\r\nconst isPrefetch = (req: ExpressRequest): boolean =>\r\n  [req.headers?.purpose, req.headers?.['sec-purpose']].some(\r\n    (header) => typeof header === 'string' && header.includes('prefetch')\r\n  );\r\n\r\n/**\r\n * Serializes an Express query object back into a query string (without a leading `?`).\r\n * @param {Record<string, string | string[] | undefined>} query - Express query object.\r\n * @returns {string} Query string.\r\n */\r\nconst serializeQuery = (query: Record<string, string | string[] | undefined>): string => {\r\n  const params = new URLSearchParams();\r\n  for (const [key, value] of Object.entries(query)) {\r\n    if (value === undefined) continue;\r\n    if (Array.isArray(value)) {\r\n      value.forEach((entry) => params.append(key, entry));\r\n    } else {\r\n      params.append(key, value);\r\n    }\r\n  }\r\n  return params.toString();\r\n};\r\n\r\n/**\r\n * Builds the redirects service from the middleware options:\r\n * uses an injected service when provided, otherwise requires Edge (contextId/clientContextId) or\r\n * local (apiHost/apiKey) API config. Returns `null` (disabling the middleware) when neither is set.\r\n * @param {RedirectsMiddlewareOptions} options - Middleware options.\r\n * @returns {RedirectsService | null} The redirects service or `null` when not configured.\r\n */\r\nconst resolveRedirectsService = (options: RedirectsMiddlewareOptions): RedirectsService | null => {\r\n  if (options.redirectsService) {\r\n    return options.redirectsService;\r\n  }\r\n\r\n  const hasEdgeConfig = !!(options.contextId || options.clientContextId);\r\n  const hasLocalConfig = !!(options.apiHost && options.apiKey);\r\n\r\n  if (!hasEdgeConfig && !hasLocalConfig) {\r\n    console.warn(\r\n      '[RedirectsMiddleware] Redirects middleware requires either Edge configuration (contextId/clientContextId) or local API configuration (apiHost/apiKey). ' +\r\n        'Redirects features will be disabled. This is expected when API configuration is not available.'\r\n    );\r\n    return null;\r\n  }\r\n\r\n  const graphQLOptions = {\r\n    api: {\r\n      edge: {\r\n        contextId: options.contextId!,\r\n        clientContextId: options.clientContextId,\r\n        edgeUrl: options.edgeUrl,\r\n      },\r\n      ...(options.apiHost && options.apiKey\r\n        ? {\r\n            local: {\r\n              apiHost: options.apiHost,\r\n              apiKey: options.apiKey,\r\n              path: options.path,\r\n            },\r\n          }\r\n        : {}),\r\n    },\r\n  };\r\n\r\n  return new RedirectsService({\r\n    ...options,\r\n    clientFactory: createGraphQLClientFactory(graphQLOptions),\r\n    fetch: fetch,\r\n  });\r\n};\r\n\r\n/**\r\n * Middleware to support Sitecore redirects on the Angular Express SSR server.\r\n *\r\n * Fetches redirects for the resolved site, matches the incoming request against locale-versioned\r\n * and redirect-map (static/regex) rules using the shared redirect utilities, and dispatches a\r\n * 301/302 redirect or an internal server-transfer rewrite. Fails open (`next()`) on any error so a\r\n * misconfigured redirect never takes the site down.\r\n *\r\n * Must run after the multisite middleware (which resolves `scParams.siteName`) and before the\r\n * Angular SSR handler.\r\n * @param {RedirectsMiddlewareOptions} options - Redirects middleware options.\r\n * @returns {ExpressMiddleware} Express middleware.\r\n * @public\r\n */\r\nexport function createRedirectsMiddleware(options: RedirectsMiddlewareOptions): ExpressMiddleware {\r\n  const redirectsService = resolveRedirectsService(options);\r\n  const locales = options.locales ?? [];\r\n  const siteResolver = new SiteResolver(options.sites ?? []);\r\n\r\n  return async (req: ExpressRequest, res: ExpressResponse, next: ExpressNextFunction) => {\r\n    try {\r\n      // `enabled` defaults to true: omitting it keeps the middleware on (see BaseMiddlewareOptions).\r\n      if (options.enabled === false || !redirectsService) {\r\n        debug.redirects('redirects middleware disabled or not configured');\r\n        return next();\r\n      }\r\n\r\n      // For browser loader navigations (/_data) routing data comes from the loader payload, not\r\n      // the request; getMiddlewareRequest normalizes both into path/query/data.\r\n      const { path, query, data } = getMiddlewareRequest(req);\r\n\r\n      if (isEditingPreview(data.headers)) {\r\n        debug.redirects('skipped (editing/preview mode)');\r\n        return next();\r\n      }\r\n\r\n      // Path matching also covers static files (paths with an extension), API and Sitecore routes.\r\n      if (!shouldProcessPath(path, options.matcher)) {\r\n        debug.redirects('redirects middleware skipped (path does not match)');\r\n        return next();\r\n      }\r\n\r\n      if (options.skip?.(req)) {\r\n        debug.redirects('redirects middleware skipped (skip predicate)');\r\n        return next();\r\n      }\r\n\r\n      if (isPrefetch(req)) {\r\n        // Don't burden the redirects service with prefetch traffic; disable caching so the\r\n        // real navigation still evaluates redirects.\r\n        debug.redirects('skipped (prefetch)');\r\n        res.setHeader?.('x-proxy-cache', 'no-cache');\r\n        res.setHeader?.('Cache-Control', 'no-store, must-revalidate');\r\n        return next();\r\n      }\r\n\r\n      const startTimestamp = Date.now();\r\n      const { locale } = splitLocaleFromPath(path, locales);\r\n      const language = locale || options.defaultLanguage || 'en';\r\n      const siteName =\r\n        (req as CsdkExpressRequest).scParams?.siteName ||\r\n        data.cookies?.[SITE_KEY] ||\r\n        options.defaultSite;\r\n\r\n      debug.redirects('redirects middleware start: %o', { path, language, siteName });\r\n\r\n      if (!siteName) {\r\n        debug.redirects('skipped (site could not be resolved)');\r\n        return next();\r\n      }\r\n\r\n      const incomingURL = path;\r\n      const incomingQS = serializeQuery(query);\r\n\r\n      const existsRedirect = await getExistsRedirect(\r\n        redirectsService,\r\n        siteName,\r\n        language,\r\n        locales,\r\n        incomingURL,\r\n        incomingQS\r\n      );\r\n\r\n      if (!existsRedirect) {\r\n        debug.redirects('skipped (redirect does not exist)');\r\n        return next();\r\n      }\r\n\r\n      debug.redirects('Matched redirect rule: %o', { existsRedirect });\r\n\r\n      const incomingPathData = breakDownPath(locales, incomingURL);\r\n      incomingPathData.queryString = incomingQS || undefined;\r\n\r\n      // Site's default language drives the `$siteLang` token; fall back to the request language.\r\n      const siteLanguage = siteResolver.getByName(siteName)?.language || language;\r\n      existsRedirect.target = resolveRedirectTarget(existsRedirect, siteLanguage, incomingURL);\r\n\r\n      // Browser loader navigations (POST/GET /_data) can't be driven by an HTTP redirect: the\r\n      // client fetch would silently follow it. For those we answer through the loader-data channel\r\n      // so the client-side router performs the navigation (see dispatchRedirect).\r\n      const loaderDataRequest = isDataLoaderRequest(req);\r\n\r\n      if (isAbsoluteTarget(existsRedirect.target)) {\r\n        const targetUrl = processAbsoluteUrlTarget(incomingPathData, existsRedirect);\r\n        dispatchRedirect(\r\n          targetUrl,\r\n          existsRedirect.redirectType,\r\n          req,\r\n          res,\r\n          next,\r\n          true,\r\n          loaderDataRequest\r\n        );\r\n      } else {\r\n        const { targetLocale, targetPath } = processRelativeUrlTarget(\r\n          incomingPathData,\r\n          existsRedirect,\r\n          locales,\r\n          language\r\n        );\r\n        // Angular is locale-in-path, but a locale-less request must stay locale-less when the\r\n        // target resolves to the same locale (e.g. `isLanguagePreserved` on a `/foo` → `/bar`\r\n        // rule). Only prefix the locale segment when the origin was already locale-prefixed, or\r\n        // the target locale actually differs from the request locale.\r\n        const incomingHadLocale = !!incomingPathData.locale;\r\n        const localeChanged = targetLocale.toLowerCase() !== language.toLowerCase();\r\n        const shouldPrefixLocale =\r\n          !!targetLocale && locales.length > 0 && (incomingHadLocale || localeChanged);\r\n        const finalPath = shouldPrefixLocale ? `/${targetLocale}${targetPath}` : targetPath;\r\n        dispatchRedirect(\r\n          finalPath,\r\n          existsRedirect.redirectType,\r\n          req,\r\n          res,\r\n          next,\r\n          false,\r\n          loaderDataRequest\r\n        );\r\n      }\r\n\r\n      debug.redirects('redirects middleware end in %dms', Date.now() - startTimestamp);\r\n    } catch (error) {\r\n      console.log('Redirects middleware failed:');\r\n      console.log(error);\r\n      next();\r\n    }\r\n  };\r\n}\r\n\r\n/**\r\n * Finds a matching redirect for the incoming request, mirroring `RedirectsProxy.getExistsRedirect`:\r\n * locale-versioned item rules take precedence over redirect-map (static/regex) rules.\r\n * @param {RedirectsService} service - Redirects service.\r\n * @param {string} siteName - Resolved site name.\r\n * @param {string} language - Request language used to match versioned rules.\r\n * @param {string[]} locales - Configured locales.\r\n * @param {string} incomingURL - Request pathname (no query string).\r\n * @param {string} incomingQS - Request query string (without leading `?`).\r\n * @returns {Promise<RedirectResult | undefined>} Matched redirect or `undefined`.\r\n */\r\nasync function getExistsRedirect(\r\n  service: RedirectsService,\r\n  siteName: string,\r\n  language: string,\r\n  locales: string[],\r\n  incomingURL: string,\r\n  incomingQS: string\r\n): Promise<RedirectResult | undefined> {\r\n  const redirects = await service.fetchRedirects(siteName);\r\n\r\n  // strip trailing slashes and lowercase to compare against locale-less patterns\r\n  const normalizedPath = incomingURL.replace(/\\/*$/gi, '').toLowerCase();\r\n  const { nonLocalePath } = breakDownPath(locales, normalizedPath);\r\n  const matchedLocaleRedirect = matchRedirectItemRedirect(redirects, language, nonLocalePath);\r\n  if (matchedLocaleRedirect) {\r\n    return matchedLocaleRedirect;\r\n  }\r\n\r\n  const incomingPathData = breakDownPath(locales, incomingURL);\r\n  incomingPathData.queryString = incomingQS || undefined;\r\n  return matchFromRedirectMapRedirect(redirects, language, incomingPathData);\r\n}\r\n\r\n/**\r\n * Rewrites the loader request URL for a `/_data` navigation so the loader-data-service middleware\r\n * resolves the target route's data (server-transfer / silent rewrite — the browser URL is unchanged).\r\n * @param {ExpressRequest} req - Incoming `/_data` request.\r\n * @param {string} target - Target loader URL (path with optional query string).\r\n */\r\nfunction setLoaderRequestUrl(req: ExpressRequest, target: string): void {\r\n  if (req.method === 'POST' && req.body && typeof req.body === 'object') {\r\n    (req.body as LoaderPayload).url = target;\r\n  } else if (req.method === 'GET') {\r\n    req.query = { ...req.query, url: target };\r\n  }\r\n}\r\n\r\n/**\r\n * Dispatches the resolved redirect through the right channel.\r\n *\r\n * Regular page requests:\r\n * - 301/302 → `res.redirect(status, target)`.\r\n * - SERVER_TRANSFER (internal) → rewrite `req.url`/`req.path` + `next()` so the SSR handler renders\r\n *   the target route without changing the browser URL.\r\n *\r\n * Browser loader navigations (`/_data`) can't follow an HTTP redirect, so they answer through the\r\n * loader-data envelope instead:\r\n * - 301/302 → `{ kind: 'redirect' }` so the client router navigates (internal) or the page reloads\r\n *   (external, via `applyRedirect`).\r\n * - SERVER_TRANSFER (internal) → rewrite the loader payload URL + `next()` so the loader-data-service\r\n *   returns the target route's data while the browser URL stays put.\r\n *\r\n * External absolute targets can't be internally transferred, so SERVER_TRANSFER to an external URL\r\n * falls back to a temporary (302) redirect.\r\n * @param {string} target - Final redirect target (absolute URL or path).\r\n * @param {string} type - Redirect type constant.\r\n * @param {ExpressRequest} req - Incoming request.\r\n * @param {ExpressResponse} res - Response.\r\n * @param {ExpressNextFunction} next - Next function.\r\n * @param {boolean} isExternal - Whether the target is an external absolute URL.\r\n * @param {boolean} isDataRequest - Whether this is a `/_data` loader navigation.\r\n */\r\nfunction dispatchRedirect(\r\n  target: string,\r\n  type: string,\r\n  req: ExpressRequest,\r\n  res: ExpressResponse,\r\n  next: ExpressNextFunction,\r\n  isExternal: boolean,\r\n  isDataRequest: boolean\r\n): void {\r\n  const respondRedirect = (status: number): void => {\r\n    if (isDataRequest) {\r\n      const payload: LoaderApiResponse = {\r\n        kind: 'redirect',\r\n        redirect: { loaderRedirectTarget: target, status },\r\n      };\r\n      res.json(payload);\r\n      return;\r\n    }\r\n    res.redirect?.(status, target);\r\n  };\r\n\r\n  switch (type) {\r\n    case REDIRECT_TYPE_301:\r\n      respondRedirect(301);\r\n      return;\r\n    case REDIRECT_TYPE_302:\r\n      respondRedirect(302);\r\n      return;\r\n    case REDIRECT_TYPE_SERVER_TRANSFER: {\r\n      // External targets can't be rewritten internally; fall back to a temporary redirect.\r\n      if (isExternal) {\r\n        respondRedirect(302);\r\n        return;\r\n      }\r\n      // Internal rewrite: render the target route without changing the browser URL.\r\n      if (isDataRequest) {\r\n        // for _data requests, rewrite URL in payload, so loader-data-service resolves the new target route's data\r\n        setLoaderRequestUrl(req, target);\r\n      } else {\r\n        const [pathname] = target.split('?');\r\n        req.url = target;\r\n        req.path = pathname;\r\n      }\r\n      next();\r\n      return;\r\n    }\r\n    default:\r\n      next();\r\n  }\r\n}\r\n","import { initContentSdk } from '@sitecore-content-sdk/core';\r\nimport { SitecoreConfig } from '@sitecore-content-sdk/content/config';\r\nimport { SITE_KEY } from '@sitecore-content-sdk/content/site';\r\nimport { analyticsPlugin, analyticsServerAdapter } from '@sitecore-content-sdk/analytics-core';\r\nimport { BOT_DETECTION_COOKIE, isBot } from '@sitecore-content-sdk/analytics-core/internal';\r\nimport { botPageView, eventsPlugin } from '@sitecore-content-sdk/events';\r\nimport {\r\n  BaseMiddlewareOptions,\r\n  CsdkExpressRequest,\r\n  ExpressMiddleware,\r\n  ExpressNextFunction,\r\n  ExpressRequest,\r\n  ExpressResponse,\r\n} from './models';\r\nimport { getMiddlewareRequest, shouldProcessPath, toNodeAdapterPair } from './utils';\r\nimport { isEditingPreview } from '../utils';\r\nimport { splitLocaleFromPath } from '../../i18n/locale-utils';\r\nimport debug from '../../debug';\r\n\r\n/**\r\n * Configuration for the bot tracking middleware.\r\n * @public\r\n */\r\nexport type BotTrackingMiddlewareOptions = Omit<BaseMiddlewareOptions, 'enabled'> &\r\n  SitecoreConfig['api']['edge'] & {\r\n    /** Locales used to extract the language from the request path */\r\n    locales?: string[];\r\n    /** Fallback language when the request path has no locale prefix. Default is `'en'` */\r\n    defaultLanguage?: string;\r\n    /** Fallback site name when not resolved by the multisite middleware or site cookie */\r\n    defaultSite?: string;\r\n  };\r\n\r\nconst isPrefetch = (req: ExpressRequest): boolean =>\r\n  [req.headers?.purpose, req.headers?.['sec-purpose']].some(\r\n    (header) => typeof header === 'string' && header.includes('prefetch')\r\n  );\r\n\r\n/**\r\n * Whether bot tracking should be skipped for a local / development environment.\r\n * @param {string} hostname - Resolved request hostname (without port).\r\n * @returns {boolean} True when bot tracking should be skipped.\r\n * @internal\r\n */\r\nexport function shouldSkipForLocalEnvironment(hostname: string): boolean {\r\n  if (process.env.SITECORE_ENABLE_BOT_TRACKING === 'true') {\r\n    return false;\r\n  }\r\n  if (process.env.NODE_ENV === 'development') {\r\n    return true;\r\n  }\r\n  const host = hostname.toLowerCase();\r\n  return host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '[::1]';\r\n}\r\n\r\n/**\r\n * Middleware that runs bot detection once per request. When the request is from a bot it marks the\r\n * request/response with the `sc_bot` cookie (so downstream middlewares — e.g. personalize — and the\r\n * SSR analytics adapters detect the bot within the same request) and dispatches a dedicated\r\n * `botPageView` event.\r\n *\r\n * Must run before the personalize middleware so the bot cookie is set before personalize reads it.\r\n * The `botPageView` dispatch is awaited (not backgrounded): `initContentSdk` writes the module-global\r\n * core context, and the SSR render re-inits it after `next()`, so awaiting sequences init + dispatch\r\n * before that happens. The extra latency lands on bot requests only.\r\n * @param {BotTrackingMiddlewareOptions} options bot tracking middleware options\r\n * @returns {ExpressMiddleware} Express middleware\r\n * @public\r\n */\r\nexport function createBotTrackingMiddleware(\r\n  options: BotTrackingMiddlewareOptions\r\n): ExpressMiddleware {\r\n  return async (req: ExpressRequest, res: ExpressResponse, next: ExpressNextFunction) => {\r\n    try {\r\n      // For browser loader navigations (/_data) routing data comes from the loader payload, not\r\n      // the request; getMiddlewareRequest normalizes both into path/query/data.\r\n      const { path, data } = getMiddlewareRequest(req);\r\n\r\n      if (isEditingPreview(data.headers)) {\r\n        debug.common('bot tracking skipped (editing/preview mode)');\r\n        return next();\r\n      }\r\n\r\n      if (!shouldProcessPath(path, options.matcher)) {\r\n        debug.common('bot tracking skipped (path does not match)');\r\n        return next();\r\n      }\r\n\r\n      if (options.skip?.(req)) {\r\n        debug.common('bot tracking skipped (skip predicate)');\r\n        return next();\r\n      }\r\n\r\n      const hostHeader = data.headers?.['x-forwarded-host'] ?? data.headers?.host;\r\n      const hostname =\r\n        (Array.isArray(hostHeader) ? hostHeader[0] : hostHeader)?.split(':')[0] || 'localhost';\r\n\r\n      if (shouldSkipForLocalEnvironment(hostname)) {\r\n        debug.common('bot tracking skipped (local environment)');\r\n        return next();\r\n      }\r\n\r\n      const userAgentHeader = data.headers?.['user-agent'];\r\n      const userAgent = Array.isArray(userAgentHeader) ? userAgentHeader[0] : userAgentHeader;\r\n      if (!userAgent) {\r\n        debug.common('bot tracking skipped (no user-agent)');\r\n        return next();\r\n      }\r\n\r\n      if (!isBot(userAgent)) {\r\n        debug.common('bot tracking skipped (not a bot)');\r\n        return next();\r\n      }\r\n\r\n      if (isPrefetch(req)) {\r\n        debug.common('bot tracking skipped (prefetch)');\r\n        return next();\r\n      }\r\n\r\n      // Mark the request as a bot. The response cookie persists it across requests; mutating\r\n      // req.cookies makes it visible to later middlewares (personalize skipForBot) and the SSR\r\n      // analytics adapters within this same request.\r\n      if (res.cookie) {\r\n        res.cookie(BOT_DETECTION_COOKIE, '1', { secure: true, sameSite: 'lax', path: '/' });\r\n      }\r\n      req.cookies = { ...(req.cookies ?? {}), [BOT_DETECTION_COOKIE]: '1' };\r\n\r\n      const { locale, nonLocalePath } = splitLocaleFromPath(path, options.locales ?? []);\r\n      const language = locale || options.defaultLanguage || 'en';\r\n      const siteName =\r\n        (req as CsdkExpressRequest).scParams?.siteName ||\r\n        data.cookies?.[SITE_KEY] ||\r\n        options.defaultSite ||\r\n        '';\r\n\r\n      const startTimestamp = Date.now();\r\n      debug.common('bot tracking (visitor is a bot): %o', {\r\n        path: nonLocalePath,\r\n        language,\r\n        siteName,\r\n        hostname,\r\n      });\r\n\r\n      // Express req/res are http.IncomingMessage/ServerResponse at runtime; cast for the cookie-based\r\n      // server adapters.\r\n      const { req: httpReq, res: httpRes } = toNodeAdapterPair(req, res);\r\n      await initContentSdk({\r\n        config: {\r\n          contextId: options.contextId,\r\n          edgeUrl: options.edgeUrl,\r\n          siteName,\r\n        },\r\n        plugins: [\r\n          analyticsPlugin({\r\n            options: { enableCookie: false },\r\n            adapter: analyticsServerAdapter(httpReq, httpRes),\r\n          }),\r\n          eventsPlugin(),\r\n        ],\r\n      });\r\n\r\n      await botPageView({ page: path, language, userAgent });\r\n\r\n      debug.common('bot tracking end in %dms: %o', Date.now() - startTimestamp, {\r\n        path: nonLocalePath,\r\n      });\r\n    } catch (error) {\r\n      debug.common('bot tracking middleware failed: %o', error);\r\n    }\r\n    next();\r\n  };\r\n}\r\n","import { RedirectCommand } from '@angular/router';\r\nimport type { Router } from '@angular/router';\r\nimport { CsdkRequestData, CsdkRequestParams } from './models';\r\nimport { EDITING_PARAMS_HEADER } from '../server/middleware';\r\nimport { EditingPreviewData } from '@sitecore-content-sdk/content/editing';\r\nimport { SC_PARAMS_HEADER } from './constants';\r\nimport debug from '../debug';\r\n\r\n/**\r\n * Apply a redirect: internal URLs → RedirectCommand; external URLs → full page navigation.\r\n * Use in resolvers and in the navigation error handler (fallback) so redirect behavior is consistent.\r\n * Redirects are not errors; this helper is the single place that defines how to perform them.\r\n * @param {Router} router - Angular Router (for internal redirects)\r\n * @param {string} location - Target URL (path or full URL)\r\n * @returns RedirectCommand for internal, void after window.location.assign for external\r\n * @public\r\n */\r\nexport function applyRedirect(router: Router, location: string): RedirectCommand | void {\r\n  const isExternal = /^https?:\\/\\//i.test(location);\r\n  if (isExternal) {\r\n    if (typeof window !== 'undefined') {\r\n      window.location.assign(location);\r\n    }\r\n    return;\r\n  }\r\n  // Angular redirect logic doesn't allow for 301/302 status codes, we use RedirectCommand always on browser nav\r\n  return new RedirectCommand(router.parseUrl(location), {});\r\n}\r\n\r\n/**\r\n * Express-like request object interface with Content SDK request params\r\n */\r\ninterface ExpressLikeRequest {\r\n  headers?: Record<string, string | string[] | undefined>;\r\n  cookies?: Record<string, string>;\r\n  query?: Record<string, string | string[] | undefined>;\r\n  scParams?: CsdkRequestParams;\r\n}\r\n\r\ninterface FetchLikeRequest extends Request {\r\n  scParams?: CsdkRequestParams;\r\n}\r\n\r\n/**\r\n * Parse query parameters from URL\r\n * @param {string} url - The URL to parse\r\n * @returns {Record<string, string | string[] | undefined>} The query parameters\r\n */\r\nfunction parseQueryFromUrl(url: string): Record<string, string | string[] | undefined> {\r\n  try {\r\n    const urlObj = new URL(url);\r\n    const query: Record<string, string | string[] | undefined> = {};\r\n    urlObj.searchParams.forEach((value, key) => {\r\n      const existing = query[key];\r\n      if (existing) {\r\n        if (Array.isArray(existing)) {\r\n          existing.push(value);\r\n        } else {\r\n          query[key] = [existing, value];\r\n        }\r\n      } else {\r\n        query[key] = value;\r\n      }\r\n    });\r\n    return query;\r\n  } catch {\r\n    return {};\r\n  }\r\n}\r\n\r\n/**\r\n * Convert Headers object to plain object\r\n * @param {Headers} headers - The Headers object to convert\r\n * @returns {Record<string, string | string[] | undefined>} The headers\r\n */\r\nfunction headersToObject(headers: Headers): Record<string, string | string[] | undefined> {\r\n  const result: Record<string, string | string[] | undefined> = {};\r\n  headers.forEach((value, key) => {\r\n    result[key.toLowerCase()] = value;\r\n  });\r\n  return result;\r\n}\r\n\r\n/**\r\n * Parse cookies from a cookie header string\r\n * @param {string | null} cookieHeader - The cookie header string to parse\r\n * @returns {Record<string, string>} The cookies\r\n */\r\nfunction parseCookieHeader(cookieHeader: string | null): Record<string, string> {\r\n  if (!cookieHeader) return {};\r\n  const cookies: Record<string, string> = {};\r\n  cookieHeader.split(';').forEach((cookie) => {\r\n    const [name, ...rest] = cookie.trim().split('=');\r\n    if (name) {\r\n      cookies[name] = rest.join('=');\r\n    }\r\n  });\r\n  return cookies;\r\n}\r\n\r\n/**\r\n * Extracts request context from a request object.\r\n * Supports both Fetch API Request objects (from Angular's REQUEST token) and Express-like request objects.\r\n * @param {Request | ExpressLikeRequest} req - The request object (Fetch API Request or Express-like object)\r\n * @returns {RequestContext} The request context\r\n * @example\r\n * ```typescript\r\n * import { extractRequestData } from '@sitecore-content-sdk/angular/server';\r\n *\r\n * // From Express request\r\n * const requestContext = extractRequestData(expressReq);\r\n *\r\n * // From Fetch API Request (Angular's REQUEST token)\r\n * const requestContext = extractRequestData(request);\r\n * ```\r\n * @public\r\n */\r\nexport function extractRequestData(req: FetchLikeRequest | ExpressLikeRequest): CsdkRequestData {\r\n  let hostname: string | undefined;\r\n  let headers: Record<string, string | string[] | undefined> = {};\r\n  let cookies: Record<string, string> = {};\r\n  let query: Record<string, string | string[] | undefined> = {};\r\n  let scPreviewData: EditingPreviewData | undefined;\r\n  let scParams = 'scParams' in req ? req.scParams : undefined;\r\n  // Check if it's a Fetch API Request object - we're in browser loaders flow in this case\r\n  if (req instanceof Request) {\r\n    headers = headersToObject(req.headers);\r\n    cookies = parseCookieHeader(req.headers.get('cookie'));\r\n    query = parseQueryFromUrl(req.url);\r\n    try {\r\n      hostname = new URL(req.url).hostname;\r\n    } catch {\r\n      // empty catch - resolve hostname from host header later\r\n    }\r\n  } else {\r\n    headers = req.headers ?? {};\r\n    cookies = req.cookies ?? {};\r\n    query = req.query ?? {};\r\n  }\r\n  hostname =\r\n    hostname ??\r\n    pickHostnameFromHostHeader(Array.isArray(headers?.host) ? headers?.host[0] : headers?.host);\r\n\r\n  const scPreviewDataHeader = headers?.[EDITING_PARAMS_HEADER] as string;\r\n  if (scPreviewDataHeader) {\r\n    try {\r\n      scPreviewData = JSON.parse(scPreviewDataHeader) as EditingPreviewData;\r\n    } catch {\r\n      debug.editing('Failed to parse editing preview data from header');\r\n    }\r\n  }\r\n\r\n  // Express request properties don't survive Angular's conversion to a web Request,\r\n  // so middleware-resolved params also ride the SC_PARAMS_HEADER (set alongside req.scParams).\r\n  const scParamsHeader = headers?.[SC_PARAMS_HEADER] as string;\r\n  if (!scParams && scParamsHeader) {\r\n    try {\r\n      scParams = JSON.parse(scParamsHeader) as CsdkRequestParams;\r\n    } catch {\r\n      debug.common('Failed to parse Content SDK request params from header');\r\n    }\r\n  }\r\n  return {\r\n    hostname,\r\n    headers,\r\n    cookies,\r\n    query,\r\n    scPreviewData,\r\n    scParams,\r\n  };\r\n}\r\n\r\n/**\r\n * Pick the hostname from the host header\r\n * @param {string | undefined} host - The host header\r\n * @returns {string | undefined} The hostname\r\n */\r\nfunction pickHostnameFromHostHeader(host: string | undefined): string | undefined {\r\n  if (!host) return undefined;\r\n  const colon = host.indexOf(':');\r\n  return colon === -1 ? host : host.slice(0, colon);\r\n}\r\n","import type { Params, Route } from '@angular/router';\r\nimport { LOADER_ID } from './loader-registry.token';\r\n\r\n/**\r\n * Resolver function shape used in route config (minimal for LOADER_ID detection).\r\n * @internal\r\n */\r\ninterface ResolverWithLoaderId {\r\n  [key: symbol]: string;\r\n}\r\n\r\n/**\r\n * Returns the loader ID tagged onto a resolver function by {@link loaderResolver}, or\r\n * `undefined` when `resolver` is not a loader resolver (e.g. an ordinary Angular `ResolveFn`).\r\n * @param {unknown} resolver - A single entry from a `Route.resolve` map.\r\n * @returns {string | undefined} The loader ID, or `undefined`.\r\n * @internal\r\n */\r\nexport function getLoaderId(resolver: unknown): string | undefined {\r\n  if (\r\n    typeof resolver === 'function' &&\r\n    LOADER_ID in resolver &&\r\n    typeof (resolver as unknown as ResolverWithLoaderId)[LOADER_ID] === 'string'\r\n  ) {\r\n    return (resolver as unknown as ResolverWithLoaderId)[LOADER_ID];\r\n  }\r\n  return undefined;\r\n}\r\n\r\n/**\r\n * Walks an ordered (parent → child) list of `Route.resolve` maps and returns every loader ID\r\n * tagged via {@link loaderResolver}. Order-preserving; does not dedupe — callers pass the\r\n * result straight to `ClientLoaderDataService.prefetch()`, which already dedupes by\r\n * `(loaderId, url)`.\r\n * @param {(Route['resolve'] | undefined)[]} resolveConfigs - `resolve` maps from each matched route level, root to leaf.\r\n * @returns {string[]} Loader IDs found across all levels.\r\n * @internal\r\n */\r\nexport function collectLoaderIds(resolveConfigs: (Route['resolve'] | undefined)[]): string[] {\r\n  const loaderIds: string[] = [];\r\n  for (const resolveConfig of resolveConfigs) {\r\n    if (!resolveConfig) continue;\r\n    for (const resolver of Object.values(resolveConfig)) {\r\n      const loaderId = getLoaderId(resolver);\r\n      if (loaderId) {\r\n        loaderIds.push(loaderId);\r\n      }\r\n    }\r\n  }\r\n  return loaderIds;\r\n}\r\n\r\n/**\r\n * Merges params from an ordered (root → leaf) list of route param sets and defaults `locale`\r\n * from `defaultLanguage` when no level contributed one. Loaders always see a concrete\r\n * `params.locale` whether or not the locale matcher captured one from the URL.\r\n * @param {Params[]} paramsChain - Params contributed by each matched route level, root to leaf.\r\n * @param {string} [defaultLanguage] - Default language to fall back to.\r\n * @returns {Params} Merged params with a guaranteed `locale` when `defaultLanguage` is set.\r\n */\r\nexport function mergeRouteParams(paramsChain: Params[], defaultLanguage?: string): Params {\r\n  const merged = paramsChain.reduce((acc, params) => ({ ...acc, ...params }), {} as Params);\r\n  if (!merged.locale && defaultLanguage) {\r\n    merged.locale = defaultLanguage;\r\n  }\r\n  return merged;\r\n}\r\n","import { inject } from '@angular/core';\r\nimport { RedirectCommand, Router } from '@angular/router';\r\nimport type { NavigationError } from '@angular/router';\r\nimport { DEFAULT_ERROR_ROUTE, DEFAULT_NOT_FOUND_ROUTE, NotFoundNavigationError } from './models';\r\nimport { ERROR_ROUTE_TOKEN, NOT_FOUND_ROUTE_TOKEN, SITECORE_CONFIG_TOKEN } from '../lib/tokens';\r\nimport { splitLocaleFromPath } from '../i18n/locale-utils';\r\n\r\n/**\r\n * Normalizes a URL path (strip leading slash and query) for comparison.\r\n * @param {string} url - URL or path string\r\n * @returns Normalized path segment\r\n */\r\nfunction normalizePath(url: string): string {\r\n  return url.replace(/^\\//, '').split('?')[0];\r\n}\r\n\r\n/**\r\n * Resolves a navigation error to a RedirectCommand or void.\r\n * Handles loader exceptions (NotFoundNavigationError and other errors) and prevents redirect loops\r\n * when the failed navigation was already to the not-found route or the error route.\r\n * Must be called from an injection context (uses NOT_FOUND_ROUTE_TOKEN, ERROR_ROUTE_TOKEN, Router).\r\n *\r\n * **HTTP status codes (SSR):** RedirectCommand only triggers navigation to the not-found or error\r\n * route; it does not set the HTTP response status. To return 404 or 500 when those pages are\r\n * rendered on the server, configure your app so the server sends the correct status. For example,\r\n * in `app.routes.server.ts` add ServerRoute entries for your not-found and error paths with\r\n * `status: 404` and `status: 500` (see Angular \"Setting headers and status codes\" in the SSR guide).\r\n * Alternatively, inject `RESPONSE_INIT` in your NotFoundComponent and ErrorComponent and set the\r\n * status when running on the server.\r\n * @param {Error} err - The error from the navigation (e.g. NotFoundNavigationError or LoaderHttpError)\r\n * @param {string} failedUrl - URL that failed to load\r\n * @param {string} notFoundRoute - Path for the not-found page (e.g. '/404')\r\n * @param {string} errorRoute - Path for the error page (e.g. '/500')\r\n * @param {Router} router - Angular Router instance\r\n * @returns RedirectCommand to redirect, or void to cancel and avoid a loop\r\n * @public\r\n */\r\nexport function redirectOnNavigationError(\r\n  err: Error,\r\n  failedUrl: string,\r\n  notFoundRoute: string,\r\n  errorRoute: string,\r\n  router: Router\r\n): RedirectCommand | void {\r\n  console.log('Navigation error occurred on url: %s %s', failedUrl, err.message);\r\n\r\n  const kind: 'error' | 'notFound' = err instanceof NotFoundNavigationError ? 'notFound' : 'error';\r\n\r\n  const failedPath = normalizePath(failedUrl);\r\n  const notFoundPath = normalizePath(notFoundRoute);\r\n  const errorPath = normalizePath(errorRoute);\r\n\r\n  if (kind === 'notFound') {\r\n    if (failedPath === notFoundPath) {\r\n      console.log('RouteErrorHandler: Not found route was not found. Avoiding redirect loop.');\r\n      return;\r\n    }\r\n    const urlTree = router.parseUrl(notFoundRoute);\r\n    return new RedirectCommand(urlTree);\r\n  }\r\n\r\n  // kind === 'error'\r\n  if (failedPath === errorPath) {\r\n    console.log('RouteErrorHandler: Error route threw its own error. Avoiding redirect loop.');\r\n    return;\r\n  }\r\n  const urlTree = router.parseUrl(errorRoute);\r\n  return new RedirectCommand(urlTree);\r\n}\r\n\r\n/**\r\n * Returns a navigation error handler for use with withNavigationErrorHandler.\r\n * Delegates to {@link redirectOnNavigationError}.\r\n * @returns A handler compatible with `provideRouter(routes, withNavigationErrorHandler(...))`\r\n * @public\r\n */\r\nexport function handleNavigationError(): (error: NavigationError) => RedirectCommand | void {\r\n  return (e: NavigationError): RedirectCommand | void => {\r\n    const err = e?.error ?? e;\r\n    const failedUrl = e.url ?? '';\r\n    const notFoundRoute =\r\n      inject(NOT_FOUND_ROUTE_TOKEN, { optional: true }) || DEFAULT_NOT_FOUND_ROUTE;\r\n    const errorRoute = inject(ERROR_ROUTE_TOKEN, { optional: true }) || DEFAULT_ERROR_ROUTE;\r\n    const locales = inject(SITECORE_CONFIG_TOKEN, { optional: true })?.angular?.locales ?? [];\r\n    const router = inject(Router);\r\n    const { locale } = splitLocaleFromPath(failedUrl, locales);\r\n    const targetNotFound = locale ? `/${locale}${notFoundRoute}` : notFoundRoute;\r\n    const targetError = locale ? `/${locale}${errorRoute}` : errorRoute;\r\n    return redirectOnNavigationError(err, failedUrl, targetNotFound, targetError, router);\r\n  };\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { LoaderRunnerInit, LoaderDataResult } from './models';\r\n\r\n/**\r\n * SSR injection port for cache-aware loader resolution.\r\n * Implemented by `ServerLoaderRunner` and wired via\r\n * `provideServerLoaderRunner` (see the `server/express` module).\r\n * @public\r\n */\r\nexport interface ServerLoaderRunnerPort {\r\n  /**\r\n   * Resolve loader data on the server (cache-aware) using the shared {@link LOADER_REGISTRY}.\r\n   * @param {LoaderRunnerInit} init - Loader request payload\r\n   * @returns {Promise<LoaderDataResult>} Resolved loader result\r\n   */\r\n  resolve(init: LoaderRunnerInit): Promise<LoaderDataResult>;\r\n}\r\n\r\n/**\r\n * Injection token for SSR loader data resolution.\r\n * Must be provided via `provideServerLoaderRunner` in server application config.\r\n * @public\r\n */\r\nexport const SERVER_LOADER_RUNNER = new InjectionToken<ServerLoaderRunnerPort>(\r\n  'SERVER_LOADER_RUNNER'\r\n);\r\n","import { inject, TransferState, PLATFORM_ID, REQUEST, makeStateKey } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n  ActivatedRouteSnapshot,\r\n  RouterStateSnapshot,\r\n  Params,\r\n  ResolveFn,\r\n  Router,\r\n  RedirectCommand,\r\n} from '@angular/router';\r\nimport { LOADER_ID } from './loader-registry.token';\r\nimport { ClientLoaderDataService } from './client-loader-data.service';\r\nimport { extractRequestData, applyRedirect } from './utils';\r\nimport { mergeRouteParams } from './route-loader-utils';\r\nimport { EDITING_PARAMS_HEADER } from '../editing/constants';\r\nimport {\r\n  DEFAULT_ERROR_ROUTE,\r\n  DEFAULT_NOT_FOUND_ROUTE,\r\n  LoaderHttpError,\r\n  NotFoundNavigationError,\r\n  PerRouteLoaderCacheConfig,\r\n} from './models';\r\nimport { redirectOnNavigationError } from './router-error-handling';\r\nimport { ERROR_ROUTE_TOKEN, NOT_FOUND_ROUTE_TOKEN } from '../lib/tokens';\r\nimport { SERVER_LOADER_RUNNER } from './server-loader-runner.token';\r\nimport { SITECORE_CONFIG_TOKEN } from '../lib/tokens';\r\n\r\n/**\r\n * Create a state key for the loader\r\n * @param {string} loaderId - The loader ID\r\n * @param {string} url - The URL\r\n * @returns {StateKey} The state key\r\n */\r\nfunction stateKey(loaderId: string, url: string) {\r\n  return makeStateKey<unknown>(`loader:${loaderId}:${url}`);\r\n}\r\n\r\n/**\r\n * Extension point for custom loader IDs. Augment this interface so that\r\n * loaderResolver() accepts your loader ids when you add them via provideLoaderRegistry().\r\n * @example\r\n * // In your app (e.g. app.d.ts or a types file):\r\n * declare module '@sitecore-content-sdk/angular' {\r\n *   interface LoaderIdMap {\r\n *     myCustomLoader: void;\r\n *   }\r\n * }\r\n * // Then provideLoaderRegistry({ myCustomLoader: myLoader }) and loaderResolver('myCustomLoader') are typed.\r\n */\r\nexport interface LoaderIdMap {}\r\n\r\n/** Loader ID type. Use string keys that match the keys you pass to provideLoaderRegistry. */\r\nexport type LoaderId = keyof LoaderIdMap extends never ? string : keyof LoaderIdMap;\r\n\r\n/**\r\n * Merges params from all ancestor route segments and defaults `locale` from the resolved\r\n * Sitecore config when missing. Loaders always see a concrete `params.locale` whether or\r\n * not the locale matcher captured one from the URL.\r\n * @param {ActivatedRouteSnapshot} route - The current route snapshot.\r\n * @param {string} [defaultLanguage] - Default language to fall back to.\r\n * @returns {Params} Merged params with a guaranteed `locale` when `defaultLanguage` is set.\r\n */\r\nfunction buildLoaderParams(route: ActivatedRouteSnapshot, defaultLanguage: string): Params {\r\n  return mergeRouteParams(\r\n    route.pathFromRoot.map((r) => r.params),\r\n    defaultLanguage\r\n  );\r\n}\r\n\r\n/**\r\n * Browser-only: load data from transfer state or ClientLoaderDataService.\r\n * Injects TransferState, ClientLoaderDataService. Called by the resolver when isPlatformBrowser.\r\n * @param {object} options - The options for the resolveOnBrowser function\r\n * @param {ActivatedRouteSnapshot} options.route - The current route snapshot\r\n * @param {RouterStateSnapshot} options.state - The router state snapshot\r\n * @param {string} options.loaderId - loader ID to resolve, used for transfer state key and ClientLoaderDataService call\r\n * @param {Router} options.router - The Angular router instance\r\n * @param {string} [options.defaultLanguage] - Default language for locale fallback in params\r\n * @param {LoaderCacheConfig} [options.cacheOptions] - Cache options for the loader\r\n * @returns {Promise<unknown | RedirectCommand>} The resolved data or redirect command\r\n */\r\nasync function resolveOnBrowser({\r\n  route,\r\n  state,\r\n  loaderId,\r\n  router,\r\n  defaultLanguage,\r\n  cacheOptions,\r\n}: {\r\n  route: ActivatedRouteSnapshot;\r\n  state: RouterStateSnapshot;\r\n  loaderId: string;\r\n  router: Router;\r\n  defaultLanguage: string;\r\n  cacheOptions?: PerRouteLoaderCacheConfig;\r\n}): Promise<unknown | RedirectCommand> {\r\n  const transferState = inject(TransferState);\r\n  const browserLoaderData = inject(ClientLoaderDataService);\r\n\r\n  const url = state.url;\r\n  const key = stateKey(loaderId, url);\r\n\r\n  if (transferState.hasKey(key)) {\r\n    const data = transferState.get(key, null);\r\n    transferState.remove(key);\r\n    return data;\r\n  }\r\n\r\n  const allParams = buildLoaderParams(route, defaultLanguage);\r\n\r\n  const resp = await browserLoaderData.getData({\r\n    url,\r\n    loaderId,\r\n    routeParams: allParams,\r\n    query: route.queryParams as Record<string, string | string[]>,\r\n    cacheOptions,\r\n  });\r\n\r\n  if (resp.kind === 'error') {\r\n    throw new LoaderHttpError(resp.status, resp.message);\r\n  }\r\n  if (resp.kind === 'notFound') {\r\n    throw new NotFoundNavigationError();\r\n  }\r\n  if (resp.kind === 'redirect') {\r\n    return applyRedirect(router, resp.redirect.loaderRedirectTarget);\r\n  }\r\n  return resp.data;\r\n}\r\n\r\n/**\r\n * Create a loader resolver function that resolver loader data with optional cache options on server or browser.\r\n * @param {LoaderId} loaderId - The loader ID\r\n * @param {PerRouteLoaderCacheConfig} [cacheOptions] - The cache options\r\n * @returns {ResolveFn<unknown>} loader resolver function\r\n */\r\nexport const loaderResolver = (\r\n  loaderId: LoaderId,\r\n  cacheOptions?: PerRouteLoaderCacheConfig\r\n): ResolveFn<unknown> => {\r\n  const resolver = async (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\r\n    const transferState = inject(TransferState);\r\n    const platformId = inject(PLATFORM_ID);\r\n    const request = inject(REQUEST, { optional: true });\r\n    const notFoundRoute =\r\n      inject(NOT_FOUND_ROUTE_TOKEN, { optional: true }) || DEFAULT_NOT_FOUND_ROUTE;\r\n    const errorRoute = inject(ERROR_ROUTE_TOKEN, { optional: true }) || DEFAULT_ERROR_ROUTE;\r\n    const router = inject(Router);\r\n    const config = inject(SITECORE_CONFIG_TOKEN);\r\n    const defaultLanguage = config.defaultLanguage;\r\n\r\n    const url = state.url;\r\n    const key = stateKey(loaderId, url);\r\n\r\n    if (isPlatformBrowser(platformId)) {\r\n      try {\r\n        return await resolveOnBrowser({\r\n          route,\r\n          state,\r\n          loaderId,\r\n          router,\r\n          defaultLanguage,\r\n          cacheOptions,\r\n        });\r\n      } catch (e) {\r\n        // special handling for browser, as navigation error for handleNavigationError is only generated on server\r\n        return redirectOnNavigationError(e as Error, url, notFoundRoute, errorRoute, router);\r\n      }\r\n    }\r\n\r\n    const serverLoaderRunner = inject(SERVER_LOADER_RUNNER, { optional: true });\r\n    if (!serverLoaderRunner) {\r\n      throw new Error(\r\n        'SSR loader resolution requires provideServerLoaderRunner() in server application providers'\r\n      );\r\n    }\r\n\r\n    const csdkRequestData = request ? extractRequestData(request) : {};\r\n\r\n    // When the request flows through createEditingRenderMiddleware, the\r\n    // editing payload is propagated via x-sitecore-editing-params. Cached\r\n    // responses must not be served to the editor (it expects fresh layout\r\n    // every render), so disable cache for this resolution.\r\n    const isEditingRequest = !!csdkRequestData.headers?.[EDITING_PARAMS_HEADER];\r\n    const effectiveCacheOptions = isEditingRequest\r\n      ? { ...(cacheOptions ?? {}), enabled: false }\r\n      : cacheOptions;\r\n\r\n    const result = await serverLoaderRunner.resolve({\r\n      loaderId,\r\n      url,\r\n      routeParams: buildLoaderParams(route, defaultLanguage),\r\n      query: route.queryParams as Record<string, string | string[]>,\r\n      cacheOptions: effectiveCacheOptions,\r\n      csdkRequestData,\r\n    });\r\n\r\n    if (result.kind === 'redirect') {\r\n      return applyRedirect(router, result.redirect.loaderRedirectTarget);\r\n    }\r\n\r\n    if (result.kind === 'error') {\r\n      const cause = result.cause;\r\n      if (cause instanceof NotFoundNavigationError) throw cause;\r\n      if (cause instanceof LoaderHttpError) throw cause;\r\n      throw new LoaderHttpError(result.status, result.message);\r\n    }\r\n\r\n    transferState.set(key, result.data);\r\n    return result.data;\r\n  };\r\n\r\n  resolver[LOADER_ID] = loaderId;\r\n\r\n  return resolver;\r\n};\r\n","import {\r\n  defaultUrlMatcher,\r\n  PRIMARY_OUTLET,\r\n  UrlSegmentGroup,\r\n  type Params,\r\n  type Route,\r\n  type Routes,\r\n  type UrlSegment,\r\n} from '@angular/router';\r\n\r\n/**\r\n * A single level of a matched route chain: the `Route` config entry that matched and the\r\n * params it contributed (path params + custom matcher `posParams`).\r\n * @internal\r\n */\r\nexport interface MatchedRouteSegment {\r\n  route: Route;\r\n  params: Params;\r\n}\r\n\r\n/**\r\n * True when `url` is an absolute or protocol-relative URL rather than an app-internal path:\r\n * it carries a scheme (`https:`, `mailto:`, `tel:`, `javascript:`, …) or starts with `//`\r\n * (protocol-relative). Such URLs point off-app or are handled directly by the browser, so\r\n * there is no in-app route to resolve loaders for.\r\n *\r\n * The `scRouterLink`/`scRichText` directives already skip these via `EXTERNAL_HREF_PREFIXES`\r\n * before calling {@link ClientPreLoaderDataService.prefetchForUrl}; this is the service-level\r\n * backstop for direct callers\r\n * @param {string} url - Candidate navigation URL (e.g. an anchor's `href`).\r\n * @returns {boolean} `true` for absolute/protocol-relative URLs, `false` for app-internal paths.\r\n * @internal\r\n */\r\nexport function isAbsoluteUrl(url: string): boolean {\r\n  // `scheme:` (RFC 3986 scheme chars) or a leading `//` (protocol-relative).\r\n  return /^[a-z][a-z0-9+.-]*:/i.test(url) || url.startsWith('//');\r\n}\r\n\r\n/**\r\n * Matches a `Route` against the given segments the same way Angular's own recognizer does:\r\n * a custom `route.matcher` when present, otherwise `defaultUrlMatcher` (static segments,\r\n * `:param` segments, `**`). Routes we cannot safely evaluate without side effects\r\n * (`redirectTo`, `canMatch`, named outlets) are treated as non-matching.\r\n * @param {Route} route - Candidate route config entry.\r\n * @param {UrlSegment[]} segments - Remaining URL segments to match against this route.\r\n * @returns {{ consumed: UrlSegment[]; posParams: Params } | null} Match result, or `null` when the route does not match.\r\n */\r\nfunction matchRoute(\r\n  route: Route,\r\n  segments: UrlSegment[]\r\n): { consumed: UrlSegment[]; posParams: Params } | null {\r\n  if (route.redirectTo !== undefined || route.canMatch?.length) {\r\n    return null;\r\n  }\r\n  if (route.outlet && route.outlet !== PRIMARY_OUTLET) {\r\n    return null;\r\n  }\r\n  // defaultUrlMatcher requires a string `path`; a route with neither `matcher` nor `path`\r\n  // is not a valid config we can evaluate here (Angular's own config validation would\r\n  // normally have already rejected it at bootstrap).\r\n  if (!route.matcher && route.path === undefined) {\r\n    return null;\r\n  }\r\n\r\n  const matcher = route.matcher ?? defaultUrlMatcher;\r\n  const segmentGroup = new UrlSegmentGroup(segments, {});\r\n  const result = matcher(segments, segmentGroup, route);\r\n  if (!result) {\r\n    return null;\r\n  }\r\n  if (route.pathMatch === 'full' && result.consumed.length !== segments.length) {\r\n    return null;\r\n  }\r\n\r\n  const posParams: Params = {};\r\n  for (const [key, segment] of Object.entries(result.posParams ?? {})) {\r\n    posParams[key] = segment.path;\r\n  }\r\n  // Matches Angular's own `parameters` computation: matrix params from only the *last*\r\n  // consumed segment are merged in, not every consumed segment.\r\n  const lastConsumed = result.consumed[result.consumed.length - 1];\r\n  const params: Params =\r\n    result.consumed.length > 0 ? { ...posParams, ...lastConsumed.parameters } : posParams;\r\n\r\n  return { consumed: result.consumed, posParams: params };\r\n}\r\n\r\n/**\r\n * Recursively matches `routes` against `segments`, first-match-wins in declaration order —\r\n * mirroring Angular Router's own matching semantics using only public Router primitives\r\n * (`defaultUrlMatcher`, custom `route.matcher`s). Used to determine, from a raw href, which\r\n * loader-bearing routes apply without triggering an actual navigation.\r\n * @param {Routes} routes - Route config to match against (e.g. `Router.config`).\r\n * @param {UrlSegment[]} segments - URL segments to match (e.g. from `Router.parseUrl(url)`).\r\n * @returns {MatchedRouteSegment[] | null} Root-to-leaf matched route chain, or `null` when no route matches.\r\n * @internal\r\n */\r\nexport function matchRouteChain(routes: Routes, segments: UrlSegment[]): MatchedRouteSegment[] | null {\r\n  for (const route of routes) {\r\n    const matched = matchRoute(route, segments);\r\n    if (!matched) {\r\n      continue;\r\n    }\r\n \r\n    const remaining = segments.slice(matched.consumed.length);\r\n    const level: MatchedRouteSegment = { route, params: matched.posParams };\r\n\r\n    // Try children first, even when `remaining` is already empty — a `**` or `path: ''`\r\n    // child (e.g. the catchall page route sitting under a pass-through locale matcher)\r\n    // can itself match zero remaining segments. Only fall back to treating *this* route\r\n    // as the leaf when it has no children, or its children don't match.\r\n    if (route.children?.length) {\r\n      const childChain = matchRouteChain(route.children, remaining);\r\n      if (childChain) {\r\n        return [level, ...childChain];\r\n      }\r\n      if (remaining.length === 0) {\r\n        return [level];\r\n      }\r\n      continue;\r\n    }\r\n\r\n    if (remaining.length === 0) {\r\n      return [level];\r\n    }\r\n\r\n    if (route.loadChildren) {\r\n      // Lazy-loaded children can't be matched synchronously without triggering a chunk\r\n      // load as a side effect of hover; treat this route as the matching boundary.\r\n      return [level];\r\n    }\r\n\r\n    // Route matched but left segments unconsumed and has nowhere to send them.\r\n    continue;\r\n  }\r\n\r\n  return null;\r\n}\r\n","import { DestroyRef, inject, Injectable, PLATFORM_ID } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { filter } from 'rxjs';\r\nimport {\r\n  ActivatedRouteSnapshot,\r\n  ActivationStart,\r\n  Params,\r\n  PRIMARY_OUTLET,\r\n  Route,\r\n  Router,\r\n  RouterStateSnapshot,\r\n} from '@angular/router';\r\nimport { ClientLoaderDataService } from './client-loader-data.service';\r\nimport { collectLoaderIds, mergeRouteParams } from './route-loader-utils';\r\nimport { isAbsoluteUrl, matchRouteChain } from './route-matcher';\r\nimport { SITECORE_CONFIG_TOKEN } from '../lib/tokens';\r\n\r\n/**\r\n * ClientPreLoaderDataService kicks off loader data fetches for all loaders in the current route\r\n * and its parent routes in parallel, so that when Angular runs resolvers sequentially,\r\n * resolvers get staged prefetched responses or join already-pending requests instead of waiting.\r\n *\r\n * Subscribes to the router's ActivationStart event and prefetches for the\r\n * ActivatedRouteSnapshot when it is the leaf route (browser only). Discovers all loader\r\n * resolvers on that snapshot and its parents (via LOADER_ID on pathFromRoot), then\r\n * calls ClientLoaderDataService.prefetch() for each (loaderId, url, params, query). Fetches\r\n * run in parallel; results are stored in ClientLoaderDataService prefetchedResponses for getData() to consume.\r\n * @public\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class ClientPreLoaderDataService {\r\n  private readonly loaderData = inject(ClientLoaderDataService);\r\n  private readonly platformId = inject(PLATFORM_ID);\r\n  private readonly router = inject(Router);\r\n  private readonly destroyRef = inject(DestroyRef);\r\n  private readonly defaultLanguage = inject(SITECORE_CONFIG_TOKEN, { optional: true })\r\n    ?.defaultLanguage;\r\n\r\n  constructor() {\r\n    this.router.events\r\n      .pipe(\r\n        filter((e): e is ActivationStart => e instanceof ActivationStart),\r\n        takeUntilDestroyed(this.destroyRef)\r\n      )\r\n      .subscribe((event) => {\r\n        const snapshot = event.snapshot;\r\n        if (!snapshot.children?.length) {\r\n          this.prefetchForRoute(snapshot, this.router.routerState.snapshot);\r\n        }\r\n      });\r\n  }\r\n\r\n  /**\r\n   * Prefetch loader data for all loaders in the route tree.\r\n   * Call this at the start of browser resolver execution so all loaders for the route\r\n   * are kicked off in parallel before resolvers run sequentially.\r\n   * No-op on server.\r\n   * @param {ActivatedRouteSnapshot} route - Current route (pathFromRoot gives current and parent routes)\r\n   * @param {RouterStateSnapshot} state - Current router state (use state.url for the navigation URL)\r\n   */\r\n  async prefetchForRoute(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {\r\n    if (!isPlatformBrowser(this.platformId)) {\r\n      return;\r\n    }\r\n    const levels = (route.pathFromRoot ?? [])\r\n      .filter((ancestor): ancestor is ActivatedRouteSnapshot => !!ancestor)\r\n      .map((ancestor) => ({ resolve: ancestor.routeConfig?.resolve, params: ancestor.params ?? {} }));\r\n    // queryParams are global to the URL (identical across every snapshot level), so the leaf's\r\n    // are representative of the whole chain.\r\n    this.prefetchChain(\r\n      levels,\r\n      state.url,\r\n      (route.queryParams ?? {}) as Record<string, string | string[]>\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Shared by {@link prefetchForRoute} and {@link prefetchForUrl}: prefetches every\r\n   * `LOADER_ID`-tagged resolver across an ordered (root → leaf) list of matched route levels.\r\n   * Params are merged per level, so a parent-route loader never sees a child's params.\r\n   * @param {{ resolve: Route['resolve']; params: Params }[]} levels - Matched route levels, root to leaf.\r\n   * @param {string} url - Navigation URL forwarded to each prefetch payload.\r\n   * @param {Record<string, string | string[]>} query - Query params forwarded to each prefetch payload.\r\n   * @param {object} [options] - Prefetch options\r\n   * @param {boolean} [options.force] - Forwarded to {@link ClientLoaderDataService.prefetch}.\r\n   */\r\n  private prefetchChain(\r\n    levels: { resolve: Route['resolve']; params: Params }[],\r\n    url: string,\r\n    query: Record<string, string | string[]>,\r\n    options?: { force?: boolean }\r\n  ): void {\r\n    levels.forEach((level, index) => {\r\n      const loaderIds = collectLoaderIds([level.resolve]);\r\n      if (loaderIds.length === 0) {\r\n        return;\r\n      }\r\n      const routeParams = mergeRouteParams(\r\n        levels.slice(0, index + 1).map((l) => l.params),\r\n        this.defaultLanguage\r\n      );\r\n      for (const loaderId of loaderIds) {\r\n        this.loaderData.prefetch({ loaderId, url, routeParams, query }, options);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Resolves the loaders that apply to `url` - without navigating - via {@link matchRouteChain}\r\n   * against `Router.config`, then prefetches each one, same as {@link prefetchForRoute} does\r\n   * for a live navigation. Entry point for hover/eager link prefetch; doesn't gate on an enable/disable flag itself - callers decide when to call it.\r\n   *\r\n   * No-ops on server, for absolute/external URLs, when `url` matches no route, or when the\r\n   * matched chain has no loaders.\r\n   * @param {string} url - Candidate navigation URL (e.g. an anchor's `href`).\r\n   * @param {object} [options] - Prefetch options\r\n   * @param {boolean} [options.force] - Forwarded to {@link ClientLoaderDataService.prefetch}; hover callers pass `true`, eager callers omit it.\r\n   */\r\n  prefetchForUrl(url: string, options?: { force?: boolean }): void {\r\n    if (!isPlatformBrowser(this.platformId)) {\r\n      return;\r\n    }\r\n\r\n    // Absolute/external URLs (external site, mailto:, tel:, protocol-relative, …) never map to an\r\n    // in-app route — skip before parsing so a scheme like `mailto:` isn't mis-parsed as a path.\r\n    if (isAbsoluteUrl(url)) {\r\n      return;\r\n    }\r\n\r\n    let chain: ReturnType<typeof matchRouteChain>;\r\n    let query: Record<string, string | string[]>;\r\n    try {\r\n      const tree = this.router.parseUrl(url);\r\n      const segments = tree.root.children[PRIMARY_OUTLET]?.segments ?? [];\r\n      chain = matchRouteChain(this.router.config, segments);\r\n      query = tree.queryParams as Record<string, string | string[]>;\r\n    } catch {\r\n      // Malformed href (e.g. invalid percent-encoding) — not this feature's job to surface.\r\n      return;\r\n    }\r\n    if (!chain) {\r\n      return;\r\n    }\r\n\r\n    this.prefetchChain(\r\n      chain.map((level) => ({ resolve: level.route.resolve, params: level.params })),\r\n      url,\r\n      query,\r\n      options\r\n    );\r\n  }\r\n}\r\n","import type { LoaderContext } from './models';\r\nimport { DEFAULT_VARIANT } from '@sitecore-content-sdk/content/personalize';\r\n\r\n/**\r\n * Read the site name resolved for the current request (multisite middleware →\r\n * `scParams`, with the configured default site applied by the server loader runner).\r\n * @param {LoaderContext} context - Loader context.\r\n * @returns {string} Site name for the current request.\r\n * @public\r\n */\r\nexport function getSiteName(context: LoaderContext): string {\r\n  return context.scParams.siteName;\r\n}\r\n\r\n/**\r\n * Read the page-level personalization variant id resolved for the current request\r\n * (personalize middleware → `scParams`). Returns the default variant id when the\r\n * request was not personalized.\r\n * @param {LoaderContext} context - Loader context.\r\n * @returns {string} Page-level variant id.\r\n * @public\r\n */\r\nexport function getVariantId(context: LoaderContext): string {\r\n  return context.scParams.variantId ?? DEFAULT_VARIANT;\r\n}\r\n\r\n/**\r\n * Read the component A/B test variant ids resolved for the current request\r\n * (personalize middleware → `scParams`). Empty when the request was not personalized.\r\n * @param {LoaderContext} context - Loader context.\r\n * @returns {string[]} Component-level variant ids.\r\n * @public\r\n */\r\nexport function getComponentVariantIds(context: LoaderContext): string[] {\r\n  return context.scParams.componentVariantIds ?? [];\r\n}\r\n\r\n/**\r\n * Read the language for the current request from the matched route params\r\n * (`scLocaleMatcher` exposes the locale URL segment as `routeParams.locale`).\r\n * Returns `undefined` when no locale was matched — fall back to your\r\n * configured default language.\r\n * @param {LoaderContext} context - Loader context.\r\n * @returns {string | undefined} Language for the current request.\r\n * @public\r\n */\r\nexport function getLanguage(context: LoaderContext): string | undefined {\r\n  const locale = context.routeParams.locale;\r\n  return typeof locale === 'string' ? locale : undefined;\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport type { EventData, IdentityData, PageViewData } from '@sitecore-content-sdk/events';\r\n\r\n/**\r\n * Browser-only analytics façade for Sitecore CDP events. A single injectable token backed by\r\n * two platform implementations: the browser implementation lazily initializes the Content SDK\r\n * events runtime on first use and dispatches; the server implementation is a no-op so callers\r\n * never need platform guards. Resolve it with `inject(SITECORE_ANALYTICS)`.\r\n * @public\r\n */\r\nexport interface SitecoreAnalyticsWrapper {\r\n  /** Dispatch a page view event. */\r\n  pageView(data: PageViewData): Promise<void>;\r\n  /** Dispatch a custom event. */\r\n  event(data: EventData): Promise<void>;\r\n  /** Dispatch an identity event. */\r\n  identity(data: IdentityData): Promise<void>;\r\n  /** Dispatch a form interaction event. */\r\n  form(\r\n    formId: string,\r\n    interactionType: 'VIEWED' | 'SUBMITTED',\r\n    componentInstanceId: string\r\n  ): Promise<void>;\r\n}\r\n\r\n/**\r\n * DI token for the {@link SitecoreAnalyticsWrapper} façade. `provideSitecoreAngular` registers a\r\n * browser or server implementation based on the current platform.\r\n * @public\r\n */\r\nexport const SITECORE_ANALYTICS = new InjectionToken<SitecoreAnalyticsWrapper>(\r\n  'SITECORE_ANALYTICS'\r\n);\r\n\r\n/**\r\n * Normalize a hostname into a cookie domain: strips the port and a leading `www.` so that\r\n * browser-side and server-side cookie writes resolve to the same domain. Divergent\r\n * normalization would mint duplicate visitor cookies on `www.` hosts.\r\n * @param {string} hostname - Hostname, optionally with a port (e.g. `www.example.com:3000`).\r\n * @returns {string} Normalized cookie domain (e.g. `example.com`).\r\n * @public\r\n */\r\nexport function normalizeCookieDomain(hostname: string): string {\r\n  const withoutPort = hostname.split(':')[0];\r\n  return withoutPort.replace(/^www\\./i, '');\r\n}","import { Injectable, inject, isDevMode } from '@angular/core';\r\nimport { initContentSdk } from '@sitecore-content-sdk/core';\r\nimport { analyticsBrowserAdapter, analyticsPlugin } from '@sitecore-content-sdk/analytics-core';\r\nimport { event, eventsPlugin, form, identity, pageView } from '@sitecore-content-sdk/events';\r\nimport type { EventData, IdentityData, PageViewData } from '@sitecore-content-sdk/events';\r\nimport { SITECORE_CONFIG_TOKEN } from '../tokens';\r\nimport { normalizeCookieDomain, type SitecoreAnalyticsWrapper } from './sitecore-analytics';\r\nimport debug from '../../debug';\r\n\r\n/** Dedup window for identical page-view fingerprints (hydration replay, transfer-state restore). */\r\nconst DEDUP_WINDOW_MS = 1000;\r\n\r\n/**\r\n * Browser {@link SitecoreAnalyticsWrapper} implementation. Lazily initializes the Content SDK\r\n * events runtime on first dispatch — memoized so concurrent first callers await the same promise\r\n * — then forwards to the `@sitecore-content-sdk/events` functions. Failures are swallowed at debug\r\n * level: analytics must never break the app.\r\n * @public\r\n */\r\n@Injectable()\r\nexport class SitecoreAnalyticsBrowser implements SitecoreAnalyticsWrapper {\r\n  private readonly config = inject(SITECORE_CONFIG_TOKEN, { optional: true });\r\n  /** Memoized one-time init; resolves `false` when analytics is disabled (dev / missing Edge). */\r\n  private initPromise?: Promise<boolean>;\r\n  /** Last page-view fingerprint + timestamp, for same-payload dedup. */\r\n  private lastPageView?: { fingerprint: string; at: number };\r\n\r\n  pageView(data: PageViewData): Promise<void> {\r\n    const fingerprint = `${data.page ?? ''}|${data.pageVariantId ?? ''}|${data.language ?? ''}`;\r\n    const now = Date.now();\r\n    if (\r\n      this.lastPageView?.fingerprint === fingerprint &&\r\n      now - this.lastPageView.at < DEDUP_WINDOW_MS\r\n    ) {\r\n      debug.common('analytics pageView deduped: %s', fingerprint);\r\n      return Promise.resolve();\r\n    }\r\n    this.lastPageView = { fingerprint, at: now };\r\n    return this.dispatch(() => pageView(data));\r\n  }\r\n\r\n  event(data: EventData): Promise<void> {\r\n    return this.dispatch(() => event(data));\r\n  }\r\n\r\n  identity(data: IdentityData): Promise<void> {\r\n    return this.dispatch(() => identity(data));\r\n  }\r\n\r\n  form(\r\n    formId: string,\r\n    interactionType: 'VIEWED' | 'SUBMITTED',\r\n    componentInstanceId: string\r\n  ): Promise<void> {\r\n    return this.dispatch(() => form(formId, interactionType, componentInstanceId));\r\n  }\r\n\r\n  /**\r\n   * Ensure the SDK is initialized, then run `send`; swallow any failure at debug level.\r\n   * @param {() => Promise<unknown>} send - Events dispatch call to run once initialized.\r\n   */\r\n  private async dispatch(send: () => Promise<unknown>): Promise<void> {\r\n    try {\r\n      const initialized = await this.ensureInit();\r\n      if (!initialized) return;\r\n      await send();\r\n    } catch (e) {\r\n      debug.common('analytics dispatch failed: %o', e);\r\n    }\r\n  }\r\n\r\n  private ensureInit(): Promise<boolean> {\r\n    if (!this.initPromise) {\r\n      this.initPromise = this.doInit();\r\n    }\r\n    return this.initPromise;\r\n  }\r\n\r\n  private async doInit(): Promise<boolean> {\r\n    if (isDevMode()) {\r\n      debug.common('Browser Events SDK is not initialized in development environment');\r\n      return false;\r\n    }\r\n    const edge = this.config?.api?.edge;\r\n    if (!edge?.clientContextId) {\r\n      debug.common('Client Edge API settings missing from configuration; analytics disabled');\r\n      return false;\r\n    }\r\n    await initContentSdk({\r\n      config: {\r\n        contextId: edge.clientContextId,\r\n        edgeUrl: edge.edgeUrl,\r\n        siteName: this.config?.defaultSite ?? '',\r\n      },\r\n      plugins: [\r\n        analyticsPlugin({\r\n          options: {\r\n            enableCookie: true,\r\n            cookieDomain: normalizeCookieDomain(window.location.hostname),\r\n          },\r\n          adapter: analyticsBrowserAdapter(),\r\n        }),\r\n        eventsPlugin(),\r\n      ],\r\n    });\r\n    return true;\r\n  }\r\n}\r\n","import { Injectable, REQUEST_CONTEXT, inject } from '@angular/core';\r\nimport { initContentSdk } from '@sitecore-content-sdk/core';\r\nimport { analyticsPlugin, analyticsServerAdapter } from '@sitecore-content-sdk/analytics-core';\r\nimport { event, eventsPlugin, form, identity, pageView } from '@sitecore-content-sdk/events';\r\nimport type { EventData, IdentityData, PageViewData } from '@sitecore-content-sdk/events';\r\nimport { SITECORE_CONFIG_TOKEN } from '../tokens';\r\nimport { normalizeCookieDomain, type SitecoreAnalyticsWrapper } from './sitecore-analytics';\r\nimport debug from '../../debug';\r\n\r\n/**\r\n * Minimal Node request shape the server analytics adapter reads from `REQUEST_CONTEXT`. Declared\r\n * locally (only the `headers` field we touch) to keep `@types/node` out of the browser-bundled lib\r\n * build; the real Express request/response objects flow through at runtime.\r\n */\r\ninterface NodeLikeRequest {\r\n  headers: Record<string, string | string[] | undefined>;\r\n}\r\n\r\n/** Shape of the SSR request context passed to `AngularNodeAppEngine.handle(req, ctx)` in server.ts. */\r\ninterface SsrAnalyticsContext {\r\n  req?: NodeLikeRequest;\r\n  res?: object;\r\n}\r\n\r\n/** Server analytics adapter param types (node req/res), derived without importing node types. */\r\ntype AdapterRequest = Parameters<typeof analyticsServerAdapter>[0];\r\ntype AdapterResponse = Parameters<typeof analyticsServerAdapter>[1];\r\n\r\n/**\r\n * Server-side {@link SitecoreAnalyticsWrapper} implementation. Unlike a no-op, it dispatches CDP\r\n * events from SSR using the **server** analytics provider: it lazily initializes the Content SDK\r\n * with `analyticsServerAdapter` (cookie-based visitor identity from the Node request/response) and\r\n * the events plugin, then forwards to the `@sitecore-content-sdk/events` functions. Failures are\r\n * swallowed at debug level so analytics never breaks rendering.\r\n *\r\n * The Node `req`/`res` are taken from `REQUEST_CONTEXT` — `server.ts` passes them via\r\n * `angularApp.handle(req, { cache, req, res })`. When they are absent (or Edge config is missing),\r\n * the wrapper degrades to a no-op.\r\n *\r\n * NOTE: `initContentSdk` writes the module-global core context. Per-request init in a long-lived\r\n * Node process can race under concurrency (same caveat as the personalize middleware); the\r\n * explicit-context engine API is the planned fix.\r\n * @public\r\n */\r\n@Injectable()\r\nexport class SitecoreAnalyticsServer implements SitecoreAnalyticsWrapper {\r\n  private readonly config = inject(SITECORE_CONFIG_TOKEN, { optional: true });\r\n  private readonly ssrContext = inject(REQUEST_CONTEXT, { optional: true }) as\r\n    | SsrAnalyticsContext\r\n    | undefined;\r\n  /** Memoized one-time init for this request; resolves `false` when analytics is disabled. */\r\n  private initPromise?: Promise<boolean>;\r\n\r\n  pageView(data: PageViewData): Promise<void> {\r\n    return this.dispatch(() => pageView(data));\r\n  }\r\n\r\n  event(data: EventData): Promise<void> {\r\n    return this.dispatch(() => event(data));\r\n  }\r\n\r\n  identity(data: IdentityData): Promise<void> {\r\n    return this.dispatch(() => identity(data));\r\n  }\r\n\r\n  form(\r\n    formId: string,\r\n    interactionType: 'VIEWED' | 'SUBMITTED',\r\n    componentInstanceId: string\r\n  ): Promise<void> {\r\n    return this.dispatch(() => form(formId, interactionType, componentInstanceId));\r\n  }\r\n\r\n  /**\r\n   * Ensure the SDK is initialized with server adapters, then run `send`; swallow failures.\r\n   * @param {() => Promise<unknown>} send - Events dispatch call to run once initialized.\r\n   */\r\n  private async dispatch(send: () => Promise<unknown>): Promise<void> {\r\n    try {\r\n      const initialized = await this.ensureInit();\r\n      if (!initialized) return;\r\n      await send();\r\n    } catch (e) {\r\n      debug.common('server analytics dispatch failed: %o', e);\r\n    }\r\n  }\r\n\r\n  private ensureInit(): Promise<boolean> {\r\n    if (!this.initPromise) {\r\n      this.initPromise = this.doInit();\r\n    }\r\n    return this.initPromise;\r\n  }\r\n\r\n  private async doInit(): Promise<boolean> {\r\n    const edge = this.config?.api?.edge;\r\n    if (!edge?.contextId) {\r\n      debug.common('Edge contextId missing from configuration; server analytics disabled');\r\n      return false;\r\n    }\r\n    const req = this.ssrContext?.req;\r\n    const res = this.ssrContext?.res;\r\n    if (!req || !res) {\r\n      debug.common('Node req/res not available in REQUEST_CONTEXT; server analytics disabled');\r\n      return false;\r\n    }\r\n\r\n    const hostHeader = req.headers['x-forwarded-host'] ?? req.headers.host;\r\n    const hostname =\r\n      (Array.isArray(hostHeader) ? hostHeader[0] : hostHeader)?.split(':')[0] || 'localhost';\r\n\r\n    await initContentSdk({\r\n      config: {\r\n        contextId: edge.contextId,\r\n        edgeUrl: edge.edgeUrl,\r\n        siteName: this.config?.defaultSite ?? '',\r\n      },\r\n      plugins: [\r\n        analyticsPlugin({\r\n          options: {\r\n            enableCookie: true,\r\n            cookieDomain: normalizeCookieDomain(hostname),\r\n          },\r\n          adapter: analyticsServerAdapter(\r\n            req as unknown as AdapterRequest,\r\n            res as unknown as AdapterResponse\r\n          ),\r\n        }),\r\n        eventsPlugin(),\r\n      ],\r\n    });\r\n    return true;\r\n  }\r\n}\r\n","import type { SitecoreClient } from '@sitecore-content-sdk/content/client';\r\nimport {\r\n  EnvironmentProviders,\r\n  makeEnvironmentProviders,\r\n  Provider,\r\n  PLATFORM_ID,\r\n  inject,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n  SITECORE_CONFIG_TOKEN,\r\n  SITECORE_CLIENT_TOKEN,\r\n  ERROR_ROUTE_TOKEN,\r\n  NOT_FOUND_ROUTE_TOKEN,\r\n} from './tokens';\r\nimport { SITECORE_ANALYTICS } from './analytics/sitecore-analytics';\r\nimport { SitecoreAnalyticsBrowser } from './analytics/sitecore-analytics.browser';\r\nimport { SitecoreAnalyticsServer } from './analytics/sitecore-analytics.server';\r\nimport type { AngularSitecoreConfig } from '../config/define-config';\r\n\r\n/**\r\n * Configuration for the Sitecore Angular SDK.\r\n * @public\r\n */\r\nexport interface AngularCSDKAppInit {\r\n  /**\r\n   * Sitecore configuration (e.g. from sitecore.config.ts).\r\n   * When provided, {@link sitecoreClient} must also be set; both are registered for DI.\r\n   */\r\n  sitecoreConfig?: AngularSitecoreConfig;\r\n  /**\r\n   * Application-owned {@link SitecoreClient} instance (e.g. from a module singleton).\r\n   * Required when {@link sitecoreConfig} is set; registered as {@link SITECORE_CLIENT_TOKEN}.\r\n   */\r\n  sitecoreClient?: SitecoreClient;\r\n  notFoundRoute?: string;\r\n  errorRoute?: string;\r\n}\r\n\r\n/**\r\n * Provides Sitecore Angular SDK services to the application.\r\n * Call this in your `app.config.ts` `providers` array.\r\n * @param {AngularCSDKAppInit} init SDK configuration\r\n * @param {AngularCSDKAppInit} init.sitecoreConfig - Sitecore configuration\r\n * @param {AngularCSDKAppInit} init.sitecoreClient - Sitecore client\r\n * @param {AngularCSDKAppInit} init.notFoundRoute - Not found route\r\n * @param {AngularCSDKAppInit} init.errorRoute - Error route\r\n * @returns {EnvironmentProviders} Angular environment providers\r\n * @example\r\n * // app.config.ts\r\n * import scConfig from '../sitecore.config';\r\n * import { getClient } from '../content-sdk/client/sitecore-client';\r\n * export const appConfig: ApplicationConfig = {\r\n *   providers: [\r\n *     provideSitecoreAngular({ sitecoreConfig: scConfig, sitecoreClient: getClient() }),\r\n *   ],\r\n * };\r\n * @public\r\n */\r\nexport function provideSitecoreAngular(init: AngularCSDKAppInit): EnvironmentProviders {\r\n  const providers: Array<Provider | EnvironmentProviders> = [];\r\n\r\n  if (init.sitecoreConfig !== undefined || init.sitecoreClient !== undefined) {\r\n    if (init.sitecoreConfig === undefined || init.sitecoreClient === undefined) {\r\n      throw new Error(\r\n        'provideSitecoreAngular: `sitecoreConfig` and `sitecoreClient` must both be provided together.'\r\n      );\r\n    }\r\n    providers.push({ provide: SITECORE_CONFIG_TOKEN, useValue: init.sitecoreConfig });\r\n    providers.push({ provide: SITECORE_CLIENT_TOKEN, useValue: init.sitecoreClient });\r\n  }\r\n  if (init.notFoundRoute) {\r\n    providers.push({ provide: NOT_FOUND_ROUTE_TOKEN, useValue: init.notFoundRoute });\r\n  }\r\n  if (init.errorRoute) {\r\n    providers.push({ provide: ERROR_ROUTE_TOKEN, useValue: init.errorRoute });\r\n  }\r\n\r\n  // Browser-only analytics façade. The server implementation is a no-op, so consumers\r\n  // (e.g. CdpPageView) can inject SITECORE_ANALYTICS without platform guards.\r\n  providers.push({\r\n    provide: SITECORE_ANALYTICS,\r\n    useFactory: () =>\r\n      isPlatformBrowser(inject(PLATFORM_ID))\r\n        ? new SitecoreAnalyticsBrowser()\r\n        : new SitecoreAnalyticsServer(),\r\n  });\r\n\r\n  return makeEnvironmentProviders(providers as Parameters<typeof makeEnvironmentProviders>[0]);\r\n}\r\n","import {\r\n  EnvironmentProviders,\r\n  inject,\r\n  makeEnvironmentProviders,\r\n  REQUEST_CONTEXT,\r\n} from '@angular/core';\r\nimport { LOADER_REGISTRY } from '../loaders/loader-registry.token';\r\nimport { SERVER_LOADER_RUNNER } from '../loaders/server-loader-runner.token';\r\nimport { LoaderCache, LoaderRunnerInit } from '../loaders/models';\r\nimport { ServerLoaderRunner } from './server-loader-runner';\r\nimport { SITECORE_CONFIG_TOKEN } from '../lib/tokens';\r\n\r\n/**\r\n * Wires SSR {@link SERVER_LOADER_RUNNER} to ServerLoaderRunner\r\n * using the shared {@link LOADER_REGISTRY}. Include in server application providers\r\n * alongside provideLoaderRegistry.\r\n * @returns Environment providers for SSR loader data resolution\r\n * @public\r\n */\r\nexport function provideServerLoaderRunner(): EnvironmentProviders {\r\n  return makeEnvironmentProviders([\r\n    {\r\n      provide: SERVER_LOADER_RUNNER,\r\n      useFactory: () => {\r\n        const registry = inject(LOADER_REGISTRY);\r\n        const config = inject(SITECORE_CONFIG_TOKEN);\r\n        return {\r\n          resolve(request: LoaderRunnerInit) {\r\n            const ssrContext = inject(REQUEST_CONTEXT, { optional: true }) as\r\n              | { cache?: LoaderCache }\r\n              | undefined;\r\n            const cache = ssrContext?.cache;\r\n            return new ServerLoaderRunner(registry, config, cache).resolve(request);\r\n          },\r\n        };\r\n      },\r\n    },\r\n  ]);\r\n}\r\n","import type { EditingPreviewData } from '@sitecore-content-sdk/content/editing';\r\nimport type { CsdkRequestData } from '../../loaders/models';\r\nimport { EDITING_PARAMS_HEADER } from '../../editing/constants';\r\n\r\n/**\r\n * Read the editing preview data from the request context produced by the\r\n * SSR resolver (`extractRequestData`). Returns `undefined` when the\r\n * request did not flow through {@link createEditingRenderMiddleware}.\r\n *\r\n * Loaders use this to branch between published-content fetching\r\n * (`client.getPage`) and preview fetching (`client.getPreview`).\r\n * @param {CsdkRequestData | undefined} csdkRequestData - Loader request context.\r\n * @returns {EditingPreviewData | undefined} Parsed preview data or `undefined`.\r\n * @public\r\n */\r\nexport function getEditingPreviewData(\r\n  csdkRequestData: CsdkRequestData | undefined\r\n): EditingPreviewData | undefined {\r\n  const raw = csdkRequestData?.headers?.[EDITING_PARAMS_HEADER];\r\n  const headerValue = Array.isArray(raw) ? raw[0] : raw;\r\n  if (!headerValue) {\r\n    return undefined;\r\n  }\r\n  try {\r\n    return JSON.parse(headerValue) as EditingPreviewData;\r\n  } catch {\r\n    return undefined;\r\n  }\r\n}\r\n","import { Storage, createStorage, Driver } from 'unstorage';\r\nimport {\r\n  InvalidateInput,\r\n  LoaderCache,\r\n  LoaderCacheConfig,\r\n  LoaderCacheEntry,\r\n  LoaderCacheEntryInfo,\r\n  LoaderCacheReadResult,\r\n} from '../../loaders/models';\r\nimport { evaluateCacheRead, applyLoaderCacheConfigDefaults } from './utils';\r\nimport { CACHE_KEY_PREFIX } from './cache-key';\r\nimport { GlobalLoaderCacheConfig } from './models';\r\n\r\n/** Prefix for tag-index keys in unstorage (entries use `sc:loader:…` keys directly). */\r\nconst TAG_INDEX_PREFIX = 'tag:';\r\n\r\n/**\r\n * Unstorage-backed {@link LoaderCache} for persistent or shared storage.\r\n * Two key spaces share one driver: `{cacheKey}` entries and `tag:{tag}` index arrays.\r\n * Semantics match {@link InMemoryLoaderCache}: `invalidate` marks stale; `get` uses\r\n * {@link evaluateCacheRead} for hit/stale/miss.\r\n * @internal\r\n */\r\nexport class UnstorageLoaderCache implements LoaderCache {\r\n  private readonly storage: Storage;\r\n  private readonly _config: Required<LoaderCacheConfig>;\r\n\r\n  /**\r\n   * @param {Driver} driver - Unstorage driver instance from the app (`server.ts`).\r\n   * @param {LoaderCacheConfig} [config] - Resolved cache configuration.\r\n   */\r\n  constructor(driver: Driver, config: GlobalLoaderCacheConfig = {}) {\r\n    this.storage = createStorage({ driver });\r\n    this._config = applyLoaderCacheConfigDefaults(config);\r\n  }\r\n\r\n  /** @inheritdoc */\r\n  get ttl(): number {\r\n    return this._config.revalidate;\r\n  }\r\n\r\n  /** @inheritdoc */\r\n  get config(): Readonly<LoaderCacheConfig> {\r\n    return this._config;\r\n  }\r\n\r\n  /** @inheritdoc */\r\n  async get(cacheKey: string): Promise<LoaderCacheReadResult> {\r\n    const entry = await this.storage.getItem<LoaderCacheEntry>(this.cacheStorageKey(cacheKey));\r\n    return evaluateCacheRead(cacheKey, entry ?? null);\r\n  }\r\n\r\n  /** @inheritdoc */\r\n  async set(cacheKey: string, value: unknown, ttlSeconds: number, tags: string[]): Promise<void> {\r\n    const existing = await this.storage.getItem<LoaderCacheEntry>(this.cacheStorageKey(cacheKey));\r\n    if (existing) {\r\n      await this.unlinkTags(cacheKey, existing.tags);\r\n    }\r\n\r\n    const expiresAt = ttlSeconds > 0 ? Date.now() + ttlSeconds * 1000 : null;\r\n    const entry: LoaderCacheEntry = {\r\n      value,\r\n      tags: [...tags],\r\n      storedAt: Date.now(),\r\n      expiresAt,\r\n      stale: false,\r\n    };\r\n    await this.storage.setItem(this.cacheStorageKey(cacheKey), entry);\r\n    await this.linkTags(cacheKey, tags);\r\n  }\r\n\r\n  /** @inheritdoc */\r\n  async invalidate(filter: InvalidateInput): Promise<number> {\r\n    const tags = filter.tags ?? [];\r\n    if (tags.length === 0) {\r\n      return 0;\r\n    }\r\n    const keys = await this.resolveCacheKeysFromTags(tags);\r\n    let marked = 0;\r\n    for (const cacheKey of keys) {\r\n      const entry = await this.storage.getItem<LoaderCacheEntry>(this.cacheStorageKey(cacheKey));\r\n      if (!entry) {\r\n        continue;\r\n      }\r\n      if (!entry.stale) {\r\n        await this.storage.setItem(this.cacheStorageKey(cacheKey), { ...entry, stale: true });\r\n      }\r\n      marked++;\r\n    }\r\n    return marked;\r\n  }\r\n\r\n  /** @inheritdoc */\r\n  async delete(cacheKey: string): Promise<boolean> {\r\n    const entry = await this.storage.getItem<LoaderCacheEntry>(this.cacheStorageKey(cacheKey));\r\n    if (!entry) {\r\n      return false;\r\n    }\r\n    await this.unlinkTags(cacheKey, entry.tags);\r\n    await this.storage.removeItem(this.cacheStorageKey(cacheKey));\r\n    return true;\r\n  }\r\n\r\n  /** @inheritdoc */\r\n  async flush(): Promise<void> {\r\n    await this.storage.clear();\r\n  }\r\n\r\n  /** @inheritdoc */\r\n  async entries(): Promise<LoaderCacheEntryInfo[]> {\r\n    const keys = await this.storage.getKeys(CACHE_KEY_PREFIX);\r\n    const out: LoaderCacheEntryInfo[] = [];\r\n    for (const cacheKey of keys) {\r\n      const entry = await this.storage.getItem<LoaderCacheEntry>(cacheKey);\r\n      if (!entry) {\r\n        continue;\r\n      }\r\n      out.push({\r\n        key: cacheKey,\r\n        tags: [...entry.tags],\r\n        storedAt: entry.storedAt,\r\n        expiresAt: entry.expiresAt,\r\n        stale: entry.stale,\r\n      });\r\n    }\r\n    return out;\r\n  }\r\n\r\n  /** @inheritdoc */\r\n  enabled(): boolean {\r\n    return this._config.enabled;\r\n  }\r\n\r\n  /**\r\n   * Cache entry storage key (OSR-aligned `sc:loader:…`).\r\n   * @param {string} cacheKey - Public loader cache key.\r\n   * @returns {string} Unstorage key for the entry payload.\r\n   */\r\n  private cacheStorageKey(cacheKey: string): string {\r\n    return cacheKey;\r\n  }\r\n\r\n  /**\r\n   * Tag index storage key (`tag:{tag}`).\r\n   * @param {string} tag - OSR cache tag.\r\n   * @returns {string} Unstorage key for the tag index bucket.\r\n   */\r\n  private tagStorageKey(tag: string): string {\r\n    return `${TAG_INDEX_PREFIX}${tag}`;\r\n  }\r\n\r\n  /**\r\n   * Links a cache key into each tag bucket.\r\n   * @param {string} cacheKey - Cache entry key.\r\n   * @param {string[]} tags - Tags to link.\r\n   */\r\n  private async linkTags(cacheKey: string, tags: string[]): Promise<void> {\r\n    for (const tag of tags) {\r\n      const storageKey = this.tagStorageKey(tag);\r\n      const current = (await this.storage.getItem<string[]>(storageKey)) ?? [];\r\n      if (!current.includes(cacheKey)) {\r\n        await this.storage.setItem(storageKey, [...current, cacheKey]);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Unlinks a cache key from each tag bucket.\r\n   * @param {string} cacheKey - Cache entry key.\r\n   * @param {string[]} tags - Tags to unlink.\r\n   */\r\n  private async unlinkTags(cacheKey: string, tags: string[]): Promise<void> {\r\n    for (const tag of tags) {\r\n      const storageKey = this.tagStorageKey(tag);\r\n      const current = (await this.storage.getItem<string[]>(storageKey)) ?? [];\r\n      const next = current.filter((k) => k !== cacheKey);\r\n      if (next.length === 0) {\r\n        await this.storage.removeItem(storageKey);\r\n      } else {\r\n        await this.storage.setItem(storageKey, next);\r\n      }\r\n    }\r\n  }\r\n\r\n  /** @param {string[]} tags - Tags to resolve. @returns {Promise<Set<string>>} Matching cache keys. */\r\n  private async resolveCacheKeysFromTags(tags: string[]): Promise<Set<string>> {\r\n    const out = new Set<string>();\r\n    for (const tag of tags) {\r\n      const keys = (await this.storage.getItem<string[]>(this.tagStorageKey(tag))) ?? [];\r\n      for (const key of keys) {\r\n        out.add(key);\r\n      }\r\n    }\r\n    return out;\r\n  }\r\n}\r\n","import { LoaderCache } from '../../loaders/models';\r\nimport { GlobalLoaderCacheConfig } from './models';\r\nimport { UnstorageLoaderCache } from './unstorage-loader-cache';\r\nimport { resolveConfig } from './utils';\r\nimport memoryDriver from 'unstorage/drivers/memory';\r\n\r\n/**\r\n * Public factory for the loader cache with unstorage backing.\r\n * Uses the memory driver by default.\r\n *\r\n * Drivers are best imported and constructed in the app's `server.ts` and passed here as an instance.\r\n * Callers depend on the {@link LoaderCache} interface; concrete classes are not exported.\r\n * @param {GlobalLoaderCacheConfig} [config] - Global cache config and optional unstorage driver.\r\n * @returns {LoaderCache} Cache implementation with SWR + tag semantics.\r\n * @example\r\n * ```ts\r\n * const cache = createLoaderCache({\r\n *   revalidate: config.angular.loadersCache.revalidate,\r\n *   enabled: config.angular.loadersCache.enabled,\r\n *   defaultSiteName: config.defaultSite,\r\n *   driver: fsDriver({ base: './.cache/loaders' }),\r\n * });\r\n * ```\r\n * @public\r\n */\r\nexport function createLoaderCache(config: GlobalLoaderCacheConfig = {}): LoaderCache {\r\n  const resolved = resolveConfig(config);\r\n  const driver = config.driver ?? memoryDriver();\r\n  return new UnstorageLoaderCache(driver, resolved);\r\n}\r\n","// Configuration\r\nexport { LOADER_DATA_ENDPOINT } from './constants';\r\n\r\nexport { ServerLoaderRunner } from './server-loader-runner';\r\nexport { provideServerLoaderRunner } from './provide-server-loader-runner';\r\n\r\nexport * from './middleware';\r\nexport { getEditingPreviewData } from './editing/get-editing-preview-data';\r\n\r\n// Loader cache (server-only). Browser code must not reach createLoaderCache —\r\n// see plan §1 (Browser safety). The exports here are types + server factories;\r\n// they tree-shake out of the browser bundle when not referenced.\r\nexport * from './cache';\r\n/**\r\n * @public\r\n */\r\nexport type { LoaderRegistry } from '../loaders/loader-registry.token';\r\n","import { Injectable, inject, computed, PLATFORM_ID, REQUEST, type Signal } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Router, NavigationEnd, type ActivatedRouteSnapshot } from '@angular/router';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { filter, map, startWith } from 'rxjs';\r\nimport type { Page } from '@sitecore-content-sdk/content/client';\r\nimport { DictionaryPhrases } from '@sitecore-content-sdk/content/i18n';\r\nimport { SITECORE_CONFIG_TOKEN } from './tokens';\r\nimport { splitLocaleFromPath, resolveCurrentPath } from '../i18n/locale-utils';\r\n/** Merged keys from route resolve data (same keys apps use today). */\r\ninterface SitecoreRouteData {\r\n  page?: Page | null;\r\n  dictionary?: DictionaryPhrases | null;\r\n}\r\n/**\r\n * Walk the activated route tree and merge `data` from every snapshot node.\r\n * @param {Router} router - Angular Router instance\r\n * @returns {SitecoreRouteData} Merged route data\r\n */\r\nfunction getMergedRouteData(router: Router): SitecoreRouteData {\r\n  const merged: SitecoreRouteData = {};\r\n  const stack: ActivatedRouteSnapshot[] = [router.routerState.snapshot.root];\r\n  while (stack.length > 0) {\r\n    const route = stack.pop()!;\r\n    Object.assign(merged, route.data);\r\n    stack.push(...route.children);\r\n  }\r\n  return merged;\r\n}\r\n/**\r\n * Request-scoped Sitecore context derived reactively from the Angular Router.\r\n *\r\n * - `page` / `dictionary` — from route resolve data (`loaderResolver('page'|'dictionary')`)\r\n * - `urlLocale` — from current pathname (SSR REQUEST / window.location, then NavigationEnd)\r\n * - `isEditing` / `effectiveLocale` — computed from page + urlLocale + config\r\n *\r\n * No manual `setPage` / `setDictionary` / `setLocale` wiring required in app components.\r\n * @public\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class SitecoreContextService {\r\n  /** Current Sitecore page data (layout + mode). */\r\n  readonly page: Signal<Page | null> = computed(() => this.routeData()?.page ?? null);\r\n  /** Current Sitecore dictionary data. */\r\n  readonly dictionary: Signal<DictionaryPhrases | null> = computed(\r\n    () => this.routeData()?.dictionary ?? null\r\n  );\r\n  /** Whether the current page is in editing mode. */\r\n  readonly isEditing: Signal<boolean> = computed(() => this.page()?.mode?.isEditing ?? false);\r\n  /** Whether the current page is in preview mode. */\r\n  readonly isPreview: Signal<boolean> = computed(() => this.page()?.mode?.isPreview ?? false);\r\n  /**\r\n   * Locale extracted from the current URL; `null` when no configured-locale prefix\r\n   * or when locales are not configured.\r\n   */\r\n  readonly urlLocale: Signal<string | null> = computed(() => {\r\n    if (this.locales.length === 0) {\r\n      return null;\r\n    }\r\n    return splitLocaleFromPath(this.pathname(), this.locales).locale;\r\n  });\r\n  /**\r\n   * Effective locale for data fetching: `page.locale ?? urlLocale ?? defaultLanguage`.\r\n   */\r\n  readonly effectiveLocale: Signal<string> = computed(\r\n    () => this.page()?.locale ?? this.urlLocale() ?? this.defaultLanguage\r\n  );\r\n  private readonly router = inject(Router);\r\n  private readonly config = inject(SITECORE_CONFIG_TOKEN, { optional: true });\r\n  private readonly platformId = inject(PLATFORM_ID);\r\n  private readonly req = inject(REQUEST, { optional: true });\r\n  private readonly isBrowser = isPlatformBrowser(this.platformId);\r\n  private readonly locales = this.config?.angular?.locales ?? [];\r\n  private readonly defaultLanguage = this.config?.defaultLanguage ?? 'en';\r\n  /** Merged resolve data; updates on every completed navigation. */\r\n  private readonly routeData = toSignal(\r\n    this.router.events.pipe(\r\n      filter((e): e is NavigationEnd => e instanceof NavigationEnd),\r\n      map(() => getMergedRouteData(this.router)),\r\n      startWith(getMergedRouteData(this.router))\r\n    ),\r\n    { initialValue: getMergedRouteData(this.router) }\r\n  );\r\n  /**\r\n   * Current pathname without query string.\r\n   * SSR/bootstrap: REQUEST or window.location; client: NavigationEnd.urlAfterRedirects.\r\n   */\r\n  private readonly pathname = toSignal(\r\n    this.router.events.pipe(\r\n      filter((e): e is NavigationEnd => e instanceof NavigationEnd),\r\n      map((e) => e.urlAfterRedirects.split('?')[0]),\r\n      startWith(resolveCurrentPath(this.req ?? null, this.isBrowser))\r\n    ),\r\n    { initialValue: resolveCurrentPath(this.req ?? null, this.isBrowser) }\r\n  );\r\n}\r\n","import { Component, PLATFORM_ID, Renderer2, computed, effect, inject } from '@angular/core';\r\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\r\nimport { getContentSdkPagesClientData } from '@sitecore-content-sdk/content/editing';\r\nimport { SitecoreContextService } from './sitecore-context.service';\r\n\r\n/**\r\n * Injects the Sitecore Pages editor's client-side bootstrap scripts inside the application's HTML.\r\n * Place this component once at the application root (e.g. in `app.component.html`) so it\r\n * survives every route navigation.\r\n * @example\r\n * ```html\r\n * <sc-editing-scripts />\r\n * <router-outlet />\r\n * ```\r\n * @public\r\n */\r\n@Component({\r\n  selector: 'sc-editing-scripts',\r\n  template: '',\r\n})\r\nexport class ScEditingScriptsComponent {\r\n  private readonly context = inject(SitecoreContextService);\r\n  private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n  private readonly renderer = inject(Renderer2);\r\n  private readonly document = inject(DOCUMENT);\r\n\r\n  private readonly mode = computed(() => this.context.page()?.mode);\r\n  private readonly injectedScripts: HTMLScriptElement[] = [];\r\n\r\n  constructor() {\r\n    effect(() => {\r\n      this.clearScripts();\r\n\r\n      const pageMode = this.mode();\r\n      if (this.isBrowser || !pageMode || !pageMode.isEditing) return;\r\n\r\n      const { clientScripts, clientData } = this.context.page()?.layout?.sitecore?.context ?? {};\r\n\r\n      for (const src of clientScripts ?? []) {\r\n        const scriptElement = this.renderer.createElement('script');\r\n        scriptElement.src = src;\r\n        this.renderer.appendChild(this.document.body, scriptElement);\r\n        this.injectedScripts.push(scriptElement);\r\n      }\r\n\r\n      const csdkClientData = { ...clientData, ...getContentSdkPagesClientData() };\r\n      for (const [id, data] of Object.entries(csdkClientData)) {\r\n        const scriptElement = this.renderer.createElement('script');\r\n        this.renderer.setAttribute(scriptElement, 'id', id);\r\n        this.renderer.setAttribute(scriptElement, 'type', 'application/json');\r\n        scriptElement.innerHTML = JSON.stringify(data);\r\n        this.renderer.appendChild(this.document.body, scriptElement);\r\n        this.injectedScripts.push(scriptElement);\r\n      }\r\n    });\r\n  }\r\n\r\n  private clearScripts(): void {\r\n    for (const el of this.injectedScripts) {\r\n      el.parentNode?.removeChild(el);\r\n    }\r\n    this.injectedScripts.length = 0;\r\n  }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { TranslateLoader } from '@ngx-translate/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { SitecoreContextService } from '../lib/sitecore-context.service';\r\nimport debug from '../debug';\r\n\r\n/**\r\n * `ngx-translate` loader using Sitecore dictionary from {@link SitecoreContextService}.\r\n * Requires a `dictionaryLoader` resolver on the active route — without it, `dictionary()`\r\n * is `null` and translations resolve to `{}`.\r\n * @public\r\n */\r\n@Injectable()\r\nexport class SitecoreTranslateLoader implements TranslateLoader {\r\n  private readonly context = inject(SitecoreContextService);\r\n\r\n  /**\r\n   * Returns the translation based on the dictionary in the context from {@link SitecoreContextService}.\r\n   * @returns {Observable<Record<string, string>>} Observable of translation dictionary.\r\n   */\r\n  getTranslation(): Observable<Record<string, string>> {\r\n    const dictionary = this.context.dictionary();\r\n    debug.dictionary('ngx translate uses dictionary', dictionary);\r\n    return of(dictionary ?? {});\r\n  }\r\n}\r\n","import { Injectable, PLATFORM_ID, REQUEST, inject } from '@angular/core';\r\nimport { DefaultUrlSerializer, type UrlTree } from '@angular/router';\r\nimport { SITECORE_CONFIG_TOKEN } from '../lib/tokens';\r\nimport { resolveCurrentPath, splitLocaleFromPath } from './locale-utils';\r\nimport { getLocaleRewrite } from '@sitecore-content-sdk/content/i18n';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n/**\r\n * Locale-aware {@link UrlSerializer} replacement. Extends {@link DefaultUrlSerializer} and\r\n * prepends the current URL locale (from the request pathname) to every serialized\r\n * URL. Angular's built-in `[routerLink]` computes hrefs via `router.serializeUrl()`, which\r\n * delegates to the DI-injected `UrlSerializer.serialize()` — so replacing the binding makes\r\n * every routerLink href locale-aware with no directive changes.\r\n *\r\n * Behavior:\r\n * - When `currentLocale` is `null` (URL has no configured locale prefix), serialization is\r\n *   unchanged.\r\n * - When the serialized URL already starts with a configured locale segment, serialization\r\n *   is unchanged (mirrors ScLinkDirective idempotency under repeated cycles).\r\n * - Otherwise the locale segment is prepended to the serialized URL.\r\n *\r\n * Parsing is inherited from the default — this serializer does **not** strip locale on\r\n * parse. The locale matcher (`scLocaleMatcher`) consumes the locale segment from the\r\n * route tree instead.\r\n * @public\r\n */\r\n@Injectable()\r\nexport class LocaleUrlSerializer extends DefaultUrlSerializer {\r\n  private readonly locales =\r\n    inject(SITECORE_CONFIG_TOKEN, { optional: true })?.angular?.locales ?? [];\r\n  private readonly req = inject(REQUEST, { optional: true });\r\n  private readonly platformId = inject(PLATFORM_ID);\r\n\r\n  override serialize(tree: UrlTree): string {\r\n    const base = super.serialize(tree);\r\n    if (this.locales.length > 0 && splitLocaleFromPath(base, this.locales).locale) {\r\n      return base;\r\n    }\r\n    const isBrowser = isPlatformBrowser(this.platformId);\r\n    const currentLocale = splitLocaleFromPath(\r\n      resolveCurrentPath(this.req, isBrowser),\r\n      this.locales\r\n    ).locale;\r\n\r\n    if (!currentLocale) {\r\n      return base;\r\n    }\r\n    return getLocaleRewrite(base, currentLocale);\r\n  }\r\n}\r\n","import { Type } from '@angular/core';\r\n\r\n/**\r\n * SXA uses a special export name to identify the \"default\" variant.\r\n * @public\r\n */\r\nexport const DEFAULT_EXPORT_NAME = 'Default';\r\n\r\nexport type AngularModule = {\r\n  /** Named variant exports */\r\n  [key: string]: Type<unknown> | undefined;\r\n  /** Default component for this rendering */\r\n  default?: Type<unknown>;\r\n  /** SXA convention: uppercase Default */\r\n  Default?: Type<unknown>;\r\n};\r\n\r\n/**\r\n * An entry in the Angular component map. Maps Sitecore rendering names to Angular component types.\r\n * Supports SXA rendering variants via named exports alongside a default.\r\n * @public\r\n */\r\nexport type AngularContentSdkComponent = Type<unknown> | AngularModule;\r\n\r\n/**\r\n * The Angular component map type: maps Sitecore rendering names to standalone component types or SXA variant groups.\r\n * @public\r\n */\r\nexport type ComponentMap = Map<string, AngularContentSdkComponent>;\r\n","import { InjectionToken } from '@angular/core';\r\nimport type { ComponentMap } from './types';\r\n\r\n/**\r\n * Injection token for the Sitecore component map.\r\n * Provide this at the application level via `provideSitecoreAngular` or\r\n * directly as `{ provide: SITECORE_COMPONENT_MAP, useValue: yourMap }`.\r\n * @public\r\n */\r\nexport const SITECORE_COMPONENT_MAP = new InjectionToken<ComponentMap>('SITECORE_COMPONENT_MAP');\r\n","import { Type } from '@angular/core';\r\nimport {\r\n  ComponentRendering,\r\n  RouteData,\r\n  isDynamicPlaceholder,\r\n  getDynamicPlaceholderPattern,\r\n} from '@sitecore-content-sdk/content/layout';\r\nimport { HIDDEN_RENDERING_NAME } from '@sitecore-content-sdk/content';\r\nimport { DEFAULT_PLACEHOLDER_UID } from '@sitecore-content-sdk/content/editing';\r\nimport { AngularContentSdkComponent, ComponentMap, DEFAULT_EXPORT_NAME } from '../types';\r\n\r\n/**\r\n * Result of resolving a component for a rendering definition.\r\n */\r\nexport interface ComponentForRendering {\r\n  component: Type<unknown> | null;\r\n  isEmpty: boolean;\r\n}\r\n\r\n/**\r\n * Merged props passed to each child component rendered by a placeholder.\r\n */\r\nexport interface ChildComponentProps {\r\n  fields: { [key: string]: unknown };\r\n  params: { [key: string]: string };\r\n  rendering: ComponentRendering;\r\n}\r\n\r\n/**\r\n * Get the renderings for the specified placeholder from the rendering layout data.\r\n * Includes dynamic placeholder handling\r\n * @param {ComponentRendering | RouteData} rendering - rendering data\r\n * @param {string} name - placeholder name\r\n * @param {boolean} isEditing - whether editing mode is active\r\n * @returns {ComponentRendering[]} Child renderings for the placeholder.\r\n */\r\nexport const getPlaceholderRenderings = (\r\n  rendering: ComponentRendering | RouteData,\r\n  name: string,\r\n  isEditing: boolean\r\n): ComponentRendering[] => {\r\n  let phName = name.slice();\r\n  let placeholdersForRead: Record<string, ComponentRendering[]> | undefined;\r\n\r\n  if (rendering?.placeholders) {\r\n    if (isEditing) {\r\n      Object.keys(rendering.placeholders).forEach((key) => {\r\n        const patternPlaceholder = isDynamicPlaceholder(key)\r\n          ? getDynamicPlaceholderPattern(key)\r\n          : null;\r\n\r\n        if (patternPlaceholder && patternPlaceholder.test(phName)) {\r\n          phName = key;\r\n        }\r\n      });\r\n      placeholdersForRead = rendering.placeholders;\r\n    } else {\r\n      placeholdersForRead = { ...rendering.placeholders };\r\n      Object.entries(rendering.placeholders).forEach(([key, value]) => {\r\n        const patternPlaceholder = isDynamicPlaceholder(key)\r\n          ? getDynamicPlaceholderPattern(key)\r\n          : null;\r\n\r\n        if (patternPlaceholder && patternPlaceholder.test(phName)) {\r\n          placeholdersForRead![phName] = value;\r\n          delete placeholdersForRead![key];\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  let result: ComponentRendering[] | null = null;\r\n  if (rendering && placeholdersForRead && Object.keys(placeholdersForRead).length > 0) {\r\n    result = placeholdersForRead[phName] ?? null;\r\n  }\r\n\r\n  if (!result) {\r\n    console.warn(\r\n      `Placeholder '${phName}' was not found in the current rendering data`,\r\n      JSON.stringify(rendering, null, 2)\r\n    );\r\n    return [];\r\n  }\r\n\r\n  return result;\r\n};\r\n\r\n/**\r\n * Returns true when the placeholder name resolves to a key declared on the parent\r\n * rendering's `placeholders` map (including dynamic-placeholder pattern keys in editing mode).\r\n * an undeclared name is not the same as a declared-but-empty placeholder.\r\n * @param {ComponentRendering | RouteData} rendering - Parent rendering / route node.\r\n * @param {string} name - Placeholder name from the template.\r\n * @param {boolean} isEditing - Whether editing mode is active.\r\n * @returns {boolean} Whether the layout declares this placeholder.\r\n * @internal\r\n */\r\nexport function isPlaceholderDeclaredInLayout(\r\n  rendering: ComponentRendering | RouteData,\r\n  name: string,\r\n  isEditing: boolean\r\n): boolean {\r\n  if (!rendering?.placeholders || Object.keys(rendering.placeholders).length === 0) {\r\n    return false;\r\n  }\r\n\r\n  let phName = name.slice();\r\n\r\n  if (isEditing) {\r\n    Object.keys(rendering.placeholders).forEach((key) => {\r\n      const patternPlaceholder = isDynamicPlaceholder(key)\r\n        ? getDynamicPlaceholderPattern(key)\r\n        : null;\r\n\r\n      if (patternPlaceholder && patternPlaceholder.test(phName)) {\r\n        phName = key;\r\n      }\r\n    });\r\n    return Object.prototype.hasOwnProperty.call(rendering.placeholders, phName);\r\n  }\r\n\r\n  if (Object.prototype.hasOwnProperty.call(rendering.placeholders, phName)) {\r\n    return true;\r\n  }\r\n\r\n  return Object.keys(rendering.placeholders).some((key) => {\r\n    if (!isDynamicPlaceholder(key)) {\r\n      return false;\r\n    }\r\n    return getDynamicPlaceholderPattern(key).test(phName);\r\n  });\r\n};\r\n\r\n/**\r\n * Extra inputs to set on each dynamically rendered component (in addition to `fields`, `params`, and `rendering`).\r\n * Keys are Angular `input()` names on the host component.\r\n * @public\r\n */\r\nexport type PassThroughProps = Readonly<Record<string, unknown>>;\r\n\r\n/**\r\n * Get SXA specific params from Sitecore rendering params.\r\n * @param {ComponentRendering} rendering - Rendering object.\r\n * @returns {{ Styles: string } | undefined} Converted SXA params, or `undefined` when none apply.\r\n */\r\nexport const getSXAParams = (rendering: ComponentRendering) => {\r\n  if (!rendering.params) return { Styles: '' };\r\n\r\n  const { GridParameters, Styles } = rendering.params;\r\n\r\n  if (GridParameters || Styles) {\r\n    return { Styles: `${GridParameters || ''} ${Styles || ''}` };\r\n  }\r\n\r\n  return undefined;\r\n};\r\n\r\n/**\r\n * Merge placeholder-level fields/params with per-component fields/params.\r\n * @param {{ [key: string]: unknown } | undefined} placeholderFields - Placeholder-level fields.\r\n * @param {{ [key: string]: string } | undefined} placeholderParams - Placeholder-level params.\r\n * @param {ComponentRendering} componentRendering - The component rendering data.\r\n * @returns {ChildComponentProps} Merged child component props.\r\n */\r\nexport function getChildComponentProps(\r\n  placeholderFields: { [key: string]: unknown } | undefined,\r\n  placeholderParams: { [key: string]: string } | undefined,\r\n  componentRendering: ComponentRendering\r\n): ChildComponentProps {\r\n  const fields = { ...(placeholderFields || {}), ...(componentRendering.fields || {}) };\r\n  const params = { ...(placeholderParams || {}), ...(componentRendering.params || {}) };\r\n  const sxa = getSXAParams(componentRendering);\r\n  return {\r\n    fields,\r\n    params: {\r\n      ...params,\r\n      ...(sxa || {}),\r\n    },\r\n    rendering: componentRendering,\r\n  };\r\n}\r\n\r\n/**\r\n * Resolve a component type for a rendering definition.\r\n * Handles hidden renderings, missing components, variant selection, and map lookup.\r\n * FEaaS/BYOC are intentionally not handled; they fall through to missingComponent.\r\n * @param {object} args - The arguments object.\r\n * @param {ComponentRendering} args.renderingDefinition - The rendering to resolve.\r\n * @param {string} args.placeholderName - Current placeholder name (for logging).\r\n * @param {ComponentMap} args.componentMap - The app component map.\r\n * @param {object} args.hiddenRenderingComponent - Optional override for hidden renderings.\r\n * @param {object} args.missingComponentComponent - Optional override for missing/unknown components.\r\n * @returns {ComponentForRendering} Resolved component info.\r\n */\r\nexport const resolveComponentForRendering = ({\r\n  renderingDefinition,\r\n  placeholderName,\r\n  componentMap,\r\n  hiddenRenderingComponent,\r\n  missingComponentComponent,\r\n}: {\r\n  renderingDefinition: ComponentRendering;\r\n  placeholderName: string;\r\n  componentMap: ComponentMap;\r\n  hiddenRenderingComponent?: Type<unknown>;\r\n  missingComponentComponent?: Type<unknown>;\r\n}): ComponentForRendering => {\r\n  if (renderingDefinition.componentName === HIDDEN_RENDERING_NAME) {\r\n    return {\r\n      component: hiddenRenderingComponent ?? null,\r\n      isEmpty: true,\r\n    };\r\n  }\r\n\r\n  if (!renderingDefinition.componentName) {\r\n    return {\r\n      component: null,\r\n      isEmpty: true,\r\n    };\r\n  }\r\n\r\n  let entry: Type<unknown> | AngularContentSdkComponent | undefined;\r\n  const hasComponentMap = !!(componentMap && componentMap.size > 0);\r\n  if (!hasComponentMap) {\r\n    console.warn(\r\n      `No components were available in component map to service request for component ${renderingDefinition.componentName}`\r\n    );\r\n  } else {\r\n    entry = componentMap.get(renderingDefinition.componentName);\r\n  }\r\n\r\n  if (!entry) {\r\n    console.error(\r\n      `Placeholder ${placeholderName} contains unknown component ${renderingDefinition.componentName}. Ensure that an Angular component exists for it, and that it is registered in your component map.`\r\n    );\r\n    return {\r\n      component: missingComponentComponent ?? null,\r\n      isEmpty: true,\r\n    };\r\n  }\r\n\r\n  // If entry is a direct component class (function / class constructor), return it\r\n  if (typeof entry === 'function') {\r\n    return { component: entry, isEmpty: false };\r\n  }\r\n\r\n  // AngularCsdkComponent (SXA variants): pick export by FieldNames\r\n  const exportName = renderingDefinition.params?.FieldNames;\r\n  const resolved =\r\n    exportName && exportName !== DEFAULT_EXPORT_NAME\r\n      ? (entry[exportName] as Type<unknown> | undefined)\r\n      : entry.default || entry.Default;\r\n\r\n  if (!resolved || typeof resolved !== 'function') {\r\n    const variantLabel = exportName && exportName !== DEFAULT_EXPORT_NAME ? ` (${exportName})` : '';\r\n    console.error(\r\n      `Placeholder ${placeholderName} contains unknown component ${renderingDefinition.componentName}${variantLabel}. Ensure that an Angular component exists for it, and that it is registered in your component map.`\r\n    );\r\n    return {\r\n      component: missingComponentComponent ?? null,\r\n      isEmpty: true,\r\n    };\r\n  }\r\n\r\n  return { component: resolved, isEmpty: false };\r\n};\r\n\r\n/**\r\n * Compute the placeholder chrome `id` attribute\r\n * lookup: matches a static placeholder name when present in the parent rendering, else\r\n * resolves a dynamic-placeholder pattern, else falls back to\r\n * `<placeholderName>_<DEFAULT_PLACEHOLDER_UID>`.\r\n * @param {ComponentRendering} rendering - The parent rendering object.\r\n * @param {string} placeholderName - Current placeholder name.\r\n * @param {string} [renderingUid] - Optional rendering uid to append (parent rendering uid for\r\n * the outer placeholder marker, omitted for the root route).\r\n * @returns {string} Computed placeholder chrome id.\r\n * @internal\r\n */\r\nexport function computePlaceholderChromeId(\r\n  rendering: ComponentRendering,\r\n  placeholderName: string,\r\n  renderingUid?: string\r\n): string {\r\n  const placeholders = rendering.placeholders ?? {};\r\n  for (const placeholder of Object.keys(placeholders)) {\r\n    if (placeholderName === placeholder) {\r\n      return renderingUid\r\n        ? `${placeholderName}_${renderingUid}`\r\n        : `${placeholderName}_${DEFAULT_PLACEHOLDER_UID}`;\r\n    }\r\n    if (isDynamicPlaceholder(placeholder)) {\r\n      const pattern = getDynamicPlaceholderPattern(placeholder);\r\n      if (pattern.test(placeholderName)) {\r\n        return renderingUid\r\n          ? `${placeholder}_${renderingUid}`\r\n          : `${placeholder}_${DEFAULT_PLACEHOLDER_UID}`;\r\n      }\r\n    }\r\n  }\r\n  return '';\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { ComponentRendering } from '@sitecore-content-sdk/content/layout';\r\n\r\n/**\r\n * Default component rendered when a Sitecore rendering has no matching entry in the component map.\r\n * @public\r\n */\r\n@Component({\r\n  selector: 'sc-missing-component',\r\n  template: `\r\n    <div style=\"background: darkorange; outline: 5px solid orange; padding: 10px; color: white; max-width: 500px;\">\r\n      <h2>{{ componentName() }}</h2>\r\n      <p>Content SDK component is missing an Angular implementation. See the developer console for more information.</p>\r\n    </div>\r\n  `,\r\n})\r\nexport class ScMissingComponentComponent {\r\n  readonly rendering = input<ComponentRendering>();\r\n  readonly fields = input<{ [key: string]: unknown }>();\r\n  readonly params = input<{ [key: string]: string }>();\r\n\r\n  readonly componentName = () => {\r\n    const r = this.rendering();\r\n    return r?.componentName || 'Unnamed Component';\r\n  };\r\n}\r\n","import { Component, HostBinding } from '@angular/core';\r\n@Component({\r\n  selector: 'sc-hidden-rendering',\r\n  template: 'The component is hidden',\r\n})\r\nexport class ScHiddenRenderingComponent {\r\n  @HostBinding('style') get style() {\r\n    return 'background-image: linear-gradient(45deg, #ffffff 25%, #dcdcdc 25%, #dcdcdc 50%, #ffffff 50%, #ffffff 75%, #dcdcdc 75%, #dcdcdc 100%); background-size: 3px 3px; display: flex; justify-content: center; align-items: center; padding: 30px; color: #aaa;';\r\n  }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { ComponentRendering, RouteData } from '@sitecore-content-sdk/content/layout';\r\n\r\n/**\r\n * Context passed to {@link PlaceholderGuardResolver} and {@link PlaceholderDataResolver}.\r\n * @public\r\n */\r\nexport interface PlaceholderResolverContext {\r\n  /** Placeholder key being rendered (e.g. `headless-main`). */\r\n  name: string;\r\n  /** Parent route or rendering node that owns the placeholder map. */\r\n  rendering: ComponentRendering | RouteData;\r\n}\r\n\r\n/**\r\n * Synchronous filter applied after layout renderings are fetched and before components\r\n * are instantiated. Return the renderings that should mount — omit entries to block them.\r\n * @public\r\n */\r\nexport type PlaceholderGuardResolver = (\r\n  renderings: ComponentRendering[],\r\n  context: PlaceholderResolverContext\r\n) => ComponentRendering[];\r\n\r\n/**\r\n * Synchronous enrichment pass applied after the guard and before instantiation.\r\n * Use to decorate `fields` / `params` on renderings (e.g. personalization metadata).\r\n * Must remain synchronous; fetch async data in a loader and feed results here.\r\n * @public\r\n */\r\nexport type PlaceholderDataResolver = (\r\n  renderings: ComponentRendering[],\r\n  context: PlaceholderResolverContext\r\n) => ComponentRendering[];\r\n\r\nconst defaultGuardResolver: PlaceholderGuardResolver = (renderings) => renderings;\r\n\r\nconst defaultDataResolver: PlaceholderDataResolver = (renderings) => renderings;\r\n\r\n/**\r\n * Optional hook to filter placeholder renderings before {@link ScPlaceholderComponent}\r\n * instantiates child components. Defaults to an identity pass-through.\r\n * @public\r\n */\r\nexport const PLACEHOLDER_GUARD_RESOLVER = new InjectionToken<PlaceholderGuardResolver>(\r\n  'PLACEHOLDER_GUARD_RESOLVER',\r\n  { providedIn: 'root', factory: () => defaultGuardResolver }\r\n);\r\n\r\n/**\r\n * Optional hook to decorate placeholder renderings after the guard pass. Defaults to\r\n * an identity pass-through.\r\n * @public\r\n */\r\nexport const PLACEHOLDER_DATA_RESOLVER = new InjectionToken<PlaceholderDataResolver>(\r\n  'PLACEHOLDER_DATA_RESOLVER',\r\n  { providedIn: 'root', factory: () => defaultDataResolver }\r\n);\r\n","import {\r\n  Component,\r\n  ComponentRef,\r\n  Injector,\r\n  TemplateRef,\r\n  Type,\r\n  ViewContainerRef,\r\n  computed,\r\n  effect,\r\n  inject,\r\n  input,\r\n  isDevMode,\r\n  signal,\r\n  viewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ComponentRendering, RouteData } from '@sitecore-content-sdk/content/layout';\r\nimport { MetadataKind, resetEditorChromes } from '@sitecore-content-sdk/content/editing';\r\nimport { SitecoreContextService } from '../../lib/sitecore-context.service';\r\nimport { SITECORE_COMPONENT_MAP } from '../tokens';\r\nimport type { AngularContentSdkComponent, ComponentMap } from '../types';\r\nimport {\r\n  getPlaceholderRenderings,\r\n  getChildComponentProps,\r\n  resolveComponentForRendering,\r\n  computePlaceholderChromeId,\r\n  isPlaceholderDeclaredInLayout,\r\n  type PassThroughProps,\r\n} from './placeholder-utils';\r\nimport { ScMissingComponentComponent } from '../sc-missing-component.component';\r\nimport { ScHiddenRenderingComponent } from '../sc-hidden-rendering.component';\r\nimport {\r\n  PLACEHOLDER_DATA_RESOLVER,\r\n  PLACEHOLDER_GUARD_RESOLVER,\r\n  type PlaceholderResolverContext,\r\n} from './placeholder-tokens';\r\n\r\n/**\r\n * Angular placeholder component. Renders components from layout data for a given placeholder name.\r\n *\r\n * Usage:\r\n * ```html\r\n * <sc-placeholder name=\"headless-main\" [rendering]=\"route\"></sc-placeholder>\r\n * ```\r\n *\r\n * Optional `[passThroughProps]` sets extra `input()` values on each child (merged after\r\n * `fields`, `params`, and `rendering`).\r\n *\r\n * **Editing chrome (Metadata mode only).** When the page is in editing mode, the placeholder\r\n * emits Sitecore Pages chrome markers using a declarative `<ng-template>` rendered into the\r\n * same `ViewContainerRef` that hosts the dynamic child components. The structure matches\r\n * Metadata-mode output:\r\n *\r\n * ```\r\n * <code class=\"scpm\" chrometype=\"placeholder\" kind=\"open\" id=\"…\" />   ← once, outer\r\n *   <code class=\"scpm\" chrometype=\"rendering\" kind=\"open\" id=\"<uid>\"/>\r\n *   <child-component />\r\n *   <code class=\"scpm\" chrometype=\"rendering\" kind=\"close\" />\r\n *   …\r\n * <code class=\"scpm\" chrometype=\"placeholder\" kind=\"close\" />          ← once, outer\r\n * ```\r\n *\r\n * An empty placeholder still emits the outer placeholder pair in editing mode so authors can\r\n * target the empty region in Sitecore Pages.\r\n *\r\n * **Guards & data resolvers.** Inject `PLACEHOLDER_GUARD_RESOLVER` and/or\r\n * `PLACEHOLDER_DATA_RESOLVER` to filter or decorate the renderings before they are\r\n * instantiated. Resolvers are synchronous; if you need async data, fetch it in the page\r\n * loader and feed cached results into the resolver.\r\n * @public\r\n */\r\n@Component({\r\n  selector: 'sc-placeholder',\r\n  host: { '[class.sc-jss-empty-placeholder]': 'emptyInEditing()' },\r\n  imports: [CommonModule],\r\n  template: `\r\n    <ng-template\r\n      #editingChromeBlock\r\n      let-kind=\"kind\"\r\n      let-chrometype=\"chrometype\"\r\n      let-chromeId=\"chromeId\"\r\n    >\r\n      <code\r\n        type=\"text/sitecore\"\r\n        class=\"scpm\"\r\n        [attr.chrometype]=\"chrometype\"\r\n        [attr.kind]=\"kind\"\r\n        [attr.id]=\"chromeId || null\"\r\n      ></code>\r\n    </ng-template>\r\n    <ng-template #placeholderView></ng-template>\r\n  `,\r\n})\r\nexport class ScPlaceholderComponent {\r\n  /** Name of the placeholder to render. */\r\n  readonly name = input.required<string>();\r\n\r\n  /** Rendering or route data containing placeholders. */\r\n  readonly rendering = input.required<ComponentRendering | RouteData>();\r\n\r\n  /** Optional placeholder-level fields merged into each child. */\r\n  readonly fields = input<{ [key: string]: unknown }>();\r\n\r\n  /** Optional placeholder-level params merged into each child's `params` input. */\r\n  readonly params = input<{ [key: string]: string }>();\r\n\r\n  /**\r\n   * Extra inputs to set on each dynamically created component, after the standard `fields`,\r\n   * `params`, and `rendering` inputs. Keys must match `input()` names on the target components.\r\n   */\r\n  readonly passThroughProps = input<PassThroughProps>({});\r\n\r\n  /** Override component map (defaults to injected `SITECORE_COMPONENT_MAP`). */\r\n  readonly componentMap = input<ComponentMap>();\r\n\r\n  /** Override for missing component rendering. */\r\n  readonly missingComponent = input<Type<unknown>>();\r\n\r\n  /** Override for hidden rendering component. */\r\n  readonly hiddenRenderingComponent = input<Type<unknown>>();\r\n\r\n  private readonly context = inject(SitecoreContextService);\r\n  private readonly contextComponentMap = inject(SITECORE_COMPONENT_MAP, { optional: true });\r\n  private readonly injector = inject(Injector);\r\n  private readonly guardResolver = inject(PLACEHOLDER_GUARD_RESOLVER);\r\n  private readonly dataResolver = inject(PLACEHOLDER_DATA_RESOLVER);\r\n\r\n  private readonly placeholderViewRef = viewChild('placeholderView', { read: ViewContainerRef });\r\n  private readonly editingChromeBlock = viewChild('editingChromeBlock', { read: TemplateRef });\r\n\r\n  private readonly isEditing = computed(() => this.context.isEditing());\r\n\r\n  /** True when the placeholder has no renderings and the page is in editing mode. */\r\n  protected readonly emptyInEditing = signal(false);\r\n\r\n  constructor() {\r\n    effect(() => {\r\n      const container = this.placeholderViewRef();\r\n      const editingChromeBlock = this.editingChromeBlock();\r\n      const rendering = this.rendering();\r\n      const name = this.name();\r\n      const isEditing = this.isEditing();\r\n      const componentMap =\r\n        this.componentMap() ??\r\n        this.contextComponentMap ??\r\n        new Map<string, AngularContentSdkComponent>();\r\n\r\n      if (!container) {\r\n        return;\r\n      }\r\n\r\n      this.updateView({ container, editingChromeBlock, rendering, name, isEditing, componentMap });\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Render the placeholder slot. Composes:\r\n   *   `[outer placeholder open] → [rendering open + child + rendering close]* → [outer placeholder close]`\r\n   * @param {object} args - Render arguments captured from the reactive effect.\r\n   * @param {object} args.container - Target view container.\r\n   * @param {object} args.editingChromeBlock - The chrome `<ng-template>`.\r\n   * @param {object} args.rendering - Parent rendering / route node.\r\n   * @param {object} args.name - Placeholder name.\r\n   * @param {object} args.isEditing - Whether the page is in editing mode.\r\n   * @param {object} args.componentMap - Component map.\r\n   */\r\n  private updateView(args: {\r\n    container: ViewContainerRef;\r\n    editingChromeBlock: TemplateRef<unknown> | undefined;\r\n    rendering: ComponentRendering | RouteData;\r\n    name: string;\r\n    isEditing: boolean;\r\n    componentMap: ComponentMap;\r\n  }): void {\r\n    const { container, editingChromeBlock, rendering, name, isEditing, componentMap } = args;\r\n    container.clear();\r\n\r\n    const rawRenderings = getPlaceholderRenderings(rendering, name, isEditing);\r\n    const placeholderDeclared = isPlaceholderDeclaredInLayout(rendering, name, isEditing);\r\n    this.emptyInEditing.set(rawRenderings.length === 0 && isEditing && placeholderDeclared);\r\n\r\n    // Empty placeholder: in Metadata edit mode, still wrap with an outer placeholder\r\n    // pair so Pages can discover and target the empty region. Skip when the name is not\r\n    // declared on the parent rendering (matches JSS PlaceholderComponent early return).\r\n    if (rawRenderings.length === 0) {\r\n      if (isEditing && editingChromeBlock && placeholderDeclared) {\r\n        resetEditorChromes();\r\n        this.emitOuterChrome(container, editingChromeBlock, MetadataKind.Open, rendering, name);\r\n        this.emitOuterChrome(container, editingChromeBlock, MetadataKind.Close, rendering, name);\r\n      }\r\n      return;\r\n    }\r\n\r\n    const ctx: PlaceholderResolverContext = { name, rendering };\r\n\r\n    let filtered: ComponentRendering[];\r\n    try {\r\n      filtered = this.guardResolver(rawRenderings, ctx);\r\n    } catch (e) {\r\n      console.warn(`[sc-placeholder] guard resolver threw for '${name}'`, e);\r\n      return;\r\n    }\r\n\r\n    let enriched: ComponentRendering[];\r\n    try {\r\n      enriched = this.dataResolver(filtered, ctx);\r\n    } catch (e) {\r\n      console.warn(`[sc-placeholder] data resolver threw for '${name}'`, e);\r\n      return;\r\n    }\r\n\r\n    if (isEditing && editingChromeBlock) {\r\n      this.emitOuterChrome(container, editingChromeBlock, MetadataKind.Open, rendering, name);\r\n    }\r\n\r\n    for (const componentRendering of enriched) {\r\n      const { component } = resolveComponentForRendering({\r\n        renderingDefinition: componentRendering,\r\n        placeholderName: name,\r\n        componentMap,\r\n        hiddenRenderingComponent: this.hiddenRenderingComponent() ?? ScHiddenRenderingComponent,\r\n        missingComponentComponent: this.missingComponent() ?? ScMissingComponentComponent,\r\n      });\r\n\r\n      if (isEditing && editingChromeBlock) {\r\n        container.createEmbeddedView(editingChromeBlock, {\r\n          kind: MetadataKind.Open,\r\n          chrometype: 'rendering',\r\n          chromeId: componentRendering.uid,\r\n        });\r\n      }\r\n\r\n      if (component) {\r\n        const ref = container.createComponent(component, { injector: this.injector });\r\n        const childProps = getChildComponentProps(this.fields(), this.params(), componentRendering);\r\n        this.trySetInput(ref, 'fields', childProps.fields);\r\n        this.trySetInput(ref, 'params', childProps.params);\r\n        this.trySetInput(ref, 'rendering', childProps.rendering);\r\n\r\n        const passThrough = this.passThroughProps();\r\n        if (passThrough && typeof passThrough === 'object') {\r\n          for (const [inputName, value] of Object.entries(passThrough)) {\r\n            this.trySetInput(ref, inputName, value);\r\n          }\r\n        }\r\n      }\r\n\r\n      if (isEditing && editingChromeBlock) {\r\n        container.createEmbeddedView(editingChromeBlock, {\r\n          kind: MetadataKind.Close,\r\n          chrometype: 'rendering',\r\n        });\r\n      }\r\n    }\r\n\r\n    if (isEditing && editingChromeBlock) {\r\n      this.emitOuterChrome(container, editingChromeBlock, MetadataKind.Close, rendering, name);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Emit a single outer placeholder open/close marker into the structural slot. The open\r\n   * marker's `id` uses the parent rendering uid when nested, otherwise falls back to\r\n   * `placeholderName_DEFAULT_PLACEHOLDER_UID` (or the matching dynamic-placeholder pattern).\r\n   * @param {ViewContainerRef} container - Target view container.\r\n   * @param {TemplateRef<unknown>} editingChromeBlock - The chrome `<ng-template>`.\r\n   * @param {MetadataKind} kind - Open or close.\r\n   * @param {ComponentRendering | RouteData} rendering - Parent rendering / route node.\r\n   * @param {string} name - Placeholder name.\r\n   */\r\n  private emitOuterChrome(\r\n    container: ViewContainerRef,\r\n    editingChromeBlock: TemplateRef<unknown>,\r\n    kind: MetadataKind,\r\n    rendering: ComponentRendering | RouteData,\r\n    name: string\r\n  ): void {\r\n    if (kind === MetadataKind.Open) {\r\n      const parentUid = (rendering as ComponentRendering).uid;\r\n      const chromeId = computePlaceholderChromeId(rendering as ComponentRendering, name, parentUid);\r\n      container.createEmbeddedView(editingChromeBlock, {\r\n        kind: MetadataKind.Open,\r\n        chrometype: 'placeholder',\r\n        chromeId,\r\n      });\r\n    } else {\r\n      container.createEmbeddedView(editingChromeBlock, {\r\n        kind: MetadataKind.Close,\r\n        chrometype: 'placeholder',\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Best-effort input setter that silently ignores undeclared inputs on the target component.\r\n   * Logs in dev mode for diagnostic purposes.\r\n   * @param {ComponentRef<unknown>} ref - The dynamically created component reference.\r\n   * @param {string} inputName - Name of the input to set.\r\n   * @param {unknown} value - Input value.\r\n   */\r\n  private trySetInput(ref: ComponentRef<unknown>, inputName: string, value: unknown): void {\r\n    try {\r\n      ref.setInput(inputName, value);\r\n    } catch (e) {\r\n      if (isDevMode()) {\r\n        console.debug(\r\n          `[sc-placeholder] Skipped input \"${inputName}\" — not declared on component`,\r\n          e\r\n        );\r\n      }\r\n    }\r\n  }\r\n}\r\n","import {\r\n  Component,\r\n  inject,\r\n  input,\r\n  ElementRef,\r\n  ViewChild,\r\n  afterNextRender,\r\n  PLATFORM_ID,\r\n  DestroyRef,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { ComponentRendering } from '@sitecore-content-sdk/content/layout';\r\nimport { form } from '@sitecore-content-sdk/content';\r\nimport { isBotClientSide } from '@sitecore-content-sdk/analytics-core/internal';\r\nimport { SITECORE_CONFIG_TOKEN } from '../lib/tokens';\r\nimport { SitecoreContextService } from '../lib/sitecore-context.service';\r\n\r\nconst { executeScriptElements, loadForm, subscribeToFormSubmitEvent } = form;\r\n\r\n/* eslint-disable @typescript-eslint/member-ordering -- ViewChild + signal inputs + constructor ordering conflicts with default groups */\r\n/**\r\n * Angular wrapper for Sitecore Forms.\r\n * Loads form HTML from Edge, executes embedded scripts, and subscribes to form events.\r\n *\r\n * Usage: register in the component map with the rendering name \"Form\".\r\n * @public\r\n */\r\n@Component({\r\n  selector: 'sc-form',\r\n  template: ` <div #formContainer [class]=\"styles()\" [id]=\"renderingId()\"></div> `,\r\n})\r\nexport class ScFormComponent {\r\n  @ViewChild('formContainer', { static: true })\r\n  private formContainerRef!: ElementRef<HTMLDivElement>;\r\n\r\n  readonly rendering = input<ComponentRendering>();\r\n  readonly params = input<{ [key: string]: string }>({});\r\n\r\n  private readonly config = inject(SITECORE_CONFIG_TOKEN, { optional: true });\r\n  private readonly context = inject(SitecoreContextService);\r\n  private readonly platformId = inject(PLATFORM_ID);\r\n  private readonly destroyRef = inject(DestroyRef);\r\n\r\n  /**\r\n   * Merges `rendering.params` with the `params` input: the component `params()` values override layout for the same key.\r\n   */\r\n  private mergedFormParams(): { [key: string]: string } {\r\n    return { ...(this.rendering()?.params ?? {}), ...this.params() };\r\n  }\r\n\r\n  constructor() {\r\n    afterNextRender(() => {\r\n      if (!isPlatformBrowser(this.platformId)) return;\r\n\r\n      const p = this.mergedFormParams();\r\n      const formId = p.FormId;\r\n      if (!formId) return;\r\n\r\n      const cfg = this.config;\r\n      const edgeId = cfg?.api?.edge?.clientContextId;\r\n      const edgeUrl = cfg?.api?.edge?.edgeUrl;\r\n\r\n      if (!edgeId) {\r\n        console.warn(\r\n          'Warning: clientContextId is missing – form cannot be loaded properly on the client'\r\n        );\r\n        return;\r\n      }\r\n\r\n      let cancelled = false;\r\n      const abort = new AbortController();\r\n      this.destroyRef.onDestroy(() => {\r\n        cancelled = true;\r\n        abort.abort();\r\n      });\r\n\r\n      loadForm(edgeId, formId, edgeUrl)\r\n        .then((html: string) => {\r\n          if (cancelled) return;\r\n          const el = this.formContainerRef?.nativeElement;\r\n          if (!el) return;\r\n\r\n          el.innerHTML = html;\r\n\r\n          // Don't send form events in editing mode or for bots.\r\n          const isEditing = this.context.isEditing();\r\n          if (!isEditing && !isBotClientSide()) {\r\n            subscribeToFormSubmitEvent(el, this.rendering()?.uid, abort.signal);\r\n          }\r\n\r\n          executeScriptElements(el);\r\n        })\r\n        .catch(() => {\r\n          console.error(\r\n            `Failed to load form with id ${formId}. Check debug logs for content-sdk:form for more details.`\r\n          );\r\n        });\r\n    });\r\n  }\r\n\r\n  readonly styles = () => {\r\n    const p = this.mergedFormParams();\r\n    const s = p.styles;\r\n    return s ? s.replace(/\\s+$/, '') : '';\r\n  };\r\n  readonly renderingId = () => {\r\n    const p = this.mergedFormParams();\r\n    return p.RenderingIdentifier || undefined;\r\n  };\r\n}\r\n/* eslint-enable @typescript-eslint/member-ordering */\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { MetadataKind } from '@sitecore-content-sdk/content/editing';\r\n\r\n/**\r\n * Component that renders a field' metadata chrome element.\r\n */\r\n@Component({\r\n  selector: 'code[scFieldMetadataMarker]',\r\n  template: '{{ metadataString() }}',\r\n  host: {\r\n    '[attr.type]': '\"text/sitecore\"',\r\n    '[attr.chrometype]': '\"field\"',\r\n    '[class]': '\"scpm\"',\r\n    '[attr.kind]': 'kind()',\r\n  },\r\n})\r\nexport class FieldMetadataMarkerComponent {\r\n  readonly metadata = input<Record<string, unknown>>();\r\n\r\n  readonly kind = input<MetadataKind>(MetadataKind.Open);\r\n\r\n  readonly metadataString = computed(() => {\r\n    const metadata = this.metadata();\r\n    return metadata ? JSON.stringify(metadata) : '';\r\n  });\r\n}\r\n","import {\r\n  EmbeddedViewRef,\r\n  Renderer2,\r\n  TemplateRef,\r\n  Type,\r\n  ViewContainerRef,\r\n  effect,\r\n  inject,\r\n  type Signal,\r\n} from '@angular/core';\r\nimport {\r\n  isFieldValueEmpty,\r\n  type GenericFieldValue,\r\n  type Field,\r\n} from '@sitecore-content-sdk/content/layout';\r\nimport { MetadataKind } from '@sitecore-content-sdk/content/editing';\r\nimport { SitecoreContextService } from '../../lib/sitecore-context.service';\r\nimport { FieldMetadataMarkerComponent } from './metadata-chrome.component';\r\n\r\n/**\r\n * Subset of the Sitecore field shape used by the base directive: anything that may carry\r\n * editor `metadata`. Concrete subclasses constrain the value via their own field type.\r\n */\r\nexport type FieldLike = { metadata?: Record<string, unknown> };\r\n\r\n/**\r\n * Abstract base for the structural Sitecore field directives (`*scText`, `*scRichText`,\r\n * `*scImage`, `*scLink`, `*scRouterLink`).\r\n *\r\n * The base owns the reactive plumbing (an `effect` that fires {@link updateView} whenever\r\n * the field signal changes) plus the editing-mode helpers each subclass uses to compose\r\n * its render flow:\r\n *\r\n *   - {@link shouldRender} - true when the field has a renderable value\r\n *   - {@link renderOpen} / {@link renderClose} - emit the open/close `<code class=\"scpm\">`\r\n *     chrome markers used by Sitecore Pages to discover the field\r\n *   - {@link renderEmpty} - emit the empty-field placeholder between chrome markers when\r\n *     the page is in editing mode and the field carries `metadata`\r\n *\r\n * The chrome flow is *not* hidden inside the base: each subclass implements {@link updateView}\r\n * explicitly so the open / render / close sequence is visible at the directive level.\r\n *\r\n * This class intentionally has no `@Directive` decorator. Subclasses carry their own\r\n * `@Directive({ selector: ... })`, and the shared state here lives in field initializers\r\n * that run in the subclass's injection context.\r\n * @internal\r\n */\r\nexport abstract class BaseFieldDirective<TField> {\r\n  protected readonly viewContainer = inject(ViewContainerRef);\r\n  protected readonly templateRef = inject(TemplateRef<unknown>);\r\n  protected readonly renderer = inject(Renderer2);\r\n  protected readonly context = inject(SitecoreContextService, { optional: true });\r\n\r\n  /** Embedded view created by the latest successful render; cleared on each tick. */\r\n  protected viewRef?: EmbeddedViewRef<unknown>;\r\n\r\n  /** Concrete subclass exposes the Sitecore field via an aliased signal input. */\r\n  abstract readonly field: Signal<TField>;\r\n  /** Consumer-supplied empty-field template; takes precedence over {@link defaultEmptyComponent}. */\r\n  abstract readonly emptyFieldEditingTemplate: Signal<TemplateRef<unknown> | undefined>;\r\n  /** Default component rendered when the field is empty in editing mode and no template is supplied. */\r\n  protected abstract readonly defaultEmptyComponent: Type<unknown>;\r\n\r\n  constructor() {\r\n    effect(() => {\r\n      this.field();\r\n      this.emptyFieldEditingTemplate();\r\n      this.updateView();\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Renders the structural slot based on the current field value and editing state.\r\n   * Subclasses compose `shouldRender → renderEmpty | (renderOpen → createEmbeddedView →\r\n   * apply field value → renderClose)`.\r\n   */\r\n  protected abstract updateView(): void;\r\n\r\n  /**\r\n   * Returns true when the field has a real value to render. Subclasses can override to add\r\n   * field-specific rules (e.g. `ScLinkDirective` preserves authored text + href).\r\n   */\r\n  protected shouldRender(): boolean {\r\n    const f = this.field();\r\n    return !!f && !isFieldValueEmpty(f as GenericFieldValue | Partial<Field>);\r\n  }\r\n\r\n  /** Whether the host page is in editing mode. Falls back to `false` when no context is provided. */\r\n  protected isEditing(): boolean {\r\n    return this.context?.isEditing() ?? false;\r\n  }\r\n\r\n  /** Whether the host page is in preview mode. Falls back to `false` when no context is provided. */\r\n  protected isPreview(): boolean {\r\n    return this.context?.isPreview() ?? false;\r\n  }\r\n\r\n  /** Field metadata payload, when present. */\r\n  protected get fieldMetadata(): Record<string, unknown> | undefined {\r\n    return (this.field() as FieldLike | undefined)?.metadata;\r\n  }\r\n\r\n  /**\r\n   * Renders the empty-field state. In editing mode with field metadata, wraps either the\r\n   * consumer's `emptyFieldEditingTemplate` or {@link defaultEmptyComponent} in chrome markers\r\n   * so Sitecore Pages can target the empty slot. Outside editing or without metadata, emits\r\n   * nothing.\r\n   */\r\n  protected renderEmpty(): void {\r\n    if (!this.fieldMetadata || !this.isEditing()) {\r\n      return;\r\n    }\r\n    this.renderEditingChrome(MetadataKind.Open);\r\n    const tpl = this.emptyFieldEditingTemplate();\r\n    if (tpl) {\r\n      this.viewContainer.createEmbeddedView(tpl);\r\n    } else {\r\n      this.viewContainer.createComponent(this.defaultEmptyComponent);\r\n    }\r\n    this.renderEditingChrome(MetadataKind.Close);\r\n  }\r\n\r\n  /**\r\n   * Inserts a single chrome marker into the structural slot when both editing mode is active\r\n   * and the field carries metadata. No-ops otherwise.\r\n   * @param {MetadataKind} kind - Whether to emit the opening or closing marker.\r\n   */\r\n  protected renderEditingChrome(kind: MetadataKind): void {\r\n    const metadata = this.fieldMetadata;\r\n    if (!metadata || !this.isEditing()) {\r\n      return;\r\n    }\r\n    const ref = this.viewContainer.createComponent(FieldMetadataMarkerComponent);\r\n    ref.setInput('kind', kind);\r\n    if (kind === MetadataKind.Open) {\r\n      ref.setInput('metadata', metadata);\r\n    }\r\n  }\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n/**\r\n * Default component that will be rendered in pages when field is empty; applies for text, richtext, date and link fields.\r\n */\r\n@Component({\r\n  selector: 'span[sc-default-empty-text-field-editing-placeholder]',\r\n  template: '[No text in field]',\r\n})\r\nexport class DefaultEmptyFieldEditingComponent {}\r\n","import { Directive, TemplateRef, Type, input } from '@angular/core';\r\nimport { TextField } from '@sitecore-content-sdk/content/layout';\r\nimport { BaseFieldDirective } from './base-field.directive';\r\nimport { DefaultEmptyFieldEditingComponent } from '../default-empty-text-field.component';\r\nimport { MetadataKind } from '@sitecore-content-sdk/content/editing';\r\n\r\n/**\r\n * Structural directive that renders a Sitecore text field value into the consumer-supplied\r\n * wrapper element.\r\n *\r\n * Editing flow:\r\n *   - field has a renderable value → emit `<code class=\"scpm\" kind=\"open\">`, embed the\r\n *     consumer's template (e.g. `<h1>`), write the value into it, then emit\r\n *     `<code class=\"scpm\" kind=\"close\">`.\r\n *   - field is empty + page is in editing mode + field carries `metadata` → emit chrome\r\n *     markers around either the consumer's `scTextEmptyFieldEditingTemplate` or the default\r\n *     {@link DefaultEmptyTextFieldPlaceholderComponent}.\r\n *   - field is empty otherwise → render nothing.\r\n *\r\n * Usage:\r\n * ```html\r\n * <h1 *scText=\"fields.Title\"></h1>\r\n * <span *scText=\"fields.Subtitle; encode: false\"></span>\r\n * <h1 *scText=\"fields.Title; emptyTemplate: customEmptyTpl\"></h1>\r\n * ```\r\n * @public\r\n */\r\n@Directive({\r\n  selector: '[scText]',\r\n})\r\nexport class ScTextDirective extends BaseFieldDirective<TextField | undefined> {\r\n  /** The Sitecore text field. */\r\n  readonly field = input.required<TextField | undefined>({ alias: 'scText' });\r\n\r\n  /** Whether to HTML-encode the value (default: true). When false, uses innerHTML. */\r\n  readonly encode = input<boolean>(true, { alias: 'scTextEncode' });\r\n\r\n  /** Consumer-supplied template rendered between chrome markers when the field is empty in editing mode. */\r\n  readonly emptyFieldEditingTemplate = input<TemplateRef<unknown> | undefined>(undefined, {\r\n    alias: 'scTextEmptyFieldEditingTemplate',\r\n  });\r\n\r\n  protected readonly defaultEmptyComponent: Type<unknown> = DefaultEmptyFieldEditingComponent;\r\n\r\n  protected updateView(): void {\r\n    this.viewContainer.clear();\r\n    this.viewRef = undefined;\r\n\r\n    if (!this.shouldRender()) {\r\n      this.renderEmpty();\r\n      return;\r\n    }\r\n\r\n    this.renderEditingChrome(MetadataKind.Open);\r\n    this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef);\r\n    this.applyValue();\r\n    this.renderEditingChrome(MetadataKind.Close);\r\n  }\r\n\r\n  private applyValue(): void {\r\n    const field = this.field();\r\n    if (!field || !this.viewRef) return;\r\n    const value = field.value === null ? '' : String(field.value);\r\n    const encode = this.encode();\r\n    for (const node of this.viewRef.rootNodes) {\r\n      if (!(node instanceof Element)) continue;\r\n      if (encode) {\r\n        this.renderer.setProperty(node, 'textContent', value);\r\n      } else {\r\n        this.renderer.setProperty(node, 'innerHTML', value);\r\n      }\r\n    }\r\n  }\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\nconst EMPTY_IMAGE_SRC =\r\n  'data:image/svg+xml,%3Csvg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 240 240\" style=\"enable-background:new 0 0 240 240;\" xml:space=\"preserve\"%3E%3Cstyle type=\"text/css\"%3E .st0%7Bfill:none;%7D .st1%7Bfill:%23969696;%7D .st2%7Bfill:%23FFFFFF;%7D .st3%7Bfill:%23FFFFFF;stroke:%23FFFFFF;stroke-width:0.75;stroke-miterlimit:10;%7D%0A%3C/style%3E%3Cg%3E%3Crect class=\"st0\" width=\"240\" height=\"240\"/%3E%3Cg%3E%3Cg%3E%3Crect x=\"20\" y=\"20\" class=\"st1\" width=\"200\" height=\"200\"/%3E%3C/g%3E%3Cg%3E%3Ccircle class=\"st2\" cx=\"174\" cy=\"67\" r=\"14\"/%3E%3Cpath class=\"st2\" d=\"M174,54c7.17,0,13,5.83,13,13s-5.83,13-13,13s-13-5.83-13-13S166.83,54,174,54 M174,52 c-8.28,0-15,6.72-15,15s6.72,15,15,15s15-6.72,15-15S182.28,52,174,52L174,52z\"/%3E%3C/g%3E%3Cpolyline class=\"st3\" points=\"29.5,179.25 81.32,122.25 95.41,137.75 137.23,91.75 209.5,179.75 \"/%3E%3C/g%3E%3C/g%3E%3C/svg%3E';\r\n\r\n/**\r\n * Default component that will be rendered in pages when image field is empty.\r\n */\r\n@Component({\r\n  selector: '[sc-default-empty-image-field-editing-placeholder]',\r\n  template: `<img\r\n    alt=\"\"\r\n    class=\"scEmptyImage\"\r\n    [attr.src]=\"src\"\r\n    style=\"min-width:48px;min-height:48px;max-width:400px;max-height:400px;cursor:pointer\"\r\n  />`,\r\n})\r\nexport class DefaultEmptyImageFieldEditingComponent {\r\n  protected readonly src = EMPTY_IMAGE_SRC;\r\n}\r\n","/**\r\n * \"className\" property will be transformed into or appended to \"class\" instead.\r\n * @param {string} fieldAttrs all other props included on the image component\r\n * @returns {void}\r\n */\r\nexport const getClassFromField = (fieldAttrs: { [key: string]: unknown }): string | undefined => {\r\n  if (fieldAttrs.className) {\r\n    if (fieldAttrs.class) {\r\n      let mergedClass: string = fieldAttrs.className as string;\r\n      mergedClass += ` ${fieldAttrs.class}`;\r\n      return mergedClass;\r\n    } else {\r\n      return fieldAttrs.className as string | undefined;\r\n    }\r\n  }\r\n  return fieldAttrs.class as string | undefined;\r\n};\r\n\r\n/**\r\n * List of prefixes that are handled by the browser and should not be processed by the router links\r\n * @public\r\n */\r\nexport const EXTERNAL_HREF_PREFIXES = [\r\n  'http://',\r\n  'https://',\r\n  'mailto:',\r\n  'tel:',\r\n  'sms:',\r\n  'javascript:',\r\n  'data:',\r\n  'ftp:',\r\n  '//',\r\n];\r\n","import { Directive, TemplateRef, Type, input } from '@angular/core';\r\nimport { isFieldValueEmpty } from '@sitecore-content-sdk/content/layout';\r\nimport { mediaApi } from '@sitecore-content-sdk/content/media';\r\nimport { BaseFieldDirective } from './base-field.directive';\r\nimport { DefaultEmptyImageFieldEditingComponent } from '../default-empty-image-field.component';\r\nimport { getClassFromField } from './utils';\r\nimport { MetadataKind } from '@sitecore-content-sdk/content/editing';\r\n\r\n/**\r\n * Image field value shape.\r\n */\r\nexport interface ImageFieldValue {\r\n  [attributeName: string]: unknown;\r\n  src?: string;\r\n  alt?: string;\r\n  width?: number;\r\n  height?: number;\r\n  srcSet?: Array<{ [key: string]: string | number | undefined }>;\r\n}\r\n\r\n/**\r\n * Image field shape (with optional value wrapper).\r\n */\r\nexport interface ImageField {\r\n  value?: ImageFieldValue;\r\n  metadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Structural directive that renders a Sitecore image field onto a consumer-supplied `<img>`\r\n * element.\r\n *\r\n * Editing flow:\r\n *   - field has a renderable src → emit opening chrome marker, embed the consumer's `<img>`\r\n *     template, write `src/alt/width/height/class` onto it, emit closing chrome marker.\r\n *   - field is empty in editing mode + has `metadata` → render the empty-image placeholder\r\n *     between markers (overridable via `scImageEmptyFieldEditingTemplate`).\r\n *\r\n * Usage:\r\n * ```html\r\n * <img *scImage=\"fields.Image\" />\r\n * <img *scImage=\"fields.Image; imageParams: { mw: 800 }\" />\r\n * ```\r\n * @public\r\n */\r\n@Directive({\r\n  selector: '[scImage]',\r\n})\r\nexport class ScImageDirective extends BaseFieldDirective<ImageField | ImageFieldValue | undefined> {\r\n  /** The Sitecore image field (raw value or `{ value }` wrapper). */\r\n  readonly field = input.required<ImageField | ImageFieldValue | undefined>({ alias: 'scImage' });\r\n\r\n  /** Optional image params for media URL transformation. */\r\n  readonly imageParams = input<{ [paramName: string]: string | number } | undefined>();\r\n\r\n  /** Optional media URL prefix regexp. */\r\n  readonly mediaUrlPrefix = input<RegExp | undefined>();\r\n\r\n  /** Consumer-supplied template rendered between chrome markers when the field is empty in editing mode. */\r\n  readonly emptyFieldEditingTemplate = input<TemplateRef<unknown> | undefined>();\r\n\r\n  protected readonly defaultEmptyComponent: Type<unknown> = DefaultEmptyImageFieldEditingComponent;\r\n\r\n  protected updateView(): void {\r\n    this.viewContainer.clear();\r\n    this.viewRef = undefined;\r\n\r\n    if (!this.shouldRender()) {\r\n      this.renderEmpty();\r\n      return;\r\n    }\r\n\r\n    this.renderEditingChrome(MetadataKind.Open);\r\n    this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef);\r\n    this.applyValue();\r\n    this.renderEditingChrome(MetadataKind.Close);\r\n  }\r\n\r\n  protected shouldRender(): boolean {\r\n    const field = this.field();\r\n    if (!field || isFieldValueEmpty(field)) return false;\r\n    const img = (field as ImageFieldValue).src\r\n      ? (field as ImageFieldValue)\r\n      : (field as ImageField).value;\r\n    return !!img?.src;\r\n  }\r\n\r\n  private applyValue(): void {\r\n    const field = this.field();\r\n    if (!field || !this.viewRef) return;\r\n\r\n    const img = (field as ImageFieldValue).src\r\n      ? (field as ImageFieldValue)\r\n      : (field as ImageField).value;\r\n    if (!img?.src) return;\r\n\r\n    const params = this.imageParams();\r\n    const prefix = this.mediaUrlPrefix();\r\n    const resolvedSrc = mediaApi.updateImageUrl(img.src, params, prefix);\r\n\r\n    for (const node of this.viewRef.rootNodes) {\r\n      if (!(node instanceof Element)) continue;\r\n      const el = node as HTMLImageElement;\r\n      this.renderer.setAttribute(el, 'src', resolvedSrc);\r\n\r\n      if (Array.isArray(img.srcSet) && img.srcSet.length > 0) {\r\n        const srcSetValue = mediaApi.getSrcSet(resolvedSrc, img.srcSet, params, prefix);\r\n        if (srcSetValue) {\r\n          this.renderer.setAttribute(el, 'srcset', srcSetValue);\r\n        }\r\n      } else {\r\n        this.renderer.removeAttribute(el, 'srcset');\r\n      }\r\n\r\n      const classValue = getClassFromField(img);\r\n      if (classValue) {\r\n        this.renderer.addClass(el, classValue);\r\n      }\r\n\r\n      if (img.alt !== undefined) {\r\n        this.renderer.setAttribute(el, 'alt', img.alt);\r\n      } else {\r\n        this.renderer.removeAttribute(el, 'alt');\r\n      }\r\n      if (img.width !== undefined) {\r\n        this.renderer.setAttribute(el, 'width', String(img.width));\r\n      } else {\r\n        this.renderer.removeAttribute(el, 'width');\r\n      }\r\n      if (img.height !== undefined) {\r\n        this.renderer.setAttribute(el, 'height', String(img.height));\r\n      } else {\r\n        this.renderer.removeAttribute(el, 'height');\r\n      }\r\n    }\r\n  }\r\n}\r\n","import { Renderer2 } from '@angular/core';\r\nimport { isFieldValueEmpty, LinkField, LinkFieldValue } from '@sitecore-content-sdk/content/layout';\r\nimport { getClassFromField } from './utils';\r\n\r\n/**\r\n * Splits a CSS class string and applies each token via {@link Renderer2.addClass}.\r\n * @param {Renderer2} renderer - Angular renderer.\r\n * @param {HTMLElement} element - Target element.\r\n * @param {string} classString - Space-separated class names.\r\n * @returns {void}\r\n */\r\nfunction addClassTokens(renderer: Renderer2, element: HTMLElement, classString: string): void {\r\n  for (const token of classString.trim().split(/\\s+/).filter(Boolean)) {\r\n    renderer.addClass(element, token);\r\n  }\r\n}\r\n\r\n/**\r\n * Normalizes a Sitecore link field input to a {@link LinkFieldValue}, or `undefined` when empty.\r\n * @param {LinkField | LinkFieldValue | undefined | null} field - Raw field or value from layout.\r\n * @returns {LinkFieldValue | undefined} Resolved link value, or `undefined` when empty.\r\n */\r\nexport function resolveLinkFromField(\r\n  field: LinkField | LinkFieldValue | undefined | null\r\n): LinkFieldValue | undefined {\r\n  if (!field || isFieldValueEmpty(field)) {\r\n    return undefined;\r\n  }\r\n  return (field as LinkFieldValue).href ? (field as LinkFieldValue) : (field as LinkField).value;\r\n}\r\n\r\n/**\r\n * Builds the `href` string (path + query + hash fragment) from a link value.\r\n * @param {LinkFieldValue} link - Sitecore link field value.\r\n * @returns {string} Full `href` string for an anchor.\r\n */\r\nexport function buildHrefFromLinkField(link: LinkFieldValue): string {\r\n  const anchor = link.linktype !== 'anchor' && link.anchor ? `#${link.anchor}` : '';\r\n  const querystring = link.querystring ? `?${link.querystring}` : '';\r\n  return `${link.href || ''}${querystring}${anchor}`;\r\n}\r\n\r\nexport interface ApplyLinkFieldToAnchorOptions {\r\n  preferTextFromField: boolean;\r\n  originalClass?: string;\r\n  originalTitle?: string;\r\n  originalTarget?: string;\r\n  /** Host `rel` captured before the directive applied field data (e.g. template `rel=\"nofollow\"`). */\r\n  originalRel?: string | null;\r\n}\r\n\r\n/**\r\n * Applies Sitecore link attributes and optional text to a host anchor (shared by ScLink / ScRouterLink),\r\n * or preserves original attributes and text when the field link is empty.\r\n * @param {Renderer2} renderer - Angular renderer.\r\n * @param {HTMLAnchorElement} element - Host anchor element.\r\n * @param {LinkFieldValue | undefined} link - Resolved link value, or `undefined` when empty.\r\n * @param {ApplyLinkFieldToAnchorOptions} options - Text/class/title/target behavior flags.\r\n * @returns {void}\r\n */\r\nexport function applyLinkFieldToAnchor(\r\n  renderer: Renderer2,\r\n  element: HTMLAnchorElement,\r\n  link: LinkFieldValue | undefined,\r\n  options: ApplyLinkFieldToAnchorOptions\r\n): void {\r\n  if (!link) {\r\n    renderer.removeAttribute(element, 'href');\r\n  } else {\r\n    renderer.setAttribute(element, 'href', buildHrefFromLinkField(link));\r\n  }\r\n  const classValue = link ? getClassFromField(link) : undefined;\r\n  if (classValue) {\r\n    addClassTokens(renderer, element, classValue);\r\n  } else {\r\n    renderer.removeAttribute(element, 'class');\r\n    if (options.originalClass) {\r\n      addClassTokens(renderer, element, options.originalClass);\r\n    }\r\n\r\n    if (link?.title) {\r\n      renderer.setAttribute(element, 'title', link.title);\r\n    } else {\r\n      renderer.removeAttribute(element, 'title');\r\n      if (options.originalTitle) {\r\n        renderer.setAttribute(element, 'title', options.originalTitle);\r\n      }\r\n    }\r\n    if (link?.target) {\r\n      renderer.setAttribute(element, 'target', link.target);\r\n      if (link?.target === '_blank' && !options.originalRel) {\r\n        renderer.setAttribute(element, 'rel', 'noopener noreferrer');\r\n      } else {\r\n        options.originalRel\r\n          ? renderer.setAttribute(element, 'rel', options.originalRel)\r\n          : renderer.removeAttribute(element, 'rel');\r\n      }\r\n    } else {\r\n      renderer.removeAttribute(element, 'target');\r\n      if (options.originalTarget) {\r\n        renderer.setAttribute(element, 'target', options.originalTarget);\r\n      }\r\n    }\r\n\r\n    const hasChildren = element.childNodes.length > 0 && element.textContent?.trim();\r\n    if (!hasChildren) {\r\n      const text = link?.text || link?.href || '';\r\n      renderer.setProperty(element, 'textContent', text);\r\n    } else if (options.preferTextFromField && link?.text) {\r\n      renderer.setProperty(element, 'textContent', link?.text || '');\r\n    }\r\n  }\r\n}\r\n","import { Directive, TemplateRef, Type, inject, input } from '@angular/core';\r\nimport { LinkField, LinkFieldValue } from '@sitecore-content-sdk/content/layout';\r\nimport { getLocaleRewrite } from '@sitecore-content-sdk/content/i18n';\r\nimport { BaseFieldDirective } from './base-field.directive';\r\nimport { DefaultEmptyFieldEditingComponent } from '../default-empty-text-field.component';\r\nimport { applyLinkFieldToAnchor, resolveLinkFromField } from './link-field-utils';\r\nimport { SitecoreContextService } from '../../lib/sitecore-context.service';\r\nimport { SITECORE_CONFIG_TOKEN } from '../../lib/tokens';\r\nimport { splitLocaleFromPath } from '../../i18n/locale-utils';\r\nimport { MetadataKind } from '@sitecore-content-sdk/content/editing';\r\nimport { EXTERNAL_HREF_PREFIXES } from './utils';\r\n\r\ntype OriginalAnchorAttrs = {\r\n  class: string | undefined;\r\n  title: string | undefined;\r\n  target: string | undefined;\r\n  rel: string | null;\r\n};\r\n\r\n/**\r\n * Returns true when the href should be written to the DOM unchanged\r\n * (external scheme, protocol-relative, fragment-only, or empty/whitespace).\r\n * @param {string} href - Raw href string from the Sitecore link field.\r\n * @returns {boolean} Whether the href is non-internal and must be left alone.\r\n */\r\nfunction isNonInternalHref(href: string): boolean {\r\n  if (!href) return true;\r\n  const trimmed = href.trim();\r\n  if (!trimmed) return true;\r\n  if (trimmed.startsWith('#')) return true;\r\n  const lower = trimmed.toLowerCase();\r\n  return EXTERNAL_HREF_PREFIXES.some((p) => lower.startsWith(p));\r\n}\r\n\r\n/**\r\n * Structural directive that renders a Sitecore link field onto a consumer-supplied `<a>`.\r\n *\r\n * Editing flow:\r\n *   - field has a renderable href/text → emit opening chrome marker, embed the consumer's\r\n *     `<a>` template, write `href/title/target/class/text` onto it (locale-aware), emit\r\n *     closing chrome marker.\r\n *   - field is empty in editing mode + has `metadata` → render the empty-link placeholder\r\n *     between markers (overridable via `scLinkEmptyFieldEditingTemplate`).\r\n *\r\n * Locale-awareness: when a configured locale list is provided via `sitecore.config`,\r\n * internal hrefs are prefixed with the current URL locale (read from\r\n * {@link SitecoreContextService}). Hrefs that already contain a configured-locale segment\r\n * are written as-is, which respects author-intent cross-locale links and keeps the\r\n * directive idempotent under repeated change detection.\r\n *\r\n * Usage:\r\n * ```html\r\n * <a *scLink=\"fields.Link\"></a>\r\n * <a *scLink=\"fields.Link\">Optional child content</a>\r\n * ```\r\n * @public\r\n */\r\n@Directive({\r\n  selector: '[scLink]',\r\n})\r\nexport class ScLinkDirective extends BaseFieldDirective<LinkField | LinkFieldValue | undefined> {\r\n  /** The Sitecore link field. */\r\n  readonly field = input.required<LinkField | LinkFieldValue | undefined>({ alias: 'scLink' });\r\n  /** Whether to override existing anchor text with the field's text value. */\r\n  readonly preferTextFromField = input<boolean>(false, { alias: 'scLinkPreferTextFromField' });\r\n  /** Consumer-supplied template rendered between chrome markers when the field is empty in editing mode. */\r\n  readonly emptyFieldEditingTemplate = input<TemplateRef<unknown> | undefined>(undefined, {\r\n    alias: 'scLinkEmptyFieldEditingTemplate',\r\n  });\r\n\r\n  protected readonly defaultEmptyComponent: Type<unknown> = DefaultEmptyFieldEditingComponent;\r\n  protected readonly sitecoreContext = inject(SitecoreContextService);\r\n  private readonly locales =\r\n    inject(SITECORE_CONFIG_TOKEN, { optional: true })?.angular?.locales ?? [];\r\n  private readonly originalAttrs = new WeakMap<HTMLAnchorElement, OriginalAnchorAttrs>();\r\n\r\n  protected updateView(): void {\r\n    this.viewContainer.clear();\r\n    this.viewRef = undefined;\r\n\r\n    if (!this.shouldRender()) {\r\n      this.renderEmpty();\r\n      return;\r\n    }\r\n\r\n    this.renderEditingChrome(MetadataKind.Open);\r\n    this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef);\r\n    this.applyValue();\r\n    this.renderEditingChrome(MetadataKind.Close);\r\n  }\r\n\r\n  protected shouldRender(): boolean {\r\n    const field = this.field();\r\n    if (!field) return false;\r\n    if (resolveLinkFromField(field as LinkField | LinkFieldValue | undefined)) {\r\n      return true;\r\n    }\r\n    const text = (field as LinkFieldValue).text ?? (field as LinkField).value?.text;\r\n    return !!text && !this.fieldMetadata;\r\n  }\r\n\r\n  protected applyValue(): void {\r\n    const field = this.field();\r\n    if (!field || !this.viewRef) return;\r\n\r\n    const link = resolveLinkFromField(field);\r\n    const localizedLink = link ? this.localizeLink(link) : link;\r\n\r\n    for (const node of this.viewRef.rootNodes) {\r\n      if (!(node instanceof Element)) continue;\r\n      const anchor = node as HTMLAnchorElement;\r\n      const originals = this.getOriginals(anchor);\r\n      applyLinkFieldToAnchor(this.renderer, anchor, localizedLink, {\r\n        preferTextFromField: this.preferTextFromField(),\r\n        originalClass: originals.class,\r\n        originalTitle: originals.title,\r\n        originalTarget: originals.target,\r\n        originalRel: originals.rel,\r\n      });\r\n    }\r\n  }\r\n\r\n  private getOriginals(anchor: HTMLAnchorElement): OriginalAnchorAttrs {\r\n    let cached = this.originalAttrs.get(anchor);\r\n    if (!cached) {\r\n      cached = {\r\n        class: anchor.className || undefined,\r\n        title: anchor.getAttribute('title') ?? undefined,\r\n        target: anchor.getAttribute('target') ?? undefined,\r\n        rel: anchor.getAttribute('rel'),\r\n      };\r\n      this.originalAttrs.set(anchor, cached);\r\n    }\r\n    return cached;\r\n  }\r\n\r\n  /**\r\n   * Returns a copy of the link with `href` prefixed by the current URL locale when applicable.\r\n   * Internal hrefs are prefixed only when:\r\n   *   1. There is a current URL locale (page itself has a locale prefix), and\r\n   *   2. The href does not already start with a configured locale segment.\r\n   * External, fragment-only, and locale-prefixed hrefs are returned unchanged.\r\n   * @param {LinkFieldValue} link - Resolved link value from layout data.\r\n   * @returns {LinkFieldValue} Link value with locale-aware href.\r\n   */\r\n  private localizeLink(link: LinkFieldValue): LinkFieldValue {\r\n    const href = link.href ?? '';\r\n    if (isNonInternalHref(href)) {\r\n      return link;\r\n    }\r\n    if (this.locales.length > 0) {\r\n      const { locale } = splitLocaleFromPath(href, this.locales);\r\n      if (locale) {\r\n        return link;\r\n      }\r\n    }\r\n    const currentLocale = this.sitecoreContext.urlLocale();\r\n    if (!currentLocale) {\r\n      return link;\r\n    }\r\n    return { ...link, href: getLocaleRewrite(href, currentLocale) };\r\n  }\r\n}\r\n","import type { Renderer2 } from '@angular/core';\r\n\r\n/**\r\n * Options for {@link attachHoverPrefetch}.\r\n * @internal\r\n */\r\nexport interface HoverPrefetchOptions {\r\n  /** Hover dwell time (ms) before `onPrefetch` fires. */\r\n  delayMs: number;\r\n  /** Called with the anchor's current `href` once the hover dwell time elapses. */\r\n  onPrefetch: (href: string) => void;\r\n}\r\n\r\n/**\r\n * Attaches a debounced `mouseenter`-triggered prefetch listener to `anchor`. Hovering starts a\r\n * timer; if the pointer leaves before `delayMs` elapses, the timer is cancelled and nothing\r\n * fires. Each full hover-and-dwell cycle re-arms and can fire `onPrefetch` again — hovering is\r\n * a fresh, repeatable signal of intent, not a one-time trigger, so re-hovering after a previous\r\n * fire should be allowed to ask again rather than being permanently gated. The caller is\r\n * expected to pass that same intent through to `ClientLoaderDataService.prefetch({ force: true })`\r\n * so a possibly-stale staged answer from an earlier hover doesn't suppress a fresh one — see\r\n * `prefetchForUrl`'s `force` option.\r\n * @param {Renderer2} renderer - Renderer used to attach/detach the DOM listeners.\r\n * @param {HTMLAnchorElement} anchor - Anchor element to observe.\r\n * @param {HoverPrefetchOptions} options - Delay and prefetch callback.\r\n * @returns {() => void} Cleanup function that clears any pending timer and removes both listeners.\r\n * @internal\r\n */\r\nexport function attachHoverPrefetch(\r\n  renderer: Renderer2,\r\n  anchor: HTMLAnchorElement,\r\n  options: HoverPrefetchOptions\r\n): () => void {\r\n  let timer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n  const clearTimer = () => {\r\n    if (timer !== undefined) {\r\n      clearTimeout(timer);\r\n      timer = undefined;\r\n    }\r\n  };\r\n\r\n  const unlistenEnter = renderer.listen(anchor, 'mouseenter', () => {\r\n    if (timer !== undefined) {\r\n      return;\r\n    }\r\n    timer = setTimeout(() => {\r\n      timer = undefined;\r\n      const href = anchor.getAttribute('href')?.trim() ?? '';\r\n      if (href) {\r\n        options.onPrefetch(href);\r\n      }\r\n    }, options.delayMs);\r\n  });\r\n\r\n  const unlistenLeave = renderer.listen(anchor, 'mouseleave', clearTimer);\r\n\r\n  return () => {\r\n    clearTimer();\r\n    unlistenEnter();\r\n    unlistenLeave();\r\n  };\r\n}\r\n","import { Directive, inject, input, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Router } from '@angular/router';\r\nimport type { LinkField, LinkFieldValue } from '@sitecore-content-sdk/content/layout';\r\nimport { ScLinkDirective } from './sc-link.directive';\r\nimport { EXTERNAL_HREF_PREFIXES } from './utils';\r\nimport { attachHoverPrefetch } from './link-hover-prefetch';\r\nimport { ClientPreLoaderDataService } from '../../loaders/pre-loader-data.service';\r\nimport { SITECORE_CONFIG_TOKEN } from '../../lib/tokens';\r\nimport type { LinkPrefetchMode } from '../../config/define-config';\r\n\r\n/** Ultimate fallback when no `SITECORE_CONFIG_TOKEN` is provided. Mirrors `DEFAULT_LINK_PREFETCH` in `config/define-config.ts`. */\r\nconst FALLBACK_PREFETCH_MODE: LinkPrefetchMode = 'eager';\r\nconst FALLBACK_PREFETCH_DELAY_MS = 100;\r\n\r\n/**\r\n * Structural directive that renders a Sitecore link field onto a consumer-supplied `<a>` and\r\n * routes in-app navigation through `Router.navigateByUrl`. Clicks are left to the browser\r\n * when `href` is missing/empty, when `target=\"_blank\"`, or when the href uses an external\r\n * scheme (http(s), mailto, tel, sms, javascript, data, ftp, protocol-relative `//`).\r\n *\r\n * Internal links (browser only) prefetch the loaders that apply to them via\r\n * {@link ClientPreLoaderDataService.prefetchForUrl}, per `sitecore.config`'s\r\n * `angular.linkPrefetch.mode` (default `'eager'`; `'hover'` defers until the pointer dwells\r\n * on the link; `'off'` disables it). Override per link with `scRouterLinkPrefetch` - pass it\r\n * via the structural microsyntax (`*scRouterLink=\"fields.Link; prefetch: 'off'\"`), since a\r\n * separate `[scRouterLinkPrefetch]` binding would target the inner `<a>`, not this directive.\r\n *\r\n * Editing chrome + empty-field placeholder behavior is inherited from {@link ScLinkDirective}.\r\n * @public\r\n */\r\n@Directive({\r\n  selector: '[scRouterLink]',\r\n})\r\nexport class ScRouterLinkDirective extends ScLinkDirective {\r\n  /** Sitecore link field; aliases the base {@link ScLinkDirective.field} input to `scRouterLink`. */\r\n  override readonly field = input.required<LinkField | LinkFieldValue | undefined>({\r\n    alias: 'scRouterLink',\r\n  });\r\n  /** Per-link override for loader prefetch. See {@link LinkPrefetchMode}. Falls back to `angular.linkPrefetch.mode` when unset. */\r\n  readonly prefetch = input<LinkPrefetchMode | undefined>(undefined, {\r\n    alias: 'scRouterLinkPrefetch',\r\n  });\r\n\r\n  private readonly router = inject(Router);\r\n  private readonly platformId = inject(PLATFORM_ID);\r\n  private readonly preLoaderData = inject(ClientPreLoaderDataService);\r\n  private readonly linkPrefetchConfig = inject(SITECORE_CONFIG_TOKEN, { optional: true })?.angular\r\n    ?.linkPrefetch;\r\n  private readonly unlisteners: (() => void)[] = [];\r\n\r\n  protected override applyValue(): void {\r\n    this.disposeListeners();\r\n    super.applyValue();\r\n    if (!this.viewRef) return;\r\n    for (const node of this.viewRef.rootNodes) {\r\n      if (!(node instanceof HTMLAnchorElement)) continue;\r\n      const unlisten = this.renderer.listen(node, 'click', (event: MouseEvent) =>\r\n        this.onClick(event, node)\r\n      );\r\n      this.unlisteners.push(unlisten);\r\n      this.applyPrefetch(node);\r\n    }\r\n  }\r\n\r\n  private disposeListeners(): void {\r\n    for (const u of this.unlisteners) u();\r\n    this.unlisteners.length = 0;\r\n  }\r\n\r\n  /**\r\n   * Applies the resolved prefetch mode to `anchor` when running in the browser, the page isn't\r\n   * in editing/preview mode, and the href isn't one the browser handles directly (external,\r\n   * `target=\"_blank\"`, empty). `'hover'` attaches a debounced listener; `'eager'` prefetches\r\n   * immediately; `'off'` does nothing.\r\n   * @param {HTMLAnchorElement} anchor - Anchor element to observe/prefetch.\r\n   */\r\n  private applyPrefetch(anchor: HTMLAnchorElement): void {\r\n    if (!isPlatformBrowser(this.platformId)) return;\r\n    if (this.sitecoreContext.isEditing() || this.sitecoreContext.isPreview()) return;\r\n\r\n    const hrefAttr = anchor.getAttribute('href')?.trim() ?? '';\r\n    const targetAttr = anchor.getAttribute('target');\r\n    if (this.shouldDeferNavigation(hrefAttr, targetAttr)) return;\r\n\r\n    const mode = this.prefetch() ?? this.linkPrefetchConfig?.mode ?? FALLBACK_PREFETCH_MODE;\r\n    if (mode === 'off') return;\r\n\r\n    if (mode === 'hover') {\r\n      const delayMs = this.linkPrefetchConfig?.delayMs ?? FALLBACK_PREFETCH_DELAY_MS;\r\n      const unlisten = attachHoverPrefetch(this.renderer, anchor, {\r\n        delayMs,\r\n        onPrefetch: (href) => this.preLoaderData.prefetchForUrl(href, { force: true }),\r\n      });\r\n      this.unlisteners.push(unlisten);\r\n      return;\r\n    }\r\n\r\n    // mode === 'eager'\r\n    this.preLoaderData.prefetchForUrl(hrefAttr);\r\n  }\r\n\r\n  /**\r\n   * Click handler attached to the freshly rendered anchor. Defers to the browser for external\r\n   * URLs and `target=\"_blank\"`; routes everything else via Angular Router. Calls\r\n   * `event.preventDefault()` only when the in-app navigation has no hash fragment.\r\n   * @param {MouseEvent} event - Native click event.\r\n   * @param {HTMLAnchorElement} anchor - Anchor element receiving the click.\r\n   */\r\n  private onClick(event: MouseEvent, anchor: HTMLAnchorElement): void {\r\n    const hrefAttr = anchor.getAttribute('href')?.trim() ?? '';\r\n    const targetAttr = anchor.getAttribute('target');\r\n    if (this.shouldDeferNavigation(hrefAttr, targetAttr)) {\r\n      return;\r\n    }\r\n\r\n    if (this.sitecoreContext.isEditing() || this.sitecoreContext.isPreview()) {\r\n      return;\r\n    }\r\n\r\n    void this.router.navigateByUrl(hrefAttr);\r\n    if (!hrefAttr.includes('#')) {\r\n      event.preventDefault();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Returns true when the browser should handle navigation (no in-app Router navigation).\r\n   * @param {string | null} hrefAttr - Raw `href` attribute from the anchor.\r\n   * @param {string | null} targetAttr - Raw `target` attribute from the anchor.\r\n   * @returns {boolean} Whether to skip `Router.navigateByUrl`.\r\n   */\r\n  private shouldDeferNavigation(hrefAttr: string | null, targetAttr: string | null): boolean {\r\n    if (!hrefAttr || hrefAttr === '') {\r\n      return true;\r\n    }\r\n    if (targetAttr === '_blank') {\r\n      return true;\r\n    }\r\n    const lower = hrefAttr.toLowerCase();\r\n    return EXTERNAL_HREF_PREFIXES.some((prefix) => lower.startsWith(prefix));\r\n  }\r\n}\r\n","import {\r\n  Directive,\r\n  PLATFORM_ID,\r\n  SecurityContext,\r\n  TemplateRef,\r\n  Type,\r\n  inject,\r\n  input,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { Router } from '@angular/router';\r\nimport { TextField } from '@sitecore-content-sdk/content/layout';\r\nimport { BaseFieldDirective } from './base-field.directive';\r\nimport { DefaultEmptyFieldEditingComponent } from '../default-empty-text-field.component';\r\nimport { EXTERNAL_HREF_PREFIXES } from './utils';\r\nimport { attachHoverPrefetch } from './link-hover-prefetch';\r\nimport { ClientPreLoaderDataService } from '../../loaders/pre-loader-data.service';\r\nimport { SITECORE_CONFIG_TOKEN } from '../../lib/tokens';\r\nimport { MetadataKind } from '@sitecore-content-sdk/content/editing';\r\nimport type { LinkPrefetchMode } from '../../config/define-config';\r\n\r\n/** Ultimate fallback when no `SITECORE_CONFIG_TOKEN` is provided. Mirrors `DEFAULT_LINK_PREFETCH` in `config/define-config.ts`. */\r\nconst FALLBACK_PREFETCH_MODE: LinkPrefetchMode = 'eager';\r\nconst FALLBACK_PREFETCH_DELAY_MS = 100;\r\n\r\n/**\r\n * Structural directive that renders a Sitecore rich-text field value as the `innerHTML` of\r\n * the consumer-supplied wrapper element.\r\n *\r\n * Internal links inside the rendered HTML are intercepted and routed through\r\n * {@link Router.navigateByUrl} so CMS-authored in-app links behave like SPA navigation.\r\n * External URLs, `target=\"_blank\"`, and links clicked while the page is in editing mode\r\n * are left to the browser.\r\n *\r\n * Internal links (browser only) prefetch the loaders that apply to them via\r\n * {@link ClientPreLoaderDataService.prefetchForUrl}, per `sitecore.config`'s\r\n * `angular.linkPrefetch.mode` (default `'eager'`; `'hover'` defers until the pointer\r\n * dwells on the link; `'off'` disables it). Override per field with `scRichTextPrefetch`.\r\n * @public\r\n */\r\n@Directive({\r\n  selector: '[scRichText]',\r\n})\r\nexport class ScRichTextDirective extends BaseFieldDirective<TextField | undefined> {\r\n  /** The Sitecore rich-text field. */\r\n  readonly field = input.required<TextField | undefined>({ alias: 'scRichText' });\r\n\r\n  /** Consumer-supplied template rendered between chrome markers when the field is empty in editing mode. */\r\n  readonly emptyFieldEditingTemplate = input<TemplateRef<unknown> | undefined>(undefined, {\r\n    alias: 'scRichTextEmptyFieldEditingTemplate',\r\n  });\r\n  /** Per-field override for loader prefetch. See {@link LinkPrefetchMode}. Falls back to `angular.linkPrefetch.mode` when unset. */\r\n  readonly prefetch = input<LinkPrefetchMode | undefined>(undefined, {\r\n    alias: 'scRichTextPrefetch',\r\n  });\r\n\r\n  protected readonly defaultEmptyComponent: Type<unknown> = DefaultEmptyFieldEditingComponent;\r\n\r\n  private readonly sanitizer = inject(DomSanitizer);\r\n  private readonly router = inject(Router);\r\n  private readonly platformId = inject(PLATFORM_ID);\r\n  private readonly preLoaderData = inject(ClientPreLoaderDataService);\r\n  private readonly linkPrefetchConfig = inject(SITECORE_CONFIG_TOKEN, { optional: true })?.angular\r\n    ?.linkPrefetch;\r\n  private readonly linkUnlisteners: (() => void)[] = [];\r\n\r\n  protected updateView(): void {\r\n    this.cleanupLinks();\r\n    this.viewContainer.clear();\r\n    this.viewRef = undefined;\r\n\r\n    if (!this.shouldRender()) {\r\n      this.renderEmpty();\r\n      return;\r\n    }\r\n\r\n    this.renderEditingChrome(MetadataKind.Open);\r\n    this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef);\r\n    this.applyValue();\r\n    this.renderEditingChrome(MetadataKind.Close);\r\n  }\r\n\r\n  private applyValue(): void {\r\n    this.cleanupLinks();\r\n    const field = this.field();\r\n    if (!field || !this.viewRef) return;\r\n    const raw = (field.value as string) ?? '';\r\n    const trusted = this.sanitizer.bypassSecurityTrustHtml(raw);\r\n    const html = this.sanitizer.sanitize(SecurityContext.HTML, trusted) ?? '';\r\n    for (const node of this.viewRef.rootNodes) {\r\n      if (!(node instanceof Element)) continue;\r\n      this.renderer.setProperty(node, 'innerHTML', html);\r\n      this.hookLinks(node);\r\n    }\r\n  }\r\n\r\n  private hookLinks(container: Element): void {\r\n    if (this.isEditing()) {\r\n      return;\r\n    }\r\n    const anchors = container.querySelectorAll('a[href]');\r\n    for (const anchor of Array.from(anchors) as HTMLAnchorElement[]) {\r\n      const href = anchor.getAttribute('href')?.trim() ?? '';\r\n      if (!href) continue;\r\n      const lower = href.toLowerCase();\r\n      if (EXTERNAL_HREF_PREFIXES.some((p) => lower.startsWith(p))) continue;\r\n      const unlisten = this.renderer.listen(anchor, 'click', (event: MouseEvent) => {\r\n        const currentHref = anchor.getAttribute('href')?.trim() ?? '';\r\n        if (anchor.getAttribute('target') === '_blank') return;\r\n        event.preventDefault();\r\n        void this.router.navigateByUrl(currentHref);\r\n      });\r\n      this.linkUnlisteners.push(unlisten);\r\n      this.applyPrefetch(anchor, href);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Applies the resolved prefetch mode to `anchor` when running in the browser and the page\r\n   * isn't in editing or preview mode (checked here directly rather than relied on from\r\n   * {@link hookLinks}'s own editing-only gate, so this method's preconditions are self\r\n   * contained). External/`target=\"_blank\"`/empty hrefs are already filtered out by\r\n   * {@link hookLinks} before this is called. `'hover'` attaches a debounced listener; `'eager'`\r\n   * prefetches immediately; `'off'` does nothing.\r\n   * @param {HTMLAnchorElement} anchor - Anchor element to observe/prefetch.\r\n   * @param {string} href - The anchor's already-validated internal href.\r\n   */\r\n  private applyPrefetch(anchor: HTMLAnchorElement, href: string): void {\r\n    if (!isPlatformBrowser(this.platformId)) return;\r\n    if (this.isEditing() || this.isPreview()) return;\r\n\r\n    const mode = this.prefetch() ?? this.linkPrefetchConfig?.mode ?? FALLBACK_PREFETCH_MODE;\r\n    if (mode === 'off') return;\r\n\r\n    if (mode === 'hover') {\r\n      const delayMs = this.linkPrefetchConfig?.delayMs ?? FALLBACK_PREFETCH_DELAY_MS;\r\n      const unlisten = attachHoverPrefetch(this.renderer, anchor, {\r\n        delayMs,\r\n        onPrefetch: (h) => this.preLoaderData.prefetchForUrl(h, { force: true }),\r\n      });\r\n      this.linkUnlisteners.push(unlisten);\r\n      return;\r\n    }\r\n\r\n    // mode === 'eager'\r\n    this.preLoaderData.prefetchForUrl(href);\r\n  }\r\n\r\n  private cleanupLinks(): void {\r\n    for (const unlisten of this.linkUnlisteners) {\r\n      unlisten();\r\n    }\r\n    this.linkUnlisteners.length = 0;\r\n  }\r\n}\r\n","// ─── Angular SDK providers and tokens ──────────────────────────\r\nexport { type AngularCSDKAppInit } from './lib/providers';\r\nexport { SITECORE_CONFIG_TOKEN, SITECORE_CLIENT_TOKEN } from './lib/tokens';\r\n\r\nexport {\r\n  getContentStylesheetLink,\r\n  getDesignLibraryStylesheetLinks,\r\n  LayoutServiceData,\r\n  LayoutServicePageState,\r\n  LayoutServiceContext,\r\n  LayoutServiceContextData,\r\n  LayoutService,\r\n  RouteData,\r\n  Field,\r\n  Item,\r\n  getChildPlaceholder,\r\n  getFieldValue,\r\n  ComponentRendering,\r\n  ComponentFields,\r\n  ComponentParams,\r\n  EditMode,\r\n} from '@sitecore-content-sdk/content/layout';\r\nexport type {\r\n  ImageField,\r\n  ImageFieldValue,\r\n  ImageSizeParameters,\r\n  LinkField,\r\n  LinkFieldValue,\r\n  RichTextField,\r\n  TextField,\r\n} from '@sitecore-content-sdk/content/layout';\r\nexport {\r\n  isEditorActive,\r\n  resetEditorChromes,\r\n  EditingPreviewData,\r\n  PAGES_EDITING_MARKER,\r\n} from '@sitecore-content-sdk/content/editing';\r\nexport {\r\n  GraphQLClientError,\r\n  RetryStrategy,\r\n  DefaultRetryStrategy,\r\n  GraphQLRequestClientFactoryConfig,\r\n  GraphQLRequestClient,\r\n  PageMode,\r\n  ErrorPage,\r\n  Page,\r\n  SitecoreClient,\r\n} from '@sitecore-content-sdk/content/client';\r\nexport { getLocaleRewrite } from '@sitecore-content-sdk/content/i18n';\r\nexport { mediaApi } from '@sitecore-content-sdk/content/media';\r\nexport { SitePathService, SitePathServiceConfig } from '@sitecore-content-sdk/content/site';\r\nexport {\r\n  constants,\r\n  enableDebug,\r\n  ClientError,\r\n  CacheClient,\r\n  CacheOptions,\r\n  MemoryCacheClient,\r\n  NativeDataFetcher,\r\n  NativeDataFetcherResponse,\r\n  NativeDataFetcherConfig,\r\n} from '@sitecore-content-sdk/core';\r\n/**\r\n * Public API Surface of @sitecore-content-sdk/angular\r\n */\r\n\r\nimport { VERSION as CORE_VERSION } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\n\r\n// Angular-specific exports\r\nexport * from './loaders/loader-resolver';\r\nexport * from './loaders/loader-registry.token';\r\nexport * from './loaders/client-loader-data.service';\r\nexport * from './loaders/pre-loader-data.service';\r\nexport {\r\n  SERVER_LOADER_RUNNER,\r\n  type ServerLoaderRunnerPort,\r\n} from './loaders/server-loader-runner.token';\r\nexport { type LoaderRegistry } from './loaders/loader-registry.token';\r\nexport {\r\n  NotFoundNavigationError,\r\n  LoaderHttpError,\r\n  type LoaderFn,\r\n  type LoaderContext,\r\n  type LoaderDataResult,\r\n  type LoaderPayload,\r\n  type LoaderRunnerInit,\r\n  type CsdkRequestData,\r\n  type CsdkRequestParams,\r\n  type PerRouteLoaderCacheConfig,\r\n  type LoaderCacheConfig,\r\n} from './loaders/models';\r\nexport { handleNavigationError } from './loaders/router-error-handling';\r\nexport { applyRedirect } from './loaders/utils';\r\nexport {\r\n  getSiteName,\r\n  getVariantId,\r\n  getComponentVariantIds,\r\n  getLanguage,\r\n} from './loaders/context-helpers';\r\nexport { SC_PARAMS_HEADER } from './loaders/constants';\r\nexport { provideSitecoreAngular } from './lib/providers';\r\nexport {\r\n  SITECORE_ANALYTICS,\r\n  normalizeCookieDomain,\r\n  type SitecoreAnalyticsWrapper,\r\n} from './lib/analytics/sitecore-analytics';\r\nexport { CdpHelper } from '@sitecore-content-sdk/content/personalize';\r\nexport * from './server';\r\n\r\n// ─── Sitecore Context ──────────────────────────────────────────\r\nexport { SitecoreContextService } from './lib/sitecore-context.service';\r\nexport { ScEditingScriptsComponent } from './lib/sc-editing-scripts.component';\r\n\r\nexport { SitecoreTranslateLoader } from './i18n/sitecore-translate-loader';\r\n\r\n// ─── Localized routing ────────────────────────────────────────\r\nexport {\r\n  splitLocaleFromPath,\r\n  scLocaleMatcher,\r\n  type LocaleExtractionResult,\r\n} from './i18n/locale-utils';\r\nexport { LocaleUrlSerializer } from './i18n/locale-url-serializer';\r\n\r\n// ─── Placeholders, components and field directives ───────────────────────────────────────────────\r\nexport {\r\n  DEFAULT_EXPORT_NAME,\r\n  type AngularContentSdkComponent,\r\n  type ComponentMap,\r\n} from './components/types';\r\nexport { SITECORE_COMPONENT_MAP } from './components/tokens';\r\nexport {\r\n  type ChildComponentProps,\r\n  type ComponentForRendering,\r\n  type PassThroughProps,\r\n  getPlaceholderRenderings,\r\n  getSXAParams,\r\n  getChildComponentProps,\r\n  resolveComponentForRendering,\r\n} from './components/placeholder/placeholder-utils';\r\nexport { ScPlaceholderComponent } from './components/placeholder/sc-placeholder.component';\r\nexport {\r\n  PLACEHOLDER_GUARD_RESOLVER,\r\n  PLACEHOLDER_DATA_RESOLVER,\r\n  type PlaceholderGuardResolver,\r\n  type PlaceholderDataResolver,\r\n  type PlaceholderResolverContext,\r\n} from './components/placeholder/placeholder-tokens';\r\nexport {\r\n  BaseFieldDirective,\r\n  ScTextDirective,\r\n  ScImageDirective,\r\n  ScLinkDirective,\r\n  ScRouterLinkDirective,\r\n  ScRichTextDirective,\r\n  ScHiddenRenderingComponent,\r\n  ScMissingComponentComponent,\r\n  FieldMetadataMarkerComponent,\r\n  DefaultEmptyFieldEditingComponent,\r\n  DefaultEmptyImageFieldEditingComponent,\r\n  type FieldLike,\r\n} from './components';\r\nexport { ScFormComponent } from './components/sc-form.component';\r\nexport { type LinkPrefetchMode } from './config/define-config';\r\n\r\nexport const _coreVersionMarker = CORE_VERSION;\r\nexport const _routerTokenMarker = Router;\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DEFAULT_ENDPOINT","coreDebug","contentDebug","ERROR_MESSAGES","isPrefetch","_c0","form","FALLBACK_PREFETCH_MODE","FALLBACK_PREFETCH_DELAY_MS","CORE_VERSION"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;;;;;AAMG;MACU,qBAAqB,GAAG,IAAI,cAAc,CACrD,uBAAuB,EACvB;AAEF;;;;AAIG;MACU,qBAAqB,GAAG,IAAI,cAAc,CAAiB,uBAAuB,EAAE;AAE1F,MAAM,qBAAqB,GAAG,IAAI,cAAc,CAAS,uBAAuB,CAAC,CAAC;AAEzF;;;AAGG;AACI,MAAM,iBAAiB,GAAG,IAAI,cAAc,CAAS,mBAAmB,CAAC;;ACzBhF;;;;AAIG;MACU,mBAAmB,GAAG,IAAI,cAAc,CACnD,qBAAqB,EACrB;MAUW,eAAe,GAAG,IAAI,cAAc,CAAiB,iBAAiB,EAAE;AAErF;;;;;;;AAOG;AACI,MAAM,qBAAqB,GAAG,CAAC,OAAuB,KAAgB;IAC3E,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE;AACzB,SAAA;KACF,CAAC;AACJ,EAAE;AAEF;;;;AAIG;MACU,SAAS,GAAG,MAAM,CAAC,UAAU;;AC5C1C;;;;AAIG;AACI,MAAM,oBAAoB,GAAG;;ACGpC;;;;;AAKG;AACH,SAAS,UAAU,CAAC,QAAgB,EAAE,GAAW,EAAA;AAC/C,IAAA,OAAO,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,EAAI,GAAG,EAAE,CAAC;AACrC,CAAC;AAED;;;;;AAKG;MAIU,uBAAuB,CAAA;AACjB,IAAA,mBAAmB,GAAG,IAAI,GAAG,EAA6B,CAAC;AAC3D,IAAA,OAAO,GAAG,IAAI,GAAG,EAAsC,CAAC;AACxD,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAC1B,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AACjC,IAAA,iBAAiB,GAChC,MAAM,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,oBAAoB,CAAC;AAE1E;;;;;;;;;;;;;AAaG;IACH,QAAQ,CAAC,aAA4B,EAAE,OAA6B,EAAA;QAClE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACvC,OAAO;QACT,CAAC;AACD,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;QAClE,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACzB,OAAO;QACT,CAAC;AACD,QAAA,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACxD,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC/B,QAAA,OAAO,CAAC,IAAI,CAAC,MAAK;;AAElB,QAAA,CAAC,CAAC,CAAC;IACL,CAAC;AAED;;;;;;;AAOG;IACH,MAAM,OAAO,CAAC,OAAsB,EAAA;QAClC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACvC,OAAO;AACL,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,MAAM,EAAE,GAAG;AACX,gBAAA,OAAO,EAAE,+CAA+C;aACzD,CAAC;QACJ,CAAC;AAED,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACjD,QAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,YAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACrC,YAAA,OAAO,MAAM,CAAC;QAChB,CAAC;;QAGD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,cAAc,EAAE;AAClB,YAAA,OAAO,cAAc,CAAC;QACxB,CAAC;;QAGD,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;AACxC,QAAA,OAAO,gBAAgB,CAAC;IAC1B,CAAC;AAED;;;;;;AAMG;IACK,MAAM,SAAS,CAAC,OAAsB,EAAA;AAC5C,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AACtD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC;AACxC,QAAA,MAAM,OAAO,GAAkB;YAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;AAChB,YAAA,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;AACtC,YAAA,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;YAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAC;AAEF,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAoB,QAAQ,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAC5E,CAAC;YACF,IAAI,CAAC,IAAI,EAAE;AACT,gBAAA,MAAM,OAAO,GAAG,CAAA,iBAAA,EAAoB,QAAQ,EAAE,CAAC;gBAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAuB,CAAC;YACtE,CAAC;AACD,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;gBACxB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;AAAM,iBAAA,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;gBACnC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;AACD,YAAA,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC;YACxE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAuB,CAAC;QACtE,CAAC;gBAAS;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;iHAnHU,uBAAuB,GAAA,CAAA,CAAA,CAAA,CAAA;gEAAvB,uBAAuB,EAAA,OAAA,EAAvB,uBAAuB,CAAA,IAAA,EAAA,UAAA,EAFtB,MAAM,EAAA,CAAA,CAAA;;iFAEP,uBAAuB,EAAA,CAAA;cAHnC,UAAU;AAAC,QAAA,IAAA,EAAA,CAAA;AACV,gBAAA,UAAU,EAAE,MAAM;AACnB,aAAA,CAAA;;;ACxBM,MAAM,uBAAuB,GAAG,MAAM,CAAC;AACvC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AA6H1C;;;;AAIG;AACG,SAAU,sBAAsB,CAAC,CAAU,EAAA;AAC/C,IAAA,QACE,OAAO,CAAC,KAAK,QAAQ;AACrB,QAAA,CAAC,KAAK,IAAI;AACV,QAAA,sBAAsB,IAAI,CAAC;AAC3B,QAAA,OAAQ,CAA0B,CAAC,oBAAoB,KAAK,QAAQ,EACpE;AACJ,CAAC;AA4BK,MAAO,uBAAwB,SAAQ,KAAK,CAAA;IAChD,WAAA,CAAY,OAAO,GAAG,WAAW,EAAA;QAC/B,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;AACF,CAAA;AAEK,MAAO,eAAgB,SAAQ,KAAK,CAAA;AACrB,IAAA,MAAA,CAAA;AAAnB,IAAA,WAAA,CAAmB,MAAc,EAAE,OAAO,GAAG,0BAA0B,EAAA;QACrE,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,IAAA,CAAA,MAAM,GAAN,MAAM,CAAQ;IAEjC,CAAC;AACF;;AC/KD;AACO,MAAM,iBAAiB,GAAG,GAAG;;ACIpC;;;;;AAKG;AACH,SAAS,UAAU,CAAC,GAAW,EAAA;IAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC3B,IAAA,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;;;;;AAcG;AACG,SAAU,YAAY,CAAC,GAAW,EAAE,MAAe,EAAA;AACvD,IAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAClE,IAAI,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;AACnE,IAAA,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,EAAE;AACjE,QAAA,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;AACD,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,QAAA,OAAO,GAAG,CAAC;IACb,CAAC;AACD,IAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,4BAA4B,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpF,CAAC;AAED;;;;;;;AAOG;AACG,SAAU,qBAAqB,CAAC,QAAgB,EAAE,GAAkB,EAAA;IACxE,MAAM,MAAM,IAAI,GAAG,CAAC,WAAW,IAAI,EAAE,CAA4B,CAAC;AAClE,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACnC,IAAA,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;AACzC,IAAA,MAAM,mBAAmB,GAAG,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC;AAC7D,IAAA,MAAM,MAAM,GAAI,MAAM,EAAE,MAAiB,IAAI,IAAI,CAAC;AAClD,IAAA,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC;IAErD,OAAO;QACL,IAAI;QACJ,MAAM;QACN,SAAS;QACT,mBAAmB;QACnB,QAAQ;QACR,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;;;;AAKG;AACG,SAAU,aAAa,CAAC,MAA+B,EAAA;AAC3D,IAAA,MAAM,YAAY,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IACnC,OAAO,YAAY,CAAC,MAAM,CAAC;AAC3B,IAAA,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;AAKG;AACG,SAAU,8BAA8B,CAC5C,MAAA,GAA4B,EAAE,EAAA;IAE9B,OAAO;AACL,QAAA,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,iBAAiB;AAClD,QAAA,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;AAC/B,QAAA,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,SAAS;AACpD,QAAA,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;AACvB,QAAA,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;AACzB,QAAA,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;KAC5C,CAAC;AACJ,CAAC;AAED;;;;;;;AAOG;AACG,SAAU,iBAAiB,CAC/B,QAAgB,EAChB,KAA0C,EAC1C,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAA;IAEhB,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACpC,CAAC;AACD,IAAA,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,EAAE;AACvE,QAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;IACzD,CAAC;AACD,IAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;AACvD,CAAC;AAED;;;;;AAKG;AACG,SAAU,4BAA4B,CAAC,KAAa,EAAA;AACxD,IAAA,OAAO,KAAK;AACT,SAAA,IAAI,EAAE;AACN,SAAA,WAAW,EAAE;AACb,SAAA,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;AAKG;AACG,SAAU,kCAAkC,CAAC,MAAc,EAAA;AAC/D,IAAA,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;AAKG;AACG,SAAU,kBAAkB,CAAC,MAAgB,EAAA;AACjD,IAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,CAAC;AAC3C,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAChC;;ACpJA;;;;AAIG;AACI,MAAM,iCAAiC,GAAG,IAAI,CAAC;AAetD;;;;;AAKG;AACG,SAAU,yBAAyB,CAAC,MAAuC,EAAA;IAC/E,MAAM,EAAE,GAAG,kCAAkC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,4BAA4B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC3D,IAAA,MAAM,GAAG,GACP,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;UAC3D,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA,CAAE;UAChC,QAAQ,CAAC;IACf,OAAO,CAAA,EAAG,iCAAiC,CAAA,MAAA,EAAS,EAAE,IAAI,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAC;AAC5E,CAAC;AAmCD;;;;;;AAMG;AACG,SAAU,+BAA+B,CAAC,MAAwC,EAAA;IACtF,MAAM,IAAI,GAAG,4BAA4B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,4BAA4B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC3D,IAAA,OAAO,GAAG,iCAAiC,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,MAAM,EAAE,CAAC;AACvE,CAAC;AAED;;;;;;;AAOG;AACG,SAAU,sCAAsC,CACpD,KAAmC,EACnC,cAAsB,EAAA;AAEtB,IAAA,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;AAClB,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;AACD,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY;AAC/B,UAAE,4BAA4B,CAAC,KAAK,CAAC,YAAY,CAAC;AAClD,UAAE,4BAA4B,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,kCAAkC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC5D,IAAA,MAAM,GAAG,GACP,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC;UACjE,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA,CAAE;UACnC,QAAQ,CAAC;IACf,OAAO,CAAA,EAAG,iCAAiC,CAAA,MAAA,EAAS,EAAE,IAAI,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAC;AAC5E,CAAC;AAED;;;;;;;AAOG;AACG,SAAU,uCAAuC,CACrD,MAAqD,EAAA;AAErD,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;AACzB,IAAA,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;AACzE,QAAA,MAAM,GAAG,GAAG,6BAA6B,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAClB,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACd,YAAA,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;AACD,IAAA,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;AAKG;AACG,SAAU,6BAA6B,CAAC,MAAwC,EAAA;IACpF,MAAM,IAAI,GAAG,4BAA4B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,4BAA4B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC3D,IAAA,OAAO,GAAG,iCAAiC,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAA,EAAI,MAAM,EAAE,CAAC;AACpF,CAAC;AAED;;;;;;AAMG;AACG,SAAU,yBAAyB,CAAC,IAAY,EAAA;IACpD,OAAO,CAAA,EAAG,iCAAiC,CAAA,MAAA,EAAS,4BAA4B,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3F,CAAC;AAED;;;;;AAKG;AACG,SAAU,2BAA2B,CAAC,MAAc,EAAA;IACxD,OAAO,CAAA,EAAG,iCAAiC,CAAA,QAAA,EAAW,4BAA4B,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/F,CAAC;AAED;;;;;;;;;;;AAWG;AACG,SAAU,oBAAoB,CAClC,QAAgB,EAChB,UAA8B,EAC9B,QAAgB,EAChB,WAAqB,EACrB,UAAA,GAAuB,EAAE,EAAA;AAEzB,IAAA,MAAM,IAAI,GAAa;QACrB,QAAQ;AACR,QAAA,yBAAyB,CAAC,UAAU,CAAC,IAAI,CAAC;AAC1C,QAAA,2BAA2B,CAAC,UAAU,CAAC,MAAM,CAAC;AAC9C,QAAA,GAAG,UAAU;KACd,CAAC;AAEF,IAAA,IAAI,QAAQ,KAAK,MAAM,EAAE;QACvB,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;AAED,IAAA,IAAI,QAAQ,KAAK,YAAY,EAAE;QAC7B,IAAI,CAAC,IAAI,CACP,+BAA+B,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CACtF,CAAC;IACJ,CAAC;AAED,IAAA,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;AAMG;AACH,SAAS,gBAAgB,CAAC,KAAc,EAAE,cAAsB,EAAA;IAC9D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACvC,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,KAAa,CAAC;AAC3B,IAAA,OAAO,sCAAsC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAC9F;;AC/NA;AACO,MAAM,gBAAgB,GAAG,CAAA,EAAG,iCAAiC,SAAS,CAAC;AAE9E;;;;;;;;;;;AAWG;AACG,SAAU,aAAa,CAC3B,QAAgB,EAChB,GAAkB,EAAA;IAElB,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AACxD,IAAA,MAAM,GAAG,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;AAChD,IAAA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;AAOG;AACG,SAAU,uBAAuB,CAAC,UAA8B,EAAA;AACpE,IAAA,IAAI,UAAU,CAAC,QAAQ,KAAK,MAAM,EAAE;AAClC,QAAA,OAAO,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;AACD,IAAA,IAAI,UAAU,CAAC,QAAQ,KAAK,YAAY,EAAE;AACxC,QAAA,OAAO,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;AACD,IAAA,OAAO,0BAA0B,CAAC,UAAU,CAAC,CAAC;AAChD,CAAC;AAED;;;;;AAKG;AACG,SAAU,iBAAiB,CAAC,UAA8B,EAAA;IAC9D,MAAM,IAAI,GAAG,4BAA4B,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,4BAA4B,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/D,IAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,SAAS;UACzC,IAAI,4BAA4B,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA,CAAE;UACxD,EAAE,CAAC;AACP,IAAA,OAAO,CAAA,EAAG,gBAAgB,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,UAAU,CAAC,OAAO,EAAE,CAAC;AAC/F,CAAC;AAED;;;;;AAKG;AACG,SAAU,uBAAuB,CAAC,UAA8B,EAAA;IACpE,MAAM,IAAI,GAAG,4BAA4B,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,4BAA4B,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/D,IAAA,OAAO,GAAG,gBAAgB,CAAA,YAAA,EAAe,IAAI,CAAA,CAAA,EAAI,MAAM,EAAE,CAAC;AAC5D,CAAC;AAED;;;;;;AAMG;AACG,SAAU,0BAA0B,CAAC,UAA8B,EAAA;IACvE,MAAM,QAAQ,GAAG,4BAA4B,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,4BAA4B,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,4BAA4B,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/D,IAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,SAAS;UACzC,IAAI,4BAA4B,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA,CAAE;UACxD,EAAE,CAAC;AACP,IAAA,OAAO,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,QAAQ,IAAI,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,UAAU,CAAC,OAAO,EAAE,CAAC;AACtG;;AC9EA;;;;;;;;;;;;;;AAcG;MACU,kBAAkB,CAAA;AAUV,IAAA,QAAA,CAAA;AACA,IAAA,MAAA,CAAA;AACA,IAAA,KAAA,CAAA;;AAVX,IAAA,OAAgB,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;AAE5D;;;;AAIG;AACH,IAAA,WAAA,CACmB,QAAwB,EACxB,MAA6B,EAC7B,KAAmB,EAAA;QAFnB,IAAA,CAAA,QAAQ,GAAR,QAAQ,CAAgB;QACxB,IAAA,CAAA,MAAM,GAAN,MAAM,CAAuB;QAC7B,IAAA,CAAA,KAAK,GAAL,KAAK,CAAc;IACnC,CAAC;AAEJ;;;;AAIG;IACH,MAAM,OAAO,CAAC,IAAsB,EAAA;AAClC,QAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAA,6BAAA,EAAgC,QAAQ,CAAA,CAAA,CAAG,EAAE,CAAC;QAC9F,CAAC;AAED,QAAA,MAAM,gBAAgB,GAAG,eAAe,EAAE,QAAQ,IAAI,EAAE,CAAC;;;AAIzD,QAAA,MAAM,QAAQ,GACZ,gBAAgB,CAAC,QAAQ,IAAI,eAAe,EAAE,aAAa,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;AAE/F,QAAA,MAAM,QAAQ,GAAG;AACf,YAAA,GAAG,gBAAgB;YACnB,QAAQ;SACT,CAAC;;;AAIF,QAAA,MAAM,GAAG,GAAkB;YACzB,GAAG;YACH,WAAW;YACX,KAAK;YACL,QAAQ;YACR,eAAe,EAAE,eAAe,IAAI,SAAS;SAC9C,CAAC;AAEF,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,KAAK,YAAY,EAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAEhF,IAAI,SAAS,EAAE;YACb,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEvC,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE;gBACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5C,CAAC;AAED,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;gBACzB,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;gBACjE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5C,CAAC;QACH,CAAC;AAED,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;IACjF,CAAC;AAED;;;;;;AAMG;AACK,IAAA,yBAAyB,CAC/B,QAAgB,EAChB,GAAkB,EAClB,QAAgB,EAChB,YAA8C,EAAA;QAE9C,IAAI,kBAAkB,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YACpD,OAAO;QACT,CAAC;AACD,QAAA,kBAAkB,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,KAAK,IAAI,CAAC,SAAS,CAAC;YAClB,QAAQ;YACR,GAAG;AACH,YAAA,SAAS,EAAE,IAAI;YACf,YAAY;AACZ,YAAA,aAAa,EAAE,QAAQ;AACxB,SAAA,CAAC,CAAC,IAAI,CACL,MAAK;AACH,YAAA,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtD,CAAC,EACD,MAAK;AACH,YAAA,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACtD,QAAA,CAAC,CACF,CAAC;IACJ,CAAC;AAEO,IAAA,MAAM,SAAS,CAAC,EACtB,QAAQ,EACR,GAAG,EACH,SAAS,EACT,YAAY,EACZ,aAAa,GAOd,EAAA;QACC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAE,CAAC;AAExC,QAAA,IAAI,KAAc,CAAC;AACnB,QAAA,IAAI;AACF,YAAA,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE;AACZ,YAAA,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,eAAe,CAAC;YACrE,OAAO;AACL,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,MAAM,EAAE,GAAG;gBACX,OAAO;AACP,gBAAA,IAAI,GAAG,YAAY,KAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;aAChD,CAAC;QACJ,CAAC;AAED,QAAA,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE;YACjC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC/C,CAAC;AAED,QAAA,IAAI,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE;AAC3B,YAAA,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AACzD,YAAA,MAAM,QAAQ,GAAG,aAAa,IAAI,GAAG,CAAC;AACtC,YAAA,MAAM,IAAI,GAAG,oBAAoB,CAC/B,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,KAAK,EACL,YAAY,EAAE,IAAI,IAAI,EAAE,CACzB,CAAC;YACF,MAAM,GAAG,GAAG,YAAY,EAAE,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACvD,YAAA,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,GAAG,EAAE;AACZ,gBAAA,OAAO,CAAC,IAAI,CACV,yEAAyE,EACzE,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,GAAG,CACzC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;;;ACtLH;;;;AAIG;AACI,MAAM,qBAAqB,GAAG;;ACHrC;;;;;;AAMG;AACG,SAAU,cAAc,CAAC,IAAY,EAAA;;AAEzC,IAAA,MAAM,GAAG,GAAI,UAAyE,CAAC,OAAO;AAC5F,UAAE,GAAG,CAAC;IACR,IAAI,GAAG,EAAE;AACP,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;AACD,IAAA,OAAO,SAAS,CAAC;AACnB,CAAC;AAQD;;;;;;;AAOG;AACG,SAAU,OAAO,CAAC,IAAY,EAAE,OAAoB,EAAA;AACxD,IAAA,OAAO,OAAO,OAAO,KAAK,QAAQ,GAAG,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;AAMG;AACG,SAAU,gBAAgB,CAC9B,OAAA,GAAyD,EAAE,EAAA;AAE3D,IAAA,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAC1C;;ACzCA;;;;;;;;AAQG;SACa,mBAAmB,CACjC,GAAmB,EACnB,YAAY,GAAG,oBAAoB,EAAA;AAEnC,IAAA,OAAO,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;AACnC,CAAC;AAED;;;;;;;AAOG;AACG,SAAU,kBAAkB,CAChC,GAAmB,EAAA;AAEnB,IAAA,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE;AACzB,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAqB,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;QACzE,OAAO,EAAE,GAAG,IAAI,EAAE,eAAe,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/D,CAAC;AACD,IAAA,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE;AACxB,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;AACnD,QAAA,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;QACnE,MAAM,KAAK,GAA2B,EAAE,CAAC;AACzC,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;YAC1D,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,gBAAA,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3F,CAAC;QACD,OAAO;YACL,QAAQ;YACR,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC;AACjC,YAAA,WAAW,EAAE,EAAE;YACf,KAAK;AACL,YAAA,eAAe,EAAE,kBAAkB,CAAC,GAAG,CAAC,IAAI,IAAI;SACjD,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;AACxD,CAAC;AAiBD;;;;;;;;;;AAUG;SACa,oBAAoB,CAClC,GAAmB,EACnB,YAAY,GAAG,oBAAoB,EAAA;IAEnC,MAAM,QAAQ,GAAI,GAAG,CAAC,OAAO,EAAE,OAA8B,IAAI,GAAG,CAAC,QAAQ,CAAC;AAC9E,IAAA,IAAI,mBAAmB,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE;AAC1C,QAAA,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;AACvC,QAAA,IAAI,UAAU,IAAI,MAAM,EAAE;YACxB,OAAO;AACL,gBAAA,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC5C,gBAAA,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;gBACzB,QAAQ;gBACR,IAAI,EAAE,MAAM,CAAC,eAAe,IAAI,kBAAkB,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;AACd,QAAA,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;QACtB,QAAQ;AACR,QAAA,IAAI,EAAE,kBAAkB,CAAC,GAAG,CAAC;KAC9B,CAAC;AACJ,CAAC;AASD;;;;;AAKG;AACG,SAAU,iBAAiB,CAC/B,GAAmB,EACnB,GAAoB,EAAA;IAEpB,OAAO;AACL,QAAA,GAAG,EAAE,GAAoC;AACzC,QAAA,GAAG,EAAE,GAAqC;KAC3C,CAAC;AACJ,CAAC;AAED;;;;AAIG;AACH,MAAM,wBAAwB,GAAkB;AAC9C,IAAA,cAAc;AACd,IAAA,mBAAmB;AACnB,IAAA,UAAU;CACX,CAAC;AAEF;;;;;;;;;;;;;AAaG;AACG,SAAU,iBAAiB,CAAC,IAAY,EAAE,OAA2B,EAAA;AACzE,IAAA,IACE,wBAAwB,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACjE,OAAO,EAAE,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;SACxF,OAAO,EAAE,YAAY,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAC1F;AACA,QAAA,OAAO,KAAK,CAAC;IACf,CAAC;AACD,IAAA,OAAO,IAAI,CAAC;AACd;;AC5HA;;;;AAIG;AACH,SAAS,aAAa,CAAC,MAAwB,EAAA;AAC7C,IAAA,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;QAC9B,OAAO;AACL,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,QAAQ,EAAE;AACR,gBAAA,oBAAoB,EAAE,MAAM,CAAC,QAAQ,CAAC,oBAAoB;AAC1D,gBAAA,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;AAC/B,aAAA;SACF,CAAC;IACJ,CAAC;AAED,IAAA,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE;AAC3B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,KAAK,YAAY,uBAAuB,EAAE;YAC5C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC3C,CAAC;AACD,QAAA,IAAI,KAAK,YAAY,eAAe,EAAE;AACpC,YAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACzE,CAAC;AACD,QAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC3E,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED;;;;AAIG;AACH,SAAS,YAAY,CAAC,GAAoB,EAAE,MAAyB,EAAA;AACnE,IAAA,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACG,SAAU,iCAAiC,CAC/C,MAA6B,EAC7B,OAAiC,EAAA;IAEjC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,GAAG,oBAAoB,EAAE,GAAG,OAAO,CAAC;IACpE,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAE1E,OAAO,OACL,GAAmB,EACnB,GAAoB,EACpB,IAAyB,KACR;AACjB,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AACzB,YAAA,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;AACD,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;AACvC,YAAA,IAAI,UAAU,IAAI,MAAM,EAAE;AACxB,gBAAA,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACvE,gBAAA,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC5B,CAAC;iBAAM;gBACL,GAAG;AACA,qBAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;AACrB,qBAAA,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,uBAAuB,CAAC;YACjF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;AACH,IAAA,CAAC,CAAC;AACJ,CAAC;AAED;AACO,MAAM,2BAA2B,GAAG;;AC/G3C;;;;AAIG;AACG,SAAU,4BAA4B,CAAC,UAAkB,EAAA;IAC7D,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;AACjD,QAAA,OAAO,EAAE,CAAC;IACZ,CAAC;AACD,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAClC,OAAO,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,eAAe,GAAG,CAAA,EAAG,iCAAiC,GAAG,CAAC;AAUhE;;;;;;;;;;AAUG;AACG,SAAU,gDAAgD,CAC9D,IAA0D,EAC1D,OAA+C,EAAA;AAE/C,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE;AAClC,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAC3B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,EAAE;YACR,SAAS;QACX,CAAC;AACD,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE;AACnC,YAAA,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;aAAM;AACL,YAAA,MAAM,EAAE,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,EAAE,EAAE;AACN,gBAAA,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE;QACnC,MAAM,EAAE,GAAG,4BAA4B,CAAC,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,EAAE,EAAE;YACP,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,aAAa,CAAC;AAC1D,QAAA,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACjD;;ACnFA,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AAC5D,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AACpD,MAAMA,kBAAgB,GAAG,iBAAiB,CAAC;AAE3C;;;;;;AAMG;AACG,SAAU,iCAAiC,CAC/C,YAAgC,EAChC,QAA4B,EAAA;AAE5B,IAAA,MAAM,GAAG,GAAG,YAAY,KAAK,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;AACjE,IAAA,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;IAC5B,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAsBD;;;;;;;;;;;;;AAaG;AACG,SAAU,kCAAkC,CAChD,OAA4C,EAAA;AAE5C,IAAA,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAGA,kBAAgB,EAAE,GAAG,OAAO,CAAC;AAE5F,IAAA,MAAM,cAAc,GAClB,KAAK,KAAK,SAAS;UACf,uCAAuC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;UAC7E,EAAE,CAAC;IAET,OAAO,OAAO,GAAmB,EAAE,GAAoB,EAAE,IAAyB,KAAI;AACpF,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AAClD,YAAA,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;AAED,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAElC,QAAA,IAAI;YACF,MAAM,gBAAgB,GAAG,iCAAiC,CACxD,MAAM,EACN,cAAc,CAAC,sBAAsB,CAAC,CACvC,CAAC;AAEF,YAAA,MAAM,OAAO,GAAG,GAAG,CAAC,OAAwD,CAAC;AAC7E,YAAA,MAAM,cAAc,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AACtD,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC;AACvF,YAAA,IAAI,WAAW,KAAK,gBAAgB,EAAE;AACpC,gBAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;AAED,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;AACtB,YAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACpE,gBAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,IAAyC,CAAC;YAE9D,MAAM,IAAI,GAAG,kBAAkB,CAAC;AAC9B,gBAAA,GAAG,gDAAgD,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,CAAC;AACnF,gBAAA,GAAG,cAAc;AAClB,aAAA,CAAC,CAAC;AAEH,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACrB,gBAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AACnB,oBAAA,KAAK,EACH,sGAAsG;AACzG,iBAAA,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AAEhD,YAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AACnB,gBAAA,WAAW,EAAE,IAAI;gBACjB,SAAS,EAAE,IAAI,CAAC,MAAM;gBACtB,MAAM;AACN,gBAAA,aAAa,EAAE,WAAW,CAAC,aAAa,IAAI,IAAI;AAChD,gBAAA,SAAS,EAAE,WAAW,CAAC,SAAS,IAAI,KAAK;AACzC,gBAAA,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc;AACxC,aAAA,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;AAC/D,YAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;QAC5D,CAAC;AACH,IAAA,CAAC,CAAC;AACJ;;ACjIA;;;AAGG;AACH,MAAM,KAAK,GAA6B;AACtC,IAAA,GAAGC,OAAS;AACZ,IAAA,GAAGC,OAAY;CAChB;;ACED,MAAMF,kBAAgB,GAAG,qBAAqB,CAAC;AAC/C,MAAM,cAAc,GAAa,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAwClD;;;;;;;AAOG;SACa,4BAA4B,CAC1C,eAAuB,EACvB,YAAY,GAAG,4BAA4B,EAAA;IAE3C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC;IAChE,OAAO,MAAM,0BAA0B,WAAW,CAAC,CAAC;AACtD,CAAC;AAED;;;;;AAKG;AACG,SAAU,8BAA8B,CAAC,MAA0B,EAAA;AACvE,IAAA,MAAM,GAAG,GAAG,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,cAAc,CAAC,yBAAyB,CAAC,CAAC;AACtF,IAAA,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;IAC5B,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED;;;;;AAKG;AACG,SAAU,yBAAyB,CAAC,MAAe,EAAA;IACvD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AACzC,QAAA,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,MAAM,MAAM,GAAG,MAAiE,CAAC;AACjF,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;IACtC,OAAO;QACL,QAAQ,EAAE,EAAE,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;KACvC,CAAC;AACJ,CAAC;AAED;;;;;;;AAOG;AACG,SAAU,6BAA6B,CAC3C,OAA6C,EAAA;AAE7C,IAAA,MAAM,EACJ,UAAU,EACV,QAAQ,EAAE,cAAc,EACxB,cAAc,EACd,QAAQ,GAAGA,kBAAgB,GAC5B,GAAG,OAAO,CAAC;IAEZ,IAAI,cAAc,GAAyB,cAAc,CAAC;AAC1D,IAAA,IAAI,mBAAkD,CAAC;IAEvD,MAAM,eAAe,GAAG,MAAwB;QAC9C,IAAI,cAAc,EAAE;AAClB,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,mBAAmB,EAAE;AACxB,YAAA,mBAAmB,GAAG,CAAC,YAAW;gBAChC,IAAI,CAAC,cAAc,EAAE;oBACnB,cAAc,GAAG,cAAc,CAAC;AAChC,oBAAA,OAAO,cAAc,CAAC;gBACxB,CAAC;AACD,gBAAA,IAAI;AACF,oBAAA,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;AACtC,oBAAA,cAAc,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;AACnD,oBAAA,KAAK,CAAC,OAAO,CAAC,+BAA+B,EAAE;wBAC7C,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,MAAM;AACtD,qBAAA,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,GAAG,EAAE;AACZ,oBAAA,KAAK,CAAC,OAAO,CAAC,kDAAkD,EAAE,GAAG,CAAC,CAAC;oBACvE,cAAc,GAAG,cAAc,CAAC;gBAClC,CAAC;AACD,gBAAA,OAAO,cAAc,CAAC;YACxB,CAAC,GAAG,CAAC;QACP,CAAC;AACD,QAAA,OAAO,mBAAmB,CAAC;AAC7B,IAAA,CAAC,CAAC;IAEF,OAAO,OAAO,GAAmB,EAAE,GAAoB,EAAE,IAAyB,KAAI;AACpF,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AACzB,YAAA,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;AAED,QAAA,KAAK,CAAC,OAAO,CAAC,qCAAqC,EAAE;YACnD,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,OAAO;AACrB,SAAA,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,sBAAsB,CAAC;YACzC,aAAa,EAAE,GAAG,CAAC,MAAM;AACzB,YAAA,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAkD;AAC7E,YAAA,cAAc,EAAE,uBAAuB;AACxC,SAAA,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,KAAK,CAAC,OAAO,CACX,uFAAuF,CACxF,CAAC;AACF,YAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;AAED,QAAA,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,EAAE;YACvC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;gBACvC,GAAG,CAAC,SAAU,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,YAAA,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAkD,CAAC;AACjF,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,0BAA0B,CAAC,CAAC;AACtD,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;QACzE,MAAM,gBAAgB,GAAG,8BAA8B,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;AAE/E,QAAA,IAAI,CAAC,gBAAgB,IAAI,MAAM,KAAK,gBAAgB,EAAE;YACpD,KAAK,CAAC,OAAO,CAAC,kDAAkD,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAC5F,YAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;AAED,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE;AAC5B,YAAA,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;AACnC,YAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAChB,YAAA,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE;AAClC,gBAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;iBAAM;AACL,gBAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;YACD,OAAO;QACT,CAAC;AAED,QAAA,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAC;AAEzC,QAAA,KAAK,CAAC,OAAO,CAAC,6BAA6B,EAAE;YAC3C,UAAU,EAAE,UAAU,CAAC,IAAI;YAC3B,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM;AAChD,SAAA,CAAC,CAAC;AAEH,QAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AACzC,YAAA,QAAQ,EAAE,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE;YAClC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;AAC5B,SAAA,CAAC,CAAC;AACL,IAAA,CAAC,CAAC;AACJ;;ACvMA,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAgE/C,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AAEtF;;;;;;AAMG;AACH,SAAS,gBAAgB,CACvB,KAAyC,EACzC,kBAA2C,EAAA;AAE3C,IAAA,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,IAAI,eAAe,CAAC;IACtD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC;QACrC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAA+B;QAC5D,SAAS;QACT,OAAO,EAAE,KAAK,CAAC,UAAU;QACzB,UAAU,EAAE,KAAK,CAAC,aAAiD;AACnE,QAAA,IAAI,KAAK,CAAC,cAAc,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC;AAClE,QAAA,GAAG,kBAAkB;KACtB,CAAC;AACJ,CAAC;AAED;;;;;;;AAOG;AACH,SAAS,yBAAyB,CAChC,WAA0D,EAC1D,aAAkC,EAAA;AAElC,IAAA,MAAM,IAAI,GACR,OAAO,aAAa,KAAK,UAAU;UAC/B,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACzC,UAAE,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;AAC9B,cAAE,aAAa;cACb,EAAE,CAAC;IAET,MAAM,kBAAkB,GAA4B,EAAE,CAAC;IACvD,MAAM,oBAAoB,GAAa,EAAE,CAAC;AAE1C,IAAA,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE;AACxB,QAAA,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;AAC5D,QAAA,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;AACpE,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AAChC,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,kBAAkB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACnC,CAAC;aAAM,IAAI,QAAQ,EAAE;AACnB,YAAA,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;AAED,IAAA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,CAAC;AACtD,CAAC;AAED;;;;;AAKG;AACH,SAAS,cAAc,GAAA;AACrB,IAAA,OAAO,CAAA,uBAAA,EAA0B,CAAC,GAAG,wBAAwB,EAAE,EAAE,GAAG,uBAAuB,CAAC,CAAC,IAAI,CAC/F,GAAG,CACJ,EAAE,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;AAaG;AACG,SAAU,6BAA6B,CAC3C,OAA8C,EAAA;AAE9C,IAAA,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,gBAAgB,CAAC;IAEvD,OAAO,OAAO,GAAmB,EAAE,GAAoB,EAAE,IAAyB,KAAI;AACpF,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AACzB,YAAA,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;AAED,QAAA,IAAI;AACF,YAAA,KAAK,CAAC,OAAO,CAAC,qCAAqC,EAAE;gBACnD,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,OAAO,EAAE,GAAG,CAAC,OAAO;AACrB,aAAA,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,sBAAsB,CAAC;gBACzC,aAAa,EAAE,GAAG,CAAC,MAAM;AACzB,gBAAA,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAkD;AAC7E,gBAAA,cAAc,EAAE,uBAAuB;AACxC,aAAA,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,EAAE;AAChB,gBAAA,KAAK,CAAC,OAAO,CACX,uFAAuF,CACxF,CAAC;gBACF,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC;AAC1C,gBAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAA,qBAAA,EAAwB,MAAM,CAAA,YAAA,CAAc,EAAE,CAAC,CAAC;gBAC9E,OAAO;YACT,CAAC;AAED,YAAA,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,EAAE;gBACvC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;oBACvC,GAAG,CAAC,SAAU,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,gBAAA,CAAC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAkD,CAAC;AACjF,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,0BAA0B,CAAC,CAAC;AACtD,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;AACzE,YAAA,MAAM,gBAAgB,GACpB,8BAA8B,CAAC,OAAO,EAAE,aAAa,CAAC;gBACtD,cAAc,CAAC,yBAAyB,CAAC,CAAC;AAE5C,YAAA,IAAI,CAAC,gBAAgB,IAAI,MAAM,KAAK,gBAAgB,EAAE;gBACpD,KAAK,CAAC,OAAO,CAAC,kDAAkD,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAC5F,gBAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;gBAC7D,OAAO;YACT,CAAC;AAED,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE;AAC5B,gBAAA,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;AACnC,gBAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAChB,gBAAA,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE;AAClC,oBAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,CAAC;qBAAM;AACL,oBAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,CAAC;gBACD,OAAO;YACT,CAAC;AAED,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE;gBACxB,KAAK,CAAC,OAAO,CAAC,uCAAuC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AACnE,gBAAA,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,EAAE;AACvC,oBAAA,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAChC,CAAC;AACD,gBAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,GAAG,CAAC,MAAM,CAAA,CAAA,CAAG,EAAE,CAAC,CAAC;gBAC1E,OAAO;YACT,CAAC;AAED,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAElC,MAAM,SAAS,GAAuC,EAAE,CAAC;AACzD,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBAChD,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YAC3D,CAAC;AAED,YAAA,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACrE,YAAA,MAAM,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,GAAG,yBAAyB,CAC5E,KAAK,EACL,OAAO,EAAE,kBAAkB,CAC5B,CAAC;YAEF,IAAI,eAAe,CAAC,MAAM,IAAI,oBAAoB,CAAC,MAAM,EAAE;gBACzD,MAAM,OAAO,GAAG,CAAC,GAAG,eAAe,EAAE,GAAG,oBAAoB,CAAC,CAAC;AAC9D,gBAAA,KAAK,CAAC,OAAO,CAAC,uCAAuC,EAAE,OAAO,CAAC,CAAC;AAChE,gBAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,sCAAsC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE;AAClE,iBAAA,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAEpE,YAAA,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,EAAE;gBACvC,GAAG,CAAC,SAAS,CAAC,yBAAyB,EAAE,cAAc,EAAE,CAAC,CAAC;YAC7D,CAAC;AAED,YAAA,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3C,MAAM,WAAW,GACf,OAAO,EAAE,cAAc,GAAG,YAAY,EAAE,WAAW,CAAC;gBACpD,CAAA,CAAA,EAAI,WAAW,CAAC,QAAQ,CAAA,EAAG,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA,EAAG,YAAY,CAAA,CAAE,CAAC;AACtF,YAAA,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;AAE5C,YAAA,KAAK,CAAC,OAAO,CAAC,oCAAoC,EAAE,WAAW,CAAC,CAAC;YAEjE,MAAM,UAAU,GAAG,GAA4B,CAAC;AAChD,YAAA,UAAU,CAAC,SAAS,GAAG,WAAW,CAAC;AACnC,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACvB,gBAAA,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC;YAC1B,CAAC;AACD,YAAA,UAAU,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;AAExE,YAAA,UAAU,CAAC,GAAG,GAAG,YAAY,CAAC;;AAE9B,YAAA,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC;YAE1B,KAAK,CAAC,OAAO,CAAC,2CAA2C,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,EAAE;AACtF,gBAAA,KAAK,EAAE,WAAW;AACnB,aAAA,CAAC,CAAC;AAEH,YAAA,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,GAAG,EAAE;AACZ,YAAA,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AACjE,YAAA,KAAK,CAAC,OAAO,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;;AAE1D,YAAA,OAAO,CAAC,KAAK,CAAC,mDAAmD,EAAE,GAAG,CAAC,CAAC;AACxE,YAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;AACH,IAAA,CAAC,CAAC;AACJ;;ACnSA,MAAM,kBAAEG,gBAAc,EAAE,GAAG,SAAS,CAAC;AAQrC;;;;AAIG;AACG,SAAU,uBAAuB,CACrC,OAAuC,EAAA;AAEvC,IAAA,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;AAClC,IAAA,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;AAE7C,IAAA,OAAO,OAAO,GAAmB,EAAE,GAAoB,KAAmB;AACxE,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;QACnF,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,WAAW,IAAI,SAAS,CAAC;AACtD,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;AAClC,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAClE,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC;QAC5D,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAErD,QAAA,MAAM,cAAc,GAAsB;AACxC,YAAA,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;AACxB,YAAA,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;YAChC,EAAE;YACF,QAAQ,EAAE,IAAI,CAAC,IAAI;SACpB,CAAC;AAEF,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAElC,QAAA,KAAK,CAAC,OAAO,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;AAE9D,QAAA,IAAI;YACF,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AAE3D,YAAA,KAAK,CAAC,OAAO,CAAC,gCAAgC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,CAAC;YAE7E,GAAG,CAAC,SAAS,GAAG,cAAc,EAAE,wBAAwB,CAAC,CAAC;AAC1D,YAAA,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE;AACd,YAAA,KAAK,CAAC,OAAO,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YAErD,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,cAAc,EAAE;AAC9D,gBAAA,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;YACzB,CAAC;iBAAM;AACL,gBAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,0BAA0BA,gBAAc,CAAC,eAAe,CAAA,CAAE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;AACH,IAAA,CAAC,CAAC;AACJ;;ACvDA,MAAM,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;AAQrC;;;;AAIG;AACG,SAAU,sBAAsB,CACpC,OAAsC,EAAA;AAEtC,IAAA,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;AAClC,IAAA,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;AAE7C,IAAA,OAAO,OAAO,GAAmB,EAAE,GAAoB,KAAmB;QACxE,GAAG,CAAC,SAAS,GAAG,cAAc,EAAE,YAAY,CAAC,CAAC;AAE9C,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;QAClC,MAAM,QAAQ,GACZ,OAAO,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QACzF,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEtD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAElC,QAAA,KAAK,CAAC,MAAM,CAAC,6BAA6B,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAE/E,QAAA,IAAI;YACF,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAExD,YAAA,KAAK,CAAC,MAAM,CAAC,+BAA+B,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,CAAC;YAE3E,IAAI,CAAC,aAAa,EAAE;gBAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,4BAA4B,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE;AACd,YAAA,KAAK,CAAC,MAAM,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;AAEnD,YAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,0BAA0B,cAAc,CAAC,eAAe,CAAA,CAAE,CAAC,CAAC;QACrF,CAAC;AACH,IAAA,CAAC,CAAC;AACJ;;ACtDA;;;;;;;AAOG;AACI,MAAM,gBAAgB,GAAG;;ACyBhC,MAAM,eAAe,GAAG,kEAAkE,CAAC;AAE3F;;;;AAIG;AACG,SAAU,WAAW,CAAC,GAAmB,EAAA;IAC7C,OAAO,yBAAyB,CAC7B,GAAG,CAAC,OAAO,GAAG,kBAAkB,CAAwB;QACtD,GAAG,CAAC,OAAO,EAAE,IAA2B;AACzC,QAAA,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;AACxC,QAAA,GAAG,CACN,CAAC;AACJ,CAAC;AAED;;;;AAIG;AACG,SAAU,yBAAyB,CAAC,OAAmC,EAAA;IAC3E,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC3D,IAAA,OAAO,CAAC,GAAmB,EAAE,GAAoB,EAAE,IAAyB,KAAI;AAC9E,QAAA,IAAI;;;AAGF,YAAA,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,oBAAoB,CAAC,GAAyB,CAAC,CAAC;AAE9E,YAAA,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE;AAC7B,gBAAA,KAAK,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;gBACjD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;AAED,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AAClC,gBAAA,KAAK,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;gBAClD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;AAC7C,gBAAA,KAAK,CAAC,SAAS,CACb,sFAAsF,CACvF,CAAC;gBACF,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE;AACvB,gBAAA,KAAK,CAAC,SAAS,CAAC,+CAA+C,CAAC,CAAC;gBACjE,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;AACD,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAClC,YAAA,KAAK,CAAC,SAAS,CAAC,gCAAgC,EAAE;gBAChD,IAAI;gBACJ,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,KAAK;AACN,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,YAAoB,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;YAEnD,YAAY;gBACT,KAAK,CAAC,QAAQ,CAAwB;AACtC,oBAAA,KAAK,CAAC,IAA2B;qBACjC,OAAO,CAAC,mBAAmB;AAC1B,wBAAA,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC;AAC/B,wBAAA,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAwB,CAAC;AACnD,oBAAA,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;YAExC,IAAI,CAAC,YAAY,EAAE;AACjB,gBAAA,YAAY,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;YAC3C,CAAC;YACA,GAA0B,CAAC,QAAQ,GAAG;AACrC,gBAAA,IAAK,GAA0B,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC/C,gBAAA,QAAQ,EAAE,YAAY;aACvB,CAAC;;;YAGF,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;AAChC,YAAA,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,SAAS,CAAE,GAA0B,CAAC,QAAQ,CAAC,CAAC;YACrF,KAAK,CAAC,SAAS,CAAC,sCAAsC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,EAAE;gBACnF,YAAY;AACb,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACd,gBAAA,MAAM,uBAAuB,GAAG;AAC9B,oBAAA,MAAM,EAAE,IAAI;AACZ,oBAAA,QAAQ,EAAE,IAAI;AACd,oBAAA,QAAQ,EAAE,MAAM;iBACA,CAAC;gBACnB,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,uBAAuB,CAAC,CAAC;YAC9D,CAAC;iBAAM;AACL,gBAAA,KAAK,CAAC,SAAS,CACb,iIAAiI,CAClI,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAC5C,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;AACD,QAAA,IAAI,EAAE,CAAC;AACT,IAAA,CAAC,CAAC;AACJ;;ACtHA;;;AAGG;AACH,MAAM,gBAAgB,GAAG,mCAAmC,CAAC;AAE7D;;;;;;;AAOG;AACG,SAAU,mBAAmB,CAAC,QAAgB,EAAE,OAAiB,EAAA;IACrE,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC;IAC9C,CAAC;AACD,IAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAC;IACxE,MAAM,GAAG,YAAY,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE,EAAE,aAAa,GAAG,SAAS,CAAC,GACnE,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;IAE3C,IAAI,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;AAClD,QAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,IAAI,GAAG,EAAE,aAAa,EAAE,CAAC;IACjF,CAAC;AACD,IAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAA,CAAA,EAAI,YAAY,GAAG,QAAQ,CAAA,CAAE,EAAE,aAAa,EAAE,CAAC;AACvF,CAAC;AAED;;;;;;;;;AASG;AACG,SAAU,eAAe,CAAC,OAAiB,EAAA;IAC/C,OAAO,CAAC,QAAsB,KAAoB;AAChD,QAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;YAC7D,OAAO,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACzE,CAAC;AACD,QAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC1B,IAAA,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;AAMG;AACG,SAAU,kBAAkB,CAAC,GAAmB,EAAE,SAAkB,EAAA;IACxE,IAAI,GAAG,EAAE;AACP,QAAA,IAAI;YACF,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QACnC,CAAC;AAAC,QAAA,MAAM;;QAER,CAAC;IACH,CAAC;IACD,IAAI,SAAS,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,EAAE;AACjE,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAClC,CAAC;AACD,IAAA,OAAO,GAAG,CAAC;AACb;;ACMA,MAAMC,YAAU,GAAG,CAAC,GAAmB,KACrC,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CACvD,CAAC,MAAM,KAAK,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CACtE,CAAC;AAEJ,MAAM,mBAAmB,GAAG,CAC1B,KAAoD,EACpD,QAAgB,EAChB,cAAA,GAAmD,EAAE,KACjC;AACpB,IAAA,MAAM,QAAQ,GAAG,CAAC,IAAY,KAAI;AAChC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,SAAS,CAAC;AAChE,IAAA,CAAC,CAAC;IACF,OAAO;QACL,QAAQ;AACR,QAAA,GAAG,EAAE;AACH,YAAA,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC;AAClC,YAAA,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC;AAChC,YAAA,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC;AAC9B,YAAA,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC;AAC9B,YAAA,GAAG,cAAc;AAClB,SAAA;KACF,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;AAOG;AACH,MAAM,wBAAwB,GAAG,CAC/B,eAAgC,EAChC,QAAgB,EAChB,KAAc,KAEd,eAAe,CAAC,UAAU,CAAC,MAAM,CAAyB,CAAC,OAAO,EAAE,SAAS,KAAI;IAC/E,MAAM,kBAAkB,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,kBAAkB;AACnC,UAAE,SAAS,CAAC,sBAAsB,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC;AACxF,UAAE,SAAS,CAAC,iBAAiB,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AACzE,IAAA,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IACnE,IAAI,SAAS,EAAE;AACb,QAAA,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;SAAM;QACL,OAAO,CAAC,IAAI,CAAC;YACX,UAAU;;AAEV,YAAA,UAAU,EAAE,kBAAkB;kBAC1B,CAAC,CAAA,EAAG,WAAW,GAAG,eAAe,CAAA,CAAE,EAAE,SAAS,CAAC;kBAC/C,CAAC,SAAS,CAAC;AAChB,SAAA,CAAC,CAAC;IACL,CAAC;AACD,IAAA,OAAO,OAAO,CAAC;AACjB,CAAC,EAAE,EAAE,CAAC,CAAC;AAET;;;;;;;AAOG;AACG,SAAU,2BAA2B,CACzC,OAAqC,EAAA;AAErC,IAAA,MAAM,kBAAkB,GACtB,OAAO,CAAC,kBAAkB;AAC1B,SAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,eAAe;cACzC,IAAI,kBAAkB,CAAC;gBACrB,aAAa,EAAE,0BAA0B,CAAC;AACxC,oBAAA,GAAG,EAAE;AACH,wBAAA,IAAI,EAAE;4BACJ,SAAS,EAAE,OAAO,CAAC,SAAmB;4BACtC,eAAe,EAAE,OAAO,CAAC,eAAe;4BACxC,OAAO,EAAE,OAAO,CAAC,OAAO;AACzB,yBAAA;AACF,qBAAA;iBACF,CAAC;gBACF,OAAO,EAAE,OAAO,CAAC,WAAW;gBAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,gBAAA,KAAK,EAAE,KAAK;aACb,CAAC;cACF,IAAI,CAAC,CAAC;IAEZ,IAAI,CAAC,kBAAkB,EAAE;QACvB,OAAO,CAAC,IAAI,CACV,0GAA0G;AACxG,YAAA,yFAAyF,CAC5F,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,GAAmB,EAAE,GAAoB,EAAE,IAAyB,KAAI;AACpF,QAAA,IAAI;;YAEF,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,kBAAkB,EAAE;AACpD,gBAAA,KAAK,CAAC,WAAW,CAAC,mDAAmD,CAAC,CAAC;gBACvE,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;;;AAGD,YAAA,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAExD,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AAClC,gBAAA,KAAK,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;gBACpD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;AAC7C,gBAAA,KAAK,CAAC,WAAW,CAAC,sDAAsD,CAAC,CAAC;gBAC1E,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE;AACvB,gBAAA,KAAK,CAAC,WAAW,CAAC,iDAAiD,CAAC,CAAC;gBACrE,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;;AAGD,YAAA,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,KAAK,IAAI,CAAC,OAAO,GAAG,oBAAoB,CAAC,EAAE;AACxE,gBAAA,KAAK,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;gBAC3C,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;AAED,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAClC,YAAA,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACnF,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;AAC3D,YAAA,MAAM,QAAQ,GACX,GAA0B,CAAC,QAAQ,EAAE,QAAQ;AAC9C,gBAAA,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;gBACxB,OAAO,CAAC,WAAW,CAAC;AACtB,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;AAC5E,YAAA,MAAM,QAAQ,GACZ,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;AAEzF,YAAA,KAAK,CAAC,WAAW,CAAC,kCAAkC,EAAE;AACpD,gBAAA,IAAI,EAAE,aAAa;gBACnB,QAAQ;gBACR,QAAQ;gBACR,QAAQ;gBACR,OAAO,EAAE,GAAG,CAAC,OAAO;AACrB,aAAA,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,KAAK,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC;gBAC1D,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;;AAGD,YAAA,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAAC,kBAAkB,CACjE,aAAa,EACb,QAAQ,EACR,QAAQ,CACT,CAAC;YACF,IAAI,CAAC,eAAe,EAAE;;AAEpB,gBAAA,KAAK,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC;gBAC1D,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YACD,IAAI,eAAe,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3C,gBAAA,KAAK,CAAC,WAAW,CAAC,yCAAyC,CAAC,CAAC;gBAC7D,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;AAED,YAAA,IAAIA,YAAU,CAAC,GAAG,CAAC,EAAE;;;;AAInB,gBAAA,KAAK,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;gBACxC,GAAG,CAAC,SAAS,GAAG,eAAe,EAAE,UAAU,CAAC,CAAC;gBAC7C,GAAG,CAAC,SAAS,GAAG,eAAe,EAAE,2BAA2B,CAAC,CAAC;gBAC9D,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;;;AAID,YAAA,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,GAAyB,EAAE,GAAG,CAAC,CAAC;AACzF,YAAA,MAAM,cAAc,CAAC;AACnB,gBAAA,MAAM,EAAE;oBACN,SAAS,EAAE,OAAO,CAAC,SAAmB;oBACtC,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,QAAQ;AACT,iBAAA;AACD,gBAAA,OAAO,EAAE;AACP,oBAAA,eAAe,CAAC;AACd,wBAAA,OAAO,EAAE;AACP,4BAAA,YAAY,EAAE,IAAI;AAClB,4BAAA,YAAY,EAAE,QAAQ;AACvB,yBAAA;;AAED,wBAAA,OAAO,EAAE,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC;qBAClD,CAAC;AACF,oBAAA,uBAAuB,CAAC;AACtB,wBAAA,OAAO,EAAE;AACP,4BAAA,uBAAuB,EAAE,IAAI;AAC9B,yBAAA;AACD,wBAAA,OAAO,EAAE,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC;qBACpD,CAAC;AACH,iBAAA;AACF,aAAA,CAAC,CAAC;AAEH,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;YACvF,MAAM,MAAM,GAAG,mBAAmB,CAChC,KAAK,EACJ,IAAI,CAAC,QAAmB,IAAK,IAAI,CAAC,OAAO,EAAE,OAAkB,IAAI,EAAE,EACpE,OAAO,CAAC,iBAAiB,GAAG,GAAG,CAAC,CACjC,CAAC;AACF,YAAA,MAAM,UAAU,GAAG,wBAAwB,CAAC,eAAe,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACtF,MAAM,oBAAoB,GAAa,EAAE,CAAC;AAE1C,YAAA,MAAM,OAAO,CAAC,GAAG,CACf,UAAU,CAAC,GAAG,CAAC,OAAO,SAAS,KAAI;gBACjC,KAAK,CAAC,WAAW,CAAC,gCAAgC,EAAE,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAClF,gBAAA,MAAM,eAAe,IAAI,MAAM,WAAW,CACxC;AACE,oBAAA,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;AACjC,oBAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,KAAK;oBACnC,UAAU,EAAE,SAAS,CAAC,UAAU;oBAChC,MAAM;oBACN,QAAQ;oBACR,cAAc,EAAE,SAAS,CAAC,UAAU;AACpC,oBAAA,IAAI,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;iBACpB,EACD,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE,CAChC,CAAkC,CAAC;AACpC,gBAAA,MAAM,SAAS,GAAG,eAAe,EAAE,SAAS,CAAC;AAC7C,gBAAA,IAAI,CAAC,SAAS;oBAAE,OAAO;gBACvB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AAC7C,oBAAA,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;gBACrD,CAAC;qBAAM;AACL,oBAAA,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC,CAAC,CACH,CAAC;AAEF,YAAA,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE;AACrC,gBAAA,KAAK,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC;gBACxD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,MAAM,EAAE,SAAS,EAAE,mBAAmB,EAAE,GAAG,oBAAoB,CAAC,oBAAoB,CAAC,CAAC;YACrF,GAA0B,CAAC,QAAQ,GAAG;AACrC,gBAAA,IAAK,GAA0B,CAAC,QAAQ,IAAI,EAAE,CAAC;gBAC/C,SAAS;gBACT,mBAAmB;aACpB,CAAC;;;YAGF,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;AAChC,YAAA,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,SAAS,CAAE,GAA0B,CAAC,QAAQ,CAAC,CAAC;YAErF,KAAK,CAAC,WAAW,CAAC,wCAAwC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,EAAE;gBACvF,SAAS;gBACT,mBAAmB;AACpB,aAAA,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAC9C,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;AACD,QAAA,IAAI,EAAE,CAAC;AACT,IAAA,CAAC,CAAC;AACJ;;AC7SA,MAAMA,YAAU,GAAG,CAAC,GAAmB,KACrC,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CACvD,CAAC,MAAM,KAAK,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CACtE,CAAC;AAEJ;;;;AAIG;AACH,MAAM,cAAc,GAAG,CAAC,KAAoD,KAAY;AACtF,IAAA,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;AACrC,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAChD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;AAClC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM;AACL,YAAA,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;AACD,IAAA,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF;;;;;;AAMG;AACH,MAAM,uBAAuB,GAAG,CAAC,OAAmC,KAA6B;AAC/F,IAAA,IAAI,OAAO,CAAC,gBAAgB,EAAE;QAC5B,OAAO,OAAO,CAAC,gBAAgB,CAAC;IAClC,CAAC;AAED,IAAA,MAAM,aAAa,GAAG,CAAC,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;AACvE,IAAA,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7D,IAAA,IAAI,CAAC,aAAa,IAAI,CAAC,cAAc,EAAE;QACrC,OAAO,CAAC,IAAI,CACV,yJAAyJ;AACvJ,YAAA,gGAAgG,CACnG,CAAC;AACF,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;AAED,IAAA,MAAM,cAAc,GAAG;AACrB,QAAA,GAAG,EAAE;AACH,YAAA,IAAI,EAAE;gBACJ,SAAS,EAAE,OAAO,CAAC,SAAU;gBAC7B,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,OAAO,EAAE,OAAO,CAAC,OAAO;AACzB,aAAA;AACD,YAAA,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM;AACnC,kBAAE;AACE,oBAAA,KAAK,EAAE;wBACL,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;wBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;AACnB,qBAAA;AACF,iBAAA;kBACD,EAAE,CAAC;AACR,SAAA;KACF,CAAC;IAEF,OAAO,IAAI,gBAAgB,CAAC;AAC1B,QAAA,GAAG,OAAO;AACV,QAAA,aAAa,EAAE,0BAA0B,CAAC,cAAc,CAAC;AACzD,QAAA,KAAK,EAAE,KAAK;AACb,KAAA,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;;;;;;;;;AAaG;AACG,SAAU,yBAAyB,CAAC,OAAmC,EAAA;AAC3E,IAAA,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAC1D,IAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAE3D,OAAO,OAAO,GAAmB,EAAE,GAAoB,EAAE,IAAyB,KAAI;AACpF,QAAA,IAAI;;YAEF,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,gBAAgB,EAAE;AAClD,gBAAA,KAAK,CAAC,SAAS,CAAC,iDAAiD,CAAC,CAAC;gBACnE,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;;;AAID,YAAA,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAExD,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AAClC,gBAAA,KAAK,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;gBAClD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;;YAGD,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;AAC7C,gBAAA,KAAK,CAAC,SAAS,CAAC,oDAAoD,CAAC,CAAC;gBACtE,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE;AACvB,gBAAA,KAAK,CAAC,SAAS,CAAC,+CAA+C,CAAC,CAAC;gBACjE,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;AAED,YAAA,IAAIA,YAAU,CAAC,GAAG,CAAC,EAAE;;;AAGnB,gBAAA,KAAK,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;gBACtC,GAAG,CAAC,SAAS,GAAG,eAAe,EAAE,UAAU,CAAC,CAAC;gBAC7C,GAAG,CAAC,SAAS,GAAG,eAAe,EAAE,2BAA2B,CAAC,CAAC;gBAC9D,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;AAED,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAClC,MAAM,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;AAC3D,YAAA,MAAM,QAAQ,GACX,GAA0B,CAAC,QAAQ,EAAE,QAAQ;AAC9C,gBAAA,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;gBACxB,OAAO,CAAC,WAAW,CAAC;AAEtB,YAAA,KAAK,CAAC,SAAS,CAAC,gCAAgC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEhF,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,KAAK,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAC;gBACxD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC;AACzB,YAAA,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAEzC,YAAA,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAC5C,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,WAAW,EACX,UAAU,CACX,CAAC;YAEF,IAAI,CAAC,cAAc,EAAE;AACnB,gBAAA,KAAK,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;gBACrD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,KAAK,CAAC,SAAS,CAAC,2BAA2B,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;YAEjE,MAAM,gBAAgB,GAAG,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAC7D,YAAA,gBAAgB,CAAC,WAAW,GAAG,UAAU,IAAI,SAAS,CAAC;;AAGvD,YAAA,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,IAAI,QAAQ,CAAC;YAC5E,cAAc,CAAC,MAAM,GAAG,qBAAqB,CAAC,cAAc,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;;;;AAKzF,YAAA,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAEnD,YAAA,IAAI,gBAAgB,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;gBAC3C,MAAM,SAAS,GAAG,wBAAwB,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;AAC7E,gBAAA,gBAAgB,CACd,SAAS,EACT,cAAc,CAAC,YAAY,EAC3B,GAAG,EACH,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,iBAAiB,CAClB,CAAC;YACJ,CAAC;iBAAM;AACL,gBAAA,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,wBAAwB,CAC3D,gBAAgB,EAChB,cAAc,EACd,OAAO,EACP,QAAQ,CACT,CAAC;;;;;AAKF,gBAAA,MAAM,iBAAiB,GAAG,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC;gBACpD,MAAM,aAAa,GAAG,YAAY,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC;AAC5E,gBAAA,MAAM,kBAAkB,GACtB,CAAC,CAAC,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,iBAAiB,IAAI,aAAa,CAAC,CAAC;AAC/E,gBAAA,MAAM,SAAS,GAAG,kBAAkB,GAAG,CAAA,CAAA,EAAI,YAAY,CAAA,EAAG,UAAU,CAAA,CAAE,GAAG,UAAU,CAAC;AACpF,gBAAA,gBAAgB,CACd,SAAS,EACT,cAAc,CAAC,YAAY,EAC3B,GAAG,EACH,GAAG,EACH,IAAI,EACJ,KAAK,EACL,iBAAiB,CAClB,CAAC;YACJ,CAAC;AAED,YAAA,KAAK,CAAC,SAAS,CAAC,kCAAkC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,CAAC;QACnF,CAAC;QAAC,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAC5C,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnB,YAAA,IAAI,EAAE,CAAC;QACT,CAAC;AACH,IAAA,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;AAUG;AACH,eAAe,iBAAiB,CAC9B,OAAyB,EACzB,QAAgB,EAChB,QAAgB,EAChB,OAAiB,EACjB,WAAmB,EACnB,UAAkB,EAAA;IAElB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;;AAGzD,IAAA,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACvE,MAAM,EAAE,aAAa,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,qBAAqB,GAAG,yBAAyB,CAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC5F,IAAI,qBAAqB,EAAE;AACzB,QAAA,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAED,MAAM,gBAAgB,GAAG,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAC7D,IAAA,gBAAgB,CAAC,WAAW,GAAG,UAAU,IAAI,SAAS,CAAC;IACvD,OAAO,4BAA4B,CAAC,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;AAKG;AACH,SAAS,mBAAmB,CAAC,GAAmB,EAAE,MAAc,EAAA;AAC9D,IAAA,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AACpE,QAAA,GAAG,CAAC,IAAsB,CAAC,GAAG,GAAG,MAAM,CAAC;IAC3C,CAAC;AAAM,SAAA,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE;AAC/B,QAAA,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;AACH,SAAS,gBAAgB,CACvB,MAAc,EACd,IAAY,EACZ,GAAmB,EACnB,GAAoB,EACpB,IAAyB,EACzB,UAAmB,EACnB,aAAsB,EAAA;AAEtB,IAAA,MAAM,eAAe,GAAG,CAAC,MAAc,KAAU;QAC/C,IAAI,aAAa,EAAE;AACjB,YAAA,MAAM,OAAO,GAAsB;AACjC,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,QAAQ,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE;aACnD,CAAC;AACF,YAAA,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,GAAG,CAAC,QAAQ,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;AACjC,IAAA,CAAC,CAAC;IAEF,QAAQ,IAAI;AACV,QAAA,KAAK,iBAAiB;YACpB,eAAe,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO;AACT,QAAA,KAAK,iBAAiB;YACpB,eAAe,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,KAAK,6BAA6B,EAAE;;YAElC,IAAI,UAAU,EAAE;gBACd,eAAe,CAAC,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;;YAED,IAAI,aAAa,EAAE;;AAEjB,gBAAA,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACnC,CAAC;iBAAM;gBACL,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACrC,gBAAA,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC;AACjB,gBAAA,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC;YACtB,CAAC;AACD,YAAA,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;AACD,QAAA;AACE,YAAA,IAAI,EAAE,CAAC;KACV;AACH;;AC1WA,MAAM,UAAU,GAAG,CAAC,GAAmB,KACrC,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CACvD,CAAC,MAAM,KAAK,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CACtE,CAAC;AAEJ;;;;;AAKG;AACG,SAAU,6BAA6B,CAAC,QAAgB,EAAA;IAC5D,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,MAAM,EAAE;AACvD,QAAA,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;AAC1C,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;AACD,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;AACpC,IAAA,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,OAAO,CAAC;AAC5F,CAAC;AAED;;;;;;;;;;;;;AAaG;AACG,SAAU,2BAA2B,CACzC,OAAqC,EAAA;IAErC,OAAO,OAAO,GAAmB,EAAE,GAAoB,EAAE,IAAyB,KAAI;AACpF,QAAA,IAAI;;;YAGF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAEjD,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AAClC,gBAAA,KAAK,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC;gBAC5D,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;AAC7C,gBAAA,KAAK,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC;gBAC3D,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE;AACvB,gBAAA,KAAK,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC;gBACtD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;AAED,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;AAC5E,YAAA,MAAM,QAAQ,GACZ,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;AAEzF,YAAA,IAAI,6BAA6B,CAAC,QAAQ,CAAC,EAAE;AAC3C,gBAAA,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC;gBACzD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC;AACrD,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;YACxF,IAAI,CAAC,SAAS,EAAE;AACd,gBAAA,KAAK,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC;gBACrD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;AAED,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;AACrB,gBAAA,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC;gBACjD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;AAED,YAAA,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE;AACnB,gBAAA,KAAK,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC;gBAChD,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;;;;AAKD,YAAA,IAAI,GAAG,CAAC,MAAM,EAAE;gBACd,GAAG,CAAC,MAAM,CAAC,oBAAoB,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YACtF,CAAC;AACD,YAAA,GAAG,CAAC,OAAO,GAAG,EAAE,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,oBAAoB,GAAG,GAAG,EAAE,CAAC;AAEtE,YAAA,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACnF,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;AAC3D,YAAA,MAAM,QAAQ,GACX,GAA0B,CAAC,QAAQ,EAAE,QAAQ;AAC9C,gBAAA,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;AACxB,gBAAA,OAAO,CAAC,WAAW;AACnB,gBAAA,EAAE,CAAC;AAEL,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAClC,YAAA,KAAK,CAAC,MAAM,CAAC,qCAAqC,EAAE;AAClD,gBAAA,IAAI,EAAE,aAAa;gBACnB,QAAQ;gBACR,QAAQ;gBACR,QAAQ;AACT,aAAA,CAAC,CAAC;;;AAIH,YAAA,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACnE,YAAA,MAAM,cAAc,CAAC;AACnB,gBAAA,MAAM,EAAE;oBACN,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,QAAQ;AACT,iBAAA;AACD,gBAAA,OAAO,EAAE;AACP,oBAAA,eAAe,CAAC;AACd,wBAAA,OAAO,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE;AAChC,wBAAA,OAAO,EAAE,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC;qBAClD,CAAC;AACF,oBAAA,YAAY,EAAE;AACf,iBAAA;AACF,aAAA,CAAC,CAAC;AAEH,YAAA,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;YAEvD,KAAK,CAAC,MAAM,CAAC,8BAA8B,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,EAAE;AACxE,gBAAA,IAAI,EAAE,aAAa;AACpB,aAAA,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE;AACd,YAAA,KAAK,CAAC,MAAM,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;AACD,QAAA,IAAI,EAAE,CAAC;AACT,IAAA,CAAC,CAAC;AACJ;;ACnKA;;;;;;;;AAQG;AACG,SAAU,aAAa,CAAC,MAAc,EAAE,QAAgB,EAAA;IAC5D,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,UAAU,EAAE;AACd,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AACjC,YAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QACD,OAAO;IACT,CAAC;;AAED,IAAA,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5D,CAAC;AAgBD;;;;AAIG;AACH,SAAS,iBAAiB,CAAC,GAAW,EAAA;AACpC,IAAA,IAAI;AACF,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAkD,EAAE,CAAC;QAChE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AACzC,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,QAAQ,EAAE;AACZ,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3B,oBAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;qBAAM;oBACL,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;iBAAM;AACL,gBAAA,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACrB,CAAC;AACH,QAAA,CAAC,CAAC,CAAC;AACH,QAAA,OAAO,KAAK,CAAC;IACf,CAAC;AAAC,IAAA,MAAM;AACN,QAAA,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;AAIG;AACH,SAAS,eAAe,CAAC,OAAgB,EAAA;IACvC,MAAM,MAAM,GAAkD,EAAE,CAAC;IACjE,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;QAC7B,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;AACpC,IAAA,CAAC,CAAC,CAAC;AACH,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;AAIG;AACH,SAAS,iBAAiB,CAAC,YAA2B,EAAA;AACpD,IAAA,IAAI,CAAC,YAAY;AAAE,QAAA,OAAO,EAAE,CAAC;IAC7B,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;AACzC,QAAA,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,IAAI,EAAE;YACR,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;AACH,IAAA,CAAC,CAAC,CAAC;AACH,IAAA,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;AAgBG;AACG,SAAU,kBAAkB,CAAC,GAA0C,EAAA;AAC3E,IAAA,IAAI,QAA4B,CAAC;IACjC,IAAI,OAAO,GAAkD,EAAE,CAAC;IAChE,IAAI,OAAO,GAA2B,EAAE,CAAC;IACzC,IAAI,KAAK,GAAkD,EAAE,CAAC;AAC9D,IAAA,IAAI,aAA6C,CAAC;AAClD,IAAA,IAAI,QAAQ,GAAG,UAAU,IAAI,GAAG,GAAG,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC;;AAE5D,IAAA,IAAI,GAAG,YAAY,OAAO,EAAE;AAC1B,QAAA,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvC,QAAA,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvD,QAAA,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnC,QAAA,IAAI;YACF,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QACvC,CAAC;AAAC,QAAA,MAAM;;QAER,CAAC;IACH,CAAC;SAAM;AACL,QAAA,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;AAC5B,QAAA,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;AAC5B,QAAA,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAC1B,CAAC;IACD,QAAQ;QACN,QAAQ;YACR,0BAA0B,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC;AAE9F,IAAA,MAAM,mBAAmB,GAAG,OAAO,GAAG,qBAAqB,CAAW,CAAC;IACvE,IAAI,mBAAmB,EAAE;AACvB,QAAA,IAAI;AACF,YAAA,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAuB,CAAC;QACxE,CAAC;AAAC,QAAA,MAAM;AACN,YAAA,KAAK,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;;;AAID,IAAA,MAAM,cAAc,GAAG,OAAO,GAAG,gBAAgB,CAAW,CAAC;AAC7D,IAAA,IAAI,CAAC,QAAQ,IAAI,cAAc,EAAE;AAC/B,QAAA,IAAI;AACF,YAAA,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAsB,CAAC;QAC7D,CAAC;AAAC,QAAA,MAAM;AACN,YAAA,KAAK,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO;QACL,QAAQ;QACR,OAAO;QACP,OAAO;QACP,KAAK;QACL,aAAa;QACb,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;AAIG;AACH,SAAS,0BAA0B,CAAC,IAAwB,EAAA;AAC1D,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,SAAS,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAChC,IAAA,OAAO,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACpD;;AC1KA;;;;;;AAMG;AACG,SAAU,WAAW,CAAC,QAAiB,EAAA;IAC3C,IACE,OAAO,QAAQ,KAAK,UAAU;AAC9B,QAAA,SAAS,IAAI,QAAQ;AACrB,QAAA,OAAQ,QAA4C,CAAC,SAAS,CAAC,KAAK,QAAQ,EAC5E;AACA,QAAA,OAAQ,QAA4C,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC;AACD,IAAA,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;AAQG;AACG,SAAU,gBAAgB,CAAC,cAAgD,EAAA;IAC/E,MAAM,SAAS,GAAa,EAAE,CAAC;AAC/B,IAAA,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;AAC1C,QAAA,IAAI,CAAC,aAAa;YAAE,SAAS;QAC7B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;AACnD,YAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,QAAQ,EAAE;AACZ,gBAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;AACD,IAAA,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;AAOG;AACG,SAAU,gBAAgB,CAAC,WAAqB,EAAE,eAAwB,EAAA;IAC9E,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,MAAM,EAAE,GAAG,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,EAAY,CAAC,CAAC;AAC1F,IAAA,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,eAAe,EAAE;AACrC,QAAA,MAAM,CAAC,MAAM,GAAG,eAAe,CAAC;IAClC,CAAC;AACD,IAAA,OAAO,MAAM,CAAC;AAChB;;AC3DA;;;;AAIG;AACH,SAAS,aAAa,CAAC,GAAW,EAAA;AAChC,IAAA,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;;;;;;;;;;;;;;AAoBG;AACG,SAAU,yBAAyB,CACvC,GAAU,EACV,SAAiB,EACjB,aAAqB,EACrB,UAAkB,EAClB,MAAc,EAAA;IAEd,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AAE/E,IAAA,MAAM,IAAI,GAAyB,GAAG,YAAY,uBAAuB,GAAG,UAAU,GAAG,OAAO,CAAC;AAEjG,IAAA,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;AAC5C,IAAA,MAAM,YAAY,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;AAClD,IAAA,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;AAE5C,IAAA,IAAI,IAAI,KAAK,UAAU,EAAE;AACvB,QAAA,IAAI,UAAU,KAAK,YAAY,EAAE;AAC/B,YAAA,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;YACzF,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC/C,QAAA,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;;AAGD,IAAA,IAAI,UAAU,KAAK,SAAS,EAAE;AAC5B,QAAA,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAC3F,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC5C,IAAA,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC;AAED;;;;;AAKG;SACa,qBAAqB,GAAA;IACnC,OAAO,CAAC,CAAkB,KAA4B;AACpD,QAAA,MAAM,GAAG,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;AAC1B,QAAA,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;AAC9B,QAAA,MAAM,aAAa,GACjB,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,uBAAuB,CAAC;AAC/E,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,mBAAmB,CAAC;AACxF,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;AAC1F,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAC3D,QAAA,MAAM,cAAc,GAAG,MAAM,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA,EAAG,aAAa,CAAA,CAAE,GAAG,aAAa,CAAC;AAC7E,QAAA,MAAM,WAAW,GAAG,MAAM,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA,EAAG,UAAU,CAAA,CAAE,GAAG,UAAU,CAAC;AACpE,QAAA,OAAO,yBAAyB,CAAC,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AACxF,IAAA,CAAC,CAAC;AACJ;;ACxEA;;;;AAIG;MACU,oBAAoB,GAAG,IAAI,cAAc,CACpD,sBAAsB;;ACGxB;;;;;AAKG;AACH,SAAS,QAAQ,CAAC,QAAgB,EAAE,GAAW,EAAA;IAC7C,OAAO,YAAY,CAAU,CAAA,OAAA,EAAU,QAAQ,IAAI,GAAG,CAAA,CAAE,CAAC,CAAC;AAC5D,CAAC;AAmBD;;;;;;;AAOG;AACH,SAAS,iBAAiB,CAAC,KAA6B,EAAE,eAAuB,EAAA;IAC/E,OAAO,gBAAgB,CACrB,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EACvC,eAAe,CAChB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;AAWG;AACH,eAAe,gBAAgB,CAAC,EAC9B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAM,EACN,eAAe,EACf,YAAY,GAQb,EAAA;AACC,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AAC5C,IAAA,MAAM,iBAAiB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAE1D,IAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAEpC,IAAA,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;QAC7B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC1C,QAAA,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1B,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;AAE5D,IAAA,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC;QAC3C,GAAG;QACH,QAAQ;AACR,QAAA,WAAW,EAAE,SAAS;QACtB,KAAK,EAAE,KAAK,CAAC,WAAgD;QAC7D,YAAY;AACb,KAAA,CAAC,CAAC;AAEH,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;QACzB,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;AACD,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;QAC5B,MAAM,IAAI,uBAAuB,EAAE,CAAC;IACtC,CAAC;AACD,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;QAC5B,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAED;;;;;AAKG;MACU,cAAc,GAAG,CAC5B,QAAkB,EAClB,YAAwC,KAClB;IACtB,MAAM,QAAQ,GAAG,OAAO,KAA6B,EAAE,KAA0B,KAAI;AACnF,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AAC5C,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AACvC,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,QAAA,MAAM,aAAa,GACjB,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,uBAAuB,CAAC;AAC/E,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,mBAAmB,CAAC;AACxF,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9B,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAC7C,QAAA,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;AAE/C,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACtB,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAEpC,QAAA,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE;AACjC,YAAA,IAAI;gBACF,OAAO,MAAM,gBAAgB,CAAC;oBAC5B,KAAK;oBACL,KAAK;oBACL,QAAQ;oBACR,MAAM;oBACN,eAAe;oBACf,YAAY;AACb,iBAAA,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE;;AAEV,gBAAA,OAAO,yBAAyB,CAAC,CAAU,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;AAED,QAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,kBAAkB,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAC;QACJ,CAAC;AAED,QAAA,MAAM,eAAe,GAAG,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;;;;;QAMnE,MAAM,gBAAgB,GAAG,CAAC,CAAC,eAAe,CAAC,OAAO,GAAG,qBAAqB,CAAC,CAAC;QAC5E,MAAM,qBAAqB,GAAG,gBAAgB;AAC5C,cAAE,EAAE,IAAI,YAAY,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;cAC3C,YAAY,CAAC;AAEjB,QAAA,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC;YAC9C,QAAQ;YACR,GAAG;AACH,YAAA,WAAW,EAAE,iBAAiB,CAAC,KAAK,EAAE,eAAe,CAAC;YACtD,KAAK,EAAE,KAAK,CAAC,WAAgD;AAC7D,YAAA,YAAY,EAAE,qBAAqB;YACnC,eAAe;AAChB,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;YAC9B,OAAO,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;QACrE,CAAC;AAED,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE;AAC3B,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,KAAK,YAAY,uBAAuB;AAAE,gBAAA,MAAM,KAAK,CAAC;YAC1D,IAAI,KAAK,YAAY,eAAe;AAAE,gBAAA,MAAM,KAAK,CAAC;YAClD,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3D,CAAC;QAED,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,IAAA,CAAC,CAAC;AAEF,IAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC;AAE/B,IAAA,OAAO,QAAQ,CAAC;AAClB;;ACnMA;;;;;;;;;;;;AAYG;AACG,SAAU,aAAa,CAAC,GAAW,EAAA;;AAEvC,IAAA,OAAO,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;AAQG;AACH,SAAS,UAAU,CACjB,KAAY,EACZ,QAAsB,EAAA;AAEtB,IAAA,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE;AAC5D,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,EAAE;AACnD,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;;;;IAID,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE;AAC9C,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;AAED,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,iBAAiB,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;AACD,IAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE;AAC5E,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAW,EAAE,CAAC;AAC7B,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE;AACnE,QAAA,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAChC,CAAC;;;AAGD,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjE,MAAM,MAAM,GACV,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,YAAY,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC;IAExF,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAC1D,CAAC;AAED;;;;;;;;;AASG;AACG,SAAU,eAAe,CAAC,MAAc,EAAE,QAAsB,EAAA;AACpE,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE;YACZ,SAAS;QACX,CAAC;AAED,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAwB,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;;;;;AAMxE,QAAA,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE;YAC1B,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC9D,IAAI,UAAU,EAAE;AACd,gBAAA,OAAO,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC;YAChC,CAAC;AACD,YAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC1B,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;YACD,SAAS;QACX,CAAC;AAED,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;AAED,QAAA,IAAI,KAAK,CAAC,YAAY,EAAE;;;YAGtB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;;QAGD,SAAS;IACX,CAAC;AAED,IAAA,OAAO,IAAI,CAAC;AACd;;ACvHA;;;;;;;;;;;AAWG;MAIU,0BAA0B,CAAA;AACpB,IAAA,UAAU,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAC7C,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AACjC,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAChC,eAAe,GAAG,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClF,UAAE,eAAe,CAAC;AAEpB,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,MAAM,CAAC,MAAM;AACf,aAAA,IAAI,CACH,MAAM,CAAC,CAAC,CAAC,KAA2B,CAAC,YAAY,eAAe,CAAC,EACjE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CACpC;AACA,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;AAChC,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE;AAC9B,gBAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACpE,CAAC;AACH,QAAA,CAAC,CAAC,CAAC;IACP,CAAC;AAED;;;;;;;AAOG;AACH,IAAA,MAAM,gBAAgB,CAAC,KAA6B,EAAE,KAA0B,EAAA;QAC9E,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACvC,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE;aACrC,MAAM,CAAC,CAAC,QAAQ,KAAyC,CAAC,CAAC,QAAQ,CAAC;aACpE,GAAG,CAAC,CAAC,QAAQ,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;;;AAGlG,QAAA,IAAI,CAAC,aAAa,CAChB,MAAM,EACN,KAAK,CAAC,GAAG,GACR,KAAK,CAAC,WAAW,IAAI,EAAE,EACzB,CAAC;IACJ,CAAC;AAED;;;;;;;;;AASG;AACK,IAAA,aAAa,CACnB,MAAuD,EACvD,GAAW,EACX,KAAwC,EACxC,OAA6B,EAAA;QAE7B,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;YAC9B,MAAM,SAAS,GAAG,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,YAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC1B,OAAO;YACT,CAAC;AACD,YAAA,MAAM,WAAW,GAAG,gBAAgB,CAClC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAC/C,IAAI,CAAC,eAAe,CACrB,CAAC;AACF,YAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;AAChC,gBAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;YAC3E,CAAC;AACH,QAAA,CAAC,CAAC,CAAC;IACL,CAAC;AAED;;;;;;;;;;AAUG;IACH,cAAc,CAAC,GAAW,EAAE,OAA6B,EAAA;QACvD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACvC,OAAO;QACT,CAAC;;;AAID,QAAA,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE;YACtB,OAAO;QACT,CAAC;AAED,QAAA,IAAI,KAAyC,CAAC;AAC9C,QAAA,IAAI,KAAwC,CAAC;AAC7C,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACvC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC;YACpE,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACtD,YAAA,KAAK,GAAG,IAAI,CAAC,WAAgD,CAAC;QAChE,CAAC;AAAC,QAAA,MAAM;;YAEN,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,EAAE;YACV,OAAO;QACT,CAAC;AAED,QAAA,IAAI,CAAC,aAAa,CAChB,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,EAC9E,GAAG,EACH,KAAK,EACL,OAAO,CACR,CAAC;IACJ,CAAC;oHAxHU,0BAA0B,GAAA,CAAA,CAAA,CAAA,CAAA;gEAA1B,0BAA0B,EAAA,OAAA,EAA1B,0BAA0B,CAAA,IAAA,EAAA,UAAA,EAFzB,MAAM,EAAA,CAAA,CAAA;;iFAEP,0BAA0B,EAAA,CAAA;cAHtC,UAAU;AAAC,QAAA,IAAA,EAAA,CAAA;AACV,gBAAA,UAAU,EAAE,MAAM;AACnB,aAAA,CAAA;;;AC7BD;;;;;;AAMG;AACG,SAAU,WAAW,CAAC,OAAsB,EAAA;AAChD,IAAA,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACnC,CAAC;AAED;;;;;;;AAOG;AACG,SAAU,YAAY,CAAC,OAAsB,EAAA;AACjD,IAAA,OAAO,OAAO,CAAC,QAAQ,CAAC,SAAS,IAAI,eAAe,CAAC;AACvD,CAAC;AAED;;;;;;AAMG;AACG,SAAU,sBAAsB,CAAC,OAAsB,EAAA;AAC3D,IAAA,OAAO,OAAO,CAAC,QAAQ,CAAC,mBAAmB,IAAI,EAAE,CAAC;AACpD,CAAC;AAED;;;;;;;;AAQG;AACG,SAAU,WAAW,CAAC,OAAsB,EAAA;AAChD,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;AAC1C,IAAA,OAAO,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AACzD;;ACxBA;;;;AAIG;MACU,kBAAkB,GAAG,IAAI,cAAc,CAClD,oBAAoB,EACpB;AAEF;;;;;;;AAOG;AACG,SAAU,qBAAqB,CAAC,QAAgB,EAAA;IACpD,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAC5C;;ACpCA;AACA,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B;;;;;;AAMG;MAEU,wBAAwB,CAAA;IAClB,MAAM,GAAG,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;;AAEpE,IAAA,WAAW,CAAoB;;AAE/B,IAAA,YAAY,CAAuC;AAE3D,IAAA,QAAQ,CAAC,IAAkB,EAAA;QACzB,MAAM,WAAW,GAAG,CAAA,EAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,aAAa,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAA,CAAE,CAAC;AAC5F,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACvB,QAAA,IACE,IAAI,CAAC,YAAY,EAAE,WAAW,KAAK,WAAW;YAC9C,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,eAAe,EAC5C;AACA,YAAA,KAAK,CAAC,MAAM,CAAC,gCAAgC,EAAE,WAAW,CAAC,CAAC;AAC5D,YAAA,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;AAC7C,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;AAED,IAAA,KAAK,CAAC,IAAe,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;AAED,IAAA,QAAQ,CAAC,IAAkB,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;AAED,IAAA,IAAI,CACF,MAAc,EACd,eAAuC,EACvC,mBAA2B,EAAA;AAE3B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACjF,CAAC;AAED;;;AAGG;IACK,MAAM,QAAQ,CAAC,IAA4B,EAAA;AACjD,QAAA,IAAI;AACF,YAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;AAC5C,YAAA,IAAI,CAAC,WAAW;gBAAE,OAAO;YACzB,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,CAAC,EAAE;AACV,YAAA,KAAK,CAAC,MAAM,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAEO,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACrB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;AAEO,IAAA,MAAM,MAAM,GAAA;QAClB,IAAI,SAAS,EAAE,EAAE;AACf,YAAA,KAAK,CAAC,MAAM,CAAC,kEAAkE,CAAC,CAAC;AACjF,YAAA,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;AACpC,QAAA,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE;AAC1B,YAAA,KAAK,CAAC,MAAM,CAAC,yEAAyE,CAAC,CAAC;AACxF,YAAA,OAAO,KAAK,CAAC;QACf,CAAC;AACD,QAAA,MAAM,cAAc,CAAC;AACnB,YAAA,MAAM,EAAE;gBACN,SAAS,EAAE,IAAI,CAAC,eAAe;gBAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,gBAAA,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE;AACzC,aAAA;AACD,YAAA,OAAO,EAAE;AACP,gBAAA,eAAe,CAAC;AACd,oBAAA,OAAO,EAAE;AACP,wBAAA,YAAY,EAAE,IAAI;wBAClB,YAAY,EAAE,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC9D,qBAAA;oBACD,OAAO,EAAE,uBAAuB,EAAE;iBACnC,CAAC;AACF,gBAAA,YAAY,EAAE;AACf,aAAA;AACF,SAAA,CAAC,CAAC;AACH,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;kHAtFU,wBAAwB,GAAA,CAAA,CAAA,CAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,iBAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,KAAA,EAAA,wBAAwB,WAAxB,wBAAwB,CAAA,IAAA,EAAA,CAAA,CAAA;;iFAAxB,wBAAwB,EAAA,CAAA;cADpC,UAAU;;;ACSX;;;;;;;;;;;;;;;AAeG;MAEU,uBAAuB,CAAA;IACjB,MAAM,GAAG,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,UAAU,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAE3D,CAAC;;AAEN,IAAA,WAAW,CAAoB;AAEvC,IAAA,QAAQ,CAAC,IAAkB,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;AAED,IAAA,KAAK,CAAC,IAAe,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;AAED,IAAA,QAAQ,CAAC,IAAkB,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;AAED,IAAA,IAAI,CACF,MAAc,EACd,eAAuC,EACvC,mBAA2B,EAAA;AAE3B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACjF,CAAC;AAED;;;AAGG;IACK,MAAM,QAAQ,CAAC,IAA4B,EAAA;AACjD,QAAA,IAAI;AACF,YAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;AAC5C,YAAA,IAAI,CAAC,WAAW;gBAAE,OAAO;YACzB,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,CAAC,EAAE;AACV,YAAA,KAAK,CAAC,MAAM,CAAC,sCAAsC,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAEO,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACrB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;AAEO,IAAA,MAAM,MAAM,GAAA;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;AACpC,QAAA,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE;AACpB,YAAA,KAAK,CAAC,MAAM,CAAC,sEAAsE,CAAC,CAAC;AACrF,YAAA,OAAO,KAAK,CAAC;QACf,CAAC;AACD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC;AACjC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC;AACjC,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;AAChB,YAAA,KAAK,CAAC,MAAM,CAAC,0EAA0E,CAAC,CAAC;AACzF,YAAA,OAAO,KAAK,CAAC;QACf,CAAC;AAED,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;AACvE,QAAA,MAAM,QAAQ,GACZ,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;AAEzF,QAAA,MAAM,cAAc,CAAC;AACnB,YAAA,MAAM,EAAE;gBACN,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,gBAAA,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE;AACzC,aAAA;AACD,YAAA,OAAO,EAAE;AACP,gBAAA,eAAe,CAAC;AACd,oBAAA,OAAO,EAAE;AACP,wBAAA,YAAY,EAAE,IAAI;AAClB,wBAAA,YAAY,EAAE,qBAAqB,CAAC,QAAQ,CAAC;AAC9C,qBAAA;AACD,oBAAA,OAAO,EAAE,sBAAsB,CAC7B,GAAgC,EAChC,GAAiC,CAClC;iBACF,CAAC;AACF,gBAAA,YAAY,EAAE;AACf,aAAA;AACF,SAAA,CAAC,CAAC;AACH,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;iHAvFU,uBAAuB,GAAA,CAAA,CAAA,CAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,iBAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,KAAA,EAAA,uBAAuB,WAAvB,uBAAuB,CAAA,IAAA,EAAA,CAAA,CAAA;;iFAAvB,uBAAuB,EAAA,CAAA;cADnC,UAAU;;;ACLX;;;;;;;;;;;;;;;;;;;AAmBG;AACG,SAAU,sBAAsB,CAAC,IAAwB,EAAA;IAC7D,MAAM,SAAS,GAA2C,EAAE,CAAC;AAE7D,IAAA,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;AAC1E,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;AAC1E,YAAA,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;QACJ,CAAC;AACD,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;AAClF,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IACpF,CAAC;AACD,IAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IACnF,CAAC;AACD,IAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5E,CAAC;;;IAID,SAAS,CAAC,IAAI,CAAC;AACb,QAAA,OAAO,EAAE,kBAAkB;QAC3B,UAAU,EAAE,MACV,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;cAClC,IAAI,wBAAwB,EAAE;cAC9B,IAAI,uBAAuB,EAAE;AACpC,KAAA,CAAC,CAAC;AAEH,IAAA,OAAO,wBAAwB,CAAC,SAA2D,CAAC,CAAC;AAC/F;;AC7EA;;;;;;AAMG;SACa,yBAAyB,GAAA;AACvC,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA;AACE,YAAA,OAAO,EAAE,oBAAoB;YAC7B,UAAU,EAAE,MAAK;AACf,gBAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AACzC,gBAAA,MAAM,MAAM,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;gBAC7C,OAAO;AACL,oBAAA,OAAO,CAAC,OAAyB,EAAA;AAC/B,wBAAA,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAEhD,CAAC;AACd,wBAAA,MAAM,KAAK,GAAG,UAAU,EAAE,KAAK,CAAC;AAChC,wBAAA,OAAO,IAAI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC1E,CAAC;iBACF,CAAC;YACJ,CAAC;AACF,SAAA;AACF,KAAA,CAAC,CAAC;AACL;;AClCA;;;;;;;;;;AAUG;AACG,SAAU,qBAAqB,CACnC,eAA4C,EAAA;IAE5C,MAAM,GAAG,GAAG,eAAe,EAAE,OAAO,GAAG,qBAAqB,CAAC,CAAC;AAC9D,IAAA,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACtD,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,OAAO,SAAS,CAAC;IACnB,CAAC;AACD,IAAA,IAAI;AACF,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAuB,CAAC;IACvD,CAAC;AAAC,IAAA,MAAM;AACN,QAAA,OAAO,SAAS,CAAC;IACnB,CAAC;AACH;;ACfA;AACA,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC;;;;;;AAMG;MACU,oBAAoB,CAAA;AACd,IAAA,OAAO,CAAU;AACjB,IAAA,OAAO,CAA8B;AAEtD;;;AAGG;IACH,WAAA,CAAY,MAAc,EAAE,MAAA,GAAkC,EAAE,EAAA;QAC9D,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,OAAO,GAAG,8BAA8B,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;;AAGD,IAAA,IAAI,GAAG,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;IACjC,CAAC;;AAGD,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;;IAGD,MAAM,GAAG,CAAC,QAAgB,EAAA;AACxB,QAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAmB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3F,OAAO,iBAAiB,CAAC,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC;IACpD,CAAC;;IAGD,MAAM,GAAG,CAAC,QAAgB,EAAE,KAAc,EAAE,UAAkB,EAAE,IAAc,EAAA;AAC5E,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAmB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9F,IAAI,QAAQ,EAAE;YACZ,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;AACzE,QAAA,MAAM,KAAK,GAAqB;YAC9B,KAAK;AACL,YAAA,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;AACf,YAAA,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;YACpB,SAAS;AACT,YAAA,KAAK,EAAE,KAAK;SACb,CAAC;AACF,QAAA,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QAClE,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;;IAGD,MAAM,UAAU,CAAC,MAAuB,EAAA;AACtC,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;AAC/B,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACrB,YAAA,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,QAAA,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE;AAC3B,YAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAmB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC3F,IAAI,CAAC,KAAK,EAAE;gBACV,SAAS;YACX,CAAC;AACD,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;gBAChB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACxF,CAAC;AACD,YAAA,MAAM,EAAE,CAAC;QACX,CAAC;AACD,QAAA,OAAO,MAAM,CAAC;IAChB,CAAC;;IAGD,MAAM,MAAM,CAAC,QAAgB,EAAA;AAC3B,QAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAmB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5C,QAAA,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9D,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;;AAGD,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;;AAGD,IAAA,MAAM,OAAO,GAAA;QACX,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC1D,MAAM,GAAG,GAA2B,EAAE,CAAC;AACvC,QAAA,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE;YAC3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAmB,QAAQ,CAAC,CAAC;YACrE,IAAI,CAAC,KAAK,EAAE;gBACV,SAAS;YACX,CAAC;YACD,GAAG,CAAC,IAAI,CAAC;AACP,gBAAA,GAAG,EAAE,QAAQ;AACb,gBAAA,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;gBACrB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;AACnB,aAAA,CAAC,CAAC;QACL,CAAC;AACD,QAAA,OAAO,GAAG,CAAC;IACb,CAAC;;IAGD,OAAO,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;AAED;;;;AAIG;AACK,IAAA,eAAe,CAAC,QAAgB,EAAA;AACtC,QAAA,OAAO,QAAQ,CAAC;IAClB,CAAC;AAED;;;;AAIG;AACK,IAAA,aAAa,CAAC,GAAW,EAAA;AAC/B,QAAA,OAAO,CAAA,EAAG,gBAAgB,CAAA,EAAG,GAAG,EAAE,CAAC;IACrC,CAAC;AAED;;;;AAIG;AACK,IAAA,MAAM,QAAQ,CAAC,QAAgB,EAAE,IAAc,EAAA;AACrD,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAC3C,YAAA,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAW,UAAU,CAAC,KAAK,EAAE,CAAC;YACzE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AAC/B,gBAAA,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;AAED;;;;AAIG;AACK,IAAA,MAAM,UAAU,CAAC,QAAgB,EAAE,IAAc,EAAA;AACvD,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAC3C,YAAA,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAW,UAAU,CAAC,KAAK,EAAE,CAAC;AACzE,YAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC;AACnD,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;gBACrB,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC;iBAAM;gBACL,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;;IAGO,MAAM,wBAAwB,CAAC,IAAc,EAAA;AACnD,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;AAC9B,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAW,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;AACnF,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,gBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACf,CAAC;QACH,CAAC;AACD,QAAA,OAAO,GAAG,CAAC;IACb,CAAC;AACF;;AC7LD;;;;;;;;;;;;;;;;;;AAkBG;AACG,SAAU,iBAAiB,CAAC,MAAA,GAAkC,EAAE,EAAA;AACpE,IAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;AAC/C,IAAA,OAAO,IAAI,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACpD;;AC7BA;;ACcA;;;;AAIG;AACH,SAAS,kBAAkB,CAAC,MAAc,EAAA;IACxC,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,KAAK,GAA6B,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC3E,IAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;AACD,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC;AACD;;;;;;;;;AASG;MAEU,sBAAsB,CAAA;;AAExB,IAAA,IAAI,GAAwB,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,IAAI,IAAI,2EAAC,CAAC;;AAE3E,IAAA,UAAU,GAAqC,QAAQ,CAC9D,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,UAAU,IAAI,IAAI,iFAC3C,CAAC;;AAEO,IAAA,SAAS,GAAoB,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,IAAI,KAAK,gFAAC,CAAC;;AAEnF,IAAA,SAAS,GAAoB,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,IAAI,KAAK,gFAAC,CAAC;AAC5F;;;AAGG;AACM,IAAA,SAAS,GAA0B,QAAQ,CAAC,MAAK;QACxD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7B,YAAA,OAAO,IAAI,CAAC;QACd,CAAC;AACD,QAAA,OAAO,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACnE,IAAA,CAAC,gFAAC,CAAC;AACH;;AAEG;IACM,eAAe,GAAmB,QAAQ,CACjD,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,eAAe,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACtE,CAAC;AACe,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,GAAG,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3D,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACjC,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1C,IAAA,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IAC9C,eAAe,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,IAAI,IAAI,CAAC;;IAEvD,SAAS,GAAG,QAAQ,CACnC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CACrB,MAAM,CAAC,CAAC,CAAC,KAAyB,CAAC,YAAY,aAAa,CAAC,EAC7D,GAAG,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAC1C,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAC3C,EACD,EAAE,YAAY,EAAE,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAClD,CAAC;AACF;;;AAGG;AACc,IAAA,QAAQ,GAAG,QAAQ,CAClC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CACrB,MAAM,CAAC,CAAC,CAAC,KAAyB,CAAC,YAAY,aAAa,CAAC,EAC7D,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAC7C,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAChE,EACD,EAAE,YAAY,EAAE,kBAAkB,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CACvE,CAAC;gHAtDS,sBAAsB,GAAA,CAAA,CAAA,CAAA,CAAA;gEAAtB,sBAAsB,EAAA,OAAA,EAAtB,sBAAsB,CAAA,IAAA,EAAA,UAAA,EADT,MAAM,EAAA,CAAA,CAAA;;iFACnB,sBAAsB,EAAA,CAAA;cADlC,UAAU;eAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;AClClC;;;;;;;;;;AAUG;MAKU,yBAAyB,CAAA;AACnB,IAAA,OAAO,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACzC,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AACnD,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7B,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAE5B,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,2EAAC,CAAC;IACjD,eAAe,GAAwB,EAAE,CAAC;AAE3D,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,YAAY,EAAE,CAAC;AAEpB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,SAAS;gBAAE,OAAO;YAE/D,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC;AAE3F,YAAA,KAAK,MAAM,GAAG,IAAI,aAAa,IAAI,EAAE,EAAE;gBACrC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC5D,gBAAA,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;AACxB,gBAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AAC7D,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,cAAc,GAAG,EAAE,GAAG,UAAU,EAAE,GAAG,4BAA4B,EAAE,EAAE,CAAC;AAC5E,YAAA,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;gBACvD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC5D,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;gBACtE,aAAa,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC/C,gBAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AAC7D,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3C,CAAC;AACH,QAAA,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,YAAY,GAAA;AAClB,QAAA,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE;AACrC,YAAA,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC;AACD,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;mHA1CU,yBAAyB,GAAA,CAAA,CAAA,CAAA,CAAA;6DAAzB,yBAAyB,EAAA,SAAA,EAAA,CAAA,CAAA,oBAAA,CAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAA,kCAAA,CAAA,EAAA,EAAA,GAAA,EAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;iFAAzB,yBAAyB,EAAA,CAAA;cAJrC,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,QAAQ,EAAE,oBAAoB;AAC9B,gBAAA,QAAQ,EAAE,EAAE;AACb,aAAA,CAAA;;kFACY,yBAAyB,EAAA,EAAA,SAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,UAAA,EAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,GAAA;;ACdtC;;;;;AAKG;MAEU,uBAAuB,CAAA;AACjB,IAAA,OAAO,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAE1D;;;AAGG;IACH,cAAc,GAAA;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;AAC7C,QAAA,KAAK,CAAC,UAAU,CAAC,+BAA+B,EAAE,UAAU,CAAC,CAAC;AAC9D,QAAA,OAAO,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;iHAXU,uBAAuB,GAAA,CAAA,CAAA,CAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,iBAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,KAAA,EAAA,uBAAuB,WAAvB,uBAAuB,CAAA,IAAA,EAAA,CAAA,CAAA;;iFAAvB,uBAAuB,EAAA,CAAA;cADnC,UAAU;;;ACLX;;;;;;;;;;;;;;;;;;AAkBG;AAEG,MAAO,mBAAoB,SAAQ,oBAAoB,CAAA;AAC1C,IAAA,OAAO,GACtB,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IAC3D,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1C,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAEzC,IAAA,SAAS,CAAC,IAAa,EAAA;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACnC,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;AAC7E,YAAA,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrD,QAAA,MAAM,aAAa,GAAG,mBAAmB,CACvC,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EACvC,IAAI,CAAC,OAAO,CACb,CAAC,MAAM,CAAC;QAET,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,OAAO,IAAI,CAAC;QACd,CAAC;AACD,QAAA,OAAO,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC/C,CAAC;AArBU,IAAA,OAAA,IAAA,iBAAA,CAAA,MAAA,EAAA,IAAA,gCAAA,CAAA,CAAA,OAAA,SAAA,2BAAA,CAAA,iBAAA,EAAA,EAAA,OAAA,CAAA,gCAAA,KAAA,gCAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,mBAAmB,yBAAnB,mBAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,iBAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,KAAA,EAAA,mBAAmB,WAAnB,mBAAmB,CAAA,IAAA,EAAA,CAAA,CAAA;;iFAAnB,mBAAmB,EAAA,CAAA;cAD/B,UAAU;;;ACxBX;;;AAGG;AACI,MAAM,mBAAmB,GAAG;;ACHnC;;;;;AAKG;MACU,sBAAsB,GAAG,IAAI,cAAc,CAAe,wBAAwB;;ACmB/F;;;;;;;AAOG;AACI,MAAM,wBAAwB,GAAG,CACtC,SAAyC,EACzC,IAAY,EACZ,SAAkB,KACM;AACxB,IAAA,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAC1B,IAAA,IAAI,mBAAqE,CAAC;AAE1E,IAAA,IAAI,SAAS,EAAE,YAAY,EAAE;QAC3B,IAAI,SAAS,EAAE;AACb,YAAA,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAClD,gBAAA,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,GAAG,CAAC;AAClD,sBAAE,4BAA4B,CAAC,GAAG,CAAC;sBACjC,IAAI,CAAC;gBAET,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;oBACzD,MAAM,GAAG,GAAG,CAAC;gBACf,CAAC;AACH,YAAA,CAAC,CAAC,CAAC;AACH,YAAA,mBAAmB,GAAG,SAAS,CAAC,YAAY,CAAC;QAC/C,CAAC;aAAM;AACL,YAAA,mBAAmB,GAAG,EAAE,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC;AACpD,YAAA,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAC9D,gBAAA,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,GAAG,CAAC;AAClD,sBAAE,4BAA4B,CAAC,GAAG,CAAC;sBACjC,IAAI,CAAC;gBAET,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACzD,oBAAA,mBAAoB,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;AACrC,oBAAA,OAAO,mBAAoB,CAAC,GAAG,CAAC,CAAC;gBACnC,CAAC;AACH,YAAA,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,MAAM,GAAgC,IAAI,CAAC;AAC/C,IAAA,IAAI,SAAS,IAAI,mBAAmB,IAAI,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AACnF,QAAA,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,CAAC,IAAI,CACV,gBAAgB,MAAM,CAAA,6CAAA,CAA+C,EACrE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CACnC,CAAC;AACF,QAAA,OAAO,EAAE,CAAC;IACZ,CAAC;AAED,IAAA,OAAO,MAAM,CAAC;AAChB,EAAE;AAEF;;;;;;;;;AASG;SACa,6BAA6B,CAC3C,SAAyC,EACzC,IAAY,EACZ,SAAkB,EAAA;AAElB,IAAA,IAAI,CAAC,SAAS,EAAE,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AAChF,QAAA,OAAO,KAAK,CAAC;IACf,CAAC;AAED,IAAA,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAE1B,IAAI,SAAS,EAAE;AACb,QAAA,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAClD,YAAA,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,GAAG,CAAC;AAClD,kBAAE,4BAA4B,CAAC,GAAG,CAAC;kBACjC,IAAI,CAAC;YAET,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;gBACzD,MAAM,GAAG,GAAG,CAAC;YACf,CAAC;AACH,QAAA,CAAC,CAAC,CAAC;AACH,QAAA,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;AAED,IAAA,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE;AACxE,QAAA,OAAO,IAAI,CAAC;IACd,CAAC;AAED,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;AACtD,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE;AAC9B,YAAA,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,4BAA4B,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACxD,IAAA,CAAC,CAAC,CAAC;AACL,CAAC;AAAA,CAAC;AASF;;;;AAIG;AACI,MAAM,YAAY,GAAG,CAAC,SAA6B,KAAI;IAC5D,IAAI,CAAC,SAAS,CAAC,MAAM;AAAE,QAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAE7C,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC;AAEpD,IAAA,IAAI,cAAc,IAAI,MAAM,EAAE;AAC5B,QAAA,OAAO,EAAE,MAAM,EAAE,CAAA,EAAG,cAAc,IAAI,EAAE,CAAA,CAAA,EAAI,MAAM,IAAI,EAAE,CAAA,CAAE,EAAE,CAAC;IAC/D,CAAC;AAED,IAAA,OAAO,SAAS,CAAC;AACnB,EAAE;AAEF;;;;;;AAMG;SACa,sBAAsB,CACpC,iBAAyD,EACzD,iBAAwD,EACxD,kBAAsC,EAAA;AAEtC,IAAA,MAAM,MAAM,GAAG,EAAE,IAAI,iBAAiB,IAAI,EAAE,CAAC,EAAE,IAAI,kBAAkB,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;AACtF,IAAA,MAAM,MAAM,GAAG,EAAE,IAAI,iBAAiB,IAAI,EAAE,CAAC,EAAE,IAAI,kBAAkB,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;AACtF,IAAA,MAAM,GAAG,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;IAC7C,OAAO;QACL,MAAM;AACN,QAAA,MAAM,EAAE;AACN,YAAA,GAAG,MAAM;AACT,YAAA,IAAI,GAAG,IAAI,EAAE,CAAC;AACf,SAAA;AACD,QAAA,SAAS,EAAE,kBAAkB;KAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;AAWG;AACI,MAAM,4BAA4B,GAAG,CAAC,EAC3C,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,wBAAwB,EACxB,yBAAyB,GAO1B,KAA2B;AAC1B,IAAA,IAAI,mBAAmB,CAAC,aAAa,KAAK,qBAAqB,EAAE;QAC/D,OAAO;YACL,SAAS,EAAE,wBAAwB,IAAI,IAAI;AAC3C,YAAA,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AAED,IAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE;QACtC,OAAO;AACL,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AAED,IAAA,IAAI,KAA6D,CAAC;AAClE,IAAA,MAAM,eAAe,GAAG,CAAC,EAAE,YAAY,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO,CAAC,IAAI,CACV,CAAA,+EAAA,EAAkF,mBAAmB,CAAC,aAAa,CAAA,CAAE,CACtH,CAAC;IACJ,CAAC;SAAM;QACL,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,CAAC,KAAK,CACX,CAAA,YAAA,EAAe,eAAe,CAAA,4BAAA,EAA+B,mBAAmB,CAAC,aAAa,CAAA,kGAAA,CAAoG,CACnM,CAAC;QACF,OAAO;YACL,SAAS,EAAE,yBAAyB,IAAI,IAAI;AAC5C,YAAA,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;;AAGD,IAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;QAC/B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC9C,CAAC;;AAGD,IAAA,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC;AAC1D,IAAA,MAAM,QAAQ,GACZ,UAAU,IAAI,UAAU,KAAK,mBAAmB;AAC9C,UAAG,KAAK,CAAC,UAAU,CAA+B;UAChD,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;IAErC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;AAC/C,QAAA,MAAM,YAAY,GAAG,UAAU,IAAI,UAAU,KAAK,mBAAmB,GAAG,KAAK,UAAU,CAAA,CAAA,CAAG,GAAG,EAAE,CAAC;AAChG,QAAA,OAAO,CAAC,KAAK,CACX,CAAA,YAAA,EAAe,eAAe,CAAA,4BAAA,EAA+B,mBAAmB,CAAC,aAAa,CAAA,EAAG,YAAY,CAAA,kGAAA,CAAoG,CAClN,CAAC;QACF,OAAO;YACL,SAAS,EAAE,yBAAyB,IAAI,IAAI;AAC5C,YAAA,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACjD,EAAE;AAEF;;;;;;;;;;;AAWG;SACa,0BAA0B,CACxC,SAA6B,EAC7B,eAAuB,EACvB,YAAqB,EAAA;AAErB,IAAA,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,IAAI,EAAE,CAAC;IAClD,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;AACnD,QAAA,IAAI,eAAe,KAAK,WAAW,EAAE;AACnC,YAAA,OAAO,YAAY;AACjB,kBAAE,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE;AACtC,kBAAE,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,uBAAuB,EAAE,CAAC;QACtD,CAAC;AACD,QAAA,IAAI,oBAAoB,CAAC,WAAW,CAAC,EAAE;AACrC,YAAA,MAAM,OAAO,GAAG,4BAA4B,CAAC,WAAW,CAAC,CAAC;AAC1D,YAAA,IAAI,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;AACjC,gBAAA,OAAO,YAAY;AACjB,sBAAE,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE;AAClC,sBAAE,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,uBAAuB,EAAE,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;AACD,IAAA,OAAO,EAAE,CAAC;AACZ;;AC1SA;;;AAGG;MAUU,2BAA2B,CAAA;IAC7B,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB,CAAC;IACxC,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA8B,CAAC;IAC7C,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA6B,CAAC;IAE5C,aAAa,GAAG,MAAK;AAC5B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;AAC3B,QAAA,OAAO,CAAC,EAAE,aAAa,IAAI,mBAAmB,CAAC;AACjD,IAAA,CAAC,CAAC;qHARS,2BAA2B,GAAA,CAAA,CAAA,CAAA,CAAA;6DAA3B,2BAA2B,EAAA,SAAA,EAAA,CAAA,CAAA,sBAAA,CAAA,CAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,CAAA,CAAA,EAAA,WAAA,CAAA,EAAA,MAAA,EAAA,CAAA,CAAA,EAAA,QAAA,CAAA,EAAA,MAAA,EAAA,CAAA,CAAA,EAAA,QAAA,CAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,CAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,WAAA,EAAA,OAAA,CAAA,CAAA,EAAA,QAAA,EAAA,SAAA,oCAAA,CAAA,EAAA,EAAA,GAAA,EAAA,EAAA,IAAA,EAAA,GAAA,CAAA,EAAA;AALlC,YADF,iCAA+G,CAAA,CAAA,EAAA,IAAA,CACzG,CAAA;YAAA,EAAA,CAAA,MAAA,CAAA,CAAA,CAAqB,CAAA;YAAA,EAAA,CAAA,eAAA,EAAK,CAAA;YAC9B,EAAA,CAAA,iBAAA,CAAA,CAAA,EAAA,GAAA,CAAG,CAAA;YAAA,EAAA,CAAA,MAAA,CAAA,CAAA,EAAA,6GAAA,CAA2G,CAAA;AAChH,YADgH,oBAAI,EAC9G,CAAA;;YAFA,EAAA,CAAA,SAAA,CAAA,CAAA,CAAqB,CAAA;YAArB,EAAA,CAAA,iBAAA,CAAA,GAAA,CAAA,aAAA,EAAA,CAAqB,CAAA;;;iFAKlB,2BAA2B,EAAA,CAAA;cATvC,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,QAAQ,EAAE,sBAAsB;AAChC,gBAAA,QAAQ,EAAE,CAAA;;;;;AAKT,EAAA,CAAA;AACF,aAAA,CAAA;;kFACY,2BAA2B,EAAA,EAAA,SAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,UAAA,EAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,GAAA;;MCX3B,0BAA0B,CAAA;AACrC,IAAA,IAA0B,KAAK,GAAA;AAC7B,QAAA,OAAO,0PAA0P,CAAC;IACpQ,CAAC;oHAHU,0BAA0B,GAAA,CAAA,CAAA,CAAA,CAAA;6DAA1B,0BAA0B,EAAA,SAAA,EAAA,CAAA,CAAA,qBAAA,CAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,uCAAA,CAAA,EAAA,EAAA,GAAA,EAAA,EAAA,IAAA,EAAA,GAAA,CAAA,EAAA;YAA1B,EAAA,CAAA,UAAA,CAAA,GAAA,CAAA,KAAA,CAA0B,CAAA;;YAF1B,EAAA,CAAA,MAAA,CAAA,CAAA,EAAA,yBAAA,CAAuB,CAAA;;;iFAEvB,0BAA0B,EAAA,CAAA;cAJtC,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,QAAQ,EAAE,qBAAqB;AAC/B,gBAAA,QAAQ,EAAE,yBAAyB;AACpC,aAAA,CAAA;;kBAEE,WAAW;mBAAC,OAAO,CAAA;;kFADT,0BAA0B,EAAA,EAAA,SAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,GAAA;;AC8BvC,MAAM,oBAAoB,GAA6B,CAAC,UAAU,KAAK,UAAU,CAAC;AAElF,MAAM,mBAAmB,GAA4B,CAAC,UAAU,KAAK,UAAU,CAAC;AAEhF;;;;AAIG;MACU,0BAA0B,GAAG,IAAI,cAAc,CAC1D,4BAA4B,EAC5B,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,oBAAoB,EAAE,EAC3D;AAEF;;;;AAIG;MACU,yBAAyB,GAAG,IAAI,cAAc,CACzD,2BAA2B,EAC3B,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,EAAE;;;;;IC0BtD,EAAA,CAAA,YAAA,CAAA,CAAA,EAAA,MAAA,EAAA,CAAA,CAMQ,CAAA;;;;;;;;AAnDd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCG;MAuBU,sBAAsB,CAAA;;AAExB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAU,CAAC;;AAGhC,IAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,+EAAkC,CAAC;;IAG7D,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA8B,CAAC;;IAG7C,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA6B,CAAC;AAErD;;;AAGG;AACM,IAAA,gBAAgB,GAAG,KAAK,CAAmB,EAAE,uFAAC,CAAC;;IAG/C,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAgB,CAAC;;IAGrC,gBAAgB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAiB,CAAC;;IAG1C,wBAAwB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,0BAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAiB,CAAC;AAE1C,IAAA,OAAO,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACzC,mBAAmB,GAAG,MAAM,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AACzE,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC5B,IAAA,aAAa,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAC;AACnD,IAAA,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAEjD,kBAAkB,GAAG,SAAS,CAAC,iBAAiB,0FAAI,IAAI,EAAE,gBAAgB,EAAA,CAAG,CAAC;IAC9E,kBAAkB,GAAG,SAAS,CAAC,oBAAoB,0FAAI,IAAI,EAAE,WAAW,EAAA,CAAG,CAAC;AAE5E,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,gFAAC,CAAC;;AAGnD,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,qFAAC,CAAC;AAElD,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC5C,YAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACrD,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;AACnC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AACzB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;AACnC,YAAA,MAAM,YAAY,GAChB,IAAI,CAAC,YAAY,EAAE;AACnB,gBAAA,IAAI,CAAC,mBAAmB;gBACxB,IAAI,GAAG,EAAsC,CAAC;YAEhD,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO;YACT,CAAC;AAED,YAAA,IAAI,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;AAC/F,QAAA,CAAC,CAAC,CAAC;IACL,CAAC;AAED;;;;;;;;;;AAUG;AACK,IAAA,UAAU,CAAC,IAOlB,EAAA;AACC,QAAA,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;QACzF,SAAS,CAAC,KAAK,EAAE,CAAC;QAElB,MAAM,aAAa,GAAG,wBAAwB,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3E,MAAM,mBAAmB,GAAG,6BAA6B,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AACtF,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,IAAI,mBAAmB,CAAC,CAAC;;;;AAKxF,QAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9B,YAAA,IAAI,SAAS,IAAI,kBAAkB,IAAI,mBAAmB,EAAE;AAC1D,gBAAA,kBAAkB,EAAE,CAAC;AACrB,gBAAA,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,kBAAkB,EAAE,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AACxF,gBAAA,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,kBAAkB,EAAE,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAC3F,CAAC;YACD,OAAO;QACT,CAAC;AAED,QAAA,MAAM,GAAG,GAA+B,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAE5D,QAAA,IAAI,QAA8B,CAAC;AACnC,QAAA,IAAI;YACF,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,IAAI,CAAC,CAAA,2CAAA,EAA8C,IAAI,CAAA,CAAA,CAAG,EAAE,CAAC,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;AAED,QAAA,IAAI,QAA8B,CAAC;AACnC,QAAA,IAAI;YACF,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,IAAI,CAAC,CAAA,0CAAA,EAA6C,IAAI,CAAA,CAAA,CAAG,EAAE,CAAC,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;AAED,QAAA,IAAI,SAAS,IAAI,kBAAkB,EAAE;AACnC,YAAA,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,kBAAkB,EAAE,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAC1F,CAAC;AAED,QAAA,KAAK,MAAM,kBAAkB,IAAI,QAAQ,EAAE;AACzC,YAAA,MAAM,EAAE,SAAS,EAAE,GAAG,4BAA4B,CAAC;AACjD,gBAAA,mBAAmB,EAAE,kBAAkB;AACvC,gBAAA,eAAe,EAAE,IAAI;gBACrB,YAAY;AACZ,gBAAA,wBAAwB,EAAE,IAAI,CAAC,wBAAwB,EAAE,IAAI,0BAA0B;AACvF,gBAAA,yBAAyB,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,2BAA2B;AAClF,aAAA,CAAC,CAAC;AAEH,YAAA,IAAI,SAAS,IAAI,kBAAkB,EAAE;AACnC,gBAAA,SAAS,CAAC,kBAAkB,CAAC,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,YAAY,CAAC,IAAI;AACvB,oBAAA,UAAU,EAAE,WAAW;oBACvB,QAAQ,EAAE,kBAAkB,CAAC,GAAG;AACjC,iBAAA,CAAC,CAAC;YACL,CAAC;YAED,IAAI,SAAS,EAAE;AACb,gBAAA,MAAM,GAAG,GAAG,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9E,gBAAA,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC;gBAC5F,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;gBACnD,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;gBACnD,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;AAEzD,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAC5C,gBAAA,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;AAClD,oBAAA,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;wBAC5D,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC;YACH,CAAC;AAED,YAAA,IAAI,SAAS,IAAI,kBAAkB,EAAE;AACnC,gBAAA,SAAS,CAAC,kBAAkB,CAAC,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,YAAY,CAAC,KAAK;AACxB,oBAAA,UAAU,EAAE,WAAW;AACxB,iBAAA,CAAC,CAAC;YACL,CAAC;QACH,CAAC;AAED,QAAA,IAAI,SAAS,IAAI,kBAAkB,EAAE;AACnC,YAAA,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,kBAAkB,EAAE,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;AAED;;;;;;;;;AASG;IACK,eAAe,CACrB,SAA2B,EAC3B,kBAAwC,EACxC,IAAkB,EAClB,SAAyC,EACzC,IAAY,EAAA;AAEZ,QAAA,IAAI,IAAI,KAAK,YAAY,CAAC,IAAI,EAAE;AAC9B,YAAA,MAAM,SAAS,GAAI,SAAgC,CAAC,GAAG,CAAC;YACxD,MAAM,QAAQ,GAAG,0BAA0B,CAAC,SAA+B,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AAC9F,YAAA,SAAS,CAAC,kBAAkB,CAAC,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,YAAY,CAAC,IAAI;AACvB,gBAAA,UAAU,EAAE,aAAa;gBACzB,QAAQ;AACT,aAAA,CAAC,CAAC;QACL,CAAC;aAAM;AACL,YAAA,SAAS,CAAC,kBAAkB,CAAC,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,YAAY,CAAC,KAAK;AACxB,gBAAA,UAAU,EAAE,aAAa;AAC1B,aAAA,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AAED;;;;;;AAMG;AACK,IAAA,WAAW,CAAC,GAA0B,EAAE,SAAiB,EAAE,KAAc,EAAA;AAC/E,QAAA,IAAI;AACF,YAAA,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,SAAS,EAAE,EAAE;gBACf,OAAO,CAAC,KAAK,CACX,CAAA,gCAAA,EAAmC,SAAS,CAAA,6BAAA,CAA+B,EAC3E,CAAC,CACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;gHA1NU,sBAAsB,GAAA,CAAA,CAAA,CAAA,CAAA;6DAAtB,sBAAsB,EAAA,SAAA,EAAA,CAAA,CAAA,gBAAA,CAAA,CAAA,EAAA,SAAA,EAAA,SAAA,4BAAA,CAAA,EAAA,EAAA,GAAA,EAAA,EAAA,IAAA,EAAA,GAAA,CAAA,EAAA;AAkC0C,YAAA,EAAA,CAAA,iBAAA,CAAA,GAAA,CAAA,kBAAA,EAAAC,KAAA,EAAA,CAAA,EAAA,gBAAgB,kCACb,WAAW,CAAA,CAAA;;;;AAnC9E,YAAA,EAAA,CAAA,WAAA,CAAA,0BAAA,EAAA,oBAAgB,CAAM,CAAA;;AAH/B,YAdA,2HAKC,CAAA,CAAA,EAAA,6CAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,CAAA,EAAA,EAAA,CAAA,sBAAA,CAS6B,CAAA;4BAhBtB,YAAY,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;iFAmBX,sBAAsB,EAAA,CAAA;cAtBlC,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,QAAQ,EAAE,gBAAgB;AAC1B,gBAAA,IAAI,EAAE,EAAE,kCAAkC,EAAE,kBAAkB,EAAE;gBAChE,OAAO,EAAE,CAAC,YAAY,CAAC;AACvB,gBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;AAgBT,EAAA,CAAA;AACF,aAAA,CAAA;AAmCiD,KAAA,CAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,iBAAiB,EAAA,EAAA,GAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAC7C,oBAAoB,EAAA,EAAA,GAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA;kFAnChF,sBAAsB,EAAA,EAAA,SAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,oDAAA,EAAA,UAAA,EAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,GAAA;;;AC5EnC,MAAM,EAAE,qBAAqB,EAAE,QAAQ,EAAE,0BAA0B,EAAE,GAAGC,MAAI,CAAC;AAE7E;AACA;;;;;;AAMG;MAKU,eAAe,CAAA;AAElB,IAAA,gBAAgB,CAA8B;IAE7C,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB,CAAC;AACxC,IAAA,MAAM,GAAG,KAAK,CAA4B,EAAE,6EAAC,CAAC;IAEtC,MAAM,GAAG,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3D,IAAA,OAAO,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;AACzC,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AACjC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAEjD;;AAEG;IACK,gBAAgB,GAAA;AACtB,QAAA,OAAO,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;IACnE,CAAC;AAED,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;gBAAE,OAAO;AAEhD,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAClC,YAAA,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;AACxB,YAAA,IAAI,CAAC,MAAM;gBAAE,OAAO;AAEpB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;YACxB,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC;YAC/C,MAAM,OAAO,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC;YAExC,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,OAAO,CAAC,IAAI,CACV,oFAAoF,CACrF,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,SAAS,GAAG,KAAK,CAAC;AACtB,YAAA,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;AACpC,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;gBAC7B,SAAS,GAAG,IAAI,CAAC;gBACjB,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,YAAA,CAAC,CAAC,CAAC;AAEH,YAAA,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;AAC9B,iBAAA,IAAI,CAAC,CAAC,IAAY,KAAI;AACrB,gBAAA,IAAI,SAAS;oBAAE,OAAO;AACtB,gBAAA,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC;AAChD,gBAAA,IAAI,CAAC,EAAE;oBAAE,OAAO;AAEhB,gBAAA,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC;;gBAGpB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;AAC3C,gBAAA,IAAI,CAAC,SAAS,IAAI,CAAC,eAAe,EAAE,EAAE;AACpC,oBAAA,0BAA0B,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtE,CAAC;gBAED,qBAAqB,CAAC,EAAE,CAAC,CAAC;AAC5B,YAAA,CAAC,CAAC;iBACD,KAAK,CAAC,MAAK;AACV,gBAAA,OAAO,CAAC,KAAK,CACX,+BAA+B,MAAM,CAAA,yDAAA,CAA2D,CACjG,CAAC;AACJ,YAAA,CAAC,CAAC,CAAC;AACP,QAAA,CAAC,CAAC,CAAC;IACL,CAAC;IAEQ,MAAM,GAAG,MAAK;AACrB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAClC,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;AACnB,QAAA,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;AACxC,IAAA,CAAC,CAAC;IACO,WAAW,GAAG,MAAK;AAC1B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAClC,QAAA,OAAO,CAAC,CAAC,mBAAmB,IAAI,SAAS,CAAC;AAC5C,IAAA,CAAC,CAAC;yGA7ES,eAAe,GAAA,CAAA,CAAA,CAAA,CAAA;6DAAf,eAAe,EAAA,SAAA,EAAA,CAAA,CAAA,SAAA,CAAA,CAAA,EAAA,SAAA,EAAA,SAAA,qBAAA,CAAA,EAAA,EAAA,GAAA,EAAA,EAAA,IAAA,EAAA,GAAA,CAAA,EAAA;;;;;;YAFd,EAAA,CAAA,YAAA,CAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,CAAkE,CAAA;;YAA9C,EAAA,CAAA,UAAA,CAAA,GAAA,CAAA,MAAA,EAAA,CAAkB,CAAA;YAAC,EAAA,CAAA,aAAA,CAAA,IAAA,EAAA,GAAA,CAAA,WAAA,EAAA,CAAoB,CAAA;;;iFAE5D,eAAe,EAAA,CAAA;cAJ3B,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,QAAQ,EAAE,CAAA,oEAAA,CAAsE;AACjF,aAAA,CAAA;;kBAEE,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;;kFADjC,eAAe,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,UAAA,EAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,GAAA;;;AC5B5B;;AAEG;MAWU,4BAA4B,CAAA;IAC9B,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA2B,CAAC;AAE5C,IAAA,IAAI,GAAG,KAAK,CAAe,YAAY,CAAC,IAAI,2EAAC,CAAC;AAE9C,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AACjC,QAAA,OAAO,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;AAClD,IAAA,CAAC,qFAAC,CAAC;sHARQ,4BAA4B,GAAA,CAAA,CAAA,CAAA,CAAA;6DAA5B,4BAA4B,EAAA,SAAA,EAAA,CAAA,CAAA,MAAA,EAAA,uBAAA,EAAA,EAAA,CAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,yCAAA,CAAA,EAAA,EAAA,GAAA,EAAA,EAAA,IAAA,EAAA,GAAA,CAAA,EAAA;mCAA5B,eAAe,CAAA,CAAA,YAAA,EAAf,OAAO,CAAA,CAAA,MAAA,EAAP,GAAA,CAAA,IAAA,EAAM,CAAA,CAAA;AAAN,YAAA,EAAA,CAAA,UAAA,CAAA,MAAM,CAAsB,CAAA;;YAR5B,EAAA,CAAA,MAAA,CAAA,CAAA,CAAsB,CAAA;;YAAtB,EAAA,CAAA,iBAAA,CAAA,GAAA,CAAA,cAAA,EAAA,CAAsB,CAAA;;;iFAQtB,4BAA4B,EAAA,CAAA;cAVxC,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,QAAQ,EAAE,6BAA6B;AACvC,gBAAA,QAAQ,EAAE,wBAAwB;AAClC,gBAAA,IAAI,EAAE;AACJ,oBAAA,aAAa,EAAE,iBAAiB;AAChC,oBAAA,mBAAmB,EAAE,SAAS;AAC9B,oBAAA,SAAS,EAAE,QAAQ;AACnB,oBAAA,aAAa,EAAE,QAAQ;AACxB,iBAAA;AACF,aAAA,CAAA;;kFACY,4BAA4B,EAAA,EAAA,SAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,0DAAA,EAAA,UAAA,EAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,GAAA;;ACSzC;;;;;;;;;;;;;;;;;;;;;AAqBG;MACmB,kBAAkB,CAAA;AACnB,IAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACzC,IAAA,WAAW,GAAG,MAAM,EAAC,WAAoB,EAAC,CAAC;AAC3C,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,OAAO,GAAG,MAAM,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;;AAGtE,IAAA,OAAO,CAA4B;AAS7C,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACjC,IAAI,CAAC,UAAU,EAAE,CAAC;AACpB,QAAA,CAAC,CAAC,CAAC;IACL,CAAC;AASD;;;AAGG;IACO,YAAY,GAAA;AACpB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAuC,CAAC,CAAC;IAC5E,CAAC;;IAGS,SAAS,GAAA;QACjB,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,KAAK,CAAC;IAC5C,CAAC;;IAGS,SAAS,GAAA;QACjB,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,KAAK,CAAC;IAC5C,CAAC;;AAGD,IAAA,IAAc,aAAa,GAAA;AACzB,QAAA,OAAQ,IAAI,CAAC,KAAK,EAA4B,EAAE,QAAQ,CAAC;IAC3D,CAAC;AAED;;;;;AAKG;IACO,WAAW,GAAA;QACnB,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YAC5C,OAAO;QACT,CAAC;AACD,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC7C,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;aAAM;YACL,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACjE,CAAC;AACD,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;AAED;;;;AAIG;AACO,IAAA,mBAAmB,CAAC,IAAkB,EAAA;AAC9C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;QACpC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YAClC,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,4BAA4B,CAAC,CAAC;AAC7E,QAAA,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC3B,QAAA,IAAI,IAAI,KAAK,YAAY,CAAC,IAAI,EAAE;AAC9B,YAAA,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;AACF;;;ACxID;;AAEG;MAKU,iCAAiC,CAAA;2HAAjC,iCAAiC,GAAA,CAAA,CAAA,CAAA,CAAA;6DAAjC,iCAAiC,EAAA,SAAA,EAAA,CAAA,CAAA,MAAA,EAAA,iDAAA,EAAA,EAAA,CAAA,CAAA,EAAA,KAAA,EAAAD,KAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAA,0CAAA,CAAA,EAAA,EAAA,GAAA,EAAA,EAAA,IAAA,EAAA,GAAA,CAAA,EAAA;YAFjC,EAAA,CAAA,MAAA,CAAA,CAAA,EAAA,oBAAA,CAAkB,CAAA;;;iFAElB,iCAAiC,EAAA,CAAA;cAJ7C,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,QAAQ,EAAE,uDAAuD;AACjE,gBAAA,QAAQ,EAAE,oBAAoB;AAC/B,aAAA,CAAA;;kFACY,iCAAiC,EAAA,EAAA,SAAA,EAAA,mCAAA,EAAA,QAAA,EAAA,kDAAA,EAAA,UAAA,EAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,GAAA;;ACH9C;;;;;;;;;;;;;;;;;;;;AAoBG;AAIG,MAAO,eAAgB,SAAQ,kBAAyC,CAAA;;IAEnE,KAAK,GAAG,KAAK,CAAC,QAAQ,4EAA0B,KAAK,EAAE,QAAQ,EAAA,CAAG,CAAC;;IAGnE,MAAM,GAAG,KAAK,CAAU,IAAI,8EAAI,KAAK,EAAE,cAAc,EAAA,CAAG,CAAC;;IAGzD,yBAAyB,GAAG,KAAK,CAAmC,SAAS,iGACpF,KAAK,EAAE,iCAAiC,EAAA,CACxC,CAAC;IAEgB,qBAAqB,GAAkB,iCAAiC,CAAC;IAElF,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;AAEzB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;YACxB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;AAED,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5C,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvE,IAAI,CAAC,UAAU,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEO,UAAU,GAAA;AAChB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC9D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;AACzC,YAAA,IAAI,EAAE,IAAI,YAAY,OAAO,CAAC;gBAAE,SAAS;YACzC,IAAI,MAAM,EAAE;gBACV,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;YACxD,CAAC;iBAAM;gBACL,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;AA1CU,IAAA,OAAA,IAAA,iBAAA,CAAA,MAAA,EAAA,IAAA,4BAAA,CAAA,CAAA,OAAA,SAAA,uBAAA,CAAA,iBAAA,EAAA,EAAA,OAAA,CAAA,4BAAA,KAAA,4BAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,eAAe,yBAAf,eAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA;6DAAf,eAAe,EAAA,SAAA,EAAA,CAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,CAAA,CAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,CAAA,CAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,MAAA,EAAA,CAAA,CAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,yBAAA,EAAA,CAAA,CAAA,EAAA,iCAAA,EAAA,2BAAA,CAAA,EAAA,EAAA,QAAA,EAAA,CAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,CAAA,CAAA;;iFAAf,eAAe,EAAA,CAAA;cAH3B,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,QAAQ,EAAE,UAAU;AACrB,aAAA,CAAA;;;;AC3BD,MAAM,eAAe,GACnB,u7BAAu7B,CAAC;AAE17B;;AAEG;MAUU,sCAAsC,CAAA;IAC9B,GAAG,GAAG,eAAe,CAAC;gIAD9B,sCAAsC,GAAA,CAAA,CAAA,CAAA,CAAA;6DAAtC,sCAAsC,EAAA,SAAA,EAAA,CAAA,CAAA,EAAA,EAAA,kDAAA,EAAA,EAAA,CAAA,CAAA,EAAA,KAAA,EAAA,GAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,CAAA,KAAA,EAAA,EAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,WAAA,EAAA,MAAA,EAAA,YAAA,EAAA,MAAA,EAAA,WAAA,EAAA,OAAA,EAAA,YAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,CAAA,CAAA,EAAA,QAAA,EAAA,SAAA,+CAAA,CAAA,EAAA,EAAA,GAAA,EAAA,EAAA,IAAA,EAAA,GAAA,CAAA,EAAA;YAPtC,EAAA,CAAA,YAAA,CAAA,CAAA,EAAA,KAAA,EAAA,CAAA,CAKT,CAAA;;;;;iFAES,sCAAsC,EAAA,CAAA;cATlD,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,QAAQ,EAAE,oDAAoD;AAC9D,gBAAA,QAAQ,EAAE,CAAA;;;;;AAKP,IAAA,CAAA;AACJ,aAAA,CAAA;;kFACY,sCAAsC,EAAA,EAAA,SAAA,EAAA,wCAAA,EAAA,QAAA,EAAA,mDAAA,EAAA,UAAA,EAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,GAAA;;ACjBnD;;;;AAIG;AACI,MAAM,iBAAiB,GAAG,CAAC,UAAsC,KAAwB;AAC9F,IAAA,IAAI,UAAU,CAAC,SAAS,EAAE;AACxB,QAAA,IAAI,UAAU,CAAC,KAAK,EAAE;AACpB,YAAA,IAAI,WAAW,GAAW,UAAU,CAAC,SAAmB,CAAC;AACzD,YAAA,WAAW,IAAI,CAAA,CAAA,EAAI,UAAU,CAAC,KAAK,EAAE,CAAC;AACtC,YAAA,OAAO,WAAW,CAAC;QACrB,CAAC;aAAM;YACL,OAAO,UAAU,CAAC,SAA+B,CAAC;QACpD,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,KAA2B,CAAC;AAChD,CAAC,CAAC;AAEF;;;AAGG;AACI,MAAM,sBAAsB,GAAG;IACpC,SAAS;IACT,UAAU;IACV,SAAS;IACT,MAAM;IACN,MAAM;IACN,aAAa;IACb,OAAO;IACP,MAAM;IACN,IAAI;CACL;;ACJD;;;;;;;;;;;;;;;;AAgBG;AAIG,MAAO,gBAAiB,SAAQ,kBAA4D,CAAA;;IAEvF,KAAK,GAAG,KAAK,CAAC,QAAQ,4EAA6C,KAAK,EAAE,SAAS,EAAA,CAAG,CAAC;;IAGvF,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAwD,CAAC;;IAG5E,cAAc,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB,CAAC;;IAG7C,yBAAyB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,2BAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAoC,CAAC;IAE5D,qBAAqB,GAAkB,sCAAsC,CAAC;IAEvF,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;AAEzB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;YACxB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;AAED,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5C,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvE,IAAI,CAAC,UAAU,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAES,YAAY,GAAA;AACpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK,CAAC;AACrD,QAAA,MAAM,GAAG,GAAI,KAAyB,CAAC,GAAG;AACxC,cAAG,KAAyB;AAC5B,cAAG,KAAoB,CAAC,KAAK,CAAC;AAChC,QAAA,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACpB,CAAC;IAEO,UAAU,GAAA;AAChB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;AAEpC,QAAA,MAAM,GAAG,GAAI,KAAyB,CAAC,GAAG;AACxC,cAAG,KAAyB;AAC5B,cAAG,KAAoB,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,GAAG,EAAE,GAAG;YAAE,OAAO;AAEtB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAClC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;AACrC,QAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAErE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;AACzC,YAAA,IAAI,EAAE,IAAI,YAAY,OAAO,CAAC;gBAAE,SAAS;YACzC,MAAM,EAAE,GAAG,IAAwB,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;AAEnD,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACtD,gBAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBAChF,IAAI,WAAW,EAAE;oBACf,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;iBAAM;gBACL,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC9C,CAAC;AAED,YAAA,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,UAAU,EAAE;gBACd,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACzC,CAAC;AAED,YAAA,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE;AACzB,gBAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACjD,CAAC;iBAAM;gBACL,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC3C,CAAC;AACD,YAAA,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE;AAC3B,gBAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7D,CAAC;iBAAM;gBACL,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC7C,CAAC;AACD,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE;AAC5B,gBAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/D,CAAC;iBAAM;gBACL,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;AAvFU,IAAA,OAAA,IAAA,iBAAA,CAAA,MAAA,EAAA,IAAA,6BAAA,CAAA,CAAA,OAAA,SAAA,wBAAA,CAAA,iBAAA,EAAA,EAAA,OAAA,CAAA,6BAAA,KAAA,6BAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,gBAAgB,yBAAhB,gBAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA;6DAAhB,gBAAgB,EAAA,SAAA,EAAA,CAAA,CAAA,EAAA,EAAA,SAAA,EAAA,EAAA,CAAA,CAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,CAAA,CAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,WAAA,EAAA,CAAA,CAAA,EAAA,aAAA,CAAA,EAAA,cAAA,EAAA,CAAA,CAAA,EAAA,gBAAA,CAAA,EAAA,yBAAA,EAAA,CAAA,CAAA,EAAA,2BAAA,CAAA,EAAA,EAAA,QAAA,EAAA,CAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,CAAA,CAAA;;iFAAhB,gBAAgB,EAAA,CAAA;cAH5B,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,QAAQ,EAAE,WAAW;AACtB,aAAA,CAAA;;;AC3CD;;;;;;AAMG;AACH,SAAS,cAAc,CAAC,QAAmB,EAAE,OAAoB,EAAE,WAAmB,EAAA;AACpF,IAAA,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;AACnE,QAAA,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED;;;;AAIG;AACG,SAAU,oBAAoB,CAClC,KAAoD,EAAA;IAEpD,IAAI,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE;AACtC,QAAA,OAAO,SAAS,CAAC;IACnB,CAAC;AACD,IAAA,OAAQ,KAAwB,CAAC,IAAI,GAAI,KAAwB,GAAI,KAAmB,CAAC,KAAK,CAAC;AACjG,CAAC;AAED;;;;AAIG;AACG,SAAU,sBAAsB,CAAC,IAAoB,EAAA;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;AAClF,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,WAAW,CAAA,CAAE,GAAG,EAAE,CAAC;IACnE,OAAO,CAAA,EAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA,EAAG,WAAW,CAAA,EAAG,MAAM,CAAA,CAAE,CAAC;AACrD,CAAC;AAWD;;;;;;;;AAQG;AACG,SAAU,sBAAsB,CACpC,QAAmB,EACnB,OAA0B,EAC1B,IAAgC,EAChC,OAAsC,EAAA;IAEtC,IAAI,CAAC,IAAI,EAAE;AACT,QAAA,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;SAAM;AACL,QAAA,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,CAAC;AACD,IAAA,MAAM,UAAU,GAAG,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9D,IAAI,UAAU,EAAE;AACd,QAAA,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAChD,CAAC;SAAM;AACL,QAAA,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC3C,QAAA,IAAI,OAAO,CAAC,aAAa,EAAE;YACzB,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAC3D,CAAC;AAED,QAAA,IAAI,IAAI,EAAE,KAAK,EAAE;YACf,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC;aAAM;AACL,YAAA,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC3C,YAAA,IAAI,OAAO,CAAC,aAAa,EAAE;gBACzB,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;AACD,QAAA,IAAI,IAAI,EAAE,MAAM,EAAE;YAChB,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,IAAI,EAAE,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;gBACrD,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;YAC/D,CAAC;iBAAM;AACL,gBAAA,OAAO,CAAC,WAAW;AACjB,sBAAE,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC;sBAC1D,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;aAAM;AACL,YAAA,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC5C,YAAA,IAAI,OAAO,CAAC,cAAc,EAAE;gBAC1B,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;AAED,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;QACjF,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;YAC5C,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,OAAO,CAAC,mBAAmB,IAAI,IAAI,EAAE,IAAI,EAAE;AACpD,YAAA,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH;;AC7FA;;;;;AAKG;AACH,SAAS,iBAAiB,CAAC,IAAY,EAAA;AACrC,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI,CAAC;AACvB,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAC5B,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,IAAI,CAAC;AAC1B,IAAA,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC;AACzC,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;AACpC,IAAA,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;AAsBG;AAIG,MAAO,eAAgB,SAAQ,kBAA0D,CAAA;;IAEpF,KAAK,GAAG,KAAK,CAAC,QAAQ,4EAA2C,KAAK,EAAE,QAAQ,EAAA,CAAG,CAAC;;IAEpF,mBAAmB,GAAG,KAAK,CAAU,KAAK,2FAAI,KAAK,EAAE,2BAA2B,EAAA,CAAG,CAAC;;IAEpF,yBAAyB,GAAG,KAAK,CAAmC,SAAS,iGACpF,KAAK,EAAE,iCAAiC,EAAA,CACxC,CAAC;IAEgB,qBAAqB,GAAkB,iCAAiC,CAAC;AACzE,IAAA,eAAe,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;AACnD,IAAA,OAAO,GACtB,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;AAC3D,IAAA,aAAa,GAAG,IAAI,OAAO,EAA0C,CAAC;IAE7E,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;AAEzB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;YACxB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;AAED,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5C,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvE,IAAI,CAAC,UAAU,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAES,YAAY,GAAA;AACpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK,CAAC;AACzB,QAAA,IAAI,oBAAoB,CAAC,KAA+C,CAAC,EAAE;AACzE,YAAA,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAI,KAAwB,CAAC,IAAI,IAAK,KAAmB,CAAC,KAAK,EAAE,IAAI,CAAC;QAChF,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;IACvC,CAAC;IAES,UAAU,GAAA;AAClB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;AAEpC,QAAA,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACzC,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAE5D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;AACzC,YAAA,IAAI,EAAE,IAAI,YAAY,OAAO,CAAC;gBAAE,SAAS;YACzC,MAAM,MAAM,GAAG,IAAyB,CAAC;YACzC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC5C,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE;AAC3D,gBAAA,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAAE;gBAC/C,aAAa,EAAE,SAAS,CAAC,KAAK;gBAC9B,aAAa,EAAE,SAAS,CAAC,KAAK;gBAC9B,cAAc,EAAE,SAAS,CAAC,MAAM;gBAChC,WAAW,EAAE,SAAS,CAAC,GAAG;AAC3B,aAAA,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AAEO,IAAA,YAAY,CAAC,MAAyB,EAAA;QAC5C,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,GAAG;AACP,gBAAA,KAAK,EAAE,MAAM,CAAC,SAAS,IAAI,SAAS;gBACpC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,SAAS;gBAChD,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,SAAS;AAClD,gBAAA,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;aAChC,CAAC;YACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;AACD,QAAA,OAAO,MAAM,CAAC;IAChB,CAAC;AAED;;;;;;;;AAQG;AACK,IAAA,YAAY,CAAC,IAAoB,EAAA;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;AAC7B,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE;AAC3B,YAAA,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,YAAA,MAAM,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3D,IAAI,MAAM,EAAE;AACV,gBAAA,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;QACvD,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,OAAO,IAAI,CAAC;QACd,CAAC;AACD,QAAA,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC;IAClE,CAAC;AArGU,IAAA,OAAA,IAAA,iBAAA,CAAA,MAAA,EAAA,IAAA,4BAAA,CAAA,CAAA,OAAA,SAAA,uBAAA,CAAA,iBAAA,EAAA,EAAA,OAAA,CAAA,4BAAA,KAAA,4BAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,eAAe,yBAAf,eAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA;6DAAf,eAAe,EAAA,SAAA,EAAA,CAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,CAAA,CAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,CAAA,CAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,CAAA,EAAA,2BAAA,EAAA,qBAAA,CAAA,EAAA,yBAAA,EAAA,CAAA,CAAA,EAAA,iCAAA,EAAA,2BAAA,CAAA,EAAA,EAAA,QAAA,EAAA,CAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,CAAA,CAAA;;iFAAf,eAAe,EAAA,CAAA;cAH3B,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,QAAQ,EAAE,UAAU;AACrB,aAAA,CAAA;;;AC9CD;;;;;;;;;;;;;;AAcG;SACa,mBAAmB,CACjC,QAAmB,EACnB,MAAyB,EACzB,OAA6B,EAAA;AAE7B,IAAA,IAAI,KAAgD,CAAC;IAErD,MAAM,UAAU,GAAG,MAAK;AACtB,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC;AACH,IAAA,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,MAAK;AAC/D,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,OAAO;QACT,CAAC;AACD,QAAA,KAAK,GAAG,UAAU,CAAC,MAAK;YACtB,KAAK,GAAG,SAAS,CAAC;AAClB,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACvD,IAAI,IAAI,EAAE;AACR,gBAAA,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;AACH,QAAA,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;AACtB,IAAA,CAAC,CAAC,CAAC;AAEH,IAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAExE,IAAA,OAAO,MAAK;AACV,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,aAAa,EAAE,CAAC;AAChB,QAAA,aAAa,EAAE,CAAC;AAClB,IAAA,CAAC,CAAC;AACJ;;ACnDA;AACA,MAAME,wBAAsB,GAAqB,OAAO,CAAC;AACzD,MAAMC,4BAA0B,GAAG,GAAG,CAAC;AAEvC;;;;;;;;;;;;;;;AAeG;AAIG,MAAO,qBAAsB,SAAQ,eAAe,CAAA;;IAEtC,KAAK,GAAG,KAAK,CAAC,QAAQ,4EACtC,KAAK,EAAE,cAAc,EAAA,CACrB,CAAC;;IAEM,QAAQ,GAAG,KAAK,CAA+B,SAAS,gFAC/D,KAAK,EAAE,sBAAsB,EAAA,CAC7B,CAAC;AAEc,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AACjC,IAAA,aAAa,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAC;AACnD,IAAA,kBAAkB,GAAG,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO;AAC9F,UAAE,YAAY,CAAC;IACA,WAAW,GAAmB,EAAE,CAAC;IAE/B,UAAU,GAAA;QAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;AACzC,YAAA,IAAI,EAAE,IAAI,YAAY,iBAAiB,CAAC;gBAAE,SAAS;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,KAAiB,KACrE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAC1B,CAAC;AACF,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,gBAAgB,GAAA;AACtB,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW;AAAE,YAAA,CAAC,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,CAAC;AAED;;;;;;AAMG;AACK,IAAA,aAAa,CAAC,MAAyB,EAAA;AAC7C,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO;AAChD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE;YAAE,OAAO;AAEjF,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AACjD,QAAA,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC;YAAE,OAAO;AAE7D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,IAAID,wBAAsB,CAAC;QACxF,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO;AAE3B,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,OAAO,IAAIC,4BAA0B,CAAC;YAC/E,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;gBAC1D,OAAO;AACP,gBAAA,UAAU,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC/E,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;;AAGD,QAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;AAED;;;;;;AAMG;IACK,OAAO,CAAC,KAAiB,EAAE,MAAyB,EAAA;AAC1D,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE;YACpD,OAAO;QACT,CAAC;AAED,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,EAAE;YACxE,OAAO;QACT,CAAC;QAED,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC3B,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;AAED;;;;;AAKG;IACK,qBAAqB,CAAC,QAAuB,EAAE,UAAyB,EAAA;AAC9E,QAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,EAAE,EAAE;AAChC,YAAA,OAAO,IAAI,CAAC;QACd,CAAC;AACD,QAAA,IAAI,UAAU,KAAK,QAAQ,EAAE;AAC3B,YAAA,OAAO,IAAI,CAAC;QACd,CAAC;AACD,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;AACrC,QAAA,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,CAAC;AA3GU,IAAA,OAAA,IAAA,iBAAA,CAAA,MAAA,EAAA,IAAA,kCAAA,CAAA,CAAA,OAAA,SAAA,6BAAA,CAAA,iBAAA,EAAA,EAAA,OAAA,CAAA,kCAAA,KAAA,kCAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,qBAAqB,yBAArB,qBAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA;6DAArB,qBAAqB,EAAA,SAAA,EAAA,CAAA,CAAA,EAAA,EAAA,cAAA,EAAA,EAAA,CAAA,CAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,CAAA,CAAA,EAAA,cAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,CAAA,EAAA,sBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,QAAA,EAAA,CAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,CAAA,CAAA;;iFAArB,qBAAqB,EAAA,CAAA;cAHjC,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,QAAQ,EAAE,gBAAgB;AAC3B,aAAA,CAAA;;;ACXD;AACA,MAAM,sBAAsB,GAAqB,OAAO,CAAC;AACzD,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAEvC;;;;;;;;;;;;;;AAcG;AAIG,MAAO,mBAAoB,SAAQ,kBAAyC,CAAA;;IAEvE,KAAK,GAAG,KAAK,CAAC,QAAQ,4EAA0B,KAAK,EAAE,YAAY,EAAA,CAAG,CAAC;;IAGvE,yBAAyB,GAAG,KAAK,CAAmC,SAAS,iGACpF,KAAK,EAAE,qCAAqC,EAAA,CAC5C,CAAC;;IAEM,QAAQ,GAAG,KAAK,CAA+B,SAAS,gFAC/D,KAAK,EAAE,oBAAoB,EAAA,CAC3B,CAAC;IAEgB,qBAAqB,GAAkB,iCAAiC,CAAC;AAE3E,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACjC,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AACjC,IAAA,aAAa,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAC;AACnD,IAAA,kBAAkB,GAAG,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO;AAC9F,UAAE,YAAY,CAAC;IACA,eAAe,GAAmB,EAAE,CAAC;IAE5C,UAAU,GAAA;QAClB,IAAI,CAAC,YAAY,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;AAEzB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;YACxB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;AAED,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5C,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvE,IAAI,CAAC,UAAU,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEO,UAAU,GAAA;QAChB,IAAI,CAAC,YAAY,EAAE,CAAC;AACpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;AACpC,QAAA,MAAM,GAAG,GAAI,KAAK,CAAC,KAAgB,IAAI,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;AAC5D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC1E,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;AACzC,YAAA,IAAI,EAAE,IAAI,YAAY,OAAO,CAAC;gBAAE,SAAS;YACzC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;AACnD,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AAEO,IAAA,SAAS,CAAC,SAAkB,EAAA;AAClC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACtD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAwB,EAAE;AAC/D,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACvD,YAAA,IAAI,CAAC,IAAI;gBAAE,SAAS;AACpB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AACjC,YAAA,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAAE,SAAS;AACtE,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,KAAiB,KAAI;AAC3E,gBAAA,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC9D,gBAAA,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,QAAQ;oBAAE,OAAO;gBACvD,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;AAC9C,YAAA,CAAC,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACpC,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;AAED;;;;;;;;;AASG;IACK,aAAa,CAAC,MAAyB,EAAE,IAAY,EAAA;AAC3D,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO;QAChD,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO;AAEjD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,IAAI,sBAAsB,CAAC;QACxF,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO;AAE3B,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,OAAO,IAAI,0BAA0B,CAAC;YAC/E,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;gBAC1D,OAAO;AACP,gBAAA,UAAU,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzE,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;;AAGD,QAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAEO,YAAY,GAAA;AAClB,QAAA,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE;AAC3C,YAAA,QAAQ,EAAE,CAAC;QACb,CAAC;AACD,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;AA9GU,IAAA,OAAA,IAAA,iBAAA,CAAA,MAAA,EAAA,IAAA,gCAAA,CAAA,CAAA,OAAA,SAAA,2BAAA,CAAA,iBAAA,EAAA,EAAA,OAAA,CAAA,gCAAA,KAAA,gCAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,mBAAmB,yBAAnB,mBAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA;6DAAnB,mBAAmB,EAAA,SAAA,EAAA,CAAA,CAAA,EAAA,EAAA,YAAA,EAAA,EAAA,CAAA,CAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,CAAA,CAAA,EAAA,YAAA,EAAA,OAAA,CAAA,EAAA,yBAAA,EAAA,CAAA,CAAA,EAAA,qCAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,CAAA,EAAA,oBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,QAAA,EAAA,CAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,CAAA,CAAA;;iFAAnB,mBAAmB,EAAA,CAAA;cAH/B,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,QAAQ,EAAE,cAAc;AACzB,aAAA,CAAA;;;AC0HM,MAAM,kBAAkB,GAAGC,QAAa;AACxC,MAAM,kBAAkB,GAAG;;ACtKlC;;AAEG;;;;"}