{
  "version": 3,
  "sources": ["/cdn/shop/t/519/assets/instant-gels-builder.js?bust=103"],
  "sourcesContent": ["/**\n * GLAMRDiP Instant Gels BundleBuilder \u2014 count-driven brain, kit-builder visual parity.\n * - Count-driven: user picks N designs, tier auto-selects (highest tier where design_count <= N).\n * - Modal chrome reuses kit-builder classes (gd-kb-*, gd-tier-step, gd-kb-quickview);\n *   this JS drives the same class hooks (is-active/is-reached tiers, data-selected tiles,\n *   .gd-kb__slot slots, is-quickview pane-swap) with IG data.\n * - Cart: single /cart/add.js items[] \u2014 tier variant (_kit + Designs + __bundle_id) +\n *   each design ($0 _addon) + per-tier fixed extras ($0 _addon), all one __bundle_id.\n */\n(() => {\n  // Resilient init (Joel 2026-07-18): loaded from layout (head defer) so it executes on\n  // every render (section-embedded <script> doesn't run on ?view=/editor). Open trigger is\n  // a document-level DELEGATED listener so the cross-section hero CTA can't be orphaned.\n  // hydrate() is idempotent (gdInstantHydrated guard on the modal).\n  let openCurrent = null;\n\n  function initAll() { document.querySelectorAll('[data-gd-instant]').forEach(hydrate); }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', initAll);\n  else initAll();\n  document.addEventListener('shopify:section:load', initAll);\n\n  if (!document.__gdInstantTriggerBound) {\n    document.__gdInstantTriggerBound = true;\n    document.addEventListener('click', (e) => {\n      const trigger = e.target.closest('[data-gd-open-bundle-builder], [data-gd-instant-open]');\n      if (!trigger) return;\n      const root = document.querySelector('[data-gd-instant]');\n      // Modal is portaled to <body> (see hydrate) \u2014 check document-wide, not under root.\n      if (!root || !document.querySelector('[data-gd-instant-modal]')) return;\n      e.preventDefault();\n      hydrate(root);\n      if (openCurrent) openCurrent();\n    });\n  }\n\n  function hydrate(root) {\n    // PORTAL-SAFE: gd-overlay-portal.js moves [data-gd-instant-modal] (and everything\n    // inside it) to <body>. Resolve the modal document-wide and scope every internal\n    // lookup to `modal`, never the section root.\n    const modal = root.querySelector('[data-gd-instant-modal]') || document.querySelector('[data-gd-instant-modal]');\n    if (!modal) return;\n    if (modal.dataset.gdInstantHydrated === '1') return;\n    modal.dataset.gdInstantHydrated = '1';\n    root.dataset.gdInstantHydrated = '1';\n\n    const panel      = modal.querySelector('.gd-kb-modal__panel') || modal;\n    const closeBtns  = modal.querySelectorAll('[data-gd-instant-close]');\n    const backBtn    = modal.querySelector('[data-gd-instant-back]');\n    const tiers = [...modal.querySelectorAll('[data-gd-instant-tier]')]\n      .map(el => ({\n        el,\n        variantId: parseInt(el.dataset.variantId, 10),\n        count: parseInt(el.dataset.designCount, 10),\n        price: parseInt(el.dataset.price, 10),\n        compare: parseInt(el.dataset.compare, 10) || null,\n        title: el.dataset.title,\n        extras: (() => { try { return JSON.parse(el.dataset.extras || '[]'); } catch (e) { return []; } })(),\n        includes: el.dataset.includes || '',\n      }))\n      .sort((a, b) => a.count - b.count);\n\n    const maxSelections = tiers.length ? tiers[tiers.length - 1].count : 0;\n    const minSelections = tiers.length ? tiers[0].count : 0;\n\n    const catChips    = [...modal.querySelectorAll('[data-gd-instant-cat]')];\n    const designTiles = [...modal.querySelectorAll('[data-gd-instant-design]')];\n\n    // Multi-instance rail hooks (desktop summary + mobile footer share attributes;\n    // the JS updates all instances together \u2014 the salon dual-render pattern).\n    const slotsHosts = [...modal.querySelectorAll('[data-gd-instant-slots]')];\n    const statusEls  = [...modal.querySelectorAll('[data-gd-instant-status]')];\n    const priceEls   = [...modal.querySelectorAll('[data-gd-instant-price]')];\n    const wasEls     = [...modal.querySelectorAll('[data-gd-instant-was]')];\n    const savingsEls = [...modal.querySelectorAll('[data-gd-instant-savings]')];\n    const includesEls= [...modal.querySelectorAll('[data-gd-instant-includes]')];\n    const atcBtns    = [...modal.querySelectorAll('[data-gd-instant-atc]')];\n    const atcTexts   = [...modal.querySelectorAll('[data-gd-instant-atc-text]')];\n    const progressFills = [...modal.querySelectorAll('[data-gd-instant-progress-fill]')];\n    const errEl      = modal.querySelector('[data-gd-instant-error]');\n\n    // Chip-scroll arrows (parity with salon; only surface when the strip overflows).\n    const chipsWrap  = modal.querySelector('[data-gd-instant-chips-wrap]');\n    const chipsTrack = modal.querySelector('[data-gd-instant-chips]');\n    const chipsPrev  = modal.querySelector('[data-gd-instant-chips-prev]');\n    const chipsNext  = modal.querySelector('[data-gd-instant-chips-next]');\n\n    // Detail pane (salon quick-view pane-swap).\n    const gridPane    = modal.querySelector('[data-gd-instant-pane=\"grid\"]');\n    const detailPane  = modal.querySelector('[data-gd-instant-pane=\"detail\"]');\n    const scrollRegion= modal.querySelector('.gd-kb__scroll-region');\n    const dTrack   = detailPane && detailPane.querySelector('[data-gd-instant-detail-track]');\n    const dPrev    = detailPane && detailPane.querySelector('[data-gd-instant-detail-prev]');\n    const dNext    = detailPane && detailPane.querySelector('[data-gd-instant-detail-next]');\n    const dCounter = detailPane && detailPane.querySelector('[data-gd-instant-detail-counter]');\n    const dName    = detailPane && detailPane.querySelector('[data-gd-instant-detail-name]');\n    const dOos     = detailPane && detailPane.querySelector('[data-gd-instant-detail-oos]');\n    const dCta     = detailPane && detailPane.querySelector('[data-gd-instant-detail-cta]');\n    const dCtaText = detailPane && detailPane.querySelector('[data-gd-instant-detail-cta-text]');\n    const dBackEls = detailPane ? detailPane.querySelectorAll('[data-gd-instant-detail-back]') : [];\n    const detailState = { tile: null, idx: 0, urls: [] };\n    let _dScrollTimer = null;\n\n    const selected = []; // [{ variantId, name, designId, image }]\n\n    const fmt = (cents) => {\n      const currency = (window.Shopify && window.Shopify.currency && window.Shopify.currency.active) || 'AUD';\n      return new Intl.NumberFormat('en-AU', {\n        style: 'currency', currency,\n        minimumFractionDigits: cents % 100 === 0 ? 0 : 2,\n        maximumFractionDigits: 2,\n      }).format(cents / 100);\n    };\n    const emit = (name, detail) => {\n      document.body.dispatchEvent(new CustomEvent(name, { detail }));\n      if (window.dataLayer) window.dataLayer.push({ event: name, ...detail });\n    };\n    const uuid = () => (crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2) + Date.now().toString(36));\n\n    // \u2500\u2500 Modal open/close (shared scroll-lock manager). \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const open = () => {\n      if (!modal.hidden) return;\n      modal.hidden = false;\n      if (window.gdScrollLock) window.gdScrollLock.lock(modal);\n      else document.body.style.overflow = 'hidden';\n      emit('instant_gels_builder_open', {});\n      setTimeout(() => (modal.querySelector('.gd-kb__close') || modal.querySelector('[data-gd-instant-close]'))?.focus?.({ preventScroll: true }), 50);\n    };\n    const close = () => {\n      if (modal.hidden) return;\n      // Always return to the grid pane so a reopen doesn't land in a stale detail view.\n      if (detailPane && !detailPane.hidden) closeDetail();\n      modal.hidden = true;\n      if (window.gdScrollLock) window.gdScrollLock.unlock(modal);\n      else document.body.style.overflow = '';\n    };\n    openCurrent = open;\n    closeBtns.forEach(b => b.addEventListener('click', close));\n    // State-aware back chevron (salon pattern): in quick-view \u2192 back to grid; else close modal.\n    backBtn?.addEventListener('click', (e) => {\n      e.preventDefault();\n      if (panel.classList.contains('is-quickview') || (detailPane && !detailPane.hidden)) closeDetail();\n      else close();\n    });\n    document.addEventListener('keydown', e => {\n      if (e.key !== 'Escape' || modal.hidden) return;\n      if (detailPane && !detailPane.hidden) { closeDetail(); return; }\n      close();\n    });\n\n    // \u2500\u2500 Category chips \u2014 .is-active pill (salon treatment). \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    catChips.forEach(chip => {\n      chip.addEventListener('click', () => {\n        const cat = chip.dataset.gdInstantCat;\n        catChips.forEach(c => { c.classList.remove('is-active'); c.setAttribute('aria-pressed', 'false'); });\n        chip.classList.add('is-active'); chip.setAttribute('aria-pressed', 'true');\n        designTiles.forEach(t => { t.hidden = cat !== '' && t.dataset.category !== cat; });\n      });\n    });\n    // Chip-scroll arrows: reveal only when the strip overflows; nudge on click.\n    function updateChipArrows() {\n      if (!chipsTrack || !chipsPrev || !chipsNext) return;\n      const overflow = chipsTrack.scrollWidth > chipsTrack.clientWidth + 2;\n      chipsPrev.hidden = !overflow || chipsTrack.scrollLeft <= 2;\n      chipsNext.hidden = !overflow || chipsTrack.scrollLeft + chipsTrack.clientWidth >= chipsTrack.scrollWidth - 2;\n    }\n    chipsTrack?.addEventListener('scroll', updateChipArrows, { passive: true });\n    chipsPrev?.addEventListener('click', () => chipsTrack.scrollBy({ left: -160, behavior: 'smooth' }));\n    chipsNext?.addEventListener('click', () => chipsTrack.scrollBy({ left: 160, behavior: 'smooth' }));\n\n    // \u2500\u2500 Active/target tier \u2014 SALON LOCK-STEP MODEL (Joel 2026-07-18, revenue fix). \u2500\u2500\n    // Round UP, never down: the target is the pinned tier (slider click) or, unpinned,\n    // the CEILING tier (lowest tier whose count >= selection). So 5 designs targets the\n    // 6-pack ($149) \u2014 NEVER the 4-pack ($119). Auto-upgrade: selecting past the pinned\n    // tier clears the pin and re-derives the ceiling. ATC is enabled ONLY when the\n    // selection EXACTLY equals the target tier's count (see render + handleAtc).\n    let pinnedIdx = null;\n    const activeTier = () => {\n      if (tiers.length === 0) return null;\n      if (pinnedIdx != null) {\n        if (selected.length <= tiers[pinnedIdx].count) return tiers[pinnedIdx];\n        pinnedIdx = null; // overflowed the pinned target \u2192 auto-upgrade\n      }\n      for (const t of tiers) if (t.count >= selected.length) return t; // ceiling\n      return tiers[tiers.length - 1];\n    };\n    // Slider node click = set target tier (salon package click). Progress + CTA then\n    // track toward it; picking past it auto-upgrades (pin clears in activeTier).\n    tiers.forEach((t, i) => {\n      t.el.addEventListener('click', (e) => { e.preventDefault(); pinnedIdx = i; render(); });\n    });\n\n    function renderSlots(tier) {\n      const slotCount = Math.max(minSelections, selected.length, tier ? tier.count : 0);\n      slotsHosts.forEach(host => {\n        host.innerHTML = '';\n        for (let i = 0; i < slotCount; i++) {\n          const sel = selected[i];\n          // Salon parity: FILLED slots are <button> (clickable \u2192 reopen detail,\n          // cursor + focus-ring via button.gd-kb__slot); EMPTY slots are <div>.\n          const slot = document.createElement(sel ? 'button' : 'div');\n          slot.className = 'gd-kb__slot';\n          slot.dataset.gdInstantSlot = '';\n          slot.dataset.slotIdx = String(i);\n          slot.setAttribute('role', 'listitem');\n          if (sel) {\n            slot.type = 'button';\n            slot.setAttribute('data-filled', 'true');\n            slot.setAttribute('aria-label', `Preview ${sel.name}`);\n            slot.title = sel.name;\n            if (sel.image) {\n              const img = document.createElement('img');\n              img.className = 'gd-kb__slot-img';\n              img.src = sel.image; img.alt = sel.name; img.loading = 'lazy';\n              slot.appendChild(img);\n            } else {\n              const num = document.createElement('span');\n              num.className = 'gd-kb__slot-num';\n              num.textContent = sel.name.slice(0, 2);\n              slot.appendChild(num);\n            }\n            const info = document.createElement('span');\n            info.className = 'gd-kb__slot-info';\n            info.setAttribute('aria-hidden', 'true');\n            info.innerHTML = '<svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>';\n            slot.appendChild(info);\n          } else {\n            slot.setAttribute('aria-label', `Slot ${i + 1}: empty`);\n            const num = document.createElement('span');\n            num.className = 'gd-kb__slot-num';\n            num.textContent = String(i + 1);\n            slot.appendChild(num);\n          }\n          host.appendChild(slot);\n        }\n      });\n    }\n\n    const render = () => {\n      const tier = activeTier();          // the TARGET tier (pinned or ceiling)\n      const activeIdx = tier ? tiers.indexOf(tier) : -1;\n      const target = tier ? tier.count : 0;\n      // LOCK-STEP: ready ONLY when the selection EXACTLY equals the target tier's count.\n      const ready = !!tier && selected.length === target;\n\n      // Tier slider: is-active on the target tier, is-reached on tiers strictly below it.\n      tiers.forEach((t, i) => {\n        t.el.classList.toggle('is-active', i === activeIdx);\n        t.el.classList.toggle('is-reached', i < activeIdx);\n        t.el.setAttribute('aria-pressed', i === activeIdx ? 'true' : 'false');\n      });\n\n      renderSlots(tier);\n\n      // Progress bar under the slots \u2014 fills selection/target (salon).\n      const pctFill = target > 0 ? Math.min(100, Math.round((selected.length / target) * 100)) : 0;\n      progressFills.forEach(el => { el.style.width = pctFill + '%'; });\n\n      // Price row reflects the TARGET tier (the next tier up at intermediate counts \u2014\n      // never the lower tier's price). $X + strike + \"Save $Y\" (absolute, compare \u2212 price).\n      const priceStr = tier ? fmt(tier.price) : '';\n      priceEls.forEach(el => { el.textContent = priceStr; });\n      const hasCompare = tier && tier.compare && tier.compare > tier.price;\n      wasEls.forEach(el => { el.textContent = hasCompare ? fmt(tier.compare) : ''; });      // :empty hides\n      savingsEls.forEach(el => { el.textContent = hasCompare ? ('Save ' + fmt(tier.compare - tier.price)) : ''; });\n\n      // Below-CTA info chip \u2014 the target tier's included extras.\n      const inc = (tier && tier.includes) ? ('Includes: ' + tier.includes) : '';\n      includesEls.forEach(el => { el.textContent = inc; el.hidden = !inc; });\n\n      // Status \u2014 \"X of N selected\" (salon).\n      statusEls.forEach(el => { el.textContent = tier ? `${selected.length} of ${target} selected` : ''; });\n\n      // ATC \u2014 lock-step: enabled only at an exact tier; else \"Pick N more design(s)\".\n      const remaining = tier ? Math.max(0, target - selected.length) : 0;\n      atcBtns.forEach(b => { b.disabled = !ready; });\n      atcTexts.forEach(t => {\n        t.textContent = ready\n          ? 'Add bundle to cart'\n          : (remaining > 0 ? `Pick ${remaining} more design${remaining === 1 ? '' : 's'}` : 'Pick designs to continue');\n      });\n    };\n\n    // \u2500\u2500 OOS pre-validation (dual-fetch; paired retail availability is authoritative). \u2500\u2500\n    async function preValidateTile(tile) {\n      const handle = tile.dataset.productHandle;\n      const variantId = String(tile.dataset.variantId || '');\n      if (!handle || !variantId) return true;\n      const regularHandle = handle.endsWith('-bundle') ? handle.slice(0, -'-bundle'.length) : handle;\n      const fetchProduct = async (h) => {\n        try {\n          const resp = await fetch(`/products/${h}.js?_=${Date.now()}`, { credentials: 'same-origin', headers: { 'Cache-Control': 'no-cache', Accept: 'application/json' } });\n          if (!resp.ok) return null;\n          return await resp.json();\n        } catch (e) { return null; }\n      };\n      try {\n        const [duplicate, regular] = await Promise.all([\n          fetchProduct(handle),\n          regularHandle !== handle ? fetchProduct(regularHandle) : Promise.resolve(null),\n        ]);\n        if (duplicate) {\n          const dupVariant = (duplicate.variants || []).find((v) => String(v.id) === variantId);\n          if (dupVariant && dupVariant.available === false) return false;\n        }\n        if (regular && regular.available === false) {\n          console.info('[gd-instant-gels-builder] OOS via paired regular:', regularHandle);\n          return false;\n        }\n        if (regular && duplicate) {\n          const dupVariant = (duplicate.variants || []).find((v) => String(v.id) === variantId);\n          const dupSku = dupVariant && dupVariant.sku;\n          if (dupSku) {\n            const matchingRegular = (regular.variants || []).find((v) => v.sku === dupSku);\n            if (matchingRegular && matchingRegular.available === false) {\n              console.info('[gd-instant-gels-builder] OOS via shared-SKU regular variant:', dupSku);\n              return false;\n            }\n          }\n        }\n        return true;\n      } catch (e) {\n        console.warn('[gd-instant-gels-builder] OOS pre-check failed, deferring to cart-add:', e && e.message);\n        return true;\n      }\n    }\n\n    function showOosNotice(name) {\n      if (!errEl) return;\n      errEl.hidden = false;\n      errEl.textContent = `${name || 'That design'} just sold out \u2014 pick another.`;\n      errEl.classList.add('gd-instant__error--oos');\n      if (errEl._oosTimer) clearTimeout(errEl._oosTimer);\n      errEl._oosTimer = setTimeout(() => {\n        errEl.hidden = true; errEl.textContent = ''; errEl.classList.remove('gd-instant__error--oos'); errEl._oosTimer = null;\n      }, 4000);\n    }\n\n    // \u2500\u2500 Selection helpers (selection flows through the detail CTA; grid tiles open detail). \u2500\u2500\n    function addSelected(tile) {\n      const variantId = parseInt(tile.dataset.variantId, 10);\n      if (selected.some(d => d.variantId === variantId)) return;\n      selected.push({ variantId, name: tile.dataset.name, designId: tile.dataset.designId, image: tile.dataset.image || '' });\n      tile.setAttribute('data-selected', 'true');\n      emit('instant_gels_design_toggle', { design_id: tile.dataset.designId, variant_id: variantId, action: 'add' });\n    }\n    function removeSelected(tile) {\n      const variantId = parseInt(tile.dataset.variantId, 10);\n      const i = selected.findIndex(d => d.variantId === variantId);\n      if (i >= 0) selected.splice(i, 1);\n      tile.removeAttribute('data-selected');\n      emit('instant_gels_design_toggle', { design_id: tile.dataset.designId, variant_id: variantId, action: 'remove' });\n    }\n\n    // \u2500\u2500 Detail quick-view (salon pane-swap + gd-kb-quickview chrome). \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // Photos are LAZY (perf): the tile carries only the component's own image; the full\n    // retail photo set is fetched from /products/<retail>.js when the detail opens (never\n    // 32 all_products pairings at render \u2014 that hit Shopify's 20-cap and dropped photos).\n    function buildDetailTrack(urls, label) {\n      if (!dTrack) return;\n      detailState.urls = urls || [];\n      dTrack.innerHTML = '';\n      const frag = document.createDocumentFragment();\n      (urls || []).forEach((url, i) => {\n        const slide = document.createElement('div');\n        slide.className = 'gd-kb-quickview__slide';\n        slide.dataset.gdInstantSlide = String(i);\n        const img = document.createElement('img');\n        img.className = 'gd-kb-quickview__slide-img';\n        img.loading = 'eager'; img.decoding = 'async';\n        img.alt = label ? `${label} \u2014 image ${i + 1} of ${urls.length}` : '';\n        img.src = url;\n        slide.appendChild(img);\n        frag.appendChild(slide);\n      });\n      dTrack.appendChild(frag);\n    }\n    async function fetchRetailPhotos(tile) {\n      const handle = tile.dataset.productHandle || '';\n      const retail = handle.endsWith('-bundle') ? handle.slice(0, -'-bundle'.length) : handle;\n      if (!retail) return [];\n      try {\n        const r = await fetch(`/products/${retail}.js`, { credentials: 'same-origin', headers: { Accept: 'application/json' } });\n        if (!r.ok) return [];\n        const d = await r.json();\n        return (d.images || []).slice(0, 8).map((u) => {\n          const url = (u || '').indexOf('//') === 0 ? ('https:' + u) : u;\n          return url + (url.indexOf('?') >= 0 ? '&' : '?') + 'width=900';\n        }).filter(Boolean);\n      } catch (e) { return []; }\n    }\n    function scrollDetailToSlide(idx, behavior) {\n      if (!dTrack) return;\n      const slide = dTrack.querySelectorAll('[data-gd-instant-slide]')[idx];\n      if (!slide) return;\n      const pad = parseFloat(getComputedStyle(dTrack).scrollPaddingLeft || '0') || 0;\n      dTrack.scrollTo({ left: Math.max(0, slide.offsetLeft - pad), behavior: behavior || 'auto' });\n    }\n    function updateDetailCounter() {\n      if (!dCounter) return;\n      const n = detailState.urls.length;\n      if (n > 1) { dCounter.textContent = `${detailState.idx + 1} / ${n}`; dCounter.hidden = false; }\n      else { dCounter.textContent = ''; dCounter.hidden = true; }\n    }\n    function updateDetailArrows() {\n      const n = detailState.urls.length;\n      if (dPrev) { dPrev.hidden = n <= 1 || detailState.idx <= 0; dPrev.disabled = dPrev.hidden; }\n      if (dNext) { dNext.hidden = n <= 1 || detailState.idx >= n - 1; dNext.disabled = dNext.hidden; }\n    }\n    function markDetailOos() {\n      if (dOos) dOos.hidden = false;\n      if (dCta) { dCta.disabled = true; dCta.classList.remove('is-remove'); }\n      if (dCtaText) dCtaText.textContent = 'Sold out';\n    }\n    function updateDetailCta(tile) {\n      if (!dCta || !dCtaText) return;\n      const oos = tile.classList.contains('gd-instant__design--oos');\n      if (dOos) dOos.hidden = !oos;\n      if (oos) { dCta.disabled = true; dCta.classList.remove('is-remove'); dCtaText.textContent = 'Sold out'; return; }\n      const variantId = parseInt(tile.dataset.variantId, 10);\n      const inSel = selected.some(d => d.variantId === variantId);\n      const full = selected.length >= maxSelections && !inSel;\n      dCta.classList.toggle('is-remove', inSel);\n      dCta.disabled = full;\n      dCtaText.textContent = inSel ? 'Remove from kit' : (full ? 'Kit full \u2014 remove one first' : 'Add to kit');\n    }\n    function openDetail(tile) {\n      if (!detailPane) { // no detail markup \u2192 direct toggle fallback\n        const vId = parseInt(tile.dataset.variantId, 10);\n        if (selected.some(d => d.variantId === vId)) removeSelected(tile);\n        else if (selected.length < maxSelections) addSelected(tile);\n        render(); return;\n      }\n      detailState.tile = tile; detailState.idx = 0;\n      const label = tile.dataset.displayName || tile.dataset.name || '';\n      // Seed instantly with the component's own image (or a previously-fetched set), then\n      // upgrade to the full retail photo set once the lazy fetch resolves.\n      const seed = tile._photos || (tile.dataset.image ? [tile.dataset.image] : []);\n      buildDetailTrack(seed, label);\n      if (dName) dName.textContent = label;\n      updateDetailCta(tile);\n      updateDetailCounter();\n      updateDetailArrows();\n      if (gridPane) gridPane.hidden = true;\n      detailPane.hidden = false;\n      panel.classList.add('is-quickview');\n      if (scrollRegion) scrollRegion.scrollTop = 0;\n      requestAnimationFrame(() => scrollDetailToSlide(0, 'auto'));\n      detailPane.querySelector('[data-gd-instant-detail-back]')?.focus?.({ preventScroll: true });\n      emit('instant_gels_detail_open', { design_id: tile.dataset.designId, image_count: detailState.urls.length });\n      if (!tile._photos) {\n        fetchRetailPhotos(tile).then((urls) => {\n          tile._photos = urls.length ? urls : seed;\n          if (detailState.tile === tile && urls.length) {\n            detailState.idx = 0;\n            buildDetailTrack(tile._photos, label);\n            updateDetailCounter();\n            updateDetailArrows();\n            requestAnimationFrame(() => scrollDetailToSlide(0, 'auto'));\n          }\n        });\n      }\n    }\n    function closeDetail() {\n      if (!detailPane) return;\n      detailPane.hidden = true;\n      if (gridPane) gridPane.hidden = false;\n      panel.classList.remove('is-quickview');\n      detailState.tile = null;\n    }\n\n    dTrack?.addEventListener('scroll', () => {\n      if (_dScrollTimer) clearTimeout(_dScrollTimer);\n      _dScrollTimer = setTimeout(() => {\n        if (!dTrack || detailState.urls.length === 0) return;\n        const r = dTrack.getBoundingClientRect(); const center = r.left + r.width / 2;\n        let best = 0, bestD = Infinity;\n        dTrack.querySelectorAll('[data-gd-instant-slide]').forEach((s, i) => {\n          const rr = s.getBoundingClientRect(); const c = rr.left + rr.width / 2; const d = Math.abs(c - center);\n          if (d < bestD) { bestD = d; best = i; }\n        });\n        if (best !== detailState.idx) { detailState.idx = best; updateDetailCounter(); updateDetailArrows(); }\n      }, 80);\n    }, { passive: true });\n    dPrev?.addEventListener('click', (e) => { e.preventDefault(); detailState.idx = Math.max(0, detailState.idx - 1); scrollDetailToSlide(detailState.idx, 'smooth'); updateDetailCounter(); updateDetailArrows(); });\n    dNext?.addEventListener('click', (e) => { e.preventDefault(); detailState.idx = Math.min(detailState.urls.length - 1, detailState.idx + 1); scrollDetailToSlide(detailState.idx, 'smooth'); updateDetailCounter(); updateDetailArrows(); });\n\n    dCta?.addEventListener('click', async (e) => {\n      e.preventDefault();\n      const tile = detailState.tile;\n      if (!tile || dCta.disabled) return;\n      const variantId = parseInt(tile.dataset.variantId, 10);\n      const inSel = selected.some(d => d.variantId === variantId);\n      const prevTier = activeTier();\n      if (inSel) {\n        removeSelected(tile);\n      } else {\n        if (selected.length >= maxSelections) { updateDetailCta(tile); return; }\n        // Validate BEFORE committing so an OOS design surfaces the badge inside the detail.\n        dCta.disabled = true; if (dCtaText) dCtaText.textContent = 'Checking\u2026';\n        const ok = await preValidateTile(tile);\n        if (!ok) {\n          tile.classList.add('gd-instant__design--oos');\n          tile.setAttribute('aria-disabled', 'true');\n          emit('instant_gels_design_oos_blocked', { design_id: tile.dataset.designId, variant_id: variantId });\n          showOosNotice(tile.dataset.name);\n          markDetailOos();\n          render();\n          return; // stay in the detail so the OOS badge is visible\n        }\n        addSelected(tile);\n      }\n      const nextT = activeTier();\n      if (prevTier?.variantId !== nextT?.variantId) {\n        emit('instant_gels_tier_changed', { from_tier: prevTier?.variantId, to_tier: nextT?.variantId, to_count: nextT?.count });\n      }\n      render();\n      closeDetail();\n    });\n    dBackEls.forEach(el => el.addEventListener('click', (e) => { e.preventDefault(); closeDetail(); }));\n\n    // Grid tile \u2192 open the detail quick-view (selection via the detail CTA, salon pattern).\n    designTiles.forEach(tile => {\n      tile.addEventListener('click', (e) => { e.preventDefault(); openDetail(tile); });\n    });\n\n    // Selected-slot thumbnail \u2192 reopen that design's detail (salon slot-click parity,\n    // kit-builder.js line 783). Delegated on the host so it survives renderSlots()\n    // rebuilds; both desktop rail + mobile footer hosts share the behaviour.\n    slotsHosts.forEach(host => {\n      host.addEventListener('click', (e) => {\n        const slotBtn = e.target.closest('[data-gd-instant-slot][data-filled=\"true\"]');\n        if (!slotBtn) return;\n        e.preventDefault();\n        const idx = parseInt(slotBtn.dataset.slotIdx, 10);\n        const sel = selected[idx];\n        if (!sel) return;\n        // Read from dataset via variantId \u2014 tile may be chip-filtered hidden; irrelevant.\n        const tile = designTiles.find(t => parseInt(t.dataset.variantId, 10) === sel.variantId);\n        if (tile) openDetail(tile);\n      });\n    });\n\n    // \u2500\u2500 ATC \u2014 atomic /cart/add.js: tier (_kit) + designs ($0 _addon) + extras ($0 _addon). \u2500\u2500\n    const handleAtc = async () => {\n      const tier = activeTier();\n      // LOCK-STEP revenue backstop: only add when the selection EXACTLY equals a tier\n      // count. Guarantees the cart can never hold an intermediate-count bundle (e.g. a\n      // 5-design bundle at the 4-pack price). Belt-and-suspenders with the disabled CTA.\n      if (!tier || selected.length !== tier.count) return;\n      atcBtns.forEach(b => { b.disabled = true; });\n      atcTexts.forEach(t => { t.textContent = 'Adding\u2026'; });\n      if (errEl) errEl.hidden = true;\n      const bundleId = uuid();\n      const designsStr = selected.map(d => d.name).join(',');\n      const items = [\n        { id: tier.variantId, quantity: 1, properties: { Designs: designsStr, __bundle_id: bundleId, _kit: 'true' } },\n        ...selected.map(d => ({ id: d.variantId, quantity: 1, properties: { __bundle_id: bundleId, _addon: 'true' } })),\n        ...(tier.extras || []).filter(x => x && x.id).map(x => ({\n          id: x.id, quantity: Math.max(1, parseInt(x.qty, 10) || 1), properties: { __bundle_id: bundleId, _addon: 'true' },\n        })),\n      ];\n      emit('instant_gels_atc_click', { tier_id: tier.variantId, design_count: selected.length, price: tier.price });\n      try {\n        const r = await fetch('/cart/add.js', {\n          method: 'POST', credentials: 'same-origin',\n          headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n          body: JSON.stringify({ items }),\n        });\n        if (!r.ok) { const body = await r.json().catch(() => ({})); throw new Error(body.description || 'Cart add failed'); }\n        emit('instant_gels_atc_success', { tier_id: tier.variantId });\n        try {\n          if (window._learnq && typeof window._learnq.push === 'function') {\n            const tierPriceDollars = (tier.price || 0) / 100;\n            window._learnq.push(['track', 'Added to Cart', {\n              $value: tierPriceDollars,\n              AddedItemProductName: tier.title || 'Instant Gels Bundle',\n              AddedItemProductID:   tier.variantId ? String(tier.variantId) : '',\n              AddedItemQuantity:    1,\n              AddedItemPrice:       tierPriceDollars,\n              AddedItemURL:         window.location.origin + window.location.pathname,\n              AddedItemCategories:  ['Instant Gels'],\n              BundleTier:           tier.title || '',\n              BundleDesigns:        selected.map(d => d.name).filter(Boolean),\n              BundleDesignCount:    selected.length,\n            }]);\n          }\n        } catch (e) {}\n        document.body.dispatchEvent(new CustomEvent('product-added-to-cart'));\n        document.body.dispatchEvent(new CustomEvent('gd:cart-open'));\n        close();\n        selected.length = 0;\n        designTiles.forEach(t => t.removeAttribute('data-selected'));\n        render();\n      } catch (e) {\n        emit('instant_gels_atc_error', { message: e.message });\n        if (errEl) { errEl.textContent = e.message; errEl.hidden = false; }\n        atcTexts.forEach(t => { t.textContent = 'Add bundle to cart'; });\n        atcBtns.forEach(b => { b.disabled = false; });\n      }\n    };\n    atcBtns.forEach(b => b.addEventListener('click', handleAtc));\n\n    render();\n    updateChipArrows();\n  }\n})();\n\n/* ig-builder: kit-builder visual parity (gd-kb-* reskin) + count-driven brain (2026-07-18) */\n"],
  "mappings": "CASC,IAAM,CAKL,IAAI,YAAc,KAElB,SAAS,SAAU,CAAE,SAAS,iBAAiB,mBAAmB,EAAE,QAAQ,OAAO,CAAG,CAClF,SAAS,aAAe,UAAW,SAAS,iBAAiB,mBAAoB,OAAO,EACvF,QAAQ,EACb,SAAS,iBAAiB,uBAAwB,OAAO,EAEpD,SAAS,0BACZ,SAAS,wBAA0B,GACnC,SAAS,iBAAiB,QAAU,GAAM,CAExC,GAAI,CADY,EAAE,OAAO,QAAQ,uDAAuD,EAC1E,OACd,MAAM,KAAO,SAAS,cAAc,mBAAmB,EAEnD,CAAC,MAAQ,CAAC,SAAS,cAAc,yBAAyB,IAC9D,EAAE,eAAe,EACjB,QAAQ,IAAI,EACR,aAAa,YAAY,EAC/B,CAAC,GAGH,SAAS,QAAQ,KAAM,CAIrB,MAAM,MAAQ,KAAK,cAAc,yBAAyB,GAAK,SAAS,cAAc,yBAAyB,EAE/G,GADI,CAAC,OACD,MAAM,QAAQ,oBAAsB,IAAK,OAC7C,MAAM,QAAQ,kBAAoB,IAClC,KAAK,QAAQ,kBAAoB,IAEjC,MAAM,MAAa,MAAM,cAAc,qBAAqB,GAAK,MAC3D,UAAa,MAAM,iBAAiB,yBAAyB,EAC7D,QAAa,MAAM,cAAc,wBAAwB,EACzD,MAAQ,CAAC,GAAG,MAAM,iBAAiB,wBAAwB,CAAC,EAC/D,IAAI,KAAO,CACV,GACA,UAAW,SAAS,GAAG,QAAQ,UAAW,EAAE,EAC5C,MAAO,SAAS,GAAG,QAAQ,YAAa,EAAE,EAC1C,MAAO,SAAS,GAAG,QAAQ,MAAO,EAAE,EACpC,QAAS,SAAS,GAAG,QAAQ,QAAS,EAAE,GAAK,KAC7C,MAAO,GAAG,QAAQ,MAClB,QAAS,IAAM,CAAE,GAAI,CAAE,OAAO,KAAK,MAAM,GAAG,QAAQ,QAAU,IAAI,CAAG,MAAY,CAAE,MAAO,CAAC,CAAG,CAAE,GAAG,EACnG,SAAU,GAAG,QAAQ,UAAY,EACnC,EAAE,EACD,KAAK,CAAC,EAAG,IAAM,EAAE,MAAQ,EAAE,KAAK,EAE7B,cAAgB,MAAM,OAAS,MAAM,MAAM,OAAS,CAAC,EAAE,MAAQ,EAC/D,cAAgB,MAAM,OAAS,MAAM,CAAC,EAAE,MAAQ,EAEhD,SAAc,CAAC,GAAG,MAAM,iBAAiB,uBAAuB,CAAC,EACjE,YAAc,CAAC,GAAG,MAAM,iBAAiB,0BAA0B,CAAC,EAIpE,WAAa,CAAC,GAAG,MAAM,iBAAiB,yBAAyB,CAAC,EAClE,UAAa,CAAC,GAAG,MAAM,iBAAiB,0BAA0B,CAAC,EACnE,SAAa,CAAC,GAAG,MAAM,iBAAiB,yBAAyB,CAAC,EAClE,OAAa,CAAC,GAAG,MAAM,iBAAiB,uBAAuB,CAAC,EAChE,WAAa,CAAC,GAAG,MAAM,iBAAiB,2BAA2B,CAAC,EACpE,YAAa,CAAC,GAAG,MAAM,iBAAiB,4BAA4B,CAAC,EACrE,QAAa,CAAC,GAAG,MAAM,iBAAiB,uBAAuB,CAAC,EAChE,SAAa,CAAC,GAAG,MAAM,iBAAiB,4BAA4B,CAAC,EACrE,cAAgB,CAAC,GAAG,MAAM,iBAAiB,iCAAiC,CAAC,EAC7E,MAAa,MAAM,cAAc,yBAAyB,EAG1D,UAAa,MAAM,cAAc,8BAA8B,EAC/D,WAAa,MAAM,cAAc,yBAAyB,EAC1D,UAAa,MAAM,cAAc,8BAA8B,EAC/D,UAAa,MAAM,cAAc,8BAA8B,EAG/D,SAAc,MAAM,cAAc,+BAA+B,EACjE,WAAc,MAAM,cAAc,iCAAiC,EACnE,aAAc,MAAM,cAAc,uBAAuB,EACzD,OAAW,YAAc,WAAW,cAAc,gCAAgC,EAClF,MAAW,YAAc,WAAW,cAAc,+BAA+B,EACjF,MAAW,YAAc,WAAW,cAAc,+BAA+B,EACjF,SAAW,YAAc,WAAW,cAAc,kCAAkC,EACpF,MAAW,YAAc,WAAW,cAAc,+BAA+B,EACjF,KAAW,YAAc,WAAW,cAAc,8BAA8B,EAChF,KAAW,YAAc,WAAW,cAAc,8BAA8B,EAChF,SAAW,YAAc,WAAW,cAAc,mCAAmC,EACrF,SAAW,WAAa,WAAW,iBAAiB,+BAA+B,EAAI,CAAC,EACxF,YAAc,CAAE,KAAM,KAAM,IAAK,EAAG,KAAM,CAAC,CAAE,EACnD,IAAI,cAAgB,KAEpB,MAAM,SAAW,CAAC,EAEZ,IAAO,OAAU,CACrB,MAAM,SAAY,OAAO,SAAW,OAAO,QAAQ,UAAY,OAAO,QAAQ,SAAS,QAAW,MAClG,OAAO,IAAI,KAAK,aAAa,QAAS,CACpC,MAAO,WAAY,SACnB,sBAAuB,MAAQ,MAAQ,EAAI,EAAI,EAC/C,sBAAuB,CACzB,CAAC,EAAE,OAAO,MAAQ,GAAG,CACvB,EACM,KAAO,CAAC,KAAM,SAAW,CAC7B,SAAS,KAAK,cAAc,IAAI,YAAY,KAAM,CAAE,MAAO,CAAC,CAAC,EACzD,OAAO,WAAW,OAAO,UAAU,KAAK,CAAE,MAAO,KAAM,GAAG,MAAO,CAAC,CACxE,EACM,KAAO,IAAO,OAAO,WAAa,OAAO,WAAW,EAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,EAAI,KAAK,IAAI,EAAE,SAAS,EAAE,EAGpH,KAAO,IAAM,CACZ,MAAM,SACX,MAAM,OAAS,GACX,OAAO,aAAc,OAAO,aAAa,KAAK,KAAK,EAClD,SAAS,KAAK,MAAM,SAAW,SACpC,KAAK,4BAA6B,CAAC,CAAC,EACpC,WAAW,KAAO,MAAM,cAAc,eAAe,GAAK,MAAM,cAAc,yBAAyB,IAAI,QAAQ,CAAE,cAAe,EAAK,CAAC,EAAG,EAAE,EACjJ,EACM,MAAQ,IAAM,CACd,MAAM,SAEN,YAAc,CAAC,WAAW,QAAQ,YAAY,EAClD,MAAM,OAAS,GACX,OAAO,aAAc,OAAO,aAAa,OAAO,KAAK,EACpD,SAAS,KAAK,MAAM,SAAW,GACtC,EACA,YAAc,KACd,UAAU,QAAQ,GAAK,EAAE,iBAAiB,QAAS,KAAK,CAAC,EAEzD,SAAS,iBAAiB,QAAU,GAAM,CACxC,EAAE,eAAe,EACb,MAAM,UAAU,SAAS,cAAc,GAAM,YAAc,CAAC,WAAW,OAAS,YAAY,EAC3F,MAAM,CACb,CAAC,EACD,SAAS,iBAAiB,UAAW,GAAK,CACxC,GAAI,IAAE,MAAQ,UAAY,MAAM,QAChC,IAAI,YAAc,CAAC,WAAW,OAAQ,CAAE,YAAY,EAAG,MAAQ,CAC/D,MAAM,EACR,CAAC,EAGD,SAAS,QAAQ,MAAQ,CACvB,KAAK,iBAAiB,QAAS,IAAM,CACnC,MAAM,IAAM,KAAK,QAAQ,aACzB,SAAS,QAAQ,GAAK,CAAE,EAAE,UAAU,OAAO,WAAW,EAAG,EAAE,aAAa,eAAgB,OAAO,CAAG,CAAC,EACnG,KAAK,UAAU,IAAI,WAAW,EAAG,KAAK,aAAa,eAAgB,MAAM,EACzE,YAAY,QAAQ,GAAK,CAAE,EAAE,OAAS,MAAQ,IAAM,EAAE,QAAQ,WAAa,GAAK,CAAC,CACnF,CAAC,CACH,CAAC,EAED,SAAS,kBAAmB,CAC1B,GAAI,CAAC,YAAc,CAAC,WAAa,CAAC,UAAW,OAC7C,MAAM,SAAW,WAAW,YAAc,WAAW,YAAc,EACnE,UAAU,OAAS,CAAC,UAAY,WAAW,YAAc,EACzD,UAAU,OAAS,CAAC,UAAY,WAAW,WAAa,WAAW,aAAe,WAAW,YAAc,CAC7G,CACA,YAAY,iBAAiB,SAAU,iBAAkB,CAAE,QAAS,EAAK,CAAC,EAC1E,WAAW,iBAAiB,QAAS,IAAM,WAAW,SAAS,CAAE,KAAM,KAAM,SAAU,QAAS,CAAC,CAAC,EAClG,WAAW,iBAAiB,QAAS,IAAM,WAAW,SAAS,CAAE,KAAM,IAAK,SAAU,QAAS,CAAC,CAAC,EAQjG,IAAI,UAAY,KAChB,MAAM,WAAa,IAAM,CACvB,GAAI,MAAM,SAAW,EAAG,OAAO,KAC/B,GAAI,WAAa,KAAM,CACrB,GAAI,SAAS,QAAU,MAAM,SAAS,EAAE,MAAO,OAAO,MAAM,SAAS,EACrE,UAAY,IACd,CACA,UAAW,KAAK,MAAO,GAAI,EAAE,OAAS,SAAS,OAAQ,OAAO,EAC9D,OAAO,MAAM,MAAM,OAAS,CAAC,CAC/B,EAGA,MAAM,QAAQ,CAAC,EAAG,IAAM,CACtB,EAAE,GAAG,iBAAiB,QAAU,GAAM,CAAE,EAAE,eAAe,EAAG,UAAY,EAAG,OAAO,CAAG,CAAC,CACxF,CAAC,EAED,SAAS,YAAY,KAAM,CACzB,MAAM,UAAY,KAAK,IAAI,cAAe,SAAS,OAAQ,KAAO,KAAK,MAAQ,CAAC,EAChF,WAAW,QAAQ,MAAQ,CACzB,KAAK,UAAY,GACjB,QAAS,EAAI,EAAG,EAAI,UAAW,IAAK,CAClC,MAAM,IAAM,SAAS,CAAC,EAGhB,KAAO,SAAS,cAAc,IAAM,SAAW,KAAK,EAK1D,GAJA,KAAK,UAAY,cACjB,KAAK,QAAQ,cAAgB,GAC7B,KAAK,QAAQ,QAAU,OAAO,CAAC,EAC/B,KAAK,aAAa,OAAQ,UAAU,EAChC,IAAK,CAKP,GAJA,KAAK,KAAO,SACZ,KAAK,aAAa,cAAe,MAAM,EACvC,KAAK,aAAa,aAAc,WAAW,IAAI,IAAI,EAAE,EACrD,KAAK,MAAQ,IAAI,KACb,IAAI,MAAO,CACb,MAAM,IAAM,SAAS,cAAc,KAAK,EACxC,IAAI,UAAY,kBAChB,IAAI,IAAM,IAAI,MAAO,IAAI,IAAM,IAAI,KAAM,IAAI,QAAU,OACvD,KAAK,YAAY,GAAG,CACtB,KAAO,CACL,MAAM,IAAM,SAAS,cAAc,MAAM,EACzC,IAAI,UAAY,kBAChB,IAAI,YAAc,IAAI,KAAK,MAAM,EAAG,CAAC,EACrC,KAAK,YAAY,GAAG,CACtB,CACA,MAAM,KAAO,SAAS,cAAc,MAAM,EAC1C,KAAK,UAAY,mBACjB,KAAK,aAAa,cAAe,MAAM,EACvC,KAAK,UAAY,4QACjB,KAAK,YAAY,IAAI,CACvB,KAAO,CACL,KAAK,aAAa,aAAc,QAAQ,EAAI,CAAC,SAAS,EACtD,MAAM,IAAM,SAAS,cAAc,MAAM,EACzC,IAAI,UAAY,kBAChB,IAAI,YAAc,OAAO,EAAI,CAAC,EAC9B,KAAK,YAAY,GAAG,CACtB,CACA,KAAK,YAAY,IAAI,CACvB,CACF,CAAC,CACH,CAEA,MAAM,OAAS,IAAM,CACnB,MAAM,KAAO,WAAW,EAClB,UAAY,KAAO,MAAM,QAAQ,IAAI,EAAI,GACzC,OAAS,KAAO,KAAK,MAAQ,EAE7B,MAAQ,CAAC,CAAC,MAAQ,SAAS,SAAW,OAG5C,MAAM,QAAQ,CAAC,EAAG,IAAM,CACtB,EAAE,GAAG,UAAU,OAAO,YAAa,IAAM,SAAS,EAClD,EAAE,GAAG,UAAU,OAAO,aAAc,EAAI,SAAS,EACjD,EAAE,GAAG,aAAa,eAAgB,IAAM,UAAY,OAAS,OAAO,CACtE,CAAC,EAED,YAAY,IAAI,EAGhB,MAAM,QAAU,OAAS,EAAI,KAAK,IAAI,IAAK,KAAK,MAAO,SAAS,OAAS,OAAU,GAAG,CAAC,EAAI,EAC3F,cAAc,QAAQ,IAAM,CAAE,GAAG,MAAM,MAAQ,QAAU,GAAK,CAAC,EAI/D,MAAM,SAAW,KAAO,IAAI,KAAK,KAAK,EAAI,GAC1C,SAAS,QAAQ,IAAM,CAAE,GAAG,YAAc,QAAU,CAAC,EACrD,MAAM,WAAa,MAAQ,KAAK,SAAW,KAAK,QAAU,KAAK,MAC/D,OAAO,QAAQ,IAAM,CAAE,GAAG,YAAc,WAAa,IAAI,KAAK,OAAO,EAAI,EAAI,CAAC,EAC9E,WAAW,QAAQ,IAAM,CAAE,GAAG,YAAc,WAAc,QAAU,IAAI,KAAK,QAAU,KAAK,KAAK,EAAK,EAAI,CAAC,EAG3G,MAAM,IAAO,MAAQ,KAAK,SAAa,aAAe,KAAK,SAAY,GACvE,YAAY,QAAQ,IAAM,CAAE,GAAG,YAAc,IAAK,GAAG,OAAS,CAAC,GAAK,CAAC,EAGrE,UAAU,QAAQ,IAAM,CAAE,GAAG,YAAc,KAAO,GAAG,SAAS,MAAM,OAAO,MAAM,YAAc,EAAI,CAAC,EAGpG,MAAM,UAAY,KAAO,KAAK,IAAI,EAAG,OAAS,SAAS,MAAM,EAAI,EACjE,QAAQ,QAAQ,GAAK,CAAE,EAAE,SAAW,CAAC,KAAO,CAAC,EAC7C,SAAS,QAAQ,GAAK,CACpB,EAAE,YAAc,MACZ,qBACC,UAAY,EAAI,QAAQ,SAAS,eAAe,YAAc,EAAI,GAAK,GAAG,GAAK,0BACtF,CAAC,CACH,EAGA,eAAe,gBAAgB,KAAM,CACnC,MAAM,OAAS,KAAK,QAAQ,cACtB,UAAY,OAAO,KAAK,QAAQ,WAAa,EAAE,EACrD,GAAI,CAAC,QAAU,CAAC,UAAW,MAAO,GAClC,MAAM,cAAgB,OAAO,SAAS,SAAS,EAAI,OAAO,MAAM,EAAG,EAAiB,EAAI,OAClF,aAAe,MAAO,GAAM,CAChC,GAAI,CACF,MAAM,KAAO,MAAM,MAAM,aAAa,CAAC,SAAS,KAAK,IAAI,CAAC,GAAI,CAAE,YAAa,cAAe,QAAS,CAAE,gBAAiB,WAAY,OAAQ,kBAAmB,CAAE,CAAC,EAClK,OAAK,KAAK,GACH,MAAM,KAAK,KAAK,EADF,IAEvB,MAAY,CAAE,OAAO,IAAM,CAC7B,EACA,GAAI,CACF,KAAM,CAAC,UAAW,OAAO,EAAI,MAAM,QAAQ,IAAI,CAC7C,aAAa,MAAM,EACnB,gBAAkB,OAAS,aAAa,aAAa,EAAI,QAAQ,QAAQ,IAAI,CAC/E,CAAC,EACD,GAAI,UAAW,CACb,MAAM,YAAc,UAAU,UAAY,CAAC,GAAG,KAAM,GAAM,OAAO,EAAE,EAAE,IAAM,SAAS,EACpF,GAAI,YAAc,WAAW,YAAc,GAAO,MAAO,EAC3D,CACA,GAAI,SAAW,QAAQ,YAAc,GACnC,eAAQ,KAAK,oDAAqD,aAAa,EACxE,GAET,GAAI,SAAW,UAAW,CACxB,MAAM,YAAc,UAAU,UAAY,CAAC,GAAG,KAAM,GAAM,OAAO,EAAE,EAAE,IAAM,SAAS,EAC9E,OAAS,YAAc,WAAW,IACxC,GAAI,OAAQ,CACV,MAAM,iBAAmB,QAAQ,UAAY,CAAC,GAAG,KAAM,GAAM,EAAE,MAAQ,MAAM,EAC7E,GAAI,iBAAmB,gBAAgB,YAAc,GACnD,eAAQ,KAAK,gEAAiE,MAAM,EAC7E,EAEX,CACF,CACA,MAAO,EACT,OAAS,EAAG,CACV,eAAQ,KAAK,yEAA0E,GAAK,EAAE,OAAO,EAC9F,EACT,CACF,CAEA,SAAS,cAAc,KAAM,CACtB,QACL,MAAM,OAAS,GACf,MAAM,YAAc,GAAG,MAAQ,aAAa,sCAC5C,MAAM,UAAU,IAAI,wBAAwB,EACxC,MAAM,WAAW,aAAa,MAAM,SAAS,EACjD,MAAM,UAAY,WAAW,IAAM,CACjC,MAAM,OAAS,GAAM,MAAM,YAAc,GAAI,MAAM,UAAU,OAAO,wBAAwB,EAAG,MAAM,UAAY,IACnH,EAAG,GAAI,EACT,CAGA,SAAS,YAAY,KAAM,CACzB,MAAM,UAAY,SAAS,KAAK,QAAQ,UAAW,EAAE,EACjD,SAAS,KAAK,GAAK,EAAE,YAAc,SAAS,IAChD,SAAS,KAAK,CAAE,UAAW,KAAM,KAAK,QAAQ,KAAM,SAAU,KAAK,QAAQ,SAAU,MAAO,KAAK,QAAQ,OAAS,EAAG,CAAC,EACtH,KAAK,aAAa,gBAAiB,MAAM,EACzC,KAAK,6BAA8B,CAAE,UAAW,KAAK,QAAQ,SAAU,WAAY,UAAW,OAAQ,KAAM,CAAC,EAC/G,CACA,SAAS,eAAe,KAAM,CAC5B,MAAM,UAAY,SAAS,KAAK,QAAQ,UAAW,EAAE,EAC/C,EAAI,SAAS,UAAU,GAAK,EAAE,YAAc,SAAS,EACvD,GAAK,GAAG,SAAS,OAAO,EAAG,CAAC,EAChC,KAAK,gBAAgB,eAAe,EACpC,KAAK,6BAA8B,CAAE,UAAW,KAAK,QAAQ,SAAU,WAAY,UAAW,OAAQ,QAAS,CAAC,CAClH,CAMA,SAAS,iBAAiB,KAAM,MAAO,CACrC,GAAI,CAAC,OAAQ,OACb,YAAY,KAAO,MAAQ,CAAC,EAC5B,OAAO,UAAY,GACnB,MAAM,KAAO,SAAS,uBAAuB,GAC5C,MAAQ,CAAC,GAAG,QAAQ,CAAC,IAAK,IAAM,CAC/B,MAAM,MAAQ,SAAS,cAAc,KAAK,EAC1C,MAAM,UAAY,yBAClB,MAAM,QAAQ,eAAiB,OAAO,CAAC,EACvC,MAAM,IAAM,SAAS,cAAc,KAAK,EACxC,IAAI,UAAY,6BAChB,IAAI,QAAU,QAAS,IAAI,SAAW,QACtC,IAAI,IAAM,MAAQ,GAAG,KAAK,iBAAY,EAAI,CAAC,OAAO,KAAK,MAAM,GAAK,GAClE,IAAI,IAAM,IACV,MAAM,YAAY,GAAG,EACrB,KAAK,YAAY,KAAK,CACxB,CAAC,EACD,OAAO,YAAY,IAAI,CACzB,CACA,eAAe,kBAAkB,KAAM,CACrC,MAAM,OAAS,KAAK,QAAQ,eAAiB,GACvC,OAAS,OAAO,SAAS,SAAS,EAAI,OAAO,MAAM,EAAG,EAAiB,EAAI,OACjF,GAAI,CAAC,OAAQ,MAAO,CAAC,EACrB,GAAI,CACF,MAAM,EAAI,MAAM,MAAM,aAAa,MAAM,MAAO,CAAE,YAAa,cAAe,QAAS,CAAE,OAAQ,kBAAmB,CAAE,CAAC,EACvH,OAAK,EAAE,KACG,MAAM,EAAE,KAAK,GACb,QAAU,CAAC,GAAG,MAAM,EAAG,CAAC,EAAE,IAAK,GAAM,CAC7C,MAAM,KAAO,GAAK,IAAI,QAAQ,IAAI,IAAM,EAAK,SAAW,EAAK,EAC7D,OAAO,KAAO,IAAI,QAAQ,GAAG,GAAK,EAAI,IAAM,KAAO,WACrD,CAAC,EAAE,OAAO,OAAO,EALC,CAAC,CAMrB,MAAY,CAAE,MAAO,CAAC,CAAG,CAC3B,CACA,SAAS,oBAAoB,IAAK,SAAU,CAC1C,GAAI,CAAC,OAAQ,OACb,MAAM,MAAQ,OAAO,iBAAiB,yBAAyB,EAAE,GAAG,EACpE,GAAI,CAAC,MAAO,OACZ,MAAM,IAAM,WAAW,iBAAiB,MAAM,EAAE,mBAAqB,GAAG,GAAK,EAC7E,OAAO,SAAS,CAAE,KAAM,KAAK,IAAI,EAAG,MAAM,WAAa,GAAG,EAAG,SAAU,UAAY,MAAO,CAAC,CAC7F,CACA,SAAS,qBAAsB,CAC7B,GAAI,CAAC,SAAU,OACf,MAAM,EAAI,YAAY,KAAK,OACvB,EAAI,GAAK,SAAS,YAAc,GAAG,YAAY,IAAM,CAAC,MAAM,CAAC,GAAI,SAAS,OAAS,KAChF,SAAS,YAAc,GAAI,SAAS,OAAS,GACtD,CACA,SAAS,oBAAqB,CAC5B,MAAM,EAAI,YAAY,KAAK,OACvB,QAAS,MAAM,OAAS,GAAK,GAAK,YAAY,KAAO,EAAG,MAAM,SAAW,MAAM,QAC/E,QAAS,MAAM,OAAS,GAAK,GAAK,YAAY,KAAO,EAAI,EAAG,MAAM,SAAW,MAAM,OACzF,CACA,SAAS,eAAgB,CACnB,OAAM,KAAK,OAAS,IACpB,OAAQ,KAAK,SAAW,GAAM,KAAK,UAAU,OAAO,WAAW,GAC/D,WAAU,SAAS,YAAc,WACvC,CACA,SAAS,gBAAgB,KAAM,CAC7B,GAAI,CAAC,MAAQ,CAAC,SAAU,OACxB,MAAM,IAAM,KAAK,UAAU,SAAS,yBAAyB,EAE7D,GADI,OAAM,KAAK,OAAS,CAAC,KACrB,IAAK,CAAE,KAAK,SAAW,GAAM,KAAK,UAAU,OAAO,WAAW,EAAG,SAAS,YAAc,WAAY,MAAQ,CAChH,MAAM,UAAY,SAAS,KAAK,QAAQ,UAAW,EAAE,EAC/C,MAAQ,SAAS,KAAK,GAAK,EAAE,YAAc,SAAS,EACpD,KAAO,SAAS,QAAU,eAAiB,CAAC,MAClD,KAAK,UAAU,OAAO,YAAa,KAAK,EACxC,KAAK,SAAW,KAChB,SAAS,YAAc,MAAQ,kBAAqB,KAAO,mCAAgC,YAC7F,CACA,SAAS,WAAW,KAAM,CACxB,GAAI,CAAC,WAAY,CACf,MAAM,IAAM,SAAS,KAAK,QAAQ,UAAW,EAAE,EAC3C,SAAS,KAAK,GAAK,EAAE,YAAc,GAAG,EAAG,eAAe,IAAI,EACvD,SAAS,OAAS,eAAe,YAAY,IAAI,EAC1D,OAAO,EAAG,MACZ,CACA,YAAY,KAAO,KAAM,YAAY,IAAM,EAC3C,MAAM,MAAQ,KAAK,QAAQ,aAAe,KAAK,QAAQ,MAAQ,GAGzD,KAAO,KAAK,UAAY,KAAK,QAAQ,MAAQ,CAAC,KAAK,QAAQ,KAAK,EAAI,CAAC,GAC3E,iBAAiB,KAAM,KAAK,EACxB,QAAO,MAAM,YAAc,OAC/B,gBAAgB,IAAI,EACpB,oBAAoB,EACpB,mBAAmB,EACf,WAAU,SAAS,OAAS,IAChC,WAAW,OAAS,GACpB,MAAM,UAAU,IAAI,cAAc,EAC9B,eAAc,aAAa,UAAY,GAC3C,sBAAsB,IAAM,oBAAoB,EAAG,MAAM,CAAC,EAC1D,WAAW,cAAc,+BAA+B,GAAG,QAAQ,CAAE,cAAe,EAAK,CAAC,EAC1F,KAAK,2BAA4B,CAAE,UAAW,KAAK,QAAQ,SAAU,YAAa,YAAY,KAAK,MAAO,CAAC,EACtG,KAAK,SACR,kBAAkB,IAAI,EAAE,KAAM,MAAS,CACrC,KAAK,QAAU,KAAK,OAAS,KAAO,KAChC,YAAY,OAAS,MAAQ,KAAK,SACpC,YAAY,IAAM,EAClB,iBAAiB,KAAK,QAAS,KAAK,EACpC,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,IAAM,oBAAoB,EAAG,MAAM,CAAC,EAE9D,CAAC,CAEL,CACA,SAAS,aAAc,CAChB,aACL,WAAW,OAAS,GAChB,WAAU,SAAS,OAAS,IAChC,MAAM,UAAU,OAAO,cAAc,EACrC,YAAY,KAAO,KACrB,CAEA,QAAQ,iBAAiB,SAAU,IAAM,CACnC,eAAe,aAAa,aAAa,EAC7C,cAAgB,WAAW,IAAM,CAC/B,GAAI,CAAC,QAAU,YAAY,KAAK,SAAW,EAAG,OAC9C,MAAM,EAAI,OAAO,sBAAsB,EAAS,OAAS,EAAE,KAAO,EAAE,MAAQ,EAC5E,IAAI,KAAO,EAAG,MAAQ,IACtB,OAAO,iBAAiB,yBAAyB,EAAE,QAAQ,CAAC,EAAG,IAAM,CACnE,MAAM,GAAK,EAAE,sBAAsB,EAAS,EAAI,GAAG,KAAO,GAAG,MAAQ,EAAS,EAAI,KAAK,IAAI,EAAI,MAAM,EACjG,EAAI,QAAS,MAAQ,EAAG,KAAO,EACrC,CAAC,EACG,OAAS,YAAY,MAAO,YAAY,IAAM,KAAM,oBAAoB,EAAG,mBAAmB,EACpG,EAAG,EAAE,CACP,EAAG,CAAE,QAAS,EAAK,CAAC,EACpB,OAAO,iBAAiB,QAAU,GAAM,CAAE,EAAE,eAAe,EAAG,YAAY,IAAM,KAAK,IAAI,EAAG,YAAY,IAAM,CAAC,EAAG,oBAAoB,YAAY,IAAK,QAAQ,EAAG,oBAAoB,EAAG,mBAAmB,CAAG,CAAC,EAChN,OAAO,iBAAiB,QAAU,GAAM,CAAE,EAAE,eAAe,EAAG,YAAY,IAAM,KAAK,IAAI,YAAY,KAAK,OAAS,EAAG,YAAY,IAAM,CAAC,EAAG,oBAAoB,YAAY,IAAK,QAAQ,EAAG,oBAAoB,EAAG,mBAAmB,CAAG,CAAC,EAE1O,MAAM,iBAAiB,QAAS,MAAO,GAAM,CAC3C,EAAE,eAAe,EACjB,MAAM,KAAO,YAAY,KACzB,GAAI,CAAC,MAAQ,KAAK,SAAU,OAC5B,MAAM,UAAY,SAAS,KAAK,QAAQ,UAAW,EAAE,EAC/C,MAAQ,SAAS,KAAK,GAAK,EAAE,YAAc,SAAS,EACpD,SAAW,WAAW,EAC5B,GAAI,MACF,eAAe,IAAI,MACd,CACL,GAAI,SAAS,QAAU,cAAe,CAAE,gBAAgB,IAAI,EAAG,MAAQ,CAIvE,GAFA,KAAK,SAAW,GAAU,WAAU,SAAS,YAAc,kBAEvD,CADO,MAAM,gBAAgB,IAAI,EAC5B,CACP,KAAK,UAAU,IAAI,yBAAyB,EAC5C,KAAK,aAAa,gBAAiB,MAAM,EACzC,KAAK,kCAAmC,CAAE,UAAW,KAAK,QAAQ,SAAU,WAAY,SAAU,CAAC,EACnG,cAAc,KAAK,QAAQ,IAAI,EAC/B,cAAc,EACd,OAAO,EACP,MACF,CACA,YAAY,IAAI,CAClB,CACA,MAAM,MAAQ,WAAW,EACrB,UAAU,YAAc,OAAO,WACjC,KAAK,4BAA6B,CAAE,UAAW,UAAU,UAAW,QAAS,OAAO,UAAW,SAAU,OAAO,KAAM,CAAC,EAEzH,OAAO,EACP,YAAY,CACd,CAAC,EACD,SAAS,QAAQ,IAAM,GAAG,iBAAiB,QAAU,GAAM,CAAE,EAAE,eAAe,EAAG,YAAY,CAAG,CAAC,CAAC,EAGlG,YAAY,QAAQ,MAAQ,CAC1B,KAAK,iBAAiB,QAAU,GAAM,CAAE,EAAE,eAAe,EAAG,WAAW,IAAI,CAAG,CAAC,CACjF,CAAC,EAKD,WAAW,QAAQ,MAAQ,CACzB,KAAK,iBAAiB,QAAU,GAAM,CACpC,MAAM,QAAU,EAAE,OAAO,QAAQ,4CAA4C,EAC7E,GAAI,CAAC,QAAS,OACd,EAAE,eAAe,EACjB,MAAM,IAAM,SAAS,QAAQ,QAAQ,QAAS,EAAE,EAC1C,IAAM,SAAS,GAAG,EACxB,GAAI,CAAC,IAAK,OAEV,MAAM,KAAO,YAAY,KAAK,GAAK,SAAS,EAAE,QAAQ,UAAW,EAAE,IAAM,IAAI,SAAS,EAClF,MAAM,WAAW,IAAI,CAC3B,CAAC,CACH,CAAC,EAGD,MAAM,UAAY,SAAY,CAC5B,MAAM,KAAO,WAAW,EAIxB,GAAI,CAAC,MAAQ,SAAS,SAAW,KAAK,MAAO,OAC7C,QAAQ,QAAQ,GAAK,CAAE,EAAE,SAAW,EAAM,CAAC,EAC3C,SAAS,QAAQ,GAAK,CAAE,EAAE,YAAc,cAAW,CAAC,EAChD,QAAO,MAAM,OAAS,IAC1B,MAAM,SAAW,KAAK,EAChB,WAAa,SAAS,IAAI,GAAK,EAAE,IAAI,EAAE,KAAK,GAAG,EAC/C,MAAQ,CACZ,CAAE,GAAI,KAAK,UAAW,SAAU,EAAG,WAAY,CAAE,QAAS,WAAY,YAAa,SAAU,KAAM,MAAO,CAAE,EAC5G,GAAG,SAAS,IAAI,IAAM,CAAE,GAAI,EAAE,UAAW,SAAU,EAAG,WAAY,CAAE,YAAa,SAAU,OAAQ,MAAO,CAAE,EAAE,EAC9G,IAAI,KAAK,QAAU,CAAC,GAAG,OAAO,GAAK,GAAK,EAAE,EAAE,EAAE,IAAI,IAAM,CACtD,GAAI,EAAE,GAAI,SAAU,KAAK,IAAI,EAAG,SAAS,EAAE,IAAK,EAAE,GAAK,CAAC,EAAG,WAAY,CAAE,YAAa,SAAU,OAAQ,MAAO,CACjH,EAAE,CACJ,EACA,KAAK,yBAA0B,CAAE,QAAS,KAAK,UAAW,aAAc,SAAS,OAAQ,MAAO,KAAK,KAAM,CAAC,EAC5G,GAAI,CACF,MAAM,EAAI,MAAM,MAAM,eAAgB,CACpC,OAAQ,OAAQ,YAAa,cAC7B,QAAS,CAAE,eAAgB,mBAAoB,OAAU,kBAAmB,EAC5E,KAAM,KAAK,UAAU,CAAE,KAAM,CAAC,CAChC,CAAC,EACD,GAAI,CAAC,EAAE,GAAI,CAAE,MAAM,KAAO,MAAM,EAAE,KAAK,EAAE,MAAM,KAAO,CAAC,EAAE,EAAG,MAAM,IAAI,MAAM,KAAK,aAAe,iBAAiB,CAAG,CACpH,KAAK,2BAA4B,CAAE,QAAS,KAAK,SAAU,CAAC,EAC5D,GAAI,CACF,GAAI,OAAO,SAAW,OAAO,OAAO,QAAQ,MAAS,WAAY,CAC/D,MAAM,kBAAoB,KAAK,OAAS,GAAK,IAC7C,OAAO,QAAQ,KAAK,CAAC,QAAS,gBAAiB,CAC7C,OAAQ,iBACR,qBAAsB,KAAK,OAAS,sBACpC,mBAAsB,KAAK,UAAY,OAAO,KAAK,SAAS,EAAI,GAChE,kBAAsB,EACtB,eAAsB,iBACtB,aAAsB,OAAO,SAAS,OAAS,OAAO,SAAS,SAC/D,oBAAsB,CAAC,cAAc,EACrC,WAAsB,KAAK,OAAS,GACpC,cAAsB,SAAS,IAAI,GAAK,EAAE,IAAI,EAAE,OAAO,OAAO,EAC9D,kBAAsB,SAAS,MACjC,CAAC,CAAC,CACJ,CACF,MAAY,CAAC,CACb,SAAS,KAAK,cAAc,IAAI,YAAY,uBAAuB,CAAC,EACpE,SAAS,KAAK,cAAc,IAAI,YAAY,cAAc,CAAC,EAC3D,MAAM,EACN,SAAS,OAAS,EAClB,YAAY,QAAQ,GAAK,EAAE,gBAAgB,eAAe,CAAC,EAC3D,OAAO,CACT,OAAS,EAAG,CACV,KAAK,yBAA0B,CAAE,QAAS,EAAE,OAAQ,CAAC,EACjD,QAAS,MAAM,YAAc,EAAE,QAAS,MAAM,OAAS,IAC3D,SAAS,QAAQ,GAAK,CAAE,EAAE,YAAc,oBAAsB,CAAC,EAC/D,QAAQ,QAAQ,GAAK,CAAE,EAAE,SAAW,EAAO,CAAC,CAC9C,CACF,EACA,QAAQ,QAAQ,GAAK,EAAE,iBAAiB,QAAS,SAAS,CAAC,EAE3D,OAAO,EACP,iBAAiB,CACnB,CACF,GAAG",
  "names": []
}
