{
  "version": 3,
  "sources": ["/cdn/shop/t/106/assets/theme.js?section_id=product-recommendations"],
  "sourcesContent": ["/*\n* This is an unminified version of the theme.min.js file used by your theme.\n* If you want to use this file, you will need to change the script reference in your theme\n* Change <script src=\"{{ 'theme.min.js' | asset_url }}\"> to:\n* <script src=\"{{ 'theme.js' | asset_url }}\">\n*/\n(function ($,omit,find,throttle,a11y,remove,filter,fill,debounce,morphdom,defaultTo,findIndex,isArray,Hammer) {\n$ = 'default' in $ ? $['default'] : $;\nomit = 'default' in omit ? omit['default'] : omit;\nfind = 'default' in find ? find['default'] : find;\nthrottle = 'default' in throttle ? throttle['default'] : throttle;\nremove = 'default' in remove ? remove['default'] : remove;\nfilter = 'default' in filter ? filter['default'] : filter;\nfill = 'default' in fill ? fill['default'] : fill;\ndebounce = 'default' in debounce ? debounce['default'] : debounce;\nmorphdom = 'default' in morphdom ? morphdom['default'] : morphdom;\ndefaultTo = 'default' in defaultTo ? defaultTo['default'] : defaultTo;\nfindIndex = 'default' in findIndex ? findIndex['default'] : findIndex;\nisArray = 'default' in isArray ? isArray['default'] : isArray;\nHammer = 'default' in Hammer ? Hammer['default'] : Hammer;\n\nfunction Templates() {\n  this.registered = {};\n  this.instances = [];\n  this.extensions = {\n    '*': []\n  };\n}\n\nTemplates.prototype = {\n  register: function(name, classname, properties) {\n    function Template(container, extensions) {\n      this.name = name.toLowerCase();\n      this.container = container;\n      this.$container = $(container);\n      this.extensions = extensions;\n      Master.call(this);\n    }\n\n    Template.classname = classname;\n    Template.constructor = Template;\n    Template.prototype = Object.create(Master.prototype);\n    $.extend(Template.prototype, properties);\n\n    this.registered[name] = Template;\n  },\n\n  extend: function(names, extension) {\n    if (names === '*') {\n      names = Object.keys(this.registered);\n      names.push('*');\n    } else if (typeof names === 'string') {\n      names = [names];\n    }\n\n    names.forEach(\n      function(name) {\n        this.extensions[name] = this.extensions[name] || [];\n        this.extensions[name].push(extension);\n\n        if (typeof this.registered[name] === 'undefined' || name === '*')\n          return;\n\n        this.instances.forEach(function(instance) {\n          if (instance.name !== name) return;\n\n          instance.extend(extension);\n        });\n      }.bind(this)\n    );\n  },\n\n  load: function(names) {\n    if (names === '*') {\n      names = Object.keys(this.registered);\n    } else if (typeof names === 'string') {\n      names = [names];\n    }\n\n    names.forEach(this._loadTemplate.bind(this));\n  },\n\n  _loadTemplate: function(name) {\n    var Template = this.registered[name];\n    var instance = find(this.instances, { name: name });\n    var container;\n    var extensions;\n\n    // If the template name is not registered or already has an instance loaded,\n    // then return\n    if (typeof Template === 'undefined' || instance) return;\n\n    // Get the container for the template\n    if (Template.classname === '*') {\n      container = document.body;\n    } else {\n      container = document.querySelector('body.' + Template.classname);\n    }\n\n    // If we don't have the specified container on the page then return\n    if (!container) return;\n\n    // Get all extensions for the new template instance\n    extensions = this.extensions['*'].concat(this.extensions[name] || []);\n    instance = new Template(container, extensions);\n\n    // Call the onLoad function of the template if it exists\n    if ($.isFunction(instance.onLoad)) {\n      instance.onLoad(container);\n    }\n\n    // Push the template instance to storage\n    this.instances.push(instance);\n  }\n};\n\nfunction Master() {\n  this.extensions.forEach(\n    function(extension) {\n      this.extend(extension);\n    }.bind(this)\n  );\n}\n\nMaster.prototype = {\n  extend: function(extension) {\n    var init = extension.init;\n    this.extensions.push(extension);\n\n    if ($.isFunction(init)) {\n      extension = omit(extension, 'init');\n    }\n\n    $.extend(this, extension);\n    init.apply(this);\n  }\n};\n\nvar templates = new Templates();\n\nvar classes$1 = {\n  disableScroll: 'disable-scroll',\n  isTouch: 'is-touch'\n};\n\nvar utils = {\n  pointerEventToXY: function(event) {\n    var position;\n\n    if (event.originalEvent.touches) {\n      position =\n        event.originalEvent.touches[0] || event.originalEvent.changedTouches[0];\n    } else {\n      position = event;\n    }\n    return {\n      x: position.pageX,\n      y: position.pageY\n    };\n  },\n\n  promiseRepeatSeries: function(promise, count) {\n    count--;\n\n    return promise().then(\n      function() {\n        // eslint-disable-line consistent-return\n        if (count) {\n          return this.promiseRepeatSeries(promise, count);\n        }\n      }.bind(this)\n    );\n  },\n\n  mapPromiseSeries: function(iterable, cb, delay) {\n    var series = $.Deferred().resolve();\n\n    $.each(iterable, function(index, item) {\n      series = series.then(function() {\n        if (typeof delay === 'number') {\n          return delayedReturn(index, item);\n        } else {\n          return cb(index, item);\n        }\n      });\n    });\n\n    function delayedReturn(index, item) {\n      return $.Deferred(function(defer) {\n        setTimeout(function() {\n          defer.resolve(cb(index, item)); // eslint-disable-line callback-return\n        }, delay);\n      });\n    }\n\n    return series;\n  },\n\n  promiseAnimationEnd: function($el) {\n    var events = 'animationend webkitAnimationEnd oAnimationEnd';\n    var properties = [\n      'animation-duration',\n      '-moz-animation-duration',\n      '-webkit-animation-duration',\n      '-o-animation-duration'\n    ];\n    var duration = 0;\n    var promise = $.Deferred().resolve();\n\n    // check the various CSS properties to see if a duration has been set\n    $.each(properties, function(index, value) {\n      duration || (duration = parseFloat($el.css(value))); // eslint-disable-line no-unused-expressions\n    });\n\n    if (duration > 0) {\n      promise = $.Deferred(function(defer) {\n        $el.on(events, function(evt) {\n          if (evt.target !== $el[0]) return;\n          $el.off(events);\n          defer.resolve();\n        });\n      });\n    }\n\n    return promise;\n  },\n\n  promiseTransitionEnd: function($el) {\n    var events =\n      'webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend';\n    var properties = [\n      'transition-duration',\n      '-moz-transition-duration',\n      '-webkit-transition-duration',\n      '-o-transition-duration'\n    ];\n    var duration = 0;\n    var promise = $.Deferred().resolve();\n\n    // check the various CSS properties to see if a duration has been set\n    $.each(properties, function(index, value) {\n      duration || (duration = parseFloat($el.css(value))); // eslint-disable-line no-unused-expressions\n    });\n\n    if (duration > 0) {\n      promise = $.Deferred(function(defer) {\n        $el.on(events, function(evt) {\n          if (evt.target !== $el[0]) return;\n          $el.off(events);\n          defer.resolve();\n        });\n      });\n    }\n\n    return promise;\n  },\n\n  isLocalStorageSupported: function() {\n    var mod = 'localStorageTest';\n    try {\n      localStorage.setItem(mod, mod);\n      localStorage.removeItem(mod);\n      return true;\n    } catch (error) {\n      return false;\n    }\n  },\n\n  isSessionStorageSupported: function() {\n    var mod = 'sessionStorageTest';\n    try {\n      sessionStorage.setItem(mod, mod);\n      sessionStorage.removeItem(mod);\n      return true;\n    } catch (error) {\n      return false;\n    }\n  },\n\n  /**\n   * Set all tabbable elements tabindex attribute to '-1' so that they are not\n   * tabbable. Great for if you want to hide something with opacity: 0 or\n   * visibility: hidden, but don't want interactivity\n   *\n   * @param {any} container - Container to look for children elements to disable\n   */\n  disableTabbingOfChildren: function(containers) {\n    $(containers).each(function(index, container) {\n      $(\n        'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]',\n        container\n      ).attr('tabindex', '-1');\n    });\n  },\n\n  /**\n   * Remove all tabbable elements' tabindex attribute so that they assume their\n   * normal tabbing behaviour.\n   *\n   * @param {any} container - Container to look for children elements to reset\n   */\n  enableTabbingOfChildren: function(containers) {\n    $(containers).each(function(index, container) {\n      $(\n        'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex]:not(.plyr):not([data-product-media-wrapper]), *[contenteditable]',\n        container\n      ).removeAttr('tabindex');\n    });\n  },\n\n  isiOSSafari: function() {\n    var userAgent = window.navigator.userAgent;\n    var iOS =\n      Boolean(userAgent.match(/iPad/i)) || Boolean(userAgent.match(/iPhone/i));\n    var webkit = Boolean(userAgent.match(/WebKit/i));\n\n    return iOS && webkit && !userAgent.match(/CriOS/i);\n  },\n\n  disableScrollBody: function() {\n    // If the body isn't tall enough to scroll then we have nothing to disable\n    if (document.body.scrollHeight - window.innerHeight === 0) return;\n\n    $('html').addClass(classes$1.disableScroll);\n  },\n\n  enableScrollBody: function() {\n    $('html').removeClass(classes$1.disableScroll);\n  },\n\n  updateUrlParameter: function(url, key, value) {\n    var re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i');\n    var separator = url.indexOf('?') === -1 ? '?' : '&';\n\n    if (url.match(re)) {\n      return url.replace(re, '$1' + key + '=' + value + '$2');\n    } else {\n      return url + separator + key + '=' + value;\n    }\n  },\n\n  cookiesEnabled: function() {\n    var cookieEnabled = navigator.cookieEnabled;\n\n    if (!cookieEnabled) {\n      document.cookie = 'testcookie';\n      cookieEnabled = document.cookie.indexOf('testcookie') !== -1;\n    }\n    return cookieEnabled;\n  },\n\n  onFirst: function(name, fn) {\n    // bind as you normally would\n    // don't want to miss out on any jQuery magic\n    this.on(name, fn);\n\n    this.each(function() {\n      var handlers = $._data(this, 'events')[name.split('.')[0]];\n      // take out the handler we just inserted from the end\n      var handler = handlers.pop();\n      // move it at the beginning\n      handlers.splice(0, 0, handler);\n    });\n  },\n\n  // Returns a promise that is only resolved when the stylesheet has been\n  // downloaded. This function defaults to load the main stylesheet, but\n  // can be used to load a different stylesheet by passing in its url\n  promiseStylesheet: function(stylesheet) {\n    var stylesheetUrl = stylesheet || theme.stylesheet;\n\n    if (typeof this.stylesheetPromise === 'undefined') {\n      this.stylesheetPromise = $.Deferred(function(defer) {\n        var link = document.querySelector('link[href=\"' + stylesheetUrl + '\"]');\n\n        if (link.loaded) {\n          defer.resolve();\n        }\n\n        /* eslint-disable no-undef */\n        onloadCSS(link, function() {\n          // Global onloadCSS function injected by load-css.liquid\n          defer.resolve();\n        });\n      });\n    }\n\n    return this.stylesheetPromise;\n  },\n\n  isMobile: function() {\n    // Create a scoped variable that stores the current status\n    var status = false;\n\n    // Replace utils.isMobile function with a function that returns the status.\n    // This makes sure the code below is on executed once, and then from there\n    // on the only thing that isMobile does is return var status.\n    this.isMobile = function() {\n      return status;\n    };\n\n    function checkIfMobile() {\n      status = $(window).outerWidth() < theme.mediaQuerySmall;\n      return status;\n    }\n\n    // Make sure that this resize handler is the first handler in the event loop\n    $.fn.onFirst = this.onFirst;\n\n    // This event handler is only assigned once.\n    $(window).onFirst('resize', checkIfMobile);\n\n    // Set the initial value of status and return that value. After this,\n    // isMobile() will return `var status`\n    return checkIfMobile();\n  },\n\n  isTablet: function() {\n    // Create a scoped variable that stores the current status\n    var status = false;\n\n    // Replace utils.isTablet function with a function that returns the status.\n    // This makes sure the code below is on executed once, and then from there\n    // on the only thing that isTablet does is return var status.\n    this.isTablet = function() {\n      return status;\n    };\n\n    function checkIfTablet() {\n      var width = $(window).outerWidth();\n      status = width > theme.mediaQuerySmall && width < theme.mediaQueryMedium;\n      return status;\n    }\n\n    // Make sure that this resize handler is the first handler in the event loop\n    $.fn.onFirst = this.onFirst;\n\n    // This event handler is only assigned once.\n    $(window).onFirst('resize', checkIfTablet);\n\n    // Set the initial value of status and return that value. After this,\n    // isTablet() will return `var status`\n    return checkIfTablet();\n  },\n\n  isInOrAboveViewport: function(element) {\n    var rect = element.getBoundingClientRect();\n    var offset = 50;\n\n    return (\n      // The top is in view: the top is more than 0 and less than the window height (the top of the element is in view)\n      (rect.top + offset >= 0 && rect.top + offset <= window.innerHeight) ||\n      // The bottom is in view: bottom position is greater than 0 and greater than the window height\n      (rect.bottom + offset >= 0 &&\n        rect.bottom + offset <= window.innerHeight) ||\n      // The top is above the viewport and the bottom is below the viewport\n      (rect.top + offset < 0 && rect.bottom + offset > window.innerHeight) ||\n      // The bottom is above the viewport\n      rect.bottom < 0\n    );\n  },\n\n  isTouch: function() {\n    // Create a scoped variable that stores the current status\n    var status = false;\n\n    this.isTouch = function() {\n      return status;\n    };\n\n    // This event handler is only assigned once.\n    $(document).one('touchstart', function() {\n      status = true;\n      $('html').addClass(classes$1.isTouch);\n    });\n\n    // Set the initial value of status and return that value.\n    return status;\n  },\n\n  keyboardKeys: {\n    TAB: 9,\n    ENTER: 13,\n    SPACE: 32,\n    LEFTARROW: 37,\n    RIGHTARROW: 39\n  }\n};\n\nvar selectors = {\n  elementsToAnimate: '[data-animate]'\n};\n\nvar classes = {\n  animated: 'has-animated',\n  animationsDisabled: 'animations--disabled'\n};\n\ntemplates.register('Page animations', '*', {\n  onLoad: function() {\n    this.animationNamespace = '.animations';\n    this.$elementsToAnimate = $(selectors.elementsToAnimate, this.$container);\n\n    if (this.$elementsToAnimate.length === 0) return;\n\n    // This extension is used for templates and sections. Templates don't have\n    // event handling like sections so we need to use regular jQuery events\n    var scrollEvent = 'scroll' + this.animationNamespace;\n\n    if (Shopify.designMode) {\n      scrollEvent += ' touchmove' + this.animationNamespace;\n    }\n    $(window).on(\n      scrollEvent,\n      throttle(this._animateElementsInViewport.bind(this), 200)\n    );\n    $(window).on(\n      'resize' + this.animationNamespace,\n      throttle(this._animateElementsInViewport.bind(this), 200)\n    );\n\n    if (Shopify && Shopify.designMode) {\n      $(document).on(\n        'shopify:section:load shopify:section:select',\n        this._onSectionSelect.bind(this)\n      );\n      $(document).on(\n        'shopify:section:unload shopify:section:deselect',\n        this._onSectionDeselect.bind(this)\n      );\n    }\n\n    // Put this on a loop to check if elements on page load need to be animated\n    utils.promiseStylesheet().then(this._animateElementsInViewport.bind(this));\n  },\n\n  _animateElementsInViewport: function() {\n    this.$elementsToAnimate = this.$elementsToAnimate.map(function(\n      index,\n      element\n    ) {\n      // If the element is not going to be animated, return it to the list of\n      // elements to animate\n      if (!utils.isInOrAboveViewport(element)) {\n        return element;\n      }\n\n      // Debounce any style changes to the next frame.\n      requestAnimationFrame(function() {\n        $(element).addClass(classes.animated);\n\n        // This extension is also used for template, which don't have trigger and\n        // events functionality\n        $(element).trigger('animate_element', [element]);\n      });\n\n      // Since this element was animated, we return null so its NOT added back\n      // to the list of elements to animate\n      return null;\n    });\n\n    if (this.$elementsToAnimate.length === 0) {\n      $(window).off(this.animationNamespace);\n    }\n  },\n\n  _onSectionSelect: function() {\n    $(document.body).addClass(classes.animationsDisabled);\n  },\n\n  _onSectionDeselect: function(evt) {\n    $(document.body).removeClass(classes.animationsDisabled);\n\n    $(evt.target)\n      .find(selectors.elementsToAnimate)\n      .addClass(classes.animated);\n  }\n});\n\nvar selectors$2 = {\n  socialSharing: '.social-sharing',\n  socialSharingToggle: '.social-sharing__toggle',\n  linkList: '.social-sharing__item-list'\n};\nvar classes$3 = {\n  socialSharingAction: 'social-sharing--active'\n};\n\nvar socialSharing = {\n  init: function() {\n    this.$elements = $(selectors$2.socialSharing, this.$container);\n    this.clicked = false;\n\n    $(selectors$2.socialSharingToggle, this.$container)\n      .on('click', this._onClick.bind(this))\n      .one('click', function() {\n        this.clicked = true;\n      });\n\n    this.$container.on('section_unload', this.destroySocialSharing.bind(this));\n  },\n\n  showSocialSharing: function() {\n    $(selectors$2.socialSharing, this.$container).addClass(\n      classes$3.socialSharingAction\n    );\n    $(selectors$2.socialSharingToggle, this.$container).attr(\n      'aria-expanded',\n      true\n    );\n    $(selectors$2.linkList, this.$container).attr('aria-hidden', false);\n    utils.enableTabbingOfChildren($(selectors$2.linkList, this.$container));\n  },\n\n  hideSocialSharing: function() {\n    $(selectors$2.socialSharing, this.$container).removeClass(\n      classes$3.socialSharingAction\n    );\n    $(selectors$2.socialSharingToggle, this.$container).attr(\n      'aria-expanded',\n      false\n    );\n    $(selectors$2.linkList, this.$container).attr('aria-hidden', true);\n    utils.disableTabbingOfChildren($(selectors$2.linkList, this.$container));\n  },\n\n  destroySocialSharing: function() {\n    $(selectors$2.socialSharingToggle, this.$container).off();\n  },\n\n  _onClick: function(evt) {\n    if ($(evt.currentTarget).attr('aria-expanded') === 'true') {\n      this.hideSocialSharing();\n    } else {\n      this.showSocialSharing();\n    }\n  }\n};\n\nvar selectors$1 = {\n  articleContentWrapper: '.article__wrapper',\n  articleShareDesktop: '.article__share-desktop',\n  articleShareMobile: '.article__share-mobile',\n  articleShareDesktopWrapper: '.article__share-desktop-wrapper',\n  socialSharing: '.social-sharing'\n};\n\nvar classes$2 = {\n  shareFixed: 'article__share-desktop--fixed',\n  shareBottom: 'article__share-desktop--bottom'\n};\n\nvar settings = {\n  shareExpandedHeight: 350\n};\n\ntemplates.register('Article Template', 'template-article', {\n  onLoad: function() {\n    this.extend(socialSharing);\n\n    $(window)\n      .on('scroll', this.setSharePosition.bind(this))\n      .on('resize', this.updateMeasurements.bind(this));\n\n    utils.promiseStylesheet().then(\n      function() {\n        this.updateMeasurements();\n      }.bind(this)\n    );\n  },\n\n  setSharePosition: function() {\n    if (utils.isMobile() || utils.isTablet()) return;\n\n    var scrollTop = $(window).scrollTop();\n\n    // Debounce DOM edits to next frame with requestAnimationFrame\n    requestAnimationFrame(\n      function() {\n        if (scrollTop > this.fixedTop) {\n          if (scrollTop > this.fixedBottom) {\n            // Fix to bottom\n            $(selectors$1.articleShareDesktop)\n              .removeClass(classes$2.shareFixed)\n              .addClass(classes$2.shareBottom);\n          } else {\n            // Fix to top\n            $(selectors$1.articleShareDesktop)\n              .addClass(classes$2.shareFixed)\n              .removeClass(classes$2.shareBottom);\n          }\n        } else {\n          // Fix to side\n          $(selectors$1.articleShareDesktop)\n            .removeClass(classes$2.shareFixed)\n            .removeClass(classes$2.shareBottom);\n        }\n\n        if (!this.clicked) {\n          if (scrollTop > this.fixedBottom - settings.shareExpandedHeight) {\n            this.showSocialSharing();\n          } else {\n            this.hideSocialSharing();\n          }\n        }\n      }.bind(this)\n    );\n  },\n\n  updateMeasurements: function() {\n    this.fixedTop = $(selectors$1.articleContentWrapper).offset().top;\n    this.fixedBottom =\n      this.fixedTop +\n      $(selectors$1.articleContentWrapper).height() -\n      $(selectors$1.articleShareDesktopWrapper).height();\n    this.windowHeight = $(window).outerHeight();\n\n    this.setSharePosition();\n  }\n});\n\nvar selectors$3 = {\n  addressCountrySelect: '.address-country-selector',\n  newToggle: '.address-new-toggle',\n  newAddressContainer: '.new-address',\n  editToggle: '.address-edit-toggle',\n  editAddressContainer: '.edit-address',\n  editAddressContainerId: '#EditAddress_',\n  deleteAddress: '.address-delete',\n  currentAddresses: '.current-addresses',\n  currentAddress: '#CurrentAddress_',\n  currentAddressesItem: '.current-addresses__item'\n};\nvar classes$4 = {\n  newAddressHide: 'new-address--hidden',\n  editAddressShow: 'edit-address--show'\n};\n\ntemplates.register(\n  'Customer Addresses Template',\n  'template-customers-addresses',\n  {\n    onLoad: function(container) {\n      var $container = (this.$container = $(container));\n      var $countryOptions = $(theme.countryOptionTags).filter('option');\n      var $addressCountrySelect = $(selectors$3.addressCountrySelect, $container);\n      var $newAddressContainer = $(selectors$3.newAddressContainer, $container);\n      var $editAddressContainers = $(\n        selectors$3.editAddressContainer,\n        $container\n      );\n\n      $addressCountrySelect.each(\n        function(index, countrySelect) {\n          var $countrySelect = this._populateCountrySelect(\n            countrySelect,\n            $countryOptions\n          );\n          var currentProvinces = this._fetchCurrentProvinces($countrySelect);\n          var $provinceSelect = $(\n            $countrySelect.attr('data-province-select'),\n            $container\n          );\n          var defaultProvince = $provinceSelect.data('default');\n\n          this._populateProvinceSelect(\n            $provinceSelect,\n            currentProvinces,\n            defaultProvince\n          );\n        }.bind(this)\n      );\n\n      $(selectors$3.newToggle).on('click', this._onNewAddressClick.bind(this));\n      $(selectors$3.editToggle).on('click', this._onEditAddressClick.bind(this));\n      $(selectors$3.deleteAddress).on(\n        'click',\n        this._onDeleteAddressClick.bind(this)\n      );\n\n      if ($('div.errors', $newAddressContainer).length !== 0) {\n        $newAddressContainer.removeClass(classes$4.newAddressHide);\n      }\n\n      $editAddressContainers.each(function() {\n        if ($('div.errors', this).length !== 0) {\n          $(this).addClass(classes$4.editAddressShow);\n        }\n      });\n    },\n\n    _populateCountrySelect: function(countrySelect, countryOptions) {\n      var $countrySelect = $(countrySelect);\n      var defaultValue = $countrySelect.data('default');\n      var defaultOption = countryOptions[0];\n\n      // If the country <select> has a default value already set, that country\n      // value is written in the theme language (not always english). The <option>\n      // value attribute in the country <select> are always in English. We need to\n      // find the <option> that has the same .text value as our default value.\n      if (typeof defaultValue === 'string' && defaultValue !== '') {\n        defaultOption = find(countryOptions, function(el) {\n          return el.text === defaultValue;\n        });\n      }\n\n      return $countrySelect\n        .html(countryOptions.clone())\n        .val(defaultOption.value)\n        .on('change', this._onCountrySelectChange.bind(this));\n    },\n\n    _populateProvinceSelect: function(\n      $provinceSelect,\n      provinces,\n      defaultValue\n    ) {\n      var $container = $provinceSelect.parent();\n      var provinceOptions = provinces.map(this._createProvinceOption);\n      var value = defaultValue || $(provinceOptions[0]).val();\n\n      if (provinceOptions.length) {\n        $container.show();\n      } else {\n        $container.hide();\n      }\n\n      return $provinceSelect.html(provinceOptions).val(value);\n    },\n\n    _createProvinceOption: function(province) {\n      return $('<option>')\n        .attr({\n          value: province[0]\n        })\n        .text(province[1]);\n    },\n\n    _fetchCurrentProvinces: function($countrySelect) {\n      return $countrySelect.find(':selected').data('provinces') || [];\n    },\n\n    _onCountrySelectChange: function(event) {\n      var $countrySelect = $(event.target);\n      var currentProvinces = this._fetchCurrentProvinces($countrySelect);\n      var $provinceSelect = $($countrySelect.data('province-select'));\n\n      this._populateProvinceSelect($provinceSelect, currentProvinces);\n    },\n\n    _onNewAddressClick: function() {\n      $(selectors$3.newAddressContainer, this.$container).toggleClass(\n        classes$4.newAddressHide\n      );\n    },\n\n    _onEditAddressClick: function(event) {\n      var formId = $(event.target).data('form-id');\n      $(selectors$3.editAddressContainerId + formId, this.$container).toggleClass(\n        classes$4.editAddressShow\n      );\n    },\n\n    _onDeleteAddressClick: function(event) {\n      var $button = $(event.target);\n      var formId = $button.data('form-id');\n      var addressUrl = $button.data('address-url');\n      var confirmMessage = $button.data('confirm-message');\n      var $container = $(selectors$3.currentAddress + formId, this.$container);\n\n      if (confirm(confirmMessage)) {\n        // eslint-disable-line no-alert\n        $.post(addressUrl, {\n          _method: 'delete'\n        });\n        $container.remove();\n\n        if (!$(selectors$3.currentAddressesItem).length) {\n          $(selectors$3.currentAddresses, this.$container).remove();\n          $(selectors$3.newAddressContainer, this.$container).removeClass(\n            classes$4.newAddressHide\n          );\n        }\n      }\n    }\n  }\n);\n\nvar selectors$4 = {\n  recoverPasswordForm: '#RecoverPasswordForm',\n  customerLoginForm: '#CustomerLoginForm',\n  hideRecoverPasswordLink: '#HideRecoverPasswordLink',\n  showRecoverPasswordLink: '#RecoverPassword'\n};\n\ntemplates.register('Customer Login Template', 'template-customers-login', {\n  onLoad: function(container) {\n    var $container = (this.$container = $(container));\n\n    this.checkUrlHash();\n    this.resetPasswordSuccess();\n\n    $(selectors$4.showRecoverPasswordLink, $container).on(\n      'click',\n      this.onShowHidePasswordForm.bind(this)\n    );\n    $(selectors$4.hideRecoverPasswordLink, $container).on(\n      'click',\n      this.onShowHidePasswordForm.bind(this)\n    );\n  },\n\n  onShowHidePasswordForm: function(evt) {\n    evt.preventDefault();\n    this.toggleRecoverPasswordForm();\n  },\n\n  checkUrlHash: function() {\n    var hash = window.location.hash;\n\n    if (hash === '#recover') {\n      this.toggleRecoverPasswordForm();\n    }\n  },\n\n  toggleRecoverPasswordForm: function() {\n    $(selectors$4.recoverPasswordForm).toggleClass('hide');\n    $(selectors$4.customerLoginForm).toggleClass('hide');\n  },\n\n  resetPasswordSuccess: function() {\n    if (!$('.reset-password-success').length) {\n      return;\n    }\n\n    $('#ResetSuccess').removeClass('hide');\n  }\n});\n\nif (!Element.prototype.matches) {\n    Element.prototype.matches =\n        Element.prototype.matchesSelector ||\n        Element.prototype.msMatchesSelector ||\n        Element.prototype.webkitMatchesSelector;\n}\n\n/**\n * Rich Text Editor\n * -----------------------------------------------------------------------------\n * Wrap videos in div to force responsive layout.\n *\n * @namespace rte\n */\n\nvar rte = {\n  wrapTable: function() {\n    $('.rte table').wrap('<div class=\"rte__table-wrapper\"></div>');\n  },\n\n  iframeReset: function() {\n    var $iframeVideo = $(\n      '.rte iframe[src*=\"youtube.com/embed\"], .rte iframe[src*=\"player.vimeo\"]'\n    );\n    var $iframeReset = $iframeVideo.add('.rte iframe#admin_bar_iframe');\n\n    $iframeVideo.each(function() {\n      // Add wrapper to make video responsive\n      $(this).wrap('<div class=\"video-wrapper\"></div>');\n    });\n\n    $iframeReset.each(function() {\n      // Re-set 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      // Need to specifically target video and admin bar\n      this.src = this.src;\n    });\n  },\n\n  imageLink: function() {\n    // Add class to remove underline on image links.\n    $('.rte a:has(img)').addClass('image-link');\n  }\n};\n\ntemplates.register('Page Helpers', '*', {\n  onLoad: function() {\n    this.pageLinkFocus();\n    this.rteFixes();\n    this.disableOutlineOnClick();\n    this.checkIfMobileOS();\n  },\n\n  pageLinkFocus: function() {\n    // Common a11y fixes\n    a11y.focusHash({\n      className: 'js-focus-hidden'\n    });\n\n    a11y.bindInPageLinks({\n      className: 'js-focus-hidden',\n      ignore: '[data-link-no-focus]'\n    });\n  },\n\n  rteFixes: function() {\n    // Wrap videos in div to force responsive layout.\n    rte.wrapTable();\n    rte.iframeReset();\n    // Remove underline on image links.\n    rte.imageLink();\n  },\n\n  disableOutlineOnClick: function() {\n    // Disable focus outline when clicking, enable when navigating with keys\n    var classes = {\n      outlineDisabled: 'outline-disabled'\n    };\n\n    $('html').addClass(classes.outlineDisabled);\n\n    $(document).on('keyup', function() {\n      $('html').removeClass(classes.outlineDisabled);\n    });\n\n    $(document).on('click', function(evt) {\n      $('html').toggleClass(\n        classes.outlineDisabled,\n        !$(evt.target).is('input, textarea, select, button')\n      );\n    });\n  },\n\n  checkIfMobileOS: function() {\n    var ua = navigator.userAgent.toLowerCase();\n    var isIOS = /ipad|iphone|ipod/.test(ua) && !window.MSStream;\n    var isAndroid = /android/.test(ua);\n\n    if (isIOS) {\n      $('html')\n        .addClass('is-mobile-os')\n        .addClass('is-ios');\n    }\n    if (isAndroid) {\n      $('html')\n        .addClass('is-mobile-os')\n        .addClass('is-android');\n    }\n  }\n});\n\n/**\n * A11y Helpers\n * -----------------------------------------------------------------------------\n * A collection of useful functions that help make your theme more accessible\n * to users with visual impairments.\n *\n *\n * @namespace a11y\n */\n\nvar a11y$1 = {\n  /**\n   * For use when focus shifts to a container rather than a link\n   * eg for In-page links, after scroll, focus shifts to content area so that\n   * next `tab` is where user expects if focusing a link, just $link.focus();\n   *\n   * @param {JQuery} $element - The element to be acted upon\n   */\n  pageLinkFocus: function($element) {\n    var focusClass = 'js-focus-hidden';\n\n    $element\n      .first()\n      .attr('tabIndex', '-1')\n      .focus()\n      .addClass(focusClass)\n      .one('blur', callback);\n\n    function callback() {\n      $element\n        .first()\n        .removeClass(focusClass)\n        .removeAttr('tabindex');\n    }\n  },\n\n  /**\n   * Attempts to focus an element, and if unsuccessful adds tabindex to the\n   * element and focuses it. Tabindex is removed on element blur.\n   *\n   * @param {jQuery} $element - The element to be focused\n   */\n  forceFocus: function($element) {\n    $element.focus();\n\n    if (!$element.is(document.activeElement)) {\n      $element\n        .attr('tabindex', '0')\n        .focus()\n        .one('blur', function() {\n          $element.removeAttr('tabindex');\n        });\n    }\n  },\n\n  /**\n   * If there's a hash in the url, focus the appropriate element\n   */\n  focusHash: function() {\n    var hash = window.location.hash;\n\n    // is there a hash in the url? is it an element on the page?\n    if (hash && document.getElementById(hash.slice(1))) {\n      this.pageLinkFocus($(hash));\n    }\n  },\n\n  /**\n   * When an in-page (url w/hash) link is clicked, focus the appropriate element\n   */\n  bindInPageLinks: function() {\n    $('a[href*=#]').on(\n      'click',\n      function(evt) {\n        this.pageLinkFocus($(evt.currentTarget.hash));\n      }.bind(this)\n    );\n  },\n\n  /**\n   * Traps the focus in a particular container\n   *\n   * @param {object} options - Options to be used\n   * @param {jQuery} options.$container - Container to trap focus within\n   * @param {jQuery} options.$elementToFocus - Element to be focused when focus leaves container\n   * @param {string} options.namespace - Namespace used for new focus event handler\n   */\n  trapFocus: function(options) {\n    var eventName = options.namespace\n      ? 'focusin.' + options.namespace\n      : 'focusin';\n\n    if (!options.$elementToFocus) {\n      options.$elementToFocus = options.$container;\n    }\n\n    options.$container.attr('tabindex', '-1');\n    options.$elementToFocus.focus();\n\n    $(document).on(eventName, function(evt) {\n      if (\n        options.$container[0] !== evt.target &&\n        !options.$container.has(evt.target).length\n      ) {\n        options.$container.focus();\n      }\n    });\n  },\n\n  /**\n   * Removes the trap of focus in a particular container\n   *\n   * @param {object} options - Options to be used\n   * @param {jQuery} options.$container - Container to trap focus within\n   * @param {string} options.namespace - Namespace used for new focus event handler\n   */\n  removeTrapFocus: function(options) {\n    var eventName = options.namespace\n      ? 'focusin.' + options.namespace\n      : 'focusin';\n\n    if (options.$container && options.$container.length) {\n      options.$container.removeAttr('tabindex');\n    }\n\n    $(document).off(eventName);\n  }\n};\n\n/**\n *  prepareTransition\n *  jQuery Plugin for ensuring transitions with display:none or visibility:hidden\n *  are in the right state until the end of the transition\n *\n *  Developed by Jonathan Snook (http://snook.ca/)\n *  January 12, 2012\n *\n *  Requires the following CSS:\n *  .is-transitioning {\n *      display: block !important;\n *      visibility: visible !important;\n *  }\n *\n *  MIT license\n *  http://www.opensource.org/licenses/mit-license.php\n */\n\n$.fn.prepareTransition = function(){\n  return this.each(function(){\n    var el = $(this);\n    // remove the transition class upon completion\n    el.one('TransitionEnd webkitTransitionEnd transitionend oTransitionEnd', function(){\n      el.removeClass('is-transitioning');\n    });\n\n    // check the various CSS properties to see if a duration has been set\n    var cl = [\"transition-duration\", \"-moz-transition-duration\", \"-webkit-transition-duration\", \"-o-transition-duration\"];\n    var duration = 0;\n    $.each(cl, function(idx, itm){\n      duration || (duration = parseFloat( el.css( itm ) ));\n    });\n\n    // if I have a duration then add the class\n    if (duration != 0) {\n      el.addClass('is-transitioning');\n      el[0].offsetWidth; // check offsetWidth to force the style rendering\n    }\n  });\n};\n\nvar selectors$5 = {\n  passwordModal: '.password-modal',\n  modalOpenButton: '.password__open-modal',\n  modalCloseButton: '.password-modal__close',\n  modalInput: '.password-modal__input'\n};\nvar classes$5 = {\n  passwordModalOpen: 'password-modal--open',\n  disableScroll: 'disable-scroll'\n};\n\ntemplates.register('Password Template', 'password-template', {\n  onLoad: function(container) {\n    var $container = (this.$container = $(container));\n\n    $(selectors$5.modalOpenButton, $container).on(\n      'click',\n      this.showPasswordModal.bind(this)\n    );\n    $(selectors$5.modalCloseButton, $container).on(\n      'click',\n      this.hidePasswordModal.bind(this)\n    );\n\n    if ($('.errors', $container).length) {\n      this.showPasswordModal();\n    }\n  },\n\n  showPasswordModal: function() {\n    var $container = this.$container;\n    var $modal = $(selectors$5.passwordModal, $container);\n\n    a11y$1.trapFocus({\n      $container: $modal,\n      namespace: 'passwordModal',\n      $elementToFocus: $(selectors$5.modalCloseButton, $container)\n    });\n\n    $modal.prepareTransition().addClass(classes$5.passwordModalOpen);\n\n    $(selectors$5.modalOpenButton, $container).attr('aria-expanded', true);\n    $(selectors$5.modalInput, $container).focus();\n    $(document.documentElement).addClass(classes$5.disableScroll);\n    $(document).on('keyup', this.closeOnEscape.bind(this));\n  },\n\n  hidePasswordModal: function() {\n    var $container = this.$container;\n    var $modal = $(selectors$5.passwordModal, $container);\n\n    a11y$1.removeTrapFocus({ namespace: 'passwordModal' });\n\n    $modal.prepareTransition().removeClass(classes$5.passwordModalOpen);\n\n    $(document.documentElement).removeClass(classes$5.disableScroll);\n    $(selectors$5.modalOpenButton, $container)\n      .attr('aria-expanded', false)\n      .focus();\n\n    $(document).off('keyup', this.closeOnEscape.bind(this));\n  },\n\n  closeOnEscape: function(evt) {\n    if (evt.keyCode === 27) {\n      this.hidePasswordModal();\n    }\n  }\n});\n\nfunction Sections() {\n  this.$document = $(document);\n  this.namespace = '.section-js-events';\n\n  document.addEventListener(\n    'shopify:section:load',\n    function(evt) {\n      var id = evt.detail.sectionId;\n      var container = evt.target.querySelector(\n        '[data-section-id=\"' + id + '\"]'\n      );\n      var type = container.getAttribute('data-section-type');\n\n      this.load(type, container);\n    }.bind(this)\n  );\n}\n\n$.extend(Sections.prototype, {\n  /**\n   * Indexed list of all registered section types\n   */\n  registered: {},\n\n  /**\n   * List of all section instances\n   */\n  instances: [],\n\n  /**\n   * Indexed list of all registered global extensions\n   */\n  extensions: {\n    '*': []\n  },\n\n  /**\n   * Registers a section type with properties. Adds a new section constructor to\n   * the registered list of sections.\n   *\n   * @param {string} type\n   * @param {object} properties\n   */\n  register: function(type, properties) {\n    function Section(data) {\n      this.type = type;\n      Master$1.call(this, data);\n    }\n\n    Section.constructor = this.registered[type];\n    Section.prototype = Object.create(Master$1.prototype);\n    $.extend(Section.prototype, properties);\n\n    this.registered[type] = Section;\n  },\n\n  /**\n   * Loads all or the specified section types\n   */\n  load: function(types, containers) {\n    types = this._normalizeTypeParam(types);\n    containers = this._normalizeContainersParam(containers);\n\n    types.forEach(\n      function(type) {\n        var Section = this.registered[type];\n        var selection = containers;\n\n        if (typeof Section === 'undefined') {\n          return;\n        }\n\n        if (typeof selection === 'undefined') {\n          selection = document.querySelectorAll(\n            '[data-section-type=\"' + type + '\"]'\n          );\n        }\n\n        // Convert selection NodeList into an array\n        selection = Array.prototype.slice.call(selection);\n\n        selection.forEach(\n          function(container) {\n            if (this._instanceExists(container)) {\n              return;\n            }\n\n            var extensions = this.extensions['*'].concat(\n              this.extensions[type] || []\n            );\n            var instance = new Section({\n              container: container,\n              extensions: extensions,\n              id: container.getAttribute('data-section-id')\n            });\n\n            instance.trigger('section_load');\n\n            this.instances.push(instance);\n          }.bind(this)\n        );\n      }.bind(this)\n    );\n  },\n\n  /**\n   * Extend single, multiple, or all sections with additional functionality.\n   */\n  extend: function(types, extension) {\n    types = this._normalizeTypeParam(types);\n\n    types.forEach(\n      function(type) {\n        this.extensions[type] = this.extensions[type] || [];\n        this.extensions[type].push(extension);\n\n        if (typeof this.registered[type] === 'undefined') {\n          return;\n        }\n\n        this.instances.forEach(function(instance) {\n          if (instance.type !== type) {\n            return;\n          }\n          instance.extend(extension);\n        });\n      }.bind(this)\n    );\n  },\n\n  /**\n   * Checks if a particular section type has been loaded on the page.\n   */\n  isInstance: function(type) {\n    return typeof find(this.instances, { type: type }) === 'object';\n  },\n\n  /**\n   * Returns all instances of a section type on the page.\n   */\n  getInstances: function(type) {\n    return $.Deferred(\n      function(defer) {\n        var instances = filter(this.instances, { type: type });\n\n        if (instances.length === 0) {\n          defer.reject();\n        } else {\n          defer.resolve(instances);\n        }\n      }.bind(this)\n    );\n  },\n\n  /**\n   * Attaches an event handler to the document that is fired whenever any section\n   * instance triggers an event of specified type. Automatically adds a namespace\n   * for easy removal with `sections.off('event')`\n   */\n  on: function() {\n    // Convert arguments object into an array\n    var args = Array.prototype.slice.call(arguments);\n\n    // Apply the section namespace to any event handler created by this section\n    args[0] = args[0].concat(this.namespace);\n\n    this.$document.on.apply(this.$document, args);\n  },\n\n  /**\n   * Removes an event handler attached using `sections.on()`.\n   */\n  off: function() {\n    // Convert arguments object into an array\n    var args = Array.prototype.slice.call(arguments);\n\n    // Apply the section namespace to any event handler created by this section\n    args[0] = args[0].concat(this.namespace);\n\n    this.$document.off.apply(this.$document, arguments);\n  },\n\n  /**\n   * Triggers and event in every section instance\n   */\n  trigger: function() {\n    var triggerArgs = arguments;\n    this.instances.forEach(function(instance) {\n      instance.trigger.apply(instance, triggerArgs);\n    });\n  },\n\n  _sectionTrigger: function() {\n    this.$document.trigger.apply(this.$document, arguments);\n  },\n\n  _normalizeTypeParam: function(types) {\n    if (types === '*') {\n      types = Object.keys(this.registered);\n    } else if (typeof types === 'string') {\n      types = [types];\n    }\n\n    types = types.map(function(type) {\n      return type.toLowerCase();\n    });\n\n    return types;\n  },\n\n  _normalizeContainersParam: function(containers) {\n    if (!Array.isArray(containers) && typeof containers === 'object') {\n      // If a single container object is specified not inside a function\n      containers = [containers];\n    }\n    return containers;\n  },\n\n  _instanceExists: function(container) {\n    var instance = find(this.instances, {\n      id: container.getAttribute('data-section-id')\n    });\n    return typeof instance !== 'undefined';\n  }\n});\n\nvar sections = new Sections();\n/**\n * Master section class that all sections inherit from\n * @constructor\n *\n */\nfunction Master$1(data) {\n  this.container = data.container;\n  this.$container = $(this.container);\n  this.id = data.id;\n  this.namespace = '.' + data.id;\n  this.extensions = data.extensions || [];\n  this.$eventBinder = this.$container;\n\n  _applyExtensions.call(this);\n  _applyEditorHandlers.call(this);\n  _applyDefaultHandlers.call(this);\n}\n\nMaster$1.prototype = {\n  /* eslint-disable no-empty-function */\n  onLoad: function() {},\n  onUnload: function() {},\n  onSelect: function() {},\n  onDeselect: function() {},\n  onBlockSelect: function() {},\n  onBlockDeselect: function() {},\n\n  /* eslint-enable no-empty-function */\n\n  /**\n   * Attaches an event handler to an instance of a section. Only listens to\n   * events triggered by that section instance.\n   */\n  on: function() {\n    // Convert arguments object into an array\n    var args = Array.prototype.slice.call(arguments);\n\n    // Apply the section namespace to any event handler created by this section\n    args[0] = args[0].concat(this.namespace);\n\n    this.$eventBinder.on.apply(this.$eventBinder, args);\n    this.$eventBinder = this.$container;\n  },\n\n  /**\n   * Attaches an event handler to an instance of a section that is removed after\n   * being called once. Only listens to events triggered by that section instance.\n   */\n  one: function() {\n    // Convert arguments object into an array\n    var args = Array.prototype.slice.call(arguments);\n\n    // Apply the section namespace to any event handler created by this section\n    args[0] = args[0].concat(this.namespace);\n\n    this.$eventBinder.one.apply(this.$eventBinder, args);\n    this.$eventBinder = this.$container;\n  },\n\n  /**\n   * Removes an event handler that was attached using the `this.on()` method\n   */\n  off: function() {\n    // Convert arguments object into an array\n    var args = Array.prototype.slice.call(arguments);\n\n    // Apply the section namespace to any event handler created by this section\n    args[0] = args[0] || '';\n    args[0] = args[0].concat(this.namespace);\n\n    this.$eventBinder.off.apply(this.$eventBinder, arguments);\n    this.$eventBinder = this.$container;\n  },\n\n  /*\n   * Triggers an event on both this section instance and the sections object so\n   * so that any event handlers attached using `sections.on()` will be also\n   * triggered.\n   */\n  trigger: function() {\n    // Convert arguments object into an array\n    var args = Array.prototype.slice.call(arguments);\n\n    // Check what the second argument is. If there is already an array keep it.\n    args[1] = args[1] || [];\n\n    // Add the section instance as the first item in the array. This will force\n    // it to be the first param in the .on() callback\n    args[1].splice(0, 0, this);\n\n    this.$eventBinder.trigger.apply(this.$eventBinder, args);\n    this.$eventBinder = this.$container;\n  },\n\n  /**\n   * Extends this section instance with additional functionality.\n   */\n  extend: function(extension) {\n    var init = extension.init;\n    this.extensions.push(extension);\n\n    $.extend(this, omit(extension, 'init'));\n\n    if ($.isFunction(init)) {\n      init.apply(this);\n    }\n  }\n};\n\n/**\n * Shortcut methods that are automatically namespaced for easy removal, e.g.\n * $(document).on('event' + this.namespace);\n */\nMaster$1.prototype.document = function() {\n  var $document = $(document);\n  var self = this;\n  return {\n    on: function() {\n      self.$eventBinder = $document;\n      self.on.apply(self, arguments);\n    },\n    off: function() {\n      self.$eventBinder = $document;\n      self.off.apply(self, arguments);\n    },\n    trigger: function() {\n      self.$eventBinder = $document;\n      self.trigger.apply(self, arguments);\n    }\n  };\n};\n\n/**\n * Shortcut methods that are automatically namespaced for easy removal, e.g.\n * $(window).on('event' + this.namespace);\n */\nMaster$1.prototype.window = function() {\n  var $window = $(window);\n  var self = this;\n  return {\n    on: function() {\n      self.$eventBinder = $window;\n      self.on.apply(self, arguments);\n    },\n    off: function() {\n      self.$eventBinder = $window;\n      self.off.apply(self, arguments);\n    },\n    trigger: function() {\n      self.$eventBinder = $window;\n      self.trigger.apply(self, arguments);\n    }\n  };\n};\n\nfunction _applyExtensions() {\n  this.extensions.forEach(\n    function(extension) {\n      this.extend(extension);\n    }.bind(this)\n  );\n}\n\nfunction _applyEditorHandlers() {\n  $(document)\n    .on('shopify:section:unload' + this.namespace, _onSectionUnload.bind(this))\n    .on('shopify:section:select' + this.namespace, _onSelect.bind(this))\n    .on('shopify:section:deselect' + this.namespace, _onDeselect.bind(this))\n    .on('shopify:block:select' + this.namespace, _onBlockSelect.bind(this))\n    .on('shopify:block:deselect' + this.namespace, _onBlockDeselect.bind(this));\n}\n\nfunction _applyDefaultHandlers() {\n  this.on('section_load', this.onLoad.bind(this));\n  this.on('section_unload', this.onUnload.bind(this));\n  this.on('section_select', this.onSelect.bind(this));\n  this.on('section_deselect', this.onDeselect.bind(this));\n  this.on('block_select', this.onBlockSelect.bind(this));\n  this.on('block_deselect', this.onBlockDeselect.bind(this));\n}\n\nfunction _onSectionUnload(event) {\n  if (this.id !== event.detail.sectionId) return;\n\n  event.type = 'section_unload';\n  this.trigger(event);\n\n  this.off(this.namespace);\n  sections.off(this.namespace);\n  $(document).off(this.namespace);\n  $(window).off(this.namespace);\n\n  remove(sections.instances, { id: this.id });\n}\n\nfunction _onSelect(event) {\n  if (this.id !== event.detail.sectionId) return;\n\n  event.type = 'section_select';\n  this.trigger(event);\n}\n\nfunction _onDeselect(event) {\n  if (this.id !== event.detail.sectionId) return;\n\n  event.type = 'section_deselect';\n  this.trigger(event);\n}\n\nfunction _onBlockSelect(event) {\n  if (this.id !== event.detail.sectionId) return;\n\n  event.type = 'block_select';\n  this.trigger(event);\n}\n\nfunction _onBlockDeselect(event) {\n  if (this.id !== event.detail.sectionId) return;\n\n  event.type = 'block_deselect';\n  this.trigger(event);\n}\n\n/*\n\nCard Manager Extension\n--------------------------------------------------------------------------------\nManages the drawer functionilty of the cart drawer section\n\n\nEvents\n------------\n\nName: cards_load_start\nDescription: Fired before cards start to load\nPayload: none\n\nName: card_loaded\nDescription: Fired each time a card is loaded onto the page\nPayload: { object } Card DOM element\n\nName: cards_load_done\nDescription: Fired when all cards have loaded\nPayload: none\n\n*/\n\nvar classes$6 = {\n  cardListSubLoaded: 'card-list__sub-actions--loaded',\n  cardReveal: 'card--reveal',\n  searchTemplate: 'template-search'\n};\n\nvar selectors$6 = {\n  cardList: '.card-list',\n  cardListColumn: '.card-list__column',\n  cardListSub: '.card-list__sub-actions',\n  card: '.card',\n  cardWrapper: '.card__wrapper',\n  cardInfo: '.card__info'\n};\n\nvar cardManager = {\n  init: function() {\n    this.$cardList = $(selectors$6.cardList, this.$container);\n    this.$emptyColumn = $(selectors$6.cardListColumn, this.$container)\n      .clone()\n      .empty();\n    this.$cards = $(selectors$6.card, this.$container);\n\n    this.desktopColumnCount = this.$cardList.data('desktop-columns') || 2;\n    this.mobileColumnCount = this.$cardList.data('mobile-columns') || 1;\n    this.columnCount = utils.isMobile()\n      ? this.mobileColumnCount\n      : this.desktopColumnCount;\n    this.gridStyle = this.$cardList.data('grid-style') || 'collage';\n    this.windowWidth = $(window).outerWidth();\n    this.cardLoadPromises = [];\n\n    this.window().on('resize', this._onResize.bind(this));\n\n    this.on('keydown', selectors$6.cardWrapper, this._onCardTabDown.bind(this));\n    this.on('keyup', this._onCardTabUp.bind(this));\n\n    utils.promiseStylesheet().then(\n      function() {\n        this.cardsLoaded = this._loadCards();\n\n        $('html').removeClass('site-footer--hidden');\n\n        $(selectors$6.cardListSub, this.$container)\n          .prepareTransition()\n          .addClass(classes$6.cardListSubLoaded);\n      }.bind(this)\n    );\n  },\n\n  _onResize: function() {\n    var columnCount = utils.isMobile()\n      ? this.mobileColumnCount\n      : this.desktopColumnCount;\n\n    // Only replace columns if the number of columns changes.\n    if (this.columnCount !== columnCount) {\n      this.columnCount = columnCount;\n      this.$columns = this._replaceColumns();\n    }\n\n    $.each(\n      this.$cards,\n      function(index) {\n        if (utils.isMobile()) {\n          this.$columns.find(selectors$6.cardWrapper).removeAttr('style');\n        } else if (this._isAlignedRow(index + 1)) {\n          var rowNumber =\n            (index - (index % this.desktopColumnCount)) /\n              this.desktopColumnCount +\n            1;\n          this._matchRowHeights(this.$columns, rowNumber);\n        }\n      }.bind(this)\n    );\n  },\n\n  _onCardTabDown: function(evt) {\n    if (evt.keyCode !== 9) return; // Only continue if tab key is pressed\n\n    var index = $(evt.target).data('tabindex');\n\n    this.tabFromList = true;\n\n    if (evt.shiftKey) {\n      if (index > 1) {\n        evt.preventDefault();\n        $('[data-tabindex=' + (index - 1) + ']').focus();\n      }\n    } else {\n      if (index === this.$cards.length) {\n        $(selectors$6.cardWrapper, this.$container)\n          .last()\n          .focus();\n      } else {\n        evt.preventDefault();\n        $('[data-tabindex=' + (index + 1) + ']').focus();\n      }\n    }\n  },\n\n  _onCardTabUp: function(evt) {\n    if (evt.keyCode !== 9) return;\n\n    var tabFromList = this.tabFromList || false;\n    this.tabFromList = false;\n\n    if (!evt.shiftKey || tabFromList) return;\n\n    if (\n      $(selectors$6.cardWrapper, this.$container)\n        .last()\n        .is(evt.target)\n    ) {\n      $('[data-tabindex=' + this.$cards.length + ']').focus();\n    }\n  },\n\n  _loadCards: function() {\n    this.trigger('cards_load_start');\n\n    this.$columns = this._addColumns();\n\n    return this._promiseAllCardsReveal().always(\n      function() {\n        this.trigger('cards_load_done');\n      }.bind(this)\n    );\n  },\n\n  _addColumns: function() {\n    var $columns;\n    for (var i = 1; i < this.columnCount; i++) {\n      this.$cardList.append(this.$emptyColumn.clone());\n    }\n\n    $columns = $(selectors$6.cardListColumn, this.$container);\n    $columns.heights = fill(Array(this.columnCount), 0);\n    $columns.lengths = fill(Array(this.columnCount), 0);\n\n    return $columns;\n  },\n\n  _replaceColumns: function() {\n    var $columns = this.$emptyColumn.clone();\n\n    $columns.heights = fill(Array(this.columnCount), 0);\n    $columns.lengths = fill(Array(this.columnCount), 0);\n\n    for (var i = 1; i < this.columnCount; i++) {\n      $columns.push(this.$emptyColumn.clone()[0]);\n    }\n\n    $.each(\n      this.$cards,\n      function(index, card) {\n        this._positionCard($(card), index, $columns);\n      }.bind(this)\n    );\n\n    this.$cardList.html($columns);\n\n    return $columns;\n  },\n\n  _promiseAllCardsReveal: function() {\n    var series = $.Deferred().resolve();\n\n    this.$cards.each(\n      function(index, card) {\n        // Position the card in one of the available columns\n        this._positionCard($(card), index, this.$columns);\n\n        // Check that we have an aligned row and isMobile is false\n        if (!utils.isMobile() && this._isAlignedRow(index + 1)) {\n          var rowNumber = this.$columns.lengths[0];\n          this._matchRowHeights(this.$columns, rowNumber);\n        }\n\n        // We want to check immediately if the card should be revealed, not after\n        // a previous `.then()` in our series has been fulfilled.\n        var promiseRevealReady = this._promiseRevealReady(card);\n\n        // Add the following steps to our series of promises for each card:\n        // 1. Promise the card is ready to be revealed\n        // 2. Reveal the card\n        // 3. Delay 80ms\n        series = series\n          .then(function() {\n            return promiseRevealReady;\n          })\n          .then(this._revealCard.bind(this, card))\n          .then(function() {\n            return $.Deferred(function(defer) {\n              setTimeout(defer.resolve, 80);\n            });\n          });\n      }.bind(this)\n    );\n    return series;\n  },\n\n  _revealCard: function(card) {\n    var $card = $(card);\n\n    this.trigger('card_loaded', [$card[0]]);\n\n    requestAnimationFrame($card.addClass.bind($card, classes$6.cardReveal));\n  },\n\n  // A promise that will be fulfilled when a card is ready to be revealed\n  _promiseRevealReady: function(card) {\n    return $.Deferred(function(defer) {\n      var $card = $(card);\n\n      if (!($('html').hasClass('is-ios') && Shopify.designMode)) {\n        // If we already triggered the animation, then resolve the promise to show\n        // the card. Wrap the position check in requestAnimationFrame to make sure\n        // that the browser is done positioning the element before it reads its\n        // position.\n        requestAnimationFrame(function() {\n          if (utils.isInOrAboveViewport(card)) {\n            return defer.resolve();\n          }\n        });\n\n        // If we haven't triggered the animation, then wait for the animation\n        // event for this card and then resolve the promise to show the card.\n        $card.on('animate_element', onAnimate);\n\n        function onAnimate(evt, element) {\n          if (element !== card) return;\n\n          $card.off('animate_element', onAnimate);\n          defer.resolve();\n        }\n      } else {\n        $(card).addClass(classes$6.cardReveal);\n        defer.resolve();\n      }\n    });\n  },\n\n  _positionCard: function($card, index, $columns) {\n    var columnIndex = 0;\n    var cardHeight = $card.outerHeight(true);\n\n    if (this.gridStyle === 'collage') {\n      columnIndex = $columns.heights.indexOf(\n        Math.min.apply(Math, $columns.heights)\n      ); // Default to shortest column\n      var threshold = 150;\n      for (var i = 0; i < $columns.heights.length; i++) {\n        if ($columns.heights[columnIndex] > $columns.heights[i] - threshold) {\n          columnIndex = i;\n          break;\n        }\n      }\n    } else {\n      columnIndex = $columns.lengths.indexOf(\n        Math.min.apply(Math, $columns.lengths)\n      );\n    }\n\n    $columns.eq(columnIndex).append($card);\n\n    // Restore the height if it is 0 (needed for matching heights in the\n    // 'aligned' grid)\n    if ($card.outerHeight() === 0 && !utils.isMobile()) {\n      $card.find(selectors$6.cardWrapper).outerHeight(cardHeight);\n    }\n\n    if (this.gridStyle === 'collage') {\n      $columns.heights[columnIndex] += cardHeight;\n    }\n    $columns.lengths[columnIndex]++;\n\n    $card.find('a').attr('data-tabindex', index + 1);\n  },\n\n  _matchRowHeights: function($columns, rowNumber) {\n    var maxHeight = 0;\n    var currentCardHeight = 0;\n    var rowSelector = '';\n    var isArticle = false;\n\n    // Construct the selector for the cards in the current row\n    for (var i = 0; i < $columns.length; i++) {\n      rowSelector +=\n        \"[data-tabindex='\" + ((rowNumber - 1) * $columns.length + i + 1) + \"']\";\n      if (i < $columns.length - 1) {\n        rowSelector += ', ';\n      }\n    }\n    var $row = $columns.find(rowSelector).parent();\n\n    for (var j = 0; j < $row.length; j++) {\n      isArticle = $($row[j])\n        .find(selectors$6.cardWrapper)\n        .is('.card--article');\n\n      currentCardHeight = $($row[j])\n        .find(selectors$6.cardWrapper)\n        .outerWidth();\n      if ($(document.body).hasClass(classes$6.searchTemplate) && isArticle) {\n        currentCardHeight = $($row[j])\n          .find(selectors$6.cardWrapper)\n          .outerHeight();\n      } else {\n        currentCardHeight =\n          $($row[j])\n            .find(selectors$6.cardWrapper)\n            .outerWidth() +\n          $($row[j])\n            .find(selectors$6.cardInfo)\n            .outerHeight();\n      }\n\n      if (currentCardHeight > maxHeight) {\n        maxHeight = currentCardHeight;\n      }\n    }\n\n    $row.find(selectors$6.cardWrapper).outerHeight(maxHeight);\n  },\n\n  _isAlignedRow: function(index) {\n    // Check if the gridStyle is 'grid', and if we are at the end of a row or\n    // at the last card\n    return (\n      this.gridStyle === 'grid' &&\n      (index % this.desktopColumnCount === 0 || index === this.$cards.length)\n    );\n  }\n};\n\n/*\n\nBlog Template Section\n--------------------------------------------------------------------------------\nCreates a staggered card grid for the blog template.\n\n*/\n\n// Extensions\n// Libs\nsections.register('blog-template', {\n  onLoad: function() {\n    this.extend(cardManager);\n  }\n});\n\nvar cart = {\n  isUpdating: false,\n\n  getCart: function() {\n    return $.getJSON('/cart.js');\n  },\n\n  on: function(event, cb) {\n    $(this).on(event, cb);\n  },\n\n  trigger: function(event, data) {\n    $(this).triggerHandler(event, data);\n  },\n\n  updateNote: function(note) {\n    return this._promiseChange({\n      url: '/cart/update.js',\n      dataType: 'json',\n      data: {\n        note: note || ''\n      }\n    });\n  },\n\n  addItem: function(id, quantity) {\n    return this._promiseChange({\n      url: '/cart/add.js',\n      dataType: 'json',\n      data: {\n        id: id,\n        quantity: typeof quantity === 'undefined' ? 1 : quantity\n      }\n    });\n  },\n\n  addItemFromForm: function(data) {\n    return this._promiseChange({\n      url: '/cart/add.js',\n      dataType: 'json',\n      processData: false,\n      contentType: false,\n      type: 'POST',\n      data: data\n    });\n  },\n\n  removeItem: function(lineNumber) {\n    return this._promiseChange({\n      url: '/cart/change.js',\n      dataType: 'json',\n      data: {\n        line: lineNumber,\n        quantity: 0\n      }\n    });\n  },\n\n  changeItem: function(lineNumber, quantity) {\n    return this._promiseChange({\n      url: '/cart/change.js',\n      dataType: 'json',\n      data: {\n        line: lineNumber,\n        quantity: quantity\n      }\n    });\n  },\n\n  saveLocalState: function(state) {\n    if (utils.isLocalStorageSupported()) {\n      localStorage.shopify_cart_state = JSON.stringify(state); // eslint-disable-line camelcase\n    }\n\n    return state;\n  },\n\n  getLocalState: function() {\n    // eslint-disable-line consistent-return\n    if (utils.isLocalStorageSupported()) {\n      return JSON.parse(localStorage.shopify_cart_state || '');\n    }\n  },\n\n  _promiseChange: function(parameters) {\n    var promiseRequest = $.ajax(parameters);\n\n    this.isUpdating = true;\n\n    // If offline, provide a rejected promise so that an error is thrown.\n    if (navigator && !theme.isOnline) {\n      promiseRequest = $.Deferred().reject();\n    }\n\n    return (\n      promiseRequest\n        // Some cart API requests don't return the cart object. If there is no\n        // cart object then get one before proceeding.\n        .then(\n          function(state) {\n            if (typeof state.token === 'undefined') {\n              return this.getCart();\n            } else {\n              return state;\n            }\n          }.bind(this)\n        )\n        .then(this.saveLocalState)\n        .then(this._triggerChangeEvent.bind(this))\n        .catch(this._triggerErrorEvent.bind(this))\n        .always(\n          function() {\n            this.isUpdating = false;\n          }.bind(this)\n        )\n    );\n  },\n\n  _triggerChangeEvent: function(state) {\n    this.trigger('change', state);\n    return state;\n  },\n\n  _triggerErrorEvent: function(error) {\n    this.trigger('error', error);\n\n    // We want to throw an error event, but also let any future 'catch' down\n    // the promise chain to catch this error, so we re-throw the error.\n    throw error;\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 *\n * Alternatives\n * - Accounting.js - http://openexchangerates.github.io/accounting.js/\n *\n */\n\nvar moneyFormat = '${{amount}}'; // eslint-disable-line camelcase\n\nvar currency = {\n  formatMoney: function(cents, format) {\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 = defaultTo(precision, 2);\n      thousands = defaultTo(thousands, ',');\n      decimal = 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(\n        /(\\d)(?=(\\d\\d\\d)+(?!\\d))/g,\n        '$1' + thousands\n      );\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        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        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      case 'amount_with_apostrophe_separator':\n        value = formatWithDelimiters(cents, 2, \"'\");\n        break;\n    }\n\n    return formatString.replace(placeholderRegex, value);\n  }\n};\n\n/**\n * Image Helper Functions\n * -----------------------------------------------------------------------------\n * A collection of functions that help with basic image operations.\n *\n */\n\nvar images = {\n  /**\n   * Preloads an image in memory and uses the browsers cache to store it until needed.\n   *\n   * @param {Array} images - A list of image urls\n   * @param {String} size - A shopify image size attribute\n   */\n\n  preload: function(images, size) {\n    if (typeof images === 'string') {\n      images = [images];\n    }\n\n    for (var i = 0; i < images.length; i++) {\n      var image = images[i];\n\n      this.loadImage(this.getSizedImageUrl(image, size));\n    }\n  },\n\n  /**\n   * Loads and caches an image in the browsers cache.\n   * @param {string} path - An image url\n   */\n  loadImage: function(path) {\n    new Image().src = path;\n  },\n\n  /**\n   * Swaps the src of an image for another OR returns the imageURL to the callback function\n   * @param image\n   * @param element\n   * @param callback\n   */\n  switchImage: function(image, element, callback) {\n    var size = this.imageSize(element.src);\n    var imageUrl = this.getSizedImageUrl(image.src, size);\n\n    if (callback) {\n      callback(imageUrl, image, element); // eslint-disable-line callback-return\n    } else {\n      element.src = imageUrl;\n    }\n  },\n\n  /**\n   * +++ Useful\n   * Find the Shopify image attribute size\n   *\n   * @param {string} src\n   * @returns {null}\n   */\n  imageSize: function(src) {\n    src = src || '';\n\n    var match = src.match(\n      /.+_((?:pico|icon|thumb|small|compact|medium|large|grande)|\\d{1,4}x\\d{0,4}|x\\d{1,4})[_\\\\.@]/\n    );\n\n    if (match !== null) {\n      return match[1];\n    }\n\n    return null;\n  },\n\n  /**\n   * +++ Useful\n   * Adds a Shopify size attribute to a URL\n   *\n   * @param src\n   * @param size\n   * @returns {*}\n   */\n  getSizedImageUrl: function(src, size) {\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(\n      /\\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif)(\\?v=\\d+)?$/i\n    );\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  removeProtocol: function(path) {\n    return path.replace(/http(s)?:/, '');\n  }\n};\n\n/*\n\nAjax Cart Extension\n--------------------------------------------------------------------------------\nManages the AJAX powered cart functionality\n\n\nEvents\n------------\n\nName: cart_update_start\nDescription: Fired before the cart DOM updates\nPayload: { object } Cart state object\n\nName: cart_update_done\nDescription: Fired after the cart DOM updates\nPayload: { object } Cart state object\n\nName: cart_error\nDescription: Fired when there is an with the last cart request\nPayload: { object } Error object\n\nName: cart_item_quantity_error\nDescription: Fired when there is problem with the requested item quanitity\nPayload: { object } Item with valid quantity\n\nName: cart_storage_state_change\nDescription: Fired when the cart state changes in another active tab\nPayload: { object } Cart state object\n\nName: cart_item_quantity_change\nDescription: Fired when the user selects a new quantity in the item input\nPayload: { string } Item ID\nPayload: { number } Quantity\n\nName: cart_item_remove\nDescription: Fired when the user selects to remove an item\nPayload: { string } Item ID\n\nName: cart_note_change\nDescription: Fired when the user changes the value in the note textarea\nPayload: { string } Note value\n\nName: cart_submit\nDescription: Fired when the user submits the cart form and proceeds to the checkout\nPayload: none\n\n*/\n\nvar data = {\n  itemId: 'data-cart-item-id',\n  itemLineNumber: 'data-cart-item-line-number'\n};\n\nvar selectors$8 = {\n  ajaxCart: '.cart-drawer',\n  itemList: '[data-cart-item-list]',\n  item: '[data-cart-item]',\n  itemId: '[data-cart-item-id]',\n  itemHref: '[data-cart-item-href]',\n  itemImage: '[data-cart-item-image]',\n  itemBackgroundImage: '[data-cart-item-background-image]',\n  itemTitle: '[data-cart-item-title]',\n  itemVariantTitle: '[data-cart-item-variant-title]',\n  itemDetailsList: '[data-cart-item-details-list]',\n  itemProperty: '[data-cart-item-property]',\n  itemSellingPlanName: '[data-cart-item-selling-plan-name]',\n  itemDiscountList: '[data-cart-item-discount-list]',\n  itemDiscount: '[data-cart-item-discount]',\n  itemDiscountTitle: '[data-cart-item-discount-title]',\n  itemDiscountAmount: '[data-cart-item-discount-amount]',\n  itemLabelQuantity: '[data-cart-item-label-quantity]',\n  itemInputQuantity: '[data-cart-item-input-quantity]',\n  itemDelete: '[data-cart-item-delete]',\n  itemPriceContainer: '[data-cart-item-price-container]',\n  itemLinePriceContainer: '[data-cart-item-line-price-container]',\n  itemMessage: '[data-item-message]',\n  cartDiscountContainer: '[data-cart-discount-container]',\n  cartDiscount: '[data-cart-discount]',\n  cartDiscountTitle: '[data-cart-discount-title]',\n  cartDiscountAmount: '[data-cart-discount-amount]',\n  cartNoteContainer: '[data-cart-note-container]',\n  cartNoteInput: '[data-cart-note]',\n  cartMessage: '[data-cart-message]',\n  cartSubtotal: '[data-cart-subtotal]',\n  cartSubmit: '[data-cart-submit]'\n};\n\nvar classes$8 = {\n  cartTemplate: 'ajax-cart__template',\n  cartItemRemove: 'ajax-cart__item--remove',\n  cartError: 'ajax-cart--error',\n  visuallyHidden: 'visually-hidden',\n  cartDiscountActive: 'ajax-cart__discount-container--active',\n  btnLoaderActive: 'btn--loader-active'\n};\n\nvar ajaxCart = {\n  init: function() {\n    this.$ajaxCart = $(selectors$8.ajaxCart, this.$container);\n    this.$itemTemplate = $(selectors$8.item, this.$container)\n      .first()\n      .clone();\n    this.$propertyTemplate = $(selectors$8.itemProperty, this.$container)\n      .first()\n      .clone();\n    this.$sellingPlanNameTemplate = $(\n      selectors$8.itemSellingPlanName,\n      this.$container\n    )\n      .first()\n      .clone();\n    this.$discountTemplate = $(selectors$8.itemDiscount, this.$container)\n      .first()\n      .clone();\n    this.$cartDiscountTemplate = $(selectors$8.cartDiscount, this.$container)\n      .first()\n      .clone();\n\n    cart.on('quantity', this._onQuantityError.bind(this));\n    cart.on(\n      'change',\n      function(event, state) {\n        this.update(state);\n      }.bind(this)\n    );\n\n    this.on(\n      'input',\n      selectors$8.itemInputQuantity,\n      debounce(this._onItemQuantityChange.bind(this), 500)\n    );\n    this.on(\n      'blur',\n      selectors$8.itemInputQuantity,\n      this._onItemQuantityEmptyBlur.bind(this)\n    );\n    this.on('focus', selectors$8.itemInputQuantity, this._highlightText);\n    this.on('click', selectors$8.itemDelete, this._onItemDelete.bind(this));\n    this.on('change', selectors$8.cartNoteInput, this._onNoteChange.bind(this));\n    this.on('submit', this._onSubmit.bind(this));\n\n    this.window().on('storage', this._onStorageStateChange.bind(this));\n  },\n\n  refresh: function() {\n    cart.getCart().then(this.update.bind(this));\n  },\n\n  update: function(state) {\n    this.trigger('cart_update_start', [state]);\n\n    var $cart = this._createCart(state);\n    morphdom(this.$container[0], $cart[0]);\n\n    this.trigger('cart_update_done', [state]);\n  },\n\n  _onError: function(error) {\n    this.trigger('cart_error', [error]);\n\n    this.$container.addClass(classes$8.cartError);\n\n    $(selectors$8.item, this.$container).removeClass(classes$8.cartItemRemove);\n    $(selectors$8.cartMessage, this.$container).text(theme.strings.cartError);\n  },\n\n  _onQuantityError: function(event, item) {\n    this.trigger('cart_item_quantity_error', [item]);\n\n    this.$container.addClass(classes$8.cartError);\n\n    var quantityError = theme.strings.cartQuantityError\n      .replace('[quantity]', item.quantity)\n      .replace('[title]', item.title);\n\n    var $itemMessageElement = $(\n      selectors$8.itemMessage,\n      $('[' + data.itemId + '=\"' + item.key + '\"]')\n    );\n\n    $itemMessageElement.removeAttr('aria-hidden');\n    $itemMessageElement.html(quantityError);\n  },\n\n  _createCart: function(state) {\n    var $container = this.$container.clone();\n\n    $container.removeClass(classes$8.cartError);\n    $(selectors$8.cartMessage, $container).text('');\n\n    $(selectors$8.item, $container)\n      .not(selectors$8.cartNoteContainer)\n      .remove();\n\n    $(selectors$8.itemList, $container).prepend(this._createItemList(state));\n\n    $(selectors$8.cartNoteInput, $container).val(state.note);\n\n    $(selectors$8.cartDiscountContainer, $container).toggleClass(\n      classes$8.cartDiscountActive,\n      state.total_discount !== 0\n    );\n\n    $(selectors$8.cartDiscountContainer, $container).html(\n      this._createCartDiscountList(state)\n    );\n\n    $(selectors$8.cartSubtotal, $container).html(\n      currency.formatMoney(state.total_price, theme.moneyFormat)\n    );\n\n    $(selectors$8.cartSubmit, $container).attr(\n      'disabled',\n      state.items.length === 0\n    );\n\n    return $container;\n  },\n\n  _createItemList: function(state) {\n    return $.map(\n      state.items,\n      function(item, index) {\n        var $item = this.$itemTemplate\n          .clone()\n          .removeClass(classes$8.cartTemplate);\n        var detailsList = this._createDetailsList(item);\n        var discountList = this._createDiscountList(item);\n        var itemPrice = this._createItemPrice(item);\n        var itemLinePrice = this._createItemTotalPrice(item);\n\n        $item\n          .find(selectors$8.itemId)\n          .addBack(selectors$8.itemId)\n          .attr(data.itemId, item.key)\n          .attr(data.itemLineNumber, (index += 1));\n\n        $(selectors$8.itemHref, $item).attr('href', item.url);\n\n        $(selectors$8.itemImage, $item)\n          .attr(\n            'src',\n            item.image ? images.getSizedImageUrl(item.image, 'medium') : ''\n          )\n          .toggleClass('hide', typeof item.image !== 'string');\n\n        $(selectors$8.itemBackgroundImage, $item).css(\n          'background-image',\n          item.image\n            ? 'url(' + images.getSizedImageUrl(item.image, 'medium') + ')'\n            : 'none'\n        );\n\n        $(selectors$8.itemTitle, $item).text(item.product_title);\n\n        $(selectors$8.itemVariantTitle, $item).text(item.variant_title);\n\n        $(selectors$8.itemPriceContainer, $item).html(itemPrice);\n\n        $(selectors$8.itemLinePriceContainer, $item).html(itemLinePrice);\n\n        $(selectors$8.itemLabelQuantity, $item).attr(\n          'for',\n          'quantity_' + item.key\n        );\n\n        $(selectors$8.itemInputQuantity, $item)\n          .attr('id', 'quantity_' + item.key)\n          .val(item.quantity);\n\n        $(selectors$8.itemDetailsList, $item).html(detailsList);\n\n        $(selectors$8.itemDiscountList, $item).html(discountList);\n\n        return $item[0];\n      }.bind(this)\n    );\n  },\n\n  _createItemPrice: function(item) {\n    var itemPrice = '';\n\n    itemPrice += this._createItemProductPrice(\n      item.original_price,\n      item.final_price\n    );\n\n    if (item.unit_price_measurement) {\n      itemPrice += this._createItemUnitPrice(item);\n    }\n\n    return itemPrice;\n  },\n\n  _createItemTotalPrice: function(item) {\n    var itemPrice = '';\n\n    itemPrice += this._createItemProductPrice(\n      item.original_line_price,\n      item.final_line_price\n    );\n\n    return itemPrice;\n  },\n\n  _createItemProductPrice: function(original_price, final_price) {\n    var itemPrice = '';\n\n    if (original_price !== final_price) {\n      itemPrice +=\n        '<span class=\"visually-hidden\">' +\n        theme.strings.regularPrice +\n        '</span>' +\n        '<del class=\"cart-item__original-price\">' +\n        currency.formatMoney(original_price, theme.moneyFormat) +\n        '</del>' +\n        '<span class=\"visually-hidden\">' +\n        theme.strings.salePrice +\n        '</span>' +\n        '<span class=\"order-discount cart-item__price\">' +\n        currency.formatMoney(final_price, theme.moneyFormat) +\n        '</span>';\n    } else {\n      itemPrice +=\n        '<span class=\"cart-item__original-price cart-item__price\">' +\n        currency.formatMoney(original_price, theme.moneyFormat) +\n        '</span>';\n    }\n\n    return itemPrice;\n  },\n\n  _createItemUnitPrice: function(item) {\n    return (\n      '<span class=\"product-price-unit\">' +\n      '<span class=\"visually-hidden\">' +\n      theme.strings.unitPrice +\n      '</span>' +\n      '<span>' +\n      currency.formatMoney(item.unit_price, theme.moneyFormat) +\n      '</span>' +\n      '<span aria-hidden=\"true\">/</span>' +\n      '<span class=\"visually-hidden\">&nbsp;' +\n      theme.strings.unitPriceSeparator +\n      '&nbsp;</span>' +\n      '<span>' +\n      (item.unit_price_measurement.reference_value !== 1\n        ? item.unit_price_measurement.reference_value\n        : '') +\n      item.unit_price_measurement.reference_unit +\n      '</span>' +\n      '</span>'\n    );\n  },\n\n  _createDetailsList: function(item) {\n    var productDetailsHTML = [];\n\n    if (item.selling_plan_allocation) {\n      productDetailsHTML = productDetailsHTML.concat(\n        this._getSellingPlanName(item.selling_plan_allocation.selling_plan.name)\n      );\n    }\n\n    if (item.properties !== null && Object.keys(item.properties).length !== 0) {\n      productDetailsHTML = productDetailsHTML.concat(\n        this._getPropertyList(item.properties)\n      );\n    }\n\n    return productDetailsHTML;\n  },\n\n  _getSellingPlanName: function(selling_plan_name) {\n    var $sellingPlanNameElement = this.$sellingPlanNameTemplate.clone();\n\n    $sellingPlanNameElement\n      .text(selling_plan_name)\n      .removeClass(classes$8.visuallyHidden);\n\n    return $sellingPlanNameElement[0];\n  },\n\n  _getPropertyList: function(properties) {\n    return $.map(\n      properties,\n      function(value, key) {\n        var $property = this.$propertyTemplate\n          .clone()\n          .removeClass(classes$8.cartTemplate);\n\n        // Line item properties prefixed with an underscore are not to be displayed\n        if (key.charAt(0) === '_') return;\n\n        // Line item properties with no value are not to be displayed\n        if (value === '') return;\n\n        if (value.indexOf('/uploads/') === -1) {\n          $property.text(key + ': ' + value);\n        } else {\n          $property.html(\n            key + ': <a href=\"' + value + '\">' + value.split('/').pop() + '</a>'\n          );\n        }\n\n        return $property[0];\n      }.bind(this)\n    );\n  },\n\n  _createDiscountList: function(item) {\n    return $.map(\n      item.line_level_discount_allocations,\n      function(discount) {\n        var $discount = this.$discountTemplate\n          .clone()\n          .removeClass(classes$8.cartTemplate);\n        $discount\n          .find(selectors$8.itemDiscountTitle)\n          .text(discount.discount_application.title);\n        $discount\n          .find(selectors$8.itemDiscountAmount)\n          .html(currency.formatMoney(discount.amount, theme.moneyFormat));\n        return $discount[0];\n      }.bind(this)\n    );\n  },\n\n  _createCartDiscountList: function(cart$$1) {\n    return $.map(\n      cart$$1.cart_level_discount_applications,\n      function(discount) {\n        var $discount = this.$cartDiscountTemplate\n          .clone()\n          .removeClass(classes$8.cartTemplate);\n        $discount.find(selectors$8.cartDiscountTitle).text(discount.title);\n        $discount\n          .find(selectors$8.cartDiscountAmount)\n          .html(\n            currency.formatMoney(\n              discount.total_allocated_amount,\n              theme.moneyFormat\n            )\n          );\n        return $discount[0];\n      }.bind(this)\n    );\n  },\n\n  _onStorageStateChange: function(evt) {\n    if (evt.key !== 'shopify_cart_state') return;\n\n    var state = cart.getLocalState();\n\n    this.trigger('cart_storage_state_change', [state]);\n    this.update(cart.getLocalState());\n  },\n\n  _onItemQuantityChange: function(evt) {\n    var $input = $(evt.target);\n    var id = $input.closest(selectors$8.item).attr(data.itemId);\n    var lineItemNumber = parseInt(\n      $input.closest(selectors$8.item).attr(data.itemLineNumber)\n    );\n    var quantity = $input.val();\n\n    // Don't update the cart when a input is empty. Also make sure an input\n    // does not remain empty by checking blur event.\n    if (quantity === '') return;\n\n    this.trigger('cart_item_quantity_change', [id, quantity]);\n\n    cart.changeItem(lineItemNumber, quantity).catch(this._onError.bind(this));\n  },\n\n  _onItemQuantityEmptyBlur: function(evt) {\n    var $input = $(evt.target);\n    var value = $input.val();\n\n    if (value !== '') return;\n\n    this.refresh();\n  },\n\n  _onItemDelete: function(evt) {\n    evt.preventDefault();\n\n    var $deleteButton = $(evt.target);\n    var $items = $(selectors$8.item, this.$container);\n    var $item = $deleteButton.closest(selectors$8.item);\n    var $note = $(selectors$8.cartNoteContainer, this.$container);\n    var id = $item.attr(data.itemId);\n    var lineItemNumber = parseInt($item.attr(data.itemLineNumber));\n\n    this.trigger('cart_item_remove', [id]);\n\n    if ($items.length === 2 && $items.last().is($note)) {\n      $note.addClass(classes$8.cartItemRemove);\n\n      utils\n        .promiseTransitionEnd($(selectors$8.itemList, this.$container))\n        .then(function() {\n          $note.removeClass(classes$8.cartItemRemove);\n        });\n    }\n\n    $item.addClass(classes$8.cartItemRemove);\n\n    utils.promiseAnimationEnd($item).then(\n      function() {\n        cart.removeItem(lineItemNumber).catch(this._onError.bind(this));\n      }.bind(this)\n    );\n  },\n\n  _onNoteChange: function(evt) {\n    var value = $(evt.target).val();\n\n    this.trigger('cart_note_change', [value]);\n\n    cart.updateNote(value).catch(this._onError.bind(this));\n  },\n\n  _onSubmit: function(evt) {\n    if (cart.isUpdating) {\n      evt.preventDefault();\n    } else {\n      $(selectors$8.cartSubmit, this.$container).addClass(\n        classes$8.btnLoaderActive\n      );\n      this.trigger('cart_submit');\n    }\n  },\n\n  _highlightText: function(evt) {\n    $(evt.target).select();\n  }\n};\n\n/*\n\nCart Drawer Extension\n--------------------------------------------------------------------------------\nManages the drawer functionality of the cart drawer section\n\n\nEvents\n------------\n\nName: drawer_open_start\nDescription: Fired before the cart drawer starts to open\nPayload: none\n\nName: drawer_open_transitioning\nDescription: Fired while the cart drawer is transitioning open\nPayload: none\n\nName: drawer_open_done\nDescription: Fired while the cart drawer is done transitioning open\nPayload: none\n\nName: drawer_close_start\nDescription: Fired before the cart drawer starts to close\nPayload: none\n\nName: drawer_close_transitioning\nDescription: Fired while the cart drawer is transitioning close\nPayload: none\n\nName: drawer_close_done\nDescription: Fired while the cart drawer is done transitioning close\nPayload: none\n\nName: drawer_dragging\nDescription: Fired while the cart drawer is being dragged closed by the user\nPayload: { object } Coordinates\n\n*/\n\nvar classes$9 = {\n  drawerActive: 'drawer--active',\n  disableScroll: 'disable-scroll'\n};\n\nvar selectors$9 = {\n  drawerPush: '[data-drawer-push]',\n  drawerCover: '.drawer-cover',\n  mainContent: '.main-content',\n  siteHeader: '.site-header'\n};\n\nvar drawer = {\n  init: function() {\n    // Used to keep track of which button toggled the drawer so we can return\n    // focus to it when the drawer closes.\n    this.$toggleButton = null;\n    this.draggingAction = null;\n    this.namespaceTouch = '.onTouchStart';\n    this.namespaceOpen = '.onOpen';\n\n    // Drawer width might change when resizing the window. Make sure that we have\n    // the right drawer width to translate the page with.\n    this.document().on('resize', this._onWindowResize.bind(this));\n  },\n\n  drawerOpen: function(evt) {\n    this.trigger('drawer_open_start');\n\n    a11y$1.trapFocus({\n      $container: this.$container,\n      namespace: 'drawer'\n    });\n\n    // If this function is used as an event handler, e.g. a click event on a\n    // button to open the drawer, than make sure to set whatever element that\n    // triggered the event to aria-expanded = true\n    if (evt && evt.currentTarget) {\n      this.$toggleButton = $(evt.target).attr('aria-expanded', true);\n    }\n\n    utils.disableScrollBody();\n\n    $('body').addClass(classes$9.drawerActive);\n    this.trigger('drawer_open_transitioning');\n\n    utils.promiseTransitionEnd(this.$container).then(\n      function() {\n        utils.enableTabbingOfChildren(this.$container);\n        this.$container.attr('aria-hidden', false);\n\n        this.document().on(\n          'click touchend' + this.namespaceOpen,\n          selectors$9.drawerCover,\n          this.drawerClose.bind(this)\n        );\n        this.document().on(\n          'keyup' + this.namespaceOpen,\n          this._closeOnEscape.bind(this)\n        );\n        this.document().on(\n          'touchstart' + this.namespaceOpen,\n          this._onTouchStart.bind(this)\n        );\n\n        this.trigger('drawer_open_done');\n      }.bind(this)\n    );\n  },\n\n  drawerClose: function() {\n    this.trigger('drawer_close_start');\n\n    a11y$1.removeTrapFocus({ namespace: 'drawer' });\n\n    // If we detected a toggle button on open and set one, then let's return the\n    // focus to it and then remove our saved reference to it.\n    if (this.$toggleButton && this.$toggleButton.length) {\n      this.$toggleButton.focus().attr('aria-expanded', false);\n      this.$toggleButton = null;\n    }\n\n    utils.enableScrollBody();\n    utils.disableTabbingOfChildren(this.$container);\n    this.$container.attr('aria-hidden', true);\n\n    this.document().off(this.namespaceOpen);\n\n    $('body').removeClass(classes$9.drawerActive);\n    this.trigger('drawer_close_transitioning');\n\n    utils.promiseTransitionEnd(this.$container).then(\n      function() {\n        this.trigger('drawer_close_done');\n      }.bind(this)\n    );\n  },\n\n  _onWindowResize: function() {\n    // Reset in case width changes on resize. Used for determining how much we\n    // want to translate the page to the side. Translating === sliderWidth.\n    this.sliderWidth = 0;\n  },\n\n  _onTouchStart: function(event) {\n    this.startPosition = utils.pointerEventToXY(event);\n    this.$elementsToPush = this.$elementsToPush || $(selectors$9.drawerPush); // eslint-disable-line shopify/jquery-dollar-sign-reference\n    this.sliderWidth = this.sliderWidth || this.$container.width();\n    this.isDragging = false;\n\n    this.document().on(\n      'touchmove' + this.namespaceTouch,\n      this._onTouchMove.bind(this)\n    );\n    this.document().on(\n      'touchend' + this.namespaceTouch,\n      this._onTouchEnd.bind(this)\n    );\n  },\n\n  _onTouchMove: function(event) {\n    var dx;\n    var dy;\n    var deg;\n    var transform;\n\n    this.isDragging = true;\n    this.currentPosition = utils.pointerEventToXY(event);\n    this.trigger('drawer_dragging', [this.currentPosition]);\n\n    dx = this.currentPosition.x - this.startPosition.x;\n    dy = this.currentPosition.y - this.startPosition.y;\n    deg = Math.atan2(dx, dy) / (Math.PI / 180);\n    this.translated = dx > 0 ? dx : 0;\n\n    if (\n      Math.abs(deg) > 65 &&\n      Math.abs(deg) < 115 &&\n      this.draggingAction === null\n    ) {\n      this.draggingAction = 'slide';\n    } else if (\n      (Math.abs(deg) < 65 || Math.abs(deg) > 115) &&\n      this.draggingAction === null\n    ) {\n      this.draggingAction = 'scroll';\n    }\n\n    if (this.draggingAction === 'slide') {\n      event.preventDefault();\n\n      transform = {\n        transform:\n          'translateX(-' + (this.sliderWidth - this.translated) + 'px)',\n        transition: 'none'\n      };\n\n      this.$elementsToPush.css(transform);\n    }\n  },\n\n  _onTouchEnd: function() {\n    var percentMoved;\n\n    this.wasDragging = this.isDragging;\n    this.isDragging = false;\n\n    if (this.wasDragging) {\n      percentMoved = this.translated / this.sliderWidth;\n      if (percentMoved > 0.25 && this.draggingAction === 'slide') {\n        this.drawerClose('ease-out');\n        this.trigger('drawer_dragging_success');\n      } else {\n        this.trigger('drawer_dragging_fail');\n      }\n\n      this.$elementsToPush.removeAttr('style');\n    }\n\n    this.draggingAction = null;\n\n    this.document().off(this.namespaceTouch);\n  },\n\n  _closeOnEscape: function(evt) {\n    if (evt.keyCode === 27) {\n      this.drawerClose();\n    }\n  }\n};\n\n/*\n\nCart Drawer Section\n--------------------------------------------------------------------------------\nCreates a page drawer with AJAX cart functionilty\n\n*/\n\n// Extensions\n// Libs\nvar selectors$7 = {\n  drawer: '.drawer',\n  cartHeader: '.cart-drawer__header',\n  cartTitle: '.cart-drawer__header-title',\n  cartContent: '.cart-drawer__content',\n  cartToggle: '.ajax-cart__toggle',\n  cartCloseButton: '.cart-drawer__close-button',\n  siteHeader: '.site-header'\n};\n\nvar classes$7 = {\n  cartTemplate: 'template-cart',\n  cartEmpty: 'cart-drawer--empty',\n  cartNoCookies: 'cart-drawer--no-cookies'\n};\n\nsections.register('cart-drawer', {\n  onLoad: function() {\n    if ($(document.body).hasClass(classes$7.cartTemplate)) return;\n\n    // Setup the drawer functionality\n    this.extend(drawer);\n    this._setDrawerHeaderHeight();\n    this.on('drawer_close_done', this._onDrawerClose.bind(this));\n    this.document().on(\n      'click',\n      selectors$7.cartToggle,\n      this._openCartDrawer.bind(this)\n    );\n\n    // If cookies are disabled, then add a class which shows a warning and don't\n    // continue any further. We don't want the AJAX Cart functionality.\n    if (!utils.cookiesEnabled()) {\n      this.$container.addClass(classes$7.cartNoCookies);\n      return;\n    }\n\n    this.extend(ajaxCart);\n    cart.on(\n      'change',\n      function(event, state) {\n        this.$ajaxCart.toggleClass(classes$7.cartEmpty, state.items.length === 0);\n      }.bind(this)\n    );\n  },\n\n  onSelect: function() {\n    this._openCartDrawer();\n  },\n\n  onDeselect: function() {\n    this._closeCartDrawer();\n  },\n\n  _onDrawerClose: function() {\n    sections.getInstances('header-section').then(function(instances) {\n      instances[0].scrollHandler = true;\n    });\n  },\n\n  _setDrawerHeaderHeight: function() {\n    var $cartHeader = $(selectors$7.cartHeader, this.$container);\n    var siteHeaderHeight = $(selectors$7.siteHeader).outerHeight();\n\n    $cartHeader.css('height', siteHeaderHeight);\n  },\n\n  _openCartDrawer: function(evt) {\n    evt.preventDefault();\n\n    sections\n      .getInstances('header-section')\n      .then(function(instances) {\n        instances[0].scrollHandler = false;\n        return instances[0].hideNavigation();\n      })\n      .then(\n        function() {\n          this.drawerOpen(evt);\n\n          $(selectors$7.cartContent, this.$container).scrollTop(0);\n\n          a11y$1.forceFocus($(selectors$7.cartTitle, this.$container));\n\n          this.$container.on(\n            'click',\n            selectors$7.cartCloseButton,\n            this._closeCartDrawer.bind(this)\n          );\n        }.bind(this)\n      );\n  },\n\n  _closeCartDrawer: function() {\n    this.drawerClose();\n  }\n});\n\n/*\n\nCart Template Section\n--------------------------------------------------------------------------------\nAdds ajax cart functionality to the cart template\n\n*/\n\n// Extensions\n// Libs\nvar classes$10 = {\n  showClass: 'cart-item__update--show',\n  showEditClass: 'cart-item__edit--active',\n  cartEmpty: 'cart--empty',\n  cartNoCookies: 'cart--no-cookies'\n};\n\nsections.register('cart-template', {\n  onLoad: function() {\n    var $container = $(this.container);\n\n    if (!utils.cookiesEnabled()) {\n      $container.addClass(classes$10.cartNoCookies);\n      return;\n    }\n\n    this.extend(ajaxCart);\n\n    cart.on('change', function(event, state) {\n      $container.toggleClass(classes$10.cartEmpty, state.items.length === 0);\n    });\n  }\n});\n\n/*\n\nCollection Template Section\n--------------------------------------------------------------------------------\nCreates a staggered card grid for the collection template. Manages filters.\n\n*/\n\n// Extensions\n// Libs\nvar selectors$10 = {\n  filterBy: '#FilterBy',\n  sortBy: '#SortBy',\n  collectionImage: '.section-header-image'\n};\nvar defaultSort = 'title-ascending';\nvar queryParams = {};\n\nsections.register('collection-template', {\n  onLoad: function() {\n    var $container = (this.$container = $(this.container));\n    var $filterBy = $(selectors$10.filterBy, $container);\n    var $sortBy = $(selectors$10.sortBy, $container);\n\n    this.defaultSort = this.getDefaultSortValue();\n    this.extend(cardManager);\n    this.initParams();\n\n    $filterBy.on('change', this.onFilterChange.bind(this));\n    $sortBy.on('change', this.onSortChange.bind(this));\n  },\n\n  initParams: function() {\n    if (!location.search.length) return;\n\n    var aKeyValue;\n    var aCouples = location.search.substr(1).split('&');\n\n    for (var i = 0; i < aCouples.length; i++) {\n      aKeyValue = aCouples[i].split('=');\n      if (aKeyValue.length > 1) {\n        queryParams[decodeURIComponent(aKeyValue[0])] = decodeURIComponent(\n          aKeyValue[1]\n        );\n      }\n    }\n  },\n\n  onSortChange: function() {\n    queryParams.sort_by = this.getSortValue();\n    if (queryParams.page) {\n      delete queryParams.page;\n    }\n    location.search = decodeURIComponent($.param(queryParams));\n  },\n\n  onFilterChange: function() {\n    this.filter = this.getFilterValue();\n    document.location.href = this.filter;\n  },\n\n  getSortValue: function() {\n    return $(selectors$10.sortBy).val() || this.defaultSort;\n  },\n\n  getDefaultSortValue: function() {\n    return $(selectors$10.sortBy, this.$container).val() || defaultSort;\n  },\n\n  getFilterValue: function() {\n    return $(selectors$10.filterBy, this.$container).val() || 'collections/all';\n  }\n});\n\n/*\n\nFeatured Blog Post Section\n--------------------------------------------------------------------------------\nCreates a staggered card grid for the featured blog post section.\n\n*/\n\n// Extensions\n// Libs\nsections.register('featured-blog', {\n  onLoad: function() {\n    this.extend(cardManager);\n  }\n});\n\nvar product = {\n  validate: function(product) {\n    if (typeof product !== 'object' || typeof product.id !== 'number') {\n      throw Error(\n        'Please pass a valid Product object to the Product Controller'\n      );\n    }\n\n    return $.extend({}, product);\n  },\n\n  getVariant: function(product, value) {\n    var variant;\n\n    if (typeof value === 'string' || typeof value === 'number') {\n      // If value is an id\n      variant = this._getVariantFromId(product, value);\n    } else if (typeof value === 'object' && typeof value.id === 'number') {\n      // If value is a variant object containing an id key\n      variant = this._getVariantFromId(product, value.id);\n    } else if (isArray(value)) {\n      // If value is an array of options\n      if (typeof value[0] === 'object') {\n        // If value is a collection of options with name and value keys\n        variant = this._getVariantFromOptionCollection(product, value);\n      } else {\n        // If value is an array of option values, ordered by index of array\n        variant = this._getVariantFromOptionArray(product, value);\n      }\n    }\n\n    return variant;\n  },\n\n  optionArrayFromOptionCollection: function(product, collection) {\n    var optionArray = [];\n\n    collection.forEach(function(option) {\n      var index;\n\n      if (typeof option.name !== 'string') {\n        throw Error(\n          'Invalid value type passed for name of option ' +\n            index +\n            '. Value should be string.'\n        );\n      }\n\n      index = findIndex(product.options, function(name) {\n        return name.toLowerCase() === option.name.toLowerCase();\n      });\n\n      if (index === -1) {\n        throw Error('Invalid option name, ' + option.name);\n      }\n\n      optionArray[index] = option.value;\n    });\n\n    return optionArray;\n  },\n\n  _getVariantFromId: function(product, id) {\n    return find(product.variants, { id: id });\n  },\n\n  _getVariantFromOptionCollection: function(product, collection, closest) {\n    var optionArray = this.optionArrayFromOptionCollection(product, collection);\n\n    return this._getVariantFromOptionArray(product, optionArray, closest);\n  },\n\n  _getVariantFromOptionArray: function(product, options) {\n    return find(product.variants, function(variant) {\n      return options.every(function(option, index) {\n        return variant.options[index] === option;\n      });\n    });\n  }\n};\n\n/*\n\nProduct Display Extension\n--------------------------------------------------------------------------------\nManages the state of the product selection display.\n\n\nEvents\n------------\n\nName: variant_change\nDescription: Fired whenever a new variant is selected\nPayload: { object } Product object of the item being selected\nPayload: { object } Variant object resulted from options selection\n\nName: variant_change_undefined\nDescription: Fired when the product options selected result in a undefined variant\nPayload: { object } Product object of the item being selected\nPayload: { array } Collection of form option input names and values\n\nName: variant_change_successful\nDescription: Fired when the product options selected result in a variant\nPayload: { object } Product object of the item being selected\nPayload: { object } Variant object resulted from options selection\n\nName: variant_add_to_cart\nDescription: Fired when a product variant is added to the cart\nPayload: { object } Product object of the item being added to the cart\nPayload: { object } Variant object of the item being added to the cart\nPayload: { object } Serialized form data being submitted to the cart API\n\nName: variant_add_to_cart_successful\nDescription: Fired when a product variant has been added to the cart successfully\nPayload: { object } Product object of the item being added to the cart\nPayload: { object } Variant object of the item being added to the cart\nPayload: { object } Serialized form data being submitted to the cart API\n\nName: variant_add_to_cart_fail\nDescription: Fired when a product variant has failed to be added to the cart\nPayload: { object } Product object of the item being added to the cart\nPayload: { object } Variant object of the item being added to the cart\nPayload: { string } Error string\n\n*/\n\nvar classes$11 = {\n  productPriceSale: 'product__price--sale',\n  productPriceUnitUnavailable: 'product-price-unit--unavailable',\n  productNotificationSuccess: 'product__notification--success',\n  productNotificationError: 'product__notification--error',\n  buttonTransition: 'btn--to-secondary-transitioned',\n  ajaxCartToggle: 'ajax-cart__toggle',\n  hide: 'hide',\n  lazyPreload: 'lazypreload'\n};\n\nvar selectors$12 = {\n  productForm: '.product-form',\n  selectorWrapper: '.product-form__item',\n  ajaxCartToggle: '.ajax-cart__toggle',\n  shopifyPaymentButton: '.shopify-payment-button',\n\n  productJSON: '[data-product-json]',\n  optionInputs: '[data-option-input]',\n  masterSelect: '[data-master-select]',\n  variantMediaImage: '[data-variant-media-image]',\n  variantMediaToggleHide: '[data-variant-media-toggle-hide]',\n  productPrice: '[data-product-price]',\n  regularPrice: '[data-regular-price]',\n  compareAtPrice: '[data-compare-price]',\n  unitPrice: '[data-unit-price]',\n  unitPriceBaseUnit: '[data-unit-price-base-unit]',\n  unitPriceContainer: '[data-unit-price-container]',\n  submitButton: '[data-cart-submit]',\n  submitButtonPrimaryText: '[data-cart-primary-submit-text]',\n  submitButtonSecondaryText: '[data-cart-secondary-submit-text]',\n  notification: '[data-cart-notification]',\n  shopifyXr: '[data-shopify-xr]'\n};\n\nvar productDisplay = {\n  init: function() {\n    var $productJSON = $(selectors$12.productJSON, this.container);\n\n    if ($productJSON.length === 0) return;\n\n    this.product = JSON.parse($productJSON.html());\n    this.variant = product.getVariant(\n      this.product,\n      this.$container.data('variant-id')\n    );\n\n    this._formatVariantSelectors();\n\n    this.on('submit', selectors$12.productForm, this._addItemToCart.bind(this));\n    this.one(\n      'focus',\n      selectors$12.optionInputs,\n      this._preloadVariantMediaImages.bind(this)\n    );\n    this.on(\n      'change.variantController',\n      selectors$12.optionInputs,\n      this.update.bind(this)\n    );\n\n    this.document().on(\n      'click',\n      selectors$12.ajaxCartToggle,\n      this._resetAddToCartButton.bind(this)\n    );\n\n    this.window().on('online', this._updateOnlineStatus);\n    this.window().on('offline', this._updateOfflineStatus);\n  },\n\n  update: function() {\n    var $inputs = $(selectors$12.optionInputs, this.$container);\n    var options = $inputs.serializeArray();\n    var variant = product.getVariant(this.product, options);\n\n    // If the variant we tried to find with the selected options does not exist\n    // then modify and clone the currently selected variant and transform it\n    // to an 'unavailable' product variant object.\n    if (typeof variant === 'undefined') {\n      this.trigger('variant_change_undefined', [this.product, options]);\n\n      variant = $.extend({}, this.variant); // Clone variant because we are going to edit it\n      variant.isUndefined = true;\n      variant.available = false;\n      variant.options = product.optionArrayFromOptionCollection(\n        this.product,\n        options\n      );\n    } else {\n      this.trigger('variant_change_successful', [this.product, variant]);\n    }\n\n    this.variant = variant;\n\n    // MorphDOM - Here is the old container, and the new container, only update\n    // the DOM with things that have changed.\n    morphdom(this.$container[0], this._updatedContainer(this.variant));\n\n    this.trigger('variant_change', [this.product, variant]);\n  },\n\n  _preloadVariantMediaImages: function() {\n    $(selectors$12.variantMediaImage, this.$container).addClass(\n      classes$11.lazyPreload\n    );\n  },\n\n  // The padding on the left side of the variant select's needs to be set\n  // to the same width as the option label. This can only be done when the main\n  // stylesheet has been downloaded, so we use utils.promiseStylesheet()\n  _formatVariantSelectors: function() {\n    utils.promiseStylesheet().then(\n      function() {\n        $(selectors$12.selectorWrapper, this.$container).each(function() {\n          var $wrapper = $(this);\n          var $label = $wrapper.find('label');\n          var $input = $wrapper.find('select, input');\n\n          $input.css({\n            'padding-left': $label.outerWidth(),\n            opacity: 1\n          });\n        });\n      }.bind(this)\n    );\n  },\n\n  // Clone the current version of the container and update elements with jQuery\n  // according to the new variant values. This is an alternative to having a\n  // duplicate Handlebars template that you would pass the cart object to\n  // generate the updated container.\n  _updatedContainer: function(variant) {\n    var $container = this.$container.clone();\n\n    $(selectors$12.masterSelect, $container).val(variant.id);\n\n    this._updateInputValues(variant, $container);\n    this._updateProductPrices(variant, $container);\n    this._updateVariantMediaImage(variant, $container);\n    this._toggleVariantMediaHide(variant, $container);\n    this._updateCartButtonState(variant, $container);\n\n    return $container[0];\n  },\n\n  _updateInputValues: function(variant, $container) {\n    $(selectors$12.optionInputs, $container).each(function(index) {\n      $(this).val(variant.options[index]);\n    });\n  },\n\n  _updateCartButtonState: function(variant, $container) {\n    var text;\n\n    if (variant.isUndefined) {\n      text = theme.strings.unavailable;\n    } else {\n      text = variant.available\n        ? theme.strings.addToCart\n        : theme.strings.soldOut;\n    }\n\n    this._resetAddToCartButton($container);\n\n    if (variant.available) {\n      $(selectors$12.shopifyPaymentButton, $container).show();\n    } else {\n      $(selectors$12.shopifyPaymentButton, $container).hide();\n    }\n\n    $(selectors$12.submitButton, $container)\n      .prop('disabled', !variant.available)\n      .attr('aria-label', text);\n\n    $(selectors$12.submitButtonPrimaryText, $container).text(text);\n  },\n\n  _updateProductPrices: function(variant, $container) {\n    var productPrice = variant.price;\n    var comparePrice = variant.compare_at_price;\n\n    $(selectors$12.regularPrice, $container).html(\n      currency.formatMoney(productPrice, theme.moneyFormat)\n    );\n\n    $(selectors$12.compareAtPrice, $container).html(\n      currency.formatMoney(comparePrice, theme.moneyFormat)\n    );\n\n    $(selectors$12.productPrice, $container).toggleClass(\n      classes$11.productPriceSale,\n      comparePrice > productPrice\n    );\n\n    $(selectors$12.unitPriceContainer, $container).addClass(\n      classes$11.productPriceUnitUnavailable\n    );\n    if (variant.unit_price_measurement) {\n      $(selectors$12.unitPrice, $container).html(\n        currency.formatMoney(variant.unit_price, theme.moneyFormat)\n      );\n      $(selectors$12.unitPriceBaseUnit, $container).html(\n        this.getBaseUnit(variant)\n      );\n      $(selectors$12.unitPriceContainer, $container).removeClass(\n        classes$11.productPriceUnitUnavailable\n      );\n    }\n  },\n\n  _updateVariantMediaImage: function(variant, $container) {\n    var $variantMediaImage = $(selectors$12.variantMediaImage, $container);\n    if (!this.product.media || !$variantMediaImage.length) return;\n\n    var src =\n      (variant.featured_media && variant.featured_media.preview_image.src) ||\n      this.product.media[0].preview_image.src;\n    var size = images.imageSize($variantMediaImage.attr('src'));\n    var sizedImgUrl = images.getSizedImageUrl(src, size);\n\n    $variantMediaImage.attr('src', sizedImgUrl);\n  },\n\n  _toggleVariantMediaHide: function(variant, $container) {\n    if (!variant.featured_media && !this.product.featured_media) return;\n\n    var media = variant.featured_media || this.product.featured_media.id;\n    var id = media && media.id;\n    var mediaId = this.id + '-' + id;\n\n    var $mediaGroup = $(selectors$12.variantMediaToggleHide, $container);\n    var $active = $mediaGroup.filter('[data-media-id=\"' + mediaId + '\"]');\n\n    $active\n      .removeClass(classes$11.hide)\n      .siblings()\n      .not(selectors$12.shopifyXr)\n      .addClass(classes$11.hide);\n  },\n\n  _addItemToCart: function(evt) {\n    if (!sections.isInstance('cart-drawer')) return;\n\n    evt.preventDefault();\n    var $button = $(selectors$12.submitButton, this.$container);\n    var data = new FormData(evt.target);\n    if ($button.hasClass(classes$11.ajaxCartToggle)) return;\n\n    cart\n      .addItemFromForm(data)\n      .then(this._transitionAddToCartButton.bind(this, data))\n      .catch(this._onAddItemFail.bind(this))\n      .always(\n        function() {\n          this.trigger('variant_add_to_cart', [\n            this.product,\n            this.variant,\n            data\n          ]);\n        }.bind(this)\n      );\n  },\n\n  _onAddItemFail: function(response) {\n    var $notification = $(selectors$12.notification, this.$container);\n    var responseText = response && response.responseText;\n\n    if (responseText) {\n      responseText = JSON.parse(responseText).description;\n    } else {\n      responseText = theme.strings.cartError;\n    }\n\n    $notification\n      .addClass(classes$11.productNotificationError)\n      .removeClass(classes$11.productNotificationSuccess)\n      .html(responseText)\n      .attr('role', 'alert');\n\n    this.trigger('variant_add_to_cart_fail', [\n      this.product,\n      this.variant,\n      responseText\n    ]);\n\n    return utils.promiseTransitionEnd($notification);\n  },\n\n  _transitionAddToCartButton: function(data) {\n    var $notification = $(selectors$12.notification, this.$container);\n    var $button = $(selectors$12.submitButton, this.$container);\n    var $primaryButtonText = $(selectors$12.submitButtonPrimaryText, $button);\n    var $secondaryButtonText = $(selectors$12.submitButtonSecondaryText, $button);\n\n    $button\n      .addClass([classes$11.buttonTransition, classes$11.ajaxCartToggle].join(' '))\n      .attr('aria-label', theme.strings.viewCart);\n    $primaryButtonText.attr('aria-hidden', true);\n    $secondaryButtonText.attr('aria-hidden', false);\n\n    $notification\n      .removeClass(classes$11.productNotificationError)\n      .addClass(classes$11.productNotificationSuccess)\n      .text(theme.strings.addItemSuccess)\n      .attr('role', 'alert');\n\n    this.trigger('variant_add_to_cart_successful', [\n      this.product,\n      this.variant,\n      data\n    ]);\n\n    return utils.promiseTransitionEnd($notification);\n  },\n\n  _resetAddToCartButton: function($container) {\n    $container = $container.length ? $container : this.$container;\n    var $notification = $(selectors$12.notification, $container);\n    var $button = $(selectors$12.submitButton, $container);\n    var $primaryButtonText = $(selectors$12.submitButtonPrimaryText, $button);\n    var $secondaryButtonText = $(selectors$12.submitButtonSecondaryText, $button);\n\n    $button\n      .removeClass([classes$11.buttonTransition, classes$11.ajaxCartToggle].join(' '))\n      .attr('aria-label', theme.strings.addToCart);\n    $primaryButtonText.attr('aria-hidden', false);\n    $secondaryButtonText.attr('aria-hidden', true);\n\n    $notification\n      .removeClass(classes$11.productNotificationError)\n      .removeClass(classes$11.productNotificationSuccess)\n      .text('')\n      .attr('role', '');\n  },\n\n  _updateOnlineStatus: function() {\n    theme.isOnline = true;\n  },\n\n  _updateOfflineStatus: function() {\n    theme.isOnline = false;\n  },\n\n  getBaseUnit: function(variant) {\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\nvar types = {\n  link: 'link',\n  script: 'script'\n};\n\nvar status = {\n  requested: 'requested',\n  loaded: 'loaded'\n};\n\nvar cloudCdn = 'https://cdn.shopify.com/shopifycloud/';\n\nvar libraries = {\n  plyrShopifyStyles: {\n    tagId: 'plyr-shopify-styles',\n    src: cloudCdn + 'plyr/v2.0/shopify-plyr.css',\n    type: types.link\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\nvar libraryLoader = {\n  load: function(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 = this._createScriptTag(library, callback);\n        break;\n      case types.link:\n        tag = this._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  _createScriptTag: function(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  _createLinkTag: function(library, callback) {\n    var tag = document.createElement('link');\n    tag.href = library.src;\n    tag.rel = 'stylesheet';\n    tag.type = 'text/css';\n\n    utils.promiseStylesheet(library.src).then(function() {\n      library.status = status.loaded;\n      callback();\n    });\n\n    return tag;\n  }\n};\n\nvar modelJsonSections = {};\nvar models = {};\nvar xrButtons = {};\n\nvar selectors$13 = {\n  mediaGroup: '[data-media-group]',\n  productMediaTypeModel: '[data-product-media-type-model]',\n  xrButton: '[data-shopify-xr]'\n};\n\nvar attributes = {\n  modelJson: 'data-model-json',\n  productSlideshowSlide: 'data-product-slideshow-slide'\n};\n\nvar classes$12 = {\n  slideActive: 'slider__slide--active'\n};\n\nvar productModel = {\n  initModelViewers: function($sectionContainer) {\n    utils.isTouch();\n\n    var $container = $sectionContainer || this.$container;\n    var $modelViewerElements = $(selectors$13.productMediaTypeModel, $container);\n    var $xrButtons = $(selectors$13.xrButton, $container);\n\n    if (!$xrButtons.length && !$modelViewerElements.length) return;\n    this._initModelViewerLibraries($modelViewerElements);\n  },\n\n  removeSectionModels: function() {\n    for (var key in models) {\n      if (models.hasOwnProperty(key)) {\n        var model = models[key];\n        if (model.sectionId === this.id) {\n          model.modelViewerUi.destroy();\n          delete models[key];\n        }\n      }\n    }\n    delete modelJsonSections[this.id];\n  },\n\n  _initModelViewerLibraries: function(modelViewerContainers) {\n    modelJsonSections[this.id] = {\n      loaded: false\n    };\n    var sectionId = this.id;\n\n    modelViewerContainers.each(function(index) {\n      var $modelViewerContainer = $(this);\n      var mediaId = $modelViewerContainer.data('media-id');\n      var $modelViewerElement = $(\n        $modelViewerContainer.find('model-viewer')[0]\n      );\n      var modelId = $modelViewerElement.data('model-id');\n\n      if (index === 0) {\n        var $xrButton = $modelViewerContainer\n          .closest(selectors$13.mediaGroup)\n          .find(selectors$13.xrButton);\n        xrButtons[sectionId] = {\n          $element: $xrButton,\n          defaultId: modelId\n        };\n      }\n\n      models[mediaId] = {\n        modelId: modelId,\n        sectionId: sectionId,\n        $container: $modelViewerContainer,\n        $element: $modelViewerElement\n      };\n    });\n\n    window.Shopify.loadFeatures([\n      {\n        name: 'shopify-xr',\n        version: '1.0',\n        onLoad: this._setupShopifyXr.bind(this)\n      }\n    ]);\n\n    if (!modelViewerContainers.length) return;\n\n    window.Shopify.loadFeatures([\n      {\n        name: 'model-viewer-ui',\n        version: '1.0',\n        onLoad: this._setupModelViewerUi.bind(this)\n      }\n    ]);\n    libraryLoader.load('modelViewerUiStyles');\n  },\n\n  _setupShopifyXr: function(errors) {\n    if (errors) return;\n\n    if (!window.ShopifyXR) {\n      document.addEventListener(\n        'shopify_xr_initialized',\n        function() {\n          this._setupShopifyXr();\n        }.bind(this)\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        var $modelJson = $(\n          '[' + attributes.modelJson + '=\"' + sectionId + '\"]'\n        );\n\n        window.ShopifyXR.addModels(JSON.parse($modelJson.html()));\n        modelSection.loaded = true;\n      }\n    }\n    window.ShopifyXR.setupXRElements();\n  },\n\n  _setupModelViewerUi: function(errors) {\n    if (errors) return;\n\n    for (var key in models) {\n      if (models.hasOwnProperty(key)) {\n        var model = models[key];\n\n        if (!model.modelViewerUi) {\n          model.modelViewerUi = new Shopify.ModelViewerUI(model.$element, {\n            iconUrl: theme.modelViewerUiSprite\n          });\n        }\n\n        this._setupModelViewerListeners(model);\n      }\n    }\n  },\n\n  updateShopifyXr: function(sectionId, currentMediaId) {\n    var xrButton = xrButtons[sectionId];\n    if (!xrButton) return;\n\n    var modelId = currentMediaId\n      ? models[currentMediaId].modelId\n      : xrButton.defaultId;\n\n    xrButton.$element.attr('data-shopify-model3d-id', modelId);\n  },\n\n  _setupModelViewerListeners: function(model) {\n    var $mediaSlide = model.$container;\n    var $isSlideshow = $mediaSlide[0].hasAttribute(\n      attributes.productSlideshowSlide\n    );\n\n    if (!$isSlideshow) return;\n\n    model.$element\n      .on('shopify_model_viewer_ui_toggle_play', function() {\n        if (!$mediaSlide.hasClass(classes$12.slideActive)) return;\n\n        $mediaSlide.trigger('mediaSlideIsDraggable', [false]);\n      })\n      .on('shopify_model_viewer_ui_toggle_pause', function() {\n        if (!$mediaSlide.hasClass(classes$12.slideActive)) return;\n\n        $mediaSlide.trigger('mediaSlideIsDraggable', [true]);\n      });\n\n    model.$container.on('mediaVisible', function() {\n      if (utils.isTouch()) return;\n      model.modelViewerUi.play();\n    });\n\n    model.$container\n      .on('mediaHidden', function() {\n        model.modelViewerUi.pause();\n      })\n      .on('xrLaunch', function() {\n        model.modelViewerUi.pause();\n      });\n  }\n};\n\nvar videos = {};\n\nvar hosts = {\n  html5: 'html5',\n  external: 'external'\n};\n\nvar selectors$14 = {\n  productMediaWrapper: '[data-product-media-wrapper]',\n  productMediaTypeVideo: '[data-product-media-type-video]'\n};\n\nvar attributes$1 = {\n  enableVideoLooping: 'enable-video-looping',\n  videoId: 'video-id',\n  productMediaSlide: 'data-product-slideshow-slide'\n};\n\nvar productVideo = {\n  initProductVideos: function($sectionContainer) {\n    utils.isTouch();\n    var $container = $sectionContainer || this.$container;\n\n    $(selectors$14.productMediaTypeVideo, $container).each(\n      function(index, video) {\n        var $videoElement = $(video);\n\n        this._setupProductVideo($videoElement);\n      }.bind(this)\n    );\n  },\n\n  removeSectionVideos: function(sectionId) {\n    for (var key in videos) {\n      if (videos.hasOwnProperty(key)) {\n        var video = videos[key];\n\n        if (video.sectionId === sectionId) {\n          if (video.player) video.player.destroy();\n          delete videos[key];\n        }\n      }\n    }\n  },\n\n  _setupProductVideo: function($videoContainer) {\n    if (!$videoContainer.length) {\n      return;\n    }\n\n    var videoElement = $videoContainer.find('iframe, video')[0];\n    var mediaId = $videoContainer.data('media-id');\n    var self = this;\n\n    if (!videoElement) {\n      return;\n    }\n\n    videos[mediaId] = {\n      mediaId: mediaId,\n      sectionId: self.id,\n      host: self._hostFromVideoElement(videoElement),\n      $container: $videoContainer,\n      element: videoElement,\n      ready: function() {\n        self._createPlayer(this);\n      }\n    };\n\n    window.Shopify.loadFeatures([\n      {\n        name: 'video-ui',\n        version: '2.0',\n        onLoad: this._setupPlyrVideos.bind(this)\n      }\n    ]);\n    libraryLoader.load('plyrShopifyStyles');\n  },\n\n  _setupPlyrVideos: function(errors) {\n    if (errors) {\n      this._fallbackToNativeVideo();\n      return;\n    }\n\n    this._loadVideos();\n  },\n\n  _createPlayer: function(video) {\n    if (video.player) return;\n\n    var $productMediaWrapper = video.$container.closest(\n      selectors$14.productMediaWrapper\n    );\n    var isSlideshow = $($productMediaWrapper)[0].hasAttribute(\n      attributes$1.productMediaSlide\n    );\n    var enableLooping = $productMediaWrapper.data(\n      attributes$1.enableVideoLooping\n    );\n\n    // eslint-disable-next-line no-undef\n    video.player = new Shopify.Video(video.element, {\n      loop: { active: enableLooping },\n      iconUrl: theme.plyrSprite\n    });\n\n    // Only add the events if the media is in the slideshow.\n    if (isSlideshow) {\n      video.player.on('seeking', function() {\n        $productMediaWrapper.trigger('mediaSlideIsDraggable', [false]);\n      });\n\n      video.player.on(\n        'seeked',\n        debounce(function() {\n          $productMediaWrapper.trigger('mediaSlideIsDraggable', [true]);\n        }, 1000)\n      );\n    }\n\n    $productMediaWrapper.on('mediaHidden xrLaunch', function() {\n      if (!video.player) return;\n      video.player.pause();\n    });\n\n    $productMediaWrapper.on('mediaVisible', function() {\n      if (utils.isTouch()) return;\n      if (!video.player) return;\n      video.player.play();\n    });\n  },\n\n  _hostFromVideoElement: function(video) {\n    if (video.tagName === 'VIDEO') {\n      return hosts.html5;\n    }\n    return hosts.external;\n  },\n\n  _loadVideos: function() {\n    for (var key in videos) {\n      if (videos.hasOwnProperty(key)) {\n        var video = videos[key];\n        video.ready();\n      }\n    }\n  },\n\n  _fallbackToNativeVideo: function() {\n    for (var key in videos) {\n      if (videos.hasOwnProperty(key)) {\n        var video = videos[key];\n\n        if (video.nativeVideo) continue;\n\n        if (video.host === hosts.html5) {\n          video.element.setAttribute('controls', 'controls');\n          video.nativeVideo = true;\n        }\n      }\n    }\n  }\n};\n\n/*\n\nFeatured Product Section\n--------------------------------------------------------------------------------\nShows a product and allows the user to select product variants and add the product\nto their cart.\n\n*/\n\n// Extensions\n// Libs\nvar selectors$11 = {\n  socialSharing: '.social-sharing',\n  detailsButton: '.product__more-details'\n};\n\nsections.register('featured-product', {\n  onLoad: function() {\n    this.extend(socialSharing);\n    this.extend(productDisplay);\n    this.extend(productModel);\n    this.extend(productVideo);\n\n    this.initModelViewers();\n    this.initProductVideos();\n\n    this.on('variant_change', this._updateProductLink.bind(this));\n\n    this.window().on(\n      'resize',\n      debounce(this._formatVariantSelectors.bind(this), 500)\n    );\n  },\n\n  _updateProductLink: function(evt, instance, product, variant) {\n    var $link = $(selectors$11.detailsButton, this.$container);\n    var url = utils.updateUrlParameter(\n      $link.attr('href'),\n      'variant',\n      variant.id\n    );\n\n    $link.attr('href', url);\n  },\n\n  onUnload: function() {\n    this.removeSectionVideos(this.id);\n    this.removeSectionModels(this.id);\n  }\n});\n\nvar selectors$16 = {\n  slides: '.slider__slide',\n  activeSlide: '.slider__slide--active'\n};\n\nvar classes$14 = {\n  activeSlide: 'slider__slide--active',\n  previousSlide: 'slider__slide--previous',\n  nextSlide: 'slider__slide--next',\n  transitioningSlide: 'slider__slide--transitioning',\n  draggingSlide: 'slider__slide--dragging'\n};\n\nvar events = {\n  nextSlide: 'nextslide',\n  prevSlide: 'prevslide',\n  transitionStart: 'slidetransitionstart',\n  transitionEnd: 'slidetransitionend'\n};\n\nvar defaults = {\n  moveThreshold: 25\n};\n\nfunction Slider(element, settings) {\n  this.$element = $(element);\n  this.$slides = $(selectors$16.slides, this.$element);\n  this.config = $.extend({}, defaults, settings);\n  this.isDraggable = true;\n\n  this._setCurrentSlide($(selectors$16.activeSlide, this.$element));\n  this._assignTouchHandlers();\n\n  // We need to store the binded version of each event handler so that we can\n  // remove it in the `slider.destroy()` method.\n  this.bindedOnFocus = this._onFocus.bind(this);\n  this.bindedOnBlur = this._onBlur.bind(this);\n\n  // Need useCapture parameter in .addEventListener (the last parameter, set here\n  // to true) so we can't use jQuery `.on()`\n  if (this.$slides.length) {\n    this.$slides[0].addEventListener('focus', this.bindedOnFocus, true);\n    this.$slides[0].addEventListener('blur', this.bindedOnBlur, true);\n  }\n}\n\nSlider.prototype = $.extend({}, Slider.prototype, {\n  // Public Methods\n  // ---------------------------------------------------------------------------\n  destroy: function() {\n    this.$element.off('touchstart mousedown');\n    if (this.$slides.length) {\n      this.$slides[0].removeEventListener('focus', this.bindedOnFocus, true);\n      this.$slides[0].removeEventListener('blur', this.bindedOnBlur, true);\n    }\n\n    return null;\n  },\n\n  nextSlide: function() {\n    this._triggerEvent([events.nextSlide, events.transitionStart]);\n\n    return this._promiseNextSlide().then(\n      function() {\n        this._triggerEvent(events.transitionEnd);\n      }.bind(this)\n    );\n  },\n\n  previousSlide: function() {\n    this._triggerEvent([events.prevSlide, events.transitionStart]);\n\n    return this._promisePrevSlide().then(\n      function() {\n        this._triggerEvent(events.transitionEnd);\n      }.bind(this)\n    );\n  },\n\n  setSlide: function(setIndex, animate) {\n    var slidePromiseChain = this.slidePromiseChain || $.Deferred().resolve();\n    var currentIndex = this.$currentSlide.index();\n    var totalSlides = this.$slides.length;\n    var promiseSlide = $.Deferred().resolve();\n\n    this.slidePromiseChain = slidePromiseChain.then(\n      function() {\n        if (setIndex < totalSlides && setIndex !== currentIndex) {\n          if (animate) {\n            if (setIndex > currentIndex) {\n              promiseSlide = utils.promiseRepeatSeries(\n                this.nextSlide.bind(this),\n                setIndex - currentIndex\n              );\n            } else if (setIndex < currentIndex) {\n              promiseSlide = utils.promiseRepeatSeries(\n                this.previousSlide.bind(this),\n                currentIndex - setIndex\n              );\n            }\n          } else {\n            promiseSlide = this._promiseSlide(this.$slides.eq(setIndex));\n          }\n        }\n\n        return promiseSlide;\n      }.bind(this)\n    );\n\n    return this.slidePromiseChain;\n  },\n\n  setIsDraggable: function(isDraggable) {\n    this.isDraggable = isDraggable;\n  },\n\n  shouldPreventSlide: function(target, selectors, slideCount) {\n    if (slideCount < 2 || $(target).closest(selectors.join(',')).length) {\n      return true;\n    }\n\n    return false;\n  },\n\n  // Slide Management\n  // ---------------------------------------------------------------------------\n  _promiseNextSlide: function() {\n    requestAnimationFrame(\n      function() {\n        this.$nextSlide.addClass(classes$14.nextSlide);\n\n        requestAnimationFrame(\n          function() {\n            this.$slides.removeAttr('style');\n\n            this.$nextSlide\n              .removeClass(classes$14.nextSlide)\n              .addClass(classes$14.activeSlide)\n              .addClass(classes$14.transitioningSlide);\n\n            this.$currentSlide\n              .removeClass(classes$14.activeSlide)\n              .addClass(classes$14.previousSlide)\n              .addClass(classes$14.transitioningSlide);\n          }.bind(this)\n        );\n      }.bind(this)\n    );\n\n    return this._promiseSlideTransitionEnd().then(\n      function() {\n        this._setCurrentSlide(this.$nextSlide);\n      }.bind(this)\n    );\n  },\n\n  _promisePrevSlide: function() {\n    requestAnimationFrame(\n      function() {\n        this.$previousSlide.addClass(classes$14.previousSlide);\n\n        requestAnimationFrame(\n          function() {\n            this.$slides.removeAttr('style');\n\n            this.$previousSlide\n              .removeClass(classes$14.previousSlide)\n              .addClass(classes$14.activeSlide)\n              .addClass(classes$14.transitioningSlide);\n\n            this.$currentSlide\n              .removeClass(classes$14.activeSlide)\n              .addClass(classes$14.nextSlide)\n              .addClass(classes$14.transitioningSlide);\n          }.bind(this)\n        );\n      }.bind(this)\n    );\n\n    return this._promiseSlideTransitionEnd().then(\n      function() {\n        this._setCurrentSlide(this.$previousSlide);\n      }.bind(this)\n    );\n  },\n\n  _promiseSlide: function($slide) {\n    this._setCurrentSlide($slide);\n\n    $slide\n      .addClass(classes$14.activeSlide)\n      .siblings()\n      .removeClass(classes$14.activeSlide);\n\n    return $.Deferred(\n      function(defer) {\n        requestAnimationFrame(\n          function() {\n            this._triggerEvent(events.transitionEnd);\n            defer.resolve();\n          }.bind(this)\n        );\n      }.bind(this)\n    );\n  },\n\n  _promiseCancelSlide: function() {\n    requestAnimationFrame(\n      function() {\n        this.$slides.removeAttr('style').addClass(classes$14.transitioningSlide);\n      }.bind(this)\n    );\n\n    return this._promiseSlideTransitionEnd();\n  },\n\n  _promiseSlideTransitionEnd: function() {\n    return $.Deferred(\n      function(defer) {\n        this.$currentSlide.one(\n          'transitionend',\n          function() {\n            this.$slides.removeClass(\n              [\n                classes$14.transitioningSlide,\n                classes$14.nextSlide,\n                classes$14.previousSlide\n              ].join(' ')\n            );\n            defer.resolve();\n          }.bind(this)\n        );\n      }.bind(this)\n    );\n  },\n\n  _setCurrentSlide: function($slide) {\n    this.$currentSlide = $slide;\n    this.$nextSlide = this._nextSlideIndex($slide, this.$slides);\n    this.$previousSlide = this._prevSlideIndex($slide, this.$slides);\n  },\n\n  // Touch Handlers\n  // ---------------------------------------------------------------------------\n\n  _assignTouchHandlers: function() {\n    this.bindedTouchStart = this._onTouchStart.bind(this);\n    this.bindedTouchMove = this._onTouchMove.bind(this);\n    this.bindedTouchEnd = this._onTouchEnd.bind(this);\n\n    // When a touchstart OR mousedown event is fired, take action.\n    this.$element\n      .one('touchstart', this.bindedTouchStart)\n      .one('mousedown', this.bindedTouchStart);\n  },\n\n  _onTouchStart: function(evt) {\n    this.windowWidth = $(window).innerWidth();\n    this.startPosition = utils.pointerEventToXY(evt);\n    this.isDragging = false;\n\n    this.$element\n      .on('touchmove mousemove', this.bindedTouchMove)\n      .on('touchend mouseup', this.bindedTouchEnd);\n  },\n\n  _onTouchMove: function(evt) {\n    if (!this.isDraggable) return;\n\n    this.currentPosition = utils.pointerEventToXY(evt);\n    this.percentMoved =\n      ((this.currentPosition.x - this.startPosition.x) / this.windowWidth) *\n      100;\n\n    if (!this.isDragging) {\n      this.isDragging = true;\n    }\n\n    if (this.percentMoved > 0) {\n      this.$previousSlide.addClass(classes$14.previousSlide);\n      this.$nextSlide.removeClass(classes$14.nextSlide);\n      this.$previousSlide.css({\n        transform: 'translateX(' + (this.percentMoved - 100) + '%)'\n      });\n    } else {\n      this.$previousSlide.removeClass(classes$14.previousSlide);\n      this.$nextSlide.addClass(classes$14.nextSlide);\n      this.$nextSlide.css({\n        transform: 'translateX(' + (100 + this.percentMoved) + '%)'\n      });\n    }\n\n    this.$currentSlide\n      .addClass(classes$14.draggingSlide)\n      .css({ transform: 'translateX(' + this.percentMoved + '%)' });\n  },\n\n  _onTouchEnd: function() {\n    var moveThreshold = this.config.moveThreshold;\n    var promiseTransition = $.Deferred().resolve();\n\n    this.$element.off();\n\n    if (this.isDragging) {\n      this.isDragging = false;\n\n      this.$currentSlide.removeClass(classes$14.draggingSlide);\n\n      if (this.percentMoved > moveThreshold) {\n        promiseTransition = this.previousSlide();\n      } else if (this.percentMoved < -moveThreshold) {\n        promiseTransition = this.nextSlide();\n      } else {\n        promiseTransition = this._promiseCancelSlide();\n      }\n    }\n\n    promiseTransition.then(\n      function() {\n        this.$element\n          .one('touchstart', this.bindedTouchStart)\n          .one('mousedown', this.bindedTouchStart);\n      }.bind(this)\n    );\n  },\n\n  // A11y\n  // ---------------------------------------------------------------------------\n  _onFocus: function() {\n    this.$element.one('keyup', this._onKeyup.bind(this));\n  },\n\n  _onBlur: function() {\n    this.$element.off('keyup');\n  },\n\n  _onKeyup: function(evt) {\n    var promiseTransition = $.Deferred().resolve();\n    var refocusOnSlideShow = false;\n    var shouldPreventSlide = this.shouldPreventSlide(\n      evt.target,\n      ['.plyr', '.shopify-model-viewer-ui'],\n      this.$slides.length\n    );\n\n    switch (evt.keyCode) {\n      case 37:\n        if (shouldPreventSlide) break;\n\n        promiseTransition = this.previousSlide();\n\n        refocusOnSlideShow = $.contains(\n          this.$element[0],\n          document.activeElement\n        );\n        break;\n      case 39:\n        if (shouldPreventSlide) break;\n\n        promiseTransition = this.nextSlide();\n\n        refocusOnSlideShow = $.contains(\n          this.$element[0],\n          document.activeElement\n        );\n        break;\n    }\n\n    promiseTransition.then(\n      function() {\n        if (refocusOnSlideShow) {\n          this.$element.focus();\n        }\n        this.$element.one('keyup', this._onKeyup.bind(this));\n      }.bind(this)\n    );\n  },\n\n  // Misc\n  // ---------------------------------------------------------------------------\n  _triggerEvent: function(names) {\n    if (typeof names === 'string') {\n      names = [names];\n    }\n\n    names.forEach(\n      function(name) {\n        this.$element.trigger(name, {\n          $previousSlide: this.$previousSlide,\n          $currentSlide: this.$currentSlide,\n          $nextSlide: this.$nextSlide\n        });\n      }.bind(this)\n    );\n  },\n\n  _nextSlideIndex: function($current, $slides) {\n    var index = $current.index();\n    var count = $slides.length;\n    var next = index + 1;\n\n    if (index + 1 === count) {\n      next = 0;\n    }\n\n    return $slides.eq(next);\n  },\n\n  _prevSlideIndex: function($current, $slides) {\n    var index = $current.index();\n    var count = $slides.length;\n    var prev = index - 1;\n\n    if (index - 1 === -1) {\n      prev = count - 1;\n    }\n\n    return $slides.eq(prev);\n  }\n});\n\n/*\n\nReveal Slider Extension\n--------------------------------------------------------------------------------\nManage the mobile reveal slider functionality.\n\n\nEvents\n------------\nName: reveal_slider_init_start\nDescription: Fired at the start of the reveal slider initialization\nPayload: none\n\nName: reveal_slider_init_done\nDescription: Fired at the end of the reveal slider initialization\nPayload: none\n\nName: reveal_slider_destroy\nDescription: Fired when the reveal slider is destroyed\nPayload: none\n\nName: reveal_slider_open_cover\nDescription: Fired when the  slider cover is opened\nPayload: none\n\nName: reveal_slider_close_cover\nDescription: Fired when the  slider cover is closed\nPayload: none\n\nName: reveal_slider_set_slide\nDescription: Fired when the slider nav buttons are clicked to change a slide\nPayload: { number } Index of the slide to set as active\n\n*/\n\nvar selectors$15 = {\n  coverTopBackground: '.reveal-slider__cover-background--top',\n  coverBottomBackground: '.reveal-slider__cover-background--bottom',\n  coverContent: '.reveal-slider__cover-content',\n  slideNavButtons: '.reveal-slider__nav-button',\n  slidePreviousButton: '.reveal-slider__previous-button',\n  slideNextButton: '.reveal-slider__next-button',\n  closeCoverButton: '.reveal-slider__close',\n  slider: '.slider'\n};\n\nvar classes$13 = {\n  navButtonActive: 'active',\n  coverOpen: 'open'\n};\n\nvar revealSlider = {\n  initRevealSlider: function() {\n    this.trigger('reveal_slider_init_start');\n\n    this.revealSlider = true;\n    this.coverIsOpen = false;\n    this.revealSliderNamespace = '.revealSlider';\n    this.mediaQuerySmall = theme.mediaQuerySmall;\n\n    this.slider = new Slider($(selectors$15.slider, this.$container));\n    this.hammertime = new Hammer(this.$container[0]);\n\n    this.on(\n      'click',\n      selectors$15.slideNavButtons,\n      this._onClickNavButton.bind(this)\n    );\n    this.on(\n      'click',\n      selectors$15.slidePreviousButton,\n      this.slider.previousSlide.bind(this.slider)\n    );\n    this.on(\n      'click',\n      selectors$15.slideNextButton,\n      this.slider.nextSlide.bind(this.slider)\n    );\n    this.on('click', selectors$15.closeCoverButton, this.closeCover.bind(this));\n    this.on('click', selectors$15.coverContent, this.openCover.bind(this));\n    this.on('nextslide prevslide', this._changeBackgroundColor.bind(this));\n    this.on('slidetransitionend', this._onSlideTransitionEnd.bind(this));\n\n    this.document().on(\n      'touchstart' + this.revealSliderNamespace,\n      this._onTouchStart.bind(this)\n    );\n    this.document().on(\n      'touchend' + this.revealSliderNamespace,\n      this._onTouchEnd.bind(this)\n    );\n\n    this.hammertime\n      .on('pinchout pinchin', this._onPinch.bind(this))\n      .on('pinchend pinchcancel', this._onPinchEnd.bind(this));\n\n    this.trigger('reveal_slider_init_done');\n  },\n\n  destroyRevealSlider: function() {\n    this.revealSlider = false;\n    this.slider = this.slider.destroy();\n    this.document().off(this.revealSliderNamespace);\n    this.off();\n\n    this.trigger('reveal_slider_destroy');\n  },\n\n  openCover: function() {\n    this.$container.addClass(classes$13.coverOpen);\n    this.coverIsOpen = true;\n    this.trigger('reveal_slider_open_cover');\n  },\n\n  closeCover: function() {\n    this.$container.removeClass(classes$13.coverOpen);\n    this.coverIsOpen = false;\n    this.trigger('reveal_slider_close_cover');\n  },\n\n  _changeBackgroundColor: function(evt, data) {\n    var color;\n\n    if (evt.type === 'nextslide') {\n      color = data.$nextSlide.data('background-color');\n    } else {\n      color = data.$previousSlide.data('background-color');\n    }\n\n    $(selectors$15.slider, this.$container).css({ backgroundColor: color });\n  },\n\n  _onSlideTransitionEnd: function(evt, data) {\n    var index = data.$currentSlide.index();\n\n    $(selectors$15.slideNavButtons, this.$container)\n      .eq(index)\n      .addClass(classes$13.navButtonActive)\n      .siblings()\n      .removeClass(classes$13.navButtonActive);\n  },\n\n  _onClickNavButton: function(evt) {\n    var $navButton = $(evt.target);\n    var index = $navButton.index();\n    this.slider.setSlide($navButton.index());\n    this.trigger('reveal_slider_set_slide', [index]);\n  },\n\n  _onTouchStart: function(evt) {\n    if (evt.originalEvent.touches.length <= 1) return;\n\n    this.enablePinch = true;\n\n    // Lock Scrolling over the zoom element by allowing Hammer.js to fire pinch events.\n    this.hammertime.get('pinch').set({ enable: this.enablePinch });\n  },\n\n  _onTouchEnd: function() {\n    if (!this.enablePinch) return;\n\n    this.enablePinch = false;\n    this.hammertime.get('pinch').set({ enable: this.enablePinch });\n  },\n\n  _onPinch: function(evt) {\n    this.$coverTopBackground =\n      this.$coverTopBackground ||\n      $(selectors$15.coverTopBackground, this.$container); // eslint-disable-line shopify/jquery-dollar-sign-reference\n    this.$coverBottomBackground =\n      this.$coverBottomBackground ||\n      $(selectors$15.coverBottomBackground, this.$container); // eslint-disable-line shopify/jquery-dollar-sign-reference\n    this.$coverTitle =\n      this.$coverTitle || $(selectors$15.coverContent, this.$container); // eslint-disable-line shopify/jquery-dollar-sign-reference\n\n    if (\n      (evt.type === 'pinchin' && !this.coverIsOpen) ||\n      (evt.type === 'pinchout' && this.coverIsOpen)\n    )\n      return;\n\n    // The distance of the top and bottom backgrounds (relative to the center\n    // of the slider) will be calculated based on evt.scale, which represents\n    // the scale factor between two pointersets (two finger points).\n    this.distance = this.coverIsOpen ? 70 * evt.scale : (evt.scale - 1) * 25;\n\n    if (this.distance < 0) {\n      this.distance = 0;\n    }\n\n    this.$coverBottomBackground.css({\n      transform: 'translateY(' + this.distance + '%)'\n    });\n    this.$coverTopBackground.css({\n      transform: 'translateY(-' + this.distance + '%)'\n    });\n    this.$coverTitle.css({ opacity: 1 - this.distance / 30 });\n  },\n\n  // If the scale factor is greater than 2, the cover will open automatically.\n  _onPinchEnd: function(evt) {\n    if (evt.scale > 2) {\n      this.$container.addClass(classes$13.coverOpen);\n      this.coverIsOpen = true;\n    } else {\n      this.$container.removeClass(classes$13.coverOpen);\n      this.coverIsOpen = false;\n    }\n\n    // When pinching, a style attribute is added to the following elements with\n    // the distance percentage. This callback will only get fired once at the\n    // end of a pinch and ensures the cover will either open or close automatically\n    // based on the conditional above.\n    requestAnimationFrame(\n      function() {\n        this.$coverTopBackground.removeAttr('style');\n        this.$coverBottomBackground.removeAttr('style');\n        this.$coverTitle.removeAttr('style');\n      }.bind(this)\n    );\n  }\n};\n\n/*\n\nSide Scroller Extension\n--------------------------------------------------------------------------------\nManages the desktop side scrolling behavior\n\n\nEvents\n------------\n\nName: side_scroller_init_start\nDescription: Fired at the start of the side scroller initialization\nPayload: none\n\nName: side_scroller_init_done\nDescription: Fired at the end of the side scroller initialization\nPayload: none\n\nName: side_scroller_destroy\nDescription: Fired when the side scroller is destroyed\nPayload: none\n\nName: side_scroller_position_top\nDescription: Fired when the position of the side scroller sticky image is switched to the top\nPayload: none\n\nName: side_scroller_position_fixed\nDescription: Fired when the position of the side scroller sticky image is switched to be fixed\nPayload: none\n\nName: side_scroller_position_bottom\nDescription: Fired when the position of the side scroller sticky image is switched to the bottom\nPayload: none\n\n*/\n\nvar selectors$17 = {\n  coverContent: '.side-scroller__cover-content',\n  slidesContainer: '.side-scroller__slides-container',\n  coverBackground: '.side-scroller__cover-background',\n  slides: '.side-scroller__slide'\n};\n\nvar classes$15 = {\n  coverFixed: 'side-scroller--fixed',\n  coverBottom: 'side-scroller--fixed-bottom'\n};\n\nvar sideScroller = {\n  initSideScroller: function() {\n    this.trigger('side_scroller_init_start');\n\n    this.$slides = $(selectors$17.slides, this.$container);\n    this.$slidesContainer = $(selectors$17.slidesContainer, this.$container);\n\n    this.sideScroller = true;\n    this.sideScrollerNamespace = '.sideScroller';\n    this.coverPosition = 'top';\n\n    this.window().on(\n      'scroll' + this.sideScrollerNamespace,\n      this._onScroll.bind(this)\n    );\n    this.window().on(\n      'resize' + this.sideScrollerNamespace,\n      this._updateCoverPositionValues.bind(this)\n    );\n    this.window().on(\n      'resize' + this.sideScrollerNamespace,\n      this._onScroll.bind(this)\n    );\n\n    this.document().on(\n      'drawer_open_start' + this.sideScrollerNamespace,\n      this._handleFixedSideImage.bind(this)\n    );\n    this.document().on(\n      'drawer_close_done' + this.sideScrollerNamespace,\n      this._resetFixedSideImage.bind(this)\n    );\n\n    utils.promiseStylesheet().then(\n      function() {\n        this._updateCoverPositionValues();\n        this._onScroll();\n\n        this.trigger('side_scroller_init_done');\n      }.bind(this)\n    );\n  },\n\n  destroySideScroller: function() {\n    this.sideScroller = false;\n    this.window().off(this.sideScrollerNamespace);\n    this.document().off(this.sideScrollerNamespace);\n\n    this.trigger('side_scroller_destroy');\n  },\n\n  _handleFixedSideImage: function() {\n    if (this.coverPosition !== 'fixed') return;\n\n    var $coverContent = $(selectors$17.coverContent, this.$container);\n    var coverContentHeight = $coverContent.outerHeight();\n    var scrollTop = $(window).scrollTop();\n    var translate = scrollTop - this.featuresOffset.top;\n\n    $(selectors$17.coverBackground, this.$container).css({\n      transform: 'translateY(' + translate + 'px)',\n      position: 'absolute'\n    });\n\n    $(selectors$17.coverContent, this.$container).css({\n      transform:\n        'translate(-50%, ' + (translate - coverContentHeight / 2) + 'px)',\n      position: 'absolute'\n    });\n  },\n\n  _resetFixedSideImage: function() {\n    if (this.coverPosition !== 'fixed') return;\n\n    $(selectors$17.coverBackground, this.$container)\n      .add(selectors$17.coverContent, this.$container)\n      .css({\n        transform: '',\n        position: ''\n      });\n  },\n\n  _onScroll: function() {\n    var scrollTop = $(window).scrollTop();\n\n    // If the top of the window has gone past the top of the featured slider\n    // and the window has not gone past the bottom of the featured slider,\n    // we set the cover to fixed.\n    // Debounce any style changes to the next from with requestAnimationFrame.\n    if (\n      scrollTop > this.featuresOffset.top &&\n      scrollTop + this.windowHeight <=\n        this.featuresOffset.top + this.featuresHeight\n    ) {\n      requestAnimationFrame(this._setCoverPosition.bind(this, 'fixed'));\n      requestAnimationFrame(this._updateBackgroundColor.bind(this, scrollTop));\n    } else if (\n      scrollTop + this.windowHeight >\n      this.featuresOffset.top + this.featuresHeight\n    ) {\n      requestAnimationFrame(this._setCoverPosition.bind(this, 'bottom'));\n    } else {\n      requestAnimationFrame(this._setCoverPosition.bind(this, 'top'));\n    }\n  },\n\n  _setCoverPosition: function(position) {\n    if (this.coverPosition !== position) {\n      switch (position) {\n        case 'top':\n          this.$container.removeClass(\n            [classes$15.coverBottom, classes$15.coverFixed].join(' ')\n          );\n          this.trigger('side_scroller_position_top');\n          break;\n        case 'fixed':\n          this.$container\n            .removeClass(classes$15.coverBottom)\n            .addClass(classes$15.coverFixed);\n          this.trigger('side_scroller_position_fixed');\n          break;\n        case 'bottom':\n          this.$container\n            .removeClass(classes$15.coverFixed)\n            .addClass(classes$15.coverBottom);\n          this.trigger('side_scroller_position_bottom');\n          break;\n      }\n    }\n\n    this.coverPosition = position;\n  },\n\n  _updateBackgroundColor: function(scrollTop) {\n    // The slide index is determined based on the current top position of the\n    // window relative to the height of the slide.\n    var currentSlideIndex = Math.floor(\n      (scrollTop - this.featuresOffset.top + this.windowHeight / 2) /\n        this.slideHeight\n    );\n\n    this.currentBackgroundIndex = this.currentBackgroundIndex || 0;\n\n    if (currentSlideIndex !== this.currentBackgroundIndex) {\n      this.currentBackgroundIndex = currentSlideIndex;\n      this.$slidesContainer.css({\n        backgroundColor: this.$slides\n          .eq(currentSlideIndex)\n          .data('background-color')\n      });\n    }\n  },\n\n  _updateCoverPositionValues: function() {\n    this.slideHeight = this.$slides.first().height();\n    this.featuresOffset = this.$container.offset();\n    this.featuresHeight = this.$container.height();\n    this.windowHeight = $(window).innerHeight();\n    this.windowWidth = $(window).innerWidth();\n  }\n};\n\n// Because the functionality is vastly different on mobile vs desktop, we\n// require two different extensions and load them here into one section\nsections.register('featured-slider', {\n  onLoad: function() {\n    this.coverIsOpen = false;\n\n    this.extend(revealSlider);\n    this.extend(sideScroller);\n\n    this._toggleViewState();\n\n    $(window).on('resize', debounce(this._toggleViewState.bind(this)));\n  },\n\n  onUnload: function() {\n    this._destroyDesktopState();\n    this._destroyMobileState();\n  },\n\n  onDeselect: function() {\n    if (this.mobileViewEnabled) {\n      this.closeCover();\n    }\n  },\n\n  onBlockSelect: function(evt) {\n    if (this.mobileViewEnabled) {\n      this.openCover();\n      this.slider.setSlide($(evt.target).index());\n    } else {\n      $('html, body').animate(\n        {\n          scrollTop: $(evt.target).offset().top\n        },\n        400\n      );\n    }\n  },\n\n  onBlockDeselect: function() {\n    if (this.mobileViewEnabled) {\n      this.revealSlider.closeCover();\n    }\n  },\n\n  _toggleViewState: function() {\n    var windowWidth = $(window).innerWidth();\n    var enableMobileView;\n    var enableDesktopView;\n\n    if (typeof this.mobileViewEnabled === 'undefined') {\n      enableMobileView = windowWidth < theme.mediaQuerySmall;\n      enableDesktopView = windowWidth >= theme.mediaQuerySmall;\n    } else {\n      enableMobileView =\n        windowWidth < theme.mediaQuerySmall && !this.mobileViewEnabled;\n      enableDesktopView =\n        windowWidth >= theme.mediaQuerySmall && this.mobileViewEnabled;\n    }\n\n    if (enableMobileView) {\n      this.mobileViewEnabled = true;\n      this._destroyDesktopState();\n      this._enableMobileState();\n    }\n\n    if (enableDesktopView) {\n      this.mobileViewEnabled = false;\n      this._destroyMobileState();\n      this._enableDesktopState();\n    }\n  },\n\n  _enableDesktopState: function() {\n    this.initSideScroller();\n  },\n\n  _destroyDesktopState: function() {\n    if (typeof this.sideScroller !== 'undefined') {\n      this.destroySideScroller();\n    }\n  },\n\n  _enableMobileState: function() {\n    this.initRevealSlider();\n  },\n\n  _destroyMobileState: function() {\n    if (this.revealSlider) {\n      this.destroyRevealSlider();\n    }\n  }\n});\n\nvar classes$16 = {\n  footerParallax: 'site-footer--parallax'\n};\n\nvar selectors$18 = {\n  contentForLayout: '.content-for-layout',\n  footerCover: '.site-footer__drawer-cover '\n};\n\nsections.register('footer', {\n  onLoad: function() {\n    if (\n      !this.container.hasAttribute('data-footer-parallax') ||\n      ($('html').hasClass('is-ios') && Shopify.designMode)\n    )\n      return;\n\n    this.window().on('resize', this._setParallax.bind(this));\n    this.document().on(\n      'drawer_open_start',\n      this._handleDrawerOpenState.bind(this)\n    );\n    this.document().on(\n      'drawer_close_done',\n      this._resetDrawerOpenState.bind(this)\n    );\n\n    $(document.body).addClass(classes$16.footerParallax);\n\n    utils.promiseStylesheet().then(this._setParallax.bind(this));\n  },\n\n  onUnload: function() {\n    $(document.body).removeClass(classes$16.footerParallax);\n    $(selectors$18.contentForLayout).css('margin-bottom', '');\n  },\n\n  _setParallax: function() {\n    this.height = this.$container.innerHeight();\n    $(selectors$18.contentForLayout).css('margin-bottom', this.height);\n  },\n\n  _handleDrawerOpenState: function() {\n    if (document.body.scrollHeight - window.innerHeight === 0) {\n      // If the page is smaller than the window\n      this.$container.css(\n        'margin-bottom',\n        document.body.clientHeight - document.body.scrollHeight\n      );\n    } else {\n      // If the page is longer than the window\n      var distanceFromBottom =\n        document.body.scrollHeight - window.innerHeight - window.scrollY;\n      var adjustFooter = distanceFromBottom - this.height;\n\n      this.$container.css('margin-bottom', adjustFooter);\n      $(selectors$18.footerCover)\n        .css('height', distanceFromBottom)\n        .show();\n    }\n  },\n\n  _resetDrawerOpenState: function() {\n    this.$container.css('margin-bottom', '');\n    $(selectors$18.footerCover).hide();\n  }\n});\n\nvar selectors$19 = {\n  skipLink: '.skip-link',\n  navigation: '.navigation',\n  navAnimateElements: '.navigation__entrance-animation',\n  cartBubble: '.site-header__cart-bubble',\n  siteHeader: '.site-header',\n  siteHeaderWrapper: '.site-header__wrapper',\n  siteHeaderLogo: '.site-header__logo',\n  siteHeaderCart: '.site-header__cart',\n  siteNavigation: '[data-site-navigation]',\n  navigationButton: '[data-navigation-button]',\n  navigationExpandSublinks: '.navigation__expand-sublinks',\n  navigationExpandChildSublinks: '.navigation__expand-sublinks--third-level',\n  navigationSublinksContainer: '.navigation__sublinks-container',\n  navigationSublink: '.navigation__sublink',\n  navigationSublinks: '.navigation__sublinks',\n  navigationChildSublinks: '.navigation__sublinks--third-level',\n  navigationHasSublinks: '.navigation__has-sublinks',\n  announcementBar: '.announcement-bar',\n  announcementBarClose: '.announcement-bar__close',\n  contentForLayout: '.content-for-layout'\n};\n\nvar classes$17 = {\n  themeEditor: 'theme-editor',\n  headerFixed: 'site-header--fixed',\n  headerHomepage: 'site-header--homepage',\n  headerTransparent: 'site-header--transparent',\n  cartBubbleVisible: 'site-header__cart-bubble--visible',\n  bubblePulse: 'bubble-pulse',\n  drawerActive: 'drawer--active',\n  navigationExpandChildSublinks: 'navigation__expand-sublinks--third-level',\n  navigationOpen: 'navigation-open',\n  navigationOpenEditor: 'navigation-open--editor',\n  navigationTransitioning: 'navigation--is-transitioning',\n  navigationHasSublinksCollapsed: 'navigation__has-sublinks--collapsed',\n  navigationEntranceActive: 'navigation__entrance-animation--active',\n  siteHeaderWrapperTransitioning: 'site-header__wrapper--transitioning',\n  announcementBarVisible: 'announcement-bar--visible'\n};\n\nvar sectionsWithTransparentHeader = ['slideshow-section', 'gallery', 'hero'];\nvar scrollHandler = true;\nvar blockEditorEvents = false;\nvar navigationManuallyToggled = false;\n\nsections.register('header-section', {\n  /*--------------------------------------------------------------------------*/\n  /*                             Editor Events                                */\n  /*--------------------------------------------------------------------------*/\n  onLoad: function() {\n    this.$container = $(this.container);\n    this.$siteHeader = $(selectors$19.siteHeader);\n    this.$siteHeaderWrapper = $(selectors$19.siteHeaderWrapper);\n\n    this.scrollTop = 0;\n    this.isFixed = false;\n    this.headerHeight = 0;\n    this.promiseChain = $.Deferred().resolve();\n    this._updateHeaderTransparency();\n\n    // Initially disable tabbing through site navigation\n    utils.disableTabbingOfChildren(selectors$19.navigation);\n\n    $(selectors$19.navigationButton)\n      .one('click', this._toggleNavigationDisplay.bind(this))\n      .one('click', this._setSublinksMaxHeight.bind(this));\n\n    $(selectors$19.navigationExpandSublinks, this.$container).on(\n      'click',\n      this._toggleNavigationSublinks.bind(this)\n    );\n\n    $(selectors$19.announcementBarClose, this.$container).on(\n      'click',\n      this._closeAnnouncementBar.bind(this)\n    );\n\n    // Disable the sticky and/or transparent header in iOS editor\n    if ($('html').hasClass('is-ios') && Shopify.designMode) {\n      this.$siteHeader.removeClass(classes$17.headerHomepage);\n      this.$siteHeader.removeClass(classes$17.headerTransparent);\n    } else {\n      // Don't call _toggleHeaderPosition on scroll in the iOS editor\n      $(document).on(\n        'scroll' + this.namespace,\n        throttle(this._toggleHeaderPosition.bind(this), 200)\n      );\n    }\n\n    $(window).on(\n      'resize' + this.namespace,\n      this._adjustNavigationPadding.bind(this)\n    );\n\n    $(document).on(\n      'shopify:section:reorder shopify:section:load',\n      this._updateHeaderTransparency.bind(this)\n    );\n\n    $(document).on(\n      'shopify:section:unload',\n      function() {\n        setTimeout(this._updateHeaderTransparency.bind(this));\n      }.bind(this)\n    );\n\n    cart.on('change', this._toggleCartBubble.bind(this));\n\n    utils.promiseStylesheet().then(\n      function() {\n        this._setupAnnouncementBar();\n      }.bind(this)\n    );\n  },\n\n  onSelect: function() {\n    this._adjustNavigationPadding();\n\n    // If you close the navigation to view and edit the transparent header\n    // settings, then you don't want the navigation to open when it reloads\n    // with your changes. Skip opening the navigation if the user has clicked\n    // on the 'X' of the navigation.\n    if (navigationManuallyToggled) return;\n\n    // Block the 'onDeselect' if it is fired within 100ms\n    blockEditorEvents = true;\n\n    this.showNavigation();\n  },\n\n  onDeselect: function() {\n    // Make sure that we're not blocking editor events by default\n    blockEditorEvents = false;\n\n    // When a section is reloaded by the editor it fires the 'onDeselect',\n    // 'onUnload', 'onLoad', and then 'onSelect' events. We don't want to hide\n    // the navigation when the section reloads from an edit. If we receive a\n    // `onSelect` event within 100ms of the 'onDeselect' event, then it is\n    // canceled.\n    setTimeout(\n      function() {\n        if (blockEditorEvents) return;\n\n        navigationManuallyToggled = false;\n        blockEditorEvents = false;\n\n        this.hideNavigation();\n      }.bind(this),\n      100\n    );\n  },\n\n  /*--------------------------------------------------------------------------*/\n  /*                                 Header                                   */\n  /*--------------------------------------------------------------------------*/\n  _setupAnnouncementBar: function() {\n    var $announcementBar = $(selectors$19.announcementBar, this.$container);\n\n    if (!$announcementBar.length) return;\n\n    if (\n      utils.isSessionStorageSupported() &&\n      sessionStorage.getItem('announcement-bar-hidden')\n    )\n      return;\n\n    requestAnimationFrame(\n      function() {\n        $announcementBar.addClass(classes$17.announcementBarVisible);\n        this.$siteHeaderWrapper.css(\n          'margin-top',\n          '-' + $announcementBar.outerHeight() + 'px'\n        );\n\n        requestAnimationFrame(\n          function() {\n            this.$siteHeaderWrapper\n              .addClass(classes$17.siteHeaderWrapperTransitioning)\n              .css('margin-top', '');\n          }.bind(this)\n        );\n      }.bind(this)\n    );\n  },\n\n  _closeAnnouncementBar: function(evt) {\n    evt.preventDefault();\n\n    if (Shopify.designMode) return;\n\n    var $announcementBar = $(selectors$19.announcementBar);\n\n    this.$siteHeaderWrapper.css(\n      'margin-top',\n      '-' + $announcementBar.outerHeight() + 'px'\n    );\n\n    $(selectors$19.announcementBarClose).attr('aria-expanded', false);\n\n    if (utils.isSessionStorageSupported()) {\n      sessionStorage.setItem('announcement-bar-hidden', true);\n    }\n\n    utils.promiseTransitionEnd(this.$siteHeaderWrapper).then(\n      function() {\n        $announcementBar.remove();\n\n        this.$siteHeaderWrapper\n          .removeClass(classes$17.siteHeaderWrapperTransitioning)\n          .css('margin-top', '');\n      }.bind(this)\n    );\n  },\n\n  _updateHeaderTransparency: function() {\n    if ($('html').hasClass('is-ios') && Shopify.designMode) return;\n\n    this.$siteHeader.removeClass(classes$17.headerTransparent);\n\n    // Only continue if we're on the homepage and transparent header setting is enabled.\n    if (!this.$siteHeader.data('transparent-header')) return;\n\n    var $firstSection = $(selectors$19.contentForLayout)\n      .find('[data-section-type]')\n      .first();\n\n    // Only continue if first section exists and its type allows for a transparent header\n    if (\n      !$firstSection.length ||\n      sectionsWithTransparentHeader.indexOf(\n        $firstSection.data('section-type')\n      ) === -1\n    )\n      return;\n\n    this.$siteHeader.addClass(classes$17.headerTransparent);\n  },\n\n  _toggleHeaderPosition: function() {\n    // Check if toggle is disabled by other settings\n    if (!scrollHandler || this.headerAnimating) return;\n\n    var scrollTop = $(document).scrollTop();\n\n    this.headerHeight = this.headerHeight || this.$container.outerHeight();\n\n    // Check which header transformation needs to happen. Also check if a toggle\n    // even needs to happen, i.e. if you're scrolling up and the header is\n    // already displayed, why call slideOut again?\n    // Debounce any style changes to the next frame using requestAnimationFrame\n    if (scrollTop <= 0) {\n      requestAnimationFrame(this._promiseHeaderReset.bind(this));\n    } else if (\n      scrollTop < this.scrollTop &&\n      scrollTop > 0 &&\n      !this.isFixed &&\n      !this.isAnimating\n    ) {\n      requestAnimationFrame(this._promiseHeaderSlideIn.bind(this));\n    } else if (\n      scrollTop > this.scrollTop &&\n      scrollTop > this.headerHeight &&\n      this.isFixed &&\n      !this.isAnimating\n    ) {\n      requestAnimationFrame(this._promiseHeaderSlideOut.bind(this));\n    }\n\n    this.scrollTop = scrollTop;\n\n    // The scroll event is fired randomly and is not guaranteed to fire when\n    // scrollTop === 0. Double check after a short period to see if we need to\n    // reset the header.\n    this._doubleCheckPosition();\n  },\n\n  _doubleCheckPosition: function() {\n    if (typeof this.doubleCheckDebounced === 'undefined') {\n      this.doubleCheckDebounced = debounce(\n        function() {\n          this.scrollTop = $(document).scrollTop();\n          if (this.scrollTop <= 0) {\n            this._promiseHeaderReset();\n          }\n        }.bind(this),\n        500\n      );\n    }\n\n    this.doubleCheckDebounced();\n  },\n\n  _promiseHeaderReset: function() {\n    this.promiseChain = this.promiseChain.then(\n      function() {\n        this.$container.removeClass(classes$17.headerFixed);\n        $('body').css('padding-top', '');\n      }.bind(this)\n    );\n  },\n\n  _promiseHeaderSlideIn: function() {\n    this.isFixed = true;\n    this.headerAnimating = true;\n    this.$siteHeaderWrapper.css('transform', 'translateY(-100%)');\n\n    requestAnimationFrame(\n      function() {\n        this.$container.addClass(classes$17.headerFixed);\n\n        // \u7DE8\u96C6\u7B87\u6240\n        if ($('body').hasClass('template-page') && window.matchMedia('(max-width: 749px)').matches) {\n          $('body').css('padding-top', 0);\n        } else if (!this.$container.hasClass(classes$17.headerHomepage)) {\n          $('body').css('padding-top', this.headerHeight);\n        }\n\n        requestAnimationFrame(\n          function() {\n            this.$siteHeaderWrapper.css({\n              transform: 'translateY(0%)',\n              transition: 'transform 0.25s ease-out'\n            });\n          }.bind(this)\n        );\n      }.bind(this)\n    );\n\n    return utils.promiseTransitionEnd(this.$siteHeaderWrapper).then(\n      function() {\n        this.headerAnimating = false;\n        this.$siteHeaderWrapper.attr('style', '');\n      }.bind(this)\n    );\n  },\n\n  _promiseHeaderSlideOut: function() {\n    this.isFixed = false;\n    this.headerAnimating = true;\n\n    this.$siteHeaderWrapper.css({\n      transform: 'translateY(-100%)',\n      transition: 'transform 0.25s ease-out'\n    });\n\n    return utils.promiseTransitionEnd(this.$siteHeaderWrapper).then(\n      function() {\n        this.headerAnimating = false;\n        this.$siteHeaderWrapper.attr('style', '');\n        $('body').css('padding-top', '');\n        this.$container.removeClass(classes$17.headerFixed);\n      }.bind(this)\n    );\n  },\n\n  _toggleCartBubble: function(evt, state) {\n    var $bubble = $(selectors$19.cartBubble, this.$container);\n\n    $bubble.toggleClass(classes$17.cartBubbleVisible, state.items.length !== 0);\n\n    if (!$('body').hasClass(classes$17.drawerActive)) {\n      $bubble.addClass(classes$17.bubblePulse);\n\n      utils.promiseAnimationEnd($bubble).then(function() {\n        $bubble.removeClass(classes$17.bubblePulse);\n      });\n    }\n  },\n\n  /*--------------------------------------------------------------------------*/\n  /*                              Navigation                                  */\n  /*--------------------------------------------------------------------------*/\n  showNavigation: function() {\n    var isOpen = $(document.body).hasClass(classes$17.navigationOpen);\n    this.siteNavigation = this.container.querySelector(\n      selectors$19.siteNavigation\n    );\n    var navigationButton = this.siteNavigation.querySelector(\n      selectors$19.navigationButton\n    );\n\n    if (!isOpen) {\n      scrollHandler = false;\n\n      this._adjustNavigationPadding();\n      a11y.trapFocus(this.siteNavigation, {\n        elementToFocus: navigationButton\n      });\n\n      utils.enableTabbingOfChildren(selectors$19.navigation);\n      $(selectors$19.navigation).attr('aria-hidden', false);\n\n      this.promiseChain = this.promiseChain\n        .then(this._promiseNavTransition.bind(this, true))\n        .then(\n          this._promiseNavItemsTransition.bind(\n            this,\n            $(selectors$19.navAnimateElements, this.$container).toArray(),\n            true\n          )\n        )\n        .then(\n          function() {\n            $(document).on(\n              'keyup' + this.namespace,\n              this._closeOnEscape.bind(this)\n            );\n            $(selectors$19.navigationButton)\n              .attr('aria-expanded', true)\n              .off()\n              .one('click', this._toggleNavigationDisplay.bind(this));\n          }.bind(this)\n        );\n    }\n\n    return this.promiseChain.then(function() {\n      // This class is only applied in the Theme Editor and makes sure that\n      // the navigation links show when the section reloads from settings\n      // changes.\n      if (Shopify.designMode) {\n        $(document.body).addClass(classes$17.navigationOpenEditor);\n      }\n    });\n  },\n\n  hideNavigation: function() {\n    var isOpen = $(document.body).hasClass(classes$17.navigationOpen);\n\n    if (isOpen) {\n      var $navElements = $(selectors$19.navAnimateElements, this.$container);\n\n      a11y.removeTrapFocus();\n\n      utils.disableTabbingOfChildren(selectors$19.navigation);\n      $(selectors$19.navigation).attr('aria-hidden', true);\n\n      if (Shopify.designMode) {\n        $(document.body).removeClass(classes$17.navigationOpenEditor);\n        $navElements.addClass(classes$17.navigationEntranceActive);\n      }\n\n      this.promiseChain = this.promiseChain\n        .then(\n          this._promiseNavItemsTransition.bind(\n            this,\n            $navElements.toArray().reverse(),\n            false\n          )\n        )\n        .then(this._promiseNavTransition.bind(this, false))\n        .then(\n          function() {\n            scrollHandler = true;\n            $(document).off('keyup' + this.namespace);\n            $(selectors$19.navigationButton)\n              .off()\n              .one('click', this._toggleNavigationDisplay.bind(this))\n              .attr('aria-expanded', false)\n              .focus();\n          }.bind(this)\n        );\n    }\n\n    return this.promiseChain;\n  },\n\n  _toggleNavigationDisplay: function() {\n    navigationManuallyToggled = true;\n\n    if ($(document.body).hasClass(classes$17.navigationOpen)) {\n      this.hideNavigation();\n    } else {\n      this.showNavigation();\n    }\n  },\n\n  _adjustNavigationPadding: function() {\n    this.headerHeight = this.$siteHeader.height();\n    $(selectors$19.navigation, this.$container).css({\n      top: this.headerHeight + 'px',\n      'min-height': 'calc(100vh - ' + this.headerHeight + 'px)',\n      'max-height': 'calc(100vh - ' + this.headerHeight + 'px)'\n    });\n  },\n\n  _promiseNavTransition: function(active) {\n    $(document.body)\n      .addClass(classes$17.navigationTransitioning)\n      .toggleClass(classes$17.navigationOpen, active);\n\n    $(window).scrollTop(this.scrollTop);\n\n    return utils\n      .promiseTransitionEnd($(selectors$19.navigation, this.$container))\n      .then(function() {\n        $(document.body).removeClass(classes$17.navigationTransitioning);\n      });\n  },\n\n  _promiseNavItemsTransition: function(elements, active) {\n    return utils.mapPromiseSeries(elements, function(index, element) {\n      var $element = $(element);\n\n      $element.toggleClass(classes$17.navigationEntranceActive, active);\n\n      return utils.promiseTransitionEnd($element);\n    });\n  },\n\n  _closeOnEscape: function(evt) {\n    if (evt.keyCode === 27) {\n      this.hideNavigation();\n    }\n  },\n\n  _toggleNavigationSublinks: function(evt) {\n    var $anchor = $(evt.currentTarget);\n    var $parent = $anchor.parent();\n    var isExpanded = $anchor.attr('aria-expanded') === 'true';\n    var $childSublinks = $parent.find(selectors$19.navigationExpandChildSublinks);\n\n    $parent.toggleClass(classes$17.navigationHasSublinksCollapsed);\n    $parent\n      .siblings(selectors$19.navigationHasSublinks)\n      .addClass(classes$17.navigationHasSublinksCollapsed)\n      .children(selectors$19.navigationExpandSublinks)\n      .attr('aria-expanded', false);\n\n    this._setMaxHeight($parent.siblings(selectors$19.navigationHasSublinks), '');\n\n    if ($childSublinks.length) {\n      this._updateSublinkMaxHeight($anchor);\n    }\n\n    $anchor.attr('aria-expanded', !isExpanded);\n    this._toggleSubNavigationElementHeight($anchor);\n  },\n\n  _updateSublinkMaxHeight: function($anchor) {\n    var isChildSublink = $anchor.hasClass(\n      classes$17.navigationExpandChildSublinks\n    );\n\n    if (!isChildSublink) {\n      return;\n    }\n\n    var $sublinkContainer = $anchor.closest(\n      selectors$19.navigationSublinksContainer\n    );\n    var $childSublinks = $sublinkContainer.find(\n      selectors$19.navigationHasSublinks\n    );\n\n    var maxHeight = $sublinkContainer.data('max-height');\n\n    $childSublinks.each(function() {\n      var $el = $(this);\n\n      if ($el.hasClass(classes$17.navigationHasSublinksCollapsed)) {\n        return;\n      }\n\n      var $childSublink = $el.find(selectors$19.navigationChildSublinks);\n      var $parent = $childSublink.parent();\n\n      maxHeight += $parent.data('max-height');\n    });\n\n    $sublinkContainer.css('max-height', maxHeight);\n  },\n\n  _setSublinksMaxHeight: function() {\n    $(selectors$19.navigationSublinks, this.$container).each(function() {\n      var $el = $(this);\n      var $parent = $el.parent();\n      var sublinkHeight = $el.outerHeight();\n\n      $parent\n        .data('max-height', sublinkHeight)\n        .css('max-height', sublinkHeight);\n    });\n  },\n\n  _toggleSubNavigationElementHeight: function($anchor) {\n    var $currentListItem = $anchor.parent('li');\n    if ($currentListItem.hasClass(classes$17.navigationHasSublinksCollapsed)) {\n      this._setMaxHeight($currentListItem, '');\n    } else {\n      if ($currentListItem.hasClass(selectors$19.navigationSublink)) {\n        this._updateSublinkMaxHeight($currentListItem);\n        return;\n      }\n      this._setMaxHeight($currentListItem, 'none');\n    }\n  },\n\n  _setMaxHeight: function(element, maxHeight) {\n    element.css('max-height', maxHeight);\n  }\n});\n\n/*\n\nList Collections Template Section\n--------------------------------------------------------------------------------\nCreates a staggered card grid for the list collections template.\n\n*/\n\n// Extensions\n// Libs\nsections.register('list-collections-template', {\n  onLoad: function() {\n    this.extend(cardManager);\n  }\n});\n\nvar promiseGoogleMapsAPI;\n\nvar errors = {\n  zeroResults: theme.strings.map && theme.strings.map.zeroResults,\n  overQueryLimit: theme.strings.map && theme.strings.map.overQueryLimit,\n  authError: theme.strings.map && theme.strings.map.authError,\n  requestDenied: theme.strings.map && theme.strings.map.addressError,\n  geocodeUnknownError: theme.strings.map && theme.strings.map.addressError,\n  missingKey: theme.strings.map && theme.strings.map.addressError,\n  apiLoadError: theme.strings.map && theme.strings.map.authError\n};\n\nfunction errorMessage(status) {\n  var error;\n\n  switch (status) {\n    case 'ZERO_RESULTS':\n      error = errors.zeroResults;\n      break;\n    case 'OVER_QUERY_LIMIT':\n      error = errors.overQueryLimit;\n      break;\n    case 'REQUEST_DENIED':\n      error = errors.requestDenied;\n      break;\n    case 'UNKNOWN_ERROR':\n      error = errors.geocodeUnknownError;\n      break;\n    default:\n      error = errors.geocodeUnknownError;\n  }\n\n  return error;\n}\n\nvar googleMaps = {\n  promiseAPI: function(key) {\n    key = key || '';\n\n    if (typeof promiseGoogleMapsAPI === 'undefined') {\n      promiseGoogleMapsAPI = $.getScript(\n        'https://maps.googleapis.com/maps/api/js?key=' + key\n      );\n    }\n\n    return promiseGoogleMapsAPI.then(function() {\n      return $.Deferred(function(defer) {\n        if (!window.google || !window.google.maps) {\n          defer.reject(errors.apiLoadError);\n        }\n\n        defer.resolve(window.google);\n      });\n    });\n  },\n\n  promiseGeocode: function(address) {\n    return this.promiseAPI().then(function(google) {\n      return $.Deferred(function(defer) {\n        var geocoder;\n\n        // Global function called by Google on auth errors.\n        window.gm_authFailure = function() {\n          // eslint-disable-line camelcase\n          defer.reject(errors.authError);\n        };\n\n        geocoder = new google.maps.Geocoder();\n        geocoder.geocode({ address: address }, function(results, status) {\n          if (status !== google.maps.GeocoderStatus.OK) {\n            defer.reject(errorMessage(status));\n          }\n          defer.resolve(results);\n        });\n      });\n    });\n  },\n\n  promiseMap: function(config) {\n    return $.when(\n      this.promiseAPI(config.key),\n      this.promiseGeocode(config.address)\n    ).then(function(google, results) {\n      return $.Deferred(function(defer) {\n        var map;\n        var center = results[0].geometry.location;\n        var mapOptions = $.extend(\n          {},\n          {\n            zoom: 14,\n            center: center,\n            disableDefaultUI: true\n          },\n          config\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          // eslint-disable-line camelcase\n          defer.reject(errors.authError);\n        };\n\n        map = new google.maps.Map(config.container, mapOptions);\n        map.centerMarker = new google.maps.Marker({\n          map: map,\n          position: map.getCenter()\n        });\n\n        google.maps.event.addDomListener(\n          window,\n          'resize',\n          debounce(function() {\n            google.maps.event.trigger(map, 'resize');\n            map.setCenter(center);\n          }, 250)\n        );\n\n        return defer.resolve(map);\n      });\n    });\n  }\n};\n\n/*\n\nMap Section\n--------------------------------------------------------------------------------\nLoads a static map in the background of the section\n\n*/\n\n// Libs\nvar selectors$20 = {\n  map: '.map-section__container',\n  mapError: '.map-section__error-message'\n};\n\nvar classes$18 = {\n  mapError: 'map-section--load-error'\n};\n\nsections.register('map', {\n  onLoad: function() {\n    this.$container = $(this.container);\n    this.$map = $(selectors$20.map, this.$container);\n    this.key = this.$map.data('api-key');\n\n    if (typeof this.key !== 'string' || this.key === '') return;\n\n    var config = {\n      key: this.key,\n      container: this.$map[0],\n      address: this.$map.data('address-setting')\n    };\n\n    utils\n      .promiseStylesheet()\n      .then(function() {\n        return googleMaps.promiseMap(config);\n      })\n      .then(\n        function(map) {\n          this.map = map;\n        }.bind(this)\n      )\n      .catch(\n        function(error) {\n          this.$container.addClass(classes$18.mapError);\n\n          // Only show error in the theme editor\n          if (Shopify.designMode) {\n            $(selectors$20.mapError, this.$container)\n              .html(error)\n              .css('display', 'inline-block');\n          }\n        }.bind(this)\n      );\n  }\n});\n\n/*\n\nNewsletter Section\n--------------------------------------------------------------------------------\nOverrides default HTML5 error checking for the newsletter section.\n\n*/\n\n// Libs\nvar selectors$21 = {\n  emailField: '#EmailField',\n  inputGroup: '.input-group--underline',\n  submitButton: '.btn--newsletter__submit',\n  newsletterMessage: '.newsletter__message'\n};\n\nvar errors$1 = {\n  blankError: theme.strings.newsletter && theme.strings.newsletter.blankError,\n  invalidError:\n    theme.strings.newsletter && theme.strings.newsletter.invalidError\n};\n\nsections.register('newsletter', {\n  onLoad: function() {\n    if ($('html').hasClass('is-ios') && Shopify.designMode) {\n      $(selectors$21.inputGroup, this.$container).addClass('has-animated');\n    }\n\n    this.$container.on(\n      'click',\n      selectors$21.submitButton,\n      this._checkEmail.bind(this)\n    );\n  },\n\n  _checkEmail: function() {\n    var emailFieldID =\n      selectors$21.emailField + this.$container.data('section-id');\n    var $emailField = $(emailFieldID, this.$container);\n    var $newsletterMessage = $(selectors$21.newsletterMessage, this.$container);\n    var errorMessage;\n    var emailValue = $emailField[0].value;\n    var emailRegExp = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\n    if (emailValue === '') {\n      errorMessage = errors$1.blankError;\n    } else if (!emailRegExp.test(emailValue)) {\n      errorMessage = errors$1.invalidError;\n    }\n\n    if (typeof errorMessage !== 'undefined') {\n      $newsletterMessage.html('<p class=\"errors\">' + errorMessage + '</p>');\n      return false;\n    } else {\n      $newsletterMessage.html('');\n    }\n  }\n});\n\n/*\n\nProduct Recommendations Section\n--------------------------------------------------------------------------------\nCreates a staggered card grid for the product recommendations section.\n\n*/\n\n// Libs\nvar selectors$22 = {\n  productRecommendationSlider: '[data-recommendations-slider]',\n  productRecommendationSlides: '[data-recommendations-slide]',\n  indicatorsWrapper: '[data-recommendations-indicators]',\n  indicator: '[data-recommendations-indicator]',\n  productRecommendationIndicatorIndex: function(index) {\n    return '[data-product-recommendation-indicator-index=\"' + index + '\"]';\n  }\n};\n\nvar classes$19 = {\n  indicatorActive: 'product-recommendations__slide-indicator--active'\n};\n\nvar mobileMediaQuery = '(max-width: 749px)';\n\nsections.register('product-recommendations', {\n  onLoad: function() {\n    this.didShowRecommendations = false;\n\n    var baseUrl = this.$container.data('baseUrl');\n    var productId = this.$container.data('productId');\n    var recommendationsSectionUrl =\n      baseUrl +\n      '?section_id=product-recommendations&product_id=' +\n      productId +\n      '&limit=4';\n\n    utils\n      .promiseStylesheet()\n      .then(function() {\n        return $.get(recommendationsSectionUrl);\n      })\n      .then(\n        function(section) {\n          var recommendationsMarkup = $(section).html();\n          if (recommendationsMarkup.trim() !== '') {\n            this.$container.html(recommendationsMarkup);\n            this._initProductRecommendations();\n\n            this.didShowRecommendations = true;\n          }\n        }.bind(this)\n      );\n  },\n\n  _initProductRecommendations: function() {\n    this.eventHandlers = {};\n    this.mql = window.matchMedia(mobileMediaQuery);\n    this._setupEventHandlers();\n    this._mediaQueryHandler();\n  },\n\n  _setupEventHandlers: function() {\n    this.eventHandlers._mediaQueryHandler = this._mediaQueryHandler.bind(this);\n    this.eventHandlers._updateIndicatorActiveState = this._updateIndicatorActiveState.bind(\n      this\n    );\n\n    this.mql.addListener(this.eventHandlers._mediaQueryHandler);\n  },\n\n  _mediaQueryHandler: function() {\n    if (this.mql.matches) {\n      this._initializeMobileSlider();\n    } else {\n      this._destroyMobileSlider();\n    }\n  },\n\n  _initializeMobileSlider: function() {\n    this.$slider =\n      this.$slider ||\n      this.$container.find(selectors$22.productRecommendationSlider);\n    this.$slides =\n      this.$slides || this.$slider.find(selectors$22.productRecommendationSlides);\n\n    // Don't init the slider if we have less than 2 slides\n    if (this.$slides.length < 2) {\n      return;\n    }\n\n    this.$indicatorsWrapper =\n      this.$indicatorsWrapper ||\n      this.$container.find(selectors$22.indicatorsWrapper);\n\n    this.$indicators =\n      this.$indicators || this.$indicatorsWrapper.find(selectors$22.indicator);\n\n    this.$slider.on(\n      'scroll',\n      { passive: true },\n      this.eventHandlers._updateIndicatorActiveState\n    );\n\n    this._updateIndicatorActiveState();\n  },\n\n  _destroyMobileSlider: function() {\n    if (!this.$slider) {\n      return;\n    }\n\n    this.$slider.off('scroll');\n  },\n\n  _updateIndicatorActiveState: function() {\n    this.$indicators.removeClass(classes$19.indicatorActive);\n\n    var scrollLeft = this.$slider.scrollLeft();\n    var numberOfSlides = this.$slides.length;\n    var slideWidth = this.$slider[0].scrollWidth / numberOfSlides;\n    var activeIndicatorIndex = Math.round(scrollLeft / slideWidth) + 1;\n\n    var $indicator = this.$container.find(\n      selectors$22.productRecommendationIndicatorIndex(activeIndicatorIndex)\n    );\n\n    $indicator.addClass(classes$19.indicatorActive);\n  },\n\n  onUnload: function() {\n    if (!this.didShowRecommendations) {\n      return;\n    }\n\n    this.mql.removeListener(this.eventHandlers._mediaQueryHandler);\n    this._destroyMobileSlider();\n  }\n});\n\n/*\n\nProduct Slideshow Extension\n--------------------------------------------------------------------------------\nAdds the product slideshow functionality to a section\n\nEvents\n---------\n\nName: product_slideshow_show\nDescription: Fired when the slideshow is opened\nPayload: none\n\nName: product_slideshow_hide\nDescription: Fired when the slideshow is closed\nPayload: none\n\nName: product_slideshow_set_slide\nDescription: Fired when the slide is being set\nPayload: { number } Index of the slide\n\nName: product_slideshow_next\nDescription: Fired when the next button is clicked\nPayload: none\n\nName: product_slideshow_previous\nDescription: Fired when the previous button is clicked\nPayload: none\n\n*/\n\nvar classes$21 = {\n  lazypreload: 'lazypreload',\n  showProductSlideshow: 'product-slideshow--show',\n  productSlideshowSelectActive: 'product-slideshow__slide-select--active'\n};\n\nvar selectors$24 = {\n  slider: '[data-product-slider]',\n  productSlideshow: '[data-product-slideshow]',\n  productSlideshowOpen: '[data-product-slideshow-open]',\n  productSlideshowSlide: '[data-product-slideshow-slide]',\n  productSlideshowImage: '[data-product-slideshow-image]',\n  productSlideshowNext: '[data-product-slideshow-next]',\n  productSlideshowSelect: '[data-product-slideshow-select]',\n  productSlideshowPrevious: '[data-product-slideshow-previous]',\n  productSlideshowClose: '[data-product-slideshow-close]',\n  productMediaTypeVideo: '[data-product-media-type-video]',\n  plyrAspectRatio: '[data-plyr-aspect-ratio]'\n};\n\nvar attributes$2 = {\n  productMediaTypeModel: 'data-product-media-type-model'\n};\n\nvar productSlideshow = {\n  init: function() {\n    this.$productSlideshow = $(selectors$24.productSlideshow, this.$container);\n    this.$slideshowSelect = $(selectors$24.productSlideshowSelect);\n\n    this.translateDistance = 0;\n\n    this.dotSettings = {\n      maxVisibleDots: 9,\n      dotWidth: 16\n    };\n\n    this.extend(productModel);\n    this.extend(productVideo);\n\n    this.initModelViewers(this.$productSlideshow);\n    this.initProductVideos(this.$productSlideshow);\n\n    $(window).on(\n      'resize',\n      debounce(\n        function() {\n          this.adjustPlyrMaxWidth();\n        }.bind(this),\n        100\n      )\n    );\n\n    // If there are not enough images on the page we won't have a slideshow, so\n    // return.\n    if (this.$productSlideshow.length === 0) return;\n\n    $(selectors$24.productSlideshowOpen).on(\n      'click',\n      this._onImageClick.bind(this)\n    );\n\n    // The product slideshow is shipped from the server inside the product template\n    // section HTML. For styling reasons, the slideshow HTML needs to live as\n    // the last child of body.\n    this.$productSlideshow.appendTo(document.body);\n\n    // Check how many slides we have for the slideshow. If we only have one, then\n    // we don't need any slide controls, so no need to initialize the Slider() lib\n    this.slideCount = $(\n      selectors$24.productSlideshowSlide,\n      this.$productSlideshow\n    ).length;\n\n    if (this.slideCount) {\n      this.slider = new Slider($(selectors$24.slider, this.$productSlideshow));\n\n      this.slider.$slides.on(\n        'mediaSlideIsDraggable',\n        function(event, isDraggable) {\n          this.slider.setIsDraggable(isDraggable);\n        }.bind(this)\n      );\n    }\n  },\n\n  showSlideshow: function() {\n    this.trigger('product_slideshow_show');\n\n    // Cache the image that was clicked so that when we close the slideshow, we\n    // can return the focus to it.\n    this.$slideshowOpenFocus = $(document.activeElement);\n\n    // Add the lazysizes preload class so that we start preloading all slideshow\n    // images\n    $(selectors$24.productSlideshowImage, this.$productSlideshow).addClass(\n      classes$21.lazypreload\n    );\n\n    // Get the header section so that we can turn off the scroll handling so that\n    // it doesn't disappear when we open the slideshow.\n    return sections.getInstances('header-section').then(\n      function(instances) {\n        instances[0].scrollHandler = false;\n\n        this._assignEventHandlers();\n\n        a11y$1.trapFocus({\n          $container: this.$productSlideshow,\n          namespace: 'product-slideshow'\n        });\n\n        this.$productSlideshow\n          .addClass(classes$21.showProductSlideshow)\n          .attr('aria-hidden', false);\n\n        this.adjustPlyrMaxWidth();\n\n        utils.disableScrollBody();\n        utils.enableTabbingOfChildren(this.$productSlideshow);\n      }.bind(this)\n    );\n  },\n\n  hideSlideshow: function() {\n    this.trigger('product_slideshow_hide');\n\n    return sections.getInstances('header-section').then(\n      function(instances) {\n        instances[0].scrollHandler = true;\n        this._removeEventHandlers();\n\n        a11y$1.removeTrapFocus({ namespace: 'product-slideshow' });\n\n        utils.enableScrollBody();\n        utils.disableTabbingOfChildren(this.$productSlideshow);\n\n        this.$productSlideshow\n          .removeClass(classes$21.showProductSlideshow)\n          .attr('aria-hidden', true);\n        this.$slideshowOpenFocus.focus();\n\n        this.slider.$currentSlide.trigger('mediaHidden');\n        this.updateShopifyXr();\n      }.bind(this)\n    );\n  },\n\n  setSlide: function(id) {\n    if (this.slideCount <= 1) return;\n\n    var index = this._getSlideIndex(id);\n\n    this.trigger('product_slideshow_set_slide', [index]);\n\n    return this.slider.setSlide(index); // eslint-disable-line consistent-return\n  },\n\n  adjustPlyrMaxWidth: function() {\n    $(selectors$24.plyrAspectRatio).each(function() {\n      var $aspectRatioContainer = $(this);\n\n      var aspectRatioValue = parseFloat(\n        $aspectRatioContainer.data('plyr-aspect-ratio')\n      );\n\n      var parentHeight = $(\n        $aspectRatioContainer.closest(selectors$24.productMediaTypeVideo)\n      ).height();\n\n      var maxWidth = parentHeight * aspectRatioValue;\n\n      $aspectRatioContainer.css('max-width', maxWidth + 'px');\n    });\n  },\n\n  _onImageClick: function(evt) {\n    // By default the image is a link, so prevent going to the image link\n    evt.preventDefault();\n    var id = $(evt.currentTarget).data('media-id');\n    this.setSlide(id);\n    this.showSlideshow();\n    this._triggerMediaVisible(id);\n  },\n\n  _triggerMediaVisible: function(id) {\n    var $currentSlide = $(\n      selectors$24.productSlideshowSlide,\n      this.$productSlideshow\n    ).filter('[data-media-id=\"' + id + '\"]');\n\n    if (!$currentSlide) return;\n    $currentSlide.trigger('mediaVisible');\n  },\n\n  _assignEventHandlers: function() {\n    // Use `.one()` instead of `.on()` because we want to listen and respond\n    // to one key input at a time. For example, if you hit the forward arrow button\n    // really fast while the slide is still animating, we don't want it to keep\n    // animating for all the times that you mashed the key.\n    $(document).one('keyup.product-slideshow', this._onKeyup.bind(this));\n\n    this.$productSlideshow\n      .on(\n        'slidetransitionend',\n        function(evt, data) {\n          this._setSlideIndicator(evt, data);\n\n          var currentMediaId = data.$currentSlide.data('media-id');\n          $(this.slider.$slides)\n            .filter(\":not([data-media-id='\" + currentMediaId + \"'])\")\n            .trigger('mediaHidden');\n\n          var isCurrentSlideModel = data.$currentSlide[0].hasAttribute(\n            attributes$2.productMediaTypeModel\n          );\n\n          if (isCurrentSlideModel && utils.isTouch()) {\n            this.updateShopifyXr(this.id, currentMediaId);\n            this.slider.setIsDraggable(true);\n          } else if (isCurrentSlideModel) {\n            this.updateShopifyXr(this.id, currentMediaId);\n          } else {\n            this.updateShopifyXr(this.id);\n            this.slider.setIsDraggable(true);\n          }\n        }.bind(this)\n      )\n      .on('click', selectors$24.productSlideshowSelect, this._setSlide.bind(this))\n      .on(\n        'keyup',\n        selectors$24.productSlideshowSelect,\n        this._handleMediaFocus.bind(this)\n      )\n      .one(\n        'click',\n        selectors$24.productSlideshowClose,\n        this.hideSlideshow.bind(this)\n      )\n      .one('click', selectors$24.productSlideshowNext, this._nextSlide.bind(this))\n      .one(\n        'click',\n        selectors$24.productSlideshowPrevious,\n        this._previousSlide.bind(this)\n      );\n  },\n\n  _removeEventHandlers: function() {\n    this.$productSlideshow.off();\n    $(document).off('.product-slideshow');\n  },\n\n  _getSlideIndex: function(id) {\n    return $(selectors$24.productSlideshowSlide, this.$productSlideshow)\n      .filter('[data-media-id=\"' + id + '\"]')\n      .index();\n  },\n\n  _handleMediaFocus: function(evt) {\n    if (\n      evt.keyCode !== utils.keyboardKeys.ENTER &&\n      evt.keyCode !== utils.keyboardKeys.SPACE\n    )\n      return;\n\n    var slideIndex = $(evt.currentTarget).index();\n    var $slide = $(this.slider.$slides[slideIndex]);\n\n    var $plyrOrModel = $slide.find('model-viewer, .plyr');\n    if ($plyrOrModel.length) {\n      $plyrOrModel.first().focus();\n    } else {\n      $slide.focus();\n    }\n  },\n\n  _setSlide: function(evt) {\n    var $navButton = $(evt.target);\n    var index = $navButton.index();\n\n    this.trigger('product_slideshow_set_slide', [index]);\n    this.slider.setSlide(index);\n  },\n\n  _nextSlide: function() {\n    this.trigger('product_slideshow_next');\n    this.trigger('product_slideshow_set_slide', [\n      this.slider.$nextSlide.index()\n    ]);\n\n    return this.slider.nextSlide().then(\n      function() {\n        this.$productSlideshow.one(\n          'click',\n          selectors$24.productSlideshowNext,\n          this._nextSlide.bind(this)\n        );\n      }.bind(this)\n    );\n  },\n\n  _previousSlide: function() {\n    this.trigger('product_slideshow_previous');\n    this.trigger('product_slideshow_set_slide', [\n      this.slider.$previousSlide.index()\n    ]);\n\n    return this.slider.previousSlide().then(\n      function() {\n        this.$productSlideshow.one(\n          'click',\n          selectors$24.productSlideshowPrevious,\n          this._previousSlide.bind(this)\n        );\n      }.bind(this)\n    );\n  },\n\n  _setSlideIndicator: function(evt, data) {\n    var index = data.$currentSlide.index();\n\n    $(selectors$24.productSlideshowSelect, this.$productSlideshow)\n      .eq(index)\n      .addClass(classes$21.productSlideshowSelectActive)\n      .siblings()\n      .removeClass(classes$21.productSlideshowSelectActive);\n\n    this.translateDots(index);\n  },\n\n  translateDots: function(index) {\n    var settings = this.dotSettings;\n\n    if (this.slideCount <= settings.maxVisibleDots) return;\n\n    var maxTranslateDistance =\n      (this.slideCount - settings.maxVisibleDots) * settings.dotWidth;\n\n    if (index >= settings.maxVisibleDots - 1) {\n      var calculatedTranslateDistance =\n        (index + 2 - settings.maxVisibleDots) * settings.dotWidth;\n\n      calculatedTranslateDistance =\n        maxTranslateDistance < calculatedTranslateDistance\n          ? maxTranslateDistance\n          : calculatedTranslateDistance;\n\n      this.translateDistance = -calculatedTranslateDistance;\n    } else {\n      this.translateDistance = 0;\n    }\n\n    this.$slideshowSelect.css(\n      'transform',\n      'translateX(' + this.translateDistance + 'px)'\n    );\n  },\n\n  _onKeyup: function(evt) {\n    // Assign the default transition value to be a resolved promise so that if\n    // we don't end up assigning a real transition (next, prev, esc) then we\n    // immediately attach another keyup event handler.\n    var promiseTransition = $.Deferred().resolve();\n    var shouldPreventSlide = this.slider.shouldPreventSlide(\n      evt.target,\n      ['.plyr', '.shopify-model-viewer-ui'],\n      this.slideCount\n    );\n\n    switch (evt.keyCode) {\n      case 37:\n        if (shouldPreventSlide) break;\n\n        promiseTransition = this.slider.previousSlide();\n        break;\n      case 39:\n        if (shouldPreventSlide) break;\n\n        promiseTransition = this.slider.nextSlide();\n        break;\n      case 27:\n        this.hideSlideshow();\n        promiseTransition = $.Deferred().reject();\n        break;\n    }\n\n    promiseTransition.then(\n      function() {\n        // When the transition is done, then start listening for a keyup event again\n        $(document).one('keyup', this._onKeyup.bind(this));\n      }.bind(this)\n    );\n  }\n};\n\n/*\n\nProduct Template Section\n--------------------------------------------------------------------------------\nShows a product and allows the user to select product variants and add the product\nto their cart. Adds a product media slideshow that can be viewed when you select\na media on the page. Adds expanding social sharing buttons.\n\n*/\n\n// Extensions\n// Libs\nvar selectors$23 = {\n  productFormWrapper: '.product__form-wrapper',\n  productDescription: '.product__description'\n};\n\nvar classes$20 = {\n  productFormFixed: 'product__form-wrapper--fixed',\n  productFormBottom: 'product__form-wrapper--bottom'\n};\n\nvar formStickyTop = 80;\n\nsections.register('product-template', {\n  onLoad: function() {\n    this.coverPosition = 'top';\n\n    this.extend(productSlideshow);\n    this.extend(socialSharing);\n    this.extend(productDisplay);\n\n    this.window().on('scroll', this._setFormPosition.bind(this));\n    this.window().on(\n      'resize',\n      debounce(this._callResizeFunctions.bind(this), 500)\n    );\n\n    this.on('variant_add_to_cart', this._updateMeasurements.bind(this));\n    this.on('variant_change', this._updateHistoryState.bind(this));\n\n    this.document().on(\n      'drawer_open_start',\n      this._handleFixedSideImage.bind(this)\n    );\n    this.document().on(\n      'drawer_close_done',\n      this._resetFixedSideImage.bind(this)\n    );\n\n    utils.promiseStylesheet().then(\n      function() {\n        this._updateMeasurements();\n      }.bind(this)\n    );\n  },\n\n  _callResizeFunctions: function() {\n    this._updateMeasurements();\n    this._formatVariantSelectors();\n  },\n\n  _handleFixedSideImage: function() {\n    if (this.coverPosition !== 'fixed') return;\n\n    var scrollTop = $(window).scrollTop();\n    var translate = scrollTop - this.fixedTop + 2 * formStickyTop + 28;\n\n    $(selectors$23.productFormWrapper, this.$container).css({\n      transform: 'translateY(' + translate + 'px)',\n      position: 'absolute'\n    });\n  },\n\n  _resetFixedSideImage: function() {\n    if (this.coverPosition !== 'fixed') return;\n\n    $(selectors$23.productFormWrapper, this.$container).css({\n      transform: '',\n      position: ''\n    });\n  },\n\n  _updateHistoryState: function(event, instance, product, variant) {\n    if (!history.replaceState) return;\n\n    var newurl =\n      window.location.protocol +\n      '//' +\n      window.location.host +\n      window.location.pathname +\n      '?variant=' +\n      variant.id;\n    window.history.replaceState({ path: newurl }, '', newurl);\n  },\n\n  _setFormPosition: function() {\n    if (utils.isMobile() || !this.enableSticky) return;\n\n    var scrollTop = $(window).scrollTop();\n\n    // Debounce DOM edits to next frame with requestAnimationFrame\n    requestAnimationFrame(\n      function() {\n        if (scrollTop > this.fixedTop) {\n          if (scrollTop > this.fixedBottom) {\n            // Fix to bottom\n            this.coverPosition = 'bottom';\n            $(selectors$23.productFormWrapper)\n              .css('width', this.formWidth)\n              .removeClass(classes$20.productFormFixed)\n              .addClass(classes$20.productFormBottom);\n          } else {\n            // Fix to the side\n            this.coverPosition = 'fixed';\n            $(selectors$23.productFormWrapper)\n              .css('width', this.formWidth)\n              .addClass(classes$20.productFormFixed)\n              .removeClass(classes$20.productFormBottom);\n          }\n        } else {\n          // Fix to the top\n          this.coverPosition = 'top';\n          $(selectors$23.productFormWrapper)\n            .css('width', '')\n            .removeClass(classes$20.productFormFixed)\n            .removeClass(classes$20.productFormBottom);\n        }\n      }.bind(this)\n    );\n  },\n\n  _updateMeasurements: function() {\n    var $formWrapper = $(selectors$23.productFormWrapper);\n    var descriptionHeight = $(selectors$23.productDescription).outerHeight(true);\n    var formHeight = $formWrapper.height();\n\n    this.enableSticky = descriptionHeight > formHeight;\n\n    if (!this.enableSticky) return;\n\n    this.fixedTop = $formWrapper.parent().offset().top - formStickyTop;\n    this.fixedBottom = this.fixedTop + descriptionHeight - formHeight;\n    this.formWidth = $formWrapper.parent().width();\n\n    this._setFormPosition();\n  }\n});\n\nvar selectors$25 = {\n  slider: '.quotes-slider',\n  slide: '.quotes-slide'\n};\n\nvar classes$22 = {\n  visible: 'quotes-slide--visible'\n};\n\nsections.register('quotes-section', {\n  onLoad: function() {\n    this.$container = $(this.container);\n    this.$slider = $(selectors$25.slider, this.$container);\n    this.totalSlides = this.$slider.data('count');\n    this.speed = this.$slider.data('speed');\n    this.currentSlide = 0;\n\n    if (this.$slider.find(selectors$25.slide).length > 1) {\n      this._startSlider();\n    }\n  },\n\n  _startSlider: function() {\n    this.interval = setInterval(\n      function() {\n        if (this.currentSlide + 1 >= this.totalSlides) {\n          this.currentSlide = 0;\n        } else {\n          this.currentSlide++;\n        }\n\n        this._showSlide(selectors$25.slide + '--' + this.currentSlide);\n      }.bind(this),\n      this.speed\n    );\n  },\n\n  _showSlide: function(slide) {\n    this.$slider\n      .find(selectors$25.slide)\n      .removeClass(classes$22.visible)\n      .end()\n      .find(slide)\n      .addClass(classes$22.visible);\n  },\n\n  onBlockSelect: function(evt) {\n    clearInterval(this.interval);\n\n    var $selectedSlide = this.$container.find(\n      selectors$25.slide + '--' + evt.detail.blockId\n    );\n\n    this._showSlide($selectedSlide);\n  },\n\n  onBlockDeselect: function() {\n    this._startSlider();\n  }\n});\n\n/*\n\nSearch Template Section\n--------------------------------------------------------------------------------\nCreates a staggered card grid for the search template.\n\n*/\n\n// Extensions\n// Libs\nsections.register('search-template', {\n  onLoad: function() {\n    this.extend(cardManager);\n  }\n});\n\nvar promiseYoutubeAPI;\n\nvar youtube = {\n  promiseAPI: function() {\n    if (typeof window.YT !== 'undefined') {\n      promiseYoutubeAPI = $.Deferred(function(defer) {\n        defer.resolve();\n      });\n    }\n    if (!promiseYoutubeAPI) {\n      var tag = document.createElement('script');\n\n      tag.src = 'https://www.youtube.com/iframe_api';\n      var firstScriptTag = document.getElementsByTagName('script')[0];\n      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n\n      promiseYoutubeAPI = $.Deferred(function(defer) {\n        window.onYouTubeIframeAPIReady = defer.resolve;\n\n        setTimeout(function() {\n          defer.reject('Request for YouTube API timed out after 30 seconds.');\n        }, 30000);\n      });\n    }\n\n    return promiseYoutubeAPI;\n  },\n\n  promisePlayer: function(id, options) {\n    return this.promiseAPI().then(function() {\n      return $.Deferred(function(defer) {\n        if (typeof window.YT === 'undefined') {\n          defer.reject(\n            \"We're sorry, something went wrong. The YouTube API has not loaded correctly.\"\n          );\n        }\n\n        /* eslint-disable no-undef */\n        var player = new YT.Player(id, options); // global YT variable injected by YouTube API\n\n        player.addEventListener('onReady', function() {\n          defer.resolve(player);\n        });\n\n        setTimeout(function() {\n          defer.reject(\n            'Request for YouTube player has timed out after 30 seconds.'\n          );\n        }, 30000);\n      });\n    });\n  }\n};\n\nvar promiseVimeoAPI;\n\nvar vimeo = {\n  promiseAPI: function() {\n    if (typeof window.Vimeo !== 'undefined') {\n      promiseVimeoAPI = $.Deferred(function(defer) {\n        defer.resolve();\n      });\n    }\n    if (!promiseVimeoAPI) {\n      promiseVimeoAPI = $.Deferred(function(defer) {\n        var tag = document.createElement('script');\n        tag.src = 'https://player.vimeo.com/api/player.js';\n        tag.onload = tag.onreadystatechange = function() {\n          if (!this.readyState || this.readyState === 'complete') {\n            defer.resolve();\n          }\n        };\n\n        var firstScriptTag = document.getElementsByTagName('script')[0];\n        firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n\n        setTimeout(function() {\n          defer.reject('Request for Vimeo API timed out after 30 seconds.');\n        }, 30000);\n      });\n    }\n\n    return promiseVimeoAPI;\n  },\n\n  promisePlayer: function(id, options) {\n    return this.promiseAPI().then(function() {\n      return $.Deferred(function(defer) {\n        if (typeof window.Vimeo === 'undefined') {\n          defer.reject(\n            \"We're sorry, something went wrong. The Vimeo API has not loaded correctly.\"\n          );\n        }\n\n        var player = new window.Vimeo.Player(id, options);\n\n        setTimeout(function() {\n          defer.reject(\n            'Request for Vimeo player has timed out after 30 seconds.'\n          );\n        }, 30000);\n\n        player.ready().then(function() {\n          defer.resolve(player);\n        });\n      });\n    });\n  }\n};\n\n/*\n\nSlideshow Desktop Extension\n--------------------------------------------------------------------------------\nManages all the desktop behaviour of the home page slideshow\n\n\nEvents\n------------\n\nName: slideshow_desktop_init_start\nDescription: Fired before the desktop slideshow begins to initialize\nPayload: none\n\nName: slideshow_desktop_init_done\nDescription: Fired when the desktop slideshow is done initializing\nPayload: none\n\nName: slideshow_desktop_destroy\nDescription: Fired when the desktop slideshow is destroyed\nPayload: none\n\nName: slideshow_set_slide\nDescription: Fired when the user selects a specific slide\nPayload: { number } Index of the slide being displayed\n\nName: slideshow_previous_slide\nDescription: Fired when the user selects the previous slide\nPayload: { number } Index of the slide being displayed\n\nName: slideshow_next_slide\nDescription: Fired when the user selects the next slide\nPayload: { number } Index of the slide being displayed\n\nName: slideshow_video_load\nDescription: Fired when a video is being loaded in the slideshow\nPayload: { object } Video player DOM object\n\nName: slideshow_video_loaded\nDescription: Fired when the video is done loading in the slideshow\nPayload: { object } Video player DOM object\n\n*/\n\nvar selectors$27 = {\n  buttons: '.slideshow__buttons',\n  button: '.slideshow__button',\n  pauseButton: '[data-pause-button]',\n  label: '.slideshow__button-label',\n  cta: '.slideshow__button-cta--desktop',\n  ctaText: '.slideshow__heading-cta-text',\n  slide: '.slideshow__slide',\n  slideshow: '.slideshow',\n  video: '.slideshow__video'\n};\n\nvar classes$24 = {\n  centredCta: 'slideshow--center-cta',\n  buttonActive: 'slideshow__button--active',\n  headingCtaActive: 'slideshow__heading-cta-text--active',\n  headingCtaTransitioning: 'slideshow__heading-cta-text--transitioning',\n  linkActive: 'slideshow__button--link',\n  slideActive: 'slideshow__slide--active',\n  slideActiveTransitioning: 'slideshow__slide--transitioning',\n  videoLoaded: 'slideshow__video--loaded',\n  videoPaused: 'slideshow__video--paused',\n  paused: 'is-paused'\n};\n\nvar config = {\n  // Intensity for desktop mouse over effect (if more than 3 slides)\n  easeIntensity: 10\n};\n\nvar slideshowDesktop = {\n  initDesktopSlideshow: function() {\n    this.trigger('slideshow_desktop_init_start');\n\n    this.$slideshow = $(selectors$27.slideshow, this.$container);\n    this.$slide = $(selectors$27.slide, this.$container);\n    this.$buttons = $(selectors$27.buttons, this.$container);\n    this.$button = $(selectors$27.button, this.$container);\n\n    this.desktopSlideshow = true;\n    this.isAnimating = false;\n    this.currentDesktopSlide = 0;\n    this.totalSlides = this.$buttons.data('count');\n    this.players = [];\n    this.desktopSlideshowNamespace = '.desktopSlideshow';\n    this.isPostInitialized = false;\n\n    this.on(\n      'mouseover' + this.desktopSlideshowNamespace,\n      this._onHoverSlideshow.bind(this)\n    );\n    this.on(\n      'mousemove' + this.desktopSlideshowNamespace,\n      this._mouseMoveButtons.bind(this)\n    );\n    this.on(\n      'mouseleave' + this.desktopSlideshowNamespace,\n      this._resetButtonsPosition.bind(this)\n    );\n    this.on(\n      'keydown' + this.desktopSlideshowNamespace,\n      this._onTabButtons.bind(this)\n    );\n    this.on(\n      'click' + this.desktopSlideshowNamespace,\n      selectors$27.pauseButton,\n      this._onPauseButton.bind(this)\n    );\n    this.on(\n      'click' + this.desktopSlideshowNamespace,\n      selectors$27.label,\n      this._onClickButton.bind(this)\n    );\n    this.on(\n      'keydown' + this.desktopSlideshowNamespace,\n      this._addKeyBindingsDesktop.bind(this)\n    );\n\n    this.window().on(\n      'resize' + this.desktopSlideshowNamespace,\n      this._setButtonWrapperValues.bind(this)\n    );\n\n    utils.promiseStylesheet().then(\n      function() {\n        this._setButtonWrapperValues();\n        this._setSlideDesktop(0);\n        if (this.$container.hasClass(classes$24.centredCta)) {\n          this._setButtonStatus(0);\n        }\n        this.trigger('slideshow_desktop_init_done');\n      }.bind(this)\n    );\n  },\n\n  destroyDesktopSlideshow: function() {\n    this.trigger('slideshow_desktop_destroy');\n\n    this.desktopSlideshow = false;\n    this.off(this.desktopSlideshowNamespace);\n    this.window().off(this.desktopSlideshowNamespace);\n\n    this._setButtonsTranslateX(0);\n\n    // Loop over every video slide that is found as part of this.players\n    // and explicitly call the YouTube and/or Vimeo destroy method\n    // depending on the type of video player.\n    for (var key in this.players) {\n      if (!this.players.hasOwnProperty(key)) return;\n\n      var player = this.players[key];\n\n      if (typeof player.destroy === 'function') {\n        player.destroy();\n      } else if (typeof player.unload === 'function') {\n        player.unload();\n      }\n    }\n\n    this.players = [];\n  },\n\n  _onHoverSlideshow: function() {\n    this._animateButtonFrame();\n  },\n\n  _mouseMoveButtons: function(evt) {\n    if (this.totalSlides <= 3) return;\n\n    this.mousePosition = evt.pageX - this.centerOfButtonsWrapper;\n\n    if (!this.isAnimating) {\n      this.isAnimating = true;\n      this._animateButtonFrame();\n    }\n  },\n\n  _resetButtonsPosition: function() {\n    this.mousePosition = 0;\n  },\n\n  _onTabButtons: function(evt) {\n    if (evt.which !== utils.keyboardKeys.TAB) return;\n\n    var $nextButton;\n\n    if (!evt.shiftKey) {\n      $nextButton = $(evt.target)\n        .closest(this.$button)\n        .next();\n    } else {\n      $nextButton = $(evt.target)\n        .closest(this.$button)\n        .prev();\n    }\n\n    if (!$nextButton.length) return;\n\n    var division = $(window).width() / this.totalSlides;\n    var buttonIndex = $nextButton.index();\n\n    this.mousePosition = division * buttonIndex - $nextButton.width();\n    this._animateButtonFrame();\n  },\n\n  _onPauseButton: function(evt) {\n    var $currentSlide = this.$slide.eq(this.currentDesktopSlide);\n    var $pauseButton = $(evt.target);\n    var isPaused = $pauseButton.hasClass(classes$24.paused);\n    var blockId = this.$video.attr('data-block-id');\n\n    $pauseButton.toggleClass(classes$24.paused, !isPaused).attr({\n      'aria-label': isPaused\n        ? $pauseButton.data('label-pause')\n        : $pauseButton.data('label-play'),\n      'aria-pressed': !isPaused\n    });\n\n    if (this.players[blockId]) {\n      if (isPaused) {\n        this.players[blockId].playVideo();\n      } else {\n        this.players[blockId].pauseVideo();\n      }\n    }\n    $currentSlide.toggleClass(classes$24.videoPaused);\n  },\n\n  _onClickButton: function(evt) {\n    var $buttonClicked = $(evt.target).closest(selectors$27.button);\n\n    if ($buttonClicked.hasClass(classes$24.buttonActive)) return;\n\n    var index = $buttonClicked.index();\n\n    this._setSlideDesktop(index);\n\n    // Allow first slide to be clicked after initial load\n    if (!$buttonClicked.hasClass(classes$24.buttonActive)) {\n      this._setButtonStatus(index);\n    }\n  },\n\n  _setButtonStatus: function(index) {\n    var $button = this.$button.eq(index);\n    var $buttonText = $button.find(selectors$27.ctaText);\n\n    this.$button\n      .removeClass(classes$24.buttonActive)\n      .find(selectors$27.label)\n      .attr('aria-expanded', false);\n\n    $button\n      .addClass(classes$24.buttonActive)\n      .find(selectors$27.label)\n      .attr('aria-expanded', true);\n\n    if (this.isPostInitialized) {\n      $button.focus();\n    } else {\n      this.isPostInitialized = true;\n    }\n\n    this.$buttons\n      .find(selectors$27.ctaText)\n      .empty()\n      .attr('aria-hidden', true)\n      .removeClass(classes$24.headingCtaActive)\n      .removeAttr('style');\n\n    if ($buttonText.parent().is('a')) {\n      this._showButtonContent($buttonText);\n    }\n\n    this.$button.find(selectors$27.cta).attr('tabindex', '-1');\n    if ($button.hasClass(classes$24.linkActive)) {\n      $button.find(selectors$27.cta).attr('tabindex', '0');\n    }\n  },\n\n  _animateButtonFrame: function() {\n    var deltaPosition = this.mousePosition - this.xPosition;\n    // Calculates the differential ratio between the width of the button wrapper\n    // and the overflowed button element that actually animates.\n    var widthDifferenceRatio =\n      this.buttonsInnerWidth / this.buttonsWrapperWidth - 1;\n\n    // deltaPosition represents the momentum and will increment down every frame\n    // until it reaches < 1, the buttons will then stop animating.\n    if (Math.abs(deltaPosition) < 1) {\n      this.isAnimating = false;\n      return;\n    }\n\n    // This represents the mouse position relative to the slideshow width\n    // where this.xPosition equals 0 if the mouse position is in the center.\n    this.xPosition += deltaPosition / config.easeIntensity;\n\n    this._setButtonsTranslateX(-(this.xPosition * widthDifferenceRatio));\n\n    // This function is called recursively until the condition above is met,\n    // meaning once the buttons have stopped animating.\n    requestAnimationFrame(this._animateButtonFrame.bind(this));\n  },\n\n  _showButtonContent: function($buttonText) {\n    var buttonText = $buttonText.data('button-text');\n\n    $buttonText.html(buttonText).attr('aria-hidden', false);\n\n    if (\n      !$buttonText.attr('data-new-width') ||\n      !$buttonText.attr('data-new-height')\n    ) {\n      $buttonText.attr('data-new-width', $buttonText.outerWidth());\n      $buttonText.attr('data-new-height', $buttonText.outerHeight());\n    }\n\n    var newButtonContentWidth = $buttonText.attr('data-new-width');\n    var newButtonContentHeight = $buttonText.attr('data-new-height');\n\n    $buttonText.empty();\n\n    requestAnimationFrame(function() {\n      $buttonText\n        .css({\n          minHeight: newButtonContentHeight + 'px',\n          minWidth: newButtonContentWidth + 'px'\n        })\n        .addClass(classes$24.headingCtaTransitioning);\n    });\n\n    utils.promiseTransitionEnd($buttonText).then(function() {\n      $buttonText\n        .html(buttonText)\n        .removeClass(classes$24.headingCtaTransitioning)\n        .addClass(classes$24.headingCtaActive);\n    });\n  },\n\n  _setButtonsTranslateX: function(xPosition) {\n    this.$buttons.css({\n      transform: 'translate3d(' + xPosition + 'px, 0, 0)'\n    });\n  },\n\n  _addKeyBindingsDesktop: function(evt) {\n    if (evt.which === utils.keyboardKeys.LEFTARROW) {\n      this._previousSlideDesktop();\n    } else if (evt.which === utils.keyboardKeys.RIGHTARROW) {\n      this._nextSlideDesktop();\n    }\n  },\n\n  _previousSlideDesktop: function() {\n    if (this.currentDesktopSlide === 0) return;\n\n    this._setSlideDesktop(this.currentDesktopSlide - 1);\n  },\n\n  _nextSlideDesktop: function() {\n    if (this.currentDesktopSlide === this.totalSlides - 1) return;\n\n    this._setSlideDesktop(this.currentDesktopSlide + 1);\n  },\n\n  _setSlideDesktop: function(slideIndex) {\n    var $currentSlide = this.$slide.eq(this.currentDesktopSlide);\n    var $nextSlide = this.$slide.eq(slideIndex);\n    var $video = $nextSlide.find(selectors$27.video);\n\n    // We call _loadVideo() before we check to see if\n    // this.currentDesktopSlide === slideIndex (below). This would never fire\n    // on initial load if it was after the condition below since 0 === 0\n    // would return true.\n    if ($video.length) {\n      this._loadVideo($video, $nextSlide);\n    }\n\n    if (this.currentDesktopSlide === slideIndex) return;\n\n    $nextSlide.addClass(classes$24.slideActive).attr('aria-hidden', false);\n    $currentSlide.addClass(classes$24.slideActiveTransitioning);\n\n    utils.promiseTransitionEnd($nextSlide).then(function() {\n      $currentSlide\n        .removeClass(classes$24.slideActive)\n        .removeClass(classes$24.slideActiveTransitioning)\n        .attr('aria-hidden', true);\n    });\n\n    this._setButtonStatus(slideIndex);\n\n    this.currentDesktopSlide = slideIndex;\n\n    this.trigger('slideshow_set_slide', [slideIndex]);\n\n    if (this.currentDesktopSlide - 1 >= 0) {\n      this.trigger('slideshow_previous_slide', [slideIndex - 1]);\n    }\n\n    if (this.currentDesktopSlide + 1 < this.totalSlides) {\n      this.trigger('slideshow_next_slide', [slideIndex + 1]);\n    }\n  },\n\n  _loadVideo: function($video, $slide) {\n    this.$video = $video;\n\n    this.trigger('slideshow_video_load', [$video[0]]);\n\n    return this._promiseVideo().then(\n      function() {\n        $slide.addClass(classes$24.videoLoaded);\n        $slide.find(selectors$27.pauseButton).prop('disabled', false);\n        this.trigger('slideshow_video_loaded', [$video[0]]);\n      }.bind(this)\n    );\n  },\n\n  _promiseVideo: function() {\n    var playerType = this.$video.attr('data-video-type');\n    var promiseVideoPlayer;\n\n    if (playerType === 'youtube') {\n      promiseVideoPlayer = this._loadYoutubePlayer();\n      this.$video.attr('tabindex', '-1');\n    } else if (playerType === 'vimeo') {\n      promiseVideoPlayer = this._loadVimeoPlayer();\n      this.$video.find('iframe').attr('tabindex', '-1');\n    }\n\n    return promiseVideoPlayer;\n  },\n\n  _loadYoutubePlayer: function() {\n    var blockId = this.$video.attr('data-block-id');\n    var videoId = this.$video.attr('data-video-id');\n\n    return youtube\n      .promisePlayer(this.$video[0], {\n        videoId: videoId,\n        ratio: 16 / 9,\n        playerVars: {\n          // eslint-disable-next-line camelcase\n          iv_load_policy: 3,\n          modestbranding: 1,\n          autoplay: 0,\n          controls: 0,\n          showinfo: 0,\n          wmode: 'opaque',\n          branding: 0,\n          autohide: 0,\n          rel: 0\n        },\n        events: {\n          onStateChange: function(evt) {\n            // Video has ended, loop back to beginning\n            if (evt.data === 0) {\n              this.players[blockId].seekTo(0);\n            }\n          }.bind(this)\n        }\n      })\n      .then(\n        function(player) {\n          this.players[blockId] = player;\n          player.playVideo().mute();\n          // The video will not play if the iframe is set to visibility: hidden\n          // Need to set it seperately from other styles in order to resolve the promise\n          $(player.a).css('visibility', 'visible');\n          // set player to visible\n          return $.Deferred(function(defer) {\n            player.addEventListener('onStateChange', function(evt) {\n              // Only resolve the promise if the video is playing\n              if (evt.data === 1) {\n                defer.resolve();\n              }\n            });\n          });\n        }.bind(this)\n      );\n  },\n\n  _loadVimeoPlayer: function() {\n    var blockId = this.$video.attr('data-block-id');\n    var videoId = this.$video.attr('data-video-id');\n\n    return vimeo\n      .promisePlayer(this.$video[0], {\n        id: videoId,\n        loop: true,\n        // This property isn't reliable. The user might see the Vimeo playbar flash\n        // as the video begins to play.\n        playbar: false,\n        background: true\n      })\n      .then(\n        function(player) {\n          this.players[blockId] = player;\n          player.play();\n          player.setVolume(0);\n\n          return $.Deferred(function(defer) {\n            player.on('loaded', function() {\n              defer.resolve();\n            });\n          });\n        }.bind(this)\n      );\n  },\n\n  _setButtonWrapperValues: function() {\n    this.mousePosition = 0;\n    this.xPosition = 0;\n    this.buttonsWrapperWidth = this.$container.outerWidth();\n    this.buttonsInnerWidth = this.$button.first().width() * this.totalSlides;\n    this.centerOfButtonsWrapper = this.buttonsWrapperWidth / 2;\n    this.$button\n      .find(selectors$27.ctaText)\n      .removeAttr(\n        'style data-previous-width data-previous-height data-new-width data-new-height'\n      );\n\n    this._setButtonsTranslateX(0);\n  }\n};\n\n/*\n\nSlideshow Mobile Extension\n--------------------------------------------------------------------------------\nManages all the mobile behaviour of the home page slideshow\n\n\nEvents\n------------\n\nName: slideshow_mobile_init_start\nDescription: Fired before the mobile slideshow begins to initialize\nPayload: none\n\nName: slideshow_mobile_init_done\nDescription: Fired when the mobile slideshow is done initializing\nPayload: none\n\nName: slideshow_mobile_destroy\nDescription: Fired when the mobile slideshow is destroyed\nPayload: none\n\nName: slideshow_set_slide\nDescription: Fired when the user selects a specific slide\nPayload: { number } Index of the slide being displayed\n\nName: slideshow_previous_slide\nDescription: Fired when the user selects the previous slide\nPayload: { number } Index of the slide being displayed\n\nName: slideshow_next_slide\nDescription: Fired when the user selects the next slide\nPayload: { number } Index of the slide being displayed\n\n*/\n\nvar selectors$28 = {\n  button: '.slideshow__button',\n  buttons: '.slideshow__buttons',\n  ctaMultipleSlides: '.slideshow__button-cta--multiple',\n  ctaSingleSlide: '.slideshow__button-cta-single',\n  label: '.slideshow__button-label',\n  mobileTextContainer: '.slideshow__text-container-mobile',\n  mobileTextContent: '.slideshow__text-content-mobile',\n  navigationButtons: '[data-slider-navigation]',\n  nextButton: '[data-slider-navigation-next]',\n  previousButton: '[data-slider-navigation-previous]',\n  slide: '.slideshow__slide',\n  slideshow: '.slideshow',\n  indicatorDots: '.slideshow__indicator'\n};\n\nvar classes$25 = {\n  buttonActive: 'slideshow__button--active',\n  dotActive: 'slideshow__indicator--active',\n  linkActive: 'slideshow__button--link',\n  slideActive: 'slideshow__slide--active',\n  slideActiveTransitioning: 'slideshow__slide--transitioning',\n  navigationNoFocus: 'slideshow__navigation-item--no-focus'\n};\n\nvar slideshowMobile = {\n  initMobileSlideshow: function() {\n    this.trigger('slideshow_mobile_init_start');\n\n    this.$slideshow = $(selectors$28.slideshow, this.$container);\n    this.$buttons = $(selectors$28.buttons, this.$container);\n    this.$button = $(selectors$28.button, this.$container);\n    this.$navigationButtons = $(selectors$28.navigationButtons, this.$container);\n    this.$ctaMultipleSlides = $(selectors$28.ctaMultipleSlides, this.$container);\n    this.$ctaSingleSlide = $(selectors$28.ctaSingleSlide, this.$container);\n    this.$indicatorDots = $(selectors$28.indicatorDots, this.$container);\n    this.$mobileTextContainer = $(\n      selectors$28.mobileTextContainer,\n      this.$container\n    );\n    this.$mobileTextContent = $(selectors$28.mobileTextContent, this.$container);\n\n    this.mobileSlideshow = true;\n    this.currentMobileSlide = 0;\n    this.totalSlides = this.$buttons.data('count');\n    this.xPosition = 0;\n    this.mobileSlideshowNamespace = '.mobileSlideshow';\n\n    // The header is above the slideshow in the iOS editor, so we need to\n    // reduce it's height by the height of the header.\n    if ($('html').hasClass('is-ios') && Shopify.designMode) {\n      this.$slideshow.css('height', '-=60px');\n    }\n\n    this.on(\n      'click keyup' + this.mobileSlideshowNamespace,\n      selectors$28.indicatorDots,\n      this._onClickIndicatorDot.bind(this)\n    );\n    this.on(\n      'click keyup' + this.mobileSlideshowNamespace,\n      selectors$28.previousButton,\n      this._previousSlideMobile.bind(this)\n    );\n    this.on(\n      'click keyup' + this.mobileSlideshowNamespace,\n      selectors$28.nextButton,\n      this._nextSlideMobile.bind(this)\n    );\n    this.on(\n      'keydown' + this.mobileSlideshowNamespace,\n      this._addKeyBindingsMobile.bind(this)\n    );\n\n    if (this.totalSlides > 1) {\n      this.hammertime = new Hammer(this.$container[0]);\n\n      // Import swipe gestures and only allow these two events\n      this.hammertime\n        .on('swipeleft', this._nextSlideMobile.bind(this))\n        .on('swiperight', this._previousSlideMobile.bind(this));\n    }\n\n    this.$button.first().addClass(classes$25.buttonActive);\n\n    utils.promiseStylesheet().then(\n      function() {\n        this._setSlideMobile(0);\n        this._setMobileText(0);\n        this._setSlideshowA11y();\n        this.trigger('slideshow_mobile_init_done');\n      }.bind(this)\n    );\n  },\n\n  destroyMobileSlideshow: function() {\n    this.trigger('slideshow_mobile_destroy');\n\n    this.mobileSlideshow = false;\n    this.$container.off(this.mobileSlideshowNamespace);\n\n    if (this.totalSlides > 1) {\n      this.hammertime.destroy();\n    }\n  },\n\n  _onClickIndicatorDot: function(evt) {\n    var $indicatorDot = $(evt.target);\n    var index = $indicatorDot.data('slide-index');\n\n    evt.preventDefault();\n\n    if (\n      evt.type === 'keyup' &&\n      !(\n        evt.keyCode === utils.keyboardKeys.ENTER ||\n        evt.keyCode === utils.keyboardKeys.SPACE\n      )\n    )\n      return;\n\n    this._setSlideMobile(index);\n\n    if (evt.type === 'keyup' || evt.detail === 0) {\n      this.$slideshow.focus();\n    }\n  },\n\n  _addKeyBindingsMobile: function(evt) {\n    if (evt.which === utils.keyboardKeys.LEFTARROW) {\n      this._previousSlideMobile(evt);\n    } else if (evt.which === utils.keyboardKeys.RIGHTARROW) {\n      this._nextSlideMobile(evt);\n    }\n  },\n\n  _previousSlideMobile: function(evt) {\n    if (evt.type === 'click') {\n      $(evt.target).addClass(classes$25.navigationNoFocus);\n    }\n    if (\n      (evt.type === 'keyup' &&\n        !(\n          evt.keyCode === utils.keyboardKeys.ENTER ||\n          evt.keyCode === utils.keyboardKeys.SPACE\n        )) ||\n      this.currentMobileSlide === 0\n    ) {\n      return;\n    }\n\n    this._setSlideMobile(this.currentMobileSlide - 1);\n  },\n\n  _nextSlideMobile: function(evt) {\n    if (evt.type === 'click') {\n      $(evt.target).addClass(classes$25.navigationNoFocus);\n    }\n    if (\n      (evt.type === 'keyup' &&\n        !(\n          evt.keyCode === utils.keyboardKeys.ENTER ||\n          evt.keyCode === utils.keyboardKeys.SPACE\n        )) ||\n      this.currentMobileSlide === this.totalSlides - 1\n    ) {\n      return;\n    }\n\n    this._setSlideMobile(this.currentMobileSlide + 1);\n  },\n\n  _setSlideMobile: function(slideIndex) {\n    if (this.currentMobileSlide === slideIndex) return;\n\n    this.xPosition = slideIndex * 50;\n\n    this.$buttons.css({\n      transform: 'translate3d(-' + this.xPosition + '%, 0, 0)'\n    });\n\n    this._setActiveStates(slideIndex);\n    this._setSlideA11y(slideIndex);\n    this._setMobileText(slideIndex);\n\n    this.currentMobileSlide = slideIndex;\n\n    this.trigger('slideshow_set_slide', [slideIndex]);\n\n    this.$navigationButtons.attr('disabled', false);\n\n    if (this.currentMobileSlide === 0) {\n      this.$navigationButtons\n        .filter(selectors$28.previousButton)\n        .attr('disabled', true);\n    }\n\n    if (this.currentMobileSlide === this.totalSlides - 1) {\n      this.$navigationButtons\n        .not(selectors$28.previousButton)\n        .attr('disabled', true);\n    }\n\n    if (this.currentMobileSlide - 1 >= 0) {\n      this.trigger('slideshow_previous_slide', [slideIndex - 1]);\n    }\n\n    if (this.currentMobileSlide + 1 < this.totalSlides) {\n      this.trigger('slideshow_next_slide', [slideIndex + 1]);\n    }\n  },\n\n  _setActiveStates: function(slideIndex) {\n    this.$slide = this.$slide || $(selectors$28.slide, this.$container); // eslint-disable-line shopify/jquery-dollar-sign-reference\n    this.$button = this.$button || $(selectors$28.button, this.$container); // eslint-disable-line shopify/jquery-dollar-sign-reference\n    this.$dot = this.$dot || $(selectors$28.indicatorDots, this.$container); // eslint-disable-line shopify/jquery-dollar-sign-reference\n\n    var $currentSlide = this.$slide.eq(this.currentMobileSlide);\n    var $nextSlide = this.$slide.eq(slideIndex);\n\n    $nextSlide.addClass(classes$25.slideActive).attr('aria-hidden', false);\n    $currentSlide.addClass(classes$25.slideActiveTransitioning);\n\n    utils.promiseTransitionEnd($nextSlide).then(function() {\n      $currentSlide\n        .removeClass(classes$25.slideActive)\n        .removeClass(classes$25.slideActiveTransitioning)\n        .attr('aria-hidden', true);\n    });\n\n    this.$button.removeClass(classes$25.buttonActive);\n\n    this.$button.eq(slideIndex).addClass(classes$25.buttonActive);\n\n    this.$dot.removeClass(classes$25.dotActive);\n    this.$dot.eq(slideIndex).addClass(classes$25.dotActive);\n  },\n\n  _setSlideshowA11y: function() {\n    this.$labels = this.$labels || this.$button.find(selectors$28.label); // eslint-disable-line shopify/jquery-dollar-sign-reference\n    this.$ctaSingleSlide =\n      this.$ctaSingleSlide || this.$button.find(selectors$28.ctaSingleSlide); // eslint-disable-line shopify/jquery-dollar-sign-reference\n\n    this.$ctaSingleSlide.attr('tabindex', '0');\n    this.$labels.attr('tabindex', '-1');\n    this._setSlideA11y(0);\n\n    $.each(\n      this.$indicatorDots,\n      function(index, indicatorDot) {\n        $(indicatorDot).attr({\n          'aria-controls': 'Slide' + index\n        });\n      }.bind(this)\n    );\n  },\n\n  _setSlideA11y: function(slideIndex) {\n    var $button = this.$button.eq(slideIndex);\n\n    this.$ctasMultipleSlides =\n      this.$ctasMultipleSlides ||\n      this.$button.find(selectors$28.ctaMultipleSlides); // eslint-disable-line shopify/jquery-dollar-sign-reference\n\n    if (this.$ctasMultipleSlides) {\n      this.$ctasMultipleSlides.attr('tabindex', '-1');\n\n      // All slide titles are tabbable. If the currently active button has a CTA\n      // link, the CTA link becomes tabbable as well.\n      if ($button.hasClass(classes$25.linkActive)) {\n        this.$ctasMultipleSlides.eq(slideIndex).attr('tabindex', '0');\n      }\n    }\n\n    $.each(\n      this.$indicatorDots,\n      function(index, indicatorDot) {\n        $(indicatorDot).attr({\n          'aria-label': this._slideLabel(slideIndex, index),\n          'aria-current': slideIndex === index ? true : false\n        });\n      }.bind(this)\n    );\n  },\n\n  _setMobileText: function(slideIndex) {\n    var $currentTextContent = this.$mobileTextContent.eq(slideIndex);\n    this.$ctaSingleSlide =\n      this.$ctaSingleSlide || this.$button.find(selectors$28.ctaSingleSlide); // eslint-disable-line shopify/jquery-dollar-sign-reference\n\n    if (this.$ctaSingleSlide.length) {\n      // Adjust for buttons with labels on multiple lines.\n      var paddingAdjustment =\n        (this.$ctaSingleSlide.outerHeight() - 50) / 2 + 40;\n      this.$mobileTextContent.css('padding-top', paddingAdjustment + 'px');\n    }\n\n    this.$mobileTextContent.hide();\n    $currentTextContent.show();\n  },\n\n  _slideLabel: function(activeSlideIndex, currentIndex) {\n    var label =\n      activeSlideIndex === currentIndex\n        ? theme.strings.slideshow.activeSlideA11yString\n        : theme.strings.slideshow.loadSlideA11yString;\n\n    return label.replace('[slide_number]', currentIndex + 1);\n  }\n};\n\n/*\n\nSlideshow Section\n--------------------------------------------------------------------------------\nManages the functionality of the both mobile and desktop slideshow\n\n*/\n\n// Extensions\n// Libs\nvar selectors$26 = {\n  button: '.slideshow__button',\n  slide: '.slideshow__slide'\n};\n\nvar classes$23 = {\n  buttonActive: 'slideshow__button--active',\n  slideActive: 'slideshow__slide--active'\n};\n\nsections.register('slideshow-section', {\n  onLoad: function() {\n    this.extend(slideshowDesktop);\n    this.extend(slideshowMobile);\n\n    this.$container.on('focusin' + this.namespace, this._onFocusIn.bind(this));\n    this.$container.on(\n      'focusout' + this.namespace,\n      this._onFocusOut.bind(this)\n    );\n    this._toggleViewState();\n\n    this.window().on('resize', this._toggleViewState.bind(this));\n  },\n\n  onUnload: function() {\n    this._destroyDesktopState();\n    this._destroyMobileState();\n  },\n\n  onBlockSelect: function(evt) {\n    utils.promiseStylesheet().then(\n      function() {\n        var index = $(evt.target).index();\n\n        if (this.mobileViewEnabled) {\n          this._setSlideMobile(index);\n        } else {\n          this._setSlideDesktop(index);\n        }\n      }.bind(this)\n    );\n  },\n\n  _toggleViewState: function() {\n    var windowWidth = $(window).innerWidth();\n    var enableMobileView;\n    var enableDesktopView;\n\n    if (typeof this.mobileViewEnabled === 'undefined') {\n      enableMobileView = windowWidth < theme.mediaQuerySmall;\n      enableDesktopView = windowWidth >= theme.mediaQuerySmall;\n    } else {\n      enableMobileView =\n        windowWidth < theme.mediaQuerySmall && !this.mobileViewEnabled;\n      enableDesktopView =\n        windowWidth >= theme.mediaQuerySmall && this.mobileViewEnabled;\n    }\n\n    if (enableMobileView) {\n      this.mobileViewEnabled = true;\n      this._destroyDesktopState();\n      this._enableMobileState();\n    }\n\n    if (enableDesktopView) {\n      this.mobileViewEnabled = false;\n      this._destroyMobileState();\n      this._enableDesktopState();\n    }\n  },\n\n  _enableDesktopState: function() {\n    this.initDesktopSlideshow();\n  },\n\n  _destroyDesktopState: function() {\n    if (!this.desktopSlideshow) return;\n\n    this.destroyDesktopSlideshow();\n    this._resetSlideshowValues();\n  },\n\n  _enableMobileState: function() {\n    this.initMobileSlideshow();\n  },\n\n  _destroyMobileState: function() {\n    if (!this.mobileSlideshow) return;\n\n    this.destroyMobileSlideshow();\n    this._resetSlideshowValues();\n  },\n\n  // This method is called when the viewport goes from mobile to desktop\n  // and vice versa. It ensures the slideshow resets to the first slide,\n  // which helps with potential conflicting values based on shared markup.\n  _resetSlideshowValues: function() {\n    $(selectors$26.slide)\n      .removeClass(classes$23.slideActive)\n      .first()\n      .addClass(classes$23.slideActive);\n\n    $(selectors$26.button)\n      .removeClass(classes$23.buttonActive)\n      .first()\n      .addClass(classes$23.buttonActive);\n  },\n\n  _onFocusIn: function(evt) {\n    if (\n      this.$container.has(evt.target).length &&\n      this.$slideshow.attr('aria-live') === 'polite'\n    ) {\n      return;\n    }\n\n    this.$slideshow.attr('aria-live', 'polite');\n  },\n\n  _onFocusOut: function(evt) {\n    if (this.$container.has(evt.relatedTarget).length) {\n      return;\n    }\n\n    this.$slideshow.removeAttr('aria-live');\n  }\n});\n\nvar selectors$29 = {\n  loadPlayerButton: '.video-section__load-player-button',\n  closePlayerButton: '.video-section__player-close',\n  playerContainer: '.video-section__player',\n  cover: '.video-section__cover',\n  errorMessage: '.video-section__error',\n  bodyOverlay: '.video-section__body-overlay'\n};\n\nvar classes$26 = {\n  playerLoading: 'video-section--loading',\n  playerLoaded: 'video-section--loaded',\n  playerError: 'video-section--error',\n  animateButton: 'animated pulse'\n};\n\nsections.register('video-section', {\n  onLoad: function() {\n    this.$container = $(this.container);\n\n    this.$container\n      .on('click', selectors$29.loadPlayerButton, this._loadPlayer.bind(this))\n      .on('click', selectors$29.closePlayerButton, this._closePlayer.bind(this))\n      .on('click', selectors$29.bodyOverlay, this._closePlayer.bind(this));\n  },\n\n  _loadPlayer: function() {\n    var $container = this.$container;\n    var $loadButton = $(selectors$29.loadPlayerButton, $container);\n    var $playerContainer = $(selectors$29.playerContainer, $container);\n    var playerType = this.$container.attr('data-video-type');\n    var promiseVideoPlayer;\n\n    $loadButton.addClass(classes$26.animateButton);\n\n    this._scrollToPlayer($container);\n\n    if (playerType === 'youtube') {\n      promiseVideoPlayer = this._loadYoutubePlayer($playerContainer[0]);\n    } else if (playerType === 'vimeo') {\n      promiseVideoPlayer = this._loadVimeoPlayer($playerContainer[0]);\n    }\n\n    return promiseVideoPlayer\n      .then(this._onPlayerLoadReady.bind(this))\n      .catch(this._onPlayerLoadError.bind(this))\n      .always(function() {\n        $loadButton.removeClass(classes$26.animateButton);\n      });\n  },\n\n  _scrollToPlayer: function(container) {\n    var containerTop = container.offset().top;\n    var offset = ($(window).height() - container.height()) / 2;\n\n    $('html, body').animate(\n      {\n        scrollTop: containerTop - Math.max(offset, 0)\n      },\n      400\n    );\n  },\n\n  _loadYoutubePlayer: function(container) {\n    return youtube\n      .promisePlayer(container, {\n        videoId: this.$container.attr('data-video-id'),\n        ratio: 16 / 9,\n        playerVars: {\n          modestbranding: 1,\n          autoplay: 1,\n          showinfo: 0,\n          rel: 0\n        }\n      })\n      .then(\n        function(player) {\n          this.player = player;\n        }.bind(this)\n      );\n  },\n\n  _loadVimeoPlayer: function(container) {\n    return vimeo\n      .promisePlayer(container, {\n        id: this.$container.attr('data-video-id')\n      })\n      .then(\n        function(player) {\n          this.player = player;\n          this.player.play();\n        }.bind(this)\n      );\n  },\n\n  _onPlayerLoadReady: function() {\n    $(selectors$29.closePlayerButton, this.$container)\n      .show()\n      .focus();\n    $(selectors$29.cover, this.$container)\n      .prepareTransition()\n      .addClass(classes$26.playerLoaded);\n    this.$container.addClass(classes$26.playerLoaded);\n\n    this._setScrollPositionValues();\n\n    $(document)\n      .one('keyup' + this.namespace, this._closeOnEscape.bind(this))\n      .on('scroll' + this.namespace, this._onScroll.bind(this));\n\n    $(window).on(\n      'resize' + this.namespace,\n      this._setScrollPositionValues.bind(this)\n    );\n  },\n\n  _onPlayerLoadError: function(err) {\n    this.$container.addClass(classes$26.playerError);\n    $(selectors$29.errorMessage, this.$container).text(err);\n  },\n\n  _closeOnEscape: function(evt) {\n    if (evt.keyCode !== 27) return;\n\n    this._closePlayer();\n    $(selectors$29.loadPlayerButton, this.$container).focus();\n  },\n\n  _onScroll: function() {\n    var scrollTop = $(window).scrollTop();\n\n    if (\n      scrollTop > this.videoTop + 0.25 * this.videoHeight ||\n      scrollTop + this.windowHeight < this.videoBottom - 0.25 * this.videoHeight\n    ) {\n      // Debounce DOM edits to the next frame with requestAnimationFrame\n      requestAnimationFrame(this._closePlayer.bind(this));\n    }\n  },\n\n  _setScrollPositionValues: function() {\n    this.videoHeight = this.$container.outerHeight(true);\n    this.videoTop = this.$container.offset().top;\n    this.videoBottom = this.videoTop + this.videoHeight;\n    this.windowHeight = $(window).innerHeight();\n  },\n\n  _closePlayer: function() {\n    $(selectors$29.cover, this.$container)\n      .prepareTransition()\n      .removeClass(classes$26.playerLoaded);\n    this.$container.removeClass(classes$26.playerLoaded);\n    $(selectors$29.closePlayerButton, this.$container).hide();\n\n    if (typeof this.player.destroy === 'function') {\n      this.player.destroy();\n    } else if (typeof this.player.unload === 'function') {\n      this.player.unload();\n    }\n\n    $(document).off(this.namespace);\n    $(window).off(this.namespace);\n  }\n});\n\n// import templates.js and assign it to the global theme object\nwindow.theme.templates = templates;\n\n// import all templates js\n// import sections.js and assign it to the global theme object\nwindow.theme.sections = sections;\n\n// import all sections js\n$(document).ready(function() {\n  templates.load('*');\n  sections.load('*');\n\n  a11y.accessibleLinks('a[href]:not([aria-describedby]', {\n    messages: {\n      newWindow: theme.strings.newWindow,\n      external: theme.strings.external,\n      newWindowExternal: theme.strings.newWindowExternal\n    }\n  });\n});\n  \n\n}(jQuery,_.omit,_.find,_.throttle,Shopify.theme.a11y,_.remove,_.filter,_.fill,_.debounce,morphdom,_.defaultTo,_.findIndex,_.isArray,Hammer));\n"],
  "mappings": "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",
  "names": ["morphdom", "Hammer", "events", "status", "classes", "data", "types", "onAnimate", "images", "product", "errors", "settings", "selectors", "config", "errorMessage"]
}
