{
  "version": 3,
  "sources": ["/cdn/shop/t/13/assets/theme.js?view=ajax"],
  "sourcesContent": ["/*\n@license\n  Streamline by Archetype Themes (https://archetypethemes.co)\n  Access unminified JS in assets/theme.js\n\n  Use our custom event listeners to tap into common functions.\n  Documentation - https://archetypethemes.co/blogs/streamline/javascript-events-for-developers\n\n  document.addEventListener('page:loaded', function() {\n    // Stylesheet and theme scripts have loaded\n  });\n*/\n\nwindow.theme = window.theme || {};\nwindow.Shopify = window.Shopify || {};\n\n// Breakpoint values are used throughout many templates.\n// We strongly suggest not changing them globally.\ntheme.bp = {};\ntheme.config = {\n  cssLoaded: false,\n  bpSmall: false,\n  hasSessionStorage: true,\n  mediaQuerySmall: 'screen and (max-width: 768px)',\n  youTubeReady: false,\n  vimeoReady: false,\n  vimeoLoading: false,\n  isSafari: !!navigator.userAgent.match(/Version\\/[\\d\\.]+.*Safari/),\n  isTouch: ('ontouchstart' in window) || window.DocumentTouch && window.document instanceof DocumentTouch || window.navigator.maxTouchPoints || window.navigator.msMaxTouchPoints ? true : false,\n  rtl: document.documentElement.getAttribute('dir') == 'rtl' ? true : false\n};\n\nif (console && console.log) {\n  console.log('Streamline theme ('+theme.settings.themeVersion+') by ARCH\u039ETYPE | Learn more at https://archetypethemes.co');\n}\n\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nlazySizesConfig.expFactor = 4;\n\n// Trigger events when going between breakpoints\ntheme.config.bpSmall = matchMedia(theme.config.mediaQuerySmall).matches;\nmatchMedia(theme.config.mediaQuerySmall).addListener(function(mql) {\n  if (mql.matches) {\n    theme.config.bpSmall = true;\n    document.dispatchEvent(new CustomEvent('matchSmall'));\n  } else {\n    theme.config.bpSmall = false;\n    document.dispatchEvent(new CustomEvent('unmatchSmall'));\n  }\n});\n\n(function(){\n  'use strict';\n\n  theme.delegate = {\n    on: function(event, callback, options){\n      if( !this.namespaces ) // save the namespaces on the DOM element itself\n        this.namespaces = {};\n  \n      this.namespaces[event] = callback;\n      options = options || false;\n  \n      this.addEventListener(event.split('.')[0], callback, options);\n      return this;\n    },\n    off: function(event) {\n      if (!this.namespaces) { return }\n      this.removeEventListener(event.split('.')[0], this.namespaces[event]);\n      delete this.namespaces[event];\n      return this;\n    }\n  };\n  \n  // Extend the DOM with these above custom methods\n  window.on = Element.prototype.on = theme.delegate.on;\n  window.off = Element.prototype.off = theme.delegate.off;\n  \n  theme.utils = {\n    defaultTo: function(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value\n    },\n  \n    wrap: function(el, wrapper) {\n      el.parentNode.insertBefore(wrapper, el);\n      wrapper.appendChild(el);\n    },\n  \n    debounce: function(wait, callback, immediate) {\n      var timeout;\n      return function() {\n        var context = this, args = arguments;\n        var later = function() {\n          timeout = null;\n          if (!immediate) callback.apply(context, args);\n        };\n        var callNow = immediate && !timeout;\n        clearTimeout(timeout);\n        timeout = setTimeout(later, wait);\n        if (callNow) callback.apply(context, args);\n      }\n    },\n  \n    throttle: function(limit, callback) {\n      var waiting = false;\n      return function () {\n        if (!waiting) {\n          callback.apply(this, arguments);\n          waiting = true;\n          setTimeout(function () {\n            waiting = false;\n          }, limit);\n        }\n      }\n    },\n  \n    prepareTransition: function(el, callback) {\n      el.addEventListener('transitionend', removeClass);\n  \n      function removeClass(evt) {\n        el.classList.remove('is-transitioning');\n        el.removeEventListener('transitionend', removeClass);\n      }\n  \n      el.classList.add('is-transitioning');\n      el.offsetWidth; // check offsetWidth to force the style rendering\n  \n      if (typeof callback === 'function') {\n        callback();\n      }\n    },\n  \n    // _.compact from lodash\n    // Creates an array with all falsey values removed. The values `false`, `null`,\n    // `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n    // _.compact([0, 1, false, 2, '', 3]);\n    // => [1, 2, 3]\n    compact: function(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n  \n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    },\n  \n    serialize: function(form) {\n      var arr = [];\n      Array.prototype.slice.call(form.elements).forEach(function(field) {\n        if (\n          !field.name ||\n          field.disabled ||\n          ['file', 'reset', 'submit', 'button'].indexOf(field.type) > -1\n        )\n          return;\n        if (field.type === 'select-multiple') {\n          Array.prototype.slice.call(field.options).forEach(function(option) {\n            if (!option.selected) return;\n            arr.push(\n              encodeURIComponent(field.name) +\n                '=' +\n                encodeURIComponent(option.value)\n            );\n          });\n          return;\n        }\n        if (['checkbox', 'radio'].indexOf(field.type) > -1 && !field.checked)\n          return;\n        arr.push(\n          encodeURIComponent(field.name) + '=' + encodeURIComponent(field.value)\n        );\n      });\n      return arr.join('&');\n    }\n  };\n  \n  theme.a11y = {\n    trapFocus: function(options) {\n      var eventsName = {\n        focusin: options.namespace ? 'focusin.' + options.namespace : 'focusin',\n        focusout: options.namespace\n          ? 'focusout.' + options.namespace\n          : 'focusout',\n        keydown: options.namespace\n          ? 'keydown.' + options.namespace\n          : 'keydown.handleFocus'\n      };\n  \n      // Get every possible visible focusable element\n      var focusableEls = options.container.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex^=\"-\"])');\n      var elArray = [].slice.call(focusableEls);\n      var focusableElements = elArray.filter(el => el.offsetParent !== null);\n  \n      var firstFocusable = focusableElements[0];\n      var lastFocusable = focusableElements[focusableElements.length - 1];\n  \n      if (!options.elementToFocus) {\n        options.elementToFocus = options.container;\n      }\n  \n      options.container.setAttribute('tabindex', '-1');\n      options.elementToFocus.focus();\n  \n      document.documentElement.off('focusin');\n      document.documentElement.on(eventsName.focusout, function() {\n        document.documentElement.off(eventsName.keydown);\n      });\n  \n      document.documentElement.on(eventsName.focusin, function(evt) {\n        if (evt.target !== lastFocusable && evt.target !== firstFocusable) return;\n  \n        document.documentElement.on(eventsName.keydown, function(evt) {\n          _manageFocus(evt);\n        });\n      });\n  \n      function _manageFocus(evt) {\n        if (evt.keyCode !== 9) return;\n        /**\n         * On the first focusable element and tab backward,\n         * focus the last element\n         */\n        if (evt.target === firstFocusable && evt.shiftKey) {\n          evt.preventDefault();\n          lastFocusable.focus();\n        }\n      }\n    },\n    removeTrapFocus: function(options) {\n      var eventName = options.namespace\n        ? 'focusin.' + options.namespace\n        : 'focusin';\n  \n      if (options.container) {\n        options.container.removeAttribute('tabindex');\n      }\n  \n      document.documentElement.off(eventName);\n    },\n  \n    lockMobileScrolling: function(namespace, element) {\n      var el = element ? element : document.documentElement;\n      document.documentElement.classList.add('lock-scroll');\n      el.on('touchmove' + namespace, function() {\n        return true;\n      });\n    },\n  \n    unlockMobileScrolling: function(namespace, element) {\n      document.documentElement.classList.remove('lock-scroll');\n      var el = element ? element : document.documentElement;\n      el.off('touchmove' + namespace);\n    }\n  };\n  \n  // Add class when tab key starts being used to show outlines\n  document.documentElement.on('keyup.tab', function(evt) {\n    if (evt.keyCode === 9) {\n      document.documentElement.classList.add('tab-outline');\n      document.documentElement.off('keyup.tab');\n    }\n  });\n  \n  theme.Sections = function Sections() {\n    this.constructors = {};\n    this.instances = [];\n  \n    document.addEventListener('shopify:section:load', this._onSectionLoad.bind(this));\n    document.addEventListener('shopify:section:unload', this._onSectionUnload.bind(this));\n    document.addEventListener('shopify:section:select', this._onSelect.bind(this));\n    document.addEventListener('shopify:section:deselect', this._onDeselect.bind(this));\n    document.addEventListener('shopify:block:select', this._onBlockSelect.bind(this));\n    document.addEventListener('shopify:block:deselect', this._onBlockDeselect.bind(this));\n  };\n  \n  theme.Sections.prototype = Object.assign({}, theme.Sections.prototype, {\n    _createInstance: function(container, constructor, scope) {\n      var id = container.getAttribute('data-section-id');\n      var type = container.getAttribute('data-section-type');\n  \n      constructor = constructor || this.constructors[type];\n  \n      if (typeof constructor === 'undefined') {\n        return;\n      }\n  \n      // If custom scope passed, check to see if instance\n      // is already initialized so we don't double up\n      if (scope) {\n        var instanceExists = this._findInstance(id);\n        if (instanceExists) {\n          this._removeInstance(id);\n        }\n      }\n  \n      // If a section fails to init, handle the error without letting all subsequest section registers to fail\n      try {\n        var instance = Object.assign(new constructor(container), {\n          id: id,\n          type: type,\n          container: container\n        });\n        this.instances.push(instance);\n      } catch (e) {\n        console.error(e);\n      }\n    },\n  \n    _findInstance: function(id) {\n      for (var i = 0; i < this.instances.length; i++) {\n        if (this.instances[i].id === id) {\n          return this.instances[i];\n        }\n      }\n    },\n  \n    _removeInstance: function(id) {\n      var i = this.instances.length;\n      var instance;\n  \n      while(i--) {\n        if (this.instances[i].id === id) {\n          instance = this.instances[i];\n          this.instances.splice(i, 1);\n          break;\n        }\n      }\n  \n      return instance;\n    },\n  \n    _onSectionLoad: function(evt, subSection, subSectionId) {\n      if (window.AOS) { AOS.refreshHard() }\n      if (theme && theme.initGlobals) {\n        theme.initGlobals();\n      }\n  \n      var container = subSection ? subSection : evt.target;\n      var section = subSection ? subSection : evt.target.querySelector('[data-section-id]');\n  \n      if (!section) {\n        return;\n      }\n  \n      this._createInstance(section);\n  \n      var instance = subSection ? subSectionId : this._findInstance(evt.detail.sectionId);\n  \n      // Check if we have subsections to load\n      var haveSubSections = container.querySelectorAll('[data-subsection]');\n      if (haveSubSections.length) {\n        this.loadSubSections(container);\n      }\n  \n      // Run JS only in case of the section being selected in the editor\n      // before merchant clicks \"Add\"\n      if (instance && typeof instance.onLoad === 'function') {\n        instance.onLoad(evt);\n      }\n  \n      // Force editor to trigger scroll event when loading a section\n      setTimeout(function() {\n        window.dispatchEvent(new Event('scroll'));\n      }, 200);\n    },\n  \n    _onSectionUnload: function(evt) {\n      this.instances = this.instances.filter(function(instance) {\n        var isEventInstance = instance.id === evt.detail.sectionId;\n  \n        if (isEventInstance) {\n          if (typeof instance.onUnload === 'function') {\n            instance.onUnload(evt);\n          }\n        }\n  \n        return !isEventInstance;\n      });\n    },\n  \n    loadSubSections: function(scope) {\n      if (!scope) {\n        return;\n      }\n  \n      var sections = scope.querySelectorAll('[data-section-id]');\n  \n      sections.forEach(el => {\n        this._onSectionLoad(null, el, el.dataset.sectionId);\n      });\n    },\n  \n    _onSelect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (\n        typeof instance !== 'undefined' &&\n        typeof instance.onSelect === 'function'\n      ) {\n        instance.onSelect(evt);\n      }\n    },\n  \n    _onDeselect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (\n        typeof instance !== 'undefined' &&\n        typeof instance.onDeselect === 'function'\n      ) {\n        instance.onDeselect(evt);\n      }\n    },\n  \n    _onBlockSelect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (\n        typeof instance !== 'undefined' &&\n        typeof instance.onBlockSelect === 'function'\n      ) {\n        instance.onBlockSelect(evt);\n      }\n    },\n  \n    _onBlockDeselect: function(evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n  \n      if (\n        typeof instance !== 'undefined' &&\n        typeof instance.onBlockDeselect === 'function'\n      ) {\n        instance.onBlockDeselect(evt);\n      }\n    },\n  \n    register: function(type, constructor, scope) {\n      this.constructors[type] = constructor;\n  \n      var sections = document.querySelectorAll('[data-section-type=\"' + type + '\"]');\n  \n      if (scope) {\n        sections = scope.querySelectorAll('[data-section-type=\"' + type + '\"]');\n      }\n  \n      sections.forEach(\n        function(container) {\n          this._createInstance(container, constructor, scope);\n        }.bind(this)\n      );\n    },\n  \n    reinit: function(section) {\n      for (var i = 0; i < this.instances.length; i++) {\n        var instance = this.instances[i];\n        if (instance['type'] === section) {\n          if (typeof instance.forceReload === 'function') {\n            instance.forceReload();\n          }\n        }\n      }\n    }\n  });\n  \n  /**\n   * Currency Helpers\n   * -----------------------------------------------------------------------------\n   * A collection of useful functions that help with currency formatting\n   *\n   * Current contents\n   * - formatMoney - Takes an amount in cents and returns it as a formatted dollar value.\n   *   - When theme.settings.superScriptPrice is enabled, format cents in <sup> tag\n   * - getBaseUnit - Splits unit price apart to get value + unit\n   *\n   */\n  \n  theme.Currency = (function() {\n    var moneyFormat = '${{amount}}';\n    var superScript = theme && theme.settings && theme.settings.superScriptPrice;\n  \n    function formatMoney(cents, format) {\n      if (!format) {\n        format = theme.settings.moneyFormat;\n      }\n  \n      if (typeof cents === 'string') {\n        cents = cents.replace('.', '');\n      }\n      var value = '';\n      var placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/;\n      var formatString = (format || moneyFormat);\n  \n      function formatWithDelimiters(number, precision, thousands, decimal) {\n        precision = theme.utils.defaultTo(precision, 2);\n        thousands = theme.utils.defaultTo(thousands, ',');\n        decimal = theme.utils.defaultTo(decimal, '.');\n  \n        if (isNaN(number) || number == null) {\n          return 0;\n        }\n  \n        number = (number / 100.0).toFixed(precision);\n  \n        var parts = number.split('.');\n        var dollarsAmount = parts[0].replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1' + thousands);\n        var centsAmount = parts[1] ? (decimal + parts[1]) : '';\n  \n        return dollarsAmount + centsAmount;\n      }\n  \n      switch (formatString.match(placeholderRegex)[1]) {\n        case 'amount':\n          value = formatWithDelimiters(cents, 2);\n  \n          if (superScript && value && value.includes('.')) {\n            value = value.replace('.', '<sup>') + '</sup>';\n          }\n  \n          break;\n        case 'amount_no_decimals':\n          value = formatWithDelimiters(cents, 0);\n          break;\n        case 'amount_with_comma_separator':\n          value = formatWithDelimiters(cents, 2, '.', ',');\n  \n          if (superScript && value && value.includes('.')) {\n            value = value.replace(',', '<sup>') + '</sup>';\n          }\n  \n          break;\n        case 'amount_no_decimals_with_comma_separator':\n          value = formatWithDelimiters(cents, 0, '.', ',');\n          break;\n        case 'amount_no_decimals_with_space_separator':\n          value = formatWithDelimiters(cents, 0, ' ');\n          break;\n      }\n  \n      return formatString.replace(placeholderRegex, value);\n    }\n  \n    function getBaseUnit(variant) {\n      if (!variant) {\n        return;\n      }\n  \n      if (!variant.unit_price_measurement || !variant.unit_price_measurement.reference_value) {\n        return;\n      }\n  \n      return variant.unit_price_measurement.reference_value === 1\n        ? variant.unit_price_measurement.reference_unit\n        : variant.unit_price_measurement.reference_value +\n            variant.unit_price_measurement.reference_unit;\n    }\n  \n    return {\n      formatMoney: formatMoney,\n      getBaseUnit: getBaseUnit\n    }\n  })();\n  \n  theme.Images = (function() {\n  \n    /**\n     * Find the Shopify image attribute size\n     */\n    function imageSize(src) {\n      if (!src) {\n        return '620x'; // default based on theme\n      }\n  \n      var match = src.match(/.+_((?:pico|icon|thumb|small|compact|medium|large|grande)|\\d{1,4}x\\d{0,4}|x\\d{1,4})[_\\.@]/);\n  \n      if (match !== null) {\n        return match[1];\n      } else {\n        return null;\n      }\n    }\n  \n    /**\n     * Adds a Shopify size attribute to a URL\n     */\n    function getSizedImageUrl(src, size) {\n      if (!src) {\n        return src;\n      }\n  \n      if (size == null) {\n        return src;\n      }\n  \n      if (size === 'master') {\n        return this.removeProtocol(src);\n      }\n  \n      var match = src.match(/\\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif)(\\?v=\\d+)?$/i);\n  \n      if (match != null) {\n        var prefix = src.split(match[0]);\n        var suffix = match[0];\n  \n        return this.removeProtocol(prefix[0] + '_' + size + suffix);\n      }\n  \n      return null;\n    }\n  \n    function removeProtocol(path) {\n      return path.replace(/http(s)?:/, '');\n    }\n  \n    function lazyloadImagePath(string) {\n      var image;\n  \n      if (string !== null) {\n        image = string.replace(/(\\.[^.]*)$/, \"_{width}x$1\");\n      }\n  \n      return image;\n    }\n  \n    return {\n      imageSize: imageSize,\n      getSizedImageUrl: getSizedImageUrl,\n      removeProtocol: removeProtocol,\n      lazyloadImagePath: lazyloadImagePath\n    };\n  })();\n  \n  theme.loadImageSection = function(container) {\n    // Wait until images inside container have lazyloaded class\n    function setAsLoaded() {\n      container.classList.remove('loading', 'loading--delayed');\n      container.classList.add('loaded');\n    }\n  \n    function checkForLazyloadedImage() {\n      return container.querySelector('.lazyloaded');\n    }\n  \n    // If it has SVGs it's in the onboarding state so set as loaded\n    if (container.querySelector('svg')) {\n      setAsLoaded();\n      return;\n    };\n  \n    if (checkForLazyloadedImage()) {\n      setAsLoaded();\n      return;\n    }\n  \n    var interval = setInterval(function() {\n      if (checkForLazyloadedImage()) {\n        clearInterval(interval);\n        setAsLoaded();\n      }\n    }, 25);\n  };\n  \n  // Init section function when it's visible, then disable observer\n  theme.initWhenVisible = function(options) {\n    var threshold = options.threshold ? options.threshold : 0;\n  \n    var observer = new IntersectionObserver((entries, observer) => {\n      entries.forEach(entry => {\n        if (entry.isIntersecting) {\n          if (typeof options.callback === 'function') {\n            options.callback();\n            observer.unobserve(entry.target);\n          }\n        }\n      });\n    }, {rootMargin: '0px 0px '+ threshold +'px 0px'});\n  \n    observer.observe(options.element);\n  };\n  \n  /*\n    Options:\n      container\n      enableHistoryState - enable when on single product page to update URL\n      singleOptionSelector - selector for individual variant option (e.g. 'Blue' or 'Small')\n      originalSelectorId - selector for base variant selector (visually hidden)\n      variants - JSON parsed object of product variant info\n   */\n  theme.Variants = (function() {\n  \n    function Variants(options) {\n      this.container = options.container;\n      this.variants = options.variants;\n      this.singleOptionSelector = options.singleOptionSelector;\n      this.originalSelectorId = options.originalSelectorId;\n      this.enableHistoryState = options.enableHistoryState;\n      this.currentlySelectedValues = this._getCurrentOptions();\n      this.currentVariant = this._getVariantFromOptions(this.currentlySelectedValues);\n  \n      this.container.querySelectorAll(this.singleOptionSelector).forEach(el => {\n        el.addEventListener('change', this._onSelectChange.bind(this));\n      });\n    }\n  \n    Variants.prototype = Object.assign({}, Variants.prototype, {\n  \n      _getCurrentOptions: function() {\n        var result = [];\n  \n        this.container.querySelectorAll(this.singleOptionSelector).forEach(el => {\n          var type = el.getAttribute('type');\n  \n          if (type === 'radio' || type === 'checkbox') {\n            if (el.checked) {\n              result.push({\n                value: el.value,\n                index: el.dataset.index\n              });\n            }\n          } else {\n            result.push({\n              value: el.value,\n              index: el.dataset.index\n            });\n          }\n        });\n  \n        // remove any unchecked input values if using radio buttons or checkboxes\n        result = theme.utils.compact(result);\n  \n        return result;\n      },\n  \n      _getVariantFromOptions: function(lastSelectedOption) {\n        const currentlySelectedOptions = this._getCurrentOptions();\n        const variants = this.variants;\n        // 1. Find the variant that matches all current selected options + is available\n        const availableAndMatchAllSelected = variants.find(variant => {\n          return currentlySelectedOptions.every(({value, index}) => {\n            return variant[index] === value;\n          }) && variant.available;\n        });\n  \n        // 2. Find a variant that is available and matches last selected option\n        const availableAndMatchesLastSelected = lastSelectedOption && variants.find(variant => {\n          return variant[lastSelectedOption.index] === lastSelectedOption.value && variant.available\n        });\n  \n        // 3. Find a variant that matches the current selection but is not available (aka Sold Out)\n        const matchesAllSelected = variants.find(variant => {\n          return currentlySelectedOptions.every(({value, index}) => {\n            return variant[index] === value;\n          });\n        });\n  \n        // 4. Find a variant that matches the last selected option but is not available (aka Sold Out)\n        const anyMatchesLastSelected = lastSelectedOption && variants.find((variant) => {\n          return variant[lastSelectedOption.index] === lastSelectedOption.value\n        });\n  \n        return availableAndMatchAllSelected || availableAndMatchesLastSelected || matchesAllSelected || anyMatchesLastSelected || null;\n      },\n  \n      _updateInputState: function (variant) {\n        return (input) => {\n          const index = input.dataset.index;\n          const value = input.value;\n          const type = input.getAttribute('type');\n  \n          if (type === 'radio' || type === 'checkbox') {\n            if (variant === null) {\n              if (el !== input) {\n                input.checked = false;\n              }\n            } else {\n              input.checked = variant[index] === value\n            }\n          }\n        }\n      },\n  \n      _onSelectChange: function({srcElement}) {\n        const optionSelectElements = this.container.querySelectorAll(this.singleOptionSelector);\n  \n        // Get the best variant based on the current selection + last selected element\n        const variant = this._getVariantFromOptions({\n          index: srcElement.dataset.index,\n          value: srcElement.value\n        });\n  \n        // Update DOM option input states based on the variant that was found\n        optionSelectElements.forEach(this._updateInputState(variant))\n  \n        // Make sure our currently selected values are up to date after updating state of DOM\n        const currentlySelectedValues = this.currentlySelectedValues = this._getCurrentOptions();\n  \n        const detail = {\n          variant,\n          currentlySelectedValues,\n          value: srcElement.value,\n          index: srcElement.parentElement.dataset.index\n        }\n  \n        this.container.dispatchEvent(new CustomEvent('variantChange', {detail}));\n        document.dispatchEvent(new CustomEvent('variant:change', {detail}));\n  \n        if (!variant) {\n          return;\n        }\n  \n        this._updateMasterSelect(variant);\n        this._updateImages(variant);\n        this._updatePrice(variant);\n        this._updateUnitPrice(variant);\n        this._updateSKU(variant);\n        this.currentVariant = variant;\n  \n        if (this.enableHistoryState) {\n          this._updateHistoryState(variant);\n        }\n      },\n  \n      _updateImages: function(variant) {\n        var variantImage = variant.featured_image || {};\n        var currentVariantImage = this.currentVariant && this.currentVariant.featured_image || {};\n  \n        if (!variant.featured_image || variantImage.src === currentVariantImage.src) {\n          return;\n        }\n  \n        this.container.dispatchEvent(new CustomEvent('variantImageChange', {\n          detail: {\n            variant: variant\n          }\n        }));\n      },\n  \n      _updatePrice: function(variant) {\n        if (this.currentVariant && variant.price === this.currentVariant.price && variant.compare_at_price === this.currentVariant.compare_at_price) {\n          return;\n        }\n  \n        this.container.dispatchEvent(new CustomEvent('variantPriceChange', {\n          detail: {\n            variant: variant\n          }\n        }));\n      },\n  \n      _updateUnitPrice: function(variant) {\n        if (this.currentVariant && variant.unit_price === this.currentVariant.unit_price) {\n          return;\n        }\n  \n        this.container.dispatchEvent(new CustomEvent('variantUnitPriceChange', {\n          detail: {\n            variant: variant\n          }\n        }));\n      },\n  \n      _updateSKU: function(variant) {\n        if (this.currentVariant && variant.sku === this.currentVariant.sku) {\n          return;\n        }\n  \n        this.container.dispatchEvent(new CustomEvent('variantSKUChange', {\n          detail: {\n            variant: variant\n          }\n        }));\n      },\n  \n      _updateHistoryState: function(variant) {\n        if (!history.replaceState || !variant) {\n          return;\n        }\n  \n        var newurl = window.location.protocol + '//' + window.location.host + window.location.pathname + '?variant=' + variant.id;\n        window.history.replaceState({path: newurl}, '', newurl);\n      },\n  \n      _updateMasterSelect: function(variant) {\n        this.container.querySelector(this.originalSelectorId).value = variant.id;\n        // Force a change event so Shop Pay installments works after a variant is changed\n        this.container.querySelector(this.originalSelectorId).dispatchEvent(new Event('change', { bubbles: true }));\n      }\n    });\n  \n    return Variants;\n  })();\n  \n  theme.rteInit = function() {\n    // Wrap tables so they become scrollable on small screens\n    document.querySelectorAll('.rte table').forEach(table => {\n      var wrapWith = document.createElement('div');\n      wrapWith.classList.add('table-wrapper');\n      theme.utils.wrap(table, wrapWith);\n    });\n  \n    // Wrap video iframe embeds so they are responsive\n    document.querySelectorAll('.rte iframe[src*=\"youtube.com/embed\"]').forEach(iframe => {\n      wrapVideo(iframe);\n    });\n    document.querySelectorAll('.rte iframe[src*=\"player.vimeo\"]').forEach(iframe => {\n      wrapVideo(iframe);\n    });\n  \n    function wrapVideo(iframe) {\n      // Reset the src attribute on each iframe after page load\n      // for Chrome's \"incorrect iFrame content on 'back'\" bug.\n      // https://code.google.com/p/chromium/issues/detail?id=395791\n      iframe.src = iframe.src;\n      var wrapWith = document.createElement('div');\n      wrapWith.classList.add('video-wrapper');\n      theme.utils.wrap(iframe, wrapWith);\n    }\n  \n    // Remove CSS that adds animated underline under image links\n    document.querySelectorAll('.rte a img').forEach(img => {\n      img.parentNode.classList.add('rte__image');\n    });\n  }\n  \n  theme.LibraryLoader = (function() {\n    var types = {\n      link: 'link',\n      script: 'script'\n    };\n  \n    var status = {\n      requested: 'requested',\n      loaded: 'loaded'\n    };\n  \n    var cloudCdn = 'https://cdn.shopify.com/shopifycloud/';\n  \n    var libraries = {\n      youtubeSdk: {\n        tagId: 'youtube-sdk',\n        src: 'https://www.youtube.com/iframe_api',\n        type: types.script\n      },\n      vimeo: {\n        tagId: 'vimeo-api',\n        src: 'https://player.vimeo.com/api/player.js',\n        type: types.script\n      },\n      shopifyXr: {\n        tagId: 'shopify-model-viewer-xr',\n        src: cloudCdn + 'shopify-xr-js/assets/v1.0/shopify-xr.en.js',\n        type: types.script\n      },\n      modelViewerUi: {\n        tagId: 'shopify-model-viewer-ui',\n        src: cloudCdn + 'model-viewer-ui/assets/v1.0/model-viewer-ui.en.js',\n        type: types.script\n      },\n      modelViewerUiStyles: {\n        tagId: 'shopify-model-viewer-ui-styles',\n        src: cloudCdn + 'model-viewer-ui/assets/v1.0/model-viewer-ui.css',\n        type: types.link\n      }\n    };\n  \n    function load(libraryName, callback) {\n      var library = libraries[libraryName];\n  \n      if (!library) return;\n      if (library.status === status.requested) return;\n  \n      callback = callback || function() {};\n      if (library.status === status.loaded) {\n        callback();\n        return;\n      }\n  \n      library.status = status.requested;\n  \n      var tag;\n  \n      switch (library.type) {\n        case types.script:\n          tag = createScriptTag(library, callback);\n          break;\n        case types.link:\n          tag = createLinkTag(library, callback);\n          break;\n      }\n  \n      tag.id = library.tagId;\n      library.element = tag;\n  \n      var firstScriptTag = document.getElementsByTagName(library.type)[0];\n      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n    }\n  \n    function createScriptTag(library, callback) {\n      var tag = document.createElement('script');\n      tag.src = library.src;\n      tag.addEventListener('load', function() {\n        library.status = status.loaded;\n        callback();\n      });\n      return tag;\n    }\n  \n    function createLinkTag(library, callback) {\n      var tag = document.createElement('link');\n      tag.href = library.src;\n      tag.rel = 'stylesheet';\n      tag.type = 'text/css';\n      tag.addEventListener('load', function() {\n        library.status = status.loaded;\n        callback();\n      });\n      return tag;\n    }\n  \n    return {\n      load: load\n    };\n  })();\n  \n  window.vimeoApiReady = function() {\n    theme.config.vimeoLoading = true;\n  \n    // Because there's no way to check for the Vimeo API being loaded\n    // asynchronously, we use this terrible timeout to wait for it being ready\n    checkIfVimeoIsReady()\n      .then(function() {\n        theme.config.vimeoReady = true;\n        theme.config.vimeoLoading = false;\n        document.dispatchEvent(new CustomEvent('vimeoReady'));\n      });\n  }\n  \n  function checkIfVimeoIsReady() {\n    var wait;\n    var timeout;\n  \n    var deferred = new Promise((resolve, reject) => {\n      wait = setInterval(function() {\n        if (!Vimeo) {\n          return;\n        }\n  \n        clearInterval(wait);\n        clearTimeout(timeout);\n        resolve();\n      }, 500);\n  \n      timeout = setTimeout(function() {\n        clearInterval(wait);\n        reject();\n      }, 4000); // subjective. test up to 8 times over 4 seconds\n    });\n  \n    return deferred;\n  }\n  \n  theme.VimeoPlayer = (function() {\n    var classes = {\n      loading: 'loading',\n      loaded: 'loaded',\n      interactable: 'video-interactable'\n    }\n  \n    var defaults = {\n      background: true,\n      byline: false,\n      controls: false,\n      loop: true,\n      muted: true,\n      playsinline: true,\n      portrait: false,\n      title: false\n    };\n  \n    function VimeoPlayer(divId, videoId, options) {\n      this.divId = divId;\n      this.el = document.getElementById(divId);\n      this.videoId = videoId;\n      this.iframe = null;\n      this.options = options;\n  \n      if (this.options && this.options.videoParent) {\n        this.parent = this.el.closest(this.options.videoParent);\n      }\n  \n      this.setAsLoading();\n  \n      if (theme.config.vimeoReady) {\n        this.init();\n      } else {\n        theme.LibraryLoader.load('vimeo', window.vimeoApiReady);\n        document.addEventListener('vimeoReady', this.init.bind(this));\n      }\n    }\n  \n    VimeoPlayer.prototype = Object.assign({}, VimeoPlayer.prototype, {\n      init: function() {\n        var args = defaults;\n        args.id = this.videoId;\n  \n        this.videoPlayer = new Vimeo.Player(this.el, args);\n  \n        this.videoPlayer.ready().then(this.playerReady.bind(this));\n      },\n  \n      playerReady: function() {\n        this.iframe = this.el.querySelector('iframe');\n        this.iframe.setAttribute('tabindex', '-1');\n  \n        this.videoPlayer.setMuted(true);\n  \n        this.setAsLoaded();\n  \n        // pause when out of view\n        var observer = new IntersectionObserver((entries, observer) => {\n          entries.forEach(entry => {\n            if (entry.isIntersecting) {\n              this.play();\n            } else {\n              this.pause();\n            }\n          });\n        }, {rootMargin: '0px 0px 50px 0px'});\n  \n        observer.observe(this.iframe);\n      },\n  \n      setAsLoading: function() {\n        if (!this.parent) return;\n        this.parent.classList.add(classes.loading);\n      },\n  \n      setAsLoaded: function() {\n        if (!this.parent) return;\n        this.parent.classList.remove(classes.loading);\n        this.parent.classList.add(classes.loaded);\n        if (Shopify && Shopify.designMode) {\n          if (window.AOS) {AOS.refreshHard()}\n        }\n      },\n  \n      enableInteraction: function() {\n        if (!this.parent) return;\n        this.parent.classList.add(classes.interactable);\n      },\n  \n      play: function() {\n        if (this.videoPlayer && typeof this.videoPlayer.play === 'function') {\n          this.videoPlayer.play();\n        }\n      },\n  \n      pause: function() {\n        if (this.videoPlayer && typeof this.videoPlayer.pause === 'function') {\n          this.videoPlayer.pause();\n        }\n      },\n  \n      destroy: function() {\n        if (this.videoPlayer && typeof this.videoPlayer.destroy === 'function') {\n          this.videoPlayer.destroy();\n        }\n      }\n    });\n  \n    return VimeoPlayer;\n  })();\n  \n  window.onYouTubeIframeAPIReady = function() {\n    theme.config.youTubeReady = true;\n    document.dispatchEvent(new CustomEvent('youTubeReady'));\n  }\n  \n  /*============================================================================\n    YouTube SDK method\n    Parameters:\n      - player div id (required)\n      - arguments\n        - videoId (required)\n        - videoParent (selector, optional for section loading state)\n        - events (object, optional)\n  ==============================================================================*/\n  theme.YouTube = (function() {\n    var classes = {\n      loading: 'loading',\n      loaded: 'loaded',\n      interactable: 'video-interactable'\n    }\n  \n    var defaults = {\n      width: 1280,\n      height: 720,\n      playerVars: {\n        autohide: 0,\n        autoplay: 1,\n        cc_load_policy: 0,\n        controls: 0,\n        fs: 0,\n        iv_load_policy: 3,\n        modestbranding: 1,\n        playsinline: 1,\n        rel: 0\n      }\n    };\n  \n    function YouTube(divId, options) {\n      this.divId = divId;\n      this.iframe = null;\n  \n      this.attemptedToPlay = false;\n  \n      // API callback events\n      defaults.events = {\n        onReady: this.onVideoPlayerReady.bind(this),\n        onStateChange: this.onVideoStateChange.bind(this)\n      };\n  \n      this.options = Object.assign({}, defaults, options);\n  \n      if (this.options) {\n        if (this.options.videoParent) {\n          this.parent = document.getElementById(this.divId).closest(this.options.videoParent);\n        }\n  \n        // Most YT videos will autoplay. If in product media,\n        // will handle in theme.Product instead\n        if (!this.options.autoplay) {\n          this.options.playerVars.autoplay = this.options.autoplay;\n        }\n  \n        if (this.options.style === 'sound') {\n          this.options.playerVars.controls = 1;\n          this.options.playerVars.autoplay = 0;\n        }\n  \n      }\n  \n      this.setAsLoading();\n  \n      if (theme.config.youTubeReady) {\n        this.init();\n      } else {\n        theme.LibraryLoader.load('youtubeSdk');\n        document.addEventListener('youTubeReady', this.init.bind(this));\n      }\n    }\n  \n    YouTube.prototype = Object.assign({}, YouTube.prototype, {\n      init: function() {\n        this.videoPlayer = new YT.Player(this.divId, this.options);\n      },\n  \n      onVideoPlayerReady: function(evt) {\n        this.iframe = document.getElementById(this.divId); // iframe once YT loads\n        this.iframe.setAttribute('tabindex', '-1');\n  \n        if (this.options.style !== 'sound') {\n          evt.target.mute();\n        }\n  \n        // pause when out of view\n        var observer = new IntersectionObserver((entries, observer) => {\n          entries.forEach(entry => {\n            if (entry.isIntersecting) {\n              this.play();\n            } else {\n              this.pause();\n            }\n          });\n        }, {rootMargin: '0px 0px 50px 0px'});\n  \n        observer.observe(this.iframe);\n      },\n  \n      onVideoStateChange: function(evt) {\n        switch (evt.data) {\n          case -1: // unstarted\n            // Handle low power state on iOS by checking if\n            // video is reset to unplayed after attempting to buffer\n            if (this.attemptedToPlay) {\n              this.setAsLoaded();\n              this.enableInteraction();\n            }\n            break;\n          case 0: // ended, loop it\n            this.play(evt);\n            break;\n          case 1: // playing\n            this.setAsLoaded();\n            break;\n          case 3: // buffering\n            this.attemptedToPlay = true;\n            break;\n        }\n      },\n  \n      setAsLoading: function() {\n        if (!this.parent) return;\n        this.parent.classList.add(classes.loading);\n      },\n  \n      setAsLoaded: function() {\n        if (!this.parent) return;\n        this.parent.classList.remove(classes.loading);\n        this.parent.classList.add(classes.loaded);\n        if (Shopify && Shopify.designMode) {\n          if (window.AOS) {AOS.refreshHard()}\n        }\n      },\n  \n      enableInteraction: function() {\n        if (!this.parent) return;\n        this.parent.classList.add(classes.interactable);\n      },\n  \n      play: function() {\n        if (this.videoPlayer && typeof this.videoPlayer.playVideo === 'function') {\n          this.videoPlayer.playVideo();\n        }\n      },\n  \n      pause: function() {\n        if (this.videoPlayer && typeof this.videoPlayer.pauseVideo === 'function') {\n          this.videoPlayer.pauseVideo();\n        }\n      },\n  \n      destroy: function() {\n        if (this.videoPlayer && typeof this.videoPlayer.destroy === 'function') {\n          this.videoPlayer.destroy();\n        }\n      }\n    });\n  \n    return YouTube;\n  })();\n  \n  // Prevent vertical scroll while using flickity sliders\n  (function() {\n    var e = !1;\n    var t;\n  \n    document.body.addEventListener('touchstart', function(i) {\n      if (!i.target.closest('.flickity-slider')) {\n        return e = !1;\n        void 0;\n      }\n      e = !0;\n      t = {\n        x: i.touches[0].pageX,\n        y: i.touches[0].pageY\n      }\n    })\n  \n    document.body.addEventListener('touchmove', function(i) {\n      if (e && i.cancelable) {\n        var n = {\n          x: i.touches[0].pageX - t.x,\n          y: i.touches[0].pageY - t.y\n        };\n        Math.abs(n.x) > Flickity.defaults.dragThreshold && i.preventDefault()\n      }\n    }, { passive: !1 })\n  })();\n  \n\n  /**\n   * Ajax Renderer\n   * -----------------------------------------------------------------------------\n   * Render sections without reloading the page.\n   * @param {Object[]} sections - The section to update on render.\n   * @param {string} sections[].sectionId - The ID of the section from Shopify.\n   * @param {string} sections[].nodeId - The ID of the DOM node to replace.\n   * @param {Function} sections[].onReplace (optional) - The custom render function.\n   * @param {boolean} debug - Output logs to console for debugging.\n   *\n   */\n  \n  theme.AjaxRenderer = (function () {\n    function AjaxRenderer({ sections, onReplace, debug } = {}) {\n      this.sections = sections || [];\n      this.cachedSections = [];\n      this.onReplace = onReplace;\n      this.debug = Boolean(debug);\n    }\n  \n    AjaxRenderer.prototype = Object.assign({}, AjaxRenderer.prototype, {\n      renderPage: function (basePath, newParams, updateURLHash = true) {\n        const currentParams = new URLSearchParams(window.location.search);\n        const updatedParams = this.getUpdatedParams(currentParams, newParams)\n  \n        const sectionRenders = this.sections.map(section => {\n  \n          const url = `${basePath}?section_id=${section.sectionId}&${updatedParams.toString()}`;\n          const cachedSectionUrl = cachedSection => cachedSection.url === url;\n  \n          return this.cachedSections.some(cachedSectionUrl)\n            ? this.renderSectionFromCache(cachedSectionUrl, section)\n            : this.renderSectionFromFetch(url, section);\n        });\n  \n        if (updateURLHash) this.updateURLHash(updatedParams);\n  \n        return Promise.all(sectionRenders);\n      },\n  \n      renderSectionFromCache: function (url, section) {\n        const cachedSection = this.cachedSections.find(url);\n  \n        this.log(`[AjaxRenderer] rendering from cache: url=${cachedSection.url}`);\n        this.renderSection(cachedSection.html, section);\n        return Promise.resolve(section);\n      },\n  \n      renderSectionFromFetch: function (url, section) {\n        this.log(`[AjaxRenderer] redering from fetch: url=${url}`);\n  \n        return new Promise((resolve, reject) => {\n          fetch(url)\n            .then(response => response.text())\n            .then(responseText => {\n              const html = responseText;\n              this.cachedSections = [...this.cachedSections, { html, url }];\n              this.renderSection(html, section);\n              resolve(section);\n            })\n            .catch(err => reject(err));\n        });\n      },\n  \n      renderSection: function (html, section) {\n        this.log(\n          `[AjaxRenderer] rendering section: section=${JSON.stringify(section)}`,\n        );\n  \n        const newDom = new DOMParser().parseFromString(html, 'text/html');\n        if (this.onReplace) {\n          this.onReplace(newDom, section);\n        } else {\n          if (typeof section.nodeId === 'string') {\n            var newContentEl = newDom.getElementById(section.nodeId);\n            if (!newContentEl) {\n              return;\n            }\n  \n            document.getElementById(section.nodeId).innerHTML =\n              newContentEl.innerHTML;\n          } else {\n            section.nodeId.forEach(id => {\n              document.getElementById(id).innerHTML =\n                newDom.getElementById(id).innerHTML;\n            });\n          }\n        }\n  \n        return section;\n      },\n  \n      getUpdatedParams: function (currentParams, newParams) {\n        const clone = new URLSearchParams(currentParams);\n        const preservedParams = ['sort_by', 'q', 'options[prefix]', 'type'];\n  \n        // Find what params need to be removed\n        // delete happens first as we cannot specify keys based off of values\n        for (const [key, value] of clone.entries()) {\n          if (!newParams.getAll(key).includes(value) && !preservedParams.includes(key)) {\n            clone.delete(key);\n          };\n        }\n  \n        // Find what params need to be added\n        for (const [key, value] of newParams.entries()) {\n          if (!clone.getAll(key).includes(value) && value !== '') {\n            clone.append(key, value);\n          }\n        }\n  \n        return clone;\n      },\n  \n      updateURLHash: function (searchParams) {\n        history.pushState(\n          {},\n          '',\n          `${window.location.pathname}${\n            searchParams && '?'.concat(searchParams)\n          }`,\n        );\n      },\n  \n      log: function (...args) {\n        if (this.debug) {\n          console.log(...args);\n        }\n      },\n    });\n  \n    return AjaxRenderer;\n  })();\n  \n  if (window.Shopify && window.Shopify.theme && navigator && navigator.sendBeacon && window.Shopify.designMode) {\n    navigator.sendBeacon('https://api.archetypethemes.co/api/beacon', new URLSearchParams({\n      shop: window.Shopify.shop,\n      themeName: window.theme && window.theme.settings && `${window.theme.settings.themeName} v${window.theme.settings.themeVersion}`,\n      role: window.Shopify.theme.role,\n      route: window.location.pathname,\n      themeId: window.Shopify.theme.id,\n      themeStoreId: window.Shopify.theme.theme_store_id || 0,\n      isThemeEditor: !!window.Shopify.designMode\n    }))\n  }\n  theme.cart = {\n    getCart: function() {\n      var url = ''.concat(theme.routes.cart, '?t=').concat(Date.now());\n      return fetch(url, {\n        credentials: 'same-origin',\n        method: 'GET'\n      }).then(response => response.json());\n    },\n  \n    getCartProductMarkup: function() {\n      var url = ''.concat(theme.routes.cartPage, '?t=').concat(Date.now());\n  \n      url = url.indexOf('?') === -1 ? (url + '?view=ajax') : (url + '&view=ajax');\n  \n      return fetch(url, {\n        credentials: 'same-origin',\n        method: 'GET'\n      })\n      .then(function(response) {return response.text()});\n    },\n  \n    changeItem: function(key, qty) {\n      return this._updateCart({\n        url: ''.concat(theme.routes.cartChange, '?t=').concat(Date.now()),\n        data: JSON.stringify({\n          id: key,\n          quantity: qty\n        })\n      })\n    },\n  \n    _updateCart: function(params) {\n      return fetch(params.url, {\n        method: 'POST',\n        body: params.data,\n        credentials: 'same-origin',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-Requested-With': 'XMLHttpRequest'\n        }\n      })\n      .then(response => response.json())\n      .then(function(cart) {\n        return cart;\n      });\n    },\n  \n    updateAttribute: function(key, value) {\n      return this._updateCart({\n        url: '/cart/update.js',\n        data: JSON.stringify({\n          attributes: {\n            [key]: theme.cart.attributeToString(value)\n          }\n        })\n      });\n    },\n  \n    updateNote: function(note) {\n      return this._updateCart({\n        url: '/cart/update.js',\n        data: JSON.stringify({\n          note: theme.cart.attributeToString(note)\n        })\n      });\n    },\n  \n    attributeToString: function(attribute) {\n      if ((typeof attribute) !== 'string') {\n        attribute += '';\n        if (attribute === 'undefined') {\n          attribute = '';\n        }\n      }\n      return attribute.trim();\n    }\n  }\n  \n  /*============================================================================\n    CartForm\n    - Prevent checkout when terms checkbox exists\n    - Listen to quantity changes, rebuild cart (both widget and page)\n  ==============================================================================*/\n  theme.CartForm = (function() {\n    var selectors = {\n      products: '[data-products]',\n      qtySelector: '.js-qty__wrapper',\n      discounts: '[data-discounts]',\n      savings: '[data-savings]',\n      subTotal: '[data-subtotal]',\n  \n      cartBubble: '.cart-link__bubble',\n      cartNote: '[name=\"note\"]',\n      termsCheckbox: '.cart__terms-checkbox',\n      checkoutBtn: '.cart__checkout'\n    };\n  \n    var classes = {\n      btnLoading: 'btn--loading'\n    };\n  \n    var config = {\n      requiresTerms: false\n    };\n  \n    function CartForm(form) {\n      if (!form) {\n        return;\n      }\n  \n      this.form = form;\n      this.wrapper = form.parentNode;\n      this.location = form.dataset.location;\n      this.namespace = '.cart-' + this.location;\n      this.products = form.querySelector(selectors.products)\n      this.submitBtn = form.querySelector(selectors.checkoutBtn);\n  \n      this.discounts = form.querySelector(selectors.discounts);\n      this.savings = form.querySelector(selectors.savings);\n      this.subtotal = form.querySelector(selectors.subTotal);\n      this.termsCheckbox = form.querySelector(selectors.termsCheckbox);\n      this.noteInput = form.querySelector(selectors.cartNote);\n  \n      if (this.termsCheckbox) {\n        config.requiresTerms = true;\n      }\n  \n      this.init();\n    }\n  \n    CartForm.prototype = Object.assign({}, CartForm.prototype, {\n      init: function() {\n        this.initQtySelectors();\n  \n        document.addEventListener('cart:quantity' + this.namespace, this.quantityChanged.bind(this));\n  \n        this.form.on('submit' + this.namespace, this.onSubmit.bind(this));\n  \n        if (this.noteInput) {\n          this.noteInput.addEventListener('change', function() {\n            var newNote = this.value;\n            theme.cart.updateNote(newNote);\n          });\n        }\n  \n        // Dev-friendly way to build the cart\n        document.addEventListener('cart:build', function() {\n          this.buildCart();\n        }.bind(this));\n      },\n  \n      reInit: function() {\n        this.initQtySelectors();\n      },\n  \n      onSubmit: function(evt) {\n        this.submitBtn.classList.add(classes.btnLoading);\n  \n        if (config.requiresTerms) {\n          if (this.termsCheckbox.checked) {\n            // continue to checkout\n          } else {\n            alert(theme.strings.cartTermsConfirmation);\n            this.submitBtn.classList.remove(classes.btnLoading)\n            evt.preventDefault();\n            return false;\n          }\n        }\n      },\n  \n      /*============================================================================\n        Query cart page to get markup\n      ==============================================================================*/\n      _parseProductHTML: function(html) {\n        var parser = new DOMParser();\n        var doc = parser.parseFromString(html, 'text/html');\n        return {\n          items: doc.querySelector('.cart__items'),\n          discounts: doc.querySelector('.cart__discounts')\n        }\n      },\n  \n      buildCart: function() {\n        theme.cart.getCartProductMarkup().then(this.cartMarkup.bind(this));\n      },\n  \n      cartMarkup: function(html) {\n        var markup = this._parseProductHTML(html);\n        var items = markup.items;\n        var count = parseInt(items.dataset.count);\n        var subtotal = items.dataset.cartSubtotal;\n        var savings = items.dataset.cartSavings;\n  \n        this.updateCartDiscounts(markup.discounts);\n        this.updateSavings(savings);\n  \n        if (count > 0) {\n          this.wrapper.classList.remove('is-empty');\n        } else {\n          this.wrapper.classList.add('is-empty');\n        }\n  \n        this.updateCount(count);\n  \n        // Append item markup\n        this.products.innerHTML = '';\n        this.products.append(items);\n  \n        // Update subtotal\n        this.subtotal.innerHTML = theme.Currency.formatMoney(subtotal, theme.settings.moneyFormat);\n  \n        this.reInit();\n  \n        if (window.AOS) { AOS.refreshHard() }\n  \n        if (Shopify && Shopify.StorefrontExpressButtons) {\n          Shopify.StorefrontExpressButtons.initialize();\n        }\n      },\n  \n      updateCartDiscounts: function(markup) {\n        if (!this.discounts) {\n          return;\n        }\n        this.discounts.innerHTML = '';\n        this.discounts.append(markup);\n      },\n  \n      /*============================================================================\n        Quantity handling\n      ==============================================================================*/\n      initQtySelectors: function() {\n        this.form.querySelectorAll(selectors.qtySelector).forEach(el => {\n          var selector = new theme.QtySelector(el, {\n            namespace: this.namespace,\n            isCart: true\n          });\n        });\n      },\n  \n      quantityChanged: function(evt) {\n        var key = evt.detail[0];\n        var qty = evt.detail[1];\n        var el = evt.detail[2];\n  \n        if (!key || !qty) {\n          return;\n        }\n  \n        // Disable qty selector so multiple clicks can't happen while loading\n        if (el) {\n          el.classList.add('is-loading');\n        }\n  \n        theme.cart.changeItem(key, qty)\n          .then(function(cart) {\n            if (cart.item_count > 0) {\n              this.wrapper.classList.remove('is-empty');\n            } else {\n              this.wrapper.classList.add('is-empty');\n            }\n  \n            this.buildCart();\n  \n            document.dispatchEvent(new CustomEvent('cart:updated', {\n              detail: {\n                cart: cart\n              }\n            }));\n          }.bind(this))\n          .catch(function(XMLHttpRequest){});\n      },\n  \n      /*============================================================================\n        Update elements of the cart\n      ==============================================================================*/\n      updateSubtotal: function(subtotal) {\n        this.form.querySelector(selectors.subTotal).innerHTML = theme.Currency.formatMoney(subtotal, theme.settings.moneyFormat);\n      },\n  \n      updateSavings: function(savings) {\n        if (!this.savings) {\n          return;\n        }\n  \n        if (savings > 0) {\n          var amount = theme.Currency.formatMoney(savings, theme.settings.moneyFormat);\n          this.savings.classList.remove('hide');\n          this.savings.innerHTML = theme.strings.cartSavings.replace('[savings]', amount);\n        } else {\n          this.savings.classList.add('hide');\n        }\n      },\n  \n      updateCount: function(count) {\n        var countEls = document.querySelectorAll('.cart-link__bubble-num');\n  \n        if (countEls.length) {\n          countEls.forEach(el => {\n            el.innerText = count;\n          });\n        }\n  \n        // show/hide bubble(s)\n        var bubbles = document.querySelectorAll(selectors.cartBubble);\n        if (bubbles.length) {\n          if (count > 0) {\n            bubbles.forEach(b => {\n              b.classList.add('cart-link__bubble--visible');\n            });\n          } else {\n            bubbles.forEach(b => {\n              b.classList.remove('cart-link__bubble--visible');\n            });\n          }\n        }\n      }\n    });\n  \n    return CartForm;\n  })();\n  \n  // Either collapsible containers all acting individually,\n  // or tabs that can only have one open at a time\n  theme.collapsibles = (function() {\n    var selectors = {\n      trigger: '.collapsible-trigger',\n      module: '.collapsible-content',\n      moduleInner: '.collapsible-content__inner',\n      tabs: '.collapsible-trigger--tab'\n    };\n  \n    var classes = {\n      hide: 'hide',\n      open: 'is-open',\n      autoHeight: 'collapsible--auto-height',\n      tabs: 'collapsible-trigger--tab'\n    };\n  \n    var namespace = '.collapsible';\n  \n    var isTransitioning = false;\n  \n    function init(scope) {\n      var el = scope ? scope : document;\n      el.querySelectorAll(selectors.trigger).forEach(trigger => {\n        var state = trigger.classList.contains(classes.open);\n        trigger.setAttribute('aria-expanded', state);\n  \n        trigger.off('click' + namespace);\n        trigger.on('click' + namespace, toggle);\n      });\n    }\n  \n    function toggle(evt) {\n      if (isTransitioning) {\n        return;\n      }\n  \n      isTransitioning = true;\n  \n      var el = evt.currentTarget;\n      var isOpen = el.classList.contains(classes.open);\n      var isTab = el.classList.contains(classes.tabs);\n      var moduleId = el.getAttribute('aria-controls');\n      var container = document.getElementById(moduleId);\n  \n      if (!moduleId) {\n        moduleId = el.dataset.controls;\n      }\n  \n      // No ID, bail\n      if (!moduleId) {\n        return;\n      }\n  \n      // If container=null, there isn't a matching ID.\n      // Check if data-id is set instead. Could be multiple.\n      // Select based on being in the same parent div.\n      if (!container) {\n        var multipleMatches = document.querySelectorAll('[data-id=\"' + moduleId + '\"]');\n        if (multipleMatches.length > 0) {\n          container = el.parentNode.querySelector('[data-id=\"' + moduleId + '\"]');\n        }\n      }\n  \n      if (!container) {\n        isTransitioning = false;\n        return;\n      }\n  \n      var height = container.querySelector(selectors.moduleInner).offsetHeight;\n      var isAutoHeight = container.classList.contains(classes.autoHeight);\n      var parentCollapsibleEl = container.parentNode.closest(selectors.module);\n      var childHeight = height;\n  \n      if (isTab) {\n        if(isOpen) {\n          isTransitioning = false;\n          return;\n        }\n  \n        var newModule;\n        document.querySelectorAll(selectors.tabs + '[data-id=\"'+ el.dataset.id +'\"]').forEach(el => {\n          el.classList.remove(classes.open);\n          newModule = document.querySelector('#' + el.getAttribute('aria-controls'));\n          setTransitionHeight(newModule, 0, true);\n        });\n      }\n  \n      // If isAutoHeight, set the height to 0 just after setting the actual height\n      // so the closing animation works nicely\n      if (isOpen && isAutoHeight) {\n        setTimeout(function() {\n          height = 0;\n          setTransitionHeight(container, height, isOpen, isAutoHeight);\n        }, 0);\n      }\n  \n      if (isOpen && !isAutoHeight) {\n        height = 0;\n      }\n  \n      el.setAttribute('aria-expanded', !isOpen);\n      if (isOpen) {\n        el.classList.remove(classes.open);\n      } else {\n        el.classList.add(classes.open);\n      }\n  \n      setTransitionHeight(container, height, isOpen, isAutoHeight);\n  \n      // If we are in a nested collapsible element like the mobile nav,\n      // also set the parent element's height\n      if (parentCollapsibleEl) {\n        var parentHeight = parentCollapsibleEl.style.height;\n  \n        if (isOpen && parentHeight === 'auto') {\n          childHeight = 0; // Set childHeight to 0 if parent is initially opened\n        }\n  \n        var totalHeight = isOpen\n                        ? parentCollapsibleEl.offsetHeight - childHeight\n                        : height + parentCollapsibleEl.offsetHeight;\n  \n        setTransitionHeight(parentCollapsibleEl, totalHeight, false, false);\n      }\n  \n      // If Shopify Product Reviews app installed,\n      // resize container on 'Write review' click\n      // that shows form\n      if (window.SPR) {\n        var btn = container.querySelector('.spr-summary-actions-newreview');\n        if (!btn) { return }\n        btn.off('click' + namespace);\n        btn.on('click' + namespace, function() {\n          height = container.querySelector(selectors.moduleInner).offsetHeight;\n          setTransitionHeight(container, height, isOpen, isAutoHeight);\n        });\n      }\n    }\n  \n    function setTransitionHeight(container, height, isOpen, isAutoHeight) {\n      container.classList.remove(classes.hide);\n      theme.utils.prepareTransition(container, function() {\n  \n        container.style.height = height+'px';\n        if (isOpen) {\n          container.classList.remove(classes.open);\n        } else {\n          container.classList.add(classes.open);\n        }\n      });\n  \n      if (!isOpen && isAutoHeight) {\n        var o = container;\n        window.setTimeout(function() {\n          o.css('height','auto');\n          isTransitioning = false;\n        }, 500);\n      } else {\n        isTransitioning = false;\n      }\n    }\n  \n    return {\n      init: init\n    };\n  })();\n  \n  // Shopify-built select-like popovers for currency and language selection\n  theme.Disclosure = (function() {\n    var selectors = {\n      disclosureForm: '[data-disclosure-form]',\n      disclosureList: '[data-disclosure-list]',\n      disclosureToggle: '[data-disclosure-toggle]',\n      disclosureInput: '[data-disclosure-input]',\n      disclosureOptions: '[data-disclosure-option]'\n    };\n  \n    var classes = {\n      listVisible: 'disclosure-list--visible'\n    };\n  \n    function Disclosure(disclosure) {\n      this.container = disclosure;\n      this._cacheSelectors();\n      this._setupListeners();\n    }\n  \n    Disclosure.prototype = Object.assign({}, Disclosure.prototype, {\n      _cacheSelectors: function() {\n        this.cache = {\n          disclosureForm: this.container.closest(selectors.disclosureForm),\n          disclosureList: this.container.querySelector(selectors.disclosureList),\n          disclosureToggle: this.container.querySelector(\n            selectors.disclosureToggle\n          ),\n          disclosureInput: this.container.querySelector(\n            selectors.disclosureInput\n          ),\n          disclosureOptions: this.container.querySelectorAll(\n            selectors.disclosureOptions\n          )\n        };\n      },\n  \n      _setupListeners: function() {\n        this.eventHandlers = this._setupEventHandlers();\n  \n        this.cache.disclosureToggle.addEventListener(\n          'click',\n          this.eventHandlers.toggleList\n        );\n  \n        this.cache.disclosureOptions.forEach(function(disclosureOption) {\n          disclosureOption.addEventListener(\n            'click',\n            this.eventHandlers.connectOptions\n          );\n        }, this);\n  \n        this.container.addEventListener(\n          'keyup',\n          this.eventHandlers.onDisclosureKeyUp\n        );\n  \n        this.cache.disclosureList.addEventListener(\n          'focusout',\n          this.eventHandlers.onDisclosureListFocusOut\n        );\n  \n        this.cache.disclosureToggle.addEventListener(\n          'focusout',\n          this.eventHandlers.onDisclosureToggleFocusOut\n        );\n  \n        document.body.addEventListener('click', this.eventHandlers.onBodyClick);\n      },\n  \n      _setupEventHandlers: function() {\n        return {\n          connectOptions: this._connectOptions.bind(this),\n          toggleList: this._toggleList.bind(this),\n          onBodyClick: this._onBodyClick.bind(this),\n          onDisclosureKeyUp: this._onDisclosureKeyUp.bind(this),\n          onDisclosureListFocusOut: this._onDisclosureListFocusOut.bind(this),\n          onDisclosureToggleFocusOut: this._onDisclosureToggleFocusOut.bind(this)\n        };\n      },\n  \n      _connectOptions: function(event) {\n        event.preventDefault();\n  \n        this._submitForm(event.currentTarget.dataset.value);\n      },\n  \n      _onDisclosureToggleFocusOut: function(event) {\n        var disclosureLostFocus =\n          this.container.contains(event.relatedTarget) === false;\n  \n        if (disclosureLostFocus) {\n          this._hideList();\n        }\n      },\n  \n      _onDisclosureListFocusOut: function(event) {\n        var childInFocus = event.currentTarget.contains(event.relatedTarget);\n  \n        var isVisible = this.cache.disclosureList.classList.contains(\n          classes.listVisible\n        );\n  \n        if (isVisible && !childInFocus) {\n          this._hideList();\n        }\n      },\n  \n      _onDisclosureKeyUp: function(event) {\n        if (event.which !== 27) return;\n        this._hideList();\n        this.cache.disclosureToggle.focus();\n      },\n  \n      _onBodyClick: function(event) {\n        var isOption = this.container.contains(event.target);\n        var isVisible = this.cache.disclosureList.classList.contains(\n          classes.listVisible\n        );\n  \n        if (isVisible && !isOption) {\n          this._hideList();\n        }\n      },\n  \n      _submitForm: function(value) {\n        this.cache.disclosureInput.value = value;\n        this.cache.disclosureForm.submit();\n      },\n  \n      _hideList: function() {\n        this.cache.disclosureList.classList.remove(classes.listVisible);\n        this.cache.disclosureToggle.setAttribute('aria-expanded', false);\n      },\n  \n      _toggleList: function() {\n        var ariaExpanded =\n          this.cache.disclosureToggle.getAttribute('aria-expanded') === 'true';\n        this.cache.disclosureList.classList.toggle(classes.listVisible);\n        this.cache.disclosureToggle.setAttribute('aria-expanded', !ariaExpanded);\n      },\n  \n      destroy: function() {\n        this.cache.disclosureToggle.removeEventListener(\n          'click',\n          this.eventHandlers.toggleList\n        );\n  \n        this.cache.disclosureOptions.forEach(function(disclosureOption) {\n          disclosureOption.removeEventListener(\n            'click',\n            this.eventHandlers.connectOptions\n          );\n        }, this);\n  \n        this.container.removeEventListener(\n          'keyup',\n          this.eventHandlers.onDisclosureKeyUp\n        );\n  \n        this.cache.disclosureList.removeEventListener(\n          'focusout',\n          this.eventHandlers.onDisclosureListFocusOut\n        );\n  \n        this.cache.disclosureToggle.removeEventListener(\n          'focusout',\n          this.eventHandlers.onDisclosureToggleFocusOut\n        );\n  \n        document.body.removeEventListener(\n          'click',\n          this.eventHandlers.onBodyClick\n        );\n      }\n    });\n  \n    return Disclosure;\n  })();\n  \n  theme.Drawers = (function() {\n    function Drawers(id, name) {\n      this.config = {\n        id: id,\n        close: '.js-drawer-close',\n        open: '.js-drawer-open-' + name,\n        openClass: 'js-drawer-open',\n        closingClass: 'js-drawer-closing',\n        activeDrawer: 'drawer--is-open',\n        namespace: '.drawer-' + name\n      };\n  \n      this.nodes = {\n        page: document.querySelector('#MainContent')\n      };\n  \n      this.drawer = document.querySelector('#' + id);\n      this.isOpen = false;\n  \n      if (!this.drawer) {\n        return;\n      }\n  \n      this.init();\n    }\n  \n    Drawers.prototype = Object.assign({}, Drawers.prototype, {\n      init: function() {\n        // Setup open button(s)\n        document.querySelectorAll(this.config.open).forEach(openBtn => {\n          openBtn.setAttribute('aria-expanded', 'false');\n          openBtn.addEventListener('click', this.open.bind(this));\n        });\n  \n        this.drawer.querySelector(this.config.close).addEventListener('click', this.close.bind(this));\n  \n        // Close modal if a drawer is opened\n        document.addEventListener('modalOpen', function() {\n          this.close();\n        }.bind(this));\n      },\n  \n      open: function(evt, returnFocusEl) {\n        if (evt) {\n          evt.preventDefault();\n        }\n  \n        if (this.isOpen) {\n          return;\n        }\n  \n        // Without this the drawer opens, the click event bubbles up to $nodes.page which closes the drawer.\n        if (evt && evt.stopPropagation) {\n          evt.stopPropagation();\n          // save the source of the click, we'll focus to this on close\n          evt.currentTarget.setAttribute('aria-expanded', 'true');\n          this.activeSource = evt.currentTarget;\n        } else if (returnFocusEl) {\n          returnFocusEl.setAttribute('aria-expanded', 'true');\n          this.activeSource = returnFocusEl;\n        }\n  \n        theme.utils.prepareTransition(this.drawer, function() {\n          this.drawer.classList.add(this.config.activeDrawer);\n        }.bind(this));\n  \n        document.documentElement.classList.add(this.config.openClass);\n        this.isOpen = true;\n  \n        theme.a11y.trapFocus({\n          container: this.drawer,\n          namespace: 'drawer_focus'\n        });\n  \n        document.dispatchEvent(new CustomEvent('drawerOpen'));\n        document.dispatchEvent(new CustomEvent('drawerOpen.' + this.config.id));\n  \n        this.bindEvents();\n      },\n  \n      close: function(evt) {\n        if (!this.isOpen) {\n          return;\n        }\n  \n        // Do not close if click event came from inside drawer\n        if (evt) {\n          if (evt.target.closest('.js-drawer-close')) {\n            // Do not close if using the drawer close button\n          } else if (evt.target.closest('.drawer')) {\n            return;\n          }\n        }\n  \n        // deselect any focused form elements\n        document.activeElement.blur();\n  \n        theme.utils.prepareTransition(this.drawer, function() {\n          this.drawer.classList.remove(this.config.activeDrawer);\n        }.bind(this));\n  \n        document.documentElement.classList.remove(this.config.openClass);\n        document.documentElement.classList.add(this.config.closingClass);\n  \n        window.setTimeout(function() {\n          document.documentElement.classList.remove(this.config.closingClass);\n          if (this.activeSource && this.activeSource.getAttribute('aria-expanded')) {\n            this.activeSource.setAttribute('aria-expanded', 'false');\n            this.activeSource.focus();\n          }\n        }.bind(this), 500);\n  \n        this.isOpen = false;\n  \n        theme.a11y.removeTrapFocus({\n          container: this.drawer,\n          namespace: 'drawer_focus'\n        });\n  \n        this.unbindEvents();\n      },\n  \n      bindEvents: function() {\n        // Clicking out of drawer closes it\n        window.on('click' + this.config.namespace, function(evt) {\n          this.close(evt)\n          return;\n        }.bind(this));\n  \n        // Pressing escape closes drawer\n        window.on('keyup' + this.config.namespace, function(evt) {\n          if (evt.keyCode === 27) {\n            this.close();\n          }\n        }.bind(this));\n  \n        theme.a11y.lockMobileScrolling(this.config.namespace, this.nodes.page);\n      },\n  \n      unbindEvents: function() {\n        window.off('click' + this.config.namespace);\n        window.off('keyup' + this.config.namespace);\n  \n        theme.a11y.unlockMobileScrolling(this.config.namespace, this.nodes.page);\n      }\n    });\n  \n    return Drawers;\n  })();\n  \n  theme.Modals = (function() {\n    function Modal(id, name, options) {\n      var defaults = {\n        close: '.js-modal-close',\n        open: '.js-modal-open-' + name,\n        openClass: 'modal--is-active',\n        closingClass: 'modal--is-closing',\n        bodyOpenClass: ['modal-open'],\n        bodyOpenSolidClass: 'modal-open--solid',\n        bodyClosingClass: 'modal-closing',\n        closeOffContentClick: true\n      };\n  \n      this.id = id;\n      this.modal = document.getElementById(id);\n  \n      if (!this.modal) {\n        return false;\n      }\n  \n      this.modalContent = this.modal.querySelector('.modal__inner');\n  \n      this.config = Object.assign(defaults, options);\n      this.modalIsOpen = false;\n      this.focusOnOpen = this.config.focusIdOnOpen ? document.getElementById(this.config.focusIdOnOpen) : this.modal;\n      this.isSolid = this.config.solid;\n  \n      this.init();\n    }\n  \n    Modal.prototype.init = function() {\n      document.querySelectorAll(this.config.open).forEach(btn => {\n        btn.setAttribute('aria-expanded', 'false');\n        btn.addEventListener('click', this.open.bind(this));\n      });\n  \n      this.modal.querySelectorAll(this.config.close).forEach(btn => {\n        btn.addEventListener('click', this.close.bind(this));\n      });\n  \n      // Close modal if a drawer is opened\n      document.addEventListener('drawerOpen', function() {\n        this.close();\n      }.bind(this));\n    };\n  \n    Modal.prototype.open = function(evt) {\n      // Keep track if modal was opened from a click, or called by another function\n      var externalCall = false;\n  \n      // don't open an opened modal\n      if (this.modalIsOpen) {\n        return;\n      }\n  \n      // Prevent following href if link is clicked\n      if (evt) {\n        evt.preventDefault();\n      } else {\n        externalCall = true;\n      }\n  \n      // Without this, the modal opens, the click event bubbles up to $nodes.page\n      // which closes the modal.\n      if (evt && evt.stopPropagation) {\n        evt.stopPropagation();\n        // save the source of the click, we'll focus to this on close\n        this.activeSource = evt.currentTarget.setAttribute('aria-expanded', 'true');\n      }\n  \n      if (this.modalIsOpen && !externalCall) {\n        this.close();\n      }\n  \n      this.modal.classList.add(this.config.openClass);\n  \n      document.documentElement.classList.add(...this.config.bodyOpenClass);\n  \n      if (this.isSolid) {\n        document.documentElement.classList.add(this.config.bodyOpenSolidClass);\n      }\n  \n      this.modalIsOpen = true;\n  \n      theme.a11y.trapFocus({\n        container: this.modal,\n        elementToFocus: this.focusOnOpen,\n        namespace: 'modal_focus'\n      });\n  \n      document.dispatchEvent(new CustomEvent('modalOpen'));\n      document.dispatchEvent(new CustomEvent('modalOpen.' + this.id));\n  \n      this.bindEvents();\n    };\n  \n    Modal.prototype.close = function(evt) {\n      // don't close a closed modal\n      if (!this.modalIsOpen) {\n        return;\n      }\n  \n      // Do not close modal if click happens inside modal content\n      if (evt) {\n        if (evt.target.closest('.js-modal-close')) {\n          // Do not close if using the modal close button\n        } else if (evt.target.closest('.modal__inner')) {\n          return;\n        }\n      }\n  \n      // deselect any focused form elements\n      document.activeElement.blur();\n  \n      this.modal.classList.remove(this.config.openClass);\n      this.modal.classList.add(this.config.closingClass);\n  \n      document.documentElement.classList.remove(...this.config.bodyOpenClass);\n      document.documentElement.classList.add(this.config.bodyClosingClass);\n  \n      window.setTimeout(function() {\n        document.documentElement.classList.remove(this.config.bodyClosingClass);\n        this.modal.classList.remove(this.config.closingClass);\n        if (this.activeSource && this.activeSource.getAttribute('aria-expanded')) {\n          this.activeSource.setAttribute('aria-expanded', 'false').focus();\n        }\n      }.bind(this), 500); // modal close css transition\n  \n      if (this.isSolid) {\n        document.documentElement.classList.remove(this.config.bodyOpenSolidClass);\n      }\n  \n      this.modalIsOpen = false;\n  \n      theme.a11y.removeTrapFocus({\n        container: this.modal,\n        namespace: 'modal_focus'\n      });\n  \n      document.dispatchEvent(new CustomEvent('modalClose.' + this.id));\n  \n      this.unbindEvents();\n    };\n  \n    Modal.prototype.bindEvents = function() {\n      window.on('keyup.modal', function(evt) {\n        if (evt.keyCode === 27) {\n          this.close();\n        }\n      }.bind(this));\n  \n      if (this.config.closeOffContentClick) {\n        // Clicking outside of the modal content also closes it\n        this.modal.on('click.modal', this.close.bind(this));\n      }\n    };\n  \n    Modal.prototype.unbindEvents = function() {\n      document.documentElement.off('.modal');\n  \n      if (this.config.closeOffContentClick) {\n        this.modal.off('.modal');\n      }\n    };\n  \n    return Modal;\n  })();\n  \n  if (typeof window.noUiSlider === 'undefined') {\n    throw new Error('theme.PriceRange is missing vendor noUiSlider: // =require vendor/nouislider.js');\n  }\n  \n  theme.PriceRange = (function () {\n    var defaultStep = 10;\n    var selectors = {\n      priceRange: '.price-range',\n      priceRangeSlider: '.price-range__slider',\n      priceRangeInputMin: '.price-range__input-min',\n      priceRangeInputMax: '.price-range__input-max',\n      priceRangeDisplayMin: '.price-range__display-min',\n      priceRangeDisplayMax: '.price-range__display-max',\n    };\n  \n    function PriceRange(container, {onChange, onUpdate, ...sliderOptions} = {}) {\n      this.container = container;\n      this.onChange = onChange;\n      this.onUpdate = onUpdate;\n      this.sliderOptions = sliderOptions || {};\n  \n      return this.init();\n    }\n  \n    PriceRange.prototype = Object.assign({}, PriceRange.prototype, {\n      init: function () {\n        if (!this.container.classList.contains('price-range')) {\n          throw new Error('You must instantiate PriceRange with a valid container')\n        }\n  \n        this.formEl = this.container.closest('form');\n        this.sliderEl = this.container.querySelector(selectors.priceRangeSlider);\n        this.inputMinEl = this.container.querySelector(selectors.priceRangeInputMin);\n        this.inputMaxEl = this.container.querySelector(selectors.priceRangeInputMax);\n        this.displayMinEl = this.container.querySelector(selectors.priceRangeDisplayMin);\n        this.displayMaxEl = this.container.querySelector(selectors.priceRangeDisplayMax);\n  \n        this.minRange = parseFloat(this.container.dataset.min) || 0;\n        this.minValue = parseFloat(this.container.dataset.minValue) || 0;\n        this.maxRange = parseFloat(this.container.dataset.max) || 100;\n        this.maxValue = parseFloat(this.container.dataset.maxValue) || this.maxRange;\n  \n        return this.createPriceRange();\n      },\n  \n      createPriceRange: function () {\n        if (this.sliderEl && this.sliderEl.noUiSlider && typeof this.sliderEl.noUiSlider.destroy === 'function') {\n          this.sliderEl.noUiSlider.destroy();\n        }\n  \n        var slider = noUiSlider.create(this.sliderEl, {\n          connect: true,\n          step: defaultStep,\n          ...this.sliderOptions,\n          // Do not allow overriding these options\n          start: [this.minValue, this.maxValue],\n          range: {\n            min: this.minRange,\n            max: this.maxRange,\n          },\n        });\n  \n        slider.on('update', values => {\n          this.displayMinEl.innerHTML = theme.Currency.formatMoney(\n            values[0],\n            theme.settings.moneyFormat,\n          );\n          this.displayMaxEl.innerHTML = theme.Currency.formatMoney(\n            values[1],\n            theme.settings.moneyFormat,\n          );\n  \n          if (this.onUpdate) {\n            this.onUpdate(values);\n          }\n        });\n  \n        slider.on('change', values => {\n          this.inputMinEl.value = values[0];\n          this.inputMaxEl.value = values[1];\n  \n          if (this.onChange) {\n            const formData = new FormData(this.formEl);\n            this.onChange(formData);\n          }\n        });\n  \n        return slider;\n      },\n    });\n  \n    return PriceRange;\n  })();\n  \n  theme.AjaxProduct = (function() {\n    var status = {\n      loading: false\n    };\n  \n    function ProductForm(form, submit, args) {\n      this.form = form;\n      this.args = args;\n  \n      var submitSelector = submit ? submit : '.add-to-cart';\n  \n      if (this.form) {\n        this.addToCart = form.querySelector(submitSelector);\n        this.form.addEventListener('submit', this.addItemFromForm.bind(this));\n      }\n    };\n  \n    ProductForm.prototype = Object.assign({}, ProductForm.prototype, {\n      addItemFromForm: function(evt, callback){\n        evt.preventDefault();\n  \n        if (status.loading) {\n          return;\n        }\n  \n        // Loading indicator on add to cart button\n        this.addToCart.classList.add('btn--loading');\n  \n        status.loading = true;\n  \n        var data = theme.utils.serialize(this.form);\n  \n        fetch(theme.routes.cartAdd, {\n          method: 'POST',\n          body: data,\n          credentials: 'same-origin',\n          headers: {\n            'Content-Type': 'application/x-www-form-urlencoded',\n            'X-Requested-With': 'XMLHttpRequest'\n          }\n        })\n        .then(response => response.json())\n        .then(function(data) {\n          if (data.status === 422) {\n            this.error(data);\n          } else {\n            var product = data;\n            this.success(product);\n          }\n  \n          status.loading = false;\n          this.addToCart.classList.remove('btn--loading');\n  \n          // Reload page if adding product from a section on the cart page\n          if (document.body.classList.contains('template-cart')) {\n            window.scrollTo(0, 0);\n            location.reload();\n          }\n        }.bind(this));\n      },\n  \n      success: function(product) {\n        var errors = this.form.querySelector('.errors');\n        if (errors) {\n          errors.remove();\n        }\n  \n        document.dispatchEvent(new CustomEvent('ajaxProduct:added', {\n          detail: {\n            product: product,\n            addToCartBtn: this.addToCart\n          }\n        }));\n  \n        if (this.args && this.args.scopedEventId) {\n          document.dispatchEvent(new CustomEvent('ajaxProduct:added:' + this.args.scopedEventId, {\n            detail: {\n              product: product,\n              addToCartBtn: this.addToCart\n            }\n          }));\n        }\n      },\n  \n      error: function(error) {\n        if (!error.description) {\n          console.warn(error);\n          return;\n        }\n  \n        var errors = this.form.querySelector('.errors');\n        if (errors) {\n          errors.remove();\n        }\n  \n        var errorDiv = document.createElement('div');\n        errorDiv.classList.add('errors', 'text-center');\n        errorDiv.textContent = error.description;\n        this.form.append(errorDiv);\n  \n        document.dispatchEvent(new CustomEvent('ajaxProduct:error', {\n          detail: {\n            errorMessage: error.description\n          }\n        }));\n  \n        if (this.args && this.args.scopedEventId) {\n          document.dispatchEvent(new CustomEvent('ajaxProduct:error:' + this.args.scopedEventId, {\n            detail: {\n              errorMessage: error.description\n            }\n          }));\n        }\n      }\n    });\n  \n    return ProductForm;\n  })();\n  \n  theme.ProductMedia = (function() {\n    var modelJsonSections = {};\n    var models = {};\n    var xrButtons = {};\n  \n    var selectors = {\n      mediaGroup: '[data-product-single-media-group]',\n      xrButton: '[data-shopify-xr]'\n    };\n  \n    function init(modelViewerContainers, sectionId) {\n      modelJsonSections[sectionId] = {\n        loaded: false\n      };\n  \n      modelViewerContainers.forEach(function(container, index) {\n        var mediaId = container.dataset.mediaId;\n        var modelViewerElement = container.querySelector('model-viewer');\n        var modelId = modelViewerElement.dataset.modelId;\n  \n        if (index === 0) {\n          var mediaGroup = container.closest(selectors.mediaGroup);\n          var xrButton = mediaGroup.querySelector(selectors.xrButton);\n          xrButtons[sectionId] = {\n            element: xrButton,\n            defaultId: modelId\n          };\n        }\n  \n        models[mediaId] = {\n          modelId: modelId,\n          sectionId: sectionId,\n          container: container,\n          element: modelViewerElement\n        };\n  \n      });\n  \n      window.Shopify.loadFeatures([\n        {\n          name: 'shopify-xr',\n          version: '1.0',\n          onLoad: setupShopifyXr\n        },\n        {\n          name: 'model-viewer-ui',\n          version: '1.0',\n          onLoad: setupModelViewerUi\n        }\n      ]);\n  \n      theme.LibraryLoader.load('modelViewerUiStyles');\n    }\n  \n    function setupShopifyXr(errors) {\n      if (errors) return;\n  \n      if (!window.ShopifyXR) {\n        document.addEventListener('shopify_xr_initialized', function() {\n          setupShopifyXr();\n        });\n        return;\n      }\n  \n      for (var sectionId in modelJsonSections) {\n        if (modelJsonSections.hasOwnProperty(sectionId)) {\n          var modelSection = modelJsonSections[sectionId];\n  \n          if (modelSection.loaded) continue;\n  \n          var modelJson = document.querySelector('#ModelJson-' + sectionId);\n  \n          window.ShopifyXR.addModels(JSON.parse(modelJson.innerHTML));\n          modelSection.loaded = true;\n        }\n      }\n      window.ShopifyXR.setupXRElements();\n    }\n  \n    function setupModelViewerUi(errors) {\n      if (errors) return;\n  \n      for (var key in models) {\n        if (models.hasOwnProperty(key)) {\n          var model = models[key];\n          if (!model.modelViewerUi && Shopify) {\n            model.modelViewerUi = new Shopify.ModelViewerUI(model.element);\n          }\n          setupModelViewerListeners(model);\n        }\n      }\n    }\n  \n    function setupModelViewerListeners(model) {\n      var xrButton = xrButtons[model.sectionId];\n  \n      model.container.addEventListener('mediaVisible', function() {\n        xrButton.element.setAttribute('data-shopify-model3d-id', model.modelId);\n        if (theme.config.isTouch) return;\n        model.modelViewerUi.play();\n      });\n  \n      model.container.addEventListener('mediaHidden', function() {\n        xrButton.element.setAttribute('data-shopify-model3d-id', xrButton.defaultId);\n        model.modelViewerUi.pause();\n      });\n  \n      model.container.addEventListener('xrLaunch', function() {\n        model.modelViewerUi.pause();\n      });\n    }\n  \n    function removeSectionModels(sectionId) {\n      for (var key in models) {\n        if (models.hasOwnProperty(key)) {\n          var model = models[key];\n          if (model.sectionId === sectionId) {\n            delete models[key];\n          }\n        }\n      }\n      delete modelJsonSections[sectionId];\n    }\n  \n    return {\n      init: init,\n      removeSectionModels: removeSectionModels\n    };\n  })();\n  \n  theme.QtySelector = (function() {\n    var selectors = {\n      input: '.js-qty__num',\n      plus: '.js-qty__adjust--plus',\n      minus: '.js-qty__adjust--minus'\n    };\n  \n    function QtySelector(el, options) {\n      this.wrapper = el;\n      this.plus = el.querySelector(selectors.plus);\n      this.minus = el.querySelector(selectors.minus);\n      this.input = el.querySelector(selectors.input);\n      this.minValue = this.input.getAttribute('min') || 1;\n  \n      var defaults = {\n        namespace: null,\n        isCart: false,\n        key: this.input.dataset.id\n      };\n  \n      this.options = Object.assign({}, defaults, options);\n  \n      this.init();\n    }\n  \n    QtySelector.prototype = Object.assign({}, QtySelector.prototype, {\n      init: function() {\n        this.plus.addEventListener('click', function() {\n          var qty = this._getQty();\n          this._change(qty + 1);\n        }.bind(this));\n  \n        this.minus.addEventListener('click', function() {\n          var qty = this._getQty();\n          this._change(qty - 1);\n        }.bind(this));\n  \n        this.input.addEventListener('change', function(evt) {\n          this._change(this._getQty());\n        }.bind(this));\n      },\n  \n      _getQty: function() {\n        var qty = this.input.value;\n        if((parseFloat(qty) == parseInt(qty)) && !isNaN(qty)) {\n          // We have a valid number!\n        } else {\n          // Not a number. Default to 1.\n          qty = 1;\n        }\n        return parseInt(qty);\n      },\n  \n      _change: function(qty) {\n        if (qty <= this.minValue) {\n          qty = this.minValue;\n        }\n  \n        this.input.value = qty;\n  \n        if (this.options.isCart) {\n          document.dispatchEvent(new CustomEvent('cart:quantity' + this.options.namespace, {\n              detail: [this.options.key, qty, this.wrapper]\n          }));\n        }\n      }\n    });\n  \n    return QtySelector;\n  })();\n  \n  // theme.Slideshow handles all flickity based sliders\n  // Child navigation is only setup to work on product images\n  theme.Slideshow = (function() {\n    var classes = {\n      animateOut: 'animate-out',\n      isPaused: 'is-paused',\n      isActive: 'is-active'\n    };\n  \n    var selectors = {\n      allSlides: '.slideshow__slide',\n      currentSlide: '.is-selected',\n      wrapper: '.slideshow-wrapper',\n      pauseButton: '.slideshow__pause'\n    };\n  \n    var productSelectors = {\n      thumb: '.product__thumb-item:not(.hide)',\n      links: '.product__thumb-item:not(.hide) a',\n      arrow: '.product__thumb-arrow'\n    };\n  \n    var defaults = {\n      adaptiveHeight: false,\n      autoPlay: false,\n      avoidReflow: false, // custom by Archetype\n      childNav: null, // element. Custom by Archetype instead of asNavFor\n      childNavScroller: null, // element\n      childVertical: false,\n      dragThreshold: 7,\n      fade: false,\n      friction: 0.8,\n      initialIndex: 0,\n      pageDots: false,\n      pauseAutoPlayOnHover: false,\n      prevNextButtons: false,\n      rightToLeft: theme.config.rtl,\n      selectedAttraction: 0.14,\n      setGallerySize: true,\n      wrapAround: true\n    };\n  \n    function slideshow(el, args) {\n      this.el = el;\n      this.args = Object.assign({}, defaults, args);\n  \n      // Setup listeners as part of arguments\n      this.args.on = {\n        ready: this.init.bind(this),\n        change: this.slideChange.bind(this),\n        settle: this.afterChange.bind(this)\n      };\n  \n      if (this.args.childNav) {\n        this.childNavEls = this.args.childNav.querySelectorAll(productSelectors.thumb);\n        this.childNavLinks = this.args.childNav.querySelectorAll(productSelectors.links);\n        this.arrows = this.args.childNav.querySelectorAll(productSelectors.arrow);\n        if (this.childNavLinks.length) {\n          this.initChildNav();\n        }\n      }\n  \n      if (this.args.avoidReflow) {\n        avoidReflow(el);\n      }\n  \n      this.slideshow = new Flickity(el, this.args);\n  \n      if (this.args.autoPlay) {\n        var wrapper = el.closest(selectors.wrapper);\n        this.pauseBtn = wrapper.querySelector(selectors.pauseButton);\n        if (this.pauseBtn) {\n          this.pauseBtn.addEventListener('click', this._togglePause.bind(this));\n        }\n      }\n  \n      // Reset dimensions on resize\n      window.on('resize', theme.utils.debounce(300, function() {\n        this.resize();\n      }.bind(this)));\n  \n      // Set flickity-viewport height to first element to\n      // avoid awkward page reflows while initializing.\n      // Must be added in a `style` tag because element does not exist yet.\n      // Slideshow element must have an ID\n      function avoidReflow(el) {\n        if (!el.id) return;\n        var firstChild = el.firstChild;\n        while(firstChild != null && firstChild.nodeType == 3){ // skip TextNodes\n          firstChild = firstChild.nextSibling;\n        }\n        var style = document.createElement('style');\n        style.innerHTML = `#${el.id} .flickity-viewport{height:${firstChild.offsetHeight}px}`;\n        document.head.appendChild(style);\n      }\n    }\n  \n    slideshow.prototype = Object.assign({}, slideshow.prototype, {\n      init: function(el) {\n        this.currentSlide = this.el.querySelector(selectors.currentSlide);\n  \n        // Optional onInit callback\n        if (this.args.callbacks && this.args.callbacks.onInit) {\n          if (typeof this.args.callbacks.onInit === 'function') {\n            this.args.callbacks.onInit(this.currentSlide);\n          }\n        }\n  \n        if (window.AOS) { AOS.refresh() }\n      },\n  \n      slideChange: function(index) {\n        // Outgoing fade styles\n        if (this.args.fade && this.currentSlide) {\n          this.currentSlide.classList.add(classes.animateOut);\n          this.currentSlide.addEventListener('transitionend', function() {\n            this.currentSlide.classList.remove(classes.animateOut);\n          }.bind(this));\n        }\n  \n        // Match index with child nav\n        if (this.args.childNav) {\n          this.childNavGoTo(index);\n        }\n  \n        // Optional onChange callback\n        if (this.args.callbacks && this.args.callbacks.onChange) {\n          if (typeof this.args.callbacks.onChange === 'function') {\n            this.args.callbacks.onChange(index);\n          }\n        }\n  \n        // Show/hide arrows depending on selected index\n        if (this.arrows && this.arrows.length) {\n          this.arrows[0].classList.toggle('hide', index === 0);\n          this.arrows[1].classList.toggle('hide', index === (this.childNavLinks.length - 1));\n        }\n      },\n      afterChange: function(index) {\n        // Remove all fade animation classes after slide is done\n        if (this.args.fade) {\n          this.el.querySelectorAll(selectors.allSlides).forEach(slide => {\n            slide.classList.remove(classes.animateOut);\n          });\n        }\n  \n        this.currentSlide = this.el.querySelector(selectors.currentSlide);\n  \n        // Match index with child nav (in case slider height changed first)\n        if (this.args.childNav) {\n          this.childNavGoTo(this.slideshow.selectedIndex);\n        }\n      },\n      destroy: function() {\n        if (this.args.childNav && this.childNavLinks.length) {\n          this.childNavLinks.forEach(a => {\n            a.classList.remove(classes.isActive);\n          });\n        }\n        this.slideshow.destroy();\n      },\n      reposition: function() {\n        this.slideshow.reposition();\n      },\n      _togglePause: function() {\n        if (this.pauseBtn.classList.contains(classes.isPaused)) {\n          this.pauseBtn.classList.remove(classes.isPaused);\n          this.slideshow.playPlayer();\n        } else {\n          this.pauseBtn.classList.add(classes.isPaused);\n          this.slideshow.pausePlayer();\n        }\n      },\n      resize: function() {\n        this.slideshow.resize();\n      },\n      play: function() {\n        this.slideshow.playPlayer();\n      },\n      pause: function() {\n        this.slideshow.pausePlayer();\n      },\n      goToSlide: function(i) {\n        this.slideshow.select(i);\n      },\n      setDraggable: function(enable) {\n        this.slideshow.options.draggable = enable;\n        this.slideshow.updateDraggable();\n      },\n  \n      initChildNav: function() {\n        this.childNavLinks[this.args.initialIndex].classList.add('is-active');\n  \n        // Setup events\n        this.childNavLinks.forEach((link, i) => {\n          // update data-index because image-set feature may be enabled\n          link.setAttribute('data-index', i);\n  \n          link.addEventListener('click', function(evt) {\n            evt.preventDefault();\n            this.goToSlide(this.getChildIndex(evt.currentTarget))\n          }.bind(this));\n          link.addEventListener('focus', function(evt) {\n            this.goToSlide(this.getChildIndex(evt.currentTarget))\n          }.bind(this));\n          link.addEventListener('keydown', function(evt) {\n            if (evt.keyCode === 13) {\n              this.goToSlide(this.getChildIndex(evt.currentTarget))\n            }\n          }.bind(this));\n        });\n  \n        // Setup optional arrows\n        if (this.arrows.length) {\n          this.arrows.forEach(arrow => {\n            arrow.addEventListener('click', this.arrowClick.bind(this));\n          });;\n        }\n      },\n  \n      getChildIndex: function(target) {\n        return parseInt(target.dataset.index);\n      },\n  \n      childNavGoTo: function(index) {\n        this.childNavLinks.forEach(a => {\n          a.blur();\n          a.classList.remove(classes.isActive);\n        });\n  \n        var el = this.childNavLinks[index];\n        el.classList.add(classes.isActive);\n  \n        if (!this.args.childNavScroller) {\n          return;\n        }\n  \n        if (this.args.childVertical) {\n          var elTop = el.offsetTop;\n          this.args.childNavScroller.scrollTop = elTop - 100;\n        } else {\n          var elLeft = el.offsetLeft;\n          this.args.childNavScroller.scrollLeft = elLeft - 100;\n        }\n      },\n  \n      arrowClick: function(evt) {\n        if (evt.currentTarget.classList.contains('product__thumb-arrow--prev')) {\n          this.slideshow.previous();\n        } else {\n          this.slideshow.next();\n        }\n      }\n    });\n  \n    return slideshow;\n  })();\n  \n  /*============================================================================\n    VariantAvailability\n    - Cross out sold out or unavailable variants\n    - To disable, set dynamicVariantsEnable to false in theme.liquid\n    - Required markup:\n      - class=variant-input-wrap to wrap select or button group\n      - class=variant-input to wrap button/label\n  ==============================================================================*/\n  \n  theme.VariantAvailability = (function() {\n    var classes = {\n      disabled: 'disabled'\n    };\n  \n    function availability(args) {\n      this.type = args.type;\n      this.variantsObject = args.variantsObject;\n      this.currentVariantObject = args.currentVariantObject;\n      this.container = args.container;\n      this.namespace = args.namespace;\n  \n      this.init();\n    }\n  \n    availability.prototype = Object.assign({}, availability.prototype, {\n      init: function() {\n        this.container.on('variantChange' + this.namespace, this.setAvailability.bind(this));\n  \n        // Set default state based on current selected variant\n        this.setInitialAvailability();\n      },\n  \n      // Create a list of all options. If any variant exists and is in stock with that option, it's considered available\n      createAvailableOptionsTree(variants, currentlySelectedValues, selectedVariant, lastSelectedIndex, lastSelectedValue) {\n        // Reduce variant array into option availability tree\n        return variants.reduce((options, variant) => {\n  \n          const numberOfOptionTypes = variant.options.length;\n  \n          // Check each option group (e.g. option1, option2, option3) of the variant\n          Object.keys(options).forEach(index => {\n  \n            if (variant[index] === null) return;\n  \n            let entry = options[index].find(option => option.value === variant[index]);\n  \n            if (typeof entry === 'undefined') {\n              // If option has yet to be added to the options tree, add it\n              entry = {value: variant[index], soldOut: true}\n              options[index].push(entry);\n            }\n  \n            // Check how many selected option values match a variant\n            const countVariantOptionsThatMatchCurrent = currentlySelectedValues.reduce((count, {value, index}) => {\n              return variant[index] === value ? count + 1 : count;\n            },0)\n  \n            // Only enable an option if an available variant matches all but one current selected value\n            if (countVariantOptionsThatMatchCurrent >= currentlySelectedValues.length - 1) {\n              entry.soldOut = entry.soldOut && variant.available ? false : entry.soldOut;\n            }\n  \n            // Make sure if a variant is non-existant or sold out, disable currently selected option\n            if (\n              (!selectedVariant || !selectedVariant.available)\n              && currentlySelectedValues.find((option) => option.value === entry.value && index === option.index)\n            ) {\n                entry.soldOut = true;\n            }\n  \n            // Option1 inputs should always remain enabled based on all available variants\n            if (index === 'option1') {\n              entry.soldOut = entry.soldOut && variant.available ? false : entry.soldOut;\n            }\n          })\n  \n          return options;\n        }, { option1: [], option2: [], option3: []})\n      },\n  \n      setInitialAvailability: function() {\n        this.container.querySelectorAll('.variant-input-wrap').forEach(group => {\n          this.disableVariantGroup(group);\n        });\n  \n        const currentlySelectedValues = this.currentVariantObject.options.map((value,index) => {return {value, index: `option${index+1}`}})\n        const initialOptions = this.createAvailableOptionsTree(this.variantsObject, currentlySelectedValues, this.currentVariantObject);\n  \n        for (var [option, values] of Object.entries(initialOptions)) {\n          this.manageOptionState(option, values);\n        }\n      },\n  \n      setAvailability: function(evt) {\n  \n        const {value: lastSelectedValue, index: lastSelectedIndex, currentlySelectedValues, variant} = evt.detail;\n  \n        // Object to hold all options by value.\n        // This will be what sets a button/dropdown as\n        // sold out or unavailable (not a combo set as purchasable)\n        const valuesToManage = this.createAvailableOptionsTree(this.variantsObject, currentlySelectedValues, variant, lastSelectedIndex, lastSelectedValue)\n  \n        // Disable all options to start.\n        // If coming from a variant change event, do not disable\n        // options inside current index group\n        this.container.querySelectorAll('.variant-input-wrap').forEach(group => {\n          this.disableVariantGroup(group);\n        });\n  \n        // Loop through all option levels and send each\n        // value w/ args to function that determines to show/hide/enable/disable\n        for (var [option, values] of Object.entries(valuesToManage)) {\n          this.manageOptionState(option, values, lastSelectedValue);\n        }\n      },\n  \n      manageOptionState: function(option, values, selectedValue) {\n        var group = this.container.querySelector('.variant-input-wrap[data-index=\"'+ option +'\"]');\n  \n        // Loop through each option value\n        values.forEach(obj => {\n          this.enableVariantOption(group, obj, selectedValue);\n        });\n      },\n  \n      enableVariantOption: function(group, obj, selectedValue) {\n        // Selecting by value so escape it\n        var value = obj.value.replace(/([ #;&,.+*~\\':\"!^$[\\]()=>|\\/@])/g,'\\\\$1');\n  \n        if (this.type === 'dropdown') {\n          group.querySelector('option[value=\"'+ value +'\"]').disabled = false;\n        } else {\n          var buttonGroup = group.querySelector('.variant-input[data-value=\"'+ value +'\"]');\n          var input = buttonGroup.querySelector('input');\n          var label = buttonGroup.querySelector('label');\n  \n          // Variant exists - enable & show variant\n          input.classList.remove(classes.disabled);\n          label.classList.remove(classes.disabled);\n  \n          // Variant sold out - cross out option (remains selectable)\n          if (obj.soldOut) {\n            input.classList.add(classes.disabled);\n            label.classList.add(classes.disabled);\n          }\n        }\n      },\n  \n      disableVariantGroup: function(group) {\n        if (this.type === 'dropdown') {\n          group.querySelectorAll('option').forEach(option => {\n            option.disabled = true;\n          });\n        } else {\n          group.querySelectorAll('input').forEach(input => {\n            input.classList.add(classes.disabled);\n          });\n          group.querySelectorAll('label').forEach(label => {\n            label.classList.add(classes.disabled);\n          });\n        }\n      }\n  \n    });\n  \n    return availability;\n  })();\n  \n  // Video modal will auto-initialize for any anchor link that points to YouTube\n  // MP4 videos must manually be enabled with:\n  //   - .product-video-trigger--mp4 (trigger button)\n  //   - .product-video-mp4-sound video player element (cloned into modal)\n  //     - see media.liquid for example of this\n  theme.videoModal = function() {\n    var youtubePlayer;\n  \n    var videoHolderId = 'VideoHolder';\n    var selectors = {\n      youtube: 'a[href*=\"youtube.com/watch\"], a[href*=\"youtu.be/\"]',\n      mp4Trigger: '.product-video-trigger--mp4',\n      mp4Player: '.product-video-mp4-sound'\n    };\n  \n    var youtubeTriggers = document.querySelectorAll(selectors.youtube);\n    var mp4Triggers = document.querySelectorAll(selectors.mp4Trigger);\n  \n    if (!youtubeTriggers.length && !mp4Triggers.length) {\n      return;\n    }\n  \n    var videoHolderDiv = document.getElementById(videoHolderId);\n  \n    if (youtubeTriggers.length) {\n      theme.LibraryLoader.load('youtubeSdk');\n    }\n  \n    var modal = new theme.Modals('VideoModal', 'video-modal', {\n      closeOffContentClick: true,\n      bodyOpenClass: ['modal-open', 'video-modal-open'],\n      solid: true\n    });\n  \n    youtubeTriggers.forEach(btn => {\n      btn.addEventListener('click', triggerYouTubeModal);\n    });\n  \n    mp4Triggers.forEach(btn => {\n      btn.addEventListener('click', triggerMp4Modal);\n    });\n  \n    document.addEventListener('modalClose.VideoModal', closeVideoModal);\n  \n    function triggerYouTubeModal(evt) {\n      // If not already loaded, treat as normal link\n      if (!theme.config.youTubeReady) {\n        return;\n      }\n  \n      evt.preventDefault();\n      emptyVideoHolder();\n  \n      modal.open(evt);\n  \n      var videoId = getYoutubeVideoId(evt.currentTarget.getAttribute('href'));\n      youtubePlayer = new theme.YouTube(\n        videoHolderId,\n        {\n          videoId: videoId,\n          style: 'sound',\n          events: {\n            onReady: onYoutubeReady\n          }\n        }\n      );\n    }\n  \n    function triggerMp4Modal(evt) {\n      emptyVideoHolder();\n  \n      var el = evt.currentTarget;\n      var player = el.parentNode.querySelector(selectors.mp4Player);\n  \n      // Clone video element and place it in the modal\n      var playerClone = player.cloneNode(true);\n      playerClone.classList.remove('hide');\n  \n      videoHolderDiv.append(playerClone);\n      modal.open(evt);\n  \n      // Play new video element\n      videoHolderDiv.querySelector('video').play();\n    }\n  \n    function onYoutubeReady(evt) {\n      evt.target.unMute();\n      evt.target.playVideo();\n    }\n  \n    function getYoutubeVideoId(url) {\n      var regExp = /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*/;\n      var match = url.match(regExp);\n      return (match&&match[7].length==11)? match[7] : false;\n    }\n  \n    function emptyVideoHolder() {\n      videoHolderDiv.innerHTML = '';\n    }\n  \n    function closeVideoModal() {\n      if (youtubePlayer && typeof youtubePlayer.destroy === 'function') {\n        youtubePlayer.destroy();\n      } else {\n        emptyVideoHolder();\n      }\n    }\n  };\n  \n  \n  /*============================================================================\n    ToolTip\n  ==============================================================================*/\n  \n  class ToolTip extends HTMLElement {\n    constructor() {\n      super();\n      this.el = this;\n      this.inner = this.querySelector('[data-tool-tip-inner]');\n      this.closeButton = this.querySelector('[data-tool-tip-close]');\n      this.toolTipContent = this.querySelector('[data-tool-tip-content]');\n  \n      this.triggers = document.querySelectorAll('[data-tool-tip-trigger]');\n  \n      document.addEventListener('tooltip:open', e => {\n        this._open(e.detail.context, e.detail.content);\n      });\n    }\n  \n    _open(context, insertedHtml) {\n      this.toolTipContent.innerHTML = insertedHtml;\n  \n      theme.a11y.trapFocus({\n        container: this.el,\n        namespace: 'tooltip_focus'\n      });\n  \n      if (this.closeButton) {\n        this.closeButton.on('click' + '.tooltip-close', () => {\n          this._close();\n        });\n      }\n  \n      document.documentElement.on('click' + '.tooltip-outerclick', event => {\n        if (this.el.dataset.toolTipOpen === 'true' && !this.inner.contains(event.target)) this._close();\n      });\n  \n      document.documentElement.on('keydown' + '.tooltip-esc', event => {\n        if (event.code === 'Escape') this._close();\n      });\n  \n      this.el.dataset.toolTipOpen = true;\n      this.el.dataset.toolTip = context;\n    }\n  \n    _close() {\n      this.toolTipContent.innerHTML = '';\n      this.el.dataset.toolTipOpen = 'false';\n      this.el.dataset.toolTip = '';\n  \n      theme.a11y.removeTrapFocus({\n        container: this.el,\n        namespace: 'tooltip_focus'\n      });\n  \n      this.closeButton.off('click' + '.tooltip-close');\n      document.documentElement.off('click' + '.tooltip-outerclick');\n      document.documentElement.off('keydown' + '.tooltip-esc');\n    }\n  }\n  \n  customElements.define('tool-tip', ToolTip);\n  \n  /*============================================================================\n    ToolTipTrigger\n  ==============================================================================*/\n  \n  class ToolTipTrigger extends HTMLElement {\n    constructor() {\n      super();\n      this.el = this;\n      this.toolTipContent = this.querySelector('[data-tool-tip-content]');\n  \n      this.init();\n    }\n  \n    init() {\n      //Create and dispatch customEvent\n      const toolTipOpen = new CustomEvent('tooltip:open', {\n        detail: {\n          context: this.dataset.toolTip,\n          content: this.toolTipContent.innerHTML\n        },\n        bubbles: true\n      });\n  \n      this.el.addEventListener('click', e => {\n        e.stopPropagation();\n        this.dispatchEvent(toolTipOpen);\n      });\n    }\n  }\n  \n  customElements.define('tool-tip-trigger', ToolTipTrigger);\n  \n\n  theme.ProductScreen = (function() {\n    var originalTitle = document.title;\n    var namespace = 'productscreen';\n    var windowPosition = 0;\n    var page = document.getElementById('MainContent');\n  \n    var config = {\n      close: '.js-screen-close',\n      openClass: 'screen-layer--is-active',\n      closeSlideAnimate: ['screen-layer--is-sliding'],\n      bodyOpenClass: 'screen-layer-open',\n      bodyClosingClass: ['screen-layer-closing'],\n      bodyCloseAnimate: ['screen-layer-closing', 'screen-layer-animating'],\n      loaderStart: 200,\n      pullToCloseThreshold: -100\n    }\n  \n    function ProductScreen(id, name) {\n      this.id = id;\n      this.screen = document.getElementById(id);\n  \n      if (!this.screen) {\n        return;\n      }\n  \n      this.nodes = {\n        loader: document.getElementById('OverscrollLoader').querySelector('.icon-loader__path'),\n        screenContent: this.screen.querySelector('.screen-layer__inner'),\n        photoswipe: document.querySelector('.pswp')\n      };\n  \n      this.title = this.screen.dataset.productTitle;\n      this.openBtnClass = '.js-screen-open-' + name;\n  \n      this.initialized = false; // opened at least once\n      this.isOpen = false;\n      this.focusOnOpen = config.focusOnOpen ? this.screen.querySelector(config.focusOnOpen) : this.screen;\n  \n      this.init();\n    }\n  \n    ProductScreen.prototype = Object.assign({}, ProductScreen.prototype, {\n      init: function() {\n        var openBtns = document.querySelectorAll(this.openBtnClass);\n  \n        openBtns.forEach(btn => {\n          btn.setAttribute('aria-expanded', 'false');\n          btn.addEventListener('click', this.open.bind(this));\n        });\n  \n        var closeBtns = this.screen.querySelectorAll(config.close);\n        closeBtns.forEach(btn => {\n          btn.on('click.' + namespace, function(evt) {\n            this.close(false, { noAnimate: true, back: true });\n          }.bind(this));\n        });\n  \n        // Close screen if product added to sticky cart\n        if (theme.settings.cartType === 'sticky') {\n          document.addEventListener('ajaxProduct:added:' + this.id, function() {\n            theme.headerNav.toggleThumbMenu(false, true);\n            var args = { back: true };\n            this.close(false, args);\n          }.bind(this));\n  \n          document.addEventListener('ajaxProduct:error:' + this.id, function() {\n            if (this.initialized) {\n              this.open();\n            }\n          }.bind(this));\n        }\n      },\n  \n      open: function(evt, data) {\n        // Update reference to screen in case filters reloaded it\n        this.screen = document.getElementById(this.id);\n  \n        // Keep track if modal was opened from a click, or called by another function\n        var externalCall = false;\n        var args = {\n          updateCurrentPath: data ? data.updateCurrentPath : true\n        };\n  \n        if (this.isOpen) {\n          return;\n        }\n  \n        // Prevent following href if link is clicked\n        if (evt) {\n          evt.preventDefault();\n        } else {\n          externalCall = true;\n        }\n  \n        // Without this, the modal opens, the click event bubbles up to nodes.page\n        // which closes the modal.\n        if (evt && evt.stopPropagation) {\n          evt.stopPropagation();\n          // save the source of the click, we'll focus to this on close\n          this.activeSource = evt.currentTarget;\n        }\n  \n        if (this.isOpen && !externalCall) {\n          this.close();\n        }\n  \n        windowPosition = window.scrollY;\n  \n        theme.utils.prepareTransition(this.screen, function() {\n          this.screen.classList.add(config.openClass);\n        }.bind(this));\n  \n        document.documentElement.classList.add(config.bodyOpenClass);\n        document.body.classList.add(config.bodyOpenClass);\n        this.nodes.screenContent.scrollTo(0,0);\n        window.scrollTo(0,0);\n  \n        theme.a11y.trapFocus({\n          container: this.screen,\n          elementToFocus: this.focusOnOpen,\n          namespace: namespace\n        });\n  \n        if (this.activeSource && this.activeSource.hasAttribute('aria-expanded')) {\n          this.activeSource.setAttribute('aria-expanded', 'true');\n        }\n  \n        var newUrl = this.activeSource.dataset.url;\n  \n        document.dispatchEvent(new CustomEvent('productModalOpen.' + this.id));\n        document.dispatchEvent(new CustomEvent('newPopstate', {\n          detail: {\n            screen: this,\n            url: newUrl,\n            updateCurrentPath: args.updateCurrentPath\n          }\n        }));\n  \n        this.initialized = true;\n        this.isOpen = true;\n        document.title = this.title;\n  \n        // Trigger Google Analytics page view if enabled\n        if (window.ga) { ga('send', 'pageview', { page: newUrl }) }\n  \n        this.bindEvents();\n      },\n  \n      close: function(evt, args) {\n        var evtData = args ? args : (evt ? evt.data : null);\n        var goBack = evtData ? evtData.back : false;\n        var noAnimate = (evtData && evtData.noAnimate) ? true : false;\n        document.body.removeAttribute('style');\n        this.nodes.loader.style.strokeDashoffset = config.loaderStart;\n  \n        if (goBack) {\n          document.dispatchEvent(new CustomEvent('newPopstate', {\n            detail: {\n              screen: this,\n              back: true\n            }\n          }));\n        }\n  \n        var closeClass = noAnimate ? [] : config.closeSlideAnimate;\n        var bodyCloseClass = noAnimate ? config.bodyClosingClass : config.bodyCloseAnimate;\n  \n        // Don't close if already closed\n        if (!this.isOpen) {\n          return;\n        }\n  \n        // deselect any focused form elements\n        document.activeElement.blur();\n  \n        theme.utils.prepareTransition(this.screen, function() {\n          this.screen.classList.remove(config.openClass);\n          this.screen.classList.add(...closeClass);\n          this.screen.classList.remove('is-transitioning');\n        }.bind(this));\n  \n        document.documentElement.classList.remove(config.bodyOpenClass);\n        document.body.classList.remove(config.bodyOpenClass);\n        document.documentElement.classList.add(...bodyCloseClass);\n        document.body.classList.add(...bodyCloseClass);\n  \n        window.setTimeout(function() {\n          this.screen.classList.remove(...closeClass);\n          document.documentElement.classList.remove(...bodyCloseClass);\n          document.body.classList.remove(...bodyCloseClass);\n          window.scrollTo(0, windowPosition);\n        }.bind(this), 500); // duration of css animation\n  \n        theme.a11y.removeTrapFocus({\n          container: this.screen,\n          namespace: namespace\n        });\n  \n        if (this.activeSource && this.activeSource.hasAttribute('aria-expanded')) {\n          this.activeSource.setAttribute('aria-expanded', 'false');\n          this.activeSource.focus();\n        }\n  \n        document.dispatchEvent(new CustomEvent('productModalClose'));\n        document.dispatchEvent(new CustomEvent('productModalClose.' + this.id));\n  \n        window.scrollTo(0, windowPosition);\n  \n        this.isOpen = false;\n        document.title = originalTitle;\n  \n        if (window.ga) { ga('send', 'pageview') }\n  \n        this.unbindEvents();\n      },\n  \n      bindEvents: function() {\n        // Pressing escape closes modal, unless the photoswipe screen is open\n        window.on('keyup.' + namespace, function(evt) {\n          if (evt.keyCode === 27) {\n            if (this.nodes.photoswipe.classList.contains('pswp--open')) {\n              return;\n            }\n            if (document.body.classList.contains('js-drawer-open')) {\n              return;\n            }\n  \n            this.close(false, { back: true });\n          }\n        }.bind(this));\n  \n        // If scrolling up while at top, close modal\n        var bgAmount = 0;\n        var loaderAmount = 0;\n  \n        window.on('touchmove.' + namespace, theme.utils.throttle(15, function() {\n          var pos = window.scrollY;\n          if (pos >= 0) {\n            return;\n          }\n  \n          bgAmount = -(pos/100);\n          document.body.style.background = 'rgba(0,0,0,' + bgAmount + ')';\n  \n          // stroke fills from 200-0 (0 = full)\n          loaderAmount = config.loaderStart + (pos * 2); // pos is negative number\n  \n          if (pos <= config.pullToCloseThreshold) {\n            loaderAmount = 0;\n          }\n  \n          this.nodes.loader.style.strokeDashoffset = loaderAmount;\n        }.bind(this)));\n  \n        window.on('touchend.' + namespace, function() {\n          var pos = window.scrollY;\n          if (pos < config.pullToCloseThreshold) {\n            var args = { back: true };\n            this.close(false, args);\n          }\n        }.bind(this));\n      },\n  \n      unbindEvents: function() {\n        window.off('keyup.' + namespace);\n        window.off('touchmove.' + namespace);\n        window.off('touchend.' + namespace);\n      }\n    });\n  \n    return ProductScreen;\n  })();\n  \n  /*\n    Quick shop modals, or product screens, live inside\n    product-grid-item markup until page load, where they're\n    moved to #ProductScreens at the bottom of the page\n   */\n  \n  theme.QuickShopScreens = (function() {\n    var startingUrl = window.location.pathname + window.location.search;\n    var currentPath = startingUrl;\n    var prevPath = null;\n    var currentScreen = null;\n    if ('scrollRestoration' in history) {\n      history.scrollRestoration = 'manual';\n    }\n  \n    var selectors = {\n      screensWrap: '#ProductScreens',\n      screens: '[data-product-id]',\n      trigger: '.quick-product__btn'\n    };\n  \n    var activeIds = [];\n  \n    function init(container) {\n      if (!theme.settings.quickView) {\n        return;\n      }\n  \n      var productIds = getProductIds();\n      initProductScreens(productIds);\n      initHistoryWatcher();\n    }\n  \n    function initHistoryWatcher() {\n      // No need to adjust URL in the editor since it handles the navigation\n      if (Shopify.designMode) {\n        return;\n      }\n  \n      // Listen for product screens opening\n      document.addEventListener('newPopstate', function(evt) {\n        if (!evt.detail) {\n          return;\n        }\n  \n        var data = evt.detail;\n  \n        currentScreen = data.screen;\n        // Manually trigger back, comes from esc key or close btns\n        if (data.back) {\n          prevPath = location.pathname;\n          currentPath = startingUrl;\n          history.pushState({}, '', startingUrl);\n        }\n  \n        if (data.url) {\n          if (data.updateCurrentPath) {\n            prevPath = location.pathname;\n            currentPath = data.url;\n            history.pushState({}, '', data.url);\n          }\n        }\n      });\n  \n      window.addEventListener('popstate', function(evt) {\n        var goToUrl = false;\n        prevPath = currentPath;\n  \n        // Hash change or no change, let browser take over\n        if (location.pathname === currentPath) {\n          return;\n        }\n  \n        prevPath = currentPath;\n        currentPath = location.pathname;\n  \n        // Back to where we started. Close existing screen if open\n        if (location.pathname === startingUrl) {\n          if (currentScreen && currentScreen.isOpen) {\n            closeScreen(currentScreen);\n          }\n          return;\n        }\n  \n        // Opening product\n        if (location.pathname.indexOf('/products/') !== -1) {\n          if (currentScreen) {\n            currentScreen.open();\n          } else {\n            // No screen sent to function, trigger new click\n            var btn = document.querySelector('.quick-product__btn[href=\"'+ location.pathname +'\"]');\n            btn.dispatchEvent(new Event('click'), { updateCurrentPath: false });\n          }\n  \n          return;\n        }\n  \n        if (evt.originalEvent && evt.originalEvent.state) {\n          if (currentScreen && currentScreen.isOpen) {\n            closeScreen(currentScreen);\n            history.replaceState({}, '', startingUrl);\n            return;\n          }\n  \n          goToUrl = true;\n        } else {\n          if (currentScreen) {\n            if (currentScreen.isOpen) {\n              closeScreen(currentScreen);\n              return;\n            }\n          } else {\n            // No state/modal. Navigate to where browser wants\n            goToUrl = true;\n          }\n        }\n  \n        // Fallback if none of our conditions are met\n        if (goToUrl) {\n          window.location.href = location.href;\n        }\n      }.bind(this));\n    }\n  \n    function closeScreen(screen) {\n      screen.close();\n      currentScreen = null;\n      window.dispatchEvent(new Event('resize'));\n    }\n  \n    function getProductIds(scope) {\n      var ids = [];\n  \n      var triggers = scope ? scope.querySelectorAll(selectors.trigger) : document.querySelectorAll(selectors.trigger);\n  \n      triggers.forEach(trigger => {\n        var id = trigger.dataset.productId;\n  \n        // If another identical modal exists, remove from DOM\n        if (ids.indexOf(id) > -1) {\n          var duplicate = document.querySelector('.screen-layer--product[data-product-id=\"' + id + '\"]');\n          if (duplicate) {\n            duplicate.parentNode.removeChild(duplicate);\n          }\n          return;\n        }\n  \n        ids.push(id);\n      });\n  \n      return ids;\n    }\n  \n    function getIdsFromTriggers(triggers) {\n      var ids = [];\n  \n      triggers.forEach(trigger => {\n        var id = trigger.dataset.productId;\n        ids.push(id);\n      });\n  \n      return ids;\n    }\n  \n    function initProductScreens(ids) {\n      var screenId;\n      var screenLayer;\n      var screens = document.createDocumentFragment();\n  \n      // Init screens if they're not duplicates\n      for (var i = 0; i < ids.length; i++) {\n        if (activeIds.indexOf(ids[i]) === -1) {\n          screenId = 'ProductScreen-' + ids[i];\n          screenLayer = document.getElementById(screenId);\n  \n          if (screenLayer) {\n            screens.appendChild(screenLayer);\n            activeIds.push(ids[i]);\n          }\n        }\n      }\n  \n      // Append screens to bottom of page\n      document.querySelector(selectors.screensWrap).appendChild(screens);\n  \n      // Init active screens once they're appended\n      for (var i = 0; i < activeIds.length; i++) {\n        screenId = 'ProductScreen-' + activeIds[i];\n        new theme.ProductScreen(screenId, 'product-' + activeIds[i]);\n      }\n    }\n  \n    // Section unloaded in theme editor.\n    // Check if product exists in any other area\n    // of the page, remove other's section.instance\n    function unload(container) {\n      if (!theme.settings.quickView) {\n        return;\n      }\n  \n      var removeIds = [];\n      var productIds = getProductIds(container);\n  \n      // Get ids from buttons not in removed section\n      var activeButtons = document.querySelectorAll(selectors.trigger);\n      var stillActiveIds = getIdsFromTriggers(activeButtons);\n  \n      // If ID exists on active button, do not add to IDs to remove\n      for (var i = 0; i < productIds.length; i++) {\n        var id = productIds[i];\n        if (stillActiveIds.indexOf(id) === -1) {\n          removeIds.push(id);\n        }\n      }\n  \n      for (var i = 0; i < removeIds.length; i++) {\n        sections._removeInstance(removeIds[i]);\n      }\n    }\n  \n    // Section container is sent, so must re-scrape for product IDs\n    function reInit(container) {\n      if (!theme.settings.quickView) {\n        return;\n      }\n  \n      var newProductIds = getProductIds(container);\n      removeDuplicateModals(newProductIds, container);\n      initProductScreens(newProductIds);\n  \n      // Re-register product templates in quick view modals.\n      // Will not double-register.\n      var screens = document.getElementById('ProductScreens');\n      theme.sections.register('product-template', theme.Product, screens);\n    }\n  \n    function removeDuplicateModals(ids, container) {\n      for (var i = 0; i < ids.length; i++) {\n        var duplicate = container.querySelector('.screen-layer--product[data-product-id=\"' + ids[i] + '\"]');\n        if (duplicate) {\n          duplicate.parentNode.removeChild(duplicate);\n        }\n      }\n    }\n  \n    return {\n      init: init,\n      unload: unload,\n      reInit: reInit\n    };\n  })();\n  \n  theme.HoverProductGrid = (function() {\n    var selectors = {\n      product: '.grid-product',\n      slider: '.product-slider',\n    };\n  \n    function HoverProductGrid(container) {\n      this.container = container;\n      this.sectionId = this.container.getAttribute('data-section-id');\n      this.namespace = '.product-image-slider-' + this.sectionId;\n      this.activeIds = [];\n      this.allSliders = {};\n  \n      if (!theme.settings.hoverProductGrid) {\n        return;\n      }\n  \n      this.products = container.querySelectorAll(selectors.product);\n      this.slidersMobile = (container.dataset.productSlidersMobile === 'true');\n  \n      // No products means no sliders\n      if (this.products.length === 0) {\n        return;\n      }\n  \n      this.init();\n    }\n  \n    HoverProductGrid.prototype = Object.assign({}, HoverProductGrid.prototype, {\n      init: function() {\n        this.destroyAllSliders();\n        this.setupEventType();\n        this.listnerSetup();\n      },\n  \n      setupEventType: function() {\n        this.products.forEach(prod => {\n          prod.off('mouseenter' + this.namespace);\n          prod.off('mouseout' + this.namespace);\n        });\n  \n        window.off('scroll' + this.namespace);\n  \n        if (theme.config.bpSmall) {\n          if (this.slidersMobile) {\n            this.inViewSliderInit();\n          }\n        } else {\n          this.mouseSliderInit();\n        }\n      },\n  \n      listnerSetup: function() {\n        document.addEventListener('matchSmall', function() {\n          this.destroyAllSliders();\n          this.setupEventType();\n        }.bind(this));\n        document.addEventListener('unmatchSmall', function() {\n          this.destroyAllSliders();\n          this.setupEventType();\n        }.bind(this));\n      },\n  \n      inViewSliderInit: function() {\n        this.products.forEach(prod => {\n          var observer = new IntersectionObserver((entries, observer) => {\n            entries.forEach(entry => {\n              var slider = prod.querySelector(selectors.slider);\n              if (theme.config.bpSmall) {\n                if (entry.isIntersecting) {\n                  this.initSlider(slider);\n                } else {\n                  this.destroySlider(slider);\n                }\n              }\n            });\n          }, {threshold: 1});\n  \n          observer.observe(prod);\n        });\n      },\n  \n      mouseSliderInit: function() {\n        this.products.forEach(prod => {\n          var slider = prod.querySelector(selectors.slider);\n  \n          prod.on('mouseenter' + this.namespace, function() {\n            this.initSlider(slider);\n          }.bind(this));\n  \n          prod.on('mouseleave' + this.namespace, function(evt) {\n            this.destroySlider(slider);\n          }.bind(this));\n        });\n      },\n  \n      initSlider: function(slider) {\n        if (!slider.dataset || slider.dataset.imageCount < 2) {\n          return;\n        }\n  \n        if (this.activeIds.indexOf(slider.dataset.id) !== -1) {\n          return;\n        }\n  \n        slider.classList.add('product-slider--init');\n        this.allSliders[slider.dataset.id] = new theme.Slideshow(slider, {\n          autoPlay: 1050,\n          fade: true,\n          avoidReflow: true\n        });\n  \n        this.activeIds.push(slider.dataset.id);\n      },\n  \n      destroySlider: function(slider) {\n        if (!slider.dataset || slider.dataset.imageCount < 2) {\n          return;\n        }\n  \n        var alreadyActive = this.activeIds.indexOf(slider.dataset.id);\n        if (alreadyActive !== -1) {\n          this.activeIds.splice(alreadyActive, 1);\n  \n          var flickity = this.allSliders[slider.dataset.id];\n          if (flickity && typeof flickity.destroy === 'function') {\n            flickity.destroy();\n          }\n        }\n      },\n  \n      destroyAllSliders: function() {\n        this.products.forEach(prod => {\n          var slider = prod.querySelector(selectors.slider);\n          this.destroySlider(slider);\n        });\n      }\n    });\n  \n    return HoverProductGrid;\n  })();\n  \n  theme.slideNav = (function() {\n  \n    var selectors = {\n      container: '#PageContainer',\n      navWrapper: '.slide-nav__overflow',\n      nav: '#SlideNav',\n      toggleBtn: '.js-toggle-slide-nav',\n      subNavToggleBtn: '.js-toggle-submenu',\n      thumbNavToggle: '.site-nav__thumb-button'\n    };\n  \n    var classes = {\n      subNavLink: 'slide-nav__sublist-link',\n      return: 'slide-nav__return-btn',\n      isActive: 'is-active',\n      isOpen: 'js-menu--is-open',\n      subNavShowing: 'sub-nav--is-open',\n      thirdNavShowing: 'third-nav--is-open'\n    };\n  \n    var namespace = '.slideNav';\n  \n    var isTransitioning;\n    var activeSubNav;\n    var activeTrigger;\n    var pageSlide = true;\n    var menuLevel = 1;\n    var container;\n    var navWrapper;\n    var toggleBtns;\n    var subNavToggleBtns;\n    var activeMenuToggle = null;\n  \n    function init() {\n      var thumbNavToggle = document.querySelector(selectors.thumbNavToggle);\n      if (thumbNavToggle) {\n        pageSlide = false;\n      }\n  \n      container = document.querySelector(selectors.container);\n      navWrapper = document.querySelector(selectors.navWrapper);\n  \n      toggleBtns = document.querySelectorAll(selectors.toggleBtn);\n      subNavToggleBtns = document.querySelectorAll(selectors.subNavToggleBtn);\n  \n      toggleBtns.forEach(btn => {\n        btn.on('click' + namespace, toggleNav);\n      });\n  \n      subNavToggleBtns.forEach(btn => {\n        btn.on('click' + namespace, toggleSubNav);\n      });\n    }\n  \n    function toggleNav(evt) {\n      activeMenuToggle = evt.currentTarget;\n      if (activeMenuToggle.classList.contains(classes.isActive)) {\n        closeNav();\n      } else {\n        openNav();\n      }\n    }\n  \n    function openNav(evt) {\n      toggleBtns.forEach(btn => {\n        btn.classList.add(classes.isActive);\n      });\n  \n      theme.utils.prepareTransition(navWrapper, function() {\n        navWrapper.classList.add(classes.isOpen);\n      });\n  \n      if (pageSlide) {\n        var navWrapperHeight = document.querySelector(selectors.navWrapper).clientHeight;\n        container.style.transform = 'translate3d(0, ' + navWrapperHeight + 'px, 0)';\n      }\n  \n      navWrapper.setAttribute('tabindex', '-1');\n      navWrapper.focus();\n  \n      // close on escape\n      window.on('keyup' + namespace, function(evt) {\n        if (evt.keyCode === 27) {\n          closeNav();\n        }\n      });\n    }\n  \n    function closeNav() {\n      toggleBtns.forEach(btn => {\n        btn.classList.remove(classes.isActive);\n      });\n  \n      theme.utils.prepareTransition(navWrapper, function() {\n        navWrapper.classList.remove(classes.isOpen);\n      });\n  \n      if (pageSlide) {\n        container.removeAttribute('style');\n      }\n  \n      activeMenuToggle.focus();\n      activeMenuToggle = null;\n  \n      window.off('keyup' + namespace);\n    }\n  \n    function toggleSubNav(evt) {\n      if (isTransitioning) {\n        return;\n      }\n  \n      var toggleBtn = evt.currentTarget;\n      var isReturn = toggleBtn.classList.contains(classes.return);\n      isTransitioning = true;\n  \n      if (isReturn) {\n        // Close all subnavs by removing active class on buttons\n        var btns = document.querySelectorAll(selectors.subNavToggleBtn + '[data-level=\"' + (menuLevel - 1) + '\"]');\n        btns.forEach(btn => {\n          btn.classList.remove(classes.isActive);\n        });\n  \n        var menus = document.querySelectorAll('.slide-nav__dropdown[data-level=\"' + (menuLevel) + '\"]');\n        menus.forEach(menu => {\n          theme.utils.prepareTransition(menu, function() {\n            menu.classList.remove(classes.isActive);\n          });\n        });\n  \n        if (activeTrigger) {\n          activeTrigger.classList.remove(classes.isActive);\n        }\n      } else {\n        toggleBtn.classList.add(classes.isActive);\n  \n        var dropdown = toggleBtn.nextElementSibling;\n        theme.utils.prepareTransition(dropdown, function() {\n          dropdown.classList.add(classes.isActive);\n        });\n      }\n  \n      activeTrigger = toggleBtn;\n  \n      goToSubnav(toggleBtn.dataset.target);\n    }\n  \n    function goToSubnav(target) {\n      var targetMenu = target\n        ? document.querySelector('.slide-nav__dropdown[data-parent=\"' + target + '\"]')\n        : document.querySelector(selectors.nav);\n  \n      menuLevel = targetMenu.dataset.level ? parseInt(targetMenu.dataset.level) : 1;\n  \n      activeSubNav = targetMenu;\n  \n      // Unused?\n      // var $elementToFocus = target\n      //   ? $targetMenu.find('.' + classes.subNavLink + ':first')\n      //   : $activeTrigger;\n  \n      var translateMenuHeight = targetMenu.clientHeight;\n  \n      var openNavClass =\n        menuLevel > 2 ? classes.thirdNavShowing : classes.subNavShowing;\n  \n      navWrapper.style.height = translateMenuHeight + 'px';\n      navWrapper.classList.remove(classes.thirdNavShowing);\n      navWrapper.classList.add(openNavClass);\n  \n      if (!target) {\n        // Show top level nav\n        navWrapper.classList.remove(classes.thirdNavShowing);\n        navWrapper.classList.remove(classes.subNavShowing);\n      }\n  \n      isTransitioning = false;\n  \n      // Match height of subnav\n      if (pageSlide) {\n        container.style.transform = 'translate3d(0, ' + translateMenuHeight + 'px, 0)';\n      }\n    }\n  \n    function unload() {\n      window.off(namespace);\n    }\n  \n    return {\n      init: init,\n      unload: unload\n    };\n  })();\n  \n  window.onpageshow = function(evt) {\n    // Removes unload class when returning to cached page\n    if (evt.persisted) {\n      document.body.classList.remove('unloading');\n      document.querySelectorAll('.cart__checkout').forEach(el => {\n        el.classList.remove('btn--loading');\n      });\n      document.querySelectorAll('#StickySubmit').forEach(btn => {\n        btn.classList.remove('btn--loading');\n      });\n    }\n  \n    // Reset scroll position when coming from back button\n    var historyPage = event.persisted || (typeof window.performance != 'undefined' && window.performance.navigation && window.performance.navigation.type === 2);\n    if (historyPage) {\n      theme.resetScrollPosition();\n    }\n  };\n  \n  theme.resetScrollPosition = function() {\n    if (!theme.config.hasSessionStorage) { return; }\n    var pathName = document.location.pathname;\n  \n    if (sessionStorage['scrollPosition_' + pathName]) {\n      window.scrollTo(0, sessionStorage.getItem('scrollPosition_' + pathName));\n    }\n  };\n  \n  theme.storeScrollPositionOnUnload = function() {\n    if (!theme.config.hasSessionStorage) { return; }\n    var eventName = theme.config.isSafari ? 'pagehide' : 'beforeunload';\n  \n    window.addEventListener(eventName, function (event) {\n      var pos = window.scrollY;\n  \n      sessionStorage.setItem('scrollPosition_' + document.location.pathname, pos.toString());\n    });\n  };\n  \n  theme.pageTransitions = function() {\n    if (document.body.dataset.transitions === 'true') {\n  \n      // Hack test to fix Safari page cache issue.\n      // window.onpageshow doesn't always run when navigating\n      // back to the page, so the unloading class remains, leaving\n      // a white page. Setting a timeout to remove that class when leaving\n      // the page actually finishes running when they come back.\n      if (theme.config.isSafari) {\n        document.querySelectorAll('a').forEach(a => {\n          window.setTimeout(function() {\n            document.body.classList.remove('unloading');\n          }, 1200);\n        });\n      }\n  \n      // Add disable transition class to malito, anchor, and YouTube links\n      // Add disable transition class to various link types\n      document.querySelectorAll('a[href^=\"mailto:\"], a[href^=\"#\"], a[target=\"_blank\"], a[href*=\"youtube.com/watch\"], a[href*=\"youtu.be/\"], a[download]').forEach(el => {\n        el.classList.add('js-no-transition');\n      });\n  \n      document.querySelectorAll('a:not(.js-no-transition)').forEach(el => {\n        el.addEventListener('click', function(evt) {\n          if (evt.metaKey) return true;\n          var src = el.getAttribute('href');\n  \n          // Bail if it's a hash link\n          if(src.indexOf(location.pathname) >= 0 && src.indexOf('#') >= 0) {\n            return true;\n          }\n  \n          evt.preventDefault();\n          document.body.classList.add('unloading');\n          window.setTimeout(function() {\n            location.href = src;\n          }, 50);\n        });\n      });\n    }\n  };\n  \n  theme.headerNav = (function() {\n  \n    var selectors = {\n      wrapper: '.header-wrapper',\n      siteHeader: '.site-header',\n      logo: '.site-header__logo img',\n      navItems: '.site-nav__item',\n      navLinks: '.site-nav__link',\n      navLinksWithDropdown: '.site-nav__link--has-dropdown',\n      navDropdownLinks: '.site-nav__dropdown-link--second-level',\n      thumbMenu: '.site-nav__thumb-menu'\n    };\n  \n    var classes = {\n      hasDropdownClass: 'site-nav--has-dropdown',\n      hasSubDropdownClass: 'site-nav__deep-dropdown-trigger',\n      dropdownActive: 'is-focused',\n      stickyCartActive: 'body--sticky-cart-open',\n      overlayEnabledClass: 'header-wrapper--overlay',\n      overlayedClass: 'is-light',\n      thumbMenuInactive: 'site-nav__thumb-menu--inactive',\n      stickyClass: 'site-header--sticky',\n      overlayStickyClass: 'header-wrapper--sticky',\n      openTransitionClass: 'site-header--opening'\n    };\n  \n    var config = {\n      namespace: '.siteNav',\n      overlayHeader: false,\n      stickyActive: false,\n      forceStickyOnMobile: false,\n      forceCloseThumbNav: false\n    };\n  \n    // Elements used in resize functions, defined in init\n    var wrapper;\n    var siteHeader;\n  \n    function init() {\n      wrapper = document.querySelector(selectors.wrapper);\n      siteHeader = document.querySelector(selectors.siteHeader);\n  \n      // Reset config\n      theme.settings.overlayHeader = (siteHeader.dataset.overlay === 'true');\n      config.stickyActive = false;\n  \n      accessibleDropdowns();\n      var searchModal = new theme.Modals('SearchModal', 'search-modal', {\n        closeOffContentClick: false,\n        focusIdOnOpen: 'SearchModalInput'\n      });\n  \n      // One listener for all header-related resize and load functions\n      window.on('resize' + config.namespace, theme.utils.debounce(150, headerResize));\n      window.on('load' + config.namespace, headerLoad);\n  \n      // Determine type of header:\n        // desktop: sticky bar | sticky button | top only\n        // mobile: always sticky button\n      setHeaderStyle();\n  \n      // Sticky menu (bar or thumb) on scroll\n      window.on('scroll' + config.namespace, theme.utils.throttle(150, stickyMenuOnScroll));\n      // Make sure it fires after scrolling, to be safe and sure\n      // the height is properly set\n      window.on('scroll' + config.namespace, theme.utils.debounce(150, stickyMenuOnScroll));\n  \n      // Make sure sticky nav appears after header is reloaded in editor\n      if (Shopify.designMode) {\n        window.dispatchEvent(new Event('resize'));\n      }\n    }\n  \n    function headerLoad() {\n      resizeLogo();\n      initStickyThumbMenu();\n  \n      if (config.headerStyle === 'bar') {\n        initStickyBarMenu();\n      }\n    }\n  \n    function headerResize() {\n      resizeLogo();\n      setHeaderStyle();\n  \n      if (config.headerStyle === 'bar') {\n        stickyHeaderHeight();\n      }\n    }\n  \n    function setHeaderStyle() {\n      if (theme.config.bpSmall) {\n        config.headerStyle = 'button';\n      } else {\n        config.headerStyle = wrapper.dataset.headerStyle;\n      }\n  \n      config.stickyThreshold = config.headerStyle === 'button' ? 100 : 250;\n  \n      if (config.headerStyle !== 'button') {\n        toggleThumbMenu(false);\n      }\n    }\n  \n    function resizeLogo() {\n      document.querySelectorAll(selectors.logo).forEach(logo => {\n        var logoWidthOnScreen = logo.clientWidth;\n        var containerWidth = logo.closest('.header-item').clientWidth;\n  \n        // If image exceeds container, let's make it smaller\n        if (logoWidthOnScreen > containerWidth) {\n          logo.style.maxWidth = containerWidth;\n        }\n        else {\n          logo.removeAttribute('style')\n        }\n      });\n    }\n  \n    function accessibleDropdowns() {\n      var hasActiveDropdown = false;\n      var hasActiveSubDropdown = false;\n      var closeOnClickActive = false;\n  \n      // Touch devices open dropdown on first click, navigate to link on second\n      if (theme.config.isTouch) {\n        document.querySelectorAll(selectors.navLinksWithDropdown).forEach(el => {\n          el.on('touchend' + config.namespace, function(evt) {\n            var parent = evt.currentTarget.parentNode;\n            if (!parent.classList.contains(classes.dropdownActive)) {\n              evt.preventDefault();\n              closeDropdowns();\n              openFirstLevelDropdown(evt.currentTarget);\n            } else {\n              window.location.replace(evt.currentTarget.getAttribute('href'));\n            }\n          });\n        });\n      }\n  \n      // Open/hide top level dropdowns\n      document.querySelectorAll(selectors.navLinks).forEach(el => {\n        el.on('focusin' + config.namespace, accessibleMouseEvent);\n        el.on('mouseover' + config.namespace, accessibleMouseEvent);\n        el.on('mouseleave' + config.namespace, closeDropdowns);\n      });\n  \n      document.querySelectorAll(selectors.navDropdownLinks).forEach(el => {\n        if (theme.config.isTouch) {\n          el.on('touchend' + config.namespace, function(evt) {\n            var parent = evt.currentTarget.parentNode;\n  \n            // Open third level menu or go to link based on active state\n            if (parent.classList.contains(classes.hasSubDropdownClass)) {\n              if (!parent.classList.contains(classes.dropdownActive)) {\n                evt.preventDefault();\n                closeThirdLevelDropdown();\n                openSecondLevelDropdown(evt.currentTarget);\n              } else {\n                window.location.replace(evt.currentTarget.getAttribute('href'));\n              }\n            } else {\n              // No third level nav, go to link\n              window.location.replace(evt.currentTarget.getAttribute('href'));\n            }\n          });\n        }\n  \n        // Open/hide sub level dropdowns\n        el.on('focusin' + config.namespace, function(evt) {\n          closeThirdLevelDropdown();\n          openSecondLevelDropdown(evt.currentTarget, true);\n        })\n      });\n  \n      function accessibleMouseEvent(evt) {\n        if (hasActiveDropdown) {\n          closeSecondLevelDropdown();\n        }\n  \n        if (hasActiveSubDropdown) {\n          closeThirdLevelDropdown();\n        }\n  \n        openFirstLevelDropdown(evt.currentTarget);\n      }\n  \n      // Private dropdown functions\n      function openFirstLevelDropdown(el) {\n        var parent = el.parentNode;\n        if (parent.classList.contains(classes.hasDropdownClass)) {\n          parent.classList.add(classes.dropdownActive);\n          hasActiveDropdown = true;\n        }\n  \n        if (!theme.config.isTouch) {\n          if (!closeOnClickActive) {\n            var eventType = theme.config.isTouch ? 'touchend' : 'click';\n            closeOnClickActive = true;\n            document.documentElement.on(eventType + config.namespace, function() {\n              closeDropdowns();\n              document.documentElement.off(eventType + config.namespace);\n              closeOnClickActive = false;\n            }.bind(this));\n          }\n        }\n      }\n  \n      function openSecondLevelDropdown(el, skipCheck) {\n        var parent = el.parentNode;\n        if (parent.classList.contains(classes.hasSubDropdownClass) || skipCheck) {\n          parent.classList.add(classes.dropdownActive);\n          hasActiveSubDropdown = true;\n        }\n      }\n  \n      function closeDropdowns() {\n        closeSecondLevelDropdown();\n        closeThirdLevelDropdown();\n      }\n  \n      function closeSecondLevelDropdown() {\n        document.querySelectorAll(selectors.navItems).forEach(el => {\n          el.classList.remove(classes.dropdownActive)\n        });\n      }\n  \n      function closeThirdLevelDropdown() {\n        document.querySelectorAll(selectors.navDropdownLinks).forEach(el => {\n          el.parentNode.classList.remove(classes.dropdownActive);\n        });\n      }\n    }\n  \n    function initStickyBarMenu() {\n      var wrapWith = document.createElement('div');\n      wrapWith.classList.add('site-header-sticky');\n      theme.utils.wrap(siteHeader, wrapWith);\n  \n      // No need to set a height on wrapper if positioned absolutely already\n      if (theme.settings.overlayHeader) {\n        return;\n      }\n  \n      stickyHeaderHeight();\n      setTimeout(function() {\n        stickyHeaderHeight();\n  \n        // Don't let height get stuck on 0\n        var stickyHeader = document.querySelector('.site-header-sticky');\n        if (stickyHeader.offsetHeight === 0) {\n          setTimeout(function() {\n            window.dispatchEvent(new Event('resize'));\n          }, 500);\n        }\n      }, 200);\n    }\n  \n    function stickyHeaderHeight() {\n      var stickyHeader = document.querySelector('.site-header-sticky');\n      if (stickyHeader) {\n        var h = siteHeader.offsetHeight;\n        stickyHeader.style.height = h + 'px';\n      }\n    }\n  \n    function initStickyThumbMenu() {\n      if (document.body.classList.contains(classes.stickyCartActive)) {\n        return;\n      }\n  \n      if (theme.config.bpSmall && theme.template !== 'product') {\n        setTimeout(function() {\n          config.forceStickyOnMobile = true;\n          toggleThumbMenu(true);\n        }, 25);\n      }\n    }\n  \n    function stickyMenuOnScroll(evt) {\n      if (window.scrollY > config.stickyThreshold) {\n        if (config.forceStickyOnMobile) {\n          config.forceStickyOnMobile = false;\n        }\n  \n        if (config.stickyActive) {\n          return;\n        }\n  \n        if (config.headerStyle === 'button') {\n          toggleThumbMenu(true);\n        } else if (config.headerStyle === 'bar') {\n          toggleBarMenu(true);\n        }\n      } else {\n        // If menu is shown on mobile page load, do not\n        // automatically hide it when you start scrolling\n        if (config.forceStickyOnMobile) {\n          return;\n        }\n  \n        if (!config.stickyActive) {\n          return;\n        }\n  \n        if (config.headerStyle === 'button') {\n          if (!theme.config.bpSmall) {\n            toggleThumbMenu(false);\n          }\n        } else if (config.headerStyle === 'bar') {\n          toggleBarMenu(false);\n        }\n  \n        if (!theme.settings.overlayHeader) {\n          stickyHeaderHeight();\n        }\n      }\n    }\n  \n    function toggleThumbMenu(active, forceClose) {\n      // If forced close, will not open again until page refreshes\n      // because sticky nav is open\n      if (config.forceCloseThumbNav) {\n        return;\n      }\n  \n      // If thumb menu is open, do not hide menu button\n      var thumbBtn = document.querySelector('.slide-nav__overflow--thumb');\n      if (thumbBtn.classList.contains('js-menu--is-open')) {\n        return;\n      }\n  \n      const menuElement = document.querySelector(selectors.thumbMenu)\n      menuElement && menuElement.classList.toggle(classes.thumbMenuInactive, !active);\n  \n      config.stickyActive = active;\n      config.forceCloseThumbNav = forceClose;\n    }\n  \n    function toggleBarMenu(active) {\n      if (config.headerStyle !== 'bar') {\n        return;\n      }\n  \n      if (active) {\n        siteHeader.classList.add(classes.stickyClass);\n        if (theme.settings.overlayHeader) {\n          wrapper.classList.remove(classes.overlayedClass);\n          wrapper.classList.add(classes.overlayStickyClass);\n        }\n  \n        // Add open transition class after element is set to fixed\n        // so CSS animation is applied correctly\n        setTimeout(function() {\n          siteHeader.classList.add(classes.openTransitionClass);\n        }, 100);\n      } else {\n        siteHeader.classList.remove(classes.openTransitionClass);\n        siteHeader.classList.remove(classes.stickyClass);\n  \n        if (theme.settings.overlayHeader) {\n          wrapper.classList.add(classes.overlayedClass);\n          wrapper.classList.remove(classes.overlayStickyClass);\n        }\n      }\n  \n      config.stickyActive = active;\n    }\n  \n    // If the header setting to overlay the menu on the collection image\n    // is enabled but the collection setting is disabled, we need to undo\n    // the init of the sticky nav\n    function disableOverlayHeader() {\n      wrapper.classList.remove(config.overlayEnabledClass);\n      wrapper.classList.remove(config.overlayedClass);\n      theme.settings.overlayHeader = false;\n    }\n  \n    function unload() {\n      window.off(config.namespace);\n    }\n  \n    return {\n      init: init,\n      disableOverlayHeader: disableOverlayHeader,\n      toggleThumbMenu: toggleThumbMenu,\n      unload: unload\n    };\n  })();\n  \n  theme.articleImages = function() {\n    var wrappers = document.querySelectorAll('.rte--indented-images');\n  \n    if (!wrappers.length) {\n      return;\n    }\n  \n    wrappers.forEach(wrapper => {\n      wrapper.querySelectorAll('img').forEach(image => {\n        var attr = image.getAttribute('style');\n        // Check if undefined for float: none\n        if (!attr || attr == 'float: none;') {\n          // Remove grid-breaking styles if image is not wider than parent\n          if (image.width < wrapper.offsetWidth) {\n            image.classList.add('rte__no-indent');\n          }\n        }\n      });\n    });\n  };\n  \n  theme.customerTemplates = function() {\n    checkUrlHash();\n    initEventListeners();\n    resetPasswordSuccess();\n    customerAddressForm();\n  \n    function checkUrlHash() {\n      var hash = window.location.hash;\n  \n      // Allow deep linking to recover password form\n      if (hash === '#recover') {\n        toggleRecoverPasswordForm();\n      }\n    }\n  \n    function toggleRecoverPasswordForm() {\n      var passwordForm = document.getElementById('RecoverPasswordForm').classList.toggle('hide');\n      var loginForm = document.getElementById('CustomerLoginForm').classList.toggle('hide');\n    }\n  \n    function initEventListeners() {\n      // Show reset password form\n      var recoverForm = document.getElementById('RecoverPassword');\n      if (recoverForm) {\n        recoverForm.addEventListener('click', function(evt) {\n          evt.preventDefault();\n          toggleRecoverPasswordForm();\n        });\n      }\n  \n      // Hide reset password form\n      var hideRecoverPassword = document.getElementById('HideRecoverPasswordLink');\n      if (hideRecoverPassword) {\n        hideRecoverPassword.addEventListener('click', function(evt) {\n          evt.preventDefault();\n          toggleRecoverPasswordForm();\n        });\n      }\n    }\n  \n    function resetPasswordSuccess() {\n      var formState = document.querySelector('.reset-password-success');\n  \n      // check if reset password form was successfully submitted\n      if (!formState) {\n        return;\n      }\n  \n      // show success message\n      document.getElementById('ResetSuccess').classList.remove('hide');\n    }\n  \n    function customerAddressForm() {\n      var newAddressForm = document.getElementById('AddressNewForm');\n      var addressForms = document.querySelectorAll('.js-address-form');\n  \n      if (!newAddressForm || !addressForms.length) {\n        return;\n      }\n  \n      // Country/province selector can take a short time to load\n      setTimeout(function() {\n        document.querySelectorAll('.js-address-country').forEach(el => {\n          var countryId = el.dataset.countryId;\n          var provinceId = el.dataset.provinceId;\n          var provinceContainerId = el.dataset.provinceContainerId;\n  \n          new Shopify.CountryProvinceSelector(\n            countryId,\n            provinceId,\n            {\n              hideElement: provinceContainerId\n            }\n          );\n        });\n      }, 1000);\n  \n      // Toggle new/edit address forms\n      document.querySelectorAll('.address-new-toggle').forEach(el => {\n        el.addEventListener('click', function() {\n          newAddressForm.classList.toggle('hide');\n        });\n      });\n  \n      document.querySelectorAll('.address-edit-toggle').forEach(el => {\n        el.addEventListener('click', function(evt) {\n          var formId = evt.currentTarget.dataset.formId;\n          document.getElementById('EditAddress_' + formId).classList.toggle('hide');\n        });\n      });\n  \n      document.querySelectorAll('.address-delete').forEach(el => {\n        el.addEventListener('click', function(evt) {\n          var formId = evt.currentTarget.dataset.formId;\n          var confirmMessage = evt.currentTarget.dataset.confirmMessage;\n  \n          if (confirm(confirmMessage || 'Are you sure you wish to delete this address?')) {\n            if (Shopify) {\n              Shopify.postLink('/account/addresses/' + formId, {parameters: {_method: 'delete'}});\n            }\n          }\n        })\n      });\n    }\n  };\n  \n  theme.CartDrawer = (function() {\n    var selectors = {\n      drawer: '#CartDrawer',\n      form: '#CartDrawerForm'\n    };\n  \n    function CartDrawer() {\n      this.form = document.querySelector(selectors.form);\n      this.drawer = new theme.Drawers('CartDrawer', 'cart');\n  \n      this.init();\n    }\n  \n    CartDrawer.prototype = Object.assign({}, CartDrawer.prototype, {\n      init: function() {\n        this.cartForm = new theme.CartForm(this.form);\n        this.cartForm.buildCart();\n  \n        document.addEventListener('ajaxProduct:added', function(evt) {\n          document.body.classList.add('cart-has-items');\n          this.cartForm.buildCart();\n          this.open();\n        }.bind(this));\n  \n        // Dev-friendly way to open cart\n        document.addEventListener('cart:open', this.open.bind(this));\n        document.addEventListener('cart:close', this.close.bind(this));\n      },\n  \n      open: function() {\n        this.drawer.open();\n      },\n  \n      close: function() {\n        this.drawer.close();\n      }\n    });\n  \n    return CartDrawer;\n  })();\n  \n  theme.refreshCart = function() {\n    if (theme.settings.cartType === 'sticky' && theme.StickyCart) {\n      theme.cart.getCart().then(function(cart) {\n        theme.StickyCart.refresh(cart);\n      });\n    }\n  };\n  \n  theme.StickyCart = (function() {\n    var config = {\n      namespace: '.ajaxcart'\n    };\n  \n    var selectors = {\n      cart: '#StickyCart',\n      items: '#StickyItems',\n      subtotal: '#StickySubtotal',\n      submit: '#StickySubmit'\n    };\n  \n    var classes = {\n      cartTemplate: 'template-cart',\n      active: 'sticky-cart--open',\n      activeBodyClass: 'body--sticky-cart-open'\n    };\n  \n    function StickyCart() {\n      this.status = {\n        loaded: false,\n        loading: false,\n        open: document.body.classList.contains(classes.activeBodyClass)\n      };\n  \n      if (!document.querySelector(selectors.cart)) {\n        return;\n      }\n  \n      this.initEventListeners();\n    }\n  \n    function refresh(cart) {\n      if (document.body.classList.contains(classes.cartTemplate)) {\n        return;\n      }\n  \n      if (cart.item_count > 0) {\n        document.body.classList.add(classes.activeBodyClass);\n        document.querySelector(selectors.cart).classList.add(classes.active);\n      } else {\n        document.body.classList.remove(classes.activeBodyClass);\n        document.querySelector(selectors.cart).classList.remove(classes.active);\n      }\n  \n      document.querySelector(selectors.items).innerText = theme.strings.cartItems.replace('[count]', cart.item_count);\n      document.querySelector(selectors.subtotal).innerHTML = theme.Currency.formatMoney(cart.total_price, theme.settings.moneyFormat);\n    }\n  \n    StickyCart.prototype = Object.assign({}, StickyCart.prototype, {\n      initEventListeners: function() {\n        var submitBtn = document.querySelector(selectors.submit);\n        submitBtn.addEventListener('click', function() {\n          submitBtn.classList.add('btn--loading');\n        });\n  \n        document.addEventListener('ajaxProduct:added', function() {\n          this.hideCart();\n          theme.cart.getCart().then(function(cart) {\n            this.buildCart(cart, true);\n          }.bind(this));\n        }.bind(this));\n      },\n  \n      hideCart: function() {\n        document.body.classList.remove(classes.activeBodyClass);\n        document.querySelector(selectors.cart).classList.remove(classes.active);\n      },\n  \n      showCart: function(count, subtotal) {\n        if (count) {\n          document.querySelector(selectors.items).innerText = theme.strings.cartItems.replace('[count]', count);\n        }\n        if (subtotal) {\n          document.querySelector(selectors.subtotal).innerHTML = theme.Currency.formatMoney(subtotal, theme.settings.moneyFormat);\n        }\n  \n        document.body.classList.add(classes.activeBodyClass);\n        document.querySelector(selectors.cart).classList.add(classes.active);\n  \n        this.status.open = true;\n      },\n  \n      buildCart: function(cart, open) {\n        this.loading(true);\n  \n        this.status.loaded = true;\n        this.loading(false);\n  \n        // If specifically asked, open the cart (only happens after product added from form)\n        if (open === true) {\n          this.showCart(cart.item_count, cart.total_price);\n        }\n      },\n  \n      loading: function(state) {\n        this.status.loading = state;\n  \n        if (state) {\n          document.querySelector(selectors.cart).classList.add('is-loading');\n        } else {\n          document.querySelector(selectors.cart).classList.remove('is-loading');\n        }\n      },\n  \n      updateError: function(XMLHttpRequest) {\n        if (XMLHttpRequest.responseJSON && XMLHttpRequest.responseJSON.description) {\n          console.warn(XMLHttpRequest.responseJSON.description);\n        }\n      }\n    });\n  \n    return {\n      init: StickyCart,\n      refresh: refresh\n    }\n  })();\n  \n\n  theme.Product = (function() {\n    var videoObjects = {};\n  \n    var classes = {\n      onSale: 'sale-price',\n      disabled: 'disabled',\n      isModal: 'is-modal',\n      loading: 'loading',\n      loaded: 'loaded',\n      hidden: 'hide',\n      visuallyHide: 'visually-invisible',\n      thumbActive: 'thumb--current'\n    };\n  \n    var selectors = {\n      variantsJson: '[data-variant-json]',\n      currentVariantJson: '[data-current-variant-json]',\n  \n      imageContainer: '[data-product-images]',\n      mainSlider: '[data-product-photos]',\n      thumbSlider: '[data-product-thumbs]',\n      thumbScroller: '[data-product-thumbs-scroller]',\n      photo: '[data-product-photo]',\n      photoThumbs: '[data-product-thumb]',\n      photoThumbItem: '[data-product-thumb-item]',\n      zoomButton: '.product__photo-zoom',\n  \n      priceWrapper: '[data-price-wrapper]',\n      price: '[data-product-price]',\n      comparePrice: '[data-product-price-compare]',\n      priceA11y: '[data-price-a11y]',\n      comparePriceA11y: '[data-compare-a11y]',\n      sku: '[data-sku]',\n      inventory: '[data-product-inventory]',\n      incomingInventory: '[data-product-incoming-inventory]',\n      unitWrapper: '[data-product-unit-wrapper]',\n  \n      addToCart: '[data-add-to-cart]',\n      addToCartText: '[data-add-to-cart-text]',\n  \n      variantType: '.variant-wrapper',\n      originalSelectorId: '[data-product-select]',\n      singleOptionSelector: '[data-variant-input]',\n      variantColorSwatch: '[data-color-swatch]',\n  \n      productImageMain: '.product-image-main',\n      productVideo: '.product__video',\n      videoParent: '.product__video-wrapper',\n      slide: '.product-main-slide',\n      currentSlide: '.is-selected',\n      startingSlide: '.starting-slide',\n  \n      media: '[data-product-media-type-model]',\n      closeMedia: '.product-single__close-media',\n  \n      blocks: '[data-product-blocks]',\n      blocksHolder: '[data-blocks-holder]',\n      formContainer: '.product-single__form',\n      availabilityContainer: '[data-store-availability]'\n    };\n  \n    function Product(container) {\n      this.container = container;\n      this.sectionId = container.getAttribute('data-section-id')\n      this.productId = container.getAttribute('data-product-id')\n  \n      this.inModal = (container.dataset.modal === 'true');\n      this.modal;\n  \n      this.namespace = '.product-' + this.sectionId;\n      this.namespaceImages = '.product-image-' + this.sectionId;\n  \n      this.settings = {\n        enableHistoryState: (container.dataset.history === 'true') || false,\n        namespace: '.product-' + this.sectionId,\n        inventory: false,\n        inventoryThreshold: 10,\n        modalInit: false,\n        hasImages: true,\n        hasVideos: container.querySelectorAll(selectors.productVideo).length || false,\n        videoStyle: container.dataset.videoStyle,\n        has3d: false,\n        imageSetName: null,\n        imageSetIndex: null,\n        currentImageSet: null,\n        stackedImages: container.dataset.imagesStacked || false,\n        stackedCurrent: 0,\n        stackedImagePositions: [],\n        imageSize: '620x',\n        currentSlideIndex: 0,\n        videoLooping: container.dataset.videoLooping\n      };\n  \n      this.videos = {};\n  \n      // Overwrite some settings when loaded in modal\n      if (this.inModal) {\n        this.settings.enableHistoryState = false;\n        this.namespace = '.product-' + this.sectionId + '-modal';\n        this.modal = document.getElementById('ProductScreen-' + this.sectionId);\n      }\n  \n      this.init();\n    }\n  \n    Product.prototype = Object.assign({}, Product.prototype, {\n      init: function() {\n        this.mainSlider = this.container.querySelector(selectors.mainSlider);\n        this.thumbSlider = this.container.querySelector(selectors.thumbSlider);\n        this.firstProductImage = this.mainSlider.querySelector('img');\n  \n        if (!this.firstProductImage) {\n          this.settings.hasImages = false;\n        }\n  \n        var dataSetEl = this.mainSlider.querySelector('[data-set-name]');\n        this.settings.imageSetName = dataSetEl ? dataSetEl.dataset.setName : false;\n  \n        if (this.inModal) {\n          this.container.classList.add(classes.isModal);\n          document.removeEventListener('productModalOpen.ProductScreen-' + this.sectionId, this.openModalProduct.bind(this));\n          document.removeEventListener('productModalClose.ProductScreen-' + this.sectionId, this.openModalProduct.bind(this));\n          document.addEventListener('productModalOpen.ProductScreen-' + this.sectionId, this.openModalProduct.bind(this));\n          document.addEventListener('productModalClose.ProductScreen-' + this.sectionId, this.closeModalProduct.bind(this));\n        }\n  \n        if (!this.inModal) {\n          this.formSetup();\n          this.preImageSetup();\n          this.videoSetup();\n          this.initProductSlider();\n        }\n      },\n  \n      formSetup: function() {\n        this.initAjaxProductForm();\n        this.availabilitySetup();\n        this.initVariants();\n  \n        // We know the current variant now so setup image sets\n        if (this.settings.imageSetName) {\n          this.updateImageSet();\n        }\n      },\n  \n      availabilitySetup: function() {\n        var container = this.container.querySelector(selectors.availabilityContainer);\n        if (container) {\n          this.storeAvailability = new theme.StoreAvailability(container);\n        }\n      },\n  \n      initVariants: function() {\n        var variantJson = this.container.querySelector(selectors.variantsJson);\n  \n        if (!variantJson) {\n          return;\n        }\n  \n        this.variantsObject = JSON.parse(variantJson.innerHTML);\n  \n        var options = {\n          container: this.container,\n          enableHistoryState: this.settings.enableHistoryState,\n          singleOptionSelector: selectors.singleOptionSelector,\n          originalSelectorId: selectors.originalSelectorId,\n          variants: this.variantsObject\n        };\n  \n        var swatches = this.container.querySelectorAll(selectors.variantColorSwatch);\n  \n        if (swatches.length) {\n          swatches.forEach(swatch => {\n            swatch.addEventListener('change', function(evt) {\n              var color = swatch.dataset.colorName;\n              var index = swatch.dataset.colorIndex;\n              this.updateColorName(color, index);\n            }.bind(this))\n          });\n        }\n  \n        this.variants = new theme.Variants(options);\n  \n        // Product availability on page load\n        if (this.storeAvailability) {\n          var variant_id = this.variants.currentVariant ? this.variants.currentVariant.id : this.variants.variants[0].id;\n  \n          this.storeAvailability.updateContent(variant_id);\n          this.container.on('variantChange' + this.settings.namespace, this.updateAvailability.bind(this));\n        }\n  \n        this.container.on('variantChange' + this.namespace, this.updateCartButton.bind(this));\n        this.container.on('variantImageChange' + this.settings.namespace, this.updateVariantImage.bind(this));\n        this.container.on('variantPriceChange' + this.settings.namespace, this.updatePrice.bind(this));\n        this.container.on('variantUnitPriceChange' + this.settings.namespace, this.updateUnitPrice.bind(this));\n  \n        if (this.container.querySelectorAll(selectors.sku).length) {\n          this.container.on('variantSKUChange' + this.settings.namespace, this.updateSku.bind(this));\n        }\n  \n        var inventoryEl = this.container.querySelector(selectors.inventory);\n        if (inventoryEl) {\n          this.settings.inventory = true;\n          this.settings.inventoryThreshold = inventoryEl.dataset.threshold;\n          this.container.on('variantChange' + this.settings.namespace, this.updateInventory.bind(this));\n        }\n  \n        // Update individual variant availability on each selection\n        if (theme.settings.dynamicVariantsEnable) {\n          var currentVariantJson = this.container.querySelector(selectors.currentVariantJson);\n  \n          if (currentVariantJson) {\n            var variantType = this.container.querySelector(selectors.variantType);\n  \n            if (variantType) {\n              new theme.VariantAvailability({\n                container: this.container,\n                namespace: this.settings.namespace,\n                type: variantType.dataset.type,\n                variantsObject: this.variantsObject,\n                currentVariantObject: JSON.parse(currentVariantJson.innerHTML),\n                form: this.container.querySelector(selectors.formContainer)\n              });\n            }\n          }\n        }\n  \n        // image set names variant change listeners\n        if (this.settings.imageSetName) {\n          var variantWrapper = this.container.querySelector('.variant-input-wrap[data-handle=\"'+this.settings.imageSetName+'\"]');\n          if (variantWrapper) {\n            this.settings.imageSetIndex = variantWrapper.dataset.index;\n            this.container.on('variantChange' + this.settings.namespace, this.updateImageSet.bind(this))\n          } else {\n            this.settings.imageSetName = null;\n          }\n  \n          // Retrigger image sets after screen size change\n          window.on('resize' + this.namespaceImages, theme.utils.debounce(200, function(){\n            // Reset currentImageSet on desktop to hide\n            // unrelated stacked images.\n            // On mobile the slideshow initializes and\n            // automatically resets visible photos\n            if (!theme.config.bpSmall) {\n              this.settings.currentImageSet = null;\n            }\n            this.updateImageSet();\n          }.bind(this)));\n        }\n      },\n  \n      initAjaxProductForm: function() {\n        if (theme.settings.cartType === 'drawer' || theme.settings.cartType === 'sticky') {\n          var form = this.container.querySelector(selectors.formContainer);\n  \n          new theme.AjaxProduct(form, selectors.addToCart, {\n            scopedEventId: 'ProductScreen-' + this.sectionId\n          });\n        }\n      },\n  \n      /*============================================================================\n        Variant change methods\n      ==============================================================================*/\n      updateColorName: function(color, index) {\n        // Updates on radio button change, not variant.js\n        var label = this.container.querySelector('[data-color-label][data-color-label-index=\"'+index+'\"]');\n        if (label) {\n          label.textContent = color;\n        }\n      },\n  \n      updateCartButton: function(evt) {\n        var variant = evt.detail.variant;\n        var cartBtn = this.container.querySelector(selectors.addToCart);\n        var cartBtnText = this.container.querySelector(selectors.addToCartText);\n  \n        if (variant) {\n          if (variant.available) {\n            // Available, enable the submit button and change text\n            cartBtn.classList.remove(classes.disabled);\n            cartBtn.disabled = false;\n            var defaultText = cartBtnText.dataset.defaultText;\n            cartBtnText.textContent = defaultText;\n          } else {\n            // Sold out, disable the submit button and change text\n            cartBtn.classList.add(classes.disabled);\n            cartBtn.disabled = true;\n            cartBtnText.textContent = theme.strings.soldOut;\n          }\n        } else {\n          // The variant doesn't exist, disable submit button\n          cartBtn.classList.add(classes.disabled);\n          cartBtn.disabled = true;\n          cartBtnText.textContent = theme.strings.unavailable;\n        }\n      },\n  \n      updatePrice: function(evt) {\n        var variant = evt.detail.variant;\n  \n        if (variant) {\n          // Regular price\n          this.container.querySelector(selectors.price).innerHTML = theme.Currency.formatMoney(variant.price, theme.settings.moneyFormat);\n  \n          // Sale price, if necessary\n          if (variant.compare_at_price > variant.price) {\n            this.container.querySelector(selectors.comparePrice).innerHTML = theme.Currency.formatMoney(variant.compare_at_price, theme.settings.moneyFormat);\n            this.container.querySelector(selectors.priceWrapper).classList.remove(classes.hidden);\n            this.container.querySelector(selectors.price).classList.add(classes.onSale);\n            this.container.querySelector(selectors.comparePriceA11y).setAttribute('aria-hidden', 'false');\n            this.container.querySelector(selectors.priceA11y).setAttribute('aria-hidden', 'false');\n          } else {\n            this.container.querySelector(selectors.priceWrapper).classList.add(classes.hidden);\n            this.container.querySelector(selectors.price).classList.remove(classes.onSale);\n            this.container.querySelector(selectors.comparePriceA11y).setAttribute('aria-hidden', 'true');\n            this.container.querySelector(selectors.priceA11y).setAttribute('aria-hidden', 'true');\n          }\n        }\n      },\n  \n      updateUnitPrice: function(evt) {\n        var variant = evt.detail.variant;\n  \n        if (variant && variant.unit_price) {\n          var price = theme.Currency.formatMoney(variant.unit_price, theme.settings.moneyFormat);\n          var base = theme.Currency.getBaseUnit(variant);\n  \n          var el = this.container.querySelector(selectors.unitWrapper);\n          el.innerHTML = price + '/' + base;\n          el.classList.remove(...[classes.hidden, classes.visuallyHide]);\n        } else {\n          this.container.querySelector(selectors.unitWrapper).classList.add(classes.visuallyHide);\n        }\n      },\n  \n      imageSetArguments: function(variant) {\n        var variant = variant ? variant : (this.variants ? this.variants.currentVariant : null);\n        if (!variant) return;\n  \n        var setValue = this.settings.currentImageSet = this.getImageSetName(variant[this.settings.imageSetIndex]);\n        var set = this.settings.imageSetName + '_' + setValue;\n  \n        // Always start on index 0\n        this.settings.currentSlideIndex = 0;\n  \n        // Return object that adds cellSelector to mainSliderArgs\n        return {\n          cellSelector: '[data-group=\"'+set+'\"]',\n          imageSet: set,\n          initialIndex: this.settings.currentSlideIndex\n        }\n      },\n  \n      updateImageSet: function(evt, reload) {\n        // If called directly, use current variant\n        var variant = (evt && evt.detail) ? evt.detail.variant : (this.variants ? this.variants.currentVariant : null);\n        if (!variant) {\n          return;\n        }\n  \n        var setValue = this.getImageSetName(variant[this.settings.imageSetIndex]);\n        var set = this.settings.imageSetName + '_' + setValue;\n  \n        // Already on the current image group\n        if (this.settings.currentImageSet === setValue) {\n          return;\n        }\n  \n        if (!theme.config.bpSmall && this.settings.stackedImages) {\n          // Hide all thumbs and main images that are part of group\n          this.container.querySelectorAll('[data-group]').forEach(el => {\n            el.classList.add(classes.hidden);\n  \n            // Show if in group\n            if (el.dataset.group && el.dataset.group === set) {\n              el.classList.remove(classes.hidden);\n            }\n          });\n  \n          // reset stacked position\n          this.stackedImagePositions();\n          AOS.refresh();\n          this.settings.currentImageSet = setValue;\n          return;\n        } else {\n          // Reset image set visibility (required between breakpoints)\n          if (theme.config.bpSmall && this.settings.stackedImages) {\n            this.container.querySelectorAll('[data-group]').forEach(el => {\n              el.classList.remove(classes.hidden);\n            });\n          }\n  \n          this.initProductSlider(variant);\n        }\n      },\n  \n      // Show/hide thumbnails based on current image set\n      updateImageSetThumbs: function(set) {\n        if (!this.settings.stackedImages) {\n          this.thumbSlider.querySelectorAll('.product__thumb-item').forEach(thumb => {\n            thumb.classList.toggle(classes.hidden, thumb.dataset.group !== set);\n          });\n        }\n      },\n  \n      getImageSetName: function(string) {\n        return string.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/-$/, '').replace(/^-/, '');\n      },\n  \n      updateSku: function(evt) {\n        var variant = evt.detail.variant;\n        var newSku = '';\n        var hideSku = true;\n  \n        if (variant) {\n          if (variant.sku) {\n            newSku = variant.sku;\n            hideSku = false;\n          }\n  \n          this.container.querySelectorAll(selectors.sku).forEach(el => {\n            el.classList.toggle(classes.hidden, hideSku);\n            el.textContent = newSku;\n          });\n        }\n      },\n  \n      updateInventory: function(evt) {\n        var variant = evt.detail.variant;\n  \n        // Hide stock if no inventory management or policy is continue\n        if (!variant || !variant.inventory_management || variant.inventory_policy === 'continue') {\n          this.toggleInventoryQuantity(variant, false);\n          this.toggleIncomingInventory(false);\n          return;\n        }\n  \n        if (variant.inventory_management === 'shopify' && window.inventories && window.inventories[this.productId]) {\n          var variantInventoryObject = window.inventories[this.productId][variant.id];\n  \n          // Hide stock if policy is continue\n          if (variantInventoryObject.policy === 'continue') {\n            this.toggleInventoryQuantity(variant, false);\n            this.toggleIncomingInventory(false);\n            return;\n          }\n  \n          var quantity = variantInventoryObject.quantity;\n          var showInventory = true;\n          var showIncomingInventory = false;\n  \n          if (quantity <= 0 || quantity > this.settings.inventoryThreshold) {\n            showInventory = false;\n          }\n  \n          this.toggleInventoryQuantity(variant, showInventory, quantity);\n  \n          // Only show incoming inventory when:\n          // - inventory notice itself is hidden\n          // - have incoming inventory\n          // - current quantity is below theme setting threshold\n          if (!showInventory && variantInventoryObject.incoming === 'true' && quantity <= this.settings.inventoryThreshold) {\n            showIncomingInventory = true;\n          }\n  \n          this.toggleIncomingInventory(showIncomingInventory, variant.available, variantInventoryObject.next_incoming_date);\n        }\n      },\n  \n      updateAvailability: function(evt) {\n        var variant = evt.detail.variant;\n        if (!variant) {\n          return;\n        }\n  \n        this.storeAvailability.updateContent(variant.id);\n      },\n  \n      toggleInventoryQuantity: function(variant, show, qty) {\n        if (!this.settings.inventory) {\n          show = false;\n        }\n  \n        var el = this.container.querySelector(selectors.inventory);\n        var salesPoint = el.closest('.product-block');\n  \n        if (parseInt(qty) <= parseInt(this.settings.inventoryThreshold)) {\n          el.parentNode.classList.add('inventory--low')\n          el.textContent = theme.strings.stockLabel.replace('[count]', qty);\n        } else {\n          el.parentNode.classList.remove('inventory--low')\n          el.textContent = theme.strings.inStockLabel;\n        }\n  \n        if (variant && variant.available) {\n          el.parentNode.classList.remove(classes.hidden);\n          if (salesPoint) {\n            salesPoint.classList.remove(classes.hidden);\n          }\n        } else {\n          el.parentNode.classList.add(classes.hidden);\n          if (salesPoint) {\n            salesPoint.classList.add(classes.hidden);\n          }\n        }\n      },\n  \n      toggleIncomingInventory: function(show, available, date) {\n        var el = this.container.querySelector(selectors.incomingInventory);\n        var salesPoint = el.closest('.product-block');\n  \n        if (!el) {\n          return;\n        }\n  \n        var textEl = el.querySelector('.js-incoming-text');\n  \n        if (show) {\n          var string = available ?\n                       theme.strings.willNotShipUntil.replace('[date]', date) :\n                       theme.strings.willBeInStockAfter.replace('[date]', date);\n  \n          if (!date) {\n            string = theme.strings.waitingForStock;\n          }\n  \n          el.classList.remove(classes.hidden);\n          if (salesPoint) {\n            salesPoint.classList.remove(classes.hidden);\n          }\n          textEl.textContent = string;\n        } else {\n          el.classList.add(classes.hidden);\n        }\n      },\n  \n      /*============================================================================\n        Product videos\n      ==============================================================================*/\n      videoSetup: function() {\n        var productVideos = this.mainSlider.querySelectorAll(selectors.productVideo);\n  \n        // Stop if there are 0 videos\n        if (!productVideos.length) {\n          return false;\n        }\n  \n        productVideos.forEach(vid => {\n          var type = vid.dataset.videoType;\n          if (type === 'youtube') {\n            this.initYoutubeVideo(vid);\n          } else if (type === 'mp4') {\n            this.initMp4Video(vid);\n          }\n        });\n      },\n  \n      initYoutubeVideo: function(div) {\n        videoObjects[div.id] = new theme.YouTube(\n          div.id,\n          {\n            videoId: div.dataset.youtubeId,\n            videoParent: selectors.videoParent,\n            autoplay: false, // will handle this in callback\n            style: div.dataset.videoStyle,\n            loop: div.dataset.videoLoop,\n            events: {\n              onReady: this.youtubePlayerReady.bind(this),\n              onStateChange: this.youtubePlayerStateChange.bind(this)\n            }\n          }\n        );\n      },\n  \n      // Comes from YouTube SDK\n      // Get iframe ID with evt.target.getIframe().id\n      // Then access product video players with videoObjects[id]\n      youtubePlayerReady: function(evt) {\n        var iframeId = evt.target.getIframe().id;\n  \n        if (!videoObjects[iframeId]) {\n          // No youtube player data\n          return;\n        }\n  \n        var obj = videoObjects[iframeId];\n        var player = obj.videoPlayer;\n  \n        if (obj.options.style !== 'sound') {\n          player.mute();\n        }\n  \n        obj.parent.classList.remove('loading');\n        obj.parent.classList.add('loaded');\n  \n        // If we have an element, it is in the visible/first slide,\n        // and is muted, play it\n        if (this._isFirstSlide(iframeId) && obj.options.style !== 'sound') {\n          player.playVideo();\n        }\n      },\n  \n      _isFirstSlide: function(id) {\n        return this.mainSlider.querySelector(selectors.startingSlide + ' ' + '#' + id);\n      },\n  \n      youtubePlayerStateChange: function(evt) {\n        var iframeId = evt.target.getIframe().id;\n        var obj = videoObjects[iframeId];\n  \n        switch (evt.data) {\n          case -1: // unstarted\n            // Handle low power state on iOS by checking if\n            // video is reset to unplayed after attempting to buffer\n            if (obj.attemptedToPlay) {\n              obj.parent.classList.add('video-interactable');\n            }\n            break;\n          case 0: // ended\n            if (obj && obj.options.loop === 'true') {\n              obj.videoPlayer.playVideo();\n            }\n            break;\n          case 3: // buffering\n            obj.attemptedToPlay = true;\n            break;\n        }\n      },\n  \n      initMp4Video: function(div) {\n        videoObjects[div.id] = {\n          id: div.id,\n          type: 'mp4'\n        };\n  \n        if (this._isFirstSlide(div.id)) {\n          this.playMp4Video(div.id);\n        }\n      },\n  \n      stopVideos: function() {\n        for (var [id, vid] of Object.entries(videoObjects)) {\n          if (vid.videoPlayer) {\n            if (typeof vid.videoPlayer.stopVideo === 'function') {\n              vid.videoPlayer.stopVideo(); // YouTube player\n            }\n          } else if (vid.type === 'mp4') {\n            this.stopMp4Video(vid.id); // MP4 player\n          }\n        }\n      },\n  \n      _getVideoType: function(video) {\n        return video.getAttribute('data-video-type');\n      },\n  \n      _getVideoDivId: function(video) {\n        return video.id;\n      },\n  \n      playMp4Video: function(id) {\n        var player = this.container.querySelector('#' + id);\n        var playPromise = player.play();\n  \n        player.setAttribute('controls', '');\n        player.focus();\n  \n        // When existing focus on the element, go back to thumbnail\n        player.addEventListener('focusout', this.returnFocusToThumbnail.bind(this));\n  \n        if (playPromise !== undefined) {\n          playPromise.then(function() {\n            // Playing as expected\n          })\n          .catch(function(error) {\n            // Likely low power mode on iOS, show controls\n            player.setAttribute('controls', '');\n            player.closest(selectors.videoParent).setAttribute('data-video-style', 'unmuted');\n          });\n        }\n      },\n  \n      stopMp4Video: function(id) {\n        var player = this.container.querySelector('#' + id);\n        player.removeEventListener('focusout', this.returnFocusToThumbnail.bind(this));\n        if (player && typeof player.pause === 'function') {\n          player.removeAttribute('controls');\n          player.pause();\n        }\n      },\n  \n      returnFocusToThumbnail: function(evt) {\n        // Only return focus to active thumbnail if relatedTarget\n        // is a thumbnail, otherwise user may have clicked elsewhere on the page\n        if (evt.relatedTarget && evt.relatedTarget.classList.contains('product__thumb')) {\n          var thumb = this.container.querySelector('.product__thumb-item[data-index=\"'+ this.settings.currentSlideIndex +'\"] a');\n          if (thumb) {\n            thumb.focus();\n          }\n        }\n      },\n  \n      /*============================================================================\n        Product images\n      ==============================================================================*/\n      preImageSetup: function() {\n        this.setImageSizes();\n        this.initImageSwitch();\n        this.initImageZoom();\n        this.customMediaListners();\n        this.initModelViewerLibraries();\n        this.initShopifyXrLaunch();\n        theme.collapsibles.init(this.container);\n  \n        if (window.SPR) {SPR.initDomEls();SPR.loadBadges()}\n      },\n  \n      initProductSlider: function(variant) {\n        // Stop if only a single image, but add active class to first slide\n        if (this.mainSlider.querySelectorAll(selectors.slide).length <= 1) {\n          var slide = this.mainSlider.querySelector(selectors.slide);\n          if (slide) {\n            slide.classList.add('is-selected');\n          }\n          return;\n        }\n  \n        this.settings.has3d = this.container.querySelectorAll(selectors.media).length;\n  \n        if (this.settings.videoStyle !== 'muted') {\n          theme.videoModal(true);\n        }\n  \n        // If variant argument exists, slideshow is reinitializing because of the\n        // image set feature enabled and switching to a new group.\n        // currentSlideIndex\n        if (!variant) {\n          var activeSlide = this.mainSlider.querySelector(selectors.startingSlide);\n          this.settings.currentSlideIndex = this._slideIndex(activeSlide);\n        }\n  \n        var mainSliderArgs = {\n          adaptiveHeight: true,\n          avoidReflow: true,\n          initialIndex: this.settings.currentSlideIndex,\n          childNav: this.thumbSlider,\n          childNavScroller: this.container.querySelector(selectors.thumbScroller),\n          childVertical: this.thumbSlider.dataset.position === 'beside',\n          fade: this.settings.stackedImages ? false : true,\n          pageDots: true, // mobile only with CSS\n          wrapAround: true,\n          callbacks: {\n            onInit: this.onSliderInit.bind(this),\n            onChange: this.onSlideChange.bind(this)\n          }\n        };\n  \n        // Override default settings if image set feature enabled\n        if (this.settings.imageSetName) {\n          var imageSetArgs = this.imageSetArguments(variant);\n          mainSliderArgs = Object.assign({}, mainSliderArgs, imageSetArgs);\n          this.updateImageSetThumbs(mainSliderArgs.imageSet);\n        }\n  \n        this.initSliders(mainSliderArgs);\n  \n        // Re-init slider when a breakpoint is hit\n        document.addEventListener('matchSmall', function() {\n          this.initSliders(mainSliderArgs, true);\n        }.bind(this));\n        document.addEventListener('unmatchSmall', function() {\n          this.initSliders(mainSliderArgs, true);\n        }.bind(this));\n      },\n  \n      onSliderInit: function(slide) {\n        // If slider is initialized with image set feature active,\n        // initialize any videos/media when they are first slide\n        if (this.settings.imageSetName) {\n          this.prepMediaOnSlide(slide);\n        }\n  \n        // If height is 0, trigger resize to force height recalculation\n        var height = this.mainSlider.offsetHeight;\n        if (height === 0) {\n          setTimeout(function() {\n            window.dispatchEvent(new Event('resize'));\n          }, 250);\n        }\n      },\n  \n      onSlideChange: function(index) {\n        if (!this.flickity) return;\n  \n        var prevSlide = this.mainSlider.querySelector('.product-main-slide[data-index=\"'+this.settings.currentSlideIndex+'\"]');\n  \n        // If imageSetName exists, use a more specific selector\n        var nextSlide = this.settings.imageSetName ?\n                        this.mainSlider.querySelectorAll('.flickity-slider .product-main-slide')[index] :\n                        this.mainSlider.querySelector('.product-main-slide[data-index=\"'+index+'\"]');\n  \n        prevSlide.setAttribute('tabindex', '-1');\n        nextSlide.setAttribute('tabindex', 0);\n  \n        // Pause any existing slide video/media\n        this.stopMediaOnSlide(prevSlide);\n  \n        // Prep next slide video/media\n        this.prepMediaOnSlide(nextSlide);\n  \n        // Update current slider index\n        this.settings.currentSlideIndex = index;\n      },\n  \n      stopMediaOnSlide(slide) {\n        // Stop existing video\n        var video = slide.querySelector(selectors.productVideo);\n        if (video) {\n          var videoType = this._getVideoType(video);\n          var videoId = this._getVideoDivId(video);\n          if (videoType === 'youtube') {\n            if (videoObjects[videoId].videoPlayer) {\n              videoObjects[videoId].videoPlayer.stopVideo();\n              return;\n            }\n          } else if (videoType === 'mp4') {\n            this.stopMp4Video(videoId);\n            return;\n          }\n        }\n  \n        // Stop existing media\n        var currentMedia = slide.querySelector(selectors.media);\n        if (currentMedia) {\n          currentMedia.dispatchEvent(\n            new CustomEvent('mediaHidden', {\n              bubbles: true,\n              cancelable: true\n            })\n          );\n        }\n      },\n  \n      prepMediaOnSlide(slide) {\n        var video = slide.querySelector(selectors.productVideo);\n        if (video) {\n          this.flickity.reposition();\n          var videoType = this._getVideoType(video);\n          var videoId = this._getVideoDivId(video);\n          if (videoType === 'youtube') {\n            if (videoObjects[videoId].videoPlayer && videoObjects[videoId].options.style !== 'sound') {\n              videoObjects[videoId].videoPlayer.playVideo();\n              return;\n            }\n          } else if (videoType === 'mp4') {\n            this.playMp4Video(videoId);\n          }\n        }\n  \n        var nextMedia = slide.querySelector(selectors.media);\n        if (nextMedia) {\n          nextMedia.dispatchEvent(\n            new CustomEvent('mediaVisible', {\n              bubbles: true,\n              cancelable: true\n            })\n          );\n          slide.querySelector('.shopify-model-viewer-ui__button').setAttribute('tabindex', 0);\n          slide.querySelector('.product-single__close-media').setAttribute('tabindex', 0);\n        }\n  \n        this.hideZoomOverlay(nextMedia);\n      },\n  \n      _slideIndex: function(el) {\n        return el.getAttribute('data-index');\n      },\n  \n      initImageZoom: function() {\n        var container = this.container.querySelector(selectors.imageContainer);\n  \n        if (!container) {\n          return;\n        }\n  \n        var imageZoom = new theme.Photoswipe(container, this.sectionId);\n  \n        container.addEventListener('photoswipe:afterChange', function(evt) {\n          if (this.flickity) {\n            this.flickity.goToSlide(evt.detail.index);\n          }\n        }.bind(this));\n      },\n  \n      getThumbIndex: function(target) {\n        return target.dataset.index;\n      },\n  \n      setImageSizes: function() {\n        if (!this.settings.hasImages) {\n          return;\n        }\n  \n        // Get srcset image src, works on most modern browsers\n        // otherwise defaults to settings.imageSize\n        var currentImage = this.firstProductImage.currentSrc;\n  \n        if (currentImage) {\n          this.settings.imageSize = theme.Images.imageSize(currentImage);\n        }\n      },\n  \n      updateVariantImage: function(evt) {\n        var variant = evt.detail.variant;\n        var sizedImgUrl = theme.Images.getSizedImageUrl(variant.featured_media.preview_image.src, this.settings.imageSize);\n  \n        var newImage = this.container.querySelector('.product-main-slide[data-id=\"' + variant.featured_media.id + '\"]');\n        var imageIndex = this.getThumbIndex(newImage);\n  \n        // No image, bail\n        if (typeof imageIndex === 'undefined') {\n          return;\n        }\n  \n        if (!theme.config.bpSmall && this.settings.stackedImages) {\n          this.stackedScrollTo(imageIndex);\n        } else {\n          if (this.flickity) {\n            this.flickity.goToSlide(imageIndex);\n          }\n        }\n      },\n  \n      initImageSwitch: function() {\n        var thumbs = this.container.querySelectorAll(selectors.photoThumbs);\n        if (!thumbs.length) {\n          return;\n        }\n  \n        thumbs.forEach(thumb => {\n          thumb.addEventListener('click', function(evt) {\n            evt.preventDefault();\n            if (!theme.config.bpSmall && this.settings.stackedImages) {\n              var index = this.getThumbIndex(thumb);\n              this.stackedScrollTo(index);\n            }\n          }.bind(this));\n  \n          thumb.addEventListener('focus', function(evt) {\n            var index = this.getThumbIndex(thumb);\n            if (!theme.config.bpSmall) {\n              if (this.settings.stackedImages) {\n                this.container.querySelectorAll(selectors.photoThumbItem).forEach(el => {\n                  el.classList.remove(classes.thumbActive);\n                });\n                this.stackedScrollTo(index);\n              } else {\n                if (this.flickity) {\n                  this.flickity.goToSlide(index);\n                }\n              }\n            }\n          }.bind(this));\n  \n          thumb.addEventListener('keydown', function(evt) {\n            if (evt.keyCode === 13) {\n              this.container.querySelector(selectors.currentSlide).focus();\n            }\n          }.bind(this));\n        });\n      },\n  \n      stackedImagesInit: function() {\n        window.off(this.namespaceImages);\n        this.stackedImagePositions();\n  \n        if (this.inModal) {\n          // Slight delay in modal to accommodate loading videos\n          setTimeout(function() {\n            this.stackedActive(this.settings.stackedCurrent);\n          }.bind(this), 1000);\n        } else {\n          this.stackedActive(this.settings.stackedCurrent);\n        }\n  \n        // update image positions on resize\n        window.on('resize' + this.namespaceImages, theme.utils.debounce(200, this.stackedImagePositions.bind(this)));\n  \n        // scroll listener to mark active thumbnail\n        window.on('scroll' + this.namespaceImages, theme.utils.throttle(200, function() {\n          var goal = window.scrollY;\n          var closest = this.settings.stackedImagePositions.reduce(function(prev, curr) {\n            return (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n          });\n          var index = this.settings.stackedImagePositions.indexOf(closest);\n          if (this.settings.stackedCurrent !== index) {\n            this.stackedActive(index);\n          }\n        }.bind(this)));\n      },\n  \n      stackedImagePositions: function() {\n        var positions = [];\n        this.container.querySelectorAll(selectors.photo).forEach(el => {\n          positions.push(Math.round(el.offsetTop))\n        });\n        this.settings.stackedImagePositions = positions;\n      },\n  \n      stackedScrollTo: function(index) {\n        var img = this.container.querySelectorAll(selectors.photo)[index];\n        if (!img) {\n          return;\n        }\n  \n        // Scroll to top of large image\n        var pos = img.offsetTop;\n  \n        window.scroll({\n          top: pos,\n          behavior: 'smooth'\n        });\n      },\n  \n      stackedActive: function(index) {\n        this.container.querySelectorAll(selectors.photoThumbItem).forEach(el => {\n          el.classList.remove(classes.thumbActive);\n          el.classList.remove('is-active');\n        });\n  \n        var thumb = this.container.querySelectorAll(selectors.photoThumbItem)[index];\n        if (thumb) {\n          thumb.classList.add(classes.thumbActive);\n          this.settings.currentSlideIndex = thumb.dataset.index;\n        }\n  \n        if (this.settings.hasVideos) {\n          this.stopVideos();\n  \n          var video = this.container.querySelectorAll(selectors.photo)[index].querySelector('.product__video');\n  \n          if (video) {\n            var videoType = this._getVideoType(video);\n            var videoId = this._getVideoDivId(video);\n            if (videoType === 'youtube') {\n              if (videoObjects[videoId].videoPlayer && videoObjects[videoId].options.style !== 'sound') {\n                videoObjects[videoId].videoPlayer.playVideo();\n                return;\n              }\n            } else if (videoType === 'mp4') {\n              this.playMp4Video(videoId);\n            }\n          }\n        }\n  \n        if (this.settings.has3d) {\n          var allMedia = this.container.querySelectorAll(selectors.media);\n          if (allMedia.length) {\n            allMedia.forEach(el => {\n              el.dispatchEvent(\n                new CustomEvent('mediaHidden')\n              );\n            });\n          }\n  \n          var media = this.container.querySelectorAll(selectors.photo)[index].querySelector(selectors.media);\n  \n          if (media) {\n            media.dispatchEvent(\n              new CustomEvent('mediaVisible')\n            );\n          }\n        }\n  \n        this.settings.stackedCurrent = index;\n      },\n  \n      initSliders: function(args, reload) {\n        this.destroyImageCarousels();\n        var imageContainer = this.container.querySelector(selectors.imageContainer);\n  \n        if (!theme.config.bpSmall && this.settings.stackedImages) {\n          this.stackedImagesInit();\n          imageContainer.setAttribute('data-has-slideshow', 'false');\n        } else {\n          this.flickity = new theme.Slideshow(this.mainSlider, args);\n          imageContainer.setAttribute('data-has-slideshow', 'true');\n        }\n      },\n  \n      destroyImageCarousels: function() {\n        if (this.flickity && typeof this.flickity.destroy === 'function') {\n          this.flickity.destroy();\n        }\n      },\n  \n      hideZoomOverlay: function(hide) {\n        var btn = this.container.querySelector(selectors.zoomButton);\n        if (hide) {\n          if (btn) {\n            btn.classList.add(classes.hidden);\n          }\n        } else {\n          if (btn) {\n            btn.classList.remove(classes.hidden);\n          }\n        }\n      },\n  \n      /*============================================================================\n        Products when in quick view modal\n      ==============================================================================*/\n      openModalProduct: function() {\n        var initialized = false;\n  \n        if (!this.settings.modalInit) {\n          this.blocksHolder = this.container.querySelector(selectors.blocksHolder);\n  \n          var url = this.blocksHolder.dataset.url;\n  \n          fetch(url).then(function(response) {\n            return response.text();\n          }).then(function(html) {\n            var parser = new DOMParser();\n            var doc = parser.parseFromString(html, 'text/html');\n            var blocks = doc.querySelector(selectors.blocks);\n  \n            // Because the same product could be opened in quick view\n            // on the page we load the form elements from, we need to\n            // update any `id`, `for`, and `form` attributes\n            blocks.querySelectorAll('[id]').forEach(el => {\n              // Update input `id`\n              var val = el.getAttribute('id');\n              el.setAttribute('id', val + '-modal');\n  \n              // Update related label if it exists\n              var label = blocks.querySelector(`[for=\"${val}\"]`);\n              if (label) {\n                label.setAttribute('for', val + '-modal');\n              }\n  \n              // Update any collapsible elements\n              var collapsibleTrigger = blocks.querySelector(`[aria-controls=\"${val}\"]`);\n              if (collapsibleTrigger) {\n                collapsibleTrigger.setAttribute('aria-controls', val + '-modal');\n              }\n            });\n  \n            // Update any elements with `form` attribute.\n            // Form element already has `-modal` appended\n            var form = blocks.querySelector(selectors.formContainer);\n            var formId = form.getAttribute('id');\n            blocks.querySelectorAll('[form]').forEach(el => {\n              el.setAttribute('form', formId);\n            });\n  \n            this.blocksHolder.innerHTML = '';\n            this.blocksHolder.append(blocks);\n  \n            this.formSetup();\n            this.updateModalProductInventory();\n  \n            if (Shopify && Shopify.PaymentButton) {\n              Shopify.PaymentButton.init();\n            }\n  \n            // Re-hook up collapsible box triggers\n            theme.collapsibles.init(this.container);\n  \n            // Append sections to page\n            var allSections = doc.querySelectorAll('#MainContent .shopify-section:not(.shopify-section__product)');\n            if (allSections.length) {\n              this.loadProductSections(allSections);\n            }\n  \n            var socialDiv = doc.querySelector('.index-section.social-section');\n            if (socialDiv) {\n              this.loadSocialSection(socialDiv);\n            }\n  \n            if (window.SPR) {\n              SPR.initDomEls();SPR.loadBadges();\n            }\n  \n            theme.sections.loadSubSections(this.modal);\n  \n            document.dispatchEvent(new CustomEvent('quickview:loaded', {\n              detail: {\n                productId: this.sectionId\n              }\n            }));\n  \n            this.preImageSetup();\n            this.initProductSlider();\n            this.settings.modalInit = true;\n          }.bind(this));\n        } else {\n          initialized = true;\n          if (!theme.config.bpSmall && this.settings.stackedImages) {\n            this.stackedActive(0);\n          }\n        }\n  \n        document.dispatchEvent(new CustomEvent('quickview:open', {\n          detail: {\n            initialized: initialized,\n            productId: this.sectionId\n          }\n        }));\n      },\n  \n      // Recommended products and quick view load via JS and don't add variant inventory to the\n      // global variable that we later check. This function scrapes a data div\n      // to get that info and manually add the values.\n      updateModalProductInventory: function() {\n        window.inventories = window.inventories || {};\n        this.container.querySelectorAll('.js-product-inventory-data').forEach(el => {\n          var productId = el.dataset.productId;\n          window.inventories[productId] = {};\n  \n          el.querySelectorAll('.js-variant-inventory-data').forEach(el => {\n            window.inventories[productId][el.dataset.id] = {\n              'quantity': el.dataset.quantity,\n              'policy': el.dataset.policy,\n              'incoming': el.dataset.incoming,\n              'next_incoming_date': el.dataset.date\n            }\n          });\n        });\n      },\n  \n      closeModalProduct: function() {\n        this.stopVideos();\n        this.unloadProductSections();\n        this.unloadSocialSection();\n        this.settings.modalInit = false;\n        window.off(this.namespace);\n      },\n  \n      unloadProductSections: function() {\n        var holder = document.querySelector('#ProductSectionsHolder-' + this.productId);\n  \n        if (holder) {\n          holder.innerHTML = '';\n        }\n      },\n  \n      loadProductSections: function(content) {\n        var holder = document.querySelector('#ProductSectionsHolder-' + this.productId);\n        if (holder) {\n          holder.innerHTML = '';\n          holder.append(...content);\n  \n          // Re-hook up collapsible box triggers\n          theme.collapsibles.init(holder);\n        }\n      },\n  \n      loadSocialSection: function(content) {\n        var holder = document.querySelector('#SocialSectionHolder-' + this.productId);\n        if (holder) {\n          holder.replaceWith(content);\n        }\n      },\n  \n      unloadSocialSection: function() {\n        var holder = document.querySelector('#SocialSectionHolder-' + this.productId);\n        if (holder) {\n          holder.innerHTML = '';\n        }\n      },\n  \n      /*============================================================================\n        Product media (3D)\n      ==============================================================================*/\n      initModelViewerLibraries: function() {\n        var modelViewerElements = this.container.querySelectorAll(selectors.media);\n        if (modelViewerElements.length < 1) return;\n  \n        theme.ProductMedia.init(modelViewerElements, this.sectionId);\n      },\n  \n      initShopifyXrLaunch: function() {\n        document.addEventListener(\n          'shopify_xr_launch',\n          function() {\n            var currentMedia = this.container.querySelector(\n              selectors.productMediaWrapper +\n                ':not(.' +\n                self.classes.hidden +\n                ')'\n            );\n            currentMedia.dispatchEvent(\n              new CustomEvent('xrLaunch', {\n                bubbles: true,\n                cancelable: true\n              })\n            );\n          }.bind(this)\n        );\n      },\n  \n      customMediaListners: function() {\n        this.container.querySelectorAll(selectors.closeMedia).forEach(el => {\n          el.addEventListener('click', function() {\n            if (this.settings.stackedImages) {\n              var slide = this.mainSlider.querySelector('.product-main-slide[data-index=\"'+this.settings.currentSlideIndex+'\"]');\n            } else {\n              var slide = this.mainSlider.querySelector(selectors.currentSlide);\n            }\n  \n            var media = slide.querySelector(selectors.media);\n            if (media) {\n              media.dispatchEvent(\n                new CustomEvent('mediaHidden', {\n                  bubbles: true,\n                  cancelable: true\n                })\n              );\n            }\n          }.bind(this))\n        });\n  \n  \n        var modelViewers = this.container.querySelectorAll('model-viewer');\n        if (modelViewers.length) {\n          modelViewers.forEach(el => {\n            el.addEventListener('shopify_model_viewer_ui_toggle_play', function(evt) {\n              this.mediaLoaded(evt);\n            }.bind(this));\n  \n            el.addEventListener('shopify_model_viewer_ui_toggle_pause', function(evt) {\n              this.mediaUnloaded(evt);\n            }.bind(this));\n          });\n        }\n      },\n  \n      mediaLoaded: function(evt) {\n        this.container.querySelectorAll(selectors.closeMedia).forEach(el => {\n          el.classList.remove(classes.hidden);\n        });\n  \n        if (this.flickity) {\n          this.flickity.setDraggable(false);\n        }\n      },\n  \n      mediaUnloaded: function(evt) {\n        this.container.querySelectorAll(selectors.closeMedia).forEach(el => {\n          el.classList.add(classes.hidden);\n        });\n  \n        if (this.flickity) {\n          this.flickity.setDraggable(true);\n        }\n      },\n  \n      onUnload: function() {\n        window.off(this.namespace);\n        this.container.off(this.namespace);\n        this.destroyImageCarousels();\n        theme.ProductMedia.removeSectionModels(this.sectionId);\n  \n        if (AOS) {\n          AOS.refresh();\n        }\n      }\n    });\n  \n    return Product;\n  })();\n  \n  theme.Blog = (function() {\n  \n    function Blog(container) {\n      this.tagFilters();\n    }\n  \n    Blog.prototype = Object.assign({}, Blog.prototype, {\n      tagFilters: function() {\n        var filterBy = document.getElementById('BlogTagFilter');\n  \n        if (!filterBy) {\n          return;\n        }\n  \n        filterBy.addEventListener('change', function() {\n          location.href = filterBy.value;\n        });\n      }\n    });\n  \n    return Blog;\n  })();\n  \n  theme.HeaderSection = (function() {\n    function HeaderSection(container) {\n      this.initDrawers();\n      theme.headerNav.init();\n      theme.slideNav.init();\n  \n      // Reload any slideshow when the header is reloaded to make sure the\n      // sticky header works as expected (it can be anywhere in the sections.instance array)\n      if (Shopify && Shopify.designMode) {\n        theme.sections.reinit('slideshow-section');\n  \n        // Set a timer to resize the header in case the logo changes size\n        setTimeout(function() {\n          window.dispatchEvent(new Event('resize'));\n        }, 500);\n      }\n    }\n  \n    HeaderSection.prototype = Object.assign({}, HeaderSection.prototype, {\n      initDrawers: function() {\n        if (theme.settings.cartType === 'drawer') {\n          if (!document.body.classList.contains('template-cart')) {\n            new theme.CartDrawer();\n          }\n        }\n      },\n  \n      onUnload: function() {\n        theme.headerNav.unload();\n        theme.slideNav.unload();\n      }\n    });\n  \n    return HeaderSection;\n  })();\n  \n  theme.FooterSection = (function() {\n  \n    var selectors = {\n      locale: '[data-disclosure-locale]',\n      currency: '[data-disclosure-currency]'\n    };\n  \n    function FooterSection(container) {\n      this.container = container;\n      this.localeDisclosure = null;\n      this.currencyDisclosure = null;\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.init.bind(this),\n        threshold: 1000\n      });\n    }\n  \n    FooterSection.prototype = Object.assign({}, FooterSection.prototype, {\n      init: function() {\n        var localeEl = this.container.querySelector(selectors.locale);\n        var currencyEl = this.container.querySelector(selectors.currency);\n  \n        if (localeEl) {\n          this.localeDisclosure = new theme.Disclosure(localeEl);\n        }\n  \n        if (currencyEl) {\n          this.currencyDisclosure = new theme.Disclosure(currencyEl);\n        }\n      },\n      onUnload: function() {\n        if (this.localeDisclosure) {\n          this.localeDisclosure.destroy();\n        }\n  \n        if (this.currencyDisclosure) {\n          this.currencyDisclosure.destroy();\n        }\n      }\n    });\n  \n    return FooterSection;\n  })();\n  \n  theme.Collection = (function() {\n    var isAnimating = false;\n  \n    var selectors = {\n      sortSelect: '#SortBy'\n    };\n  \n    function Collection(container) {\n      this.container = container;\n      this.sectionId = container.getAttribute('data-section-id')\n      this.namespace = '.collection-' + this.sectionId;\n  \n      var hasHeroImage = document.querySelector('.collection-hero');\n  \n      if (hasHeroImage) {\n        this.checkIfNeedReload();\n      } else if (theme.settings.overlayHeader) {\n        theme.headerNav.disableOverlayHeader();\n      }\n  \n      this.init();\n    }\n  \n    Collection.prototype = Object.assign({}, Collection.prototype, {\n      init: function() {\n        // init is called on load and when tags are selected\n        this.container = this.container;\n        this.sectionId = this.container.getAttribute('data-section-id')\n  \n        this.sortSelect = document.querySelector(selectors.sortSelect);\n        if (this.sortSelect) {\n          this.sortSelect.on('change', this.onSortChange.bind(this));\n          this.defaultSort = this.getDefaultSortValue();\n        }\n  \n        new theme.HoverProductGrid(this.container);\n  \n        this.sortTags();\n        this.bindBackButton();\n      },\n  \n      getSortValue: function() {\n        return this.sortSelect.value || this.defaultSort;\n      },\n  \n      getDefaultSortValue: function() {\n        return this.sortSelect.dataset.sortBy;\n      },\n  \n      onSortChange: function() {\n        this.queryParams = new URLSearchParams(window.location.search);\n  \n        this.queryParams.set('sort_by', this.getSortValue());\n        this.queryParams.delete('page'); // Delete if it exists\n  \n        window.location.search = this.queryParams.toString();\n      },\n  \n      sortTags: function() {\n        var sortTags = document.getElementById('SortTags');\n  \n        if (!sortTags) {\n          return;\n        }\n  \n        sortTags.on('change', function(evt) {\n          location.href = sortTags.value;\n        });\n      },\n  \n      bindBackButton: function() {\n        window.off('popstate' + this.namespace);\n        window.on('popstate' + this.namespace, (state) => {\n          if (state) {\n            // Bail if it's a hash link\n            if (location.href.indexOf(location.pathname) >= 0) {\n              return true;\n            }\n  \n            const newUrl = new URL(window.location.href);\n  \n            theme.CollectionAjaxFilter(newUrl, false).then(() => {\n              isAnimating = false;\n              this.initPriceRange();\n            });\n          }\n        });\n      },\n  \n      // A liquid variable in the header needs a full page refresh\n      // if the collection header hero image setting is enabled\n      // and the header is set to sticky. Only necessary in the editor.\n      checkIfNeedReload: function() {\n        if (!Shopify.designMode) {\n          return;\n        }\n  \n        if (!theme.settings.overlayHeader) {\n          return;\n        }\n  \n        var headerWrapper = document.querySelector('.header-wrapper');\n        if (!headerWrapper.classList.contains('header-wrapper--overlay')) {\n          location.reload();\n        }\n      },\n  \n      forceReload: function() {\n        this.onUnload();\n        this.init();\n      },\n  \n      onUnload: function() {\n        window.off(this.namespace);\n        this.container.off(this.namespace);\n      }\n  \n    });\n  \n    return Collection;\n  })();\n  \n  theme.CollectionFilter = (function() {\n    var isAnimating = false;\n  \n    var selectors = {\n      activeTagList: '.tag-list--active-tags',\n      activeTags: '.tag-list a',\n      filters: '.collection-filter',\n      priceRange: '.price-range',\n      tags: '.tag-list input',\n      tagsForm: '.filter-form',\n    };\n  \n    var classes = {\n      activeTag: 'tag--active',\n      removeTagParent: 'tag--remove'\n    };\n  \n    function CollectionFilter(container) {\n      this.container = container;\n      this.sectionId = container.getAttribute('data-section-id');\n      this.namespace = '.collection-filter-' + this.sectionId;\n  \n      this.init();\n    }\n  \n    CollectionFilter.prototype = Object.assign({}, CollectionFilter.prototype, {\n      init: function() {\n        document.querySelectorAll(selectors.activeTags).forEach(tag => {\n          tag.on('click' + this.namespace, this.onTagClick.bind(this));\n        });\n  \n        document.querySelectorAll(selectors.tagsForm).forEach(form => {\n          form.addEventListener('input', this.onFormSubmit.bind(this));\n        });\n  \n        this.initPriceRange();\n      },\n  \n      initPriceRange: function() {\n        const priceRangeEls = document.querySelectorAll(selectors.priceRange)\n        priceRangeEls.forEach((el) => new theme.PriceRange(el, {\n          // onChange passes in formData\n          onChange: this.renderFromFormData.bind(this),\n        }));\n      },\n  \n      onTagClick: function(evt) {\n        var tag = evt.currentTarget;\n  \n        if (tag.classList.contains('no-ajax')) {\n          return;\n        }\n  \n        evt.preventDefault();\n        if (isAnimating) {\n          return;\n        }\n  \n        isAnimating = true;\n  \n        const parent = tag.parentNode;\n        const newUrl = new URL(tag.href);\n  \n        this.renderActiveTag(parent, tag);\n        this.startLoading();\n        this.renderCollectionPage(newUrl.searchParams);\n      },\n  \n      onFormSubmit: function(evt) {\n        const tag = evt.target;\n  \n        // Do not ajax-load collection links\n        if (tag.classList.contains('no-ajax')) {\n          return;\n        }\n  \n        evt.preventDefault();\n        if (isAnimating) {\n          return;\n        }\n  \n        isAnimating = true;\n  \n        const parent = tag.closest('li');\n        const formEl = tag.closest('form');\n        const formData = new FormData(formEl);\n  \n        this.renderActiveTag(parent, tag);\n        this.startLoading();\n        this.renderFromFormData(formData);\n      },\n  \n      renderCollectionPage: function(searchParams) {\n        theme.CollectionAjaxFilter(searchParams)\n          .then(() => {\n            isAnimating = false;\n            this.initPriceRange();\n            document.dispatchEvent(new CustomEvent('collection:reloaded'));\n          });\n      },\n  \n      renderFromFormData: function(formData) {\n        const searchParams = new URLSearchParams(formData);\n        this.renderCollectionPage(searchParams);\n      },\n  \n      renderActiveTag: function(parent, el) {\n        const textEl = parent.querySelector('.tag__text');\n  \n        if (parent.classList.contains(classes.activeTag)) {\n          parent.classList.remove(classes.activeTag);\n        } else {\n          // If adding a tag, show new tag right away.\n          // Otherwise, remove it before ajax finishes\n          if (el.closest('li').classList.contains(classes.removeTagParent)) {\n            parent.remove();\n          } else {\n            const newTag = document.createElement('li');\n            newTag.classList.add(...['tag', 'tag--remove']);\n            const tagLink = document.createElement('a');\n            tagLink.classList.add(...['btn', 'btn--small', 'js-no-transition']);\n            tagLink.innerText = textEl.innerText;\n  \n            newTag.appendChild(tagLink);\n  \n            const tagList = document.querySelector(selectors.activeTagList);\n            if (tagList) tagList.append(newTag);\n          }\n  \n          parent.classList.add(classes.activeTag);\n        }\n      },\n  \n      startLoading: function() {\n        document.querySelectorAll('.grid-product').forEach(el => {\n          el.classList.add('unload');\n        });\n      },\n  \n      forceReload: function() {\n        this.init();\n      }\n    });\n  \n    return CollectionFilter;\n  })();\n  \n  theme.CollectionAjaxFilter = function (searchParams, updateURLHash = true) {\n    const selectors = {\n      filterWrapperId: 'CollectionFiltersSection',\n      productWrapperId: 'CollectionGrid',\n      productContentId: 'CollectionAjaxContent',\n    };\n    const filterWrapper = document.getElementById(selectors.filterWrapperId);\n    const productWrapper = document.getElementById(selectors.productWrapperId);\n  \n    const ajaxRenderer = new theme.AjaxRenderer({\n      sections: [\n        {\n          sectionId: filterWrapper.dataset.sectionId,\n          nodeId: selectors.filterWrapperId,\n        },\n        {\n          sectionId: productWrapper.dataset.sectionId,\n          nodeId: selectors.productContentId,\n        },\n      ]\n    });\n  \n    return ajaxRenderer\n      .renderPage(window.location.pathname, searchParams, updateURLHash)\n      .then(() => {\n        theme.sections.reinit('collection-grid');\n        theme.sections.reinit('collection-filter');\n  \n        const newProductContent = document.getElementById(\n          selectors.productContentId,\n        );\n        theme.reinitProductGridItem(newProductContent);\n        theme.QuickShopScreens.reInit(newProductContent);\n      });\n  };\n  \n  // Handles multiple section interactions:\n  //  - Featured collection slider\n  //  - Featured collection grid (hover product sliders only)\n  //  - Related products\n  //  - Social reviews\n  //\n  // Options:\n  //  - scrollable: overflow div with arrows\n  //  - infinite pagination: only in slider format\n  \n  theme.FeaturedCollection = (function() {\n    var selectors = {\n      scrollWrap: '[data-pagination-wrapper]',\n      productContainer: '[data-product-container]',\n      collectionProductContainer: '[data-collection-container]',\n      product: '[data-product-grid]',\n      arrows: '[data-arrow]'\n    };\n  \n    var classes = {\n      loading: 'collection-loading',\n      arrowLeft: 'overflow-scroller__arrow--left',\n      disableScrollLeft: 'overflow-scroller--disable-left',\n      disableScrollRight: 'overflow-scroller--disable-right'\n    };\n  \n    function FeaturedCollection(container) {\n      this.container = container;\n      this.sectionId = this.container.getAttribute('data-section-id');\n      this.scrollWrap = this.container.querySelector(selectors.scrollWrap);\n      this.scrollArrows = this.container.querySelectorAll(selectors.arrows);\n      this.namespace = '.featured-collection-' + this.sectionId;\n  \n      this.options = {\n        scrollable: this.container.dataset.scrollable,\n        paginate: this.container.dataset.paginate\n      };\n  \n      var paginateBy = this.container.dataset.paginateBy;\n      var productCount = this.container.dataset.collectionCount;\n  \n      this.settings = {\n        url: this.container.dataset.collectionUrl,\n        page: 1,\n        pageCount: this.options.paginate ? Math.ceil(productCount / paginateBy) : 0,\n        itemsToScroll: 3,\n        gridItemWidth: this.container.dataset.gridItemWidth\n      };\n  \n      this.state = {\n        isInit: false,\n        loading: false,\n        scrollerEnabled: false,\n        loadedAllProducts: false,\n        scrollable: this.options.scrollable,\n        scrollInterval: null,\n        scrollSpeed: 3 // smaller is faster\n      };\n  \n      this.sizing = {\n        scroller: 0,\n        itemWidth: 0\n      };\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.init.bind(this)\n      });\n    }\n  \n    FeaturedCollection.prototype = Object.assign({}, FeaturedCollection.prototype, {\n      init: function() {\n        new theme.HoverProductGrid(this.container);\n  \n        if (!this.state.scrollable) {\n          return;\n        }\n  \n        this.sizing = this.getScrollWidths();\n  \n        window.on('resize' + this.namespace, theme.utils.debounce(200, this.handleResize.bind(this)));\n  \n        this.toggleScrollListener(this.state.scrollable);\n        this.arrowListeners(this.state.scrollable);\n  \n        this.state.isInit = true;\n      },\n  \n      reInit: function() {\n        new theme.HoverProductGrid(this.container);\n  \n        if (this.state.scrollable) {\n          this.sizing = this.getScrollWidths();\n          this.toggleScrollListener(this.state.scrollable);\n        }\n  \n        theme.reinitProductGridItem();\n      },\n  \n      loadingState: function(loading) {\n        this.state.loading = loading;\n        this.container.classList.toggle(classes.loading, loading);\n      },\n  \n      getScrollWidths: function() {\n        var container = this.scrollWrap.offsetWidth;\n        var scroller = this.scrollWrap.scrollWidth;\n        var item = this.scrollWrap.querySelector('.grid__item');\n        var itemWidth = item.offsetWidth;\n  \n        // First time this runs there is a 200px CSS animation that JS doesn't\n        // take into account, so manually subtract from the scroller width\n        if (!this.state.isInit) {\n          scroller = scroller - 200;\n        }\n  \n        if (scroller <= container) {\n          this.disableArrow(null, true);\n        }\n  \n        return {\n          scroller: scroller,\n          scrollSize: scroller - container,\n          itemWidth: itemWidth\n        };\n      },\n  \n      handleResize: function() {\n        if (this.state.scrollable) {\n          this.sizing = this.getScrollWidths();\n        }\n        this.toggleScrollListener(this.state.scrollable);\n        this.arrowListeners(this.state.scrollable);\n      },\n  \n      toggleScrollListener: function(enable) {\n        if (enable) {\n          if (this.state.scrollerEnabled) { return; }\n          this.scrollWrap.on('scroll' + this.namespace, theme.utils.throttle(250, this.scrollCheck.bind(this)));\n          this.state.scrollerEnabled = true;\n        } else {\n          this.scrollWrap.off('scroll' + this.namespace);\n          this.state.scrollerEnabled = false;\n        }\n      },\n  \n      scrollCheck: function(evt) {\n        if (this.state.loading) {\n          this.toggleScrollListener(false);\n          return;\n        }\n  \n        // If a value is 0, we need to recalculate starting points\n        if (this.sizing.scrollSize === 0) {\n          this.sizing = this.getScrollWidths();\n        }\n  \n        var scrollLeft = evt.currentTarget.scrollLeft ? evt.currentTarget.scrollLeft : 0;\n        var percent = Math.floor(scrollLeft / this.sizing.scrollSize * 100);\n        var fromEnd = this.sizing.scrollSize - scrollLeft;\n  \n        if (this.options.paginate) {\n          if (!this.state.loadedAllProducts && percent > 50) {\n            this.getNewProducts();\n          }\n        }\n  \n        if (!percent) {\n          percent = 0;\n        }\n  \n        this.disableArrow(percent);\n      },\n  \n      arrowListeners: function(enable) {\n        this.scrollArrows.forEach(arrow => {\n          arrow.off('click' + this.namespace);\n          if (enable) {\n            arrow.classList.remove('hide');\n            arrow.on('click' + this.namespace, this.arrowScroll.bind(this));\n          } else {\n            arrow.classList.add('hide');\n          }\n        });\n      },\n  \n      arrowScroll: function(evt) {\n        var direction = evt.currentTarget.classList.contains(classes.arrowLeft) ? 'left' : 'right';\n        var iteration = theme.config.bpSmall ? 1 : 2;\n  \n        if (evt.type === 'mouseenter') {\n          this.state.scrollInterval = setInterval(function(){\n            var currentPos = this.scrollWrap.scrollLeft;\n            var newPos = direction === 'left' ? (currentPos - iteration) : (currentPos + iteration);\n            this.scrollWrap.scrollLeft = newPos;\n          }.bind(this), this.state.scrollSpeed);\n        } else if (evt.type === 'mouseleave') {\n          clearInterval(this.state.scrollInterval);\n        } else if (evt.type === 'click') {\n          clearInterval(this.state.scrollInterval);\n          var currentPos = this.scrollWrap.scrollLeft;\n          var scrollAmount = this.sizing.itemWidth * this.settings.itemsToScroll;\n          var newPos = direction === 'left' ? (currentPos - scrollAmount) : (currentPos + scrollAmount);\n  \n          this.scrollWrap.scroll({\n            left: newPos,\n            behavior: 'smooth'\n          });\n        }\n  \n        if (newPos <= 0) {\n          this.disableArrow(newPos);\n        }\n      },\n  \n      disableArrow: function(pos, all) {\n        this.scrollArrows.forEach(arrow => {\n          arrow.classList.remove(classes.disableScrollRight);\n          arrow.classList.remove(classes.disableScrollLeft);\n  \n          if (all) {\n            arrow.classList.add(classes.disableScrollRight);\n            arrow.classList.add(classes.disableScrollLeft);\n            return;\n          }\n  \n          // Max left scroll\n          if (pos <= 10) {\n            arrow.classList.add(classes.disableScrollLeft);\n            return;\n          }\n  \n          // Max right scroll\n          if (pos >= 96) {\n            arrow.classList.add(classes.disableScrollRight);\n            return;\n          }\n        });\n      },\n  \n      getNewProducts: function() {\n        this.loadingState(true);\n        var newPage = this.settings.page + 1;\n        var itemWidth = this.settings.gridItemWidth;\n  \n        // No more pages, disable features\n        if (newPage > this.settings.pageCount) {\n          this.loadingState(false);\n          this.state.loadedAllProducts = true;\n          return;\n        }\n  \n        // URL not defined (recommended products), disable loading\n        if (this.settings.url === undefined) {\n          this.loadingState(false);\n          this.state.loadedAllProducts = true;\n          return;\n        }\n  \n        var newUrl = this.settings.url + '?page=' + (newPage);\n  \n        fetch(newUrl).then(function(response) {\n          return response.text();\n        }).then(function(html) {\n          var parser = new DOMParser();\n          var doc = parser.parseFromString(html, 'text/html');\n          var newProducts = doc.querySelectorAll(selectors.collectionProductContainer + ' .grid-product');\n          var fragment = document.createDocumentFragment();\n  \n          newProducts.forEach(prod => {\n            prod.classList.add(itemWidth);\n            fragment.appendChild(prod);\n          });\n  \n          this.container.querySelector(selectors.productContainer).appendChild(fragment);\n  \n          this.ajaxSuccess();\n        }.bind(this));\n      },\n  \n      ajaxSuccess: function() {\n        this.loadingState(false);\n        this.settings.page = this.settings.page + 1;\n        this.reInit();\n      },\n  \n      forceReload: function() {\n        this.onUnload();\n        this.init();\n      },\n  \n      // Only runs in the editor while a user is activating.\n      // Rearranges quick shop modals to fix potentially broken layout\n      onLoad: function() {\n        theme.QuickShopScreens.reInit(this.container);\n      },\n  \n      onUnload: function() {\n        window.off(this.namespace);\n        window.dispatchEvent(new Event('resize'));\n        this.scrollWrap.off(this.namespace);\n        theme.QuickShopScreens.unload(this.container);\n      }\n  \n    });\n  \n    return FeaturedCollection;\n  })();\n  \n  theme.Testimonials = (function() {\n    var defaults = {\n      adaptiveHeight: false,\n      avoidReflow: true,\n      pageDots: true,\n      prevNextButtons: false,\n      wrapAround: true\n    };\n  \n    function Testimonials(container) {\n      this.container = container;\n      var sectionId = container.getAttribute('data-section-id')\n      this.slideshow = container.querySelector('#Testimonials-' + sectionId);\n  \n      if (!this.slideshow) { return }\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.init.bind(this),\n        threshold: 600\n      });\n    }\n  \n    Testimonials.prototype = Object.assign({}, Testimonials.prototype, {\n      init: function(obj, args) {\n        // Do not wrap when only a few blocks\n        if (this.slideshow.dataset.count <= 3) {\n          defaults.wrapAround = false;\n          defaults.contain = true;\n        }\n  \n        this.flickity = new theme.Slideshow(this.slideshow, defaults);\n        this.flickity.resize();\n      },\n  \n      onUnload: function() {\n        if (this.flickity && typeof this.flickity.destroy === 'function') {\n          this.flickity.destroy();\n        }\n      },\n  \n      onDeselect: function() {\n        if (this.flickity && typeof this.flickity.play === 'function') {\n          this.flickity.play();\n        }\n      },\n  \n      onBlockSelect: function(evt) {\n        var slide = this.slideshow.querySelector('.testimonials-slide--' + evt.detail.blockId)\n        var index = parseInt(slide.dataset.index);\n  \n        clearTimeout(this.timeout);\n  \n        if (this.flickity && typeof this.flickity.pause === 'function') {\n          this.flickity.goToSlide(index);\n          this.flickity.pause();\n        }\n      },\n  \n      onBlockDeselect: function() {\n        if (this.flickity && typeof this.flickity.play === 'function') {\n          this.flickity.play();\n        }\n      }\n    });\n  \n    return Testimonials;\n  })();\n  \n  theme.HeroAnimated = (function() {\n  \n    var classes = {\n      active: 'animated__slide--active',\n      inactive: 'animated__slide--inactive'\n    }\n  \n    function HeroAnimated(container) {\n      this.container = container;\n      var imageCount = container.dataset.count;\n  \n      var imageContainer = container.querySelector('.hero');\n      if (imageContainer) {\n        theme.loadImageSection(imageContainer);\n      }\n      this.allImages = Array.from(container.querySelectorAll('.animated__slide'));\n  \n      this.state = {\n        activeIndex: 0\n      };\n  \n      if (imageCount === 1) {\n        this.setFades(true);\n        return;\n      }\n  \n      this.interval;\n      this.intervalSpeed = container.dataset.interval;\n      this.maxIndex = imageCount - 1;\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.initInterval.bind(this)\n      });\n    }\n  \n    HeroAnimated.prototype = Object.assign({}, HeroAnimated.prototype, {\n      initInterval: function() {\n  \n        // Check if all image wrappers have loaded class before starting fades\n        var imagesHaveLoaded = this.allImages.every((element) => {\n          return element.querySelector('.hero__image-wrapper').classList.contains('loaded')\n        });\n  \n        if (imagesHaveLoaded) {\n          this.setFades(true);\n          this.interval = setInterval(function() {\n            this.setFades();\n          }.bind(this), this.intervalSpeed);\n        } else {\n          setTimeout(this.initInterval.bind(this), 200);\n        }\n      },\n  \n      setFades: function(first) {\n        // Get next image index\n        var nextIndex = this.state.activeIndex === this.maxIndex ? 0 : this.state.activeIndex + 1;\n  \n        if (first) {\n          nextIndex = this.state.activeIndex;\n        }\n  \n        // Unset existing image\n        if (!first) {\n          var image = this.allImages[this.state.activeIndex];\n          image.classList.remove(classes.active);\n          image.classList.add(classes.inactive);\n        }\n  \n        // Set next image as active\n        var nextImage = this.allImages[nextIndex];\n        nextImage.classList.remove(classes.inactive);\n        nextImage.classList.add(classes.active);\n  \n        this.state.activeIndex = nextIndex;\n      },\n  \n      onUnload: function() {\n        clearInterval(this.interval);\n      }\n    });\n  \n    return HeroAnimated;\n  })();\n  \n\n  theme.Maps = (function() {\n    var config = {\n      zoom: 14\n    };\n    var apiStatus = null;\n    var mapsToLoad = [];\n  \n    var errors = {};\n  \n    var selectors = {\n      section: '[data-section-type=\"map\"]',\n      map: '[data-map]',\n      mapOverlay: '.map-section__overlay'\n    };\n  \n    // Global function called by Google on auth errors.\n    // Show an auto error message on all map instances.\n    window.gm_authFailure = function() {\n      if (!Shopify.designMode) {\n        return;\n      }\n  \n      document.querySelectorAll(selectors.section).forEach(section => {\n        section.classList.add('map-section--load-error');\n      });\n  \n      document.querySelectorAll(selectors.map).forEach(map => {\n        map.parentNode.removeChild(map);\n      });\n  \n      window.mapError(theme.strings.authError);\n    };\n  \n    window.mapError = function(error) {\n      var message = document.createElement('div');\n      message.classList.add('map-section__error', 'errors', 'text-center');\n      message.innerHTML = error;\n      document.querySelectorAll(selectors.mapOverlay).forEach(overlay => {\n        overlay.parentNode.prepend(message);\n      });\n      document.querySelectorAll('.map-section__link').forEach(link => {\n        link.classList.add('hide');\n      });\n    };\n  \n    function Map(container) {\n      this.container = container;\n      this.sectionId = this.container.getAttribute('data-section-id');\n      this.namespace = '.map-' + this.sectionId;\n      this.map = container.querySelector(selectors.map);\n      this.key = this.map.dataset.apiKey;\n  \n      errors = {\n        addressNoResults: theme.strings.addressNoResults,\n        addressQueryLimit: theme.strings.addressQueryLimit,\n        addressError: theme.strings.addressError,\n        authError: theme.strings.authError\n      };\n  \n      if (!this.key) {\n        return;\n      }\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.prepMapApi.bind(this),\n        threshold: 20\n      });\n    }\n  \n    // API has loaded, load all Map instances in queue\n    function initAllMaps() {\n      mapsToLoad.forEach(instance => {\n        instance.createMap();\n      });\n    }\n  \n    function geolocate(map) {\n      var geocoder = new google.maps.Geocoder();\n  \n      if (!map) {\n        return;\n      }\n  \n      var address = map.dataset.addressSetting;\n  \n      var deferred = new Promise((resolve, reject) => {\n        geocoder.geocode({ address: address }, function(results, status) {\n          if (status !== google.maps.GeocoderStatus.OK) {\n            reject(status);\n          }\n          resolve(results);\n        });\n      });\n  \n      return deferred;\n    }\n  \n    Map.prototype = Object.assign({}, Map.prototype, {\n      prepMapApi: function() {\n        if (apiStatus === 'loaded') {\n          this.createMap();\n        } else {\n          mapsToLoad.push(this);\n  \n          if (apiStatus !== 'loading') {\n            apiStatus = 'loading';\n            if (typeof window.google === 'undefined' || typeof window.google.maps === 'undefined' ) {\n  \n              var script = document.createElement('script');\n              script.onload = function () {\n                apiStatus = 'loaded';\n                initAllMaps();\n              };\n              script.src = 'https://maps.googleapis.com/maps/api/js?key=' + this.key;\n              document.head.appendChild(script);\n            }\n          }\n        }\n      },\n  \n      createMap: function() {\n        var mapDiv = this.map;\n  \n        return geolocate(mapDiv)\n          .then(\n            function(results) {\n              var mapOptions = {\n                zoom: config.zoom,\n                backgroundColor: 'none',\n                center: results[0].geometry.location,\n                draggable: false,\n                clickableIcons: false,\n                scrollwheel: false,\n                disableDoubleClickZoom: true,\n                disableDefaultUI: true\n              };\n  \n              var map = (this.map = new google.maps.Map(mapDiv, mapOptions));\n              var center = (this.center = map.getCenter());\n  \n              var marker = new google.maps.Marker({\n                map: map,\n                position: map.getCenter()\n              });\n  \n              google.maps.event.addDomListener(\n                window,\n                'resize',\n                theme.utils.debounce(250, function() {\n                  google.maps.event.trigger(map, 'resize');\n                  map.setCenter(center);\n                  mapDiv.removeAttribute('style');\n                })\n              );\n  \n              if (Shopify.designMode) {\n                if (window.AOS) { AOS.refreshHard() }\n              }\n            }.bind(this)\n          )\n          .catch(function(status) {\n            var errorMessage;\n  \n            switch (status) {\n              case 'ZERO_RESULTS':\n                errorMessage = errors.addressNoResults;\n                break;\n              case 'OVER_QUERY_LIMIT':\n                errorMessage = errors.addressQueryLimit;\n                break;\n              case 'REQUEST_DENIED':\n                errorMessage = errors.authError;\n                break;\n              default:\n                errorMessage = errors.addressError;\n                break;\n            }\n  \n            // Show errors only to merchant in the editor.\n            if (Shopify.designMode) {\n              window.mapError(errorMessage);\n            }\n          });\n      },\n  \n      onUnload: function() {\n        if (this.map.length === 0) {\n          return;\n        }\n        // Causes a harmless JS error when a section without an active map is reloaded\n        if (google && google.maps && google.maps.event) {\n          google.maps.event.clearListeners(this.map, 'resize');\n        }\n      }\n    });\n  \n    return Map;\n  })();\n  \n  theme.SlideshowSection = (function() {\n  \n    var selectors = {\n      parallaxContainer: '.parallax-container'\n    };\n  \n    function SlideshowSection(container) {\n      this.container = container;\n      var sectionId = container.getAttribute('data-section-id');\n      this.slideshow = container.querySelector('#Slideshow-' + sectionId);\n      this.namespace = '.' + sectionId;\n  \n      this.initialIndex = 0;\n  \n      if (!this.slideshow) { return }\n  \n      // Get shopify-created div that section markup lives in,\n      // then get index of it inside its parent\n      var sectionEl = container.parentElement;\n      var sectionIndex = [].indexOf.call(sectionEl.parentElement.children, sectionEl);\n  \n      if (sectionIndex === 0) {\n        this.init();\n      } else {\n        theme.initWhenVisible({\n          element: this.container,\n          callback: this.init.bind(this)\n        });\n      }\n  \n    }\n  \n    SlideshowSection.prototype = Object.assign({}, SlideshowSection.prototype, {\n      init: function() {\n        var slides = this.slideshow.querySelectorAll('.slideshow__slide');\n  \n        if (this.container.hasAttribute('data-immediate-load')) {\n          this.slideshow.classList.remove('loading', 'loading--delayed');\n          this.slideshow.classList.add('loaded');\n        } else {\n          // Wait for image to load before marking as done\n          theme.loadImageSection(this.slideshow);\n        }\n  \n        if (slides.length > 1) {\n          var sliderArgs = {\n            prevNextButtons: this.slideshow.hasAttribute('data-arrows'),\n            pageDots: this.slideshow.hasAttribute('data-dots'),\n            fade: true,\n            setGallerySize: false,\n            initialIndex: this.initialIndex,\n            autoPlay: this.slideshow.dataset.autoplay === 'true'\n              ? parseInt(this.slideshow.dataset.speed)\n              : false\n          };\n  \n          this.flickity = new theme.Slideshow(this.slideshow, sliderArgs);\n        } else {\n          // Add loaded class to first slide\n          slides[0].classList.add('is-selected');\n        }\n  \n        if (this.container.hasAttribute('data-parallax')) {\n          // Create new parallax for each slideshow image\n          this.container.querySelectorAll(selectors.parallaxContainer).forEach(function(el, i) {\n            new theme.Parallax(el, {\n              namespace: this.namespace + '-parallax-' + i\n            });\n          }.bind(this));\n        }\n      },\n  \n      forceReload: function() {\n        this.onUnload();\n        this.init();\n      },\n  \n      onUnload: function() {\n        if (this.flickity && typeof this.flickity.destroy === 'function') {\n          this.flickity.destroy();\n        }\n      },\n  \n      onDeselect: function() {\n        if (this.flickity && typeof this.flickity.play === 'function') {\n          this.flickity.play();\n        }\n      },\n  \n      onBlockSelect: function(evt) {\n        var slide = this.slideshow.querySelector('.slideshow__slide--' + evt.detail.blockId)\n        var index = parseInt(slide.dataset.index);\n  \n        if (this.flickity && typeof this.flickity.pause === 'function') {\n          this.flickity.goToSlide(index);\n          this.flickity.pause();\n        } else {\n          // If section reloads, slideshow might not have been setup yet, wait a second and try again\n          this.initialIndex = index;\n          setTimeout(function() {\n            if (this.flickity && typeof this.flickity.pause === 'function') {\n              this.flickity.pause();\n            }\n          }.bind(this), 1000);\n        }\n      },\n  \n      onBlockDeselect: function() {\n        if (this.flickity && typeof this.flickity.play === 'function') {\n          if (this.flickity.args.autoPlay) {\n            this.flickity.play();\n          }\n        }\n      }\n    });\n  \n    return SlideshowSection;\n  })();\n  \n  theme.NewsletterPopup = (function() {\n    function NewsletterPopup(container) {\n      this.container = container;\n      var sectionId = this.container.getAttribute('data-section-id');\n      this.cookieName = 'newsletter-' + sectionId;\n  \n      if (!container) {\n        return;\n      }\n  \n      // Prevent popup on Shopify robot challenge page\n      if (window.location.pathname === '/challenge') {\n        return;\n      }\n  \n      // Prevent popup on password page\n      if (window.location.pathname === '/password') {\n        return;\n      }\n  \n      this.data = {\n        secondsBeforeShow: container.dataset.delaySeconds,\n        daysBeforeReappear: container.dataset.delayDays,\n        cookie: Cookies.get(this.cookieName),\n        testMode: container.dataset.testMode\n      };\n  \n      this.modal = new theme.Modals('NewsletterPopup-' + sectionId, 'newsletter-popup-modal');\n  \n      // Set cookie if optional button is clicked\n      var btn = container.querySelector('.popup-cta a');\n      if (btn) {\n        btn.addEventListener('click', function(){\n          this.closePopup(true);\n        }.bind(this));\n      }\n  \n      // Open modal if errors or success message exist\n      if (container.querySelector('.errors') || container.querySelector('.note--success')) {\n        this.modal.open();\n      }\n  \n      // Set cookie as opened if success message\n      if (container.querySelector('.note--success')) {\n        this.closePopup(true);\n        return;\n      }\n  \n      document.addEventListener('modalClose.' + container.id, this.closePopup.bind(this));\n  \n      if (!this.data.cookie || this.data.testMode === 'true') {\n        this.initPopupDelay();\n      }\n    }\n  \n    NewsletterPopup.prototype = Object.assign({}, NewsletterPopup.prototype, {\n      initPopupDelay: function() {\n        if (Shopify && Shopify.designMode) {\n          return;\n        }\n        setTimeout(function() {\n          this.modal.open();\n        }.bind(this), this.data.secondsBeforeShow * 1000);\n      },\n  \n      closePopup: function(success) {\n        // Remove a cookie in case it was set in test mode\n        if (this.data.testMode === 'true') {\n          Cookies.remove(this.cookieName, { path: '/' });\n          return;\n        }\n  \n        var expiry = success ? 200 : this.data.daysBeforeReappear;\n        Cookies.set(this.cookieName, 'opened', { path: '/', expires: expiry });\n      },\n  \n      onLoad: function() {\n        this.modal.open();\n      },\n  \n      onSelect: function() {\n        this.modal.open();\n      },\n  \n      onDeselect: function() {\n        this.modal.close();\n      }\n    });\n  \n    return NewsletterPopup;\n  })();\n  \n  theme.PasswordHeader = (function() {\n    function PasswordHeader() {\n      this.init();\n    }\n  \n    PasswordHeader.prototype = Object.assign({}, PasswordHeader.prototype, {\n      init: function() {\n        if (!document.querySelector('#LoginModal')) {\n          return;\n        }\n  \n        var passwordModal = new theme.Modals('LoginModal', 'login-modal', {\n          focusIdOnOpen: 'password',\n          solid: true\n        });\n  \n        // Open modal if errors exist\n        if (document.querySelectorAll('.errors').length) {\n          passwordModal.open();\n        }\n      }\n    });\n  \n    return PasswordHeader;\n  })();\n  \n  theme.Photoswipe = (function() {\n    var selectors = {\n      trigger: '.js-photoswipe__zoom',\n      images: '.photoswipe__image',\n      slideshowTrack: '.flickity-viewport ',\n      activeImage: '.is-selected'\n    };\n  \n    function Photoswipe(container, sectionId) {\n      this.container = container;\n      this.sectionId = sectionId;\n      this.namespace = '.photoswipe-' + this.sectionId;\n      this.gallery;\n      this.images;\n      this.items;\n      this.inSlideshow = false;\n  \n      if (!container || container.dataset.zoom === 'false') {\n        return;\n      }\n  \n      this.init();\n    }\n  \n    Photoswipe.prototype = Object.assign({}, Photoswipe.prototype, {\n      init: function() {\n        this.container.querySelectorAll(selectors.trigger).forEach(trigger => {\n          trigger.on('click' + this.namespace, this.triggerClick.bind(this));\n        });\n      },\n  \n      triggerClick: function(evt) {\n        // Streamline changes between a slideshow and\n        // stacked images, so recheck if we are still\n        // working with a slideshow when initializing zoom\n        if (this.container.dataset && this.container.dataset.hasSlideshow === 'true') {\n          this.inSlideshow = true;\n        } else {\n          this.inSlideshow = false;\n        }\n  \n        this.items = this.getImageData();\n  \n        var image = this.inSlideshow ? this.container.querySelector(selectors.activeImage) : evt.currentTarget;\n  \n        var index = this.inSlideshow ? this.getChildIndex(image) : image.dataset.index;\n  \n        this.initGallery(this.items, index);\n      },\n  \n      // Because of image set feature, need to get index based on location in parent\n      getChildIndex: function(el) {\n        var i = 0;\n        while( (el = el.previousSibling) != null ) {\n          i++;\n        }\n  \n        // 1-based index required\n        return i + 1;\n      },\n  \n      getImageData: function() {\n        this.images = this.inSlideshow\n                        ? this.container.querySelectorAll(selectors.slideshowTrack + selectors.images)\n                        : this.container.querySelectorAll(selectors.images);\n  \n        var items = [];\n        var options = {};\n  \n        this.images.forEach(el => {\n          var item = {\n            msrc: el.currentSrc || el.src,\n            src: el.getAttribute('data-photoswipe-src'),\n            w: el.getAttribute('data-photoswipe-width'),\n            h: el.getAttribute('data-photoswipe-height'),\n            el: el,\n            initialZoomLevel: 0.5\n          }\n  \n          items.push(item);\n        });\n  \n        return items;\n      },\n  \n      initGallery: function(items, index) {\n        var pswpElement = document.querySelectorAll('.pswp')[0];\n  \n        var options = {\n          allowPanToNext: false,\n          captionEl: false,\n          closeOnScroll: false,\n          counterEl: false,\n          history: false,\n          index: index - 1,\n          pinchToClose: false,\n          preloaderEl: false,\n          scaleMode: 'zoom',\n          shareEl: false,\n          tapToToggleControls: false,\n          getThumbBoundsFn: function(index) {\n            var pageYScroll = window.pageYOffset || document.documentElement.scrollTop;\n            var thumbnail = items[index].el;\n            var rect = thumbnail.getBoundingClientRect();\n            return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};\n          }\n        }\n  \n        this.gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);\n        this.gallery.listen('afterChange', this.afterChange.bind(this));\n        this.gallery.init();\n  \n        this.preventiOS15Scrolling();\n      },\n  \n      afterChange: function() {\n        var index = this.gallery.getCurrentIndex();\n        this.container.dispatchEvent(new CustomEvent('photoswipe:afterChange', {\n          detail: {\n            index: index\n          }\n        }));\n      },\n  \n      syncHeight: function() {\n        document.documentElement.style.setProperty(\n          \"--window-inner-height\", \n          `${window.innerHeight}px`\n        );\n      },\n  \n      // Fix poached from https://gist.github.com/dimsemenov/0b8c255c0d87f2989e8ab876073534ea\n      preventiOS15Scrolling: function() {\n        let initialScrollPos;\n  \n        if (!/iPhone|iPad|iPod/i.test(window.navigator.userAgent)) return; \n        \n        this.syncHeight();\n              \n        // Store scroll position to restore it later\n        initialScrollPos = window.scrollY;\n        \n        // Add class to root element when PhotoSwipe opens\n        document.documentElement.classList.add('pswp-open-in-ios');\n  \n        window.addEventListener('resize', this.syncHeight);\n      \n        this.gallery.listen('destroy', () => {\n          document.documentElement.classList.remove('pswp-open-in-ios');\n          window.scrollTo(0, initialScrollPos);\n        });\n      }\n    });\n  \n    return Photoswipe;\n  })();\n  \n  \n  theme.Recommendations = (function() {\n    var selectors = {\n      placeholder: '.product-recommendations-placeholder',\n      sectionClass: ' .product-recommendations',\n      productResults: '.grid-product'\n    }\n  \n    function Recommendations(container) {\n      this.container = container;\n      this.sectionId = container.getAttribute('data-section-id');\n      this.url = container.dataset.url;\n  \n      selectors.recommendations = 'Recommendations-' + this.sectionId;\n  \n      theme.initWhenVisible({\n        element: container,\n        callback: this.init.bind(this),\n        threshold: 500\n      });\n    }\n  \n    Recommendations.prototype = Object.assign({}, Recommendations.prototype, {\n      init: function() {\n        var section = document.getElementById(selectors.recommendations);\n  \n        if (!section || section.dataset.enable === 'false') {\n          return;\n        }\n  \n        var id = section.dataset.productId;\n        var limit = section.dataset.limit;\n  \n        var url = this.url + '?section_id=product-recommendations&limit='+ limit +'&product_id=' + id;\n  \n        // When section his hidden and shown, make sure it starts empty\n        if (Shopify.designMode) {\n          var wrapper = section.querySelector(selectors.sectionClass)\n          if (wrapper) {\n            wrapper.innerHTML = '';\n          }\n        }\n  \n        fetch(url).then(function(response) {\n          return response.text();\n        }).then(function(html) {\n          // Convert the HTML string into a document object\n          var parser = new DOMParser();\n          var doc = parser.parseFromString(html, 'text/html');\n          var div = doc.querySelector(selectors.sectionClass);\n          var placeholder = section.querySelector(selectors.placeholder);\n          if (!placeholder) {\n            return;\n          }\n  \n          placeholder.innerHTML = '';\n  \n          if (!div) {\n            this.container.classList.add('hide');\n            if (AOS) { AOS.refreshHard() }\n            return;\n          }\n  \n          placeholder.appendChild(div);\n  \n          theme.reinitProductGridItem(section);\n  \n          document.dispatchEvent(new CustomEvent('recommendations:loaded', {\n            detail: {\n              section: section\n            }\n          }));\n  \n          // If no results, hide the entire section\n          var results = div.querySelectorAll(selectors.productResults);\n          if (results.length === 0) {\n            this.container.classList.add('hide');\n          }\n        }.bind(this));\n      }\n    });\n  \n    return Recommendations;\n  })();\n  \n  theme.StoreAvailability = (function() {\n    var selectors = {\n      drawerOpenBtn: '.js-drawer-open-availability',\n      modalOpenBtn: '.js-modal-open-availability',\n      productTitle: '[data-availability-product-title]'\n    };\n  \n    function StoreAvailability(container) {\n      this.container = container;\n      this.baseUrl = container.dataset.baseUrl;\n      this.productTitle = container.dataset.productName;\n    }\n  \n    StoreAvailability.prototype = Object.assign({}, StoreAvailability.prototype, {\n      updateContent: function(variantId) {\n        var variantSectionUrl =\n          this.baseUrl +\n          '/variants/' +\n          variantId +\n          '/?section_id=store-availability';\n  \n        var self = this;\n  \n        fetch(variantSectionUrl)\n          .then(function(response) {\n            return response.text();\n          })\n          .then(function(html) {\n            if (html.trim() === '') {\n              this.container.innerHTML = '';\n              return;\n            }\n  \n            self.container.innerHTML = html;\n            self.container.innerHTML = self.container.firstElementChild.innerHTML;\n  \n            // Setup drawer if have open button\n            if (self.container.querySelector(selectors.drawerOpenBtn)) {\n              self.drawer = new theme.Drawers('StoreAvailabilityDrawer', 'availability');\n            }\n  \n            // Setup modal if have open button\n            if (self.container.querySelector(selectors.modalOpenBtn)) {\n              self.modal = new theme.Modals('StoreAvailabilityModal', 'availability');\n            }\n  \n            var title = self.container.querySelector(selectors.productTitle);\n            if (title) {\n              title.textContent = self.productTitle;\n            }\n          });\n      }\n    });\n  \n    return StoreAvailability;\n  })();\n  \n  theme.VideoSection = (function() {\n    var selectors = {\n      videoParent: '.video-parent-section'\n    };\n  \n    function videoSection(container) {\n      this.container = container;\n      this.sectionId = container.getAttribute('data-section-id');\n      this.namespace = '.video-' + this.sectionId;\n      this.videoObject;\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.init.bind(this),\n        threshold: 500\n      });\n    }\n  \n    videoSection.prototype = Object.assign({}, videoSection.prototype, {\n      init: function() {\n        var dataDiv = this.container.querySelector('.video-div');\n        if (!dataDiv) {\n          return;\n        }\n        var type = dataDiv.dataset.type;\n  \n        switch(type) {\n          case 'youtube':\n            var videoId = dataDiv.dataset.videoId;\n            this.initYoutubeVideo(videoId);\n            break;\n          case 'vimeo':\n            var videoId = dataDiv.dataset.videoId;\n            this.initVimeoVideo(videoId);\n            break;\n          case 'mp4':\n            this.initMp4Video();\n            break;\n        }\n      },\n  \n      initYoutubeVideo: function(videoId) {\n        this.videoObject = new theme.YouTube(\n          'YouTubeVideo-' + this.sectionId,\n          {\n            videoId: videoId,\n            videoParent: selectors.videoParent\n          }\n        );\n      },\n  \n      initVimeoVideo: function(videoId) {\n        this.videoObject = new theme.VimeoPlayer(\n          'Vimeo-' + this.sectionId,\n          videoId,\n          {\n            videoParent: selectors.videoParent\n          }\n        );\n      },\n  \n      initMp4Video: function() {\n        var mp4Video = 'Mp4Video-' + this.sectionId;\n        var mp4Div = document.getElementById(mp4Video);\n        var parent = mp4Div.closest(selectors.videoParent);\n  \n        if (mp4Div) {\n          parent.classList.add('loaded');\n  \n          var playPromise = document.querySelector('#' + mp4Video).play();\n  \n          // Edge does not return a promise (video still plays)\n          if (playPromise !== undefined) {\n            playPromise.then(function() {\n                // playback normal\n              }).catch(function() {\n                mp4Div.setAttribute('controls', '');\n                parent.classList.add('video-interactable');\n              });\n          }\n        }\n      },\n  \n      onUnload: function(evt) {\n        var sectionId = evt.target.id.replace('shopify-section-', '');\n        if (this.videoObject && typeof this.videoObject.destroy === 'function') {\n          this.videoObject.destroy();\n        }\n      }\n    });\n  \n    return videoSection;\n  })();\n  \n\n  theme.isStorageSupported = function(type) {\n    // Return false if we are in an iframe without access to sessionStorage\n    if (window.self !== window.top) {\n      return false;\n    }\n\n    var testKey = 'test';\n    var storage;\n    if (type === 'session') {\n      storage = window.sessionStorage;\n    }\n    if (type === 'local') {\n      storage = window.localStorage;\n    }\n\n    try {\n      storage.setItem(testKey, '1');\n      storage.removeItem(testKey);\n      return true;\n    } catch (error) {\n      return false;\n    }\n  };\n\n  theme.reinitProductGridItem = function() {\n    if (AOS) {\n      AOS.refreshHard();\n    }\n\n    // Refresh reviews app\n    if (window.SPR) {\n      SPR.initDomEls();SPR.loadBadges();\n    }\n\n    // Re-hook up collapsible box triggers\n    theme.collapsibles.init();\n  };\n\n  theme.reviewAppLinkListener = function() {\n    document.addEventListener('click', function (evt) {\n      if (!window.SPR) {\n        return;\n      }\n\n      var parent = evt.target.parentNode;\n      var scroller = null;\n\n      if (parent.matches('.spr-pagination-next') || parent.matches('.spr-pagination-page')) {\n        scroller = parent.closest('.spr-reviews');\n      }\n\n      if (scroller) {\n        scroller.scrollTo(0,0);\n      }\n    });\n  };\n\n  theme.checkForAnchorLink = function() {\n    if(window.location.hash) {\n      var el = document.querySelector(window.location.hash);\n      if (el) {\n        window.scrollTo(0, el.offsetTop - 100);\n      }\n    }\n  };\n\n  theme.init = function() {\n    theme.QuickShopScreens.init();\n    theme.rteInit();\n    theme.articleImages();\n    theme.collapsibles.init();\n    if (theme.settings.cartType === 'sticky') {\n      new theme.StickyCart.init();\n    }\n    theme.videoModal();\n\n    // Two ways to determine if page was loaded from cache from back button\n    // Most use `pageshow` + evt.persisted, Chrome uses `performance.navigation.type`\n    window.addEventListener('pageshow', function(evt) {\n      if (evt.persisted) {\n        theme.refreshCart();\n      }\n    });\n\n    if (performance && performance.navigation.type === 2) {\n      theme.refreshCart();\n    }\n  };\n\n  theme.initSecondary = function() {\n    document.body.classList.add('js-animate');\n\n    AOS.init({\n      easing: 'ease-out-quad',\n      once: false,\n      mirror: true,\n      offset: 100,\n      disableMutationObserver: true\n    });\n\n    document.addEventListener('lazyloaded', function(evt) {\n      var img = evt.target\n      if (img) {\n        img.parentNode.classList.add('loaded');\n      }\n    });\n\n    theme.storeScrollPositionOnUnload();\n    theme.reviewAppLinkListener();\n    theme.checkForAnchorLink();\n  };\n\n  /*============================================================================\n    Things that don't require DOM to be ready\n  ==============================================================================*/\n  theme.config.hasSessionStorage = theme.isStorageSupported('session');\n  theme.config.hasLocalStorage = theme.isStorageSupported('local');\n\n  /*============================================================================\n    Things that require DOM to be ready\n  ==============================================================================*/\n  function DOMready(callback) {\n    if (document.readyState != 'loading') callback();\n    else document.addEventListener('DOMContentLoaded', callback);\n  }\n\n  DOMready(function(){\n    theme.sections = new theme.Sections();\n\n    theme.init();\n\n    if (theme.settings.isCustomerTemplate) {\n      theme.customerTemplates();\n    }\n\n    theme.sections.register('slideshow-section', theme.SlideshowSection);\n    theme.sections.register('header-section', theme.HeaderSection);\n    theme.sections.register('hero-animated', theme.HeroAnimated);\n    theme.sections.register('video-section', theme.VideoSection);\n    theme.sections.register('product', theme.Product);\n    theme.sections.register('product-recommendations', theme.Recommendations);\n    theme.sections.register('password-header', theme.PasswordHeader);\n    theme.sections.register('product-template', theme.Product);\n    theme.sections.register('featured-collection', theme.FeaturedCollection);\n    theme.sections.register('collection-grid', theme.Collection);\n    theme.sections.register('collection-filter', theme.CollectionFilter);\n    theme.sections.register('testimonials', theme.Testimonials);\n    theme.sections.register('newsletter-popup', theme.NewsletterPopup);\n    theme.sections.register('map', theme.Maps);\n    theme.sections.register('blog', theme.Blog);\n    theme.sections.register('footer-section', theme.FooterSection);\n    theme.sections.register('store-availability', theme.StoreAvailability);\n\n    if (document.body.classList.contains('template-cart')) {\n      var cartPageForm = document.getElementById('CartPageForm');\n      if (cartPageForm) {\n        new theme.CartForm(cartPageForm);\n      }\n    }\n\n    theme.pageTransitions();\n\n    theme.initSecondary();\n    document.dispatchEvent(new CustomEvent('page:loaded'));\n  });\n})();\n"],
  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,MAAQ,OAAO,OAAS,CAAC,EAChC,OAAO,QAAU,OAAO,SAAW,CAAC,EAIpC,MAAM,GAAK,CAAC,EACZ,MAAM,OAAS,CACb,UAAW,GACX,QAAS,GACT,kBAAmB,GACnB,gBAAiB,gCACjB,aAAc,GACd,WAAY,GACZ,aAAc,GACd,SAAU,CAAC,CAAC,UAAU,UAAU,MAAM,0BAA0B,EAChE,QAAU,oBAAkB,QAAW,OAAO,eAAiB,OAAO,oBAAoB,eAAiB,OAAO,UAAU,gBAAkB,OAAO,UAAU,kBAC/J,IAAK,SAAS,gBAAgB,aAAa,KAAK,GAAK,KACvD,EAEI,SAAW,QAAQ,KACrB,QAAQ,IAAI,qBAAqB,MAAM,SAAS,aAAa,gEAA2D,EAG1H,OAAO,gBAAkB,OAAO,iBAAmB,CAAC,EACpD,gBAAgB,UAAY,EAG5B,MAAM,OAAO,QAAU,WAAW,MAAM,OAAO,eAAe,EAAE,QAChE,WAAW,MAAM,OAAO,eAAe,EAAE,YAAY,SAAS,IAAK,CAC7D,IAAI,SACN,MAAM,OAAO,QAAU,GACvB,SAAS,cAAc,IAAI,YAAY,YAAY,CAAC,IAEpD,MAAM,OAAO,QAAU,GACvB,SAAS,cAAc,IAAI,YAAY,cAAc,CAAC,EAE1D,CAAC,GAEA,UAAU,CACT,aAEA,MAAM,SAAW,CACf,GAAI,SAASA,OAAO,SAAU,QAAQ,CACpC,OAAK,KAAK,aACR,KAAK,WAAa,CAAC,GAErB,KAAK,WAAWA,MAAK,EAAI,SACzB,QAAU,SAAW,GAErB,KAAK,iBAAiBA,OAAM,MAAM,GAAG,EAAE,CAAC,EAAG,SAAU,OAAO,EACrD,IACT,EACA,IAAK,SAASA,OAAO,CACnB,GAAK,KAAK,WACV,YAAK,oBAAoBA,OAAM,MAAM,GAAG,EAAE,CAAC,EAAG,KAAK,WAAWA,MAAK,CAAC,EACpE,OAAO,KAAK,WAAWA,MAAK,EACrB,IACT,CACF,EAGA,OAAO,GAAK,QAAQ,UAAU,GAAK,MAAM,SAAS,GAClD,OAAO,IAAM,QAAQ,UAAU,IAAM,MAAM,SAAS,IAEpD,MAAM,MAAQ,CACZ,UAAW,SAAS,MAAO,aAAc,CACvC,OAAQ,OAAS,MAAQ,QAAU,MAAS,aAAe,KAC7D,EAEA,KAAM,SAASC,IAAI,QAAS,CAC1BA,IAAG,WAAW,aAAa,QAASA,GAAE,EACtC,QAAQ,YAAYA,GAAE,CACxB,EAEA,SAAU,SAAS,KAAM,SAAU,UAAW,CAC5C,IAAI,QACJ,OAAO,UAAW,CAChB,IAAI,QAAU,KAAM,KAAO,UACvB,MAAQ,UAAW,CACrB,QAAU,KACL,WAAW,SAAS,MAAM,QAAS,IAAI,CAC9C,EACI,QAAU,WAAa,CAAC,QAC5B,aAAa,OAAO,EACpB,QAAU,WAAW,MAAO,IAAI,EAC5B,SAAS,SAAS,MAAM,QAAS,IAAI,CAC3C,CACF,EAEA,SAAU,SAAS,MAAO,SAAU,CAClC,IAAI,QAAU,GACd,OAAO,UAAY,CACZ,UACH,SAAS,MAAM,KAAM,SAAS,EAC9B,QAAU,GACV,WAAW,UAAY,CACrB,QAAU,EACZ,EAAG,KAAK,EAEZ,CACF,EAEA,kBAAmB,SAASA,IAAI,SAAU,CACxCA,IAAG,iBAAiB,gBAAiB,WAAW,EAEhD,SAAS,YAAY,IAAK,CACxBA,IAAG,UAAU,OAAO,kBAAkB,EACtCA,IAAG,oBAAoB,gBAAiB,WAAW,CACrD,CAEAA,IAAG,UAAU,IAAI,kBAAkB,EACnCA,IAAG,YAEC,OAAO,UAAa,YACtB,SAAS,CAEb,EAOA,QAAS,SAAS,MAAO,CAMvB,QALI,MAAQ,GACR,OAAS,OAAS,KAAO,EAAI,MAAM,OACnC,SAAW,EACX,OAAS,CAAC,EAEP,EAAE,MAAQ,QAAQ,CACvB,IAAI,MAAQ,MAAM,KAAK,EACnB,QACF,OAAO,UAAU,EAAI,MAEzB,CACA,OAAO,MACT,EAEA,UAAW,SAAS,KAAM,CACxB,IAAI,IAAM,CAAC,EACX,aAAM,UAAU,MAAM,KAAK,KAAK,QAAQ,EAAE,QAAQ,SAAS,MAAO,CAChE,GACE,GAAC,MAAM,MACP,MAAM,UACN,CAAC,OAAQ,QAAS,SAAU,QAAQ,EAAE,QAAQ,MAAM,IAAI,EAAI,IAG9D,IAAI,MAAM,OAAS,kBAAmB,CACpC,MAAM,UAAU,MAAM,KAAK,MAAM,OAAO,EAAE,QAAQ,SAAS,OAAQ,CAC5D,OAAO,UACZ,IAAI,KACF,mBAAmB,MAAM,IAAI,EAC3B,IACA,mBAAmB,OAAO,KAAK,CACnC,CACF,CAAC,EACD,MACF,CACI,CAAC,WAAY,OAAO,EAAE,QAAQ,MAAM,IAAI,EAAI,IAAM,CAAC,MAAM,SAE7D,IAAI,KACF,mBAAmB,MAAM,IAAI,EAAI,IAAM,mBAAmB,MAAM,KAAK,CACvE,EACF,CAAC,EACM,IAAI,KAAK,GAAG,CACrB,CACF,EAEA,MAAM,KAAO,CACX,UAAW,SAAS,QAAS,CAC3B,IAAI,WAAa,CACf,QAAS,QAAQ,UAAY,WAAa,QAAQ,UAAY,UAC9D,SAAU,QAAQ,UACd,YAAc,QAAQ,UACtB,WACJ,QAAS,QAAQ,UACb,WAAa,QAAQ,UACrB,qBACN,EAGI,aAAe,QAAQ,UAAU,iBAAiB,0EAA0E,EAC5H,QAAU,CAAC,EAAE,MAAM,KAAK,YAAY,EACpC,kBAAoB,QAAQ,OAAOA,KAAMA,IAAG,eAAiB,IAAI,EAEjE,eAAiB,kBAAkB,CAAC,EACpC,cAAgB,kBAAkB,kBAAkB,OAAS,CAAC,EAE7D,QAAQ,iBACX,QAAQ,eAAiB,QAAQ,WAGnC,QAAQ,UAAU,aAAa,WAAY,IAAI,EAC/C,QAAQ,eAAe,MAAM,EAE7B,SAAS,gBAAgB,IAAI,SAAS,EACtC,SAAS,gBAAgB,GAAG,WAAW,SAAU,UAAW,CAC1D,SAAS,gBAAgB,IAAI,WAAW,OAAO,CACjD,CAAC,EAED,SAAS,gBAAgB,GAAG,WAAW,QAAS,SAAS,IAAK,CACxD,IAAI,SAAW,eAAiB,IAAI,SAAW,gBAEnD,SAAS,gBAAgB,GAAG,WAAW,QAAS,SAASC,KAAK,CAC5D,aAAaA,IAAG,CAClB,CAAC,CACH,CAAC,EAED,SAAS,aAAa,IAAK,CACrB,IAAI,UAAY,GAKhB,IAAI,SAAW,gBAAkB,IAAI,WACvC,IAAI,eAAe,EACnB,cAAc,MAAM,EAExB,CACF,EACA,gBAAiB,SAAS,QAAS,CACjC,IAAI,UAAY,QAAQ,UACpB,WAAa,QAAQ,UACrB,UAEA,QAAQ,WACV,QAAQ,UAAU,gBAAgB,UAAU,EAG9C,SAAS,gBAAgB,IAAI,SAAS,CACxC,EAEA,oBAAqB,SAAS,UAAW,QAAS,CAChD,IAAID,IAAK,SAAoB,SAAS,gBACtC,SAAS,gBAAgB,UAAU,IAAI,aAAa,EACpDA,IAAG,GAAG,YAAc,UAAW,UAAW,CACxC,MAAO,EACT,CAAC,CACH,EAEA,sBAAuB,SAAS,UAAW,QAAS,CAClD,SAAS,gBAAgB,UAAU,OAAO,aAAa,EACvD,IAAIA,IAAK,SAAoB,SAAS,gBACtCA,IAAG,IAAI,YAAc,SAAS,CAChC,CACF,EAGA,SAAS,gBAAgB,GAAG,YAAa,SAAS,IAAK,CACjD,IAAI,UAAY,IAClB,SAAS,gBAAgB,UAAU,IAAI,aAAa,EACpD,SAAS,gBAAgB,IAAI,WAAW,EAE5C,CAAC,EAED,MAAM,SAAW,UAAoB,CACnC,KAAK,aAAe,CAAC,EACrB,KAAK,UAAY,CAAC,EAElB,SAAS,iBAAiB,uBAAwB,KAAK,eAAe,KAAK,IAAI,CAAC,EAChF,SAAS,iBAAiB,yBAA0B,KAAK,iBAAiB,KAAK,IAAI,CAAC,EACpF,SAAS,iBAAiB,yBAA0B,KAAK,UAAU,KAAK,IAAI,CAAC,EAC7E,SAAS,iBAAiB,2BAA4B,KAAK,YAAY,KAAK,IAAI,CAAC,EACjF,SAAS,iBAAiB,uBAAwB,KAAK,eAAe,KAAK,IAAI,CAAC,EAChF,SAAS,iBAAiB,yBAA0B,KAAK,iBAAiB,KAAK,IAAI,CAAC,CACtF,EAEA,MAAM,SAAS,UAAY,OAAO,OAAO,CAAC,EAAG,MAAM,SAAS,UAAW,CACrE,gBAAiB,SAAS,UAAW,YAAa,MAAO,CACvD,IAAI,GAAK,UAAU,aAAa,iBAAiB,EAC7C,KAAO,UAAU,aAAa,mBAAmB,EAIrD,GAFA,YAAc,aAAe,KAAK,aAAa,IAAI,EAE/C,SAAO,YAAgB,KAM3B,IAAI,MAAO,CACT,IAAI,eAAiB,KAAK,cAAc,EAAE,EACtC,gBACF,KAAK,gBAAgB,EAAE,CAE3B,CAGA,GAAI,CACF,IAAI,SAAW,OAAO,OAAO,IAAI,YAAY,SAAS,EAAG,CACvD,GACA,KACA,SACF,CAAC,EACD,KAAK,UAAU,KAAK,QAAQ,CAC9B,OAAS,EAAG,CACV,QAAQ,MAAM,CAAC,CACjB,EACF,EAEA,cAAe,SAAS,GAAI,CAC1B,QAAS,EAAI,EAAG,EAAI,KAAK,UAAU,OAAQ,IACzC,GAAI,KAAK,UAAU,CAAC,EAAE,KAAO,GAC3B,OAAO,KAAK,UAAU,CAAC,CAG7B,EAEA,gBAAiB,SAAS,GAAI,CAI5B,QAHI,EAAI,KAAK,UAAU,OACnB,SAEE,KACJ,GAAI,KAAK,UAAU,CAAC,EAAE,KAAO,GAAI,CAC/B,SAAW,KAAK,UAAU,CAAC,EAC3B,KAAK,UAAU,OAAO,EAAG,CAAC,EAC1B,KACF,CAGF,OAAO,QACT,EAEA,eAAgB,SAAS,IAAK,WAAY,aAAc,CAClD,OAAO,KAAO,IAAI,YAAY,EAC9B,OAAS,MAAM,aACjB,MAAM,YAAY,EAGpB,IAAI,UAAY,YAA0B,IAAI,OAC1C,QAAU,YAA0B,IAAI,OAAO,cAAc,mBAAmB,EAEpF,GAAK,QAIL,MAAK,gBAAgB,OAAO,EAE5B,IAAI,SAAW,WAAa,aAAe,KAAK,cAAc,IAAI,OAAO,SAAS,EAG9E,gBAAkB,UAAU,iBAAiB,mBAAmB,EAChE,gBAAgB,QAClB,KAAK,gBAAgB,SAAS,EAK5B,UAAY,OAAO,SAAS,QAAW,YACzC,SAAS,OAAO,GAAG,EAIrB,WAAW,UAAW,CACpB,OAAO,cAAc,IAAI,MAAM,QAAQ,CAAC,CAC1C,EAAG,GAAG,EACR,EAEA,iBAAkB,SAAS,IAAK,CAC9B,KAAK,UAAY,KAAK,UAAU,OAAO,SAAS,SAAU,CACxD,IAAI,gBAAkB,SAAS,KAAO,IAAI,OAAO,UAEjD,OAAI,iBACE,OAAO,SAAS,UAAa,YAC/B,SAAS,SAAS,GAAG,EAIlB,CAAC,eACV,CAAC,CACH,EAEA,gBAAiB,SAAS,MAAO,CAC/B,GAAK,MAIL,KAAIE,UAAW,MAAM,iBAAiB,mBAAmB,EAEzDA,UAAS,QAAQF,KAAM,CACrB,KAAK,eAAe,KAAMA,IAAIA,IAAG,QAAQ,SAAS,CACpD,CAAC,EACH,EAEA,UAAW,SAAS,IAAK,CACvB,IAAI,SAAW,KAAK,cAAc,IAAI,OAAO,SAAS,EAGpD,OAAO,SAAa,KACpB,OAAO,SAAS,UAAa,YAE7B,SAAS,SAAS,GAAG,CAEzB,EAEA,YAAa,SAAS,IAAK,CACzB,IAAI,SAAW,KAAK,cAAc,IAAI,OAAO,SAAS,EAGpD,OAAO,SAAa,KACpB,OAAO,SAAS,YAAe,YAE/B,SAAS,WAAW,GAAG,CAE3B,EAEA,eAAgB,SAAS,IAAK,CAC5B,IAAI,SAAW,KAAK,cAAc,IAAI,OAAO,SAAS,EAGpD,OAAO,SAAa,KACpB,OAAO,SAAS,eAAkB,YAElC,SAAS,cAAc,GAAG,CAE9B,EAEA,iBAAkB,SAAS,IAAK,CAC9B,IAAI,SAAW,KAAK,cAAc,IAAI,OAAO,SAAS,EAGpD,OAAO,SAAa,KACpB,OAAO,SAAS,iBAAoB,YAEpC,SAAS,gBAAgB,GAAG,CAEhC,EAEA,SAAU,SAAS,KAAM,YAAa,MAAO,CAC3C,KAAK,aAAa,IAAI,EAAI,YAE1B,IAAIE,UAAW,SAAS,iBAAiB,uBAAyB,KAAO,IAAI,EAEzE,QACFA,UAAW,MAAM,iBAAiB,uBAAyB,KAAO,IAAI,GAGxEA,UAAS,QACP,SAAS,UAAW,CAClB,KAAK,gBAAgB,UAAW,YAAa,KAAK,CACpD,EAAE,KAAK,IAAI,CACb,CACF,EAEA,OAAQ,SAAS,QAAS,CACxB,QAAS,EAAI,EAAG,EAAI,KAAK,UAAU,OAAQ,IAAK,CAC9C,IAAI,SAAW,KAAK,UAAU,CAAC,EAC3B,SAAS,OAAY,SACnB,OAAO,SAAS,aAAgB,YAClC,SAAS,YAAY,CAG3B,CACF,CACF,CAAC,EAcD,MAAM,UAAY,UAAW,CAC3B,IAAI,YAAc,cACd,YAAc,OAAS,MAAM,UAAY,MAAM,SAAS,iBAE5D,SAAS,YAAY,MAAO,OAAQ,CAC7B,SACH,OAAS,MAAM,SAAS,aAGtB,OAAO,OAAU,WACnB,MAAQ,MAAM,QAAQ,IAAK,EAAE,GAE/B,IAAI,MAAQ,GACR,iBAAmB,sBACnB,aAAgB,QAAU,YAE9B,SAAS,qBAAqB,OAAQ,UAAW,UAAW,QAAS,CAKnE,GAJA,UAAY,MAAM,MAAM,UAAU,UAAW,CAAC,EAC9C,UAAY,MAAM,MAAM,UAAU,UAAW,GAAG,EAChD,QAAU,MAAM,MAAM,UAAU,QAAS,GAAG,EAExC,MAAM,MAAM,GAAK,QAAU,KAC7B,MAAO,GAGT,QAAU,OAAS,KAAO,QAAQ,SAAS,EAE3C,IAAI,MAAQ,OAAO,MAAM,GAAG,EACxB,cAAgB,MAAM,CAAC,EAAE,QAAQ,2BAA4B,KAAO,SAAS,EAC7E,YAAc,MAAM,CAAC,EAAK,QAAU,MAAM,CAAC,EAAK,GAEpD,OAAO,cAAgB,WACzB,CAEA,OAAQ,aAAa,MAAM,gBAAgB,EAAE,CAAC,EAAG,CAC/C,IAAK,SACH,MAAQ,qBAAqB,MAAO,CAAC,EAEjC,aAAe,OAAS,MAAM,SAAS,GAAG,IAC5C,MAAQ,MAAM,QAAQ,IAAK,OAAO,EAAI,UAGxC,MACF,IAAK,qBACH,MAAQ,qBAAqB,MAAO,CAAC,EACrC,MACF,IAAK,8BACH,MAAQ,qBAAqB,MAAO,EAAG,IAAK,GAAG,EAE3C,aAAe,OAAS,MAAM,SAAS,GAAG,IAC5C,MAAQ,MAAM,QAAQ,IAAK,OAAO,EAAI,UAGxC,MACF,IAAK,0CACH,MAAQ,qBAAqB,MAAO,EAAG,IAAK,GAAG,EAC/C,MACF,IAAK,0CACH,MAAQ,qBAAqB,MAAO,EAAG,GAAG,EAC1C,KACJ,CAEA,OAAO,aAAa,QAAQ,iBAAkB,KAAK,CACrD,CAEA,SAAS,YAAY,QAAS,CAC5B,GAAK,SAID,GAAC,QAAQ,wBAA0B,CAAC,QAAQ,uBAAuB,iBAIvE,OAAO,QAAQ,uBAAuB,kBAAoB,EACtD,QAAQ,uBAAuB,eAC/B,QAAQ,uBAAuB,gBAC7B,QAAQ,uBAAuB,cACvC,CAEA,MAAO,CACL,YACA,WACF,CACF,GAAG,EAEH,MAAM,QAAU,UAAW,CAKzB,SAAS,UAAU,IAAK,CACtB,GAAI,CAAC,IACH,MAAO,OAGT,IAAI,MAAQ,IAAI,MAAM,2FAA2F,EAEjH,OAAI,QAAU,KACL,MAAM,CAAC,EAEP,IAEX,CAKA,SAAS,iBAAiB,IAAK,KAAM,CAKnC,GAJI,CAAC,KAID,MAAQ,KACV,OAAO,IAGT,GAAI,OAAS,SACX,OAAO,KAAK,eAAe,GAAG,EAGhC,IAAI,MAAQ,IAAI,MAAM,sDAAsD,EAE5E,GAAI,OAAS,KAAM,CACjB,IAAI,OAAS,IAAI,MAAM,MAAM,CAAC,CAAC,EAC3B,OAAS,MAAM,CAAC,EAEpB,OAAO,KAAK,eAAe,OAAO,CAAC,EAAI,IAAM,KAAO,MAAM,CAC5D,CAEA,OAAO,IACT,CAEA,SAAS,eAAe,KAAM,CAC5B,OAAO,KAAK,QAAQ,YAAa,EAAE,CACrC,CAEA,SAAS,kBAAkB,OAAQ,CACjC,IAAI,MAEJ,OAAI,SAAW,OACb,MAAQ,OAAO,QAAQ,aAAc,aAAa,GAG7C,KACT,CAEA,MAAO,CACL,UACA,iBACA,eACA,iBACF,CACF,GAAG,EAEH,MAAM,iBAAmB,SAAS,UAAW,CAE3C,SAAS,aAAc,CACrB,UAAU,UAAU,OAAO,UAAW,kBAAkB,EACxD,UAAU,UAAU,IAAI,QAAQ,CAClC,CAEA,SAAS,yBAA0B,CACjC,OAAO,UAAU,cAAc,aAAa,CAC9C,CAGA,GAAI,UAAU,cAAc,KAAK,EAAG,CAClC,YAAY,EACZ,MACF,CAEA,GAAI,wBAAwB,EAAG,CAC7B,YAAY,EACZ,MACF,CAEA,IAAI,SAAW,YAAY,UAAW,CAChC,wBAAwB,IAC1B,cAAc,QAAQ,EACtB,YAAY,EAEhB,EAAG,EAAE,CACP,EAGA,MAAM,gBAAkB,SAAS,QAAS,CACxC,IAAI,UAAY,QAAQ,UAAY,QAAQ,UAAY,EAEpD,SAAW,IAAI,qBAAqB,CAAC,QAASC,YAAa,CAC7D,QAAQ,QAAQ,OAAS,CACnB,MAAM,gBACJ,OAAO,QAAQ,UAAa,aAC9B,QAAQ,SAAS,EACjBA,UAAS,UAAU,MAAM,MAAM,EAGrC,CAAC,CACH,EAAG,CAAC,WAAY,WAAY,UAAW,QAAQ,CAAC,EAEhD,SAAS,QAAQ,QAAQ,OAAO,CAClC,EAUA,MAAM,UAAY,UAAW,CAE3B,SAAS,SAAS,QAAS,CACzB,KAAK,UAAY,QAAQ,UACzB,KAAK,SAAW,QAAQ,SACxB,KAAK,qBAAuB,QAAQ,qBACpC,KAAK,mBAAqB,QAAQ,mBAClC,KAAK,mBAAqB,QAAQ,mBAClC,KAAK,wBAA0B,KAAK,mBAAmB,EACvD,KAAK,eAAiB,KAAK,uBAAuB,KAAK,uBAAuB,EAE9E,KAAK,UAAU,iBAAiB,KAAK,oBAAoB,EAAE,QAAQH,KAAM,CACvEA,IAAG,iBAAiB,SAAU,KAAK,gBAAgB,KAAK,IAAI,CAAC,CAC/D,CAAC,CACH,CAEA,gBAAS,UAAY,OAAO,OAAO,CAAC,EAAG,SAAS,UAAW,CAEzD,mBAAoB,UAAW,CAC7B,IAAI,OAAS,CAAC,EAEd,YAAK,UAAU,iBAAiB,KAAK,oBAAoB,EAAE,QAAQA,KAAM,CACvE,IAAI,KAAOA,IAAG,aAAa,MAAM,EAE7B,OAAS,SAAW,OAAS,WAC3BA,IAAG,SACL,OAAO,KAAK,CACV,MAAOA,IAAG,MACV,MAAOA,IAAG,QAAQ,KACpB,CAAC,EAGH,OAAO,KAAK,CACV,MAAOA,IAAG,MACV,MAAOA,IAAG,QAAQ,KACpB,CAAC,CAEL,CAAC,EAGD,OAAS,MAAM,MAAM,QAAQ,MAAM,EAE5B,MACT,EAEA,uBAAwB,SAAS,mBAAoB,CACnD,MAAM,yBAA2B,KAAK,mBAAmB,EACnD,SAAW,KAAK,SAEhB,6BAA+B,SAAS,KAAK,SAC1C,yBAAyB,MAAM,CAAC,CAAC,MAAO,KAAK,IAC3C,QAAQ,KAAK,IAAM,KAC3B,GAAK,QAAQ,SACf,EAGK,gCAAkC,oBAAsB,SAAS,KAAK,SACnE,QAAQ,mBAAmB,KAAK,IAAM,mBAAmB,OAAS,QAAQ,SAClF,EAGK,mBAAqB,SAAS,KAAK,SAChC,yBAAyB,MAAM,CAAC,CAAC,MAAO,KAAK,IAC3C,QAAQ,KAAK,IAAM,KAC3B,CACF,EAGK,uBAAyB,oBAAsB,SAAS,KAAM,SAC3D,QAAQ,mBAAmB,KAAK,IAAM,mBAAmB,KACjE,EAED,OAAO,8BAAgC,iCAAmC,oBAAsB,wBAA0B,IAC5H,EAEA,kBAAmB,SAAU,QAAS,CACpC,OAAQ,OAAU,CAChB,MAAM,MAAQ,MAAM,QAAQ,MACtB,MAAQ,MAAM,MACd,KAAO,MAAM,aAAa,MAAM,GAElC,OAAS,SAAW,OAAS,cAC3B,UAAY,KACV,KAAO,QACT,MAAM,QAAU,IAGlB,MAAM,QAAU,QAAQ,KAAK,IAAM,MAGzC,CACF,EAEA,gBAAiB,SAAS,CAAC,UAAU,EAAG,CACtC,MAAM,qBAAuB,KAAK,UAAU,iBAAiB,KAAK,oBAAoB,EAGhF,QAAU,KAAK,uBAAuB,CAC1C,MAAO,WAAW,QAAQ,MAC1B,MAAO,WAAW,KACpB,CAAC,EAGD,qBAAqB,QAAQ,KAAK,kBAAkB,OAAO,CAAC,EAG5D,MAAM,wBAA0B,KAAK,wBAA0B,KAAK,mBAAmB,EAEjF,OAAS,CACb,QACA,wBACA,MAAO,WAAW,MAClB,MAAO,WAAW,cAAc,QAAQ,KAC1C,EAEA,KAAK,UAAU,cAAc,IAAI,YAAY,gBAAiB,CAAC,MAAM,CAAC,CAAC,EACvE,SAAS,cAAc,IAAI,YAAY,iBAAkB,CAAC,MAAM,CAAC,CAAC,EAE7D,UAIL,KAAK,oBAAoB,OAAO,EAChC,KAAK,cAAc,OAAO,EAC1B,KAAK,aAAa,OAAO,EACzB,KAAK,iBAAiB,OAAO,EAC7B,KAAK,WAAW,OAAO,EACvB,KAAK,eAAiB,QAElB,KAAK,oBACP,KAAK,oBAAoB,OAAO,EAEpC,EAEA,cAAe,SAAS,QAAS,CAC/B,IAAI,aAAe,QAAQ,gBAAkB,CAAC,EAC1C,oBAAsB,KAAK,gBAAkB,KAAK,eAAe,gBAAkB,CAAC,EAEpF,CAAC,QAAQ,gBAAkB,aAAa,MAAQ,oBAAoB,KAIxE,KAAK,UAAU,cAAc,IAAI,YAAY,qBAAsB,CACjE,OAAQ,CACN,OACF,CACF,CAAC,CAAC,CACJ,EAEA,aAAc,SAAS,QAAS,CAC1B,KAAK,gBAAkB,QAAQ,QAAU,KAAK,eAAe,OAAS,QAAQ,mBAAqB,KAAK,eAAe,kBAI3H,KAAK,UAAU,cAAc,IAAI,YAAY,qBAAsB,CACjE,OAAQ,CACN,OACF,CACF,CAAC,CAAC,CACJ,EAEA,iBAAkB,SAAS,QAAS,CAC9B,KAAK,gBAAkB,QAAQ,aAAe,KAAK,eAAe,YAItE,KAAK,UAAU,cAAc,IAAI,YAAY,yBAA0B,CACrE,OAAQ,CACN,OACF,CACF,CAAC,CAAC,CACJ,EAEA,WAAY,SAAS,QAAS,CACxB,KAAK,gBAAkB,QAAQ,MAAQ,KAAK,eAAe,KAI/D,KAAK,UAAU,cAAc,IAAI,YAAY,mBAAoB,CAC/D,OAAQ,CACN,OACF,CACF,CAAC,CAAC,CACJ,EAEA,oBAAqB,SAAS,QAAS,CACrC,GAAI,GAAC,QAAQ,cAAgB,CAAC,SAI9B,KAAI,OAAS,OAAO,SAAS,SAAW,KAAO,OAAO,SAAS,KAAO,OAAO,SAAS,SAAW,YAAc,QAAQ,GACvH,OAAO,QAAQ,aAAa,CAAC,KAAM,MAAM,EAAG,GAAI,MAAM,EACxD,EAEA,oBAAqB,SAAS,QAAS,CACrC,KAAK,UAAU,cAAc,KAAK,kBAAkB,EAAE,MAAQ,QAAQ,GAEtE,KAAK,UAAU,cAAc,KAAK,kBAAkB,EAAE,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,CAC5G,CACF,CAAC,EAEM,QACT,GAAG,EAEH,MAAM,QAAU,UAAW,CAEzB,SAAS,iBAAiB,YAAY,EAAE,QAAQ,OAAS,CACvD,IAAI,SAAW,SAAS,cAAc,KAAK,EAC3C,SAAS,UAAU,IAAI,eAAe,EACtC,MAAM,MAAM,KAAK,MAAO,QAAQ,CAClC,CAAC,EAGD,SAAS,iBAAiB,uCAAuC,EAAE,QAAQ,QAAU,CACnF,UAAU,MAAM,CAClB,CAAC,EACD,SAAS,iBAAiB,kCAAkC,EAAE,QAAQ,QAAU,CAC9E,UAAU,MAAM,CAClB,CAAC,EAED,SAAS,UAAU,OAAQ,CAIzB,OAAO,IAAM,OAAO,IACpB,IAAI,SAAW,SAAS,cAAc,KAAK,EAC3C,SAAS,UAAU,IAAI,eAAe,EACtC,MAAM,MAAM,KAAK,OAAQ,QAAQ,CACnC,CAGA,SAAS,iBAAiB,YAAY,EAAE,QAAQ,KAAO,CACrD,IAAI,WAAW,UAAU,IAAI,YAAY,CAC3C,CAAC,CACH,EAEA,MAAM,eAAiB,UAAW,CAChC,IAAI,MAAQ,CACV,KAAM,OACN,OAAQ,QACV,EAEI,OAAS,CACX,UAAW,YACX,OAAQ,QACV,EAEI,SAAW,wCAEX,UAAY,CACd,WAAY,CACV,MAAO,cACP,IAAK,qCACL,KAAM,MAAM,MACd,EACA,MAAO,CACL,MAAO,YACP,IAAK,yCACL,KAAM,MAAM,MACd,EACA,UAAW,CACT,MAAO,0BACP,IAAK,SAAW,6CAChB,KAAM,MAAM,MACd,EACA,cAAe,CACb,MAAO,0BACP,IAAK,SAAW,oDAChB,KAAM,MAAM,MACd,EACA,oBAAqB,CACnB,MAAO,iCACP,IAAK,SAAW,kDAChB,KAAM,MAAM,IACd,CACF,EAEA,SAAS,KAAK,YAAa,SAAU,CACnC,IAAI,QAAU,UAAU,WAAW,EAEnC,GAAK,SACD,QAAQ,SAAW,OAAO,UAG9B,IADA,SAAW,UAAY,UAAW,CAAC,EAC/B,QAAQ,SAAW,OAAO,OAAQ,CACpC,SAAS,EACT,MACF,CAEA,QAAQ,OAAS,OAAO,UAExB,IAAI,IAEJ,OAAQ,QAAQ,KAAM,CACpB,KAAK,MAAM,OACT,IAAM,gBAAgB,QAAS,QAAQ,EACvC,MACF,KAAK,MAAM,KACT,IAAM,cAAc,QAAS,QAAQ,EACrC,KACJ,CAEA,IAAI,GAAK,QAAQ,MACjB,QAAQ,QAAU,IAElB,IAAI,eAAiB,SAAS,qBAAqB,QAAQ,IAAI,EAAE,CAAC,EAClE,eAAe,WAAW,aAAa,IAAK,cAAc,EAC5D,CAEA,SAAS,gBAAgB,QAAS,SAAU,CAC1C,IAAI,IAAM,SAAS,cAAc,QAAQ,EACzC,WAAI,IAAM,QAAQ,IAClB,IAAI,iBAAiB,OAAQ,UAAW,CACtC,QAAQ,OAAS,OAAO,OACxB,SAAS,CACX,CAAC,EACM,GACT,CAEA,SAAS,cAAc,QAAS,SAAU,CACxC,IAAI,IAAM,SAAS,cAAc,MAAM,EACvC,WAAI,KAAO,QAAQ,IACnB,IAAI,IAAM,aACV,IAAI,KAAO,WACX,IAAI,iBAAiB,OAAQ,UAAW,CACtC,QAAQ,OAAS,OAAO,OACxB,SAAS,CACX,CAAC,EACM,GACT,CAEA,MAAO,CACL,IACF,CACF,GAAG,EAEH,OAAO,cAAgB,UAAW,CAChC,MAAM,OAAO,aAAe,GAI5B,oBAAoB,EACjB,KAAK,UAAW,CACf,MAAM,OAAO,WAAa,GAC1B,MAAM,OAAO,aAAe,GAC5B,SAAS,cAAc,IAAI,YAAY,YAAY,CAAC,CACtD,CAAC,CACL,EAEA,SAAS,qBAAsB,CAC7B,IAAI,KACA,QAEA,SAAW,IAAI,QAAQ,CAAC,QAAS,SAAW,CAC9C,KAAO,YAAY,UAAW,CACvB,QAIL,cAAc,IAAI,EAClB,aAAa,OAAO,EACpB,QAAQ,EACV,EAAG,GAAG,EAEN,QAAU,WAAW,UAAW,CAC9B,cAAc,IAAI,EAClB,OAAO,CACT,EAAG,GAAI,CACT,CAAC,EAED,OAAO,QACT,CAq6CA,GAn6CA,MAAM,aAAe,UAAW,CAC9B,IAAI,QAAU,CACZ,QAAS,UACT,OAAQ,SACR,aAAc,oBAChB,EAEI,SAAW,CACb,WAAY,GACZ,OAAQ,GACR,SAAU,GACV,KAAM,GACN,MAAO,GACP,YAAa,GACb,SAAU,GACV,MAAO,EACT,EAEA,SAAS,YAAY,MAAO,QAAS,QAAS,CAC5C,KAAK,MAAQ,MACb,KAAK,GAAK,SAAS,eAAe,KAAK,EACvC,KAAK,QAAU,QACf,KAAK,OAAS,KACd,KAAK,QAAU,QAEX,KAAK,SAAW,KAAK,QAAQ,cAC/B,KAAK,OAAS,KAAK,GAAG,QAAQ,KAAK,QAAQ,WAAW,GAGxD,KAAK,aAAa,EAEd,MAAM,OAAO,WACf,KAAK,KAAK,GAEV,MAAM,cAAc,KAAK,QAAS,OAAO,aAAa,EACtD,SAAS,iBAAiB,aAAc,KAAK,KAAK,KAAK,IAAI,CAAC,EAEhE,CAEA,mBAAY,UAAY,OAAO,OAAO,CAAC,EAAG,YAAY,UAAW,CAC/D,KAAM,UAAW,CACf,IAAI,KAAO,SACX,KAAK,GAAK,KAAK,QAEf,KAAK,YAAc,IAAI,MAAM,OAAO,KAAK,GAAI,IAAI,EAEjD,KAAK,YAAY,MAAM,EAAE,KAAK,KAAK,YAAY,KAAK,IAAI,CAAC,CAC3D,EAEA,YAAa,UAAW,CACtB,KAAK,OAAS,KAAK,GAAG,cAAc,QAAQ,EAC5C,KAAK,OAAO,aAAa,WAAY,IAAI,EAEzC,KAAK,YAAY,SAAS,EAAI,EAE9B,KAAK,YAAY,EAGjB,IAAI,SAAW,IAAI,qBAAqB,CAAC,QAASG,YAAa,CAC7D,QAAQ,QAAQ,OAAS,CACnB,MAAM,eACR,KAAK,KAAK,EAEV,KAAK,MAAM,CAEf,CAAC,CACH,EAAG,CAAC,WAAY,kBAAkB,CAAC,EAEnC,SAAS,QAAQ,KAAK,MAAM,CAC9B,EAEA,aAAc,UAAW,CAClB,KAAK,QACV,KAAK,OAAO,UAAU,IAAI,QAAQ,OAAO,CAC3C,EAEA,YAAa,UAAW,CACjB,KAAK,SACV,KAAK,OAAO,UAAU,OAAO,QAAQ,OAAO,EAC5C,KAAK,OAAO,UAAU,IAAI,QAAQ,MAAM,EACpC,SAAW,QAAQ,YACjB,OAAO,KAAM,IAAI,YAAY,EAErC,EAEA,kBAAmB,UAAW,CACvB,KAAK,QACV,KAAK,OAAO,UAAU,IAAI,QAAQ,YAAY,CAChD,EAEA,KAAM,UAAW,CACX,KAAK,aAAe,OAAO,KAAK,YAAY,MAAS,YACvD,KAAK,YAAY,KAAK,CAE1B,EAEA,MAAO,UAAW,CACZ,KAAK,aAAe,OAAO,KAAK,YAAY,OAAU,YACxD,KAAK,YAAY,MAAM,CAE3B,EAEA,QAAS,UAAW,CACd,KAAK,aAAe,OAAO,KAAK,YAAY,SAAY,YAC1D,KAAK,YAAY,QAAQ,CAE7B,CACF,CAAC,EAEM,WACT,GAAG,EAEH,OAAO,wBAA0B,UAAW,CAC1C,MAAM,OAAO,aAAe,GAC5B,SAAS,cAAc,IAAI,YAAY,cAAc,CAAC,CACxD,EAWA,MAAM,SAAW,UAAW,CAC1B,IAAI,QAAU,CACZ,QAAS,UACT,OAAQ,SACR,aAAc,oBAChB,EAEI,SAAW,CACb,MAAO,KACP,OAAQ,IACR,WAAY,CACV,SAAU,EACV,SAAU,EACV,eAAgB,EAChB,SAAU,EACV,GAAI,EACJ,eAAgB,EAChB,eAAgB,EAChB,YAAa,EACb,IAAK,CACP,CACF,EAEA,SAAS,QAAQ,MAAO,QAAS,CAC/B,KAAK,MAAQ,MACb,KAAK,OAAS,KAEd,KAAK,gBAAkB,GAGvB,SAAS,OAAS,CAChB,QAAS,KAAK,mBAAmB,KAAK,IAAI,EAC1C,cAAe,KAAK,mBAAmB,KAAK,IAAI,CAClD,EAEA,KAAK,QAAU,OAAO,OAAO,CAAC,EAAG,SAAU,OAAO,EAE9C,KAAK,UACH,KAAK,QAAQ,cACf,KAAK,OAAS,SAAS,eAAe,KAAK,KAAK,EAAE,QAAQ,KAAK,QAAQ,WAAW,GAK/E,KAAK,QAAQ,WAChB,KAAK,QAAQ,WAAW,SAAW,KAAK,QAAQ,UAG9C,KAAK,QAAQ,QAAU,UACzB,KAAK,QAAQ,WAAW,SAAW,EACnC,KAAK,QAAQ,WAAW,SAAW,IAKvC,KAAK,aAAa,EAEd,MAAM,OAAO,aACf,KAAK,KAAK,GAEV,MAAM,cAAc,KAAK,YAAY,EACrC,SAAS,iBAAiB,eAAgB,KAAK,KAAK,KAAK,IAAI,CAAC,EAElE,CAEA,eAAQ,UAAY,OAAO,OAAO,CAAC,EAAG,QAAQ,UAAW,CACvD,KAAM,UAAW,CACf,KAAK,YAAc,IAAI,GAAG,OAAO,KAAK,MAAO,KAAK,OAAO,CAC3D,EAEA,mBAAoB,SAAS,IAAK,CAChC,KAAK,OAAS,SAAS,eAAe,KAAK,KAAK,EAChD,KAAK,OAAO,aAAa,WAAY,IAAI,EAErC,KAAK,QAAQ,QAAU,SACzB,IAAI,OAAO,KAAK,EAIlB,IAAI,SAAW,IAAI,qBAAqB,CAAC,QAASA,YAAa,CAC7D,QAAQ,QAAQ,OAAS,CACnB,MAAM,eACR,KAAK,KAAK,EAEV,KAAK,MAAM,CAEf,CAAC,CACH,EAAG,CAAC,WAAY,kBAAkB,CAAC,EAEnC,SAAS,QAAQ,KAAK,MAAM,CAC9B,EAEA,mBAAoB,SAAS,IAAK,CAChC,OAAQ,IAAI,KAAM,CAChB,IAAK,GAGC,KAAK,kBACP,KAAK,YAAY,EACjB,KAAK,kBAAkB,GAEzB,MACF,IAAK,GACH,KAAK,KAAK,GAAG,EACb,MACF,IAAK,GACH,KAAK,YAAY,EACjB,MACF,IAAK,GACH,KAAK,gBAAkB,GACvB,KACJ,CACF,EAEA,aAAc,UAAW,CAClB,KAAK,QACV,KAAK,OAAO,UAAU,IAAI,QAAQ,OAAO,CAC3C,EAEA,YAAa,UAAW,CACjB,KAAK,SACV,KAAK,OAAO,UAAU,OAAO,QAAQ,OAAO,EAC5C,KAAK,OAAO,UAAU,IAAI,QAAQ,MAAM,EACpC,SAAW,QAAQ,YACjB,OAAO,KAAM,IAAI,YAAY,EAErC,EAEA,kBAAmB,UAAW,CACvB,KAAK,QACV,KAAK,OAAO,UAAU,IAAI,QAAQ,YAAY,CAChD,EAEA,KAAM,UAAW,CACX,KAAK,aAAe,OAAO,KAAK,YAAY,WAAc,YAC5D,KAAK,YAAY,UAAU,CAE/B,EAEA,MAAO,UAAW,CACZ,KAAK,aAAe,OAAO,KAAK,YAAY,YAAe,YAC7D,KAAK,YAAY,WAAW,CAEhC,EAEA,QAAS,UAAW,CACd,KAAK,aAAe,OAAO,KAAK,YAAY,SAAY,YAC1D,KAAK,YAAY,QAAQ,CAE7B,CACF,CAAC,EAEM,OACT,GAAG,GAGF,UAAW,CACV,IAAI,EAAI,GACJ,EAEJ,SAAS,KAAK,iBAAiB,aAAc,SAAS,EAAG,CACvD,GAAI,CAAC,EAAE,OAAO,QAAQ,kBAAkB,EACtC,OAAO,EAAI,GAGb,EAAI,GACJ,EAAI,CACF,EAAG,EAAE,QAAQ,CAAC,EAAE,MAChB,EAAG,EAAE,QAAQ,CAAC,EAAE,KAClB,CACF,CAAC,EAED,SAAS,KAAK,iBAAiB,YAAa,SAAS,EAAG,CACtD,GAAI,GAAK,EAAE,WAAY,CACrB,IAAI,EAAI,CACN,EAAG,EAAE,QAAQ,CAAC,EAAE,MAAQ,EAAE,EAC1B,EAAG,EAAE,QAAQ,CAAC,EAAE,MAAQ,EAAE,CAC5B,EACA,KAAK,IAAI,EAAE,CAAC,EAAI,SAAS,SAAS,eAAiB,EAAE,eAAe,CACtE,CACF,EAAG,CAAE,QAAS,EAAG,CAAC,CACpB,GAAG,EAeH,MAAM,cAAgB,UAAY,CAChC,SAAS,aAAa,CAAE,SAAAD,UAAU,UAAW,KAAM,EAAI,CAAC,EAAG,CACzD,KAAK,SAAWA,WAAY,CAAC,EAC7B,KAAK,eAAiB,CAAC,EACvB,KAAK,UAAY,UACjB,KAAK,MAAQ,EAAQ,KACvB,CAEA,oBAAa,UAAY,OAAO,OAAO,CAAC,EAAG,aAAa,UAAW,CACjE,WAAY,SAAU,SAAU,UAAW,cAAgB,GAAM,CAC/D,MAAM,cAAgB,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAC1D,cAAgB,KAAK,iBAAiB,cAAe,SAAS,EAE9D,eAAiB,KAAK,SAAS,IAAI,SAAW,CAElD,MAAM,IAAM,GAAG,QAAQ,eAAe,QAAQ,SAAS,IAAI,cAAc,SAAS,CAAC,GAC7E,iBAAmB,eAAiB,cAAc,MAAQ,IAEhE,OAAO,KAAK,eAAe,KAAK,gBAAgB,EAC5C,KAAK,uBAAuB,iBAAkB,OAAO,EACrD,KAAK,uBAAuB,IAAK,OAAO,CAC9C,CAAC,EAED,OAAI,eAAe,KAAK,cAAc,aAAa,EAE5C,QAAQ,IAAI,cAAc,CACnC,EAEA,uBAAwB,SAAU,IAAK,QAAS,CAC9C,MAAM,cAAgB,KAAK,eAAe,KAAK,GAAG,EAElD,YAAK,IAAI,4CAA4C,cAAc,GAAG,EAAE,EACxE,KAAK,cAAc,cAAc,KAAM,OAAO,EACvC,QAAQ,QAAQ,OAAO,CAChC,EAEA,uBAAwB,SAAU,IAAK,QAAS,CAC9C,YAAK,IAAI,2CAA2C,GAAG,EAAE,EAElD,IAAI,QAAQ,CAAC,QAAS,SAAW,CACtC,MAAM,GAAG,EACN,KAAK,UAAY,SAAS,KAAK,CAAC,EAChC,KAAK,cAAgB,CACpB,MAAM,KAAO,aACb,KAAK,eAAiB,CAAC,GAAG,KAAK,eAAgB,CAAE,KAAM,GAAI,CAAC,EAC5D,KAAK,cAAc,KAAM,OAAO,EAChC,QAAQ,OAAO,CACjB,CAAC,EACA,MAAM,KAAO,OAAO,GAAG,CAAC,CAC7B,CAAC,CACH,EAEA,cAAe,SAAU,KAAM,QAAS,CACtC,KAAK,IACH,6CAA6C,KAAK,UAAU,OAAO,CAAC,EACtE,EAEA,MAAM,OAAS,IAAI,UAAU,EAAE,gBAAgB,KAAM,WAAW,EAChE,GAAI,KAAK,UACP,KAAK,UAAU,OAAQ,OAAO,UAE1B,OAAO,QAAQ,QAAW,SAAU,CACtC,IAAI,aAAe,OAAO,eAAe,QAAQ,MAAM,EACvD,GAAI,CAAC,aACH,OAGF,SAAS,eAAe,QAAQ,MAAM,EAAE,UACtC,aAAa,SACjB,MACE,QAAQ,OAAO,QAAQ,IAAM,CAC3B,SAAS,eAAe,EAAE,EAAE,UAC1B,OAAO,eAAe,EAAE,EAAE,SAC9B,CAAC,EAIL,OAAO,OACT,EAEA,iBAAkB,SAAU,cAAe,UAAW,CACpD,MAAM,MAAQ,IAAI,gBAAgB,aAAa,EACzC,gBAAkB,CAAC,UAAW,IAAK,kBAAmB,MAAM,EAIlE,SAAW,CAAC,IAAK,KAAK,IAAK,MAAM,QAAQ,EACnC,CAAC,UAAU,OAAO,GAAG,EAAE,SAAS,KAAK,GAAK,CAAC,gBAAgB,SAAS,GAAG,GACzE,MAAM,OAAO,GAAG,EAKpB,SAAW,CAAC,IAAK,KAAK,IAAK,UAAU,QAAQ,EACvC,CAAC,MAAM,OAAO,GAAG,EAAE,SAAS,KAAK,GAAK,QAAU,IAClD,MAAM,OAAO,IAAK,KAAK,EAI3B,OAAO,KACT,EAEA,cAAe,SAAU,aAAc,CACrC,QAAQ,UACN,CAAC,EACD,GACA,GAAG,OAAO,SAAS,QAAQ,GACzB,cAAgB,IAAI,OAAO,YAAY,CACzC,EACF,CACF,EAEA,IAAK,YAAa,KAAM,CAClB,KAAK,OACP,QAAQ,IAAI,GAAG,IAAI,CAEvB,CACF,CAAC,EAEM,YACT,GAAG,EAEC,OAAO,SAAW,OAAO,QAAQ,OAAS,WAAa,UAAU,YAAc,OAAO,QAAQ,YAChG,UAAU,WAAW,4CAA6C,IAAI,gBAAgB,CACpF,KAAM,OAAO,QAAQ,KACrB,UAAW,OAAO,OAAS,OAAO,MAAM,UAAY,GAAG,OAAO,MAAM,SAAS,SAAS,KAAK,OAAO,MAAM,SAAS,YAAY,GAC7H,KAAM,OAAO,QAAQ,MAAM,KAC3B,MAAO,OAAO,SAAS,SACvB,QAAS,OAAO,QAAQ,MAAM,GAC9B,aAAc,OAAO,QAAQ,MAAM,gBAAkB,EACrD,cAAe,CAAC,CAAC,OAAO,QAAQ,UAClC,CAAC,CAAC,EAEJ,MAAM,KAAO,CACX,QAAS,UAAW,CAClB,IAAI,IAAM,GAAG,OAAO,MAAM,OAAO,KAAM,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,EAC/D,OAAO,MAAM,IAAK,CAChB,YAAa,cACb,OAAQ,KACV,CAAC,EAAE,KAAK,UAAY,SAAS,KAAK,CAAC,CACrC,EAEA,qBAAsB,UAAW,CAC/B,IAAI,IAAM,GAAG,OAAO,MAAM,OAAO,SAAU,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,EAEnE,WAAM,IAAI,QAAQ,GAAG,IAAM,GAAM,IAAM,aAAiB,IAAM,aAEvD,MAAM,IAAK,CAChB,YAAa,cACb,OAAQ,KACV,CAAC,EACA,KAAK,SAAS,SAAU,CAAC,OAAO,SAAS,KAAK,CAAC,CAAC,CACnD,EAEA,WAAY,SAAS,IAAK,IAAK,CAC7B,OAAO,KAAK,YAAY,CACtB,IAAK,GAAG,OAAO,MAAM,OAAO,WAAY,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,EAChE,KAAM,KAAK,UAAU,CACnB,GAAI,IACJ,SAAU,GACZ,CAAC,CACH,CAAC,CACH,EAEA,YAAa,SAAS,OAAQ,CAC5B,OAAO,MAAM,OAAO,IAAK,CACvB,OAAQ,OACR,KAAM,OAAO,KACb,YAAa,cACb,QAAS,CACP,eAAgB,mBAChB,mBAAoB,gBACtB,CACF,CAAC,EACA,KAAK,UAAY,SAAS,KAAK,CAAC,EAChC,KAAK,SAAS,KAAM,CACnB,OAAO,IACT,CAAC,CACH,EAEA,gBAAiB,SAAS,IAAK,MAAO,CACpC,OAAO,KAAK,YAAY,CACtB,IAAK,kBACL,KAAM,KAAK,UAAU,CACnB,WAAY,CACV,CAAC,GAAG,EAAG,MAAM,KAAK,kBAAkB,KAAK,CAC3C,CACF,CAAC,CACH,CAAC,CACH,EAEA,WAAY,SAAS,KAAM,CACzB,OAAO,KAAK,YAAY,CACtB,IAAK,kBACL,KAAM,KAAK,UAAU,CACnB,KAAM,MAAM,KAAK,kBAAkB,IAAI,CACzC,CAAC,CACH,CAAC,CACH,EAEA,kBAAmB,SAAS,UAAW,CACrC,OAAK,OAAO,WAAe,WACzB,WAAa,GACT,YAAc,cAChB,UAAY,KAGT,UAAU,KAAK,CACxB,CACF,EAOA,MAAM,UAAY,UAAW,CAC3B,IAAI,UAAY,CACd,SAAU,kBACV,YAAa,mBACb,UAAW,mBACX,QAAS,iBACT,SAAU,kBAEV,WAAY,qBACZ,SAAU,gBACV,cAAe,wBACf,YAAa,iBACf,EAEI,QAAU,CACZ,WAAY,cACd,EAEI,OAAS,CACX,cAAe,EACjB,EAEA,SAAS,SAAS,KAAM,CACjB,OAIL,KAAK,KAAO,KACZ,KAAK,QAAU,KAAK,WACpB,KAAK,SAAW,KAAK,QAAQ,SAC7B,KAAK,UAAY,SAAW,KAAK,SACjC,KAAK,SAAW,KAAK,cAAc,UAAU,QAAQ,EACrD,KAAK,UAAY,KAAK,cAAc,UAAU,WAAW,EAEzD,KAAK,UAAY,KAAK,cAAc,UAAU,SAAS,EACvD,KAAK,QAAU,KAAK,cAAc,UAAU,OAAO,EACnD,KAAK,SAAW,KAAK,cAAc,UAAU,QAAQ,EACrD,KAAK,cAAgB,KAAK,cAAc,UAAU,aAAa,EAC/D,KAAK,UAAY,KAAK,cAAc,UAAU,QAAQ,EAElD,KAAK,gBACP,OAAO,cAAgB,IAGzB,KAAK,KAAK,EACZ,CAEA,gBAAS,UAAY,OAAO,OAAO,CAAC,EAAG,SAAS,UAAW,CACzD,KAAM,UAAW,CACf,KAAK,iBAAiB,EAEtB,SAAS,iBAAiB,gBAAkB,KAAK,UAAW,KAAK,gBAAgB,KAAK,IAAI,CAAC,EAE3F,KAAK,KAAK,GAAG,SAAW,KAAK,UAAW,KAAK,SAAS,KAAK,IAAI,CAAC,EAE5D,KAAK,WACP,KAAK,UAAU,iBAAiB,SAAU,UAAW,CACnD,IAAI,QAAU,KAAK,MACnB,MAAM,KAAK,WAAW,OAAO,CAC/B,CAAC,EAIH,SAAS,iBAAiB,aAAc,UAAW,CACjD,KAAK,UAAU,CACjB,EAAE,KAAK,IAAI,CAAC,CACd,EAEA,OAAQ,UAAW,CACjB,KAAK,iBAAiB,CACxB,EAEA,SAAU,SAAS,IAAK,CAGtB,GAFA,KAAK,UAAU,UAAU,IAAI,QAAQ,UAAU,EAE3C,OAAO,eACL,MAAK,cAAc,QAGrB,aAAM,MAAM,QAAQ,qBAAqB,EACzC,KAAK,UAAU,UAAU,OAAO,QAAQ,UAAU,EAClD,IAAI,eAAe,EACZ,EAGb,EAKA,kBAAmB,SAAS,KAAM,CAChC,IAAI,OAAS,IAAI,UACb,IAAM,OAAO,gBAAgB,KAAM,WAAW,EAClD,MAAO,CACL,MAAO,IAAI,cAAc,cAAc,EACvC,UAAW,IAAI,cAAc,kBAAkB,CACjD,CACF,EAEA,UAAW,UAAW,CACpB,MAAM,KAAK,qBAAqB,EAAE,KAAK,KAAK,WAAW,KAAK,IAAI,CAAC,CACnE,EAEA,WAAY,SAAS,KAAM,CACzB,IAAI,OAAS,KAAK,kBAAkB,IAAI,EACpC,MAAQ,OAAO,MACf,MAAQ,SAAS,MAAM,QAAQ,KAAK,EACpC,SAAW,MAAM,QAAQ,aACzB,QAAU,MAAM,QAAQ,YAE5B,KAAK,oBAAoB,OAAO,SAAS,EACzC,KAAK,cAAc,OAAO,EAEtB,MAAQ,EACV,KAAK,QAAQ,UAAU,OAAO,UAAU,EAExC,KAAK,QAAQ,UAAU,IAAI,UAAU,EAGvC,KAAK,YAAY,KAAK,EAGtB,KAAK,SAAS,UAAY,GAC1B,KAAK,SAAS,OAAO,KAAK,EAG1B,KAAK,SAAS,UAAY,MAAM,SAAS,YAAY,SAAU,MAAM,SAAS,WAAW,EAEzF,KAAK,OAAO,EAER,OAAO,KAAO,IAAI,YAAY,EAE9B,SAAW,QAAQ,0BACrB,QAAQ,yBAAyB,WAAW,CAEhD,EAEA,oBAAqB,SAAS,OAAQ,CAC/B,KAAK,YAGV,KAAK,UAAU,UAAY,GAC3B,KAAK,UAAU,OAAO,MAAM,EAC9B,EAKA,iBAAkB,UAAW,CAC3B,KAAK,KAAK,iBAAiB,UAAU,WAAW,EAAE,QAAQF,KAAM,CAC9D,IAAI,SAAW,IAAI,MAAM,YAAYA,IAAI,CACvC,UAAW,KAAK,UAChB,OAAQ,EACV,CAAC,CACH,CAAC,CACH,EAEA,gBAAiB,SAAS,IAAK,CAC7B,IAAI,IAAM,IAAI,OAAO,CAAC,EAClB,IAAM,IAAI,OAAO,CAAC,EAClBA,IAAK,IAAI,OAAO,CAAC,EAEjB,CAAC,KAAO,CAAC,MAKTA,KACFA,IAAG,UAAU,IAAI,YAAY,EAG/B,MAAM,KAAK,WAAW,IAAK,GAAG,EAC3B,KAAK,SAAS,KAAM,CACf,KAAK,WAAa,EACpB,KAAK,QAAQ,UAAU,OAAO,UAAU,EAExC,KAAK,QAAQ,UAAU,IAAI,UAAU,EAGvC,KAAK,UAAU,EAEf,SAAS,cAAc,IAAI,YAAY,eAAgB,CACrD,OAAQ,CACN,IACF,CACF,CAAC,CAAC,CACJ,EAAE,KAAK,IAAI,CAAC,EACX,MAAM,SAAS,eAAe,CAAC,CAAC,EACrC,EAKA,eAAgB,SAAS,SAAU,CACjC,KAAK,KAAK,cAAc,UAAU,QAAQ,EAAE,UAAY,MAAM,SAAS,YAAY,SAAU,MAAM,SAAS,WAAW,CACzH,EAEA,cAAe,SAAS,QAAS,CAC/B,GAAK,KAAK,QAIV,GAAI,QAAU,EAAG,CACf,IAAI,OAAS,MAAM,SAAS,YAAY,QAAS,MAAM,SAAS,WAAW,EAC3E,KAAK,QAAQ,UAAU,OAAO,MAAM,EACpC,KAAK,QAAQ,UAAY,MAAM,QAAQ,YAAY,QAAQ,YAAa,MAAM,CAChF,MACE,KAAK,QAAQ,UAAU,IAAI,MAAM,CAErC,EAEA,YAAa,SAAS,MAAO,CAC3B,IAAI,SAAW,SAAS,iBAAiB,wBAAwB,EAE7D,SAAS,QACX,SAAS,QAAQA,KAAM,CACrBA,IAAG,UAAY,KACjB,CAAC,EAIH,IAAI,QAAU,SAAS,iBAAiB,UAAU,UAAU,EACxD,QAAQ,SACN,MAAQ,EACV,QAAQ,QAAQ,GAAK,CACnB,EAAE,UAAU,IAAI,4BAA4B,CAC9C,CAAC,EAED,QAAQ,QAAQ,GAAK,CACnB,EAAE,UAAU,OAAO,4BAA4B,CACjD,CAAC,EAGP,CACF,CAAC,EAEM,QACT,GAAG,EAIH,MAAM,cAAgB,UAAW,CAC/B,IAAI,UAAY,CACd,QAAS,uBACT,OAAQ,uBACR,YAAa,8BACb,KAAM,2BACR,EAEI,QAAU,CACZ,KAAM,OACN,KAAM,UACN,WAAY,2BACZ,KAAM,0BACR,EAEI,UAAY,eAEZ,gBAAkB,GAEtB,SAAS,KAAK,MAAO,CACnB,IAAIA,IAAK,OAAgB,SACzBA,IAAG,iBAAiB,UAAU,OAAO,EAAE,QAAQ,SAAW,CACxD,IAAI,MAAQ,QAAQ,UAAU,SAAS,QAAQ,IAAI,EACnD,QAAQ,aAAa,gBAAiB,KAAK,EAE3C,QAAQ,IAAI,QAAU,SAAS,EAC/B,QAAQ,GAAG,QAAU,UAAW,MAAM,CACxC,CAAC,CACH,CAEA,SAAS,OAAO,IAAK,CACnB,GAAI,iBAIJ,iBAAkB,GAElB,IAAIA,IAAK,IAAI,cACT,OAASA,IAAG,UAAU,SAAS,QAAQ,IAAI,EAC3C,MAAQA,IAAG,UAAU,SAAS,QAAQ,IAAI,EAC1C,SAAWA,IAAG,aAAa,eAAe,EAC1C,UAAY,SAAS,eAAe,QAAQ,EAOhD,GALK,WACH,SAAWA,IAAG,QAAQ,UAIpB,EAAC,SAOL,IAAI,CAAC,UAAW,CACd,IAAI,gBAAkB,SAAS,iBAAiB,aAAe,SAAW,IAAI,EAC1E,gBAAgB,OAAS,IAC3B,UAAYA,IAAG,WAAW,cAAc,aAAe,SAAW,IAAI,EAE1E,CAEA,GAAI,CAAC,UAAW,CACd,gBAAkB,GAClB,MACF,CAEA,IAAI,OAAS,UAAU,cAAc,UAAU,WAAW,EAAE,aACxD,aAAe,UAAU,UAAU,SAAS,QAAQ,UAAU,EAC9D,oBAAsB,UAAU,WAAW,QAAQ,UAAU,MAAM,EACnE,YAAc,OAElB,GAAI,MAAO,CACT,GAAG,OAAQ,CACT,gBAAkB,GAClB,MACF,CAEA,IAAI,UACJ,SAAS,iBAAiB,UAAU,KAAO,aAAcA,IAAG,QAAQ,GAAI,IAAI,EAAE,QAAQA,KAAM,CAC1FA,IAAG,UAAU,OAAO,QAAQ,IAAI,EAChC,UAAY,SAAS,cAAc,IAAMA,IAAG,aAAa,eAAe,CAAC,EACzE,oBAAoB,UAAW,EAAG,EAAI,CACxC,CAAC,CACH,CA0BA,GAtBI,QAAU,cACZ,WAAW,UAAW,CACpB,OAAS,EACT,oBAAoB,UAAW,OAAQ,OAAQ,YAAY,CAC7D,EAAG,CAAC,EAGF,QAAU,CAAC,eACb,OAAS,GAGXA,IAAG,aAAa,gBAAiB,CAAC,MAAM,EACpC,OACFA,IAAG,UAAU,OAAO,QAAQ,IAAI,EAEhCA,IAAG,UAAU,IAAI,QAAQ,IAAI,EAG/B,oBAAoB,UAAW,OAAQ,OAAQ,YAAY,EAIvD,oBAAqB,CACvB,IAAI,aAAe,oBAAoB,MAAM,OAEzC,QAAU,eAAiB,SAC7B,YAAc,GAGhB,IAAI,YAAc,OACA,oBAAoB,aAAe,YACnC,OAAS,oBAAoB,aAE/C,oBAAoB,oBAAqB,YAAa,GAAO,EAAK,CACpE,CAKA,GAAI,OAAO,IAAK,CACd,IAAI,IAAM,UAAU,cAAc,gCAAgC,EAClE,GAAI,CAAC,IAAO,OACZ,IAAI,IAAI,QAAU,SAAS,EAC3B,IAAI,GAAG,QAAU,UAAW,UAAW,CACrC,OAAS,UAAU,cAAc,UAAU,WAAW,EAAE,aACxD,oBAAoB,UAAW,OAAQ,OAAQ,YAAY,CAC7D,CAAC,CACH,GACF,CAEA,SAAS,oBAAoB,UAAW,OAAQ,OAAQ,aAAc,CAYpE,GAXA,UAAU,UAAU,OAAO,QAAQ,IAAI,EACvC,MAAM,MAAM,kBAAkB,UAAW,UAAW,CAElD,UAAU,MAAM,OAAS,OAAO,KAC5B,OACF,UAAU,UAAU,OAAO,QAAQ,IAAI,EAEvC,UAAU,UAAU,IAAI,QAAQ,IAAI,CAExC,CAAC,EAEG,CAAC,QAAU,aAAc,CAC3B,IAAI,EAAI,UACR,OAAO,WAAW,UAAW,CAC3B,EAAE,IAAI,SAAS,MAAM,EACrB,gBAAkB,EACpB,EAAG,GAAG,CACR,MACE,gBAAkB,EAEtB,CAEA,MAAO,CACL,IACF,CACF,GAAG,EAGH,MAAM,YAAc,UAAW,CAC7B,IAAI,UAAY,CACd,eAAgB,yBAChB,eAAgB,yBAChB,iBAAkB,2BAClB,gBAAiB,0BACjB,kBAAmB,0BACrB,EAEI,QAAU,CACZ,YAAa,0BACf,EAEA,SAAS,WAAW,WAAY,CAC9B,KAAK,UAAY,WACjB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,CACvB,CAEA,kBAAW,UAAY,OAAO,OAAO,CAAC,EAAG,WAAW,UAAW,CAC7D,gBAAiB,UAAW,CAC1B,KAAK,MAAQ,CACX,eAAgB,KAAK,UAAU,QAAQ,UAAU,cAAc,EAC/D,eAAgB,KAAK,UAAU,cAAc,UAAU,cAAc,EACrE,iBAAkB,KAAK,UAAU,cAC/B,UAAU,gBACZ,EACA,gBAAiB,KAAK,UAAU,cAC9B,UAAU,eACZ,EACA,kBAAmB,KAAK,UAAU,iBAChC,UAAU,iBACZ,CACF,CACF,EAEA,gBAAiB,UAAW,CAC1B,KAAK,cAAgB,KAAK,oBAAoB,EAE9C,KAAK,MAAM,iBAAiB,iBAC1B,QACA,KAAK,cAAc,UACrB,EAEA,KAAK,MAAM,kBAAkB,QAAQ,SAAS,iBAAkB,CAC9D,iBAAiB,iBACf,QACA,KAAK,cAAc,cACrB,CACF,EAAG,IAAI,EAEP,KAAK,UAAU,iBACb,QACA,KAAK,cAAc,iBACrB,EAEA,KAAK,MAAM,eAAe,iBACxB,WACA,KAAK,cAAc,wBACrB,EAEA,KAAK,MAAM,iBAAiB,iBAC1B,WACA,KAAK,cAAc,0BACrB,EAEA,SAAS,KAAK,iBAAiB,QAAS,KAAK,cAAc,WAAW,CACxE,EAEA,oBAAqB,UAAW,CAC9B,MAAO,CACL,eAAgB,KAAK,gBAAgB,KAAK,IAAI,EAC9C,WAAY,KAAK,YAAY,KAAK,IAAI,EACtC,YAAa,KAAK,aAAa,KAAK,IAAI,EACxC,kBAAmB,KAAK,mBAAmB,KAAK,IAAI,EACpD,yBAA0B,KAAK,0BAA0B,KAAK,IAAI,EAClE,2BAA4B,KAAK,4BAA4B,KAAK,IAAI,CACxE,CACF,EAEA,gBAAiB,SAASD,OAAO,CAC/BA,OAAM,eAAe,EAErB,KAAK,YAAYA,OAAM,cAAc,QAAQ,KAAK,CACpD,EAEA,4BAA6B,SAASA,OAAO,CAC3C,IAAI,oBACF,KAAK,UAAU,SAASA,OAAM,aAAa,IAAM,GAE/C,qBACF,KAAK,UAAU,CAEnB,EAEA,0BAA2B,SAASA,OAAO,CACzC,IAAI,aAAeA,OAAM,cAAc,SAASA,OAAM,aAAa,EAE/D,UAAY,KAAK,MAAM,eAAe,UAAU,SAClD,QAAQ,WACV,EAEI,WAAa,CAAC,cAChB,KAAK,UAAU,CAEnB,EAEA,mBAAoB,SAASA,OAAO,CAC9BA,OAAM,QAAU,KACpB,KAAK,UAAU,EACf,KAAK,MAAM,iBAAiB,MAAM,EACpC,EAEA,aAAc,SAASA,OAAO,CAC5B,IAAI,SAAW,KAAK,UAAU,SAASA,OAAM,MAAM,EAC/C,UAAY,KAAK,MAAM,eAAe,UAAU,SAClD,QAAQ,WACV,EAEI,WAAa,CAAC,UAChB,KAAK,UAAU,CAEnB,EAEA,YAAa,SAAS,MAAO,CAC3B,KAAK,MAAM,gBAAgB,MAAQ,MACnC,KAAK,MAAM,eAAe,OAAO,CACnC,EAEA,UAAW,UAAW,CACpB,KAAK,MAAM,eAAe,UAAU,OAAO,QAAQ,WAAW,EAC9D,KAAK,MAAM,iBAAiB,aAAa,gBAAiB,EAAK,CACjE,EAEA,YAAa,UAAW,CACtB,IAAI,aACF,KAAK,MAAM,iBAAiB,aAAa,eAAe,IAAM,OAChE,KAAK,MAAM,eAAe,UAAU,OAAO,QAAQ,WAAW,EAC9D,KAAK,MAAM,iBAAiB,aAAa,gBAAiB,CAAC,YAAY,CACzE,EAEA,QAAS,UAAW,CAClB,KAAK,MAAM,iBAAiB,oBAC1B,QACA,KAAK,cAAc,UACrB,EAEA,KAAK,MAAM,kBAAkB,QAAQ,SAAS,iBAAkB,CAC9D,iBAAiB,oBACf,QACA,KAAK,cAAc,cACrB,CACF,EAAG,IAAI,EAEP,KAAK,UAAU,oBACb,QACA,KAAK,cAAc,iBACrB,EAEA,KAAK,MAAM,eAAe,oBACxB,WACA,KAAK,cAAc,wBACrB,EAEA,KAAK,MAAM,iBAAiB,oBAC1B,WACA,KAAK,cAAc,0BACrB,EAEA,SAAS,KAAK,oBACZ,QACA,KAAK,cAAc,WACrB,CACF,CACF,CAAC,EAEM,UACT,GAAG,EAEH,MAAM,SAAW,UAAW,CAC1B,SAAS,QAAQ,GAAI,KAAM,CACzB,KAAK,OAAS,CACZ,GACA,MAAO,mBACP,KAAM,mBAAqB,KAC3B,UAAW,iBACX,aAAc,oBACd,aAAc,kBACd,UAAW,WAAa,IAC1B,EAEA,KAAK,MAAQ,CACX,KAAM,SAAS,cAAc,cAAc,CAC7C,EAEA,KAAK,OAAS,SAAS,cAAc,IAAM,EAAE,EAC7C,KAAK,OAAS,GAET,KAAK,QAIV,KAAK,KAAK,CACZ,CAEA,eAAQ,UAAY,OAAO,OAAO,CAAC,EAAG,QAAQ,UAAW,CACvD,KAAM,UAAW,CAEf,SAAS,iBAAiB,KAAK,OAAO,IAAI,EAAE,QAAQ,SAAW,CAC7D,QAAQ,aAAa,gBAAiB,OAAO,EAC7C,QAAQ,iBAAiB,QAAS,KAAK,KAAK,KAAK,IAAI,CAAC,CACxD,CAAC,EAED,KAAK,OAAO,cAAc,KAAK,OAAO,KAAK,EAAE,iBAAiB,QAAS,KAAK,MAAM,KAAK,IAAI,CAAC,EAG5F,SAAS,iBAAiB,YAAa,UAAW,CAChD,KAAK,MAAM,CACb,EAAE,KAAK,IAAI,CAAC,CACd,EAEA,KAAM,SAAS,IAAK,cAAe,CAC7B,KACF,IAAI,eAAe,EAGjB,MAAK,SAKL,KAAO,IAAI,iBACb,IAAI,gBAAgB,EAEpB,IAAI,cAAc,aAAa,gBAAiB,MAAM,EACtD,KAAK,aAAe,IAAI,eACf,gBACT,cAAc,aAAa,gBAAiB,MAAM,EAClD,KAAK,aAAe,eAGtB,MAAM,MAAM,kBAAkB,KAAK,OAAQ,UAAW,CACpD,KAAK,OAAO,UAAU,IAAI,KAAK,OAAO,YAAY,CACpD,EAAE,KAAK,IAAI,CAAC,EAEZ,SAAS,gBAAgB,UAAU,IAAI,KAAK,OAAO,SAAS,EAC5D,KAAK,OAAS,GAEd,MAAM,KAAK,UAAU,CACnB,UAAW,KAAK,OAChB,UAAW,cACb,CAAC,EAED,SAAS,cAAc,IAAI,YAAY,YAAY,CAAC,EACpD,SAAS,cAAc,IAAI,YAAY,cAAgB,KAAK,OAAO,EAAE,CAAC,EAEtE,KAAK,WAAW,EAClB,EAEA,MAAO,SAAS,IAAK,CACnB,GAAK,KAAK,OAKV,IAAI,KACE,KAAI,OAAO,QAAQ,kBAAkB,GAElC,GAAI,IAAI,OAAO,QAAQ,SAAS,EACrC,OAKJ,SAAS,cAAc,KAAK,EAE5B,MAAM,MAAM,kBAAkB,KAAK,OAAQ,UAAW,CACpD,KAAK,OAAO,UAAU,OAAO,KAAK,OAAO,YAAY,CACvD,EAAE,KAAK,IAAI,CAAC,EAEZ,SAAS,gBAAgB,UAAU,OAAO,KAAK,OAAO,SAAS,EAC/D,SAAS,gBAAgB,UAAU,IAAI,KAAK,OAAO,YAAY,EAE/D,OAAO,WAAW,UAAW,CAC3B,SAAS,gBAAgB,UAAU,OAAO,KAAK,OAAO,YAAY,EAC9D,KAAK,cAAgB,KAAK,aAAa,aAAa,eAAe,IACrE,KAAK,aAAa,aAAa,gBAAiB,OAAO,EACvD,KAAK,aAAa,MAAM,EAE5B,EAAE,KAAK,IAAI,EAAG,GAAG,EAEjB,KAAK,OAAS,GAEd,MAAM,KAAK,gBAAgB,CACzB,UAAW,KAAK,OAChB,UAAW,cACb,CAAC,EAED,KAAK,aAAa,EACpB,EAEA,WAAY,UAAW,CAErB,OAAO,GAAG,QAAU,KAAK,OAAO,UAAW,SAAS,IAAK,CACvD,KAAK,MAAM,GAAG,CAEhB,EAAE,KAAK,IAAI,CAAC,EAGZ,OAAO,GAAG,QAAU,KAAK,OAAO,UAAW,SAAS,IAAK,CACnD,IAAI,UAAY,IAClB,KAAK,MAAM,CAEf,EAAE,KAAK,IAAI,CAAC,EAEZ,MAAM,KAAK,oBAAoB,KAAK,OAAO,UAAW,KAAK,MAAM,IAAI,CACvE,EAEA,aAAc,UAAW,CACvB,OAAO,IAAI,QAAU,KAAK,OAAO,SAAS,EAC1C,OAAO,IAAI,QAAU,KAAK,OAAO,SAAS,EAE1C,MAAM,KAAK,sBAAsB,KAAK,OAAO,UAAW,KAAK,MAAM,IAAI,CACzE,CACF,CAAC,EAEM,OACT,GAAG,EAEH,MAAM,QAAU,UAAW,CACzB,SAAS,MAAM,GAAI,KAAM,QAAS,CAChC,IAAI,SAAW,CACb,MAAO,kBACP,KAAM,kBAAoB,KAC1B,UAAW,mBACX,aAAc,oBACd,cAAe,CAAC,YAAY,EAC5B,mBAAoB,oBACpB,iBAAkB,gBAClB,qBAAsB,EACxB,EAKA,GAHA,KAAK,GAAK,GACV,KAAK,MAAQ,SAAS,eAAe,EAAE,EAEnC,CAAC,KAAK,MACR,MAAO,GAGT,KAAK,aAAe,KAAK,MAAM,cAAc,eAAe,EAE5D,KAAK,OAAS,OAAO,OAAO,SAAU,OAAO,EAC7C,KAAK,YAAc,GACnB,KAAK,YAAc,KAAK,OAAO,cAAgB,SAAS,eAAe,KAAK,OAAO,aAAa,EAAI,KAAK,MACzG,KAAK,QAAU,KAAK,OAAO,MAE3B,KAAK,KAAK,CACZ,CAEA,aAAM,UAAU,KAAO,UAAW,CAChC,SAAS,iBAAiB,KAAK,OAAO,IAAI,EAAE,QAAQ,KAAO,CACzD,IAAI,aAAa,gBAAiB,OAAO,EACzC,IAAI,iBAAiB,QAAS,KAAK,KAAK,KAAK,IAAI,CAAC,CACpD,CAAC,EAED,KAAK,MAAM,iBAAiB,KAAK,OAAO,KAAK,EAAE,QAAQ,KAAO,CAC5D,IAAI,iBAAiB,QAAS,KAAK,MAAM,KAAK,IAAI,CAAC,CACrD,CAAC,EAGD,SAAS,iBAAiB,aAAc,UAAW,CACjD,KAAK,MAAM,CACb,EAAE,KAAK,IAAI,CAAC,CACd,EAEA,MAAM,UAAU,KAAO,SAAS,IAAK,CAEnC,IAAI,aAAe,GAGf,KAAK,cAKL,IACF,IAAI,eAAe,EAEnB,aAAe,GAKb,KAAO,IAAI,kBACb,IAAI,gBAAgB,EAEpB,KAAK,aAAe,IAAI,cAAc,aAAa,gBAAiB,MAAM,GAGxE,KAAK,aAAe,CAAC,cACvB,KAAK,MAAM,EAGb,KAAK,MAAM,UAAU,IAAI,KAAK,OAAO,SAAS,EAE9C,SAAS,gBAAgB,UAAU,IAAI,GAAG,KAAK,OAAO,aAAa,EAE/D,KAAK,SACP,SAAS,gBAAgB,UAAU,IAAI,KAAK,OAAO,kBAAkB,EAGvE,KAAK,YAAc,GAEnB,MAAM,KAAK,UAAU,CACnB,UAAW,KAAK,MAChB,eAAgB,KAAK,YACrB,UAAW,aACb,CAAC,EAED,SAAS,cAAc,IAAI,YAAY,WAAW,CAAC,EACnD,SAAS,cAAc,IAAI,YAAY,aAAe,KAAK,EAAE,CAAC,EAE9D,KAAK,WAAW,EAClB,EAEA,MAAM,UAAU,MAAQ,SAAS,IAAK,CAEpC,GAAK,KAAK,YAKV,IAAI,KACE,KAAI,OAAO,QAAQ,iBAAiB,GAEjC,GAAI,IAAI,OAAO,QAAQ,eAAe,EAC3C,OAKJ,SAAS,cAAc,KAAK,EAE5B,KAAK,MAAM,UAAU,OAAO,KAAK,OAAO,SAAS,EACjD,KAAK,MAAM,UAAU,IAAI,KAAK,OAAO,YAAY,EAEjD,SAAS,gBAAgB,UAAU,OAAO,GAAG,KAAK,OAAO,aAAa,EACtE,SAAS,gBAAgB,UAAU,IAAI,KAAK,OAAO,gBAAgB,EAEnE,OAAO,WAAW,UAAW,CAC3B,SAAS,gBAAgB,UAAU,OAAO,KAAK,OAAO,gBAAgB,EACtE,KAAK,MAAM,UAAU,OAAO,KAAK,OAAO,YAAY,EAChD,KAAK,cAAgB,KAAK,aAAa,aAAa,eAAe,GACrE,KAAK,aAAa,aAAa,gBAAiB,OAAO,EAAE,MAAM,CAEnE,EAAE,KAAK,IAAI,EAAG,GAAG,EAEb,KAAK,SACP,SAAS,gBAAgB,UAAU,OAAO,KAAK,OAAO,kBAAkB,EAG1E,KAAK,YAAc,GAEnB,MAAM,KAAK,gBAAgB,CACzB,UAAW,KAAK,MAChB,UAAW,aACb,CAAC,EAED,SAAS,cAAc,IAAI,YAAY,cAAgB,KAAK,EAAE,CAAC,EAE/D,KAAK,aAAa,EACpB,EAEA,MAAM,UAAU,WAAa,UAAW,CACtC,OAAO,GAAG,cAAe,SAAS,IAAK,CACjC,IAAI,UAAY,IAClB,KAAK,MAAM,CAEf,EAAE,KAAK,IAAI,CAAC,EAER,KAAK,OAAO,sBAEd,KAAK,MAAM,GAAG,cAAe,KAAK,MAAM,KAAK,IAAI,CAAC,CAEtD,EAEA,MAAM,UAAU,aAAe,UAAW,CACxC,SAAS,gBAAgB,IAAI,QAAQ,EAEjC,KAAK,OAAO,sBACd,KAAK,MAAM,IAAI,QAAQ,CAE3B,EAEO,KACT,GAAG,EAEC,OAAO,OAAO,WAAe,IAC/B,MAAM,IAAI,MAAM,iFAAiF,EAGnG,MAAM,YAAc,UAAY,CAC9B,IAAI,YAAc,GACd,UAAY,CACd,WAAY,eACZ,iBAAkB,uBAClB,mBAAoB,0BACpB,mBAAoB,0BACpB,qBAAsB,4BACtB,qBAAsB,2BACxB,EAEA,SAAS,WAAW,UAAW,CAAC,SAAU,SAAU,GAAG,aAAa,EAAI,CAAC,EAAG,CAC1E,YAAK,UAAY,UACjB,KAAK,SAAW,SAChB,KAAK,SAAW,SAChB,KAAK,cAAgB,eAAiB,CAAC,EAEhC,KAAK,KAAK,CACnB,CAEA,kBAAW,UAAY,OAAO,OAAO,CAAC,EAAG,WAAW,UAAW,CAC7D,KAAM,UAAY,CAChB,GAAI,CAAC,KAAK,UAAU,UAAU,SAAS,aAAa,EAClD,MAAM,IAAI,MAAM,wDAAwD,EAG1E,YAAK,OAAS,KAAK,UAAU,QAAQ,MAAM,EAC3C,KAAK,SAAW,KAAK,UAAU,cAAc,UAAU,gBAAgB,EACvE,KAAK,WAAa,KAAK,UAAU,cAAc,UAAU,kBAAkB,EAC3E,KAAK,WAAa,KAAK,UAAU,cAAc,UAAU,kBAAkB,EAC3E,KAAK,aAAe,KAAK,UAAU,cAAc,UAAU,oBAAoB,EAC/E,KAAK,aAAe,KAAK,UAAU,cAAc,UAAU,oBAAoB,EAE/E,KAAK,SAAW,WAAW,KAAK,UAAU,QAAQ,GAAG,GAAK,EAC1D,KAAK,SAAW,WAAW,KAAK,UAAU,QAAQ,QAAQ,GAAK,EAC/D,KAAK,SAAW,WAAW,KAAK,UAAU,QAAQ,GAAG,GAAK,IAC1D,KAAK,SAAW,WAAW,KAAK,UAAU,QAAQ,QAAQ,GAAK,KAAK,SAE7D,KAAK,iBAAiB,CAC/B,EAEA,iBAAkB,UAAY,CACxB,KAAK,UAAY,KAAK,SAAS,YAAc,OAAO,KAAK,SAAS,WAAW,SAAY,YAC3F,KAAK,SAAS,WAAW,QAAQ,EAGnC,IAAI,OAAS,WAAW,OAAO,KAAK,SAAU,CAC5C,QAAS,GACT,KAAM,YACN,GAAG,KAAK,cAER,MAAO,CAAC,KAAK,SAAU,KAAK,QAAQ,EACpC,MAAO,CACL,IAAK,KAAK,SACV,IAAK,KAAK,QACZ,CACF,CAAC,EAED,cAAO,GAAG,SAAU,QAAU,CAC5B,KAAK,aAAa,UAAY,MAAM,SAAS,YAC3C,OAAO,CAAC,EACR,MAAM,SAAS,WACjB,EACA,KAAK,aAAa,UAAY,MAAM,SAAS,YAC3C,OAAO,CAAC,EACR,MAAM,SAAS,WACjB,EAEI,KAAK,UACP,KAAK,SAAS,MAAM,CAExB,CAAC,EAED,OAAO,GAAG,SAAU,QAAU,CAI5B,GAHA,KAAK,WAAW,MAAQ,OAAO,CAAC,EAChC,KAAK,WAAW,MAAQ,OAAO,CAAC,EAE5B,KAAK,SAAU,CACjB,MAAM,SAAW,IAAI,SAAS,KAAK,MAAM,EACzC,KAAK,SAAS,QAAQ,CACxB,CACF,CAAC,EAEM,MACT,CACF,CAAC,EAEM,UACT,GAAG,EAEH,MAAM,aAAe,UAAW,CAC9B,IAAI,OAAS,CACX,QAAS,EACX,EAEA,SAAS,YAAY,KAAM,OAAQ,KAAM,CACvC,KAAK,KAAO,KACZ,KAAK,KAAO,KAEZ,IAAI,eAAiB,QAAkB,eAEnC,KAAK,OACP,KAAK,UAAY,KAAK,cAAc,cAAc,EAClD,KAAK,KAAK,iBAAiB,SAAU,KAAK,gBAAgB,KAAK,IAAI,CAAC,EAExE,CAEA,mBAAY,UAAY,OAAO,OAAO,CAAC,EAAG,YAAY,UAAW,CAC/D,gBAAiB,SAAS,IAAK,SAAS,CAGtC,GAFA,IAAI,eAAe,EAEf,QAAO,QAKX,MAAK,UAAU,UAAU,IAAI,cAAc,EAE3C,OAAO,QAAU,GAEjB,IAAI,KAAO,MAAM,MAAM,UAAU,KAAK,IAAI,EAE1C,MAAM,MAAM,OAAO,QAAS,CAC1B,OAAQ,OACR,KAAM,KACN,YAAa,cACb,QAAS,CACP,eAAgB,oCAChB,mBAAoB,gBACtB,CACF,CAAC,EACA,KAAK,UAAY,SAAS,KAAK,CAAC,EAChC,KAAK,SAASK,MAAM,CACnB,GAAIA,MAAK,SAAW,IAClB,KAAK,MAAMA,KAAI,MACV,CACL,IAAI,QAAUA,MACd,KAAK,QAAQ,OAAO,CACtB,CAEA,OAAO,QAAU,GACjB,KAAK,UAAU,UAAU,OAAO,cAAc,EAG1C,SAAS,KAAK,UAAU,SAAS,eAAe,IAClD,OAAO,SAAS,EAAG,CAAC,EACpB,SAAS,OAAO,EAEpB,EAAE,KAAK,IAAI,CAAC,EACd,EAEA,QAAS,SAAS,QAAS,CACzB,IAAI,OAAS,KAAK,KAAK,cAAc,SAAS,EAC1C,QACF,OAAO,OAAO,EAGhB,SAAS,cAAc,IAAI,YAAY,oBAAqB,CAC1D,OAAQ,CACN,QACA,aAAc,KAAK,SACrB,CACF,CAAC,CAAC,EAEE,KAAK,MAAQ,KAAK,KAAK,eACzB,SAAS,cAAc,IAAI,YAAY,qBAAuB,KAAK,KAAK,cAAe,CACrF,OAAQ,CACN,QACA,aAAc,KAAK,SACrB,CACF,CAAC,CAAC,CAEN,EAEA,MAAO,SAAS,MAAO,CACrB,GAAI,CAAC,MAAM,YAAa,CACtB,QAAQ,KAAK,KAAK,EAClB,MACF,CAEA,IAAI,OAAS,KAAK,KAAK,cAAc,SAAS,EAC1C,QACF,OAAO,OAAO,EAGhB,IAAI,SAAW,SAAS,cAAc,KAAK,EAC3C,SAAS,UAAU,IAAI,SAAU,aAAa,EAC9C,SAAS,YAAc,MAAM,YAC7B,KAAK,KAAK,OAAO,QAAQ,EAEzB,SAAS,cAAc,IAAI,YAAY,oBAAqB,CAC1D,OAAQ,CACN,aAAc,MAAM,WACtB,CACF,CAAC,CAAC,EAEE,KAAK,MAAQ,KAAK,KAAK,eACzB,SAAS,cAAc,IAAI,YAAY,qBAAuB,KAAK,KAAK,cAAe,CACrF,OAAQ,CACN,aAAc,MAAM,WACtB,CACF,CAAC,CAAC,CAEN,CACF,CAAC,EAEM,WACT,GAAG,EAEH,MAAM,cAAgB,UAAW,CAC/B,IAAI,kBAAoB,CAAC,EACrB,OAAS,CAAC,EACV,UAAY,CAAC,EAEb,UAAY,CACd,WAAY,oCACZ,SAAU,mBACZ,EAEA,SAAS,KAAK,sBAAuB,UAAW,CAC9C,kBAAkB,SAAS,EAAI,CAC7B,OAAQ,EACV,EAEA,sBAAsB,QAAQ,SAAS,UAAW,MAAO,CACvD,IAAI,QAAU,UAAU,QAAQ,QAC5B,mBAAqB,UAAU,cAAc,cAAc,EAC3D,QAAU,mBAAmB,QAAQ,QAEzC,GAAI,QAAU,EAAG,CACf,IAAI,WAAa,UAAU,QAAQ,UAAU,UAAU,EACnD,SAAW,WAAW,cAAc,UAAU,QAAQ,EAC1D,UAAU,SAAS,EAAI,CACrB,QAAS,SACT,UAAW,OACb,CACF,CAEA,OAAO,OAAO,EAAI,CAChB,QACA,UACA,UACA,QAAS,kBACX,CAEF,CAAC,EAED,OAAO,QAAQ,aAAa,CAC1B,CACE,KAAM,aACN,QAAS,MACT,OAAQ,cACV,EACA,CACE,KAAM,kBACN,QAAS,MACT,OAAQ,kBACV,CACF,CAAC,EAED,MAAM,cAAc,KAAK,qBAAqB,CAChD,CAEA,SAAS,eAAe,OAAQ,CAC9B,GAAI,QAEJ,IAAI,CAAC,OAAO,UAAW,CACrB,SAAS,iBAAiB,yBAA0B,UAAW,CAC7D,eAAe,CACjB,CAAC,EACD,MACF,CAEA,QAAS,aAAa,kBACpB,GAAI,kBAAkB,eAAe,SAAS,EAAG,CAC/C,IAAI,aAAe,kBAAkB,SAAS,EAE9C,GAAI,aAAa,OAAQ,SAEzB,IAAI,UAAY,SAAS,cAAc,cAAgB,SAAS,EAEhE,OAAO,UAAU,UAAU,KAAK,MAAM,UAAU,SAAS,CAAC,EAC1D,aAAa,OAAS,EACxB,CAEF,OAAO,UAAU,gBAAgB,EACnC,CAEA,SAAS,mBAAmB,OAAQ,CAClC,GAAI,SAEJ,QAAS,OAAO,OACd,GAAI,OAAO,eAAe,GAAG,EAAG,CAC9B,IAAI,MAAQ,OAAO,GAAG,EAClB,CAAC,MAAM,eAAiB,UAC1B,MAAM,cAAgB,IAAI,QAAQ,cAAc,MAAM,OAAO,GAE/D,0BAA0B,KAAK,CACjC,EAEJ,CAEA,SAAS,0BAA0B,MAAO,CACxC,IAAI,SAAW,UAAU,MAAM,SAAS,EAExC,MAAM,UAAU,iBAAiB,eAAgB,UAAW,CAC1D,SAAS,QAAQ,aAAa,0BAA2B,MAAM,OAAO,EAClE,OAAM,OAAO,SACjB,MAAM,cAAc,KAAK,CAC3B,CAAC,EAED,MAAM,UAAU,iBAAiB,cAAe,UAAW,CACzD,SAAS,QAAQ,aAAa,0BAA2B,SAAS,SAAS,EAC3E,MAAM,cAAc,MAAM,CAC5B,CAAC,EAED,MAAM,UAAU,iBAAiB,WAAY,UAAW,CACtD,MAAM,cAAc,MAAM,CAC5B,CAAC,CACH,CAEA,SAAS,oBAAoB,UAAW,CACtC,QAAS,OAAO,OACd,GAAI,OAAO,eAAe,GAAG,EAAG,CAC9B,IAAI,MAAQ,OAAO,GAAG,EAClB,MAAM,YAAc,WACtB,OAAO,OAAO,GAAG,CAErB,CAEF,OAAO,kBAAkB,SAAS,CACpC,CAEA,MAAO,CACL,KACA,mBACF,CACF,GAAG,EAEH,MAAM,aAAe,UAAW,CAC9B,IAAI,UAAY,CACd,MAAO,eACP,KAAM,wBACN,MAAO,wBACT,EAEA,SAAS,YAAYJ,IAAI,QAAS,CAChC,KAAK,QAAUA,IACf,KAAK,KAAOA,IAAG,cAAc,UAAU,IAAI,EAC3C,KAAK,MAAQA,IAAG,cAAc,UAAU,KAAK,EAC7C,KAAK,MAAQA,IAAG,cAAc,UAAU,KAAK,EAC7C,KAAK,SAAW,KAAK,MAAM,aAAa,KAAK,GAAK,EAElD,IAAI,SAAW,CACb,UAAW,KACX,OAAQ,GACR,IAAK,KAAK,MAAM,QAAQ,EAC1B,EAEA,KAAK,QAAU,OAAO,OAAO,CAAC,EAAG,SAAU,OAAO,EAElD,KAAK,KAAK,CACZ,CAEA,mBAAY,UAAY,OAAO,OAAO,CAAC,EAAG,YAAY,UAAW,CAC/D,KAAM,UAAW,CACf,KAAK,KAAK,iBAAiB,QAAS,UAAW,CAC7C,IAAI,IAAM,KAAK,QAAQ,EACvB,KAAK,QAAQ,IAAM,CAAC,CACtB,EAAE,KAAK,IAAI,CAAC,EAEZ,KAAK,MAAM,iBAAiB,QAAS,UAAW,CAC9C,IAAI,IAAM,KAAK,QAAQ,EACvB,KAAK,QAAQ,IAAM,CAAC,CACtB,EAAE,KAAK,IAAI,CAAC,EAEZ,KAAK,MAAM,iBAAiB,SAAU,SAAS,IAAK,CAClD,KAAK,QAAQ,KAAK,QAAQ,CAAC,CAC7B,EAAE,KAAK,IAAI,CAAC,CACd,EAEA,QAAS,UAAW,CAClB,IAAI,IAAM,KAAK,MAAM,MACrB,OAAI,WAAW,GAAG,GAAK,SAAS,GAAG,GAAM,CAAC,MAAM,GAAG,IAIjD,IAAM,GAED,SAAS,GAAG,CACrB,EAEA,QAAS,SAAS,IAAK,CACjB,KAAO,KAAK,WACd,IAAM,KAAK,UAGb,KAAK,MAAM,MAAQ,IAEf,KAAK,QAAQ,QACf,SAAS,cAAc,IAAI,YAAY,gBAAkB,KAAK,QAAQ,UAAW,CAC7E,OAAQ,CAAC,KAAK,QAAQ,IAAK,IAAK,KAAK,OAAO,CAChD,CAAC,CAAC,CAEN,CACF,CAAC,EAEM,WACT,GAAG,EAIH,MAAM,WAAa,UAAW,CAC5B,IAAI,QAAU,CACZ,WAAY,cACZ,SAAU,YACV,SAAU,WACZ,EAEI,UAAY,CACd,UAAW,oBACX,aAAc,eACd,QAAS,qBACT,YAAa,mBACf,EAEI,iBAAmB,CACrB,MAAO,kCACP,MAAO,oCACP,MAAO,uBACT,EAEI,SAAW,CACb,eAAgB,GAChB,SAAU,GACV,YAAa,GACb,SAAU,KACV,iBAAkB,KAClB,cAAe,GACf,cAAe,EACf,KAAM,GACN,SAAU,GACV,aAAc,EACd,SAAU,GACV,qBAAsB,GACtB,gBAAiB,GACjB,YAAa,MAAM,OAAO,IAC1B,mBAAoB,IACpB,eAAgB,GAChB,WAAY,EACd,EAEA,SAAS,UAAUA,IAAI,KAAM,CA0B3B,GAzBA,KAAK,GAAKA,IACV,KAAK,KAAO,OAAO,OAAO,CAAC,EAAG,SAAU,IAAI,EAG5C,KAAK,KAAK,GAAK,CACb,MAAO,KAAK,KAAK,KAAK,IAAI,EAC1B,OAAQ,KAAK,YAAY,KAAK,IAAI,EAClC,OAAQ,KAAK,YAAY,KAAK,IAAI,CACpC,EAEI,KAAK,KAAK,WACZ,KAAK,YAAc,KAAK,KAAK,SAAS,iBAAiB,iBAAiB,KAAK,EAC7E,KAAK,cAAgB,KAAK,KAAK,SAAS,iBAAiB,iBAAiB,KAAK,EAC/E,KAAK,OAAS,KAAK,KAAK,SAAS,iBAAiB,iBAAiB,KAAK,EACpE,KAAK,cAAc,QACrB,KAAK,aAAa,GAIlB,KAAK,KAAK,aACZ,YAAYA,GAAE,EAGhB,KAAK,UAAY,IAAI,SAASA,IAAI,KAAK,IAAI,EAEvC,KAAK,KAAK,SAAU,CACtB,IAAI,QAAUA,IAAG,QAAQ,UAAU,OAAO,EAC1C,KAAK,SAAW,QAAQ,cAAc,UAAU,WAAW,EACvD,KAAK,UACP,KAAK,SAAS,iBAAiB,QAAS,KAAK,aAAa,KAAK,IAAI,CAAC,CAExE,CAGA,OAAO,GAAG,SAAU,MAAM,MAAM,SAAS,IAAK,UAAW,CACvD,KAAK,OAAO,CACd,EAAE,KAAK,IAAI,CAAC,CAAC,EAMb,SAAS,YAAYA,IAAI,CACvB,GAAKA,IAAG,GAER,SADI,WAAaA,IAAG,WACd,YAAc,MAAQ,WAAW,UAAY,GACjD,WAAa,WAAW,YAE1B,IAAI,MAAQ,SAAS,cAAc,OAAO,EAC1C,MAAM,UAAY,IAAIA,IAAG,EAAE,8BAA8B,WAAW,YAAY,MAChF,SAAS,KAAK,YAAY,KAAK,EACjC,CACF,CAEA,iBAAU,UAAY,OAAO,OAAO,CAAC,EAAG,UAAU,UAAW,CAC3D,KAAM,SAASA,IAAI,CACjB,KAAK,aAAe,KAAK,GAAG,cAAc,UAAU,YAAY,EAG5D,KAAK,KAAK,WAAa,KAAK,KAAK,UAAU,QACzC,OAAO,KAAK,KAAK,UAAU,QAAW,YACxC,KAAK,KAAK,UAAU,OAAO,KAAK,YAAY,EAI5C,OAAO,KAAO,IAAI,QAAQ,CAChC,EAEA,YAAa,SAAS,MAAO,CAEvB,KAAK,KAAK,MAAQ,KAAK,eACzB,KAAK,aAAa,UAAU,IAAI,QAAQ,UAAU,EAClD,KAAK,aAAa,iBAAiB,gBAAiB,UAAW,CAC7D,KAAK,aAAa,UAAU,OAAO,QAAQ,UAAU,CACvD,EAAE,KAAK,IAAI,CAAC,GAIV,KAAK,KAAK,UACZ,KAAK,aAAa,KAAK,EAIrB,KAAK,KAAK,WAAa,KAAK,KAAK,UAAU,UACzC,OAAO,KAAK,KAAK,UAAU,UAAa,YAC1C,KAAK,KAAK,UAAU,SAAS,KAAK,EAKlC,KAAK,QAAU,KAAK,OAAO,SAC7B,KAAK,OAAO,CAAC,EAAE,UAAU,OAAO,OAAQ,QAAU,CAAC,EACnD,KAAK,OAAO,CAAC,EAAE,UAAU,OAAO,OAAQ,QAAW,KAAK,cAAc,OAAS,CAAE,EAErF,EACA,YAAa,SAAS,MAAO,CAEvB,KAAK,KAAK,MACZ,KAAK,GAAG,iBAAiB,UAAU,SAAS,EAAE,QAAQ,OAAS,CAC7D,MAAM,UAAU,OAAO,QAAQ,UAAU,CAC3C,CAAC,EAGH,KAAK,aAAe,KAAK,GAAG,cAAc,UAAU,YAAY,EAG5D,KAAK,KAAK,UACZ,KAAK,aAAa,KAAK,UAAU,aAAa,CAElD,EACA,QAAS,UAAW,CACd,KAAK,KAAK,UAAY,KAAK,cAAc,QAC3C,KAAK,cAAc,QAAQ,GAAK,CAC9B,EAAE,UAAU,OAAO,QAAQ,QAAQ,CACrC,CAAC,EAEH,KAAK,UAAU,QAAQ,CACzB,EACA,WAAY,UAAW,CACrB,KAAK,UAAU,WAAW,CAC5B,EACA,aAAc,UAAW,CACnB,KAAK,SAAS,UAAU,SAAS,QAAQ,QAAQ,GACnD,KAAK,SAAS,UAAU,OAAO,QAAQ,QAAQ,EAC/C,KAAK,UAAU,WAAW,IAE1B,KAAK,SAAS,UAAU,IAAI,QAAQ,QAAQ,EAC5C,KAAK,UAAU,YAAY,EAE/B,EACA,OAAQ,UAAW,CACjB,KAAK,UAAU,OAAO,CACxB,EACA,KAAM,UAAW,CACf,KAAK,UAAU,WAAW,CAC5B,EACA,MAAO,UAAW,CAChB,KAAK,UAAU,YAAY,CAC7B,EACA,UAAW,SAAS,EAAG,CACrB,KAAK,UAAU,OAAO,CAAC,CACzB,EACA,aAAc,SAAS,OAAQ,CAC7B,KAAK,UAAU,QAAQ,UAAY,OACnC,KAAK,UAAU,gBAAgB,CACjC,EAEA,aAAc,UAAW,CACvB,KAAK,cAAc,KAAK,KAAK,YAAY,EAAE,UAAU,IAAI,WAAW,EAGpE,KAAK,cAAc,QAAQ,CAAC,KAAM,IAAM,CAEtC,KAAK,aAAa,aAAc,CAAC,EAEjC,KAAK,iBAAiB,QAAS,SAAS,IAAK,CAC3C,IAAI,eAAe,EACnB,KAAK,UAAU,KAAK,cAAc,IAAI,aAAa,CAAC,CACtD,EAAE,KAAK,IAAI,CAAC,EACZ,KAAK,iBAAiB,QAAS,SAAS,IAAK,CAC3C,KAAK,UAAU,KAAK,cAAc,IAAI,aAAa,CAAC,CACtD,EAAE,KAAK,IAAI,CAAC,EACZ,KAAK,iBAAiB,UAAW,SAAS,IAAK,CACzC,IAAI,UAAY,IAClB,KAAK,UAAU,KAAK,cAAc,IAAI,aAAa,CAAC,CAExD,EAAE,KAAK,IAAI,CAAC,CACd,CAAC,EAGG,KAAK,OAAO,QACd,KAAK,OAAO,QAAQ,OAAS,CAC3B,MAAM,iBAAiB,QAAS,KAAK,WAAW,KAAK,IAAI,CAAC,CAC5D,CAAC,CAEL,EAEA,cAAe,SAAS,OAAQ,CAC9B,OAAO,SAAS,OAAO,QAAQ,KAAK,CACtC,EAEA,aAAc,SAAS,MAAO,CAC5B,KAAK,cAAc,QAAQ,GAAK,CAC9B,EAAE,KAAK,EACP,EAAE,UAAU,OAAO,QAAQ,QAAQ,CACrC,CAAC,EAED,IAAIA,IAAK,KAAK,cAAc,KAAK,EAGjC,GAFAA,IAAG,UAAU,IAAI,QAAQ,QAAQ,EAE7B,EAAC,KAAK,KAAK,iBAIf,GAAI,KAAK,KAAK,cAAe,CAC3B,IAAI,MAAQA,IAAG,UACf,KAAK,KAAK,iBAAiB,UAAY,MAAQ,GACjD,KAAO,CACL,IAAI,OAASA,IAAG,WAChB,KAAK,KAAK,iBAAiB,WAAa,OAAS,GACnD,CACF,EAEA,WAAY,SAAS,IAAK,CACpB,IAAI,cAAc,UAAU,SAAS,4BAA4B,EACnE,KAAK,UAAU,SAAS,EAExB,KAAK,UAAU,KAAK,CAExB,CACF,CAAC,EAEM,SACT,GAAG,EAWH,MAAM,qBAAuB,UAAW,CACtC,IAAI,QAAU,CACZ,SAAU,UACZ,EAEA,SAAS,aAAa,KAAM,CAC1B,KAAK,KAAO,KAAK,KACjB,KAAK,eAAiB,KAAK,eAC3B,KAAK,qBAAuB,KAAK,qBACjC,KAAK,UAAY,KAAK,UACtB,KAAK,UAAY,KAAK,UAEtB,KAAK,KAAK,CACZ,CAEA,oBAAa,UAAY,OAAO,OAAO,CAAC,EAAG,aAAa,UAAW,CACjE,KAAM,UAAW,CACf,KAAK,UAAU,GAAG,gBAAkB,KAAK,UAAW,KAAK,gBAAgB,KAAK,IAAI,CAAC,EAGnF,KAAK,uBAAuB,CAC9B,EAGA,2BAA2B,SAAU,wBAAyB,gBAAiB,kBAAmB,kBAAmB,CAEnH,OAAO,SAAS,OAAO,CAAC,QAAS,UAAY,CAE3C,MAAM,oBAAsB,QAAQ,QAAQ,OAG5C,cAAO,KAAK,OAAO,EAAE,QAAQ,OAAS,CAEpC,GAAI,QAAQ,KAAK,IAAM,KAAM,OAE7B,IAAI,MAAQ,QAAQ,KAAK,EAAE,KAAK,QAAU,OAAO,QAAU,QAAQ,KAAK,CAAC,EAErE,OAAO,MAAU,MAEnB,MAAQ,CAAC,MAAO,QAAQ,KAAK,EAAG,QAAS,EAAI,EAC7C,QAAQ,KAAK,EAAE,KAAK,KAAK,GAIiB,wBAAwB,OAAO,CAAC,MAAO,CAAC,MAAO,MAAAK,MAAK,IACvF,QAAQA,MAAK,IAAM,MAAQ,MAAQ,EAAI,MAC9C,CAAC,GAGwC,wBAAwB,OAAS,IAC1E,MAAM,QAAU,MAAM,SAAW,QAAQ,UAAY,GAAQ,MAAM,UAKlE,CAAC,iBAAmB,CAAC,gBAAgB,YACnC,wBAAwB,KAAM,QAAW,OAAO,QAAU,MAAM,OAAS,QAAU,OAAO,KAAK,IAEhG,MAAM,QAAU,IAIhB,QAAU,YACZ,MAAM,QAAU,MAAM,SAAW,QAAQ,UAAY,GAAQ,MAAM,QAEvE,CAAC,EAEM,OACT,EAAG,CAAE,QAAS,CAAC,EAAG,QAAS,CAAC,EAAG,QAAS,CAAC,CAAC,CAAC,CAC7C,EAEA,uBAAwB,UAAW,CACjC,KAAK,UAAU,iBAAiB,qBAAqB,EAAE,QAAQ,OAAS,CACtE,KAAK,oBAAoB,KAAK,CAChC,CAAC,EAED,MAAM,wBAA0B,KAAK,qBAAqB,QAAQ,IAAI,CAAC,MAAM,SAAkB,CAAC,MAAO,MAAO,SAAS,MAAM,CAAC,EAAE,EAAE,EAC5H,eAAiB,KAAK,2BAA2B,KAAK,eAAgB,wBAAyB,KAAK,oBAAoB,EAE9H,OAAS,CAAC,OAAQ,MAAM,IAAK,OAAO,QAAQ,cAAc,EACxD,KAAK,kBAAkB,OAAQ,MAAM,CAEzC,EAEA,gBAAiB,SAAS,IAAK,CAE7B,KAAM,CAAC,MAAO,kBAAmB,MAAO,kBAAmB,wBAAyB,OAAO,EAAI,IAAI,OAK7F,eAAiB,KAAK,2BAA2B,KAAK,eAAgB,wBAAyB,QAAS,kBAAmB,iBAAiB,EAKlJ,KAAK,UAAU,iBAAiB,qBAAqB,EAAE,QAAQ,OAAS,CACtE,KAAK,oBAAoB,KAAK,CAChC,CAAC,EAID,OAAS,CAAC,OAAQ,MAAM,IAAK,OAAO,QAAQ,cAAc,EACxD,KAAK,kBAAkB,OAAQ,OAAQ,iBAAiB,CAE5D,EAEA,kBAAmB,SAAS,OAAQ,OAAQ,cAAe,CACzD,IAAI,MAAQ,KAAK,UAAU,cAAc,mCAAoC,OAAQ,IAAI,EAGzF,OAAO,QAAQ,KAAO,CACpB,KAAK,oBAAoB,MAAO,IAAK,aAAa,CACpD,CAAC,CACH,EAEA,oBAAqB,SAAS,MAAO,IAAK,cAAe,CAEvD,IAAI,MAAQ,IAAI,MAAM,QAAQ,mCAAmC,MAAM,EAEvE,GAAI,KAAK,OAAS,WAChB,MAAM,cAAc,iBAAkB,MAAO,IAAI,EAAE,SAAW,OACzD,CACL,IAAI,YAAc,MAAM,cAAc,8BAA+B,MAAO,IAAI,EAC5E,MAAQ,YAAY,cAAc,OAAO,EACzC,MAAQ,YAAY,cAAc,OAAO,EAG7C,MAAM,UAAU,OAAO,QAAQ,QAAQ,EACvC,MAAM,UAAU,OAAO,QAAQ,QAAQ,EAGnC,IAAI,UACN,MAAM,UAAU,IAAI,QAAQ,QAAQ,EACpC,MAAM,UAAU,IAAI,QAAQ,QAAQ,EAExC,CACF,EAEA,oBAAqB,SAAS,MAAO,CAC/B,KAAK,OAAS,WAChB,MAAM,iBAAiB,QAAQ,EAAE,QAAQ,QAAU,CACjD,OAAO,SAAW,EACpB,CAAC,GAED,MAAM,iBAAiB,OAAO,EAAE,QAAQ,OAAS,CAC/C,MAAM,UAAU,IAAI,QAAQ,QAAQ,CACtC,CAAC,EACD,MAAM,iBAAiB,OAAO,EAAE,QAAQ,OAAS,CAC/C,MAAM,UAAU,IAAI,QAAQ,QAAQ,CACtC,CAAC,EAEL,CAEF,CAAC,EAEM,YACT,GAAG,EAOH,MAAM,WAAa,UAAW,CAC5B,IAAI,cAEA,cAAgB,cAChB,UAAY,CACd,QAAS,qDACT,WAAY,8BACZ,UAAW,0BACb,EAEI,gBAAkB,SAAS,iBAAiB,UAAU,OAAO,EAC7D,YAAc,SAAS,iBAAiB,UAAU,UAAU,EAEhE,GAAI,CAAC,gBAAgB,QAAU,CAAC,YAAY,OAC1C,OAGF,IAAI,eAAiB,SAAS,eAAe,aAAa,EAEtD,gBAAgB,QAClB,MAAM,cAAc,KAAK,YAAY,EAGvC,IAAI,MAAQ,IAAI,MAAM,OAAO,aAAc,cAAe,CACxD,qBAAsB,GACtB,cAAe,CAAC,aAAc,kBAAkB,EAChD,MAAO,EACT,CAAC,EAED,gBAAgB,QAAQ,KAAO,CAC7B,IAAI,iBAAiB,QAAS,mBAAmB,CACnD,CAAC,EAED,YAAY,QAAQ,KAAO,CACzB,IAAI,iBAAiB,QAAS,eAAe,CAC/C,CAAC,EAED,SAAS,iBAAiB,wBAAyB,eAAe,EAElE,SAAS,oBAAoB,IAAK,CAEhC,GAAK,MAAM,OAAO,aAIlB,KAAI,eAAe,EACnB,iBAAiB,EAEjB,MAAM,KAAK,GAAG,EAEd,IAAI,QAAU,kBAAkB,IAAI,cAAc,aAAa,MAAM,CAAC,EACtE,cAAgB,IAAI,MAAM,QACxB,cACA,CACE,QACA,MAAO,QACP,OAAQ,CACN,QAAS,cACX,CACF,CACF,EACF,CAEA,SAAS,gBAAgB,IAAK,CAC5B,iBAAiB,EAEjB,IAAIL,IAAK,IAAI,cACT,OAASA,IAAG,WAAW,cAAc,UAAU,SAAS,EAGxD,YAAc,OAAO,UAAU,EAAI,EACvC,YAAY,UAAU,OAAO,MAAM,EAEnC,eAAe,OAAO,WAAW,EACjC,MAAM,KAAK,GAAG,EAGd,eAAe,cAAc,OAAO,EAAE,KAAK,CAC7C,CAEA,SAAS,eAAe,IAAK,CAC3B,IAAI,OAAO,OAAO,EAClB,IAAI,OAAO,UAAU,CACvB,CAEA,SAAS,kBAAkB,IAAK,CAC9B,IAAI,OAAS,8EACT,MAAQ,IAAI,MAAM,MAAM,EAC5B,OAAQ,OAAO,MAAM,CAAC,EAAE,QAAQ,GAAK,MAAM,CAAC,EAAI,EAClD,CAEA,SAAS,kBAAmB,CAC1B,eAAe,UAAY,EAC7B,CAEA,SAAS,iBAAkB,CACrB,eAAiB,OAAO,cAAc,SAAY,WACpD,cAAc,QAAQ,EAEtB,iBAAiB,CAErB,CACF,EAOA,MAAM,gBAAgB,WAAY,CAChC,aAAc,CACZ,MAAM,EACN,KAAK,GAAK,KACV,KAAK,MAAQ,KAAK,cAAc,uBAAuB,EACvD,KAAK,YAAc,KAAK,cAAc,uBAAuB,EAC7D,KAAK,eAAiB,KAAK,cAAc,yBAAyB,EAElE,KAAK,SAAW,SAAS,iBAAiB,yBAAyB,EAEnE,SAAS,iBAAiB,eAAgB,GAAK,CAC7C,KAAK,MAAM,EAAE,OAAO,QAAS,EAAE,OAAO,OAAO,CAC/C,CAAC,CACH,CAEA,MAAM,QAAS,aAAc,CAC3B,KAAK,eAAe,UAAY,aAEhC,MAAM,KAAK,UAAU,CACnB,UAAW,KAAK,GAChB,UAAW,eACb,CAAC,EAEG,KAAK,aACP,KAAK,YAAY,GAAG,sBAA4B,IAAM,CACpD,KAAK,OAAO,CACd,CAAC,EAGH,SAAS,gBAAgB,GAAG,2BAAiCD,QAAS,CAChE,KAAK,GAAG,QAAQ,cAAgB,QAAU,CAAC,KAAK,MAAM,SAASA,OAAM,MAAM,GAAG,KAAK,OAAO,CAChG,CAAC,EAED,SAAS,gBAAgB,GAAG,sBAA4BA,QAAS,CAC3DA,OAAM,OAAS,UAAU,KAAK,OAAO,CAC3C,CAAC,EAED,KAAK,GAAG,QAAQ,YAAc,GAC9B,KAAK,GAAG,QAAQ,QAAU,OAC5B,CAEA,QAAS,CACP,KAAK,eAAe,UAAY,GAChC,KAAK,GAAG,QAAQ,YAAc,QAC9B,KAAK,GAAG,QAAQ,QAAU,GAE1B,MAAM,KAAK,gBAAgB,CACzB,UAAW,KAAK,GAChB,UAAW,eACb,CAAC,EAED,KAAK,YAAY,IAAI,qBAA0B,EAC/C,SAAS,gBAAgB,IAAI,0BAA+B,EAC5D,SAAS,gBAAgB,IAAI,qBAA0B,CACzD,CACF,CAEA,eAAe,OAAO,WAAY,OAAO,EAMzC,MAAM,uBAAuB,WAAY,CACvC,aAAc,CACZ,MAAM,EACN,KAAK,GAAK,KACV,KAAK,eAAiB,KAAK,cAAc,yBAAyB,EAElE,KAAK,KAAK,CACZ,CAEA,MAAO,CAEL,MAAM,YAAc,IAAI,YAAY,eAAgB,CAClD,OAAQ,CACN,QAAS,KAAK,QAAQ,QACtB,QAAS,KAAK,eAAe,SAC/B,EACA,QAAS,EACX,CAAC,EAED,KAAK,GAAG,iBAAiB,QAAS,GAAK,CACrC,EAAE,gBAAgB,EAClB,KAAK,cAAc,WAAW,CAChC,CAAC,CACH,CACF,CAEA,eAAe,OAAO,mBAAoB,cAAc,EAGxD,MAAM,eAAiB,UAAW,CAChC,IAAI,cAAgB,SAAS,MACzB,UAAY,gBACZ,eAAiB,EACjB,KAAO,SAAS,eAAe,aAAa,EAE5C,OAAS,CACX,MAAO,mBACP,UAAW,0BACX,kBAAmB,CAAC,0BAA0B,EAC9C,cAAe,oBACf,iBAAkB,CAAC,sBAAsB,EACzC,iBAAkB,CAAC,uBAAwB,wBAAwB,EACnE,YAAa,IACb,qBAAsB,IACxB,EAEA,SAAS,cAAc,GAAI,KAAM,CAC/B,KAAK,GAAK,GACV,KAAK,OAAS,SAAS,eAAe,EAAE,EAEnC,KAAK,SAIV,KAAK,MAAQ,CACX,OAAQ,SAAS,eAAe,kBAAkB,EAAE,cAAc,oBAAoB,EACtF,cAAe,KAAK,OAAO,cAAc,sBAAsB,EAC/D,WAAY,SAAS,cAAc,OAAO,CAC5C,EAEA,KAAK,MAAQ,KAAK,OAAO,QAAQ,aACjC,KAAK,aAAe,mBAAqB,KAEzC,KAAK,YAAc,GACnB,KAAK,OAAS,GACd,KAAK,YAAc,OAAO,YAAc,KAAK,OAAO,cAAc,OAAO,WAAW,EAAI,KAAK,OAE7F,KAAK,KAAK,EACZ,CAEA,qBAAc,UAAY,OAAO,OAAO,CAAC,EAAG,cAAc,UAAW,CACnE,KAAM,UAAW,CACf,IAAI,SAAW,SAAS,iBAAiB,KAAK,YAAY,EAE1D,SAAS,QAAQ,KAAO,CACtB,IAAI,aAAa,gBAAiB,OAAO,EACzC,IAAI,iBAAiB,QAAS,KAAK,KAAK,KAAK,IAAI,CAAC,CACpD,CAAC,EAED,IAAI,UAAY,KAAK,OAAO,iBAAiB,OAAO,KAAK,EACzD,UAAU,QAAQ,KAAO,CACvB,IAAI,GAAG,SAAW,UAAW,SAAS,IAAK,CACzC,KAAK,MAAM,GAAO,CAAE,UAAW,GAAM,KAAM,EAAK,CAAC,CACnD,EAAE,KAAK,IAAI,CAAC,CACd,CAAC,EAGG,MAAM,SAAS,WAAa,WAC9B,SAAS,iBAAiB,qBAAuB,KAAK,GAAI,UAAW,CACnE,MAAM,UAAU,gBAAgB,GAAO,EAAI,EAC3C,IAAI,KAAO,CAAE,KAAM,EAAK,EACxB,KAAK,MAAM,GAAO,IAAI,CACxB,EAAE,KAAK,IAAI,CAAC,EAEZ,SAAS,iBAAiB,qBAAuB,KAAK,GAAI,UAAW,CAC/D,KAAK,aACP,KAAK,KAAK,CAEd,EAAE,KAAK,IAAI,CAAC,EAEhB,EAEA,KAAM,SAAS,IAAK,KAAM,CAExB,KAAK,OAAS,SAAS,eAAe,KAAK,EAAE,EAG7C,IAAI,aAAe,GACf,KAAO,CACT,kBAAmB,KAAO,KAAK,kBAAoB,EACrD,EAEA,GAAI,MAAK,OAKT,CAAI,IACF,IAAI,eAAe,EAEnB,aAAe,GAKb,KAAO,IAAI,kBACb,IAAI,gBAAgB,EAEpB,KAAK,aAAe,IAAI,eAGtB,KAAK,QAAU,CAAC,cAClB,KAAK,MAAM,EAGb,eAAiB,OAAO,QAExB,MAAM,MAAM,kBAAkB,KAAK,OAAQ,UAAW,CACpD,KAAK,OAAO,UAAU,IAAI,OAAO,SAAS,CAC5C,EAAE,KAAK,IAAI,CAAC,EAEZ,SAAS,gBAAgB,UAAU,IAAI,OAAO,aAAa,EAC3D,SAAS,KAAK,UAAU,IAAI,OAAO,aAAa,EAChD,KAAK,MAAM,cAAc,SAAS,EAAE,CAAC,EACrC,OAAO,SAAS,EAAE,CAAC,EAEnB,MAAM,KAAK,UAAU,CACnB,UAAW,KAAK,OAChB,eAAgB,KAAK,YACrB,SACF,CAAC,EAEG,KAAK,cAAgB,KAAK,aAAa,aAAa,eAAe,GACrE,KAAK,aAAa,aAAa,gBAAiB,MAAM,EAGxD,IAAI,OAAS,KAAK,aAAa,QAAQ,IAEvC,SAAS,cAAc,IAAI,YAAY,oBAAsB,KAAK,EAAE,CAAC,EACrE,SAAS,cAAc,IAAI,YAAY,cAAe,CACpD,OAAQ,CACN,OAAQ,KACR,IAAK,OACL,kBAAmB,KAAK,iBAC1B,CACF,CAAC,CAAC,EAEF,KAAK,YAAc,GACnB,KAAK,OAAS,GACd,SAAS,MAAQ,KAAK,MAGlB,OAAO,IAAM,GAAG,OAAQ,WAAY,CAAE,KAAM,MAAO,CAAC,EAExD,KAAK,WAAW,EAClB,EAEA,MAAO,SAAS,IAAK,KAAM,CACzB,IAAI,QAAU,OAAe,IAAM,IAAI,KAAO,MAC1C,OAAS,QAAU,QAAQ,KAAO,GAClC,UAAa,YAAW,QAAQ,WACpC,SAAS,KAAK,gBAAgB,OAAO,EACrC,KAAK,MAAM,OAAO,MAAM,iBAAmB,OAAO,YAE9C,QACF,SAAS,cAAc,IAAI,YAAY,cAAe,CACpD,OAAQ,CACN,OAAQ,KACR,KAAM,EACR,CACF,CAAC,CAAC,EAGJ,IAAI,WAAa,UAAY,CAAC,EAAI,OAAO,kBACrC,eAAiB,UAAY,OAAO,iBAAmB,OAAO,iBAG7D,KAAK,SAKV,SAAS,cAAc,KAAK,EAE5B,MAAM,MAAM,kBAAkB,KAAK,OAAQ,UAAW,CACpD,KAAK,OAAO,UAAU,OAAO,OAAO,SAAS,EAC7C,KAAK,OAAO,UAAU,IAAI,GAAG,UAAU,EACvC,KAAK,OAAO,UAAU,OAAO,kBAAkB,CACjD,EAAE,KAAK,IAAI,CAAC,EAEZ,SAAS,gBAAgB,UAAU,OAAO,OAAO,aAAa,EAC9D,SAAS,KAAK,UAAU,OAAO,OAAO,aAAa,EACnD,SAAS,gBAAgB,UAAU,IAAI,GAAG,cAAc,EACxD,SAAS,KAAK,UAAU,IAAI,GAAG,cAAc,EAE7C,OAAO,WAAW,UAAW,CAC3B,KAAK,OAAO,UAAU,OAAO,GAAG,UAAU,EAC1C,SAAS,gBAAgB,UAAU,OAAO,GAAG,cAAc,EAC3D,SAAS,KAAK,UAAU,OAAO,GAAG,cAAc,EAChD,OAAO,SAAS,EAAG,cAAc,CACnC,EAAE,KAAK,IAAI,EAAG,GAAG,EAEjB,MAAM,KAAK,gBAAgB,CACzB,UAAW,KAAK,OAChB,SACF,CAAC,EAEG,KAAK,cAAgB,KAAK,aAAa,aAAa,eAAe,IACrE,KAAK,aAAa,aAAa,gBAAiB,OAAO,EACvD,KAAK,aAAa,MAAM,GAG1B,SAAS,cAAc,IAAI,YAAY,mBAAmB,CAAC,EAC3D,SAAS,cAAc,IAAI,YAAY,qBAAuB,KAAK,EAAE,CAAC,EAEtE,OAAO,SAAS,EAAG,cAAc,EAEjC,KAAK,OAAS,GACd,SAAS,MAAQ,cAEb,OAAO,IAAM,GAAG,OAAQ,UAAU,EAEtC,KAAK,aAAa,EACpB,EAEA,WAAY,UAAW,CAErB,OAAO,GAAG,SAAW,UAAW,SAAS,IAAK,CAC5C,GAAI,IAAI,UAAY,GAAI,CAItB,GAHI,KAAK,MAAM,WAAW,UAAU,SAAS,YAAY,GAGrD,SAAS,KAAK,UAAU,SAAS,gBAAgB,EACnD,OAGF,KAAK,MAAM,GAAO,CAAE,KAAM,EAAK,CAAC,CAClC,CACF,EAAE,KAAK,IAAI,CAAC,EAGZ,IAAI,SAAW,EACX,aAAe,EAEnB,OAAO,GAAG,aAAe,UAAW,MAAM,MAAM,SAAS,GAAI,UAAW,CACtE,IAAI,IAAM,OAAO,QACb,KAAO,IAIX,SAAW,EAAE,IAAI,KACjB,SAAS,KAAK,MAAM,WAAa,cAAgB,SAAW,IAG5D,aAAe,OAAO,YAAe,IAAM,EAEvC,KAAO,OAAO,uBAChB,aAAe,GAGjB,KAAK,MAAM,OAAO,MAAM,iBAAmB,aAC7C,EAAE,KAAK,IAAI,CAAC,CAAC,EAEb,OAAO,GAAG,YAAc,UAAW,UAAW,CAC5C,IAAI,IAAM,OAAO,QACjB,GAAI,IAAM,OAAO,qBAAsB,CACrC,IAAI,KAAO,CAAE,KAAM,EAAK,EACxB,KAAK,MAAM,GAAO,IAAI,CACxB,CACF,EAAE,KAAK,IAAI,CAAC,CACd,EAEA,aAAc,UAAW,CACvB,OAAO,IAAI,SAAW,SAAS,EAC/B,OAAO,IAAI,aAAe,SAAS,EACnC,OAAO,IAAI,YAAc,SAAS,CACpC,CACF,CAAC,EAEM,aACT,GAAG,EAQH,MAAM,kBAAoB,UAAW,CACnC,IAAI,YAAc,OAAO,SAAS,SAAW,OAAO,SAAS,OACzD,YAAc,YACd,SAAW,KACX,cAAgB,KAChB,sBAAuB,UACzB,QAAQ,kBAAoB,UAG9B,IAAI,UAAY,CACd,YAAa,kBACb,QAAS,oBACT,QAAS,qBACX,EAEI,UAAY,CAAC,EAEjB,SAAS,KAAK,UAAW,CACvB,GAAK,MAAM,SAAS,UAIpB,KAAI,WAAa,cAAc,EAC/B,mBAAmB,UAAU,EAC7B,mBAAmB,EACrB,CAEA,SAAS,oBAAqB,CAExB,QAAQ,aAKZ,SAAS,iBAAiB,cAAe,SAAS,IAAK,CACrD,GAAK,IAAI,OAIT,KAAI,KAAO,IAAI,OAEf,cAAgB,KAAK,OAEjB,KAAK,OACP,SAAW,SAAS,SACpB,YAAc,YACd,QAAQ,UAAU,CAAC,EAAG,GAAI,WAAW,GAGnC,KAAK,KACH,KAAK,oBACP,SAAW,SAAS,SACpB,YAAc,KAAK,IACnB,QAAQ,UAAU,CAAC,EAAG,GAAI,KAAK,GAAG,GAGxC,CAAC,EAED,OAAO,iBAAiB,WAAY,SAAS,IAAK,CAChD,IAAI,QAAU,GAId,GAHA,SAAW,YAGP,SAAS,WAAa,YAQ1B,IAJA,SAAW,YACX,YAAc,SAAS,SAGnB,SAAS,WAAa,YAAa,CACjC,eAAiB,cAAc,QACjC,YAAY,aAAa,EAE3B,MACF,CAGA,GAAI,SAAS,SAAS,QAAQ,YAAY,IAAM,GAAI,CAClD,GAAI,cACF,cAAc,KAAK,MACd,CAEL,IAAI,IAAM,SAAS,cAAc,6BAA8B,SAAS,SAAU,IAAI,EACtF,IAAI,cAAc,IAAI,MAAM,OAAO,EAAG,CAAE,kBAAmB,EAAM,CAAC,CACpE,CAEA,MACF,CAEA,GAAI,IAAI,eAAiB,IAAI,cAAc,MAAO,CAChD,GAAI,eAAiB,cAAc,OAAQ,CACzC,YAAY,aAAa,EACzB,QAAQ,aAAa,CAAC,EAAG,GAAI,WAAW,EACxC,MACF,CAEA,QAAU,EACZ,SACM,eACF,GAAI,cAAc,OAAQ,CACxB,YAAY,aAAa,EACzB,MACF,OAGA,QAAU,GAKV,UACF,OAAO,SAAS,KAAO,SAAS,MAEpC,EAAE,KAAK,IAAI,CAAC,EACd,CAEA,SAAS,YAAY,OAAQ,CAC3B,OAAO,MAAM,EACb,cAAgB,KAChB,OAAO,cAAc,IAAI,MAAM,QAAQ,CAAC,CAC1C,CAEA,SAAS,cAAc,MAAO,CAC5B,IAAI,IAAM,CAAC,EAEP,SAAW,MAAQ,MAAM,iBAAiB,UAAU,OAAO,EAAI,SAAS,iBAAiB,UAAU,OAAO,EAE9G,gBAAS,QAAQ,SAAW,CAC1B,IAAI,GAAK,QAAQ,QAAQ,UAGzB,GAAI,IAAI,QAAQ,EAAE,EAAI,GAAI,CACxB,IAAI,UAAY,SAAS,cAAc,2CAA6C,GAAK,IAAI,EACzF,WACF,UAAU,WAAW,YAAY,SAAS,EAE5C,MACF,CAEA,IAAI,KAAK,EAAE,CACb,CAAC,EAEM,GACT,CAEA,SAAS,mBAAmB,SAAU,CACpC,IAAI,IAAM,CAAC,EAEX,gBAAS,QAAQ,SAAW,CAC1B,IAAI,GAAK,QAAQ,QAAQ,UACzB,IAAI,KAAK,EAAE,CACb,CAAC,EAEM,GACT,CAEA,SAAS,mBAAmB,IAAK,CAM/B,QALI,SACA,YACA,QAAU,SAAS,uBAAuB,EAGrC,EAAI,EAAG,EAAI,IAAI,OAAQ,IAC1B,UAAU,QAAQ,IAAI,CAAC,CAAC,IAAM,KAChC,SAAW,iBAAmB,IAAI,CAAC,EACnC,YAAc,SAAS,eAAe,QAAQ,EAE1C,cACF,QAAQ,YAAY,WAAW,EAC/B,UAAU,KAAK,IAAI,CAAC,CAAC,IAM3B,SAAS,cAAc,UAAU,WAAW,EAAE,YAAY,OAAO,EAGjE,QAAS,EAAI,EAAG,EAAI,UAAU,OAAQ,IACpC,SAAW,iBAAmB,UAAU,CAAC,EACzC,IAAI,MAAM,cAAc,SAAU,WAAa,UAAU,CAAC,CAAC,CAE/D,CAKA,SAAS,OAAO,UAAW,CACzB,GAAK,MAAM,SAAS,UAYpB,SARI,UAAY,CAAC,EACb,WAAa,cAAc,SAAS,EAGpC,cAAgB,SAAS,iBAAiB,UAAU,OAAO,EAC3D,eAAiB,mBAAmB,aAAa,EAG5C,EAAI,EAAG,EAAI,WAAW,OAAQ,IAAK,CAC1C,IAAI,GAAK,WAAW,CAAC,EACjB,eAAe,QAAQ,EAAE,IAAM,IACjC,UAAU,KAAK,EAAE,CAErB,CAEA,QAAS,EAAI,EAAG,EAAI,UAAU,OAAQ,IACpC,SAAS,gBAAgB,UAAU,CAAC,CAAC,EAEzC,CAGA,SAAS,OAAO,UAAW,CACzB,GAAK,MAAM,SAAS,UAIpB,KAAI,cAAgB,cAAc,SAAS,EAC3C,sBAAsB,cAAe,SAAS,EAC9C,mBAAmB,aAAa,EAIhC,IAAI,QAAU,SAAS,eAAe,gBAAgB,EACtD,MAAM,SAAS,SAAS,mBAAoB,MAAM,QAAS,OAAO,EACpE,CAEA,SAAS,sBAAsB,IAAK,UAAW,CAC7C,QAAS,EAAI,EAAG,EAAI,IAAI,OAAQ,IAAK,CACnC,IAAI,UAAY,UAAU,cAAc,2CAA6C,IAAI,CAAC,EAAI,IAAI,EAC9F,WACF,UAAU,WAAW,YAAY,SAAS,CAE9C,CACF,CAEA,MAAO,CACL,KACA,OACA,MACF,CACF,GAAG,EAEH,MAAM,kBAAoB,UAAW,CACnC,IAAI,UAAY,CACd,QAAS,gBACT,OAAQ,iBACV,EAEA,SAAS,iBAAiB,UAAW,CACnC,KAAK,UAAY,UACjB,KAAK,UAAY,KAAK,UAAU,aAAa,iBAAiB,EAC9D,KAAK,UAAY,yBAA2B,KAAK,UACjD,KAAK,UAAY,CAAC,EAClB,KAAK,WAAa,CAAC,EAEd,MAAM,SAAS,mBAIpB,KAAK,SAAW,UAAU,iBAAiB,UAAU,OAAO,EAC5D,KAAK,cAAiB,UAAU,QAAQ,uBAAyB,OAG7D,KAAK,SAAS,SAAW,GAI7B,KAAK,KAAK,EACZ,CAEA,wBAAiB,UAAY,OAAO,OAAO,CAAC,EAAG,iBAAiB,UAAW,CACzE,KAAM,UAAW,CACf,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,aAAa,CACpB,EAEA,eAAgB,UAAW,CACzB,KAAK,SAAS,QAAQ,MAAQ,CAC5B,KAAK,IAAI,aAAe,KAAK,SAAS,EACtC,KAAK,IAAI,WAAa,KAAK,SAAS,CACtC,CAAC,EAED,OAAO,IAAI,SAAW,KAAK,SAAS,EAEhC,MAAM,OAAO,QACX,KAAK,eACP,KAAK,iBAAiB,EAGxB,KAAK,gBAAgB,CAEzB,EAEA,aAAc,UAAW,CACvB,SAAS,iBAAiB,aAAc,UAAW,CACjD,KAAK,kBAAkB,EACvB,KAAK,eAAe,CACtB,EAAE,KAAK,IAAI,CAAC,EACZ,SAAS,iBAAiB,eAAgB,UAAW,CACnD,KAAK,kBAAkB,EACvB,KAAK,eAAe,CACtB,EAAE,KAAK,IAAI,CAAC,CACd,EAEA,iBAAkB,UAAW,CAC3B,KAAK,SAAS,QAAQ,MAAQ,CAC5B,IAAI,SAAW,IAAI,qBAAqB,CAAC,QAASI,YAAa,CAC7D,QAAQ,QAAQ,OAAS,CACvB,IAAI,OAAS,KAAK,cAAc,UAAU,MAAM,EAC5C,MAAM,OAAO,UACX,MAAM,eACR,KAAK,WAAW,MAAM,EAEtB,KAAK,cAAc,MAAM,EAG/B,CAAC,CACH,EAAG,CAAC,UAAW,CAAC,CAAC,EAEjB,SAAS,QAAQ,IAAI,CACvB,CAAC,CACH,EAEA,gBAAiB,UAAW,CAC1B,KAAK,SAAS,QAAQ,MAAQ,CAC5B,IAAI,OAAS,KAAK,cAAc,UAAU,MAAM,EAEhD,KAAK,GAAG,aAAe,KAAK,UAAW,UAAW,CAChD,KAAK,WAAW,MAAM,CACxB,EAAE,KAAK,IAAI,CAAC,EAEZ,KAAK,GAAG,aAAe,KAAK,UAAW,SAAS,IAAK,CACnD,KAAK,cAAc,MAAM,CAC3B,EAAE,KAAK,IAAI,CAAC,CACd,CAAC,CACH,EAEA,WAAY,SAAS,OAAQ,CACvB,CAAC,OAAO,SAAW,OAAO,QAAQ,WAAa,GAI/C,KAAK,UAAU,QAAQ,OAAO,QAAQ,EAAE,IAAM,KAIlD,OAAO,UAAU,IAAI,sBAAsB,EAC3C,KAAK,WAAW,OAAO,QAAQ,EAAE,EAAI,IAAI,MAAM,UAAU,OAAQ,CAC/D,SAAU,KACV,KAAM,GACN,YAAa,EACf,CAAC,EAED,KAAK,UAAU,KAAK,OAAO,QAAQ,EAAE,EACvC,EAEA,cAAe,SAAS,OAAQ,CAC9B,GAAI,GAAC,OAAO,SAAW,OAAO,QAAQ,WAAa,GAInD,KAAI,cAAgB,KAAK,UAAU,QAAQ,OAAO,QAAQ,EAAE,EAC5D,GAAI,gBAAkB,GAAI,CACxB,KAAK,UAAU,OAAO,cAAe,CAAC,EAEtC,IAAI,SAAW,KAAK,WAAW,OAAO,QAAQ,EAAE,EAC5C,UAAY,OAAO,SAAS,SAAY,YAC1C,SAAS,QAAQ,CAErB,EACF,EAEA,kBAAmB,UAAW,CAC5B,KAAK,SAAS,QAAQ,MAAQ,CAC5B,IAAI,OAAS,KAAK,cAAc,UAAU,MAAM,EAChD,KAAK,cAAc,MAAM,CAC3B,CAAC,CACH,CACF,CAAC,EAEM,gBACT,GAAG,EAEH,MAAM,UAAY,UAAW,CAE3B,IAAI,UAAY,CACd,UAAW,iBACX,WAAY,uBACZ,IAAK,YACL,UAAW,uBACX,gBAAiB,qBACjB,eAAgB,yBAClB,EAEI,QAAU,CACZ,WAAY,0BACZ,OAAQ,wBACR,SAAU,YACV,OAAQ,mBACR,cAAe,mBACf,gBAAiB,oBACnB,EAEI,UAAY,YAEZ,gBACA,aACA,cACA,UAAY,GACZ,UAAY,EACZ,UACA,WACA,WACA,iBACA,iBAAmB,KAEvB,SAAS,MAAO,CACd,IAAI,eAAiB,SAAS,cAAc,UAAU,cAAc,EAChE,iBACF,UAAY,IAGd,UAAY,SAAS,cAAc,UAAU,SAAS,EACtD,WAAa,SAAS,cAAc,UAAU,UAAU,EAExD,WAAa,SAAS,iBAAiB,UAAU,SAAS,EAC1D,iBAAmB,SAAS,iBAAiB,UAAU,eAAe,EAEtE,WAAW,QAAQ,KAAO,CACxB,IAAI,GAAG,QAAU,UAAW,SAAS,CACvC,CAAC,EAED,iBAAiB,QAAQ,KAAO,CAC9B,IAAI,GAAG,QAAU,UAAW,YAAY,CAC1C,CAAC,CACH,CAEA,SAAS,UAAU,IAAK,CACtB,iBAAmB,IAAI,cACnB,iBAAiB,UAAU,SAAS,QAAQ,QAAQ,EACtD,SAAS,EAET,QAAQ,CAEZ,CAEA,SAAS,QAAQ,IAAK,CASpB,GARA,WAAW,QAAQ,KAAO,CACxB,IAAI,UAAU,IAAI,QAAQ,QAAQ,CACpC,CAAC,EAED,MAAM,MAAM,kBAAkB,WAAY,UAAW,CACnD,WAAW,UAAU,IAAI,QAAQ,MAAM,CACzC,CAAC,EAEG,UAAW,CACb,IAAI,iBAAmB,SAAS,cAAc,UAAU,UAAU,EAAE,aACpE,UAAU,MAAM,UAAY,kBAAoB,iBAAmB,QACrE,CAEA,WAAW,aAAa,WAAY,IAAI,EACxC,WAAW,MAAM,EAGjB,OAAO,GAAG,QAAU,UAAW,SAASF,KAAK,CACvCA,KAAI,UAAY,IAClB,SAAS,CAEb,CAAC,CACH,CAEA,SAAS,UAAW,CAClB,WAAW,QAAQ,KAAO,CACxB,IAAI,UAAU,OAAO,QAAQ,QAAQ,CACvC,CAAC,EAED,MAAM,MAAM,kBAAkB,WAAY,UAAW,CACnD,WAAW,UAAU,OAAO,QAAQ,MAAM,CAC5C,CAAC,EAEG,WACF,UAAU,gBAAgB,OAAO,EAGnC,iBAAiB,MAAM,EACvB,iBAAmB,KAEnB,OAAO,IAAI,QAAU,SAAS,CAChC,CAEA,SAAS,aAAa,IAAK,CACzB,GAAI,iBAIJ,KAAI,UAAY,IAAI,cAChB,SAAW,UAAU,UAAU,SAAS,QAAQ,MAAM,EAG1D,GAFA,gBAAkB,GAEd,SAAU,CAEZ,IAAI,KAAO,SAAS,iBAAiB,UAAU,gBAAkB,iBAAmB,UAAY,GAAK,IAAI,EACzG,KAAK,QAAQ,KAAO,CAClB,IAAI,UAAU,OAAO,QAAQ,QAAQ,CACvC,CAAC,EAED,IAAI,MAAQ,SAAS,iBAAiB,oCAAuC,UAAa,IAAI,EAC9F,MAAM,QAAQ,MAAQ,CACpB,MAAM,MAAM,kBAAkB,KAAM,UAAW,CAC7C,KAAK,UAAU,OAAO,QAAQ,QAAQ,CACxC,CAAC,CACH,CAAC,EAEG,eACF,cAAc,UAAU,OAAO,QAAQ,QAAQ,CAEnD,KAAO,CACL,UAAU,UAAU,IAAI,QAAQ,QAAQ,EAExC,IAAI,SAAW,UAAU,mBACzB,MAAM,MAAM,kBAAkB,SAAU,UAAW,CACjD,SAAS,UAAU,IAAI,QAAQ,QAAQ,CACzC,CAAC,CACH,CAEA,cAAgB,UAEhB,WAAW,UAAU,QAAQ,MAAM,EACrC,CAEA,SAAS,WAAW,OAAQ,CAC1B,IAAI,WAAa,OACb,SAAS,cAAc,qCAAuC,OAAS,IAAI,EAC3E,SAAS,cAAc,UAAU,GAAG,EAExC,UAAY,WAAW,QAAQ,MAAQ,SAAS,WAAW,QAAQ,KAAK,EAAI,EAE5E,aAAe,WAOf,IAAI,oBAAsB,WAAW,aAEjC,aACF,UAAY,EAAI,QAAQ,gBAAkB,QAAQ,cAEpD,WAAW,MAAM,OAAS,oBAAsB,KAChD,WAAW,UAAU,OAAO,QAAQ,eAAe,EACnD,WAAW,UAAU,IAAI,YAAY,EAEhC,SAEH,WAAW,UAAU,OAAO,QAAQ,eAAe,EACnD,WAAW,UAAU,OAAO,QAAQ,aAAa,GAGnD,gBAAkB,GAGd,YACF,UAAU,MAAM,UAAY,kBAAoB,oBAAsB,SAE1E,CAEA,SAAS,QAAS,CAChB,OAAO,IAAI,SAAS,CACtB,CAEA,MAAO,CACL,KACA,MACF,CACF,GAAG,EAEH,OAAO,WAAa,SAAS,IAAK,CAE5B,IAAI,YACN,SAAS,KAAK,UAAU,OAAO,WAAW,EAC1C,SAAS,iBAAiB,iBAAiB,EAAE,QAAQD,KAAM,CACzDA,IAAG,UAAU,OAAO,cAAc,CACpC,CAAC,EACD,SAAS,iBAAiB,eAAe,EAAE,QAAQ,KAAO,CACxD,IAAI,UAAU,OAAO,cAAc,CACrC,CAAC,GAIH,IAAI,YAAc,MAAM,WAAc,OAAO,OAAO,YAAe,KAAe,OAAO,YAAY,YAAc,OAAO,YAAY,WAAW,OAAS,EACtJ,aACF,MAAM,oBAAoB,CAE9B,EAEA,MAAM,oBAAsB,UAAW,CACrC,GAAK,MAAM,OAAO,kBAClB,KAAI,SAAW,SAAS,SAAS,SAE7B,eAAe,kBAAoB,QAAQ,GAC7C,OAAO,SAAS,EAAG,eAAe,QAAQ,kBAAoB,QAAQ,CAAC,EAE3E,EAEA,MAAM,4BAA8B,UAAW,CAC7C,GAAK,MAAM,OAAO,kBAClB,KAAI,UAAY,MAAM,OAAO,SAAW,WAAa,eAErD,OAAO,iBAAiB,UAAW,SAAUD,OAAO,CAClD,IAAI,IAAM,OAAO,QAEjB,eAAe,QAAQ,kBAAoB,SAAS,SAAS,SAAU,IAAI,SAAS,CAAC,CACvF,CAAC,EACH,EAEA,MAAM,gBAAkB,UAAW,CAC7B,SAAS,KAAK,QAAQ,cAAgB,SAOpC,MAAM,OAAO,UACf,SAAS,iBAAiB,GAAG,EAAE,QAAQ,GAAK,CAC1C,OAAO,WAAW,UAAW,CAC3B,SAAS,KAAK,UAAU,OAAO,WAAW,CAC5C,EAAG,IAAI,CACT,CAAC,EAKH,SAAS,iBAAiB,uHAAuH,EAAE,QAAQC,KAAM,CAC/JA,IAAG,UAAU,IAAI,kBAAkB,CACrC,CAAC,EAED,SAAS,iBAAiB,0BAA0B,EAAE,QAAQA,KAAM,CAClEA,IAAG,iBAAiB,QAAS,SAAS,IAAK,CACzC,GAAI,IAAI,QAAS,MAAO,GACxB,IAAI,IAAMA,IAAG,aAAa,MAAM,EAGhC,GAAG,IAAI,QAAQ,SAAS,QAAQ,GAAK,GAAK,IAAI,QAAQ,GAAG,GAAK,EAC5D,MAAO,GAGT,IAAI,eAAe,EACnB,SAAS,KAAK,UAAU,IAAI,WAAW,EACvC,OAAO,WAAW,UAAW,CAC3B,SAAS,KAAO,GAClB,EAAG,EAAE,CACP,CAAC,CACH,CAAC,EAEL,EAEA,MAAM,WAAa,UAAW,CAE5B,IAAI,UAAY,CACd,QAAS,kBACT,WAAY,eACZ,KAAM,yBACN,SAAU,kBACV,SAAU,kBACV,qBAAsB,gCACtB,iBAAkB,yCAClB,UAAW,uBACb,EAEI,QAAU,CACZ,iBAAkB,yBAClB,oBAAqB,kCACrB,eAAgB,aAChB,iBAAkB,yBAClB,oBAAqB,0BACrB,eAAgB,WAChB,kBAAmB,iCACnB,YAAa,sBACb,mBAAoB,yBACpB,oBAAqB,sBACvB,EAEI,OAAS,CACX,UAAW,WACX,cAAe,GACf,aAAc,GACd,oBAAqB,GACrB,mBAAoB,EACtB,EAGI,QACA,WAEJ,SAAS,MAAO,CACd,QAAU,SAAS,cAAc,UAAU,OAAO,EAClD,WAAa,SAAS,cAAc,UAAU,UAAU,EAGxD,MAAM,SAAS,cAAiB,WAAW,QAAQ,UAAY,OAC/D,OAAO,aAAe,GAEtB,oBAAoB,EACpB,IAAI,YAAc,IAAI,MAAM,OAAO,cAAe,eAAgB,CAChE,qBAAsB,GACtB,cAAe,kBACjB,CAAC,EAGD,OAAO,GAAG,SAAW,OAAO,UAAW,MAAM,MAAM,SAAS,IAAK,YAAY,CAAC,EAC9E,OAAO,GAAG,OAAS,OAAO,UAAW,UAAU,EAK/C,eAAe,EAGf,OAAO,GAAG,SAAW,OAAO,UAAW,MAAM,MAAM,SAAS,IAAK,kBAAkB,CAAC,EAGpF,OAAO,GAAG,SAAW,OAAO,UAAW,MAAM,MAAM,SAAS,IAAK,kBAAkB,CAAC,EAGhF,QAAQ,YACV,OAAO,cAAc,IAAI,MAAM,QAAQ,CAAC,CAE5C,CAEA,SAAS,YAAa,CACpB,WAAW,EACX,oBAAoB,EAEhB,OAAO,cAAgB,OACzB,kBAAkB,CAEtB,CAEA,SAAS,cAAe,CACtB,WAAW,EACX,eAAe,EAEX,OAAO,cAAgB,OACzB,mBAAmB,CAEvB,CAEA,SAAS,gBAAiB,CACpB,MAAM,OAAO,QACf,OAAO,YAAc,SAErB,OAAO,YAAc,QAAQ,QAAQ,YAGvC,OAAO,gBAAkB,OAAO,cAAgB,SAAW,IAAM,IAE7D,OAAO,cAAgB,UACzB,gBAAgB,EAAK,CAEzB,CAEA,SAAS,YAAa,CACpB,SAAS,iBAAiB,UAAU,IAAI,EAAE,QAAQ,MAAQ,CACxD,IAAI,kBAAoB,KAAK,YACzB,eAAiB,KAAK,QAAQ,cAAc,EAAE,YAG9C,kBAAoB,eACtB,KAAK,MAAM,SAAW,eAGtB,KAAK,gBAAgB,OAAO,CAEhC,CAAC,CACH,CAEA,SAAS,qBAAsB,CAC7B,IAAI,kBAAoB,GACpB,qBAAuB,GACvB,mBAAqB,GAGrB,MAAM,OAAO,SACf,SAAS,iBAAiB,UAAU,oBAAoB,EAAE,QAAQA,KAAM,CACtEA,IAAG,GAAG,WAAa,OAAO,UAAW,SAAS,IAAK,CACjD,IAAI,OAAS,IAAI,cAAc,WAC1B,OAAO,UAAU,SAAS,QAAQ,cAAc,EAKnD,OAAO,SAAS,QAAQ,IAAI,cAAc,aAAa,MAAM,CAAC,GAJ9D,IAAI,eAAe,EACnB,eAAe,EACf,uBAAuB,IAAI,aAAa,EAI5C,CAAC,CACH,CAAC,EAIH,SAAS,iBAAiB,UAAU,QAAQ,EAAE,QAAQA,KAAM,CAC1DA,IAAG,GAAG,UAAY,OAAO,UAAW,oBAAoB,EACxDA,IAAG,GAAG,YAAc,OAAO,UAAW,oBAAoB,EAC1DA,IAAG,GAAG,aAAe,OAAO,UAAW,cAAc,CACvD,CAAC,EAED,SAAS,iBAAiB,UAAU,gBAAgB,EAAE,QAAQA,KAAM,CAC9D,MAAM,OAAO,SACfA,IAAG,GAAG,WAAa,OAAO,UAAW,SAAS,IAAK,CACjD,IAAI,OAAS,IAAI,cAAc,WAG3B,OAAO,UAAU,SAAS,QAAQ,mBAAmB,EAClD,OAAO,UAAU,SAAS,QAAQ,cAAc,EAKnD,OAAO,SAAS,QAAQ,IAAI,cAAc,aAAa,MAAM,CAAC,GAJ9D,IAAI,eAAe,EACnB,wBAAwB,EACxB,wBAAwB,IAAI,aAAa,GAM3C,OAAO,SAAS,QAAQ,IAAI,cAAc,aAAa,MAAM,CAAC,CAElE,CAAC,EAIHA,IAAG,GAAG,UAAY,OAAO,UAAW,SAAS,IAAK,CAChD,wBAAwB,EACxB,wBAAwB,IAAI,cAAe,EAAI,CACjD,CAAC,CACH,CAAC,EAED,SAAS,qBAAqB,IAAK,CAC7B,mBACF,yBAAyB,EAGvB,sBACF,wBAAwB,EAG1B,uBAAuB,IAAI,aAAa,CAC1C,CAGA,SAAS,uBAAuBA,IAAI,CAClC,IAAI,OAASA,IAAG,WAMhB,GALI,OAAO,UAAU,SAAS,QAAQ,gBAAgB,IACpD,OAAO,UAAU,IAAI,QAAQ,cAAc,EAC3C,kBAAoB,IAGlB,CAAC,MAAM,OAAO,SACZ,CAAC,mBAAoB,CACvB,IAAI,UAAY,MAAM,OAAO,QAAU,WAAa,QACpD,mBAAqB,GACrB,SAAS,gBAAgB,GAAG,UAAY,OAAO,UAAW,UAAW,CACnE,eAAe,EACf,SAAS,gBAAgB,IAAI,UAAY,OAAO,SAAS,EACzD,mBAAqB,EACvB,EAAE,KAAK,IAAI,CAAC,CACd,CAEJ,CAEA,SAAS,wBAAwBA,IAAI,UAAW,CAC9C,IAAI,OAASA,IAAG,YACZ,OAAO,UAAU,SAAS,QAAQ,mBAAmB,GAAK,aAC5D,OAAO,UAAU,IAAI,QAAQ,cAAc,EAC3C,qBAAuB,GAE3B,CAEA,SAAS,gBAAiB,CACxB,yBAAyB,EACzB,wBAAwB,CAC1B,CAEA,SAAS,0BAA2B,CAClC,SAAS,iBAAiB,UAAU,QAAQ,EAAE,QAAQA,KAAM,CAC1DA,IAAG,UAAU,OAAO,QAAQ,cAAc,CAC5C,CAAC,CACH,CAEA,SAAS,yBAA0B,CACjC,SAAS,iBAAiB,UAAU,gBAAgB,EAAE,QAAQA,KAAM,CAClEA,IAAG,WAAW,UAAU,OAAO,QAAQ,cAAc,CACvD,CAAC,CACH,CACF,CAEA,SAAS,mBAAoB,CAC3B,IAAI,SAAW,SAAS,cAAc,KAAK,EAC3C,SAAS,UAAU,IAAI,oBAAoB,EAC3C,MAAM,MAAM,KAAK,WAAY,QAAQ,EAGjC,OAAM,SAAS,gBAInB,mBAAmB,EACnB,WAAW,UAAW,CACpB,mBAAmB,EAGnB,IAAI,aAAe,SAAS,cAAc,qBAAqB,EAC3D,aAAa,eAAiB,GAChC,WAAW,UAAW,CACpB,OAAO,cAAc,IAAI,MAAM,QAAQ,CAAC,CAC1C,EAAG,GAAG,CAEV,EAAG,GAAG,EACR,CAEA,SAAS,oBAAqB,CAC5B,IAAI,aAAe,SAAS,cAAc,qBAAqB,EAC/D,GAAI,aAAc,CAChB,IAAI,EAAI,WAAW,aACnB,aAAa,MAAM,OAAS,EAAI,IAClC,CACF,CAEA,SAAS,qBAAsB,CACzB,SAAS,KAAK,UAAU,SAAS,QAAQ,gBAAgB,GAIzD,MAAM,OAAO,SAAW,MAAM,WAAa,WAC7C,WAAW,UAAW,CACpB,OAAO,oBAAsB,GAC7B,gBAAgB,EAAI,CACtB,EAAG,EAAE,CAET,CAEA,SAAS,mBAAmB,IAAK,CAC/B,GAAI,OAAO,QAAU,OAAO,gBAAiB,CAK3C,GAJI,OAAO,sBACT,OAAO,oBAAsB,IAG3B,OAAO,aACT,OAGE,OAAO,cAAgB,SACzB,gBAAgB,EAAI,EACX,OAAO,cAAgB,OAChC,cAAc,EAAI,CAEtB,KAAO,CAOL,GAJI,OAAO,qBAIP,CAAC,OAAO,aACV,OAGE,OAAO,cAAgB,SACpB,MAAM,OAAO,SAChB,gBAAgB,EAAK,EAEd,OAAO,cAAgB,OAChC,cAAc,EAAK,EAGhB,MAAM,SAAS,eAClB,mBAAmB,CAEvB,CACF,CAEA,SAAS,gBAAgB,OAAQ,WAAY,CAG3C,GAAI,OAAO,mBACT,OAIF,IAAI,SAAW,SAAS,cAAc,6BAA6B,EACnE,GAAI,SAAS,UAAU,SAAS,kBAAkB,EAChD,OAGF,MAAM,YAAc,SAAS,cAAc,UAAU,SAAS,EAC9D,aAAe,YAAY,UAAU,OAAO,QAAQ,kBAAmB,CAAC,MAAM,EAE9E,OAAO,aAAe,OACtB,OAAO,mBAAqB,UAC9B,CAEA,SAAS,cAAc,OAAQ,CACzB,OAAO,cAAgB,QAIvB,QACF,WAAW,UAAU,IAAI,QAAQ,WAAW,EACxC,MAAM,SAAS,gBACjB,QAAQ,UAAU,OAAO,QAAQ,cAAc,EAC/C,QAAQ,UAAU,IAAI,QAAQ,kBAAkB,GAKlD,WAAW,UAAW,CACpB,WAAW,UAAU,IAAI,QAAQ,mBAAmB,CACtD,EAAG,GAAG,IAEN,WAAW,UAAU,OAAO,QAAQ,mBAAmB,EACvD,WAAW,UAAU,OAAO,QAAQ,WAAW,EAE3C,MAAM,SAAS,gBACjB,QAAQ,UAAU,IAAI,QAAQ,cAAc,EAC5C,QAAQ,UAAU,OAAO,QAAQ,kBAAkB,IAIvD,OAAO,aAAe,OACxB,CAKA,SAAS,sBAAuB,CAC9B,QAAQ,UAAU,OAAO,OAAO,mBAAmB,EACnD,QAAQ,UAAU,OAAO,OAAO,cAAc,EAC9C,MAAM,SAAS,cAAgB,EACjC,CAEA,SAAS,QAAS,CAChB,OAAO,IAAI,OAAO,SAAS,CAC7B,CAEA,MAAO,CACL,KACA,qBACA,gBACA,MACF,CACF,GAAG,EAEH,MAAM,cAAgB,UAAW,CAC/B,IAAI,SAAW,SAAS,iBAAiB,uBAAuB,EAE3D,SAAS,QAId,SAAS,QAAQ,SAAW,CAC1B,QAAQ,iBAAiB,KAAK,EAAE,QAAQ,OAAS,CAC/C,IAAI,KAAO,MAAM,aAAa,OAAO,GAEjC,CAAC,MAAQ,MAAQ,iBAEf,MAAM,MAAQ,QAAQ,aACxB,MAAM,UAAU,IAAI,gBAAgB,CAG1C,CAAC,CACH,CAAC,CACH,EAEA,MAAM,kBAAoB,UAAW,CACnC,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EAEpB,SAAS,cAAe,CACtB,IAAI,KAAO,OAAO,SAAS,KAGvB,OAAS,YACX,0BAA0B,CAE9B,CAEA,SAAS,2BAA4B,CACnC,IAAI,aAAe,SAAS,eAAe,qBAAqB,EAAE,UAAU,OAAO,MAAM,EACrF,UAAY,SAAS,eAAe,mBAAmB,EAAE,UAAU,OAAO,MAAM,CACtF,CAEA,SAAS,oBAAqB,CAE5B,IAAI,YAAc,SAAS,eAAe,iBAAiB,EACvD,aACF,YAAY,iBAAiB,QAAS,SAAS,IAAK,CAClD,IAAI,eAAe,EACnB,0BAA0B,CAC5B,CAAC,EAIH,IAAI,oBAAsB,SAAS,eAAe,yBAAyB,EACvE,qBACF,oBAAoB,iBAAiB,QAAS,SAAS,IAAK,CAC1D,IAAI,eAAe,EACnB,0BAA0B,CAC5B,CAAC,CAEL,CAEA,SAAS,sBAAuB,CAC9B,IAAI,UAAY,SAAS,cAAc,yBAAyB,EAG3D,WAKL,SAAS,eAAe,cAAc,EAAE,UAAU,OAAO,MAAM,CACjE,CAEA,SAAS,qBAAsB,CAC7B,IAAI,eAAiB,SAAS,eAAe,gBAAgB,EACzD,aAAe,SAAS,iBAAiB,kBAAkB,EAE3D,CAAC,gBAAkB,CAAC,aAAa,SAKrC,WAAW,UAAW,CACpB,SAAS,iBAAiB,qBAAqB,EAAE,QAAQA,KAAM,CAC7D,IAAI,UAAYA,IAAG,QAAQ,UACvB,WAAaA,IAAG,QAAQ,WACxB,oBAAsBA,IAAG,QAAQ,oBAErC,IAAI,QAAQ,wBACV,UACA,WACA,CACE,YAAa,mBACf,CACF,CACF,CAAC,CACH,EAAG,GAAI,EAGP,SAAS,iBAAiB,qBAAqB,EAAE,QAAQA,KAAM,CAC7DA,IAAG,iBAAiB,QAAS,UAAW,CACtC,eAAe,UAAU,OAAO,MAAM,CACxC,CAAC,CACH,CAAC,EAED,SAAS,iBAAiB,sBAAsB,EAAE,QAAQA,KAAM,CAC9DA,IAAG,iBAAiB,QAAS,SAAS,IAAK,CACzC,IAAI,OAAS,IAAI,cAAc,QAAQ,OACvC,SAAS,eAAe,eAAiB,MAAM,EAAE,UAAU,OAAO,MAAM,CAC1E,CAAC,CACH,CAAC,EAED,SAAS,iBAAiB,iBAAiB,EAAE,QAAQA,KAAM,CACzDA,IAAG,iBAAiB,QAAS,SAAS,IAAK,CACzC,IAAI,OAAS,IAAI,cAAc,QAAQ,OACnC,eAAiB,IAAI,cAAc,QAAQ,eAE3C,QAAQ,gBAAkB,+CAA+C,GACvE,SACF,QAAQ,SAAS,sBAAwB,OAAQ,CAAC,WAAY,CAAC,QAAS,QAAQ,CAAC,CAAC,CAGxF,CAAC,CACH,CAAC,EACH,CACF,EAEA,MAAM,YAAc,UAAW,CAC7B,IAAI,UAAY,CACd,OAAQ,cACR,KAAM,iBACR,EAEA,SAAS,YAAa,CACpB,KAAK,KAAO,SAAS,cAAc,UAAU,IAAI,EACjD,KAAK,OAAS,IAAI,MAAM,QAAQ,aAAc,MAAM,EAEpD,KAAK,KAAK,CACZ,CAEA,kBAAW,UAAY,OAAO,OAAO,CAAC,EAAG,WAAW,UAAW,CAC7D,KAAM,UAAW,CACf,KAAK,SAAW,IAAI,MAAM,SAAS,KAAK,IAAI,EAC5C,KAAK,SAAS,UAAU,EAExB,SAAS,iBAAiB,oBAAqB,SAAS,IAAK,CAC3D,SAAS,KAAK,UAAU,IAAI,gBAAgB,EAC5C,KAAK,SAAS,UAAU,EACxB,KAAK,KAAK,CACZ,EAAE,KAAK,IAAI,CAAC,EAGZ,SAAS,iBAAiB,YAAa,KAAK,KAAK,KAAK,IAAI,CAAC,EAC3D,SAAS,iBAAiB,aAAc,KAAK,MAAM,KAAK,IAAI,CAAC,CAC/D,EAEA,KAAM,UAAW,CACf,KAAK,OAAO,KAAK,CACnB,EAEA,MAAO,UAAW,CAChB,KAAK,OAAO,MAAM,CACpB,CACF,CAAC,EAEM,UACT,GAAG,EAEH,MAAM,YAAc,UAAW,CACzB,MAAM,SAAS,WAAa,UAAY,MAAM,YAChD,MAAM,KAAK,QAAQ,EAAE,KAAK,SAAS,KAAM,CACvC,MAAM,WAAW,QAAQ,IAAI,CAC/B,CAAC,CAEL,EAEA,MAAM,YAAc,UAAW,CAC7B,IAAI,OAAS,CACX,UAAW,WACb,EAEI,UAAY,CACd,KAAM,cACN,MAAO,eACP,SAAU,kBACV,OAAQ,eACV,EAEI,QAAU,CACZ,aAAc,gBACd,OAAQ,oBACR,gBAAiB,wBACnB,EAEA,SAAS,YAAa,CACpB,KAAK,OAAS,CACZ,OAAQ,GACR,QAAS,GACT,KAAM,SAAS,KAAK,UAAU,SAAS,QAAQ,eAAe,CAChE,EAEK,SAAS,cAAc,UAAU,IAAI,GAI1C,KAAK,mBAAmB,CAC1B,CAEA,SAAS,QAAQ,KAAM,CACjB,SAAS,KAAK,UAAU,SAAS,QAAQ,YAAY,IAIrD,KAAK,WAAa,GACpB,SAAS,KAAK,UAAU,IAAI,QAAQ,eAAe,EACnD,SAAS,cAAc,UAAU,IAAI,EAAE,UAAU,IAAI,QAAQ,MAAM,IAEnE,SAAS,KAAK,UAAU,OAAO,QAAQ,eAAe,EACtD,SAAS,cAAc,UAAU,IAAI,EAAE,UAAU,OAAO,QAAQ,MAAM,GAGxE,SAAS,cAAc,UAAU,KAAK,EAAE,UAAY,MAAM,QAAQ,UAAU,QAAQ,UAAW,KAAK,UAAU,EAC9G,SAAS,cAAc,UAAU,QAAQ,EAAE,UAAY,MAAM,SAAS,YAAY,KAAK,YAAa,MAAM,SAAS,WAAW,EAChI,CAEA,kBAAW,UAAY,OAAO,OAAO,CAAC,EAAG,WAAW,UAAW,CAC7D,mBAAoB,UAAW,CAC7B,IAAI,UAAY,SAAS,cAAc,UAAU,MAAM,EACvD,UAAU,iBAAiB,QAAS,UAAW,CAC7C,UAAU,UAAU,IAAI,cAAc,CACxC,CAAC,EAED,SAAS,iBAAiB,oBAAqB,UAAW,CACxD,KAAK,SAAS,EACd,MAAM,KAAK,QAAQ,EAAE,KAAK,SAAS,KAAM,CACvC,KAAK,UAAU,KAAM,EAAI,CAC3B,EAAE,KAAK,IAAI,CAAC,CACd,EAAE,KAAK,IAAI,CAAC,CACd,EAEA,SAAU,UAAW,CACnB,SAAS,KAAK,UAAU,OAAO,QAAQ,eAAe,EACtD,SAAS,cAAc,UAAU,IAAI,EAAE,UAAU,OAAO,QAAQ,MAAM,CACxE,EAEA,SAAU,SAAS,MAAO,SAAU,CAC9B,QACF,SAAS,cAAc,UAAU,KAAK,EAAE,UAAY,MAAM,QAAQ,UAAU,QAAQ,UAAW,KAAK,GAElG,WACF,SAAS,cAAc,UAAU,QAAQ,EAAE,UAAY,MAAM,SAAS,YAAY,SAAU,MAAM,SAAS,WAAW,GAGxH,SAAS,KAAK,UAAU,IAAI,QAAQ,eAAe,EACnD,SAAS,cAAc,UAAU,IAAI,EAAE,UAAU,IAAI,QAAQ,MAAM,EAEnE,KAAK,OAAO,KAAO,EACrB,EAEA,UAAW,SAAS,KAAM,KAAM,CAC9B,KAAK,QAAQ,EAAI,EAEjB,KAAK,OAAO,OAAS,GACrB,KAAK,QAAQ,EAAK,EAGd,OAAS,IACX,KAAK,SAAS,KAAK,WAAY,KAAK,WAAW,CAEnD,EAEA,QAAS,SAAS,MAAO,CACvB,KAAK,OAAO,QAAU,MAElB,MACF,SAAS,cAAc,UAAU,IAAI,EAAE,UAAU,IAAI,YAAY,EAEjE,SAAS,cAAc,UAAU,IAAI,EAAE,UAAU,OAAO,YAAY,CAExE,EAEA,YAAa,SAAS,eAAgB,CAChC,eAAe,cAAgB,eAAe,aAAa,aAC7D,QAAQ,KAAK,eAAe,aAAa,WAAW,CAExD,CACF,CAAC,EAEM,CACL,KAAM,WACN,OACF,CACF,GAAG,EAGH,MAAM,SAAW,UAAW,CAC1B,IAAI,aAAe,CAAC,EAEhB,QAAU,CACZ,OAAQ,aACR,SAAU,WACV,QAAS,WACT,QAAS,UACT,OAAQ,SACR,OAAQ,OACR,aAAc,qBACd,YAAa,gBACf,EAEI,UAAY,CACd,aAAc,sBACd,mBAAoB,8BAEpB,eAAgB,wBAChB,WAAY,wBACZ,YAAa,wBACb,cAAe,iCACf,MAAO,uBACP,YAAa,uBACb,eAAgB,4BAChB,WAAY,uBAEZ,aAAc,uBACd,MAAO,uBACP,aAAc,+BACd,UAAW,oBACX,iBAAkB,sBAClB,IAAK,aACL,UAAW,2BACX,kBAAmB,oCACnB,YAAa,8BAEb,UAAW,qBACX,cAAe,0BAEf,YAAa,mBACb,mBAAoB,wBACpB,qBAAsB,uBACtB,mBAAoB,sBAEpB,iBAAkB,sBAClB,aAAc,kBACd,YAAa,0BACb,MAAO,sBACP,aAAc,eACd,cAAe,kBAEf,MAAO,kCACP,WAAY,+BAEZ,OAAQ,wBACR,aAAc,uBACd,cAAe,wBACf,sBAAuB,2BACzB,EAEA,SAAS,QAAQ,UAAW,CAC1B,KAAK,UAAY,UACjB,KAAK,UAAY,UAAU,aAAa,iBAAiB,EACzD,KAAK,UAAY,UAAU,aAAa,iBAAiB,EAEzD,KAAK,QAAW,UAAU,QAAQ,QAAU,OAC5C,KAAK,MAEL,KAAK,UAAY,YAAc,KAAK,UACpC,KAAK,gBAAkB,kBAAoB,KAAK,UAEhD,KAAK,SAAW,CACd,mBAAqB,UAAU,QAAQ,UAAY,QAAW,GAC9D,UAAW,YAAc,KAAK,UAC9B,UAAW,GACX,mBAAoB,GACpB,UAAW,GACX,UAAW,GACX,UAAW,UAAU,iBAAiB,UAAU,YAAY,EAAE,QAAU,GACxE,WAAY,UAAU,QAAQ,WAC9B,MAAO,GACP,aAAc,KACd,cAAe,KACf,gBAAiB,KACjB,cAAe,UAAU,QAAQ,eAAiB,GAClD,eAAgB,EAChB,sBAAuB,CAAC,EACxB,UAAW,OACX,kBAAmB,EACnB,aAAc,UAAU,QAAQ,YAClC,EAEA,KAAK,OAAS,CAAC,EAGX,KAAK,UACP,KAAK,SAAS,mBAAqB,GACnC,KAAK,UAAY,YAAc,KAAK,UAAY,SAChD,KAAK,MAAQ,SAAS,eAAe,iBAAmB,KAAK,SAAS,GAGxE,KAAK,KAAK,CACZ,CAEA,eAAQ,UAAY,OAAO,OAAO,CAAC,EAAG,QAAQ,UAAW,CACvD,KAAM,UAAW,CACf,KAAK,WAAa,KAAK,UAAU,cAAc,UAAU,UAAU,EACnE,KAAK,YAAc,KAAK,UAAU,cAAc,UAAU,WAAW,EACrE,KAAK,kBAAoB,KAAK,WAAW,cAAc,KAAK,EAEvD,KAAK,oBACR,KAAK,SAAS,UAAY,IAG5B,IAAI,UAAY,KAAK,WAAW,cAAc,iBAAiB,EAC/D,KAAK,SAAS,aAAe,UAAY,UAAU,QAAQ,QAAU,GAEjE,KAAK,UACP,KAAK,UAAU,UAAU,IAAI,QAAQ,OAAO,EAC5C,SAAS,oBAAoB,kCAAoC,KAAK,UAAW,KAAK,iBAAiB,KAAK,IAAI,CAAC,EACjH,SAAS,oBAAoB,mCAAqC,KAAK,UAAW,KAAK,iBAAiB,KAAK,IAAI,CAAC,EAClH,SAAS,iBAAiB,kCAAoC,KAAK,UAAW,KAAK,iBAAiB,KAAK,IAAI,CAAC,EAC9G,SAAS,iBAAiB,mCAAqC,KAAK,UAAW,KAAK,kBAAkB,KAAK,IAAI,CAAC,GAG7G,KAAK,UACR,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EAE3B,EAEA,UAAW,UAAW,CACpB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAGd,KAAK,SAAS,cAChB,KAAK,eAAe,CAExB,EAEA,kBAAmB,UAAW,CAC5B,IAAI,UAAY,KAAK,UAAU,cAAc,UAAU,qBAAqB,EACxE,YACF,KAAK,kBAAoB,IAAI,MAAM,kBAAkB,SAAS,EAElE,EAEA,aAAc,UAAW,CACvB,IAAI,YAAc,KAAK,UAAU,cAAc,UAAU,YAAY,EAErE,GAAK,YAIL,MAAK,eAAiB,KAAK,MAAM,YAAY,SAAS,EAEtD,IAAI,QAAU,CACZ,UAAW,KAAK,UAChB,mBAAoB,KAAK,SAAS,mBAClC,qBAAsB,UAAU,qBAChC,mBAAoB,UAAU,mBAC9B,SAAU,KAAK,cACjB,EAEI,SAAW,KAAK,UAAU,iBAAiB,UAAU,kBAAkB,EAe3E,GAbI,SAAS,QACX,SAAS,QAAQ,QAAU,CACzB,OAAO,iBAAiB,SAAU,SAAS,IAAK,CAC9C,IAAI,MAAQ,OAAO,QAAQ,UACvB,MAAQ,OAAO,QAAQ,WAC3B,KAAK,gBAAgB,MAAO,KAAK,CACnC,EAAE,KAAK,IAAI,CAAC,CACd,CAAC,EAGH,KAAK,SAAW,IAAI,MAAM,SAAS,OAAO,EAGtC,KAAK,kBAAmB,CAC1B,IAAI,WAAa,KAAK,SAAS,eAAiB,KAAK,SAAS,eAAe,GAAK,KAAK,SAAS,SAAS,CAAC,EAAE,GAE5G,KAAK,kBAAkB,cAAc,UAAU,EAC/C,KAAK,UAAU,GAAG,gBAAkB,KAAK,SAAS,UAAW,KAAK,mBAAmB,KAAK,IAAI,CAAC,CACjG,CAEA,KAAK,UAAU,GAAG,gBAAkB,KAAK,UAAW,KAAK,iBAAiB,KAAK,IAAI,CAAC,EACpF,KAAK,UAAU,GAAG,qBAAuB,KAAK,SAAS,UAAW,KAAK,mBAAmB,KAAK,IAAI,CAAC,EACpG,KAAK,UAAU,GAAG,qBAAuB,KAAK,SAAS,UAAW,KAAK,YAAY,KAAK,IAAI,CAAC,EAC7F,KAAK,UAAU,GAAG,yBAA2B,KAAK,SAAS,UAAW,KAAK,gBAAgB,KAAK,IAAI,CAAC,EAEjG,KAAK,UAAU,iBAAiB,UAAU,GAAG,EAAE,QACjD,KAAK,UAAU,GAAG,mBAAqB,KAAK,SAAS,UAAW,KAAK,UAAU,KAAK,IAAI,CAAC,EAG3F,IAAI,YAAc,KAAK,UAAU,cAAc,UAAU,SAAS,EAQlE,GAPI,cACF,KAAK,SAAS,UAAY,GAC1B,KAAK,SAAS,mBAAqB,YAAY,QAAQ,UACvD,KAAK,UAAU,GAAG,gBAAkB,KAAK,SAAS,UAAW,KAAK,gBAAgB,KAAK,IAAI,CAAC,GAI1F,MAAM,SAAS,sBAAuB,CACxC,IAAI,mBAAqB,KAAK,UAAU,cAAc,UAAU,kBAAkB,EAElF,GAAI,mBAAoB,CACtB,IAAI,YAAc,KAAK,UAAU,cAAc,UAAU,WAAW,EAEhE,aACF,IAAI,MAAM,oBAAoB,CAC5B,UAAW,KAAK,UAChB,UAAW,KAAK,SAAS,UACzB,KAAM,YAAY,QAAQ,KAC1B,eAAgB,KAAK,eACrB,qBAAsB,KAAK,MAAM,mBAAmB,SAAS,EAC7D,KAAM,KAAK,UAAU,cAAc,UAAU,aAAa,CAC5D,CAAC,CAEL,CACF,CAGA,GAAI,KAAK,SAAS,aAAc,CAC9B,IAAI,eAAiB,KAAK,UAAU,cAAc,oCAAoC,KAAK,SAAS,aAAa,IAAI,EACjH,gBACF,KAAK,SAAS,cAAgB,eAAe,QAAQ,MACrD,KAAK,UAAU,GAAG,gBAAkB,KAAK,SAAS,UAAW,KAAK,eAAe,KAAK,IAAI,CAAC,GAE3F,KAAK,SAAS,aAAe,KAI/B,OAAO,GAAG,SAAW,KAAK,gBAAiB,MAAM,MAAM,SAAS,IAAK,UAAU,CAKxE,MAAM,OAAO,UAChB,KAAK,SAAS,gBAAkB,MAElC,KAAK,eAAe,CACtB,EAAE,KAAK,IAAI,CAAC,CAAC,CACf,EACF,EAEA,oBAAqB,UAAW,CAC9B,GAAI,MAAM,SAAS,WAAa,UAAY,MAAM,SAAS,WAAa,SAAU,CAChF,IAAI,KAAO,KAAK,UAAU,cAAc,UAAU,aAAa,EAE/D,IAAI,MAAM,YAAY,KAAM,UAAU,UAAW,CAC/C,cAAe,iBAAmB,KAAK,SACzC,CAAC,CACH,CACF,EAKA,gBAAiB,SAAS,MAAO,MAAO,CAEtC,IAAI,MAAQ,KAAK,UAAU,cAAc,8CAA8C,MAAM,IAAI,EAC7F,QACF,MAAM,YAAc,MAExB,EAEA,iBAAkB,SAAS,IAAK,CAC9B,IAAI,QAAU,IAAI,OAAO,QACrB,QAAU,KAAK,UAAU,cAAc,UAAU,SAAS,EAC1D,YAAc,KAAK,UAAU,cAAc,UAAU,aAAa,EAEtE,GAAI,QACF,GAAI,QAAQ,UAAW,CAErB,QAAQ,UAAU,OAAO,QAAQ,QAAQ,EACzC,QAAQ,SAAW,GACnB,IAAI,YAAc,YAAY,QAAQ,YACtC,YAAY,YAAc,WAC5B,MAEE,QAAQ,UAAU,IAAI,QAAQ,QAAQ,EACtC,QAAQ,SAAW,GACnB,YAAY,YAAc,MAAM,QAAQ,aAI1C,QAAQ,UAAU,IAAI,QAAQ,QAAQ,EACtC,QAAQ,SAAW,GACnB,YAAY,YAAc,MAAM,QAAQ,WAE5C,EAEA,YAAa,SAAS,IAAK,CACzB,IAAI,QAAU,IAAI,OAAO,QAErB,UAEF,KAAK,UAAU,cAAc,UAAU,KAAK,EAAE,UAAY,MAAM,SAAS,YAAY,QAAQ,MAAO,MAAM,SAAS,WAAW,EAG1H,QAAQ,iBAAmB,QAAQ,OACrC,KAAK,UAAU,cAAc,UAAU,YAAY,EAAE,UAAY,MAAM,SAAS,YAAY,QAAQ,iBAAkB,MAAM,SAAS,WAAW,EAChJ,KAAK,UAAU,cAAc,UAAU,YAAY,EAAE,UAAU,OAAO,QAAQ,MAAM,EACpF,KAAK,UAAU,cAAc,UAAU,KAAK,EAAE,UAAU,IAAI,QAAQ,MAAM,EAC1E,KAAK,UAAU,cAAc,UAAU,gBAAgB,EAAE,aAAa,cAAe,OAAO,EAC5F,KAAK,UAAU,cAAc,UAAU,SAAS,EAAE,aAAa,cAAe,OAAO,IAErF,KAAK,UAAU,cAAc,UAAU,YAAY,EAAE,UAAU,IAAI,QAAQ,MAAM,EACjF,KAAK,UAAU,cAAc,UAAU,KAAK,EAAE,UAAU,OAAO,QAAQ,MAAM,EAC7E,KAAK,UAAU,cAAc,UAAU,gBAAgB,EAAE,aAAa,cAAe,MAAM,EAC3F,KAAK,UAAU,cAAc,UAAU,SAAS,EAAE,aAAa,cAAe,MAAM,GAG1F,EAEA,gBAAiB,SAAS,IAAK,CAC7B,IAAI,QAAU,IAAI,OAAO,QAEzB,GAAI,SAAW,QAAQ,WAAY,CACjC,IAAI,MAAQ,MAAM,SAAS,YAAY,QAAQ,WAAY,MAAM,SAAS,WAAW,EACjF,KAAO,MAAM,SAAS,YAAY,OAAO,EAEzCA,IAAK,KAAK,UAAU,cAAc,UAAU,WAAW,EAC3DA,IAAG,UAAY,MAAQ,IAAM,KAC7BA,IAAG,UAAU,OAAW,QAAQ,OAAQ,QAAQ,YAAa,CAC/D,MACE,KAAK,UAAU,cAAc,UAAU,WAAW,EAAE,UAAU,IAAI,QAAQ,YAAY,CAE1F,EAEA,kBAAmB,SAAS,QAAS,CACnC,IAAI,QAAU,UAAqB,KAAK,SAAW,KAAK,SAAS,eAAiB,MAClF,GAAK,QAEL,KAAI,SAAW,KAAK,SAAS,gBAAkB,KAAK,gBAAgB,QAAQ,KAAK,SAAS,aAAa,CAAC,EACpG,IAAM,KAAK,SAAS,aAAe,IAAM,SAG7C,YAAK,SAAS,kBAAoB,EAG3B,CACL,aAAc,gBAAgB,IAAI,KAClC,SAAU,IACV,aAAc,KAAK,SAAS,iBAC9B,EACF,EAEA,eAAgB,SAAS,IAAK,OAAQ,CAEpC,IAAI,QAAW,KAAO,IAAI,OAAU,IAAI,OAAO,QAAW,KAAK,SAAW,KAAK,SAAS,eAAiB,KACzG,GAAK,QAIL,KAAI,SAAW,KAAK,gBAAgB,QAAQ,KAAK,SAAS,aAAa,CAAC,EACpE,IAAM,KAAK,SAAS,aAAe,IAAM,SAG7C,GAAI,KAAK,SAAS,kBAAoB,SAItC,GAAI,CAAC,MAAM,OAAO,SAAW,KAAK,SAAS,cAAe,CAExD,KAAK,UAAU,iBAAiB,cAAc,EAAE,QAAQA,KAAM,CAC5DA,IAAG,UAAU,IAAI,QAAQ,MAAM,EAG3BA,IAAG,QAAQ,OAASA,IAAG,QAAQ,QAAU,KAC3CA,IAAG,UAAU,OAAO,QAAQ,MAAM,CAEtC,CAAC,EAGD,KAAK,sBAAsB,EAC3B,IAAI,QAAQ,EACZ,KAAK,SAAS,gBAAkB,SAChC,MACF,MAEM,MAAM,OAAO,SAAW,KAAK,SAAS,eACxC,KAAK,UAAU,iBAAiB,cAAc,EAAE,QAAQA,KAAM,CAC5DA,IAAG,UAAU,OAAO,QAAQ,MAAM,CACpC,CAAC,EAGH,KAAK,kBAAkB,OAAO,EAElC,EAGA,qBAAsB,SAAS,IAAK,CAC7B,KAAK,SAAS,eACjB,KAAK,YAAY,iBAAiB,sBAAsB,EAAE,QAAQ,OAAS,CACzE,MAAM,UAAU,OAAO,QAAQ,OAAQ,MAAM,QAAQ,QAAU,GAAG,CACpE,CAAC,CAEL,EAEA,gBAAiB,SAAS,OAAQ,CAChC,OAAO,OAAO,YAAY,EAAE,QAAQ,cAAe,GAAG,EAAE,QAAQ,KAAM,EAAE,EAAE,QAAQ,KAAM,EAAE,CAC5F,EAEA,UAAW,SAAS,IAAK,CACvB,IAAI,QAAU,IAAI,OAAO,QACrB,OAAS,GACT,QAAU,GAEV,UACE,QAAQ,MACV,OAAS,QAAQ,IACjB,QAAU,IAGZ,KAAK,UAAU,iBAAiB,UAAU,GAAG,EAAE,QAAQA,KAAM,CAC3DA,IAAG,UAAU,OAAO,QAAQ,OAAQ,OAAO,EAC3CA,IAAG,YAAc,MACnB,CAAC,EAEL,EAEA,gBAAiB,SAAS,IAAK,CAC7B,IAAI,QAAU,IAAI,OAAO,QAGzB,GAAI,CAAC,SAAW,CAAC,QAAQ,sBAAwB,QAAQ,mBAAqB,WAAY,CACxF,KAAK,wBAAwB,QAAS,EAAK,EAC3C,KAAK,wBAAwB,EAAK,EAClC,MACF,CAEA,GAAI,QAAQ,uBAAyB,WAAa,OAAO,aAAe,OAAO,YAAY,KAAK,SAAS,EAAG,CAC1G,IAAI,uBAAyB,OAAO,YAAY,KAAK,SAAS,EAAE,QAAQ,EAAE,EAG1E,GAAI,uBAAuB,SAAW,WAAY,CAChD,KAAK,wBAAwB,QAAS,EAAK,EAC3C,KAAK,wBAAwB,EAAK,EAClC,MACF,CAEA,IAAI,SAAW,uBAAuB,SAClC,cAAgB,GAChB,sBAAwB,IAExB,UAAY,GAAK,SAAW,KAAK,SAAS,sBAC5C,cAAgB,IAGlB,KAAK,wBAAwB,QAAS,cAAe,QAAQ,EAMzD,CAAC,eAAiB,uBAAuB,WAAa,QAAU,UAAY,KAAK,SAAS,qBAC5F,sBAAwB,IAG1B,KAAK,wBAAwB,sBAAuB,QAAQ,UAAW,uBAAuB,kBAAkB,CAClH,CACF,EAEA,mBAAoB,SAAS,IAAK,CAChC,IAAI,QAAU,IAAI,OAAO,QACpB,SAIL,KAAK,kBAAkB,cAAc,QAAQ,EAAE,CACjD,EAEA,wBAAyB,SAAS,QAAS,KAAM,IAAK,CAC/C,KAAK,SAAS,YACjB,KAAO,IAGT,IAAIA,IAAK,KAAK,UAAU,cAAc,UAAU,SAAS,EACrD,WAAaA,IAAG,QAAQ,gBAAgB,EAExC,SAAS,GAAG,GAAK,SAAS,KAAK,SAAS,kBAAkB,GAC5DA,IAAG,WAAW,UAAU,IAAI,gBAAgB,EAC5CA,IAAG,YAAc,MAAM,QAAQ,WAAW,QAAQ,UAAW,GAAG,IAEhEA,IAAG,WAAW,UAAU,OAAO,gBAAgB,EAC/CA,IAAG,YAAc,MAAM,QAAQ,cAG7B,SAAW,QAAQ,WACrBA,IAAG,WAAW,UAAU,OAAO,QAAQ,MAAM,EACzC,YACF,WAAW,UAAU,OAAO,QAAQ,MAAM,IAG5CA,IAAG,WAAW,UAAU,IAAI,QAAQ,MAAM,EACtC,YACF,WAAW,UAAU,IAAI,QAAQ,MAAM,EAG7C,EAEA,wBAAyB,SAAS,KAAM,UAAW,KAAM,CACvD,IAAIA,IAAK,KAAK,UAAU,cAAc,UAAU,iBAAiB,EAC7D,WAAaA,IAAG,QAAQ,gBAAgB,EAE5C,GAAKA,IAIL,KAAI,OAASA,IAAG,cAAc,mBAAmB,EAEjD,GAAI,KAAM,CACR,IAAI,OAAS,UACA,MAAM,QAAQ,iBAAiB,QAAQ,SAAU,IAAI,EACrD,MAAM,QAAQ,mBAAmB,QAAQ,SAAU,IAAI,EAE/D,OACH,OAAS,MAAM,QAAQ,iBAGzBA,IAAG,UAAU,OAAO,QAAQ,MAAM,EAC9B,YACF,WAAW,UAAU,OAAO,QAAQ,MAAM,EAE5C,OAAO,YAAc,MACvB,MACEA,IAAG,UAAU,IAAI,QAAQ,MAAM,EAEnC,EAKA,WAAY,UAAW,CACrB,IAAI,cAAgB,KAAK,WAAW,iBAAiB,UAAU,YAAY,EAG3E,GAAI,CAAC,cAAc,OACjB,MAAO,GAGT,cAAc,QAAQ,KAAO,CAC3B,IAAI,KAAO,IAAI,QAAQ,UACnB,OAAS,UACX,KAAK,iBAAiB,GAAG,EAChB,OAAS,OAClB,KAAK,aAAa,GAAG,CAEzB,CAAC,CACH,EAEA,iBAAkB,SAAS,IAAK,CAC9B,aAAa,IAAI,EAAE,EAAI,IAAI,MAAM,QAC/B,IAAI,GACJ,CACE,QAAS,IAAI,QAAQ,UACrB,YAAa,UAAU,YACvB,SAAU,GACV,MAAO,IAAI,QAAQ,WACnB,KAAM,IAAI,QAAQ,UAClB,OAAQ,CACN,QAAS,KAAK,mBAAmB,KAAK,IAAI,EAC1C,cAAe,KAAK,yBAAyB,KAAK,IAAI,CACxD,CACF,CACF,CACF,EAKA,mBAAoB,SAAS,IAAK,CAChC,IAAI,SAAW,IAAI,OAAO,UAAU,EAAE,GAEtC,GAAK,aAAa,QAAQ,EAK1B,KAAI,IAAM,aAAa,QAAQ,EAC3B,OAAS,IAAI,YAEb,IAAI,QAAQ,QAAU,SACxB,OAAO,KAAK,EAGd,IAAI,OAAO,UAAU,OAAO,SAAS,EACrC,IAAI,OAAO,UAAU,IAAI,QAAQ,EAI7B,KAAK,cAAc,QAAQ,GAAK,IAAI,QAAQ,QAAU,SACxD,OAAO,UAAU,EAErB,EAEA,cAAe,SAAS,GAAI,CAC1B,OAAO,KAAK,WAAW,cAAc,UAAU,cAAgB,KAAY,EAAE,CAC/E,EAEA,yBAA0B,SAAS,IAAK,CACtC,IAAI,SAAW,IAAI,OAAO,UAAU,EAAE,GAClC,IAAM,aAAa,QAAQ,EAE/B,OAAQ,IAAI,KAAM,CAChB,IAAK,GAGC,IAAI,iBACN,IAAI,OAAO,UAAU,IAAI,oBAAoB,EAE/C,MACF,IAAK,GACC,KAAO,IAAI,QAAQ,OAAS,QAC9B,IAAI,YAAY,UAAU,EAE5B,MACF,IAAK,GACH,IAAI,gBAAkB,GACtB,KACJ,CACF,EAEA,aAAc,SAAS,IAAK,CAC1B,aAAa,IAAI,EAAE,EAAI,CACrB,GAAI,IAAI,GACR,KAAM,KACR,EAEI,KAAK,cAAc,IAAI,EAAE,GAC3B,KAAK,aAAa,IAAI,EAAE,CAE5B,EAEA,WAAY,UAAW,CACrB,OAAS,CAAC,GAAI,GAAG,IAAK,OAAO,QAAQ,YAAY,EAC3C,IAAI,YACF,OAAO,IAAI,YAAY,WAAc,YACvC,IAAI,YAAY,UAAU,EAEnB,IAAI,OAAS,OACtB,KAAK,aAAa,IAAI,EAAE,CAG9B,EAEA,cAAe,SAAS,MAAO,CAC7B,OAAO,MAAM,aAAa,iBAAiB,CAC7C,EAEA,eAAgB,SAAS,MAAO,CAC9B,OAAO,MAAM,EACf,EAEA,aAAc,SAAS,GAAI,CACzB,IAAI,OAAS,KAAK,UAAU,cAAc,IAAM,EAAE,EAC9C,YAAc,OAAO,KAAK,EAE9B,OAAO,aAAa,WAAY,EAAE,EAClC,OAAO,MAAM,EAGb,OAAO,iBAAiB,WAAY,KAAK,uBAAuB,KAAK,IAAI,CAAC,EAEtE,cAAgB,QAClB,YAAY,KAAK,UAAW,CAE5B,CAAC,EACA,MAAM,SAAS,MAAO,CAErB,OAAO,aAAa,WAAY,EAAE,EAClC,OAAO,QAAQ,UAAU,WAAW,EAAE,aAAa,mBAAoB,SAAS,CAClF,CAAC,CAEL,EAEA,aAAc,SAAS,GAAI,CACzB,IAAI,OAAS,KAAK,UAAU,cAAc,IAAM,EAAE,EAClD,OAAO,oBAAoB,WAAY,KAAK,uBAAuB,KAAK,IAAI,CAAC,EACzE,QAAU,OAAO,OAAO,OAAU,aACpC,OAAO,gBAAgB,UAAU,EACjC,OAAO,MAAM,EAEjB,EAEA,uBAAwB,SAAS,IAAK,CAGpC,GAAI,IAAI,eAAiB,IAAI,cAAc,UAAU,SAAS,gBAAgB,EAAG,CAC/E,IAAI,MAAQ,KAAK,UAAU,cAAc,oCAAqC,KAAK,SAAS,kBAAmB,MAAM,EACjH,OACF,MAAM,MAAM,CAEhB,CACF,EAKA,cAAe,UAAW,CACxB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,MAAM,aAAa,KAAK,KAAK,SAAS,EAElC,OAAO,MAAM,IAAI,WAAW,EAAE,IAAI,WAAW,EACnD,EAEA,kBAAmB,SAAS,QAAS,CAEnC,GAAI,KAAK,WAAW,iBAAiB,UAAU,KAAK,EAAE,QAAU,EAAG,CACjE,IAAI,MAAQ,KAAK,WAAW,cAAc,UAAU,KAAK,EACrD,OACF,MAAM,UAAU,IAAI,aAAa,EAEnC,MACF,CAWA,GATA,KAAK,SAAS,MAAQ,KAAK,UAAU,iBAAiB,UAAU,KAAK,EAAE,OAEnE,KAAK,SAAS,aAAe,SAC/B,MAAM,WAAW,EAAI,EAMnB,CAAC,QAAS,CACZ,IAAI,YAAc,KAAK,WAAW,cAAc,UAAU,aAAa,EACvE,KAAK,SAAS,kBAAoB,KAAK,YAAY,WAAW,CAChE,CAEA,IAAI,eAAiB,CACnB,eAAgB,GAChB,YAAa,GACb,aAAc,KAAK,SAAS,kBAC5B,SAAU,KAAK,YACf,iBAAkB,KAAK,UAAU,cAAc,UAAU,aAAa,EACtE,cAAe,KAAK,YAAY,QAAQ,WAAa,SACrD,KAAM,MAAK,SAAS,cACpB,SAAU,GACV,WAAY,GACZ,UAAW,CACT,OAAQ,KAAK,aAAa,KAAK,IAAI,EACnC,SAAU,KAAK,cAAc,KAAK,IAAI,CACxC,CACF,EAGA,GAAI,KAAK,SAAS,aAAc,CAC9B,IAAI,aAAe,KAAK,kBAAkB,OAAO,EACjD,eAAiB,OAAO,OAAO,CAAC,EAAG,eAAgB,YAAY,EAC/D,KAAK,qBAAqB,eAAe,QAAQ,CACnD,CAEA,KAAK,YAAY,cAAc,EAG/B,SAAS,iBAAiB,aAAc,UAAW,CACjD,KAAK,YAAY,eAAgB,EAAI,CACvC,EAAE,KAAK,IAAI,CAAC,EACZ,SAAS,iBAAiB,eAAgB,UAAW,CACnD,KAAK,YAAY,eAAgB,EAAI,CACvC,EAAE,KAAK,IAAI,CAAC,CACd,EAEA,aAAc,SAAS,MAAO,CAGxB,KAAK,SAAS,cAChB,KAAK,iBAAiB,KAAK,EAI7B,IAAI,OAAS,KAAK,WAAW,aACzB,SAAW,GACb,WAAW,UAAW,CACpB,OAAO,cAAc,IAAI,MAAM,QAAQ,CAAC,CAC1C,EAAG,GAAG,CAEV,EAEA,cAAe,SAAS,MAAO,CAC7B,GAAK,KAAK,SAEV,KAAI,UAAY,KAAK,WAAW,cAAc,mCAAmC,KAAK,SAAS,kBAAkB,IAAI,EAGjH,UAAY,KAAK,SAAS,aACd,KAAK,WAAW,iBAAiB,sCAAsC,EAAE,KAAK,EAC9E,KAAK,WAAW,cAAc,mCAAmC,MAAM,IAAI,EAE3F,UAAU,aAAa,WAAY,IAAI,EACvC,UAAU,aAAa,WAAY,CAAC,EAGpC,KAAK,iBAAiB,SAAS,EAG/B,KAAK,iBAAiB,SAAS,EAG/B,KAAK,SAAS,kBAAoB,MACpC,EAEA,iBAAiB,MAAO,CAEtB,IAAI,MAAQ,MAAM,cAAc,UAAU,YAAY,EACtD,GAAI,MAAO,CACT,IAAI,UAAY,KAAK,cAAc,KAAK,EACpC,QAAU,KAAK,eAAe,KAAK,EACvC,GAAI,YAAc,WAChB,GAAI,aAAa,OAAO,EAAE,YAAa,CACrC,aAAa,OAAO,EAAE,YAAY,UAAU,EAC5C,MACF,UACS,YAAc,MAAO,CAC9B,KAAK,aAAa,OAAO,EACzB,MACF,CACF,CAGA,IAAI,aAAe,MAAM,cAAc,UAAU,KAAK,EAClD,cACF,aAAa,cACX,IAAI,YAAY,cAAe,CAC7B,QAAS,GACT,WAAY,EACd,CAAC,CACH,CAEJ,EAEA,iBAAiB,MAAO,CACtB,IAAI,MAAQ,MAAM,cAAc,UAAU,YAAY,EACtD,GAAI,MAAO,CACT,KAAK,SAAS,WAAW,EACzB,IAAI,UAAY,KAAK,cAAc,KAAK,EACpC,QAAU,KAAK,eAAe,KAAK,EACvC,GAAI,YAAc,WAChB,GAAI,aAAa,OAAO,EAAE,aAAe,aAAa,OAAO,EAAE,QAAQ,QAAU,QAAS,CACxF,aAAa,OAAO,EAAE,YAAY,UAAU,EAC5C,MACF,OACS,YAAc,OACvB,KAAK,aAAa,OAAO,CAE7B,CAEA,IAAI,UAAY,MAAM,cAAc,UAAU,KAAK,EAC/C,YACF,UAAU,cACR,IAAI,YAAY,eAAgB,CAC9B,QAAS,GACT,WAAY,EACd,CAAC,CACH,EACA,MAAM,cAAc,kCAAkC,EAAE,aAAa,WAAY,CAAC,EAClF,MAAM,cAAc,8BAA8B,EAAE,aAAa,WAAY,CAAC,GAGhF,KAAK,gBAAgB,SAAS,CAChC,EAEA,YAAa,SAASA,IAAI,CACxB,OAAOA,IAAG,aAAa,YAAY,CACrC,EAEA,cAAe,UAAW,CACxB,IAAI,UAAY,KAAK,UAAU,cAAc,UAAU,cAAc,EAErE,GAAK,UAIL,KAAI,UAAY,IAAI,MAAM,WAAW,UAAW,KAAK,SAAS,EAE9D,UAAU,iBAAiB,yBAA0B,SAAS,IAAK,CAC7D,KAAK,UACP,KAAK,SAAS,UAAU,IAAI,OAAO,KAAK,CAE5C,EAAE,KAAK,IAAI,CAAC,EACd,EAEA,cAAe,SAAS,OAAQ,CAC9B,OAAO,OAAO,QAAQ,KACxB,EAEA,cAAe,UAAW,CACxB,GAAK,KAAK,SAAS,UAMnB,KAAI,aAAe,KAAK,kBAAkB,WAEtC,eACF,KAAK,SAAS,UAAY,MAAM,OAAO,UAAU,YAAY,GAEjE,EAEA,mBAAoB,SAAS,IAAK,CAChC,IAAI,QAAU,IAAI,OAAO,QACrB,YAAc,MAAM,OAAO,iBAAiB,QAAQ,eAAe,cAAc,IAAK,KAAK,SAAS,SAAS,EAE7G,SAAW,KAAK,UAAU,cAAc,gCAAkC,QAAQ,eAAe,GAAK,IAAI,EAC1G,WAAa,KAAK,cAAc,QAAQ,EAGxC,OAAO,WAAe,MAItB,CAAC,MAAM,OAAO,SAAW,KAAK,SAAS,cACzC,KAAK,gBAAgB,UAAU,EAE3B,KAAK,UACP,KAAK,SAAS,UAAU,UAAU,EAGxC,EAEA,gBAAiB,UAAW,CAC1B,IAAI,OAAS,KAAK,UAAU,iBAAiB,UAAU,WAAW,EAC7D,OAAO,QAIZ,OAAO,QAAQ,OAAS,CACtB,MAAM,iBAAiB,QAAS,SAAS,IAAK,CAE5C,GADA,IAAI,eAAe,EACf,CAAC,MAAM,OAAO,SAAW,KAAK,SAAS,cAAe,CACxD,IAAI,MAAQ,KAAK,cAAc,KAAK,EACpC,KAAK,gBAAgB,KAAK,CAC5B,CACF,EAAE,KAAK,IAAI,CAAC,EAEZ,MAAM,iBAAiB,QAAS,SAAS,IAAK,CAC5C,IAAI,MAAQ,KAAK,cAAc,KAAK,EAC/B,MAAM,OAAO,UACZ,KAAK,SAAS,eAChB,KAAK,UAAU,iBAAiB,UAAU,cAAc,EAAE,QAAQA,KAAM,CACtEA,IAAG,UAAU,OAAO,QAAQ,WAAW,CACzC,CAAC,EACD,KAAK,gBAAgB,KAAK,GAEtB,KAAK,UACP,KAAK,SAAS,UAAU,KAAK,EAIrC,EAAE,KAAK,IAAI,CAAC,EAEZ,MAAM,iBAAiB,UAAW,SAAS,IAAK,CAC1C,IAAI,UAAY,IAClB,KAAK,UAAU,cAAc,UAAU,YAAY,EAAE,MAAM,CAE/D,EAAE,KAAK,IAAI,CAAC,CACd,CAAC,CACH,EAEA,kBAAmB,UAAW,CAC5B,OAAO,IAAI,KAAK,eAAe,EAC/B,KAAK,sBAAsB,EAEvB,KAAK,QAEP,WAAW,UAAW,CACpB,KAAK,cAAc,KAAK,SAAS,cAAc,CACjD,EAAE,KAAK,IAAI,EAAG,GAAI,EAElB,KAAK,cAAc,KAAK,SAAS,cAAc,EAIjD,OAAO,GAAG,SAAW,KAAK,gBAAiB,MAAM,MAAM,SAAS,IAAK,KAAK,sBAAsB,KAAK,IAAI,CAAC,CAAC,EAG3G,OAAO,GAAG,SAAW,KAAK,gBAAiB,MAAM,MAAM,SAAS,IAAK,UAAW,CAC9E,IAAI,KAAO,OAAO,QACd,QAAU,KAAK,SAAS,sBAAsB,OAAO,SAAS,KAAM,KAAM,CAC5E,OAAQ,KAAK,IAAI,KAAO,IAAI,EAAI,KAAK,IAAI,KAAO,IAAI,EAAI,KAAO,IACjE,CAAC,EACG,MAAQ,KAAK,SAAS,sBAAsB,QAAQ,OAAO,EAC3D,KAAK,SAAS,iBAAmB,OACnC,KAAK,cAAc,KAAK,CAE5B,EAAE,KAAK,IAAI,CAAC,CAAC,CACf,EAEA,sBAAuB,UAAW,CAChC,IAAI,UAAY,CAAC,EACjB,KAAK,UAAU,iBAAiB,UAAU,KAAK,EAAE,QAAQA,KAAM,CAC7D,UAAU,KAAK,KAAK,MAAMA,IAAG,SAAS,CAAC,CACzC,CAAC,EACD,KAAK,SAAS,sBAAwB,SACxC,EAEA,gBAAiB,SAAS,MAAO,CAC/B,IAAI,IAAM,KAAK,UAAU,iBAAiB,UAAU,KAAK,EAAE,KAAK,EAChE,GAAK,IAKL,KAAI,IAAM,IAAI,UAEd,OAAO,OAAO,CACZ,IAAK,IACL,SAAU,QACZ,CAAC,EACH,EAEA,cAAe,SAAS,MAAO,CAC7B,KAAK,UAAU,iBAAiB,UAAU,cAAc,EAAE,QAAQA,KAAM,CACtEA,IAAG,UAAU,OAAO,QAAQ,WAAW,EACvCA,IAAG,UAAU,OAAO,WAAW,CACjC,CAAC,EAED,IAAI,MAAQ,KAAK,UAAU,iBAAiB,UAAU,cAAc,EAAE,KAAK,EAM3E,GALI,QACF,MAAM,UAAU,IAAI,QAAQ,WAAW,EACvC,KAAK,SAAS,kBAAoB,MAAM,QAAQ,OAG9C,KAAK,SAAS,UAAW,CAC3B,KAAK,WAAW,EAEhB,IAAI,MAAQ,KAAK,UAAU,iBAAiB,UAAU,KAAK,EAAE,KAAK,EAAE,cAAc,iBAAiB,EAEnG,GAAI,MAAO,CACT,IAAI,UAAY,KAAK,cAAc,KAAK,EACpC,QAAU,KAAK,eAAe,KAAK,EACvC,GAAI,YAAc,WAChB,GAAI,aAAa,OAAO,EAAE,aAAe,aAAa,OAAO,EAAE,QAAQ,QAAU,QAAS,CACxF,aAAa,OAAO,EAAE,YAAY,UAAU,EAC5C,MACF,OACS,YAAc,OACvB,KAAK,aAAa,OAAO,CAE7B,CACF,CAEA,GAAI,KAAK,SAAS,MAAO,CACvB,IAAI,SAAW,KAAK,UAAU,iBAAiB,UAAU,KAAK,EAC1D,SAAS,QACX,SAAS,QAAQA,KAAM,CACrBA,IAAG,cACD,IAAI,YAAY,aAAa,CAC/B,CACF,CAAC,EAGH,IAAI,MAAQ,KAAK,UAAU,iBAAiB,UAAU,KAAK,EAAE,KAAK,EAAE,cAAc,UAAU,KAAK,EAE7F,OACF,MAAM,cACJ,IAAI,YAAY,cAAc,CAChC,CAEJ,CAEA,KAAK,SAAS,eAAiB,KACjC,EAEA,YAAa,SAAS,KAAM,OAAQ,CAClC,KAAK,sBAAsB,EAC3B,IAAI,eAAiB,KAAK,UAAU,cAAc,UAAU,cAAc,EAEtE,CAAC,MAAM,OAAO,SAAW,KAAK,SAAS,eACzC,KAAK,kBAAkB,EACvB,eAAe,aAAa,qBAAsB,OAAO,IAEzD,KAAK,SAAW,IAAI,MAAM,UAAU,KAAK,WAAY,IAAI,EACzD,eAAe,aAAa,qBAAsB,MAAM,EAE5D,EAEA,sBAAuB,UAAW,CAC5B,KAAK,UAAY,OAAO,KAAK,SAAS,SAAY,YACpD,KAAK,SAAS,QAAQ,CAE1B,EAEA,gBAAiB,SAAS,KAAM,CAC9B,IAAI,IAAM,KAAK,UAAU,cAAc,UAAU,UAAU,EACvD,KACE,KACF,IAAI,UAAU,IAAI,QAAQ,MAAM,EAG9B,KACF,IAAI,UAAU,OAAO,QAAQ,MAAM,CAGzC,EAKA,iBAAkB,UAAW,CAC3B,IAAI,YAAc,GAElB,GAAK,KAAK,SAAS,UAkFjB,YAAc,GACV,CAAC,MAAM,OAAO,SAAW,KAAK,SAAS,eACzC,KAAK,cAAc,CAAC,MApFM,CAC5B,KAAK,aAAe,KAAK,UAAU,cAAc,UAAU,YAAY,EAEvE,IAAI,IAAM,KAAK,aAAa,QAAQ,IAEpC,MAAM,GAAG,EAAE,KAAK,SAAS,SAAU,CACjC,OAAO,SAAS,KAAK,CACvB,CAAC,EAAE,KAAK,SAAS,KAAM,CACrB,IAAI,OAAS,IAAI,UACb,IAAM,OAAO,gBAAgB,KAAM,WAAW,EAC9C,OAAS,IAAI,cAAc,UAAU,MAAM,EAK/C,OAAO,iBAAiB,MAAM,EAAE,QAAQA,KAAM,CAE5C,IAAI,IAAMA,IAAG,aAAa,IAAI,EAC9BA,IAAG,aAAa,KAAM,IAAM,QAAQ,EAGpC,IAAI,MAAQ,OAAO,cAAc,SAAS,GAAG,IAAI,EAC7C,OACF,MAAM,aAAa,MAAO,IAAM,QAAQ,EAI1C,IAAI,mBAAqB,OAAO,cAAc,mBAAmB,GAAG,IAAI,EACpE,oBACF,mBAAmB,aAAa,gBAAiB,IAAM,QAAQ,CAEnE,CAAC,EAID,IAAI,KAAO,OAAO,cAAc,UAAU,aAAa,EACnD,OAAS,KAAK,aAAa,IAAI,EACnC,OAAO,iBAAiB,QAAQ,EAAE,QAAQA,KAAM,CAC9CA,IAAG,aAAa,OAAQ,MAAM,CAChC,CAAC,EAED,KAAK,aAAa,UAAY,GAC9B,KAAK,aAAa,OAAO,MAAM,EAE/B,KAAK,UAAU,EACf,KAAK,4BAA4B,EAE7B,SAAW,QAAQ,eACrB,QAAQ,cAAc,KAAK,EAI7B,MAAM,aAAa,KAAK,KAAK,SAAS,EAGtC,IAAI,YAAc,IAAI,iBAAiB,8DAA8D,EACjG,YAAY,QACd,KAAK,oBAAoB,WAAW,EAGtC,IAAI,UAAY,IAAI,cAAc,+BAA+B,EAC7D,WACF,KAAK,kBAAkB,SAAS,EAG9B,OAAO,MACT,IAAI,WAAW,EAAE,IAAI,WAAW,GAGlC,MAAM,SAAS,gBAAgB,KAAK,KAAK,EAEzC,SAAS,cAAc,IAAI,YAAY,mBAAoB,CACzD,OAAQ,CACN,UAAW,KAAK,SAClB,CACF,CAAC,CAAC,EAEF,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,SAAS,UAAY,EAC5B,EAAE,KAAK,IAAI,CAAC,CACd,CAOA,SAAS,cAAc,IAAI,YAAY,iBAAkB,CACvD,OAAQ,CACN,YACA,UAAW,KAAK,SAClB,CACF,CAAC,CAAC,CACJ,EAKA,4BAA6B,UAAW,CACtC,OAAO,YAAc,OAAO,aAAe,CAAC,EAC5C,KAAK,UAAU,iBAAiB,4BAA4B,EAAE,QAAQA,KAAM,CAC1E,IAAI,UAAYA,IAAG,QAAQ,UAC3B,OAAO,YAAY,SAAS,EAAI,CAAC,EAEjCA,IAAG,iBAAiB,4BAA4B,EAAE,QAAQA,KAAM,CAC9D,OAAO,YAAY,SAAS,EAAEA,IAAG,QAAQ,EAAE,EAAI,CAC7C,SAAYA,IAAG,QAAQ,SACvB,OAAUA,IAAG,QAAQ,OACrB,SAAYA,IAAG,QAAQ,SACvB,mBAAsBA,IAAG,QAAQ,IACnC,CACF,CAAC,CACH,CAAC,CACH,EAEA,kBAAmB,UAAW,CAC5B,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,SAAS,UAAY,GAC1B,OAAO,IAAI,KAAK,SAAS,CAC3B,EAEA,sBAAuB,UAAW,CAChC,IAAI,OAAS,SAAS,cAAc,0BAA4B,KAAK,SAAS,EAE1E,SACF,OAAO,UAAY,GAEvB,EAEA,oBAAqB,SAAS,QAAS,CACrC,IAAI,OAAS,SAAS,cAAc,0BAA4B,KAAK,SAAS,EAC1E,SACF,OAAO,UAAY,GACnB,OAAO,OAAO,GAAG,OAAO,EAGxB,MAAM,aAAa,KAAK,MAAM,EAElC,EAEA,kBAAmB,SAAS,QAAS,CACnC,IAAI,OAAS,SAAS,cAAc,wBAA0B,KAAK,SAAS,EACxE,QACF,OAAO,YAAY,OAAO,CAE9B,EAEA,oBAAqB,UAAW,CAC9B,IAAI,OAAS,SAAS,cAAc,wBAA0B,KAAK,SAAS,EACxE,SACF,OAAO,UAAY,GAEvB,EAKA,yBAA0B,UAAW,CACnC,IAAI,oBAAsB,KAAK,UAAU,iBAAiB,UAAU,KAAK,EACrE,oBAAoB,OAAS,GAEjC,MAAM,aAAa,KAAK,oBAAqB,KAAK,SAAS,CAC7D,EAEA,oBAAqB,UAAW,CAC9B,SAAS,iBACP,oBACA,UAAW,CACT,IAAI,aAAe,KAAK,UAAU,cAChC,UAAU,oBACR,SACA,KAAK,QAAQ,OACb,GACJ,EACA,aAAa,cACX,IAAI,YAAY,WAAY,CAC1B,QAAS,GACT,WAAY,EACd,CAAC,CACH,CACF,EAAE,KAAK,IAAI,CACb,CACF,EAEA,oBAAqB,UAAW,CAC9B,KAAK,UAAU,iBAAiB,UAAU,UAAU,EAAE,QAAQA,KAAM,CAClEA,IAAG,iBAAiB,QAAS,UAAW,CACtC,GAAI,KAAK,SAAS,cAChB,IAAI,MAAQ,KAAK,WAAW,cAAc,mCAAmC,KAAK,SAAS,kBAAkB,IAAI,MAEjH,KAAI,MAAQ,KAAK,WAAW,cAAc,UAAU,YAAY,EAGlE,IAAI,MAAQ,MAAM,cAAc,UAAU,KAAK,EAC3C,OACF,MAAM,cACJ,IAAI,YAAY,cAAe,CAC7B,QAAS,GACT,WAAY,EACd,CAAC,CACH,CAEJ,EAAE,KAAK,IAAI,CAAC,CACd,CAAC,EAGD,IAAI,aAAe,KAAK,UAAU,iBAAiB,cAAc,EAC7D,aAAa,QACf,aAAa,QAAQA,KAAM,CACzBA,IAAG,iBAAiB,sCAAuC,SAAS,IAAK,CACvE,KAAK,YAAY,GAAG,CACtB,EAAE,KAAK,IAAI,CAAC,EAEZA,IAAG,iBAAiB,uCAAwC,SAAS,IAAK,CACxE,KAAK,cAAc,GAAG,CACxB,EAAE,KAAK,IAAI,CAAC,CACd,CAAC,CAEL,EAEA,YAAa,SAAS,IAAK,CACzB,KAAK,UAAU,iBAAiB,UAAU,UAAU,EAAE,QAAQA,KAAM,CAClEA,IAAG,UAAU,OAAO,QAAQ,MAAM,CACpC,CAAC,EAEG,KAAK,UACP,KAAK,SAAS,aAAa,EAAK,CAEpC,EAEA,cAAe,SAAS,IAAK,CAC3B,KAAK,UAAU,iBAAiB,UAAU,UAAU,EAAE,QAAQA,KAAM,CAClEA,IAAG,UAAU,IAAI,QAAQ,MAAM,CACjC,CAAC,EAEG,KAAK,UACP,KAAK,SAAS,aAAa,EAAI,CAEnC,EAEA,SAAU,UAAW,CACnB,OAAO,IAAI,KAAK,SAAS,EACzB,KAAK,UAAU,IAAI,KAAK,SAAS,EACjC,KAAK,sBAAsB,EAC3B,MAAM,aAAa,oBAAoB,KAAK,SAAS,EAEjD,KACF,IAAI,QAAQ,CAEhB,CACF,CAAC,EAEM,OACT,GAAG,EAEH,MAAM,MAAQ,UAAW,CAEvB,SAAS,KAAK,UAAW,CACvB,KAAK,WAAW,CAClB,CAEA,YAAK,UAAY,OAAO,OAAO,CAAC,EAAG,KAAK,UAAW,CACjD,WAAY,UAAW,CACrB,IAAI,SAAW,SAAS,eAAe,eAAe,EAEjD,UAIL,SAAS,iBAAiB,SAAU,UAAW,CAC7C,SAAS,KAAO,SAAS,KAC3B,CAAC,CACH,CACF,CAAC,EAEM,IACT,GAAG,EAEH,MAAM,eAAiB,UAAW,CAChC,SAAS,cAAc,UAAW,CAChC,KAAK,YAAY,EACjB,MAAM,UAAU,KAAK,EACrB,MAAM,SAAS,KAAK,EAIhB,SAAW,QAAQ,aACrB,MAAM,SAAS,OAAO,mBAAmB,EAGzC,WAAW,UAAW,CACpB,OAAO,cAAc,IAAI,MAAM,QAAQ,CAAC,CAC1C,EAAG,GAAG,EAEV,CAEA,qBAAc,UAAY,OAAO,OAAO,CAAC,EAAG,cAAc,UAAW,CACnE,YAAa,UAAW,CAClB,MAAM,SAAS,WAAa,WACzB,SAAS,KAAK,UAAU,SAAS,eAAe,GACnD,IAAI,MAAM,WAGhB,EAEA,SAAU,UAAW,CACnB,MAAM,UAAU,OAAO,EACvB,MAAM,SAAS,OAAO,CACxB,CACF,CAAC,EAEM,aACT,GAAG,EAEH,MAAM,eAAiB,UAAW,CAEhC,IAAI,UAAY,CACd,OAAQ,2BACR,SAAU,4BACZ,EAEA,SAAS,cAAc,UAAW,CAChC,KAAK,UAAY,UACjB,KAAK,iBAAmB,KACxB,KAAK,mBAAqB,KAE1B,MAAM,gBAAgB,CACpB,QAAS,KAAK,UACd,SAAU,KAAK,KAAK,KAAK,IAAI,EAC7B,UAAW,GACb,CAAC,CACH,CAEA,qBAAc,UAAY,OAAO,OAAO,CAAC,EAAG,cAAc,UAAW,CACnE,KAAM,UAAW,CACf,IAAI,SAAW,KAAK,UAAU,cAAc,UAAU,MAAM,EACxD,WAAa,KAAK,UAAU,cAAc,UAAU,QAAQ,EAE5D,WACF,KAAK,iBAAmB,IAAI,MAAM,WAAW,QAAQ,GAGnD,aACF,KAAK,mBAAqB,IAAI,MAAM,WAAW,UAAU,EAE7D,EACA,SAAU,UAAW,CACf,KAAK,kBACP,KAAK,iBAAiB,QAAQ,EAG5B,KAAK,oBACP,KAAK,mBAAmB,QAAQ,CAEpC,CACF,CAAC,EAEM,aACT,GAAG,EAEH,MAAM,YAAc,UAAW,CAC7B,IAAI,YAAc,GAEd,UAAY,CACd,WAAY,SACd,EAEA,SAAS,WAAW,UAAW,CAC7B,KAAK,UAAY,UACjB,KAAK,UAAY,UAAU,aAAa,iBAAiB,EACzD,KAAK,UAAY,eAAiB,KAAK,UAEvC,IAAI,aAAe,SAAS,cAAc,kBAAkB,EAExD,aACF,KAAK,kBAAkB,EACd,MAAM,SAAS,eACxB,MAAM,UAAU,qBAAqB,EAGvC,KAAK,KAAK,CACZ,CAEA,kBAAW,UAAY,OAAO,OAAO,CAAC,EAAG,WAAW,UAAW,CAC7D,KAAM,UAAW,CAEf,KAAK,UAAY,KAAK,UACtB,KAAK,UAAY,KAAK,UAAU,aAAa,iBAAiB,EAE9D,KAAK,WAAa,SAAS,cAAc,UAAU,UAAU,EACzD,KAAK,aACP,KAAK,WAAW,GAAG,SAAU,KAAK,aAAa,KAAK,IAAI,CAAC,EACzD,KAAK,YAAc,KAAK,oBAAoB,GAG9C,IAAI,MAAM,iBAAiB,KAAK,SAAS,EAEzC,KAAK,SAAS,EACd,KAAK,eAAe,CACtB,EAEA,aAAc,UAAW,CACvB,OAAO,KAAK,WAAW,OAAS,KAAK,WACvC,EAEA,oBAAqB,UAAW,CAC9B,OAAO,KAAK,WAAW,QAAQ,MACjC,EAEA,aAAc,UAAW,CACvB,KAAK,YAAc,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAE7D,KAAK,YAAY,IAAI,UAAW,KAAK,aAAa,CAAC,EACnD,KAAK,YAAY,OAAO,MAAM,EAE9B,OAAO,SAAS,OAAS,KAAK,YAAY,SAAS,CACrD,EAEA,SAAU,UAAW,CACnB,IAAI,SAAW,SAAS,eAAe,UAAU,EAE5C,UAIL,SAAS,GAAG,SAAU,SAAS,IAAK,CAClC,SAAS,KAAO,SAAS,KAC3B,CAAC,CACH,EAEA,eAAgB,UAAW,CACzB,OAAO,IAAI,WAAa,KAAK,SAAS,EACtC,OAAO,GAAG,WAAa,KAAK,UAAY,OAAU,CAChD,GAAI,MAAO,CAET,GAAI,SAAS,KAAK,QAAQ,SAAS,QAAQ,GAAK,EAC9C,MAAO,GAGT,MAAM,OAAS,IAAI,IAAI,OAAO,SAAS,IAAI,EAE3C,MAAM,qBAAqB,OAAQ,EAAK,EAAE,KAAK,IAAM,CACnD,YAAc,GACd,KAAK,eAAe,CACtB,CAAC,CACH,CACF,CAAC,CACH,EAKA,kBAAmB,UAAW,CAC5B,GAAK,QAAQ,YAIR,MAAM,SAAS,cAIpB,KAAI,cAAgB,SAAS,cAAc,iBAAiB,EACvD,cAAc,UAAU,SAAS,yBAAyB,GAC7D,SAAS,OAAO,EAEpB,EAEA,YAAa,UAAW,CACtB,KAAK,SAAS,EACd,KAAK,KAAK,CACZ,EAEA,SAAU,UAAW,CACnB,OAAO,IAAI,KAAK,SAAS,EACzB,KAAK,UAAU,IAAI,KAAK,SAAS,CACnC,CAEF,CAAC,EAEM,UACT,GAAG,EAEH,MAAM,kBAAoB,UAAW,CACnC,IAAI,YAAc,GAEd,UAAY,CACd,cAAe,yBACf,WAAY,cACZ,QAAS,qBACT,WAAY,eACZ,KAAM,kBACN,SAAU,cACZ,EAEI,QAAU,CACZ,UAAW,cACX,gBAAiB,aACnB,EAEA,SAAS,iBAAiB,UAAW,CACnC,KAAK,UAAY,UACjB,KAAK,UAAY,UAAU,aAAa,iBAAiB,EACzD,KAAK,UAAY,sBAAwB,KAAK,UAE9C,KAAK,KAAK,CACZ,CAEA,wBAAiB,UAAY,OAAO,OAAO,CAAC,EAAG,iBAAiB,UAAW,CACzE,KAAM,UAAW,CACf,SAAS,iBAAiB,UAAU,UAAU,EAAE,QAAQ,KAAO,CAC7D,IAAI,GAAG,QAAU,KAAK,UAAW,KAAK,WAAW,KAAK,IAAI,CAAC,CAC7D,CAAC,EAED,SAAS,iBAAiB,UAAU,QAAQ,EAAE,QAAQ,MAAQ,CAC5D,KAAK,iBAAiB,QAAS,KAAK,aAAa,KAAK,IAAI,CAAC,CAC7D,CAAC,EAED,KAAK,eAAe,CACtB,EAEA,eAAgB,UAAW,CACH,SAAS,iBAAiB,UAAU,UAAU,EACtD,QAASA,KAAO,IAAI,MAAM,WAAWA,IAAI,CAErD,SAAU,KAAK,mBAAmB,KAAK,IAAI,CAC7C,CAAC,CAAC,CACJ,EAEA,WAAY,SAAS,IAAK,CACxB,IAAI,IAAM,IAAI,cAOd,GALI,IAAI,UAAU,SAAS,SAAS,IAIpC,IAAI,eAAe,EACf,aACF,OAGF,YAAc,GAEd,MAAM,OAAS,IAAI,WACb,OAAS,IAAI,IAAI,IAAI,IAAI,EAE/B,KAAK,gBAAgB,OAAQ,GAAG,EAChC,KAAK,aAAa,EAClB,KAAK,qBAAqB,OAAO,YAAY,CAC/C,EAEA,aAAc,SAAS,IAAK,CAC1B,MAAM,IAAM,IAAI,OAQhB,GALI,IAAI,UAAU,SAAS,SAAS,IAIpC,IAAI,eAAe,EACf,aACF,OAGF,YAAc,GAEd,MAAM,OAAS,IAAI,QAAQ,IAAI,EACzB,OAAS,IAAI,QAAQ,MAAM,EAC3B,SAAW,IAAI,SAAS,MAAM,EAEpC,KAAK,gBAAgB,OAAQ,GAAG,EAChC,KAAK,aAAa,EAClB,KAAK,mBAAmB,QAAQ,CAClC,EAEA,qBAAsB,SAAS,aAAc,CAC3C,MAAM,qBAAqB,YAAY,EACpC,KAAK,IAAM,CACV,YAAc,GACd,KAAK,eAAe,EACpB,SAAS,cAAc,IAAI,YAAY,qBAAqB,CAAC,CAC/D,CAAC,CACL,EAEA,mBAAoB,SAAS,SAAU,CACrC,MAAM,aAAe,IAAI,gBAAgB,QAAQ,EACjD,KAAK,qBAAqB,YAAY,CACxC,EAEA,gBAAiB,SAAS,OAAQA,IAAI,CACpC,MAAM,OAAS,OAAO,cAAc,YAAY,EAEhD,GAAI,OAAO,UAAU,SAAS,QAAQ,SAAS,EAC7C,OAAO,UAAU,OAAO,QAAQ,SAAS,MACpC,CAGL,GAAIA,IAAG,QAAQ,IAAI,EAAE,UAAU,SAAS,QAAQ,eAAe,EAC7D,OAAO,OAAO,MACT,CACL,MAAM,OAAS,SAAS,cAAc,IAAI,EAC1C,OAAO,UAAU,IAAQ,MAAO,aAAc,EAC9C,MAAM,QAAU,SAAS,cAAc,GAAG,EAC1C,QAAQ,UAAU,IAAQ,MAAO,aAAc,kBAAmB,EAClE,QAAQ,UAAY,OAAO,UAE3B,OAAO,YAAY,OAAO,EAE1B,MAAM,QAAU,SAAS,cAAc,UAAU,aAAa,EAC1D,SAAS,QAAQ,OAAO,MAAM,CACpC,CAEA,OAAO,UAAU,IAAI,QAAQ,SAAS,CACxC,CACF,EAEA,aAAc,UAAW,CACvB,SAAS,iBAAiB,eAAe,EAAE,QAAQA,KAAM,CACvDA,IAAG,UAAU,IAAI,QAAQ,CAC3B,CAAC,CACH,EAEA,YAAa,UAAW,CACtB,KAAK,KAAK,CACZ,CACF,CAAC,EAEM,gBACT,GAAG,EAEH,MAAM,qBAAuB,SAAU,aAAc,cAAgB,GAAM,CACzE,MAAM,UAAY,CAChB,gBAAiB,2BACjB,iBAAkB,iBAClB,iBAAkB,uBACpB,EACM,cAAgB,SAAS,eAAe,UAAU,eAAe,EACjE,eAAiB,SAAS,eAAe,UAAU,gBAAgB,EAezE,OAbqB,IAAI,MAAM,aAAa,CAC1C,SAAU,CACR,CACE,UAAW,cAAc,QAAQ,UACjC,OAAQ,UAAU,eACpB,EACA,CACE,UAAW,eAAe,QAAQ,UAClC,OAAQ,UAAU,gBACpB,CACF,CACF,CAAC,EAGE,WAAW,OAAO,SAAS,SAAU,aAAc,aAAa,EAChE,KAAK,IAAM,CACV,MAAM,SAAS,OAAO,iBAAiB,EACvC,MAAM,SAAS,OAAO,mBAAmB,EAEzC,MAAM,kBAAoB,SAAS,eACjC,UAAU,gBACZ,EACA,MAAM,sBAAsB,iBAAiB,EAC7C,MAAM,iBAAiB,OAAO,iBAAiB,CACjD,CAAC,CACL,EAYA,MAAM,oBAAsB,UAAW,CACrC,IAAI,UAAY,CACd,WAAY,4BACZ,iBAAkB,2BAClB,2BAA4B,8BAC5B,QAAS,sBACT,OAAQ,cACV,EAEI,QAAU,CACZ,QAAS,qBACT,UAAW,iCACX,kBAAmB,kCACnB,mBAAoB,kCACtB,EAEA,SAAS,mBAAmB,UAAW,CACrC,KAAK,UAAY,UACjB,KAAK,UAAY,KAAK,UAAU,aAAa,iBAAiB,EAC9D,KAAK,WAAa,KAAK,UAAU,cAAc,UAAU,UAAU,EACnE,KAAK,aAAe,KAAK,UAAU,iBAAiB,UAAU,MAAM,EACpE,KAAK,UAAY,wBAA0B,KAAK,UAEhD,KAAK,QAAU,CACb,WAAY,KAAK,UAAU,QAAQ,WACnC,SAAU,KAAK,UAAU,QAAQ,QACnC,EAEA,IAAI,WAAa,KAAK,UAAU,QAAQ,WACpC,aAAe,KAAK,UAAU,QAAQ,gBAE1C,KAAK,SAAW,CACd,IAAK,KAAK,UAAU,QAAQ,cAC5B,KAAM,EACN,UAAW,KAAK,QAAQ,SAAW,KAAK,KAAK,aAAe,UAAU,EAAI,EAC1E,cAAe,EACf,cAAe,KAAK,UAAU,QAAQ,aACxC,EAEA,KAAK,MAAQ,CACX,OAAQ,GACR,QAAS,GACT,gBAAiB,GACjB,kBAAmB,GACnB,WAAY,KAAK,QAAQ,WACzB,eAAgB,KAChB,YAAa,CACf,EAEA,KAAK,OAAS,CACZ,SAAU,EACV,UAAW,CACb,EAEA,MAAM,gBAAgB,CACpB,QAAS,KAAK,UACd,SAAU,KAAK,KAAK,KAAK,IAAI,CAC/B,CAAC,CACH,CAEA,0BAAmB,UAAY,OAAO,OAAO,CAAC,EAAG,mBAAmB,UAAW,CAC7E,KAAM,UAAW,CACf,IAAI,MAAM,iBAAiB,KAAK,SAAS,EAEpC,KAAK,MAAM,aAIhB,KAAK,OAAS,KAAK,gBAAgB,EAEnC,OAAO,GAAG,SAAW,KAAK,UAAW,MAAM,MAAM,SAAS,IAAK,KAAK,aAAa,KAAK,IAAI,CAAC,CAAC,EAE5F,KAAK,qBAAqB,KAAK,MAAM,UAAU,EAC/C,KAAK,eAAe,KAAK,MAAM,UAAU,EAEzC,KAAK,MAAM,OAAS,GACtB,EAEA,OAAQ,UAAW,CACjB,IAAI,MAAM,iBAAiB,KAAK,SAAS,EAErC,KAAK,MAAM,aACb,KAAK,OAAS,KAAK,gBAAgB,EACnC,KAAK,qBAAqB,KAAK,MAAM,UAAU,GAGjD,MAAM,sBAAsB,CAC9B,EAEA,aAAc,SAAS,QAAS,CAC9B,KAAK,MAAM,QAAU,QACrB,KAAK,UAAU,UAAU,OAAO,QAAQ,QAAS,OAAO,CAC1D,EAEA,gBAAiB,UAAW,CAC1B,IAAI,UAAY,KAAK,WAAW,YAC5B,SAAW,KAAK,WAAW,YAC3B,KAAO,KAAK,WAAW,cAAc,aAAa,EAClD,UAAY,KAAK,YAIrB,OAAK,KAAK,MAAM,SACd,SAAW,SAAW,KAGpB,UAAY,WACd,KAAK,aAAa,KAAM,EAAI,EAGvB,CACL,SACA,WAAY,SAAW,UACvB,SACF,CACF,EAEA,aAAc,UAAW,CACnB,KAAK,MAAM,aACb,KAAK,OAAS,KAAK,gBAAgB,GAErC,KAAK,qBAAqB,KAAK,MAAM,UAAU,EAC/C,KAAK,eAAe,KAAK,MAAM,UAAU,CAC3C,EAEA,qBAAsB,SAAS,OAAQ,CACrC,GAAI,OAAQ,CACV,GAAI,KAAK,MAAM,gBAAmB,OAClC,KAAK,WAAW,GAAG,SAAW,KAAK,UAAW,MAAM,MAAM,SAAS,IAAK,KAAK,YAAY,KAAK,IAAI,CAAC,CAAC,EACpG,KAAK,MAAM,gBAAkB,EAC/B,MACE,KAAK,WAAW,IAAI,SAAW,KAAK,SAAS,EAC7C,KAAK,MAAM,gBAAkB,EAEjC,EAEA,YAAa,SAAS,IAAK,CACzB,GAAI,KAAK,MAAM,QAAS,CACtB,KAAK,qBAAqB,EAAK,EAC/B,MACF,CAGI,KAAK,OAAO,aAAe,IAC7B,KAAK,OAAS,KAAK,gBAAgB,GAGrC,IAAI,WAAa,IAAI,cAAc,WAAa,IAAI,cAAc,WAAa,EAC3E,QAAU,KAAK,MAAM,WAAa,KAAK,OAAO,WAAa,GAAG,EAC9D,QAAU,KAAK,OAAO,WAAa,WAEnC,KAAK,QAAQ,UACX,CAAC,KAAK,MAAM,mBAAqB,QAAU,IAC7C,KAAK,eAAe,EAInB,UACH,QAAU,GAGZ,KAAK,aAAa,OAAO,CAC3B,EAEA,eAAgB,SAAS,OAAQ,CAC/B,KAAK,aAAa,QAAQ,OAAS,CACjC,MAAM,IAAI,QAAU,KAAK,SAAS,EAC9B,QACF,MAAM,UAAU,OAAO,MAAM,EAC7B,MAAM,GAAG,QAAU,KAAK,UAAW,KAAK,YAAY,KAAK,IAAI,CAAC,GAE9D,MAAM,UAAU,IAAI,MAAM,CAE9B,CAAC,CACH,EAEA,YAAa,SAAS,IAAK,CACzB,IAAI,UAAY,IAAI,cAAc,UAAU,SAAS,QAAQ,SAAS,EAAI,OAAS,QAC/E,UAAY,MAAM,OAAO,QAAU,EAAI,EAE3C,GAAI,IAAI,OAAS,aACf,KAAK,MAAM,eAAiB,YAAY,UAAU,CAChD,IAAIM,YAAa,KAAK,WAAW,WAC7BC,QAAS,YAAc,OAAUD,YAAa,UAAcA,YAAa,UAC7E,KAAK,WAAW,WAAaC,OAC/B,EAAE,KAAK,IAAI,EAAG,KAAK,MAAM,WAAW,UAC3B,IAAI,OAAS,aACtB,cAAc,KAAK,MAAM,cAAc,UAC9B,IAAI,OAAS,QAAS,CAC/B,cAAc,KAAK,MAAM,cAAc,EACvC,IAAI,WAAa,KAAK,WAAW,WAC7B,aAAe,KAAK,OAAO,UAAY,KAAK,SAAS,cACrD,OAAS,YAAc,OAAU,WAAa,aAAiB,WAAa,aAEhF,KAAK,WAAW,OAAO,CACrB,KAAM,OACN,SAAU,QACZ,CAAC,CACH,CAEI,QAAU,GACZ,KAAK,aAAa,MAAM,CAE5B,EAEA,aAAc,SAAS,IAAK,IAAK,CAC/B,KAAK,aAAa,QAAQ,OAAS,CAIjC,GAHA,MAAM,UAAU,OAAO,QAAQ,kBAAkB,EACjD,MAAM,UAAU,OAAO,QAAQ,iBAAiB,EAE5C,IAAK,CACP,MAAM,UAAU,IAAI,QAAQ,kBAAkB,EAC9C,MAAM,UAAU,IAAI,QAAQ,iBAAiB,EAC7C,MACF,CAGA,GAAI,KAAO,GAAI,CACb,MAAM,UAAU,IAAI,QAAQ,iBAAiB,EAC7C,MACF,CAGA,GAAI,KAAO,GAAI,CACb,MAAM,UAAU,IAAI,QAAQ,kBAAkB,EAC9C,MACF,CACF,CAAC,CACH,EAEA,eAAgB,UAAW,CACzB,KAAK,aAAa,EAAI,EACtB,IAAI,QAAU,KAAK,SAAS,KAAO,EAC/B,UAAY,KAAK,SAAS,cAG9B,GAAI,QAAU,KAAK,SAAS,UAAW,CACrC,KAAK,aAAa,EAAK,EACvB,KAAK,MAAM,kBAAoB,GAC/B,MACF,CAGA,GAAI,KAAK,SAAS,MAAQ,OAAW,CACnC,KAAK,aAAa,EAAK,EACvB,KAAK,MAAM,kBAAoB,GAC/B,MACF,CAEA,IAAI,OAAS,KAAK,SAAS,IAAM,SAAY,QAE7C,MAAM,MAAM,EAAE,KAAK,SAAS,SAAU,CACpC,OAAO,SAAS,KAAK,CACvB,CAAC,EAAE,KAAK,SAAS,KAAM,CACrB,IAAI,OAAS,IAAI,UACb,IAAM,OAAO,gBAAgB,KAAM,WAAW,EAC9C,YAAc,IAAI,iBAAiB,UAAU,2BAA6B,gBAAgB,EAC1F,SAAW,SAAS,uBAAuB,EAE/C,YAAY,QAAQ,MAAQ,CAC1B,KAAK,UAAU,IAAI,SAAS,EAC5B,SAAS,YAAY,IAAI,CAC3B,CAAC,EAED,KAAK,UAAU,cAAc,UAAU,gBAAgB,EAAE,YAAY,QAAQ,EAE7E,KAAK,YAAY,CACnB,EAAE,KAAK,IAAI,CAAC,CACd,EAEA,YAAa,UAAW,CACtB,KAAK,aAAa,EAAK,EACvB,KAAK,SAAS,KAAO,KAAK,SAAS,KAAO,EAC1C,KAAK,OAAO,CACd,EAEA,YAAa,UAAW,CACtB,KAAK,SAAS,EACd,KAAK,KAAK,CACZ,EAIA,OAAQ,UAAW,CACjB,MAAM,iBAAiB,OAAO,KAAK,SAAS,CAC9C,EAEA,SAAU,UAAW,CACnB,OAAO,IAAI,KAAK,SAAS,EACzB,OAAO,cAAc,IAAI,MAAM,QAAQ,CAAC,EACxC,KAAK,WAAW,IAAI,KAAK,SAAS,EAClC,MAAM,iBAAiB,OAAO,KAAK,SAAS,CAC9C,CAEF,CAAC,EAEM,kBACT,GAAG,EAEH,MAAM,cAAgB,UAAW,CAC/B,IAAI,SAAW,CACb,eAAgB,GAChB,YAAa,GACb,SAAU,GACV,gBAAiB,GACjB,WAAY,EACd,EAEA,SAAS,aAAa,UAAW,CAC/B,KAAK,UAAY,UACjB,IAAI,UAAY,UAAU,aAAa,iBAAiB,EACxD,KAAK,UAAY,UAAU,cAAc,iBAAmB,SAAS,EAEhE,KAAK,WAEV,MAAM,gBAAgB,CACpB,QAAS,KAAK,UACd,SAAU,KAAK,KAAK,KAAK,IAAI,EAC7B,UAAW,GACb,CAAC,CACH,CAEA,oBAAa,UAAY,OAAO,OAAO,CAAC,EAAG,aAAa,UAAW,CACjE,KAAM,SAAS,IAAK,KAAM,CAEpB,KAAK,UAAU,QAAQ,OAAS,IAClC,SAAS,WAAa,GACtB,SAAS,QAAU,IAGrB,KAAK,SAAW,IAAI,MAAM,UAAU,KAAK,UAAW,QAAQ,EAC5D,KAAK,SAAS,OAAO,CACvB,EAEA,SAAU,UAAW,CACf,KAAK,UAAY,OAAO,KAAK,SAAS,SAAY,YACpD,KAAK,SAAS,QAAQ,CAE1B,EAEA,WAAY,UAAW,CACjB,KAAK,UAAY,OAAO,KAAK,SAAS,MAAS,YACjD,KAAK,SAAS,KAAK,CAEvB,EAEA,cAAe,SAAS,IAAK,CAC3B,IAAI,MAAQ,KAAK,UAAU,cAAc,wBAA0B,IAAI,OAAO,OAAO,EACjF,MAAQ,SAAS,MAAM,QAAQ,KAAK,EAExC,aAAa,KAAK,OAAO,EAErB,KAAK,UAAY,OAAO,KAAK,SAAS,OAAU,aAClD,KAAK,SAAS,UAAU,KAAK,EAC7B,KAAK,SAAS,MAAM,EAExB,EAEA,gBAAiB,UAAW,CACtB,KAAK,UAAY,OAAO,KAAK,SAAS,MAAS,YACjD,KAAK,SAAS,KAAK,CAEvB,CACF,CAAC,EAEM,YACT,GAAG,EAEH,MAAM,cAAgB,UAAW,CAE/B,IAAI,QAAU,CACZ,OAAQ,0BACR,SAAU,2BACZ,EAEA,SAAS,aAAa,UAAW,CAC/B,KAAK,UAAY,UACjB,IAAI,WAAa,UAAU,QAAQ,MAE/B,eAAiB,UAAU,cAAc,OAAO,EAUpD,GATI,gBACF,MAAM,iBAAiB,cAAc,EAEvC,KAAK,UAAY,MAAM,KAAK,UAAU,iBAAiB,kBAAkB,CAAC,EAE1E,KAAK,MAAQ,CACX,YAAa,CACf,EAEI,aAAe,EAAG,CACpB,KAAK,SAAS,EAAI,EAClB,MACF,CAEA,KAAK,SACL,KAAK,cAAgB,UAAU,QAAQ,SACvC,KAAK,SAAW,WAAa,EAE7B,MAAM,gBAAgB,CACpB,QAAS,KAAK,UACd,SAAU,KAAK,aAAa,KAAK,IAAI,CACvC,CAAC,CACH,CAEA,oBAAa,UAAY,OAAO,OAAO,CAAC,EAAG,aAAa,UAAW,CACjE,aAAc,UAAW,CAGvB,IAAI,iBAAmB,KAAK,UAAU,MAAO,SACpC,QAAQ,cAAc,sBAAsB,EAAE,UAAU,SAAS,QAAQ,CACjF,EAEG,kBACF,KAAK,SAAS,EAAI,EAClB,KAAK,SAAW,YAAY,UAAW,CACrC,KAAK,SAAS,CAChB,EAAE,KAAK,IAAI,EAAG,KAAK,aAAa,GAEhC,WAAW,KAAK,aAAa,KAAK,IAAI,EAAG,GAAG,CAEhD,EAEA,SAAU,SAAS,MAAO,CAExB,IAAI,UAAY,KAAK,MAAM,cAAgB,KAAK,SAAW,EAAI,KAAK,MAAM,YAAc,EAOxF,GALI,QACF,UAAY,KAAK,MAAM,aAIrB,CAAC,MAAO,CACV,IAAI,MAAQ,KAAK,UAAU,KAAK,MAAM,WAAW,EACjD,MAAM,UAAU,OAAO,QAAQ,MAAM,EACrC,MAAM,UAAU,IAAI,QAAQ,QAAQ,CACtC,CAGA,IAAI,UAAY,KAAK,UAAU,SAAS,EACxC,UAAU,UAAU,OAAO,QAAQ,QAAQ,EAC3C,UAAU,UAAU,IAAI,QAAQ,MAAM,EAEtC,KAAK,MAAM,YAAc,SAC3B,EAEA,SAAU,UAAW,CACnB,cAAc,KAAK,QAAQ,CAC7B,CACF,CAAC,EAEM,YACT,GAAG,EAGH,MAAM,MAAQ,UAAW,CACvB,IAAI,OAAS,CACX,KAAM,EACR,EACI,UAAY,KACZ,WAAa,CAAC,EAEd,OAAS,CAAC,EAEV,UAAY,CACd,QAAS,4BACT,IAAK,aACL,WAAY,uBACd,EAIA,OAAO,eAAiB,UAAW,CAC5B,QAAQ,aAIb,SAAS,iBAAiB,UAAU,OAAO,EAAE,QAAQ,SAAW,CAC9D,QAAQ,UAAU,IAAI,yBAAyB,CACjD,CAAC,EAED,SAAS,iBAAiB,UAAU,GAAG,EAAE,QAAQ,KAAO,CACtD,IAAI,WAAW,YAAY,GAAG,CAChC,CAAC,EAED,OAAO,SAAS,MAAM,QAAQ,SAAS,EACzC,EAEA,OAAO,SAAW,SAAS,MAAO,CAChC,IAAI,QAAU,SAAS,cAAc,KAAK,EAC1C,QAAQ,UAAU,IAAI,qBAAsB,SAAU,aAAa,EACnE,QAAQ,UAAY,MACpB,SAAS,iBAAiB,UAAU,UAAU,EAAE,QAAQ,SAAW,CACjE,QAAQ,WAAW,QAAQ,OAAO,CACpC,CAAC,EACD,SAAS,iBAAiB,oBAAoB,EAAE,QAAQ,MAAQ,CAC9D,KAAK,UAAU,IAAI,MAAM,CAC3B,CAAC,CACH,EAEA,SAAS,IAAI,UAAW,CACtB,KAAK,UAAY,UACjB,KAAK,UAAY,KAAK,UAAU,aAAa,iBAAiB,EAC9D,KAAK,UAAY,QAAU,KAAK,UAChC,KAAK,IAAM,UAAU,cAAc,UAAU,GAAG,EAChD,KAAK,IAAM,KAAK,IAAI,QAAQ,OAE5B,OAAS,CACP,iBAAkB,MAAM,QAAQ,iBAChC,kBAAmB,MAAM,QAAQ,kBACjC,aAAc,MAAM,QAAQ,aAC5B,UAAW,MAAM,QAAQ,SAC3B,EAEK,KAAK,KAIV,MAAM,gBAAgB,CACpB,QAAS,KAAK,UACd,SAAU,KAAK,WAAW,KAAK,IAAI,EACnC,UAAW,EACb,CAAC,CACH,CAGA,SAAS,aAAc,CACrB,WAAW,QAAQ,UAAY,CAC7B,SAAS,UAAU,CACrB,CAAC,CACH,CAEA,SAAS,UAAU,IAAK,CACtB,IAAI,SAAW,IAAI,OAAO,KAAK,SAE/B,GAAK,IAIL,KAAI,QAAU,IAAI,QAAQ,eAEtB,SAAW,IAAI,QAAQ,CAAC,QAAS,SAAW,CAC9C,SAAS,QAAQ,CAAE,OAAiB,EAAG,SAAS,QAAS,OAAQ,CAC3D,SAAW,OAAO,KAAK,eAAe,IACxC,OAAO,MAAM,EAEf,QAAQ,OAAO,CACjB,CAAC,CACH,CAAC,EAED,OAAO,SACT,CAEA,WAAI,UAAY,OAAO,OAAO,CAAC,EAAG,IAAI,UAAW,CAC/C,WAAY,UAAW,CACrB,GAAI,YAAc,SAChB,KAAK,UAAU,UAEf,WAAW,KAAK,IAAI,EAEhB,YAAc,YAChB,UAAY,UACR,OAAO,OAAO,OAAW,KAAe,OAAO,OAAO,OAAO,KAAS,KAAc,CAEtF,IAAI,OAAS,SAAS,cAAc,QAAQ,EAC5C,OAAO,OAAS,UAAY,CAC1B,UAAY,SACZ,YAAY,CACd,EACA,OAAO,IAAM,+CAAiD,KAAK,IACnE,SAAS,KAAK,YAAY,MAAM,CAClC,CAGN,EAEA,UAAW,UAAW,CACpB,IAAI,OAAS,KAAK,IAElB,OAAO,UAAU,MAAM,EACpB,KACC,SAAS,QAAS,CAChB,IAAI,WAAa,CACf,KAAM,OAAO,KACb,gBAAiB,OACjB,OAAQ,QAAQ,CAAC,EAAE,SAAS,SAC5B,UAAW,GACX,eAAgB,GAChB,YAAa,GACb,uBAAwB,GACxB,iBAAkB,EACpB,EAEI,IAAO,KAAK,IAAM,IAAI,OAAO,KAAK,IAAI,OAAQ,UAAU,EACxD,OAAU,KAAK,OAAS,IAAI,UAAU,EAEtC,OAAS,IAAI,OAAO,KAAK,OAAO,CAClC,IACA,SAAU,IAAI,UAAU,CAC1B,CAAC,EAED,OAAO,KAAK,MAAM,eAChB,OACA,SACA,MAAM,MAAM,SAAS,IAAK,UAAW,CACnC,OAAO,KAAK,MAAM,QAAQ,IAAK,QAAQ,EACvC,IAAI,UAAU,MAAM,EACpB,OAAO,gBAAgB,OAAO,CAChC,CAAC,CACH,EAEI,QAAQ,YACN,OAAO,KAAO,IAAI,YAAY,CAEtC,EAAE,KAAK,IAAI,CACb,EACC,MAAM,SAAS,OAAQ,CACtB,IAAI,aAEJ,OAAQ,OAAQ,CACd,IAAK,eACH,aAAe,OAAO,iBACtB,MACF,IAAK,mBACH,aAAe,OAAO,kBACtB,MACF,IAAK,iBACH,aAAe,OAAO,UACtB,MACF,QACE,aAAe,OAAO,aACtB,KACJ,CAGI,QAAQ,YACV,OAAO,SAAS,YAAY,CAEhC,CAAC,CACL,EAEA,SAAU,UAAW,CACf,KAAK,IAAI,SAAW,GAIpB,QAAU,OAAO,MAAQ,OAAO,KAAK,OACvC,OAAO,KAAK,MAAM,eAAe,KAAK,IAAK,QAAQ,CAEvD,CACF,CAAC,EAEM,GACT,GAAG,EAEH,MAAM,kBAAoB,UAAW,CAEnC,IAAI,UAAY,CACd,kBAAmB,qBACrB,EAEA,SAAS,iBAAiB,UAAW,CACnC,KAAK,UAAY,UACjB,IAAI,UAAY,UAAU,aAAa,iBAAiB,EAMxD,GALA,KAAK,UAAY,UAAU,cAAc,cAAgB,SAAS,EAClE,KAAK,UAAY,IAAM,UAEvB,KAAK,aAAe,EAEhB,EAAC,KAAK,UAIV,KAAI,UAAY,UAAU,cACtB,aAAe,CAAC,EAAE,QAAQ,KAAK,UAAU,cAAc,SAAU,SAAS,EAE1E,eAAiB,EACnB,KAAK,KAAK,EAEV,MAAM,gBAAgB,CACpB,QAAS,KAAK,UACd,SAAU,KAAK,KAAK,KAAK,IAAI,CAC/B,CAAC,EAGL,CAEA,wBAAiB,UAAY,OAAO,OAAO,CAAC,EAAG,iBAAiB,UAAW,CACzE,KAAM,UAAW,CACf,IAAI,OAAS,KAAK,UAAU,iBAAiB,mBAAmB,EAUhE,GARI,KAAK,UAAU,aAAa,qBAAqB,GACnD,KAAK,UAAU,UAAU,OAAO,UAAW,kBAAkB,EAC7D,KAAK,UAAU,UAAU,IAAI,QAAQ,GAGrC,MAAM,iBAAiB,KAAK,SAAS,EAGnC,OAAO,OAAS,EAAG,CACrB,IAAI,WAAa,CACf,gBAAiB,KAAK,UAAU,aAAa,aAAa,EAC1D,SAAU,KAAK,UAAU,aAAa,WAAW,EACjD,KAAM,GACN,eAAgB,GAChB,aAAc,KAAK,aACnB,SAAU,KAAK,UAAU,QAAQ,WAAa,OAC1C,SAAS,KAAK,UAAU,QAAQ,KAAK,EACrC,EACN,EAEA,KAAK,SAAW,IAAI,MAAM,UAAU,KAAK,UAAW,UAAU,CAChE,MAEE,OAAO,CAAC,EAAE,UAAU,IAAI,aAAa,EAGnC,KAAK,UAAU,aAAa,eAAe,GAE7C,KAAK,UAAU,iBAAiB,UAAU,iBAAiB,EAAE,QAAQ,SAASP,IAAI,EAAG,CACnF,IAAI,MAAM,SAASA,IAAI,CACrB,UAAW,KAAK,UAAY,aAAe,CAC7C,CAAC,CACH,EAAE,KAAK,IAAI,CAAC,CAEhB,EAEA,YAAa,UAAW,CACtB,KAAK,SAAS,EACd,KAAK,KAAK,CACZ,EAEA,SAAU,UAAW,CACf,KAAK,UAAY,OAAO,KAAK,SAAS,SAAY,YACpD,KAAK,SAAS,QAAQ,CAE1B,EAEA,WAAY,UAAW,CACjB,KAAK,UAAY,OAAO,KAAK,SAAS,MAAS,YACjD,KAAK,SAAS,KAAK,CAEvB,EAEA,cAAe,SAAS,IAAK,CAC3B,IAAI,MAAQ,KAAK,UAAU,cAAc,sBAAwB,IAAI,OAAO,OAAO,EAC/E,MAAQ,SAAS,MAAM,QAAQ,KAAK,EAEpC,KAAK,UAAY,OAAO,KAAK,SAAS,OAAU,YAClD,KAAK,SAAS,UAAU,KAAK,EAC7B,KAAK,SAAS,MAAM,IAGpB,KAAK,aAAe,MACpB,WAAW,UAAW,CAChB,KAAK,UAAY,OAAO,KAAK,SAAS,OAAU,YAClD,KAAK,SAAS,MAAM,CAExB,EAAE,KAAK,IAAI,EAAG,GAAI,EAEtB,EAEA,gBAAiB,UAAW,CACtB,KAAK,UAAY,OAAO,KAAK,SAAS,MAAS,YAC7C,KAAK,SAAS,KAAK,UACrB,KAAK,SAAS,KAAK,CAGzB,CACF,CAAC,EAEM,gBACT,GAAG,EAEH,MAAM,iBAAmB,UAAW,CAClC,SAAS,gBAAgB,UAAW,CAClC,KAAK,UAAY,UACjB,IAAI,UAAY,KAAK,UAAU,aAAa,iBAAiB,EAG7D,GAFA,KAAK,WAAa,cAAgB,UAE9B,EAAC,WAKD,OAAO,SAAS,WAAa,cAK7B,OAAO,SAAS,WAAa,YAIjC,MAAK,KAAO,CACV,kBAAmB,UAAU,QAAQ,aACrC,mBAAoB,UAAU,QAAQ,UACtC,OAAQ,QAAQ,IAAI,KAAK,UAAU,EACnC,SAAU,UAAU,QAAQ,QAC9B,EAEA,KAAK,MAAQ,IAAI,MAAM,OAAO,mBAAqB,UAAW,wBAAwB,EAGtF,IAAI,IAAM,UAAU,cAAc,cAAc,EAahD,GAZI,KACF,IAAI,iBAAiB,QAAS,UAAU,CACtC,KAAK,WAAW,EAAI,CACtB,EAAE,KAAK,IAAI,CAAC,GAIV,UAAU,cAAc,SAAS,GAAK,UAAU,cAAc,gBAAgB,IAChF,KAAK,MAAM,KAAK,EAId,UAAU,cAAc,gBAAgB,EAAG,CAC7C,KAAK,WAAW,EAAI,EACpB,MACF,CAEA,SAAS,iBAAiB,cAAgB,UAAU,GAAI,KAAK,WAAW,KAAK,IAAI,CAAC,GAE9E,CAAC,KAAK,KAAK,QAAU,KAAK,KAAK,WAAa,SAC9C,KAAK,eAAe,EAExB,CAEA,uBAAgB,UAAY,OAAO,OAAO,CAAC,EAAG,gBAAgB,UAAW,CACvE,eAAgB,UAAW,CACrB,SAAW,QAAQ,YAGvB,WAAW,UAAW,CACpB,KAAK,MAAM,KAAK,CAClB,EAAE,KAAK,IAAI,EAAG,KAAK,KAAK,kBAAoB,GAAI,CAClD,EAEA,WAAY,SAAS,QAAS,CAE5B,GAAI,KAAK,KAAK,WAAa,OAAQ,CACjC,QAAQ,OAAO,KAAK,WAAY,CAAE,KAAM,GAAI,CAAC,EAC7C,MACF,CAEA,IAAI,OAAS,QAAU,IAAM,KAAK,KAAK,mBACvC,QAAQ,IAAI,KAAK,WAAY,SAAU,CAAE,KAAM,IAAK,QAAS,MAAO,CAAC,CACvE,EAEA,OAAQ,UAAW,CACjB,KAAK,MAAM,KAAK,CAClB,EAEA,SAAU,UAAW,CACnB,KAAK,MAAM,KAAK,CAClB,EAEA,WAAY,UAAW,CACrB,KAAK,MAAM,MAAM,CACnB,CACF,CAAC,EAEM,eACT,GAAG,EAEH,MAAM,gBAAkB,UAAW,CACjC,SAAS,gBAAiB,CACxB,KAAK,KAAK,CACZ,CAEA,sBAAe,UAAY,OAAO,OAAO,CAAC,EAAG,eAAe,UAAW,CACrE,KAAM,UAAW,CACf,GAAK,SAAS,cAAc,aAAa,EAIzC,KAAI,cAAgB,IAAI,MAAM,OAAO,aAAc,cAAe,CAChE,cAAe,WACf,MAAO,EACT,CAAC,EAGG,SAAS,iBAAiB,SAAS,EAAE,QACvC,cAAc,KAAK,EAEvB,CACF,CAAC,EAEM,cACT,GAAG,EAEH,MAAM,YAAc,UAAW,CAC7B,IAAI,UAAY,CACd,QAAS,uBACT,OAAQ,qBACR,eAAgB,sBAChB,YAAa,cACf,EAEA,SAAS,WAAW,UAAW,UAAW,CACxC,KAAK,UAAY,UACjB,KAAK,UAAY,UACjB,KAAK,UAAY,eAAiB,KAAK,UACvC,KAAK,QACL,KAAK,OACL,KAAK,MACL,KAAK,YAAc,GAEf,GAAC,WAAa,UAAU,QAAQ,OAAS,UAI7C,KAAK,KAAK,CACZ,CAEA,kBAAW,UAAY,OAAO,OAAO,CAAC,EAAG,WAAW,UAAW,CAC7D,KAAM,UAAW,CACf,KAAK,UAAU,iBAAiB,UAAU,OAAO,EAAE,QAAQ,SAAW,CACpE,QAAQ,GAAG,QAAU,KAAK,UAAW,KAAK,aAAa,KAAK,IAAI,CAAC,CACnE,CAAC,CACH,EAEA,aAAc,SAAS,IAAK,CAItB,KAAK,UAAU,SAAW,KAAK,UAAU,QAAQ,eAAiB,OACpE,KAAK,YAAc,GAEnB,KAAK,YAAc,GAGrB,KAAK,MAAQ,KAAK,aAAa,EAE/B,IAAI,MAAQ,KAAK,YAAc,KAAK,UAAU,cAAc,UAAU,WAAW,EAAI,IAAI,cAErF,MAAQ,KAAK,YAAc,KAAK,cAAc,KAAK,EAAI,MAAM,QAAQ,MAEzE,KAAK,YAAY,KAAK,MAAO,KAAK,CACpC,EAGA,cAAe,SAASA,IAAI,CAE1B,QADI,EAAI,GACAA,IAAKA,IAAG,kBAAoB,MAClC,IAIF,OAAO,EAAI,CACb,EAEA,aAAc,UAAW,CACvB,KAAK,OAAS,KAAK,YACD,KAAK,UAAU,iBAAiB,UAAU,eAAiB,UAAU,MAAM,EAC3E,KAAK,UAAU,iBAAiB,UAAU,MAAM,EAElE,IAAI,MAAQ,CAAC,EACT,QAAU,CAAC,EAEf,YAAK,OAAO,QAAQA,KAAM,CACxB,IAAI,KAAO,CACT,KAAMA,IAAG,YAAcA,IAAG,IAC1B,IAAKA,IAAG,aAAa,qBAAqB,EAC1C,EAAGA,IAAG,aAAa,uBAAuB,EAC1C,EAAGA,IAAG,aAAa,wBAAwB,EAC3C,GAAIA,IACJ,iBAAkB,EACpB,EAEA,MAAM,KAAK,IAAI,CACjB,CAAC,EAEM,KACT,EAEA,YAAa,SAAS,MAAO,MAAO,CAClC,IAAI,YAAc,SAAS,iBAAiB,OAAO,EAAE,CAAC,EAElD,QAAU,CACZ,eAAgB,GAChB,UAAW,GACX,cAAe,GACf,UAAW,GACX,QAAS,GACT,MAAO,MAAQ,EACf,aAAc,GACd,YAAa,GACb,UAAW,OACX,QAAS,GACT,oBAAqB,GACrB,iBAAkB,SAASK,OAAO,CAChC,IAAI,YAAc,OAAO,aAAe,SAAS,gBAAgB,UAC7D,UAAY,MAAMA,MAAK,EAAE,GACzB,KAAO,UAAU,sBAAsB,EAC3C,MAAO,CAAC,EAAE,KAAK,KAAM,EAAE,KAAK,IAAM,YAAa,EAAE,KAAK,KAAK,CAC7D,CACF,EAEA,KAAK,QAAU,IAAI,WAAW,YAAa,qBAAsB,MAAO,OAAO,EAC/E,KAAK,QAAQ,OAAO,cAAe,KAAK,YAAY,KAAK,IAAI,CAAC,EAC9D,KAAK,QAAQ,KAAK,EAElB,KAAK,sBAAsB,CAC7B,EAEA,YAAa,UAAW,CACtB,IAAI,MAAQ,KAAK,QAAQ,gBAAgB,EACzC,KAAK,UAAU,cAAc,IAAI,YAAY,yBAA0B,CACrE,OAAQ,CACN,KACF,CACF,CAAC,CAAC,CACJ,EAEA,WAAY,UAAW,CACrB,SAAS,gBAAgB,MAAM,YAC7B,wBACA,GAAG,OAAO,WAAW,IACvB,CACF,EAGA,sBAAuB,UAAW,CAChC,IAAI,iBAEC,oBAAoB,KAAK,OAAO,UAAU,SAAS,IAExD,KAAK,WAAW,EAGhB,iBAAmB,OAAO,QAG1B,SAAS,gBAAgB,UAAU,IAAI,kBAAkB,EAEzD,OAAO,iBAAiB,SAAU,KAAK,UAAU,EAEjD,KAAK,QAAQ,OAAO,UAAW,IAAM,CACnC,SAAS,gBAAgB,UAAU,OAAO,kBAAkB,EAC5D,OAAO,SAAS,EAAG,gBAAgB,CACrC,CAAC,EACH,CACF,CAAC,EAEM,UACT,GAAG,EAGH,MAAM,iBAAmB,UAAW,CAClC,IAAI,UAAY,CACd,YAAa,uCACb,aAAc,4BACd,eAAgB,eAClB,EAEA,SAAS,gBAAgB,UAAW,CAClC,KAAK,UAAY,UACjB,KAAK,UAAY,UAAU,aAAa,iBAAiB,EACzD,KAAK,IAAM,UAAU,QAAQ,IAE7B,UAAU,gBAAkB,mBAAqB,KAAK,UAEtD,MAAM,gBAAgB,CACpB,QAAS,UACT,SAAU,KAAK,KAAK,KAAK,IAAI,EAC7B,UAAW,GACb,CAAC,CACH,CAEA,uBAAgB,UAAY,OAAO,OAAO,CAAC,EAAG,gBAAgB,UAAW,CACvE,KAAM,UAAW,CACf,IAAI,QAAU,SAAS,eAAe,UAAU,eAAe,EAE/D,GAAI,GAAC,SAAW,QAAQ,QAAQ,SAAW,SAI3C,KAAI,GAAK,QAAQ,QAAQ,UACrB,MAAQ,QAAQ,QAAQ,MAExB,IAAM,KAAK,IAAM,6CAA8C,MAAO,eAAiB,GAG3F,GAAI,QAAQ,WAAY,CACtB,IAAI,QAAU,QAAQ,cAAc,UAAU,YAAY,EACtD,UACF,QAAQ,UAAY,GAExB,CAEA,MAAM,GAAG,EAAE,KAAK,SAAS,SAAU,CACjC,OAAO,SAAS,KAAK,CACvB,CAAC,EAAE,KAAK,SAAS,KAAM,CAErB,IAAI,OAAS,IAAI,UACb,IAAM,OAAO,gBAAgB,KAAM,WAAW,EAC9C,IAAM,IAAI,cAAc,UAAU,YAAY,EAC9C,YAAc,QAAQ,cAAc,UAAU,WAAW,EAC7D,GAAK,YAML,IAFA,YAAY,UAAY,GAEpB,CAAC,IAAK,CACR,KAAK,UAAU,UAAU,IAAI,MAAM,EAC/B,KAAO,IAAI,YAAY,EAC3B,MACF,CAEA,YAAY,YAAY,GAAG,EAE3B,MAAM,sBAAsB,OAAO,EAEnC,SAAS,cAAc,IAAI,YAAY,yBAA0B,CAC/D,OAAQ,CACN,OACF,CACF,CAAC,CAAC,EAGF,IAAI,QAAU,IAAI,iBAAiB,UAAU,cAAc,EACvD,QAAQ,SAAW,GACrB,KAAK,UAAU,UAAU,IAAI,MAAM,EAEvC,EAAE,KAAK,IAAI,CAAC,EACd,CACF,CAAC,EAEM,eACT,GAAG,EAEH,MAAM,mBAAqB,UAAW,CACpC,IAAI,UAAY,CACd,cAAe,+BACf,aAAc,8BACd,aAAc,mCAChB,EAEA,SAAS,kBAAkB,UAAW,CACpC,KAAK,UAAY,UACjB,KAAK,QAAU,UAAU,QAAQ,QACjC,KAAK,aAAe,UAAU,QAAQ,WACxC,CAEA,yBAAkB,UAAY,OAAO,OAAO,CAAC,EAAG,kBAAkB,UAAW,CAC3E,cAAe,SAAS,UAAW,CACjC,IAAI,kBACF,KAAK,QACL,aACA,UACA,kCAEEG,MAAO,KAEX,MAAM,iBAAiB,EACpB,KAAK,SAAS,SAAU,CACvB,OAAO,SAAS,KAAK,CACvB,CAAC,EACA,KAAK,SAAS,KAAM,CACnB,GAAI,KAAK,KAAK,IAAM,GAAI,CACtB,KAAK,UAAU,UAAY,GAC3B,MACF,CAEAA,MAAK,UAAU,UAAY,KAC3BA,MAAK,UAAU,UAAYA,MAAK,UAAU,kBAAkB,UAGxDA,MAAK,UAAU,cAAc,UAAU,aAAa,IACtDA,MAAK,OAAS,IAAI,MAAM,QAAQ,0BAA2B,cAAc,GAIvEA,MAAK,UAAU,cAAc,UAAU,YAAY,IACrDA,MAAK,MAAQ,IAAI,MAAM,OAAO,yBAA0B,cAAc,GAGxE,IAAI,MAAQA,MAAK,UAAU,cAAc,UAAU,YAAY,EAC3D,QACF,MAAM,YAAcA,MAAK,aAE7B,CAAC,CACL,CACF,CAAC,EAEM,iBACT,GAAG,EAEH,MAAM,cAAgB,UAAW,CAC/B,IAAI,UAAY,CACd,YAAa,uBACf,EAEA,SAAS,aAAa,UAAW,CAC/B,KAAK,UAAY,UACjB,KAAK,UAAY,UAAU,aAAa,iBAAiB,EACzD,KAAK,UAAY,UAAY,KAAK,UAClC,KAAK,YAEL,MAAM,gBAAgB,CACpB,QAAS,KAAK,UACd,SAAU,KAAK,KAAK,KAAK,IAAI,EAC7B,UAAW,GACb,CAAC,CACH,CAEA,oBAAa,UAAY,OAAO,OAAO,CAAC,EAAG,aAAa,UAAW,CACjE,KAAM,UAAW,CACf,IAAI,QAAU,KAAK,UAAU,cAAc,YAAY,EACvD,GAAK,QAGL,KAAI,KAAO,QAAQ,QAAQ,KAE3B,OAAO,KAAM,CACX,IAAK,UACH,IAAI,QAAU,QAAQ,QAAQ,QAC9B,KAAK,iBAAiB,OAAO,EAC7B,MACF,IAAK,QACH,IAAI,QAAU,QAAQ,QAAQ,QAC9B,KAAK,eAAe,OAAO,EAC3B,MACF,IAAK,MACH,KAAK,aAAa,EAClB,KACJ,EACF,EAEA,iBAAkB,SAAS,QAAS,CAClC,KAAK,YAAc,IAAI,MAAM,QAC3B,gBAAkB,KAAK,UACvB,CACE,QACA,YAAa,UAAU,WACzB,CACF,CACF,EAEA,eAAgB,SAAS,QAAS,CAChC,KAAK,YAAc,IAAI,MAAM,YAC3B,SAAW,KAAK,UAChB,QACA,CACE,YAAa,UAAU,WACzB,CACF,CACF,EAEA,aAAc,UAAW,CACvB,IAAI,SAAW,YAAc,KAAK,UAC9B,OAAS,SAAS,eAAe,QAAQ,EACzC,OAAS,OAAO,QAAQ,UAAU,WAAW,EAEjD,GAAI,OAAQ,CACV,OAAO,UAAU,IAAI,QAAQ,EAE7B,IAAI,YAAc,SAAS,cAAc,IAAM,QAAQ,EAAE,KAAK,EAG1D,cAAgB,QAClB,YAAY,KAAK,UAAW,CAE1B,CAAC,EAAE,MAAM,UAAW,CAClB,OAAO,aAAa,WAAY,EAAE,EAClC,OAAO,UAAU,IAAI,oBAAoB,CAC3C,CAAC,CAEP,CACF,EAEA,SAAU,SAAS,IAAK,CACtB,IAAI,UAAY,IAAI,OAAO,GAAG,QAAQ,mBAAoB,EAAE,EACxD,KAAK,aAAe,OAAO,KAAK,YAAY,SAAY,YAC1D,KAAK,YAAY,QAAQ,CAE7B,CACF,CAAC,EAEM,YACT,GAAG,EAGH,MAAM,mBAAqB,SAAS,KAAM,CAExC,GAAI,OAAO,OAAS,OAAO,IACzB,MAAO,GAGT,IAAI,QAAU,OACV,QACA,OAAS,YACX,QAAU,OAAO,gBAEf,OAAS,UACX,QAAU,OAAO,cAGnB,GAAI,CACF,eAAQ,QAAQ,QAAS,GAAG,EAC5B,QAAQ,WAAW,OAAO,EACnB,EACT,MAAgB,CACd,MAAO,EACT,CACF,EAEA,MAAM,sBAAwB,UAAW,CACnC,KACF,IAAI,YAAY,EAId,OAAO,MACT,IAAI,WAAW,EAAE,IAAI,WAAW,GAIlC,MAAM,aAAa,KAAK,CAC1B,EAEA,MAAM,sBAAwB,UAAW,CACvC,SAAS,iBAAiB,QAAS,SAAU,IAAK,CAChD,GAAK,OAAO,IAIZ,KAAI,OAAS,IAAI,OAAO,WACpB,SAAW,MAEX,OAAO,QAAQ,sBAAsB,GAAK,OAAO,QAAQ,sBAAsB,KACjF,SAAW,OAAO,QAAQ,cAAc,GAGtC,UACF,SAAS,SAAS,EAAE,CAAC,EAEzB,CAAC,CACH,EAEA,MAAM,mBAAqB,UAAW,CACpC,GAAG,OAAO,SAAS,KAAM,CACvB,IAAIR,IAAK,SAAS,cAAc,OAAO,SAAS,IAAI,EAChDA,KACF,OAAO,SAAS,EAAGA,IAAG,UAAY,GAAG,CAEzC,CACF,EAEA,MAAM,KAAO,UAAW,CACtB,MAAM,iBAAiB,KAAK,EAC5B,MAAM,QAAQ,EACd,MAAM,cAAc,EACpB,MAAM,aAAa,KAAK,EACpB,MAAM,SAAS,WAAa,UAC9B,IAAI,MAAM,WAAW,KAEvB,MAAM,WAAW,EAIjB,OAAO,iBAAiB,WAAY,SAAS,IAAK,CAC5C,IAAI,WACN,MAAM,YAAY,CAEtB,CAAC,EAEG,aAAe,YAAY,WAAW,OAAS,GACjD,MAAM,YAAY,CAEtB,EAEA,MAAM,cAAgB,UAAW,CAC/B,SAAS,KAAK,UAAU,IAAI,YAAY,EAExC,IAAI,KAAK,CACP,OAAQ,gBACR,KAAM,GACN,OAAQ,GACR,OAAQ,IACR,wBAAyB,EAC3B,CAAC,EAED,SAAS,iBAAiB,aAAc,SAAS,IAAK,CACpD,IAAI,IAAM,IAAI,OACV,KACF,IAAI,WAAW,UAAU,IAAI,QAAQ,CAEzC,CAAC,EAED,MAAM,4BAA4B,EAClC,MAAM,sBAAsB,EAC5B,MAAM,mBAAmB,CAC3B,EAKA,MAAM,OAAO,kBAAoB,MAAM,mBAAmB,SAAS,EACnE,MAAM,OAAO,gBAAkB,MAAM,mBAAmB,OAAO,EAK/D,SAAS,SAAS,SAAU,CACtB,SAAS,YAAc,UAAW,SAAS,EAC1C,SAAS,iBAAiB,mBAAoB,QAAQ,CAC7D,CAEA,SAAS,UAAU,CA2BjB,GA1BA,MAAM,SAAW,IAAI,MAAM,SAE3B,MAAM,KAAK,EAEP,MAAM,SAAS,oBACjB,MAAM,kBAAkB,EAG1B,MAAM,SAAS,SAAS,oBAAqB,MAAM,gBAAgB,EACnE,MAAM,SAAS,SAAS,iBAAkB,MAAM,aAAa,EAC7D,MAAM,SAAS,SAAS,gBAAiB,MAAM,YAAY,EAC3D,MAAM,SAAS,SAAS,gBAAiB,MAAM,YAAY,EAC3D,MAAM,SAAS,SAAS,UAAW,MAAM,OAAO,EAChD,MAAM,SAAS,SAAS,0BAA2B,MAAM,eAAe,EACxE,MAAM,SAAS,SAAS,kBAAmB,MAAM,cAAc,EAC/D,MAAM,SAAS,SAAS,mBAAoB,MAAM,OAAO,EACzD,MAAM,SAAS,SAAS,sBAAuB,MAAM,kBAAkB,EACvE,MAAM,SAAS,SAAS,kBAAmB,MAAM,UAAU,EAC3D,MAAM,SAAS,SAAS,oBAAqB,MAAM,gBAAgB,EACnE,MAAM,SAAS,SAAS,eAAgB,MAAM,YAAY,EAC1D,MAAM,SAAS,SAAS,mBAAoB,MAAM,eAAe,EACjE,MAAM,SAAS,SAAS,MAAO,MAAM,IAAI,EACzC,MAAM,SAAS,SAAS,OAAQ,MAAM,IAAI,EAC1C,MAAM,SAAS,SAAS,iBAAkB,MAAM,aAAa,EAC7D,MAAM,SAAS,SAAS,qBAAsB,MAAM,iBAAiB,EAEjE,SAAS,KAAK,UAAU,SAAS,eAAe,EAAG,CACrD,IAAI,aAAe,SAAS,eAAe,cAAc,EACrD,cACF,IAAI,MAAM,SAAS,YAAY,CAEnC,CAEA,MAAM,gBAAgB,EAEtB,MAAM,cAAc,EACpB,SAAS,cAAc,IAAI,YAAY,aAAa,CAAC,CACvD,CAAC,CACH,GAAG",
  "names": ["event", "el", "evt", "sections", "observer", "data", "index", "currentPos", "newPos", "self"]
}
