{"version":3,"file":"ngx-matomo-router.mjs","sources":["../../../projects/router/src/lib/configuration.ts","../../../projects/router/src/lib/interceptor.ts","../../../projects/router/src/lib/errors.ts","../../../projects/router/src/lib/page-title-providers.ts","../../../projects/router/src/lib/page-url-provider.ts","../../../projects/router/src/lib/matomo-router.service.ts","../../../projects/router/src/lib/ngx-matomo-router.module.ts","../../../projects/router/src/lib/interceptors/route-utils.ts","../../../projects/router/src/lib/interceptors/route-interceptor-base.ts","../../../projects/router/src/lib/interceptors/route-data-interceptor.ts","../../../projects/router/src/public-api.ts","../../../projects/router/src/ngx-matomo-router.ts"],"sourcesContent":["import { inject, InjectionToken, Type } from '@angular/core';\nimport { INTERNAL_MATOMO_CONFIGURATION, InternalMatomoConfiguration } from '@ngx-matomo/tracker';\nimport { MatomoRouterInterceptor } from './interceptor';\n\nexport const MATOMO_ROUTER_CONFIGURATION = new InjectionToken<MatomoRouterConfiguration>(\n  'MATOMO_ROUTER_CONFIGURATION'\n);\n\nexport type ExclusionConfig = string | RegExp | (string | RegExp)[];\n\nexport interface MatomoRouterConfiguration {\n  /**\n   * Set whether the application base href should be included in Matomo tracked urls\n   *\n   * Optional, default is `true`\n   */\n  prependBaseHref?: boolean; // Default true or false?\n\n  /**\n   * Set whether the page title should be set when tracking page views\n   *\n   * Note that if set to `false`, Matomo is likely to still use the initial document title for all\n   * tracked page views.\n   *\n   * Optional, default is `true`\n   */\n  trackPageTitle?: boolean;\n\n  /**\n   * Set a delay after navigation event, before the page view is tracked. This is useful to let a\n   * chance to the components to update document title.\n   *\n   * Set it to 0 (the default) to execute tracking asynchronously without further delay\n   * Set it to -1, to execute tracking synchronously (not recommended)\n   *\n   * Optional, default is `0` (but still asynchronous)\n   */\n  delay?: number;\n\n  /**\n   * Pass some regular expressions to exclude some urls from being tracked as page views\n   *\n   * Optional, default is no url excluded\n   */\n  exclude?: ExclusionConfig;\n}\n\nexport interface MatomoRouterConfigurationWithInterceptors extends MatomoRouterConfiguration {\n  /**\n   * Interceptors types to register.\n   *\n   * For more complex scenarios, it is possible to configure any interceptor by\n   * providing token `MATOMO_ROUTER_INTERCEPTORS` as `multi` provider(s).\n   */\n  interceptors?: Type<MatomoRouterInterceptor>[];\n}\n\nexport const DEFAULT_ROUTER_CONFIGURATION: Required<MatomoRouterConfiguration> = {\n  prependBaseHref: true,\n  trackPageTitle: true,\n  delay: 0,\n  exclude: [],\n};\n\nexport type InternalGlobalConfiguration = Pick<\n  InternalMatomoConfiguration,\n  'enableLinkTracking' | 'disabled'\n>;\nexport type InternalRouterConfiguration = Required<MatomoRouterConfiguration> &\n  InternalGlobalConfiguration;\n\nexport const INTERNAL_ROUTER_CONFIGURATION = new InjectionToken<InternalRouterConfiguration>(\n  'INTERNAL_ROUTER_CONFIGURATION',\n  {\n    factory: () => {\n      const { disabled, enableLinkTracking } = inject(INTERNAL_MATOMO_CONFIGURATION);\n      const routerConfig = inject(MATOMO_ROUTER_CONFIGURATION, { optional: true }) || {};\n\n      return { ...DEFAULT_ROUTER_CONFIGURATION, ...routerConfig, enableLinkTracking, disabled };\n    },\n  }\n);\n","import { InjectionToken, Provider, Type } from '@angular/core';\nimport { NavigationEnd } from '@angular/router';\nimport { Observable } from 'rxjs';\n\nexport const MATOMO_ROUTER_INTERCEPTORS = new InjectionToken<MatomoRouterInterceptor[]>(\n  'MATOMO_ROUTER_INTERCEPTORS'\n);\n\n/** Interceptor used to hook into the page tracking process */\nexport interface MatomoRouterInterceptor {\n  /**\n   * Called after a router event has occurred and before page view has been tracked (i.e. before `trackPageView()` has been called)\n   *\n   * If an Observable or a Promise is returned, the observable (first emission or completion) or promise resolution is awaited before tracking call.\n   */\n  beforePageTrack(event: NavigationEnd): Observable<void> | Promise<void> | void;\n}\n\nexport function provideInterceptor(type: Type<MatomoRouterInterceptor>): Provider {\n  return {\n    provide: MATOMO_ROUTER_INTERCEPTORS,\n    multi: true,\n    useClass: type,\n  };\n}\n\nexport function provideInterceptors(\n  types: Type<MatomoRouterInterceptor>[] | undefined\n): Provider[] {\n  if (!types) {\n    return [];\n  }\n\n  return types.map(provideInterceptor);\n}\n","export function invalidInterceptorsProviderError(): Error {\n  return new Error(\n    'An invalid MATOMO_ROUTER_INTERCEPTORS provider was configured. Did you forget to set \"multi: true\" ?'\n  );\n}\n","import { inject, InjectionToken } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { NavigationEnd } from '@angular/router';\nimport { Observable, of } from 'rxjs';\n\n/**\n * @deprecated Use an interceptor calling `setDocumentTitle()` instead\n * @see MatomoRouterInterceptor\n * @see MATOMO_ROUTER_INTERCEPTORS\n */\nexport const MATOMO_PAGE_TITLE_PROVIDER = new InjectionToken<PageTitleProvider>(\n  'MATOMO_PAGE_TITLE_PROVIDER',\n  {\n    factory: () => new DefaultPageTitleProvider(inject(Title)),\n  }\n);\n\n/**\n * @deprecated Use an interceptor calling `setDocumentTitle()` instead\n * @see MatomoRouterInterceptor\n * @see MATOMO_ROUTER_INTERCEPTORS\n */\nexport interface PageTitleProvider {\n  getCurrentPageTitle(event: NavigationEnd): Observable<string>;\n}\n\nexport class DefaultPageTitleProvider implements PageTitleProvider {\n  constructor(private readonly title: Title) {}\n\n  getCurrentPageTitle(event: NavigationEnd): Observable<string> {\n    return of(this.title.getTitle());\n  }\n}\n","import { APP_BASE_HREF, PlatformLocation } from '@angular/common';\nimport { Inject, inject, InjectionToken, Optional } from '@angular/core';\nimport { NavigationEnd } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { INTERNAL_ROUTER_CONFIGURATION, InternalRouterConfiguration } from './configuration';\n\nexport const MATOMO_PAGE_URL_PROVIDER = new InjectionToken<PageUrlProvider>(\n  'MATOMO_PAGE_URL_PROVIDER',\n  {\n    factory: () =>\n      new DefaultPageUrlProvider(\n        inject(INTERNAL_ROUTER_CONFIGURATION),\n        inject(APP_BASE_HREF, { optional: true }),\n        inject(PlatformLocation)\n      ),\n  }\n);\n\nexport interface PageUrlProvider {\n  getCurrentPageUrl(event: NavigationEnd): Observable<string>;\n}\n\nfunction trimTrailingSlash(str: string): string {\n  return str.endsWith('/') ? str.slice(0, -1) : str;\n}\n\nexport class DefaultPageUrlProvider implements PageUrlProvider {\n  constructor(\n    @Optional()\n    @Inject(INTERNAL_ROUTER_CONFIGURATION)\n    private readonly config: InternalRouterConfiguration,\n    @Optional() @Inject(APP_BASE_HREF) private readonly baseHref: string | null,\n    private readonly platformLocation: PlatformLocation\n  ) {}\n\n  getCurrentPageUrl(event: NavigationEnd): Observable<string> {\n    const url = this.config.prependBaseHref\n      ? this.getBaseHrefWithoutTrailingSlash() + event.urlAfterRedirects\n      : event.urlAfterRedirects;\n\n    return of(url);\n  }\n\n  private getBaseHrefWithoutTrailingSlash(): string {\n    return trimTrailingSlash(this.baseHref ?? this.platformLocation.getBaseHrefFromDOM());\n  }\n}\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { Event, NavigationEnd, Router } from '@angular/router';\nimport { MatomoTracker } from '@ngx-matomo/tracker';\nimport {\n  combineLatest,\n  forkJoin,\n  from,\n  identity,\n  MonoTypeOperatorFunction,\n  Observable,\n  of,\n} from 'rxjs';\nimport {\n  concatMap,\n  defaultIfEmpty,\n  delay,\n  distinctUntilKeyChanged,\n  filter,\n  map,\n  mapTo,\n  switchMap,\n  take,\n  tap,\n} from 'rxjs/operators';\nimport {\n  ExclusionConfig,\n  INTERNAL_ROUTER_CONFIGURATION,\n  InternalRouterConfiguration,\n} from './configuration';\nimport { invalidInterceptorsProviderError } from './errors';\nimport { MATOMO_ROUTER_INTERCEPTORS, MatomoRouterInterceptor } from './interceptor';\nimport { MATOMO_PAGE_TITLE_PROVIDER, PageTitleProvider } from './page-title-providers';\nimport { MATOMO_PAGE_URL_PROVIDER, PageUrlProvider } from './page-url-provider';\n\nfunction isNavigationEnd(event: Event): event is NavigationEnd {\n  return event instanceof NavigationEnd;\n}\n\nfunction coerceRegExp(input: string | RegExp): RegExp {\n  return typeof input === 'string' ? new RegExp(input) : input;\n}\n\nfunction coerceRegExpArray(input: ExclusionConfig | null | undefined): RegExp[] {\n  if (!input) {\n    return [];\n  }\n\n  return Array.isArray(input) ? input.map(coerceRegExp) : [coerceRegExp(input)];\n}\n\nfunction isNotExcluded(excludeConfig: ExclusionConfig): (event: NavigationEnd) => boolean {\n  const exclusions = coerceRegExpArray(excludeConfig);\n\n  return (event: NavigationEnd) => !exclusions.some(rx => event.urlAfterRedirects.match(rx));\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MatomoRouter {\n  constructor(\n    private readonly router: Router,\n    @Inject(INTERNAL_ROUTER_CONFIGURATION)\n    private readonly config: InternalRouterConfiguration,\n    @Inject(MATOMO_PAGE_TITLE_PROVIDER)\n    private readonly pageTitleProvider: PageTitleProvider,\n    @Inject(MATOMO_PAGE_URL_PROVIDER)\n    private readonly pageUrlProvider: PageUrlProvider,\n    private readonly tracker: MatomoTracker,\n    @Optional()\n    @Inject(MATOMO_ROUTER_INTERCEPTORS)\n    private readonly interceptors: MatomoRouterInterceptor[] | null\n  ) {\n    if (interceptors && !Array.isArray(interceptors)) {\n      throw invalidInterceptorsProviderError();\n    }\n  }\n\n  init(): void {\n    if (this.config.disabled) {\n      // Do not set-up router if globally disabled\n      return;\n    }\n\n    const delayOp: MonoTypeOperatorFunction<NavigationEnd> =\n      this.config.delay === -1 ? identity : delay(this.config.delay);\n\n    this.router.events\n      .pipe(\n        // Take only NavigationEnd events\n        filter(isNavigationEnd),\n        // Filter out excluded urls\n        filter(isNotExcluded(this.config.exclude)),\n        // Distinct urls\n        distinctUntilKeyChanged('urlAfterRedirects'),\n        // Optionally add some delay\n        delayOp,\n        // Set default page title & url\n        switchMap(event =>\n          this.presetPageTitleAndUrl(event).pipe(map(({ pageUrl }) => ({ pageUrl, event })))\n        ),\n        // Run interceptors then track page view\n        concatMap(({ event, pageUrl }) =>\n          this.callInterceptors(event).pipe(tap(() => this.trackPageView(pageUrl)))\n        )\n      )\n      .subscribe();\n  }\n\n  private callInterceptors(event: NavigationEnd): Observable<void> {\n    if (this.interceptors) {\n      return forkJoin(\n        this.interceptors.map(interceptor => {\n          const result = interceptor.beforePageTrack(event);\n          const result$ = result == null ? of(undefined) : from(result);\n\n          // Must not be an empty observable (otherwise forkJoin would complete without waiting others)\n          return result$.pipe(take(1), defaultIfEmpty(undefined as void));\n        })\n      ).pipe(mapTo(undefined), defaultIfEmpty(undefined as void));\n    } else {\n      return of(undefined);\n    }\n  }\n\n  private presetPageTitleAndUrl(event: NavigationEnd): Observable<{ pageUrl: string }> {\n    const title$ = this.config.trackPageTitle\n      ? this.pageTitleProvider\n          .getCurrentPageTitle(event)\n          .pipe(tap(pageTitle => this.tracker.setDocumentTitle(pageTitle)))\n      : of(undefined);\n    const url$ = this.pageUrlProvider\n      .getCurrentPageUrl(event)\n      .pipe(tap(pageUrl => this.tracker.setCustomUrl(pageUrl)));\n\n    return combineLatest([title$, url$]).pipe(map(([_, pageUrl]) => ({ pageUrl })));\n  }\n\n  private trackPageView(pageUrl: string): void {\n    this.tracker.trackPageView();\n\n    if (this.config.enableLinkTracking) {\n      this.tracker.enableLinkTracking(true);\n    }\n\n    // Set referrer for next page view\n    this.tracker.setReferrerUrl(pageUrl);\n  }\n}\n","import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\nimport {\n  MATOMO_ROUTER_CONFIGURATION,\n  MatomoRouterConfigurationWithInterceptors,\n} from './configuration';\nimport { provideInterceptors } from './interceptor';\nimport { MatomoRouter } from './matomo-router.service';\n\n@NgModule()\nexport class NgxMatomoRouterModule {\n  constructor(\n    private readonly router: MatomoRouter,\n    @Optional() @SkipSelf() parent?: NgxMatomoRouterModule\n  ) {\n    if (!parent) {\n      // Do not initialize if it is already (by a parent module)\n      this.router.init();\n    }\n  }\n\n  static forRoot({\n    interceptors,\n    ...config\n  }: MatomoRouterConfigurationWithInterceptors = {}): ModuleWithProviders<NgxMatomoRouterModule> {\n    return {\n      ngModule: NgxMatomoRouterModule,\n      providers: [\n        { provide: MATOMO_ROUTER_CONFIGURATION, useValue: config },\n        provideInterceptors(interceptors),\n      ],\n    };\n  }\n}\n","import { ActivatedRouteSnapshot } from '@angular/router';\n\nfunction findChildRoute(\n  route: ActivatedRouteSnapshot,\n  outlet: string\n): ActivatedRouteSnapshot | undefined {\n  return route.children.find(child => child.outlet === outlet);\n}\n\nexport function getLeafRoute(\n  route: ActivatedRouteSnapshot,\n  outlet: string\n): ActivatedRouteSnapshot {\n  const child = findChildRoute(route, outlet);\n\n  return child ? getLeafRoute(child, outlet) : route;\n}\n","import { ActivatedRouteSnapshot, NavigationEnd, PRIMARY_OUTLET, Router } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { MatomoRouterInterceptor } from '../interceptor';\nimport { getLeafRoute } from './route-utils';\n\n/**\n * Simple interceptor base looking into route's data for tracking\n *\n * @see MatomoRouteDataInterceptor\n */\nexport abstract class MatomoRouteInterceptorBase<D> implements MatomoRouterInterceptor {\n  protected constructor(protected readonly router: Router) {}\n\n  beforePageTrack(event: NavigationEnd): Observable<void> | Promise<void> | void {\n    const route = this.getRoute(event);\n    const data = this.extractRouteData(route);\n\n    return this.processRouteData(data);\n  }\n\n  protected getRoute(event: NavigationEnd): ActivatedRouteSnapshot {\n    return getLeafRoute(this.router.routerState.snapshot.root, PRIMARY_OUTLET);\n  }\n\n  protected abstract extractRouteData(route: ActivatedRouteSnapshot): D;\n\n  protected abstract processRouteData(data: D): Observable<void> | Promise<void> | void;\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, Router } from '@angular/router';\nimport { MatomoECommerceView, MatomoTracker } from '@ngx-matomo/tracker';\nimport { Observable } from 'rxjs';\nimport { MatomoRouteInterceptorBase } from './route-interceptor-base';\n\nexport const DEFAULT_DATA_KEY = 'matomo';\n\nexport interface MatomoRouteData {\n  title?: string;\n  ecommerce?: MatomoECommerceView;\n}\n\n/**\n * Simple interceptor looking at 'matomo' key of route's data for tracking.\n *\n * It is possible to extend this class or {@link MatomoRouteInterceptorBase}\n * for custom behavior (to use another data key, etc.)\n *\n * @example\n * // Using provided MatomoRouteDataInterceptor (looks into 'matomo' data key)\n * const routes: Routes = [\n *   {\n *     path: '/hello',\n *     component: HelloComponent,\n *     data: {\n *       matomo: {\n *         title: 'Page title',\n *       } as MatomoRouteData\n *     }\n *   },\n * ];\n *\n * NgxMatomoRouterModule.forRoot({\n *   interceptors: [MatomoRouteDataInterceptor],\n * }),\n *\n * @example\n * // Using custom 'myCustomAnalyticsKey' data key\n * const routes: Routes = [\n *   {\n *     path: '/hello',\n *     component: HelloComponent,\n *     data: {\n *       myCustomAnalyticsKey: {\n *         title: 'Page title',\n *       } as MatomoRouteData\n *     }\n *   },\n * ];\n *\n * @Injectable()\n * export class MyCustomInterceptor extends MatomoRouteDataInterceptor {\n *   readonly dataKey = 'myCustomAnalyticsKey';\n * }\n *\n * NgxMatomoRouterModule.forRoot({\n *   interceptors: [MyCustomInterceptor],\n * }),\n *\n * @see MatomoRouteInterceptorBase\n */\n@Injectable()\nexport class MatomoRouteDataInterceptor extends MatomoRouteInterceptorBase<\n  MatomoRouteData | undefined\n> {\n  protected readonly dataKey: string = DEFAULT_DATA_KEY;\n\n  constructor(protected readonly tracker: MatomoTracker, router: Router) {\n    super(router);\n  }\n\n  protected extractRouteData(route: ActivatedRouteSnapshot): MatomoRouteData | undefined {\n    return route.data[this.dataKey];\n  }\n\n  protected processRouteData(\n    data: MatomoRouteData | undefined\n  ): Observable<void> | Promise<void> | void {\n    if (!data) {\n      return;\n    }\n\n    if (data.title) {\n      this.tracker.setDocumentTitle(data.title);\n    }\n\n    if (data.ecommerce) {\n      this.tracker.setEcommerceView(data.ecommerce);\n    }\n  }\n}\n","/*\n * Public API Surface of router\n */\n\nexport { NgxMatomoRouterModule } from './lib/ngx-matomo-router.module';\nexport {\n  MatomoRouterConfiguration,\n  MATOMO_ROUTER_CONFIGURATION,\n  ExclusionConfig,\n  MatomoRouterConfigurationWithInterceptors,\n} from './lib/configuration';\nexport { PageTitleProvider, MATOMO_PAGE_TITLE_PROVIDER } from './lib/page-title-providers';\nexport { PageUrlProvider, MATOMO_PAGE_URL_PROVIDER } from './lib/page-url-provider';\nexport {\n  MatomoRouterInterceptor,\n  MATOMO_ROUTER_INTERCEPTORS,\n  provideInterceptor,\n  provideInterceptors,\n} from './lib/interceptor';\nexport { MatomoRouteInterceptorBase } from './lib/interceptors/route-interceptor-base';\nexport {\n  MatomoRouteData,\n  MatomoRouteDataInterceptor,\n} from './lib/interceptors/route-data-interceptor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.MatomoRouter","i1","i2"],"mappings":";;;;;;;;;;;;MAIa,2BAA2B,GAAG,IAAI,cAAc,CAC3D,6BAA6B,EAC7B;AAmDK,MAAM,4BAA4B,GAAwC;AAC/E,IAAA,eAAe,EAAE,IAAI;AACrB,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,OAAO,EAAE,EAAE;CACZ,CAAC;AASK,MAAM,6BAA6B,GAAG,IAAI,cAAc,CAC7D,+BAA+B,EAC/B;IACE,OAAO,EAAE,MAAK;QACZ,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC;AAC/E,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAEnF,QAAA,OAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAY,4BAA4B,CAAK,EAAA,YAAY,KAAE,kBAAkB,EAAE,QAAQ,EAAG,CAAA,CAAA;KAC3F;AACF,CAAA,CACF;;MC7EY,0BAA0B,GAAG,IAAI,cAAc,CAC1D,4BAA4B,EAC5B;AAYI,SAAU,kBAAkB,CAAC,IAAmC,EAAA;IACpE,OAAO;AACL,QAAA,OAAO,EAAE,0BAA0B;AACnC,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,QAAQ,EAAE,IAAI;KACf,CAAC;AACJ,CAAC;AAEK,SAAU,mBAAmB,CACjC,KAAkD,EAAA;IAElD,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AAED,IAAA,OAAO,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AACvC;;SClCgB,gCAAgC,GAAA;AAC9C,IAAA,OAAO,IAAI,KAAK,CACd,sGAAsG,CACvG,CAAC;AACJ;;ACCA;;;;AAIG;MACU,0BAA0B,GAAG,IAAI,cAAc,CAC1D,4BAA4B,EAC5B;IACE,OAAO,EAAE,MAAM,IAAI,wBAAwB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAA,EACD;MAWW,wBAAwB,CAAA;AACnC,IAAA,WAAA,CAA6B,KAAY,EAAA;AAAZ,QAAA,IAAK,CAAA,KAAA,GAAL,KAAK,CAAO;KAAI;AAE7C,IAAA,mBAAmB,CAAC,KAAoB,EAAA;QACtC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;KAClC;AACF;;MC1BY,wBAAwB,GAAG,IAAI,cAAc,CACxD,0BAA0B,EAC1B;IACE,OAAO,EAAE,MACP,IAAI,sBAAsB,CACxB,MAAM,CAAC,6BAA6B,CAAC,EACrC,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EACzC,MAAM,CAAC,gBAAgB,CAAC,CACzB;AACJ,CAAA,EACD;AAMF,SAAS,iBAAiB,CAAC,GAAW,EAAA;IACpC,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AACpD,CAAC;AAEM,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB,CAAA;AACjC,IAAA,WAAA,CAGmB,MAAmC,EACA,QAAuB,EAC1D,gBAAkC,EAAA;AAFlC,QAAA,IAAM,CAAA,MAAA,GAAN,MAAM,CAA6B;AACA,QAAA,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAe;AAC1D,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;KACjD;AAEJ,IAAA,iBAAiB,CAAC,KAAoB,EAAA;AACpC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe;cACnC,IAAI,CAAC,+BAA+B,EAAE,GAAG,KAAK,CAAC,iBAAiB;AAClE,cAAE,KAAK,CAAC,iBAAiB,CAAC;AAE5B,QAAA,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;KAChB;IAEO,+BAA+B,GAAA;;AACrC,QAAA,OAAO,iBAAiB,CAAC,CAAA,EAAA,GAAA,IAAI,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC,CAAC;KACvF;CACF,CAAA;AApBY,sBAAsB,GAAA,UAAA,CAAA;AAE9B,IAAA,OAAA,CAAA,CAAA,EAAA,QAAQ,EAAE,CAAA;AACV,IAAA,OAAA,CAAA,CAAA,EAAA,MAAM,CAAC,6BAA6B,CAAC,CAAA;AAErC,IAAA,OAAA,CAAA,CAAA,EAAA,QAAQ,EAAE,CAAA;AAAE,IAAA,OAAA,CAAA,CAAA,EAAA,MAAM,CAAC,aAAa,CAAC,CAAA;CALzB,EAAA,sBAAsB,CAoBlC;;ACZD,SAAS,eAAe,CAAC,KAAY,EAAA;IACnC,OAAO,KAAK,YAAY,aAAa,CAAC;AACxC,CAAC;AAED,SAAS,YAAY,CAAC,KAAsB,EAAA;AAC1C,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AAC/D,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAyC,EAAA;IAClE,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;IAED,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,aAAa,CAAC,aAA8B,EAAA;AACnD,IAAA,MAAM,UAAU,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAEpD,OAAO,CAAC,KAAoB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7F,CAAC;MAGY,YAAY,CAAA;IACvB,WACmB,CAAA,MAAc,EAEd,MAAmC,EAEnC,iBAAoC,EAEpC,eAAgC,EAChC,OAAsB,EAGtB,YAA8C,EAAA;AAV9C,QAAA,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;AAEd,QAAA,IAAM,CAAA,MAAA,GAAN,MAAM,CAA6B;AAEnC,QAAA,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB,CAAmB;AAEpC,QAAA,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;AAChC,QAAA,IAAO,CAAA,OAAA,GAAP,OAAO,CAAe;AAGtB,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAkC;QAE/D,IAAI,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;YAChD,MAAM,gCAAgC,EAAE,CAAC;AAC1C,SAAA;KACF;IAED,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;;YAExB,OAAO;AACR,SAAA;QAED,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjE,IAAI,CAAC,MAAM,CAAC,MAAM;aACf,IAAI;;QAEH,MAAM,CAAC,eAAe,CAAC;;QAEvB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;;QAE1C,uBAAuB,CAAC,mBAAmB,CAAC;;QAE5C,OAAO;;AAEP,QAAA,SAAS,CAAC,KAAK,IACb,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CACnF;;AAED,QAAA,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAC3B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAC1E,CACF;AACA,aAAA,SAAS,EAAE,CAAC;KAChB;AAEO,IAAA,gBAAgB,CAAC,KAAoB,EAAA;QAC3C,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,OAAO,QAAQ,CACb,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,IAAG;gBAClC,MAAM,MAAM,GAAG,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;AAClD,gBAAA,MAAM,OAAO,GAAG,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;;AAG9D,gBAAA,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,SAAiB,CAAC,CAAC,CAAC;AAClE,aAAC,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,SAAiB,CAAC,CAAC,CAAC;AAC7D,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACtB,SAAA;KACF;AAEO,IAAA,qBAAqB,CAAC,KAAoB,EAAA;AAChD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc;cACrC,IAAI,CAAC,iBAAiB;iBACnB,mBAAmB,CAAC,KAAK,CAAC;AAC1B,iBAAA,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;AACrE,cAAE,EAAE,CAAC,SAAS,CAAC,CAAC;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe;aAC9B,iBAAiB,CAAC,KAAK,CAAC;AACxB,aAAA,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAE5D,QAAA,OAAO,aAAa,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;KACjF;AAEO,IAAA,aAAa,CAAC,OAAe,EAAA;AACnC,QAAA,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;AAE7B,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;AAClC,YAAA,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AACvC,SAAA;;AAGD,QAAA,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;KACtC;;AAxFU,YAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,wCAGb,6BAA6B,EAAA,EAAA,EAAA,KAAA,EAE7B,0BAA0B,EAE1B,EAAA,EAAA,KAAA,EAAA,wBAAwB,0CAIxB,0BAA0B,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAXzB,YAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cADC,MAAM,EAAA,CAAA,CAAA;2FACnB,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;8BAI7B,MAAM;+BAAC,6BAA6B,CAAA;;8BAEpC,MAAM;+BAAC,0BAA0B,CAAA;;8BAEjC,MAAM;+BAAC,wBAAwB,CAAA;;8BAG/B,QAAQ;;8BACR,MAAM;+BAAC,0BAA0B,CAAA;;;;MC3DzB,qBAAqB,CAAA;IAChC,WACmB,CAAA,MAAoB,EACb,MAA8B,EAAA;AADrC,QAAA,IAAM,CAAA,MAAA,GAAN,MAAM,CAAc;QAGrC,IAAI,CAAC,MAAM,EAAE;;AAEX,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACpB,SAAA;KACF;AAED,IAAA,OAAO,OAAO,CAAC,EAAA,GAGgC,EAAE,EAAA;AAHlC,QAAA,IAAA,EACb,YAAY,EAEmC,GAAA,EAAA,EAD5C,MAAM,GAAA,MAAA,CAAA,EAAA,EAFI,gBAEJ,CAAA,CAAA;QAET,OAAO;AACL,YAAA,QAAQ,EAAE,qBAAqB;AAC/B,YAAA,SAAS,EAAE;AACT,gBAAA,EAAE,OAAO,EAAE,2BAA2B,EAAE,QAAQ,EAAE,MAAM,EAAE;gBAC1D,mBAAmB,CAAC,YAAY,CAAC;AAClC,aAAA;SACF,CAAC;KACH;;kHAtBU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;mHAArB,qBAAqB,EAAA,CAAA,CAAA;mHAArB,qBAAqB,EAAA,CAAA,CAAA;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,QAAQ;;;8BAIJ,QAAQ;;8BAAI,QAAQ;;;;ACVzB,SAAS,cAAc,CACrB,KAA6B,EAC7B,MAAc,EAAA;AAEd,IAAA,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;AAC/D,CAAC;AAEe,SAAA,YAAY,CAC1B,KAA6B,EAC7B,MAAc,EAAA;IAEd,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAE5C,IAAA,OAAO,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;AACrD;;ACXA;;;;AAIG;MACmB,0BAA0B,CAAA;AAC9C,IAAA,WAAA,CAAyC,MAAc,EAAA;AAAd,QAAA,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KAAI;AAE3D,IAAA,eAAe,CAAC,KAAoB,EAAA;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAE1C,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;KACpC;AAES,IAAA,QAAQ,CAAC,KAAoB,EAAA;AACrC,QAAA,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;KAC5E;AAKF;;ACrBM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAOzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDG;AAEG,MAAO,0BAA2B,SAAQ,0BAE/C,CAAA;IAGC,WAA+B,CAAA,OAAsB,EAAE,MAAc,EAAA;QACnE,KAAK,CAAC,MAAM,CAAC,CAAC;AADe,QAAA,IAAO,CAAA,OAAA,GAAP,OAAO,CAAe;AAFlC,QAAA,IAAO,CAAA,OAAA,GAAW,gBAAgB,CAAC;KAIrD;AAES,IAAA,gBAAgB,CAAC,KAA6B,EAAA;QACtD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KACjC;AAES,IAAA,gBAAgB,CACxB,IAAiC,EAAA;QAEjC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;AACR,SAAA;QAED,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3C,SAAA;QAED,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/C,SAAA;KACF;;uHA3BU,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;2HAA1B,0BAA0B,EAAA,CAAA,CAAA;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC,UAAU;;;AC9DX;;AAEG;;ACFH;;AAEG;;;;"}