{
  "version": 3,
  "sources": ["/cdn/shop/t/75/assets/media-gallery.js?pdp_rev=20260619-arrowwrap"],
  "sourcesContent": ["if (!customElements.get('media-gallery')) {\n  class MediaGallery extends HTMLElement {\n    constructor() {\n      super();\n\n      if (Shopify.designMode) {\n        setTimeout(() => this.init(), 200);\n      } else {\n        this.init();\n      }\n    }\n\n    disconnectedCallback() {\n      window.removeEventListener('on:debounced-resize', this.resizeHandler);\n      this.removeThumbScrollArrows();\n      clearTimeout(this.mobileDotMotionTimer);\n      this.removeViewerDragListeners();\n\n      if (this.resizeInitHandler) {\n        window.removeEventListener('on:debounced-resize', this.resizeInitHandler);\n      }\n\n      if (this.zoomInitHandler) {\n        window.removeEventListener('on:debounced-resize', this.zoomInitHandler);\n      }\n    }\n\n    init() {\n      this.section = this.closest('.js-product');\n      this.noSelectedVariant = this.hasAttribute('data-no-selected-variant');\n      this.mediaGroupingEnabled = this.hasAttribute('data-media-grouping-enabled')\n        && this.getMediaGroupData();\n      this.stackedScroll = this.dataset.stackedScroll;\n      this.stackedUnderline = this.dataset.stackedUnderline === 'true' && !this.mediaGroupingEnabled;\n      this.isFeatured = this.dataset.isFeatured === 'true';\n      this.viewer = this.querySelector('.media-viewer');\n      this.thumbs = this.querySelector('.media-thumbs');\n      this.thumbsItems = this.querySelectorAll('.media-thumbs__item');\n      this.controls = this.querySelector('.media-ctrl');\n      this.prevBtn = this.querySelector('.media-ctrl__btn[name=\"prev\"]');\n      this.nextBtn = this.querySelector('.media-ctrl__btn[name=\"next\"]');\n      this.counterCurrent = this.querySelector('.media-ctrl__current-item');\n      this.counterTotal = this.querySelector('.media-ctrl__total-items');\n      this.mobileDots = this.querySelectorAll('.media-ctrl__dot');\n      this.liveRegion = this.querySelector('.media-gallery__status');\n      this.zoomLinks = this.querySelectorAll('.js-zoom-link');\n      this.actions = this.querySelector('.media-gallery__actions');\n      this.actionTabs = this.querySelectorAll('.media-gallery__action');\n      this.loadingSpinner = this.querySelector('.loading-spinner');\n      this.xrButton = this.querySelector('.media-xr-button');\n\n      if (this.hasAttribute('data-zoom-enabled')) {\n        // Adopt the modal out of the <template>'s inert document with importNode so it is upgraded to the\n        // <modal-dialog> (Modal) custom element. cloneNode alone keeps it a plain HTMLElement with no .open()\n        // method, so gallery-zoom-open clicks throw \"open is not a function\" and the lightbox never appears.\n        this.galleryModal = document.importNode(this.querySelector('.js-media-zoom-template').content.firstElementChild, true);\n        if (window.customElements && customElements.upgrade) customElements.upgrade(this.galleryModal);\n      }\n\n      if (this.mediaGroupingEnabled && !this.noSelectedVariant) {\n        this.setActiveMediaGroup(this.getMediaGroupFromOptionSelectors());\n      }\n\n      if (this.dataset.layout === 'stacked' && theme.mediaMatches.md) {\n        this.resizeInitHandler = this.resizeInitHandler || this.initGallery.bind(this);\n        window.addEventListener('on:debounced-resize', this.resizeInitHandler);\n        this.setVisibleItems();\n        this.previousMediaItem = this.querySelector('.media-viewer__item.is-current-variant');\n        setTimeout(() => this.customSetActiveMedia(this.previousMediaItem, this.stackedScroll === 'always'), 200);\n      } else {\n        this.initGallery();\n      }\n\n      if (this.zoomLinks) {\n        if (this.dataset.zoomTrigger === 'hover') {\n          this.triggerZoomInit();\n        } else {\n          this.zoomLinks.forEach((zoomLink) => {\n            zoomLink.addEventListener('click', (evt) => {\n              this.triggerZoomInit();\n              evt.preventDefault();\n            });\n          });\n        }\n      }\n\n      this.section.addEventListener('on:variant:change', this.onVariantChange.bind(this));\n      this.initBundleHoverPreview();\n    }\n\n    triggerZoomInit() {\n      this.zoomInitHandler = this.zoomInitHandler || this.initZoom.bind(this);\n      this.zoomEventListener = this.zoomEventListener || this.handleZoomMouseMove.bind(this);\n      window.addEventListener('on:debounced-resize', this.zoomInitHandler);\n      this.initZoom();\n      this.zoomLinks.forEach((zoomLink) => {\n        zoomLink.addEventListener('click', (evt) => {\n          evt.preventDefault();\n        });\n      });\n    }\n\n    /**\n     * Handle a change in variant on the page.\n     * @param {Event} evt - variant change event dispatched by variant-picker\n     */\n    onVariantChange(evt) {\n      this.clearBundleHoverPreview(false);\n\n      if (this.mediaGroupingEnabled) {\n        this.setActiveMediaGroup(this.getMediaGroupFromOptionSelectors());\n      }\n\n      if (evt.detail.variant && evt.detail.variant.featured_media) {\n        const variantMedia = this.viewer.querySelector(\n          `[data-media-id=\"${evt.detail.variant.featured_media.id}\"]`\n        );\n        this.customSetActiveMedia(variantMedia, true);\n      }\n    }\n\n    /**\n     * Gets the media group from currently selected variant options.\n     * @returns {?object}\n     */\n    getMediaGroupFromOptionSelectors() {\n      const optionSelectors = this.section.querySelectorAll('.option-selector');\n      if (optionSelectors.length > this.getMediaGroupData().groupOptionIndex) {\n        const selector = optionSelectors[this.getMediaGroupData().groupOptionIndex];\n        if (selector.dataset.selectorType === 'dropdown') {\n          return selector.querySelector('.custom-select__btn').textContent.trim();\n        }\n        return selector.querySelector('input:checked').value;\n      }\n      return null;\n    }\n\n    /**\n     * Gets the variant media associations for a product.\n     * @returns {?object}\n     */\n    getMediaGroupData() {\n      if (typeof this.variantMediaData === 'undefined') {\n        const dataEl = this.querySelector('.js-data-variant-media');\n        this.variantMediaData = dataEl ? JSON.parse(dataEl.textContent) : false;\n      }\n\n      return this.variantMediaData;\n    }\n\n    /**\n     * Gets an object mapping media to groups, and the reverse\n     * @returns {?object}\n     */\n    getMediaGroupMap() {\n      if (!this.mediaGroupMap) {\n        this.mediaGroupMap = {\n          groups: {}\n        };\n\n        // set up grouping\n        const variantMediaData = this.getMediaGroupData();\n        let currentMediaOptionName = false;\n        this.viewerItems = this.querySelectorAll('.media-viewer__item');\n        this.viewerItems.forEach((item) => {\n          for (let i = 0; i < variantMediaData.variantMedia.length; i += 1) {\n            if (parseInt(item.dataset.mediaId, 10) === variantMediaData.variantMedia[i].mediaId) {\n              if (currentMediaOptionName !== variantMediaData.variantMedia[i].option) {\n                currentMediaOptionName = variantMediaData.variantMedia[i].option;\n              }\n            }\n          }\n          if (currentMediaOptionName) {\n            if (!this.mediaGroupMap.groups[currentMediaOptionName]) {\n              this.mediaGroupMap.groups[currentMediaOptionName] = {\n                name: currentMediaOptionName,\n                items: []\n              };\n            }\n            const groupItem = { main: item };\n            if (this.thumbs) {\n              groupItem.thumb = this.thumbs.querySelector(\n                `[data-media-id=\"${item.dataset.mediaId}\"].media-thumbs__item`\n              );\n            }\n            this.mediaGroupMap.groups[currentMediaOptionName].items.push(groupItem);\n          }\n        });\n\n        // add helper\n        this.mediaGroupMap.groupFromItem = (item) => {\n          const groups = Object.keys(this.mediaGroupMap.groups);\n          for (let i = 0; i < groups; i += 1) {\n            const group = groups[i];\n            for (let j = 0; j < this.mediaGroupMap.groups[group].items.length; j += 1) {\n              if (this.mediaGroupMap.groups[group].items[j] === item) {\n                return this.mediaGroupMap.groups[group];\n              }\n            }\n          }\n          return this.mediaGroupMap.groups[Object.keys(this.mediaGroupMap.groups)[0]];\n        };\n      }\n\n      return this.mediaGroupMap;\n    }\n\n    /**\n     * Show only images associated to the current variant\n     * @param {string} groupName - optional - Group to show (uses this.currentItem if empty)\n     */\n    setActiveMediaGroup(groupName) {\n      const mediaGroupMap = this.getMediaGroupMap();\n      const selectedGroup = groupName\n        ? mediaGroupMap.groups[groupName]\n        : mediaGroupMap.groupFromItem(this.currentItem);\n\n      if (selectedGroup) {\n        if (this.currentGroup !== selectedGroup) {\n          this.currentGroup = selectedGroup;\n          this.viewerItems.forEach((item) => {\n            item.style.display = 'none';\n            item.classList.remove('media-viewer__item--single');\n          });\n          this.thumbsItems.forEach((item) => {\n            item.style.display = 'none';\n          });\n\n          let currentItemIsVisible = false;\n          selectedGroup.items.forEach((item) => {\n            item.main.style.display = '';\n            if (item.thumb) {\n              item.thumb.style.display = '';\n            }\n            if (item.main === this.currentItem) {\n              currentItemIsVisible = true;\n            }\n          });\n          this.setVisibleItems();\n\n          // If current item is not in this group, set it as the active item\n          if (!currentItemIsVisible) {\n            this.customSetActiveMedia(selectedGroup.items[0].main, true);\n          }\n\n          // Handle single images on stacked view\n          if (selectedGroup.items.length === 1) {\n            selectedGroup.items[0].main.classList.add('media-viewer__item--single');\n          }\n        }\n      } else {\n        this.viewerItems.forEach((item) => {\n          item.style.display = '';\n        });\n        this.thumbsItems.forEach((item) => {\n          item.style.display = '';\n        });\n      }\n    }\n\n    /**\n     * Initialises the media gallery slider and associated controls.\n     */\n    initGallery() {\n      this.setVisibleItems();\n      if (this.visibleItems.length <= 1) return;\n\n      this.viewerItemOffset = this.visibleItems[1].offsetLeft - this.visibleItems[0].offsetLeft;\n      this.currentIndex = Math.round(this.viewer.scrollLeft / this.viewerItemOffset);\n      this.currentItem = this.visibleItems[this.currentIndex];\n      this.addListeners();\n\n      if (this.thumbs && this.currentItem) {\n        this.currentThumb = this.thumbs.querySelector(\n          `[data-media-id=\"${this.currentItem.dataset.mediaId}\"]`\n        );\n      }\n\n      if (!this.isFeatured && document.hasFocus()) {\n        // Eager load the slider images for smooth UX\n        this.viewer.querySelectorAll('.product-image[loading=\"lazy\"]').forEach((img, index) => {\n          setTimeout(() => {\n            img.loading = 'eager';\n          }, 500 * (index + 1));\n        });\n      }\n\n      const currentItem = this.querySelector('.media-viewer__item.is-current-variant');\n      this.customSetActiveMedia(currentItem, true);\n    }\n\n\n\n    addListeners() {\n      this.viewer.addEventListener('scroll', this.handleScroll.bind(this));\n      if (this.controls) this.controls.addEventListener('click', this.handleNavClick.bind(this));\n      if (this.actions) this.actions.addEventListener('click', this.handleActionClick.bind(this));\n      if (this.thumbs) {\n        this.thumbs.addEventListener('click', this.handleThumbClick.bind(this));\n        // Add hover-to-change functionality\n        this.thumbsItems.forEach((thumb) => {\n          thumb.addEventListener('mouseenter', this.handleThumbHover.bind(this));\n        });\n      }\n      this.initViewerDrag();\n      this.resizeHandler = this.resizeHandler || this.handleResize.bind(this);\n      window.addEventListener('on:debounced-resize', this.resizeHandler);\n      \n      // Add scroll arrows for vertical thumbnails\n      this.initThumbScrollArrows();\n    }\n\n    /**\n     * Adds a reversible desktop preview when hovering bundle option cards.\n     */\n    initBundleHoverPreview() {\n      const cards = this.section\n        ? this.section.querySelectorAll('.opt-label--btn[data-bundle-media-preview][data-media-id], .opt-label--btn.has-variant-image')\n        : [];\n      this.bundleHoverCards = Array.from(cards).filter((card) => this.getBundleHoverMediaItem(card));\n      if (!this.bundleHoverCards.length) return;\n\n      this.bundleHoverCards.forEach((card) => {\n        card.addEventListener('mouseenter', this.handleBundleHoverEnter.bind(this));\n        card.addEventListener('mouseleave', this.handleBundleHoverLeave.bind(this));\n      });\n    }\n\n    /**\n     * Desktop-only bundle hover preview. This does not select the radio option.\n     * @param {Event} evt - Mouse event.\n     */\n    handleBundleHoverEnter(evt) {\n      if (!theme.mediaMatches.md || !this.viewer) return;\n\n      const card = evt.currentTarget;\n      const itemToShow = this.getBundleHoverMediaItem(card);\n\n      this.setBundleHoverCard(card);\n      if (!itemToShow || itemToShow === this.currentItem) return;\n\n      if (!this.bundleHoverPreview) {\n        this.bundleHoverPreview = {\n          item: this.currentItem,\n          mediaId: this.currentItem?.dataset.mediaId || null\n        };\n      }\n\n      this.customSetActiveMedia(itemToShow, true);\n    }\n\n    /**\n     * Resolves a bundle card's media item. Fresh markup provides data-media-id;\n     * stale cached markup can still be matched by the card thumbnail image URL.\n     * @param {Element} card - Bundle option card.\n     * @returns {Element|null}\n     */\n    getBundleHoverMediaItem(card) {\n      if (!card || !this.viewer) return null;\n\n      if (card.dataset.mediaId) {\n        const mediaItem = this.viewer.querySelector(`.media-viewer__item[data-media-id=\"${card.dataset.mediaId}\"]`);\n        if (mediaItem) return mediaItem;\n      }\n\n      const cardImage = card.querySelector('.opt-label__mini-image img, img');\n      const cardImageKey = MediaGallery.getComparableImageKey(cardImage);\n      if (!cardImageKey) return null;\n\n      const mediaItem = Array.from(this.viewer.querySelectorAll('.media-viewer__item')).find((item) => {\n        const mediaImage = item.querySelector('img');\n        return MediaGallery.getComparableImageKey(mediaImage) === cardImageKey;\n      });\n\n      if (mediaItem?.dataset.mediaId) {\n        card.dataset.mediaId = mediaItem.dataset.mediaId;\n        card.dataset.bundleMediaPreview = card.dataset.bundleMediaPreview || 'true';\n      }\n\n      return mediaItem || null;\n    }\n\n    /**\n     * Normalizes Shopify image URLs so card thumbnails match gallery images at different widths.\n     * @param {HTMLImageElement|null} image - Image to normalize.\n     * @returns {string}\n     */\n    static getComparableImageKey(image) {\n      const src = image?.currentSrc || image?.src || '';\n      if (!src) return '';\n\n      try {\n        const url = new URL(src, window.location.origin);\n        return `${url.pathname}?v=${url.searchParams.get('v') || ''}`;\n      } catch (error) {\n        return src.split('&width=')[0].split('?width=')[0];\n      }\n    }\n\n    /**\n     * Restores the gallery to the media shown before the bundle hover.\n     */\n    handleBundleHoverLeave() {\n      this.restoreBundleHoverPreview();\n    }\n\n    /**\n     * Highlights only the currently hovered bundle card.\n     * @param {Element} activeCard - Card to highlight.\n     */\n    setBundleHoverCard(activeCard) {\n      if (!this.bundleHoverCards) return;\n\n      this.bundleHoverCards.forEach((card) => {\n        const isActive = card === activeCard;\n        card.classList.toggle('is-hover-preview', isActive);\n        if (isActive) {\n          card.style.borderColor = 'rgb(0, 166, 237)';\n          card.style.boxShadow = '0 0 0 2px rgba(0, 166, 237, 0.22), 0 0 12px rgba(0, 166, 237, 0.32)';\n        } else {\n          card.style.removeProperty('border-color');\n          card.style.removeProperty('box-shadow');\n        }\n      });\n    }\n\n    /**\n     * Clears the active hover card and optionally restores the saved media.\n     * @param {boolean} restore - Whether to restore the pre-hover media.\n     */\n    clearBundleHoverPreview(restore = true) {\n      if (!this.bundleHoverPreview) {\n        this.setBundleHoverCard(null);\n        return;\n      }\n\n      const restoreItem = this.bundleHoverPreview.item\n        || (this.bundleHoverPreview.mediaId\n          ? this.viewer.querySelector(`.media-viewer__item[data-media-id=\"${this.bundleHoverPreview.mediaId}\"]`)\n          : null);\n\n      this.bundleHoverPreview = null;\n      this.setBundleHoverCard(null);\n\n      if (restore && restoreItem) {\n        this.customSetActiveMedia(restoreItem, true);\n      }\n    }\n\n    /**\n     * Restores the gallery after bundle hover preview.\n     */\n    restoreBundleHoverPreview() {\n      this.clearBundleHoverPreview(true);\n    }\n\n\n\n    /**\n     * Initializes scroll arrows for vertical thumbnail navigation.\n     */\n    initThumbScrollArrows() {\n      this.removeThumbScrollArrows();\n    }\n\n    /**\n     * Removes desktop thumbnail scroll arrows and restores the original thumbnail container.\n     */\n    removeThumbScrollArrows() {\n      const wrapper = this.querySelector('.thumb-nav-wrapper');\n      if (!wrapper) return;\n\n      const thumbsOuter = wrapper.querySelector('.media-gallery__thumbs');\n      if (thumbsOuter) {\n        wrapper.parentNode.insertBefore(thumbsOuter, wrapper);\n      }\n      wrapper.remove();\n    }\n\n    /**\n     * Enables desktop mouse-drag swiping on the main gallery viewer.\n     */\n    initViewerDrag() {\n      if (!this.viewer || this.viewerDragListenersAdded) return;\n\n      this.viewerPointerDownHandler = this.handleViewerPointerDown.bind(this);\n      this.viewerPointerMoveHandler = this.handleViewerPointerMove.bind(this);\n      this.viewerPointerUpHandler = this.handleViewerPointerUp.bind(this);\n      this.viewerClickHandler = this.handleViewerClick.bind(this);\n\n      this.viewer.addEventListener('pointerdown', this.viewerPointerDownHandler);\n      this.viewer.addEventListener('click', this.viewerClickHandler, true);\n      this.viewerDragListenersAdded = true;\n    }\n\n    /**\n     * Removes desktop drag listeners from the gallery viewer.\n     */\n    removeViewerDragListeners() {\n      if (!this.viewer || !this.viewerDragListenersAdded) return;\n\n      this.viewer.removeEventListener('pointerdown', this.viewerPointerDownHandler);\n      this.viewer.removeEventListener('click', this.viewerClickHandler, true);\n      this.removeViewerDocumentDragListeners();\n      this.viewerDragListenersAdded = false;\n    }\n\n    /**\n     * Removes gesture-scoped document listeners.\n     */\n    removeViewerDocumentDragListeners() {\n      document.removeEventListener('pointermove', this.viewerPointerMoveHandler);\n      document.removeEventListener('pointerup', this.viewerPointerUpHandler);\n      document.removeEventListener('pointercancel', this.viewerPointerUpHandler);\n      this.viewerDocumentDragListenersAdded = false;\n    }\n\n    /**\n     * Returns whether a pointer event should start desktop gallery dragging.\n     * @param {PointerEvent} evt - Pointer event.\n     * @returns {boolean}\n     */\n    canDragViewer(evt) {\n      if (!theme.mediaMatches.md || evt.pointerType !== 'mouse' || evt.button !== 0) return false;\n      if (!this.visibleItems || this.visibleItems.length <= 1 || !this.viewerItemOffset) return false;\n      return !evt.target.closest('button, a, input, select, textarea, video, iframe, model-viewer');\n    }\n\n    /**\n     * Starts a possible desktop gallery drag.\n     * @param {PointerEvent} evt - Pointer event.\n     */\n    handleViewerPointerDown(evt) {\n      if (!this.canDragViewer(evt)) return;\n\n      this.viewerDrag = {\n        pointerId: evt.pointerId,\n        startX: evt.clientX,\n        startY: evt.clientY,\n        lastX: evt.clientX,\n        scrollLeft: this.viewer.scrollLeft,\n        startIndex: Math.min(\n          Math.max(Math.round(this.viewer.scrollLeft / this.viewerItemOffset), 0),\n          this.visibleItems.length - 1\n        ),\n        dragging: false\n      };\n\n      if (!this.viewerDocumentDragListenersAdded) {\n        document.addEventListener('pointermove', this.viewerPointerMoveHandler, { passive: false });\n        document.addEventListener('pointerup', this.viewerPointerUpHandler);\n        document.addEventListener('pointercancel', this.viewerPointerUpHandler);\n        this.viewerDocumentDragListenersAdded = true;\n      }\n\n      try {\n        this.viewer.setPointerCapture(evt.pointerId);\n      } catch (error) {\n        // Pointer capture is progressive enhancement for drag continuity.\n      }\n    }\n\n    /**\n     * Drags the desktop gallery horizontally.\n     * @param {PointerEvent} evt - Pointer event.\n     */\n    handleViewerPointerMove(evt) {\n      if (!this.viewerDrag || evt.pointerId !== this.viewerDrag.pointerId) return;\n\n      const deltaX = evt.clientX - this.viewerDrag.startX;\n      const deltaY = evt.clientY - this.viewerDrag.startY;\n      const absX = Math.abs(deltaX);\n      const absY = Math.abs(deltaY);\n      this.viewerDrag.lastX = evt.clientX;\n\n      if (!this.viewerDrag.dragging) {\n        if (absX < 6 && absY < 6) return;\n\n        if (absY > absX) {\n          this.endViewerDrag(evt, false);\n          return;\n        }\n\n        this.viewerDrag.dragging = true;\n        this.viewer.classList.add('is-dragging');\n      }\n\n      evt.preventDefault();\n      this.viewer.scrollLeft = this.viewerDrag.scrollLeft - deltaX;\n    }\n\n    /**\n     * Ends a desktop gallery drag and snaps to the nearest image.\n     * @param {PointerEvent} evt - Pointer event.\n     */\n    handleViewerPointerUp(evt) {\n      this.endViewerDrag(evt, true);\n    }\n\n    /**\n     * Completes viewer drag state.\n     * @param {PointerEvent} evt - Pointer event.\n     * @param {boolean} snapToItem - Whether to snap to the nearest visible media item.\n     */\n    endViewerDrag(evt, snapToItem) {\n      if (!this.viewerDrag || evt.pointerId !== this.viewerDrag.pointerId) return;\n\n      const drag = this.viewerDrag;\n      const wasDragging = this.viewerDrag.dragging;\n      this.viewerDrag = null;\n      this.viewer.classList.remove('is-dragging');\n      this.removeViewerDocumentDragListeners();\n\n      try {\n        this.viewer.releasePointerCapture(evt.pointerId);\n      } catch (error) {\n        // Ignore browsers that already released pointer capture.\n      }\n\n      if (!wasDragging) return;\n\n      this.viewerSuppressClick = true;\n      window.setTimeout(() => {\n        this.viewerSuppressClick = false;\n      }, 0);\n\n      if (!snapToItem || !this.visibleItems?.length || !this.viewerItemOffset) return;\n\n      const dragDistance = drag.lastX - drag.startX;\n      const swipeThreshold = Math.min(48, Math.max(20, this.viewerItemOffset * 0.04));\n      const direction = Math.abs(dragDistance) >= swipeThreshold ? (dragDistance < 0 ? 1 : -1) : 0;\n      const targetIndex = Math.min(\n        Math.max(drag.startIndex + direction, 0),\n        this.visibleItems.length - 1\n      );\n      const targetItem = this.visibleItems[targetIndex];\n      if (targetItem) {\n        this.viewer.scrollTo({ left: targetItem.offsetLeft, behavior: 'smooth' });\n      }\n    }\n\n    /**\n     * Prevents a drag gesture from also opening the zoom gallery.\n     * @param {MouseEvent} evt - Click event.\n     */\n    handleViewerClick(evt) {\n      if (!this.viewerSuppressClick) return;\n\n      evt.preventDefault();\n      evt.stopPropagation();\n      this.viewerSuppressClick = false;\n    }\n\n\n\n\n\n\n    /**\n     * Initialized the zoom on hover for desktop\n     */\n    initZoom() {\n      this.zoomLinks.forEach((el) => {\n        const zoomWidth = Number(el.querySelector('.zoom-image').dataset.originalWidth || 0);\n        const imageWidth = el.querySelector('.product-image').getBoundingClientRect().width;\n        if (theme.mediaMatches.md && ((zoomWidth - 75) > (imageWidth))) {\n          el.addEventListener('mousemove', this.zoomEventListener);\n          el.classList.remove('pointer-events-none');\n        } else {\n          el.removeEventListener('mousemove', this.zoomEventListener);\n          el.classList.add('pointer-events-none');\n        }\n      });\n    }\n\n    /**\n     * Handles mouse move over a zoomable image\n     * @param {?object} evt - Event object.\n     */\n    handleZoomMouseMove(evt) {\n      const hoverElem = evt.currentTarget;\n      const zoomImage = hoverElem.querySelector('.js-zoom-image');\n\n      // Download the zoom image if necessary\n      if (zoomImage.dataset.src) {\n        this.loadingSpinner.classList.remove('loading-spinner--out');\n\n        const img = new Image();\n        img.src = zoomImage.dataset.src;\n        img.onload = () => {\n          zoomImage.src = img.src;\n          hoverElem.classList.remove('media--zoom-not-loaded');\n          this.loadingSpinner.classList.add('loading-spinner--out');\n        };\n        zoomImage.removeAttribute('data-src');\n      }\n\n      try {\n        const offsetX = evt.offsetX ? evt.offsetX : evt.touches[0].pageX;\n        const offsetY = evt.offsetY ? evt.offsetY : evt.touches[0].pageY;\n        const x = (offsetX / zoomImage.offsetWidth) * 100;\n        const y = (offsetY / zoomImage.offsetHeight) * 100;\n        zoomImage.style.objectPosition = `${x}% ${y}%`;\n      } catch (err) {\n        // Fail silently\n      }\n    }\n\n    /**\n     * Handles 'scroll' events on the main media container.\n     */\n    handleScroll() {\n      const newIndex = Math.min(\n        Math.max(Math.round(this.viewer.scrollLeft / this.viewerItemOffset), 0),\n        this.visibleItems.length - 1\n      );\n\n      if (this.visibleItems[newIndex] && newIndex !== this.currentIndex) {\n        const viewerItemOffset = this.visibleItems[1].offsetLeft - this.visibleItems[0].offsetLeft;\n\n        // If scroll wasn't caused by a resize event, update the active media.\n        if (viewerItemOffset === this.viewerItemOffset) {\n          this.customSetActiveMedia(this.visibleItems[newIndex], false);\n        }\n      }\n    }\n\n    /**\n     * Handles 'click' events on the controls container.\n     * @param {object} evt - Event object.\n     */\n    handleNavClick(evt) {\n      const button = evt.target.closest('.media-ctrl__btn');\n      if (!button) return;\n\n      const len = this.visibleItems.length;\n      if (!len) return;\n\n      const isNext = button === this.nextBtn;\n      // Wrap around the main image: next on the last image jumps to the first, prev on\n      // the first jumps to the last. (The vertical thumbnail rail does NOT wrap.)\n      const targetIndex = isNext\n        ? (this.currentIndex + 1) % len\n        : (this.currentIndex - 1 + len) % len;\n\n      const itemToShow = this.visibleItems[targetIndex];\n      this.viewer.scrollTo({ left: itemToShow.offsetLeft, behavior: 'smooth' });\n    }\n\n    /**\n     * Returns whether the gallery is currently in the mobile layout.\n     * @returns {boolean}\n     */\n    isMobileGallery() {\n      return window.matchMedia('(max-width: 768.98px)').matches;\n    }\n\n/**\n     * Handles 'click' events on the thumbnails container.\n     * @param {object} evt - Event object.\n     */\n    handleThumbClick(evt) {\n      const thumb = evt.target.closest('[data-media-id]');\n      if (!thumb) return;\n\n      const itemToShow = this.querySelector(`[data-media-id=\"${thumb.dataset.mediaId}\"]`);\n      this.customSetActiveMedia(itemToShow);\n\n      MediaGallery.playActiveMedia(itemToShow);\n    }\n\n    /**\n     * Handles 'mouseenter' events on thumbnails for hover-to-change.\n     * @param {object} evt - Event object.\n     */\n    handleThumbHover(evt) {\n      const thumb = evt.target.closest('[data-media-id]');\n      if (!thumb) return;\n\n      const itemToShow = this.querySelector(`[data-media-id=\"${thumb.dataset.mediaId}\"]`);\n      this.customSetActiveMedia(itemToShow);\n    }\n\n    /**\n     * Handles clicks on the gallery action tabs below the main media.\n     * @param {object} evt - Event object.\n     */\n    handleActionClick(evt) {\n      const action = evt.target.closest('.media-gallery__action');\n      if (!action) return;\n\n      evt.preventDefault();\n      this.setActiveAction(action);\n\n      if (action.dataset.galleryAction === 'photos') {\n        const itemToShow = this.viewer.querySelector(\n          `.media-viewer__item[data-media-id=\"${action.dataset.mediaId}\"]`\n        ) || this.viewer.querySelector('.media-viewer__item[data-media-type=\"image\"]');\n        if (itemToShow) this.customSetActiveMedia(itemToShow);\n        return;\n      }\n\n      if (action.dataset.galleryAction === 'video') {\n        const itemToShow = this.viewer.querySelector(\n          `.media-viewer__item[data-media-id=\"${action.dataset.mediaId}\"]`\n        );\n        if (itemToShow) {\n          this.customSetActiveMedia(itemToShow);\n          MediaGallery.playActiveMedia(itemToShow);\n        }\n        return;\n      }\n\n      if (action.dataset.galleryAction === 'details') {\n        document.querySelector('.product-description')\n          ?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    }\n\n    /**\n     * Sets the active visual state for gallery action tabs.\n     * @param {Element} activeAction - Active action button.\n     */\n    setActiveAction(activeAction) {\n      if (!this.actionTabs) return;\n\n      this.actionTabs.forEach((action) => {\n        const isActive = action === activeAction;\n        action.classList.toggle('is-active', isActive);\n        action.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n      });\n    }\n\n    /**\n     * Keeps the gallery action tab matched to the active media.\n     * @param {Element} mediaItem - Active media item.\n     */\n    updateMediaActionState(mediaItem) {\n      if (!this.actionTabs || !mediaItem) return;\n\n      const activeAction = Array.from(this.actionTabs).find((action) => {\n        if (mediaItem.dataset.mediaType === 'image') {\n          return action.dataset.galleryAction === 'photos';\n        }\n\n        return action.dataset.galleryAction === 'video'\n          && action.dataset.mediaId === mediaItem.dataset.mediaId;\n      });\n\n      if (activeAction) {\n        this.setActiveAction(activeAction);\n        return;\n      }\n\n      this.actionTabs.forEach((action) => action.classList.remove('is-active'));\n      this.actionTabs.forEach((action) => action.setAttribute('aria-pressed', 'false'));\n    }\n\n\n\n    /**\n     * Handles debounced 'resize' events on the window.\n     */\n    handleResize() {\n      // Reset distance from leading edge of one slide to the next.\n      this.viewerItemOffset = this.visibleItems[1].offsetLeft - this.visibleItems[0].offsetLeft;\n      this.initThumbScrollArrows();\n      this.updateControlState();\n      this.updateMobileDots();\n\n      if (this.thumbs && this.currentThumb) {\n        this.checkThumbVisibilty(this.currentThumb);\n      }\n    }\n\n    /**\n     * Stub for variant-picker calls. Listening to change event instead.\n     */\n    // eslint-disable-next-line class-methods-use-this\n    setActiveMedia() {}\n\n    /**\n     * Sets the active media item.\n     * @param {Element} mediaItem - Media element to set as active.\n     * @param {boolean} [scrollToItem=true] - Scroll to the active media item.\n     */\n    customSetActiveMedia(mediaItem, scrollToItem = true) {\n      if (mediaItem === this.currentItem) {\n        this.updateMediaActionState(mediaItem);\n        this.updateControlState();\n        this.updateMobileDots();\n        return;\n      }\n      window.pauseAllMedia(this);\n      const previousIndex = Number.isFinite(this.currentIndex) ? this.currentIndex : null;\n      this.currentItem = mediaItem;\n      this.currentIndex = this.visibleItems.indexOf(this.currentItem);\n      const dotDirection = this.mobileDotDirection\n        || this.getMobileDotDirection(previousIndex, this.currentIndex);\n      this.mobileDotDirection = null;\n\n      if (this.dataset.layout === 'stacked' && theme.mediaMatches.md) {\n        // Update the active class and scroll to the active media\n        if (this.stackedUnderline) {\n          if (this.previousMediaItem) this.previousMediaItem.classList.remove('is-active');\n          mediaItem.classList.add('is-active');\n          this.previousMediaItem = mediaItem;\n        }\n\n        if (this.stackedScroll !== 'never') {\n          const y = mediaItem.getBoundingClientRect().top\n            + document.documentElement.scrollTop - 150;\n\n          // If the element is far enough away to scroll to it\n          if (Math.abs(y - document.documentElement.scrollTop) > 300) {\n            window.scrollTo({\n              top: y < 100 ? 0 : y,\n              behavior: 'smooth'\n            });\n          }\n        }\n        return;\n      }\n\n      if (scrollToItem) this.viewer.scrollTo({ left: this.currentItem.offsetLeft });\n      if (this.thumbs) this.setActiveThumb();\n\n      this.updateControlState();\n\n      this.announceLiveRegion(this.currentItem, this.currentIndex + 1);\n      this.updateMediaActionState(mediaItem);\n      this.updateMobileDots(dotDirection);\n\n      if (this.xrButton && mediaItem.dataset.mediaType === 'model') {\n        this.xrButton.dataset.shopifyModel3dId = mediaItem.dataset.mediaId;\n      }\n    }\n\n    /**\n     * Sets the active thumbnail.\n     */\n    setActiveThumb() {\n      this.currentThumb = this.thumbs.querySelector(\n        `[data-media-id=\"${this.currentItem.dataset.mediaId}\"]`\n      );\n      const btn = this.currentThumb.querySelector('button');\n\n      this.thumbs.querySelectorAll('.media-thumbs__btn').forEach((el) => {\n        el.classList.remove('is-active');\n        el.removeAttribute('aria-current');\n      });\n\n      btn.classList.add('is-active');\n      btn.setAttribute('aria-current', 'true');\n      this.checkThumbVisibilty(this.currentThumb);\n    }\n\n    /**\n     * Creates an array of the visible media items.\n     */\n    setVisibleItems() {\n      this.viewerItems = this.querySelectorAll('.media-viewer__item');\n      this.visibleItems = Array.from(this.viewerItems).filter((el) => el.clientWidth > 0);\n      if (this.counterTotal) {\n        this.counterTotal.textContent = this.visibleItems.length;\n      }\n      this.updateMobileDots();\n    }\n\n    /**\n     * Updates media control buttons and legacy counter state.\n     */\n    updateControlState() {\n      if (!this.controls) return;\n\n      // Arrows wrap around (see handleNavClick), so keep them enabled at the ends -\n      // only disable when there's nothing to navigate to (a single image).\n      if (this.prevBtn) {\n        this.prevBtn.disabled = this.visibleItems.length <= 1;\n      }\n\n      if (this.nextBtn) {\n        this.nextBtn.disabled = this.visibleItems.length <= 1;\n      }\n\n      if (this.counterCurrent) {\n        this.counterCurrent.textContent = this.currentIndex + 1;\n      }\n    }\n\n    /**\n     * Updates the compact mobile dot indicator for the active media window.\n     */\n    updateMobileDots(direction = null) {\n      if (!this.mobileDots || this.mobileDots.length === 0 || !this.visibleItems) return;\n\n      const total = this.visibleItems.length;\n      const current = Number.isFinite(this.currentIndex) && this.currentIndex >= 0 ? this.currentIndex : 0;\n      const visibleDots = Math.min(5, total);\n      const windowStart = total > 5 ? Math.min(Math.max(current - 2, 0), total - 5) : 0;\n\n      this.mobileDots.forEach((dot, index) => {\n        if (index >= visibleDots) {\n          dot.hidden = true;\n          return;\n        }\n\n        const mediaIndex = windowStart + index;\n        const hasMoreBefore = index === 0 && windowStart > 0;\n        const hasMoreAfter = index === 4 && windowStart + 5 < total;\n\n        dot.hidden = false;\n        dot.classList.toggle('is-active', mediaIndex === current);\n        dot.classList.toggle('is-small', total > 5 && (hasMoreBefore || hasMoreAfter));\n      });\n\n      if (direction) {\n        this.animateMobileDots(direction);\n      }\n    }\n\n    /**\n     * Infers which way the active dot should move.\n     * @param {?number} previousIndex - Previous active media index.\n     * @param {number} currentIndex - Current active media index.\n     * @returns {?string}\n     */\n    getMobileDotDirection(previousIndex, currentIndex) {\n      if (previousIndex === null || previousIndex === currentIndex) return null;\n      return currentIndex > previousIndex ? 'next' : 'prev';\n    }\n\n    /**\n     * Gives the mobile dot strip a small directional nudge during image changes.\n     * @param {string} direction - Direction class suffix.\n     */\n    animateMobileDots(direction) {\n      if (!this.isMobileGallery()) return;\n\n      const dots = this.querySelector('.media-ctrl__dots');\n      if (!dots) return;\n\n      clearTimeout(this.mobileDotMotionTimer);\n      dots.classList.remove('is-moving-next', 'is-moving-prev');\n      dots.offsetWidth;\n      dots.classList.add(`is-moving-${direction}`);\n      this.mobileDotMotionTimer = setTimeout(() => {\n        dots.classList.remove('is-moving-next', 'is-moving-prev');\n      }, 220);\n    }\n\n    /**\n     * Ensures a thumbnail is in the visible area of the slider.\n     * @param {Element} thumb - Thumb item element.\n     */\n    checkThumbVisibilty(thumb) {\n      const scrollPos = this.thumbs.scrollLeft;\n      const lastVisibleThumbOffset = this.thumbs.clientWidth + scrollPos;\n      const thumbOffset = thumb.offsetLeft;\n\n      if (thumbOffset + thumb.clientWidth > lastVisibleThumbOffset || thumbOffset < scrollPos) {\n        this.thumbs.scrollTo({ left: thumbOffset, behavior: 'smooth' });\n      }\n    }\n\n    /**\n     * Updates the media gallery status.\n     * @param {Element} mediaItem - Active media element.\n     * @param {number} index - Active media index.\n     */\n    announceLiveRegion(mediaItem, index) {\n      const image = mediaItem.querySelector('.media-viewer img');\n      if (!image) return;\n\n      this.liveRegion.setAttribute('aria-hidden', 'false');\n      this.liveRegion.innerHTML = theme.strings.imageAvailable.replace('[index]', index);\n\n      setTimeout(() => {\n        this.liveRegion.setAttribute('aria-hidden', 'true');\n      }, 2000);\n    }\n\n    /**\n     * Loads the deferred media for the active item.\n     * @param {Element} mediaItem - Active media element.\n     */\n    static playActiveMedia(mediaItem) {\n      window.pauseAllMedia();\n      const deferredMedia = mediaItem.querySelector('deferred-media');\n      if (deferredMedia) deferredMedia.loadContent();\n    }\n  }\n\n  customElements.define('media-gallery', MediaGallery);\n}\n"],
  "mappings": "AAAA,GAAI,CAAC,eAAe,IAAI,eAAe,EAAG,CACxC,MAAM,qBAAqB,WAAY,CACrC,aAAc,CACZ,MAAM,EAEF,QAAQ,WACV,WAAW,IAAM,KAAK,KAAK,EAAG,GAAG,EAEjC,KAAK,KAAK,CAEd,CAEA,sBAAuB,CACrB,OAAO,oBAAoB,sBAAuB,KAAK,aAAa,EACpE,KAAK,wBAAwB,EAC7B,aAAa,KAAK,oBAAoB,EACtC,KAAK,0BAA0B,EAE3B,KAAK,mBACP,OAAO,oBAAoB,sBAAuB,KAAK,iBAAiB,EAGtE,KAAK,iBACP,OAAO,oBAAoB,sBAAuB,KAAK,eAAe,CAE1E,CAEA,MAAO,CACL,KAAK,QAAU,KAAK,QAAQ,aAAa,EACzC,KAAK,kBAAoB,KAAK,aAAa,0BAA0B,EACrE,KAAK,qBAAuB,KAAK,aAAa,6BAA6B,GACtE,KAAK,kBAAkB,EAC5B,KAAK,cAAgB,KAAK,QAAQ,cAClC,KAAK,iBAAmB,KAAK,QAAQ,mBAAqB,QAAU,CAAC,KAAK,qBAC1E,KAAK,WAAa,KAAK,QAAQ,aAAe,OAC9C,KAAK,OAAS,KAAK,cAAc,eAAe,EAChD,KAAK,OAAS,KAAK,cAAc,eAAe,EAChD,KAAK,YAAc,KAAK,iBAAiB,qBAAqB,EAC9D,KAAK,SAAW,KAAK,cAAc,aAAa,EAChD,KAAK,QAAU,KAAK,cAAc,+BAA+B,EACjE,KAAK,QAAU,KAAK,cAAc,+BAA+B,EACjE,KAAK,eAAiB,KAAK,cAAc,2BAA2B,EACpE,KAAK,aAAe,KAAK,cAAc,0BAA0B,EACjE,KAAK,WAAa,KAAK,iBAAiB,kBAAkB,EAC1D,KAAK,WAAa,KAAK,cAAc,wBAAwB,EAC7D,KAAK,UAAY,KAAK,iBAAiB,eAAe,EACtD,KAAK,QAAU,KAAK,cAAc,yBAAyB,EAC3D,KAAK,WAAa,KAAK,iBAAiB,wBAAwB,EAChE,KAAK,eAAiB,KAAK,cAAc,kBAAkB,EAC3D,KAAK,SAAW,KAAK,cAAc,kBAAkB,EAEjD,KAAK,aAAa,mBAAmB,IAIvC,KAAK,aAAe,SAAS,WAAW,KAAK,cAAc,yBAAyB,EAAE,QAAQ,kBAAmB,EAAI,EACjH,OAAO,gBAAkB,eAAe,SAAS,eAAe,QAAQ,KAAK,YAAY,GAG3F,KAAK,sBAAwB,CAAC,KAAK,mBACrC,KAAK,oBAAoB,KAAK,iCAAiC,CAAC,EAG9D,KAAK,QAAQ,SAAW,WAAa,MAAM,aAAa,IAC1D,KAAK,kBAAoB,KAAK,mBAAqB,KAAK,YAAY,KAAK,IAAI,EAC7E,OAAO,iBAAiB,sBAAuB,KAAK,iBAAiB,EACrE,KAAK,gBAAgB,EACrB,KAAK,kBAAoB,KAAK,cAAc,wCAAwC,EACpF,WAAW,IAAM,KAAK,qBAAqB,KAAK,kBAAmB,KAAK,gBAAkB,QAAQ,EAAG,GAAG,GAExG,KAAK,YAAY,EAGf,KAAK,YACH,KAAK,QAAQ,cAAgB,QAC/B,KAAK,gBAAgB,EAErB,KAAK,UAAU,QAAS,UAAa,CACnC,SAAS,iBAAiB,QAAU,KAAQ,CAC1C,KAAK,gBAAgB,EACrB,IAAI,eAAe,CACrB,CAAC,CACH,CAAC,GAIL,KAAK,QAAQ,iBAAiB,oBAAqB,KAAK,gBAAgB,KAAK,IAAI,CAAC,EAClF,KAAK,uBAAuB,CAC9B,CAEA,iBAAkB,CAChB,KAAK,gBAAkB,KAAK,iBAAmB,KAAK,SAAS,KAAK,IAAI,EACtE,KAAK,kBAAoB,KAAK,mBAAqB,KAAK,oBAAoB,KAAK,IAAI,EACrF,OAAO,iBAAiB,sBAAuB,KAAK,eAAe,EACnE,KAAK,SAAS,EACd,KAAK,UAAU,QAAS,UAAa,CACnC,SAAS,iBAAiB,QAAU,KAAQ,CAC1C,IAAI,eAAe,CACrB,CAAC,CACH,CAAC,CACH,CAMA,gBAAgB,IAAK,CAOnB,GANA,KAAK,wBAAwB,EAAK,EAE9B,KAAK,sBACP,KAAK,oBAAoB,KAAK,iCAAiC,CAAC,EAG9D,IAAI,OAAO,SAAW,IAAI,OAAO,QAAQ,eAAgB,CAC3D,MAAM,aAAe,KAAK,OAAO,cAC/B,mBAAmB,IAAI,OAAO,QAAQ,eAAe,EAAE,IACzD,EACA,KAAK,qBAAqB,aAAc,EAAI,CAC9C,CACF,CAMA,kCAAmC,CACjC,MAAM,gBAAkB,KAAK,QAAQ,iBAAiB,kBAAkB,EACxE,GAAI,gBAAgB,OAAS,KAAK,kBAAkB,EAAE,iBAAkB,CACtE,MAAM,SAAW,gBAAgB,KAAK,kBAAkB,EAAE,gBAAgB,EAC1E,OAAI,SAAS,QAAQ,eAAiB,WAC7B,SAAS,cAAc,qBAAqB,EAAE,YAAY,KAAK,EAEjE,SAAS,cAAc,eAAe,EAAE,KACjD,CACA,OAAO,IACT,CAMA,mBAAoB,CAClB,GAAI,OAAO,KAAK,iBAAqB,IAAa,CAChD,MAAM,OAAS,KAAK,cAAc,wBAAwB,EAC1D,KAAK,iBAAmB,OAAS,KAAK,MAAM,OAAO,WAAW,EAAI,EACpE,CAEA,OAAO,KAAK,gBACd,CAMA,kBAAmB,CACjB,GAAI,CAAC,KAAK,cAAe,CACvB,KAAK,cAAgB,CACnB,OAAQ,CAAC,CACX,EAGA,MAAM,iBAAmB,KAAK,kBAAkB,EAChD,IAAI,uBAAyB,GAC7B,KAAK,YAAc,KAAK,iBAAiB,qBAAqB,EAC9D,KAAK,YAAY,QAAS,MAAS,CACjC,QAAS,EAAI,EAAG,EAAI,iBAAiB,aAAa,OAAQ,GAAK,EACzD,SAAS,KAAK,QAAQ,QAAS,EAAE,IAAM,iBAAiB,aAAa,CAAC,EAAE,SACtE,yBAA2B,iBAAiB,aAAa,CAAC,EAAE,SAC9D,uBAAyB,iBAAiB,aAAa,CAAC,EAAE,QAIhE,GAAI,uBAAwB,CACrB,KAAK,cAAc,OAAO,sBAAsB,IACnD,KAAK,cAAc,OAAO,sBAAsB,EAAI,CAClD,KAAM,uBACN,MAAO,CAAC,CACV,GAEF,MAAM,UAAY,CAAE,KAAM,IAAK,EAC3B,KAAK,SACP,UAAU,MAAQ,KAAK,OAAO,cAC5B,mBAAmB,KAAK,QAAQ,OAAO,uBACzC,GAEF,KAAK,cAAc,OAAO,sBAAsB,EAAE,MAAM,KAAK,SAAS,CACxE,CACF,CAAC,EAGD,KAAK,cAAc,cAAiB,MAAS,CAC3C,MAAM,OAAS,OAAO,KAAK,KAAK,cAAc,MAAM,EACpD,QAAS,EAAI,EAAG,EAAI,OAAQ,GAAK,EAAG,CAClC,MAAM,MAAQ,OAAO,CAAC,EACtB,QAAS,EAAI,EAAG,EAAI,KAAK,cAAc,OAAO,KAAK,EAAE,MAAM,OAAQ,GAAK,EACtE,GAAI,KAAK,cAAc,OAAO,KAAK,EAAE,MAAM,CAAC,IAAM,KAChD,OAAO,KAAK,cAAc,OAAO,KAAK,CAG5C,CACA,OAAO,KAAK,cAAc,OAAO,OAAO,KAAK,KAAK,cAAc,MAAM,EAAE,CAAC,CAAC,CAC5E,CACF,CAEA,OAAO,KAAK,aACd,CAMA,oBAAoB,UAAW,CAC7B,MAAM,cAAgB,KAAK,iBAAiB,EACtC,cAAgB,UAClB,cAAc,OAAO,SAAS,EAC9B,cAAc,cAAc,KAAK,WAAW,EAEhD,GAAI,eACF,GAAI,KAAK,eAAiB,cAAe,CACvC,KAAK,aAAe,cACpB,KAAK,YAAY,QAAS,MAAS,CACjC,KAAK,MAAM,QAAU,OACrB,KAAK,UAAU,OAAO,4BAA4B,CACpD,CAAC,EACD,KAAK,YAAY,QAAS,MAAS,CACjC,KAAK,MAAM,QAAU,MACvB,CAAC,EAED,IAAI,qBAAuB,GAC3B,cAAc,MAAM,QAAS,MAAS,CACpC,KAAK,KAAK,MAAM,QAAU,GACtB,KAAK,QACP,KAAK,MAAM,MAAM,QAAU,IAEzB,KAAK,OAAS,KAAK,cACrB,qBAAuB,GAE3B,CAAC,EACD,KAAK,gBAAgB,EAGhB,sBACH,KAAK,qBAAqB,cAAc,MAAM,CAAC,EAAE,KAAM,EAAI,EAIzD,cAAc,MAAM,SAAW,GACjC,cAAc,MAAM,CAAC,EAAE,KAAK,UAAU,IAAI,4BAA4B,CAE1E,OAEA,KAAK,YAAY,QAAS,MAAS,CACjC,KAAK,MAAM,QAAU,EACvB,CAAC,EACD,KAAK,YAAY,QAAS,MAAS,CACjC,KAAK,MAAM,QAAU,EACvB,CAAC,CAEL,CAKA,aAAc,CAEZ,GADA,KAAK,gBAAgB,EACjB,KAAK,aAAa,QAAU,EAAG,OAEnC,KAAK,iBAAmB,KAAK,aAAa,CAAC,EAAE,WAAa,KAAK,aAAa,CAAC,EAAE,WAC/E,KAAK,aAAe,KAAK,MAAM,KAAK,OAAO,WAAa,KAAK,gBAAgB,EAC7E,KAAK,YAAc,KAAK,aAAa,KAAK,YAAY,EACtD,KAAK,aAAa,EAEd,KAAK,QAAU,KAAK,cACtB,KAAK,aAAe,KAAK,OAAO,cAC9B,mBAAmB,KAAK,YAAY,QAAQ,OAAO,IACrD,GAGE,CAAC,KAAK,YAAc,SAAS,SAAS,GAExC,KAAK,OAAO,iBAAiB,gCAAgC,EAAE,QAAQ,CAAC,IAAK,QAAU,CACrF,WAAW,IAAM,CACf,IAAI,QAAU,OAChB,EAAG,KAAO,MAAQ,EAAE,CACtB,CAAC,EAGH,MAAM,YAAc,KAAK,cAAc,wCAAwC,EAC/E,KAAK,qBAAqB,YAAa,EAAI,CAC7C,CAIA,cAAe,CACb,KAAK,OAAO,iBAAiB,SAAU,KAAK,aAAa,KAAK,IAAI,CAAC,EAC/D,KAAK,UAAU,KAAK,SAAS,iBAAiB,QAAS,KAAK,eAAe,KAAK,IAAI,CAAC,EACrF,KAAK,SAAS,KAAK,QAAQ,iBAAiB,QAAS,KAAK,kBAAkB,KAAK,IAAI,CAAC,EACtF,KAAK,SACP,KAAK,OAAO,iBAAiB,QAAS,KAAK,iBAAiB,KAAK,IAAI,CAAC,EAEtE,KAAK,YAAY,QAAS,OAAU,CAClC,MAAM,iBAAiB,aAAc,KAAK,iBAAiB,KAAK,IAAI,CAAC,CACvE,CAAC,GAEH,KAAK,eAAe,EACpB,KAAK,cAAgB,KAAK,eAAiB,KAAK,aAAa,KAAK,IAAI,EACtE,OAAO,iBAAiB,sBAAuB,KAAK,aAAa,EAGjE,KAAK,sBAAsB,CAC7B,CAKA,wBAAyB,CACvB,MAAM,MAAQ,KAAK,QACf,KAAK,QAAQ,iBAAiB,8FAA8F,EAC5H,CAAC,EACL,KAAK,iBAAmB,MAAM,KAAK,KAAK,EAAE,OAAQ,MAAS,KAAK,wBAAwB,IAAI,CAAC,EACxF,KAAK,iBAAiB,QAE3B,KAAK,iBAAiB,QAAS,MAAS,CACtC,KAAK,iBAAiB,aAAc,KAAK,uBAAuB,KAAK,IAAI,CAAC,EAC1E,KAAK,iBAAiB,aAAc,KAAK,uBAAuB,KAAK,IAAI,CAAC,CAC5E,CAAC,CACH,CAMA,uBAAuB,IAAK,CAC1B,GAAI,CAAC,MAAM,aAAa,IAAM,CAAC,KAAK,OAAQ,OAE5C,MAAM,KAAO,IAAI,cACX,WAAa,KAAK,wBAAwB,IAAI,EAEpD,KAAK,mBAAmB,IAAI,EACxB,GAAC,YAAc,aAAe,KAAK,eAElC,KAAK,qBACR,KAAK,mBAAqB,CACxB,KAAM,KAAK,YACX,QAAS,KAAK,aAAa,QAAQ,SAAW,IAChD,GAGF,KAAK,qBAAqB,WAAY,EAAI,EAC5C,CAQA,wBAAwB,KAAM,CAC5B,GAAI,CAAC,MAAQ,CAAC,KAAK,OAAQ,OAAO,KAElC,GAAI,KAAK,QAAQ,QAAS,CACxB,MAAMA,WAAY,KAAK,OAAO,cAAc,sCAAsC,KAAK,QAAQ,OAAO,IAAI,EAC1G,GAAIA,WAAW,OAAOA,UACxB,CAEA,MAAM,UAAY,KAAK,cAAc,iCAAiC,EAChE,aAAe,aAAa,sBAAsB,SAAS,EACjE,GAAI,CAAC,aAAc,OAAO,KAE1B,MAAM,UAAY,MAAM,KAAK,KAAK,OAAO,iBAAiB,qBAAqB,CAAC,EAAE,KAAM,MAAS,CAC/F,MAAM,WAAa,KAAK,cAAc,KAAK,EAC3C,OAAO,aAAa,sBAAsB,UAAU,IAAM,YAC5D,CAAC,EAED,OAAI,WAAW,QAAQ,UACrB,KAAK,QAAQ,QAAU,UAAU,QAAQ,QACzC,KAAK,QAAQ,mBAAqB,KAAK,QAAQ,oBAAsB,QAGhE,WAAa,IACtB,CAOA,OAAO,sBAAsB,MAAO,CAClC,MAAM,IAAM,OAAO,YAAc,OAAO,KAAO,GAC/C,GAAI,CAAC,IAAK,MAAO,GAEjB,GAAI,CACF,MAAM,IAAM,IAAI,IAAI,IAAK,OAAO,SAAS,MAAM,EAC/C,MAAO,GAAG,IAAI,QAAQ,MAAM,IAAI,aAAa,IAAI,GAAG,GAAK,EAAE,EAC7D,MAAgB,CACd,OAAO,IAAI,MAAM,SAAS,EAAE,CAAC,EAAE,MAAM,SAAS,EAAE,CAAC,CACnD,CACF,CAKA,wBAAyB,CACvB,KAAK,0BAA0B,CACjC,CAMA,mBAAmB,WAAY,CACxB,KAAK,kBAEV,KAAK,iBAAiB,QAAS,MAAS,CACtC,MAAM,SAAW,OAAS,WAC1B,KAAK,UAAU,OAAO,mBAAoB,QAAQ,EAC9C,UACF,KAAK,MAAM,YAAc,mBACzB,KAAK,MAAM,UAAY,wEAEvB,KAAK,MAAM,eAAe,cAAc,EACxC,KAAK,MAAM,eAAe,YAAY,EAE1C,CAAC,CACH,CAMA,wBAAwB,QAAU,GAAM,CACtC,GAAI,CAAC,KAAK,mBAAoB,CAC5B,KAAK,mBAAmB,IAAI,EAC5B,MACF,CAEA,MAAM,YAAc,KAAK,mBAAmB,OACtC,KAAK,mBAAmB,QACxB,KAAK,OAAO,cAAc,sCAAsC,KAAK,mBAAmB,OAAO,IAAI,EACnG,MAEN,KAAK,mBAAqB,KAC1B,KAAK,mBAAmB,IAAI,EAExB,SAAW,aACb,KAAK,qBAAqB,YAAa,EAAI,CAE/C,CAKA,2BAA4B,CAC1B,KAAK,wBAAwB,EAAI,CACnC,CAOA,uBAAwB,CACtB,KAAK,wBAAwB,CAC/B,CAKA,yBAA0B,CACxB,MAAM,QAAU,KAAK,cAAc,oBAAoB,EACvD,GAAI,CAAC,QAAS,OAEd,MAAM,YAAc,QAAQ,cAAc,wBAAwB,EAC9D,aACF,QAAQ,WAAW,aAAa,YAAa,OAAO,EAEtD,QAAQ,OAAO,CACjB,CAKA,gBAAiB,CACX,CAAC,KAAK,QAAU,KAAK,2BAEzB,KAAK,yBAA2B,KAAK,wBAAwB,KAAK,IAAI,EACtE,KAAK,yBAA2B,KAAK,wBAAwB,KAAK,IAAI,EACtE,KAAK,uBAAyB,KAAK,sBAAsB,KAAK,IAAI,EAClE,KAAK,mBAAqB,KAAK,kBAAkB,KAAK,IAAI,EAE1D,KAAK,OAAO,iBAAiB,cAAe,KAAK,wBAAwB,EACzE,KAAK,OAAO,iBAAiB,QAAS,KAAK,mBAAoB,EAAI,EACnE,KAAK,yBAA2B,GAClC,CAKA,2BAA4B,CACtB,CAAC,KAAK,QAAU,CAAC,KAAK,2BAE1B,KAAK,OAAO,oBAAoB,cAAe,KAAK,wBAAwB,EAC5E,KAAK,OAAO,oBAAoB,QAAS,KAAK,mBAAoB,EAAI,EACtE,KAAK,kCAAkC,EACvC,KAAK,yBAA2B,GAClC,CAKA,mCAAoC,CAClC,SAAS,oBAAoB,cAAe,KAAK,wBAAwB,EACzE,SAAS,oBAAoB,YAAa,KAAK,sBAAsB,EACrE,SAAS,oBAAoB,gBAAiB,KAAK,sBAAsB,EACzE,KAAK,iCAAmC,EAC1C,CAOA,cAAc,IAAK,CAEjB,MADI,CAAC,MAAM,aAAa,IAAM,IAAI,cAAgB,SAAW,IAAI,SAAW,GACxE,CAAC,KAAK,cAAgB,KAAK,aAAa,QAAU,GAAK,CAAC,KAAK,iBAAyB,GACnF,CAAC,IAAI,OAAO,QAAQ,iEAAiE,CAC9F,CAMA,wBAAwB,IAAK,CAC3B,GAAK,KAAK,cAAc,GAAG,EAE3B,MAAK,WAAa,CAChB,UAAW,IAAI,UACf,OAAQ,IAAI,QACZ,OAAQ,IAAI,QACZ,MAAO,IAAI,QACX,WAAY,KAAK,OAAO,WACxB,WAAY,KAAK,IACf,KAAK,IAAI,KAAK,MAAM,KAAK,OAAO,WAAa,KAAK,gBAAgB,EAAG,CAAC,EACtE,KAAK,aAAa,OAAS,CAC7B,EACA,SAAU,EACZ,EAEK,KAAK,mCACR,SAAS,iBAAiB,cAAe,KAAK,yBAA0B,CAAE,QAAS,EAAM,CAAC,EAC1F,SAAS,iBAAiB,YAAa,KAAK,sBAAsB,EAClE,SAAS,iBAAiB,gBAAiB,KAAK,sBAAsB,EACtE,KAAK,iCAAmC,IAG1C,GAAI,CACF,KAAK,OAAO,kBAAkB,IAAI,SAAS,CAC7C,MAAgB,CAEhB,EACF,CAMA,wBAAwB,IAAK,CAC3B,GAAI,CAAC,KAAK,YAAc,IAAI,YAAc,KAAK,WAAW,UAAW,OAErE,MAAM,OAAS,IAAI,QAAU,KAAK,WAAW,OACvC,OAAS,IAAI,QAAU,KAAK,WAAW,OACvC,KAAO,KAAK,IAAI,MAAM,EACtB,KAAO,KAAK,IAAI,MAAM,EAG5B,GAFA,KAAK,WAAW,MAAQ,IAAI,QAExB,CAAC,KAAK,WAAW,SAAU,CAC7B,GAAI,KAAO,GAAK,KAAO,EAAG,OAE1B,GAAI,KAAO,KAAM,CACf,KAAK,cAAc,IAAK,EAAK,EAC7B,MACF,CAEA,KAAK,WAAW,SAAW,GAC3B,KAAK,OAAO,UAAU,IAAI,aAAa,CACzC,CAEA,IAAI,eAAe,EACnB,KAAK,OAAO,WAAa,KAAK,WAAW,WAAa,MACxD,CAMA,sBAAsB,IAAK,CACzB,KAAK,cAAc,IAAK,EAAI,CAC9B,CAOA,cAAc,IAAK,WAAY,CAC7B,GAAI,CAAC,KAAK,YAAc,IAAI,YAAc,KAAK,WAAW,UAAW,OAErE,MAAM,KAAO,KAAK,WACZ,YAAc,KAAK,WAAW,SACpC,KAAK,WAAa,KAClB,KAAK,OAAO,UAAU,OAAO,aAAa,EAC1C,KAAK,kCAAkC,EAEvC,GAAI,CACF,KAAK,OAAO,sBAAsB,IAAI,SAAS,CACjD,MAAgB,CAEhB,CASA,GAPI,CAAC,cAEL,KAAK,oBAAsB,GAC3B,OAAO,WAAW,IAAM,CACtB,KAAK,oBAAsB,EAC7B,EAAG,CAAC,EAEA,CAAC,YAAc,CAAC,KAAK,cAAc,QAAU,CAAC,KAAK,kBAAkB,OAEzE,MAAM,aAAe,KAAK,MAAQ,KAAK,OACjC,eAAiB,KAAK,IAAI,GAAI,KAAK,IAAI,GAAI,KAAK,iBAAmB,GAAI,CAAC,EACxE,UAAY,KAAK,IAAI,YAAY,GAAK,eAAkB,aAAe,EAAI,EAAI,GAAM,EACrF,YAAc,KAAK,IACvB,KAAK,IAAI,KAAK,WAAa,UAAW,CAAC,EACvC,KAAK,aAAa,OAAS,CAC7B,EACM,WAAa,KAAK,aAAa,WAAW,EAC5C,YACF,KAAK,OAAO,SAAS,CAAE,KAAM,WAAW,WAAY,SAAU,QAAS,CAAC,CAE5E,CAMA,kBAAkB,IAAK,CAChB,KAAK,sBAEV,IAAI,eAAe,EACnB,IAAI,gBAAgB,EACpB,KAAK,oBAAsB,GAC7B,CAUA,UAAW,CACT,KAAK,UAAU,QAAS,IAAO,CAC7B,MAAM,UAAY,OAAO,GAAG,cAAc,aAAa,EAAE,QAAQ,eAAiB,CAAC,EAC7E,WAAa,GAAG,cAAc,gBAAgB,EAAE,sBAAsB,EAAE,MAC1E,MAAM,aAAa,IAAQ,UAAY,GAAO,YAChD,GAAG,iBAAiB,YAAa,KAAK,iBAAiB,EACvD,GAAG,UAAU,OAAO,qBAAqB,IAEzC,GAAG,oBAAoB,YAAa,KAAK,iBAAiB,EAC1D,GAAG,UAAU,IAAI,qBAAqB,EAE1C,CAAC,CACH,CAMA,oBAAoB,IAAK,CACvB,MAAM,UAAY,IAAI,cAChB,UAAY,UAAU,cAAc,gBAAgB,EAG1D,GAAI,UAAU,QAAQ,IAAK,CACzB,KAAK,eAAe,UAAU,OAAO,sBAAsB,EAE3D,MAAM,IAAM,IAAI,MAChB,IAAI,IAAM,UAAU,QAAQ,IAC5B,IAAI,OAAS,IAAM,CACjB,UAAU,IAAM,IAAI,IACpB,UAAU,UAAU,OAAO,wBAAwB,EACnD,KAAK,eAAe,UAAU,IAAI,sBAAsB,CAC1D,EACA,UAAU,gBAAgB,UAAU,CACtC,CAEA,GAAI,CACF,MAAM,QAAU,IAAI,QAAU,IAAI,QAAU,IAAI,QAAQ,CAAC,EAAE,MACrD,QAAU,IAAI,QAAU,IAAI,QAAU,IAAI,QAAQ,CAAC,EAAE,MACrD,EAAK,QAAU,UAAU,YAAe,IACxC,EAAK,QAAU,UAAU,aAAgB,IAC/C,UAAU,MAAM,eAAiB,GAAG,CAAC,KAAK,CAAC,GAC7C,MAAc,CAEd,CACF,CAKA,cAAe,CACb,MAAM,SAAW,KAAK,IACpB,KAAK,IAAI,KAAK,MAAM,KAAK,OAAO,WAAa,KAAK,gBAAgB,EAAG,CAAC,EACtE,KAAK,aAAa,OAAS,CAC7B,EAEI,KAAK,aAAa,QAAQ,GAAK,WAAa,KAAK,cAC1B,KAAK,aAAa,CAAC,EAAE,WAAa,KAAK,aAAa,CAAC,EAAE,aAGvD,KAAK,kBAC5B,KAAK,qBAAqB,KAAK,aAAa,QAAQ,EAAG,EAAK,CAGlE,CAMA,eAAe,IAAK,CAClB,MAAM,OAAS,IAAI,OAAO,QAAQ,kBAAkB,EACpD,GAAI,CAAC,OAAQ,OAEb,MAAM,IAAM,KAAK,aAAa,OAC9B,GAAI,CAAC,IAAK,OAKV,MAAM,YAHS,SAAW,KAAK,SAI1B,KAAK,aAAe,GAAK,KACzB,KAAK,aAAe,EAAI,KAAO,IAE9B,WAAa,KAAK,aAAa,WAAW,EAChD,KAAK,OAAO,SAAS,CAAE,KAAM,WAAW,WAAY,SAAU,QAAS,CAAC,CAC1E,CAMA,iBAAkB,CAChB,OAAO,OAAO,WAAW,uBAAuB,EAAE,OACpD,CAMA,iBAAiB,IAAK,CACpB,MAAM,MAAQ,IAAI,OAAO,QAAQ,iBAAiB,EAClD,GAAI,CAAC,MAAO,OAEZ,MAAM,WAAa,KAAK,cAAc,mBAAmB,MAAM,QAAQ,OAAO,IAAI,EAClF,KAAK,qBAAqB,UAAU,EAEpC,aAAa,gBAAgB,UAAU,CACzC,CAMA,iBAAiB,IAAK,CACpB,MAAM,MAAQ,IAAI,OAAO,QAAQ,iBAAiB,EAClD,GAAI,CAAC,MAAO,OAEZ,MAAM,WAAa,KAAK,cAAc,mBAAmB,MAAM,QAAQ,OAAO,IAAI,EAClF,KAAK,qBAAqB,UAAU,CACtC,CAMA,kBAAkB,IAAK,CACrB,MAAM,OAAS,IAAI,OAAO,QAAQ,wBAAwB,EAC1D,GAAK,OAKL,IAHA,IAAI,eAAe,EACnB,KAAK,gBAAgB,MAAM,EAEvB,OAAO,QAAQ,gBAAkB,SAAU,CAC7C,MAAM,WAAa,KAAK,OAAO,cAC7B,sCAAsC,OAAO,QAAQ,OAAO,IAC9D,GAAK,KAAK,OAAO,cAAc,8CAA8C,EACzE,YAAY,KAAK,qBAAqB,UAAU,EACpD,MACF,CAEA,GAAI,OAAO,QAAQ,gBAAkB,QAAS,CAC5C,MAAM,WAAa,KAAK,OAAO,cAC7B,sCAAsC,OAAO,QAAQ,OAAO,IAC9D,EACI,aACF,KAAK,qBAAqB,UAAU,EACpC,aAAa,gBAAgB,UAAU,GAEzC,MACF,CAEI,OAAO,QAAQ,gBAAkB,WACnC,SAAS,cAAc,sBAAsB,GACzC,eAAe,CAAE,SAAU,SAAU,MAAO,OAAQ,CAAC,EAE7D,CAMA,gBAAgB,aAAc,CACvB,KAAK,YAEV,KAAK,WAAW,QAAS,QAAW,CAClC,MAAM,SAAW,SAAW,aAC5B,OAAO,UAAU,OAAO,YAAa,QAAQ,EAC7C,OAAO,aAAa,eAAgB,SAAW,OAAS,OAAO,CACjE,CAAC,CACH,CAMA,uBAAuB,UAAW,CAChC,GAAI,CAAC,KAAK,YAAc,CAAC,UAAW,OAEpC,MAAM,aAAe,MAAM,KAAK,KAAK,UAAU,EAAE,KAAM,QACjD,UAAU,QAAQ,YAAc,QAC3B,OAAO,QAAQ,gBAAkB,SAGnC,OAAO,QAAQ,gBAAkB,SACnC,OAAO,QAAQ,UAAY,UAAU,QAAQ,OACnD,EAED,GAAI,aAAc,CAChB,KAAK,gBAAgB,YAAY,EACjC,MACF,CAEA,KAAK,WAAW,QAAS,QAAW,OAAO,UAAU,OAAO,WAAW,CAAC,EACxE,KAAK,WAAW,QAAS,QAAW,OAAO,aAAa,eAAgB,OAAO,CAAC,CAClF,CAOA,cAAe,CAEb,KAAK,iBAAmB,KAAK,aAAa,CAAC,EAAE,WAAa,KAAK,aAAa,CAAC,EAAE,WAC/E,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EAElB,KAAK,QAAU,KAAK,cACtB,KAAK,oBAAoB,KAAK,YAAY,CAE9C,CAMA,gBAAiB,CAAC,CAOlB,qBAAqB,UAAW,aAAe,GAAM,CACnD,GAAI,YAAc,KAAK,YAAa,CAClC,KAAK,uBAAuB,SAAS,EACrC,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,MACF,CACA,OAAO,cAAc,IAAI,EACzB,MAAM,cAAgB,OAAO,SAAS,KAAK,YAAY,EAAI,KAAK,aAAe,KAC/E,KAAK,YAAc,UACnB,KAAK,aAAe,KAAK,aAAa,QAAQ,KAAK,WAAW,EAC9D,MAAM,aAAe,KAAK,oBACrB,KAAK,sBAAsB,cAAe,KAAK,YAAY,EAGhE,GAFA,KAAK,mBAAqB,KAEtB,KAAK,QAAQ,SAAW,WAAa,MAAM,aAAa,GAAI,CAQ9D,GANI,KAAK,mBACH,KAAK,mBAAmB,KAAK,kBAAkB,UAAU,OAAO,WAAW,EAC/E,UAAU,UAAU,IAAI,WAAW,EACnC,KAAK,kBAAoB,WAGvB,KAAK,gBAAkB,QAAS,CAClC,MAAM,EAAI,UAAU,sBAAsB,EAAE,IACxC,SAAS,gBAAgB,UAAY,IAGrC,KAAK,IAAI,EAAI,SAAS,gBAAgB,SAAS,EAAI,KACrD,OAAO,SAAS,CACd,IAAK,EAAI,IAAM,EAAI,EACnB,SAAU,QACZ,CAAC,CAEL,CACA,MACF,CAEI,cAAc,KAAK,OAAO,SAAS,CAAE,KAAM,KAAK,YAAY,UAAW,CAAC,EACxE,KAAK,QAAQ,KAAK,eAAe,EAErC,KAAK,mBAAmB,EAExB,KAAK,mBAAmB,KAAK,YAAa,KAAK,aAAe,CAAC,EAC/D,KAAK,uBAAuB,SAAS,EACrC,KAAK,iBAAiB,YAAY,EAE9B,KAAK,UAAY,UAAU,QAAQ,YAAc,UACnD,KAAK,SAAS,QAAQ,iBAAmB,UAAU,QAAQ,QAE/D,CAKA,gBAAiB,CACf,KAAK,aAAe,KAAK,OAAO,cAC9B,mBAAmB,KAAK,YAAY,QAAQ,OAAO,IACrD,EACA,MAAM,IAAM,KAAK,aAAa,cAAc,QAAQ,EAEpD,KAAK,OAAO,iBAAiB,oBAAoB,EAAE,QAAS,IAAO,CACjE,GAAG,UAAU,OAAO,WAAW,EAC/B,GAAG,gBAAgB,cAAc,CACnC,CAAC,EAED,IAAI,UAAU,IAAI,WAAW,EAC7B,IAAI,aAAa,eAAgB,MAAM,EACvC,KAAK,oBAAoB,KAAK,YAAY,CAC5C,CAKA,iBAAkB,CAChB,KAAK,YAAc,KAAK,iBAAiB,qBAAqB,EAC9D,KAAK,aAAe,MAAM,KAAK,KAAK,WAAW,EAAE,OAAQ,IAAO,GAAG,YAAc,CAAC,EAC9E,KAAK,eACP,KAAK,aAAa,YAAc,KAAK,aAAa,QAEpD,KAAK,iBAAiB,CACxB,CAKA,oBAAqB,CACd,KAAK,WAIN,KAAK,UACP,KAAK,QAAQ,SAAW,KAAK,aAAa,QAAU,GAGlD,KAAK,UACP,KAAK,QAAQ,SAAW,KAAK,aAAa,QAAU,GAGlD,KAAK,iBACP,KAAK,eAAe,YAAc,KAAK,aAAe,GAE1D,CAKA,iBAAiB,UAAY,KAAM,CACjC,GAAI,CAAC,KAAK,YAAc,KAAK,WAAW,SAAW,GAAK,CAAC,KAAK,aAAc,OAE5E,MAAM,MAAQ,KAAK,aAAa,OAC1B,QAAU,OAAO,SAAS,KAAK,YAAY,GAAK,KAAK,cAAgB,EAAI,KAAK,aAAe,EAC7F,YAAc,KAAK,IAAI,EAAG,KAAK,EAC/B,YAAc,MAAQ,EAAI,KAAK,IAAI,KAAK,IAAI,QAAU,EAAG,CAAC,EAAG,MAAQ,CAAC,EAAI,EAEhF,KAAK,WAAW,QAAQ,CAAC,IAAK,QAAU,CACtC,GAAI,OAAS,YAAa,CACxB,IAAI,OAAS,GACb,MACF,CAEA,MAAM,WAAa,YAAc,MAC3B,cAAgB,QAAU,GAAK,YAAc,EAC7C,aAAe,QAAU,GAAK,YAAc,EAAI,MAEtD,IAAI,OAAS,GACb,IAAI,UAAU,OAAO,YAAa,aAAe,OAAO,EACxD,IAAI,UAAU,OAAO,WAAY,MAAQ,IAAM,eAAiB,aAAa,CAC/E,CAAC,EAEG,WACF,KAAK,kBAAkB,SAAS,CAEpC,CAQA,sBAAsB,cAAe,aAAc,CACjD,OAAI,gBAAkB,MAAQ,gBAAkB,aAAqB,KAC9D,aAAe,cAAgB,OAAS,MACjD,CAMA,kBAAkB,UAAW,CAC3B,GAAI,CAAC,KAAK,gBAAgB,EAAG,OAE7B,MAAM,KAAO,KAAK,cAAc,mBAAmB,EAC9C,OAEL,aAAa,KAAK,oBAAoB,EACtC,KAAK,UAAU,OAAO,iBAAkB,gBAAgB,EACxD,KAAK,YACL,KAAK,UAAU,IAAI,aAAa,SAAS,EAAE,EAC3C,KAAK,qBAAuB,WAAW,IAAM,CAC3C,KAAK,UAAU,OAAO,iBAAkB,gBAAgB,CAC1D,EAAG,GAAG,EACR,CAMA,oBAAoB,MAAO,CACzB,MAAM,UAAY,KAAK,OAAO,WACxB,uBAAyB,KAAK,OAAO,YAAc,UACnD,YAAc,MAAM,YAEtB,YAAc,MAAM,YAAc,wBAA0B,YAAc,YAC5E,KAAK,OAAO,SAAS,CAAE,KAAM,YAAa,SAAU,QAAS,CAAC,CAElE,CAOA,mBAAmB,UAAW,MAAO,CACrB,UAAU,cAAc,mBAAmB,IAGzD,KAAK,WAAW,aAAa,cAAe,OAAO,EACnD,KAAK,WAAW,UAAY,MAAM,QAAQ,eAAe,QAAQ,UAAW,KAAK,EAEjF,WAAW,IAAM,CACf,KAAK,WAAW,aAAa,cAAe,MAAM,CACpD,EAAG,GAAI,EACT,CAMA,OAAO,gBAAgB,UAAW,CAChC,OAAO,cAAc,EACrB,MAAM,cAAgB,UAAU,cAAc,gBAAgB,EAC1D,eAAe,cAAc,YAAY,CAC/C,CACF,CAEA,eAAe,OAAO,gBAAiB,YAAY,CACrD",
  "names": ["mediaItem"]
}
