{
  "version": 3,
  "sources": ["/cdn/shop/t/15/assets/theme.js?section_id=product-recommendations"],
  "sourcesContent": ["/*\n@license\n  Expanse by Archetype Themes (https://archetypethemes.co)\n  Access unminified JS in assets/theme.js\n\n  Use this event listener to run your own JS outside of this file.\n  Documentation - https://archetypethemes.co/blogs/expanse/javascript-events-for-developers\n\n  document.addEventListener('page:loaded', function() {\n    // Page has loaded and theme assets are ready\n  });\n*/\n\nwindow.theme = window.theme || {};\nwindow.Shopify = window.Shopify || {};\n\ntheme.config = {\n  bpSmall: false,\n  hasSessionStorage: true,\n  hasLocalStorage: true,\n  mediaQuerySmall: 'screen and (max-width: '+ 769 +'px)',\n  youTubeReady: false,\n  vimeoReady: false,\n  vimeoLoading: false,\n  isTouch: ('ontouchstart' in window) || window.DocumentTouch && window.document instanceof DocumentTouch || window.navigator.maxTouchPoints || window.navigator.msMaxTouchPoints ? true : false,\n  stickyHeader: false,\n  rtl: document.documentElement.getAttribute('dir') == 'rtl' ? true : false\n};\ntheme.recentlyViewedIds = [];\n\nif (theme.config.isTouch) {\n  document.documentElement.className += ' supports-touch';\n}\n\nif (console && console.log) {\n  console.log('Expanse theme ('+theme.settings.themeVersion+') by ARCH\u039ETYPE | Learn more at https://archetypethemes.co');\n}\n\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nlazySizesConfig.expFactor = 4;\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  /**\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    }, 80);\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  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  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.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      var instance = Object.assign(new constructor(container), {\n        id: id,\n        type: type,\n        container: container\n      });\n  \n      this.instances.push(instance);\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      var sections = scope\n                     ? scope.querySelectorAll('[data-subsection]')\n                     : document.querySelectorAll('[data-subsection]');\n  \n      sections.forEach(el => {\n        this._onSectionLoad(null, el, el.dataset.sectionId);\n      });\n  \n      if (window.AOS) { AOS.refreshHard() }\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  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.currentVariant = this._getVariantFromOptions();\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() {\n        var selectedValues = this._getCurrentOptions();\n        var variants = this.variants;\n        var found = false;\n  \n        variants.forEach(function(variant) {\n          var match = true;\n          var options = variant.options;\n  \n          selectedValues.forEach(function(option) {\n            if (match) {\n              match = (variant[option.index] === option.value);\n            }\n          });\n  \n          if (match) {\n            found = variant;\n          }\n        });\n  \n        return found || null;\n      },\n  \n      _onSelectChange: function() {\n        var variant = this._getVariantFromOptions();\n  \n        this.container.dispatchEvent(new CustomEvent('variantChange', {\n          detail: {\n            variant: variant\n          }\n        }));\n  \n        document.dispatchEvent(new CustomEvent('variant:change', {\n          detail: {\n            variant: variant\n          }\n        }));\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.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 (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 (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 (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      }\n    });\n  \n    return Variants;\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\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: '#CartBubble',\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 countEl = document.querySelector('.cart-link__bubble-num');\n  \n        if (countEl) {\n          countEl.innerText = count;\n        }\n  \n        // show/hide bubble\n        if (count > 0) {\n          document.querySelector(selectors.cartBubble).classList.add('cart-link__bubble--visible');\n        } else {\n          document.querySelector(selectors.cartBubble).classList.remove('cart-link__bubble--visible');\n        }\n      }\n    });\n  \n    return CartForm;\n  })();\n  \n  theme.collapsibles = (function() {\n    var selectors = {\n      trigger: '.collapsible-trigger',\n      module: '.collapsible-content',\n      moduleInner: '.collapsible-content__inner'\n    };\n  \n    var classes = {\n      hide: 'hide',\n      open: 'is-open',\n      autoHeight: 'collapsible--auto-height'\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 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 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 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        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.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  theme.parallaxSections = {};\n  \n  theme.Parallax = (function() {\n    var speed = 0.85;\n    var reset = false;\n  \n    function parallax(container, args) {\n      this.isInit = false;\n      this.isVisible = false;\n      this.container = container;\n      this.image = container.querySelector('.parallax-image');\n      this.namespace = args.namespace;\n      this.desktopOnly = args.desktopOnly;\n  \n      if (!this.container || !this.image) {\n        return;\n      }\n  \n      // If set for desktop only, setup listeners for disabling\n      // on mobile and re-enabling on desktop\n      if (this.desktopOnly) {\n        document.addEventListener('matchSmall', function() {\n          this.destroy();\n        }.bind(this));\n  \n        document.addEventListener('unmatchSmall', function() {\n          this.init(true);\n        }.bind(this));\n      }\n  \n      this.init(this.desktopOnly);\n    }\n  \n    parallax.prototype = Object.assign({}, parallax.prototype, {\n      init: function(desktopOnly) {\n        // Reset in case initialized again\n        if (this.isInit) {\n          this.destroy();\n        }\n  \n        this.isInit = true;\n  \n        // Do not setup scroll event if on mobile\n        if (desktopOnly && theme.config.bpSmall) {\n          return;\n        }\n  \n        // Set position on page load\n        this.setSizes();\n        this.scrollHandler();\n  \n        var observer = new IntersectionObserver((entries, observer) => {\n          entries.forEach(entry => {\n            this.isVisible = entry.isIntersecting;\n            if (this.isVisible) {\n              window.on('scroll' + this.namespace, this.onScroll.bind(this));\n            } else {\n              window.off('scroll' + this.namespace);\n            }\n          });\n        }, {rootMargin: '200px 0px 200px 0px'});\n  \n        observer.observe(this.container);\n  \n        window.on('resize' + this.namespace, theme.utils.debounce(250, this.setSizes.bind(this)));\n  \n        document.addEventListener('shopify:section:reorder', theme.utils.debounce(250, this.onReorder.bind(this)));\n      },\n  \n      onScroll: function() {\n        if (!this.isVisible) {\n          return;\n        }\n  \n        // If a scroll event finds Shopify's review app,\n        // update parallax scroll positions because of page reflows\n        if (window.SPR && !reset) {\n          this.setSizes();\n          reset = true;\n        }\n  \n        requestAnimationFrame(this.scrollHandler.bind(this));\n      },\n  \n      scrollHandler: function() {\n        var shiftDistance = (window.scrollY - this.elTop) * speed;\n        this.image.style.transform = 'translate3d(0, ' + shiftDistance + 'px, 0)';\n      },\n  \n      setSizes: function() {\n        var rect = this.container.getBoundingClientRect();\n        this.elTop = rect.top + window.scrollY;\n      },\n  \n      onReorder: function() {\n        this.setSizes();\n        this.onScroll();\n      },\n  \n      destroy: function() {\n        this.image.style.transform = 'none';\n        window.off('scroll' + this.namespace);\n        window.off('resize' + this.namespace);\n      }\n    });\n  \n    return parallax;\n  })();\n  \n  theme.AjaxProduct = (function() {\n    var status = {\n      loading: false\n    };\n  \n    function ProductForm(form, submit) {\n      this.form = form;\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        }.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  \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    });\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      fade: false,\n      initialIndex: 0,\n      pageDots: false,\n      pauseAutoPlayOnHover: false,\n      prevNextButtons: false,\n      rightToLeft: theme.config.rtl,\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();\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        this.slideshow.destroy();\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.classList.remove(classes.isActive);\n        });\n  \n        var el = this.childNavLinks[index];\n        el.classList.add(classes.isActive);\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 variants and disable unavailable\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.variantSelectors = args.variantSelectors;\n      this.variantsObject = args.variantsObject;\n      this.currentVariantObject = args.currentVariantObject;\n      this.form = args.form;\n  \n      this.init();\n    }\n  \n    availability.prototype = Object.assign({}, availability.prototype, {\n      init: function() {\n        this.variantSelectors.forEach(el => {\n          el.on('change', this.setAvailability.bind(this))\n        });\n  \n        // Set default state based on current selected variant\n        this.setAvailability(null, this.currentVariantObject);\n      },\n  \n      setAvailability: function(evt, variant) {\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        var valuesToManage = {\n          option1: [],\n          option2: [],\n          option3: []\n        };\n  \n        var ignoreIndex = null;\n        var variants;\n        // If working with an event, get variants to loop through\n        // based on the group index of recently selected option.\n        // If variant object passed explicitly (on load), get variants\n        // that overlap with all potential combinations\n        if (evt) {\n          var el = evt.currentTarget;\n          var val = el.value;\n          var index = el.dataset.index;\n          variants = this.variantsObject.filter(function(el) {\n            return el[index] === val;\n          });\n        } else {\n          var availableVariants = this.variantsObject.filter(function(el) {\n            if (variant.id === el.id) {\n              return false;\n            }\n  \n            if (variant.option2 === el.option2 && variant.option3 === el.option3) {\n              return true;\n            }\n  \n            if (variant.option1 === el.option1 && variant.option3 === el.option3) {\n              return true;\n            }\n  \n            if (variant.option1 === el.option1 && variant.option2 === el.option2) {\n              return true;\n            }\n          });\n  \n          // IE11 can't handle shortform of {variant} so extra step is needed\n          var variantObject = {\n            variant: variant\n          };\n  \n          variants = Object.assign({}, variantObject, availableVariants);\n        }\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.form.querySelectorAll('.variant-input-wrap').forEach(group => {\n          var groupIndex = group.dataset.index;\n          if (evt && groupIndex === index) {\n            ignoreIndex = index;\n            return;\n          }\n  \n          this.disableVariantGroup(group);\n        });\n  \n        // Loop through each available variant to gather variant values\n        for (var property in variants) {\n          if (variants.hasOwnProperty(property)) {\n            var item = variants[property];\n            var value1 = item.option1;\n            var value2 = item.option2;\n            var value3 = item.option3;\n            var soldOut = item.available === false;\n  \n            if (value1 && ignoreIndex !== 'option1') {\n              valuesToManage.option1.push({\n                value: value1,\n                soldOut: soldOut\n              });\n            }\n            if (value2 && ignoreIndex !== 'option2') {\n              valuesToManage.option2.push({\n                value: value2,\n                soldOut: soldOut\n              });\n            }\n            if (value3 && ignoreIndex !== 'option3') {\n              valuesToManage.option3.push({\n                value: value3,\n                soldOut: soldOut\n              });\n            }\n          }\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);\n        }\n      },\n  \n      manageOptionState: function(option, values) {\n        var group = this.form.querySelector('.variant-input-wrap[data-index=\"'+ option +'\"]');\n  \n        // Loop through each option value\n        values.forEach(obj => {\n          this.enableVariantOption(group, obj);\n        });\n      },\n  \n      enableVariantOptionByValue: function(array, index) {\n        var group = this.form.querySelector('.variant-input-wrap[data-index=\"'+ index +'\"]');\n  \n        for (var i = 0; i < array.length; i++) {\n          this.enableVariantOption(group, array[i]);\n        }\n      },\n  \n      enableVariantOption: function(group, obj) {\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      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  theme.announcementBar = (function() {\n    var args = {\n      autoPlay: 5000,\n      avoidReflow: true,\n      cellAlign: theme.config.rtl ? 'right' : 'left',\n      fade: true\n    };\n    var bar;\n    var flickity;\n  \n    function init() {\n      bar = document.getElementById('AnnouncementSlider');\n      if (!bar) {\n        return;\n      }\n  \n      unload();\n  \n      if (bar.dataset.blockCount === 1) {\n        return;\n      }\n  \n      flickity = new theme.Slideshow(bar, args);\n    }\n  \n    // Go to slide if selected in the editor\n    function onBlockSelect(id) {\n      var slide = bar.querySelector('#AnnouncementSlide-' + id);\n      var index = parseInt(slide.dataset.index);\n  \n      if (flickity && typeof flickity.pause === 'function') {\n        flickity.goToSlide(index);\n        flickity.pause();\n      }\n    }\n  \n    function onBlockDeselect() {\n      if (flickity && typeof flickity.play === 'function') {\n        flickity.play();\n      }\n    }\n  \n    function unload() {\n      if (flickity && typeof flickity.destroy === 'function') {\n        flickity.destroy();\n      }\n    }\n  \n    return {\n      init: init,\n      onBlockSelect: onBlockSelect,\n      onBlockDeselect: onBlockDeselect,\n      unload: unload\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.querySelector('.address-new-toggle').addEventListener('click', function() {\n        newAddressForm.classList.toggle('hide');\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.headerNav = (function() {\n    var selectors = {\n      wrapper: '#HeaderWrapper',\n      siteHeader: '#SiteHeader',\n      logo: '#LogoContainer img',\n      megamenu: '.megamenu',\n      navigation: '.site-navigation',\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      triggerCollapsedMenu: '.site-nav__compress-menu',\n      collapsedMenu: '[data-type=\"nav\"]',\n      bottomSearch: '[data-type=\"search\"]'\n    };\n  \n    var classes = {\n      hasDropdownClass: 'site-nav--has-dropdown',\n      hasSubDropdownClass: 'site-nav__deep-dropdown-trigger',\n      dropdownActive: 'is-focused',\n      headerCompressed: 'header-wrapper--compressed',\n      overlay: 'header-wrapper--overlay',\n      overlayStyle: 'is-light'\n    };\n  \n    var config = {\n      namespace: '.siteNav',\n      wrapperOverlayed: false,\n      stickyEnabled: false,\n      stickyActive: false,\n      subarPositionInit: false,\n      threshold: 0\n    };\n  \n    // Elements used in resize functions, defined in init\n    var wrapper;\n    var siteHeader;\n    var bottomNav;\n    var bottomSearch;\n  \n    function init() {\n      wrapper = document.querySelector(selectors.wrapper);\n      siteHeader = document.querySelector(selectors.siteHeader);\n      bottomNav = wrapper.querySelector(selectors.collapsedMenu);\n      bottomSearch = wrapper.querySelector(selectors.bottomSearch);\n  \n      // Trigger collapsed state at top of header\n      config.threshold = wrapper.getBoundingClientRect().top;\n  \n      config.subarPositionInit = false;\n      config.stickyEnabled = (siteHeader.dataset.sticky === 'true');\n      if (config.stickyEnabled) {\n        config.wrapperOverlayed = wrapper.classList.contains(classes.overlayStyle);\n        stickyHeaderCheck();\n      } else {\n        disableSticky();\n      }\n  \n      theme.settings.overlayHeader = (siteHeader.dataset.overlay === 'true');\n      // Disable overlay header if on collection template with no collection image\n      if (theme.settings.overlayHeader && Shopify && Shopify.designMode) {\n        if (document.body.classList.contains('template-collection') && !document.querySelector('.collection-hero')) {\n          this.disableOverlayHeader();\n        }\n      }\n  \n      // Position menu and search bars absolutely, offsetting their height\n      // with an invisible div to prevent reflows\n      setAbsoluteBottom();\n      window.on('resize' + config.namespace, theme.utils.debounce(250, setAbsoluteBottom));\n  \n      var collapsedNavTrigger = wrapper.querySelector(selectors.triggerCollapsedMenu);\n      if (collapsedNavTrigger) {\n        collapsedNavTrigger.on('click', function() {\n          collapsedNavTrigger.classList.toggle('is-active');\n          theme.utils.prepareTransition(bottomNav, function() {\n            bottomNav.classList.toggle('is-active');;\n          });\n        });\n      }\n  \n      accessibleDropdowns();\n  \n      var navigation = siteHeader.querySelector(selectors.navigation);\n      if (navigation.querySelectorAll('.grid-product')) {\n        new theme.QuickAdd(navigation);\n        new theme.QuickShop(navigation);\n      }\n  \n      window.on('load' + config.namespace, resizeLogo);\n      window.on('resize' + config.namespace, theme.utils.debounce(150, resizeLogo));\n    }\n  \n    // Measure sub menu bar, set site header's bottom padding to it.\n    // Set sub bars as absolute to avoid page jumping on collapsed state change.\n    function setAbsoluteBottom() {\n      if (theme.settings.overlayHeader) {\n        document.querySelector('.header-section').classList.add('header-section--overlay')\n      }\n  \n      var activeSubBar = theme.config.bpSmall ?\n                          document.querySelector('.site-header__element--sub[data-type=\"search\"]') :\n                          document.querySelector('.site-header__element--sub[data-type=\"nav\"]');\n  \n      if (activeSubBar) {\n        var h = activeSubBar.offsetHeight;\n        // If height is 0, it was measured when hidden so ignore it.\n        // Very likely it's on mobile when the address bar is being\n        // hidden and triggers a resize\n        if (h !== 0) {\n          document.documentElement.style.setProperty('--header-padding-bottom', h + 'px');\n        }\n  \n        // If not setup before, set active class on wrapper so subbars become absolute\n        if (!config.subarPositionInit) {\n          wrapper.classList.add('header-wrapper--init');\n          config.subarPositionInit = true;\n        }\n      }\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, classes.overlayStyle);\n      config.wrapperOverlayed = false;\n      theme.settings.overlayHeader = false;\n    }\n  \n    function stickyHeaderCheck() {\n      // Disable sticky header if any mega menu is taller than window\n      theme.config.stickyHeader = doesMegaMenuFit();\n  \n      if (theme.config.stickyHeader) {\n        config.forceStopSticky = false;\n        stickyHeader();\n      } else {\n        config.forceStopSticky = true;\n        disableSticky();\n      }\n    }\n  \n    function disableSticky() {\n      document.querySelector('.header-section').style.position = 'relative';\n    }\n  \n    function removeOverlayClass() {\n      if (config.wrapperOverlayed) {\n        wrapper.classList.remove(classes.overlayStyle);\n      }\n    }\n  \n    function doesMegaMenuFit() {\n      var largestMegaNav = 0;\n      siteHeader.querySelectorAll(selectors.megamenu).forEach(nav => {\n        var h = nav.offsetHeight;\n        if (h > largestMegaNav) {\n          largestMegaNav = h;\n        }\n      });\n  \n      // 120 ~ space of visible header when megamenu open\n      if (window.innerHeight < (largestMegaNav + 120)) {\n        return false;\n      }\n  \n      return true;\n    }\n  \n    function stickyHeader() {\n      if (window.scrollY > config.threshold) {\n        stickyHeaderScroll();\n      }\n  \n      window.on('scroll' + config.namespace, stickyHeaderScroll);\n    }\n  \n    function stickyHeaderScroll() {\n      if (!config.stickyEnabled) {\n        return;\n      }\n  \n      if (config.forceStopSticky) {\n        return;\n      }\n  \n      requestAnimationFrame(scrollHandler);\n    }\n  \n    function scrollHandler() {\n      if (window.scrollY > config.threshold) {\n        if (config.stickyActive) {\n          return;\n        }\n  \n        if (bottomNav) {\n          theme.utils.prepareTransition(bottomNav);\n        }\n        if (bottomSearch) {\n          theme.utils.prepareTransition(bottomSearch);\n        }\n  \n        config.stickyActive = true;\n  \n        wrapper.classList.add(classes.headerCompressed);\n  \n        if (config.wrapperOverlayed) {\n          wrapper.classList.remove(classes.overlayStyle);\n        }\n  \n        document.dispatchEvent(new CustomEvent('headerStickyChange'));\n      } else {\n        if (!config.stickyActive) {\n          return;\n        }\n  \n        if (bottomNav) {\n          theme.utils.prepareTransition(bottomNav);\n        }\n        if (bottomSearch) {\n          theme.utils.prepareTransition(bottomSearch);\n        }\n  \n        config.stickyActive = false;\n  \n        // Update threshold in case page was loaded down the screen\n        config.threshold = wrapper.getBoundingClientRect().top;\n  \n        wrapper.classList.remove(classes.headerCompressed);\n  \n        if (config.wrapperOverlayed) {\n          wrapper.classList.add(classes.overlayStyle);\n        }\n  \n        document.dispatchEvent(new CustomEvent('headerStickyChange'));\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 resizeLogo(evt) {\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    return {\n      init: init,\n      removeOverlayClass: removeOverlayClass,\n      disableOverlayHeader: disableOverlayHeader\n    };\n  })();\n  \n  /*============================================================================\n    MobileNav has two uses:\n    - Dropdown from header on small screens\n    - Duplicated into footer, initialized as separate entity in theme.HeaderSection\n  ==============================================================================*/\n  theme.MobileNav = (function() {\n    var selectors = {\n      wrapper: '.slide-nav__wrapper',\n      nav: '.slide-nav',\n      childList: '.slide-nav__dropdown',\n      allLinks: 'a.slide-nav__link',\n      subNavToggleBtn: '.js-toggle-submenu',\n  \n      // Trigger to open header nav\n      openBtn: '.mobile-nav-trigger'\n    };\n  \n    var classes = {\n      isActive: 'is-active'\n    };\n  \n    var defaults = {\n      isOpen: false,\n      menuLevel: 1,\n      inHeader: false\n    };\n  \n    function MobileNav(args) {\n      this.config = Object.assign({}, defaults, args);\n      this.namespace = '.nav-header-' + args.id;\n  \n      this.container = document.getElementById(this.config.id);\n      if (!this.container) {\n        return;\n      }\n  \n      this.wrapper = this.container.querySelector(selectors.wrapper);\n      if (!this.wrapper) {\n        return;\n      }\n      this.nav = this.wrapper.querySelector(selectors.nav);\n      this.openTriggers = document.querySelectorAll(selectors.openBtn);\n  \n      this.init();\n    }\n  \n    MobileNav.prototype = Object.assign({}, MobileNav.prototype, {\n      init: function() {\n        // Open/close mobile nav\n        if (this.openTriggers.length) {\n          this.openTriggers.forEach(btn => {\n            btn.addEventListener('click', function() {\n              if (this.config.isOpen) {\n                this.close();\n              } else {\n                this.open();\n              }\n            }.bind(this));\n          });\n        }\n  \n        // Toggle between menu levels\n        this.nav.querySelectorAll(selectors.subNavToggleBtn).forEach(btn => {\n          btn.addEventListener('click', this.toggleSubNav.bind(this));\n        });\n  \n        // Close nav when a normal link is clicked\n        this.nav.querySelectorAll(selectors.allLinks).forEach(link => {\n          link.addEventListener('click', this.close.bind(this));\n        });\n  \n        if (this.inHeader) {\n          document.addEventListener('unmatchSmall', function() {\n            this.close(null, true);\n          }.bind(this));\n  \n          document.addEventListener('CartDrawer:open', this.close.bind(this));\n  \n          // Dev-friendly way to open/close mobile nav\n          document.addEventListener('mobileNav:open', this.open.bind(this));\n          document.addEventListener('mobileNav:close', this.close.bind(this));\n        }\n      },\n  \n      /*============================================================================\n        Open/close mobile nav drawer in header\n      ==============================================================================*/\n      open: function(evt) {\n        if (evt) {\n          evt.preventDefault();\n        }\n  \n        theme.sizeDrawer();\n  \n        this.openTriggers.forEach(btn => {\n          btn.classList.add('is-active');\n        });\n  \n        theme.utils.prepareTransition(this.container, function() {\n          this.container.classList.add('is-active');\n        }.bind(this));\n  \n        // Esc closes cart popup\n        window.on('keyup' + this.namespace, function(evt) {\n          if (evt.keyCode === 27) {\n            this.close();\n          }\n        }.bind(this));\n  \n        theme.headerNav.removeOverlayClass();\n  \n        document.documentElement.classList.add('mobile-nav-open');\n        document.dispatchEvent(new CustomEvent('MobileNav:open'));\n  \n        this.config.isOpen = true;\n  \n        // Clicking out of menu closes it. Timeout to prevent immediate bubbling\n        setTimeout(function() {\n          window.on('click' + this.namespace, function(evt) {\n            this.close(evt)\n          }.bind(this));\n        }.bind(this), 0);\n      },\n  \n      close: function(evt, noAnimate) {\n        var forceClose = false;\n        // Do not close if click event came from inside drawer,\n        // unless it is a normal link with no children\n        if (evt && evt.target.closest && evt.target.closest('.site-header__drawer')) {\n  \n          // If normal link, continue to close drawer\n          if (evt.currentTarget && evt.currentTarget.classList) {\n            if (evt.currentTarget.classList.contains('slide-nav__link')) {\n              forceClose = true;\n            }\n          }\n  \n          if (!forceClose) {\n            return;\n          }\n        }\n  \n        this.openTriggers.forEach(btn => {\n          btn.classList.remove('is-active');\n        });\n  \n        if (noAnimate) {\n          this.container.classList.remove('is-active');\n        } else {\n          theme.utils.prepareTransition(this.container, function() {\n            this.container.classList.remove('is-active');\n          }.bind(this));\n        }\n  \n        document.documentElement.classList.remove('mobile-nav-open');\n        document.dispatchEvent(new CustomEvent('MobileNav:close'));\n  \n        window.off('keyup' + this.namespace);\n        window.off('click' + this.namespace);\n  \n        this.config.isOpen = false;\n      },\n  \n      /*============================================================================\n        Handle switching between nav levels\n      ==============================================================================*/\n      toggleSubNav: function(evt) {\n        var btn = evt.currentTarget;\n        this.goToSubnav(btn.dataset.target);\n      },\n  \n      // If a level is sent we are going up, so target list doesn't matter\n      goToSubnav: function(target) {\n        // Activate new list if a target is passed\n        var targetMenu = this.nav.querySelector(selectors.childList + '[data-parent=\"'+ target +'\"]')\n        if (targetMenu) {\n          this.config.menuLevel = targetMenu.dataset.level;\n  \n          // Hide all level 3 menus if going to level 2\n          if (this.config.menuLevel == 2) {\n            this.nav.querySelectorAll(selectors.childList + '[data-level=\"3\"]').forEach(list => {\n              list.classList.remove(classes.isActive);\n            });\n          }\n  \n          targetMenu.classList.add(classes.isActive);\n          this.setWrapperHeight(targetMenu.offsetHeight);\n        } else {\n          // Going to top level, reset\n          this.config.menuLevel = 1;\n          this.wrapper.removeAttribute('style');\n          this.nav.querySelectorAll(selectors.childList).forEach(list => {\n            list.classList.remove(classes.isActive);\n          });\n        }\n  \n        this.wrapper.dataset.level = this.config.menuLevel;\n      },\n  \n      setWrapperHeight: function(h) {\n        this.wrapper.style.height = h + 'px';\n      }\n    });\n  \n    return MobileNav;\n  })();\n  \n  window.onpageshow = function(evt) {\n    if (evt.persisted) {\n      document.querySelectorAll('.cart__checkout').forEach(el => {\n        el.classList.remove('btn--loading');\n      });\n    }\n  };\n  \n  theme.headerSearch = (function() {\n    var currentString = '';\n    var isLoading = false;\n    var searchTimeout;\n  \n    var selectors = {\n      form: '.site-header__search-form',\n      input: 'input[type=\"search\"]',\n  \n      searchInlineContainer: '.site-header__search-container',\n      searchInlineBtn: '.js-search-header',\n  \n      searchButton: '[data-predictive-search-button]',\n      closeSearch: '.site-header__search-btn--cancel',\n  \n      wrapper: '#SearchResultsWrapper',\n      topSearched: '#TopSearched',\n      predictiveWrapper: '#PredictiveWrapper',\n      resultDiv: '#PredictiveResults'\n    };\n  \n    var cache = {};\n    var activeForm;\n  \n    var classes = {\n      isActive: 'predicitive-active'\n    };\n  \n    var config = {\n      namespace: '.search',\n      topSearched: false,\n      predictiveSearch: false,\n      imageSize: 'square'\n    };\n  \n    var keys = {\n      esc: 27,\n      up_arrow: 38,\n      down_arrow: 40,\n      tab: 9\n    };\n  \n    function init() {\n      initInlineSearch();\n  \n      cache.wrapper = document.querySelector(selectors.wrapper);\n      if (!cache.wrapper) {\n        return;\n      }\n  \n      cache.topSearched = document.querySelector(selectors.topSearched);\n      if (cache.topSearched) {\n        config.topSearched = true;\n      }\n  \n      if (theme.settings.predictiveSearch) {\n        // Only some languages support predictive search\n        if (document.getElementById('shopify-features')) {\n          var supportedShopifyFeatures = JSON.parse(document.getElementById('shopify-features').innerHTML);\n          if (supportedShopifyFeatures.predictiveSearch) {\n            config.predictiveSearch = true;\n          }\n        }\n      }\n  \n      if (config.predictiveSearch) {\n        cache.predictiveWrapper = document.querySelector(selectors.predictiveWrapper);\n        config.imageSize = cache.predictiveWrapper.dataset.imageSize;\n        cache.results = document.querySelector(selectors.resultDiv);\n        cache.submit = cache.predictiveWrapper.querySelector(selectors.searchButton);\n        cache.submit.on('click' + config.namespace, triggerSearch);\n      }\n  \n      document.querySelectorAll(selectors.form).forEach(form => {\n        initForm(form);\n      });\n    }\n  \n    function initForm(form) {\n      form.setAttribute('autocomplete', 'off');\n      form.on('submit' + config.namespace, submitSearch);\n  \n      var input = form.querySelector(selectors.input);\n      input.on('focus' + config.namespace, handleFocus);\n      if (config.predictiveSearch) {\n        input.on('keyup' + config.namespace, handleKeyup);\n      }\n    }\n  \n    function reset() {\n      if (config.predictiveSearch) {\n        cache.predictiveWrapper.classList.add('hide');\n        cache.results.innerHTML = '';\n        clearTimeout(searchTimeout);\n      }\n  \n      if (config.topSearched) {\n        cache.topSearched.classList.remove('hide');\n      } else {\n        cache.wrapper.classList.add('hide');\n      }\n    }\n  \n    function close(evt) {\n      // If close button is clicked, close as expected.\n      // Otherwise, ignore clicks in search results, search form, or container elements\n      if (evt && evt.target.closest) {\n        if (evt.target.closest(selectors.closeSearch)) {\n        } else {\n          if (evt.target.closest('.site-header__search-form')) {\n            return;\n          } else if (evt.target.closest('.site-header__element--sub')) {\n            return;\n          } else if (evt.target.closest('#SearchResultsWrapper')) {\n            return;\n          } else if (evt.target.closest('.site-header__search-container')) {\n            return;\n          }\n        }\n      }\n  \n      // deselect any focused form elements\n      document.activeElement.blur();\n  \n      cache.wrapper.classList.add('hide');\n  \n      if (config.topSearched) {\n        cache.topSearched.classList.remove('hide');\n      }\n  \n      if (config.predictiveSearch) {\n        cache.predictiveWrapper.classList.add('hide');\n        clearTimeout(searchTimeout);\n      }\n  \n      if (cache.inlineSearchContainer) {\n        cache.inlineSearchContainer.classList.remove('is-active');\n      }\n  \n      document.querySelectorAll(selectors.form).forEach(form => {\n        form.classList.remove('is-active');\n      });\n  \n      window.off('click' + config.namespace);\n    }\n  \n    function initInlineSearch() {\n      cache.inlineSearchContainer = document.querySelector(selectors.searchInlineContainer);\n      document.querySelectorAll(selectors.searchInlineBtn).forEach(btn => {\n        btn.addEventListener('click', openInlineSearch);\n      });\n    }\n  \n    function openInlineSearch(evt) {\n      evt.preventDefault();\n      evt.stopImmediatePropagation();\n      var container = document.querySelector(selectors.searchInlineContainer);\n      container.classList.add('is-active');\n      container.querySelector('.site-header__search-input').focus();\n  \n      enableCloseListeners();\n    }\n  \n    function triggerSearch() {\n      if (activeForm) {\n        activeForm.submit();\n      }\n    }\n  \n    // Append * wildcard to search\n    function submitSearch(evt) {\n      evt.preventDefault ? evt.preventDefault() : evt.returnValue = false;\n  \n      var obj = {};\n      var formData = new FormData(evt.target);\n      for (var key of formData.keys()) {\n        obj[key] = formData.get(key);\n      }\n  \n      if (obj.q) {\n        obj.q += '*';\n      }\n  \n      var params = paramUrl(obj);\n  \n      window.location.href = '/search?' + params;\n      return false;\n    }\n  \n    function handleKeyup(evt) {\n      activeForm = evt.currentTarget.closest('form');\n  \n      if (evt.keyCode === keys.up_arrow) {\n        return;\n      }\n  \n      if (evt.keyCode === keys.down_arrow) {\n        return;\n      }\n  \n      if (evt.keyCode === keys.tab) {\n        return;\n      }\n  \n      if (evt.keyCode === keys.esc) {\n        close();\n        return;\n      }\n  \n      search(evt.currentTarget);\n    }\n  \n    function handleFocus(evt) {\n      evt.currentTarget.parentNode.classList.add('is-active');\n      if (config.topSearched) {\n        cache.wrapper.classList.remove('hide');\n      }\n  \n      enableCloseListeners();\n    }\n  \n    function enableCloseListeners() {\n      // Clicking out of search area closes it. Timeout to prevent immediate bubbling\n      setTimeout(function() {\n        window.on('click' + config.namespace, function(evt) {\n          close(evt);\n        });\n      }, 0);\n  \n      // Esc key also closes search\n      window.on('keyup', function(evt) {\n        if (evt.keyCode === 27) {\n          close();\n        }\n      });\n    }\n  \n    function search(input) {\n      var keyword = input.value;\n  \n      if (keyword === '') {\n        reset();\n        return;\n      }\n  \n      var q = _normalizeQuery(keyword);\n  \n      clearTimeout(searchTimeout);\n      searchTimeout = setTimeout(\n        function () {\n          predictQuery(q);\n        }.bind(this),\n        500\n      );\n    }\n  \n    function predictQuery(q) {\n      if (isLoading) {\n        return;\n      }\n  \n      // Do not re-search the same thing\n      if (currentString === q) {\n        return;\n      }\n  \n      currentString = q;\n      isLoading = true;\n  \n      var searchObj = {\n        'q': q,\n        'resources[type]': theme.settings.predictiveSearchType,\n        'resources[limit]': 4,\n        'resources[options][unavailable_products]': 'last',\n        'resources[options][fields]': 'title,product_type,variants.title,vendor'\n      };\n  \n      var params = paramUrl(searchObj);\n  \n      fetch('/search/suggest.json?' + params)\n      .then(response => response.json())\n      .then(suggestions => {\n        isLoading = false;\n        var data = {};\n        var resultCount = 0;\n  \n        if (cache.topSearched) {\n          cache.topSearched.classList.add('hide');\n        }\n        cache.predictiveWrapper.classList.remove('hide');\n        var resultTypes = Object.entries(suggestions.resources.results);\n  \n        Object.keys(resultTypes).forEach(function (i) {\n          var obj = resultTypes[i];\n          var type = obj[0];\n          var results = obj[1];\n          resultCount += results.length;\n  \n          switch(type) {\n            case 'products':\n              data[type] = buildProducts(results);\n              break;\n            case 'collections':\n              data[type] = buildCollections(results);\n              break;\n            case 'pages':\n              data[type] = buildPages(results);\n              break;\n            case 'articles':\n              data[type] = buildArticles(results);\n              break;\n          }\n        });\n  \n        if (resultCount === 0) {\n          reset();\n          return;\n        }\n  \n        // Build and append result markup\n        var output = buildOutput(data);\n        cache.results.innerHTML = '';\n        cache.results.innerHTML = output;\n  \n        cache.wrapper.classList.remove('hide');\n      });\n    }\n  \n    function buildProducts(results) {\n      var output = '';\n      var products = [];\n  \n      results.forEach(product => {\n        var new_product = {\n          title: product.title,\n          url: product.url,\n          image_responsive_url: theme.Images.lazyloadImagePath(product.image),\n          image_aspect_ratio: product.featured_image.aspect_ratio\n        };\n  \n        products.push(new_product);\n      });\n  \n      if (products.length) {\n        var markup = theme.buildProductGridItem(products, config.imageSize);\n  \n        output = `\n          <div data-type-products>\n            <div class=\"new-grid product-grid\" data-view=\"small\">\n              ${markup}\n            </div>\n          </div>\n        `;\n      }\n  \n      return output;\n    }\n  \n    function buildCollections(collections) {\n      var output = '';\n  \n      if (collections.length) {\n        var markup = theme.buildCollectionItem(collections);\n  \n        output = `\n          <div data-type-collections>\n            <p class=\"h6 predictive__label\">${theme.strings.searchCollections}</p>\n            <ul class=\"no-bullets\">\n              ${markup}\n            </ul>\n          </div>\n        `;\n      }\n  \n      return output;\n    }\n  \n    function buildPages(pages) {\n      var output = '';\n  \n      if (pages.length) {\n        var markup = theme.buildPageItem(pages);\n  \n        output = `\n          <div data-type-pages>\n            <p class=\"h6 predictive__label\">${theme.strings.searchPages}</p>\n            <ul class=\"no-bullets\">\n              ${markup}\n            </ul>\n          </div>\n        `;\n      }\n  \n      return output;\n    }\n  \n    // Overwrite full sized image returned form API\n    // with lazyloading-friendly path\n    function buildArticles(articles) {\n      var output = '';\n  \n      articles.forEach(article => {\n        if (article.image) {\n          article.image = theme.Images.getSizedImageUrl(article.image, '200x200_crop_center');\n        }\n      });\n  \n      if (articles.length) {\n        var markup = theme.buildArticleItem(articles, config.imageSize);\n  \n        output = `\n          <div data-type-articles>\n            <p class=\"h6 predictive__label\">${theme.strings.searchArticles}</p>\n            <div class=\"grid grid--uniform grid--no-gutters\">\n              ${markup}\n            </div>\n          </div>\n        `;\n      }\n  \n      return output;\n    }\n  \n    // Combine all search result markup and print to page\n    function buildOutput(data) {\n      var output = '';\n  \n      if (data.products && data.products !== '') {\n        output += data.products;\n      }\n  \n      if (data.collections && data.collections !== '') {\n        output += data.collections;\n      }\n  \n      if (data.pages && data.pages !== '') {\n        output += data.pages;\n      }\n  \n      if (data.articles && data.articles !== '') {\n        output += data.articles;\n      }\n  \n      return output;\n    }\n  \n    function _normalizeQuery(string) {\n      if (typeof string !== 'string') {\n        return null;\n      }\n  \n      return string\n        .trim()\n        .replace(/\\ /g, '-')\n        .toLowerCase();\n    }\n  \n    function paramUrl(obj) {\n      return Object.keys(obj).map(function(key) {\n        return key + '=' + encodeURIComponent(obj[key]);\n      }).join('&')\n    }\n  \n    return {\n      init: init\n    };\n  })();\n  \n  /*============================================================================\n    HeaderCart\n  ==============================================================================*/\n  theme.HeaderCart = (function() {\n    var selectors = {\n      cartTrigger: '#HeaderCartTrigger',\n      cart: '#HeaderCart',\n  \n      closeBtn: '.js-close-header-cart',\n      noteBtn: '.add-note'\n    };\n  \n    var classes = {\n      hidden: 'hide'\n    };\n  \n    var config = {\n      cartOpen: false,\n      namespace: '.cart-header'\n    };\n  \n    function HeaderCart() {\n      this.wrapper = document.querySelector(selectors.cart);\n      if (!this.wrapper) {\n        return;\n      }\n      this.trigger = document.querySelector(selectors.cartTrigger);\n      this.noteBtn = this.wrapper.querySelector(selectors.noteBtn);\n      this.form = this.wrapper.querySelector('form');\n  \n      // Close header cart\n      document.addEventListener('MobileNav:open', this.close.bind(this));\n      document.addEventListener('modalOpen', this.close.bind(this));\n  \n      this.init();\n    }\n  \n    HeaderCart.prototype = Object.assign({}, HeaderCart.prototype, {\n      init: function() {\n        this.cartForm = new theme.CartForm(this.form);\n        this.quickAdd = new theme.QuickAdd(this.wrapper);\n        this.quickShop = new theme.QuickShop(this.wrapper);\n        this.cartForm.buildCart();\n  \n        this.trigger.on('click', this.open.bind(this));\n  \n        document.querySelectorAll(selectors.closeBtn).forEach(btn => {\n          btn.addEventListener('click', function() {\n            this.close();\n          }.bind(this));\n        });\n  \n        if (this.noteBtn) {\n          this.noteBtn.addEventListener('click', function() {\n            this.noteBtn.classList.toggle('is-active');\n            this.wrapper.querySelector('.cart__note').classList.toggle('hide');\n          }.bind(this));\n        }\n  \n        document.addEventListener('ajaxProduct:added', function(evt) {\n          this.cartForm.buildCart();\n          if (!config.cartOpen) {\n            this.open();\n          }\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(evt) {\n        if (theme.settings.cartType !== 'dropdown') {\n          return;\n        }\n  \n        if (evt) {\n          evt.preventDefault();\n        }\n  \n        theme.sizeDrawer();\n  \n        theme.utils.prepareTransition(this.wrapper, function() {\n          this.wrapper.classList.add('is-active');\n          this.wrapper.scrollTop = 0;\n        }.bind(this));\n  \n        document.documentElement.classList.add('cart-open');\n  \n        theme.a11y.lockMobileScrolling(config.namespace);\n  \n        // Esc closes cart popup\n        window.on('keyup' + config.namespace, function(evt) {\n          if (evt.keyCode === 27) {\n            this.close();\n          }\n        }.bind(this));\n  \n        theme.headerNav.removeOverlayClass();\n  \n        document.dispatchEvent(new CustomEvent('CartDrawer:open'));\n        document.dispatchEvent(new CustomEvent('drawerOpen'));\n  \n        // Clicking out of cart closes it. Timeout to prevent immediate bubbling\n        setTimeout(function() {\n          window.on('click' + config.namespace, function(evt) {\n            this.close(evt)\n          }.bind(this));\n        }.bind(this), 0);\n  \n        config.cartOpen = true;\n      },\n  \n      close: function(evt) {\n        if (theme.settings.cartType !== 'dropdown') {\n          return;\n        }\n  \n        // Do not close if click event came from inside drawer\n        if (evt && evt.target.closest && evt.target.closest('.site-header__cart')) {\n          return;\n        }\n  \n        if (!config.cartOpen) {\n          return;\n        }\n  \n        // If custom event, close without transition\n        if (evt && evt.type === 'MobileNav:open') {\n          this.wrapper.classList.remove('is-active');\n        } else {\n          theme.utils.prepareTransition(this.wrapper, function() {\n            this.wrapper.classList.remove('is-active');\n          }.bind(this));\n        }\n  \n        window.off('keyup' + config.namespace);\n        window.off('click' + config.namespace);\n  \n        theme.a11y.unlockMobileScrolling(config.namespace);\n  \n        document.documentElement.classList.remove('cart-open');\n  \n        config.cartOpen = false;\n      }\n    });\n  \n    return HeaderCart;\n  })();\n  \n  /*============================================================================\n    QuickAdd\n    - Setup quick add buttons/forms on a product grid item\n  ==============================================================================*/\n  theme.QuickAdd = (function() {\n    var selectors = {\n      quickAddBtn: '.js-quick-add-btn',\n      quickAddForm: '.js-quick-add-form',\n      quickAddHolder: '#QuickAddHolder'\n    };\n  \n    var modalInitailized = false;\n    var modal;\n  \n    function QuickAdd(container) {\n      if (!container) {\n        return;\n      }\n  \n      if (!theme.settings.quickAdd) {\n        return;\n      }\n  \n      this.container = container;\n      this.init();\n    }\n  \n    QuickAdd.prototype = Object.assign({}, QuickAdd.prototype, {\n      init: function() {\n        // When a single variant, auto add it to cart\n        var quickAddBtns = this.container.querySelectorAll(selectors.quickAddBtn);\n        if (quickAddBtns) {\n          quickAddBtns.forEach(btn => {\n            btn.addEventListener('click', this.addToCart.bind(this));\n          });\n        }\n  \n        // Button loads form when 1+ variants\n        var quickAddForms = this.container.querySelectorAll(selectors.quickAddForm);\n  \n        if (quickAddForms.length) {\n          this.quickAddHolder = document.querySelector(\n            selectors.quickAddHolder);\n          if (!modalInitailized) {\n            modal = new theme.Modals('QuickAddModal', 'quick-add');\n            modalInitailized = true;\n  \n            // Empty cart form when closed\n            document.addEventListener('modalClose.QuickAddModal', function() {\n              setTimeout(function() {\n                this.quickAddHolder.innerHTML = '';\n              }.bind(this), 350);\n            }.bind(this));\n          }\n  \n          quickAddForms.forEach(btn => {\n            btn.addEventListener('click', this.loadQuickAddForm.bind(this));\n          });\n        }\n      },\n  \n      addToCart: function(evt) {\n        var btn = evt.currentTarget;\n        var visibleBtn = btn.querySelector('.btn');\n        visibleBtn.classList.add('btn--loading');\n        var id = btn.dataset.id;\n  \n        var data = {\n         'items': [{\n          'id': id,\n          'quantity': 1\n          }]\n        };\n  \n        fetch(theme.routes.cartAdd, {\n          method: 'POST',\n          body: JSON.stringify(data),\n          credentials: 'same-origin',\n          headers: {\n            'Content-Type': 'application/json'\n          }\n        })\n        .then(response => response.json())\n        .then(function(data) {\n          if (data.status === 422 || data.status === 'bad_request') {\n          } else {\n            var product = data;\n            document.dispatchEvent(new CustomEvent('ajaxProduct:added', {\n              detail: {\n                product: product,\n                addToCartBtn: btn\n              }\n            }));\n          }\n  \n          visibleBtn.classList.remove('btn--loading');\n        }.bind(this));\n      },\n  \n      loadQuickAddForm: function(evt) {\n        this.quickAddHolder.innerHTML = '';\n  \n        var btn = evt.currentTarget;\n        var gridItem = evt.currentTarget.closest('.grid-product');\n        var handle = gridItem.getAttribute('data-product-handle');\n        var prodId = gridItem.getAttribute('data-product-id');\n  \n        var url = theme.routes.home + '/products/' + handle + '?view=ajax';\n  \n        // remove double `/` in case shop might have /en or language in URL\n        url = url.replace('//', '/');\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 div = doc.querySelector('.product-section[data-product-handle=\"'+handle+'\"]');\n  \n          this.quickAddHolder.append(div);\n  \n          // Register product template inside modal\n          theme.sections.register('product', theme.Product, this.quickAddHolder);\n  \n          window.dispatchEvent(new CustomEvent('quickadd:loaded:' + prodId));\n          \n  \n          modal.open();\n          try{\n            document.querySelectorAll(\".variant-input-wrap .variant__button-label\")[1].click();\n\t        document.querySelectorAll(\".variant-input-wrap .variant__button-label\")[0].click();\n          }catch(e){}\n          \n        }.bind(this));\n      }\n    });\n  \n    return QuickAdd;\n  })();\n  \n  /*============================================================================\n    QuickShop\n    - Setup quick shop modals anywhere a product grid item exists\n    - Duplicate product modals will be condensed down to one workable one\n  ==============================================================================*/\n  theme.QuickShop = (function() {\n    var loadedIds = [];\n    var selectors = {\n      product: '.grid-product',\n      triggers: '.quick-product__btn',\n      modalContainer: '#ProductModals'\n    };\n  \n    function QuickShop(container) {\n      if (!theme.settings.quickView) {\n        return;\n      }\n  \n      this.container = container;\n      this.init();\n    }\n  \n    function getData(el) {\n      return {\n        id: el.dataset.productId,\n        handle: el.dataset.productHandle\n      }\n    }\n  \n    function productMouseover(evt) {\n      var el = evt.currentTarget;\n  \n      // No quick view on mobile breakpoint\n      if (theme.config.bpSmall) {\n        return;\n      }\n  \n      // No product or onboarding content, bail\n      if (!el || !el.dataset.productId) {\n        return;\n      }\n  \n      var data = getData(el);\n      el.removeEventListener('mouseover', productMouseover);\n  \n      preloadProductModal(data);\n    }\n  \n    function preloadProductModal(data) {\n      var modals = document.querySelectorAll('.modal--quick-shop[data-product-id=\"'+data.id+'\"]');\n  \n      if (!modals.length) {\n        return;\n      }\n  \n      // If already loaded, no need to refetch info\n      if (loadedIds.indexOf(data.id) > -1) {\n        removeDuplicateModals(modals);\n        enableTriggers(data);\n      } else {\n        // Move modal to storage element so animations work regardless\n        // of where original markup is. Will also remove duplicates.\n        moveModal(modals);\n  \n        var holder = document.getElementById('QuickShopHolder-' + data.handle);\n        var url = theme.routes.home + '/products/' + data.handle + '?view=modal';\n  \n        // remove double `/` in case shop might have /en or language in URL\n        url = url.replace('//', '/');\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('.product-section[data-product-handle=\"'+data.handle+'\"]');\n  \n          if (!holder) {\n            return;\n          }\n  \n          holder.append(div);\n  \n          // Register product template inside quick view\n          theme.sections.register('product', theme.Product, holder);\n  \n          // Register collapsible elements\n          theme.collapsibles.init();\n  \n          // Register potential video modal links (when video has sound)\n          theme.videoModal();\n  \n          // There may be multiple triggers for the same modal, so enable them all\n          enableTriggers(data);\n        });\n      }\n  \n      // Add ID to global array so we don't double-load\n      loadedIds.push(data.id);\n    }\n  \n    function moveModal(modals) {\n      var el = modals[0];\n      if (!el) {\n        return;\n      }\n  \n      // If we have multiple modals, keep the first and remove all the rest\n      if (modals.length > 1) {\n        modals.forEach(function(m, i) {\n          if (i > 0) {\n            m.remove();\n          }\n        })\n      }\n  \n      var container = document.querySelector(selectors.modalContainer);\n      container.appendChild(el);\n    }\n  \n    // Remove any modal not already in #ProductModals\n    function removeDuplicateModals(modals) {\n      if (modals.length > 1) {\n        modals.forEach(function(m, i) {\n          if (!m.closest('#ProductModals')) {\n            m.remove();\n          }\n        })\n      }\n    }\n  \n    function enableTriggers(data) {\n      // Setup quick view modal\n      var modalId = 'QuickShopModal-' + data.id;\n      var name = 'quick-modal-' + data.id;\n      new theme.Modals(modalId, name);\n  \n      var triggers = document.querySelectorAll(selectors.triggers + '[data-handle=\"'+ data.handle +'\"]');\n  \n      if (!triggers.length) {\n        return;\n      }\n  \n      triggers.forEach(trigger => {\n        trigger.classList.remove('quick-product__btn--not-ready');\n      });\n    }\n  \n    QuickShop.prototype = Object.assign({}, QuickShop.prototype, {\n      init: function() {\n        var products = this.container.querySelectorAll(selectors.product);\n  \n        if (!products.length) {\n          return;\n        }\n  \n        products.forEach(product => {\n          product.addEventListener('mouseover', productMouseover);\n        });\n      }\n    });\n  \n    return QuickShop;\n  })();\n  \n  theme.buildProductGridItem = function(items, imageSize) {\n    var output = '';\n  \n    items.forEach(product => {\n      var image = theme.buildProductImage(product, imageSize);\n      var markup = `\n        <div class=\"grid-item grid-product\">\n          <div class=\"grid-item__content\">\n            <a href=\"${product.url}\" class=\"grid-item__link\">\n              <div class=\"grid-product__image-wrap\">\n                ${image}\n              </div>\n              <div class=\"grid-item__meta\">\n                <div class=\"grid-product__title\">${product.title}</div>\n              </div>\n            </a>\n          </div>\n        </div>\n      `;\n  \n      output += markup;\n    });\n  \n    return output;\n  }\n  \n  theme.buildProductImage = function(product, imageSize) {\n    var size = imageSize ? imageSize : theme.settings.productImageSize;\n    var output = '';\n  \n    if (size === 'natural') {\n      output = `\n        <div class=\"image-wrap\" style=\"height: 0; padding-bottom: ${product.image_aspect_ratio}%;\">\n          <img class=\"grid-product__image lazyload\"\n            data-src=\"${product.image_responsive_url}\"\n            data-widths=\"[180, 360, 540, 720, 900]\"\n            data-aspectratio=\"${product.image_aspect_ratio}\"\n            data-sizes=\"auto\"\n            alt=\"${product.title}\">\n        </div>`;\n    } else {\n      var classes = 'lazyload';\n      if (!theme.settings.productImageCover) {\n        classes += ' grid__image-contain';\n      }\n      output = `\n        <div class=\"grid__image-ratio grid__image-ratio--${size}\">\n          <img class=\"${classes}\"\n              data-src=\"${product.image_responsive_url}\"\n              data-widths=\"[360, 540, 720, 900, 1080]\"\n              data-aspectratio=\"${product.aspect_ratio}\"\n              data-sizes=\"auto\"\n              alt=\"${product.title}\">\n        </div>\n      `;\n    }\n  \n    return output;\n  }\n  \n  theme.buildCollectionItem = function(items) {\n    var output = '';\n  \n    items.forEach(collection => {\n      var markup = `\n        <li>\n          <a href=\"${collection.url}\">\n            ${collection.title}\n          </a>\n        </li>\n      `;\n  \n      output += markup;\n    });\n  \n    return output;\n  }\n  \n  theme.buildPageItem = function(items) {\n    var output = '';\n  \n    items.forEach(page => {\n      var markup = `\n        <li>\n          <a href=\"${page.url}\">\n            ${page.title}\n          </a>\n        </li>\n      `;\n  \n      output += markup;\n    });\n  \n    return output;\n  }\n  \n  theme.buildArticleItem = function(items, imageSize) {\n    var output = '';\n  \n    items.forEach(article => {\n      var image = theme.buildPredictiveImage(article);\n      var markup = `\n        <div class=\"grid__item small--one-half medium-up--one-quarter\">\n          <a href=\"${article.url}\" class=\"grid-item__link grid-item__link--inline\">\n            <div class=\"grid-product__image-wrap\">\n              <div\n                class=\"grid__image-ratio grid__image-ratio--object grid__image-ratio--${imageSize}\">\n                <div class=\"predictive__image-wrap\">\n                  ${image}\n                </div>\n              </div>\n            </div>\n            <div class=\"grid-item__meta\">\n              ${article.title}\n            </div>\n          </a>\n        </div>\n      `;\n  \n      output += markup;\n    });\n  \n    return output;\n  }\n  \n  theme.buildPredictiveImage = function(obj) {\n    var imageMarkup = '';\n    if (obj.image) {\n      imageMarkup = `<img class=\"lazyload\"\n            data-src=\"${obj.image}\"\n            data-widths=\"[360, 540, 720]\"\n            data-sizes=\"auto\">`;\n    }\n    return imageMarkup;\n  }\n  \n  // Observer that adds visible class to animated elements\n  theme.animationObserver = function() {\n    var els = document.querySelectorAll('.animation-contents');\n  \n    els.forEach(el => {\n      var observer = new IntersectionObserver((entries, observer) => {\n        entries.forEach(entry => {\n          if (entry.isIntersecting) {\n            entry.target.classList.add('is-visible')\n            observer.unobserve(entry.target);\n          }\n        });\n      }, {threshold: 1});\n  \n      observer.observe(el);\n    });\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.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      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      // 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      if (container.dataset.hasSlideshow === 'true') {\n        this.inSlideshow = true;\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        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  \n        this.gallery.init();\n        this.gallery.listen('afterChange', this.afterChange.bind(this));\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  \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        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            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.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          this.flickity.play();\n        }\n      }\n    });\n  \n    return SlideshowSection;\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 drawer 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.BackgroundImage = (function() {\n  \n    var selectors = {\n      parallaxContainer: '.parallax-container'\n    };\n  \n    function backgroundImage(container) {\n      this.container = container;\n      if (!container) {\n        return;\n      }\n  \n      var sectionId = container.getAttribute('data-section-id');\n      this.namespace = '.' + sectionId;\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.init.bind(this)\n      });\n    }\n  \n    backgroundImage.prototype = Object.assign({}, backgroundImage.prototype, {\n      init: function() {\n        theme.loadImageSection(this.container);\n  \n        if (this.container.dataset && this.container.dataset.parallax) {\n          var parallaxContainer = this.container.querySelector(selectors.parallaxContainer);\n          var args = {\n            namespace: this.namespace + '-parallax',\n            desktopOnly: true\n          };\n  \n          theme.parallaxSections[this.namespace] = new theme.Parallax(parallaxContainer, args);\n        }\n      },\n  \n      onUnload: function(evt) {\n        if (!this.container) { return }\n        if (theme.parallaxSections[this.namespace] && typeof theme.parallaxSections[this.namespace].destroy === 'function') {\n          theme.parallaxSections[this.namespace].destroy();\n        }\n        delete theme.parallaxSections[this.namespace];\n      }\n    });\n  \n    return backgroundImage;\n  })();\n  \n  theme.CollectionHeader = (function() {\n    var hasLoadedBefore = false;\n  \n    function CollectionHeader(container) {\n      this.namespace = '.collection-header';\n  \n      var heroImageContainer = container.querySelector('.collection-hero');\n      if (heroImageContainer) {\n        if (hasLoadedBefore) {\n          this.checkIfNeedReload();\n        }\n        theme.loadImageSection(heroImageContainer);\n  \n        if (container.dataset && container.dataset.parallax) {\n          var parallaxContainer = container.querySelector('.parallax-container');\n          var args = {\n            namespace: this.namespace + '-parallax'\n          };\n          theme.parallaxSections[this.namespace] = new theme.Parallax(parallaxContainer, args);\n        }\n      } else if (theme.settings.overlayHeader) {\n        theme.headerNav.disableOverlayHeader();\n      }\n  \n      hasLoadedBefore = true;\n    }\n  \n    CollectionHeader.prototype = Object.assign({}, CollectionHeader.prototype, {\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          var header = document.querySelector('.header-wrapper');\n          if (!header.classList.contains('header-wrapper--overlay')) {\n            location.reload();\n          }\n        }\n      },\n  \n      onUnload: function() {\n        if (theme.parallaxSections[this.namespace]) {\n          theme.parallaxSections[this.namespace].destroy();\n          delete theme.parallaxSections[this.namespace];\n        }\n      }\n    });\n  \n    return CollectionHeader;\n  })();\n  \n  theme.CollectionSidebar = (function() {\n    var selectors = {\n      trigger: '.collection-filter__btn',\n      mobileWrapper: '#CollectionInlineFilterWrap',\n      filters: '.filter-wrapper'\n    };\n  \n    var config = {\n      isOpen: false,\n      namespace: '.collection-filters'\n    }\n  \n    function CollectionSidebar(container) {\n      this.container = container;\n  \n      document.addEventListener('filter:selected', this.close.bind(this));\n  \n      this.init();\n    }\n  \n    function getScrollFilterTop() {\n      var scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n      var elTop = document.querySelector('.collection-filter').getBoundingClientRect().top;\n      return elTop + scrollTop;\n    }\n  \n    CollectionSidebar.prototype = Object.assign({}, CollectionSidebar.prototype, {\n      init: function(reinit) {\n        // This function runs on page load, and when the collection section loads\n        // so we need to be mindful of not duplicating event listeners\n        this.trigger = document.querySelector(selectors.trigger);\n        this.wrapper = document.querySelector(selectors.mobileWrapper);\n        this.filters = this.wrapper.querySelector(selectors.filters);\n  \n        if (reinit) {\n          config.isOpen = false;\n          this.trigger.off('click');\n        }\n  \n        this.trigger.on('click', this.toggle.bind(this));\n      },\n  \n      // Collection template will force the sidebar filters to reload when it re-initializes. Make sure we aren't still locking mobile scrolling\n      forceReload: function() {\n        theme.a11y.unlockMobileScrolling(config.namespace);\n        this.init(true);\n      },\n  \n      /*============================================================================\n        Open and close filter drawer\n      ==============================================================================*/\n      toggle: function() {\n        if (config.isOpen) {\n          this.close();\n        } else {\n          this.open();\n        }\n      },\n  \n      open: function() {\n        if (!this.filters) { return }\n  \n        // Scroll to top of filter bar when opened\n        var scrollTo = getScrollFilterTop();\n        window.scrollTo({top: scrollTo, behavior: 'smooth'});\n  \n        this.trigger.classList.add('is-active');\n  \n        theme.utils.prepareTransition(this.filters, function() {\n          this.filters.classList.add('is-active');\n        }.bind(this));\n        config.isOpen = true;\n  \n        theme.a11y.lockMobileScrolling(config.namespace);\n  \n        window.on('keyup' + config.namespace, function(evt) {\n          if (evt.keyCode === 27) {\n            this.close();\n          }\n        }.bind(this));\n      },\n  \n      close: function() {\n        if (!this.filters) { return }\n  \n        this.trigger.classList.remove('is-active');\n  \n        theme.utils.prepareTransition(this.filters, function() {\n          this.filters.classList.remove('is-active');\n        }.bind(this));\n        config.isOpen = false;\n  \n        theme.a11y.unlockMobileScrolling(config.namespace);\n  \n        window.off('keyup' + config.namespace);\n      },\n  \n      onSelect: function() {\n        this.open();\n      },\n  \n      onDeselect: function() {\n        this.close();\n      }\n    });\n  \n    return CollectionSidebar;\n  })();\n  \n  /*============================================================================\n    Collection JS sets up grids of products, even if not\n    on the collection template.\n    When on the collection template, also setup sorting, filters, grid options\n  ==============================================================================*/\n  theme.Collection = (function() {\n    var isAnimating = false;\n  \n    var selectors = {\n      sortSelect: '#SortBy',\n      sortBtn: '.filter-sort',\n  \n      colorSwatchImage: '.grid-product__color-image',\n      colorSwatch: '.color-swatch--with-image',\n  \n      viewChange: '.grid-view-btn',\n      productGrid: '.product-grid',\n  \n      collectionGrid: '.collection-grid__wrapper',\n      sidebar: '#CollectionSidebar',\n      activeTagList: '.tag-list--active-tags',\n      tags: '.tag-list a',\n      filterBar: '.collection-filter',\n  \n      filters: '.filter-wrapper',\n      sidebarWrapper: '#CollectionSidebarFilterWrap',\n      inlineWrapper: '#CollectionInlineFilterWrap'\n    };\n  \n    var config = {\n      isInit: false,\n      combineTags: false,\n      mobileFiltersInPlace: false\n    };\n  \n    var classes = {\n      activeTag: 'tag--active',\n      removeTagParent: 'tag--remove'\n    };\n  \n    function Collection(container) {\n      this.container = container;\n      this.containerId = container.id;\n      this.sectionId = container.getAttribute('data-section-id');\n      this.namespace = '.collection-' + this.sectionId;\n      this.isCollectionTemplate = this.container.dataset.collectionTemplate;\n  \n      this.init(container);\n    }\n  \n    Collection.prototype = Object.assign({}, Collection.prototype, {\n      init: function(container) {\n        // If container not set, section has been reinitialized.\n        // Update this.container to refreshed DOM element\n        if (!container) {\n          this.container = document.getElementById(this.containerId);\n        }\n  \n        if (this.isCollectionTemplate) {\n          this.cloneFiltersOnMobile();\n          this.initSort();\n          this.initFilters();\n          this.initGridOptions();\n  \n          // If re-initialized, also reinit sidebar\n          if (config.isInit) {\n            theme.sections.reinit('collection-sidebar');\n          }\n        }\n  \n        this.quickAdd = new theme.QuickAdd(this.container);\n        this.quickShop = new theme.QuickShop(this.container);\n  \n        this.colorImages = this.container.querySelectorAll(selectors.colorSwatchImage);\n        if (this.colorImages.length) {\n          this.swatches = this.container.querySelectorAll(selectors.colorSwatch);\n          this.colorSwatchHovering();\n        }\n  \n        config.isInit = true;\n      },\n  \n      /*============================================================================\n        Collection sorting\n      ==============================================================================*/\n      initSort: function() {\n        this.sortSelect = document.querySelector(selectors.sortSelect);\n        this.sortBtns = document.querySelectorAll(selectors.sortBtn);\n  \n        if (this.sortSelect || this.sortBtn) {\n          this.initParams();\n        }\n  \n        if (this.sortSelect) {\n          this.defaultSort = this.getDefaultSortValue();\n          this.sortSelect.on('change' + this.namespace, this.onSortChange.bind(this));\n        }\n  \n        if (this.sortBtns.length) {\n          this.sortBtns.forEach(btn => {\n            btn.addEventListener('click', function() {\n              document.dispatchEvent(new Event('filter:selected'));\n              this.queryParams.sort_by = btn.dataset.value;\n              this.goToSortUrl();\n            }.bind(this));\n          });\n        }\n      },\n  \n      initParams: function() {\n        this.queryParams = {};\n  \n        if (location.search.length) {\n          var aKeyValue;\n          var aCouples = location.search.substr(1).split('&');\n          for (var i = 0; i < aCouples.length; i++) {\n            aKeyValue = aCouples[i].split('=');\n            if (aKeyValue.length > 1) {\n              this.queryParams[\n                decodeURIComponent(aKeyValue[0])\n              ] = decodeURIComponent(aKeyValue[1]);\n            }\n          }\n        }\n      },\n  \n      getSortValue: function() {\n        return this.sortSelect.value || this.defaultSort;\n      },\n  \n      getDefaultSortValue: function() {\n        return this.sortSelect.getAttribute('data-default-sortby');\n      },\n  \n      onSortChange: function() {\n        this.queryParams.sort_by = this.getSortValue();\n        this.goToSortUrl();\n      },\n  \n      goToSortUrl: function() {\n        if (this.queryParams.page) {\n          delete this.queryParams.page;\n        }\n  \n        window.location.search = new URLSearchParams(Object.entries(this.queryParams));\n      },\n  \n      /*============================================================================\n        Color swatch hovering\n      ==============================================================================*/\n      colorSwatchHovering: function() {\n        this.swatches.forEach(swatch => {\n          swatch.addEventListener('mouseenter', function() {\n            this.setActiveColorImage(swatch);\n          }.bind(this));\n  \n          swatch.addEventListener('touchstart', function(evt) {\n            evt.preventDefault();\n            this.setActiveColorImage(swatch);\n          }.bind(this), {passive: true});\n        });\n      },\n  \n      setActiveColorImage: function(swatch) {\n        var id = swatch.dataset.variantId;\n        var image = swatch.dataset.variantImage;\n  \n        // Unset all active swatch images\n        this.colorImages.forEach(el => {\n          el.classList.remove('is-active');\n        });\n  \n        // Unset all active swatches\n        this.swatches.forEach(el => {\n          el.classList.remove('is-active');\n        });\n  \n        // Set active image and swatch\n        var imageEl = this.container.querySelector('.grid-product__color-image--' + id);\n        imageEl.style.backgroundImage = 'url(' + image + ')';\n        imageEl.classList.add('is-active');\n        swatch.classList.add('is-active');\n  \n        // Update product grid item href with variant URL\n        var variantUrl = swatch.dataset.url;\n        var gridItem = swatch.closest('.grid-item__link');\n        gridItem.setAttribute('href', variantUrl);\n      },\n  \n      /*============================================================================\n        Grid view options\n      ==============================================================================*/\n      initGridOptions: function() {\n        var grid = this.container.querySelector(selectors.productGrid);\n        var viewBtns = this.container.querySelectorAll(selectors.viewChange);\n        this.container.querySelectorAll(selectors.viewChange).forEach(btn => {\n          btn.addEventListener('click', function() {\n            viewBtns.forEach(el=>{\n              el.classList.remove('is-active');\n            });\n            btn.classList.add('is-active');\n            var newView = btn.dataset.view;\n            grid.dataset.view = newView;\n  \n            // Set as cart attribute so we can access in liquid\n            theme.cart.updateAttribute('product_view', newView);\n  \n            // Trigger resize to update layzloaded images\n            window.dispatchEvent(new Event('resize'));\n          });\n        });\n      },\n  \n      /*====================\n        Collection filters\n      ====================*/\n      initFilters: function() {\n        var tags = document.querySelectorAll(selectors.tags);\n  \n        if (!tags.length) {\n          return;\n        }\n  \n        document.addEventListener('matchSmall', this.cloneFiltersOnMobile.bind(this));\n  \n        // Ajax pagination\n        window.addEventListener('popstate', function(state) {\n          if (state) {\n            this.getNewCollectionContent(location.href);\n          }\n        }.bind(this));\n  \n        // Set mobile top value for filters if sticky header enabled\n        if (theme.config.stickyHeader) {\n          this.setFilterStickyPosition();\n  \n          document.addEventListener('headerStickyChange', theme.utils.debounce(500, this.setFilterStickyPosition));\n          window.on('resize', theme.utils.debounce(500, this.setFilterStickyPosition));\n        }\n  \n        config.combineTags = (document.querySelector(selectors.sidebar).getAttribute('data-combine-tags') == 'true');\n  \n        document.querySelectorAll(selectors.tags).forEach(tag => {\n          tag.addEventListener('click', this.tagClick.bind(this));\n        });\n      },\n  \n      cloneFiltersOnMobile: function() {\n        if (config.mobileFiltersInPlace) {\n          return;\n        }\n  \n        var sidebarWrapper = document.querySelector(selectors.sidebarWrapper);\n        if (!sidebarWrapper) {\n          return;\n        }\n        var filters = sidebarWrapper.querySelector(selectors.filters).cloneNode(true);\n  \n        var inlineWrapper = document.querySelector(selectors.inlineWrapper);\n  \n        inlineWrapper.innerHTML = '';\n        inlineWrapper.append(filters);\n  \n        // Update collapsible JS\n        theme.collapsibles.init(inlineWrapper);\n  \n        config.mobileFiltersInPlace = true;\n      },\n  \n      tagClick: function(evt) {\n        var el = evt.currentTarget;\n  \n        document.dispatchEvent(new Event('filter:selected'));\n  \n        // Do not ajax-load collection links\n        if (el.classList.contains('no-ajax')) {\n          return;\n        }\n  \n        evt.preventDefault();\n        if (isAnimating) {\n          return;\n        }\n  \n        isAnimating = true;\n  \n        var parent = el.parentNode;\n        var newUrl = el.href;\n  \n        if (config.combineTags) {\n          if (parent.classList.contains(classes.activeTag)) {\n            parent.classList.remove(classes.activeTag);\n          } else {\n            parent.classList.add(classes.activeTag);\n  \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              var newTag = document.createElement('li');\n              var newTagLink = document.createElement('a');\n              newTag.classList.add('tag', 'tag--remove');\n              newTagLink.classList.add('btn', 'btn--small');\n              newTagLink.innerText = el.innerText;\n              newTag.appendChild(newTagLink);\n  \n              // Append new tag in both drawer and sidebar\n              document.querySelectorAll(selectors.activeTagList).forEach(list => {\n                list.appendChild(newTag);\n              });\n            }\n          }\n        } else {\n          // Remove active state on all tags, re-add to new one\n          document.querySelectorAll(selectors.tags).forEach(tag => {\n            tag.parentNode.classList.remove(classes.activeTag);\n          });\n          parent.classList.add(classes.activeTag);\n        }\n  \n        this.updateScroll(true);\n  \n        history.pushState({}, '', newUrl);\n        document.querySelector(selectors.collectionGrid).classList.add('unload');\n        this.getNewCollectionContent(newUrl);\n      },\n  \n      getNewCollectionContent: function(url) {\n        url = url.indexOf('?') === -1 ? (url + '?view=ajax') : (url + '&view=ajax');\n  \n        var ajaxContainer = document.getElementById('CollectionAjaxResult');\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  \n          var newContent = doc.getElementById('CollectionAjaxContent');\n  \n          ajaxContainer.innerHTML = '';\n          ajaxContainer.append(newContent);\n  \n          theme.sections.reinit('collection-template');\n          this.updateScroll(false);\n          theme.reinitProductGridItem();\n  \n          isAnimating = false;\n        }.bind(this));\n      },\n  \n      updateScroll: function(animate) {\n        var scrollTo = document.getElementById('CollectionAjaxContent').offsetTop;\n  \n        // Scroll below the sticky header\n        if (theme.config.stickyHeader) {\n          scrollTo = scrollTo - document.querySelector('#SiteHeader').offsetHeight;\n        }\n  \n        if (!theme.config.bpSmall) {\n          scrollTo -= 10;\n        }\n  \n        if (animate) {\n          window.scrollTo({top: scrollTo, behavior: 'smooth'});\n        } else {\n          window.scrollTo({top: scrollTo});\n        }\n      },\n  \n      /*============================================================================\n        Misc collection page helpers\n      ==============================================================================*/\n      setFilterStickyPosition: function() {\n        var headerHeight = document.querySelector('.site-header').offsetHeight - 1;\n        document.querySelector(selectors.filterBar).style.top = headerHeight + 'px';\n  \n        // Also update top position of sticky sidebar\n        var stickySidebar = document.querySelector('.grid__item--sidebar');\n        if (stickySidebar) {\n          stickySidebar.style.top = headerHeight + 30 + 'px';\n        }\n      },\n  \n      forceReload: function() {\n        config.mobileFiltersInPlace = false;\n        this.init();\n      }\n    });\n  \n    return Collection;\n  })();\n  \n  \n  theme.FooterSection = (function() {\n    var selectors = {\n      locale: '[data-disclosure-locale]',\n      currency: '[data-disclosure-currency]'\n    };\n  \n    var ids = {\n      mobileNav: 'MobileNav',\n      footerNavWrap: 'FooterMobileNavWrap',\n      footerNav: 'FooterMobileNav'\n    };\n  \n    function FooterSection(container) {\n      this.container = container;\n  \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        // If on mobile, copy the mobile nav to the footer\n        if (theme.config.bpSmall) {\n          this.initDoubleMobileNav();\n        }\n  \n        // Re-hook up collapsible box triggers\n        theme.collapsibles.init(this.container);\n      },\n  \n      initDoubleMobileNav: function() {\n        var mobileNav = document.getElementById(ids.mobileNav);\n        var footerNav = document.getElementById(ids.footerNav);\n        var clone = mobileNav.cloneNode(true);\n        var navEl = clone.querySelector('.slide-nav__wrapper')\n  \n        // Append cloned nav to footer, initialize JS, then show it\n        footerNav.appendChild(navEl);\n        new theme.MobileNav({\n          id: ids.footerNav,\n          inHeader: false\n        });\n        document.getElementById(ids.footerNavWrap).classList.remove('hide');\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.HeaderSection = (function() {\n    var selectors = {\n      headerFooter: '#MobileNavFooter',\n      footerMenus: '#FooterMenus'\n    };\n  \n    var namespace = '.header';\n  \n    function HeaderSection(container) {\n      this.container = container;\n      this.sectionId = this.container.getAttribute('data-section-id');\n  \n      this.init();\n    }\n  \n    HeaderSection.prototype = Object.assign({}, HeaderSection.prototype, {\n      init: function() {\n        // Reload any slideshow if header is reloaded to make sure\n        // sticky header works as expected\n        // (can be anywhere in 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        theme.headerNav.init();\n        theme.announcementBar.init();\n        theme.headerSearch.init();\n  \n        // Enable header cart drawer when not on cart page\n        if (!document.body.classList.contains('template-cart')) {\n          new theme.HeaderCart();\n        }\n        new theme.MobileNav({\n          id: 'MobileNav',\n          inHeader: true\n        });\n  \n        if (theme.config.bpSmall) {\n          this.cloneFooter();\n        }\n  \n        window.on('resize' + namespace, theme.utils.debounce(300, theme.sizeDrawer));\n      },\n  \n      cloneFooter: function() {\n        var headerFooter = document.querySelector(selectors.headerFooter);\n        var footerMenus = document.querySelector(selectors.footerMenus);\n  \n        var clone = footerMenus.cloneNode(true);\n        clone.id = '';\n  \n        // Append cloned footer menus to mobile nav\n        headerFooter.appendChild(clone);\n  \n        // If localization form, update IDs so they don't match footer\n        var localizationForm = headerFooter.querySelector('.multi-selectors');\n        if (localizationForm) {\n          // Loop disclosure buttons and update ids and aria attributes\n          localizationForm.querySelectorAll('[data-disclosure-toggle]').forEach(el => {\n            var controls = el.getAttribute('aria-controls');\n            var describedby = el.getAttribute('aria-describedby')\n  \n            el.setAttribute('aria-controls', controls + '-header');\n            el.setAttribute('aria-describedby', describedby + '-header');\n  \n            var list = document.getElementById(controls);\n            if (list) {\n              list.id = controls + '-header';\n            }\n  \n            var label = document.getElementById(describedby);\n            if (label) {\n              label.id = describedby + '-header';\n            }\n  \n            // Initialize language/currency selectors\n            var parent = el.parentNode;\n            if (parent) {\n              new theme.Disclosure(parent);\n            }\n          });\n        }\n      },\n  \n      onUnload: function() {\n  \n      }\n    });\n  \n    return HeaderSection;\n  })();\n  \n  theme.Toolbar = (function() {\n  \n    var selectors = {\n      locale: '[data-disclosure-locale]',\n      currency: '[data-disclosure-currency]'\n    };\n  \n    function Toolbar(container) {\n      this.container = container;\n      this.sectionId = this.container.getAttribute('data-section-id');\n  \n      this.init();\n    }\n  \n    Toolbar.prototype = Object.assign({}, Toolbar.prototype, {\n      init: function() {\n        this.initDisclosures();\n        theme.announcementBar.init();\n      },\n  \n      initDisclosures: 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  \n      onBlockSelect: function(evt) {\n        theme.announcementBar.onBlockSelect(evt.detail.blockId);\n      },\n  \n      onBlockDeselect: function() {\n        theme.announcementBar.onBlockDeselect();\n      },\n  \n      onUnload: function() {\n        theme.announcementBar.unload();\n  \n        if (this.localeDisclosure) {\n          this.localeDisclosure.destroy();\n        }\n  \n        if (this.currencyDisclosure) {\n          this.currencyDisclosure.destroy();\n        }\n      }\n    });\n  \n    return Toolbar;\n  })();\n  \n  theme.Product = (function() {\n    var videoObjects = {};\n  \n    var classes = {\n      onSale: 'on-sale',\n      disabled: 'disabled',\n      isModal: 'is-modal',\n      loading: 'loading',\n      loaded: 'loaded',\n      hidden: 'hide',\n      interactable: 'video-interactable',\n      visuallyHide: 'visually-invisible'\n    };\n  \n    var selectors = {\n      productVideo: '.product__video',\n      videoParent: '.product__video-wrapper',\n      slide: '.product-main-slide',\n      currentSlide: '.is-selected',\n      startingSlide: '.starting-slide'\n    };\n  \n    function Product(container) {\n      this.container = container;\n      var sectionId = this.sectionId = container.getAttribute('data-section-id');\n  \n      this.inModal = (container.dataset.modal === 'true');\n      this.modal;\n  \n      this.settings = {\n        enableHistoryState: (container.dataset.history === 'true') || false,\n        namespace: '.product-' + sectionId,\n        inventory: container.dataset.inventory || false,\n        incomingInventory: container.dataset.incomingInventory || false,\n        modalInit: false,\n        hasImages: true,\n        imageSetName: null,\n        imageSetIndex: null,\n        currentImageSet: null,\n        imageSize: '620x',\n        currentSlideIndex: 0,\n        videoLooping: container.dataset.videoLooping\n      };\n  \n      // Overwrite some settings when loaded in modal\n      if (this.inModal) {\n        this.settings.enableHistoryState = false;\n        this.settings.namespace = '.product-' + sectionId + '-modal';\n        this.modal = document.getElementById('QuickShopModal-' + sectionId);\n      }\n  \n      this.selectors = {\n        variantsJson: 'VariantsJson-' + sectionId,\n        currentVariantJson: 'CurrentVariantJson-' + sectionId,\n        form: '#AddToCartForm-' + sectionId,\n  \n        media: '[data-product-media-type-model]',\n        closeMedia: '.product-single__close-media',\n        photoThumbs: '.product__thumb-' + sectionId,\n        thumbSlider: '#ProductThumbs-' + sectionId,\n        thumbScroller: '.product__thumbs--scroller',\n        mainSlider: '#ProductPhotos-' + sectionId,\n        imageContainer: '[data-product-images]',\n        productImageMain: '.product-image-main--' + sectionId,\n  \n        priceWrapper: '.product__price-wrap-' + sectionId,\n        price: '#ProductPrice-' + sectionId,\n        comparePrice: '#ComparePrice-' + sectionId,\n        savePrice: '#SavePrice-' + sectionId,\n        priceA11y: '#PriceA11y-' + sectionId,\n        comparePriceA11y: '#ComparePriceA11y-' + sectionId,\n        unitWrapper: '.product__unit-price-wrapper--' + sectionId,\n        unitPrice: '.product__unit-price--' + sectionId,\n        unitPriceBaseUnit: '.product__unit-base--' + sectionId,\n        sku: '[data-sku]',\n        inventory: 'ProductInventory-' + sectionId,\n        incomingInventory: 'ProductIncomingInventory-' + sectionId,\n  \n        addToCart: 'AddToCart-' + sectionId,\n        addToCartText: 'AddToCartText-' + sectionId,\n  \n        originalSelectorId: '#ProductSelect-' + sectionId,\n        singleOptionSelector: '.variant__input-' + sectionId,\n        variantColorSwatch: '.variant__input--color-swatch-' + sectionId,\n  \n        modalFormHolder: '#ProductFormHolder-' + sectionId,\n        availabilityContainer: '#StoreAvailabilityHolder-' + sectionId\n      };\n  \n      this.cacheElements();\n  \n      this.firstProductImage = this.cache.mainSlider.querySelector('img');\n  \n      if (!this.firstProductImage) {\n        this.settings.hasImages = false;\n      }\n  \n      var dataSetEl = this.cache.mainSlider.querySelector('[data-set-name]');\n      if (dataSetEl) {\n        this.settings.imageSetName = dataSetEl.dataset.setName;\n      }\n  \n      this.init();\n    }\n  \n    Product.prototype = Object.assign({}, Product.prototype, {\n      init: function() {\n        if (this.inModal) {\n          this.container.classList.add(classes.isModal);\n          document.addEventListener('modalOpen.QuickShopModal-' + this.sectionId, this.openModalProduct.bind(this));\n          document.addEventListener('modalClose.QuickShopModal-' + this.sectionId, this.closeModalProduct.bind(this));\n        }\n  \n        if (!this.inModal) {\n          this.formSetup();\n          this.productSetup();\n          this.videoSetup();\n          this.initProductSlider();\n          this.customMediaListners();\n          this.addIdToRecentlyViewed();\n        }\n  \n        // Quick add hook\n        window.off('quickadd:loaded:' + this.sectionId);\n        window.on('quickadd:loaded:' + this.sectionId, this.initQuickAddForm.bind(this));\n      },\n  \n      cacheElements: function() {\n        this.cache = {\n          form: this.container.querySelector(this.selectors.form),\n          mainSlider: this.container.querySelector(this.selectors.mainSlider),\n          thumbSlider: this.container.querySelector(this.selectors.thumbSlider),\n          thumbScroller: this.container.querySelector(this.selectors.thumbScroller),\n          productImageMain: this.container.querySelector(this.selectors.productImageMain),\n  \n          // Price-related\n          priceWrapper: this.container.querySelector(this.selectors.priceWrapper),\n          comparePriceA11y: this.container.querySelector(this.selectors.comparePriceA11y),\n          comparePrice: this.container.querySelector(this.selectors.comparePrice),\n          price: this.container.querySelector(this.selectors.price),\n          savePrice: this.container.querySelector(this.selectors.savePrice),\n          priceA11y: this.container.querySelector(this.selectors.priceA11y)\n        };\n      },\n  \n      formSetup: function() {\n        this.initQtySelector();\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(this.selectors.availabilityContainer);\n        if (container) {\n          this.storeAvailability = new theme.StoreAvailability(container);\n        }\n      },\n  \n      productSetup: function() {\n        this.setImageSizes();\n        this.initImageZoom();\n        this.initModelViewerLibraries();\n        this.initShopifyXrLaunch();\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      addIdToRecentlyViewed: function() {\n        var id = this.container.getAttribute('data-product-id');\n  \n        if (!id) {\n          return;\n        }\n  \n        // Remove current product if already in recently viewed array\n        var i = theme.recentlyViewedIds.indexOf(id);\n        if (i > -1) {\n          theme.recentlyViewedIds.splice(i, 1);\n        }\n  \n        // Add id to array\n        theme.recentlyViewedIds.unshift(id);\n  \n        if (theme.config.hasLocalStorage) {\n          window.localStorage.setItem('recently-viewed', JSON.stringify(theme.recentlyViewedIds));\n        }\n      },\n  \n      initVariants: function() {\n        var variantJson = document.getElementById(this.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: this.selectors.singleOptionSelector,\n          originalSelectorId: this.selectors.originalSelectorId,\n          variants: this.variantsObject\n        };\n  \n        var swatches = this.container.querySelectorAll(this.selectors.variantColorSwatch);\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.settings.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(this.selectors.sku).length) {\n          this.container.on('variantSKUChange' + this.settings.namespace, this.updateSku.bind(this));\n        }\n  \n        if (this.settings.inventory || this.settings.incomingInventory) {\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 = document.getElementById(this.selectors.currentVariantJson);\n  \n          if (currentVariantJson) {\n            new theme.VariantAvailability({\n              type: theme.settings.dynamicVariantType,\n              variantSelectors: this.cache.form.querySelectorAll(this.selectors.singleOptionSelector),\n              variantsObject: this.variantsObject,\n              currentVariantObject: JSON.parse(currentVariantJson.innerHTML),\n              form: this.cache.form\n            });\n          }\n        }\n  \n        // image set names variant change listeners\n        if (this.settings.imageSetName) {\n          this.settings.imageSetIndex = this.cache.form.querySelector('.variant-input-wrap[data-handle=\"'+this.settings.imageSetName+'\"]').dataset.index;\n          this.container.on('variantChange' + this.settings.namespace, this.updateImageSet.bind(this))\n        }\n      },\n  \n      initQtySelector: function() {\n        this.container.querySelectorAll('.js-qty__wrapper').forEach(el => {\n          new theme.QtySelector(el, {\n            namespace: '.product'\n          });\n        });\n      },\n  \n      initAjaxProductForm: function() {\n        if (theme.settings.cartType === 'dropdown') {\n          new theme.AjaxProduct(this.cache.form, '.add-to-cart');\n        }\n      },\n  \n      /*============================================================================\n        Variant change methods\n      ==============================================================================*/\n      updateColorName: function(color, index) {\n        // Updates on radio button change, not variant.js\n        this.container.querySelector('#VariantColorLabel-' + this.sectionId + '-' + index).textContent = color;\n      },\n  \n      updateCartButton: function(evt) {\n        var variant = evt.detail.variant;\n        var cartBtn = document.getElementById(this.selectors.addToCart);\n        var cartBtnText = document.getElementById(this.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          // If no price element, form initiated later than rest of\n          // product page. Update cached elements\n          if (!this.cache.price) {\n            this.cacheElements();\n          }\n  \n          // Regular price\n          this.cache.price.innerHTML = theme.Currency.formatMoney(variant.price, theme.settings.moneyFormat);\n\n          try{\n          this.cache.price.classList.remove(\"wpd-processed\");\n          this.cache.price.setAttribute(\"data-wpd-variant-compare-at-price\",variant.compare_at_price == null?\"\":variant.compare_at_price);\n          this.cache.price.setAttribute(\"data-wpd-variant-price\",variant.price);\n          this.cache.price.setAttribute(\"data-wpd-variant-id\",variant.id);\n          this.cache.price.setAttribute(\"data-wpd-product-handle\", document.querySelector(\"#wpdproduct-modal\").value);\n            \n          }catch(e){}\n  \n          // Sale price, if necessary\n          if (variant.compare_at_price > variant.price) {\n            this.cache.comparePrice.innerHTML = theme.Currency.formatMoney(variant.compare_at_price, theme.settings.moneyFormat);\n            this.cache.priceWrapper.classList.remove(classes.hidden);\n            this.cache.price.classList.add(classes.onSale);\n            this.cache.comparePriceA11y.setAttribute('aria-hidden', 'false');\n            this.cache.priceA11y.setAttribute('aria-hidden', 'false');\n  \n            var savings = variant.compare_at_price - variant.price;\n  \n            if (theme.settings.saveType == 'percent') {\n              savings = Math.round(((savings) * 100) / variant.compare_at_price) + '%';\n            } else {\n              savings = theme.Currency.formatMoney(savings, theme.settings.moneyFormat);\n            }\n  \n            this.cache.savePrice.classList.remove(classes.hidden);\n            this.cache.savePrice.innerHTML = theme.strings.savePrice.replace('[saved_amount]', savings);\n          } else {\n            if (this.cache.priceWrapper) {\n              this.cache.priceWrapper.classList.add(classes.hidden);\n            }\n            this.cache.savePrice.classList.add(classes.hidden);\n            this.cache.price.classList.remove(classes.onSale);\n            if (this.cache.comparePriceA11y) {\n              this.cache.comparePriceA11y.setAttribute('aria-hidden', 'true');\n            }\n            this.cache.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          this.container.querySelector(this.selectors.unitPrice).innerHTML = theme.Currency.formatMoney(variant.unit_price, theme.settings.moneyFormat);\n          this.container.querySelector(this.selectors.unitPriceBaseUnit).innerHTML = theme.Currency.getBaseUnit(variant);\n          this.container.querySelector(this.selectors.unitWrapper).classList.remove(classes.hidden);\n        } else {\n          this.container.querySelector(this.selectors.unitWrapper).classList.add(classes.hidden);\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) {\n        // If called directly, use current variant\n        var variant = evt ? 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  \n        // Already on the current image group\n        if (this.settings.currentImageSet === setValue) {\n          return;\n        }\n  \n        this.initProductSlider(variant);\n      },\n  \n      // Show/hide thumbnails based on current image set\n      updateImageSetThumbs: function(set) {\n        this.cache.thumbSlider.querySelectorAll('.product__thumb-item').forEach(thumb => {\n          thumb.classList.toggle(classes.hidden, thumb.dataset.group !== set);\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(this.selectors.sku).forEach(el => {\n            el.classList.toggle('hide', hideSku);\n            el.querySelector('[data-sku-id]').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(false);\n          this.toggleIncomingInventory(false);\n          return;\n        }\n  \n        if (variant.inventory_management === 'shopify' && window.inventories && window.inventories[this.sectionId]) {\n          var variantInventoryObject = window.inventories[this.sectionId][variant.id];\n          var quantity = variantInventoryObject.quantity;\n          var showInventory = true;\n          var showIncomingInventory = false;\n  \n          if (quantity <= 0 || quantity > theme.settings.inventoryThreshold) {\n            showInventory = false;\n          }\n  \n          this.toggleInventoryQuantity(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 <= theme.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(show, qty) {\n        if (!this.settings.inventory) {\n          show = false;\n        }\n  \n        var el = document.getElementById(this.selectors.inventory);\n  \n        if (show) {\n          el.classList.remove(classes.hidden);\n          el.textContent = theme.strings.stockLabel.replace('[count]', qty);\n        } else {\n          el.classList.add(classes.hidden);\n        }\n      },\n  \n      toggleIncomingInventory: function(show, available, date) {\n        if (!this.settings.incomingInventory) {\n          show = false;\n        }\n  \n        var el = document.getElementById(this.selectors.incomingInventory);\n  \n        if (!el) {\n          return;\n        }\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          el.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.cache.mainSlider.querySelectorAll(selectors.productVideo);\n  \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.cache.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      // Return focus to\n      returnFocusToThumbnail: function() {\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        Product images\n      ==============================================================================*/\n      initImageZoom: function() {\n        var container = this.container.querySelector(this.selectors.imageContainer);\n        if (!container) {\n          return;\n        }\n        var imageZoom = new theme.Photoswipe(container, this.sectionId);\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      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__thumb[data-id=\"' + variant.featured_media.id + '\"]');\n        var imageIndex = this.getThumbIndex(newImage);\n  \n        // If there is no index, slider is not initalized\n        if (typeof imageIndex === 'undefined') {\n          return;\n        }\n  \n        // Go to that variant image's slide\n        if (this.flickity) {\n          this.flickity.goToSlide(imageIndex);\n        }\n      },\n  \n      initProductSlider: function(variant) {\n        // Stop if only a single image, but add active class to first slide\n        if (this.cache.mainSlider.querySelectorAll(selectors.slide).length <= 1) {\n          var slide = this.cache.mainSlider.querySelector(selectors.slide);\n          if (slide) {\n            slide.classList.add('is-selected');\n          }\n          return;\n        }\n  \n        // Destroy slider in preparation of new initialization\n        if (this.flickity && typeof this.flickity.destroy === 'function') {\n          this.flickity.destroy();\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.cache.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.cache.thumbSlider,\n          childNavScroller: this.cache.thumbScroller,\n          childVertical: this.cache.thumbSlider.dataset.position === 'beside',\n          pageDots: true, // mobile only with CSS\n          wrapAround: true,\n          callbacks: {\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.flickity = new theme.Slideshow(this.cache.mainSlider, mainSliderArgs);\n      },\n  \n      onSlideChange: function(index) {\n        if (!this.flickity) return;\n  \n        var allSlides = this.cache.mainSlider.querySelectorAll(selectors.slide);\n        var prevSlide = allSlides[this.settings.currentSlideIndex];\n        var nextSlide = allSlides[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(this.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          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(this.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  \n      _slideIndex: function(el) {\n        return el.getAttribute('data-index');\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          var formHolder = this.container.querySelector(this.selectors.modalFormHolder);\n          var url = formHolder.dataset.url;\n          var template = formHolder.dataset.template;\n  \n          // Use stripped down ajax version for faster loading,\n          // unless preorder template is used so we show right button\n          if (template !== 'preorder') {\n            url = url + '?view=ajax';\n          }\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            this.cache.form = doc.querySelector('#AddToCartForm-' + this.sectionId);\n  \n            formHolder.innerHTML = '';\n            formHolder.append(this.cache.form);\n            formHolder.classList.add('product-form-holder--loaded');\n  \n            this.formSetup();\n  \n            if (Shopify && Shopify.PaymentButton) {\n              Shopify.PaymentButton.init();\n            }\n  \n            document.dispatchEvent(new CustomEvent('quickview:loaded', {\n              detail: {\n                productId: this.sectionId\n              }\n            }));\n\n            document.dispatchEvent(new CustomEvent(\"wpd:variant:change\", {\n              detail: {\n                productId: this.sectionId,\n                variantId: 1\n              }\n            }))\n            try{\n              document.querySelectorAll(\".variant-input-wrap .variant__button-label\")[1].click();\n              document.querySelectorAll(\".variant-input-wrap .variant__button-label\")[0].click();\n            }catch(e){}\n          }.bind(this));\n  \n          this.productSetup();\n          this.videoSetup();\n  \n          // Setup product inventory data\n          this.updateModalProductInventory();\n  \n          // Enable product slider in quick view\n          // 1. with image sets enabled, make sure we have this.variants before initializing\n          // 2. initialize normally, form data not required\n          if (this.settings.imageSetName) {\n            if (this.variants) {\n              this.initProductSlider();\n            } else {\n              document.addEventListener('quickview:loaded', function(evt) {\n                if (evt.detail.productId === this.sectionId) {\n                  this.initProductSlider();\n                }\n              }.bind(this));\n            }\n          } else {\n            this.initProductSlider();\n          }\n          this.customMediaListners();\n          this.addIdToRecentlyViewed();\n          this.settings.modalInit = true;\n        } else {\n          initialized = true;\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 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 sectionId = el.dataset.sectionId;\n          window.inventories[sectionId] = {};\n  \n          el.querySelectorAll('.js-variant-inventory-data').forEach(el => {\n            window.inventories[sectionId][el.dataset.id] = {\n              'quantity': el.dataset.quantity,\n              'incoming': el.dataset.incoming,\n              'next_incoming_date': el.dataset.date\n            }\n          });\n        });\n      },\n  \n      closeModalProduct: function() {\n        this.stopVideos();\n      },\n  \n      initQuickAddForm: function() {\n        this.updateModalProductInventory();\n  \n        if (Shopify && Shopify.PaymentButton) {\n          Shopify.PaymentButton.init();\n        }\n      },\n  \n      /*============================================================================\n        Product media (3D)\n      ==============================================================================*/\n      initModelViewerLibraries: function() {\n        var modelViewerElements = this.container.querySelectorAll(this.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              this.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        document.querySelectorAll(this.selectors.closeMedia).forEach(el => {\n          el.addEventListener('click', function() {\n            var slide = this.cache.mainSlider.querySelector(selectors.currentSlide);\n            var media = slide.querySelector(this.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        var modelViewer = this.container.querySelector('model-viewer');\n        if (modelViewer) {\n          modelViewer.addEventListener('shopify_model_viewer_ui_toggle_play', function(evt) {\n            this.mediaLoaded(evt);\n          }.bind(this));\n  \n          modelViewer.addEventListener('shopify_model_viewer_ui_toggle_pause', function(evt) {\n            this.mediaUnloaded(evt);\n          }.bind(this));\n        }\n      },\n  \n      mediaLoaded: function(evt) {\n        this.container.querySelectorAll(this.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(this.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        theme.ProductMedia.removeSectionModels(this.sectionId);\n  \n        if (this.flickity && typeof this.flickity.destroy === 'function') {\n          this.flickity.destroy();\n        }\n      }\n    });\n  \n    return Product;\n  })();\n  \n  theme.RecentlyViewed = (function() {\n    var init = false;\n    var maxProducts = 7;\n  \n    function RecentlyViewed(container) {\n      if (!container) {\n        return;\n      }\n  \n      this.container = container;\n      this.sectionId = this.container.getAttribute('data-section-id');\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.init.bind(this),\n        threshold: 600\n      });\n    };\n  \n    RecentlyViewed.prototype = Object.assign({}, RecentlyViewed.prototype, {\n      init: function() {\n        if (init) {\n          return;\n        }\n  \n        init = true;\n  \n        // Stop if no data\n        if (!theme.recentlyViewedIds.length) {\n          this.container.classList.add('hide');\n          return;\n        }\n  \n        this.outputContainer = document.getElementById('RecentlyViewed-' + this.sectionId);\n        var currentId = this.container.getAttribute('data-product-id');\n  \n        var url = theme.routes.search + '?view=recently-viewed&type=product&q=';\n  \n        var products = '';\n        var i = 0;\n        theme.recentlyViewedIds.forEach(function(val) {\n          // Skip current product\n          if (val === currentId) {\n            return;\n          }\n  \n          // Stop at max\n          if (i >= maxProducts) {\n            return;\n          }\n  \n          products += 'id:' + val + ' OR ';\n          i++;\n        });\n  \n        url = url + encodeURIComponent(products);\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 count = doc.querySelectorAll('.grid-product').length;\n  \n          if (count > 0) {\n            var results = doc.querySelector('.product-grid');\n            this.outputContainer.append(results);\n  \n            new theme.QuickAdd(this.outputContainer);\n            new theme.QuickShop(this.outputContainer);\n          } else {\n            this.container.classList.add('hide');\n          }\n  \n        }.bind(this));\n      },\n  \n      onUnload: function() {\n        init = false;\n      }\n    });\n  \n    return RecentlyViewed;\n  })();\n  \n  theme.VendorProducts = (function() {\n    var maxProducts = 6;\n  \n    function VendorProducts(container) {\n      if (!container) {\n        return;\n      }\n  \n      this.container = container;\n      this.sectionId = this.container.getAttribute('data-section-id');\n      this.currentProduct = this.container.getAttribute('data-product-id');\n  \n      theme.initWhenVisible({\n        element: this.container,\n        callback: this.init.bind(this),\n        threshold: 600\n      });\n    };\n  \n    VendorProducts.prototype = Object.assign({}, VendorProducts.prototype, {\n      init: function() {\n        this.outputContainer = document.getElementById('VendorProducts-' + this.sectionId);\n        this.vendor = this.container.getAttribute('data-vendor');\n        var url = theme.routes.collections + '/vendors?view=vendor-ajax&q=' + this.vendor;\n  \n        // remove double `/` in case shop might have /en or language in URL\n        url = url.replace('//', '/');\n  \n        fetch(url).then(function(response) {\n          return response.text();\n        }).then(html => {\n          var count = 0;\n          var products = [];\n          var modals = [];\n          var parser = new DOMParser();\n          var doc = parser.parseFromString(html, 'text/html');\n  \n          var allProds = doc.querySelectorAll('.grid-product');\n  \n          // Do not add current product to output\n          allProds.forEach(el => {\n            var id = el.dataset.productId;\n  \n            if (count === maxProducts) {\n              return;\n            }\n  \n            if (id === this.currentProduct) {\n              return;\n            }\n  \n            var modal = doc.querySelector('.modal[data-product-id=\"'+ id +'\"]');\n            if (modal) {\n              modals.push(modal);\n            }\n  \n  \n            count++;\n            products.push(el);\n          });\n  \n          this.outputContainer.innerHTML = '';\n  \n          if (products.length === 0) {\n            this.container.classList.add('hide');\n          } else {\n            this.outputContainer.classList.remove('hide');\n            this.outputContainer.append(...products);\n  \n            if (modals.length) {\n              this.outputContainer.append(...modals);\n              new theme.QuickShop(this.outputContainer);\n            }\n  \n            new theme.QuickAdd(this.outputContainer);\n          }\n        });\n      }\n    });\n  \n    return VendorProducts;\n  })();\n  \n  theme.Testimonials = (function() {\n    var defaults = {\n      adaptiveHeight: true,\n      avoidReflow: true,\n      pageDots: true,\n      prevNextButtons: false\n    };\n  \n    function Testimonials(container) {\n      this.container = container;\n      this.timeout;\n      var sectionId = container.getAttribute('data-section-id');\n      this.slideshow = container.querySelector('#Testimonials-' + sectionId);\n      this.namespace = '.testimonial-' + 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() {\n        // Do not wrap when only a few blocks\n        if (this.slideshow.dataset.count <= 3) {\n          defaults.wrapAround = false;\n        }\n  \n        this.flickity = new theme.Slideshow(this.slideshow, defaults);\n  \n        // Autoscroll to next slide on load to indicate more blocks\n        if (this.slideshow.dataset.count > 2) {\n          this.timeout = setTimeout(function() {\n            this.flickity.goToSlide(1);\n          }.bind(this), 1000);\n        }\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\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(scope) {\n    // Refresh reviews app\n    if (window.SPR) {SPR.initDomEls();SPR.loadBadges()}\n\n    // Re-hook up collapsible box triggers\n    theme.collapsibles.init();\n  };\n\n  // Set a max-height on drawers when they're opened via CSS variable\n  // to account for changing mobile window heights\n  theme.sizeDrawer = function() {\n    var header = document.getElementById('HeaderWrapper').offsetHeight;\n    var max = window.innerHeight - header;\n    document.documentElement.style.setProperty('--maxDrawerHeight', `${max}px`);\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  if (theme.config.hasLocalStorage) {\n    var recentIds = window.localStorage.getItem('recently-viewed');\n    if (recentIds && typeof(recentIds) !== undefined) {\n      theme.recentlyViewedIds = JSON.parse(recentIds);\n    }\n  }\n\n  // Trigger events when going between breakpoints\n  theme.config.bpSmall = matchMedia(theme.config.mediaQuerySmall).matches;\n  matchMedia(theme.config.mediaQuerySmall).addListener(function(mql) {\n    if (mql.matches) {\n      theme.config.bpSmall = true;\n      document.dispatchEvent(new CustomEvent('matchSmall'));\n    }\n    else {\n      theme.config.bpSmall = false;\n      document.dispatchEvent(new CustomEvent('unmatchSmall'));\n    }\n  });\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  // Load generic JS. Also reinitializes when sections are\n  // added, edited, or removed in Shopify's editor\n  theme.initGlobals = function() {\n    theme.collapsibles.init();\n    theme.videoModal();\n    theme.animationObserver();\n  }\n\n  DOMready(function(){\n    theme.sections = new theme.Sections();\n\n    // sections\n    theme.sections.register('header', theme.HeaderSection);\n    theme.sections.register('toolbar', theme.Toolbar);\n    theme.sections.register('product', theme.Product);\n    theme.sections.register('password-header', theme.PasswordHeader);\n    theme.sections.register('photoswipe', theme.Photoswipe);\n    theme.sections.register('product-recommendations', theme.Recommendations);\n    theme.sections.register('slideshow-section', theme.SlideshowSection);\n    theme.sections.register('background-image', theme.BackgroundImage);\n    theme.sections.register('testimonials', theme.Testimonials);\n    theme.sections.register('video-section', theme.VideoSection);\n    theme.sections.register('map', theme.Maps);\n    theme.sections.register('footer-section', theme.FooterSection);\n    theme.sections.register('store-availability', theme.StoreAvailability);\n    theme.sections.register('recently-viewed', theme.RecentlyViewed);\n    theme.sections.register('vendor-products', theme.VendorProducts);\n    theme.sections.register('newsletter-popup', theme.NewsletterPopup);\n    theme.sections.register('collection-header', theme.CollectionHeader);\n    theme.sections.register('collection-template', theme.Collection);\n    theme.sections.register('collection-sidebar', theme.CollectionSidebar);\n\n    theme.initGlobals();\n    theme.rteInit();\n\n    if (theme.settings.isCustomerTemplate) {\n      theme.customerTemplates();\n    }\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        var recommendations = document.querySelector('.cart-recommendations[data-location=\"page\"]');\n        if (recommendations) {\n          new theme.QuickAdd(recommendations);\n          new theme.QuickShop(recommendations);\n        }\n\n        var noteBtn = cartPageForm.querySelector('.add-note');\n        if (noteBtn) {\n          noteBtn.addEventListener('click', function() {\n            noteBtn.classList.toggle('is-active');\n            cartPageForm.querySelector('.cart__note').classList.toggle('hide');\n          });\n        }\n      }\n    }\n\n    // Enable quick view/quick shop on search page\n    if (document.body.classList.contains('template-search')) {\n      var searchGrid = document.querySelector('.search-grid');\n      if (searchGrid) {\n        var searchProducts = searchGrid.querySelectorAll('.grid-product');\n        if (searchProducts.length) {\n          new theme.QuickAdd(searchGrid);\n          new theme.QuickShop(searchGrid);\n        }\n      }\n    }\n\n    document.addEventListener('recommendations:loaded', function(evt) {\n      if (evt && evt.detail && evt.detail.section) {\n        new theme.QuickAdd(evt.detail.section);\n        new theme.QuickShop(evt.detail.section);\n      }\n    })\n\n    document.dispatchEvent(new CustomEvent('page:loaded'));\n  });\n\n})();\n\n  $(document).ready(function() {\n    $('body').on('click', '#RegisterForm .btn', function() {\n      if ($('#agree').is(':checked')) {\n        $(this).submit();\n      }\n      else {\n        alert(\"You must agree with the terms and conditions of sales to check out.\");\n        return false;\n      }\n    });\n  });"],
  "mappings": "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",
  "names": ["evt", "observer", "data", "el", "index", "self"]
}
