{"version":3,"file":"main.mjs","sources":["../../../../node_modules/@nessie/web-static/dist/scripts/p13n/registry.ts","../../../../node_modules/@nessie/web-static/dist/scripts/p13n/ocp-image.ts","../../../../node_modules/@nessie/web-static/dist/scripts/p13n/adapters/banner/image.ts","../../../../node_modules/@nessie/web-static/dist/scripts/p13n/adapters/banner/index.ts","../../../../node_modules/@nessie/web-static/dist/scripts/p13n/constants.ts","../../../../node_modules/@nessie/web-static/dist/scripts/p13n/cdp-observer.ts","../../../../node_modules/@nessie/web-static/dist/scripts/p13n/service.ts","../../../../node_modules/@nessie/web-static/dist/scripts/p13n/init.ts","../../../../src/layouts/BaseLayout.astro?astro&type=script&index=0&lang.ts"],"sourcesContent":["// Component adapter registry.\n//\n// The generic p13n core looks up an adapter by name (the element's\n// `data-p13n-component` attribute) to learn how to build a personalized node.\n// Register an adapter per component type — the core never references a concrete\n// component, so any component can be personalized by supplying an adapter.\n\nimport type { ComponentAdapter } from './types';\n\nconst adapters = new Map<string, ComponentAdapter>();\n\n/** Registers (or replaces) the adapter for a component name, e.g. 'nes-banner'. */\nexport const registerAdapter = (name: string, adapter: ComponentAdapter): void => {\n  adapters.set(name, adapter);\n};\n\n/** Returns the adapter registered for a component name, or undefined. */\nexport const getAdapter = (name: string): ComponentAdapter | undefined => adapters.get(name);\n","// OCP image primitives.\n//\n// URL template resolution, srcset building, and template validation.\n// Banner-specific responsive configuration lives in adapters/banner/image.ts.\n\n// ── OCP Crop Mapping ─────────────────────────────────────────────────────────\n// Maps aspect ratios to OCP crop names from CoreMedia\n\nexport const OCP_CROPS = {\n  '3:1': 'panorama_ratio3x1',\n  '2:1': 'landscape_ratio2x1',\n  '3:2': 'landscape_ratio3x2',\n} as const;\n\n/**\n * Builds a concrete image URL from an OCP URL template.\n *\n * @param urlTemplate - OCP URL with {cropName} and {width} placeholders (URL-encoded as %7B/%7D)\n * @param cropName - OCP crop name (e.g., 'landscape_ratio16x9')\n * @param width - Image width in pixels\n * @returns Concrete image URL\n *\n * @example\n * buildOcpImageUrl(\n *   'https://ocp.ns.nl/caas/v1/media/stable/123/data/%7BcropName%7D/%7Bwidth%7D/img.webp',\n *   'landscape_ratio2x1',\n *   960\n * )\n * // Returns: 'https://ocp.ns.nl/caas/v1/media/stable/123/data/landscape_ratio2x1/960/img.webp'\n */\nexport const buildOcpImageUrl = (\n  urlTemplate: string,\n  cropName: string,\n  width: number\n): string =>\n  urlTemplate\n    .replace('%7BcropName%7D', cropName)\n    .replace('%7Bwidth%7D', String(width))\n    // Also handle non-encoded placeholders for flexibility\n    .replace('{cropName}', cropName)\n    .replace('{width}', String(width));\n\n/**\n * Builds a srcset string from an OCP URL template.\n *\n * @param urlTemplate - OCP URL template\n * @param cropName - OCP crop name\n * @param widths - Array of widths to include\n * @returns srcset string (e.g., \"url1 320w, url2 640w\")\n */\nexport const buildSrcSet = (\n  urlTemplate: string,\n  cropName: string,\n  widths: readonly number[]\n): string =>\n  widths.map((w) => `${buildOcpImageUrl(urlTemplate, cropName, w)} ${w}w`).join(', ');\n\n/**\n * Validates that a URL is an OCP URL template with placeholders.\n *\n * @param url - URL to validate\n * @returns true if URL contains OCP placeholders\n */\nexport const isOcpUrlTemplate = (url: string): boolean =>\n  url.includes('%7BcropName%7D') ||\n  url.includes('%7Bwidth%7D') ||\n  url.includes('{cropName}') ||\n  url.includes('{width}');\n","// Banner image responsive configuration.\n//\n// Owns the banner presentation layer for OCP images: variant types (width,\n// container, heading level), responsive breakpoint configs, and the transform\n// that converts an OCP URL template into a NesBannerPicture ready for\n// <nes-banner>. The core OCP URL/srcset primitives live in `../../ocp-image`.\n\nimport type { NesBannerPicture } from '@nessie/webcomponents';\nimport type { BannerVariant, BannerWidth, BannerContainer } from './types';\nimport { OCP_CROPS, buildOcpImageUrl, buildSrcSet } from '../../ocp-image';\n\n/** BannerVariant — controlled by page author, not CDP */\n\ninterface ResponsiveBreakpoint {\n  media?: string;\n  crop: string;\n  widths: readonly number[];\n  sizes: (container: BannerContainer) => string;\n}\n\n// ── Container Max Widths ─────────────────────────────────────────────────────\n// From design tokens: nes-applied-container-max-width-*\n\nconst CONTAINER_MAX_WIDTH = {\n  default: '90rem', // 1440px\n  narrow: '67.5rem', // 1080px\n} as const;\n\n// ── Screen Breakpoints ───────────────────────────────────────────────────────\n// From design tokens: nes-core-screen-*\n\nconst SCREENS = {\n  sm: '30rem', // 480px\n  md: '48rem', // 768px\n  xl: '80rem', // 1280px\n} as const;\n\n// ── Responsive Configurations by Banner Width ────────────────────────────────\n/**\n * Responsive configurations per banner width variant.\n * Maps viewport breakpoints to OCP crop names and available widths.\n *\n * Based on:\n * - Banner CSS breakpoints from nes-banner.scss\n * - pictureSrc config in cms-frontend/src/components/Banner.astro\n * - OCP Responsive Image Settings from CoreMedia\n */\nconst BANNER_RESPONSIVE_CONFIGS: Record<BannerWidth, readonly ResponsiveBreakpoint[]> = {\n  // ── Full width banner ────────────────────────────────────────────────────\n  // Desktop: 69.25rem+ (1108px) — 3:1 panorama\n  // Tablet: 30rem+ (480px) — 2:1 landscape\n  // Mobile: fallback — 3:2 landscape\n  full: [\n    {\n      media: '(min-width: 69.25rem)',\n      crop: OCP_CROPS['3:1'],\n      widths: [1920, 1440, 960, 600],\n      sizes: (container) =>\n        container === 'default'\n          ? `(min-width: ${CONTAINER_MAX_WIDTH.default}) 58rem, 55vw`\n          : `(min-width: ${CONTAINER_MAX_WIDTH.narrow}) 42rem, 55vw`,\n    },\n    {\n      media: `(min-width: ${SCREENS.sm})`,\n      crop: OCP_CROPS['2:1'],\n      widths: [1280, 960, 640, 480],\n      sizes: () => '42vw',\n    },\n    {\n      crop: OCP_CROPS['3:2'],\n      widths: [960, 640, 480, 320],\n      sizes: () => '100vw',\n    },\n  ],\n\n  // ── Intro banner ─────────────────────────────────────────────────────────\n  // Desktop: 61.25rem+ (980px) — 2:1 landscape\n  // Tablet: 30rem+ (480px) — 2:1 landscape\n  // Mobile: fallback — 3:2 landscape\n  intro: [\n    {\n      media: '(min-width: 61.25rem)',\n      crop: OCP_CROPS['2:1'],\n      widths: [1280, 960, 640, 480, 320],\n      sizes: (container) =>\n        container === 'default'\n          ? `(min-width: ${CONTAINER_MAX_WIDTH.default}) 46rem, 43vw`\n          : `(min-width: ${CONTAINER_MAX_WIDTH.narrow}) 36rem, 43vw`,\n    },\n    {\n      media: `(min-width: ${SCREENS.sm})`,\n      crop: OCP_CROPS['2:1'],\n      widths: [1600, 1280, 960, 640, 480],\n      sizes: () => '85vw',\n    },\n    {\n      crop: OCP_CROPS['3:2'],\n      widths: [960, 640, 480, 320],\n      sizes: () => '100vw',\n    },\n  ],\n\n  // ── Half width banner ────────────────────────────────────────────────────\n  // Desktop: 80rem+ (1280px) — 2:1 landscape\n  // Tablet md: 48rem+ (768px) — 3:2 landscape\n  // Tablet sm: 30rem+ (480px) — 2:1 landscape\n  // Mobile: fallback — 3:2 landscape\n  half: [\n    {\n      media: `(min-width: ${SCREENS.xl})`,\n      crop: OCP_CROPS['2:1'],\n      widths: [640, 480, 320],\n      sizes: (container) =>\n        container === 'default'\n          ? `(min-width: ${CONTAINER_MAX_WIDTH.default}) 23rem, 21vw`\n          : `(min-width: ${CONTAINER_MAX_WIDTH.narrow}) 16rem, 21vw`,\n    },\n    {\n      media: `(min-width: ${SCREENS.md})`,\n      crop: OCP_CROPS['3:2'],\n      widths: [960, 640, 480, 320],\n      sizes: () => '42vw',\n    },\n    {\n      media: `(min-width: ${SCREENS.sm})`,\n      crop: OCP_CROPS['2:1'],\n      widths: [640, 480, 320, 240],\n      sizes: () => '42vw',\n    },\n    {\n      crop: OCP_CROPS['3:2'],\n      widths: [960, 640, 480, 320],\n      sizes: () => '100vw',\n    },\n  ],\n};\n\n/**\n * Transforms an OCP URL template into a NesBannerPicture object\n * with responsive srcsets for mobile, tablet, and desktop viewports.\n *\n * @param urlTemplate - OCP URL with {cropName} and {width} placeholders\n * @param alt - Alt text for the image\n * @param mimeType - MIME type for the image sources (defaults to 'image/webp')\n * @param variant - Banner variant with width and container (defaults to full/default)\n * @returns NesBannerPicture object ready for nes-banner component\n *\n * @example\n * transformOcpToPicture(\n *   'https://ocp.ns.nl/caas/v1/media/stable/123/data/%7BcropName%7D/%7Bwidth%7D/promo.webp',\n *   'Summer promotion banner',\n *   'image/webp',\n *   { width: 'half', container: 'narrow' }\n * )\n */\nexport const transformOcpToPicture = (\n  urlTemplate: string,\n  alt: string,\n  mimeType = 'image/webp',\n  variant: BannerVariant = {}\n): NesBannerPicture => {\n  const width = variant.width ?? 'full';\n  const container = variant.container ?? 'default';\n  const config = BANNER_RESPONSIVE_CONFIGS[width];\n\n  const sourceSet = config.map((breakpoint) => ({\n    ...(breakpoint.media && { media: breakpoint.media }),\n    srcset: buildSrcSet(urlTemplate, breakpoint.crop, breakpoint.widths),\n    sizes: breakpoint.sizes(container),\n    type: mimeType,\n  }));\n\n  // Use mobile config (last item) for fallback img src\n  const mobileConfig = config[config.length - 1];\n  const fallbackSrc = buildOcpImageUrl(\n    urlTemplate,\n    mobileConfig.crop,\n    mobileConfig.widths[mobileConfig.widths.length - 1] // smallest width\n  );\n\n  return {\n    sourceSet,\n    imgAttr: {\n      src: fallbackSrc,\n      alt,\n    },\n  };\n};\n","// Banner component adapter.\n//\n// Teaches the generic p13n core how to turn CDP `BannerData` into a personalized\n// `<a><nes-banner></a>` link. All banner specifics — property mapping, OCP image\n// transformation and image preloading — live here, so the core stays\n// component-agnostic. Registering this module wires the adapter to the\n// `nes-banner` component name.\n\nimport type { NesBannerPicture } from '@nessie/webcomponents/dist/types/components/nes-banner/nes-banner.interface';\nimport type {\n  BannerData,\n  BuildContext,\n  BuildResult,\n  ComponentAdapter,\n  OcpPictureData,\n} from '../../types';\nimport { registerAdapter } from '../../registry';\nimport { isOcpUrlTemplate } from '../../ocp-image';\nimport { transformOcpToPicture } from './image';\nimport type { BannerVariant } from './types';\n\n/** Component name this adapter handles (matches `data-p13n-component`). */\nexport const BANNER_COMPONENT = 'nes-banner';\n\n/**\n * Safety net (ms): if the personalized image hasn't loaded by this point, swap\n * the banner in anyway so the skeleton can't linger indefinitely.\n */\nconst SWAP_TIMEOUT = 2000;\n\n/**\n * Picks the responsive candidate the rendered `<picture>` will actually display\n * by matching each source's media query, falling back to the base `imgAttr.src`.\n */\nconst resolvePreloadSource = (\n  picture: NesBannerPicture\n): { src: string; srcset?: string; sizes?: string } => {\n  const canMatch = typeof window.matchMedia === 'function';\n  const match = picture.sourceSet?.find(\n    (source) => !source.media || (canMatch && window.matchMedia(source.media).matches)\n  );\n  return match\n    ? { src: picture.imgAttr.src, srcset: match.srcset, sizes: match.sizes }\n    : { src: picture.imgAttr.src };\n};\n\n/**\n * Warms the browser cache for the banner image, then runs `done` (synchronously\n * when the image is already cached). This keeps the SSR skeleton on screen until\n * the personalized image is ready, avoiding an empty frame between skeleton\n * teardown and the real banner painting on slow connections. A timeout\n * guarantees the swap happens even if the image stalls.\n */\nconst preloadImage = (picture: NesBannerPicture | undefined, done: () => void): void => {\n  const src = picture?.imgAttr?.src;\n  if (!picture || !src) {\n    done();\n    return;\n  }\n\n  let settled = false;\n  const finish = (): void => {\n    if (settled) return;\n    settled = true;\n    done();\n  };\n\n  const img = new window.Image();\n  const { srcset, sizes } = resolvePreloadSource(picture);\n  if (sizes) img.sizes = sizes;\n  if (srcset) img.srcset = srcset;\n  img.src = src;\n\n  if (img.complete) {\n    finish();\n    return;\n  }\n\n  img.addEventListener('load', finish, { once: true });\n  img.addEventListener('error', finish, { once: true });\n  window.setTimeout(finish, SWAP_TIMEOUT);\n};\n\nconst isOcpPictureData = (\n  picture?: NesBannerPicture | OcpPictureData\n): picture is OcpPictureData => {\n  return (picture as OcpPictureData)?.ocpPictureUrlTemplate !== undefined;\n};\n\n/** Resolves the banner picture: OCP URL template takes precedence over `picture`. */\nconst buildPicture = (\n  data: BannerData,\n  variant: BannerVariant\n): NesBannerPicture | undefined => {\n  if (isOcpPictureData(data.picture)) {\n    const ocpPictureUrlTemplate = data.picture.ocpPictureUrlTemplate;\n    if (ocpPictureUrlTemplate && isOcpUrlTemplate(ocpPictureUrlTemplate)) {\n      return transformOcpToPicture(\n        ocpPictureUrlTemplate,\n        data.picture.alt ?? '',\n        data.picture.mimeType,\n        variant\n      );\n    }\n  } else {\n    return data.picture;\n  }\n};\n\n/** Builds the personalized `<nes-banner>` from CDP data + author variant. */\nconst buildBanner = (\n  data: BannerData,\n  variant: BannerVariant,\n  picture: NesBannerPicture | undefined\n): HTMLElement => {\n  const banner = document.createElement('nes-banner');\n\n  if (variant.filled !== undefined) banner.filled = variant.filled;\n  if (variant.headingLevel !== undefined) banner.headingLevel = `h${variant.headingLevel}`;\n  if (variant.hover !== undefined) banner.hover = variant.hover;\n\n  if (data.description !== undefined) banner.description = data.description;\n  if (data.heading !== undefined) banner.heading = data.heading;\n  if (data.inverse !== undefined) banner.inverse = data.inverse;\n  if (data.objectFit !== undefined) banner.objectFit = data.objectFit;\n  if (data.price !== undefined) {\n    banner.price = {\n      amount: data.price.amount,\n      previousPrice: data.price.previousPrice,\n      leadingText: data.price.leadingText,\n      trailingText: data.price.trailingText,\n    };\n  }\n  if (data.sticker !== undefined) banner.sticker = data.sticker;\n\n  if (picture !== undefined) banner.picture = picture;\n\n  return banner;\n};\n\nconst build = ({ data, variant }: BuildContext<BannerData>): BuildResult | null => {\n  if (!data.href) {\n    console.warn(\n      '[p13n] BannerData.href is required but was not provided — keeping SSR fallback'\n    );\n    return null;\n  }\n\n  const bannerVariant = variant as BannerVariant;\n  const picture = buildPicture(data, bannerVariant);\n  const banner = buildBanner(data, bannerVariant, picture);\n\n  // The banner is a link: wrap the web component in a plain <a> carrying the\n  // href + analytics attributes.\n  // The web component owns its own layout, so the link needs no banner class.\n  const link = document.createElement('a');\n  link.className = 'nes-focus-ring-offset-lg';\n  link.setAttribute('href', data.href);\n  if (data.openInNewTab) {\n    link.setAttribute('target', '_blank');\n    link.setAttribute('rel', 'noopener noreferrer');\n  }\n  if (data.eventData !== undefined) {\n    link.setAttribute('data-nes-event', data.eventData);\n  }\n  link.appendChild(banner);\n\n  return {\n    element: link,\n    readyTarget: banner,\n    whenReady: (done) => preloadImage(picture, done),\n  };\n};\n\nexport const bannerAdapter: ComponentAdapter<BannerData> = { build };\n\nregisterAdapter(BANNER_COMPONENT, bannerAdapter);\n","// Generic, component-agnostic hooks shared by the p13n core and every component\n// adapter. Nothing here knows about a specific component — adapters supply their\n// own building/reveal logic and components supply their own loading visual.\n\n/** Marks an element that is still waiting for the CDP (showing its skeleton). */\nexport const LOADING_ATTR = 'data-p13n-loading';\n\n/** Identifies the personalization slot and is the lookup key for updates. */\nexport const P13N_ID_ATTR = 'data-p13n-id';\n\n/** Names the component adapter responsible for building the personalized node. */\nexport const P13N_COMPONENT_ATTR = 'data-p13n-component';\n\n/** Page-author-controlled, component-specific config (JSON), e.g. banner width. */\nexport const P13N_VARIANT_ATTR = 'data-p13n-variant';\n\n/** Default adapter used when an element omits the component attribute. */\nexport const DEFAULT_COMPONENT = 'nes-banner';\n\n// Marks an element the instant the CDP starts personalizing it. While present,\n// the skeleton must stay and the SSR fallback must NOT be revealed — this\n// prevents revealAll() (fired on onEventReady / timeout) from flashing the old\n// fallback content in the gap before the personalized node is swapped in.\nexport const P13N_PERSONALIZING_ATTR = 'data-p13n-personalizing';\n","import { LOADING_ATTR, P13N_ID_ATTR, P13N_PERSONALIZING_ATTR } from './constants';\n\n// ── Initialization state ─────────────────────────────────────────────────────\n\nlet initialized = false;\n\n// ── Main initialization ──────────────────────────────────────────────────────\n\n/**\n * Initialize banner personalization for all banners on the page.\n *\n * This sets up ONE CDP observer that, when BlueConic is ready, reveals ALL\n * banners that haven't been personalized yet. BlueConic may call updateBanner()\n * for specific banners before onEventReady fires.\n *\n * Call this once per page. Subsequent calls are no-ops.\n *\n * BlueConic timing (confirmed by BC team):\n * - `onEventReady` fires when all BC interactions (dialogs, personalization) are complete\n * - `onBlueConicLoaded` fires when BC script is loaded but before interactions complete\n *\n * Scenarios:\n * 1. CDP disabled/errored:  reveal all SSR fallbacks immediately\n * 2. CDPLoadingObserver reports failure:   reveal all SSR fallbacks\n * 3. CDPLoadingObserver reports success:   subscribe to BC onEventReady, then reveal remaining\n * 4. CDPLoadingObserver absent:            fall back to direct waitForBlueConic\n * 5. window.load safety net:              BC script never loaded at all\n */\nexport const initCDPObserver = (): void => {\n  if (initialized) return;\n  initialized = true;\n\n  // Scenario 1: CDP disabled or already failed synchronously\n  if (window.cdpDisabled || window.cdpLoadError) {\n    revealAll();\n    return;\n  }\n\n  // Scenario 5: ultimate safety net — BC script never executed\n  window.addEventListener(\n    'load',\n    () => {\n      if (window.cdpLoadError || typeof window.blueConicClient === 'undefined') {\n        revealAll();\n      }\n    },\n    { once: true }\n  );\n\n  // Scenarios 2–4: subscribe via CDPLoadingObserver when present. addCDPListener\n  // fires immediately if the BC script has already loaded/errored, or deferred\n  // once its onload/onerror fires\n  if (typeof window.CDPLoadingObserver !== 'undefined') {\n    window.CDPLoadingObserver.addCDPListener((success) => {\n      if (!success) {\n        revealAll();\n      } else {\n        try {\n          waitForBlueConic(revealAll);\n        } catch (err) {\n          console.error('[p13n] Error initializing CDP observer:', err);\n          revealAll();\n        }\n      }\n    });\n  } else {\n    // CDPLoadingObserver not present — subscribe to BC directly\n    try {\n      waitForBlueConic(revealAll);\n    } catch (err) {\n      console.error('[p13n] Error initializing CDP observer:', err);\n      revealAll();\n    }\n  }\n};\n\n// ── Fallback reveal ──────────────────────────────────────────────────────────\n\n/**\n * Reveals all personalized banners that are still hidden (showing SSR fallback).\n * Called when CDP is done or unavailable.\n */\nexport const revealAll = (): void => {\n  // Skip elements that are mid-personalization (data-p13n-personalizing). Their\n  // skeleton must stay until updateBanner() swaps in the personalized content;\n  // revealing the SSR fallback here would flash the old, non-personalized text.\n  document\n    .querySelectorAll<HTMLElement>(\n      `[${P13N_ID_ATTR}][${LOADING_ATTR}]:not([${P13N_PERSONALIZING_ATTR}])`\n    )\n    .forEach(revealFallback);\n};\n\n/**\n * Reveals a single banner's SSR fallback.\n *\n * The fallback markup — including its `<img>`/`<picture>` — is rendered inside a\n * `<noscript>` so the browser does NOT download the fallback image when CDP\n * personalizes the banner. Injecting the `<noscript>` text content into the DOM\n * is what triggers the fallback image to load, so it only happens when the\n * fallback is actually shown. Mirrors the nsdesign ClientsideHero approach.\n */\nexport const revealFallback = (el: HTMLElement): void => {\n  const fallback = el.querySelector('noscript');\n  if (fallback) {\n    el.innerHTML = fallback.textContent ?? '';\n  }\n  el.removeAttribute(LOADING_ATTR);\n};\n\n// ── BlueConic readiness ──────────────────────────────────────────────────────\n\n/**\n * Subscribes to blueConicClient.event.onEventReady, waiting for BC to be available\n * first if needed.\n *\n * Per BlueConic: `onEventReady` fires when all BC interactions are complete.\n * At that point, if BC hasn't personalized this banner, we reveal the SSR fallback.\n *\n * Uses `onBlueConicLoaded` window event as fallback when `blueConicClient.event.subscribe`\n * is not yet available (BC script loaded but API not ready).\n */\nconst waitForBlueConic = (onReady: () => void): void => {\n  const subscribeToOnEventReady = (): void => {\n    window.blueConicClient!.event.subscribe(\n      window.blueConicClient!.event.onEventReady,\n      {},\n      onReady\n    );\n  };\n\n  const subscribeToOnBlueConicBeforePreListeners = (): void => {\n    window.blueConicClient!.event.subscribe(\n      window.blueConicClient!.event.onBeforePreListeners,\n      {},\n      () => {\n        if (\n          typeof window.blueConicClient!.profile?.getProfile()?.permission?.getLevel ===\n            'function' &&\n          window.blueConicClient!.profile.getProfile().permission.getLevel() === 'DO_NOT_TRACK'\n        ) {\n          onReady();\n        }\n      }\n    );\n  };\n\n  if (typeof window.blueConicClient?.event?.subscribe !== 'undefined') {\n    // Scenario 3: BC already available\n    subscribeToOnBlueConicBeforePreListeners();\n    subscribeToOnEventReady();\n  } else {\n    // Scenario 2: BC not yet loaded — wait for it\n    window.addEventListener(\n      'onBlueConicLoaded',\n      () => {\n        if (typeof window.blueConicClient?.event?.subscribe === 'function') {\n          subscribeToOnBlueConicBeforePreListeners();\n          subscribeToOnEventReady();\n        } else {\n          onReady();\n        }\n      },\n      { once: true }\n    );\n  }\n};\n","import {\n  LOADING_ATTR,\n  P13N_ID_ATTR,\n  P13N_COMPONENT_ATTR,\n  P13N_VARIANT_ATTR,\n  P13N_PERSONALIZING_ATTR,\n  DEFAULT_COMPONENT,\n} from './constants';\nimport { getAdapter } from './registry';\nimport { revealFallback } from './cdp-observer';\nimport type { BannerData, PersonalizationData, WebStaticP13nService } from './types';\n\nconst resolveTarget = (id: string): HTMLElement | null =>\n  document.querySelector<HTMLElement>(`[${P13N_ID_ATTR}=\"${id}\"]`);\n\n/** Parses the page-author variant config from `data-p13n-variant`. */\nconst readVariant = (element: HTMLElement): Record<string, unknown> => {\n  const raw = element.getAttribute(P13N_VARIANT_ATTR);\n  if (!raw) return {};\n\n  try {\n    return JSON.parse(raw) as Record<string, unknown>;\n  } catch {\n    console.warn(`[p13n] Invalid ${P13N_VARIANT_ATTR} JSON:`, raw);\n    return {};\n  }\n};\n\n/**\n * Returns the web component hydration promise (`componentOnReady()`) when the\n * element exposes one, or `null` when there is nothing to await (not a Stencil\n * component, or test/SSR env). Waiting on it prevents an empty frame between\n * tearing down the skeleton and the component painting on slow devices.\n */\nconst whenComponentReady = (el: HTMLElement | undefined): Promise<unknown> | null => {\n  const onReady = (el as { componentOnReady?: () => Promise<unknown> } | undefined)\n    ?.componentOnReady;\n  return typeof onReady === 'function' ? onReady.call(el) : null;\n};\n\n// ── Generic update orchestration ─────────────────────────────────────────────\n\n/**\n * Personalizes the element identified by `id`.\n *\n * Looks up the component adapter from the element's `data-p13n-component`\n * attribute (defaulting to the banner adapter), lets the adapter build the\n * personalized node, then swaps it in once both the adapter's readiness gate\n * (e.g. image preload) and the component's hydration have resolved. The core\n * never references a concrete component — adapters own all component specifics.\n */\nconst update = (id: string, data: PersonalizationData): void => {\n  const wrapper = resolveTarget(id);\n  if (!wrapper) return;\n\n  const componentName = wrapper.getAttribute(P13N_COMPONENT_ATTR) ?? DEFAULT_COMPONENT;\n  const adapter = getAdapter(componentName);\n  if (!adapter) {\n    console.warn(`[p13n] No adapter registered for component \"${componentName}\"`);\n    return;\n  }\n\n  // Mark as personalizing BEFORE any async work so revealAll() (fired\n  // synchronously by onEventReady right after update) cannot inject the SSR\n  // fallback and flash old content in the gap before the swap.\n  wrapper.setAttribute(P13N_PERSONALIZING_ATTR, '');\n\n  const variant = readVariant(wrapper);\n  const result = adapter.build({ data, variant, wrapper });\n\n  if (result === null) {\n    // Adapter rejected the CDP data (e.g. missing required fields) — keep the\n    // SSR fallback so the user still sees valid, clickable content.\n    wrapper.removeAttribute(P13N_PERSONALIZING_ATTR);\n    revealFallback(wrapper);\n    return;\n  }\n\n  const { element, readyTarget, whenReady } = result;\n\n  if (typeof data.onClick === 'function') element.addEventListener('click', data.onClick);\n\n  // Drop the skeleton + <noscript> fallback and reveal the personalized node.\n  const finalizeSwap = (): void => {\n    wrapper.removeAttribute(LOADING_ATTR);\n    wrapper.replaceChildren(element);\n    element.hidden = false;\n    wrapper.removeAttribute(P13N_PERSONALIZING_ATTR);\n  };\n\n  // Hydrate the personalized node off-screen (hidden → contributes no height)\n  // alongside the still-visible skeleton, then swap atomically once ready. This\n  // avoids an empty frame (skeleton gone, component not yet rendered) on slow\n  // devices.\n  const swap = (): void => {\n    element.hidden = true;\n    wrapper.appendChild(element);\n    const ready = whenComponentReady(readyTarget ?? element);\n    if (ready) {\n      void ready.then(finalizeSwap);\n    } else {\n      finalizeSwap();\n    }\n  };\n\n  if (whenReady) {\n    whenReady(swap);\n  } else {\n    swap();\n  }\n};\n\n/** Banner-specific convenience wrapper around {@link update}. */\nconst updateBanner = (id: string, data: BannerData): void => update(id, data);\n\nexport const webStaticP13nService: WebStaticP13nService = {\n  update,\n  updateBanner,\n};\n","import { initCDPObserver } from './cdp-observer';\nimport { webStaticP13nService } from './service';\nimport type { WebStaticP13nService } from './types';\n\nconst flush = (target: WebStaticP13nService) => {\n  if (Array.isArray(window._p13nServiceCalls)) {\n    for (const { method, args } of window._p13nServiceCalls) {\n      const fn = (target as any)[method];\n      if (typeof fn !== 'function') {\n        throw new TypeError(`target.${method} is not a function`);\n      }\n      fn.apply(target, args);\n    }\n    window._p13nServiceCalls.length = 0; // clear queue after processing\n  }\n};\n\nexport const initPersonalization = () => {\n  if (!window.cdpDisabled) {\n    window.p13nService = webStaticP13nService;\n    flush(webStaticP13nService);\n  }\n\n  initCDPObserver();\n};\n","      import { initPersonalization } from '@nessie/web-static/dist/scripts/p13n';\n\n      // Initialize personalization\n      initPersonalization();\n    \n\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyAidmVyc2lvbiI6IDMsICJzb3VyY2VzIjogWyIvaG9tZS92c3RzL3dvcmsvMS9zL3NyYy9sYXlvdXRzL0Jhc2VMYXlvdXQuYXN0cm8iXSwgInNvdXJjZXNDb250ZW50IjogWyItLS1cbmltcG9ydCAnLi4vc3R5bGVzL21haW4uY3NzJztcbmltcG9ydCBOYXYgZnJvbSAnQGNvbXBvbmVudHMvTmF2LmFzdHJvJztcbmltcG9ydCBuZXNzaWVJbWFnZSBmcm9tICcuLi9pbWFnZXMvbmVzc2llLnN2Zyc7XG5pbXBvcnQgRm9vdGVyIGZyb20gJ0Bjb21wb25lbnRzL0Zvb3Rlci5hc3Rybyc7XG5pbXBvcnQgeyBWRVJTSU9OUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBhdm9TeXN0ZW1Qcm9wcywgZ2xvYmFsRXZlbnREYXRhIH0gZnJvbSAnQHV0aWxzL2FuYWx5dGljcy51dGlscy50cyc7XG5cbi8vIERldGVybWluZSBOZXNzaWUgQ0ROIGJhc2UgVVJMIGJhc2VkIG9uIHZlcnNpb25cbmNvbnN0IGlzTmVzc2llVmVyc2lvblByZVJlbGVhc2UgPVxuICBWRVJTSU9OUy5ORVNTSUVfVkVSU0lPTi5pbmNsdWRlcygnYmV0YScpIHx8XG4gIFZFUlNJT05TLk5FU1NJRV9WRVJTSU9OLmluY2x1ZGVzKCdhbHBoYScpIHx8XG4gIFZFUlNJT05TLk5FU1NJRV9WRVJTSU9OLmluY2x1ZGVzKCdyYycpO1xuY29uc3QgTkVTU0lFX0NETl9CQVNFID0gaXNOZXNzaWVWZXJzaW9uUHJlUmVsZWFzZVxuICA/ICdodHRwczovL3N0YXRpYy1ucy1ubC1kYXRhLmZlcC1wLmNsYS5ucy5ubC9hcHBzL25lc3NpZS9jZG4vcHJlcmVsZWFzZXMvJ1xuICA6ICdodHRwczovL3N0YXRpYy1ucy1ubC1kYXRhLmZlcC1wLmNsYS5ucy5ubC9hcHBzL25lc3NpZS9jZG4vJztcblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIGJyaWdodGNvdmU/OiBib29sZWFuO1xufVxuXG5jb25zdCB7IHRpdGxlLCBicmlnaHRjb3ZlIH0gPSBBc3Ryby5wcm9wcztcbi0tLVxuXG5cdTAwM2MhZG9jdHlwZSBodG1sXHUwMDNlXG5cdTAwM2NodG1sIGxhbmc9XCJubFwiIGNsYXNzPVwibmVzc2llXCJcdTAwM2VcbiAgXHUwMDNjaGVhZFx1MDAzZVxuICAgIFx1MDAzY21ldGEgY2hhcnNldD1cIlVURi04XCIgL1x1MDAzZVxuICAgIFx1MDAzY21ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCIgL1x1MDAzZVxuICAgIFx1MDAzY21ldGEgbmFtZT1cInJvYm90c1wiIGNvbnRlbnQ9XCJub2luZGV4LCBub2ZvbGxvd1wiIC9cdTAwM2VcbiAgICBcdTAwM2NtZXRhIHByb3BlcnR5PVwiaGFzb3dubWFpblwiIGNvbnRlbnQ9XCJ0cnVlXCIgL1x1MDAzZVxuXG4gICAgXHUwMDNjbGluayByZWw9XCJpY29uXCIgdHlwZT1cImltYWdlL3N2Zyt4bWxcIiBocmVmPXtuZXNzaWVJbWFnZS5zcmN9IC9cdTAwM2VcblxuICAgIFx1MDAzY2xpbmtcbiAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgaHJlZj17YC9mZS1wbGF0Zm9ybS1zdGF0aWMvbnNkZXNpZ24vJHtWRVJTSU9OUy5OU0RFU0lHTl9WRVJTSU9OfS9jc3MvbnMuZ2VuZXJpYy5jc3NgfVxuICAgICAgdHlwZT1cInRleHQvY3NzXCJcbiAgICAvXHUwMDNlXG5cbiAgICBcdTAwM2NsaW5rXG4gICAgICByZWw9XCJzdHlsZXNoZWV0XCJcbiAgICAgIGhyZWY9e2AvZmUtcGxhdGZvcm0tc3RhdGljL2FwcHMvY29nbmlneS1jaGF0Ym90LyR7VkVSU0lPTlMuQ09HTklHWV9DSEFUQk9UX1ZFUlNJT059L3N0eWxlcy5jc3NgfVxuICAgICAgdHlwZT1cInRleHQvY3NzXCJcbiAgICAvXHUwMDNlXG5cbiAgICBcdTAwM2NsaW5rXG4gICAgICByZWw9XCJzdHlsZXNoZWV0XCJcbiAgICAgIGhyZWY9e2Ake05FU1NJRV9DRE5fQkFTRX0ke1ZFUlNJT05TLk5FU1NJRV9WRVJTSU9OfS93ZWJjb21wb25lbnRzL3dlYmNvbXBvbmVudHMuY3NzYH1cbiAgICAvXHUwMDNlXG5cbiAgICBcdTAwM2NzY3JpcHQgaXM6aW5saW5lXHUwMDNlXG4gICAgICBjb25zdCBiY01vY2tTY2VuYXJpbyA9XG4gICAgICAgIG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKS5nZXQoJ3NjZW5hcmlvQkMnKSB8fCAnc3VjY2Vzcyc7XG4gICAgICBpZiAoYmNNb2NrU2NlbmFyaW8gIT09ICdkaXNhYmxlZCcpIHtcbiAgICAgICAgd2luZG93LkNEUExvYWRpbmdPYnNlcnZlciA9IHtcbiAgICAgICAgICBfbGlzdGVuZXJzOiBbXSxcbiAgICAgICAgICBfc3RhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBhZGRDRFBMaXN0ZW5lcjogZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBsaXN0ZW5lcih0aGlzLl9zdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjZHBMb2FkaW5nRmluaXNoZWQ6IGZ1bmN0aW9uIChzdWNjZXNzKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IHN1Y2Nlc3M7XG4gICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgICB3aW5kb3cuY2RwTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5jZHBMb2FkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9XHUwMDNlIHtcbiAgICAgICAgICAgICAgbGlzdGVuZXIoc3VjY2Vzcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgd2luZG93Ll9wMTNuU2VydmljZUNhbGxzID0gW107XG4gICAgICAgIHdpbmRvdy5wMTNuU2VydmljZSA9IG5ldyBQcm94eShcbiAgICAgICAgICB7fSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBnZXQoXywgbWV0aG9kKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoLi4uYXJncykgPVx1MDAzZSB7XG4gICAgICAgICAgICAgICAgd2luZG93Ll9wMTNuU2VydmljZUNhbGxzLnB1c2goeyBtZXRob2Q6IFN0cmluZyhtZXRob2QpLCBhcmdzIH0pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5jZHBEaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgXHUwMDNjL3NjcmlwdFx1MDAzZVxuXG4gICAgXHUwMDNjc2NyaXB0IGlzOmlubGluZVx1MDAzZVxuICAgICAgd2luZG93Lm5zRGF0YVF1ZXVlID0gd2luZG93Lm5zRGF0YVF1ZXVlIHx8IFtdO1xuICAgIFx1MDAzYy9zY3JpcHRcdTAwM2VcblxuICAgIFx1MDAzY3NjcmlwdFxuICAgICAgaWQ9XCJ0bWJhc2Vwcm9wc1wiXG4gICAgICBpczppbmxpbmVcbiAgICAgIHNldDpodG1sPXtgXFxud2luZG93LkFWT19TWVNURU1fUFJPUEVSVElFUyA9ICR7SlNPTi5zdHJpbmdpZnkoYXZvU3lzdGVtUHJvcHMpfVxcbmB9XG4gICAgL1x1MDAzZVxuXG4gICAgXHUwMDNjc2xvdCBuYW1lPVwiYmNtb2NrXCIgL1x1MDAzZVxuXG4gICAge0FzdHJvLnNsb3RzLmJjbW9jayBcdTAwMjZcdTAwMjYgXHUwMDNjc2NyaXB0IGlzOmlubGluZSBzcmM9e2Ake2ltcG9ydC5tZXRhLmVudi5CQVNFX1VSTH1iYy1tb2NrLmpzYH0gL1x1MDAzZX1cblxuICAgIFx1MDAzY3Nsb3QgbmFtZT1cImJjXCIgL1x1MDAzZVxuXG4gICAgXHUwMDNjc2NyaXB0XHUwMDNlXG4gICAgICBpbXBvcnQgeyBpbml0UGVyc29uYWxpemF0aW9uIH0gZnJvbSAnQG5lc3NpZS93ZWItc3RhdGljL2Rpc3Qvc2NyaXB0cy9wMTNuJztcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBwZXJzb25hbGl6YXRpb25cbiAgICAgIGluaXRQZXJzb25hbGl6YXRpb24oKTtcbiAgICBcdTAwM2Mvc2NyaXB0XHUwMDNlXG5cbiAgICBcdTAwM2NzY3JpcHRcbiAgICAgIGlzOmlubGluZVxuICAgICAgdHlwZT1cIm1vZHVsZVwiXG4gICAgICBzcmM9e2Ake05FU1NJRV9DRE5fQkFTRX0ke1ZFUlNJT05TLk5FU1NJRV9WRVJTSU9OfS93ZWJjb21wb25lbnRzL3dlYmNvbXBvbmVudHMuZXNtLmpzYH1cbiAgICBcdTAwM2VcdTAwM2Mvc2NyaXB0XHUwMDNlXG5cbiAgICBcdTAwM2NzY3JpcHRcbiAgICAgIGlzOmlubGluZVxuICAgICAgbm9tb2R1bGVcbiAgICAgIHNyYz17YCR7TkVTU0lFX0NETl9CQVNFfSR7VkVSU0lPTlMuTkVTU0lFX1ZFUlNJT059L3dlYmNvbXBvbmVudHMvd2ViY29tcG9uZW50cy5qc2B9XG4gICAgXHUwMDNlXHUwMDNjL3NjcmlwdFx1MDAzZVxuXG4gICAge1xuICAgICAgYnJpZ2h0Y292ZSBcdTAwMjZcdTAwMjYgKFxuICAgICAgICBcdTAwM2NzY3JpcHRcbiAgICAgICAgICBpczppbmxpbmVcbiAgICAgICAgICBkZWZlcj1cImRlZmVyXCJcbiAgICAgICAgICBzcmM9XCIvL3BsYXllcnMuYnJpZ2h0Y292ZS5uZXQvMzkxMDg2OTcyNzAwMS9yMWdyYnB5VWpmX2RlZmF1bHQvaW5kZXgubWluLmpzXCJcbiAgICAgICAgL1x1MDAzZVxuICAgICAgKVxuICAgIH1cblxuICAgIFx1MDAzY3RpdGxlXHUwMDNlTlMgV2ViIENNUyB7dGl0bGV9XHUwMDNjL3RpdGxlXHUwMDNlXG5cbiAgICBcdTAwM2NzbG90IG5hbWU9XCJoZWFkXCIgL1x1MDAzZVxuICBcdTAwM2MvaGVhZFx1MDAzZVxuXG4gIFx1MDAzY2JvZHlcdTAwM2VcbiAgICBcdTAwM2NuZXMtYW5hbHl0aWNzIGdsb2JhbC1ldmVudC1kYXRhPXtKU09OLnN0cmluZ2lmeShnbG9iYWxFdmVudERhdGEpfVx1MDAzZVx1MDAzYy9uZXMtYW5hbHl0aWNzXHUwMDNlXG4gICAgXHUwMDNjTmF2IC9cdTAwM2VcblxuICAgIFx1MDAzY2RpdiBjbGFzcz1cImNvbnRlbnRcIlx1MDAzZVxuICAgICAgXHUwMDNjZGl2IGRhdGEtY29udGVudD1cImFwcFwiXHUwMDNlXG4gICAgICAgIFx1MDAzY21haW4gaWQ9XCJtYWluQ29udGVudFwiXHUwMDNlXG4gICAgICAgICAgXHUwMDNjYXJ0aWNsZVx1MDAzZVxuICAgICAgICAgICAgXHUwMDNjc2xvdCBuYW1lPVwiaW50cm9cIiAvXHUwMDNlXG4gICAgICAgICAgICBcdTAwM2NzbG90IC9cdTAwM2VcbiAgICAgICAgICBcdTAwM2MvYXJ0aWNsZVx1MDAzZVxuICAgICAgICBcdTAwM2MvbWFpblx1MDAzZVxuICAgICAgXHUwMDNjL2Rpdlx1MDAzZVxuICAgIFx1MDAzYy9kaXZcdTAwM2VcblxuICAgIFx1MDAzY0Zvb3RlciAvXHUwMDNlXG5cbiAgICBcdTAwM2NzY3JpcHRcbiAgICAgIGlzOmlubGluZVxuICAgICAgc3JjPXtgL2ZlLXBsYXRmb3JtLXN0YXRpYy9uc2Rlc2lnbi8ke1ZFUlNJT05TLk5TREVTSUdOX1ZFUlNJT059L2pzL25zLmdlbmVyaWMuanNgfVxuICAgIFx1MDAzZVx1MDAzYy9zY3JpcHRcdTAwM2VcblxuICAgIFx1MDAzY3Nsb3QgbmFtZT1cImJvZHlzY3JpcHRzXCIgL1x1MDAzZVxuXG4gICAgXHUwMDNjc2NyaXB0IGlzOmlubGluZVx1MDAzZVxuICAgICAgd2luZG93LkNvZ25pZ3lXZWJjaGF0Q29uZmlnID0ge1xuICAgICAgICBlbmRwb2ludDpcbiAgICAgICAgICAnaHR0cHM6Ly9lbmRwb2ludC1ucy1hY2MuY29nbmlneS5jbG91ZC9kZDA0ZmQ4N2I0Zjc4NzkxOWQ2YWFiNjlhZmZkYmI4ODYzY2NjY2RmYzFjZjVhZTk3MDkzMzEzMmJiNzk5OGFhJyxcbiAgICAgICAgbGFuZzogJ25sLU5MJ1xuICAgICAgfTtcbiAgICBcdTAwM2Mvc2NyaXB0XHUwMDNlXG4gICAgXHUwMDNjc2NyaXB0XG4gICAgICBpczppbmxpbmVcbiAgICAgIGRlZmVyXG4gICAgICBzcmM9e2AvZmUtcGxhdGZvcm0tc3RhdGljL2FwcHMvY29nbmlneS1jaGF0Ym90LyR7VkVSU0lPTlMuQ09HTklHWV9DSEFUQk9UX1ZFUlNJT059L3dlYmNoYXQuanNgfVxuICAgIFx1MDAzZVx1MDAzYy9zY3JpcHRcdTAwM2VcbiAgICBcdTAwM2NzY3JpcHRcbiAgICAgIGlzOmlubGluZVxuICAgICAgZGVmZXJcbiAgICAgIHNyYz17YC9mZS1wbGF0Zm9ybS1zdGF0aWMvYXBwcy9jb2duaWd5LWNoYXRib3QvJHtWRVJTSU9OUy5DT0dOSUdZX0NIQVRCT1RfVkVSU0lPTn0vd2ViY2hhdC1qZW5zLmpzYH1cbiAgICBcdTAwM2VcdTAwM2Mvc2NyaXB0XHUwMDNlXG5cbiAgICBcdTAwM2NzbG90IG5hbWU9XCJlbmRvZmJvZHlcIiAvXHUwMDNlXG4gIFx1MDAzYy9ib2R5XHUwMDNlXG5cdTAwM2MvaHRtbFx1MDAzZSJdLCAibWFwcGluZ3MiOiAiQUErR0EsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRjtBQUNBLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0I7QUFBQTsiLCAibmFtZXMiOiBbXSB9"],"names":["adapters","registerAdapter","name","adapter","getAdapter","OCP_CROPS","buildOcpImageUrl","urlTemplate","cropName","width","buildSrcSet","widths","w","isOcpUrlTemplate","url","CONTAINER_MAX_WIDTH","SCREENS","BANNER_RESPONSIVE_CONFIGS","container","transformOcpToPicture","alt","mimeType","variant","config","sourceSet","breakpoint","mobileConfig","fallbackSrc","BANNER_COMPONENT","SWAP_TIMEOUT","resolvePreloadSource","picture","canMatch","match","source","preloadImage","done","src","settled","finish","img","srcset","sizes","isOcpPictureData","buildPicture","data","ocpPictureUrlTemplate","buildBanner","banner","build","bannerVariant","link","bannerAdapter","LOADING_ATTR","P13N_ID_ATTR","P13N_COMPONENT_ATTR","P13N_VARIANT_ATTR","DEFAULT_COMPONENT","P13N_PERSONALIZING_ATTR","initialized","initCDPObserver","revealAll","success","waitForBlueConic","err","revealFallback","el","fallback","onReady","subscribeToOnEventReady","subscribeToOnBlueConicBeforePreListeners","resolveTarget","id","readVariant","element","raw","whenComponentReady","update","wrapper","componentName","result","readyTarget","whenReady","finalizeSwap","swap","ready","updateBanner","webStaticP13nService","flush","target","method","args","fn","initPersonalization"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7]}