{
  "version": 3,
  "sources": ["/cdn/shop/t/211/assets/bodenpulse-floor-purchase.js?bp=accessory-direct-16"],
  "sourcesContent": ["(() => {\n  // Nora 31.10. (v7.6, Selin 19:21): gemeinsamer Bestandscode f\u00FCr Boden- und Zubeh\u00F6rseiten (Zubeh\u00F6r-Section l\u00E4dt diese Datei mit).\n  // Bestandsgrenze, ruhige Meldung mit tel:-Link, \u201EJetzt anrufen\u201C statt Warenkorb-Button, R\u00FCcksetzen nach 422.\n  const BodenpulseStock = window.BodenpulseStock = window.BodenpulseStock || {\n    message: 'So viel haben wir gerade nicht auf Lager. Ruf uns an, wir finden eine L\u00F6sung: ',\n    phone() {\n      // Telefon aus dem ersten tel:-Link der Seite (Fallback Hotline); nur die Nummer \u00FCbernehmen\n      const link = document.querySelector('a[href^=\"tel:\"]:not([data-bp-stock-call])');\n      const href = link?.getAttribute('href') || 'tel:+4943212035644';\n      const text = (link?.textContent || '').replace(/\\s+/g, ' ').trim();\n      const number = (text.match(/\\+?\\d[\\d\\s\\/()-]{5,}\\d/) || [''])[0].trim();\n      return { href, text: number || (link ? href.replace(/^tel:/, '') : '+49 4321 2035644') };\n    },\n    text() { return this.message + this.phone().text; },\n    renderNote(node, linkClass) {\n      if (!node) return;\n      const phone = this.phone();\n      const link = document.createElement('a');\n      link.href = phone.href;\n      link.className = linkClass;\n      link.textContent = phone.text;\n      node.replaceChildren(document.createTextNode(this.message), link);\n    },\n    parseLimit(raw) {\n      if (raw === null || raw === undefined || raw === '') return null;\n      const limit = Number(raw);\n      return Number.isFinite(limit) ? Math.max(0, limit) : null;\n    },\n    // desired: [{id, quantity}], limitFor(id) -> Zahl|null, ignoreLine(line) -> true f\u00FCr Zeilen, die ohnehin ersetzt werden\n    exceeds(desired, cart, limitFor, ignoreLine = () => false) {\n      const wanted = new Map();\n      desired.forEach(item => wanted.set(Number(item.id), (wanted.get(Number(item.id)) || 0) + Number(item.quantity || 0)));\n      for (const [id, quantity] of wanted) {\n        const limit = limitFor(id);\n        if (limit === null) continue;\n        const inCart = (cart?.items || [])\n          .filter(line => Number(line.variant_id) === id && !ignoreLine(line))\n          .reduce((sum, line) => sum + line.quantity, 0);\n        if (quantity + inCart > limit) return true;\n      }\n      return false;\n    },\n    async cart() {\n      const response = await fetch((window.Shopify?.routes?.root || '/') + 'cart.js', { headers: { Accept: 'application/json' }, cache: 'no-store', signal: AbortSignal.timeout(15000) });\n      if (!response.ok) throw new Error('cart.js ' + response.status);\n      return response.json();\n    },\n    // Warenkorb auf den Stand vor dem Klick zur\u00FCcksetzen (Shopify kann bei 422 eine Teilmenge abgelegt haben)\n    async restore(before, cartJson) {\n      try {\n        const now = cartJson ? await cartJson('cart.js') : await this.cart();\n        const previous = new Map((before?.items || []).map(line => [line.key, line.quantity]));\n        for (const line of now.items) {\n          const target = previous.has(line.key) ? previous.get(line.key) : 0;\n          if (line.quantity === target) continue;\n          if (cartJson) await cartJson('cart/change.js', { id: line.key, quantity: target });\n          else await fetch((window.Shopify?.routes?.root || '/') + 'cart/change.js', { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify({ id: line.key, quantity: target }) });\n        }\n        return true;\n      } catch (restoreError) { return false; } // R\u00FCcksetzen fehlgeschlagen: Meldung bleibt trotzdem stehen\n    },\n    // Warenkorb-Button <-> echter tel:-Link \u201EJetzt anrufen\u201C (gleiche Klasse = gleiche Optik). Gibt den Link zur\u00FCck.\n    toggleCall({ root, button, link, active, callClass, inner }) {\n      if (!button) return link || null;\n      if (active) {\n        if (!link) {\n          link = document.createElement('a');\n          link.className = `${button.className} ${callClass}`;\n          link.setAttribute('data-bp-stock-call', '');\n          link.innerHTML = inner || '<span><strong>Jetzt anrufen</strong></span>';\n          button.after(link);\n        }\n        const phone = this.phone();\n        link.href = phone.href;\n        link.setAttribute('aria-label', `Jetzt anrufen: ${phone.text}`);\n        link.querySelectorAll('[data-bp-stock-call-number]').forEach(node => { node.textContent = phone.text; });\n        const hadFocus = document.activeElement === button;\n        button.hidden = true;\n        link.hidden = false;\n        root.dataset.bpStockCall = 'true';\n        if (hadFocus) link.focus({ preventScroll: true });\n      } else {\n        const hadFocus = link && document.activeElement === link;\n        if (link) link.hidden = true;\n        button.hidden = false;\n        delete root.dataset.bpStockCall;\n        if (hadFocus) button.focus({ preventScroll: true });\n      }\n      root.dispatchEvent(new CustomEvent('bp:stock-call', { bubbles: true, detail: { active } }));\n      return link;\n    }\n  };\n\n  function initializeFloorPurchase(section) {\n\n    if (!section || section.dataset.bpReady === 'true') return;\n\n    section.dataset.bpReady = 'true';\n\n    const cartAddUrl = (window.Shopify?.routes?.root || '/') + 'cart/add.js';\n    const cartDrawer = document.querySelector('cart-drawer');\n    const cartSectionIds = ['cart-drawer', 'cart-icon-bubble'];\n\n    async function updateCartInterface(responseData) {\n      if (!cartDrawer) {\n        window.location.assign(section.dataset.cartUrl || '/cart');\n        return;\n      }\n      try {\n        if (responseData.sections?.['cart-drawer'] && responseData.sections?.['cart-icon-bubble']) {\n          cartDrawer.renderContents(responseData, true);\n        } else {\n          await cartDrawer.refreshFromServer();\n          cartDrawer.open();\n        }\n      } catch {\n        // Adding succeeded. Never report a cart rendering error as a failed add.\n        window.location.assign(section.dataset.cartUrl || '/cart');\n      }\n    }\n\n    const packageM2 = Number(section.dataset.packageM2 || 0);\n    const currency = section.dataset.currency || 'EUR';\n    const locale = section.dataset.locale || 'de-DE';\n\n    const money = new Intl.NumberFormat(locale, {\n      style: 'currency',\n      currency\n    });\n\n    const decimal = new Intl.NumberFormat(locale, {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: 2\n    });\n\n    const areaDecimal = new Intl.NumberFormat(locale, {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: 3\n    });\n\n    const areaInput = section.querySelector('[data-bp-area]');\n    const accessoryAreaInput = section.querySelector('[data-bp-accessory-project-area]');\n    const accessoryWasteInput = section.querySelector('[data-bp-accessory-project-waste]');\n    const wasteInput = section.querySelector('[data-bp-waste]');\n    const wasteButtons = Array.from(section.querySelectorAll('[data-bp-waste-option]'));\n    const calculatorModeButtons = Array.from(section.querySelectorAll('[data-bp-calculator-mode]'));\n    const areaPanel = section.querySelector('[data-bp-area-panel]');\n    const packagePanel = section.querySelector('[data-bp-package-panel]');\n    const packageQuantityInput = section.querySelector('[data-bp-package-quantity]');\n    const packageDecrease = section.querySelector('[data-bp-package-decrease]');\n    const packageIncrease = section.querySelector('[data-bp-package-increase]');\n\n    const quantityInput = section.querySelector('[data-bp-quantity-input]');\n    const areaProperty = section.querySelector('[data-bp-property-area]');\n    const wasteProperty = section.querySelector('[data-bp-property-waste]');\n    const neededAreaProperty = section.querySelector('[data-bp-property-needed-area]');\n    const orderAreaProperty = section.querySelector('[data-bp-property-order-area]');\n\n    const calculation = section.querySelector('[data-bp-calculation]');\n    const totalBox = section.querySelector('[data-bp-total-box]');\n\n    const resultPackages = section.querySelector('[data-bp-result-packages]');\n    const resultOrderArea = section.querySelector('[data-bp-result-order-area]');\n    const total = section.querySelector('[data-bp-total]');\n    const totalHelper = section.querySelector('[data-bp-total-helper]');\n    const totalSaving = section.querySelector('[data-bp-total-saving]');\n    const totalSavingWrap = section.querySelector('[data-bp-total-saving-wrap]');\n\n\n    const freeShippingThreshold = Number(section.dataset.freeShippingThresholdCents || 0);\n    const shippingReducedThreshold = Number(section.dataset.shippingReducedThresholdCents || 0);\n    const shippingStandardCents = Number(section.dataset.shippingStandardCents || 0);\n    const shippingReducedCents = Number(section.dataset.shippingReducedCents || 0);\n\n    const addButton = section.querySelector('[data-bp-add]');\n    const addLabel = section.querySelector('[data-bp-add-label]');\n    const addSubline = section.querySelector('[data-bp-add-subline]');\n    const form = section.querySelector('.bp-floor-main__form');\n    const formMessage = section.querySelector('[data-bp-form-message]');\n    // 31.10. (Nora): Fehlermeldung direkt unter dem Fl\u00E4chenfeld und Kurz-Ergebnis unter dem Feld\n    const areaError = section.querySelector('[data-bp-area-error]');\n    const totalShipping = section.querySelector('[data-bp-total-shipping]');\n\n    const textPackageOne = section.dataset.textPackageOne || 'Paket';\n    const textPackageOther = section.dataset.textPackageOther || 'Pakete';\n    const textAreaRequired = section.dataset.textAreaRequired || 'Bitte zuerst deine Raumfl\u00E4che eingeben.';\n    const textAreaCta = section.dataset.textAreaCta || 'Menge w\u00E4hlen';\n    const textAreaCtaHelp = section.dataset.textAreaCtaHelp || 'Danach berechnen wir Pakete und Gesamtpreis';\n    const textAddToCart = section.dataset.textAddToCart || 'in den Warenkorb';\n    const textUnavailable = section.dataset.textUnavailable || 'Derzeit nicht verf\u00FCgbar';\n    const textAdding = section.dataset.textAdding || 'Wird hinzugef\u00FCgt \u2026';\n    const textAdded = section.dataset.textAdded || 'Dein Boden wurde dem Warenkorb hinzugef\u00FCgt.';\n    const textAddError = section.dataset.textAddError || 'Der Boden konnte nicht hinzugef\u00FCgt werden.';\n\n    const buildModal = null;\n    const accessorySummary = section.querySelector('[data-bp-accessories-summary]');\n    let purchaseIsSubmitting = false;\n    const buildItems = Array.from(section.querySelectorAll('[data-bp-build-item]'));\n    const buildArea = section.querySelector('[data-bp-build-area]');\n    const buildAdd = section.querySelector('[data-bp-build-add]');\n    const buildMessage = section.querySelector('[data-bp-build-message]');\n    const buildSkip = section.querySelector('[data-bp-build-skip]');\n    let buildIsSubmitting = false;\n\n    const skirtingOptions = Array.from(section.querySelectorAll('[data-bp-skirting-option]'));\n    const skirtingSelects = Array.from(section.querySelectorAll('[data-bp-skirting-select]'));\n    const skirtingFilters = Array.from(section.querySelectorAll('[data-bp-skirting-filter]'));\n    const skirtingLengthInput = section.querySelector('[data-bp-skirting-length]');\n    const skirtingPanel = section.querySelector('[data-bp-skirting]');\n    const skirtingSummaryQuantity = section.querySelector('[data-bp-skirting-summary-quantity]');\n    const skirtingSummaryTotal = section.querySelector('[data-bp-skirting-summary-total]');\n    const skirtingSelectedTitle = section.querySelector('[data-bp-skirting-selected-title]');\n    const skirtingSelectedResult = section.querySelector('[data-bp-skirting-selected-result]');\n    const skirtingClear = section.querySelector('[data-bp-skirting-clear]');\n    const skirtingNoneInput = section.querySelector('[data-bp-skirting-none]');\n    const skirtingLengthStep = section.querySelector('[data-bp-skirting-step=\"length\"]');\n    const skirtingTypeStep = section.querySelector('[data-bp-skirting-step=\"type\"]');\n    const skirtingModelStep = section.querySelector('[data-bp-skirting-step=\"model\"]');\n\n    const materialList = section.querySelector('.bp-floor-build__items');\n    if (skirtingPanel && materialList) materialList.after(skirtingPanel);\n\n    let currentArea = 0;\n    let currentWaste = Number(section.dataset.defaultWaste || 10);\n    let currentPackages = 0;\n    let currentOrderArea = 0;\n    let purchaseMode = 'area';\n    let currentSkirtingLength = 0;\n    let currentSkirtingGroup = section.dataset.skirtingDefaultGroup || 'matching';\n    let skirtingSelectionCleared = false;\n    let currentVariantPrice = Number(section.dataset.variantPrice || 0);\n    const currentVariantCompareAtPrice = Number(section.dataset.variantComparePrice || 0);\n    const currentVariantAvailable = section.dataset.variantAvailable === 'true';\n\n    let projectRequested = false;\n    let projectVersion = 0;\n    let projectAppliedVersion = -1;\n    let projectRequest = null;\n    let projectTimer = null;\n    let projectError = '';\n    let projectGeneration = 0;\n    // Nora 31.10. (v4): Menge der Bodenvariante im Warenkorb nach einem Bestandsfehler (422), gelesen aus /cart.js\n    let projectCartQuantity = null;\n    const projectId = window.crypto?.randomUUID?.() || `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n    const projectCartButton = section.querySelector('[data-bp-project-cart]');\n    const projectRetryButton = section.querySelector('[data-bp-project-retry]');\n    const cartRoot = window.Shopify?.routes?.root || '/';\n\n    function projectIsValid() {\n      return currentVariantAvailable && currentPackages > 0 && packageM2 > 0 && (purchaseMode === 'packages' || currentArea > 0);\n    }\n\n    function renderProjectState() {\n      if (!projectRequested) return;\n      const pending = projectAppliedVersion !== projectVersion;\n      const valid = projectIsValid() && selectionTotals().valid;\n      if (projectCartButton) {\n        projectCartButton.hidden = false;\n        projectCartButton.disabled = !valid || Boolean(projectRequest);\n      }\n      if (projectRetryButton) projectRetryButton.hidden = !projectError;\n      // Nora 31.10. (v4): Bestandsfehler nur noch EINMAL am Kauf-Button melden, nicht zus\u00E4tzlich im Zubeh\u00F6r-Bereich\n      if (accessorySummary) accessorySummary.textContent = projectError && projectCartQuantity === null ? section.dataset.textAutoError\n        : !valid ? section.dataset.textSelectionPending\n        : pending ? section.dataset.textAutoUpdating\n        : `${section.dataset.textAutoSaved}${selectedAccessoryElements().length ? ' \u00B7 ' + section.dataset.textSelection + ': ' + money.format(selectionTotals().accessories / 100) : ''}`;\n      buildItems.forEach(item => {\n        const label = item.querySelector('.bp-accessory-select__on');\n        if (label) label.textContent = !pending && !projectError ? section.dataset.textAutoSelected : section.dataset.textAccessoryChosen;\n      });\n      setPurchaseState();\n    }\n\n    function projectItems() {\n      const fields = new FormData(form);\n      const properties = {_bp_project: projectId};\n      fields.forEach((value, key) => {\n        const match = key.match(/^properties\\[(.+)\\]$/);\n        if (match && String(value).trim()) properties[match[1]] = String(value);\n      });\n      return [{id:Number(fields.get('id')),quantity:currentPackages,properties}, ...accessoryCartItems().map(item => ({...item,properties:{...item.properties,_bp_project:projectId}}))];\n    }\n\n    async function cartJson(path, body) {\n      const response = await fetch(cartRoot + path, body ? {\n        method:'POST',headers:{'Content-Type':'application/json',Accept:'application/json'},signal:AbortSignal.timeout(15000),body:JSON.stringify({...body,sections:cartSectionIds.join(','),sections_url:window.location.pathname})\n      } : {headers:{Accept:'application/json'},cache:'no-store',signal:AbortSignal.timeout(15000)});\n      const result = await response.json();\n      if (!response.ok) {\n        const failure = new Error(result.description || section.dataset.textProjectError);\n        failure.status = response.status; // Nora 31.10. (v7): 422 = Bestand, f\u00FCr die ruhige Meldung\n        throw failure;\n      }\n      if (result.sections) cartDrawer?.renderContents(result, false);\n      return result;\n    }\n\n    async function synchronizeProject() {\n      clearTimeout(projectTimer);\n      if (projectRequest) return projectRequest;\n      if (!projectRequested || !projectIsValid() || !selectionTotals().valid) return false;\n      if (projectAppliedVersion === projectVersion) return true;\n      projectError = '';\n      const generation = projectGeneration;\n      projectRequest = (async () => {\n        try {\n          while (projectAppliedVersion !== projectVersion) {\n            if (!projectRequested || generation !== projectGeneration || !projectIsValid() || !selectionTotals().valid) return false;\n            const version = projectVersion;\n            const desired = projectItems();\n            // Nora 31.10. (Selin 19:36, Punkt 2): mit dem beim \u00D6ffnen geholten Warenkorb schon vorher pr\u00FCfen \u2013 \u00FCber dem Bestand ohne Netz-Aufruf\n            if (LIMIT_TO_STOCK && liveCart && exceedsStock(desired, liveCart)) {\n              stockCart = liveCart;\n              const stockError = new Error(cartShortageText());\n              stockError.status = 'stock';\n              throw stockError;\n            }\n            let cart = await cartJson('cart.js');\n            if (!projectRequested || generation !== projectGeneration) return false;\n            // Nora 31.10. (v7, 19:00): Bestand VOR dem Absenden pr\u00FCfen (Boden + mitgew\u00E4hltes Zubeh\u00F6r). Reicht es f\u00FCr\n            // eine Position nicht, geht der ganze Request nicht raus: kein update.js, kein add.js.\n            if (LIMIT_TO_STOCK && exceedsStock(desired, cart)) {\n              stockCart = cart; // f\u00FCr die Pr\u00FCfung \u201EMenge wieder \u2264 Bestand\u201C nach einer Eingabe\n              const stockError = new Error(cartShortageText());\n              stockError.status = 'stock';\n              throw stockError;\n            }\n            const existing = cart.items.filter(item => item.properties?._bp_project === projectId);\n            const additions = [...desired];\n            const updates = {};\n            for (const line of existing) {\n              const index = additions.findIndex(item => Number(item.id) === Number(line.variant_id));\n              const target = index >= 0 ? additions.splice(index, 1)[0] : null;\n              const sameProperties = target && Object.keys({...line.properties,...target.properties}).every(key => String(line.properties?.[key] || '') === String(target.properties?.[key] || ''));\n              if (!target || line.quantity !== target.quantity) updates[line.key] = target?.quantity || 0;\n              if (target && !sameProperties) {\n                updates[line.key] = 0;\n                additions.push(target);\n              }\n            }\n            if (Object.keys(updates).length) cart = await cartJson('cart/update.js', {updates});\n            if (!projectRequested || generation !== projectGeneration) return false;\n            if (additions.length) {\n              const beforeAdd = cart;\n              try {\n                await cartJson('cart/add.js',{items:additions});\n              } catch (addError) {\n                // Fallback (Bestand inzwischen gesunken): Shopify hat ggf. schon eine Teilmenge abgelegt -> auf Stand vor dem Klick zur\u00FCck\n                if (addError.status === 422 && LIMIT_TO_STOCK) {\n                  stockCart = null; // echter Bestand unbekannt: n\u00E4chste Eingabe gibt den Button wieder frei\n                  await restoreCart(beforeAdd);\n                }\n                throw addError;\n              }\n            }\n            if (!projectRequested || generation !== projectGeneration) return false;\n            projectAppliedVersion = version;\n          }\n          return true;\n        } catch (error) {\n          projectError = error.message || section.dataset.textAutoError;\n          if (LIMIT_TO_STOCK && (error.status === 'stock' || error.status === 422)) {\n            // Nora 31.10. (v7, 19:00): nichts im Warenkorb, nur die ruhige Meldung; Kaufbutton wieder normal\n            projectError = cartShortageText();\n            projectCartQuantity = null;\n            stopProjectAfterStock();\n            if (buildMessage) buildMessage.textContent = '';\n            renderFormError();\n            return false;\n          }\n          // Nora 31.10. (v4): Nach einem Fehler die tats\u00E4chlich im Warenkorb liegende Menge aus /cart.js lesen.\n          // Shopify legt bei 422 (Bestand) die verf\u00FCgbare Menge in den Warenkorb; nur das wird gemeldet.\n          projectCartQuantity = null;\n          try {\n            const variantId = Number(new FormData(form).get('id'));\n            const current = await cartJson('cart.js');\n            const quantity = current.items\n              .filter(item => item.properties?._bp_project === projectId && Number(item.variant_id) === variantId)\n              .reduce((sum, item) => sum + item.quantity, 0);\n            if (quantity > 0 && quantity < currentPackages) {\n              projectCartQuantity = quantity;\n            }\n          } catch (readError) { /* Menge unbekannt */ }\n          // Nora 31.10. (v7, 18:58): bei Bestandsfehler nur eine ruhige Meldung mit Telefon, ohne Fehlmenge und ohne Betrag\n          if (error.status === 422 || projectCartQuantity !== null) projectError = cartShortageText();\n          // (Nur noch relevant, falls LIMIT_TO_STOCK wieder auf false gesetzt wird.)\n          // Nur eine Meldung, direkt \u00FCber dem Kauf-Button (kein zweiter Text im Zubeh\u00F6r-Bereich)\n          if (buildMessage) buildMessage.textContent = '';\n          renderFormError();\n          return false;\n        } finally {\n          projectRequest = null;\n          renderProjectState();\n          if (projectRequested && !projectError && projectAppliedVersion !== projectVersion && projectIsValid() && selectionTotals().valid) projectTimer = setTimeout(synchronizeProject, 0);\n        }\n      })();\n      renderProjectState();\n      return projectRequest;\n    }\n\n    function scheduleProjectSync() {\n      if (!projectRequested) return;\n      projectVersion += 1;\n      if (formMessage && projectError && formMessage.textContent === projectError) formMessage.textContent = '';\n      projectError = '';\n      projectCartQuantity = null;\n      if (buildMessage) buildMessage.textContent = '';\n      renderProjectState();\n      clearTimeout(projectTimer);\n      projectTimer = setTimeout(synchronizeProject, 180);\n    }\n\n    function beginProject() {\n      projectRequested = true;\n      section.dataset.bpCartProjectActive = 'true';\n      scheduleProjectSync();\n    }\n\n    function resetProjectAfterRemoval() {\n      if (!projectRequested) return;\n      projectRequested = false;\n      projectGeneration += 1;\n      clearTimeout(projectTimer);\n      projectVersion = 0;\n      projectAppliedVersion = -1;\n      projectError = '';\n      projectCartQuantity = null;\n      delete section.dataset.bpCartProjectActive;\n      if (projectCartButton) projectCartButton.hidden = true;\n      if (projectRetryButton) projectRetryButton.hidden = true;\n      if (formMessage) formMessage.textContent = '';\n      if (buildMessage) buildMessage.textContent = '';\n      buildItems.forEach(item => {\n        const label = item.querySelector('.bp-accessory-select__on');\n        if (label) label.textContent = section.dataset.textAccessoryChosen;\n      });\n      clearAccessorySelection();\n    }\n\n    if (typeof subscribe === 'function' && typeof PUB_SUB_EVENTS !== 'undefined') {\n      const unsubscribeProjectCart = subscribe(PUB_SUB_EVENTS.cartUpdate, event => {\n        if (event.source === 'cart-items' && event.cartData?.item_count === 0) resetProjectAfterRemoval();\n      });\n      document.addEventListener('shopify:section:unload', event => {\n        if (event.target.contains(section)) unsubscribeProjectCart();\n      });\n    }\n    if (cartDrawer) {\n      const projectCartObserver = new MutationObserver(() => {\n        if (!projectRequest && projectAppliedVersion >= 0 && cartDrawer.classList.contains('is-empty')) resetProjectAfterRemoval();\n      });\n      projectCartObserver.observe(cartDrawer, {attributes:true,attributeFilter:['class']});\n      document.addEventListener('shopify:section:unload', event => {\n        if (event.target.contains(section)) projectCartObserver.disconnect();\n      });\n    }\n\n    function showAreaError(input) {\n      const field = input || areaInput;\n      if (areaError) {\n        areaError.textContent = textAreaRequired;\n        areaError.hidden = false;\n      } else if (formMessage) formMessage.textContent = textAreaRequired;\n      field?.setAttribute('aria-invalid', 'true');\n      field?.closest('.bp-floor-main__input-wrap')?.classList.add('is-invalid');\n      field?.focus();\n    }\n\n    function clearAreaError() {\n      if (areaError) {\n        areaError.textContent = '';\n        areaError.hidden = true;\n      }\n      if (formMessage && formMessage.textContent === textAreaRequired) formMessage.textContent = '';\n      [areaInput, accessoryAreaInput].forEach(field => {\n        field?.removeAttribute('aria-invalid');\n        field?.closest('.bp-floor-main__input-wrap')?.classList.remove('is-invalid');\n      });\n    }\n\n    // Nora 31.10. (v7, 18:58): Haken f\u00FCr \u201Eauf Bestand begrenzen\u201C. Bleibt false, bis Selin/Selahattin entschieden haben.\n    // Bei true k\u00F6nnte synchronizeProject nach einem 422 die Menge aus /cart.js \u00FCbernehmen (projectCartQuantity) und\n    // den Rechner darauf setzen. Das Hinzuf\u00FCgen selbst ist unver\u00E4ndert (Shopify legt bei 422 die verf\u00FCgbare Menge ab).\n    // 19:00: aktiviert (Entscheidung Selahattin 18:58). Grenze aus data-stock-limit (nur mit Bestandsf\u00FChrung und Policy \u201Edeny\u201C).\n    const LIMIT_TO_STOCK = true;\n\n    function stockLimitFor(variantId) {\n      const id = Number(variantId);\n      if (id === Number(new FormData(form).get('id'))) return BodenpulseStock.parseLimit(section.dataset.stockLimit);\n      return BodenpulseStock.parseLimit(section.querySelector(`[data-variant-id=\"${id}\"][data-stock-limit]`)?.dataset.stockLimit);\n    }\n    function exceedsStock(desired, cart) {\n      // schon im Warenkorb z\u00E4hlt mit (ohne die Zeilen dieses Projekts, die ohnehin ersetzt werden)\n      return BodenpulseStock.exceeds(desired, cart, stockLimitFor, line => line.properties?._bp_project === projectId);\n    }\n    async function restoreCart(before) {\n      await BodenpulseStock.restore(before, cartJson);\n    }\n    function stopProjectAfterStock() {\n      projectRequested = false;\n      projectGeneration += 1;\n      clearTimeout(projectTimer);\n      projectVersion = 0;\n      projectAppliedVersion = -1;\n      delete section.dataset.bpCartProjectActive;\n      if (projectCartButton) projectCartButton.hidden = true;\n      if (projectRetryButton) projectRetryButton.hidden = true;\n      setPurchaseState();\n      totalBox?.classList.add('is-stock-hidden'); // 18:58: im Bestandsfall keine gro\u00DFe Gesamtsumme\n      setStockCall(true);\n    }\n\n    // Nora 31.10. (v7, Selin 19:16): im gesperrten Bestandszustand wird der Warenkorb-Button zu \u201EJetzt anrufen\u201C.\n    // Echter Link (tel:), gleiche Optik (gleiche Klasse), kein add.js. Der Original-Button bleibt im DOM, nur verborgen.\n    let stockCart = null;\n    let stockCallLink = null;\n    function setStockCall(active) {\n      stockCallLink = BodenpulseStock.toggleCall({ root: section, button: addButton, link: stockCallLink, active, callClass: 'bp-floor-main__add--call' });\n    }\n    // Nora 31.10. (Selin 19:36, Punkt 2 / 19:38): Bestandspr\u00FCfung schon bei der Eingabe (250 ms entprellt).\n    // /cart.js nur einmal beim \u00D6ffnen (erster Fokus/Tipp im Bereich) holen und zwischenspeichern; nach einem Absenden neu.\n    // Sperre nur, wenn eine gew\u00E4hlte Position eine Grenze hat (Bestandsf\u00FChrung + DENY). CONTINUE/ohne F\u00FChrung: nie.\n    // \u00DCber dem Bestand: Meldung + \u201EJetzt anrufen\u201C, Pakete/Betr\u00E4ge per CSS ([data-bp-stock-call]) ausgeblendet.\n    // Menge wieder \u2264 Bestand: sofort normale Anzeige.\n    let liveCart = null;\n    let liveCartRequest = null;\n    const pageHasLimit = () => !!(section.dataset.stockLimit !== undefined || section.querySelector('[data-stock-limit]'));\n    function loadLiveCart() {\n      if (!LIMIT_TO_STOCK || !pageHasLimit()) return null;\n      if (liveCart) return Promise.resolve(liveCart);\n      if (!liveCartRequest) liveCartRequest = BodenpulseStock.cart().then(cart => (liveCart = cart)).catch(() => null).finally(() => { liveCartRequest = null; });\n      return liveCartRequest;\n    }\n    function enterStockState(cart) {\n      stockCart = cart;\n      projectError = cartShortageText();\n      projectCartQuantity = null;\n      stopProjectAfterStock(); // stoppt auch einen geplanten Projekt-Abgleich: kein update.js/add.js\n      if (buildMessage) buildMessage.textContent = '';\n      renderFormError();\n    }\n    function leaveStockState() {\n      stockCart = null;\n      if (formMessage) {\n        formMessage.textContent = '';\n        formMessage.classList.remove('is-stock-note');\n      }\n      totalBox?.classList.remove('is-stock-hidden');\n      projectError = '';\n      setStockCall(false);\n      setPurchaseState();\n    }\n    let stockTimer = 0;\n    function liveStockCheck() {\n      if (!LIMIT_TO_STOCK) return;\n      clearTimeout(stockTimer);\n      stockTimer = setTimeout(() => {\n        const active = section.dataset.bpStockCall === 'true';\n        let desired = null;\n        try { desired = projectItems(); } catch (itemsError) { desired = null; } // Auswahl unvollst\u00E4ndig: keine Sperre\n        const limited = !!desired && desired.some(item => stockLimitFor(item.id) !== null);\n        if (!limited) { if (active) leaveStockState(); return; }\n        const cart = liveCart || stockCart;\n        if (!cart) { loadLiveCart()?.then(loaded => { if (loaded) liveStockCheck(); }); return; }\n        let tooMuch = false;\n        try { tooMuch = exceedsStock(desired, cart); } catch (stockError) { tooMuch = false; }\n        if (tooMuch && !active) enterStockState(cart);\n        else if (!tooMuch && active && !projectRequested) leaveStockState();\n      }, 250);\n    }\n    section.addEventListener('focusin', () => { loadLiveCart(); });\n    section.addEventListener('input', liveStockCheck);\n    section.addEventListener('change', liveStockCheck);\n    section.addEventListener('click', event => {\n      if (event.target.closest?.('[data-bp-stock-call]')) return;\n      if (event.target.closest?.('button:not([data-bp-add]), [data-bp-build-item], [data-bp-order-dialog-open], .bp-order-dialog__inline-trigger')) { loadLiveCart(); liveStockCheck(); }\n    });\n\n    // Nora 31.10. (v7): Telefon und Meldungstext aus dem gemeinsamen Bestandscode (oben)\n    function shopPhone() {\n      return BodenpulseStock.phone();\n    }\n    function cartShortageParts() {\n      return { text: BodenpulseStock.message, phone: shopPhone() };\n    }\n    function cartShortageText() {\n      const parts = cartShortageParts();\n      return parts.text + parts.phone.text;\n    }\n    function renderFormError() {\n      if (!formMessage) return;\n      const isStock = projectError === cartShortageText();\n      formMessage.classList.toggle('is-stock-note', isStock);\n      if (!isStock) {\n        formMessage.textContent = projectError;\n        return;\n      }\n      BodenpulseStock.renderNote(formMessage, 'bp-floor-main__form-phone');\n    }\n\n    // Nora 31.10. (18:15): Nach Bestandsfehler (422) zeigt der Rechner den echten Warenkorb-Stand aus /cart.js\n    // Nora 31.10. (v7): Zusatzzeile \u201EF\u00FCr \u2026 fehlen \u2026\u201C (data-bp-cart-gap) entfernt \u2013 steht jetzt in der einen Meldung \u00FCber dem Button\n    let cartViewActive = false;\n    function applyCartQuantityView() {\n      const quantity = projectCartQuantity;\n      if (quantity === null) {\n        if (!cartViewActive) return;\n        // Eingabe ge\u00E4ndert: wieder normal rechnen\n        cartViewActive = false;\n        totalBox?.classList.remove('is-cart-view');\n        const summary = selectionTotals();\n        const configured = currentPackages > 0;\n        if (resultPackages) resultPackages.textContent = configured ? currentPackages : '\u2013';\n        if (resultOrderArea) resultOrderArea.textContent = configured ? `${areaDecimal.format(currentOrderArea)} m\u00B2` : '\u2013';\n        if (total) total.textContent = configured && summary.valid ? money.format(summary.grand / 100) : '\u2013';\n        if (totalHelper && configured) totalHelper.textContent = `${currentPackages} ${currentPackages === 1 ? textPackageOne : textPackageOther}`;\n        section.querySelectorAll('[data-bp-order-floor]').forEach(node => { node.textContent = configured ? money.format(summary.floor / 100) : '\u2013'; });\n        section.querySelectorAll('[data-bp-order-shipping]').forEach(node => {\n          node.textContent = configured && summary.valid ? (summary.shipping === 0 ? section.dataset.textFreeShipping : money.format(summary.shipping / 100)) : '\u2013';\n        });\n        updateTotalSaving(currentPackages);\n        return;\n      }\n      // Nora 31.10. (v7, 18:58): keine Warenkorb-Umrechnung mehr. Rechner bleibt wie vor dem Klick,\n      // nur die Gesamt-Zeile (gro\u00DFer Betrag) wird ausgeblendet. Mit LIMIT_TO_STOCK sp\u00E4ter: Werte auf `quantity` umstellen.\n      cartViewActive = true;\n      totalBox?.classList.add('is-cart-view');\n    }\n\n    function updateShippingLine() {\n      if (!totalShipping) return;\n      applyCartQuantityView();\n      const summary = selectionTotals(LIMIT_TO_STOCK && projectCartQuantity !== null ? projectCartQuantity : currentPackages);\n      const ready = projectIsValid() && summary.valid;\n      totalShipping.hidden = !ready;\n      // Nora 31.10. (v4): eine Zeile statt Label + Zusatz; Label nur ohne g\u00FCltige Auswahl\n      const totalLabel = totalShipping.parentElement?.querySelector(':scope > span');\n      if (totalLabel) totalLabel.hidden = ready;\n      if (!ready) return;\n      // Versandstufen kommen aus den Section-Einstellungen (data-*-cents), nicht fest im Code.\n      totalShipping.textContent = summary.shipping > 0\n        ? `Gesamt inkl. ${money.format(summary.shipping / 100)} Versand`\n        : 'Gesamt, versandkostenfrei';\n    }\n\n    async function showProjectCart(options) {\n      // Fix 31.10.: Ohne g\u00FCltige Fl\u00E4che kein Projekt starten. Vorher setzte ein Tipp auf\n      // \u201EFl\u00E4che eingeben\u201C projectRequested=true, danach legte jede Eingabe still in den Warenkorb.\n      if (!projectIsValid()) {\n        // Fix 31.10.: Beim Warenkorb-Button im Rechner/Dialog das eigene Fl\u00E4chenfeld markieren (aria-invalid, Fokus),\n        // nicht das Feld im Zubeh\u00F6r-Bereich (im offenen Dialog nicht fokussierbar).\n        showAreaError(options?.main ? areaInput : (accessoryAreaInput?.getClientRects().length ? accessoryAreaInput : areaInput));\n        return;\n      }\n      clearAreaError();\n      // Nora 31.10. (v4): Nach Bestandsfehler zeigt der Button die Warenkorb-Menge; Tipp \u00F6ffnet den Warenkorb\n      if (projectRequested && projectCartQuantity !== null && projectAppliedVersion !== projectVersion && !projectRequest) {\n        if (cartDrawer) {\n          cartDrawer.setActiveElement(document.activeElement);\n          cartDrawer.open();\n        } else window.location.assign(section.dataset.cartUrl || '/cart');\n        return;\n      }\n      if (!projectRequested) beginProject();\n      do {\n        if (!await synchronizeProject()) {\n          if (projectError) renderFormError();\n          return;\n        }\n      } while (projectAppliedVersion !== projectVersion);\n      section.dispatchEvent(new CustomEvent('bp:floor-added'));\n      if (cartDrawer) {\n        cartDrawer.setActiveElement(document.activeElement);\n        cartDrawer.open();\n      } else window.location.assign(section.dataset.cartUrl || '/cart');\n    }\n\n    projectCartButton?.addEventListener('click', showProjectCart);\n    projectRetryButton?.addEventListener('click', synchronizeProject);\n    section.addEventListener('click', event => {\n      const jump = event.target.closest('.bp-floor-accessories__jump');\n      if (!jump) return;\n      event.preventDefault();\n      event.stopPropagation();\n      if (!projectIsValid()) {\n        showAreaError(areaInput);\n        return;\n      }\n      beginProject();\n      section.dispatchEvent(new CustomEvent('bp:project-started'));\n      const target = document.getElementById(jump.getAttribute('href')?.slice(1));\n      requestAnimationFrame(() => target?.scrollIntoView({block:'start',behavior:window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'instant' : 'smooth'}));\n    }, true);\n\n\n    function updateTotalSaving(packageQuantity = 0) {\n      if (!totalSaving || !totalSavingWrap) return;\n\n      const saving =\n        Math.max(0, currentVariantCompareAtPrice - currentVariantPrice) *\n        Math.max(0, packageQuantity);\n\n      totalSavingWrap.hidden = saving <= 0;\n      totalSaving.textContent = saving > 0 ? money.format(saving / 100) : '';\n    }\n\n    function selectedAccessoryElements() {\n      const materials = buildItems.filter(item => {\n        const input = item.querySelector('[data-bp-build-select]');\n        return input?.checked && !input.disabled;\n      });\n      const skirting = getSelectedSkirtingItem();\n      return skirting ? [...materials, skirting] : materials;\n    }\n\n    function selectionTotals(floorPackages = currentPackages) {\n      const elements = selectedAccessoryElements();\n      const valid = elements.every(item =>\n        Number(item.dataset.calculatedQuantity) > 0 && Number(item.dataset.variantId) > 0\n      );\n      // Nora 31.10. (18:15): Paketzahl \u00FCbersteuerbar (Warenkorb-Menge nach 422), sonst wie bisher\n      const floor = floorPackages * currentVariantPrice;\n      const accessories = elements.reduce((sum, item) =>\n        sum + Math.max(0, Number(item.dataset.calculatedQuantity) || 0) * Number(item.dataset.price || 0), 0\n      );\n      const goods = floor + accessories;\n      // The highest shipping group is flooring. These are the configured floor tiers.\n      const shipping = goods >= freeShippingThreshold ? 0\n        : goods >= shippingReducedThreshold ? shippingReducedCents : shippingStandardCents;\n      return { elements, valid, floor, accessories, goods, shipping, grand: goods + shipping };\n    }\n\n    function updateOrderSummary() {\n      const summary = selectionTotals();\n      const configured = currentPackages > 0;\n      const ready = configured && summary.valid;\n      if (total) total.textContent = ready ? money.format(summary.grand / 100) : '\u2013';\n      if (totalHelper) totalHelper.textContent = !configured ? section.dataset.textTotalPending\n        : !summary.valid ? section.dataset.textSelectionPending\n        : `${currentPackages} ${currentPackages === 1 ? textPackageOne : textPackageOther}`;\n      section.querySelectorAll('[data-bp-order-floor]').forEach(node => {\n        node.textContent = configured ? money.format(summary.floor / 100) : '\u2013';\n      });\n      section.querySelectorAll('[data-bp-order-accessories]').forEach(node => {\n        node.textContent = summary.valid ? money.format(summary.accessories / 100) : '\u2013';\n      });\n      section.querySelectorAll('[data-bp-order-shipping]').forEach(node => {\n        node.textContent = ready ? (summary.shipping === 0 ? section.dataset.textFreeShipping : money.format(summary.shipping / 100)) : '\u2013';\n      });\n      if (accessorySummary) {\n        const selectionText = summary.elements.length\n          ? `${section.dataset.textSelection}: ${summary.valid ? money.format(summary.accessories / 100) : section.dataset.textSelectionPending}`\n          : section.dataset.textSelectionEmpty;\n        accessorySummary.textContent = selectionText;\n      }\n      if (buildArea) buildArea.closest('.bp-floor-build__area').hidden = currentArea <= 0;\n      if (buildArea) buildArea.textContent = currentArea > 0\n        ? `${decimal.format(currentArea)} m\u00B2${purchaseMode === 'packages' ? ' \u00B7 ' + section.dataset.textPackagesArea : ''}`\n        : section.dataset.textTotalPending;\n      setPurchaseState();\n      if (projectRequested) scheduleProjectSync();\n    }\n\n    function setPurchaseState() {\n      if (!addButton) return;\n      // Versandzeile im Gesamtkasten nach allen synchronen Updates neu setzen\n      queueMicrotask(updateShippingLine);\n\n      const valid =\n        currentVariantAvailable &&\n        currentPackages > 0 &&\n        packageM2 > 0 &&\n        (purchaseMode === 'packages' || currentArea > 0);\n\n      addButton.disabled = purchaseIsSubmitting || !currentVariantAvailable;\n      if (purchaseIsSubmitting) {\n        addLabel.textContent = textAdding;\n        return;\n      }\n\n      if (!currentVariantAvailable) {\n        addLabel.textContent = textUnavailable;\n        addSubline.textContent = '';\n        return;\n      }\n\n      if (!valid) {\n        addLabel.textContent = textAreaCta;\n        addSubline.textContent = textAreaCtaHelp;\n        return;\n      }\n      // Fix 31.10.: veralteten Hinweis \u201EBitte zuerst deine Raumfl\u00E4che eingeben.\u201C entfernen\n      clearAreaError();\n\n      if (projectRequested) {\n        // Nora 31.10. (v4): nach Bestandsfehler echte Warenkorb-Menge statt der gew\u00FCnschten Summe zeigen\n        if (projectCartQuantity !== null) {\n          addLabel.textContent = `${projectCartQuantity} ${projectCartQuantity === 1 ? textPackageOne : textPackageOther} im Warenkorb`;\n          addSubline.textContent = '';\n          return;\n        }\n        addLabel.textContent = section.dataset.textViewCart;\n        addSubline.textContent = `${areaDecimal.format(currentOrderArea)} m\u00B2 \u00B7 ${total?.textContent || ''}`;\n        return;\n      }\n\n      const finalPrice = currentPackages * currentVariantPrice;\n      const packageLabel = currentPackages === 1 ? textPackageOne : textPackageOther;\n\n      addLabel.textContent = selectedAccessoryElements().length\n        ? section.dataset.textCartWithAccessories\n        : `${currentPackages} ${packageLabel} ${textAddToCart}`;\n\n      addSubline.textContent =\n        `${areaDecimal.format(currentOrderArea)} m\u00B2 \u00B7 ${total?.textContent || ''}`;\n    }\n\n    function calculateFloor() {\n      if (!areaInput || packageM2 <= 0) return;\n\n      currentArea = Number(String(areaInput.value || '0').replace(',', '.'));\n      currentWaste = Number(wasteInput?.value || 10);\n\n      if (!Number.isFinite(currentArea) || currentArea <= 0) {\n        currentArea = 0;\n        currentPackages = 0;\n        currentOrderArea = 0;\n\n        if (calculation) calculation.hidden = false;\n        if (totalBox) totalBox.hidden = false;\n\n        if (resultPackages) resultPackages.textContent = '\u2013';\n        if (resultOrderArea) resultOrderArea.textContent = '\u2013';\n        if (total) total.textContent = '\u2013';\n        if (totalHelper) totalHelper.textContent = 'Raumfl\u00E4che eingeben';\n\n        if (quantityInput) quantityInput.value = 1;\n        if (areaProperty) areaProperty.value = '';\n        if (wasteProperty) wasteProperty.value = '';\n        if (neededAreaProperty) neededAreaProperty.value = '';\n        if (orderAreaProperty) orderAreaProperty.value = '';\n\n        updateTotalSaving(0);\n        setPurchaseState();\n        calculateBuildItems();\n\n        return;\n      }\n\n      const neededArea =\n        currentArea * (1 + currentWaste / 100);\n\n      currentPackages =\n        Math.ceil((neededArea / packageM2) - 1e-9);\n\n      currentOrderArea =\n        currentPackages * packageM2;\n\n      const finalPrice =\n        currentPackages * currentVariantPrice;\n\n      calculation.hidden = false;\n      totalBox.hidden = false;\n\n      resultPackages.textContent =\n        currentPackages;\n\n      resultOrderArea.textContent =\n        `${areaDecimal.format(currentOrderArea)} m\u00B2`;\n\n      total.textContent =\n        money.format(finalPrice / 100);\n\n      totalHelper.textContent =\n        `${currentPackages} ${currentPackages === 1 ? 'Paket' : 'Pakete'}`;\n\n      updateTotalSaving(currentPackages);\n\n      quantityInput.value =\n        currentPackages;\n\n      areaProperty.value =\n        `${areaDecimal.format(currentArea)} m\u00B2`;\n\n      wasteProperty.value =\n        `${currentWaste} %`;\n\n      neededAreaProperty.value =\n        `${areaDecimal.format(neededArea)} m\u00B2`;\n\n      orderAreaProperty.value =\n        `${areaDecimal.format(currentOrderArea)} m\u00B2`;\n\n      setPurchaseState();\n      calculateBuildItems();\n    }\n\n    function normalizedPackageQuantity() {\n      const value = Number.parseInt(packageQuantityInput?.value || '1', 10);\n\n      if (!Number.isFinite(value)) return 1;\n\n      return Math.min(999, Math.max(1, value));\n    }\n\n    function calculatePackages() {\n      if (!packageQuantityInput || packageM2 <= 0) return;\n\n      currentPackages = normalizedPackageQuantity();\n      currentOrderArea = currentPackages * packageM2;\n      currentArea = currentOrderArea;\n      packageQuantityInput.value = String(currentPackages);\n\n      const finalPrice = currentPackages * currentVariantPrice;\n      const packageLabel = currentPackages === 1 ? textPackageOne : textPackageOther;\n\n      if (calculation) calculation.hidden = false;\n      if (totalBox) totalBox.hidden = false;\n\n      resultPackages.textContent = currentPackages;\n      resultOrderArea.textContent = `${areaDecimal.format(currentOrderArea)} m\u00B2`;\n      total.textContent = money.format(finalPrice / 100);\n      totalHelper.textContent = `${currentPackages} ${packageLabel}`;\n      updateTotalSaving(currentPackages);\n\n      quantityInput.value = currentPackages;\n      areaProperty.value = '';\n      wasteProperty.value = '';\n      neededAreaProperty.value = '';\n      orderAreaProperty.value = `${areaDecimal.format(currentOrderArea)} m\u00B2`;\n\n      setPurchaseState();\n      calculateBuildItems();\n    }\n\n    function setPurchaseMode(nextMode) {\n      purchaseMode = nextMode === 'packages' ? 'packages' : 'area';\n\n      calculatorModeButtons.forEach((button) => {\n        const isActive = button.dataset.bpCalculatorMode === purchaseMode;\n\n        button.classList.toggle('is-active', isActive);\n        button.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n      });\n\n      if (areaPanel) areaPanel.hidden = purchaseMode !== 'area';\n      if (packagePanel) packagePanel.hidden = purchaseMode !== 'packages';\n\n      if (purchaseMode === 'packages') {\n        if (currentPackages > 0 && packageQuantityInput) {\n          packageQuantityInput.value = String(currentPackages);\n        }\n\n        calculatePackages();\n        return;\n      }\n\n      calculateFloor();\n    }\n\n    accessoryAreaInput?.addEventListener('input', () => {\n      areaInput.value = accessoryAreaInput.value;\n      setPurchaseMode('area');\n    });\n    accessoryWasteInput?.addEventListener('change', () => {\n      wasteInput.value = accessoryWasteInput.value;\n      currentWaste = Number(accessoryWasteInput.value);\n      wasteButtons.forEach(button => {\n        const active = Number(button.dataset.waste) === currentWaste;\n        button.classList.toggle('is-active', active);\n        button.setAttribute('aria-pressed', String(active));\n      });\n      if (purchaseMode === 'area') calculateFloor();\n    });\n\n    areaInput?.addEventListener('input', calculateFloor);\n    // 31.10. (Nora): Enter/\u201EFertig\u201C auf der Tastatur nur berechnen \u2013 kein Absenden, kein Neuladen.\n    areaInput?.addEventListener('keydown', (event) => {\n      if (event.key !== 'Enter') return;\n      event.preventDefault();\n      calculateFloor();\n      // Nora 31.10. (v7): Fokus bleibt im Feld (vorher blur -> Fokus auf BODY, Screenreader verlor die Position)\n    });\n    areaInput?.addEventListener('change', calculateFloor);\n\n    calculatorModeButtons.forEach((button) => {\n      button.addEventListener('click', () => {\n        setPurchaseMode(button.dataset.bpCalculatorMode);\n      });\n    });\n\n    packageQuantityInput?.addEventListener('input', calculatePackages);\n    packageQuantityInput?.addEventListener('change', calculatePackages);\n\n    packageDecrease?.addEventListener('click', () => {\n      packageQuantityInput.value = String(Math.max(1, normalizedPackageQuantity() - 1));\n      calculatePackages();\n    });\n\n    packageIncrease?.addEventListener('click', () => {\n      packageQuantityInput.value = String(Math.min(999, normalizedPackageQuantity() + 1));\n      calculatePackages();\n    });\n\n    wasteButtons.forEach((button) => {\n      button.addEventListener('click', () => {\n        currentWaste = Number(button.dataset.waste || 10);\n\n        wasteInput.value = String(currentWaste);\n\n        wasteButtons.forEach((option) => {\n          const isActive = option === button;\n\n          option.classList.toggle('is-active', isActive);\n          option.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n        });\n\n        calculateFloor();\n      });\n    });\n\n    function calculateBuildItem(item) {\n      const calcType = item.dataset.calcType;\n      const consumeM2 = Number(item.dataset.consumeM2 || 0);\n      const consumeMm = Number(item.dataset.consumeMm || 0);\n      const packageContent = Number(item.dataset.packageContent || 0);\n      const coverage = Number(item.dataset.coverage || 0);\n      const extra = Number(item.dataset.extra || 0);\n      const price = Number(item.dataset.price || 0);\n\n      const quantityOutput = item.querySelector('[data-bp-build-quantity]');\n      const totalOutput = item.querySelector('[data-bp-build-total]');\n      const thicknessInput = item.querySelector('[data-bp-thickness]');\n\n      let quantity = 0;\n\n      const calcArea =\n        currentArea * (1 + extra / 100);\n\n      if (currentArea <= 0 && calcType !== 'einzeln') {\n        const ordered = item.querySelector('bp-adjustable-quantity')?.sync(0) || 0;\n        item.dataset.calculatedQuantity = String(ordered);\n        quantityOutput.textContent = 'Fl\u00E4che eingeben';\n        totalOutput.textContent = ordered > 0 ? money.format(ordered * price / 100) : '';\n        return;\n      }\n\n      if (calcType === 'flaeche') {\n        if (consumeM2 > 0 && packageContent > 0) {\n          quantity =\n            Math.ceil((calcArea * consumeM2) / packageContent - 1e-9);\n        }\n      }\n\n      if (calcType === 'schichtdicke') {\n        const mm = Number(thicknessInput?.value || 5);\n\n        if (consumeMm > 0 && packageContent > 0) {\n          quantity =\n            Math.ceil((calcArea * mm * consumeMm) / packageContent - 1e-9);\n        }\n      }\n\n      if (calcType === 'abdeckung') {\n        if (coverage > 0) {\n          quantity =\n            Math.ceil(calcArea / coverage - 1e-9);\n        }\n      }\n\n      if (calcType === 'einzeln') {\n        quantity = 1;\n      }\n\n      if (quantity <= 0) {\n        const ordered = item.querySelector('bp-adjustable-quantity')?.sync(0) || 0;\n        item.dataset.calculatedQuantity = String(ordered);\n        quantityOutput.textContent = 'Rechnerdaten fehlen';\n        totalOutput.textContent = ordered > 0 ? money.format(ordered * price / 100) : '';\n        return;\n      }\n\n      const ordered = item.querySelector('bp-adjustable-quantity')?.sync(quantity) || quantity;\n      item.dataset.calculatedQuantity = String(ordered);\n\n      let label =\n        item.dataset.packageLabel || 'Einheit';\n\n      if (quantity > 1) {\n        if (label === 'Sack') label = 'S\u00E4cke';\n        if (label === 'Rolle') label = 'Rollen';\n        if (label === 'Paket') label = 'Pakete';\n      }\n\n      quantityOutput.textContent =\n        `${quantity} ${label}`;\n\n      totalOutput.textContent =\n        money.format((ordered * price) / 100);\n    }\n\n    function updateBuildActions() {\n      buildItems.forEach(item => {\n        const selected = Boolean(item.querySelector('[data-bp-build-select]')?.checked);\n        item.classList.toggle('is-selected', selected);\n      });\n      section.querySelectorAll('[data-bp-floor-group]').forEach(button => {\n        const group = button.dataset.bpFloorGroup;\n        const count = group === 'skirtings' ? Number(Boolean(getSelectedSkirtingItem()))\n          : buildItems.filter(item => productGroup(item) === group && item.querySelector('[data-bp-build-select]')?.checked).length;\n        let badge = button.querySelector('[data-bp-group-count]');\n        if (!badge) {\n          badge = document.createElement('span');\n          badge.dataset.bpGroupCount = '';\n          badge.className = 'bp-accessory-group-count';\n          button.append(badge);\n        }\n        badge.textContent = count > 0 ? ` \u2713 ${count}` : '';\n        badge.hidden = count === 0;\n      });\n      const hasSelection = buildItems.some((item) =>\n        item.querySelector('[data-bp-build-select]')?.checked\n      ) || Boolean(getSelectedSkirtingItem());\n\n      if (buildSkip) buildSkip.hidden = hasSelection;\n      if (buildAdd) buildAdd.disabled = purchaseIsSubmitting || buildIsSubmitting || !hasSelection;\n      if (hasSelection && !projectRequested) beginProject();\n      updateOrderSummary();\n    }\n\n    function calculateBuildItems() {\n      if (accessoryAreaInput && document.activeElement !== accessoryAreaInput) {\n        accessoryAreaInput.value = purchaseMode === 'packages' ? '' : (areaInput?.value || '');\n      }\n      if (accessoryWasteInput) accessoryWasteInput.value = String(currentWaste);\n      if (buildArea) {\n        buildArea.textContent =\n          `${decimal.format(currentArea)} m\u00B2`;\n      }\n\n      buildItems.forEach(calculateBuildItem);\n      calculateSkirtingItems();\n    }\n\n    function calculateSkirtingItem(item) {\n      const lengthMm = Number(item.dataset.lengthMm || 0);\n      const price = Number(item.dataset.price || 0);\n      const quantityOutput = item.querySelector('[data-bp-skirting-quantity]');\n      const totalOutput = item.querySelector('[data-bp-skirting-total]');\n\n      if (!quantityOutput || !totalOutput) return;\n\n      if (currentSkirtingLength <= 0) {\n        const ordered = item.querySelector('bp-adjustable-quantity')?.sync(0) || 0;\n        item.dataset.calculatedQuantity = String(ordered);\n        quantityOutput.textContent = 'L\u00E4nge eingeben';\n        totalOutput.textContent = ordered > 0 ? money.format(ordered * price / 100) : '';\n        return;\n      }\n\n      if (lengthMm <= 0) {\n        item.dataset.calculatedQuantity = '0';\n        quantityOutput.textContent = 'L\u00E4ngenangabe fehlt';\n        totalOutput.textContent = '';\n        return;\n      }\n\n      const lengthM = lengthMm / 1000;\n      const quantity = Math.ceil(currentSkirtingLength / lengthM - 1e-9);\n\n      const ordered = item.querySelector('bp-adjustable-quantity')?.sync(quantity) || quantity;\n      item.dataset.calculatedQuantity = String(ordered);\n      quantityOutput.textContent =\n        `${quantity} ${quantity === 1 ? 'Leiste' : 'Leisten'}`;\n      totalOutput.textContent =\n        `${decimal.format(ordered * lengthM)} lfm \u00B7 ${money.format((ordered * price) / 100)}`;\n    }\n\n    function getSelectedSkirtingItem() {\n      const selectedInput =\n        section.querySelector('[data-bp-skirting-select]:checked');\n\n      if (!selectedInput || selectedInput.hasAttribute('data-bp-skirting-none')) {\n        return null;\n      }\n\n      return selectedInput.closest('[data-bp-skirting-option]');\n    }\n\n    function syncSkirtingSelection() {\n      skirtingOptions.forEach((option) => {\n        const radio = option.querySelector('[data-bp-skirting-select]');\n        option.classList.toggle('is-selected', Boolean(radio?.checked));\n      });\n    }\n\n    function selectFirstSkirting(group) {\n      const firstOption = skirtingOptions.find((option) => {\n        return option.dataset.bpSkirtingGroup === group;\n      });\n\n      const radio =\n        firstOption?.querySelector('[data-bp-skirting-select]');\n\n      if (radio) {\n        radio.checked = true;\n        skirtingSelectionCleared = false;\n        syncSkirtingSelection();\n      }\n    }\n\n    function updateSkirtingSummary() {\n      const selectedItem = getSelectedSkirtingItem();\n\n      skirtingLengthStep?.classList.toggle(\n        'is-complete',\n        currentSkirtingLength > 0\n      );\n\n      skirtingTypeStep?.classList.toggle(\n        'is-complete',\n        Boolean(selectedItem)\n      );\n\n      skirtingModelStep?.classList.toggle(\n        'is-complete',\n        Boolean(selectedItem) && currentSkirtingLength > 0\n      );\n\n      if (!selectedItem) {\n        if (skirtingSummaryQuantity) {\n          skirtingSummaryQuantity.textContent =\n            currentSkirtingLength > 0 ? 'Ausf\u00FChrung w\u00E4hlen' : 'L\u00E4nge und Dekor ausw\u00E4hlen';\n        }\n\n        if (skirtingSummaryTotal) {\n          skirtingSummaryTotal.textContent =\n            currentSkirtingLength > 0 ? 'Schritt 2 ausw\u00E4hlen' : '';\n        }\n\n        if (skirtingSelectedTitle) {\n          skirtingSelectedTitle.textContent =\n            'Noch keine Sockelleiste gew\u00E4hlt';\n        }\n\n        if (skirtingSelectedResult) {\n          skirtingSelectedResult.textContent =\n            currentSkirtingLength > 0\n              ? section.dataset.textSkirtingChoose\n              : 'Gib zuerst die ben\u00F6tigte L\u00E4nge ein.';\n        }\n\n        if (skirtingClear) {\n          skirtingClear.hidden = true;\n        }\n\n        return;\n      }\n\n      const title =\n        selectedItem.querySelector('.bp-floor-build__skirting-copy > strong')?.textContent?.trim() ||\n        'Ausgew\u00E4hlte Sockelleiste';\n\n      const quantity =\n        `${selectedItem.dataset.calculatedQuantity} ${Number(selectedItem.dataset.calculatedQuantity) === 1 ? 'Leiste' : 'Leisten'}`;\n\n      const total =\n        selectedItem.querySelector('[data-bp-skirting-total]')?.textContent?.trim() || '';\n\n      if (skirtingSummaryQuantity) {\n        skirtingSummaryQuantity.textContent =\n          currentSkirtingLength > 0 ? quantity : 'L\u00E4nge eingeben';\n      }\n\n      if (skirtingSummaryTotal) {\n        skirtingSummaryTotal.textContent =\n          currentSkirtingLength > 0 ? total : title;\n      }\n\n      if (skirtingSelectedTitle) {\n        skirtingSelectedTitle.textContent = title;\n      }\n\n      if (skirtingSelectedResult) {\n        skirtingSelectedResult.textContent =\n          currentSkirtingLength > 0\n            ? [quantity, total].filter(Boolean).join(' \u00B7 ')\n            : 'Gib noch die ben\u00F6tigte L\u00E4nge ein.';\n      }\n\n      if (skirtingClear) {\n        skirtingClear.hidden = false;\n      }\n    }\n\n    function calculateSkirtingItems() {\n      currentSkirtingLength = Number(\n        String(skirtingLengthInput?.value || '0').replace(',', '.')\n      );\n\n      if (!Number.isFinite(currentSkirtingLength) || currentSkirtingLength < 0) {\n        currentSkirtingLength = 0;\n      }\n\n      skirtingOptions.forEach(calculateSkirtingItem);\n      syncSkirtingSelection();\n      updateSkirtingSummary();\n      updateBuildActions();\n    }\n\n    skirtingOptions.forEach(item => item.addEventListener('bp:order-quantity', () => { calculateSkirtingItem(item); updateSkirtingSummary(); updateBuildActions(); }));\n\n    buildItems.forEach((item) => {\n      item.addEventListener('bp:order-quantity', () => { calculateBuildItem(item); updateBuildActions(); });\n      const hiddenInput = item.querySelector('[data-bp-thickness]');\n      item.querySelector('[data-bp-build-select]')?.addEventListener('change', updateBuildActions);\n\n      item.querySelectorAll('[data-thickness-value]').forEach((button) => {\n        button.addEventListener('click', () => {\n          const value = Number(button.dataset.thicknessValue || 5);\n\n          hiddenInput.value = String(value);\n\n          item.querySelectorAll('[data-thickness-value]').forEach((candidate) => {\n            candidate.classList.toggle('is-active', candidate === button);\n          });\n\n          calculateBuildItem(item);\n          updateBuildActions();\n        });\n      });\n    });\n\n    skirtingLengthInput?.addEventListener('input', () => {\n      skirtingSelectionCleared = false;\n      calculateSkirtingItems();\n    });\n\n    function setSkirtingFilter(group, selectFirst = false) {\n      currentSkirtingGroup = group;\n\n      skirtingFilters.forEach((button) => {\n        const isActive = button.dataset.bpSkirtingFilter === group;\n\n        button.classList.toggle('is-active', isActive);\n        button.setAttribute('aria-selected', isActive ? 'true' : 'false');\n      });\n\n      skirtingOptions.forEach((option) => {\n        option.hidden = option.dataset.bpSkirtingGroup !== group;\n      });\n\n      if (selectFirst) {\n        selectFirstSkirting(group);\n      }\n\n      calculateSkirtingItems();\n    }\n\n    skirtingFilters.forEach((button) => {\n      button.addEventListener('click', () => {\n        skirtingSelectionCleared = false;\n        setSkirtingFilter(\n          button.dataset.bpSkirtingFilter || 'matching',\n          true\n        );\n      });\n    });\n\n    setSkirtingFilter(currentSkirtingGroup, false);\n\n    skirtingSelects.forEach((input) => {\n      input.addEventListener('change', () => {\n        skirtingSelectionCleared =\n          input.hasAttribute('data-bp-skirting-none');\n\n        syncSkirtingSelection();\n        calculateSkirtingItems();\n      });\n    });\n\n    skirtingClear?.addEventListener('click', () => {\n      if (skirtingNoneInput) {\n        skirtingNoneInput.checked = true;\n      }\n\n      skirtingSelectionCleared = true;\n      syncSkirtingSelection();\n      calculateSkirtingItems();\n    });\n\n    syncSkirtingSelection();\n\n    function closeBuildModal() {}\n\n    const preparationChoice = section.querySelector('[data-bp-preparation-choice]');\n    const preparationButtons = Array.from(section.querySelectorAll('[data-bp-preparation-option]'));\n    preparationButtons.forEach(button => button.addEventListener('click', () => {\n      if (!preparationChoice) return;\n      preparationChoice.value = button.dataset.bpPreparationOption;\n      preparationChoice.dispatchEvent(new Event('change', {bubbles:true}));\n    }));\n    preparationChoice?.addEventListener('change', () => {\n      preparationButtons.forEach(button => button.setAttribute('aria-pressed', String(button.dataset.bpPreparationOption === preparationChoice.value)));\n      const needed = preparationChoice.value === 'needed';\n      const items = section.querySelector('[data-bp-preparation-items]');\n      if (items) items.hidden = !needed;\n      const note = section.querySelector('[data-bp-preparation-product-note]');\n      if (note) note.hidden = !needed;\n      section.querySelector('[data-bp-preparation-advice]').hidden = preparationChoice.value !== 'unsure';\n      section.querySelector('[data-bp-preparation-ready]').hidden = preparationChoice.value !== 'ready';\n      buildItems.filter(item => item.dataset.bpPreparationItem === 'true').forEach(item => {\n        const input = item.querySelector('[data-bp-build-select]');\n        input.disabled = !needed;\n        if (!needed) input.checked = false;\n      });\n      updateBuildActions();\n    });\n\n    function accessoryCartItems() {\n      const elements = selectedAccessoryElements();\n      for (const item of elements) {\n        if (Number(item.dataset.calculatedQuantity) <= 0 || !Number(item.dataset.variantId)) {\n          if (item.hasAttribute('data-bp-skirting-option')) {\n            skirtingPanel.open = true;\n            skirtingLengthInput?.focus();\n            throw new Error(section.dataset.textSkirtingError);\n          }\n          item.querySelector('bp-adjustable-quantity input')?.focus();\n          throw new Error(section.dataset.textAccessoryError);\n        }\n      }\n      return elements.map(item => {\n        const properties = { 'Passend zum Boden': section.dataset.productTitle };\n        if (item.hasAttribute('data-bp-skirting-option') && currentSkirtingLength > 0) {\n          properties['Gew\u00FCnschte Sockelleistenl\u00E4nge'] = `${decimal.format(currentSkirtingLength)} lfm`;\n        }\n        return { id: Number(item.dataset.variantId), quantity: Number(item.dataset.calculatedQuantity), properties };\n      });\n    }\n\n    function clearAccessorySelection() {\n      buildItems.forEach(item => { item.querySelector('[data-bp-build-select]').checked = false; });\n      if (skirtingNoneInput) skirtingNoneInput.checked = true;\n      syncSkirtingSelection();\n      updateSkirtingSummary();\n      updateBuildActions();\n    }\n\n    form?.addEventListener('submit', event => {\n      event.preventDefault();\n      showProjectCart({ main: true });\n    });\n    const media = Array.from(section.querySelectorAll('[data-bp-media]'));\n    const thumbs = Array.from(section.querySelectorAll('[data-bp-thumb]'));\n\n    let galleryIndex = 0;\n\n    function showMedia(index) {\n      if (!media.length) return;\n\n      if (index < 0) index = media.length - 1;\n      if (index >= media.length) index = 0;\n\n      galleryIndex = index;\n\n      media.forEach((item, i) => {\n        item.classList.toggle('is-active', i === index);\n      });\n\n      thumbs.forEach((item, i) => {\n        item.classList.toggle('is-active', i === index);\n      });\n\n      const counter =\n        section.querySelector('[data-bp-gallery-current]');\n\n      if (counter) {\n        counter.textContent = index + 1;\n      }\n    }\n\n    section.querySelector('[data-bp-gallery-prev]')?.addEventListener('click', () => {\n      showMedia(galleryIndex - 1);\n    });\n\n    section.querySelector('[data-bp-gallery-next]')?.addEventListener('click', () => {\n      showMedia(galleryIndex + 1);\n    });\n\n    thumbs.forEach((thumb, index) => {\n      thumb.addEventListener('click', () => {\n        showMedia(index);\n      });\n    });\n\n    const lightbox =\n      section.querySelector('[data-bp-lightbox]');\n\n    const lightboxMedia =\n      Array.from(\n        section.querySelectorAll('[data-bp-lightbox-media]')\n      );\n\n    const lightboxCurrent =\n      section.querySelector('[data-bp-lightbox-current]');\n\n    let lightboxIndex = 0;\n\n    function showLightboxMedia(index) {\n      if (!lightboxMedia.length) return;\n\n      if (index < 0) {\n        index = lightboxMedia.length - 1;\n      }\n\n      if (index >= lightboxMedia.length) {\n        index = 0;\n      }\n\n      lightboxIndex = index;\n\n      lightboxMedia.forEach((item, itemIndex) => {\n        item.classList.toggle(\n          'is-active',\n          itemIndex === lightboxIndex\n        );\n      });\n\n      if (lightboxCurrent) {\n        lightboxCurrent.textContent =\n          String(lightboxIndex + 1);\n      }\n    }\n\n    function openLightbox() {\n      if (!lightbox) return;\n\n      const activeGalleryMedia =\n        media[galleryIndex];\n\n      const activeMediaId =\n        activeGalleryMedia?.dataset.mediaId || '';\n\n      const matchingIndex =\n        lightboxMedia.findIndex(\n          (item) =>\n            String(item.dataset.mediaId) ===\n            String(activeMediaId)\n        );\n\n      showLightboxMedia(\n        matchingIndex >= 0\n          ? matchingIndex\n          : 0\n      );\n\n      lightbox.classList.add('is-open');\n      lightbox.setAttribute('aria-hidden', 'false');\n\n      document.documentElement.classList.add('bp-floor-modal-open');\n      document.body.classList.add('bp-floor-modal-open');\n    }\n\n    function closeLightbox() {\n      lightbox?.classList.remove('is-open');\n      lightbox?.setAttribute('aria-hidden', 'true');\n\n      if (!buildModal?.classList.contains('is-open')) {\n        document.documentElement.classList.remove('bp-floor-modal-open');\n        document.body.classList.remove('bp-floor-modal-open');\n      }\n    }\n\n    section\n      .querySelector('[data-bp-zoom]')\n      ?.addEventListener(\n        'click',\n        openLightbox\n      );\n\n    section\n      .querySelector('[data-bp-lightbox-prev]')\n      ?.addEventListener(\n        'click',\n        () => {\n          showLightboxMedia(\n            lightboxIndex - 1\n          );\n        }\n      );\n\n    section\n      .querySelector('[data-bp-lightbox-next]')\n      ?.addEventListener(\n        'click',\n        () => {\n          showLightboxMedia(\n            lightboxIndex + 1\n          );\n        }\n      );\n\n    section\n      .querySelectorAll('[data-bp-lightbox-close]')\n      .forEach((button) => {\n        button.addEventListener(\n          'click',\n          closeLightbox\n        );\n      });\n\n    document.addEventListener('keydown', (event) => {\n      if (event.key === 'Escape') {\n        closeLightbox();\n        closeBuildModal();\n      }\n\n      if (\n        lightbox?.classList.contains('is-open') &&\n        event.key === 'ArrowLeft'\n      ) {\n        showLightboxMedia(\n          lightboxIndex - 1\n        );\n      }\n\n      if (\n        lightbox?.classList.contains('is-open') &&\n        event.key === 'ArrowRight'\n      ) {\n        showLightboxMedia(\n          lightboxIndex + 1\n        );\n      }\n    });\n\n    if (skirtingPanel && !section.querySelector('[data-bp-floor-group=\"skirtings\"]')) {\n      const button = document.createElement('button');\n      button.type = 'button';\n      button.dataset.bpFloorGroup = 'skirtings';\n      button.textContent = skirtingPanel.querySelector('.bp-floor-build__skirting-summary-copy > strong')?.textContent.trim() || 'Sockelleisten';\n      button.setAttribute('aria-pressed', 'false');\n      section.querySelector('.bp-floor-accessory-groups')?.append(button);\n    }\n    const productGroupButtons = Array.from(section.querySelectorAll('[data-bp-floor-group]'));\n    const preparationPanel = section.querySelector('[data-bp-preparation]');\n    const accessoryList = section.querySelector('.bp-floor-build__items');\n    const swipeNav = section.querySelector('[data-bp-floor-swipe-nav]');\n    let activeProductGroup = 'installation';\n    function productGroup(item) {\n      if (item.dataset.bpPreparationItem === 'true') return 'preparation';\n      const label = item.dataset.bpBuildLabel || '';\n      return /pflege|profil/.test(label) ? 'finish' : 'installation';\n    }\n    const availableGroups = new Set(buildItems.map(productGroup));\n    const finishButton = section.querySelector('[data-bp-floor-group=\"finish\"]');\n    if (finishButton && buildItems.some(item => item.dataset.bpBuildLabel === 'bodenprofil')) {\n      finishButton.textContent = section.dataset.textProfilesGroup;\n    }\n    if (skirtingPanel) availableGroups.add('skirtings');\n    if (preparationPanel) availableGroups.add('preparation');\n    activeProductGroup = availableGroups.has('preparation') ? 'preparation' : availableGroups.has('installation') ? 'installation' : availableGroups.has('finish') ? 'finish' : 'skirtings';\n    function updateSwipeNav() {\n      const scroller = activeProductGroup === 'skirtings' ? null : activeProductGroup === 'preparation' ? section.querySelector('[data-bp-preparation-items]') : accessoryList;\n      const visible = scroller && !scroller.hidden ? Array.from(scroller.children).filter(node => !node.hidden).length : 0;\n      scroller?.classList.toggle('bp-accessory-list--single', visible === 1);\n      if (swipeNav) {\n        swipeNav.hidden = visible <= 1;\n        if (scroller && visible > 1) scroller.before(swipeNav);\n      }\n    }\n    function selectProductGroup(group) {\n      activeProductGroup = group;\n      productGroupButtons.forEach(button => {\n        button.hidden = !availableGroups.has(button.dataset.bpFloorGroup);\n        button.setAttribute('aria-pressed', String(button.dataset.bpFloorGroup === group));\n      });\n      if (preparationPanel) preparationPanel.hidden = group !== 'preparation';\n      const integratedUnderlayNote = section.querySelector('.bp-floor-build__integrated');\n      if (integratedUnderlayNote) integratedUnderlayNote.hidden = group !== 'installation';\n      if (accessoryList) accessoryList.hidden = group === 'preparation' || group === 'skirtings';\n      buildItems.forEach(item => { item.hidden = productGroup(item) !== group; });\n      if (skirtingPanel) {\n        skirtingPanel.hidden = group !== 'skirtings';\n        if (group === 'skirtings') skirtingPanel.open = true;\n      }\n      updateSwipeNav();\n    }\n    productGroupButtons.forEach(button => button.addEventListener('click', () => selectProductGroup(button.dataset.bpFloorGroup)));\n    section.querySelector('[data-bp-preparation-choice]')?.addEventListener('change', updateSwipeNav);\n    section.querySelectorAll('[data-bp-floor-slide]').forEach(button => button.addEventListener('click', () => {\n      const scroller = activeProductGroup === 'skirtings' ? null : activeProductGroup === 'preparation' ? section.querySelector('[data-bp-preparation-items]') : accessoryList;\n      const card = scroller && Array.from(scroller.children).find(node => !node.hidden);\n      const step = card ? card.getBoundingClientRect().width + 12 : scroller?.clientWidth || 0;\n      scroller?.scrollBy({left:step * Number(button.dataset.bpFloorSlide),behavior:window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'instant' : 'smooth'});\n    }));\n    selectProductGroup(activeProductGroup);\n\n    calculateFloor();\n    setPurchaseState();\n  }\n\n  function mount(scope) {\n    if (scope.matches?.('[data-bp-floor-main]')) initializeFloorPurchase(scope);\n    scope.querySelectorAll('[data-bp-floor-main]').forEach(initializeFloorPurchase);\n  }\n  mount(document);\n  document.addEventListener('shopify:section:load', event => mount(event.target));\n})();\n\n\n\n\n"],
  "mappings": "CAAC,IAAM,CAGL,MAAM,gBAAkB,OAAO,gBAAkB,OAAO,iBAAmB,CACzE,QAAS,oFACT,OAAQ,CAEN,MAAM,KAAO,SAAS,cAAc,2CAA2C,EACzE,KAAO,MAAM,aAAa,MAAM,GAAK,qBAErC,SADQ,MAAM,aAAe,IAAI,QAAQ,OAAQ,GAAG,EAAE,KAAK,EAC5C,MAAM,wBAAwB,GAAK,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EACtE,MAAO,CAAE,KAAM,KAAM,SAAW,KAAO,KAAK,QAAQ,QAAS,EAAE,EAAI,mBAAoB,CACzF,EACA,MAAO,CAAE,OAAO,KAAK,QAAU,KAAK,MAAM,EAAE,IAAM,EAClD,WAAW,KAAM,UAAW,CAC1B,GAAI,CAAC,KAAM,OACX,MAAM,MAAQ,KAAK,MAAM,EACnB,KAAO,SAAS,cAAc,GAAG,EACvC,KAAK,KAAO,MAAM,KAClB,KAAK,UAAY,UACjB,KAAK,YAAc,MAAM,KACzB,KAAK,gBAAgB,SAAS,eAAe,KAAK,OAAO,EAAG,IAAI,CAClE,EACA,WAAW,IAAK,CACd,GAAI,KAAQ,MAA6B,MAAQ,GAAI,OAAO,KAC5D,MAAM,MAAQ,OAAO,GAAG,EACxB,OAAO,OAAO,SAAS,KAAK,EAAI,KAAK,IAAI,EAAG,KAAK,EAAI,IACvD,EAEA,QAAQ,QAAS,KAAM,SAAU,WAAa,IAAM,GAAO,CACzD,MAAM,OAAS,IAAI,IACnB,QAAQ,QAAQ,MAAQ,OAAO,IAAI,OAAO,KAAK,EAAE,GAAI,OAAO,IAAI,OAAO,KAAK,EAAE,CAAC,GAAK,GAAK,OAAO,KAAK,UAAY,CAAC,CAAC,CAAC,EACpH,SAAW,CAAC,GAAI,QAAQ,IAAK,OAAQ,CACnC,MAAM,MAAQ,SAAS,EAAE,EACzB,GAAI,QAAU,KAAM,SACpB,MAAM,QAAU,MAAM,OAAS,CAAC,GAC7B,OAAO,MAAQ,OAAO,KAAK,UAAU,IAAM,IAAM,CAAC,WAAW,IAAI,CAAC,EAClE,OAAO,CAAC,IAAK,OAAS,IAAM,KAAK,SAAU,CAAC,EAC/C,GAAI,SAAW,OAAS,MAAO,MAAO,EACxC,CACA,MAAO,EACT,EACA,MAAM,MAAO,CACX,MAAM,SAAW,MAAM,OAAO,OAAO,SAAS,QAAQ,MAAQ,KAAO,UAAW,CAAE,QAAS,CAAE,OAAQ,kBAAmB,EAAG,MAAO,WAAY,OAAQ,YAAY,QAAQ,IAAK,CAAE,CAAC,EAClL,GAAI,CAAC,SAAS,GAAI,MAAM,IAAI,MAAM,WAAa,SAAS,MAAM,EAC9D,OAAO,SAAS,KAAK,CACvB,EAEA,MAAM,QAAQ,OAAQ,SAAU,CAC9B,GAAI,CACF,MAAM,IAAM,SAAW,MAAM,SAAS,SAAS,EAAI,MAAM,KAAK,KAAK,EAC7D,SAAW,IAAI,KAAK,QAAQ,OAAS,CAAC,GAAG,IAAI,MAAQ,CAAC,KAAK,IAAK,KAAK,QAAQ,CAAC,CAAC,EACrF,UAAW,QAAQ,IAAI,MAAO,CAC5B,MAAM,OAAS,SAAS,IAAI,KAAK,GAAG,EAAI,SAAS,IAAI,KAAK,GAAG,EAAI,EAC7D,KAAK,WAAa,SAClB,SAAU,MAAM,SAAS,iBAAkB,CAAE,GAAI,KAAK,IAAK,SAAU,MAAO,CAAC,EAC5E,MAAM,OAAO,OAAO,SAAS,QAAQ,MAAQ,KAAO,iBAAkB,CAAE,OAAQ,OAAQ,QAAS,CAAE,eAAgB,mBAAoB,OAAQ,kBAAmB,EAAG,KAAM,KAAK,UAAU,CAAE,GAAI,KAAK,IAAK,SAAU,MAAO,CAAC,CAAE,CAAC,EACtO,CACA,MAAO,EACT,MAAuB,CAAE,MAAO,EAAO,CACzC,EAEA,WAAW,CAAE,KAAM,OAAQ,KAAM,OAAQ,UAAW,KAAM,EAAG,CAC3D,GAAI,CAAC,OAAQ,OAAO,MAAQ,KAC5B,GAAI,OAAQ,CACL,OACH,KAAO,SAAS,cAAc,GAAG,EACjC,KAAK,UAAY,GAAG,OAAO,SAAS,IAAI,SAAS,GACjD,KAAK,aAAa,qBAAsB,EAAE,EAC1C,KAAK,UAAY,OAAS,8CAC1B,OAAO,MAAM,IAAI,GAEnB,MAAM,MAAQ,KAAK,MAAM,EACzB,KAAK,KAAO,MAAM,KAClB,KAAK,aAAa,aAAc,kBAAkB,MAAM,IAAI,EAAE,EAC9D,KAAK,iBAAiB,6BAA6B,EAAE,QAAQ,MAAQ,CAAE,KAAK,YAAc,MAAM,IAAM,CAAC,EACvG,MAAM,SAAW,SAAS,gBAAkB,OAC5C,OAAO,OAAS,GAChB,KAAK,OAAS,GACd,KAAK,QAAQ,YAAc,OACvB,UAAU,KAAK,MAAM,CAAE,cAAe,EAAK,CAAC,CAClD,KAAO,CACL,MAAM,SAAW,MAAQ,SAAS,gBAAkB,KAChD,OAAM,KAAK,OAAS,IACxB,OAAO,OAAS,GAChB,OAAO,KAAK,QAAQ,YAChB,UAAU,OAAO,MAAM,CAAE,cAAe,EAAK,CAAC,CACpD,CACA,YAAK,cAAc,IAAI,YAAY,gBAAiB,CAAE,QAAS,GAAM,OAAQ,CAAE,MAAO,CAAE,CAAC,CAAC,EACnF,IACT,CACF,EAEA,SAAS,wBAAwB,QAAS,CAExC,GAAI,CAAC,SAAW,QAAQ,QAAQ,UAAY,OAAQ,OAEpD,QAAQ,QAAQ,QAAU,OAE1B,MAAM,YAAc,OAAO,SAAS,QAAQ,MAAQ,KAAO,cACrD,WAAa,SAAS,cAAc,aAAa,EACjD,eAAiB,CAAC,cAAe,kBAAkB,EAEzD,eAAe,oBAAoB,aAAc,CAC/C,GAAI,CAAC,WAAY,CACf,OAAO,SAAS,OAAO,QAAQ,QAAQ,SAAW,OAAO,EACzD,MACF,CACA,GAAI,CACE,aAAa,WAAW,aAAa,GAAK,aAAa,WAAW,kBAAkB,EACtF,WAAW,eAAe,aAAc,EAAI,GAE5C,MAAM,WAAW,kBAAkB,EACnC,WAAW,KAAK,EAEpB,MAAQ,CAEN,OAAO,SAAS,OAAO,QAAQ,QAAQ,SAAW,OAAO,CAC3D,CACF,CAEA,MAAM,UAAY,OAAO,QAAQ,QAAQ,WAAa,CAAC,EACjD,SAAW,QAAQ,QAAQ,UAAY,MACvC,OAAS,QAAQ,QAAQ,QAAU,QAEnC,MAAQ,IAAI,KAAK,aAAa,OAAQ,CAC1C,MAAO,WACP,QACF,CAAC,EAEK,QAAU,IAAI,KAAK,aAAa,OAAQ,CAC5C,sBAAuB,EACvB,sBAAuB,CACzB,CAAC,EAEK,YAAc,IAAI,KAAK,aAAa,OAAQ,CAChD,sBAAuB,EACvB,sBAAuB,CACzB,CAAC,EAEK,UAAY,QAAQ,cAAc,gBAAgB,EAClD,mBAAqB,QAAQ,cAAc,kCAAkC,EAC7E,oBAAsB,QAAQ,cAAc,mCAAmC,EAC/E,WAAa,QAAQ,cAAc,iBAAiB,EACpD,aAAe,MAAM,KAAK,QAAQ,iBAAiB,wBAAwB,CAAC,EAC5E,sBAAwB,MAAM,KAAK,QAAQ,iBAAiB,2BAA2B,CAAC,EACxF,UAAY,QAAQ,cAAc,sBAAsB,EACxD,aAAe,QAAQ,cAAc,yBAAyB,EAC9D,qBAAuB,QAAQ,cAAc,4BAA4B,EACzE,gBAAkB,QAAQ,cAAc,4BAA4B,EACpE,gBAAkB,QAAQ,cAAc,4BAA4B,EAEpE,cAAgB,QAAQ,cAAc,0BAA0B,EAChE,aAAe,QAAQ,cAAc,yBAAyB,EAC9D,cAAgB,QAAQ,cAAc,0BAA0B,EAChE,mBAAqB,QAAQ,cAAc,gCAAgC,EAC3E,kBAAoB,QAAQ,cAAc,+BAA+B,EAEzE,YAAc,QAAQ,cAAc,uBAAuB,EAC3D,SAAW,QAAQ,cAAc,qBAAqB,EAEtD,eAAiB,QAAQ,cAAc,2BAA2B,EAClE,gBAAkB,QAAQ,cAAc,6BAA6B,EACrE,MAAQ,QAAQ,cAAc,iBAAiB,EAC/C,YAAc,QAAQ,cAAc,wBAAwB,EAC5D,YAAc,QAAQ,cAAc,wBAAwB,EAC5D,gBAAkB,QAAQ,cAAc,6BAA6B,EAGrE,sBAAwB,OAAO,QAAQ,QAAQ,4BAA8B,CAAC,EAC9E,yBAA2B,OAAO,QAAQ,QAAQ,+BAAiC,CAAC,EACpF,sBAAwB,OAAO,QAAQ,QAAQ,uBAAyB,CAAC,EACzE,qBAAuB,OAAO,QAAQ,QAAQ,sBAAwB,CAAC,EAEvE,UAAY,QAAQ,cAAc,eAAe,EACjD,SAAW,QAAQ,cAAc,qBAAqB,EACtD,WAAa,QAAQ,cAAc,uBAAuB,EAC1D,KAAO,QAAQ,cAAc,sBAAsB,EACnD,YAAc,QAAQ,cAAc,wBAAwB,EAE5D,UAAY,QAAQ,cAAc,sBAAsB,EACxD,cAAgB,QAAQ,cAAc,0BAA0B,EAEhE,eAAiB,QAAQ,QAAQ,gBAAkB,QACnD,iBAAmB,QAAQ,QAAQ,kBAAoB,SACvD,iBAAmB,QAAQ,QAAQ,kBAAoB,6CACvD,YAAc,QAAQ,QAAQ,aAAe,kBAC7C,gBAAkB,QAAQ,QAAQ,iBAAmB,8CACrD,cAAgB,QAAQ,QAAQ,eAAiB,mBACjD,gBAAkB,QAAQ,QAAQ,iBAAmB,6BACrD,WAAa,QAAQ,QAAQ,YAAc,6BAC3C,UAAY,QAAQ,QAAQ,WAAa,iDACzC,aAAe,QAAQ,QAAQ,cAAgB,gDAE/C,WAAa,KACb,iBAAmB,QAAQ,cAAc,+BAA+B,EAC9E,IAAI,qBAAuB,GAC3B,MAAM,WAAa,MAAM,KAAK,QAAQ,iBAAiB,sBAAsB,CAAC,EACxE,UAAY,QAAQ,cAAc,sBAAsB,EACxD,SAAW,QAAQ,cAAc,qBAAqB,EACtD,aAAe,QAAQ,cAAc,yBAAyB,EAC9D,UAAY,QAAQ,cAAc,sBAAsB,EAC9D,IAAI,kBAAoB,GAExB,MAAM,gBAAkB,MAAM,KAAK,QAAQ,iBAAiB,2BAA2B,CAAC,EAClF,gBAAkB,MAAM,KAAK,QAAQ,iBAAiB,2BAA2B,CAAC,EAClF,gBAAkB,MAAM,KAAK,QAAQ,iBAAiB,2BAA2B,CAAC,EAClF,oBAAsB,QAAQ,cAAc,2BAA2B,EACvE,cAAgB,QAAQ,cAAc,oBAAoB,EAC1D,wBAA0B,QAAQ,cAAc,qCAAqC,EACrF,qBAAuB,QAAQ,cAAc,kCAAkC,EAC/E,sBAAwB,QAAQ,cAAc,mCAAmC,EACjF,uBAAyB,QAAQ,cAAc,oCAAoC,EACnF,cAAgB,QAAQ,cAAc,0BAA0B,EAChE,kBAAoB,QAAQ,cAAc,yBAAyB,EACnE,mBAAqB,QAAQ,cAAc,kCAAkC,EAC7E,iBAAmB,QAAQ,cAAc,gCAAgC,EACzE,kBAAoB,QAAQ,cAAc,iCAAiC,EAE3E,aAAe,QAAQ,cAAc,wBAAwB,EAC/D,eAAiB,cAAc,aAAa,MAAM,aAAa,EAEnE,IAAI,YAAc,EACd,aAAe,OAAO,QAAQ,QAAQ,cAAgB,EAAE,EACxD,gBAAkB,EAClB,iBAAmB,EACnB,aAAe,OACf,sBAAwB,EACxB,qBAAuB,QAAQ,QAAQ,sBAAwB,WAC/D,yBAA2B,GAC3B,oBAAsB,OAAO,QAAQ,QAAQ,cAAgB,CAAC,EAClE,MAAM,6BAA+B,OAAO,QAAQ,QAAQ,qBAAuB,CAAC,EAC9E,wBAA0B,QAAQ,QAAQ,mBAAqB,OAErE,IAAI,iBAAmB,GACnB,eAAiB,EACjB,sBAAwB,GACxB,eAAiB,KACjB,aAAe,KACf,aAAe,GACf,kBAAoB,EAEpB,oBAAsB,KAC1B,MAAM,UAAY,OAAO,QAAQ,aAAa,GAAK,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,GACjG,kBAAoB,QAAQ,cAAc,wBAAwB,EAClE,mBAAqB,QAAQ,cAAc,yBAAyB,EACpE,SAAW,OAAO,SAAS,QAAQ,MAAQ,IAEjD,SAAS,gBAAiB,CACxB,OAAO,yBAA2B,gBAAkB,GAAK,UAAY,IAAM,eAAiB,YAAc,YAAc,EAC1H,CAEA,SAAS,oBAAqB,CAC5B,GAAI,CAAC,iBAAkB,OACvB,MAAM,QAAU,wBAA0B,eACpC,MAAQ,eAAe,GAAK,gBAAgB,EAAE,MAChD,oBACF,kBAAkB,OAAS,GAC3B,kBAAkB,SAAW,CAAC,OAAS,EAAQ,gBAE7C,qBAAoB,mBAAmB,OAAS,CAAC,cAEjD,mBAAkB,iBAAiB,YAAc,cAAgB,sBAAwB,KAAO,QAAQ,QAAQ,cAC/G,MACD,QAAU,QAAQ,QAAQ,iBAC1B,GAAG,QAAQ,QAAQ,aAAa,GAAG,0BAA0B,EAAE,OAAS,SAAQ,QAAQ,QAAQ,cAAgB,KAAO,MAAM,OAAO,gBAAgB,EAAE,YAAc,GAAG,EAAI,EAAE,GAFpK,QAAQ,QAAQ,sBAG7B,WAAW,QAAQ,MAAQ,CACzB,MAAM,MAAQ,KAAK,cAAc,0BAA0B,EACvD,QAAO,MAAM,YAAc,CAAC,SAAW,CAAC,aAAe,QAAQ,QAAQ,iBAAmB,QAAQ,QAAQ,oBAChH,CAAC,EACD,iBAAiB,CACnB,CAEA,SAAS,cAAe,CACtB,MAAM,OAAS,IAAI,SAAS,IAAI,EAC1B,WAAa,CAAC,YAAa,SAAS,EAC1C,cAAO,QAAQ,CAAC,MAAO,MAAQ,CAC7B,MAAM,MAAQ,IAAI,MAAM,sBAAsB,EAC1C,OAAS,OAAO,KAAK,EAAE,KAAK,IAAG,WAAW,MAAM,CAAC,CAAC,EAAI,OAAO,KAAK,EACxE,CAAC,EACM,CAAC,CAAC,GAAG,OAAO,OAAO,IAAI,IAAI,CAAC,EAAE,SAAS,gBAAgB,UAAU,EAAG,GAAG,mBAAmB,EAAE,IAAI,OAAS,CAAC,GAAG,KAAK,WAAW,CAAC,GAAG,KAAK,WAAW,YAAY,SAAS,CAAC,EAAE,CAAC,CACnL,CAEA,eAAe,SAAS,KAAM,KAAM,CAClC,MAAM,SAAW,MAAM,MAAM,SAAW,KAAM,KAAO,CACnD,OAAO,OAAO,QAAQ,CAAC,eAAe,mBAAmB,OAAO,kBAAkB,EAAE,OAAO,YAAY,QAAQ,IAAK,EAAE,KAAK,KAAK,UAAU,CAAC,GAAG,KAAK,SAAS,eAAe,KAAK,GAAG,EAAE,aAAa,OAAO,SAAS,QAAQ,CAAC,CAC7N,EAAI,CAAC,QAAQ,CAAC,OAAO,kBAAkB,EAAE,MAAM,WAAW,OAAO,YAAY,QAAQ,IAAK,CAAC,CAAC,EACtF,OAAS,MAAM,SAAS,KAAK,EACnC,GAAI,CAAC,SAAS,GAAI,CAChB,MAAM,QAAU,IAAI,MAAM,OAAO,aAAe,QAAQ,QAAQ,gBAAgB,EAChF,cAAQ,OAAS,SAAS,OACpB,OACR,CACA,OAAI,OAAO,UAAU,YAAY,eAAe,OAAQ,EAAK,EACtD,MACT,CAEA,eAAe,oBAAqB,CAElC,GADA,aAAa,YAAY,EACrB,eAAgB,OAAO,eAC3B,GAAI,CAAC,kBAAoB,CAAC,eAAe,GAAK,CAAC,gBAAgB,EAAE,MAAO,MAAO,GAC/E,GAAI,wBAA0B,eAAgB,MAAO,GACrD,aAAe,GACf,MAAM,WAAa,kBACnB,uBAAkB,SAAY,CAC5B,GAAI,CACF,KAAO,wBAA0B,gBAAgB,CAC/C,GAAI,CAAC,kBAAoB,aAAe,mBAAqB,CAAC,eAAe,GAAK,CAAC,gBAAgB,EAAE,MAAO,MAAO,GACnH,MAAM,QAAU,eACV,QAAU,aAAa,EAE7B,GAAI,gBAAkB,UAAY,aAAa,QAAS,QAAQ,EAAG,CACjE,UAAY,SACZ,MAAM,WAAa,IAAI,MAAM,iBAAiB,CAAC,EAC/C,iBAAW,OAAS,QACd,UACR,CACA,IAAI,KAAO,MAAM,SAAS,SAAS,EACnC,GAAI,CAAC,kBAAoB,aAAe,kBAAmB,MAAO,GAGlE,GAAI,gBAAkB,aAAa,QAAS,IAAI,EAAG,CACjD,UAAY,KACZ,MAAM,WAAa,IAAI,MAAM,iBAAiB,CAAC,EAC/C,iBAAW,OAAS,QACd,UACR,CACA,MAAM,SAAW,KAAK,MAAM,OAAO,MAAQ,KAAK,YAAY,cAAgB,SAAS,EAC/E,UAAY,CAAC,GAAG,OAAO,EACvB,QAAU,CAAC,EACjB,UAAW,QAAQ,SAAU,CAC3B,MAAM,MAAQ,UAAU,UAAU,MAAQ,OAAO,KAAK,EAAE,IAAM,OAAO,KAAK,UAAU,CAAC,EAC/E,OAAS,OAAS,EAAI,UAAU,OAAO,MAAO,CAAC,EAAE,CAAC,EAAI,KACtD,eAAiB,QAAU,OAAO,KAAK,CAAC,GAAG,KAAK,WAAW,GAAG,OAAO,UAAU,CAAC,EAAE,MAAM,KAAO,OAAO,KAAK,aAAa,GAAG,GAAK,EAAE,IAAM,OAAO,OAAO,aAAa,GAAG,GAAK,EAAE,CAAC,GAChL,CAAC,QAAU,KAAK,WAAa,OAAO,YAAU,QAAQ,KAAK,GAAG,EAAI,QAAQ,UAAY,GACtF,QAAU,CAAC,iBACb,QAAQ,KAAK,GAAG,EAAI,EACpB,UAAU,KAAK,MAAM,EAEzB,CAEA,GADI,OAAO,KAAK,OAAO,EAAE,SAAQ,KAAO,MAAM,SAAS,iBAAkB,CAAC,OAAO,CAAC,GAC9E,CAAC,kBAAoB,aAAe,kBAAmB,MAAO,GAClE,GAAI,UAAU,OAAQ,CACpB,MAAM,UAAY,KAClB,GAAI,CACF,MAAM,SAAS,cAAc,CAAC,MAAM,SAAS,CAAC,CAChD,OAAS,SAAU,CAEjB,MAAI,SAAS,SAAW,KAAO,iBAC7B,UAAY,KACZ,MAAM,YAAY,SAAS,GAEvB,QACR,CACF,CACA,GAAI,CAAC,kBAAoB,aAAe,kBAAmB,MAAO,GAClE,sBAAwB,OAC1B,CACA,MAAO,EACT,OAAS,MAAO,CAEd,GADA,aAAe,MAAM,SAAW,QAAQ,QAAQ,cAC5C,iBAAmB,MAAM,SAAW,SAAW,MAAM,SAAW,KAElE,oBAAe,iBAAiB,EAChC,oBAAsB,KACtB,sBAAsB,EAClB,eAAc,aAAa,YAAc,IAC7C,gBAAgB,EACT,GAIT,oBAAsB,KACtB,GAAI,CACF,MAAM,UAAY,OAAO,IAAI,SAAS,IAAI,EAAE,IAAI,IAAI,CAAC,EAE/C,UADU,MAAM,SAAS,SAAS,GACf,MACtB,OAAO,MAAQ,KAAK,YAAY,cAAgB,WAAa,OAAO,KAAK,UAAU,IAAM,SAAS,EAClG,OAAO,CAAC,IAAK,OAAS,IAAM,KAAK,SAAU,CAAC,EAC3C,SAAW,GAAK,SAAW,kBAC7B,oBAAsB,SAE1B,MAAoB,CAAwB,CAE5C,OAAI,MAAM,SAAW,KAAO,sBAAwB,QAAM,aAAe,iBAAiB,GAGtF,eAAc,aAAa,YAAc,IAC7C,gBAAgB,EACT,EACT,QAAE,CACA,eAAiB,KACjB,mBAAmB,EACf,kBAAoB,CAAC,cAAgB,wBAA0B,gBAAkB,eAAe,GAAK,gBAAgB,EAAE,QAAO,aAAe,WAAW,mBAAoB,CAAC,EACnL,CACF,GAAG,EACH,mBAAmB,EACZ,cACT,CAEA,SAAS,qBAAsB,CACxB,mBACL,gBAAkB,EACd,aAAe,cAAgB,YAAY,cAAgB,eAAc,YAAY,YAAc,IACvG,aAAe,GACf,oBAAsB,KAClB,eAAc,aAAa,YAAc,IAC7C,mBAAmB,EACnB,aAAa,YAAY,EACzB,aAAe,WAAW,mBAAoB,GAAG,EACnD,CAEA,SAAS,cAAe,CACtB,iBAAmB,GACnB,QAAQ,QAAQ,oBAAsB,OACtC,oBAAoB,CACtB,CAEA,SAAS,0BAA2B,CAC7B,mBACL,iBAAmB,GACnB,mBAAqB,EACrB,aAAa,YAAY,EACzB,eAAiB,EACjB,sBAAwB,GACxB,aAAe,GACf,oBAAsB,KACtB,OAAO,QAAQ,QAAQ,oBACnB,oBAAmB,kBAAkB,OAAS,IAC9C,qBAAoB,mBAAmB,OAAS,IAChD,cAAa,YAAY,YAAc,IACvC,eAAc,aAAa,YAAc,IAC7C,WAAW,QAAQ,MAAQ,CACzB,MAAM,MAAQ,KAAK,cAAc,0BAA0B,EACvD,QAAO,MAAM,YAAc,QAAQ,QAAQ,oBACjD,CAAC,EACD,wBAAwB,EAC1B,CAEA,GAAI,OAAO,WAAc,YAAc,OAAO,eAAmB,IAAa,CAC5E,MAAM,uBAAyB,UAAU,eAAe,WAAY,OAAS,CACvE,MAAM,SAAW,cAAgB,MAAM,UAAU,aAAe,GAAG,yBAAyB,CAClG,CAAC,EACD,SAAS,iBAAiB,yBAA0B,OAAS,CACvD,MAAM,OAAO,SAAS,OAAO,GAAG,uBAAuB,CAC7D,CAAC,CACH,CACA,GAAI,WAAY,CACd,MAAM,oBAAsB,IAAI,iBAAiB,IAAM,CACjD,CAAC,gBAAkB,uBAAyB,GAAK,WAAW,UAAU,SAAS,UAAU,GAAG,yBAAyB,CAC3H,CAAC,EACD,oBAAoB,QAAQ,WAAY,CAAC,WAAW,GAAK,gBAAgB,CAAC,OAAO,CAAC,CAAC,EACnF,SAAS,iBAAiB,yBAA0B,OAAS,CACvD,MAAM,OAAO,SAAS,OAAO,GAAG,oBAAoB,WAAW,CACrE,CAAC,CACH,CAEA,SAAS,cAAc,MAAO,CAC5B,MAAM,MAAQ,OAAS,UACnB,WACF,UAAU,YAAc,iBACxB,UAAU,OAAS,IACV,cAAa,YAAY,YAAc,kBAClD,OAAO,aAAa,eAAgB,MAAM,EAC1C,OAAO,QAAQ,4BAA4B,GAAG,UAAU,IAAI,YAAY,EACxE,OAAO,MAAM,CACf,CAEA,SAAS,gBAAiB,CACpB,YACF,UAAU,YAAc,GACxB,UAAU,OAAS,IAEjB,aAAe,YAAY,cAAgB,mBAAkB,YAAY,YAAc,IAC3F,CAAC,UAAW,kBAAkB,EAAE,QAAQ,OAAS,CAC/C,OAAO,gBAAgB,cAAc,EACrC,OAAO,QAAQ,4BAA4B,GAAG,UAAU,OAAO,YAAY,CAC7E,CAAC,CACH,CAMA,MAAM,eAAiB,GAEvB,SAAS,cAAc,UAAW,CAChC,MAAM,GAAK,OAAO,SAAS,EAC3B,OAAI,KAAO,OAAO,IAAI,SAAS,IAAI,EAAE,IAAI,IAAI,CAAC,EAAU,gBAAgB,WAAW,QAAQ,QAAQ,UAAU,EACtG,gBAAgB,WAAW,QAAQ,cAAc,qBAAqB,EAAE,sBAAsB,GAAG,QAAQ,UAAU,CAC5H,CACA,SAAS,aAAa,QAAS,KAAM,CAEnC,OAAO,gBAAgB,QAAQ,QAAS,KAAM,cAAe,MAAQ,KAAK,YAAY,cAAgB,SAAS,CACjH,CACA,eAAe,YAAY,OAAQ,CACjC,MAAM,gBAAgB,QAAQ,OAAQ,QAAQ,CAChD,CACA,SAAS,uBAAwB,CAC/B,iBAAmB,GACnB,mBAAqB,EACrB,aAAa,YAAY,EACzB,eAAiB,EACjB,sBAAwB,GACxB,OAAO,QAAQ,QAAQ,oBACnB,oBAAmB,kBAAkB,OAAS,IAC9C,qBAAoB,mBAAmB,OAAS,IACpD,iBAAiB,EACjB,UAAU,UAAU,IAAI,iBAAiB,EACzC,aAAa,EAAI,CACnB,CAIA,IAAI,UAAY,KACZ,cAAgB,KACpB,SAAS,aAAa,OAAQ,CAC5B,cAAgB,gBAAgB,WAAW,CAAE,KAAM,QAAS,OAAQ,UAAW,KAAM,cAAe,OAAQ,UAAW,0BAA2B,CAAC,CACrJ,CAMA,IAAI,SAAW,KACX,gBAAkB,KACtB,MAAM,aAAe,IAAM,CAAC,EAAE,QAAQ,QAAQ,aAAe,QAAa,QAAQ,cAAc,oBAAoB,GACpH,SAAS,cAAe,CACtB,MAAI,CAAC,gBAAkB,CAAC,aAAa,EAAU,KAC3C,SAAiB,QAAQ,QAAQ,QAAQ,GACxC,kBAAiB,gBAAkB,gBAAgB,KAAK,EAAE,KAAK,MAAS,SAAW,IAAK,EAAE,MAAM,IAAM,IAAI,EAAE,QAAQ,IAAM,CAAE,gBAAkB,IAAM,CAAC,GACnJ,gBACT,CACA,SAAS,gBAAgB,KAAM,CAC7B,UAAY,KACZ,aAAe,iBAAiB,EAChC,oBAAsB,KACtB,sBAAsB,EAClB,eAAc,aAAa,YAAc,IAC7C,gBAAgB,CAClB,CACA,SAAS,iBAAkB,CACzB,UAAY,KACR,cACF,YAAY,YAAc,GAC1B,YAAY,UAAU,OAAO,eAAe,GAE9C,UAAU,UAAU,OAAO,iBAAiB,EAC5C,aAAe,GACf,aAAa,EAAK,EAClB,iBAAiB,CACnB,CACA,IAAI,WAAa,EACjB,SAAS,gBAAiB,CACnB,iBACL,aAAa,UAAU,EACvB,WAAa,WAAW,IAAM,CAC5B,MAAM,OAAS,QAAQ,QAAQ,cAAgB,OAC/C,IAAI,QAAU,KACd,GAAI,CAAE,QAAU,aAAa,CAAG,MAAqB,CAAE,QAAU,IAAM,CAEvE,GAAI,EADY,CAAC,CAAC,SAAW,QAAQ,KAAK,MAAQ,cAAc,KAAK,EAAE,IAAM,IAAI,GACnE,CAAM,QAAQ,gBAAgB,EAAG,MAAQ,CACvD,MAAM,KAAO,UAAY,UACzB,GAAI,CAAC,KAAM,CAAE,aAAa,GAAG,KAAK,QAAU,CAAM,QAAQ,eAAe,CAAG,CAAC,EAAG,MAAQ,CACxF,IAAI,QAAU,GACd,GAAI,CAAE,QAAU,aAAa,QAAS,IAAI,CAAG,MAAqB,CAAE,QAAU,EAAO,CACjF,SAAW,CAAC,OAAQ,gBAAgB,IAAI,EACnC,CAAC,SAAW,QAAU,CAAC,kBAAkB,gBAAgB,CACpE,EAAG,GAAG,EACR,CACA,QAAQ,iBAAiB,UAAW,IAAM,CAAE,aAAa,CAAG,CAAC,EAC7D,QAAQ,iBAAiB,QAAS,cAAc,EAChD,QAAQ,iBAAiB,SAAU,cAAc,EACjD,QAAQ,iBAAiB,QAAS,OAAS,CACrC,MAAM,OAAO,UAAU,sBAAsB,GAC7C,MAAM,OAAO,UAAU,gHAAgH,IAAK,aAAa,EAAG,eAAe,EACjL,CAAC,EAGD,SAAS,WAAY,CACnB,OAAO,gBAAgB,MAAM,CAC/B,CACA,SAAS,mBAAoB,CAC3B,MAAO,CAAE,KAAM,gBAAgB,QAAS,MAAO,UAAU,CAAE,CAC7D,CACA,SAAS,kBAAmB,CAC1B,MAAM,MAAQ,kBAAkB,EAChC,OAAO,MAAM,KAAO,MAAM,MAAM,IAClC,CACA,SAAS,iBAAkB,CACzB,GAAI,CAAC,YAAa,OAClB,MAAM,QAAU,eAAiB,iBAAiB,EAElD,GADA,YAAY,UAAU,OAAO,gBAAiB,OAAO,EACjD,CAAC,QAAS,CACZ,YAAY,YAAc,aAC1B,MACF,CACA,gBAAgB,WAAW,YAAa,2BAA2B,CACrE,CAIA,IAAI,eAAiB,GACrB,SAAS,uBAAwB,CAE/B,GADiB,sBACA,KAAM,CACrB,GAAI,CAAC,eAAgB,OAErB,eAAiB,GACjB,UAAU,UAAU,OAAO,cAAc,EACzC,MAAM,QAAU,gBAAgB,EAC1B,WAAa,gBAAkB,EACjC,iBAAgB,eAAe,YAAc,WAAa,gBAAkB,UAC5E,kBAAiB,gBAAgB,YAAc,WAAa,GAAG,YAAY,OAAO,gBAAgB,CAAC,SAAQ,UAC3G,QAAO,MAAM,YAAc,YAAc,QAAQ,MAAQ,MAAM,OAAO,QAAQ,MAAQ,GAAG,EAAI,UAC7F,aAAe,aAAY,YAAY,YAAc,GAAG,eAAe,IAAI,kBAAoB,EAAI,eAAiB,gBAAgB,IACxI,QAAQ,iBAAiB,uBAAuB,EAAE,QAAQ,MAAQ,CAAE,KAAK,YAAc,WAAa,MAAM,OAAO,QAAQ,MAAQ,GAAG,EAAI,QAAK,CAAC,EAC9I,QAAQ,iBAAiB,0BAA0B,EAAE,QAAQ,MAAQ,CACnE,KAAK,YAAc,YAAc,QAAQ,MAAS,QAAQ,WAAa,EAAI,QAAQ,QAAQ,iBAAmB,MAAM,OAAO,QAAQ,SAAW,GAAG,EAAK,QACxJ,CAAC,EACD,kBAAkB,eAAe,EACjC,MACF,CAGA,eAAiB,GACjB,UAAU,UAAU,IAAI,cAAc,CACxC,CAEA,SAAS,oBAAqB,CAC5B,GAAI,CAAC,cAAe,OACpB,sBAAsB,EACtB,MAAM,QAAU,gBAAgB,gBAAkB,sBAAwB,KAAO,oBAAsB,eAAe,EAChH,MAAQ,eAAe,GAAK,QAAQ,MAC1C,cAAc,OAAS,CAAC,MAExB,MAAM,WAAa,cAAc,eAAe,cAAc,eAAe,EACzE,aAAY,WAAW,OAAS,OAC/B,QAEL,cAAc,YAAc,QAAQ,SAAW,EAC3C,gBAAgB,MAAM,OAAO,QAAQ,SAAW,GAAG,CAAC,WACpD,4BACN,CAEA,eAAe,gBAAgB,QAAS,CAGtC,GAAI,CAAC,eAAe,EAAG,CAGrB,cAAc,SAAS,KAAO,UAAa,oBAAoB,eAAe,EAAE,OAAS,mBAAqB,SAAU,EACxH,MACF,CAGA,GAFA,eAAe,EAEX,kBAAoB,sBAAwB,MAAQ,wBAA0B,gBAAkB,CAAC,eAAgB,CAC/G,YACF,WAAW,iBAAiB,SAAS,aAAa,EAClD,WAAW,KAAK,GACX,OAAO,SAAS,OAAO,QAAQ,QAAQ,SAAW,OAAO,EAChE,MACF,CACK,kBAAkB,aAAa,EACpC,EACE,IAAI,CAAC,MAAM,mBAAmB,EAAG,CAC3B,cAAc,gBAAgB,EAClC,MACF,OACO,wBAA0B,gBACnC,QAAQ,cAAc,IAAI,YAAY,gBAAgB,CAAC,EACnD,YACF,WAAW,iBAAiB,SAAS,aAAa,EAClD,WAAW,KAAK,GACX,OAAO,SAAS,OAAO,QAAQ,QAAQ,SAAW,OAAO,CAClE,CAEA,mBAAmB,iBAAiB,QAAS,eAAe,EAC5D,oBAAoB,iBAAiB,QAAS,kBAAkB,EAChE,QAAQ,iBAAiB,QAAS,OAAS,CACzC,MAAM,KAAO,MAAM,OAAO,QAAQ,6BAA6B,EAC/D,GAAI,CAAC,KAAM,OAGX,GAFA,MAAM,eAAe,EACrB,MAAM,gBAAgB,EAClB,CAAC,eAAe,EAAG,CACrB,cAAc,SAAS,EACvB,MACF,CACA,aAAa,EACb,QAAQ,cAAc,IAAI,YAAY,oBAAoB,CAAC,EAC3D,MAAM,OAAS,SAAS,eAAe,KAAK,aAAa,MAAM,GAAG,MAAM,CAAC,CAAC,EAC1E,sBAAsB,IAAM,QAAQ,eAAe,CAAC,MAAM,QAAQ,SAAS,OAAO,WAAW,kCAAkC,EAAE,QAAU,UAAY,QAAQ,CAAC,CAAC,CACnK,EAAG,EAAI,EAGP,SAAS,kBAAkB,gBAAkB,EAAG,CAC9C,GAAI,CAAC,aAAe,CAAC,gBAAiB,OAEtC,MAAM,OACJ,KAAK,IAAI,EAAG,6BAA+B,mBAAmB,EAC9D,KAAK,IAAI,EAAG,eAAe,EAE7B,gBAAgB,OAAS,QAAU,EACnC,YAAY,YAAc,OAAS,EAAI,MAAM,OAAO,OAAS,GAAG,EAAI,EACtE,CAEA,SAAS,2BAA4B,CACnC,MAAM,UAAY,WAAW,OAAO,MAAQ,CAC1C,MAAM,MAAQ,KAAK,cAAc,wBAAwB,EACzD,OAAO,OAAO,SAAW,CAAC,MAAM,QAClC,CAAC,EACK,SAAW,wBAAwB,EACzC,OAAO,SAAW,CAAC,GAAG,UAAW,QAAQ,EAAI,SAC/C,CAEA,SAAS,gBAAgB,cAAgB,gBAAiB,CACxD,MAAM,SAAW,0BAA0B,EACrC,MAAQ,SAAS,MAAM,MAC3B,OAAO,KAAK,QAAQ,kBAAkB,EAAI,GAAK,OAAO,KAAK,QAAQ,SAAS,EAAI,CAClF,EAEM,MAAQ,cAAgB,oBACxB,YAAc,SAAS,OAAO,CAAC,IAAK,OACxC,IAAM,KAAK,IAAI,EAAG,OAAO,KAAK,QAAQ,kBAAkB,GAAK,CAAC,EAAI,OAAO,KAAK,QAAQ,OAAS,CAAC,EAAG,CACrG,EACM,MAAQ,MAAQ,YAEhB,SAAW,OAAS,sBAAwB,EAC9C,OAAS,yBAA2B,qBAAuB,sBAC/D,MAAO,CAAE,SAAU,MAAO,MAAO,YAAa,MAAO,SAAU,MAAO,MAAQ,QAAS,CACzF,CAEA,SAAS,oBAAqB,CAC5B,MAAM,QAAU,gBAAgB,EAC1B,WAAa,gBAAkB,EAC/B,MAAQ,YAAc,QAAQ,MAcpC,GAbI,QAAO,MAAM,YAAc,MAAQ,MAAM,OAAO,QAAQ,MAAQ,GAAG,EAAI,UACvE,cAAa,YAAY,YAAe,WACvC,QAAQ,MACT,GAAG,eAAe,IAAI,kBAAoB,EAAI,eAAiB,gBAAgB,GAD9D,QAAQ,QAAQ,qBADoB,QAAQ,QAAQ,kBAGzE,QAAQ,iBAAiB,uBAAuB,EAAE,QAAQ,MAAQ,CAChE,KAAK,YAAc,WAAa,MAAM,OAAO,QAAQ,MAAQ,GAAG,EAAI,QACtE,CAAC,EACD,QAAQ,iBAAiB,6BAA6B,EAAE,QAAQ,MAAQ,CACtE,KAAK,YAAc,QAAQ,MAAQ,MAAM,OAAO,QAAQ,YAAc,GAAG,EAAI,QAC/E,CAAC,EACD,QAAQ,iBAAiB,0BAA0B,EAAE,QAAQ,MAAQ,CACnE,KAAK,YAAc,MAAS,QAAQ,WAAa,EAAI,QAAQ,QAAQ,iBAAmB,MAAM,OAAO,QAAQ,SAAW,GAAG,EAAK,QAClI,CAAC,EACG,iBAAkB,CACpB,MAAM,cAAgB,QAAQ,SAAS,OACnC,GAAG,QAAQ,QAAQ,aAAa,KAAK,QAAQ,MAAQ,MAAM,OAAO,QAAQ,YAAc,GAAG,EAAI,QAAQ,QAAQ,oBAAoB,GACnI,QAAQ,QAAQ,mBACpB,iBAAiB,YAAc,aACjC,CACI,YAAW,UAAU,QAAQ,uBAAuB,EAAE,OAAS,aAAe,GAC9E,YAAW,UAAU,YAAc,YAAc,EACjD,GAAG,QAAQ,OAAO,WAAW,CAAC,SAAM,eAAiB,WAAa,SAAQ,QAAQ,QAAQ,iBAAmB,EAAE,GAC/G,QAAQ,QAAQ,kBACpB,iBAAiB,EACb,kBAAkB,oBAAoB,CAC5C,CAEA,SAAS,kBAAmB,CAC1B,GAAI,CAAC,UAAW,OAEhB,eAAe,kBAAkB,EAEjC,MAAM,MACJ,yBACA,gBAAkB,GAClB,UAAY,IACX,eAAiB,YAAc,YAAc,GAGhD,GADA,UAAU,SAAW,sBAAwB,CAAC,wBAC1C,qBAAsB,CACxB,SAAS,YAAc,WACvB,MACF,CAEA,GAAI,CAAC,wBAAyB,CAC5B,SAAS,YAAc,gBACvB,WAAW,YAAc,GACzB,MACF,CAEA,GAAI,CAAC,MAAO,CACV,SAAS,YAAc,YACvB,WAAW,YAAc,gBACzB,MACF,CAIA,GAFA,eAAe,EAEX,iBAAkB,CAEpB,GAAI,sBAAwB,KAAM,CAChC,SAAS,YAAc,GAAG,mBAAmB,IAAI,sBAAwB,EAAI,eAAiB,gBAAgB,gBAC9G,WAAW,YAAc,GACzB,MACF,CACA,SAAS,YAAc,QAAQ,QAAQ,aACvC,WAAW,YAAc,GAAG,YAAY,OAAO,gBAAgB,CAAC,eAAS,OAAO,aAAe,EAAE,GACjG,MACF,CAEA,MAAM,WAAa,gBAAkB,oBAC/B,aAAe,kBAAoB,EAAI,eAAiB,iBAE9D,SAAS,YAAc,0BAA0B,EAAE,OAC/C,QAAQ,QAAQ,wBAChB,GAAG,eAAe,IAAI,YAAY,IAAI,aAAa,GAEvD,WAAW,YACT,GAAG,YAAY,OAAO,gBAAgB,CAAC,eAAS,OAAO,aAAe,EAAE,EAC5E,CAEA,SAAS,gBAAiB,CACxB,GAAI,CAAC,WAAa,WAAa,EAAG,OAKlC,GAHA,YAAc,OAAO,OAAO,UAAU,OAAS,GAAG,EAAE,QAAQ,IAAK,GAAG,CAAC,EACrE,aAAe,OAAO,YAAY,OAAS,EAAE,EAEzC,CAAC,OAAO,SAAS,WAAW,GAAK,aAAe,EAAG,CACrD,YAAc,EACd,gBAAkB,EAClB,iBAAmB,EAEf,cAAa,YAAY,OAAS,IAClC,WAAU,SAAS,OAAS,IAE5B,iBAAgB,eAAe,YAAc,UAC7C,kBAAiB,gBAAgB,YAAc,UAC/C,QAAO,MAAM,YAAc,UAC3B,cAAa,YAAY,YAAc,0BAEvC,gBAAe,cAAc,MAAQ,GACrC,eAAc,aAAa,MAAQ,IACnC,gBAAe,cAAc,MAAQ,IACrC,qBAAoB,mBAAmB,MAAQ,IAC/C,oBAAmB,kBAAkB,MAAQ,IAEjD,kBAAkB,CAAC,EACnB,iBAAiB,EACjB,oBAAoB,EAEpB,MACF,CAEA,MAAM,WACJ,aAAe,EAAI,aAAe,KAEpC,gBACE,KAAK,KAAM,WAAa,UAAa,IAAI,EAE3C,iBACE,gBAAkB,UAEpB,MAAM,WACJ,gBAAkB,oBAEpB,YAAY,OAAS,GACrB,SAAS,OAAS,GAElB,eAAe,YACb,gBAEF,gBAAgB,YACd,GAAG,YAAY,OAAO,gBAAgB,CAAC,SAEzC,MAAM,YACJ,MAAM,OAAO,WAAa,GAAG,EAE/B,YAAY,YACV,GAAG,eAAe,IAAI,kBAAoB,EAAI,QAAU,QAAQ,GAElE,kBAAkB,eAAe,EAEjC,cAAc,MACZ,gBAEF,aAAa,MACX,GAAG,YAAY,OAAO,WAAW,CAAC,SAEpC,cAAc,MACZ,GAAG,YAAY,KAEjB,mBAAmB,MACjB,GAAG,YAAY,OAAO,UAAU,CAAC,SAEnC,kBAAkB,MAChB,GAAG,YAAY,OAAO,gBAAgB,CAAC,SAEzC,iBAAiB,EACjB,oBAAoB,CACtB,CAEA,SAAS,2BAA4B,CACnC,MAAM,MAAQ,OAAO,SAAS,sBAAsB,OAAS,IAAK,EAAE,EAEpE,OAAK,OAAO,SAAS,KAAK,EAEnB,KAAK,IAAI,IAAK,KAAK,IAAI,EAAG,KAAK,CAAC,EAFH,CAGtC,CAEA,SAAS,mBAAoB,CAC3B,GAAI,CAAC,sBAAwB,WAAa,EAAG,OAE7C,gBAAkB,0BAA0B,EAC5C,iBAAmB,gBAAkB,UACrC,YAAc,iBACd,qBAAqB,MAAQ,OAAO,eAAe,EAEnD,MAAM,WAAa,gBAAkB,oBAC/B,aAAe,kBAAoB,EAAI,eAAiB,iBAE1D,cAAa,YAAY,OAAS,IAClC,WAAU,SAAS,OAAS,IAEhC,eAAe,YAAc,gBAC7B,gBAAgB,YAAc,GAAG,YAAY,OAAO,gBAAgB,CAAC,SACrE,MAAM,YAAc,MAAM,OAAO,WAAa,GAAG,EACjD,YAAY,YAAc,GAAG,eAAe,IAAI,YAAY,GAC5D,kBAAkB,eAAe,EAEjC,cAAc,MAAQ,gBACtB,aAAa,MAAQ,GACrB,cAAc,MAAQ,GACtB,mBAAmB,MAAQ,GAC3B,kBAAkB,MAAQ,GAAG,YAAY,OAAO,gBAAgB,CAAC,SAEjE,iBAAiB,EACjB,oBAAoB,CACtB,CAEA,SAAS,gBAAgB,SAAU,CAajC,GAZA,aAAe,WAAa,WAAa,WAAa,OAEtD,sBAAsB,QAAS,QAAW,CACxC,MAAM,SAAW,OAAO,QAAQ,mBAAqB,aAErD,OAAO,UAAU,OAAO,YAAa,QAAQ,EAC7C,OAAO,aAAa,eAAgB,SAAW,OAAS,OAAO,CACjE,CAAC,EAEG,YAAW,UAAU,OAAS,eAAiB,QAC/C,eAAc,aAAa,OAAS,eAAiB,YAErD,eAAiB,WAAY,CAC3B,gBAAkB,GAAK,uBACzB,qBAAqB,MAAQ,OAAO,eAAe,GAGrD,kBAAkB,EAClB,MACF,CAEA,eAAe,CACjB,CAEA,oBAAoB,iBAAiB,QAAS,IAAM,CAClD,UAAU,MAAQ,mBAAmB,MACrC,gBAAgB,MAAM,CACxB,CAAC,EACD,qBAAqB,iBAAiB,SAAU,IAAM,CACpD,WAAW,MAAQ,oBAAoB,MACvC,aAAe,OAAO,oBAAoB,KAAK,EAC/C,aAAa,QAAQ,QAAU,CAC7B,MAAM,OAAS,OAAO,OAAO,QAAQ,KAAK,IAAM,aAChD,OAAO,UAAU,OAAO,YAAa,MAAM,EAC3C,OAAO,aAAa,eAAgB,OAAO,MAAM,CAAC,CACpD,CAAC,EACG,eAAiB,QAAQ,eAAe,CAC9C,CAAC,EAED,WAAW,iBAAiB,QAAS,cAAc,EAEnD,WAAW,iBAAiB,UAAY,OAAU,CAC5C,MAAM,MAAQ,UAClB,MAAM,eAAe,EACrB,eAAe,EAEjB,CAAC,EACD,WAAW,iBAAiB,SAAU,cAAc,EAEpD,sBAAsB,QAAS,QAAW,CACxC,OAAO,iBAAiB,QAAS,IAAM,CACrC,gBAAgB,OAAO,QAAQ,gBAAgB,CACjD,CAAC,CACH,CAAC,EAED,sBAAsB,iBAAiB,QAAS,iBAAiB,EACjE,sBAAsB,iBAAiB,SAAU,iBAAiB,EAElE,iBAAiB,iBAAiB,QAAS,IAAM,CAC/C,qBAAqB,MAAQ,OAAO,KAAK,IAAI,EAAG,0BAA0B,EAAI,CAAC,CAAC,EAChF,kBAAkB,CACpB,CAAC,EAED,iBAAiB,iBAAiB,QAAS,IAAM,CAC/C,qBAAqB,MAAQ,OAAO,KAAK,IAAI,IAAK,0BAA0B,EAAI,CAAC,CAAC,EAClF,kBAAkB,CACpB,CAAC,EAED,aAAa,QAAS,QAAW,CAC/B,OAAO,iBAAiB,QAAS,IAAM,CACrC,aAAe,OAAO,OAAO,QAAQ,OAAS,EAAE,EAEhD,WAAW,MAAQ,OAAO,YAAY,EAEtC,aAAa,QAAS,QAAW,CAC/B,MAAM,SAAW,SAAW,OAE5B,OAAO,UAAU,OAAO,YAAa,QAAQ,EAC7C,OAAO,aAAa,eAAgB,SAAW,OAAS,OAAO,CACjE,CAAC,EAED,eAAe,CACjB,CAAC,CACH,CAAC,EAED,SAAS,mBAAmB,KAAM,CAChC,MAAM,SAAW,KAAK,QAAQ,SACxB,UAAY,OAAO,KAAK,QAAQ,WAAa,CAAC,EAC9C,UAAY,OAAO,KAAK,QAAQ,WAAa,CAAC,EAC9C,eAAiB,OAAO,KAAK,QAAQ,gBAAkB,CAAC,EACxD,SAAW,OAAO,KAAK,QAAQ,UAAY,CAAC,EAC5C,MAAQ,OAAO,KAAK,QAAQ,OAAS,CAAC,EACtC,MAAQ,OAAO,KAAK,QAAQ,OAAS,CAAC,EAEtC,eAAiB,KAAK,cAAc,0BAA0B,EAC9D,YAAc,KAAK,cAAc,uBAAuB,EACxD,eAAiB,KAAK,cAAc,qBAAqB,EAE/D,IAAI,SAAW,EAEf,MAAM,SACJ,aAAe,EAAI,MAAQ,KAE7B,GAAI,aAAe,GAAK,WAAa,UAAW,CAC9C,MAAMA,SAAU,KAAK,cAAc,wBAAwB,GAAG,KAAK,CAAC,GAAK,EACzE,KAAK,QAAQ,mBAAqB,OAAOA,QAAO,EAChD,eAAe,YAAc,qBAC7B,YAAY,YAAcA,SAAU,EAAI,MAAM,OAAOA,SAAU,MAAQ,GAAG,EAAI,GAC9E,MACF,CASA,GAPI,WAAa,WACX,UAAY,GAAK,eAAiB,IACpC,SACE,KAAK,KAAM,SAAW,UAAa,eAAiB,IAAI,GAI1D,WAAa,eAAgB,CAC/B,MAAM,GAAK,OAAO,gBAAgB,OAAS,CAAC,EAExC,UAAY,GAAK,eAAiB,IACpC,SACE,KAAK,KAAM,SAAW,GAAK,UAAa,eAAiB,IAAI,EAEnE,CAaA,GAXI,WAAa,aACX,SAAW,IACb,SACE,KAAK,KAAK,SAAW,SAAW,IAAI,GAItC,WAAa,YACf,SAAW,GAGT,UAAY,EAAG,CACjB,MAAMA,SAAU,KAAK,cAAc,wBAAwB,GAAG,KAAK,CAAC,GAAK,EACzE,KAAK,QAAQ,mBAAqB,OAAOA,QAAO,EAChD,eAAe,YAAc,sBAC7B,YAAY,YAAcA,SAAU,EAAI,MAAM,OAAOA,SAAU,MAAQ,GAAG,EAAI,GAC9E,MACF,CAEA,MAAM,QAAU,KAAK,cAAc,wBAAwB,GAAG,KAAK,QAAQ,GAAK,SAChF,KAAK,QAAQ,mBAAqB,OAAO,OAAO,EAEhD,IAAI,MACF,KAAK,QAAQ,cAAgB,UAE3B,SAAW,IACT,QAAU,SAAQ,MAAQ,YAC1B,QAAU,UAAS,MAAQ,UAC3B,QAAU,UAAS,MAAQ,WAGjC,eAAe,YACb,GAAG,QAAQ,IAAI,KAAK,GAEtB,YAAY,YACV,MAAM,OAAQ,QAAU,MAAS,GAAG,CACxC,CAEA,SAAS,oBAAqB,CAC5B,WAAW,QAAQ,MAAQ,CACzB,MAAM,SAAW,EAAQ,KAAK,cAAc,wBAAwB,GAAG,QACvE,KAAK,UAAU,OAAO,cAAe,QAAQ,CAC/C,CAAC,EACD,QAAQ,iBAAiB,uBAAuB,EAAE,QAAQ,QAAU,CAClE,MAAM,MAAQ,OAAO,QAAQ,aACvB,MAAQ,QAAU,YAAc,CAAO,EAAQ,wBAAwB,EACzE,WAAW,OAAO,MAAQ,aAAa,IAAI,IAAM,OAAS,KAAK,cAAc,wBAAwB,GAAG,OAAO,EAAE,OACrH,IAAI,MAAQ,OAAO,cAAc,uBAAuB,EACnD,QACH,MAAQ,SAAS,cAAc,MAAM,EACrC,MAAM,QAAQ,aAAe,GAC7B,MAAM,UAAY,2BAClB,OAAO,OAAO,KAAK,GAErB,MAAM,YAAc,MAAQ,EAAI,WAAM,KAAK,GAAK,GAChD,MAAM,OAAS,QAAU,CAC3B,CAAC,EACD,MAAM,aAAe,WAAW,KAAM,MACpC,KAAK,cAAc,wBAAwB,GAAG,OAChD,GAAK,EAAQ,wBAAwB,EAEjC,YAAW,UAAU,OAAS,cAC9B,WAAU,SAAS,SAAW,sBAAwB,mBAAqB,CAAC,cAC5E,cAAgB,CAAC,kBAAkB,aAAa,EACpD,mBAAmB,CACrB,CAEA,SAAS,qBAAsB,CACzB,oBAAsB,SAAS,gBAAkB,qBACnD,mBAAmB,MAAQ,eAAiB,WAAa,GAAM,WAAW,OAAS,IAEjF,sBAAqB,oBAAoB,MAAQ,OAAO,YAAY,GACpE,YACF,UAAU,YACR,GAAG,QAAQ,OAAO,WAAW,CAAC,UAGlC,WAAW,QAAQ,kBAAkB,EACrC,uBAAuB,CACzB,CAEA,SAAS,sBAAsB,KAAM,CACnC,MAAM,SAAW,OAAO,KAAK,QAAQ,UAAY,CAAC,EAC5C,MAAQ,OAAO,KAAK,QAAQ,OAAS,CAAC,EACtC,eAAiB,KAAK,cAAc,6BAA6B,EACjE,YAAc,KAAK,cAAc,0BAA0B,EAEjE,GAAI,CAAC,gBAAkB,CAAC,YAAa,OAErC,GAAI,uBAAyB,EAAG,CAC9B,MAAMA,SAAU,KAAK,cAAc,wBAAwB,GAAG,KAAK,CAAC,GAAK,EACzE,KAAK,QAAQ,mBAAqB,OAAOA,QAAO,EAChD,eAAe,YAAc,oBAC7B,YAAY,YAAcA,SAAU,EAAI,MAAM,OAAOA,SAAU,MAAQ,GAAG,EAAI,GAC9E,MACF,CAEA,GAAI,UAAY,EAAG,CACjB,KAAK,QAAQ,mBAAqB,IAClC,eAAe,YAAc,wBAC7B,YAAY,YAAc,GAC1B,MACF,CAEA,MAAM,QAAU,SAAW,IACrB,SAAW,KAAK,KAAK,sBAAwB,QAAU,IAAI,EAE3D,QAAU,KAAK,cAAc,wBAAwB,GAAG,KAAK,QAAQ,GAAK,SAChF,KAAK,QAAQ,mBAAqB,OAAO,OAAO,EAChD,eAAe,YACb,GAAG,QAAQ,IAAI,WAAa,EAAI,SAAW,SAAS,GACtD,YAAY,YACV,GAAG,QAAQ,OAAO,QAAU,OAAO,CAAC,aAAU,MAAM,OAAQ,QAAU,MAAS,GAAG,CAAC,EACvF,CAEA,SAAS,yBAA0B,CACjC,MAAM,cACJ,QAAQ,cAAc,mCAAmC,EAE3D,MAAI,CAAC,eAAiB,cAAc,aAAa,uBAAuB,EAC/D,KAGF,cAAc,QAAQ,2BAA2B,CAC1D,CAEA,SAAS,uBAAwB,CAC/B,gBAAgB,QAAS,QAAW,CAClC,MAAM,MAAQ,OAAO,cAAc,2BAA2B,EAC9D,OAAO,UAAU,OAAO,cAAe,EAAQ,OAAO,OAAQ,CAChE,CAAC,CACH,CAEA,SAAS,oBAAoB,MAAO,CAKlC,MAAM,MAJc,gBAAgB,KAAM,QACjC,OAAO,QAAQ,kBAAoB,KAC3C,GAGc,cAAc,2BAA2B,EAEpD,QACF,MAAM,QAAU,GAChB,yBAA2B,GAC3B,sBAAsB,EAE1B,CAEA,SAAS,uBAAwB,CAC/B,MAAM,aAAe,wBAAwB,EAiB7C,GAfA,oBAAoB,UAAU,OAC5B,cACA,sBAAwB,CAC1B,EAEA,kBAAkB,UAAU,OAC1B,cACA,EAAQ,YACV,EAEA,mBAAmB,UAAU,OAC3B,cACA,EAAQ,cAAiB,sBAAwB,CACnD,EAEI,CAAC,aAAc,CACb,0BACF,wBAAwB,YACtB,sBAAwB,EAAI,0BAAsB,mCAGlD,uBACF,qBAAqB,YACnB,sBAAwB,EAAI,yBAAwB,IAGpD,wBACF,sBAAsB,YACpB,sCAGA,yBACF,uBAAuB,YACrB,sBAAwB,EACpB,QAAQ,QAAQ,mBAChB,6CAGJ,gBACF,cAAc,OAAS,IAGzB,MACF,CAEA,MAAM,MACJ,aAAa,cAAc,yCAAyC,GAAG,aAAa,KAAK,GACzF,8BAEI,SACJ,GAAG,aAAa,QAAQ,kBAAkB,IAAI,OAAO,aAAa,QAAQ,kBAAkB,IAAM,EAAI,SAAW,SAAS,GAEtHC,OACJ,aAAa,cAAc,0BAA0B,GAAG,aAAa,KAAK,GAAK,GAE7E,0BACF,wBAAwB,YACtB,sBAAwB,EAAI,SAAW,qBAGvC,uBACF,qBAAqB,YACnB,sBAAwB,EAAIA,OAAQ,OAGpC,wBACF,sBAAsB,YAAc,OAGlC,yBACF,uBAAuB,YACrB,sBAAwB,EACpB,CAAC,SAAUA,MAAK,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,EAC5C,2CAGJ,gBACF,cAAc,OAAS,GAE3B,CAEA,SAAS,wBAAyB,CAChC,sBAAwB,OACtB,OAAO,qBAAqB,OAAS,GAAG,EAAE,QAAQ,IAAK,GAAG,CAC5D,GAEI,CAAC,OAAO,SAAS,qBAAqB,GAAK,sBAAwB,KACrE,sBAAwB,GAG1B,gBAAgB,QAAQ,qBAAqB,EAC7C,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,CACrB,CAEA,gBAAgB,QAAQ,MAAQ,KAAK,iBAAiB,oBAAqB,IAAM,CAAE,sBAAsB,IAAI,EAAG,sBAAsB,EAAG,mBAAmB,CAAG,CAAC,CAAC,EAEjK,WAAW,QAAS,MAAS,CAC3B,KAAK,iBAAiB,oBAAqB,IAAM,CAAE,mBAAmB,IAAI,EAAG,mBAAmB,CAAG,CAAC,EACpG,MAAM,YAAc,KAAK,cAAc,qBAAqB,EAC5D,KAAK,cAAc,wBAAwB,GAAG,iBAAiB,SAAU,kBAAkB,EAE3F,KAAK,iBAAiB,wBAAwB,EAAE,QAAS,QAAW,CAClE,OAAO,iBAAiB,QAAS,IAAM,CACrC,MAAM,MAAQ,OAAO,OAAO,QAAQ,gBAAkB,CAAC,EAEvD,YAAY,MAAQ,OAAO,KAAK,EAEhC,KAAK,iBAAiB,wBAAwB,EAAE,QAAS,WAAc,CACrE,UAAU,UAAU,OAAO,YAAa,YAAc,MAAM,CAC9D,CAAC,EAED,mBAAmB,IAAI,EACvB,mBAAmB,CACrB,CAAC,CACH,CAAC,CACH,CAAC,EAED,qBAAqB,iBAAiB,QAAS,IAAM,CACnD,yBAA2B,GAC3B,uBAAuB,CACzB,CAAC,EAED,SAAS,kBAAkB,MAAO,YAAc,GAAO,CACrD,qBAAuB,MAEvB,gBAAgB,QAAS,QAAW,CAClC,MAAM,SAAW,OAAO,QAAQ,mBAAqB,MAErD,OAAO,UAAU,OAAO,YAAa,QAAQ,EAC7C,OAAO,aAAa,gBAAiB,SAAW,OAAS,OAAO,CAClE,CAAC,EAED,gBAAgB,QAAS,QAAW,CAClC,OAAO,OAAS,OAAO,QAAQ,kBAAoB,KACrD,CAAC,EAEG,aACF,oBAAoB,KAAK,EAG3B,uBAAuB,CACzB,CAEA,gBAAgB,QAAS,QAAW,CAClC,OAAO,iBAAiB,QAAS,IAAM,CACrC,yBAA2B,GAC3B,kBACE,OAAO,QAAQ,kBAAoB,WACnC,EACF,CACF,CAAC,CACH,CAAC,EAED,kBAAkB,qBAAsB,EAAK,EAE7C,gBAAgB,QAAS,OAAU,CACjC,MAAM,iBAAiB,SAAU,IAAM,CACrC,yBACE,MAAM,aAAa,uBAAuB,EAE5C,sBAAsB,EACtB,uBAAuB,CACzB,CAAC,CACH,CAAC,EAED,eAAe,iBAAiB,QAAS,IAAM,CACzC,oBACF,kBAAkB,QAAU,IAG9B,yBAA2B,GAC3B,sBAAsB,EACtB,uBAAuB,CACzB,CAAC,EAED,sBAAsB,EAEtB,SAAS,iBAAkB,CAAC,CAE5B,MAAM,kBAAoB,QAAQ,cAAc,8BAA8B,EACxE,mBAAqB,MAAM,KAAK,QAAQ,iBAAiB,8BAA8B,CAAC,EAC9F,mBAAmB,QAAQ,QAAU,OAAO,iBAAiB,QAAS,IAAM,CACrE,oBACL,kBAAkB,MAAQ,OAAO,QAAQ,oBACzC,kBAAkB,cAAc,IAAI,MAAM,SAAU,CAAC,QAAQ,EAAI,CAAC,CAAC,EACrE,CAAC,CAAC,EACF,mBAAmB,iBAAiB,SAAU,IAAM,CAClD,mBAAmB,QAAQ,QAAU,OAAO,aAAa,eAAgB,OAAO,OAAO,QAAQ,sBAAwB,kBAAkB,KAAK,CAAC,CAAC,EAChJ,MAAM,OAAS,kBAAkB,QAAU,SACrC,MAAQ,QAAQ,cAAc,6BAA6B,EAC7D,QAAO,MAAM,OAAS,CAAC,QAC3B,MAAM,KAAO,QAAQ,cAAc,oCAAoC,EACnE,OAAM,KAAK,OAAS,CAAC,QACzB,QAAQ,cAAc,8BAA8B,EAAE,OAAS,kBAAkB,QAAU,SAC3F,QAAQ,cAAc,6BAA6B,EAAE,OAAS,kBAAkB,QAAU,QAC1F,WAAW,OAAO,MAAQ,KAAK,QAAQ,oBAAsB,MAAM,EAAE,QAAQ,MAAQ,CACnF,MAAM,MAAQ,KAAK,cAAc,wBAAwB,EACzD,MAAM,SAAW,CAAC,OACb,SAAQ,MAAM,QAAU,GAC/B,CAAC,EACD,mBAAmB,CACrB,CAAC,EAED,SAAS,oBAAqB,CAC5B,MAAM,SAAW,0BAA0B,EAC3C,UAAW,QAAQ,SACjB,GAAI,OAAO,KAAK,QAAQ,kBAAkB,GAAK,GAAK,CAAC,OAAO,KAAK,QAAQ,SAAS,EAChF,MAAI,KAAK,aAAa,yBAAyB,GAC7C,cAAc,KAAO,GACrB,qBAAqB,MAAM,EACrB,IAAI,MAAM,QAAQ,QAAQ,iBAAiB,IAEnD,KAAK,cAAc,8BAA8B,GAAG,MAAM,EACpD,IAAI,MAAM,QAAQ,QAAQ,kBAAkB,GAGtD,OAAO,SAAS,IAAI,MAAQ,CAC1B,MAAM,WAAa,CAAE,oBAAqB,QAAQ,QAAQ,YAAa,EACvE,OAAI,KAAK,aAAa,yBAAyB,GAAK,sBAAwB,IAC1E,WAAW,qCAA+B,EAAI,GAAG,QAAQ,OAAO,qBAAqB,CAAC,QAEjF,CAAE,GAAI,OAAO,KAAK,QAAQ,SAAS,EAAG,SAAU,OAAO,KAAK,QAAQ,kBAAkB,EAAG,UAAW,CAC7G,CAAC,CACH,CAEA,SAAS,yBAA0B,CACjC,WAAW,QAAQ,MAAQ,CAAE,KAAK,cAAc,wBAAwB,EAAE,QAAU,EAAO,CAAC,EACxF,oBAAmB,kBAAkB,QAAU,IACnD,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,CACrB,CAEA,MAAM,iBAAiB,SAAU,OAAS,CACxC,MAAM,eAAe,EACrB,gBAAgB,CAAE,KAAM,EAAK,CAAC,CAChC,CAAC,EACD,MAAM,MAAQ,MAAM,KAAK,QAAQ,iBAAiB,iBAAiB,CAAC,EAC9D,OAAS,MAAM,KAAK,QAAQ,iBAAiB,iBAAiB,CAAC,EAErE,IAAI,aAAe,EAEnB,SAAS,UAAU,MAAO,CACxB,GAAI,CAAC,MAAM,OAAQ,OAEf,MAAQ,IAAG,MAAQ,MAAM,OAAS,GAClC,OAAS,MAAM,SAAQ,MAAQ,GAEnC,aAAe,MAEf,MAAM,QAAQ,CAAC,KAAM,IAAM,CACzB,KAAK,UAAU,OAAO,YAAa,IAAM,KAAK,CAChD,CAAC,EAED,OAAO,QAAQ,CAAC,KAAM,IAAM,CAC1B,KAAK,UAAU,OAAO,YAAa,IAAM,KAAK,CAChD,CAAC,EAED,MAAM,QACJ,QAAQ,cAAc,2BAA2B,EAE/C,UACF,QAAQ,YAAc,MAAQ,EAElC,CAEA,QAAQ,cAAc,wBAAwB,GAAG,iBAAiB,QAAS,IAAM,CAC/E,UAAU,aAAe,CAAC,CAC5B,CAAC,EAED,QAAQ,cAAc,wBAAwB,GAAG,iBAAiB,QAAS,IAAM,CAC/E,UAAU,aAAe,CAAC,CAC5B,CAAC,EAED,OAAO,QAAQ,CAAC,MAAO,QAAU,CAC/B,MAAM,iBAAiB,QAAS,IAAM,CACpC,UAAU,KAAK,CACjB,CAAC,CACH,CAAC,EAED,MAAM,SACJ,QAAQ,cAAc,oBAAoB,EAEtC,cACJ,MAAM,KACJ,QAAQ,iBAAiB,0BAA0B,CACrD,EAEI,gBACJ,QAAQ,cAAc,4BAA4B,EAEpD,IAAI,cAAgB,EAEpB,SAAS,kBAAkB,MAAO,CAC3B,cAAc,SAEf,MAAQ,IACV,MAAQ,cAAc,OAAS,GAG7B,OAAS,cAAc,SACzB,MAAQ,GAGV,cAAgB,MAEhB,cAAc,QAAQ,CAAC,KAAM,YAAc,CACzC,KAAK,UAAU,OACb,YACA,YAAc,aAChB,CACF,CAAC,EAEG,kBACF,gBAAgB,YACd,OAAO,cAAgB,CAAC,GAE9B,CAEA,SAAS,cAAe,CACtB,GAAI,CAAC,SAAU,OAKf,MAAM,cAFJ,MAAM,YAAY,GAGE,QAAQ,SAAW,GAEnC,cACJ,cAAc,UACX,MACC,OAAO,KAAK,QAAQ,OAAO,IAC3B,OAAO,aAAa,CACxB,EAEF,kBACE,eAAiB,EACb,cACA,CACN,EAEA,SAAS,UAAU,IAAI,SAAS,EAChC,SAAS,aAAa,cAAe,OAAO,EAE5C,SAAS,gBAAgB,UAAU,IAAI,qBAAqB,EAC5D,SAAS,KAAK,UAAU,IAAI,qBAAqB,CACnD,CAEA,SAAS,eAAgB,CACvB,UAAU,UAAU,OAAO,SAAS,EACpC,UAAU,aAAa,cAAe,MAAM,EAEvC,YAAY,UAAU,SAAS,SAAS,IAC3C,SAAS,gBAAgB,UAAU,OAAO,qBAAqB,EAC/D,SAAS,KAAK,UAAU,OAAO,qBAAqB,EAExD,CAiEA,GA/DA,QACG,cAAc,gBAAgB,GAC7B,iBACA,QACA,YACF,EAEF,QACG,cAAc,yBAAyB,GACtC,iBACA,QACA,IAAM,CACJ,kBACE,cAAgB,CAClB,CACF,CACF,EAEF,QACG,cAAc,yBAAyB,GACtC,iBACA,QACA,IAAM,CACJ,kBACE,cAAgB,CAClB,CACF,CACF,EAEF,QACG,iBAAiB,0BAA0B,EAC3C,QAAS,QAAW,CACnB,OAAO,iBACL,QACA,aACF,CACF,CAAC,EAEH,SAAS,iBAAiB,UAAY,OAAU,CAC1C,MAAM,MAAQ,WAChB,cAAc,EACd,QAIA,UAAU,UAAU,SAAS,SAAS,GACtC,MAAM,MAAQ,aAEd,kBACE,cAAgB,CAClB,EAIA,UAAU,UAAU,SAAS,SAAS,GACtC,MAAM,MAAQ,cAEd,kBACE,cAAgB,CAClB,CAEJ,CAAC,EAEG,eAAiB,CAAC,QAAQ,cAAc,mCAAmC,EAAG,CAChF,MAAM,OAAS,SAAS,cAAc,QAAQ,EAC9C,OAAO,KAAO,SACd,OAAO,QAAQ,aAAe,YAC9B,OAAO,YAAc,cAAc,cAAc,iDAAiD,GAAG,YAAY,KAAK,GAAK,gBAC3H,OAAO,aAAa,eAAgB,OAAO,EAC3C,QAAQ,cAAc,4BAA4B,GAAG,OAAO,MAAM,CACpE,CACA,MAAM,oBAAsB,MAAM,KAAK,QAAQ,iBAAiB,uBAAuB,CAAC,EAClF,iBAAmB,QAAQ,cAAc,uBAAuB,EAChE,cAAgB,QAAQ,cAAc,wBAAwB,EAC9D,SAAW,QAAQ,cAAc,2BAA2B,EAClE,IAAI,mBAAqB,eACzB,SAAS,aAAa,KAAM,CAC1B,GAAI,KAAK,QAAQ,oBAAsB,OAAQ,MAAO,cACtD,MAAM,MAAQ,KAAK,QAAQ,cAAgB,GAC3C,MAAO,gBAAgB,KAAK,KAAK,EAAI,SAAW,cAClD,CACA,MAAM,gBAAkB,IAAI,IAAI,WAAW,IAAI,YAAY,CAAC,EACtD,aAAe,QAAQ,cAAc,gCAAgC,EACvE,cAAgB,WAAW,KAAK,MAAQ,KAAK,QAAQ,eAAiB,aAAa,IACrF,aAAa,YAAc,QAAQ,QAAQ,mBAEzC,eAAe,gBAAgB,IAAI,WAAW,EAC9C,kBAAkB,gBAAgB,IAAI,aAAa,EACvD,mBAAqB,gBAAgB,IAAI,aAAa,EAAI,cAAgB,gBAAgB,IAAI,cAAc,EAAI,eAAiB,gBAAgB,IAAI,QAAQ,EAAI,SAAW,YAC5K,SAAS,gBAAiB,CACxB,MAAM,SAAW,qBAAuB,YAAc,KAAO,qBAAuB,cAAgB,QAAQ,cAAc,6BAA6B,EAAI,cACrJ,QAAU,UAAY,CAAC,SAAS,OAAS,MAAM,KAAK,SAAS,QAAQ,EAAE,OAAO,MAAQ,CAAC,KAAK,MAAM,EAAE,OAAS,EACnH,UAAU,UAAU,OAAO,4BAA6B,UAAY,CAAC,EACjE,WACF,SAAS,OAAS,SAAW,EACzB,UAAY,QAAU,GAAG,SAAS,OAAO,QAAQ,EAEzD,CACA,SAAS,mBAAmB,MAAO,CACjC,mBAAqB,MACrB,oBAAoB,QAAQ,QAAU,CACpC,OAAO,OAAS,CAAC,gBAAgB,IAAI,OAAO,QAAQ,YAAY,EAChE,OAAO,aAAa,eAAgB,OAAO,OAAO,QAAQ,eAAiB,KAAK,CAAC,CACnF,CAAC,EACG,mBAAkB,iBAAiB,OAAS,QAAU,eAC1D,MAAM,uBAAyB,QAAQ,cAAc,6BAA6B,EAC9E,yBAAwB,uBAAuB,OAAS,QAAU,gBAClE,gBAAe,cAAc,OAAS,QAAU,eAAiB,QAAU,aAC/E,WAAW,QAAQ,MAAQ,CAAE,KAAK,OAAS,aAAa,IAAI,IAAM,KAAO,CAAC,EACtE,gBACF,cAAc,OAAS,QAAU,YAC7B,QAAU,cAAa,cAAc,KAAO,KAElD,eAAe,CACjB,CACA,oBAAoB,QAAQ,QAAU,OAAO,iBAAiB,QAAS,IAAM,mBAAmB,OAAO,QAAQ,YAAY,CAAC,CAAC,EAC7H,QAAQ,cAAc,8BAA8B,GAAG,iBAAiB,SAAU,cAAc,EAChG,QAAQ,iBAAiB,uBAAuB,EAAE,QAAQ,QAAU,OAAO,iBAAiB,QAAS,IAAM,CACzG,MAAM,SAAW,qBAAuB,YAAc,KAAO,qBAAuB,cAAgB,QAAQ,cAAc,6BAA6B,EAAI,cACrJ,KAAO,UAAY,MAAM,KAAK,SAAS,QAAQ,EAAE,KAAK,MAAQ,CAAC,KAAK,MAAM,EAC1E,KAAO,KAAO,KAAK,sBAAsB,EAAE,MAAQ,GAAK,UAAU,aAAe,EACvF,UAAU,SAAS,CAAC,KAAK,KAAO,OAAO,OAAO,QAAQ,YAAY,EAAE,SAAS,OAAO,WAAW,kCAAkC,EAAE,QAAU,UAAY,QAAQ,CAAC,CACpK,CAAC,CAAC,EACF,mBAAmB,kBAAkB,EAErC,eAAe,EACf,iBAAiB,CACnB,CAEA,SAAS,MAAM,MAAO,CAChB,MAAM,UAAU,sBAAsB,GAAG,wBAAwB,KAAK,EAC1E,MAAM,iBAAiB,sBAAsB,EAAE,QAAQ,uBAAuB,CAChF,CACA,MAAM,QAAQ,EACd,SAAS,iBAAiB,uBAAwB,OAAS,MAAM,MAAM,MAAM,CAAC,CAChF,GAAG",
  "names": ["ordered", "total"]
}
