{"version":3,"file":"index.cjs","sources":["../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/reducer.ts","../src/lib/utils.ts","../src/lib/tiling-plugin.ts","../src/lib/index.ts"],"sourcesContent":["import { PluginManifest } from '@embedpdf/core';\n\nimport { TilingPluginConfig } from './types';\n\nexport const TILING_PLUGIN_ID = 'tiling';\n\nexport const manifest: PluginManifest<TilingPluginConfig> = {\n  id: TILING_PLUGIN_ID,\n  name: 'Tiling Plugin',\n  version: '1.0.0',\n  provides: ['tiling'],\n  requires: ['render', 'scroll', 'viewport'],\n  optional: [],\n  defaultConfig: {\n    tileSize: 768,\n    overlapPx: 2.5,\n    extraRings: 0,\n  },\n};\n","import { Action } from '@embedpdf/core';\nimport { Tile, TileStatus, TilingDocumentState } from './types';\n\nexport const INIT_TILING_STATE = 'TILING/INIT_STATE';\nexport const CLEANUP_TILING_STATE = 'TILING/CLEANUP_STATE';\nexport const UPDATE_VISIBLE_TILES = 'TILING/UPDATE_VISIBLE_TILES';\nexport const MARK_TILE_STATUS = 'TILING/MARK_TILE_STATUS';\n\nexport interface InitTilingStateAction extends Action {\n  type: typeof INIT_TILING_STATE;\n  payload: {\n    documentId: string;\n    state: TilingDocumentState;\n  };\n}\n\nexport interface CleanupTilingStateAction extends Action {\n  type: typeof CLEANUP_TILING_STATE;\n  payload: string; // documentId\n}\n\nexport type UpdateVisibleTilesAction = {\n  type: typeof UPDATE_VISIBLE_TILES;\n  payload: {\n    documentId: string;\n    tiles: Record<number, Tile[]>;\n  };\n};\n\nexport type MarkTileStatusAction = {\n  type: typeof MARK_TILE_STATUS;\n  payload: {\n    documentId: string;\n    pageIndex: number;\n    tileId: string;\n    status: TileStatus;\n  };\n};\n\nexport type TilingAction =\n  | InitTilingStateAction\n  | CleanupTilingStateAction\n  | UpdateVisibleTilesAction\n  | MarkTileStatusAction;\n\nexport const initTilingState = (\n  documentId: string,\n  state: TilingDocumentState,\n): InitTilingStateAction => ({\n  type: INIT_TILING_STATE,\n  payload: { documentId, state },\n});\n\nexport const cleanupTilingState = (documentId: string): CleanupTilingStateAction => ({\n  type: CLEANUP_TILING_STATE,\n  payload: documentId,\n});\n\nexport const updateVisibleTiles = (\n  documentId: string,\n  tiles: Record<number, Tile[]>,\n): UpdateVisibleTilesAction => ({\n  type: UPDATE_VISIBLE_TILES,\n  payload: { documentId, tiles },\n});\n\nexport const markTileStatus = (\n  documentId: string,\n  pageIndex: number,\n  tileId: string,\n  status: TileStatus,\n): MarkTileStatusAction => ({\n  type: MARK_TILE_STATUS,\n  payload: { documentId, pageIndex, tileId, status },\n});\n","import { Reducer } from '@embedpdf/core';\n\nimport {\n  UPDATE_VISIBLE_TILES,\n  MARK_TILE_STATUS,\n  TilingAction,\n  INIT_TILING_STATE,\n  CLEANUP_TILING_STATE,\n} from './actions';\nimport { Tile, TilingDocumentState, TilingState } from './types';\n\nexport const initialTilingDocumentState: TilingDocumentState = {\n  visibleTiles: {},\n};\n\nexport const initialState: TilingState = {\n  documents: {},\n};\n\nexport const tilingReducer: Reducer<TilingState, TilingAction> = (state, action) => {\n  switch (action.type) {\n    case INIT_TILING_STATE: {\n      const { documentId, state: docState } = action.payload;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: docState,\n        },\n      };\n    }\n\n    case CLEANUP_TILING_STATE: {\n      const documentId = action.payload;\n      const { [documentId]: removed, ...remaining } = state.documents;\n      return {\n        ...state,\n        documents: remaining,\n      };\n    }\n\n    case UPDATE_VISIBLE_TILES: {\n      const { documentId, tiles: incoming } = action.payload; // Record<number, Tile[]>\n      const docState = state.documents[documentId];\n      if (!docState) return state;\n\n      const nextPages = { ...docState.visibleTiles };\n\n      for (const key in incoming) {\n        const pageIndex = Number(key);\n        const newTiles = incoming[pageIndex]; // all isFallback=false\n        const prevTiles = nextPages[pageIndex] ?? [];\n\n        const prevScale = prevTiles.find((t) => !t.isFallback)?.srcScale;\n        const newScale = newTiles.length > 0 ? newTiles[0].srcScale : prevScale;\n        const zoomChanged = prevScale !== undefined && prevScale !== newScale;\n\n        if (zoomChanged) {\n          /* 1️⃣  ready tiles from the old zoom → new fallback */\n          const promoted = prevTiles\n            .filter((t) => !t.isFallback && t.status === 'ready')\n            .map((t) => ({ ...t, isFallback: true }));\n\n          /* 2️⃣  decide which fallback tiles to keep           */\n          const fallbackToCarry = promoted.length > 0 ? [] : prevTiles.filter((t) => t.isFallback);\n\n          /* 3️⃣  final list = (maybe-kept fallback) + promoted + newTiles */\n          nextPages[pageIndex] = [...fallbackToCarry, ...promoted, ...newTiles];\n        } else {\n          /* same zoom → keep current fallback, replace visible */\n          const newIds = new Set(newTiles.map((t) => t.id));\n          const keepers: Tile[] = []; // where we’ll collect surviving tiles\n          const seenIds = new Set<string>();\n\n          /* 2️⃣  loop prevTiles once */\n          for (const t of prevTiles) {\n            if (t.isFallback) {\n              keepers.push(t); // always keep fallback\n              seenIds.add(t.id);\n            } else if (newIds.has(t.id)) {\n              keepers.push(t); // keep old visible tile (preserves status)\n              seenIds.add(t.id);\n            }\n          }\n\n          /* 3️⃣  append *brand-new* tiles (not yet kept) */\n          for (const t of newTiles) {\n            if (!seenIds.has(t.id)) keepers.push(t);\n          }\n\n          /* 4️⃣  store result */\n          nextPages[pageIndex] = keepers;\n        }\n      }\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            visibleTiles: nextPages,\n          },\n        },\n      };\n    }\n\n    case MARK_TILE_STATUS: {\n      const { documentId, pageIndex, tileId, status } = action.payload;\n      const docState = state.documents[documentId];\n      if (!docState) return state;\n\n      const tiles =\n        docState.visibleTiles[pageIndex]?.map((t) =>\n          t.id === tileId ? ({ ...t, status } as Tile) : t,\n        ) ?? [];\n\n      const newTiles = tiles.filter((t) => !t.isFallback);\n      const allReady = newTiles.length > 0 && newTiles.every((t) => t.status === 'ready');\n      const finalTiles = allReady ? newTiles : tiles;\n\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...docState,\n            visibleTiles: { ...docState.visibleTiles, [pageIndex]: finalTiles },\n          },\n        },\n      };\n    }\n\n    default:\n      return state;\n  }\n};\n","import { Rect, restoreRect, transformSize } from '@embedpdf/models';\nimport { CalculateTilesForPageOptions, Tile } from './types';\n\n/**\n * Build a grid where neighbouring tiles overlap by `overlapPx`\n * (screen pixels). Inner tiles keep the full `tileSize`, edge\n * tiles are clipped to the page bounds. All screen-space values\n * are rounded to **integers** to avoid sub-pixel seams.\n */\nexport function calculateTilesForPage({\n  tileSize = 768,\n  overlapPx = 2.5,\n  extraRings = 0,\n  scale,\n  rotation,\n  page,\n  metric,\n}: CalculateTilesForPageOptions): Tile[] {\n  /* ---- work in screen-pixel space -------------------------------- */\n  const pageW = page.size.width * scale; // px\n  const pageH = page.size.height * scale; // px\n\n  const step = tileSize - overlapPx; // shift between tiles\n\n  const containerSize = transformSize(page.size, rotation, scale);\n  const rotatedVisRect: Rect = {\n    origin: { x: metric.scaled.pageX, y: metric.scaled.pageY },\n    size: { width: metric.scaled.visibleWidth, height: metric.scaled.visibleHeight },\n  };\n  const unrotatedVisRect = restoreRect(containerSize, rotatedVisRect, rotation, 1);\n\n  const visLeft = unrotatedVisRect.origin.x;\n  const visTop = unrotatedVisRect.origin.y;\n  const visRight = visLeft + unrotatedVisRect.size.width;\n  const visBottom = visTop + unrotatedVisRect.size.height;\n\n  const maxCol = Math.floor((pageW - 1) / step);\n  const maxRow = Math.floor((pageH - 1) / step);\n\n  const startCol = Math.max(0, Math.floor(visLeft / step) - extraRings);\n  const endCol = Math.min(maxCol, Math.floor((visRight - 1) / step) + extraRings);\n  const startRow = Math.max(0, Math.floor(visTop / step) - extraRings);\n  const endRow = Math.min(maxRow, Math.floor((visBottom - 1) / step) + extraRings);\n\n  /* ---- build tiles ---------------------------------------------- */\n  const tiles: Tile[] = [];\n\n  for (let col = startCol; col <= endCol; col++) {\n    const xScreen = col * step; // px (integer)\n    const wScreen = Math.min(tileSize, pageW - xScreen); // px (≤  tileSize)\n\n    const xPage = xScreen / scale; // pt (may be frac.)\n    const wPage = wScreen / scale; // pt\n\n    for (let row = startRow; row <= endRow; row++) {\n      const yScreen = row * step;\n      const hScreen = Math.min(tileSize, pageH - yScreen);\n\n      const yPage = yScreen / scale;\n      const hPage = hScreen / scale;\n\n      tiles.push({\n        id: `p${page.index}-${scale}-x${xScreen}-y${yScreen}-w${wScreen}-h${hScreen}`,\n        col,\n        row,\n        pageRect: { origin: { x: xPage, y: yPage }, size: { width: wPage, height: hPage } },\n        screenRect: {\n          origin: { x: xScreen, y: yScreen },\n          size: { width: wScreen, height: hScreen },\n        },\n        status: 'queued',\n        srcScale: scale,\n        isFallback: false,\n      });\n    }\n  }\n\n  return tiles;\n}\n","import {\n  BasePlugin,\n  createBehaviorEmitter,\n  Listener,\n  PluginRegistry,\n  REFRESH_PAGES,\n  RefreshPagesAction,\n} from '@embedpdf/core';\nimport { ignore } from '@embedpdf/models';\nimport { RenderCapability, RenderPlugin } from '@embedpdf/plugin-render';\nimport {\n  ScrollCapability,\n  ScrollMetrics,\n  ScrollPlugin,\n  ScrollEvent,\n} from '@embedpdf/plugin-scroll';\nimport { ViewportCapability, ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nimport { initTilingState, cleanupTilingState, markTileStatus, updateVisibleTiles } from './actions';\nimport { initialTilingDocumentState } from './reducer';\nimport {\n  TilingPluginConfig,\n  TilingCapability,\n  Tile,\n  RenderTileOptions,\n  TilingState,\n  TilingEvent,\n  TilingScope,\n} from './types';\nimport { calculateTilesForPage } from './utils';\n\nexport class TilingPlugin extends BasePlugin<TilingPluginConfig, TilingCapability, TilingState> {\n  static readonly id = 'tiling' as const;\n\n  private readonly tileRendering$ = createBehaviorEmitter<TilingEvent>();\n\n  private config: TilingPluginConfig;\n  private renderCapability: RenderCapability;\n  private scrollCapability: ScrollCapability;\n  private viewportCapability: ViewportCapability;\n\n  constructor(id: string, registry: PluginRegistry, config: TilingPluginConfig) {\n    super(id, registry);\n\n    this.config = config;\n\n    this.renderCapability = this.registry.getPlugin<RenderPlugin>('render')!.provides();\n    this.scrollCapability = this.registry.getPlugin<ScrollPlugin>('scroll')!.provides();\n    this.viewportCapability = this.registry.getPlugin<ViewportPlugin>('viewport')!.provides();\n\n    this.scrollCapability.onScroll(\n      (event: ScrollEvent) => this.calculateVisibleTiles(event.documentId, event.metrics),\n      {\n        mode: 'throttle',\n        wait: 50,\n        throttleMode: 'trailing',\n      },\n    );\n\n    this.coreStore.onAction(REFRESH_PAGES, (action) => this.recalculateTiles(action.payload));\n  }\n\n  protected override onDocumentLoadingStarted(documentId: string): void {\n    this.dispatch(initTilingState(documentId, initialTilingDocumentState));\n  }\n\n  protected override onDocumentClosed(documentId: string): void {\n    this.dispatch(cleanupTilingState(documentId));\n  }\n\n  protected override onScaleChanged(documentId: string): void {\n    this.recalculateTilesForDocument(documentId);\n  }\n\n  protected override onRotationChanged(documentId: string): void {\n    this.recalculateTilesForDocument(documentId);\n  }\n\n  private recalculateTilesForDocument(documentId: string): void {\n    const scrollScope = this.scrollCapability.forDocument(documentId);\n    const viewportScope = this.viewportCapability.forDocument(documentId);\n    const metrics = scrollScope.getMetrics(viewportScope.getMetrics());\n    this.calculateVisibleTiles(documentId, metrics);\n  }\n\n  async recalculateTiles(payload: RefreshPagesAction['payload']): Promise<void> {\n    const { documentId, pageIndexes } = payload;\n    const coreDoc = this.getCoreDocument(documentId);\n    if (!coreDoc || !coreDoc.document) return;\n\n    const scrollScope = this.scrollCapability.forDocument(documentId);\n    const viewportScope = this.viewportCapability.forDocument(documentId);\n    const currentMetrics = scrollScope.getMetrics(viewportScope.getMetrics());\n\n    // Recalculate tiles for refreshed pages with a new timestamp\n    const refreshedTiles: Record<number, Tile[]> = {};\n    const refreshTimestamp = Date.now();\n    const scale = coreDoc.scale;\n\n    for (const pageIndex of pageIndexes) {\n      const metric = currentMetrics.pageVisibilityMetrics.find(\n        (m) => m.pageNumber === pageIndex + 1,\n      );\n      if (!metric) continue;\n\n      const page = coreDoc.document.pages[pageIndex];\n      if (!page) continue;\n\n      // Calculate effective rotation for this page (page intrinsic + document rotation)\n      const effectiveRotation = ((page.rotation ?? 0) + coreDoc.rotation) % 4;\n\n      refreshedTiles[pageIndex] = calculateTilesForPage({\n        page,\n        metric,\n        scale,\n        rotation: effectiveRotation,\n        tileSize: this.config.tileSize,\n        overlapPx: this.config.overlapPx,\n        extraRings: this.config.extraRings,\n      }).map((tile) => ({\n        ...tile,\n        id: `${tile.id}-r${refreshTimestamp}`, // Add refresh token to force new render\n      }));\n    }\n\n    if (Object.keys(refreshedTiles).length > 0) {\n      this.dispatch(updateVisibleTiles(documentId, refreshedTiles));\n    }\n  }\n\n  async initialize(): Promise<void> {\n    // Fetch dependencies from the registry if needed\n  }\n\n  private calculateVisibleTiles(documentId: string, scrollMetrics: ScrollMetrics): void {\n    const coreDoc = this.getCoreDocument(documentId);\n    if (!coreDoc || !coreDoc.document) return;\n\n    const scale = coreDoc.scale;\n    const visibleTiles: { [pageIndex: number]: Tile[] } = {};\n\n    for (const scrollMetric of scrollMetrics.pageVisibilityMetrics) {\n      const pageIndex = scrollMetric.pageNumber - 1; // Convert to 0-based index\n      const page = coreDoc.document.pages[pageIndex];\n      if (!page) continue;\n\n      // Calculate effective rotation for this page (page intrinsic + document rotation)\n      const effectiveRotation = ((page.rotation ?? 0) + coreDoc.rotation) % 4;\n\n      // Calculate tiles for the page using the utility function\n      const tiles = calculateTilesForPage({\n        page,\n        metric: scrollMetric,\n        scale,\n        rotation: effectiveRotation,\n        tileSize: this.config.tileSize,\n        overlapPx: this.config.overlapPx,\n        extraRings: this.config.extraRings,\n      });\n\n      visibleTiles[pageIndex] = tiles;\n    }\n\n    this.dispatch(updateVisibleTiles(documentId, visibleTiles));\n  }\n\n  override onStoreUpdated(prevState: TilingState, newState: TilingState): void {\n    for (const documentId in newState.documents) {\n      const prevDoc = prevState.documents[documentId];\n      const newDoc = newState.documents[documentId];\n      if (prevDoc !== newDoc) {\n        this.tileRendering$.emit({ documentId, tiles: newDoc.visibleTiles });\n      }\n    }\n  }\n\n  protected buildCapability(): TilingCapability {\n    return {\n      renderTile: this.renderTile.bind(this),\n      forDocument: this.createTilingScope.bind(this),\n      onTileRendering: this.tileRendering$.on,\n    };\n  }\n\n  private createTilingScope(documentId: string): TilingScope {\n    return {\n      renderTile: (options) => this.renderTile(options, documentId),\n      onTileRendering: (listener: Listener<Record<number, Tile[]>>) =>\n        this.tileRendering$.on((event) => {\n          if (event.documentId === documentId) listener(event.tiles);\n        }),\n    };\n  }\n\n  private renderTile(options: RenderTileOptions, documentId?: string) {\n    const id = documentId ?? this.getActiveDocumentId();\n    if (!this.renderCapability) {\n      throw new Error('Render capability not available.');\n    }\n\n    this.dispatch(markTileStatus(id, options.pageIndex, options.tile.id, 'rendering'));\n\n    const task = this.renderCapability.forDocument(id).renderPageRect({\n      pageIndex: options.pageIndex,\n      rect: options.tile.pageRect,\n      options: {\n        scaleFactor: options.tile.srcScale,\n        dpr: options.dpr,\n        ...(options.imageType || this.config.defaultImageType\n          ? { imageType: options.imageType ?? this.config.defaultImageType }\n          : {}),\n      },\n    });\n\n    task.wait(() => {\n      this.dispatch(markTileStatus(id, options.pageIndex, options.tile.id, 'ready'));\n    }, ignore);\n\n    return task;\n  }\n}\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { TilingAction } from './actions';\nimport { manifest, TILING_PLUGIN_ID } from './manifest';\nimport { initialState, tilingReducer } from './reducer';\nimport { TilingPlugin } from './tiling-plugin';\nimport { TilingPluginConfig, TilingState } from './types';\n\nexport const TilingPluginPackage: PluginPackage<\n  TilingPlugin,\n  TilingPluginConfig,\n  TilingState,\n  TilingAction\n> = {\n  manifest,\n  create: (registry, config) => new TilingPlugin(TILING_PLUGIN_ID, registry, config),\n  reducer: (state, action) => tilingReducer(state, action),\n  initialState,\n};\n\nexport * from './tiling-plugin';\nexport * from './types';\nexport * from './manifest';\n"],"names":["TILING_PLUGIN_ID","manifest","id","name","version","provides","requires","optional","defaultConfig","tileSize","overlapPx","extraRings","INIT_TILING_STATE","CLEANUP_TILING_STATE","UPDATE_VISIBLE_TILES","MARK_TILE_STATUS","updateVisibleTiles","documentId","tiles","type","payload","markTileStatus","pageIndex","tileId","status","initialTilingDocumentState","visibleTiles","calculateTilesForPage","scale","rotation","page","metric","pageW","size","width","pageH","height","step","containerSize","transformSize","rotatedVisRect","origin","x","scaled","pageX","y","pageY","visibleWidth","visibleHeight","unrotatedVisRect","restoreRect","visLeft","visTop","visRight","visBottom","maxCol","Math","floor","maxRow","startCol","max","endCol","min","startRow","endRow","col","xScreen","wScreen","xPage","wPage","row","yScreen","hScreen","yPage","hPage","push","index","pageRect","screenRect","srcScale","isFallback","_TilingPlugin","BasePlugin","constructor","registry","config","super","this","tileRendering$","createBehaviorEmitter","renderCapability","getPlugin","scrollCapability","viewportCapability","onScroll","event","calculateVisibleTiles","metrics","mode","wait","throttleMode","coreStore","onAction","REFRESH_PAGES","action","recalculateTiles","onDocumentLoadingStarted","dispatch","state","initTilingState","onDocumentClosed","cleanupTilingState","onScaleChanged","recalculateTilesForDocument","onRotationChanged","scrollScope","forDocument","viewportScope","getMetrics","pageIndexes","coreDoc","getCoreDocument","document","currentMetrics","refreshedTiles","refreshTimestamp","Date","now","pageVisibilityMetrics","find","m","pageNumber","pages","effectiveRotation","map","tile","Object","keys","length","initialize","scrollMetrics","scrollMetric","onStoreUpdated","prevState","newState","documents","prevDoc","newDoc","emit","buildCapability","renderTile","bind","createTilingScope","onTileRendering","on","options","listener","getActiveDocumentId","Error","task","renderPageRect","rect","scaleFactor","dpr","imageType","defaultImageType","ignore","TilingPlugin","TilingPluginPackage","create","reducer","docState","removed","remaining","incoming","nextPages","key","Number","newTiles","prevTiles","prevScale","_a","t","newScale","promoted","filter","fallbackToCarry","newIds","Set","keepers","seenIds","has","add","_b","finalTiles","every","tilingReducer","initialState"],"mappings":"gJAIaA,EAAmB,SAEnBC,EAA+C,CAC1DC,GAAIF,EACJG,KAAM,gBACNC,QAAS,QACTC,SAAU,CAAC,UACXC,SAAU,CAAC,SAAU,SAAU,YAC/BC,SAAU,GACVC,cAAe,CACbC,SAAU,IACVC,UAAW,IACXC,WAAY,ICbHC,EAAoB,oBACpBC,EAAuB,uBACvBC,EAAuB,8BACvBC,EAAmB,0BAoDnBC,EAAqB,CAChCC,EACAC,KAAA,CAEAC,KAAML,EACNM,QAAS,CAAEH,aAAYC,WAGZG,EAAiB,CAC5BJ,EACAK,EACAC,EACAC,KAAA,CAEAL,KAAMJ,EACNK,QAAS,CAAEH,aAAYK,YAAWC,SAAQC,YC9D/BC,EAAkD,CAC7DC,aAAc,CAAA,GCHT,SAASC,GAAsBlB,SACpCA,EAAW,IAAAC,UACXA,EAAY,IAAAC,WACZA,EAAa,EAAAiB,MACbA,EAAAC,SACAA,EAAAC,KACAA,EAAAC,OACAA,IAGA,MAAMC,EAAQF,EAAKG,KAAKC,MAAQN,EAC1BO,EAAQL,EAAKG,KAAKG,OAASR,EAE3BS,EAAO5B,EAAWC,EAElB4B,EAAgBC,EAAAA,cAAcT,EAAKG,KAAMJ,EAAUD,GACnDY,EAAuB,CAC3BC,OAAQ,CAAEC,EAAGX,EAAOY,OAAOC,MAAOC,EAAGd,EAAOY,OAAOG,OACnDb,KAAM,CAAEC,MAAOH,EAAOY,OAAOI,aAAcX,OAAQL,EAAOY,OAAOK,gBAE7DC,EAAmBC,EAAAA,YAAYZ,EAAeE,EAAgBX,EAAU,GAExEsB,EAAUF,EAAiBR,OAAOC,EAClCU,EAASH,EAAiBR,OAAOI,EACjCQ,EAAWF,EAAUF,EAAiBhB,KAAKC,MAC3CoB,EAAYF,EAASH,EAAiBhB,KAAKG,OAE3CmB,EAASC,KAAKC,OAAOzB,EAAQ,GAAKK,GAClCqB,EAASF,KAAKC,OAAOtB,EAAQ,GAAKE,GAElCsB,EAAWH,KAAKI,IAAI,EAAGJ,KAAKC,MAAMN,EAAUd,GAAQ1B,GACpDkD,EAASL,KAAKM,IAAIP,EAAQC,KAAKC,OAAOJ,EAAW,GAAKhB,GAAQ1B,GAC9DoD,EAAWP,KAAKI,IAAI,EAAGJ,KAAKC,MAAML,EAASf,GAAQ1B,GACnDqD,EAASR,KAAKM,IAAIJ,EAAQF,KAAKC,OAAOH,EAAY,GAAKjB,GAAQ1B,GAG/DO,EAAgB,GAEtB,IAAA,IAAS+C,EAAMN,EAAUM,GAAOJ,EAAQI,IAAO,CAC7C,MAAMC,EAAUD,EAAM5B,EAChB8B,EAAUX,KAAKM,IAAIrD,EAAUuB,EAAQkC,GAErCE,EAAQF,EAAUtC,EAClByC,EAAQF,EAAUvC,EAExB,IAAA,IAAS0C,EAAMP,EAAUO,GAAON,EAAQM,IAAO,CAC7C,MAAMC,EAAUD,EAAMjC,EAChBmC,EAAUhB,KAAKM,IAAIrD,EAAU0B,EAAQoC,GAErCE,EAAQF,EAAU3C,EAClB8C,EAAQF,EAAU5C,EAExBV,EAAMyD,KAAK,CACTzE,GAAI,IAAI4B,EAAK8C,SAAShD,MAAUsC,MAAYK,MAAYJ,MAAYK,IACpEP,MACAK,MACAO,SAAU,CAAEpC,OAAQ,CAAEC,EAAG0B,EAAOvB,EAAG4B,GAASxC,KAAM,CAAEC,MAAOmC,EAAOjC,OAAQsC,IAC1EI,WAAY,CACVrC,OAAQ,CAAEC,EAAGwB,EAASrB,EAAG0B,GACzBtC,KAAM,CAAEC,MAAOiC,EAAS/B,OAAQoC,IAElChD,OAAQ,SACRuD,SAAUnD,EACVoD,YAAY,GAEhB,CACF,CAEA,OAAO9D,CACT,CC/CO,MAAM+D,EAAN,cAA2BC,EAAAA,WAUhC,WAAAC,CAAYjF,EAAYkF,EAA0BC,GAChDC,MAAMpF,EAAIkF,GARZG,KAAiBC,eAAiBC,0BAUhCF,KAAKF,OAASA,EAEdE,KAAKG,iBAAmBH,KAAKH,SAASO,UAAwB,UAAWtF,WACzEkF,KAAKK,iBAAmBL,KAAKH,SAASO,UAAwB,UAAWtF,WACzEkF,KAAKM,mBAAqBN,KAAKH,SAASO,UAA0B,YAAatF,WAE/EkF,KAAKK,iBAAiBE,SACnBC,GAAuBR,KAAKS,sBAAsBD,EAAM9E,WAAY8E,EAAME,SAC3E,CACEC,KAAM,WACNC,KAAM,GACNC,aAAc,aAIlBb,KAAKc,UAAUC,SAASC,gBAAgBC,GAAWjB,KAAKkB,iBAAiBD,EAAOpF,SAClF,CAEmB,wBAAAsF,CAAyBzF,GAC1CsE,KAAKoB,SHlBsB,EAC7B1F,EACA2F,KAAA,CAEAzF,KAAMP,EACNQ,QAAS,CAAEH,aAAY2F,WGaPC,CAAgB5F,EAAYQ,GAC5C,CAEmB,gBAAAqF,CAAiB7F,GAClCsE,KAAKoB,SHdyB,CAAC1F,IAAA,CACjCE,KAAMN,EACNO,QAASH,IGYO8F,CAAmB9F,GACnC,CAEmB,cAAA+F,CAAe/F,GAChCsE,KAAK0B,4BAA4BhG,EACnC,CAEmB,iBAAAiG,CAAkBjG,GACnCsE,KAAK0B,4BAA4BhG,EACnC,CAEQ,2BAAAgG,CAA4BhG,GAClC,MAAMkG,EAAc5B,KAAKK,iBAAiBwB,YAAYnG,GAChDoG,EAAgB9B,KAAKM,mBAAmBuB,YAAYnG,GACpDgF,EAAUkB,EAAYG,WAAWD,EAAcC,cACrD/B,KAAKS,sBAAsB/E,EAAYgF,EACzC,CAEA,sBAAMQ,CAAiBrF,GACrB,MAAMH,WAAEA,EAAAsG,YAAYA,GAAgBnG,EAC9BoG,EAAUjC,KAAKkC,gBAAgBxG,GACrC,IAAKuG,IAAYA,EAAQE,SAAU,OAEnC,MAAMP,EAAc5B,KAAKK,iBAAiBwB,YAAYnG,GAChDoG,EAAgB9B,KAAKM,mBAAmBuB,YAAYnG,GACpD0G,EAAiBR,EAAYG,WAAWD,EAAcC,cAGtDM,EAAyC,CAAA,EACzCC,EAAmBC,KAAKC,MACxBnG,EAAQ4F,EAAQ5F,MAEtB,IAAA,MAAWN,KAAaiG,EAAa,CACnC,MAAMxF,EAAS4F,EAAeK,sBAAsBC,KACjDC,GAAMA,EAAEC,aAAe7G,EAAY,GAEtC,IAAKS,EAAQ,SAEb,MAAMD,EAAO0F,EAAQE,SAASU,MAAM9G,GACpC,IAAKQ,EAAM,SAGX,MAAMuG,IAAsBvG,EAAKD,UAAY,GAAK2F,EAAQ3F,UAAY,EAEtE+F,EAAetG,GAAaK,EAAsB,CAChDG,OACAC,SACAH,QACAC,SAAUwG,EACV5H,SAAU8E,KAAKF,OAAO5E,SACtBC,UAAW6E,KAAKF,OAAO3E,UACvBC,WAAY4E,KAAKF,OAAO1E,aACvB2H,IAAKC,IAAA,IACHA,EACHrI,GAAI,GAAGqI,EAAKrI,OAAO2H,MAEvB,CAEIW,OAAOC,KAAKb,GAAgBc,OAAS,GACvCnD,KAAKoB,SAAS3F,EAAmBC,EAAY2G,GAEjD,CAEA,gBAAMe,GAEN,CAEQ,qBAAA3C,CAAsB/E,EAAoB2H,GAChD,MAAMpB,EAAUjC,KAAKkC,gBAAgBxG,GACrC,IAAKuG,IAAYA,EAAQE,SAAU,OAEnC,MAAM9F,EAAQ4F,EAAQ5F,MAChBF,EAAgD,CAAA,EAEtD,IAAA,MAAWmH,KAAgBD,EAAcZ,sBAAuB,CAC9D,MAAM1G,EAAYuH,EAAaV,WAAa,EACtCrG,EAAO0F,EAAQE,SAASU,MAAM9G,GACpC,IAAKQ,EAAM,SAGX,MAGMZ,EAAQS,EAAsB,CAClCG,OACAC,OAAQ8G,EACRjH,QACAC,WAP0BC,EAAKD,UAAY,GAAK2F,EAAQ3F,UAAY,EAQpEpB,SAAU8E,KAAKF,OAAO5E,SACtBC,UAAW6E,KAAKF,OAAO3E,UACvBC,WAAY4E,KAAKF,OAAO1E,aAG1Be,EAAaJ,GAAaJ,CAC5B,CAEAqE,KAAKoB,SAAS3F,EAAmBC,EAAYS,GAC/C,CAES,cAAAoH,CAAeC,EAAwBC,GAC9C,IAAA,MAAW/H,KAAc+H,EAASC,UAAW,CAC3C,MAAMC,EAAUH,EAAUE,UAAUhI,GAC9BkI,EAASH,EAASC,UAAUhI,GAC9BiI,IAAYC,GACd5D,KAAKC,eAAe4D,KAAK,CAAEnI,aAAYC,MAAOiI,EAAOzH,cAEzD,CACF,CAEU,eAAA2H,GACR,MAAO,CACLC,WAAY/D,KAAK+D,WAAWC,KAAKhE,MACjC6B,YAAa7B,KAAKiE,kBAAkBD,KAAKhE,MACzCkE,gBAAiBlE,KAAKC,eAAekE,GAEzC,CAEQ,iBAAAF,CAAkBvI,GACxB,MAAO,CACLqI,WAAaK,GAAYpE,KAAK+D,WAAWK,EAAS1I,GAClDwI,gBAAkBG,GAChBrE,KAAKC,eAAekE,GAAI3D,IAClBA,EAAM9E,aAAeA,GAAY2I,EAAS7D,EAAM7E,SAG5D,CAEQ,UAAAoI,CAAWK,EAA4B1I,GAC7C,MAAMf,EAAKe,GAAcsE,KAAKsE,sBAC9B,IAAKtE,KAAKG,iBACR,MAAM,IAAIoE,MAAM,oCAGlBvE,KAAKoB,SAAStF,EAAenB,EAAIyJ,EAAQrI,UAAWqI,EAAQpB,KAAKrI,GAAI,cAErE,MAAM6J,EAAOxE,KAAKG,iBAAiB0B,YAAYlH,GAAI8J,eAAe,CAChE1I,UAAWqI,EAAQrI,UACnB2I,KAAMN,EAAQpB,KAAK1D,SACnB8E,QAAS,CACPO,YAAaP,EAAQpB,KAAKxD,SAC1BoF,IAAKR,EAAQQ,OACTR,EAAQS,WAAa7E,KAAKF,OAAOgF,iBACjC,CAAED,UAAWT,EAAQS,WAAa7E,KAAKF,OAAOgF,kBAC9C,CAAA,KAQR,OAJAN,EAAK5D,KAAK,KACRZ,KAAKoB,SAAStF,EAAenB,EAAIyJ,EAAQrI,UAAWqI,EAAQpB,KAAKrI,GAAI,WACpEoK,EAAAA,QAEIP,CACT,GA3LA9E,EAAgB/E,GAAK,SADhB,IAAMqK,EAANtF,ECvBA,MAAMuF,EAKT,CACFvK,WACAwK,OAAQ,CAACrF,EAAUC,IAAW,IAAIkF,EAAavK,EAAkBoF,EAAUC,GAC3EqF,QAAS,CAAC9D,EAAOJ,IHG8C,EAACI,EAAOJ,aACvE,OAAQA,EAAOrF,MACb,KAAKP,EAAmB,CACtB,MAAMK,WAAEA,EAAY2F,MAAO+D,GAAanE,EAAOpF,QAC/C,MAAO,IACFwF,EACHqC,UAAW,IACNrC,EAAMqC,UACThI,CAACA,GAAa0J,GAGpB,CAEA,KAAK9J,EAAsB,CACzB,MAAMI,EAAauF,EAAOpF,SAClBH,CAACA,GAAa2J,KAAYC,GAAcjE,EAAMqC,UACtD,MAAO,IACFrC,EACHqC,UAAW4B,EAEf,CAEA,KAAK/J,EAAsB,CACzB,MAAMG,WAAEA,EAAYC,MAAO4J,GAAatE,EAAOpF,QACzCuJ,EAAW/D,EAAMqC,UAAUhI,GACjC,IAAK0J,EAAU,OAAO/D,EAEtB,MAAMmE,EAAY,IAAKJ,EAASjJ,cAEhC,IAAA,MAAWsJ,KAAOF,EAAU,CAC1B,MAAMxJ,EAAY2J,OAAOD,GACnBE,EAAWJ,EAASxJ,GACpB6J,EAAYJ,EAAUzJ,IAAc,GAEpC8J,EAAY,OAAAC,IAAUpD,KAAMqD,IAAOA,EAAEtG,kBAAzB,EAAAqG,EAAsCtG,SAClDwG,EAAWL,EAASxC,OAAS,EAAIwC,EAAS,GAAGnG,SAAWqG,EAG9D,QAFkC,IAAdA,GAA2BA,IAAcG,EAE5C,CAEf,MAAMC,EAAWL,EACdM,OAAQH,IAAOA,EAAEtG,YAA2B,UAAbsG,EAAE9J,QACjC8G,IAAKgD,IAAA,IAAYA,EAAGtG,YAAY,KAG7B0G,EAAkBF,EAAS9C,OAAS,EAAI,GAAKyC,EAAUM,OAAQH,GAAMA,EAAEtG,YAG7E+F,EAAUzJ,GAAa,IAAIoK,KAAoBF,KAAaN,EAC9D,KAAO,CAEL,MAAMS,EAAS,IAAIC,IAAIV,EAAS5C,IAAKgD,GAAMA,EAAEpL,KACvC2L,EAAkB,GAClBC,MAAcF,IAGpB,IAAA,MAAWN,KAAKH,GACVG,EAAEtG,YAGK2G,EAAOI,IAAIT,EAAEpL,OAFtB2L,EAAQlH,KAAK2G,GACbQ,EAAQE,IAAIV,EAAEpL,KAQlB,IAAA,MAAWoL,KAAKJ,EACTY,EAAQC,IAAIT,EAAEpL,KAAK2L,EAAQlH,KAAK2G,GAIvCP,EAAUzJ,GAAauK,CACzB,CACF,CAEA,MAAO,IACFjF,EACHqC,UAAW,IACNrC,EAAMqC,UACThI,CAACA,GAAa,IACT0J,EACHjJ,aAAcqJ,IAItB,CAEA,KAAKhK,EAAkB,CACrB,MAAME,WAAEA,EAAAK,UAAYA,EAAAC,OAAWA,EAAAC,OAAQA,GAAWgF,EAAOpF,QACnDuJ,EAAW/D,EAAMqC,UAAUhI,GACjC,IAAK0J,EAAU,OAAO/D,EAEtB,MAAM1F,GACJ,OAAA+K,EAAAtB,EAASjJ,aAAaJ,SAAtB,EAAA2K,EAAkC3D,IAAKgD,GACrCA,EAAEpL,KAAOqB,EAAU,IAAK+J,EAAG9J,UAAoB8J,KAC5C,GAEDJ,EAAWhK,EAAMuK,OAAQH,IAAOA,EAAEtG,YAElCkH,EADWhB,EAASxC,OAAS,GAAKwC,EAASiB,MAAOb,GAAmB,UAAbA,EAAE9J,QAClC0J,EAAWhK,EAEzC,MAAO,IACF0F,EACHqC,UAAW,IACNrC,EAAMqC,UACThI,CAACA,GAAa,IACT0J,EACHjJ,aAAc,IAAKiJ,EAASjJ,aAAcJ,CAACA,GAAY4K,KAI/D,CAEA,QACE,OAAOtF,IGtHiBwF,CAAcxF,EAAOJ,GACjD6F,aHFuC,CACvCpD,UAAW,CAAA"}