{
  "version": 3,
  "sources": ["/cdn/shop/t/1049/assets/theme.js?enable_js_minification=1"],
  "sourcesContent": ["(function (factory) {\n  typeof define === \"function\" && define.amd\n    ? define(\"index\", factory)\n    : factory();\n})(function () {\n  \"use strict\";\n\n  function _typeof(obj) {\n    \"@babel/helpers - typeof\";\n\n    if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n      _typeof = function (obj) {\n        return typeof obj;\n      };\n    } else {\n      _typeof = function (obj) {\n        return obj &&\n          typeof Symbol === \"function\" &&\n          obj.constructor === Symbol &&\n          obj !== Symbol.prototype\n          ? \"symbol\"\n          : typeof obj;\n      };\n    }\n\n    return _typeof(obj);\n  }\n\n  function _classCallCheck(instance, Constructor) {\n    \n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))\n      return _arrayLikeToArray(o, minLen);\n  }\n\n  function _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n\n    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n    return arr2;\n  }\n\n  function _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n      if (\n        Array.isArray(o) ||\n        (it = _unsupportedIterableToArray(o)) ||\n        (allowArrayLike && o && typeof o.length === \"number\")\n      ) {\n        if (it) o = it;\n        var i = 0;\n\n        var F = function () {};\n\n        return {\n          s: F,\n          n: function () {\n            if (i >= o.length)\n              return {\n                done: true,\n              };\n            return {\n              done: false,\n              value: o[i++],\n            };\n          },\n          e: function (e) {\n            throw e;\n          },\n          f: F,\n        };\n      }\n\n      throw new TypeError(\n        \"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"\n      );\n    }\n\n    var normalCompletion = true,\n      didErr = false,\n      err;\n    return {\n      s: function () {\n        it = o[Symbol.iterator]();\n      },\n      n: function () {\n        var step = it.next();\n        normalCompletion = step.done;\n        return step;\n      },\n      e: function (e) {\n        didErr = true;\n        err = e;\n      },\n      f: function () {\n        try {\n          if (!normalCompletion && it.return != null) it.return();\n        } finally {\n          if (didErr) throw err;\n        }\n      },\n    };\n  }\n\n  var animationQueue = {};\n\n  var Animation = /*#__PURE__*/ (function () {\n    function Animation() {\n      _classCallCheck(this, Animation);\n    }\n\n    _createClass(Animation, null, [\n      {\n        key: \"slideUp\",\n\n        /**\n         * Slide up aims to close an element. To do that, we take the height of the element, and set it to 0 to\n         * force an animation\n         */\n        value: function slideUp(element, callback) {\n          var propertyToAnimate =\n            arguments.length > 2 && arguments[2] !== undefined\n              ? arguments[2]\n              : \"height\";\n          element.style[propertyToAnimate] = \"\".concat(\n            element.scrollHeight,\n            \"px\"\n          ); // Force previous height to allow CSS transition\n\n          element.offsetHeight; // Force redraw\n\n          element.style[propertyToAnimate] = 0;\n\n          if (animationQueue[element.id]) {\n            element.removeEventListener(\n              \"transitionend\",\n              animationQueue[element.id]\n            );\n            delete animationQueue[element.id];\n          }\n\n          var transitionEnded = function transitionEnded(event) {\n            if (event.propertyName === \"height\") {\n              element.removeEventListener(\"transitionend\", transitionEnded);\n              (callback || function () {})();\n            }\n          };\n\n          element.addEventListener(\"transitionend\", transitionEnded);\n        },\n        /**\n         * Slide down aims to open an element. To do that, you must make sure that the element you are trying to open\n         * is set with height: 0; overflow: hidden in the CSS, and does not contain any padding nor margin.\n         */\n      },\n      {\n        key: \"slideDown\",\n        value: function slideDown(element, callback) {\n          var propertyToAnimate =\n            arguments.length > 2 && arguments[2] !== undefined\n              ? arguments[2]\n              : \"height\";\n          // To do the animation we temporarily hide it, check the height, and transition to it\n          element.style[propertyToAnimate] = \"\".concat(\n            element.scrollHeight,\n            \"px\"\n          );\n\n          var transitionEnded = function transitionEnded(event) {\n            if (event.propertyName === propertyToAnimate) {\n              var defaultValue = \"auto\";\n\n              if (propertyToAnimate === \"max-height\") {\n                defaultValue = \"none\";\n              }\n\n              element.style[propertyToAnimate] = defaultValue; // Allows the content to grow normally\n\n              element.removeEventListener(\"transitionend\", transitionEnded);\n              delete animationQueue[element.id];\n              (callback || function () {})();\n            }\n          };\n\n          element.addEventListener(\"transitionend\", transitionEnded);\n          animationQueue[element.id] = transitionEnded;\n        },\n      },\n    ]);\n\n    return Animation;\n  })();\n\n  /**\n   * Various DOM helper\n   */\n  var Dom = /*#__PURE__*/ (function () {\n    function Dom() {\n      _classCallCheck(this, Dom);\n    }\n\n    _createClass(Dom, null, [\n      {\n        key: \"getSiblings\",\n\n        /**\n         * Get all the previous and next siblings, optionally filtered by a selector\n         */\n        value: function getSiblings(element, filter) {\n          var includeSelf =\n            arguments.length > 2 && arguments[2] !== undefined\n              ? arguments[2]\n              : false;\n          var siblings = [];\n          var currentElement = element; // Do the previous first\n\n          while ((currentElement = currentElement.previousElementSibling)) {\n            if (!filter || currentElement.matches(filter)) {\n              siblings.push(currentElement);\n            }\n          }\n\n          if (includeSelf) {\n            siblings.push(element);\n          } // Then the next side\n\n          currentElement = element;\n\n          while ((currentElement = currentElement.nextElementSibling)) {\n            if (!filter || currentElement.matches(filter)) {\n              siblings.push(currentElement);\n            }\n          }\n\n          return siblings;\n        },\n      },\n    ]);\n\n    return Dom;\n  })();\n\n  var commonjsGlobal =\n    typeof globalThis !== \"undefined\"\n      ? globalThis\n      : typeof window !== \"undefined\"\n      ? window\n      : typeof global !== \"undefined\"\n      ? global\n      : typeof self !== \"undefined\"\n      ? self\n      : {};\n\n  function getDefaultExportFromCjs(x) {\n    return x &&\n      x.__esModule &&\n      Object.prototype.hasOwnProperty.call(x, \"default\")\n      ? x[\"default\"]\n      : x;\n  }\n\n  function createCommonjsModule(fn, basedir, module) {\n    return (\n      (module = {\n        path: basedir,\n        exports: {},\n        require: function (path, base) {\n          return commonjsRequire(\n            path,\n            base === undefined || base === null ? module.path : base\n          );\n        },\n      }),\n      fn(module, module.exports),\n      module.exports\n    );\n  }\n\n  function commonjsRequire() {\n    throw new Error(\n      \"Dynamic requires are not currently supported by @rollup/plugin-commonjs\"\n    );\n  }\n\n  var browser = createCommonjsModule(function (module, exports) {\n    Object.defineProperty(exports, \"__esModule\", {\n      value: true,\n    });\n    exports[\"default\"] = void 0;\n    /**\n     * DOM event delegator\n     *\n     * The delegator will listen\n     * for events that bubble up\n     * to the root node.\n     *\n     * @constructor\n     * @param {Node|string} [root] The root node or a selector string matching the root node\n     */\n\n    function Delegate(root) {\n      /**\n       * Maintain a map of listener\n       * lists, keyed by event name.\n       *\n       * @type Object\n       */\n      this.listenerMap = [{}, {}];\n\n      if (root) {\n        this.root(root);\n      }\n      /** @type function() */\n\n      this.handle = Delegate.prototype.handle.bind(this); // Cache of event listeners removed during an event cycle\n\n      this._removedListeners = [];\n    }\n    /**\n     * Start listening for events\n     * on the provided DOM element\n     *\n     * @param  {Node|string} [root] The root node or a selector string matching the root node\n     * @returns {Delegate} This method is chainable\n     */\n\n    Delegate.prototype.root = function (root) {\n      var listenerMap = this.listenerMap;\n      var eventType; // Remove master event listeners\n\n      if (this.rootElement) {\n        for (eventType in listenerMap[1]) {\n          if (listenerMap[1].hasOwnProperty(eventType)) {\n            this.rootElement.removeEventListener(eventType, this.handle, true);\n          }\n        }\n\n        for (eventType in listenerMap[0]) {\n          if (listenerMap[0].hasOwnProperty(eventType)) {\n            this.rootElement.removeEventListener(eventType, this.handle, false);\n          }\n        }\n      } // If no root or root is not\n      // a dom node, then remove internal\n      // root reference and exit here\n\n      if (!root || !root.addEventListener) {\n        if (this.rootElement) {\n          delete this.rootElement;\n        }\n\n        return this;\n      }\n      /**\n       * The root node at which\n       * listeners are attached.\n       *\n       * @type Node\n       */\n\n      this.rootElement = root; // Set up master event listeners\n\n      for (eventType in listenerMap[1]) {\n        if (listenerMap[1].hasOwnProperty(eventType)) {\n          this.rootElement.addEventListener(eventType, this.handle, true);\n        }\n      }\n\n      for (eventType in listenerMap[0]) {\n        if (listenerMap[0].hasOwnProperty(eventType)) {\n          this.rootElement.addEventListener(eventType, this.handle, false);\n        }\n      }\n\n      return this;\n    };\n    /**\n     * @param {string} eventType\n     * @returns boolean\n     */\n\n    Delegate.prototype.captureForType = function (eventType) {\n      return (\n        [\"blur\", \"error\", \"focus\", \"load\", \"resize\", \"scroll\"].indexOf(\n          eventType\n        ) !== -1\n      );\n    };\n    /**\n     * Attach a handler to one\n     * event for all elements\n     * that match the selector,\n     * now or in the future\n     *\n     * The handler function receives\n     * three arguments: the DOM event\n     * object, the node that matched\n     * the selector while the event\n     * was bubbling and a reference\n     * to itself. Within the handler,\n     * 'this' is equal to the second\n     * argument.\n     *\n     * The node that actually received\n     * the event can be accessed via\n     * 'event.target'.\n     *\n     * @param {string} eventType Listen for these events\n     * @param {string|undefined} selector Only handle events on elements matching this selector, if undefined match root element\n     * @param {function()} handler Handler function - event data passed here will be in event.data\n     * @param {boolean} [useCapture] see 'useCapture' in <https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener>\n     * @returns {Delegate} This method is chainable\n     */\n\n    Delegate.prototype.on = function (\n      eventType,\n      selector,\n      handler,\n      useCapture\n    ) {\n      var root;\n      var listenerMap;\n      var matcher;\n      var matcherParam;\n\n      if (!eventType) {\n        throw new TypeError(\"Invalid event type: \" + eventType);\n      } // handler can be passed as\n      // the second or third argument\n\n      if (typeof selector === \"function\") {\n        useCapture = handler;\n        handler = selector;\n        selector = null;\n      } // Fallback to sensible defaults\n      // if useCapture not set\n\n      if (useCapture === undefined) {\n        useCapture = this.captureForType(eventType);\n      }\n\n      if (typeof handler !== \"function\") {\n        throw new TypeError(\"Handler must be a type of Function\");\n      }\n\n      root = this.rootElement;\n      listenerMap = this.listenerMap[useCapture ? 1 : 0]; // Add master handler for type if not created yet\n\n      if (!listenerMap[eventType]) {\n        if (root) {\n          root.addEventListener(eventType, this.handle, useCapture);\n        }\n\n        listenerMap[eventType] = [];\n      }\n\n      if (!selector) {\n        matcherParam = null; // COMPLEX - matchesRoot needs to have access to\n        // this.rootElement, so bind the function to this.\n\n        matcher = matchesRoot.bind(this); // Compile a matcher for the given selector\n      } else if (/^[a-z]+$/i.test(selector)) {\n        matcherParam = selector;\n        matcher = matchesTag;\n      } else if (/^#[a-z0-9\\-_]+$/i.test(selector)) {\n        matcherParam = selector.slice(1);\n        matcher = matchesId;\n      } else {\n        matcherParam = selector;\n        matcher = Element.prototype.matches;\n      } // Add to the list of listeners\n\n      listenerMap[eventType].push({\n        selector: selector,\n        handler: handler,\n        matcher: matcher,\n        matcherParam: matcherParam,\n      });\n      return this;\n    };\n    /**\n     * Remove an event handler\n     * for elements that match\n     * the selector, forever\n     *\n     * @param {string} [eventType] Remove handlers for events matching this type, considering the other parameters\n     * @param {string} [selector] If this parameter is omitted, only handlers which match the other two will be removed\n     * @param {function()} [handler] If this parameter is omitted, only handlers which match the previous two will be removed\n     * @returns {Delegate} This method is chainable\n     */\n\n    Delegate.prototype.off = function (\n      eventType,\n      selector,\n      handler,\n      useCapture\n    ) {\n      var i;\n      var listener;\n      var listenerMap;\n      var listenerList;\n      var singleEventType; // Handler can be passed as\n      // the second or third argument\n\n      if (typeof selector === \"function\") {\n        useCapture = handler;\n        handler = selector;\n        selector = null;\n      } // If useCapture not set, remove\n      // all event listeners\n\n      if (useCapture === undefined) {\n        this.off(eventType, selector, handler, true);\n        this.off(eventType, selector, handler, false);\n        return this;\n      }\n\n      listenerMap = this.listenerMap[useCapture ? 1 : 0];\n\n      if (!eventType) {\n        for (singleEventType in listenerMap) {\n          if (listenerMap.hasOwnProperty(singleEventType)) {\n            this.off(singleEventType, selector, handler);\n          }\n        }\n\n        return this;\n      }\n\n      listenerList = listenerMap[eventType];\n\n      if (!listenerList || !listenerList.length) {\n        return this;\n      } // Remove only parameter matches\n      // if specified\n\n      for (i = listenerList.length - 1; i >= 0; i--) {\n        listener = listenerList[i];\n\n        if (\n          (!selector || selector === listener.selector) &&\n          (!handler || handler === listener.handler)\n        ) {\n          this._removedListeners.push(listener);\n\n          listenerList.splice(i, 1);\n        }\n      } // All listeners removed\n\n      if (!listenerList.length) {\n        delete listenerMap[eventType]; // Remove the main handler\n\n        if (this.rootElement) {\n          this.rootElement.removeEventListener(\n            eventType,\n            this.handle,\n            useCapture\n          );\n        }\n      }\n\n      return this;\n    };\n    /**\n     * Handle an arbitrary event.\n     *\n     * @param {Event} event\n     */\n\n    Delegate.prototype.handle = function (event) {\n      var i;\n      var l;\n      var type = event.type;\n      var root;\n      var phase;\n      var listener;\n      var returned;\n      var listenerList = [];\n      var target;\n      var eventIgnore = \"ftLabsDelegateIgnore\";\n\n      if (event[eventIgnore] === true) {\n        return;\n      }\n\n      target = event.target; // Hardcode value of Node.TEXT_NODE\n      // as not defined in IE8\n\n      if (target.nodeType === 3) {\n        target = target.parentNode;\n      } // Handle SVG <use> elements in IE\n\n      if (target.correspondingUseElement) {\n        target = target.correspondingUseElement;\n      }\n\n      root = this.rootElement;\n      phase =\n        event.eventPhase || (event.target !== event.currentTarget ? 3 : 2); // eslint-disable-next-line default-case\n\n      switch (phase) {\n        case 1:\n          //Event.CAPTURING_PHASE:\n          listenerList = this.listenerMap[1][type];\n          break;\n\n        case 2:\n          //Event.AT_TARGET:\n          if (this.listenerMap[0] && this.listenerMap[0][type]) {\n            listenerList = listenerList.concat(this.listenerMap[0][type]);\n          }\n\n          if (this.listenerMap[1] && this.listenerMap[1][type]) {\n            listenerList = listenerList.concat(this.listenerMap[1][type]);\n          }\n\n          break;\n\n        case 3:\n          //Event.BUBBLING_PHASE:\n          listenerList = this.listenerMap[0][type];\n          break;\n      }\n\n      var toFire = []; // Need to continuously check\n      // that the specific list is\n      // still populated in case one\n      // of the callbacks actually\n      // causes the list to be destroyed.\n\n      l = listenerList.length;\n\n      while (target && l) {\n        for (i = 0; i < l; i++) {\n          listener = listenerList[i]; // Bail from this loop if\n          // the length changed and\n          // no more listeners are\n          // defined between i and l.\n\n          if (!listener) {\n            break;\n          }\n\n          if (\n            target.tagName &&\n            [\"button\", \"input\", \"select\", \"textarea\"].indexOf(\n              target.tagName.toLowerCase()\n            ) > -1 &&\n            target.hasAttribute(\"disabled\")\n          ) {\n            // Remove things that have previously fired\n            toFire = [];\n          } // Check for match and fire\n          // the event if there's one\n          //\n          // TODO:MCG:20120117: Need a way\n          // to check if event#stopImmediatePropagation\n          // was called. If so, break both loops.\n          else if (\n            listener.matcher.call(target, listener.matcherParam, target)\n          ) {\n            toFire.push([event, target, listener]);\n          }\n        } // TODO:MCG:20120117: Need a way to\n        // check if event#stopPropagation\n        // was called. If so, break looping\n        // through the DOM. Stop if the\n        // delegation root has been reached\n\n        if (target === root) {\n          break;\n        }\n\n        l = listenerList.length; // Fall back to parentNode since SVG children have no parentElement in IE\n\n        target = target.parentElement || target.parentNode; // Do not traverse up to document root when using parentNode, though\n\n        if (target instanceof HTMLDocument) {\n          break;\n        }\n      }\n\n      var ret;\n\n      for (i = 0; i < toFire.length; i++) {\n        // Has it been removed during while the event function was fired\n        if (this._removedListeners.indexOf(toFire[i][2]) > -1) {\n          continue;\n        }\n\n        returned = this.fire.apply(this, toFire[i]); // Stop propagation to subsequent\n        // callbacks if the callback returned\n        // false\n\n        if (returned === false) {\n          toFire[i][0][eventIgnore] = true;\n          toFire[i][0].preventDefault();\n          ret = false;\n          break;\n        }\n      }\n\n      return ret;\n    };\n    /**\n     * Fire a listener on a target.\n     *\n     * @param {Event} event\n     * @param {Node} target\n     * @param {Object} listener\n     * @returns {boolean}\n     */\n\n    Delegate.prototype.fire = function (event, target, listener) {\n      return listener.handler.call(target, event, target);\n    };\n    /**\n     * Check whether an element\n     * matches a tag selector.\n     *\n     * Tags are NOT case-sensitive,\n     * except in XML (and XML-based\n     * languages such as XHTML).\n     *\n     * @param {string} tagName The tag name to test against\n     * @param {Element} element The element to test with\n     * @returns boolean\n     */\n\n    function matchesTag(tagName, element) {\n      return tagName.toLowerCase() === element.tagName.toLowerCase();\n    }\n    /**\n     * Check whether an element\n     * matches the root.\n     *\n     * @param {?String} selector In this case this is always passed through as null and not used\n     * @param {Element} element The element to test with\n     * @returns boolean\n     */\n\n    function matchesRoot(selector, element) {\n      if (this.rootElement === window) {\n        return (\n          // Match the outer document (dispatched from document)\n          element === document || // The <html> element (dispatched from document.body or document.documentElement)\n          element === document.documentElement || // Or the window itself (dispatched from window)\n          element === window\n        );\n      }\n\n      return this.rootElement === element;\n    }\n    /**\n     * Check whether the ID of\n     * the element in 'this'\n     * matches the given ID.\n     *\n     * IDs are case-sensitive.\n     *\n     * @param {string} id The ID to test against\n     * @param {Element} element The element to test with\n     * @returns boolean\n     */\n\n    function matchesId(id, element) {\n      return id === element.id;\n    }\n    /**\n     * Short hand for off()\n     * and root(), ie both\n     * with no parameters\n     *\n     * @return void\n     */\n\n    Delegate.prototype.destroy = function () {\n      this.off();\n      this.root();\n    };\n\n    var _default = Delegate;\n    exports[\"default\"] = _default;\n    module.exports = exports[\"default\"];\n  });\n  var Delegate = /*@__PURE__*/ getDefaultExportFromCjs(browser);\n\n  var CollapsibleManager = /*#__PURE__*/ (function () {\n    function CollapsibleManager() {\n      _classCallCheck(this, CollapsibleManager);\n\n      this.domDelegate = new Delegate(document.body);\n\n      this._attachListeners();\n    }\n\n    _createClass(CollapsibleManager, [\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.domDelegate.on(\n            \"click\",\n            '[data-action=\"toggle-collapsible\"]:not([disabled])',\n            this._toggleCollapsible.bind(this)\n          );\n          document.addEventListener(\n            \"collapsible:toggle\",\n            this._toggleCollapsible.bind(this)\n          );\n        },\n        /**\n         * Toggle a given collapsible\n         */\n      },\n      {\n        key: \"_toggleCollapsible\",\n        value: function _toggleCollapsible(event, target) {\n          var _this = this;\n\n          // If the target is null, it may be because someone has sent the global event \"collapsible:toggle\". If that the case\n          // we can retrieve the toggle button by using the event.detail.id\n          if (!target && event.detail) {\n            target = document.querySelector(\n              '[aria-controls=\"'.concat(event.detail.id, '\"]')\n            );\n          }\n\n          var isOpen = target.getAttribute(\"aria-expanded\") === \"true\",\n            parentCollapsible = target.parentNode;\n\n          if (isOpen) {\n            this._close(parentCollapsible);\n          } else {\n            this._open(parentCollapsible);\n          } // We make sure to close any siblings collapsible as well\n\n          if (target.getAttribute(\"data-close-siblings\") !== \"false\") {\n            Dom.getSiblings(parentCollapsible).forEach(function (\n              collapsibleToClose\n            ) {\n              return _this._close(collapsibleToClose);\n            });\n          }\n        },\n        /**\n         * Open a given collapsible\n         */\n      },\n      {\n        key: \"_open\",\n        value: function _open(collapsible) {\n          var toggleButton = collapsible.querySelector(\"[aria-controls]\");\n\n          if (\n            !toggleButton ||\n            toggleButton.getAttribute(\"aria-expanded\") === \"true\"\n          ) {\n            return; // It's already open\n          }\n\n          var collapsibleContent = collapsible.querySelector(\n            \"#\".concat(toggleButton.getAttribute(\"aria-controls\"))\n          );\n          toggleButton.setAttribute(\"aria-expanded\", \"true\");\n\n          if (collapsibleContent.hasAttribute(\"aria-hidden\")) {\n            collapsibleContent.setAttribute(\"aria-hidden\", \"false\");\n          }\n\n          Animation.slideDown(collapsibleContent, function () {\n            if (toggleButton.hasAttribute(\"data-collapsible-force-overflow\")) {\n              collapsibleContent.style.overflow = \"visible\";\n            } // If there is an autofocus field, we focus it\n\n            var autofocusElement =\n              collapsibleContent.querySelector(\"[autofocus]\");\n\n            if (autofocusElement) {\n              autofocusElement.focus();\n            }\n          });\n        },\n        /**\n         * Close a given collapsible\n         */\n      },\n      {\n        key: \"_close\",\n        value: function _close(collapsible) {\n          var toggleButton = collapsible.querySelector(\"[aria-controls]\");\n\n          if (\n            !toggleButton ||\n            toggleButton.getAttribute(\"aria-expanded\") === \"false\"\n          ) {\n            return; // It's already closed\n          }\n\n          var collapsibleContent = collapsible.querySelector(\n            \"#\".concat(toggleButton.getAttribute(\"aria-controls\"))\n          );\n\n          if (toggleButton.hasAttribute(\"data-collapsible-force-overflow\")) {\n            collapsibleContent.style.overflow = \"hidden\";\n          }\n\n          if (collapsibleContent.hasAttribute(\"aria-hidden\")) {\n            collapsibleContent.setAttribute(\"aria-hidden\", \"true\");\n          }\n\n          toggleButton.setAttribute(\"aria-expanded\", \"false\");\n          Animation.slideUp(collapsibleContent);\n        },\n      },\n    ]);\n\n    return CollapsibleManager;\n  })();\n\n  var CountrySelector = /*#__PURE__*/ (function () {\n    function CountrySelector(countrySelect, provinceSelect) {\n      _classCallCheck(this, CountrySelector);\n\n      this.countrySelect = countrySelect;\n      this.provinceSelect = provinceSelect;\n\n      if (this.countrySelect && this.provinceSelect) {\n        this._attachListeners();\n\n        this._initSelectors();\n      }\n    }\n\n    _createClass(CountrySelector, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          if (this.countrySelect) {\n            this.countrySelect.removeEventListener(\n              \"change\",\n              this._onCountryChangedListener\n            );\n          }\n        },\n      },\n      {\n        key: \"_initSelectors\",\n        value: function _initSelectors() {\n          // Check first the default value of country\n          var defaultCountry = this.countrySelect.getAttribute(\"data-default\");\n\n          if (defaultCountry) {\n            for (var i = 0; i !== this.countrySelect.options.length; ++i) {\n              if (this.countrySelect.options[i].text === defaultCountry) {\n                this.countrySelect.selectedIndex = i;\n                break;\n              }\n            }\n          } else {\n            this.countrySelect.selectedIndex = 0;\n          }\n\n          var event = new Event(\"change\", {\n            bubbles: true,\n          });\n          this.countrySelect.dispatchEvent(event); // Then the province\n\n          var defaultProvince =\n            this.provinceSelect.getAttribute(\"data-default\");\n\n          if (defaultProvince) {\n            for (var _i = 0; _i !== this.provinceSelect.options.length; ++_i) {\n              if (this.provinceSelect.options[_i].text === defaultProvince) {\n                this.provinceSelect.selectedIndex = _i;\n                break;\n              }\n            }\n          }\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this._onCountryChangedListener = this._onCountryChanged.bind(this);\n          this.countrySelect.addEventListener(\n            \"change\",\n            this._onCountryChangedListener\n          );\n        },\n      },\n      {\n        key: \"_onCountryChanged\",\n        value: function _onCountryChanged() {\n          var _this = this;\n\n          var selectedOption =\n            this.countrySelect.options[this.countrySelect.selectedIndex];\n\n          if (!selectedOption) {\n            return;\n          }\n\n          var provinces = JSON.parse(\n            selectedOption.getAttribute(\"data-provinces\") || \"[]\"\n          ); // First remove all options\n\n          this.provinceSelect.innerHTML = \"\";\n\n          if (provinces.length === 0) {\n            this.provinceSelect.closest(\".form__input-wrapper\").style.display =\n              \"none\";\n            return;\n          } // We need to build the provinces array\n\n          provinces.forEach(function (data) {\n            _this.provinceSelect.options.add(new Option(data[1], data[0]));\n          });\n          this.provinceSelect.closest(\".form__input-wrapper\").style.display =\n            \"block\";\n        },\n      },\n    ]);\n\n    return CountrySelector;\n  })();\n\n  var Responsive = /*#__PURE__*/ (function () {\n    function Responsive() {\n      _classCallCheck(this, Responsive);\n    }\n\n    _createClass(Responsive, null, [\n      {\n        key: \"matchesBreakpoint\",\n        value: function matchesBreakpoint(breakpoint) {\n          switch (breakpoint) {\n            case \"phone\":\n              return window.matchMedia(\"screen and (max-width: 640px)\").matches;\n\n            case \"tablet\":\n              return window.matchMedia(\n                \"screen and (min-width: 641px) and (max-width: 1023px)\"\n              ).matches;\n\n            case \"tablet-and-up\":\n              return window.matchMedia(\"screen and (min-width: 641px)\").matches;\n\n            case \"pocket\":\n              return window.matchMedia(\"screen and (max-width: 1023px)\")\n                .matches;\n\n            case \"lap\":\n              return window.matchMedia(\n                \"screen and (min-width: 1024px) and (max-width: 1279px)\"\n              ).matches;\n\n            case \"lap-and-up\":\n              return window.matchMedia(\"screen and (min-width: 1024px)\")\n                .matches;\n\n            case \"desk\":\n              return window.matchMedia(\"screen and (min-width: 1280px)\")\n                .matches;\n\n            case \"widescreen\":\n              return window.matchMedia(\"screen and (min-width: 1440px)\")\n                .matches;\n\n            case \"supports-hover\":\n              return window.matchMedia(\"(hover: hover) and (pointer: fine)\")\n                .matches;\n          }\n        },\n      },\n      {\n        key: \"getCurrentBreakpoint\",\n        value: function getCurrentBreakpoint() {\n          if (window.matchMedia(\"screen and (max-width: 640px)\").matches) {\n            return \"phone\";\n          }\n\n          if (\n            window.matchMedia(\n              \"screen and (min-width: 641px) and (max-width: 1023px)\"\n            ).matches\n          ) {\n            return \"tablet\";\n          }\n\n          if (\n            window.matchMedia(\n              \"screen and (min-width: 1024px) and (max-width: 1279px)\"\n            ).matches\n          ) {\n            return \"lap\";\n          }\n\n          if (window.matchMedia(\"screen and (min-width: 1280px)\").matches) {\n            return \"desk\";\n          }\n        },\n      },\n    ]);\n\n    return Responsive;\n  })();\n\n  var DesktopNavigation = /*#__PURE__*/ (function () {\n    function DesktopNavigation(element, navigationLayout, openTrigger) {\n      _classCallCheck(this, DesktopNavigation);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.useInlineNavigation = navigationLayout === \"inline\";\n      this.isNavigationVisible = this.useInlineNavigation;\n      this.openTrigger = openTrigger; // If we use a device that does not support hover, we force the open trigger to be on click (for instance iPad)\n\n      if (!Responsive.matchesBreakpoint(\"supports-hover\")) {\n        this.openTrigger = \"click\";\n      }\n\n      this.openItems = [];\n      this.dropdownActivationTimeouts = {};\n      this.dropdownDeactivationTimeouts = {};\n      this.DROPDOWN_TIMEOUT = 100;\n\n      this._attachListeners();\n\n      if (this.useInlineNavigation) {\n        this._setupInlineNavigation();\n      }\n    }\n\n    _createClass(DesktopNavigation, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          this.delegateElement.off();\n          this.delegateRoot.off();\n        },\n      },\n      {\n        key: \"onBlockSelect\",\n        value: function onBlockSelect(event) {\n          var _this = this;\n\n          if (!this.useInlineNavigation) {\n            this._openNavigation();\n          } // We receive a reference to the mega-menu, but for simpler handling, we simulate as if the button was hovered. First, we must close\n          // mega-menu if there is already one that is open\n\n          Dom.getSiblings(event.target.parentNode, \".is-dropdown-open\").forEach(\n            function (openItem) {\n              _this._deactivateDropdown(\n                event,\n                openItem.querySelector('[data-type=\"menuitem\"][aria-haspopup]')\n              );\n            }\n          ); // The previousElementSibling is always the link itself\n\n          this._activateDropdown(event, event.target.previousElementSibling);\n        },\n      },\n      {\n        key: \"onBlockDeselect\",\n        value: function onBlockDeselect(event) {\n          if (!this.useInlineNavigation) {\n            this._closeNavigation();\n          } // The deactivation is done on the wrapping div (so parentNode)\n\n          this._deactivateDropdown(event, event.target.parentNode);\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.delegateElement.on(\"focusout\", this._onFocusOut.bind(this));\n          this.delegateRoot.on(\"click\", this._onClick.bind(this));\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"toggle-menu\"]',\n            this._toggleNavigation.bind(this)\n          );\n\n          if (this.openTrigger === \"hover\") {\n            this.delegateElement.on(\n              \"focusin\",\n              '[data-type=\"menuitem\"][aria-haspopup]',\n              this._activateDropdown.bind(this)\n            );\n            this.delegateElement.on(\n              \"mouseover\",\n              '[data-type=\"menuitem\"][aria-haspopup]',\n              this._activateDropdown.bind(this)\n            );\n            this.delegateElement.on(\n              \"mouseover\",\n              '[data-type=\"menu\"][aria-hidden=\"false\"]',\n              this._blockDropdownDeactivation.bind(this)\n            );\n            this.delegateElement.on(\n              \"focusout\",\n              \".is-dropdown-open\",\n              this._deactivateDropdown.bind(this)\n            );\n            this.delegateElement.on(\n              \"mouseout\",\n              \".is-dropdown-open\",\n              this._deactivateDropdown.bind(this)\n            );\n          } else {\n            this.delegateElement.on(\n              \"click\",\n              '[data-type=\"menuitem\"][aria-haspopup]',\n              this._toggleDropdown.bind(this)\n            );\n          }\n        },\n        /**\n         * When the whole menu looses focus, it's automatically closed (in the case of condensed menu)\n         */\n      },\n      {\n        key: \"_onFocusOut\",\n        value: function _onFocusOut(event) {\n          // event.relatedTarget is the new target that receives focus\n          if (\n            event.relatedTarget !== null &&\n            !this.element.contains(event.relatedTarget)\n          ) {\n            this._closeNavigation();\n          }\n        },\n        /**\n         * We need to catch click outside the element to automatically close menu\n         */\n      },\n      {\n        key: \"_onClick\",\n        value: function _onClick(event) {\n          if (!this.element.contains(event.target)) {\n            this._closeNavigation();\n          }\n        },\n        /**\n         * Open the navigation (really make sense for condensed menu-\n         */\n      },\n      {\n        key: \"_openNavigation\",\n        value: function _openNavigation() {           \n          // Inline navigation is always visible so there is nothing to open\n          if (this.useInlineNavigation) {\n            return;\n          }\n\n          this.element\n            .querySelector('[data-action=\"toggle-menu\"]')\n            .setAttribute(\"aria-expanded\", \"true\");\n          this.element\n            .querySelector('[data-type=\"menu\"]')\n            .setAttribute(\"aria-hidden\", \"false\");\n          this.isNavigationVisible = true;\n        },\n        /**\n         * Close the navigation (really make sense for condensed menu)\n         */\n      },\n      {\n        key: \"_closeNavigation\",\n        value: function _closeNavigation() {\n          var _this2 = this;\n\n          if (!this.useInlineNavigation) {\n            this.element\n              .querySelector('[data-action=\"toggle-menu\"]')\n              .setAttribute(\"aria-expanded\", \"false\");\n            this.element\n              .querySelector('[data-type=\"menu\"]')\n              .setAttribute(\"aria-hidden\", \"true\");\n          }\n\n          this.isNavigationVisible = false;\n\n          if (this.openTrigger === \"click\") {\n            var cloneOpenItems = this.openItems.slice(0);\n            cloneOpenItems.forEach(function (item) {\n              _this2._deactivateDropdown(event, item);\n            });\n          }\n        },\n        /**\n         * Toggle navigation\n         */\n      },\n      {\n        key: \"_toggleNavigation\",\n        value: function _toggleNavigation(event) {          \n          if (this.isNavigationVisible) {\n            this._closeNavigation();\n          } else {\n            this._openNavigation();\n          }\n        },\n        /**\n         * Toggle a dropdown\n         */\n      },\n      {\n        key: \"_toggleDropdown\",\n        value: function _toggleDropdown(event, target) {           \n          // If the link is currently not expanded, we block the click\n          if (target.getAttribute(\"aria-expanded\") === \"false\") {\n            event.preventDefault();\n          }\n\n          if (target.getAttribute(\"aria-expanded\") === \"true\") {\n            // If the link target is \"#\", by convention we close the dropdown, otherwise we just follow the link\n            if (target.getAttribute(\"href\") === \"#\") {\n              event.preventDefault();\n\n              this._deactivateDropdown(\n                event,\n                target.closest(\".is-dropdown-open\")\n              );\n            }\n          } else {\n            this._activateDropdown(event, target);\n          }\n        },\n        /**\n         * Open a dropdown menu\n         */\n      },\n      {\n        key: \"_activateDropdown\",\n        value: function _activateDropdown(event, target) {\n          var _this3 = this;\n\n          // If we are on click, we first need to close any other dropdown (if needed)\n          if (this.openTrigger === \"click\") {\n            var cloneOpenItems = this.openItems.slice(0);\n            cloneOpenItems.forEach(function (item) {\n              if (!item.contains(target)) {\n                _this3._deactivateDropdown(event, item);\n              }\n            });\n          }\n\n          var menuToOpen = Dom.getSiblings(target, \"[aria-hidden]\")[0];\n\n          var callback = function callback() {\n            target.setAttribute(\"aria-expanded\", \"true\");\n            target.parentNode.classList.add(\"is-dropdown-open\");\n            menuToOpen.setAttribute(\"aria-hidden\", \"false\"); // If this menu was scheduled for deactivation, we remove the scheduling as it is now meant to open\n\n            if (\n              _this3.openTrigger === \"hover\" &&\n              _this3.dropdownDeactivationTimeouts[menuToOpen.id]\n            ) {\n              clearTimeout(_this3.dropdownDeactivationTimeouts[menuToOpen.id]);\n              delete _this3.dropdownDeactivationTimeouts[menuToOpen.id];\n            } // If we are in inline navigation, we may be on the edge of the screen. If that's the case we check if any of the sub-sub-menu goes outside the screen. If\n            // this is the case, sub-sub-menu will be displayed on the left\n\n            if (_this3.useInlineNavigation) {\n              var windowWidth = window.innerWidth,\n                shouldOpenLeft = false;\n              menuToOpen\n                .querySelectorAll(\".nav-dropdown\")\n                .forEach(function (subSubMenu) {\n                  if (subSubMenu.getBoundingClientRect().right > windowWidth) {\n                    shouldOpenLeft = true;\n                  }\n                });\n\n              if (shouldOpenLeft) {\n                menuToOpen.classList.add(\"nav-dropdown--inverse\");\n              }\n            }\n\n            target\n              .closest('[data-type=\"menu\"]')\n              .classList.add(\"nav-dropdown--glued\");\n\n            if (menuToOpen.classList.contains(\"mega-menu\")) {\n              _this3._setupMegaMenu(menuToOpen);\n            }\n\n            if (_this3.openTrigger === \"click\") {\n              _this3.openItems.push(target.parentNode);\n            }\n          }; // If we are using on click, we can directly close, otherwise we apply a slight delay before closing the menu,\n          // so that the deactivation could be cancelled if the mouse is back to the dropdown (which can happen when doing\n          // horizontal movement)\n\n          if (this.openTrigger === \"click\") {\n            callback();\n          } else {\n            // Any other menu that has been scheduled for activation must be deactivated as it's now this one that is supposed to open\n            for (var toDeactivate in this.dropdownActivationTimeouts) {\n              if (\n                this.dropdownActivationTimeouts.hasOwnProperty(toDeactivate)\n              ) {\n                clearTimeout(this.dropdownActivationTimeouts[toDeactivate]);\n                delete this.dropdownActivationTimeouts[toDeactivate];\n              }\n            }\n\n            callback();\n            /*this.dropdownActivationTimeouts[menuToOpen.id] = setTimeout(() => {\n            callback();\n            delete this.dropdownActivationTimeouts[menuToOpen.id];\n          }, this.DROPDOWN_TIMEOUT);*/\n          }\n        },\n        /**\n         * Close a dropdown menu\n         */\n      },\n      {\n        key: \"_deactivateDropdown\",\n        value: function _deactivateDropdown(event, target) {\n          var _this4 = this;\n\n          // event.relatedTarget is the new target. This allows to make sure to only close the dropdown if we leave the containing div\n          if (\n            this.openTrigger === \"hover\" &&\n            target.contains(event.relatedTarget)\n          ) {\n            return;\n          }\n\n          var menuToClose = target.querySelector(\"[aria-hidden]\");\n\n          var callback = function callback() {\n            target.classList.remove(\"is-dropdown-open\");\n            target\n              .querySelector('[data-type=\"menuitem\"]')\n              .setAttribute(\"aria-expanded\", \"false\");\n            var menuToClose = target.querySelector(\"[aria-hidden]\");\n            menuToClose.setAttribute(\"aria-hidden\", \"true\");\n            target\n              .closest('[data-type=\"menu\"]')\n              .classList.remove(\"nav-dropdown--glued\"); // If on click, we also close all sub-menus that may be open\n\n            if (_this4.openTrigger === \"click\") {\n              target\n                .querySelectorAll(\".is-dropdown-open\")\n                .forEach(function (item) {\n                  _this4._deactivateDropdown(event, item);\n\n                  var index = _this4.openItems.indexOf(item);\n\n                  if (index > -1) {\n                    _this4.openItems.splice(index, 1);\n                  }\n                }); // It has been deactivated so we also remove this one\n\n              var index = _this4.openItems.indexOf(target);\n\n              if (index > -1) {\n                _this4.openItems.splice(index, 1);\n              }\n            }\n          }; // If we are using on click, we can directly close, otherwise we apply a slight delay before closing the menu,\n          // so that the deactivation could be cancelled if the mouse is back to the dropdown (which can happen when doing\n          // horizontal movement)\n\n          if (this.openTrigger === \"click\") {\n            callback();\n          } else {\n            this.dropdownDeactivationTimeouts[menuToClose.id] = setTimeout(\n              function () {\n                callback();\n                delete _this4.dropdownDeactivationTimeouts[menuToClose.id];\n              },\n              this.DROPDOWN_TIMEOUT\n            );\n          }\n        },\n        /**\n         * This method allows to block the dropdown deactivation if the mouse is back on the element. This may happen for\n         * instance when the customer does a kind of diagonal movement to the menu. While the mouse may leave the opening\n         * item, we want the item to stay open\n         */\n      },\n      {\n        key: \"_blockDropdownDeactivation\",\n        value: function _blockDropdownDeactivation(event, target) {\n          if (this.dropdownDeactivationTimeouts[target.id] !== undefined) {\n            clearTimeout(this.dropdownDeactivationTimeouts[target.id]);\n            delete this.dropdownDeactivationTimeouts[target.id]; // If we blocked the deactivation, then we must also remove any pending menu that could have been scheduled to open\n\n            for (var toDeactivate in this.dropdownActivationTimeouts) {\n              if (\n                this.dropdownActivationTimeouts.hasOwnProperty(toDeactivate)\n              ) {\n                clearTimeout(this.dropdownActivationTimeouts[toDeactivate]);\n                delete this.dropdownActivationTimeouts[toDeactivate];\n              }\n            }\n          }\n        },\n        /**\n         * Set the maximum width allowed for the given mega-menu. For the inline style, it is always full width so nothing to do\n         */\n      },\n      {\n        key: \"_setupMegaMenu\",\n        value: function _setupMegaMenu(megaMenu) {\n          if (!this.useInlineNavigation) {\n            var navDropdownWidth =\n              megaMenu.closest(\".nav-dropdown\").clientWidth;\n            megaMenu.style.maxWidth =\n              Math.min(\n                1400 - navDropdownWidth,\n                parseInt(window.innerWidth - navDropdownWidth - 80)\n              ) + \"px\";\n          }\n        },\n        /**\n         * Fix inline navigation\n         */\n      },\n      {\n        key: \"_setupInlineNavigation\",\n        value: function _setupInlineNavigation() {\n          var _this5 = this;\n\n          this.element\n            .querySelectorAll(\".mega-menu\")\n            .forEach(function (megaMenu) {\n              megaMenu\n                .closest(\".nav-bar__item\")\n                .classList.add(\"nav-bar__item--static\");\n            }); // If using the inline navigation, we also set up a mutation observer whenever a sub-sub-dropdown is open, in order\n          // to calculate their distance from the top of the screen, so we can apply a max-height properly\n\n          if (\"MutationObserver\" in window) {\n            this.dropdownMenuObserver = new MutationObserver(function (\n              mutationList\n            ) {\n              mutationList.forEach(function (mutation) {\n                if (mutation.target.getAttribute(\"aria-hidden\") === \"false\") {\n                  // We set a CSS variable, so we can do various calculation in CSS\n                  mutation.target.style.setProperty(\n                    \"--distance-to-top\",\n                    \"\".concat(mutation.target.getBoundingClientRect().top, \"px\")\n                  );\n                }\n              });\n            });\n            this.element\n              .querySelectorAll(\".nav-dropdown .nav-dropdown\")\n              .forEach(function (item) {\n                _this5.dropdownMenuObserver.observe(item, {\n                  attributes: true,\n                  attributeFilter: [\"aria-hidden\"],\n                });\n              });\n          }\n        },\n      },\n    ]);\n\n    return DesktopNavigation;\n  })();\n\n  var fastdom = createCommonjsModule(function (module) {\n    !(function (win) {\n      /**\n       * Mini logger\n       *\n       * @return {Function}\n       */\n\n      var debug = function () {};\n      /**\n       * Normalized rAF\n       *\n       * @type {Function}\n       */\n\n      var raf =\n        win.requestAnimationFrame ||\n        win.webkitRequestAnimationFrame ||\n        win.mozRequestAnimationFrame ||\n        win.msRequestAnimationFrame ||\n        function (cb) {\n          return setTimeout(cb, 16);\n        };\n      /**\n       * Initialize a `FastDom`.\n       *\n       * @constructor\n       */\n\n      function FastDom() {\n        var self = this;\n        self.reads = [];\n        self.writes = [];\n        self.raf = raf.bind(win); // test hook\n      }\n\n      FastDom.prototype = {\n        constructor: FastDom,\n\n        /**\n         * Adds a job to the read batch and\n         * schedules a new frame if need be.\n         *\n         * @param  {Function} fn\n         * @param  {Object} ctx the context to be bound to `fn` (optional).\n         * @public\n         */\n        measure: function measure(fn, ctx) {\n          var task = !ctx ? fn : fn.bind(ctx);\n          this.reads.push(task);\n          scheduleFlush(this);\n          return task;\n        },\n\n        /**\n         * Adds a job to the\n         * write batch and schedules\n         * a new frame if need be.\n         *\n         * @param  {Function} fn\n         * @param  {Object} ctx the context to be bound to `fn` (optional).\n         * @public\n         */\n        mutate: function mutate(fn, ctx) {\n          var task = !ctx ? fn : fn.bind(ctx);\n          this.writes.push(task);\n          scheduleFlush(this);\n          return task;\n        },\n\n        /**\n         * Clears a scheduled 'read' or 'write' task.\n         *\n         * @param {Object} task\n         * @return {Boolean} success\n         * @public\n         */\n        clear: function clear(task) {\n          return remove(this.reads, task) || remove(this.writes, task);\n        },\n\n        /**\n         * Extend this FastDom with some\n         * custom functionality.\n         *\n         * Because fastdom must *always* be a\n         * singleton, we're actually extending\n         * the fastdom instance. This means tasks\n         * scheduled by an extension still enter\n         * fastdom's global task queue.\n         *\n         * The 'super' instance can be accessed\n         * from `this.fastdom`.\n         *\n         * @example\n         *\n         * var myFastdom = fastdom.extend({\n         *   initialize: function() {\n         *     // runs on creation\n         *   },\n         *\n         *   // override a method\n         *   measure: function(fn) {\n         *     // do extra stuff ...\n         *\n         *     // then call the original\n         *     return this.fastdom.measure(fn);\n         *   },\n         *\n         *   ...\n         * });\n         *\n         * @param  {Object} props  properties to mixin\n         * @return {FastDom}\n         */\n        extend: function extend(props) {\n          if (_typeof(props) != \"object\") throw new Error(\"expected object\");\n          var child = Object.create(this);\n          mixin(child, props);\n          child.fastdom = this; // run optional creation hook\n\n          if (child.initialize) child.initialize();\n          return child;\n        },\n        // override this with a function\n        // to prevent Errors in console\n        // when tasks throw\n        catch: null,\n      };\n      /**\n       * Schedules a new read/write\n       * batch if one isn't pending.\n       *\n       * @private\n       */\n\n      function scheduleFlush(fastdom) {\n        if (!fastdom.scheduled) {\n          fastdom.scheduled = true;\n          fastdom.raf(flush.bind(null, fastdom));\n        }\n      }\n      /**\n       * Runs queued `read` and `write` tasks.\n       *\n       * Errors are caught and thrown by default.\n       * If a `.catch` function has been defined\n       * it is called instead.\n       *\n       * @private\n       */\n\n      function flush(fastdom) {\n        var writes = fastdom.writes;\n        var reads = fastdom.reads;\n        var error;\n\n        try {\n          debug(\"flushing reads\", reads.length);\n          runTasks(reads);\n          debug(\"flushing writes\", writes.length);\n          runTasks(writes);\n        } catch (e) {\n          error = e;\n        }\n\n        fastdom.scheduled = false; // If the batch errored we may still have tasks queued\n\n        if (reads.length || writes.length) scheduleFlush(fastdom);\n\n        if (error) {\n          debug(\"task errored\", error.message);\n          if (fastdom[\"catch\"]) fastdom[\"catch\"](error);\n          else throw error;\n        }\n      }\n      /**\n       * We run this inside a try catch\n       * so that if any jobs error, we\n       * are able to recover and continue\n       * to flush the batch until it's empty.\n       *\n       * @private\n       */\n\n      function runTasks(tasks) {\n        var task;\n\n        while ((task = tasks.shift())) {\n          task();\n        }\n      }\n      /**\n       * Remove an item from an Array.\n       *\n       * @param  {Array} array\n       * @param  {*} item\n       * @return {Boolean}\n       */\n\n      function remove(array, item) {\n        var index = array.indexOf(item);\n        return !!~index && !!array.splice(index, 1);\n      }\n      /**\n       * Mixin own properties of source\n       * object into the target.\n       *\n       * @param  {Object} target\n       * @param  {Object} source\n       */\n\n      function mixin(target, source) {\n        for (var key in source) {\n          if (source.hasOwnProperty(key)) target[key] = source[key];\n        }\n      } // There should never be more than\n      // one instance of `FastDom` in an app\n\n      var exports = (win.fastdom = win.fastdom || new FastDom()); // jshint ignore:line\n      // Expose to CJS & AMD\n\n      module.exports = exports;\n    })(typeof window !== \"undefined\" ? window : commonjsGlobal);\n  });\n\n  var CollectionFilterDrawer = /*#__PURE__*/ (function () {\n    function CollectionFilterDrawer(options) {\n      _classCallCheck(this, CollectionFilterDrawer);\n\n      this.element = document.getElementById(\"mobile-collection-filters\");\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.options = options;\n      this.isOpen = false;\n\n      if (this.element) {\n        this._attachListeners();\n      }\n    }\n\n    _createClass(CollectionFilterDrawer, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          this.delegateRoot.off();\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.delegateRoot.on(\n            \"click\",\n            '[aria-controls=\"mobile-collection-filters\"][data-action=\"open-drawer\"]',\n            this.open.bind(this)\n          );\n          this.delegateRoot.on(\n            \"click\",\n            '#mobile-collection-filters [data-action=\"close-drawer\"]',\n            this.close.bind(this)\n          );\n          document.addEventListener(\n            \"collection-filter:close\",\n            this.close.bind(this)\n          );\n          document.addEventListener(\n            \"click\",\n            this._detectOutsideClick.bind(this)\n          );\n          window.addEventListener(\n            \"resize\",\n            this._computeDrawerHeight.bind(this)\n          );\n        },\n      },\n      {\n        key: \"open\",\n        value: function open(event) {\n          if (event) {\n            event.stopPropagation();\n          }\n\n          this._computeDrawerHeight();\n\n          this.isOpen = true;\n          document\n            .querySelector('[aria-controls=\"mobile-collection-filters\"]')\n            .setAttribute(\"aria-expanded\", \"true\");\n          document\n            .getElementById(\"mobile-collection-filters\")\n            .setAttribute(\"aria-hidden\", \"false\");\n          document.body.classList.add(\"no-mobile-scroll\");\n        },\n      },\n      {\n        key: \"close\",\n        value: function close(event) {\n          if (event) {\n            event.stopPropagation();\n          }\n\n          this.isOpen = false;\n          document\n            .querySelector('[aria-controls=\"mobile-collection-filters\"]')\n            .setAttribute(\"aria-expanded\", \"false\");\n          document\n            .getElementById(\"mobile-collection-filters\")\n            .setAttribute(\"aria-hidden\", \"true\");\n          document.body.classList.remove(\"no-mobile-scroll\");\n        },\n      },\n      {\n        key: \"_computeDrawerHeight\",\n        value: function _computeDrawerHeight() {\n          document\n            .getElementById(\"mobile-collection-filters\")\n            .querySelector(\".collection-drawer\").style.maxHeight = \"\".concat(\n            window.innerHeight,\n            \"px\"\n          );\n        },\n        /**\n         * This method is called by the collection section whenever the filters have changed, so we can update them\n         */\n      },\n      {\n        key: \"_filtersHaveChanged\",\n        value: function _filtersHaveChanged(newFilters) {\n          var _this = this;\n\n          if (!this.element) {\n            return;\n          }\n\n          fastdom.mutate(function () {\n            // First, we update the filters count\n            var filterCountElement = _this.element.querySelector(\n              \".collection-drawer__filter-count\"\n            );\n\n            filterCountElement.innerText = \"(\".concat(newFilters.length, \")\");\n            filterCountElement.style.display =\n              newFilters.length === 0 ? \"none\" : \"inline\"; // Then we hide/display the clear tag button\n\n            _this.element.querySelector(\n              '[data-action=\"clear-tags\"]'\n            ).style.display = newFilters.length === 0 ? \"none\" : \"block\"; // Finally, we have to toggle on/off the active filter\n\n            if (_this.options[\"filterType\"] === \"group\") {\n              _this.element\n                .querySelectorAll(\".collection__filter-item-active\")\n                .forEach(function (item) {\n                  // We check if this item has an active tag\n                  var parentList = item.closest(\".collection__filter-group\"); // We find if there is associated active data-tag\n\n                  var activeDataTag = parentList.querySelector(\n                    \".is-selected[data-tag]\"\n                  );\n\n                  if (activeDataTag) {\n                    item.style.display = \"block\";\n                    item.innerText =\n                      activeDataTag.getAttribute(\"data-tag-user\");\n                  } else {\n                    item.style.display = \"none\";\n                  }\n                });\n            }\n          });\n        },\n      },\n      {\n        key: \"_detectOutsideClick\",\n        value: function _detectOutsideClick(event) {\n          if (\n            this.isOpen &&\n            !event.target.closest(\".collection-drawer__inner\")\n          ) {\n            this.close();\n          }\n        },\n      },\n    ]);\n\n    return CollectionFilterDrawer;\n  })();\n\n  var ExitPopup = /*#__PURE__*/ (function () {\n    function ExitPopup(element) {\n      _classCallCheck(this, ExitPopup);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.rootDelegateElement = new Delegate(document.body);\n      this.options = JSON.parse(element.getAttribute(\"data-popup-settings\"));\n      this.hasOpenOnceInCurrentPage = false; // If the popup has been already displayed, we do not display it\n\n      try {\n        if (\n          window.location.hash === \"#exit-popup\" &&\n          window.theme.pageType !== \"captcha\"\n        ) {\n          this._openPopup();\n        }\n      } catch (error) {\n        // Some browsers (especially in private mode) throw an exception when trying to access local storage, so we protect ourselves here\n      }\n\n      this._attachListeners();\n    }\n\n    _createClass(ExitPopup, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          this.delegateElement.off();\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          var _this = this;\n\n          this._onKeyPressedListener = this._onKeyPressed.bind(this);\n          /* Some browsers like Android emit a mouseleave event when opening keyboard. This is too unreliable for touch devices */\n\n          if (!Responsive.matchesBreakpoint(\"supports-hover\")) {\n            return;\n          }\n\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"close-popup\"]',\n            this._closePopup.bind(this)\n          );\n          document.body.addEventListener(\"mouseleave\", function () {\n            if (!_this.hasOpenOnceInCurrentPage) {\n              if (\n                !_this.options[\"showOnlyOnce\"] ||\n                (_this.options[\"showOnlyOnce\"] &&\n                  localStorage.getItem(\"themeExitPopup\") === null)\n              ) {\n                _this._openPopup();\n              }\n            }\n          });\n          this._clickOutsideListener = this._checkClickOutside.bind(this);\n        },\n      },\n      {\n        key: \"_openPopup\",\n        value: function _openPopup() {\n          if (!window.theme.isNewsletterPopupOpen) {\n            this.element.setAttribute(\"aria-hidden\", \"false\");\n            localStorage.setItem(\"themeExitPopup\", \"true\");\n            this.hasOpenOnceInCurrentPage = true;\n            window.theme.isExitPopupOpen = true;\n            this.delegateElement.on(\"click\", this._clickOutsideListener);\n            this.rootDelegateElement.on(\"keyup\", this._onKeyPressedListener);\n          }\n        },\n      },\n      {\n        key: \"_closePopup\",\n        value: function _closePopup() {\n          this.element.setAttribute(\"aria-hidden\", \"true\");\n          window.theme.isExitPopupOpen = false;\n          this.delegateElement.off(\"click\", this._clickOutsideListener);\n          this.rootDelegateElement.off(\"keyup\", this._onKeyPressedListener);\n        },\n      },\n      {\n        key: \"_checkClickOutside\",\n        value: function _checkClickOutside(event) {\n          if (\n            !this.element.contains(event.target) ||\n            this.element === event.target\n          ) {\n            this._closePopup();\n          }\n        },\n      },\n      {\n        key: \"_onKeyPressed\",\n        value: function _onKeyPressed(event) {\n          if (event.key === \"Escape\") {\n            this._closePopup();\n          }\n        },\n      },\n    ]);\n\n    return ExitPopup;\n  })();\n\n  /**\n   * Simple plugin that handles the loading bar actions\n   *\n   * This plugin uses delegate events so it's independent of the sections.\n   */\n  var LoadingBar = /*#__PURE__*/ (function () {\n    function LoadingBar() {\n      _classCallCheck(this, LoadingBar);\n\n      this.element = document.querySelector(\".loading-bar\");\n\n      if (this.element) {\n        document.addEventListener(\n          \"theme:loading:start\",\n          this._onLoadingStart.bind(this)\n        );\n        document.addEventListener(\n          \"theme:loading:end\",\n          this._onLoadingEnd.bind(this)\n        );\n        this.element.addEventListener(\n          \"transitionend\",\n          this._onTransitionEnd.bind(this)\n        );\n      }\n    }\n\n    _createClass(LoadingBar, [\n      {\n        key: \"_onLoadingStart\",\n        value: function _onLoadingStart() {\n          this.element.classList.add(\"is-visible\");\n          this.element.style.transform = \"scaleX(0.4)\";\n        },\n      },\n      {\n        key: \"_onLoadingEnd\",\n        value: function _onLoadingEnd() {\n          this.element.style.transform = \"scaleX(1)\";\n          this.element.classList.add(\"is-finished\");\n        },\n      },\n      {\n        key: \"_onTransitionEnd\",\n        value: function _onTransitionEnd(event) {\n          if (\n            event.propertyName === \"transform\" &&\n            this.element.classList.contains(\"is-finished\")\n          ) {\n            this.element.classList.remove(\"is-visible\");\n            this.element.classList.remove(\"is-finished\");\n            this.element.style.transform = \"scaleX(0)\";\n          }\n        },\n      },\n    ]);\n\n    return LoadingBar;\n  })();\n\n  var Accessibility = /*#__PURE__*/ (function () {\n    function Accessibility() {\n      _classCallCheck(this, Accessibility);\n    }\n\n    _createClass(Accessibility, null, [\n      {\n        key: \"trapFocus\",\n\n        /**\n         * Traps the focus in a particular container\n         */\n        value: function trapFocus(container, namespace) {\n          this.listeners = this.listeners || {}; // We check if there is an element with the attribute \"autofocus\"\n\n          var elementToFocus =\n            container.querySelector(\"[autofocus]\") || container;\n          container.setAttribute(\"tabindex\", \"-1\");\n          elementToFocus.focus();\n\n          this.listeners[namespace] = function (event) {\n            if (\n              container !== event.target &&\n              !container.contains(event.target)\n            ) {\n              elementToFocus.focus();\n            }\n          };\n\n          document.addEventListener(\"focusin\", this.listeners[namespace]);\n        },\n        /**\n         * Removes the trap of focus in a particular container\n         */\n      },\n      {\n        key: \"removeTrapFocus\",\n        value: function removeTrapFocus(container, namespace) {\n          if (container) {\n            container.removeAttribute(\"tabindex\");\n          }\n\n          document.removeEventListener(\"focusin\", this.listeners[namespace]);\n        },\n        /**\n         * Reset any previous trap focus\n         */\n      },\n      {\n        key: \"clearTrapFocus\",\n        value: function clearTrapFocus() {\n          for (var key in this.listeners) {\n            if (this.listeners.hasOwnProperty(key)) {\n              document.removeEventListener(\"focusin\", this.listeners[key]);\n            }\n          }\n\n          this.listeners = {};\n        },\n      },\n    ]);\n\n    return Accessibility;\n  })();\n\n  /**\n   * This class handles both the mini cart and the dedicated cart page. It's not the cleanest code on earth but works well :)\n   */\n\n  var Cart = /*#__PURE__*/ (function () {\n    function Cart(element, options) {\n      _classCallCheck(this, Cart);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.options = options; // Some developers blindly remove the DOM code for the cart, so we have to do a check here to make sure it is here\n\n      if (!this.element) {\n        return;\n      }\n\n      this.miniCartElement = this.element.querySelector(\".mini-cart\");\n      this.isMiniCartOpen = false;\n\n      if (window.theme.pageType !== \"cart\" && this.miniCartElement) {\n        this.miniCartToggleElement = this.element.querySelector(\n          '[aria-controls=\"'.concat(this.miniCartElement.id, '\"]')\n        );\n\n        this._checkMiniCartScrollability();\n      }\n\n      this.itemCount = window.theme.cartCount;\n\n      this._attachListeners();\n    }\n\n    _createClass(Cart, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          this.delegateElement.off();\n          this.delegateRoot.off();\n          window.removeEventListener(\n            \"resize\",\n            this._calculateMiniCartHeightListener\n          );\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this._calculateMiniCartHeightListener =\n            this._calculateMiniCartHeight.bind(this);\n\n          if (\n            window.theme.pageType !== \"cart\" &&\n            window.theme.cartType !== \"page\"\n          ) {\n            this.delegateElement.on(\n              \"click\",\n              '[data-action=\"toggle-mini-cart\"]',\n              this._toggleMiniCart.bind(this)\n            );\n            this.delegateRoot.on(\"click\", this._onWindowClick.bind(this));\n            window.addEventListener(\n              \"resize\",\n              this._calculateMiniCartHeightListener\n            );\n          }\n\n          this.delegateRoot.on(\n            \"click\",\n            '[data-action=\"decrease-quantity\"]',\n            this._updateQuantity.bind(this)\n          );\n          this.delegateRoot.on(\n            \"click\",\n            '[data-action=\"increase-quantity\"]',\n            this._updateQuantity.bind(this)\n          );\n          this.delegateRoot.on(\n            \"change\",\n            \".quantity-selector:not(.quantity-selector--product) .quantity-selector__value\",\n            this._updateQuantity.bind(this)\n          );        \n          this.delegateRoot.on(\n            \"keyup\",\n            \".quantity-selector:not(.quantity-selector--product) .quantity-selector__value\",\n            this._updateQuantitySize.bind(this)\n          );\n          this.delegateRoot.on(\n            \"keydown\",\n            \".quantity-selector__value\",\n            this._blockEnterKey.bind(this)\n          );\n          this.delegateRoot.on(\n            \"product:added\",\n            this._onProductAdded.bind(this)\n          );\n          this.delegateRoot.on(\"cart:refresh\", this._onCartRefresh.bind(this));\n        \n        },\n      },\n      {\n        key: \"_toggleMiniCart\",\n        value: function _toggleMiniCart(event) {\n          if (event) {\n            event.preventDefault();\n          }\n\n          if (this.isMiniCartOpen) {\n            this._closeMiniCart();\n          } else {\n            this._openMiniCart();\n          }\n        },\n      },\n      {\n        key: \"_openMiniCart\",\n        value: function _openMiniCart() {\n          \n          this.miniCartToggleElement.setAttribute(\"aria-expanded\", \"true\"); // If we are on mobile phone we also set the aria-expanded attribute to true on the icon state holder\n          if (Responsive.getCurrentBreakpoint() === \"phone\") {\n            this.miniCartToggleElement\n              .querySelector(\".header__cart-icon\")\n              .setAttribute(\"aria-expanded\", \"true\");\n          } // Finally also set aria-hidden to false on controlled element\n\n          this.miniCartElement.setAttribute(\"aria-hidden\", \"false\");\n          this.isMiniCartOpen = true;\n\n          this._calculateMiniCartHeight(); // Trap the focus\n\n          Accessibility.trapFocus(this.miniCartElement, \"mini-cart\");\n          document.body.classList.add(\"no-mobile-scroll\");\n        },\n      },\n      {\n        key: \"_closeMiniCart\",\n        value: function _closeMiniCart() {\n          this.miniCartToggleElement.setAttribute(\"aria-expanded\", \"false\"); // If we are on mobile phone we also set the aria-expanded attribute to true on the icon state holder\n\n          if (Responsive.getCurrentBreakpoint() === \"phone\") {\n            this.miniCartToggleElement\n              .querySelector(\".header__cart-icon\")\n              .setAttribute(\"aria-expanded\", \"false\");\n            this.miniCartElement.style.maxHeight = \"\";\n          } // Finally also set aria-hidden to false on controlled element\n\n          this.miniCartElement.setAttribute(\"aria-hidden\", \"true\");\n          this.isMiniCartOpen = false;\n          document.body.classList.remove(\"no-mobile-scroll\");\n        },\n      },\n      {\n        key: \"_calculateMiniCartHeight\",\n        value: function _calculateMiniCartHeight() {\n          if (Responsive.getCurrentBreakpoint() === \"phone\") {\n            if (this.isMiniCartOpen) {\n              var maxHeight =\n                window.innerHeight -\n                document.querySelector(\".header\").getBoundingClientRect()\n                  .bottom;\n              this.miniCartElement.style.maxHeight = \"\".concat(maxHeight, \"px\"); // We also need to calculate the content part height to avoid any issue on Chrome\n\n              var miniCartContentElement = this.miniCartElement.querySelector(\n                  \".mini-cart__content\"\n                ),\n                miniCartRecapElement =\n                  this.miniCartElement.querySelector(\".mini-cart__recap\");\n\n              if (miniCartRecapElement) {\n                miniCartContentElement.style.maxHeight = \"\".concat(\n                  maxHeight - miniCartRecapElement.clientHeight,\n                  \"px\"\n                );\n              }\n            } else {\n              this.miniCartElement.style.maxHeight = \"\";\n              this.miniCartElement.querySelector(\n                \".mini-cart__content\"\n              ).style.maxHeight = \"\";\n            }\n          } else {\n            this.miniCartElement.style.maxHeight = \"\";\n            this.miniCartElement.querySelector(\n              \".mini-cart__content\"\n            ).style.maxHeight = \"\";\n          }\n        },\n        /**\n         * Change the quantity of the cart\n         */\n      },\n      {\n        key: \"_updateQuantity\",\n        value: function _updateQuantity(event, target) {\n          var _this = this;        \n          \n          var parsedQuantity = 1;\n\n          if (target.tagName === \"INPUT\") {\n            parsedQuantity = parseInt(target.value);\n          } else {\n            parsedQuantity = parseInt(target.getAttribute(\"data-quantity\"));\n          } // If we are in \"page\" mode, we reload the page instead of doing that in Ajax to have a better compatibility with apps\n\n          if (window.theme.cartType === \"page\") {\n            if (target.hasAttribute(\"data-href\")) {\n              window.location.href = target.getAttribute(\"data-href\");\n            } else {\n              window.location.href = \"\"\n                .concat(window.routes.cartChangeUrl, \"?line=\")\n                .concat(target.getAttribute(\"data-line\"), \"&quantity=\")\n                .concat(parsedQuantity);\n            }\n\n            return;\n          }\n\n          document.dispatchEvent(new CustomEvent(\"theme:loading:start\"));\n          fetch(\"\".concat(window.routes.cartChangeUrl, \".js\"), {\n            body: JSON.stringify({\n              line: target.getAttribute(\"data-line\"),\n              quantity: parsedQuantity,\n            }),\n            credentials: \"same-origin\",\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": \"application/json\",\n              \"X-Requested-With\": \"XMLHttpRequest\", // This is needed as currently there is a bug in Shopify that assumes this header\n            },\n          }).then(function (cart) {\n            cart.json().then(function (content) {\n              _this.itemCount = content[\"item_count\"];   \n              \n                //pcoCampaignPromo(Currency.formatMoney(content.items_subtotal_price,window.theme.moneyFormat).replace(\"$\",\"\"));\n              _this._rerender(false).then(function () {\n                document.dispatchEvent(new CustomEvent(\"theme:loading:end\"));\n              });\n            });\n          });\n          event.preventDefault();\n\n        },\n      },\n      {\n        key: \"_updateQuantitySize\",\n        value: function _updateQuantitySize(event, target) {\n          target.setAttribute(\"size\", Math.max(target.value.length, 2));\n        },\n      },\n      {\n        key: \"_blockEnterKey\",\n        value: function _blockEnterKey(event) {\n          if (event.key === \"Enter\") {\n            return false;\n          }\n        },\n        /**\n         * This method is called internally to rerender the cart, based on the content returned by Shopify Ajax API.\n         * We could save some performance by updating directly in JavaScript instead of doing a GET call to get the HTML\n         * from Shopify, but by experience, this allows for easier app integration as it allows the Liquid to re-run\n         * all the time and hence having easier logic.\n         */\n      },\n      {\n        key: \"_rerender\",\n        value: function _rerender() {\n          var _this2 = this;\n\n          var scrollToTop =\n            arguments.length > 0 && arguments[0] !== undefined\n              ? arguments[0]\n              : true;\n          // Note: appending a timestamp is necessary as the polyfill on IE11 and lower does not support the \"cache\" property\n          var url = \"\";\n\n          if (window.theme.pageType !== \"cart\") {\n            url = \"\"\n              .concat(window.routes.cartUrl, \"?view=mini-cart&timestamp=\")\n              .concat(Date.now());\n          } else {\n            url = \"\"\n              .concat(window.routes.cartUrl, \"?timestamp=\")\n              .concat(Date.now());\n          }\n\n          return fetch(url, {\n            credentials: \"same-origin\",\n            method: \"GET\",\n          }).then(function (content) {\n            content.text().then(function (html) {\n              // We extract the data-item-count from the returned element\n              var myDiv = document.createElement(\"div\");\n              myDiv.innerHTML = html;\n\n              if (\n                myDiv.firstElementChild &&\n                myDiv.firstElementChild.hasAttribute(\"data-item-count\")\n              ) {\n                _this2.itemCount = parseInt(\n                  myDiv.firstElementChild.getAttribute(\"data-item-count\")\n                );\n              }\n\n              _this2.element.querySelector(\".header__cart-count\").textContent =\n                _this2.itemCount;\n\n              if (window.theme.cartType !== \"page\") {\n                if (window.theme.pageType !== \"cart\") {\n                  // Note: we could use outerHTML here but outerHTML does not update the reference to new object\n                  var tempElement = document.createElement(\"div\");\n                  tempElement.innerHTML = html; // When we re-render, we need to preserve the scroll position when content changes\n\n                  var miniCartItemListElement =\n                      _this2.miniCartElement.querySelector(\n                        \".mini-cart__line-item-list\"\n                      ),\n                    scrollPosition = null;\n\n                  if (miniCartItemListElement) {\n                    scrollPosition = miniCartItemListElement.scrollTop;\n                  }\n\n                  _this2.miniCartElement.innerHTML =\n                    tempElement.querySelector(\".mini-cart\").innerHTML;\n\n                  var newMiniCartItemListElement =\n                    _this2.miniCartElement.querySelector(\n                      \".mini-cart__line-item-list\"\n                    );\n\n                  if (newMiniCartItemListElement && scrollPosition !== null) {\n                    newMiniCartItemListElement.scrollTop = scrollPosition;\n                  }\n\n                  _this2._checkMiniCartScrollability();\n\n                  _this2._calculateMiniCartHeight();\n\n                  _this2.element.dispatchEvent(\n                    new CustomEvent(\"cart:rerendered\")\n                  );\n                } else {\n                  // The replacement of the DOM here could be made better and more resilient (maybe exploring using a virtual DOM approach in future?)\n                  var _tempElement = document.createElement(\"div\");\n\n                  _tempElement.innerHTML = html;\n                  var originalCart = document.querySelector(\n                    '[data-section-type=\"cart\"]'\n                  );\n                  originalCart.innerHTML = _tempElement.querySelector(\n                    '[data-section-type=\"cart\"]'\n                  ).innerHTML;\n\n                  if (scrollToTop) {\n                    window.scrollTo({\n                      top: 0,\n                      behavior: \"smooth\",\n                    });\n                  } // Reload the Shopify Review badges\n\n                  if (window.SPR) {\n                    window.SPR.initDomEls();\n                    window.SPR.loadBadges();\n                  }\n\n                  _this2.element.dispatchEvent(\n                    new CustomEvent(\"cart:rerendered\", {\n                      bubbles: true,\n                    })\n                  );\n                }\n              }\n            });\n          });\n        },\n        /**\n         * Check if the mini-cart is scrollable\n         */\n      },\n      {\n        key: \"_checkMiniCartScrollability\",\n        value: function _checkMiniCartScrollability() {\n          var miniCartItemList = this.miniCartElement.querySelector(\n            \".mini-cart__line-item-list\"\n          );\n\n          if (\n            miniCartItemList &&\n            miniCartItemList.scrollHeight > miniCartItemList.clientHeight\n          ) {\n            miniCartItemList.classList.add(\"is-scrollable\");\n          }\n        },\n        /**\n         * This callback is automatically called when a variant has been added, which allows us to open it and re-render\n         */\n      },\n      {\n        key: \"_onProductAdded\",\n        value: function _onProductAdded(event) {\n          var _this3 = this;\n\n          this.itemCount += event.detail.quantity;\n          /* Add the quantity added */\n\n          this._onCartRefresh().then(function () {\n            if (window.theme.pageType !== \"cart\") {\n              // If we don't have the sticky header enabled, we scroll to top to make sure it is visible\n              if (\n                window.theme.cartType === \"drawer\" &&\n                !_this3.options[\"useStickyHeader\"]\n              ) {\n                window.scrollTo({\n                  top: 0,\n                  behavior: \"smooth\",\n                });\n              }\n\n              if (window.theme.cartType === \"message\" && event.detail.button) {\n                event.detail.button.innerHTML =\n                  window.languages.productAddedShort;\n                setTimeout(function () {\n                  event.detail.button.innerHTML =\n                    window.languages.productFormAddToCart;\n                }, 1500);\n              }\n\n              if (\n                window.theme.pageType !== \"cart\" &&\n                window.theme.cartType === \"drawer\"\n              ) {\n                _this3._openMiniCart();\n              }\n            }\n          });\n        },\n        /**\n         * Allows to refresh the mini-cart\n         */\n      },\n      {\n        key: \"_onCartRefresh\",\n        value: function _onCartRefresh(event) {\n          var scrollToTop = true;\n\n          if (event && event.detail) {\n            scrollToTop = event.detail.scrollToTop;\n          }\n\n          return this._rerender(scrollToTop).then(function () {\n            document.dispatchEvent(new CustomEvent(\"theme:loading:end\"));\n          });\n        },\n        /**\n         * We need to catch click outside the element to automatically close mini-cart\n         */\n      },\n      {\n        key: \"_onWindowClick\",\n        value: function _onWindowClick(event) {\n          if (\n            this.miniCartElement &&\n            this.isMiniCartOpen &&\n            !this.element.contains(event.target)\n          ) {\n            this._closeMiniCart();\n          }\n        },\n      },\n    ]);\n\n    return Cart;\n  })();\n\n  var MobileNavigation = /*#__PURE__*/ (function () {\n    function MobileNavigation(element) {\n      \n      _classCallCheck(this, MobileNavigation);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.mobileMenuElement = this.element.querySelector(\".mobile-menu\");\n      this.mobileMenuToggleElement = this.element.querySelector(\n        '[aria-controls=\"'.concat(this.mobileMenuElement.id, '\"]')\n      );\n      this.isOpen = false;\n\n      this._attachListeners();\n    }\n\n    _createClass(MobileNavigation, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          this.delegateElement.off();\n          this.delegateRoot.off();\n          window.removeEventListener(\"resize\", this._calculatMaxHeightListener);\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this._calculatMaxHeightListener = this._calculateMaxHeight.bind(this);\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"toggle-menu\"]',\n            this._toggleMenu.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"open-panel\"]',\n            this._openPanel.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"close-panel\"]',\n            this._closePanel.bind(this)\n          );\n          this.delegateRoot.on(\"click\", this._onWindowClick.bind(this));\n          window.addEventListener(\"resize\", this._calculatMaxHeightListener);\n        },\n      },\n      {\n        key: \"_toggleMenu\",\n        value: function _toggleMenu() {        \n          \n          $(\"html,body\").toggleClass(\"openMenu_noScroll\");\n          $(\".mobile-menu__panel\").removeClass(\"hidescroll_panel\");\n          $(\"#mobile-menu\").removeClass(\"hidescrolling\");\n            \n          this.isOpen = !this.isOpen;\n          this.mobileMenuToggleElement.setAttribute(\n            \"aria-expanded\",\n            this.isOpen ? \"true\" : \"false\"\n          );\n          this.mobileMenuElement.setAttribute(\n            \"aria-hidden\",\n            this.isOpen ? \"false\" : \"true\"\n          );\n\n          if (!this.isOpen) {\n           \n            this.mobileMenuElement.style.maxHeight = \"\"; // If closed, we need to close all sub-menus\n\n            this.element\n              .querySelectorAll(\".mobile-menu__panel.is-open\")\n              .forEach(function (item) {\n                item.classList.remove(\"is-open\");\n              });\n            document.body.classList.remove(\"no-mobile-scroll\");\n\n             $(\".blockContent\").hide();\n            $(\"html\").css(\"overflow\",\"auto\");\n          } else {\n            // We need to restrict the height\n            this._calculateMaxHeight();\n\n            document.body.classList.add(\"no-mobile-scroll\");\n\n            $(\".blockContent\").show();\n            $(\"html\").css(\"overflow\",\"hidden\");\n          }\n        },\n      },\n      {\n        key: \"_openPanel\",\n        value: function _openPanel(event, target) {\n          target.setAttribute(\"aria-expanded\", \"true\");\n          this.element\n            .querySelector(\"#\".concat(target.getAttribute(\"aria-controls\")))\n            .classList.add(\"is-open\");\n        },\n      },\n      {\n        key: \"_closePanel\",\n        value: function _closePanel(event, target) {\n          // We first get the panel to be closed\n          var panelToClose = target.closest(\".mobile-menu__panel.is-open\");\n          panelToClose.classList.remove(\"is-open\"); // Then update the ARIA attributes for button that control it\n\n          this.element\n            .querySelector('[aria-controls=\"'.concat(panelToClose.id, '\"]'))\n            .setAttribute(\"aria-expanded\", \"false\");\n        },\n      },\n      {\n        key: \"_calculateMaxHeight\",\n        value: function _calculateMaxHeight() {\n          if (this.isOpen) {\n            this.mobileMenuElement.style.maxHeight = \"\".concat(\n              window.innerHeight -\n                document.querySelector(\".header\").getBoundingClientRect()\n                  .bottom,\n              \"px\"\n            );\n          }\n        },\n      },\n      {\n        key: \"_onWindowClick\",\n        value: function _onWindowClick(event) {\n          if (this.isOpen && !this.element.contains(event.target)) {\n            this._toggleMenu();\n          }\n        },\n      },\n    ]);\n\n    return MobileNavigation;\n  })();\n\n  var ModalManager = /*#__PURE__*/ (function () {\n    function ModalManager() {\n      _classCallCheck(this, ModalManager);\n\n      this.domDelegate = new Delegate(document.body);\n      this.activeModalsQueue = [];\n      var activeModal = document.querySelector('.modal[aria-hidden=\"false\"]');\n\n      if (activeModal) {\n        this.activeModalsQueue.push(activeModal);\n      }\n\n      this._attachListeners();\n    }\n\n    _createClass(ModalManager, [\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this._onKeyPressedListener = this._onKeyPressed.bind(this);\n          this.domDelegate.on(\n            \"click\",\n            '[data-action=\"open-modal\"]',\n            this._openModal.bind(this)\n          );\n          this.domDelegate.on(\n            \"click\",\n            '[data-action=\"close-modal\"]',\n            this._closeModal.bind(this)\n          ); // We allow any other code to force closing a modal by listening to the \"modal:close\" event\n\n          document.addEventListener(\"modal:close\", this._closeModal.bind(this));\n          this._clickOutsideListener = this._checkClickOutside.bind(this); // If there is already an active modal when the page is loaded, we directly attach the listener on outside click\n\n          if (this.activeModalsQueue.length > 0) {\n            document.documentElement.classList.add(\"is-locked\");\n            this.domDelegate.on(\"click\", this._clickOutsideListener);\n          }\n        },\n      },\n      {\n        key: \"_openModal\",\n        value: function _openModal(event, target) {\n          var _this = this;\n\n          var modal = document.querySelector(\n            \"#\".concat(target.getAttribute(\"aria-controls\"))\n          );\n\n          if (modal) {\n            var onOpen = function onOpen(event) {\n              if (event.propertyName === \"visibility\") {\n                modal.removeEventListener(\"transitionend\", onOpen);\n                Accessibility.trapFocus(modal, \"modal\" + modal.id);\n\n                _this.activeModalsQueue.push(modal);\n              }\n            };\n\n            modal.addEventListener(\"transitionend\", onOpen);\n            modal.setAttribute(\"aria-hidden\", \"false\");\n            document.documentElement.classList.add(\"is-locked\");\n            this.domDelegate.on(\"click\", this._clickOutsideListener);\n            this.domDelegate.on(\"keyup\", this._onKeyPressedListener);\n            return false; // Prevent the event to be propagated to the clickOutsideListener immediately\n          }\n        },\n      },\n      {\n        key: \"_closeModal\",\n        value: function _closeModal() {\n          if (this.activeModalsQueue.length > 0) {\n            var modalToClose = this.activeModalsQueue.pop();\n\n            var onClose = function onClose(event) {\n              if (event.propertyName === \"visibility\") {\n                modalToClose.removeEventListener(\"transitionend\", onClose);\n                Accessibility.removeTrapFocus(\n                  modalToClose,\n                  \"modal\" + modalToClose.id\n                ); // We emit an event saying it has closed, which can give the option to do cleanup\n\n                modalToClose.dispatchEvent(new CustomEvent(\"modal:closed\"));\n              }\n            };\n\n            modalToClose.addEventListener(\"transitionend\", onClose);\n            modalToClose.setAttribute(\"aria-hidden\", \"true\");\n            document.documentElement.classList.remove(\"is-locked\");\n            this.domDelegate.off(\"click\", this._clickOutsideListener);\n            this.domDelegate.off(\"keyup\", this._onKeyPressedListener);\n          }\n        },\n      },\n      {\n        key: \"_checkClickOutside\",\n        value: function _checkClickOutside(event) {\n          if (this.activeModalsQueue.length === 0) {\n            return;\n          }\n\n          var modalToClose =\n            this.activeModalsQueue[this.activeModalsQueue.length - 1];\n\n          if (\n            modalToClose &&\n            (!modalToClose.contains(event.target) ||\n              modalToClose === event.target)\n          ) {\n            this._closeModal();\n          }\n        },\n      },\n      {\n        key: \"_onKeyPressed\",\n        value: function _onKeyPressed(event) {\n          if (event.key === \"Escape\") {\n            this._closeModal();\n          }\n        },\n      },\n    ]);\n\n    return ModalManager;\n  })();\n\n  var NewsletterPopup = /*#__PURE__*/ (function () {\n    function NewsletterPopup(element) {\n      _classCallCheck(this, NewsletterPopup);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.rootDelegateElement = new Delegate(document.body);\n      this.options = JSON.parse(element.getAttribute(\"data-popup-settings\")); // If the popup has been already displayed, we do not display it\n\n      try {\n        if (\n          window.location.hash === \"#newsletter-popup\" &&\n          window.theme.pageType !== \"captcha\"\n        ) {\n          this._openPopup();\n        } else if (\n          !this.options[\"showOnlyOnce\"] ||\n          (this.options[\"showOnlyOnce\"] &&\n            localStorage.getItem(\"themePopup\") === null)\n        ) {\n          setTimeout(\n            this._openPopup.bind(this),\n            this.options[\"apparitionDelay\"] * 1000\n          );\n        }\n      } catch (error) {\n        // Some browsers (especially in private mode) throw an exception when trying to access local storage, so we protect ourselves here\n      }\n\n      this._attachListeners();\n    }\n\n    _createClass(NewsletterPopup, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          this.delegateElement.off();\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this._onKeyPressedListener = this._onKeyPressed.bind(this);\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"close-popup\"]',\n            this._closePopup.bind(this)\n          );\n          this._clickOutsideListener = this._checkClickOutside.bind(this);\n        },\n      },\n      {\n        key: \"_openPopup\",\n        value: function _openPopup() {\n          if (!window.theme.isExitPopupOpen) {\n            this.element.setAttribute(\"aria-hidden\", \"false\");\n            localStorage.setItem(\"themePopup\", \"true\");\n            window.theme.isNewsletterPopupOpen = true;\n            this.delegateElement.on(\"click\", this._clickOutsideListener);\n            this.rootDelegateElement.on(\"keyup\", this._onKeyPressedListener);\n          }\n        },\n      },\n      {\n        key: \"_closePopup\",\n        value: function _closePopup() {\n          this.element.setAttribute(\"aria-hidden\", \"true\");\n          window.theme.isNewsletterPopupOpen = false;\n          this.delegateElement.off(\"click\");\n          this.rootDelegateElement.off(\"keyup\", this._onKeyPressedListener);\n        },\n      },\n      {\n        key: \"_checkClickOutside\",\n        value: function _checkClickOutside(event) {\n          if (\n            !this.element.contains(event.target) ||\n            this.element === event.target\n          ) {\n            this._closePopup();\n          }\n        },\n      },\n      {\n        key: \"_onKeyPressed\",\n        value: function _onKeyPressed(event) {\n          if (event.key === \"Escape\") {\n            this._closePopup();\n          }\n        },\n      },\n    ]);\n\n    return NewsletterPopup;\n  })();\n\n  var OverflowScroller = /*#__PURE__*/ (function () {\n    function OverflowScroller(element, options) {\n      _classCallCheck(this, OverflowScroller);\n\n      if (!element) {\n        return;\n      }\n\n      this.element = element;\n      this.options = options;\n      this.lastKnownY = window.scrollY;\n      this.currentTop = 0;\n      this.initialTopOffset =\n        options[\"offsetTop\"] ||\n        parseInt(window.getComputedStyle(this.element).top);\n\n      this._attachListeners();\n    }\n\n    _createClass(OverflowScroller, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          window.removeEventListener(\"scroll\", this._checkPositionListener);\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this._checkPositionListener = this._checkPosition.bind(this);\n          window.addEventListener(\"scroll\", this._checkPositionListener);\n        },\n      },\n      {\n        key: \"_checkPosition\",\n        value: function _checkPosition() {\n          var _this = this;\n\n          fastdom.measure(function () {\n            var bounds = _this.element.getBoundingClientRect(),\n              maxTop =\n                bounds.top +\n                window.scrollY -\n                _this.element.offsetTop +\n                _this.initialTopOffset,\n              minTop =\n                _this.element.clientHeight -\n                window.innerHeight +\n                (_this.options[\"offsetBottom\"] || 0);\n\n            if (window.scrollY < _this.lastKnownY) {\n              _this.currentTop -= window.scrollY - _this.lastKnownY;\n            } else {\n              _this.currentTop += _this.lastKnownY - window.scrollY;\n            }\n\n            _this.currentTop = Math.min(\n              Math.max(_this.currentTop, -minTop),\n              maxTop,\n              _this.initialTopOffset\n            );\n            _this.lastKnownY = window.scrollY;\n          });\n          fastdom.mutate(function () {\n            _this.element.style.top = \"\".concat(_this.currentTop, \"px\");\n          });\n        },\n      },\n    ]);\n\n    return OverflowScroller;\n  })();\n\n  var PopoverManager = /*#__PURE__*/ (function () {\n    function PopoverManager() {\n      _classCallCheck(this, PopoverManager);\n\n      this.delegateElement = new Delegate(document.body);\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.activePopover = null;\n\n      this._attachListeners();\n    }\n\n    _createClass(PopoverManager, [\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this._onLooseFocusListener = this._onLooseFocus.bind(this);\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"toggle-popover\"]',\n            this._togglePopover.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"show-popover-panel\"]',\n            this._showPanel.bind(this)\n          );\n          this.delegateRoot.on(\"click\", this._onWindowClick.bind(this));\n          document.addEventListener(\n            \"popover:close\",\n            this._closeActivePopover.bind(this)\n          );\n          window.addEventListener(\"resize\", this._windowResized.bind(this));\n        },\n      },\n      {\n        key: \"_togglePopover\",\n        value: function _togglePopover(event, target) {\n          var hasActivePopover = this.activePopover !== null,\n            previousActivePopoverId = this.activePopover\n              ? this.activePopover.id\n              : null; // If the toggler has a \"data-follow-link\" attribute, we match against the breakpoint and redirect to the page\n\n          if (\n            target.hasAttribute(\"data-follow-link\") &&\n            Responsive.matchesBreakpoint(\n              target.getAttribute(\"data-follow-link\")\n            )\n          ) {\n            return;\n          }\n\n          if (hasActivePopover) {\n            this._closeActivePopover();\n          }\n\n          if (\n            !hasActivePopover ||\n            (hasActivePopover &&\n              target.getAttribute(\"aria-controls\") !== previousActivePopoverId)\n          ) {\n            this._openPopover(target);\n          }\n\n          event.preventDefault();\n        },\n      },\n      {\n        key: \"_closeActivePopover\",\n        value: function _closeActivePopover() {\n          this.activePopover.setAttribute(\"aria-hidden\", \"true\");\n          document\n            .querySelector(\n              '[aria-controls=\"'.concat(this.activePopover.id, '\"]')\n            )\n            .setAttribute(\"aria-expanded\", \"false\");\n          this.activePopover.removeEventListener(\n            \"focusout\",\n            this._onLooseFocusListener\n          );\n          this.activePopover = null;\n        },\n      },\n      {\n        key: \"_openPopover\",\n        value: function _openPopover(target) {\n          var element = document.getElementById(\n            target.getAttribute(\"aria-controls\")\n          );\n          target.setAttribute(\"aria-expanded\", \"true\");\n          element.setAttribute(\"aria-hidden\", \"false\"); // If we are on mobile phone we also set the aria-expanded attribute to true on the icon state holder\n\n          if (Responsive.getCurrentBreakpoint() === \"phone\") {\n            element.style.height = \"\".concat(\n              window.innerHeight -\n                document.querySelector(\".header\").getBoundingClientRect()\n                  .bottom,\n              \"px\"\n            );\n          } else {\n            element.style.height = \"\"; // If the popover contains a \"panel-list\", we set the height to the active panel\n\n            var panelList = element.querySelector(\".popover__panel-list\");\n\n            if (panelList) {\n              panelList.style.height = \"\".concat(panelList.clientHeight, \"px\");\n            }\n          }\n\n          this.activePopover = element;\n          this.activePopover.addEventListener(\n            \"focusout\",\n            this._onLooseFocusListener\n          );\n        },\n      },\n      {\n        key: \"_showPanel\",\n        value: function _showPanel(event, target) {\n          // If no active popover, we do nothing\n          if (!this.activePopover) {\n            return;\n          } // Otherwise we get all the panels within the popover\n\n          var panels = this.activePopover.querySelectorAll(\".popover__panel\");\n          panels.forEach(function (panel) {\n            if (panel.id === target.getAttribute(\"aria-controls\")) {\n              panel.classList.add(\"is-selected\");\n              panel.closest(\".popover__panel-list\").style.height = \"\".concat(\n                panel.clientHeight,\n                \"px\"\n              );\n            } else {\n              panel.classList.remove(\"is-selected\");\n            }\n          });\n        },\n      },\n      {\n        key: \"_onWindowClick\",\n        value: function _onWindowClick(event) {\n          if (\n            event.target.getAttribute(\"data-action\") === \"toggle-popover\" ||\n            event.target.closest('[data-action=\"toggle-popover\"]')\n          ) {\n            return;\n          }\n\n          if (\n            this.activePopover &&\n            !this.activePopover.contains(event.target)\n          ) {\n            this._closeActivePopover();\n          }\n        },\n      },\n      {\n        key: \"_onLooseFocus\",\n        value: function _onLooseFocus(event) {\n          if (\n            this.activePopover &&\n            event.relatedTarget !== null &&\n            !this.activePopover.contains(event.relatedTarget)\n          ) {\n            this._closeActivePopover();\n          }\n        },\n      },\n      {\n        key: \"_windowResized\",\n        value: function _windowResized() {\n          if (\n            Responsive.getCurrentBreakpoint() === \"phone\" &&\n            this.activePopover\n          ) {\n            this.activePopover.style.height = \"\".concat(\n              window.innerHeight -\n                document.querySelector(\".header\").getBoundingClientRect()\n                  .bottom,\n              \"px\"\n            );\n          }\n        },\n      },\n    ]);\n\n    return PopoverManager;\n  })();\n\n  var ProductItemColorSwatch = /*#__PURE__*/ (function () {\n    function ProductItemColorSwatch(element) {\n      _classCallCheck(this, ProductItemColorSwatch);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n\n      this._attachListeners();\n\n      this.recalculateSwatches();\n    }\n\n    _createClass(ProductItemColorSwatch, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          this.delegateElement.off();\n          window.removeEventListener(\n            \"resize\",\n            this._recalculateSwatchesListener\n          );\n        },\n      },\n      {\n        key: \"recalculateSwatches\",\n        value: function recalculateSwatches() {\n          var _this = this;\n\n          // If you have too many swatches, it will grow into more than one lines, which is not desirable. Instead,\n          // we'd like to only show one line only, and show a \"+X\" if there are too many swatches\n          fastdom.measure(function () {\n            // For each swatch list we get the number of swatches, and make sure that we don't display more than 100% of\n            // the width\n            _this.element\n              .querySelectorAll(\".product-item__swatch-list\")\n              .forEach(function (swatchList) {\n                // Get the width of the swatch list (this is 100%)\n                var currentWidth = swatchList.clientWidth,\n                  maxAllowedWidth = parseInt(Math.min(currentWidth, 200)); // A single swatch takes 30px, so let's figure out how many we can fit completely\n\n                var maxFit = Math.floor(maxAllowedWidth / 30); // Now, we add a special class to the one after \"maxFit\"\n\n                fastdom.mutate(function () {\n                  var colorSwatches =\n                    swatchList.querySelectorAll(\".color-swatch\"); // For each, we reset the attributes if needed\n\n                  colorSwatches.forEach(function (colorSwatch, index) {\n                    colorSwatch.classList.remove(\"color-swatch--view-more\");\n\n                    if (\n                      maxFit === index + 1 &&\n                      maxFit !== colorSwatches.length\n                    ) {\n                      colorSwatch.classList.add(\"color-swatch--view-more\");\n                    }\n                  });\n                });\n              });\n          });\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this._recalculateSwatchesListener =\n            this.recalculateSwatches.bind(this);\n          this.delegateElement.on(\n            \"change\",\n            \".product-item__swatch-list .color-swatch__radio\",\n            this._colorChanged.bind(this)\n          );\n          window.addEventListener(\"resize\", this._recalculateSwatchesListener);\n        },\n      },\n      {\n        key: \"_colorChanged\",\n        value: function _colorChanged(event, target) {\n          // We need to change the URL of the various links\n          var productItem = target.closest(\".product-item\"),\n            variantUrl = target.getAttribute(\"data-variant-url\");\n          productItem\n            .querySelector(\".product-item__image-wrapper\")\n            .setAttribute(\"href\", variantUrl);\n          productItem\n            .querySelector(\".product-item__title\")\n            .setAttribute(\"href\", variantUrl); // If we have a custom image for the variant, we change it\n\n          var originalImageElement = productItem.querySelector(\n            \".product-item__primary-image\"\n          );\n\n          if (\n            target.hasAttribute(\"data-image-url\") &&\n            target.getAttribute(\"data-media-id\") !==\n              originalImageElement.getAttribute(\"data-media-id\")\n          ) {\n            var newImageElement = document.createElement(\"img\");\n            newImageElement.className =\n              \"product-item__primary-image lazyload image--fade-in\";\n            newImageElement.setAttribute(\n              \"data-media-id\",\n              target.getAttribute(\"data-media-id\")\n            );\n            newImageElement.setAttribute(\n              \"data-src\",\n              target.getAttribute(\"data-image-url\")\n            );\n            newImageElement.setAttribute(\n              \"data-widths\",\n              target.getAttribute(\"data-image-widths\")\n            );\n            newImageElement.setAttribute(\"data-sizes\", \"auto\"); // Replace the original node\n\n            originalImageElement.parentNode.style.paddingBottom = \"\".concat(\n              100.0 / newImageElement.getAttribute(\"data-image-aspect-ratio\"),\n              \"%\"\n            );\n            originalImageElement.parentNode.replaceChild(\n              newImageElement,\n              originalImageElement\n            );\n          }\n        },\n      },\n    ]);\n\n    return ProductItemColorSwatch;\n  })();\n\n  var Currency = /*#__PURE__*/ (function () {\n    function Currency() {\n      _classCallCheck(this, Currency);\n    }\n\n    _createClass(Currency, null, [\n      {\n        key: \"formatMoney\",\n\n        /**\n         * Format money values based on your shop currency settings\n         *\n         * @param  {Number|string} cents - value in cents or dollar amount e.g. 300 cents or 3.00 dollars\n         * @param  {String} format - shop money_format setting\n         * @return {String} value - formatted value\n         */\n        value: function formatMoney(cents, format) {\n          if (typeof cents === \"string\") {\n            cents = cents.replace(\".\", \"\");\n          }\n\n          var placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/,\n            formatString = format || \"${{amount}}\";\n\n          function defaultTo(value, defaultValue) {\n            return value == null || value !== value ? defaultValue : value;\n          }\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            var parts = number.split(\".\"),\n              dollarsAmount = parts[0].replace(\n                /(\\d)(?=(\\d\\d\\d)+(?!\\d))/g,\n                \"$1\" + thousands\n              ),\n              centsAmount = parts[1] ? decimal + parts[1] : \"\";\n            return dollarsAmount + centsAmount;\n          }\n\n          var value = \"\";\n\n          switch (formatString.match(placeholderRegex)[1]) {\n            case \"amount\":\n              value = formatWithDelimiters(cents, 2);\n              break;\n\n            case \"amount_no_decimals\":\n              value = formatWithDelimiters(cents, 0);\n              break;\n\n            case \"amount_with_space_separator\":\n              value = formatWithDelimiters(cents, 2, \" \", \".\");\n              break;\n\n            case \"amount_no_decimals_with_comma_separator\":\n              value = formatWithDelimiters(cents, 0, \",\", \".\");\n              break;\n\n            case \"amount_no_decimals_with_space_separator\":\n              value = formatWithDelimiters(cents, 0, \" \");\n              break;\n\n            case \"amount_with_comma_separator\":\n              value = formatWithDelimiters(cents, 2, \".\", \",\");\n              break;\n          }\n\n          if (formatString.indexOf(\"with_comma_separator\") !== -1) {\n            return formatString.replace(placeholderRegex, value);\n          } else {\n            return formatString.replace(placeholderRegex, value);\n          }\n        },\n      },\n    ]);\n\n    return Currency;\n  })();\n\n  /**\n   * This implementation allows to serialize a form\n   */\n  var Form = /*#__PURE__*/ (function () {\n    function Form() {\n      _classCallCheck(this, Form);\n    }\n\n    _createClass(Form, null, [\n      {\n        key: \"serialize\",\n        value: function serialize(form) {\n          function stringKey(key, value) {\n            var beginBracket = key.lastIndexOf(\"[\");\n\n            if (beginBracket === -1) {\n              var _hash = {};\n              _hash[key] = value;\n              return _hash;\n            }\n\n            var newKey = key.substr(0, beginBracket);\n            var newValue = {};\n            newValue[key.substring(beginBracket + 1, key.length - 1)] = value;\n            return stringKey(newKey, newValue);\n          }\n\n          var hash = {};\n\n          for (var i = 0, len = form.elements.length; i < len; i++) {\n            var formElement = form.elements[i];\n\n            if (formElement.name === \"\" || formElement.disabled) {\n              continue;\n            }\n\n            if (\n              formElement.name &&\n              !formElement.disabled &&\n              (formElement.checked ||\n                /select|textarea/i.test(formElement.nodeName) ||\n                /hidden|text|search|tel|url|email|password|datetime|date|month|week|time|datetime-local|number|range|color/i.test(\n                  formElement.type\n                ))\n            ) {\n              var stringKeys = stringKey(formElement.name, formElement.value);\n              hash = Form.extend(hash, stringKeys);\n            }\n          }\n\n          return hash;\n        },\n      },\n      {\n        key: \"extend\",\n        value: function extend() {\n          var extended = {};\n          var i = 0; // Merge the object into the extended object\n\n          var merge = function merge(obj) {\n            for (var prop in obj) {\n              if (obj.hasOwnProperty(prop)) {\n                // If property is an object, merge properties\n                if (\n                  Object.prototype.toString.call(obj[prop]) ===\n                  \"[object Object]\"\n                ) {\n                  extended[prop] = Form.extend(extended[prop], obj[prop]);\n                } else {\n                  extended[prop] = obj[prop];\n                }\n              }\n            }\n          }; // Loop through each object and conduct a merge\n\n          for (; i < arguments.length; i++) {\n            merge(arguments[i]);\n          }\n\n          return extended;\n        },\n      },\n    ]);\n\n    return Form;\n  })();\n\n  /**\n   * Handle the store availability management. The parameter is the div that will hold the content. The function\n   * \"updateWithVariant\" must be called whenever the variant is changed.\n   */\n  var StoreAvailability = /*#__PURE__*/ (function () {\n    function StoreAvailability(element, productTitle) {\n      _classCallCheck(this, StoreAvailability);\n\n      this.element = element;\n      this.productTitle = productTitle;\n    }\n\n    _createClass(StoreAvailability, [\n      {\n        key: \"updateWithVariant\",\n        value: function updateWithVariant(variant) {\n          if (!this.element) {\n            return; // If the element to inject the store availability does not exist, we return immediately\n          } // If the variant is null (for instance unavailable variant), we clear the container\n\n          if (!variant) {\n            this.element.textContent = \"\";\n            return;\n          } // If we have a new variant we render the section\n\n          this._renderAvailabilitySection(variant[\"id\"]);\n        },\n      },\n      {\n        key: \"_renderAvailabilitySection\",\n        value: function _renderAvailabilitySection(id) {\n          var _this = this;\n\n          // First we clear the previous content\n          this.element.innerHTML = \"\"; // If there is already an element with the given modal we remove it first\n\n          var availabilityModal = document.getElementById(\n            \"StoreAvailabilityModal-\".concat(id)\n          );\n\n          if (availabilityModal) {\n            availabilityModal.remove();\n          }\n\n          return fetch(\n            \"\"\n              .concat(window.routes.rootUrlWithoutSlash, \"/variants/\")\n              .concat(id, \"?section_id=store-availability\")\n          ).then(function (response) {\n            return response.text().then(function (content) {\n              _this.element.innerHTML = content;\n              _this.element.innerHTML =\n                _this.element.firstElementChild.innerHTML; // The product title is not rendered so we have to render it manually\n\n              var productTitle = _this.element.querySelector(\n                \".store-availabilities-modal__product-title\"\n              );\n\n              if (productTitle) {\n                productTitle.textContent = _this.productTitle;\n              } // In order for our modal system to work we have to append the modal to the body instead\n\n              var availabilityModal = document.getElementById(\n                \"StoreAvailabilityModal-\".concat(id)\n              );\n              document.body.appendChild(availabilityModal);\n            });\n          });\n        },\n      },\n    ]);\n\n    return StoreAvailability;\n  })();\n\n  var ProductVariants = /*#__PURE__*/ (function () {\n    function ProductVariants(element, options) {\n      var _this = this;\n      _classCallCheck(this, ProductVariants);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = options;\n      var productJsonElement = this.element.querySelector(\n        \"[data-product-json]\"\n      ); // If we are using placeholder, there is no JSON so we wrap here!\n      \n      \n      if (productJsonElement) {        \n\n         var jsonData = JSON.parse(productJsonElement.innerHTML);\n                \n         var currentVariant = jsonData.metafields.filter(x => x.sku == $(\".product-meta__sku-number\").text())[0];\n      \n         var variantLongDescription = $(\"#description-\"+ currentVariant.sku).html();\n           if(variantLongDescription != \"\" && variantLongDescription != undefined && variantLongDescription != jsonData.product.description){            \n             $('<div class=\"product__accordion__content\"><div id=\"longdescript\" class=\"product__accordion__text\">'+variantLongDescription+'</div></div>').insertAfter(\".product__accordion__link\")\n          }\n          else{          \n            $('<div class=\"product__accordion__content\"><div id=\"longdescript\" class=\"product__accordion__text\">'+jsonData.product.description+'</div></div>').insertAfter(\".product__accordion__link\")\n          }\n\n         var variantShortDescription = $(\"#shortdescription-\"+ currentVariant.sku).html();\n         var originalShortDescription = $(\"#hdnDescriptionTag\").html();\n        \n           if(variantShortDescription != \"\" && variantShortDescription != undefined && variantShortDescription != originalShortDescription){            \n             $(\"#product_description_tag\").html(variantShortDescription);\n          }\n          else{          \n            $(\"#product_description_tag\").html(originalShortDescription);\n          }\n\n\n        if(currentVariant.SpecificationsTable != \"\"){\n          $(\".productSpecifications\").show();\n        }\n        else{\n          $(\".productSpecifications\").hide();\n        }\n        \n          this.productData = jsonData[\"product\"];\n          this.productOptionsWithValues = jsonData[\"options_with_values\"];\n          this.variantsInventories = jsonData[\"inventories\"] || {};\n          this.variantSelectors = this.element.querySelectorAll(\n            \".product-form__option[data-selector-type]\"\n          );\n          this.masterSelector = this.element.querySelector(\n            \"#product-select-\".concat(this.productData[\"id\"])\n          ); // We init value with the first selected variant\n  \n          this.productData[\"variants\"].forEach(function (variant) {\n            if (variant[\"id\"] === jsonData[\"selected_variant_id\"]) {\n              _this.currentVariant = variant;\n              _this.option1 = variant[\"option1\"];\n              _this.option2 = variant[\"option2\"];\n              _this.option3 = variant[\"option3\"];\n            }\n          });\n        }      \n\n      this.storeAvailability = new StoreAvailability(\n        this.element.querySelector(\n          \".product-meta__store-availability-container\"\n        ),\n        this.productData ? this.productData[\"title\"] : \"\"\n      );\n      this.storeAvailability.updateWithVariant(this.currentVariant);\n      \n      this._updateSelectors(this.currentVariant); // We update the selectors on initial load to disable the sold out variants\n\n      this._updateSelectors2(this.currentVariant); // (09/2022) We update the selectors on initial load to disable unavailable variants\n\n      this._setupStockCountdown();\n\n      this._attachListeners();\n    }\n\n    _createClass(ProductVariants, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          this.delegateElement.off(\"click\");\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.delegateElement.on(\n            \"change\",\n            \".product-form__single-selector\",\n            this._onOptionChanged.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"add-to-cart\"]',\n            this._addToCart.bind(this)\n          );\n        },\n        /**\n         * ---------------------------------------------------------------------------------------------------\n         * CODE THAT HANDLE VARIANT CHANGES IN THE FRONT\n         *\n         * Please note that this code is highly dependant on the markup and classes, so make sure to NOT\n         * edit this code\n         * ---------------------------------------------------------------------------------------------------\n         */\n\n        /**\n         * This callback is called whenever the variant changes and allows to update data about the active variant\n         */\n      },\n      {\n        key: \"_onVariantChanged\",\n        value: function _onVariantChanged(previousVariant, newVariant, target) {\n          // 1st: the prices\n          \n          this._updateProductPrices(newVariant, previousVariant); // 2th: update inventory\n\n          this._updateInventory(newVariant, previousVariant); // 3th: update SKU\n\n          this._updateSku(newVariant, previousVariant); // 4th: update the discount label (if necessary)\n\n          this._updateDiscountLabel(newVariant, previousVariant); // 5th: update the unit price (if necessary)\n\n          this._updateUnitPrice(newVariant, previousVariant); // 6th: update selectors\n\n          this._updateSelectors(newVariant, previousVariant); // 7th: the add to cart button\n\n          this._updateAddToCartButton(newVariant, previousVariant); // 8th: store availability\n\n          this._updateVariantUniqueInfos(newVariant, previousVariant); // 9th: update variants with unique infos\n          \n          this.storeAvailability.updateWithVariant(newVariant); // Finally, we send an event so that other system could hook and do their own logic          \n          \n          this.element.dispatchEvent(\n            new CustomEvent(\"variant:changed\", {\n              bubbles: true,\n              detail: {\n                variant: newVariant,\n                previousVariant: previousVariant,\n              },\n            })\n          );\n\n          this._updateOptions(newVariant, previousVariant, target); // (09/2022) 10th: update available corresponding options\n        },\n        /**\n         * Update the prices (optionally showing compare at price)\n         */\n      },\n      {\n        key: \"_updateProductPrices\",\n        value: function _updateProductPrices(newVariant, previousVariant) {\n          var productPrices = this.element.querySelector(\".price-list\");\n      \n          if (!productPrices) {\n            return; // Sometimes merchant remove element from the code without taking care of JS... so let's be defensive\n          }\n\n          if (!newVariant) {\n            productPrices.style.display = \"none\";\n          } else {\n            if (\n              previousVariant &&\n              previousVariant[\"price\"] === newVariant[\"price\"] &&\n              previousVariant[\"compare_at_price\"] ===\n                newVariant[\"compare_at_price\"]\n            ) {\n              return; // The price do not have changed so let's return to avoid changing the DOM for nothing\n            }\n\n            productPrices.innerHTML = \"\";\n\n            if (newVariant[\"compare_at_price\"] > newVariant[\"price\"]) {\n              productPrices.innerHTML +=\n                '<span class=\"price price--highlight\"><span class=\"visually-hidden\">'\n                  .concat(window.languages.productSalePrice, \"</span>\")\n                  .concat(\n                    Currency.formatMoney(\n                      newVariant[\"price\"],\n                      window.theme.moneyFormat\n                    ),\n                    \"</span>\"\n                  );\n              productPrices.innerHTML +=\n                '<span class=\"price price--compare\"><span class=\"visually-hidden\">'\n                  .concat(window.languages.productRegularPrice, \"</span>\")\n                  .concat(\n                    Currency.formatMoney(\n                      newVariant[\"compare_at_price\"],\n                      window.theme.moneyFormat\n                    ),\n                    \"</span>\"\n                  );\n            } else {\n              if (\n                this.productData.tags != null &&\n                this.productData.tags.length > 0 &&\n                (this.productData.tags.includes(\n                  \"Online Exclusive: Online Exclusive\"\n                ) ||\n                  this.productData.tags.includes(\"Clearance:On Clearance\"))\n              ) {\n                productPrices.innerHTML +=\n                  '<span class=\"price price--exclusive\"><span class=\"visually-hidden\">'\n                    .concat(window.languages.productSalePrice, \"</span>\")\n                    .concat(\n                      Currency.formatMoney(\n                        newVariant[\"price\"],\n                        window.theme.moneyFormat\n                      ),\n                      \"</span>\"\n                    );\n              } else {\n                productPrices.innerHTML +=\n                  '<span class=\"price\"><span class=\"visually-hidden\">'\n                    .concat(window.languages.productSalePrice, \"</span>\")\n                    .concat(\n                      Currency.formatMoney(\n                        newVariant[\"price\"],\n                        window.theme.moneyFormat\n                      ),\n                      \"</span>\"\n                    );\n              }\n            }\n\n            productPrices.style.display = \"\";\n          }\n        },\n        /**\n         * Update the inventory (if needed)\n         */\n      },\n      {\n        key: \"_updateInventory\",\n        value: function _updateInventory(newVariant) {\n          if (!this.options[\"showInventoryQuantity\"] || !newVariant) {\n            return;\n          }\n\n          var productFormInventoryElement = this.element.querySelector(\n              \".product-form__inventory\"\n            ),\n            variantInventoryManagement =\n              this.variantsInventories[newVariant[\"id\"]][\n                \"inventory_management\"\n              ],\n            variantInventoryPolicy =\n              this.variantsInventories[newVariant[\"id\"]][\"inventory_policy\"],\n            variantInventoryQuantity =\n              this.variantsInventories[newVariant[\"id\"]][\"inventory_quantity\"],\n            variantInventoryMessage =\n              this.variantsInventories[newVariant[\"id\"]][\"inventory_message\"];\n\n          if (!productFormInventoryElement) {\n            return; // Sometimes merchant remove element from the code without taking care of JS... so let's be defensive\n          }\n\n          productFormInventoryElement.classList.remove(\"inventory--high\");\n          productFormInventoryElement.classList.remove(\"inventory--low\");\n\n          if (newVariant[\"available\"]) {\n            if (\n              null !== variantInventoryManagement &&\n              variantInventoryPolicy === \"deny\" &&\n              this.options[\"lowInventoryThreshold\"] > 0\n            ) {\n              if (\n                variantInventoryQuantity <=\n                this.options[\"lowInventoryThreshold\"]\n              ) {\n                productFormInventoryElement.classList.add(\"inventory--low\");\n              } else {\n                productFormInventoryElement.classList.add(\"inventory--high\");\n              }\n            } else {\n              productFormInventoryElement.classList.add(\"inventory--high\");\n            }\n          } // We also need to update the stock countdown if setup\n\n          var stockCountdown = this.element.querySelector(\".inventory-bar\");\n\n          if (stockCountdown) {\n            var stockCountdownProgress = Math.min(\n              Math.max(\n                (variantInventoryQuantity /\n                  parseInt(\n                    stockCountdown.getAttribute(\"data-stock-countdown-max\")\n                  )) *\n                  100.0,\n                0\n              ),\n              100\n            );\n            stockCountdown.classList.toggle(\n              \"inventory-bar--hidden\",\n              stockCountdownProgress === 0\n            );\n            stockCountdown.firstElementChild.style.width = \"\".concat(\n              stockCountdownProgress,\n              \"%\"\n            );\n          }\n\n          productFormInventoryElement.innerHTML = variantInventoryMessage;\n        },\n        /**\n         * Update SKU\n         */\n      },\n      {\n        key: \"_updateSku\",\n        value: function _updateSku(newVariant, previousVariant) {\n          var productSku = this.element.querySelector(\".product-meta__sku\");\n\n          if (!productSku) {\n            return;\n          }\n\n          var productSkuNumber = productSku.querySelector(\n            \".product-meta__sku-number\"\n          );\n\n          if (!newVariant || newVariant[\"sku\"] === \"\") {\n            productSku.style.display = \"none\";\n          } else {\n            if (\n              previousVariant &&\n              previousVariant[\"sku\"] === newVariant[\"sku\"]\n            ) {\n              return; // The SKU do not have changed so let's return to avoid changing the DOM for nothing\n            }\n\n            productSkuNumber.innerHTML = newVariant[\"sku\"];\n            productSku.style.display = \"\";\n          }\n        },\n        /**\n         * Update the discount label\n         */\n      },\n      {\n        key: \"_updateDiscountLabel\",\n        value: function _updateDiscountLabel(newVariant, previousVariant) {\n          if (!window.theme.showDiscount) {\n            return; // Nothing to do if discount label is configured to be hidden\n          }\n\n          var discountLabel = this.element.querySelector(\n            \".product-meta .product-label--on-sale\"\n          ); // Some merchants have removed it from the code so we have to act defensive\n\n          if (!discountLabel) {\n            return;\n          }\n\n          if (\n            !newVariant ||\n            !(newVariant[\"price\"] < newVariant[\"compare_at_price\"])\n          ) {\n            discountLabel.style.display = \"none\";\n          } else {\n            // We compute the savings based on the setting\n            var savings = null;\n\n            if (window.theme.discountMode === \"percentage\") {\n              savings = \"\".concat(\n                Math.round(\n                  ((newVariant[\"compare_at_price\"] - newVariant[\"price\"]) *\n                    100) /\n                    newVariant[\"compare_at_price\"]\n                ),\n                \"%\"\n              );\n            } else {\n              savings = \"<span>\".concat(\n                Currency.formatMoney(\n                  newVariant[\"compare_at_price\"] - newVariant[\"price\"],\n                  window.theme.moneyFormat\n                ),\n                \"</span>\"\n              );\n            }\n\n            discountLabel.innerHTML = \"\".concat(\n              window.languages.collectionOnSaleLabel.replace(\n                \"{{savings}}\",\n                savings\n              )\n            );\n            discountLabel.style.display = \"inline-block\";\n          }\n        },\n      },\n      {\n        key: \"_updateUnitPrice\",\n        value: function _updateUnitPrice(newVariant, previousVariant) {\n          var unitPriceMeasurement = this.element.querySelector(\n            \".unit-price-measurement\"\n          );\n\n          if (!unitPriceMeasurement) {\n            return; // Sometimes merchant remove element from the code without taking care of JS... so let's be defensive\n          }\n\n          if (!newVariant || !newVariant[\"unit_price_measurement\"]) {\n            unitPriceMeasurement.parentNode.style.display = \"none\";\n          } else {\n            unitPriceMeasurement.parentNode.style.display = \"block\";\n            unitPriceMeasurement.querySelector(\n              \".unit-price-measurement__price\"\n            ).innerHTML = Currency.formatMoney(\n              newVariant[\"unit_price\"],\n              window.theme.moneyFormat\n            );\n            unitPriceMeasurement.querySelector(\n              \".unit-price-measurement__reference-unit\"\n            ).innerHTML =\n              newVariant[\"unit_price_measurement\"][\"reference_unit\"];\n            var unitPriceReferenceValue = unitPriceMeasurement.querySelector(\n              \".unit-price-measurement__reference-value\"\n            );\n            unitPriceReferenceValue.innerHTML =\n              newVariant[\"unit_price_measurement\"][\"reference_value\"];\n            unitPriceReferenceValue.style.display =\n              newVariant[\"unit_price_measurement\"][\"reference_value\"] === 1\n                ? \"none\"\n                : \"inline\";\n          }\n        },\n        /**\n         * Warehouse automatically adds a \"disabled\" state to sold out/unavailable variant. When we change the variant we have to recompute\n         * all the selectors\n         */\n      },\n      {\n        key: \"_updateVariantUniqueInfos\",\n        value: function _updateVariantUniqueInfos(newVariant, previousVariant) {\n                \n          if (!newVariant)\n            return;\n\n          var hidePrice = false;\n          var productObject = JSON.parse($('*[data-product-json]').html());\n\n          \n          var metafields = productObject.metafields.filter(x => x.sku == newVariant.sku)[0];\n                          \n         var vendorObject =  $(\"#vendorObject\").val()  != null ?  JSON.parse($(\"#vendorObject\").val()) : undefined;\n          \n          if(vendorObject[0] != undefined && vendorObject[0].name != undefined){ \n            for(let i = 0; i < vendorObject[0].name.length; i++){             \n                if(productObject.product.vendor == vendorObject[0].name[i] && $(\"#customer-email\").val() == \"\"){\n                  hidePrice = true;\n                }              \n              }\n          }\n          \n          //Sale Chips         \n          if(hidePrice == false){  \n            if(newVariant.compare_at_price > newVariant.price){\n                var salesChips = Math.round((newVariant.compare_at_price - newVariant.price) * 100.0 / newVariant.compare_at_price);\n                if(salesChips != undefined && salesChips > 0){\n                     if($(\"#sale-flag > span.content\").html() != undefined){\n                       if($(\"#sale-flag\").css(\"display\") == \"none\"){\n                         $(\"#sale-flag\").remove();\n                         $('<li id=\"sale-flag\" class=\"flag yellow\"><span class=\"title\">Sale</span><span class=\"content\">'+salesChips+' % off</span></li>').insertAfter('.various__information>li:last');                            \n                       }\n                       else{\n                         $(\"#sale-flag > span.content\").html(salesChips +\"% off\");\n                       }\n                     }\n                    else{\n                      $('<li id=\"sale-flag\" class=\"flag yellow\"><span class=\"title\">Sale</span><span class=\"content\">'+salesChips+' % off</span></li>').insertBefore('.various__information>li:last');                         \n                    }                  \n                }\n            }\n           }else{\n            $(\".price--exclusive\").hide();\n          }\n          \n            //OnlineExclusive Chip\n            if (metafields.OnlineExclusive != \"\" && metafields.OnlineExclusive != undefined) {\n                if ($(\".onlineExclusive\").html() != undefined) {\n                    $(\".onlineExclusive\").show();\n                } else {\n                    $('<li class=\"flag blue onlineExclusive\">Online Exclusive Price</li>').insertAfter('.various__information>li:last');\n                }\n            } else {\n                $(\".onlineExclusive\").hide();\n            }\n            \n            //Clearance Chip\n            if (metafields.Clearance != \"\" && metafields.Clearance != undefined) {\n            \n                if ($(\"#clearance_chip\").html() != undefined) {\n                    $(\"#clearance_chip\").show();\n                } else {\n                    $(' <li id=\"clearance_chip\" class=\"flag blue\">Clearance - Final Sale</li> ').insertAfter('.various__information>li:last');\n                }\n            \n            } else {\n                $(\"#clearance_chip\").hide();\n            }\n\n          \n\n            const productTags = window.productInfo.product.tags;\n\n            const nonrefundableTags = [\n              \"category:Bathroom Safety\",\n              \"category:Compression\",\n              \"category:Ostomy\",\n              \"category:CPAP\",\n              \"category:Incontinence\",\n              \"category:Braces & Supports\",\n              \"subcategory:Commodes\",\n              \"subcategory:Bathroom Chairs\",\n              \"subcategory:Bathroom Accessories\",\n              \"subcategory:TENS\",\n              \"subcategory:Pillows\",\n              \"subcategory:Blood Pressure Monitor\",\n              \"subcategory:Blood Pressure Monitors\",\n              \"subcategory:Raised Toilet Seats\",\n              \"subcategory:Grab Bars\",\n              \"subcategory:Bedroom Accessories\",\n              \"subcategory:Heating Pads\",\n              \"subcategory:Hot & Cold Therapy\",\n              \"subcategory:Ultrasound Therapy\",\n              \"subcategory:Massage Therapy\"\n            ];\n\n            const found = nonrefundableTags.some(tag => productTags.includes(tag));\n\n            //Non Refundable Chip\n            if ((metafields.Clearance != \"\" && metafields.Clearance != undefined) || found==true) {\n          \n              if ($(\"#nonRefundable_chip\").html() != undefined) {\n                  $(\"#nonRefundable_chip\").show();\n              } else {\n                  $('<li id=\"nonRefundable_chip\" class=\"flag wwblue_inverse\">Non-Refundable</li> ').insertAfter('.various__information>li:last');\n              }\n          \n            } else if (found == false) {\n              $(\"#nonRefundable_chip\").hide();\n            }\n\n          var variantShortDescription = $(\"#shortdescription-\"+ newVariant.sku).html(); \n          var variantLongDescription = $(\"#description-\"+ newVariant.sku).html();    \n          var originalShortDescrition = $(\"#hdnDescriptionTag\").html(); \n            \n          //Short Description\n          if(variantShortDescription != \"\" && variantShortDescription != undefined && variantShortDescription != originalShortDescrition){  \n            $(\".description2 > div\").html(variantShortDescription);\n          }\n         \n          //Long Description                    \n          if(variantLongDescription != \"\" && variantLongDescription != undefined && variantLongDescription != productObject.product.description){  \n            $(\"#longdescript\").html(variantLongDescription);\n          }\n          else{\n              $(\"#longdescript\").html(productObject.product.description);\n          }\n         \n          //Promo Tag\n          if(metafields.Promo != \"\" && metafields.Promo != undefined){            \n            //Promo:PROMO##Buy 1 Get 1 Test - USE CODE Boost##\n            var promoFlag = metafields.Promo.split(\"##\")[0].split(\":\")[1];\n            var promoText = metafields.Promo.split(\"##\")[1];\n\n            if($(\".flag.yellow\").not('[id~=\"sale-flag\"]').html() != undefined){\n              $(\".flag.yellow\").not('[id~=\"sale-flag\"]').find(\"span:nth-child(1)\").html(promoFlag);\n              $(\".flag.yellow\").not('[id~=\"sale-flag\"]').find(\"span:nth-child(2)\").html(promoText);\n            }\n            else{\n              $(\".various__information\").append('<li class=\"flag yellow\"><span class=\"title\">'+promoFlag+'</span><span>'+promoText+'</span></li>')\n            }\n          }\n          else{\n             $(\".flag.yellow\").not('[id~=\"sale-flag\"]').remove();\n          }\n\n            if(metafields.SpecificationsTable != \"\" && metafields.SpecificationsTable != undefined){ \n                $(\".productSpecifications\").show();\n\n              if($(\"#ProductSpecifications\").html() != undefined && $(\"#ProductSpecifications\").html().length > 0){\n                $(\"#ProductSpecifications\").remove();\n              }\n              \n              var specs = metafields.SpecificationsTable.split(\"|\");\n              var listInfo = \"\";\n              \n                for (let index = 0; index < specs.length ; index++) {\n                   var specsInfo = specs[index].split(\":\");\n\n                  if(specsInfo != \"\"){\n\n                    listInfo += \" <li class='ul__specifications__item'><strong class='ul__specifications__item__title'>\"+ specsInfo[0] +\"</strong><span class='ul__specifications__item__text'>\"+ specsInfo[1] +\"</span></li>\";\n                    \n                  }\n                }\n              \n              $(\".product__accordion\").last().append(\"<article id='ProductSpecifications' class='accordionOpen' style='height:auto'><button type='button' class='product__accordion__link__spec' aria-label='Hide/Show Accordion content'><span class='product__accordion__icon'><svg xmlns='http://www.w3.org/2000/svg' width='42' height='42' viewBox='0 0 42 42' fill='none'><path d='M26.575 7H34V39.5H7V7H14.425' stroke='#307FE2' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/><path d='M14.8957 8.3125L15.7082 3.4375H26.2918L27.1043 8.3125H14.8957Z' stroke='#307FE2' stroke-width='3'/><rect x='11.9844' y='13.9844' width='1.96875' height='1.96875' stroke='#307FE2' stroke-width='1.96875'/><rect x='11.9844' y='21.9844' width='1.96875' height='1.96875' stroke='#307FE2' stroke-width='1.96875'/><rect x='11.9844' y='29.9844' width='1.96875' height='1.96875' stroke='#307FE2' stroke-width='1.96875'/><path d='M17 15L30 15' stroke='#307FE2' stroke-width='3'/><path d='M17 23L30 23' stroke='#307FE2' stroke-width='3'/><path d='M17 31L30 31' stroke='#307FE2' stroke-width='3'/></svg></span><span class='product__accordion__text'>Product specifications</span><span class='product__accordion__open' title='Hide/Show Accordion content'></span></button><div class='product__accordion__content'><ul class='ul__specifications'>\"+ listInfo +\"</ul></div></article>\")\n\n                $(\".product__accordion__link__spec\").click(function () {\n     \n                      articleHeight = 170;\n                      contentHeight = Math.round(\n                        $(\"#ProductSpecifications\").find(\".product__accordion__content\").height()\n                      );\n              \n                      $(\"#ProductSpecifications\").toggleClass(\"accordionOpen\");\n              \n                      if ($(\"#ProductSpecifications\").hasClass(\"accordionOpen\")) {\n                        $(\"#ProductSpecifications\").css(\"height\", parseInt(articleHeight + contentHeight + 50) + \"px\");          \n                        $(\"#ProductSpecifications > button > span.product__accordion__open\").css(\"transform\",\"rotate(45deg)\")\n                      } else {\n                        $(\"#ProductSpecifications\").css(\"height\", articleHeight);\n                        $(\"#ProductSpecifications > button > span.product__accordion__open\").css(\"transform\",\"rotate(0deg)\")\n                      }     \n               \n                });\n            }\n          else{\n\n            $(\".productSpecifications\").hide();\n            \n           if($(\"#ProductSpecifications\").html() != undefined && $(\"#ProductSpecifications\").html().length > 0){\n                $(\"#ProductSpecifications\").remove();\n              }\n          }\n\n\n          //Volume Pricing update\n          if(productObject.pricebreaks && newVariant.sku != undefined){                    \n            var volume_pricing = Object.values(productObject.pricebreaks[newVariant.sku]);             \n            var currentPrice = \"\";\n            \n            if(volume_pricing.length > 0){\n              var variantPrice = newVariant.price / 100;\n              variantPrice = variantPrice.toLocaleString('en-CA', {\n                                                                            style: 'currency',\n                                                                            currency: 'CAD',\n                                                                            minimumFractionDigits: 2\n                                                                          })\n                var priceBreaks =\"<li><span class='volume-pricing-sp1'>1+</span><span class='volume-pricing-sp2' data-text='at \"+ variantPrice +\" CAD/ea'>\"+ variantPrice +\" CAD/ea</span></li>\";\n                for (let item of volume_pricing) {\n                    priceBreaks += \" <li><span class='volume-pricing-sp1'>\"+item.minimum_quantity+\"+</span><span class='volume-pricing-sp2' data-text='at \"+ item.price_break_price +\"/ea'>\"+ item.price_break_price +\"/ea</span></li>\"\n\n                  if(parseInt($(\"#Quantity-product-template\").val()) >= parseInt(item.minimum_quantity)){\n                      currentPrice = item.price_break_price;\n                  }\n                  else if(parseInt($(\"#Quantity-product-template\").val()) == 1 || (parseInt($(\"#Quantity-product-template\").val()) > parseInt(item.minimum_quantity) && parseInt($(\"#Quantity-product-template\").val()) > 1)){\n                    currentPrice = variantPrice + \" CAD\";\n                  }       \n                  else if(parseInt($(\"#Quantity-product-template\").val()) < parseInt(item.minimum_quantity) && currentPrice == \"\"){\n                     currentPrice = variantPrice + \" CAD\";\n                  }\n                 \n                }\n    \n                 $(\"#Volume-product-template > ul\").remove();\n                 $(\"#Volume-product-template\").show();\n                 $(\"#Volume-product-template\").append(\"<ul>\"+priceBreaks+\"</ul>\")\n\n                 $(\".price-per-item--current\").show();\n                 $(\".price-per-item--current\").html(\"at \"+currentPrice+\"/ea\");\n            }\n            else{\n              $(\"#Volume-product-template\").hide();\n              $(\".price-per-item--current\").hide();\n            }\n          }\n         \n          \n        }\n\t  \n      },\n      {\n        key: \"_updateOptions\",\n        value: function _updateOptions(newVariant, previousVariant, target) {        \n\n          if (newVariant == null) {\n            return;\n          }\n          var _this2 = this;\n          var selected1 = false;\n          var selected2 = false;\n          var selected3 = false;\n          var selected2b = false;\n          var selected3b = false;\n\n          // Based on _updateSelectors (09/2022)\n          // Auto-select first available corresponding option\n          // Mark first options non-corresponding buttons as unavailable\n\n          if (newVariant !== null && newVariant.available) {            \n            this._updateSelectors3(_this2.currentVariant);\n            $(\".product-gallery__image\").attr(\n              \"srcset\",\n              newVariant.featured_image?.src\n            );\n            return;\n          }\n\n          var applyOption = function applyOption(\n            selector,\n            valueIndex,\n            available,\n            level\n          ) {\n            var selectorType = selector.getAttribute(\"data-selector-type\");\n            var newOptionValue = target.getAttribute(\"value\");\n            var newOptionLevel = parseInt(\n              target.getAttribute(\"data-option-position\")\n            );\n            var variantsArray = _this2.productData[\"variants\"];\n            var availableVariants = _this2.productData[\"variants\"].filter(\n              (x) => x.available == true\n            );\n\n            // console.log(previousVariant);\n            // console.log(newOptionValue);\n            // console.log(selector);\n\n            if (newVariant == null || !newVariant.available) {\n              if (level === 1 && newOptionLevel !== 1) {\n                // console.log(\"level 1\");\n                // console.log(available);\n                // console.log(variantsArray)\n\n                if (newOptionLevel === 2) {\n                  // console.log(\"level 1-2\");\n                  if (\n                    variantsArray[valueIndex].option2.replace('\"', '\\\\\"') == newOptionValue &&\n                    !selected1\n                  ) {\n                    // console.log(\"click\");\n                    selector\n                      .querySelector(\n                        \"input[value=\\\"\" +\n                          variantsArray[valueIndex].option1.replace('\"', '\\\\\"') +\n                          \"\\\"]\"\n                      )\n                      .click();\n                    _this2._updateSelectors3(_this2.currentVariant);\n                    selected1 = true;\n                    return;\n                  }\n                }\n\n                if (newOptionLevel === 3) {\n                  // console.log(\"level 1-3\");\n                  if (\n                     variantsArray[valueIndex].option3.replace('\"', '\\\\\"') == newOptionValue &&\n                    !selected1\n                  ) {\n                    // console.log(\"click\");\n                    selector\n                      .querySelector(\n                        \"input[value=\\\"\" +\n                          variantsArray[valueIndex].option1.replace('\"', '\\\\\"') +\n                          \"\\\"]\"\n                      )\n                      .click();\n                    _this2._updateSelectors3(_this2.currentVariant);\n                    selected1 = true;\n                    return;\n                  }\n                }\n              }\n\n              if (level === 2 && newOptionLevel !== 2) {\n                // console.log(\"level 2\");\n                // console.log(available);\n                // console.log(variantsArray)\n\n                if (newOptionLevel === 1) {\n                  // console.log(\"level 2-1\");\n                  if (\n                    variantsArray[valueIndex].option1.replace('\"', '\\\\\"') == newOptionValue &&\n                    !selected2\n                  ) {\n                    // console.log(\"click\");\n                    selector\n                      .querySelector(\n                        \"input[value=\\\"\" +\n                          variantsArray[valueIndex].option2.replace('\"', '\\\\\"') +\n                          \"\\\"]\"\n                      )\n                      .click();\n                    _this2._updateSelectors3(_this2.currentVariant);\n                    selected2 = true;\n                    return;\n                  }\n                }\n\n                if (newOptionLevel === 3) {\n                  // console.log(\"level 2-3\");\n                  if (\n                     variantsArray[valueIndex].option3.replace('\"', '\\\\\"') == newOptionValue &&\n                    !selected2\n                  ) {\n                    // console.log(\"click\");\n                    selector\n                      .querySelector(\n                        \"input[value=\\\"\" +\n                          variantsArray[valueIndex].option2.replace('\"', '\\\\\"') +\n                          \"\\\"]\"\n                      )\n                      .click();\n                    _this2._updateSelectors3(_this2.currentVariant);\n                    selected2 = true;\n                    return;\n                  }\n                }\n              }\n\n              if (level === 3 && newOptionLevel !== 3) {\n                // console.log(\"level 3\");\n                // console.log(available);\n                // console.log(variantsArray)\n\n                if (newOptionLevel === 1) {\n                  // console.log(\"level 3-1\");\n                  if (\n                    variantsArray[valueIndex].option1.replace('\"', '\\\\\"') == newOptionValue &&\n                    !selected3 &&\n                    variantsArray[valueIndex].available\n                  ) {\n                    // console.log(\"click\");\n                    selector\n                      .querySelector(\n                        \"input[value=\\\"\" +\n                           variantsArray[valueIndex].option3.replace('\"', '\\\\\"') +\n                          \"\\\"]\"\n                      )\n                      .click();\n                    _this2._updateSelectors3(_this2.currentVariant);\n                    selected3 = true;\n                    return;\n                  }\n                }\n\n                if (newOptionLevel === 2) {\n                  // console.log(\"level 3-2\");\n                  if (\n                    variantsArray[valueIndex].option2.replace('\"', '\\\\\"') == newOptionValue &&\n                    !selected3 &&\n                    variantsArray[valueIndex].available\n                  ) {\n                    // console.log(\"click\");\n                    selector\n                      .querySelector(\n                        \"input[value=\\\"\" +\n                           variantsArray[valueIndex].option3.replace('\"', '\\\\\"') +\n                          \"\\\"]\"\n                      )\n                      .click();\n                    _this2._updateSelectors3(_this2.currentVariant);\n                    selected3 = true;\n                    return;\n                  }\n                }\n              }\n            }\n\n            // console.log(2, newOptionValue);\n            // console.log(2, selector);\n            // console.log(2, selector.querySelector(\"input[value=\\\"\" + newOptionValue + \"\\\"]\"));\n\n            if (level === 2 && newOptionLevel === 2 && !selected2b) {\n              // console.log(2, \"click\");\n              selector.querySelector(\n                \"input[value=\\\"\" + newOptionValue + \"\\\"]\"\n              ).checked = true; // re-instate the third variant\n              _this2._updateSelectors3(_this2.currentVariant);\n              selected2b = true;\n              return;\n            }\n\n            if (level === 3 && newOptionLevel === 3 && !selected3b) {\n              // console.log(3, \"click\");\n              selector.querySelector(\n                \"input[value=\\\"\" + newOptionValue + \"\\\"]\"\n              ).checked = true; // re-instate the third variant\n              _this2._updateSelectors3(_this2.currentVariant);\n              selected3b = true;\n              return;\n            }\n          };\n\n          if (this.variantSelectors && this.variantSelectors[0]) {\n            // For the first option, the value is considered available if there is at least one variant available\n            _this2.productData[\"variants\"].forEach(function (\n              value,\n              valueIndex\n            ) {\n              applyOption(\n                _this2.variantSelectors[0],\n                valueIndex,\n                availableVariants.some(function (variant) {\n                  return (\n                    variant[\"option1\"] === value.option1 && variant[\"available\"]\n                  );\n                }),\n                1\n              );\n            });\n          }\n\n          // We now do the second level\n          if (this.variantSelectors && _this2.variantSelectors[1]) {\n            _this2.productData[\"variants\"].forEach(function (\n              value,\n              valueIndex\n            ) {\n              applyOption(\n                _this2.variantSelectors[1],\n                valueIndex,\n                availableVariants.some(function (variant) {\n                  return (\n                    variant[\"option2\"] === value.option2 &&\n                    variant[\"option1\"] === _this2.option1 &&\n                    variant[\"available\"]\n                  );\n                }),\n                2\n              );\n            });\n          }\n              console.log(_this2.variantSelectors[2]);\n\n          // And finally the third level\n          if (this.variantSelectors && _this2.variantSelectors[2]) {\n            _this2.productData[\"variants\"].forEach(function (\n              value,\n              valueIndex\n            ) {\n              console.log(_this2.variantSelectors[2]);\n              applyOption(\n                _this2.variantSelectors[2],\n                valueIndex,\n                availableVariants.some(function (variant) {\n                  return (\n                    variant[\"option3\"] === value.option3 &&\n                    variant[\"option1\"] === _this2.option1 &&\n                    variant[\"option2\"] === _this2.option2 &&\n                    variant[\"available\"]\n                  );\n                }),\n                3\n              );\n            });\n          }\n        },\n      },\n      {\n        key: \"_updateSelectors2\",\n        value: function _updateSelectors2(newVariant) {\n          var _this2 = this;\n\n          // Based on _updateOptions (09/2022)\n          // Mark first options non-corresponding buttons as unavailable\n\n          var variantsArray = _this2.productData[\"variants\"];\n          var variant1 = \"\";\n          var variant2 = \"\";\n          var variant3 = [];\n\n          // console.log(variantsArray)\n          // console.log(newVariant)\n\n          var updateSelectors2 = function updateSelectors2(\n            selector,\n            valueIndex,\n            available,\n            level\n          ) {\n            var selectorType = selector.getAttribute(\"data-selector-type\");\n\n            // console.log(variantsArray[valueIndex].option1.replace('\"', '\\\\\"'))\n            // console.log(variantsArray[valueIndex].option2)\n            // console.log( variantsArray[valueIndex].option3.replace('\"', '\\\\\"'))\n\n            var option1 =  variantsArray[valueIndex].option1 != null ? variantsArray[valueIndex].option1.replace('\"', '\\\\\"') : null;\n            var option2 =  variantsArray[valueIndex].option2 != null ? variantsArray[valueIndex].option2.replace('\"', '\\\\\"') : null;\n            var option3 =  variantsArray[valueIndex].option3 != null ? variantsArray[valueIndex].option3.replace('\"', '\\\\\"') : null;\n            \n            console.log(\"LEVEL: \", level);           \n        \n              if( selector.querySelector(\"input[value=\\\"\" +  option1 + \"\\\"]\") == null || \n                  selector.querySelector(\"input[value=\\\"\" +  option2 + \"\\\"]\") == null ||\n                  selector.querySelector(\"input[value=\\\"\" +  option3 + \"\\\"]\") == null )\n                return;\n\n            if (level === 1) {\n              if (\n                variantsArray[valueIndex].option2.replace('\"', '\\\\\"') != newVariant.option2 &&\n                variantsArray[valueIndex].option1.replace('\"', '\\\\\"') != variant1\n              ) {                \n                  selector.querySelector(\"input[value=\\\"\" +  + \"\\\"]\").parentElement.classList.add(selectorType + \"-swatch--disabled\");                \n                                                                                                        \n                return;\n              } else if (\n                variantsArray[valueIndex].option2.replace('\"', '\\\\\"') == newVariant.option2\n              ) {                \n                  selector.querySelector(\"input[value=\\\"\" + variantsArray[valueIndex].option1.replace('\"', '\\\\\"') + \"\\\"]\").parentElement.classList.remove(selectorType + \"-swatch--disabled\");                              \n              }\n\n              if (\n                 variantsArray[valueIndex].option3.replace('\"', '\\\\\"') != newVariant.option3 &&\n                variantsArray[valueIndex].option1.replace('\"', '\\\\\"') != variant1\n              ) {                \n                  selector.querySelector(\"input[value=\\\"\" + variantsArray[valueIndex].option1.replace('\"', '\\\\\"') + \"\\\"]\").parentElement.classList.add(selectorType + \"-swatch--disabled\");                \n                \n              } else if (\n                 variantsArray[valueIndex].option3.replace('\"', '\\\\\"') == newVariant.option3\n              ) {              \n                  selector.querySelector(\"input[value=\\\"\" + variantsArray[valueIndex].option1.replace('\"', '\\\\\"') + \"\\\"]\").parentElement.classList.remove(selectorType + \"-swatch--disabled\");                                   \n              }\n\n              /*if (!available) {\n              selector.querySelector(\"input[value='\" + variantsArray[valueIndex].option1.replace('\"', '\\\\\"') + \"']\").parentElement.style.display = \"none\";\n            } */\n\n              variant1 = variantsArray[valueIndex].option1.replace('\"', '\\\\\"');\n\n              /*if (!available) {\n              selector.querySelector(\"input[value='\" + variantsArray[valueIndex].option1.replace('\"', '\\\\\"') + \"']\").parentElement.classList.add(selectorType + \"-swatch--disabled\");\n            } \n            else{\n              selector.querySelector(\"input[value='\" + variantsArray[valueIndex].option1.replace('\"', '\\\\\"') + \"']\").parentElement.classList.remove(selectorType + \"-swatch--disabled\");\n            }*/\n            }\n\n            if (level === 2) {\n              console.log(\"ERIK-VINI\");\n              if( selector.querySelector(\"input[value=\\\"\" + option1 + \"\\\"]\") == null ||\n                  selector.querySelector(\"input[value=\\\"\" + option2 + \"\\\"]\") == null ||\n                  selector.querySelector(\"input[value=\\\"\" + option3 + \"\\\"]\") == null )\n                return;\n              \n              if (variantsArray[valueIndex].options.length < 3) {\n                if (\n                  variantsArray[valueIndex].option2.replace('\"', '\\\\\"') != newVariant.option2 &&\n                  variantsArray[valueIndex].option1.replace('\"', '\\\\\"') != variant1\n                  \n                ) {\n                  selector.querySelector(\"input[value=\\\"\" + variantsArray[valueIndex].option1.replace('\"', '\\\\\"') + \"\\\"]\").parentElement.classList.add(selectorType + \"-swatch--disabled\");\n                  \n                  return;\n                } else if (\n                  variantsArray[valueIndex].option2.replace('\"', '\\\\\"') == newVariant.option2\n                ) {\n                  selector.querySelector(\"input[value=\\\"\" + variantsArray[valueIndex].option1.replace('\"', '\\\\\"') + \"\\\"]\").parentElement.classList.remove(selectorType + \"-swatch--disabled\");\n                }\n              }\n\n              if (variantsArray[valueIndex].option2 != newVariant.option2) {\n                selector.querySelector(\"input[value=\\\"\" + variantsArray[valueIndex].option2.replace('\"', '\\\\\"') + \"\\\"]\").parentElement.classList.add(selectorType + \"-swatch--disabled\");\n                return;\n              } else if (\n                variantsArray[valueIndex].option2.replace('\"', '\\\\\"') == newVariant.option2\n              ) {\n                 selector.querySelector(\"input[value=\\\"\" + variantsArray[valueIndex].option2.replace('\"', '\\\\\"') + \"\\\"]\").parentElement.classList.add(selectorType + \"-swatch--disabled\");\n              }\n\n              if ( variantsArray[valueIndex].option3.replace('\"', '\\\\\"') != newVariant.option3) {\n                 selector.querySelector(\"input[value=\\\"\" +  variantsArray[valueIndex].option3.replace('\"', '\\\\\"') + \"\\\"]\").parentElement.classList.add(selectorType + \"-swatch--disabled\");\n              } else if (\n                 variantsArray[valueIndex].option3.replace('\"', '\\\\\"') == newVariant.option3\n              ) {\n                selector.querySelector(\"input[value=\\\"\" +  variantsArray[valueIndex].option3.replace('\"', '\\\\\"') + \"\\\"]\").parentElement.classList.add(selectorType + \"-swatch--disabled\");\n              }\n\n              /*if (!available) {\n              selector.querySelector(\"input[value='\" + variantsArray[valueIndex].option2.replace('\"', '\\\\\"') + \"']\").parentElement.classList.add(selectorType + \"-swatch--disabled\");\n            } \n            else{\n              selector.querySelector(\"input[value='\" + variantsArray[valueIndex].option2.replace('\"', '\\\\\"') + \"']\").parentElement.classList.remove(selectorType + \"-swatch--disabled\");\n            }*/\n\n              //variant2 = variantsArray[valueIndex].option2.replace('\"', '\\\\\"');\n            }\n\n            if (level === 3) {\n              const variantBool = variant3.find(\n                (el) => el ===  variantsArray[valueIndex].option3.replace('\"', '\\\\\"')\n              );\n              // console.log(variantBool)\n\n              if (\n                variantsArray[valueIndex].option1.replace('\"', '\\\\\"') != newVariant.option1 &&\n                variantsArray[valueIndex].option2.replace('\"', '\\\\\"') != newVariant.option2\n              ) {\n                return;\n              }\n\n              if (\n                variantsArray[valueIndex].option1.replace('\"', '\\\\\"') == newVariant.option1 &&\n                variantsArray[valueIndex].option2.replace('\"', '\\\\\"') == newVariant.option2 &&\n                variantsArray[valueIndex].available\n              ) {\n                 selector.querySelector(\"input[value=\\\"\" +  variantsArray[valueIndex].option3.replace('\"', '\\\\\"') + \"\\\"]\").parentElement.classList.add(selectorType + \"-swatch--disabled\");\n                variant3.push( variantsArray[valueIndex].option3.replace('\"', '\\\\\"'));\n              } else if (variantBool == undefined) {\n               selector.querySelector(\"input[value=\\\"\" +  variantsArray[valueIndex].option3.replace('\"', '\\\\\"') + \"\\\"]\").parentElement.classList.add(selectorType + \"-swatch--disabled\");\n              }\n\n              /*if (!available) {\n              selector.querySelector(\"input[value='\" +  variantsArray[valueIndex].option3.replace('\"', '\\\\\"') + \"']\").parentElement.style.display = \"none\";\n            }*/\n\n              /*  if (!available) {\n              selector.querySelector(\"input[value='\" +  variantsArray[valueIndex].option3.replace('\"', '\\\\\"') + \"']\").parentElement.classList.add(selectorType + \"-swatch--disabled\");\n            } \n            else{\n              selector.querySelector(\"input[value='\" +  variantsArray[valueIndex].option3.replace('\"', '\\\\\"') + \"']\").parentElement.classList.remove(selectorType + \"-swatch--disabled\");\n            }*/\n\n              // console.log(variant3)\n            }\n          };\n\n          if (this.variantSelectors && this.variantSelectors[0]) {\n            // For the first option, the value is considered available if there is at least one variant available\n            variantsArray.forEach(function (value, valueIndex) {\n              updateSelectors2(\n                _this2.variantSelectors[0],\n                valueIndex,\n                _this2.productData[\"variants\"].some(function (variant) {\n                  return variant[\"available\"];\n                }),\n                1\n              );\n            });\n          }\n\n          // We now do the second level\n          if (this.variantSelectors && this.variantSelectors[1]) {\n            variantsArray.forEach(function (value, valueIndex) {\n              updateSelectors2(\n                _this2.variantSelectors[1],\n                valueIndex,\n                _this2.productData[\"variants\"].some(function (variant) {\n                  return variant[\"available\"];\n                }),\n                2\n              );\n            });\n          }\n\n          // And finally the third level\n          if (this.variantSelectors && this.variantSelectors[2]) {\n            variantsArray.forEach(function (value, valueIndex) {\n              updateSelectors2(\n                _this2.variantSelectors[2],\n                valueIndex,\n                _this2.productData[\"variants\"].some(function (variant) {\n                  return variant[\"available\"];\n                }),\n                3\n              );\n            });\n          }\n        },\n      },\n      {\n        key: \"_updateSelectors3\",\n        value: function _updateSelectors3(newVariant) {\n          var _this2 = this;\n\n          // Based on _updateOptions (09/2022)\n          // Mark first options non-corresponding buttons as unavailable\n\n          // console.log(newVariant)\n\n          if (newVariant == null) {\n            return;\n          }\n\n          var variantsArray = _this2.productData[\"variants\"];\n          // console.log(variantsArray);\n          var variant = \"\";\n          var selected1 = false;\n          var selected2 = [];\n          var selected3 = [];\n  console.log(\"updateSelectors3\")\n          var updateSelectors3 = function updateSelectors3(\n            selector,\n            valueIndex,\n            available,\n            level\n          ) {\n            var selectorType = selector.getAttribute(\"data-selector-type\");\n\n            // console.log(variantsArray[valueIndex].option1.replace('\"', '\\\\\"'))\n            // console.log(variantsArray[valueIndex].option2)\n            // console.log( variantsArray[valueIndex].option3.replace('\"', '\\\\\"'))\n            // console.log(selector)\n\n            if (level === 1) {\n              // console.log(variantsArray[valueIndex].option1.replace('\"', '\\\\\"'));\n              /*\n            if (variantsArray[valueIndex].option1.replace('\"', '\\\\\"') != newVariant.option1) {\n              selector.querySelector(\"input[value='\" + variantsArray[valueIndex].option1.replace('\"', '\\\\\"') + \"']\").parentElement.classList.add(selectorType + \"-swatch--disabled\");\n            }\n            if (variantsArray[valueIndex].option1.replace('\"', '\\\\\"') == newVariant.option1) {\n              selector.querySelector(\"input[value='\" + variantsArray[valueIndex].option1.replace('\"', '\\\\\"') + \"']\").parentElement.classList.remove(selectorType + \"-swatch--disabled\");\n              selected1 = true;\n            }\n            */\n            }\n\n             // CHANGES REFERENCE: TASK 30546 - DANIEL FRANCO\n            if (level === 2) {\n              // console.log(variantsArray[valueIndex].option2);\n               const selected2Bool = selected2.find(\n                (el) => el === variantsArray[valueIndex].option2.replace('\"', '\\\\\"')\n              );\n              \n              if (variantsArray[valueIndex].option1.replace('\"', '\\\\\"') != newVariant.option1){\n                return;\n              }\n\n               if (\n                variantsArray[valueIndex].option1.replace('\"', '\\\\\"') == newVariant.option1 &&\n                variantsArray[valueIndex].available\n              ) {\n                 selector\n                  .querySelector(\n                    \"input[value=\\\"\" + variantsArray[valueIndex].option2.replace('\"', '\\\\\"')  + \"\\\"]\"\n                  )\n                  .parentElement.classList.remove(\n                    selectorType + \"-swatch--disabled\"\n                  );\n                selector\n                  .querySelector(\n                    \"input[value=\\\"\" + variantsArray[valueIndex].option2.replace('\"', '\\\\\"')  + \"\\\"]\"\n                  )\n                  .removeAttribute(\"disabled\");\n                selected2.push(variantsArray[valueIndex].option2);\n               } else if (\n                variantsArray[valueIndex].option1.replace('\"', '\\\\\"') == newVariant.option1 &&\n                !variantsArray[valueIndex].available && !selected2Bool\n              ) {\n                selector\n                  .querySelector(\n                    \"input[value=\\\"\" + variantsArray[valueIndex].option2.replace('\"', '\\\\\"') + \"\\\"]\"\n                  )\n                  .parentElement.classList.add(\n                    selectorType + \"-swatch--disabled\"\n                  );\n                selector\n                  .querySelector(\n                    \"input[value=\\\"\" + variantsArray[valueIndex].option2.replace('\"', '\\\\\"') + \"\\\"]\"\n                  )\n                  .setAttribute(\"disabled\", \"disabled\");\n              } else if (selected2Bool == undefined) {\n                selector\n                  .querySelector(\n                    \"input[value=\\\"\" + variantsArray[valueIndex].option2.replace('\"', '\\\\\"') + \"\\\"]\"\n                  )\n                  .parentElement.classList.add(\n                    selectorType + \"-swatch--disabled\"\n                  );\n              }\n            }\n\n            if (level === 3) {\n              // console.log( variantsArray[valueIndex].option3.replace('\"', '\\\\\"'));\n              const selected3Bool = selected3.find(\n                (el) => el ===  variantsArray[valueIndex].option3.replace('\"', '\\\\\"')\n              );\n\n              if (\n                variantsArray[valueIndex].option1.replace('\"', '\\\\\"') != newVariant.option1 &&\n                variantsArray[valueIndex].option2.replace('\"', '\\\\\"') != newVariant.option2\n              ) {\n                return;\n              }\n\n              if (\n                variantsArray[valueIndex].option1.replace('\"', '\\\\\"') == newVariant.option1 &&\n                variantsArray[valueIndex].option2.replace('\"', '\\\\\"') == newVariant.option2 &&\n                variantsArray[valueIndex].available\n              ) {\n                selector\n                  .querySelector(\n                    \"input[value=\\\"\" +  variantsArray[valueIndex].option3.replace('\"', '\\\\\"') + \"\\\"]\"\n                  )\n                  .parentElement.classList.remove(\n                    selectorType + \"-swatch--disabled\"\n                  );\n                selector\n                  .querySelector(\n                    \"input[value=\\\"\" +  variantsArray[valueIndex].option3.replace('\"', '\\\\\"') + \"\\\"]\"\n                  )\n                  .removeAttribute(\"disabled\");\n                selected3.push( variantsArray[valueIndex].option3.replace('\"', '\\\\\"'));\n              } else if (\n                variantsArray[valueIndex].option1.replace('\"', '\\\\\"') == newVariant.option1 &&\n                variantsArray[valueIndex].option2.replace('\"', '\\\\\"') == newVariant.option2 &&\n                !variantsArray[valueIndex].available\n              ) {\n                selector\n                  .querySelector(\n                    \"input[value=\\\"\" +  variantsArray[valueIndex].option3.replace('\"', '\\\\\"') + \"\\\"]\"\n                  )\n                  .parentElement.classList.add(\n                    selectorType + \"-swatch--disabled\"\n                  );\n                selector\n                  .querySelector(\n                    \"input[value=\\\"\" +  variantsArray[valueIndex].option3.replace('\"', '\\\\\"') + \"\\\"]\"\n                  )\n                  .setAttribute(\"disabled\", \"disabled\");\n              } else if (selected3Bool == undefined) {\n                selector\n                  .querySelector(\n                    \"input[value=\\\"\" +  variantsArray[valueIndex].option3.replace('\"', '\\\\\"') + \"\\\"]\"\n                  )\n                  .parentElement.classList.add(\n                    selectorType + \"-swatch--disabled\"\n                  );\n              }\n              // console.log(selected3Bool);\n              // console.log(selected3);\n            }\n          };\n\n          if (this.variantSelectors && this.variantSelectors[0]) {\n            // For the first option, the value is considered available if there is at least one variant available\n            variantsArray.forEach(function (value, valueIndex) {\n              updateSelectors3(\n                _this2.variantSelectors[0],\n                valueIndex,\n                _this2.productData[\"variants\"].some(function (variant) {\n                  return variant[\"available\"];\n                }),\n                1\n              );\n            });\n          }\n\n          // We now do the second level\n          if (this.variantSelectors && this.variantSelectors[1]) {\n            variantsArray.forEach(function (value, valueIndex) {\n              updateSelectors3(\n                _this2.variantSelectors[1],\n                valueIndex,\n                _this2.productData[\"variants\"].some(function (variant) {\n                  return variant[\"available\"];\n                }),\n                2\n              );\n            });\n          }\n\n          // And finally the third level\n          if (this.variantSelectors && this.variantSelectors[2]) {\n            variantsArray.forEach(function (value, valueIndex) {\n              updateSelectors3(\n                _this2.variantSelectors[2],\n                valueIndex,\n                _this2.productData[\"variants\"].some(function (variant) {\n                  return variant[\"available\"];\n                }),\n                3\n              );\n            });\n          }\n        },\n      },\n      {\n        key: \"_updateSelectors\",\n        value: function _updateSelectors(newVariant) {\n          var _this2 = this;\n\n          // We apply a top-down approach where we first check the first option, second option and third option. If there is\n          // more than one option, the value is considered \"available\" if there is at least one variant with this value\n          // available (independently of the selected variant)\n          var applyClassToSelector = function applyClassToSelector(\n            selector,\n            valueIndex,\n            available\n          ) {\n            var selectorType = selector.getAttribute(\"data-selector-type\");\n\n            switch (selectorType) {\n              case \"color\":\n                selector\n                  .querySelector(\n                    \".color-swatch:nth-child(\".concat(valueIndex + 1, \")\")\n                  )\n                  .classList.toggle(\"color-swatch--disabled\", !available);\n                break;\n\n              case \"variant\":\n                selector\n                  .querySelector(\n                    \".variant-swatch:nth-child(\".concat(valueIndex + 1, \")\")\n                  )\n                  .classList.toggle(\"variant-swatch--disabled\", !available);\n                break;\n\n              case \"block\":\n                selector\n                  .querySelector(\n                    \".block-swatch:nth-child(\".concat(valueIndex + 1, \")\")\n                  )\n                  .classList.toggle(\"block-swatch--disabled\", !available);\n                break;\n            }\n          };\n\n          if (this.variantSelectors && this.variantSelectors[0]) {\n            // For the first option, the value is considered available if there is at least one variant available\n            this.productOptionsWithValues[0][\"values\"].forEach(function (\n              value,\n              valueIndex\n            ) {\n              applyClassToSelector(\n                _this2.variantSelectors[0],\n                valueIndex,\n                _this2.productData[\"variants\"].some(function (variant) {\n                  return variant[\"option1\"] === value && variant[\"available\"];\n                })\n              ); // We now do the second level\n\n              if (_this2.variantSelectors[1]) {\n                _this2.productOptionsWithValues[1][\"values\"].forEach(function (\n                  value,\n                  valueIndex\n                ) {\n                  applyClassToSelector(\n                    _this2.variantSelectors[1],\n                    valueIndex,\n                    _this2.productData[\"variants\"].some(function (variant) {\n                      return (\n                        variant[\"option2\"] === value &&\n                        variant[\"option1\"] === _this2.option1 &&\n                        variant[\"available\"]\n                      );\n                    })\n                  ); // And finally the third level\n\n                  if (_this2.variantSelectors[2]) {\n                    _this2.productOptionsWithValues[2][\"values\"].forEach(\n                      function (value, valueIndex) {\n                        applyClassToSelector(\n                          _this2.variantSelectors[2],\n                          valueIndex,\n                          _this2.productData[\"variants\"].some(function (\n                            variant\n                          ) {\n                            return (\n                              variant[\"option3\"] === value &&\n                              variant[\"option1\"] === _this2.option1 &&\n                              variant[\"option2\"] === _this2.option2 &&\n                              variant[\"available\"]\n                            );\n                          })\n                        );\n                      }\n                    );\n                  }\n                });\n              }\n            });\n          }\n        },\n        /**\n         * Update the add to cart\n         */\n      },\n      {\n        key: \"_updateAddToCartButton\",\n        value: function _updateAddToCartButton(newVariant) {\n          var addToCartButtonElement = this.element.querySelector(\n              \".product-form__add-button\"\n            ),\n            infoListElement = this.element.querySelector(\n              \".product-form__info-list\"\n            );\n\n          if (!addToCartButtonElement) {\n            return; // Sometimes merchant remove element from the code without taking care of JS... so let's be defensive\n          }\n\n          if (!newVariant) {\n            addToCartButtonElement.setAttribute(\"disabled\", \"disabled\");\n            addToCartButtonElement.classList.add(\"button--disabled\");\n            addToCartButtonElement.classList.remove(\"button--primary\");\n            addToCartButtonElement.removeAttribute(\"data-action\");\n            addToCartButtonElement.innerHTML =\n              window.languages.productFormUnavailable;\n            infoListElement.style.display = \"none\";\n          } else {\n            infoListElement.style.display = \"block\";\n\n            if (newVariant[\"available\"]) {\n              addToCartButtonElement.removeAttribute(\"disabled\");\n              addToCartButtonElement.classList.remove(\"button--disabled\");\n              addToCartButtonElement.classList.add(\"button--primary\");\n              addToCartButtonElement.setAttribute(\"data-action\", \"add-to-cart\");\n              addToCartButtonElement.innerHTML =\n                window.languages.productFormAddToCart;\n            } else {\n              addToCartButtonElement.setAttribute(\"disabled\", \"disabled\");\n              addToCartButtonElement.classList.add(\"button--disabled\");\n              addToCartButtonElement.classList.remove(\"button--primary\");\n              addToCartButtonElement.removeAttribute(\"data-action\");\n              addToCartButtonElement.innerHTML =\n                window.languages.productFormSoldOut;\n            }\n          } // We handle the smart payment button\n\n          if (this.options[\"showPaymentButton\"]) {\n            var paymentButtonElement = this.element.querySelector(\n              \".shopify-payment-button\"\n            );\n\n            if (!paymentButtonElement) {\n              return; // Some apps dynamically remove the dynamic checkout button from the code, so we add a guard here\n            }\n\n            if (!newVariant || !newVariant[\"available\"]) {\n              paymentButtonElement.style.display = \"none\";\n            } else {\n              paymentButtonElement.style.display = \"block\";\n            }\n          }\n        },\n        /**\n         * ---------------------------------------------------------------------------------------------------\n         * INTERNAL CODE THAT HANDLE VARIANT CHANGES\n         * ---------------------------------------------------------------------------------------------------\n         */\n\n        /**\n         * Whenever an option is changed, this code fetch the corresponding active variant\n         */\n      },\n      {\n        key: \"_onOptionChanged\",\n        value: function _onOptionChanged(event, target) {\n          this[\"option\" + target.getAttribute(\"data-option-position\")] =\n            target.value; // We update the selected value\n          var _thisss = this;\n\n          // CHANGES REFERENCE: TASK 30458 - DANIEL FRANCO\n          // Here we check which option has changed (In this case the first variant)\n          setTimeout(function() {\n          if (target.getAttribute(\"data-option-position\") === \"1\") {\n            var found = false;\n            _thisss.productData[\"variants\"].sort(function(a, b) {\n              return a.id - b.id;\n            }).forEach(function (variant) {\n            if (\n              variant[\"option1\"] === _thisss.option1\n              && !found\n            ) {\n              found = true;\n              if (_thisss.variantSelectors && _thisss.variantSelectors[1]) {\n                var options2 = _thisss.variantSelectors[1].querySelectorAll(\".block-swatch:not(.block-swatch--disabled)\");\n                if (options2.length > 0) {\n                  var option2Input = options2[0].querySelector(\"input\");\n                  if (option2Input) {\n                    option2Input.disabled = false;\n                    setTimeout(function() {\n                      option2Input.click();\n                      setTimeout(function() {\n                        if (_thisss.variantSelectors && _thisss.variantSelectors[2]) {\n                          var options3 = _thisss.variantSelectors[2].querySelectorAll(\".block-swatch:not(.block-swatch--disabled)\");\n                          if (options3.length > 0) {\n                            var option3Input = options3[0].querySelector(\"input\");\n                            option3Input.click();\n                          }\n                        }\n                      });\n                    });\n                    \n                    // var options3 = _thisss.productData[\"variants\"].filter(function(v) {\n                    //   return variant[\"option1\"] === v[\"option1\"] && option2Input.value === v[\"option2\"];\n                    // });\n                    // if (options3.length > 0) {\n                    //   var oldOption3 = _thisss[\"option3\"];\n                    //   _thisss[\"option3\"] = options3[0][\"option3\"];\n                    //   if (_thisss.variantSelectors && _thisss.variantSelectors[2]) {\n                    //     _thisss.variantSelectors[2].querySelectorAll(\".block-swatch\").forEach(function(option){\n                    //       var optionsToSelect = option.querySelector('input[value=\"' + _thisss[\"option3\"] + '\"]')\n                    //       var optionsToDeselect = option.querySelector('input[value=\"' + oldOption3 + '\"]')\n                    //       if (optionsToDeselect)\n                    //          optionsToDeselect.checked = false;\n                    //        if (optionsToSelect) {\n                    //          optionsToSelect.checked = true;\n                    //          setTimeout(function() {\n                    //            console.log(\"Select:\", optionsToSelect);\n                    //            optionsToSelect.click();\n                    //          });\n                    //        }\n                    //       })\n                    //   }\n                    // }\n                  }\n                }\n              }\n              // if (variant[\"option2\"]) {\n              //   // Here we apply the first available option for the second variant\n              //   var oldOption2 =  _thisss[\"option2\"];\n              //   _thisss[\"option2\"] = variant[\"option2\"];\n              //   //console.log('Option 2:', variant[\"option2\"]);\n              //   _thisss.variantSelectors[1].querySelectorAll(\".block-swatch\").forEach(function(option){\n              //     var optionsToSelect = option.querySelector('input[value=\"' + variant[\"option2\"] + '\"]')\n              //     var optionsToDeselect = option.querySelector('input[value=\"' + oldOption2 + '\"]')\n              //     if (optionsToDeselect)\n              //      optionsToDeselect.checked = false;\n              //    if (optionsToSelect)\n              //      optionsToSelect.checked = true;\n              //   })\n              // }\n              // if (variant[\"option3\"]) {\n              //   // Here we apply the first available option for the third variant\n              //   var oldOption3 =  _thisss[\"option3\"];\n              //   _thisss[\"option3\"] = variant[\"option3\"];\n              //   //console.log('Option 3:', variant[\"option3\"]);\n              //   _thisss.variantSelectors[2].querySelectorAll(\".block-swatch\").forEach(function(option){\n              //     var optionsToSelect = option.querySelector('input[value=\"' + variant[\"option3\"] + '\"]')\n              //     var optionsToDeselect = option.querySelector('input[value=\"' + oldOption3 + '\"]')\n              //     if (optionsToDeselect)\n              //      optionsToDeselect.checked = false;\n              //    if (optionsToSelect)\n              //      optionsToSelect.checked = true;\n              //   })\n              // }\n            }\n            });\n          }\n          \n          // Here we check which option has changed (In this case the second variant)\n          if (target.getAttribute(\"data-option-position\") === \"2\") {\n            console.log(\"Triggered 2\")\n            var found = false;\n            _thisss.productData[\"variants\"].sort(function(a, b) {\n              return a.id - b.id;\n            }).forEach(function (variant) {\n            if (\n              variant[\"option1\"] === _thisss.option1 &&\n              variant[\"option2\"] === _thisss.option2 && !found\n            ) {\n              //console.log('Variant Data: ', _thisss);\n              //console.log('Option 1:', variant[\"option1\"]);\n              //console.log('Option 2:', variant[\"option2\"]);\n              found = true;\n              if (_thisss.variantSelectors && _thisss.variantSelectors[2]) {\n                var options3 = _thisss.variantSelectors[2].querySelectorAll(\".block-swatch:not(.block-swatch--disabled)\");\n                if (options3.length > 0) {\n                  var option3Input = options3[0].querySelector(\"input\");\n                  if (option3Input) {\n                    _thisss.option3 = option3Input.value;\n                    option3Input.click();\n                    \n                  }\n                }\n              }\n              \n              // if (variant[\"option3\"]) {\n              //   // Here we apply the first available option for the third variant\n              //   var oldOption3 =  _thisss[\"option3\"];\n              //   _thisss[\"option3\"] = variant[\"option3\"];\n              //   //console.log('Option 3:', variant[\"option3\"]);\n              //   if (_thisss.variantSelectors && _thisss.variantSelectors[2]) {\n              //     _thisss.variantSelectors[2].querySelectorAll(\".block-swatch\").forEach(function(option){\n              //       var optionsToSelect = option.querySelector('input[value=\"' + variant[\"option3\"] + '\"]')\n              //       var optionsToDeselect = option.querySelector('input[value=\"' + oldOption3 + '\"]')\n              //       if (optionsToDeselect)\n              //        optionsToDeselect.checked = false;\n              //      if (optionsToSelect)\n              //        optionsToSelect.checked = true;\n              //     })\n              //   }\n              // }\n            }\n            });\n          }\n          });\n          var selectedValueElement = target\n            .closest(\".product-form__option\")\n            .querySelector(\".product-form__selected-value\");\n\n          if (selectedValueElement) {\n            selectedValueElement.innerHTML = target.value;\n          } // Finally, we get the new variant\n\n          var previousVariant = this.currentVariant;\n          this.currentVariant = this._getCurrentVariantFromOptions();\n\n          this._onVariantChanged(previousVariant, this.currentVariant, target);\n\n          if (this.currentVariant) {\n            if (this.options[\"enableHistoryState\"] && history.replaceState) {\n              var newUrl = \"\"\n                .concat(window.location.protocol, \"//\")\n                .concat(window.location.host)\n                .concat(window.location.pathname, \"?variant=\")\n                .concat(this.currentVariant.id);\n              window.history.replaceState(\n                {\n                  path: newUrl,\n                },\n                \"\",\n                newUrl\n              );\n            } // We need to modify the hidden select that contain the id attribute as well\n\n            this.masterSelector\n              .querySelector(\"[selected]\")\n              .removeAttribute(\"selected\");\n            this.masterSelector\n              .querySelector('[value=\"'.concat(this.currentVariant[\"id\"], '\"]'))\n              .setAttribute(\"selected\", \"selected\");\n          }\n          typeof window.BOLD !== \"undefined\" &&\n            typeof window.BOLD.BsubWidget !== \"undefined\" &&\n            BOLD.BsubWidget.renderAllPrices();\n        },\n        /**\n         * Get the active variant based on the options\n         */\n      },\n      {\n        key: \"_getCurrentVariantFromOptions\",\n        value: function _getCurrentVariantFromOptions() {\n          var _this3 = this;\n\n          var found = false;\n          this.productData[\"variants\"].forEach(function (variant) {\n            \n            if (\n              variant[\"option1\"] === _this3.option1 &&\n              variant[\"option2\"] === _this3.option2 &&\n              variant[\"option3\"] === _this3.option3\n            ) {\n              found = variant;\n            }\n          });\n          return found || null;\n        },\n        /**\n         * ---------------------------------------------------------------------------------------------------\n         * INTERNAL CODE THAT HANDLE PRODUCT ADD TO CART\n         * ---------------------------------------------------------------------------------------------------\n         */\n      },\n      {\n        key: \"_addToCart\",\n        value: function _addToCart(event, target) {\n          var _this4 = this;\n\nconsole.log(\"_addToCart\")\n          \n          if (window.theme.cartType === \"page\") {\n            return; // When using a cart type of page, we just simply redirect to the cart page\n          }\n\n          event.preventDefault(); // Prevent form to be submitted\n\n          event.stopPropagation(); // First, we switch the status of the button\n\n          target.setAttribute(\"disabled\", \"disabled\");\n          document.dispatchEvent(new CustomEvent(\"theme:loading:start\")); // Then we add the product in Ajax\n\n          \n$('.quantity-selector__value').attr('data-current-value',$(\"#Quantity-product-template\").val());      \n$('.header__cart-count').text($(\"#Quantity-product-template\").val());      \n\n        \n          var formElement = this.element.querySelector(\n            'form[action*=\"/cart/add\"]'\n          );\n          fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n            body: JSON.stringify(Form.serialize(formElement)),\n            credentials: \"same-origin\",\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": \"application/json\",\n              \"X-Requested-With\": \"XMLHttpRequest\", // This is needed as currently there is a bug in Shopify that assumes this header\n            },\n          }).then(function (response) {\n            document.dispatchEvent(new CustomEvent(\"theme:loading:end\"));\n\n            if (response.ok) {\n              target.removeAttribute(\"disabled\"); // We simply trigger an event so the mini-cart can re-render\n\n              _this4.element.dispatchEvent(\n                new CustomEvent(\"product:added\", {\n                  bubbles: true,\n                  detail: {\n                    variant: _this4.currentVariant,\n                    quantity: parseInt(formElement.querySelector('[name=\"quantity\"]').value),\n                  },\n                })\n              ); // If we are in the context of quick view, we also force closing the modal\n\n              if (\n                _this4.options[\"isQuickView\"] &&\n                window.theme.cartType === \"drawer\"\n              ) {\n                document.dispatchEvent(new CustomEvent(\"modal:close\"));\n              }\n\n              if (window.theme.cartType === \"message\") {\n                _this4._showAlert(\n                  window.languages.productAdded,\n                  \"success\",\n                  target\n                );\n              }\n\n          \n            } else {\n              response.json().then(function (content) {\n                _this4._showAlert(content[\"description\"], \"error\", target);\n              });\n            }\n          });\n          event.preventDefault();\n\n                $('.quantity-selector__value').attr('data-current-value',$(\"#Quantity-product-template\").val());      \n          $('.header__cart-count').text($(\"#Quantity-product-template\").val());      \n          \n        },\n        /**\n         * ---------------------------------------------------------------------------------------------------\n         * INTERNAL CODE THAT HANDLE PRODUCT ADD TO CART\n         * ---------------------------------------------------------------------------------------------------\n         */\n\n        /**\n         * In order to have a small animation when the inventory bar is visible, we setup an intersection observer\n         */\n      },\n      {\n        key: \"_setupStockCountdown\",\n        value: function _setupStockCountdown() {\n          var _this5 = this;\n\n          // If there is an inventory bar, we trigger an intersection observer to add an animation\n          var stockCountdown = this.element.querySelector(\".inventory-bar\");\n\n          if (stockCountdown) {\n            var onStockCountdownVisible = function onStockCountdownVisible() {\n              var variantInventoryQuantity =\n                _this5.variantsInventories[_this5.currentVariant[\"id\"]][\n                  \"inventory_quantity\"\n                ];\n              var stockCountdownProgress = Math.min(\n                Math.max(\n                  (variantInventoryQuantity /\n                    parseInt(\n                      stockCountdown.getAttribute(\"data-stock-countdown-max\")\n                    )) *\n                    100.0,\n                  0\n                ),\n                100\n              );\n              stockCountdown.classList.toggle(\n                \"inventory-bar--hidden\",\n                stockCountdownProgress === 0\n              );\n              stockCountdown.firstElementChild.style.width = \"\".concat(\n                stockCountdownProgress,\n                \"%\"\n              );\n            };\n\n            if (window.IntersectionObserver) {\n              var stockCountdownIntersectionObserver = new IntersectionObserver(\n                function (entries) {\n                  entries.forEach(function (item) {\n                    if (item.isIntersecting) {\n                      onStockCountdownVisible();\n                      stockCountdownIntersectionObserver.disconnect();\n                    }\n                  });\n                }\n              );\n              stockCountdownIntersectionObserver.observe(stockCountdown);\n            } else {\n              onStockCountdownVisible();\n            }\n          }\n        },\n      },\n      {\n        key: \"_showAlert\",\n        value: function _showAlert(message, type, afterElement) {\n          var messageElement = document.createElement(\"div\");\n          messageElement.className = \"product-form__status-message\";\n          messageElement.innerHTML = '<p class=\"alert '\n            .concat(\n              type === \"success\" ? \"alert--success\" : \"alert--error\",\n              '\">'\n            )\n            .concat(message, \"</p>\");\n          afterElement.removeAttribute(\"disabled\");\n          afterElement.parentNode.insertAdjacentElement(\n            \"afterend\",\n            messageElement\n          );\n          Animation.slideDown(messageElement);\n          setTimeout(function () {\n            Animation.slideUp(messageElement, function () {\n              messageElement.remove();\n            });\n          }, 5500);\n        },\n      },\n    ]);\n\n    return ProductVariants;\n  })();\n\n  var ProductModel = /*#__PURE__*/ (function () {\n    function ProductModel(element) {\n      _classCallCheck(this, ProductModel);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.delegateRoot = new Delegate(document.documentElement);\n\n      this._attachListeners();\n\n      var stylesheet = document.createElement(\"link\");\n      stylesheet.rel = \"stylesheet\";\n      stylesheet.href =\n        \"https://cdn.shopify.com/shopifycloud/model-viewer-ui/assets/v1.0/model-viewer-ui.css\";\n      document.head.appendChild(stylesheet);\n      window.Shopify.loadFeatures([\n        {\n          name: \"model-viewer-ui\",\n          version: \"1.0\",\n          onLoad: this._setupModelViewerUI.bind(this),\n        },\n        {\n          name: \"shopify-xr\",\n          version: \"1.0\",\n        },\n      ]);\n    }\n\n    _createClass(ProductModel, [\n      {\n        key: \"destroy\",\n        value: function destroy() {},\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          var _this = this;\n\n          this.element\n            .querySelector(\"model-viewer\")\n            .addEventListener(\n              \"shopify_model_viewer_ui_toggle_play\",\n              function () {\n                _this.element.dispatchEvent(\n                  new CustomEvent(\"model:played\", {\n                    bubbles: true,\n                  })\n                );\n              }\n            );\n          this.element\n            .querySelector(\"model-viewer\")\n            .addEventListener(\n              \"shopify_model_viewer_ui_toggle_pause\",\n              function () {\n                _this.element.dispatchEvent(\n                  new CustomEvent(\"model:paused\", {\n                    bubbles: true,\n                  })\n                );\n              }\n            );\n        },\n      },\n      {\n        key: \"hasBeenSelected\",\n        value: function hasBeenSelected(isInitialLoading) {\n          // As per guidelines, we only need to autoplay when it's not a touch device, and on desktop only if it's not the\n          // initial loading\n          if (\n            Responsive.matchesBreakpoint(\"supports-hover\") &&\n            !isInitialLoading\n          ) {\n            this.modelUi.play();\n          }\n        },\n      },\n      {\n        key: \"hasBeenDeselected\",\n        value: function hasBeenDeselected() {\n          // In all cases, we just turn it off\n          this.modelUi.pause();\n        },\n      },\n      {\n        key: \"_setupModelViewerUI\",\n        value: function _setupModelViewerUI() {\n          this.modelElement = this.element.querySelector(\"model-viewer\");\n          this.modelUi = new window.Shopify.ModelViewerUI(this.modelElement);\n        },\n      },\n    ]);\n\n    return ProductModel;\n  })();\n\n  var ProductVideo = /*#__PURE__*/ (function () {\n    function ProductVideo(element, enableVideoLooping) {\n      _classCallCheck(this, ProductVideo);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.enableVideoLooping = enableVideoLooping;\n      this.player = null;\n\n      switch (this.element.getAttribute(\"data-media-type\")) {\n        case \"video\":\n          var stylesheet = document.createElement(\"link\");\n          stylesheet.rel = \"stylesheet\";\n          stylesheet.href =\n            \"https://cdn.shopify.com/shopifycloud/shopify-plyr/v1.0/shopify-plyr.css\";\n          document.head.appendChild(stylesheet);\n          window.Shopify.loadFeatures([\n            {\n              name: \"video-ui\",\n              version: \"1.0\",\n              onLoad: this._setupHtml5Video.bind(this),\n            },\n          ]);\n          break;\n\n        case \"external_video\":\n          this._setupExternalVideo();\n\n          break;\n      }\n    }\n\n    _createClass(ProductVideo, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          if (this.player) {\n            this.player.destroy(); // Both Plyr and YouTube API use the same name\n          }\n        },\n      },\n      {\n        key: \"hasBeenSelected\",\n        value: function hasBeenSelected(isInitialLoading) {\n          // As per guidelines, we only need to autoplay when it's not a touch device, and on desktop only if it's not the\n          // initial loading\n          if (\n            Responsive.matchesBreakpoint(\"supports-hover\") &&\n            !isInitialLoading\n          ) {\n            this.play();\n          }\n        },\n      },\n      {\n        key: \"hasBeenDeselected\",\n        value: function hasBeenDeselected() {\n          this.pause();\n        },\n      },\n      {\n        key: \"play\",\n        value: function play() {\n          switch (this.element.getAttribute(\"data-media-type\")) {\n            case \"video\":\n              this.player.play();\n              break;\n\n            case \"external_video\":\n              this.player.playVideo(); // If we're using YouTube, we have to focus the parent div (as it's not possible to directly focus an iframe)\n\n              this.element.focus();\n              break;\n          }\n        },\n      },\n      {\n        key: \"pause\",\n        value: function pause() {\n          switch (this.element.getAttribute(\"data-media-type\")) {\n            case \"video\":\n              this.player.pause();\n              break;\n\n            case \"external_video\":\n              this.player.pauseVideo();\n              break;\n          }\n        },\n      },\n      {\n        key: \"_setupHtml5Video\",\n        value: function _setupHtml5Video() {\n          var _this = this;\n\n          this.player = new Shopify.Plyr(this.element.querySelector(\"video\"), {\n            controls: [\n              \"play\",\n              \"progress\",\n              \"mute\",\n              \"volume\",\n              \"play-large\",\n              \"fullscreen\",\n            ],\n            loop: {\n              active: this.enableVideoLooping,\n            },\n            hideControlsOnPause: true,\n            clickToPlay: true,\n            iconUrl:\n              \"//cdn.shopify.com/shopifycloud/shopify-plyr/v1.0/shopify-plyr.svg\",\n            tooltips: {\n              controls: false,\n              seek: true,\n            },\n          });\n          this.player.on(\"play\", function () {\n            _this.element.dispatchEvent(\n              new CustomEvent(\"video:played\", {\n                bubbles: true,\n              })\n            );\n          });\n          this.player.on(\"pause\", function () {\n            _this.element.dispatchEvent(\n              new CustomEvent(\"video:paused\", {\n                bubbles: true,\n              })\n            );\n          });\n        },\n      },\n      {\n        key: \"_setupExternalVideo\",\n        value: function _setupExternalVideo() {\n          if (this.element.getAttribute(\"data-media-host\") === \"youtube\") {\n            this._loadYouTubeScript().then(this._setupYouTubePlayer.bind(this));\n          }\n        },\n      },\n      {\n        key: \"_setupYouTubePlayer\",\n        value: function _setupYouTubePlayer() {\n          var _this2 = this;\n\n          var playerLoadingInterval = setInterval(function () {\n            if (window.YT !== undefined && window.YT.Player !== undefined) {\n              _this2.player = new YT.Player(\n                _this2.element.querySelector(\"iframe\"),\n                {\n                  videoId: _this2.element.getAttribute(\"data-video-id\"),\n                  events: {\n                    onStateChange: function onStateChange(event) {\n                      if (event.data === 0 && _this2.enableVideoLooping) {\n                        event.target.seekTo(0);\n                      }\n                    },\n                  },\n                }\n              );\n              clearInterval(playerLoadingInterval);\n            }\n          }, 50);\n        },\n      },\n      {\n        key: \"_loadYouTubeScript\",\n        value: function _loadYouTubeScript() {\n          return new Promise(function (resolve, reject) {\n            var script = document.createElement(\"script\");\n            document.body.appendChild(script);\n            script.onload = resolve;\n            script.onerror = reject;\n            script.async = true;\n            script.src = \"//www.youtube.com/iframe_api\";\n          });\n        },\n      },\n    ]);\n\n    return ProductVideo;\n  })();\n\n  var evEmitter = createCommonjsModule(function (module) {\n    /**\n     * EvEmitter v1.1.0\n     * Lil' event emitter\n     * MIT License\n     */\n\n    /* jshint unused: true, undef: true, strict: true */\n    (function (global, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n\n      /* globals define, module, window */\n      if (module.exports) {\n        // CommonJS - Browserify, Webpack\n        module.exports = factory();\n      } else {\n        // Browser globals\n        global.EvEmitter = factory();\n      }\n    })(typeof window != \"undefined\" ? window : commonjsGlobal, function () {\n      function EvEmitter() {}\n\n      var proto = EvEmitter.prototype;\n\n      proto.on = function (eventName, listener) {\n        if (!eventName || !listener) {\n          return;\n        } // set events hash\n\n        var events = (this._events = this._events || {}); // set listeners array\n\n        var listeners = (events[eventName] = events[eventName] || []); // only add once\n\n        if (listeners.indexOf(listener) == -1) {\n          listeners.push(listener);\n        }\n\n        return this;\n      };\n\n      proto.once = function (eventName, listener) {\n        if (!eventName || !listener) {\n          return;\n        } // add event\n\n        this.on(eventName, listener); // set once flag\n        // set onceEvents hash\n\n        var onceEvents = (this._onceEvents = this._onceEvents || {}); // set onceListeners object\n\n        var onceListeners = (onceEvents[eventName] =\n          onceEvents[eventName] || {}); // set flag\n\n        onceListeners[listener] = true;\n        return this;\n      };\n\n      proto.off = function (eventName, listener) {\n        var listeners = this._events && this._events[eventName];\n\n        if (!listeners || !listeners.length) {\n          return;\n        }\n\n        var index = listeners.indexOf(listener);\n\n        if (index != -1) {\n          listeners.splice(index, 1);\n        }\n\n        return this;\n      };\n\n      proto.emitEvent = function (eventName, args) {\n        var listeners = this._events && this._events[eventName];\n\n        if (!listeners || !listeners.length) {\n          return;\n        } // copy over to avoid interference if .off() in listener\n\n        listeners = listeners.slice(0);\n        args = args || []; // once stuff\n\n        var onceListeners = this._onceEvents && this._onceEvents[eventName];\n\n        for (var i = 0; i < listeners.length; i++) {\n          var listener = listeners[i];\n          var isOnce = onceListeners && onceListeners[listener];\n\n          if (isOnce) {\n            // remove listener\n            // remove before trigger to prevent recursion\n            this.off(eventName, listener); // unset once flag\n\n            delete onceListeners[listener];\n          } // trigger listener\n\n          listener.apply(this, args);\n        }\n\n        return this;\n      };\n\n      proto.allOff = function () {\n        delete this._events;\n        delete this._onceEvents;\n      };\n\n      return EvEmitter;\n    });\n  });\n\n  var getSize = createCommonjsModule(function (module) {\n    /*!\n     * getSize v2.0.3\n     * measure size of elements\n     * MIT license\n     */\n\n    /* jshint browser: true, strict: true, undef: true, unused: true */\n\n    /* globals console: false */\n    (function (window, factory) {\n      /* jshint strict: false */\n\n      /* globals define, module */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory();\n      } else {\n        // browser global\n        window.getSize = factory();\n      }\n    })(window, function factory() {\n      // get a number from a string, not a percentage\n\n      function getStyleSize(value) {\n        var num = parseFloat(value); // not a percent like '100%', and a number\n\n        var isValid = value.indexOf(\"%\") == -1 && !isNaN(num);\n        return isValid && num;\n      }\n\n      function noop() {}\n\n      var logError =\n        typeof console == \"undefined\"\n          ? noop\n          : function (message) {\n              console.error(message);\n            }; // -------------------------- measurements -------------------------- //\n\n      var measurements = [\n        \"paddingLeft\",\n        \"paddingRight\",\n        \"paddingTop\",\n        \"paddingBottom\",\n        \"marginLeft\",\n        \"marginRight\",\n        \"marginTop\",\n        \"marginBottom\",\n        \"borderLeftWidth\",\n        \"borderRightWidth\",\n        \"borderTopWidth\",\n        \"borderBottomWidth\",\n      ];\n      var measurementsLength = measurements.length;\n\n      function getZeroSize() {\n        var size = {\n          width: 0,\n          height: 0,\n          innerWidth: 0,\n          innerHeight: 0,\n          outerWidth: 0,\n          outerHeight: 0,\n        };\n\n        for (var i = 0; i < measurementsLength; i++) {\n          var measurement = measurements[i];\n          size[measurement] = 0;\n        }\n\n        return size;\n      } // -------------------------- getStyle -------------------------- //\n\n      /**\n       * getStyle, get style of element, check for Firefox bug\n       * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n       */\n\n      function getStyle(elem) {\n        var style = getComputedStyle(elem);\n\n        if (!style) {\n          logError(\n            \"Style returned \" +\n              style +\n              \". Are you running this code in a hidden iframe on Firefox? \" +\n              \"See https://bit.ly/getsizebug1\"\n          );\n        }\n\n        return style;\n      } // -------------------------- setup -------------------------- //\n\n      var isSetup = false;\n      var isBoxSizeOuter;\n      /**\n       * setup\n       * check isBoxSizerOuter\n       * do on first getSize() rather than on page load for Firefox bug\n       */\n\n      function setup() {\n        // setup once\n        if (isSetup) {\n          return;\n        }\n\n        isSetup = true; // -------------------------- box sizing -------------------------- //\n\n        /**\n         * Chrome & Safari measure the outer-width on style.width on border-box elems\n         * IE11 & Firefox<29 measures the inner-width\n         */\n\n        var div = document.createElement(\"div\");\n        div.style.width = \"200px\";\n        div.style.padding = \"1px 2px 3px 4px\";\n        div.style.borderStyle = \"solid\";\n        div.style.borderWidth = \"1px 2px 3px 4px\";\n        div.style.boxSizing = \"border-box\";\n        var body = document.body || document.documentElement;\n        body.appendChild(div);\n        var style = getStyle(div); // round value for browser zoom. desandro/masonry#928\n\n        isBoxSizeOuter = Math.round(getStyleSize(style.width)) == 200;\n        getSize.isBoxSizeOuter = isBoxSizeOuter;\n        body.removeChild(div);\n      } // -------------------------- getSize -------------------------- //\n\n      function getSize(elem) {\n        setup(); // use querySeletor if elem is string\n\n        if (typeof elem == \"string\") {\n          elem = document.querySelector(elem);\n        } // do not proceed on non-objects\n\n        if (!elem || _typeof(elem) != \"object\" || !elem.nodeType) {\n          return;\n        }\n\n        var style = getStyle(elem); // if hidden, everything is 0\n\n        if (style.display == \"none\") {\n          return getZeroSize();\n        }\n\n        var size = {};\n        size.width = elem.offsetWidth;\n        size.height = elem.offsetHeight;\n        var isBorderBox = (size.isBorderBox = style.boxSizing == \"border-box\"); // get all measurements\n\n        for (var i = 0; i < measurementsLength; i++) {\n          var measurement = measurements[i];\n          var value = style[measurement];\n          var num = parseFloat(value); // any 'auto', 'medium' value will be 0\n\n          size[measurement] = !isNaN(num) ? num : 0;\n        }\n\n        var paddingWidth = size.paddingLeft + size.paddingRight;\n        var paddingHeight = size.paddingTop + size.paddingBottom;\n        var marginWidth = size.marginLeft + size.marginRight;\n        var marginHeight = size.marginTop + size.marginBottom;\n        var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n        var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n        var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter; // overwrite width and height if we can get it from style\n\n        var styleWidth = getStyleSize(style.width);\n\n        if (styleWidth !== false) {\n          size.width =\n            styleWidth + // add padding and border unless it's already including it\n            (isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth);\n        }\n\n        var styleHeight = getStyleSize(style.height);\n\n        if (styleHeight !== false) {\n          size.height =\n            styleHeight + // add padding and border unless it's already including it\n            (isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight);\n        }\n\n        size.innerWidth = size.width - (paddingWidth + borderWidth);\n        size.innerHeight = size.height - (paddingHeight + borderHeight);\n        size.outerWidth = size.width + marginWidth;\n        size.outerHeight = size.height + marginHeight;\n        return size;\n      }\n\n      return getSize;\n    });\n  });\n\n  var matchesSelector = createCommonjsModule(function (module) {\n    /**\n     * matchesSelector v2.0.2\n     * matchesSelector( element, '.selector' )\n     * MIT license\n     */\n\n    /*jshint browser: true, strict: true, undef: true, unused: true */\n    (function (window, factory) {\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory();\n      } else {\n        // browser global\n        window.matchesSelector = factory();\n      }\n    })(window, function factory() {\n      var matchesMethod = (function () {\n        var ElemProto = window.Element.prototype; // check for the standard method name first\n\n        if (ElemProto.matches) {\n          return \"matches\";\n        } // check un-prefixed\n\n        if (ElemProto.matchesSelector) {\n          return \"matchesSelector\";\n        } // check vendor prefixes\n\n        var prefixes = [\"webkit\", \"moz\", \"ms\", \"o\"];\n\n        for (var i = 0; i < prefixes.length; i++) {\n          var prefix = prefixes[i];\n          var method = prefix + \"MatchesSelector\";\n\n          if (ElemProto[method]) {\n            return method;\n          }\n        }\n      })();\n\n      return function matchesSelector(elem, selector) {\n        return elem[matchesMethod](selector);\n      };\n    });\n  });\n\n  var utils = createCommonjsModule(function (module) {\n    /**\n     * Fizzy UI utils v2.0.7\n     * MIT license\n     */\n\n    /*jshint browser: true, undef: true, unused: true, strict: true */\n    (function (window, factory) {\n      // universal module definition\n\n      /*jshint strict: false */\n\n      /*globals define, module, require */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(window, matchesSelector);\n      } else {\n        // browser global\n        window.fizzyUIUtils = factory(window, window.matchesSelector);\n      }\n    })(window, function factory(window, matchesSelector) {\n      var utils = {}; // ----- extend ----- //\n      // extends objects\n\n      utils.extend = function (a, b) {\n        for (var prop in b) {\n          a[prop] = b[prop];\n        }\n\n        return a;\n      }; // ----- modulo ----- //\n\n      utils.modulo = function (num, div) {\n        return ((num % div) + div) % div;\n      }; // ----- makeArray ----- //\n\n      var arraySlice = Array.prototype.slice; // turn element or nodeList into an array\n\n      utils.makeArray = function (obj) {\n        if (Array.isArray(obj)) {\n          // use object if already an array\n          return obj;\n        } // return empty array if undefined or null. #6\n\n        if (obj === null || obj === undefined) {\n          return [];\n        }\n\n        var isArrayLike =\n          _typeof(obj) == \"object\" && typeof obj.length == \"number\";\n\n        if (isArrayLike) {\n          // convert nodeList to array\n          return arraySlice.call(obj);\n        } // array of single index\n\n        return [obj];\n      }; // ----- removeFrom ----- //\n\n      utils.removeFrom = function (ary, obj) {\n        var index = ary.indexOf(obj);\n\n        if (index != -1) {\n          ary.splice(index, 1);\n        }\n      }; // ----- getParent ----- //\n\n      utils.getParent = function (elem, selector) {\n        while (elem.parentNode && elem != document.body) {\n          elem = elem.parentNode;\n\n          if (matchesSelector(elem, selector)) {\n            return elem;\n          }\n        }\n      }; // ----- getQueryElement ----- //\n      // use element as selector string\n\n      utils.getQueryElement = function (elem) {\n        if (typeof elem == \"string\") {\n          return document.querySelector(elem);\n        }\n\n        return elem;\n      }; // ----- handleEvent ----- //\n      // enable .ontype to trigger from .addEventListener( elem, 'type' )\n\n      utils.handleEvent = function (event) {\n        var method = \"on\" + event.type;\n\n        if (this[method]) {\n          this[method](event);\n        }\n      }; // ----- filterFindElements ----- //\n\n      utils.filterFindElements = function (elems, selector) {\n        // make array of elems\n        elems = utils.makeArray(elems);\n        var ffElems = [];\n        elems.forEach(function (elem) {\n          // check that elem is an actual element\n          if (!(elem instanceof HTMLElement)) {\n            return;\n          } // add elem if no selector\n\n          if (!selector) {\n            ffElems.push(elem);\n            return;\n          } // filter & find items if we have a selector\n          // filter\n\n          if (matchesSelector(elem, selector)) {\n            ffElems.push(elem);\n          } // find children\n\n          var childElems = elem.querySelectorAll(selector); // concat childElems to filterFound array\n\n          for (var i = 0; i < childElems.length; i++) {\n            ffElems.push(childElems[i]);\n          }\n        });\n        return ffElems;\n      }; // ----- debounceMethod ----- //\n\n      utils.debounceMethod = function (_class, methodName, threshold) {\n        threshold = threshold || 100; // original method\n\n        var method = _class.prototype[methodName];\n        var timeoutName = methodName + \"Timeout\";\n\n        _class.prototype[methodName] = function () {\n          var timeout = this[timeoutName];\n          clearTimeout(timeout);\n          var args = arguments;\n\n          var _this = this;\n\n          this[timeoutName] = setTimeout(function () {\n            method.apply(_this, args);\n            delete _this[timeoutName];\n          }, threshold);\n        };\n      }; // ----- docReady ----- //\n\n      utils.docReady = function (callback) {\n        var readyState = document.readyState;\n\n        if (readyState == \"complete\" || readyState == \"interactive\") {\n          // do async to allow for other scripts to run. metafizzy/flickity#441\n          setTimeout(callback);\n        } else {\n          document.addEventListener(\"DOMContentLoaded\", callback);\n        }\n      }; // ----- htmlInit ----- //\n      // http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\n\n      utils.toDashed = function (str) {\n        return str\n          .replace(/(.)([A-Z])/g, function (match, $1, $2) {\n            return $1 + \"-\" + $2;\n          })\n          .toLowerCase();\n      };\n\n      var console = window.console;\n      /**\n       * allow user to initialize classes via [data-namespace] or .js-namespace class\n       * htmlInit( Widget, 'widgetName' )\n       * options are parsed from data-namespace-options\n       */\n\n      utils.htmlInit = function (WidgetClass, namespace) {\n        utils.docReady(function () {\n          var dashedNamespace = utils.toDashed(namespace);\n          var dataAttr = \"data-\" + dashedNamespace;\n          var dataAttrElems = document.querySelectorAll(\"[\" + dataAttr + \"]\");\n          var jsDashElems = document.querySelectorAll(\".js-\" + dashedNamespace);\n          var elems = utils\n            .makeArray(dataAttrElems)\n            .concat(utils.makeArray(jsDashElems));\n          var dataOptionsAttr = dataAttr + \"-options\";\n          var jQuery = window.jQuery;\n          elems.forEach(function (elem) {\n            var attr =\n              elem.getAttribute(dataAttr) || elem.getAttribute(dataOptionsAttr);\n            var options;\n\n            try {\n              options = attr && JSON.parse(attr);\n            } catch (error) {\n              // log error, do not initialize\n              if (console) {\n                console.error(\n                  \"Error parsing \" +\n                    dataAttr +\n                    \" on \" +\n                    elem.className +\n                    \": \" +\n                    error\n                );\n              }\n\n              return;\n            } // initialize\n\n            var instance = new WidgetClass(elem, options); // make available via $().data('namespace')\n\n            if (jQuery) {\n              jQuery.data(elem, namespace, instance);\n            }\n          });\n        });\n      }; // -----  ----- //\n\n      return utils;\n    });\n  });\n\n  var cell = createCommonjsModule(function (module) {\n    // Flickity.Cell\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(window, getSize);\n      } else {\n        // browser global\n        window.Flickity = window.Flickity || {};\n        window.Flickity.Cell = factory(window, window.getSize);\n      }\n    })(window, function factory(window, getSize) {\n      function Cell(elem, parent) {\n        this.element = elem;\n        this.parent = parent;\n        this.create();\n      }\n\n      var proto = Cell.prototype;\n\n      proto.create = function () {\n        this.element.style.position = \"absolute\";\n        this.element.setAttribute(\"aria-hidden\", \"true\");\n        this.x = 0;\n        this.shift = 0;\n      };\n\n      proto.destroy = function () {\n        // reset style\n        this.unselect();\n        this.element.style.position = \"\";\n        var side = this.parent.originSide;\n        this.element.style[side] = \"\";\n      };\n\n      proto.getSize = function () {\n        this.size = getSize(this.element);\n      };\n\n      proto.setPosition = function (x) {\n        this.x = x;\n        this.updateTarget();\n        this.renderPosition(x);\n      }; // setDefaultTarget v1 method, backwards compatibility, remove in v3\n\n      proto.updateTarget = proto.setDefaultTarget = function () {\n        var marginProperty =\n          this.parent.originSide == \"left\" ? \"marginLeft\" : \"marginRight\";\n        this.target =\n          this.x +\n          this.size[marginProperty] +\n          this.size.width * this.parent.cellAlign;\n      };\n\n      proto.renderPosition = function (x) {\n        // render position of cell with in slider\n        var side = this.parent.originSide;\n        this.element.style[side] = this.parent.getPositionValue(x);\n      };\n\n      proto.select = function () {\n        this.element.classList.add(\"is-selected\");\n        this.element.removeAttribute(\"aria-hidden\");\n      };\n\n      proto.unselect = function () {\n        this.element.classList.remove(\"is-selected\");\n        this.element.setAttribute(\"aria-hidden\", \"true\");\n      };\n      /**\n       * @param {Integer} factor - 0, 1, or -1\n       **/\n\n      proto.wrapShift = function (shift) {\n        this.shift = shift;\n        this.renderPosition(this.x + this.parent.slideableWidth * shift);\n      };\n\n      proto.remove = function () {\n        this.element.parentNode.removeChild(this.element);\n      };\n\n      return Cell;\n    });\n  });\n\n  var slide = createCommonjsModule(function (module) {\n    // slide\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory();\n      } else {\n        // browser global\n        window.Flickity = window.Flickity || {};\n        window.Flickity.Slide = factory();\n      }\n    })(window, function factory() {\n      function Slide(parent) {\n        this.parent = parent;\n        this.isOriginLeft = parent.originSide == \"left\";\n        this.cells = [];\n        this.outerWidth = 0;\n        this.height = 0;\n      }\n\n      var proto = Slide.prototype;\n\n      proto.addCell = function (cell) {\n        this.cells.push(cell);\n        this.outerWidth += cell.size.outerWidth;\n        this.height = Math.max(cell.size.outerHeight, this.height); // first cell stuff\n\n        if (this.cells.length == 1) {\n          this.x = cell.x; // x comes from first cell\n\n          var beginMargin = this.isOriginLeft ? \"marginLeft\" : \"marginRight\";\n          this.firstMargin = cell.size[beginMargin];\n        }\n      };\n\n      proto.updateTarget = function () {\n        var endMargin = this.isOriginLeft ? \"marginRight\" : \"marginLeft\";\n        var lastCell = this.getLastCell();\n        var lastMargin = lastCell ? lastCell.size[endMargin] : 0;\n        var slideWidth = this.outerWidth - (this.firstMargin + lastMargin);\n        this.target =\n          this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n      };\n\n      proto.getLastCell = function () {\n        return this.cells[this.cells.length - 1];\n      };\n\n      proto.select = function () {\n        this.cells.forEach(function (cell) {\n          cell.select();\n        });\n      };\n\n      proto.unselect = function () {\n        this.cells.forEach(function (cell) {\n          cell.unselect();\n        });\n      };\n\n      proto.getCellElements = function () {\n        return this.cells.map(function (cell) {\n          return cell.element;\n        });\n      };\n\n      return Slide;\n    });\n  });\n\n  var animate = createCommonjsModule(function (module) {\n    // animate\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(window, utils);\n      } else {\n        // browser global\n        window.Flickity = window.Flickity || {};\n        window.Flickity.animatePrototype = factory(window, window.fizzyUIUtils);\n      }\n    })(window, function factory(window, utils) {\n      var proto = {};\n\n      proto.startAnimation = function () {\n        if (this.isAnimating) {\n          return;\n        }\n\n        this.isAnimating = true;\n        this.restingFrames = 0;\n        this.animate();\n      };\n\n      proto.animate = function () {\n        this.applyDragForce();\n        this.applySelectedAttraction();\n        var previousX = this.x;\n        this.integratePhysics();\n        this.positionSlider();\n        this.settle(previousX); // animate next frame\n\n        if (this.isAnimating) {\n          var _this = this;\n\n          requestAnimationFrame(function animateFrame() {\n            _this.animate();\n          });\n        }\n      };\n\n      proto.positionSlider = function () {\n        var x = this.x; // wrap position around\n\n        if (this.options.wrapAround && this.cells.length > 1) {\n          x = utils.modulo(x, this.slideableWidth);\n          x = x - this.slideableWidth;\n          this.shiftWrapCells(x);\n        }\n\n        this.setTranslateX(x, this.isAnimating);\n        this.dispatchScrollEvent();\n      };\n\n      proto.setTranslateX = function (x, is3d) {\n        x += this.cursorPosition; // reverse if right-to-left and using transform\n\n        x = this.options.rightToLeft ? -x : x;\n        var translateX = this.getPositionValue(x); // use 3D tranforms for hardware acceleration on iOS\n        // but use 2D when settled, for better font-rendering\n\n        this.slider.style.transform = is3d\n          ? \"translate3d(\" + translateX + \",0,0)\"\n          : \"translateX(\" + translateX + \")\";\n      };\n\n      proto.dispatchScrollEvent = function () {\n        var firstSlide = this.slides[0];\n\n        if (!firstSlide) {\n          return;\n        }\n\n        var positionX = -this.x - firstSlide.target;\n        var progress = positionX / this.slidesWidth;\n        this.dispatchEvent(\"scroll\", null, [progress, positionX]);\n      };\n\n      proto.positionSliderAtSelected = function () {\n        if (!this.cells.length) {\n          return;\n        }\n\n        this.x = -this.selectedSlide.target;\n        this.velocity = 0; // stop wobble\n\n        this.positionSlider();\n      };\n\n      proto.getPositionValue = function (position) {\n        if (this.options.percentPosition) {\n          // percent position, round to 2 digits, like 12.34%\n          return (\n            Math.round((position / this.size.innerWidth) * 10000) * 0.01 + \"%\"\n          );\n        } else {\n          // pixel positioning\n          return Math.round(position) + \"px\";\n        }\n      };\n\n      proto.settle = function (previousX) {\n        // keep track of frames where x hasn't moved\n        if (\n          !this.isPointerDown &&\n          Math.round(this.x * 100) == Math.round(previousX * 100)\n        ) {\n          this.restingFrames++;\n        } // stop animating if resting for 3 or more frames\n\n        if (this.restingFrames > 2) {\n          this.isAnimating = false;\n          delete this.isFreeScrolling; // render position with translateX when settled\n\n          this.positionSlider();\n          this.dispatchEvent(\"settle\", null, [this.selectedIndex]);\n        }\n      };\n\n      proto.shiftWrapCells = function (x) {\n        // shift before cells\n        var beforeGap = this.cursorPosition + x;\n\n        this._shiftCells(this.beforeShiftCells, beforeGap, -1); // shift after cells\n\n        var afterGap =\n          this.size.innerWidth -\n          (x + this.slideableWidth + this.cursorPosition);\n\n        this._shiftCells(this.afterShiftCells, afterGap, 1);\n      };\n\n      proto._shiftCells = function (cells, gap, shift) {\n        for (var i = 0; i < cells.length; i++) {\n          var cell = cells[i];\n          var cellShift = gap > 0 ? shift : 0;\n          cell.wrapShift(cellShift);\n          gap -= cell.size.outerWidth;\n        }\n      };\n\n      proto._unshiftCells = function (cells) {\n        if (!cells || !cells.length) {\n          return;\n        }\n\n        for (var i = 0; i < cells.length; i++) {\n          cells[i].wrapShift(0);\n        }\n      }; // -------------------------- physics -------------------------- //\n\n      proto.integratePhysics = function () {\n        this.x += this.velocity;\n        this.velocity *= this.getFrictionFactor();\n      };\n\n      proto.applyForce = function (force) {\n        this.velocity += force;\n      };\n\n      proto.getFrictionFactor = function () {\n        return (\n          1 -\n          this.options[this.isFreeScrolling ? \"freeScrollFriction\" : \"friction\"]\n        );\n      };\n\n      proto.getRestingPosition = function () {\n        // my thanks to Steven Wittens, who simplified this math greatly\n        return this.x + this.velocity / (1 - this.getFrictionFactor());\n      };\n\n      proto.applyDragForce = function () {\n        if (!this.isDraggable || !this.isPointerDown) {\n          return;\n        } // change the position to drag position by applying force\n\n        var dragVelocity = this.dragX - this.x;\n        var dragForce = dragVelocity - this.velocity;\n        this.applyForce(dragForce);\n      };\n\n      proto.applySelectedAttraction = function () {\n        // do not attract if pointer down or no slides\n        var dragDown = this.isDraggable && this.isPointerDown;\n\n        if (dragDown || this.isFreeScrolling || !this.slides.length) {\n          return;\n        }\n\n        var distance = this.selectedSlide.target * -1 - this.x;\n        var force = distance * this.options.selectedAttraction;\n        this.applyForce(force);\n      };\n\n      return proto;\n    });\n  });\n\n  var flickity = createCommonjsModule(function (module) {\n    // Flickity main\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(\n          window,\n          evEmitter,\n          getSize,\n          utils,\n          cell,\n          slide,\n          animate\n        );\n      } else {\n        // browser global\n        var _Flickity = window.Flickity;\n        window.Flickity = factory(\n          window,\n          window.EvEmitter,\n          window.getSize,\n          window.fizzyUIUtils,\n          _Flickity.Cell,\n          _Flickity.Slide,\n          _Flickity.animatePrototype\n        );\n      }\n    })(\n      window,\n      function factory(\n        window,\n        EvEmitter,\n        getSize,\n        utils,\n        Cell,\n        Slide,\n        animatePrototype\n      ) {\n        var jQuery = window.jQuery;\n        var getComputedStyle = window.getComputedStyle;\n        var console = window.console;\n\n        function moveElements(elems, toElem) {\n          elems = utils.makeArray(elems);\n\n          while (elems.length) {\n            toElem.appendChild(elems.shift());\n          }\n        } // -------------------------- Flickity -------------------------- //\n        // globally unique identifiers\n\n        var GUID = 0; // internal store of all Flickity intances\n\n        var instances = {};\n\n        function Flickity(element, options) {\n          var queryElement = utils.getQueryElement(element);\n\n          if (!queryElement) {\n            if (console) {\n              console.error(\n                \"Bad element for Flickity: \" + (queryElement || element)\n              );\n            }\n\n            return;\n          }\n\n          this.element = queryElement; // do not initialize twice on same element\n\n          if (this.element.flickityGUID) {\n            var instance = instances[this.element.flickityGUID];\n            instance.option(options);\n            return instance;\n          } // add jQuery\n\n          if (jQuery) {\n            this.$element = jQuery(this.element);\n          } // options\n\n          this.options = utils.extend({}, this.constructor.defaults);\n          this.option(options); // kick things off\n\n          this._create();\n        }\n\n        Flickity.defaults = {\n          accessibility: true,\n          // adaptiveHeight: false,\n          cellAlign: \"center\",\n          // cellSelector: undefined,\n          // contain: false,\n          freeScrollFriction: 0.075,\n          // friction when free-scrolling\n          friction: 0.28,\n          // friction when selecting\n          namespaceJQueryEvents: true,\n          // initialIndex: 0,\n          percentPosition: true,\n          resize: true,\n          selectedAttraction: 0.025,\n          setGallerySize: true, // watchCSS: false,\n          // wrapAround: false\n        }; // hash of methods triggered on _create()\n\n        Flickity.createMethods = [];\n        var proto = Flickity.prototype; // inherit EventEmitter\n\n        utils.extend(proto, EvEmitter.prototype);\n\n        proto._create = function () {\n          // add id for Flickity.data\n          var id = (this.guid = ++GUID);\n          this.element.flickityGUID = id; // expando\n\n          instances[id] = this; // associate via id\n          // initial properties\n\n          this.selectedIndex = 0; // how many frames slider has been in same position\n\n          this.restingFrames = 0; // initial physics properties\n\n          this.x = 0;\n          this.velocity = 0;\n          this.originSide = this.options.rightToLeft ? \"right\" : \"left\"; // create viewport & slider\n\n          this.viewport = document.createElement(\"div\");\n          this.viewport.className = \"flickity-viewport\";\n\n          this._createSlider();\n\n          if (this.options.resize || this.options.watchCSS) {\n            window.addEventListener(\"resize\", this);\n          } // add listeners from on option\n\n          for (var eventName in this.options.on) {\n            var listener = this.options.on[eventName];\n            this.on(eventName, listener);\n          }\n\n          Flickity.createMethods.forEach(function (method) {\n            this[method]();\n          }, this);\n\n          if (this.options.watchCSS) {\n            this.watchCSS();\n          } else {\n            this.activate();\n          }\n        };\n        /**\n         * set options\n         * @param {Object} opts\n         */\n\n        proto.option = function (opts) {\n          utils.extend(this.options, opts);\n        };\n\n        proto.activate = function () {\n          if (this.isActive) {\n            return;\n          }\n\n          this.isActive = true;\n          this.element.classList.add(\"flickity-enabled\");\n\n          if (this.options.rightToLeft) {\n            this.element.classList.add(\"flickity-rtl\");\n          }\n\n          this.getSize(); // move initial cell elements so they can be loaded as cells\n\n          var cellElems = this._filterFindCellElements(this.element.children);\n\n          moveElements(cellElems, this.slider);\n          this.viewport.appendChild(this.slider);\n          this.element.appendChild(this.viewport); // get cells from children\n\n          this.reloadCells();\n\n          if (this.options.accessibility) {\n            // allow element to focusable\n            this.element.tabIndex = 0; // listen for key presses\n\n            this.element.addEventListener(\"keydown\", this);\n          }\n\n          this.emitEvent(\"activate\");\n          this.selectInitialIndex(); // flag for initial activation, for using initialIndex\n\n          this.isInitActivated = true; // ready event. #493\n\n          this.dispatchEvent(\"ready\");\n        }; // slider positions the cells\n\n        proto._createSlider = function () {\n          // slider element does all the positioning\n          var slider = document.createElement(\"div\");\n          slider.className = \"flickity-slider\";\n          slider.style[this.originSide] = 0;\n          this.slider = slider;\n        };\n\n        proto._filterFindCellElements = function (elems) {\n          return utils.filterFindElements(elems, this.options.cellSelector);\n        }; // goes through all children\n\n        proto.reloadCells = function () {\n          // collection of item elements\n          this.cells = this._makeCells(this.slider.children);\n          this.positionCells();\n\n          this._getWrapShiftCells();\n\n          this.setGallerySize();\n        };\n        /**\n         * turn elements into Flickity.Cells\n         * @param {Array or NodeList or HTMLElement} elems\n         * @returns {Array} items - collection of new Flickity Cells\n         */\n\n        proto._makeCells = function (elems) {\n          var cellElems = this._filterFindCellElements(elems); // create new Flickity for collection\n\n          var cells = cellElems.map(function (cellElem) {\n            return new Cell(cellElem, this);\n          }, this);\n          return cells;\n        };\n\n        proto.getLastCell = function () {\n          return this.cells[this.cells.length - 1];\n        };\n\n        proto.getLastSlide = function () {\n          return this.slides[this.slides.length - 1];\n        }; // positions all cells\n\n        proto.positionCells = function () {\n          // size all cells\n          this._sizeCells(this.cells); // position all cells\n\n          this._positionCells(0);\n        };\n        /**\n         * position certain cells\n         * @param {Integer} index - which cell to start with\n         */\n\n        proto._positionCells = function (index) {\n          index = index || 0; // also measure maxCellHeight\n          // start 0 if positioning all cells\n\n          this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n          var cellX = 0; // get cellX\n\n          if (index > 0) {\n            var startCell = this.cells[index - 1];\n            cellX = startCell.x + startCell.size.outerWidth;\n          }\n\n          var len = this.cells.length;\n\n          for (var i = index; i < len; i++) {\n            var cell = this.cells[i];\n            cell.setPosition(cellX);\n            cellX += cell.size.outerWidth;\n            this.maxCellHeight = Math.max(\n              cell.size.outerHeight,\n              this.maxCellHeight\n            );\n          } // keep track of cellX for wrap-around\n\n          this.slideableWidth = cellX; // slides\n\n          this.updateSlides(); // contain slides target\n\n          this._containSlides(); // update slidesWidth\n\n          this.slidesWidth = len\n            ? this.getLastSlide().target - this.slides[0].target\n            : 0;\n\n          /*THEME OVERRIDE*/\n          $(document).on(\"click\", \".deeplink\", function (e) {\n            e.preventDefault();\n            const target = $(this).attr(\"data-target\");\n            // console.log('target', target);\n          });\n        };\n        /**\n         * cell.getSize() on multiple cells\n         * @param {Array} cells\n         */\n\n        proto._sizeCells = function (cells) {\n          cells.forEach(function (cell) {\n            cell.getSize();\n          });\n        }; // --------------------------  -------------------------- //\n\n        proto.updateSlides = function () {\n          this.slides = [];\n\n          if (!this.cells.length) {\n            return;\n          }\n\n          var slide = new Slide(this);\n          this.slides.push(slide);\n          var isOriginLeft = this.originSide == \"left\";\n          var nextMargin = isOriginLeft ? \"marginRight\" : \"marginLeft\";\n\n          var canCellFit = this._getCanCellFit();\n\n          this.cells.forEach(function (cell, i) {\n            // just add cell if first cell in slide\n            if (!slide.cells.length) {\n              slide.addCell(cell);\n              return;\n            }\n\n            var slideWidth =\n              slide.outerWidth -\n              slide.firstMargin +\n              (cell.size.outerWidth - cell.size[nextMargin]);\n\n            if (canCellFit.call(this, i, slideWidth)) {\n              slide.addCell(cell);\n            } else {\n              // doesn't fit, new slide\n              slide.updateTarget();\n              slide = new Slide(this);\n              this.slides.push(slide);\n              slide.addCell(cell);\n            }\n          }, this); // last slide\n\n          slide.updateTarget(); // update .selectedSlide\n\n          this.updateSelectedSlide();\n        };\n\n        proto._getCanCellFit = function () {\n          var groupCells = this.options.groupCells;\n\n          if (!groupCells) {\n            return function () {\n              return false;\n            };\n          } else if (typeof groupCells == \"number\") {\n            // group by number. 3 -> [0,1,2], [3,4,5], ...\n            var number = parseInt(groupCells, 10);\n            return function (i) {\n              return i % number !== 0;\n            };\n          } // default, group by width of slide\n          // parse '75%\n\n          var percentMatch =\n            typeof groupCells == \"string\" && groupCells.match(/^(\\d+)%$/);\n          var percent = percentMatch ? parseInt(percentMatch[1], 10) / 100 : 1;\n          return function (i, slideWidth) {\n            return slideWidth <= (this.size.innerWidth + 1) * percent;\n          };\n        }; // alias _init for jQuery plugin .flickity()\n\n        proto._init = proto.reposition = function () {\n          this.positionCells();\n          this.positionSliderAtSelected();\n        };\n\n        proto.getSize = function () {\n          this.size = getSize(this.element);\n          this.setCellAlign();\n          this.cursorPosition = this.size.innerWidth * this.cellAlign;\n        };\n\n        var cellAlignShorthands = {\n          // cell align, then based on origin side\n          center: {\n            left: 0.5,\n            right: 0.5,\n          },\n          left: {\n            left: 0,\n            right: 1,\n          },\n          right: {\n            right: 0,\n            left: 1,\n          },\n        };\n\n        proto.setCellAlign = function () {\n          var shorthand = cellAlignShorthands[this.options.cellAlign];\n          this.cellAlign = shorthand\n            ? shorthand[this.originSide]\n            : this.options.cellAlign;\n        };\n\n        proto.setGallerySize = function () {\n          if (this.options.setGallerySize) {\n            var height =\n              this.options.adaptiveHeight && this.selectedSlide\n                ? this.selectedSlide.height\n                : this.maxCellHeight;\n            this.viewport.style.height = height + \"px\";\n          }\n        };\n\n        proto._getWrapShiftCells = function () {\n          // only for wrap-around\n          if (!this.options.wrapAround) {\n            return;\n          } // unshift previous cells\n\n          this._unshiftCells(this.beforeShiftCells);\n\n          this._unshiftCells(this.afterShiftCells); // get before cells\n          // initial gap\n\n          var gapX = this.cursorPosition;\n          var cellIndex = this.cells.length - 1;\n          this.beforeShiftCells = this._getGapCells(gapX, cellIndex, -1); // get after cells\n          // ending gap between last cell and end of gallery viewport\n\n          gapX = this.size.innerWidth - this.cursorPosition; // start cloning at first cell, working forwards\n\n          this.afterShiftCells = this._getGapCells(gapX, 0, 1);\n        };\n\n        proto._getGapCells = function (gapX, cellIndex, increment) {\n          // keep adding cells until the cover the initial gap\n          var cells = [];\n\n          while (gapX > 0) {\n            var cell = this.cells[cellIndex];\n\n            if (!cell) {\n              break;\n            }\n\n            cells.push(cell);\n            cellIndex += increment;\n            gapX -= cell.size.outerWidth;\n          }\n\n          return cells;\n        }; // ----- contain ----- //\n        // contain cell targets so no excess sliding\n\n        proto._containSlides = function () {\n          if (\n            !this.options.contain ||\n            this.options.wrapAround ||\n            !this.cells.length\n          ) {\n            return;\n          }\n\n          var isRightToLeft = this.options.rightToLeft;\n          var beginMargin = isRightToLeft ? \"marginRight\" : \"marginLeft\";\n          var endMargin = isRightToLeft ? \"marginLeft\" : \"marginRight\";\n          var contentWidth =\n            this.slideableWidth - this.getLastCell().size[endMargin]; // content is less than gallery size\n\n          var isContentSmaller = contentWidth < this.size.innerWidth; // bounds\n\n          var beginBound =\n            this.cursorPosition + this.cells[0].size[beginMargin];\n          var endBound =\n            contentWidth - this.size.innerWidth * (1 - this.cellAlign); // contain each cell target\n\n          this.slides.forEach(function (slide) {\n            if (isContentSmaller) {\n              // all cells fit inside gallery\n              slide.target = contentWidth * this.cellAlign;\n            } else {\n              // contain to bounds\n              slide.target = Math.max(slide.target, beginBound);\n              slide.target = Math.min(slide.target, endBound);\n            }\n          }, this);\n        }; // -----  ----- //\n\n        /**\n         * emits events via eventEmitter and jQuery events\n         * @param {String} type - name of event\n         * @param {Event} event - original event\n         * @param {Array} args - extra arguments\n         */\n\n        proto.dispatchEvent = function (type, event, args) {\n          var emitArgs = event ? [event].concat(args) : args;\n          this.emitEvent(type, emitArgs);\n\n          if (jQuery && this.$element) {\n            // default trigger with type if no event\n            type += this.options.namespaceJQueryEvents ? \".flickity\" : \"\";\n            var $event = type;\n\n            if (event) {\n              // create jQuery event\n              var jQEvent = jQuery.Event(event);\n              jQEvent.type = type;\n              $event = jQEvent;\n            }\n\n            this.$element.trigger($event, args);\n          }\n        }; // -------------------------- select -------------------------- //\n\n        /**\n         * @param {Integer} index - index of the slide\n         * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n         * @param {Boolean} isInstant - will immediately set position at selected cell\n         */\n\n        proto.select = function (index, isWrap, isInstant) {\n          if (!this.isActive) {\n            return;\n          }\n\n          index = parseInt(index, 10);\n\n          this._wrapSelect(index);\n\n          if (this.options.wrapAround || isWrap) {\n            index = utils.modulo(index, this.slides.length);\n          } // bail if invalid index\n\n          if (!this.slides[index]) {\n            return;\n          }\n\n          var prevIndex = this.selectedIndex;\n          this.selectedIndex = index;\n          this.updateSelectedSlide();\n\n          if (isInstant) {\n            this.positionSliderAtSelected();\n          } else {\n            this.startAnimation();\n          }\n\n          if (this.options.adaptiveHeight) {\n            this.setGallerySize();\n          } // events\n\n          this.dispatchEvent(\"select\", null, [index]); // change event if new index\n\n          if (index != prevIndex) {\n            this.dispatchEvent(\"change\", null, [index]);\n          } // old v1 event name, remove in v3\n\n          this.dispatchEvent(\"cellSelect\");\n        }; // wraps position for wrapAround, to move to closest slide. #113\n\n        proto._wrapSelect = function (index) {\n          var len = this.slides.length;\n          var isWrapping = this.options.wrapAround && len > 1;\n\n          if (!isWrapping) {\n            return index;\n          }\n\n          var wrapIndex = utils.modulo(index, len); // go to shortest\n\n          var delta = Math.abs(wrapIndex - this.selectedIndex);\n          var backWrapDelta = Math.abs(wrapIndex + len - this.selectedIndex);\n          var forewardWrapDelta = Math.abs(\n            wrapIndex - len - this.selectedIndex\n          );\n\n          if (!this.isDragSelect && backWrapDelta < delta) {\n            index += len;\n          } else if (!this.isDragSelect && forewardWrapDelta < delta) {\n            index -= len;\n          } // wrap position so slider is within normal area\n\n          if (index < 0) {\n            this.x -= this.slideableWidth;\n          } else if (index >= len) {\n            this.x += this.slideableWidth;\n          }\n        };\n\n        proto.previous = function (isWrap, isInstant) {\n          this.select(this.selectedIndex - 1, isWrap, isInstant);\n        };\n\n        proto.next = function (isWrap, isInstant) {\n          this.select(this.selectedIndex + 1, isWrap, isInstant);\n        };\n\n        proto.updateSelectedSlide = function () {\n          var slide = this.slides[this.selectedIndex]; // selectedIndex could be outside of slides, if triggered before resize()\n\n          if (!slide) {\n            return;\n          } // unselect previous selected slide\n\n          this.unselectSelectedSlide(); // update new selected slide\n\n          this.selectedSlide = slide;\n          slide.select();\n          this.selectedCells = slide.cells;\n          this.selectedElements = slide.getCellElements(); // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n          // Remove in v3?\n\n          this.selectedCell = slide.cells[0];\n          this.selectedElement = this.selectedElements[0];\n        };\n\n        proto.unselectSelectedSlide = function () {\n          if (this.selectedSlide) {\n            this.selectedSlide.unselect();\n          }\n        };\n\n        proto.selectInitialIndex = function () {\n          var initialIndex = this.options.initialIndex; // already activated, select previous selectedIndex\n\n          if (this.isInitActivated) {\n            this.select(this.selectedIndex, false, true);\n            return;\n          } // select with selector string\n\n          if (initialIndex && typeof initialIndex == \"string\") {\n            var cell = this.queryCell(initialIndex);\n\n            if (cell) {\n              this.selectCell(initialIndex, false, true);\n              return;\n            }\n          }\n\n          var index = 0; // select with number\n\n          if (initialIndex && this.slides[initialIndex]) {\n            index = initialIndex;\n          } // select instantly\n\n          this.select(index, false, true);\n        };\n        /**\n         * select slide from number or cell element\n         * @param {Element or Number} elem\n         */\n\n        proto.selectCell = function (value, isWrap, isInstant) {\n          // get cell\n          var cell = this.queryCell(value);\n\n          if (!cell) {\n            return;\n          }\n\n          var index = this.getCellSlideIndex(cell);\n          this.select(index, isWrap, isInstant);\n        };\n\n        proto.getCellSlideIndex = function (cell) {\n          // get index of slides that has cell\n          for (var i = 0; i < this.slides.length; i++) {\n            var slide = this.slides[i];\n            var index = slide.cells.indexOf(cell);\n\n            if (index != -1) {\n              return i;\n            }\n          }\n        }; // -------------------------- get cells -------------------------- //\n\n        /**\n         * get Flickity.Cell, given an Element\n         * @param {Element} elem\n         * @returns {Flickity.Cell} item\n         */\n\n        proto.getCell = function (elem) {\n          // loop through cells to get the one that matches\n          for (var i = 0; i < this.cells.length; i++) {\n            var cell = this.cells[i];\n\n            if (cell.element == elem) {\n              return cell;\n            }\n          }\n        };\n        /**\n         * get collection of Flickity.Cells, given Elements\n         * @param {Element, Array, NodeList} elems\n         * @returns {Array} cells - Flickity.Cells\n         */\n\n        proto.getCells = function (elems) {\n          elems = utils.makeArray(elems);\n          var cells = [];\n          elems.forEach(function (elem) {\n            var cell = this.getCell(elem);\n\n            if (cell) {\n              cells.push(cell);\n            }\n          }, this);\n          return cells;\n        };\n        /**\n         * get cell elements\n         * @returns {Array} cellElems\n         */\n\n        proto.getCellElements = function () {\n          return this.cells.map(function (cell) {\n            return cell.element;\n          });\n        };\n        /**\n         * get parent cell from an element\n         * @param {Element} elem\n         * @returns {Flickit.Cell} cell\n         */\n\n        proto.getParentCell = function (elem) {\n          // first check if elem is cell\n          var cell = this.getCell(elem);\n\n          if (cell) {\n            return cell;\n          } // try to get parent cell elem\n\n          elem = utils.getParent(elem, \".flickity-slider > *\");\n          return this.getCell(elem);\n        };\n        /**\n         * get cells adjacent to a slide\n         * @param {Integer} adjCount - number of adjacent slides\n         * @param {Integer} index - index of slide to start\n         * @returns {Array} cells - array of Flickity.Cells\n         */\n\n        proto.getAdjacentCellElements = function (adjCount, index) {\n          if (!adjCount) {\n            return this.selectedSlide.getCellElements();\n          }\n\n          index = index === undefined ? this.selectedIndex : index;\n          var len = this.slides.length;\n\n          if (1 + adjCount * 2 >= len) {\n            return this.getCellElements();\n          }\n\n          var cellElems = [];\n\n          for (var i = index - adjCount; i <= index + adjCount; i++) {\n            var slideIndex = this.options.wrapAround ? utils.modulo(i, len) : i;\n            var slide = this.slides[slideIndex];\n\n            if (slide) {\n              cellElems = cellElems.concat(slide.getCellElements());\n            }\n          }\n\n          return cellElems;\n        };\n        /**\n         * select slide from number or cell element\n         * @param {Element, Selector String, or Number} selector\n         */\n\n        proto.queryCell = function (selector) {\n          if (typeof selector == \"number\") {\n            // use number as index\n            return this.cells[selector];\n          }\n\n          if (typeof selector == \"string\") {\n            // do not select invalid selectors from hash: #123, #/. #791\n            if (selector.match(/^[#\\.]?[\\d\\/]/)) {\n              return;\n            } // use string as selector, get element\n\n            selector = this.element.querySelector(selector);\n          } // get cell from element\n\n          return this.getCell(selector);\n        }; // -------------------------- events -------------------------- //\n\n        proto.uiChange = function () {\n          this.emitEvent(\"uiChange\");\n        }; // keep focus on element when child UI elements are clicked\n\n        proto.childUIPointerDown = function (event) {\n          // HACK iOS does not allow touch events to bubble up?!\n          if (event.type != \"touchstart\") {\n            event.preventDefault();\n          }\n\n          this.focus();\n        }; // ----- resize ----- //\n\n        proto.onresize = function () {\n          this.watchCSS();\n          this.resize();\n        };\n\n        utils.debounceMethod(Flickity, \"onresize\", 150);\n\n        proto.resize = function () {\n          if (!this.isActive) {\n            return;\n          }\n\n          this.getSize(); // wrap values\n\n          if (this.options.wrapAround) {\n            this.x = utils.modulo(this.x, this.slideableWidth);\n          }\n\n          this.positionCells();\n\n          this._getWrapShiftCells();\n\n          this.setGallerySize();\n          this.emitEvent(\"resize\"); // update selected index for group slides, instant\n          // TODO: position can be lost between groups of various numbers\n\n          var selectedElement =\n            this.selectedElements && this.selectedElements[0];\n          this.selectCell(selectedElement, false, true);\n        }; // watches the :after property, activates/deactivates\n\n        proto.watchCSS = function () {\n          var watchOption = this.options.watchCSS;\n\n          if (!watchOption) {\n            return;\n          }\n\n          var afterContent = getComputedStyle(this.element, \":after\").content; // activate if :after { content: 'flickity' }\n\n          if (afterContent.indexOf(\"flickity\") != -1) {\n            this.activate();\n          } else {\n            this.deactivate();\n          }\n        }; // ----- keydown ----- //\n        // go previous/next if left/right keys pressed\n\n        proto.onkeydown = function (event) {\n          // only work if element is in focus\n          var isNotFocused =\n            document.activeElement && document.activeElement != this.element;\n\n          if (!this.options.accessibility || isNotFocused) {\n            return;\n          }\n\n          var handler = Flickity.keyboardHandlers[event.keyCode];\n\n          if (handler) {\n            handler.call(this);\n          }\n        };\n\n        Flickity.keyboardHandlers = {\n          // left arrow\n          37: function _() {\n            var leftMethod = this.options.rightToLeft ? \"next\" : \"previous\";\n            this.uiChange();\n            this[leftMethod]();\n          },\n          // right arrow\n          39: function _() {\n            var rightMethod = this.options.rightToLeft ? \"previous\" : \"next\";\n            this.uiChange();\n            this[rightMethod]();\n          },\n        }; // ----- focus ----- //\n\n        proto.focus = function () {\n          // TODO remove scrollTo once focus options gets more support\n          // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#Browser_compatibility\n          var prevScrollY = window.pageYOffset;\n          this.element.focus({\n            preventScroll: true,\n          }); // hack to fix scroll jump after focus, #76\n\n          if (window.pageYOffset != prevScrollY) {\n            window.scrollTo(window.pageXOffset, prevScrollY);\n          }\n        }; // -------------------------- destroy -------------------------- //\n        // deactivate all Flickity functionality, but keep stuff available\n\n        proto.deactivate = function () {\n          if (!this.isActive) {\n            return;\n          }\n\n          this.element.classList.remove(\"flickity-enabled\");\n          this.element.classList.remove(\"flickity-rtl\");\n          this.unselectSelectedSlide(); // destroy cells\n\n          this.cells.forEach(function (cell) {\n            cell.destroy();\n          });\n          this.element.removeChild(this.viewport); // move child elements back into element\n\n          moveElements(this.slider.children, this.element);\n\n          if (this.options.accessibility) {\n            this.element.removeAttribute(\"tabIndex\");\n            this.element.removeEventListener(\"keydown\", this);\n          } // set flags\n\n          this.isActive = false;\n          this.emitEvent(\"deactivate\");\n        };\n\n        proto.destroy = function () {\n          this.deactivate();\n          window.removeEventListener(\"resize\", this);\n          this.allOff();\n          this.emitEvent(\"destroy\");\n\n          if (jQuery && this.$element) {\n            jQuery.removeData(this.element, \"flickity\");\n          }\n\n          delete this.element.flickityGUID;\n          delete instances[this.guid];\n        }; // -------------------------- prototype -------------------------- //\n\n        utils.extend(proto, animatePrototype); // -------------------------- extras -------------------------- //\n\n        /**\n         * get Flickity instance from element\n         * @param {Element} elem\n         * @returns {Flickity}\n         */\n\n        Flickity.data = function (elem) {\n          elem = utils.getQueryElement(elem);\n          var id = elem && elem.flickityGUID;\n          return id && instances[id];\n        };\n\n        utils.htmlInit(Flickity, \"flickity\");\n\n        if (jQuery && jQuery.bridget) {\n          jQuery.bridget(\"flickity\", Flickity);\n        } // set internal jQuery, for Webpack + jQuery v3, #478\n\n        Flickity.setJQuery = function (jq) {\n          jQuery = jq;\n        };\n\n        Flickity.Cell = Cell;\n        Flickity.Slide = Slide;\n        return Flickity;\n      }\n    );\n  });\n\n  var unipointer = createCommonjsModule(function (module) {\n    /*!\n     * Unipointer v2.3.0\n     * base class for doing one thing with pointer event\n     * MIT license\n     */\n\n    /*jshint browser: true, undef: true, unused: true, strict: true */\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n\n      /*global define, module, require */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(window, evEmitter);\n      } else {\n        // browser global\n        window.Unipointer = factory(window, window.EvEmitter);\n      }\n    })(window, function factory(window, EvEmitter) {\n      function noop() {}\n\n      function Unipointer() {} // inherit EvEmitter\n\n      var proto = (Unipointer.prototype = Object.create(EvEmitter.prototype));\n\n      proto.bindStartEvent = function (elem) {\n        this._bindStartEvent(elem, true);\n      };\n\n      proto.unbindStartEvent = function (elem) {\n        this._bindStartEvent(elem, false);\n      };\n      /**\n       * Add or remove start event\n       * @param {Boolean} isAdd - remove if falsey\n       */\n\n      proto._bindStartEvent = function (elem, isAdd) {\n        // munge isAdd, default to true\n        isAdd = isAdd === undefined ? true : isAdd;\n        var bindMethod = isAdd ? \"addEventListener\" : \"removeEventListener\"; // default to mouse events\n\n        var startEvent = \"mousedown\";\n\n        if (window.PointerEvent) {\n          // Pointer Events\n          startEvent = \"pointerdown\";\n        } else if (\"ontouchstart\" in window) {\n          // Touch Events. iOS Safari\n          startEvent = \"touchstart\";\n        }\n\n        elem[bindMethod](startEvent, this);\n      }; // trigger handler methods for events\n\n      proto.handleEvent = function (event) {\n        var method = \"on\" + event.type;\n\n        if (this[method]) {\n          this[method](event);\n        }\n      }; // returns the touch that we're keeping track of\n\n      proto.getTouch = function (touches) {\n        for (var i = 0; i < touches.length; i++) {\n          var touch = touches[i];\n\n          if (touch.identifier == this.pointerIdentifier) {\n            return touch;\n          }\n        }\n      }; // ----- start event ----- //\n\n      proto.onmousedown = function (event) {\n        // dismiss clicks from right or middle buttons\n        var button = event.button;\n\n        if (button && button !== 0 && button !== 1) {\n          return;\n        }\n\n        this._pointerDown(event, event);\n      };\n\n      proto.ontouchstart = function (event) {\n        this._pointerDown(event, event.changedTouches[0]);\n      };\n\n      proto.onpointerdown = function (event) {\n        this._pointerDown(event, event);\n      };\n      /**\n       * pointer start\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       */\n\n      proto._pointerDown = function (event, pointer) {\n        // dismiss right click and other pointers\n        // button = 0 is okay, 1-4 not\n        if (event.button || this.isPointerDown) {\n          return;\n        }\n\n        this.isPointerDown = true; // save pointer identifier to match up touch events\n\n        this.pointerIdentifier =\n          pointer.pointerId !== undefined // pointerId for pointer events, touch.indentifier for touch events\n            ? pointer.pointerId\n            : pointer.identifier;\n        this.pointerDown(event, pointer);\n      };\n\n      proto.pointerDown = function (event, pointer) {\n        this._bindPostStartEvents(event);\n\n        this.emitEvent(\"pointerDown\", [event, pointer]);\n      }; // hash of events to be bound after start event\n\n      var postStartEvents = {\n        mousedown: [\"mousemove\", \"mouseup\"],\n        touchstart: [\"touchmove\", \"touchend\", \"touchcancel\"],\n        pointerdown: [\"pointermove\", \"pointerup\", \"pointercancel\"],\n      };\n\n      proto._bindPostStartEvents = function (event) {\n        if (!event) {\n          return;\n        } // get proper events to match start event\n\n        var events = postStartEvents[event.type]; // bind events to node\n\n        events.forEach(function (eventName) {\n          window.addEventListener(eventName, this);\n        }, this); // save these arguments\n\n        this._boundPointerEvents = events;\n      };\n\n      proto._unbindPostStartEvents = function () {\n        // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n        if (!this._boundPointerEvents) {\n          return;\n        }\n\n        this._boundPointerEvents.forEach(function (eventName) {\n          window.removeEventListener(eventName, this);\n        }, this);\n\n        delete this._boundPointerEvents;\n      }; // ----- move event ----- //\n\n      proto.onmousemove = function (event) {\n        this._pointerMove(event, event);\n      };\n\n      proto.onpointermove = function (event) {\n        if (event.pointerId == this.pointerIdentifier) {\n          this._pointerMove(event, event);\n        }\n      };\n\n      proto.ontouchmove = function (event) {\n        var touch = this.getTouch(event.changedTouches);\n\n        if (touch) {\n          this._pointerMove(event, touch);\n        }\n      };\n      /**\n       * pointer move\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       * @private\n       */\n\n      proto._pointerMove = function (event, pointer) {\n        this.pointerMove(event, pointer);\n      }; // public\n\n      proto.pointerMove = function (event, pointer) {\n        this.emitEvent(\"pointerMove\", [event, pointer]);\n      }; // ----- end event ----- //\n\n      proto.onmouseup = function (event) {\n        this._pointerUp(event, event);\n      };\n\n      proto.onpointerup = function (event) {\n        if (event.pointerId == this.pointerIdentifier) {\n          this._pointerUp(event, event);\n        }\n      };\n\n      proto.ontouchend = function (event) {\n        var touch = this.getTouch(event.changedTouches);\n\n        if (touch) {\n          this._pointerUp(event, touch);\n        }\n      };\n      /**\n       * pointer up\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       * @private\n       */\n\n      proto._pointerUp = function (event, pointer) {\n        this._pointerDone();\n\n        this.pointerUp(event, pointer);\n      }; // public\n\n      proto.pointerUp = function (event, pointer) {\n        this.emitEvent(\"pointerUp\", [event, pointer]);\n      }; // ----- pointer done ----- //\n      // triggered on pointer up & pointer cancel\n\n      proto._pointerDone = function () {\n        this._pointerReset();\n\n        this._unbindPostStartEvents();\n\n        this.pointerDone();\n      };\n\n      proto._pointerReset = function () {\n        // reset properties\n        this.isPointerDown = false;\n        delete this.pointerIdentifier;\n      };\n\n      proto.pointerDone = noop; // ----- pointer cancel ----- //\n\n      proto.onpointercancel = function (event) {\n        if (event.pointerId == this.pointerIdentifier) {\n          this._pointerCancel(event, event);\n        }\n      };\n\n      proto.ontouchcancel = function (event) {\n        var touch = this.getTouch(event.changedTouches);\n\n        if (touch) {\n          this._pointerCancel(event, touch);\n        }\n      };\n      /**\n       * pointer cancel\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       * @private\n       */\n\n      proto._pointerCancel = function (event, pointer) {\n        this._pointerDone();\n\n        this.pointerCancel(event, pointer);\n      }; // public\n\n      proto.pointerCancel = function (event, pointer) {\n        this.emitEvent(\"pointerCancel\", [event, pointer]);\n      }; // -----  ----- //\n      // utility function for getting x/y coords from event\n\n      Unipointer.getPointerPoint = function (pointer) {\n        return {\n          x: pointer.pageX,\n          y: pointer.pageY,\n        };\n      }; // -----  ----- //\n\n      return Unipointer;\n    });\n  });\n\n  var unidragger = createCommonjsModule(function (module) {\n    /*!\n     * Unidragger v2.3.1\n     * Draggable base class\n     * MIT license\n     */\n\n    /*jshint browser: true, unused: true, undef: true, strict: true */\n    (function (window, factory) {\n      // universal module definition\n\n      /*jshint strict: false */\n\n      /*globals define, module, require */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(window, unipointer);\n      } else {\n        // browser global\n        window.Unidragger = factory(window, window.Unipointer);\n      }\n    })(window, function factory(window, Unipointer) {\n      function Unidragger() {} // inherit Unipointer & EvEmitter\n\n      var proto = (Unidragger.prototype = Object.create(Unipointer.prototype)); // ----- bind start ----- //\n\n      proto.bindHandles = function () {\n        this._bindHandles(true);\n      };\n\n      proto.unbindHandles = function () {\n        this._bindHandles(false);\n      };\n      /**\n       * Add or remove start event\n       * @param {Boolean} isAdd\n       */\n\n      proto._bindHandles = function (isAdd) {\n        // munge isAdd, default to true\n        isAdd = isAdd === undefined ? true : isAdd; // bind each handle\n\n        var bindMethod = isAdd ? \"addEventListener\" : \"removeEventListener\";\n        var touchAction = isAdd ? this._touchActionValue : \"\";\n\n        for (var i = 0; i < this.handles.length; i++) {\n          var handle = this.handles[i];\n\n          this._bindStartEvent(handle, isAdd);\n\n          handle[bindMethod](\"click\", this); // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n\n          if (window.PointerEvent) {\n            handle.style.touchAction = touchAction;\n          }\n        }\n      }; // prototype so it can be overwriteable by Flickity\n\n      proto._touchActionValue = \"none\"; // ----- start event ----- //\n\n      /**\n       * pointer start\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       */\n\n      proto.pointerDown = function (event, pointer) {\n        var isOkay = this.okayPointerDown(event);\n\n        if (!isOkay) {\n          return;\n        } // track start event position\n        // Safari 9 overrides pageX and pageY. These values needs to be copied. flickity#842\n\n        this.pointerDownPointer = {\n          pageX: pointer.pageX,\n          pageY: pointer.pageY,\n        };\n        event.preventDefault();\n        this.pointerDownBlur(); // bind move and end events\n\n        this._bindPostStartEvents(event);\n\n        this.emitEvent(\"pointerDown\", [event, pointer]);\n      }; // nodes that have text fields\n\n      var cursorNodes = {\n        TEXTAREA: true,\n        INPUT: true,\n        SELECT: true,\n        OPTION: true,\n      }; // input types that do not have text fields\n\n      var clickTypes = {\n        radio: true,\n        checkbox: true,\n        button: true,\n        submit: true,\n        image: true,\n        file: true,\n      }; // dismiss inputs with text fields. flickity#403, flickity#404\n\n      proto.okayPointerDown = function (event) {\n        var isCursorNode = cursorNodes[event.target.nodeName];\n        var isClickType = clickTypes[event.target.type];\n        var isOkay = !isCursorNode || isClickType;\n\n        if (!isOkay) {\n          this._pointerReset();\n        }\n\n        return isOkay;\n      }; // kludge to blur previously focused input\n\n      proto.pointerDownBlur = function () {\n        var focused = document.activeElement; // do not blur body for IE10, metafizzy/flickity#117\n\n        var canBlur = focused && focused.blur && focused != document.body;\n\n        if (canBlur) {\n          focused.blur();\n        }\n      }; // ----- move event ----- //\n\n      /**\n       * drag move\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       */\n\n      proto.pointerMove = function (event, pointer) {\n        var moveVector = this._dragPointerMove(event, pointer);\n\n        this.emitEvent(\"pointerMove\", [event, pointer, moveVector]);\n\n        this._dragMove(event, pointer, moveVector);\n      }; // base pointer move logic\n\n      proto._dragPointerMove = function (event, pointer) {\n        var moveVector = {\n          x: pointer.pageX - this.pointerDownPointer.pageX,\n          y: pointer.pageY - this.pointerDownPointer.pageY,\n        }; // start drag if pointer has moved far enough to start drag\n\n        if (!this.isDragging && this.hasDragStarted(moveVector)) {\n          this._dragStart(event, pointer);\n        }\n\n        return moveVector;\n      }; // condition if pointer has moved far enough to start drag\n\n      proto.hasDragStarted = function (moveVector) {\n        return Math.abs(moveVector.x) > 3 || Math.abs(moveVector.y) > 3;\n      }; // ----- end event ----- //\n\n      /**\n       * pointer up\n       * @param {Event} event\n       * @param {Event or Touch} pointer\n       */\n\n      proto.pointerUp = function (event, pointer) {\n        this.emitEvent(\"pointerUp\", [event, pointer]);\n\n        this._dragPointerUp(event, pointer);\n      };\n\n      proto._dragPointerUp = function (event, pointer) {\n        if (this.isDragging) {\n          this._dragEnd(event, pointer);\n        } else {\n          // pointer didn't move enough for drag to start\n          this._staticClick(event, pointer);\n        }\n      }; // -------------------------- drag -------------------------- //\n      // dragStart\n\n      proto._dragStart = function (event, pointer) {\n        this.isDragging = true; // prevent clicks\n\n        this.isPreventingClicks = true;\n        this.dragStart(event, pointer);\n      };\n\n      proto.dragStart = function (event, pointer) {\n        this.emitEvent(\"dragStart\", [event, pointer]);\n      }; // dragMove\n\n      proto._dragMove = function (event, pointer, moveVector) {\n        // do not drag if not dragging yet\n        if (!this.isDragging) {\n          return;\n        }\n\n        this.dragMove(event, pointer, moveVector);\n      };\n\n      proto.dragMove = function (event, pointer, moveVector) {\n        event.preventDefault();\n        this.emitEvent(\"dragMove\", [event, pointer, moveVector]);\n      }; // dragEnd\n\n      proto._dragEnd = function (event, pointer) {\n        // set flags\n        this.isDragging = false; // re-enable clicking async\n\n        setTimeout(\n          function () {\n            delete this.isPreventingClicks;\n          }.bind(this)\n        );\n        this.dragEnd(event, pointer);\n      };\n\n      proto.dragEnd = function (event, pointer) {\n        this.emitEvent(\"dragEnd\", [event, pointer]);\n      }; // ----- onclick ----- //\n      // handle all clicks and prevent clicks when dragging\n\n      proto.onclick = function (event) {\n        if (this.isPreventingClicks) {\n          event.preventDefault();\n        }\n      }; // ----- staticClick ----- //\n      // triggered after pointer down & up with no/tiny movement\n\n      proto._staticClick = function (event, pointer) {\n        // ignore emulated mouse up clicks\n        if (this.isIgnoringMouseUp && event.type == \"mouseup\") {\n          return;\n        }\n\n        this.staticClick(event, pointer); // set flag for emulated clicks 300ms after touchend\n\n        if (event.type != \"mouseup\") {\n          this.isIgnoringMouseUp = true; // reset flag after 300ms\n\n          setTimeout(\n            function () {\n              delete this.isIgnoringMouseUp;\n            }.bind(this),\n            400\n          );\n        }\n      };\n\n      proto.staticClick = function (event, pointer) {\n        this.emitEvent(\"staticClick\", [event, pointer]);\n      }; // ----- utils ----- //\n\n      Unidragger.getPointerPoint = Unipointer.getPointerPoint; // -----  ----- //\n\n      return Unidragger;\n    });\n  });\n\n  var drag = createCommonjsModule(function (module) {\n    // drag\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(window, flickity, unidragger, utils);\n      } else {\n        // browser global\n        window.Flickity = factory(\n          window,\n          window.Flickity,\n          window.Unidragger,\n          window.fizzyUIUtils\n        );\n      }\n    })(window, function factory(window, Flickity, Unidragger, utils) {\n      utils.extend(Flickity.defaults, {\n        draggable: \">1\",\n        dragThreshold: 3,\n      }); // ----- create ----- //\n\n      Flickity.createMethods.push(\"_createDrag\"); // -------------------------- drag prototype -------------------------- //\n\n      var proto = Flickity.prototype;\n      utils.extend(proto, Unidragger.prototype);\n      proto._touchActionValue = \"pan-y\"; // --------------------------  -------------------------- //\n\n      var isTouch = \"createTouch\" in document;\n      var isTouchmoveScrollCanceled = false;\n\n      proto._createDrag = function () {\n        this.on(\"activate\", this.onActivateDrag);\n        this.on(\"uiChange\", this._uiChangeDrag);\n        this.on(\"deactivate\", this.onDeactivateDrag);\n        this.on(\"cellChange\", this.updateDraggable); // TODO updateDraggable on resize? if groupCells & slides change\n        // HACK - add seemingly innocuous handler to fix iOS 10 scroll behavior\n        // #457, RubaXa/Sortable#973\n\n        if (isTouch && !isTouchmoveScrollCanceled) {\n          window.addEventListener(\"touchmove\", function () {});\n          isTouchmoveScrollCanceled = true;\n        }\n      };\n\n      proto.onActivateDrag = function () {\n        this.handles = [this.viewport];\n        this.bindHandles();\n        this.updateDraggable();\n      };\n\n      proto.onDeactivateDrag = function () {\n        this.unbindHandles();\n        this.element.classList.remove(\"is-draggable\");\n      };\n\n      proto.updateDraggable = function () {\n        // disable dragging if less than 2 slides. #278\n        if (this.options.draggable == \">1\") {\n          this.isDraggable = this.slides.length > 1;\n        } else {\n          this.isDraggable = this.options.draggable;\n        }\n\n        if (this.isDraggable) {\n          this.element.classList.add(\"is-draggable\");\n        } else {\n          this.element.classList.remove(\"is-draggable\");\n        }\n      }; // backwards compatibility\n\n      proto.bindDrag = function () {\n        this.options.draggable = true;\n        this.updateDraggable();\n      };\n\n      proto.unbindDrag = function () {\n        this.options.draggable = false;\n        this.updateDraggable();\n      };\n\n      proto._uiChangeDrag = function () {\n        delete this.isFreeScrolling;\n      }; // -------------------------- pointer events -------------------------- //\n\n      proto.pointerDown = function (event, pointer) {\n        if (!this.isDraggable) {\n          this._pointerDownDefault(event, pointer);\n\n          return;\n        }\n\n        var isOkay = this.okayPointerDown(event);\n\n        if (!isOkay) {\n          return;\n        }\n\n        this._pointerDownPreventDefault(event);\n\n        this.pointerDownFocus(event); // blur\n\n        if (document.activeElement != this.element) {\n          // do not blur if already focused\n          this.pointerDownBlur();\n        } // stop if it was moving\n\n        this.dragX = this.x;\n        this.viewport.classList.add(\"is-pointer-down\"); // track scrolling\n\n        this.pointerDownScroll = getScrollPosition();\n        window.addEventListener(\"scroll\", this);\n\n        this._pointerDownDefault(event, pointer);\n      }; // default pointerDown logic, used for staticClick\n\n      proto._pointerDownDefault = function (event, pointer) {\n        // track start event position\n        // Safari 9 overrides pageX and pageY. These values needs to be copied. #779\n        this.pointerDownPointer = {\n          pageX: pointer.pageX,\n          pageY: pointer.pageY,\n        }; // bind move and end events\n\n        this._bindPostStartEvents(event);\n\n        this.dispatchEvent(\"pointerDown\", event, [pointer]);\n      };\n\n      var focusNodes = {\n        INPUT: true,\n        TEXTAREA: true,\n        SELECT: true,\n      };\n\n      proto.pointerDownFocus = function (event) {\n        var isFocusNode = focusNodes[event.target.nodeName];\n\n        if (!isFocusNode) {\n          this.focus();\n        }\n      };\n\n      proto._pointerDownPreventDefault = function (event) {\n        var isTouchStart = event.type == \"touchstart\";\n        var isTouchPointer = event.pointerType == \"touch\";\n        var isFocusNode = focusNodes[event.target.nodeName];\n\n        if (!isTouchStart && !isTouchPointer && !isFocusNode) {\n          event.preventDefault();\n        }\n      }; // ----- move ----- //\n\n      proto.hasDragStarted = function (moveVector) {\n        return Math.abs(moveVector.x) > this.options.dragThreshold;\n      }; // ----- up ----- //\n\n      proto.pointerUp = function (event, pointer) {\n        delete this.isTouchScrolling;\n        this.viewport.classList.remove(\"is-pointer-down\");\n        this.dispatchEvent(\"pointerUp\", event, [pointer]);\n\n        this._dragPointerUp(event, pointer);\n      };\n\n      proto.pointerDone = function () {\n        window.removeEventListener(\"scroll\", this);\n        delete this.pointerDownScroll;\n      }; // -------------------------- dragging -------------------------- //\n\n      proto.dragStart = function (event, pointer) {\n        if (!this.isDraggable) {\n          return;\n        }\n\n        this.dragStartPosition = this.x;\n        this.startAnimation();\n        window.removeEventListener(\"scroll\", this);\n        this.dispatchEvent(\"dragStart\", event, [pointer]);\n      };\n\n      proto.pointerMove = function (event, pointer) {\n        var moveVector = this._dragPointerMove(event, pointer);\n\n        this.dispatchEvent(\"pointerMove\", event, [pointer, moveVector]);\n\n        this._dragMove(event, pointer, moveVector);\n      };\n\n      proto.dragMove = function (event, pointer, moveVector) {\n        if (!this.isDraggable) {\n          return;\n        }\n\n        event.preventDefault();\n        this.previousDragX = this.dragX; // reverse if right-to-left\n\n        var direction = this.options.rightToLeft ? -1 : 1;\n\n        if (this.options.wrapAround) {\n          // wrap around move. #589\n          moveVector.x = moveVector.x % this.slideableWidth;\n        }\n\n        var dragX = this.dragStartPosition + moveVector.x * direction;\n\n        if (!this.options.wrapAround && this.slides.length) {\n          // slow drag\n          var originBound = Math.max(\n            -this.slides[0].target,\n            this.dragStartPosition\n          );\n          dragX = dragX > originBound ? (dragX + originBound) * 0.5 : dragX;\n          var endBound = Math.min(\n            -this.getLastSlide().target,\n            this.dragStartPosition\n          );\n          dragX = dragX < endBound ? (dragX + endBound) * 0.5 : dragX;\n        }\n\n        this.dragX = dragX;\n        this.dragMoveTime = new Date();\n        this.dispatchEvent(\"dragMove\", event, [pointer, moveVector]);\n      };\n\n      proto.dragEnd = function (event, pointer) {\n        if (!this.isDraggable) {\n          return;\n        }\n\n        if (this.options.freeScroll) {\n          this.isFreeScrolling = true;\n        } // set selectedIndex based on where flick will end up\n\n        var index = this.dragEndRestingSelect();\n\n        if (this.options.freeScroll && !this.options.wrapAround) {\n          // if free-scroll & not wrap around\n          // do not free-scroll if going outside of bounding slides\n          // so bounding slides can attract slider, and keep it in bounds\n          var restingX = this.getRestingPosition();\n          this.isFreeScrolling =\n            -restingX > this.slides[0].target &&\n            -restingX < this.getLastSlide().target;\n        } else if (!this.options.freeScroll && index == this.selectedIndex) {\n          // boost selection if selected index has not changed\n          index += this.dragEndBoostSelect();\n        }\n\n        delete this.previousDragX; // apply selection\n        // TODO refactor this, selecting here feels weird\n        // HACK, set flag so dragging stays in correct direction\n\n        this.isDragSelect = this.options.wrapAround;\n        this.select(index);\n        delete this.isDragSelect;\n        this.dispatchEvent(\"dragEnd\", event, [pointer]);\n      };\n\n      proto.dragEndRestingSelect = function () {\n        var restingX = this.getRestingPosition(); // how far away from selected slide\n\n        var distance = Math.abs(\n          this.getSlideDistance(-restingX, this.selectedIndex)\n        ); // get closet resting going up and going down\n\n        var positiveResting = this._getClosestResting(restingX, distance, 1);\n\n        var negativeResting = this._getClosestResting(restingX, distance, -1); // use closer resting for wrap-around\n\n        var index =\n          positiveResting.distance < negativeResting.distance\n            ? positiveResting.index\n            : negativeResting.index;\n        return index;\n      };\n      /**\n       * given resting X and distance to selected cell\n       * get the distance and index of the closest cell\n       * @param {Number} restingX - estimated post-flick resting position\n       * @param {Number} distance - distance to selected cell\n       * @param {Integer} increment - +1 or -1, going up or down\n       * @returns {Object} - { distance: {Number}, index: {Integer} }\n       */\n\n      proto._getClosestResting = function (restingX, distance, increment) {\n        var index = this.selectedIndex;\n        var minDistance = Infinity;\n        var condition =\n          this.options.contain && !this.options.wrapAround // if contain, keep going if distance is equal to minDistance\n            ? function (d, md) {\n                return d <= md;\n              }\n            : function (d, md) {\n                return d < md;\n              };\n\n        while (condition(distance, minDistance)) {\n          // measure distance to next cell\n          index += increment;\n          minDistance = distance;\n          distance = this.getSlideDistance(-restingX, index);\n\n          if (distance === null) {\n            break;\n          }\n\n          distance = Math.abs(distance);\n        }\n\n        return {\n          distance: minDistance,\n          // selected was previous index\n          index: index - increment,\n        };\n      };\n      /**\n       * measure distance between x and a slide target\n       * @param {Number} x\n       * @param {Integer} index - slide index\n       */\n\n      proto.getSlideDistance = function (x, index) {\n        var len = this.slides.length; // wrap around if at least 2 slides\n\n        var isWrapAround = this.options.wrapAround && len > 1;\n        var slideIndex = isWrapAround ? utils.modulo(index, len) : index;\n        var slide = this.slides[slideIndex];\n\n        if (!slide) {\n          return null;\n        } // add distance for wrap-around slides\n\n        var wrap = isWrapAround\n          ? this.slideableWidth * Math.floor(index / len)\n          : 0;\n        return x - (slide.target + wrap);\n      };\n\n      proto.dragEndBoostSelect = function () {\n        // do not boost if no previousDragX or dragMoveTime\n        if (\n          this.previousDragX === undefined ||\n          !this.dragMoveTime || // or if drag was held for 100 ms\n          new Date() - this.dragMoveTime > 100\n        ) {\n          return 0;\n        }\n\n        var distance = this.getSlideDistance(-this.dragX, this.selectedIndex);\n        var delta = this.previousDragX - this.dragX;\n\n        if (distance > 0 && delta > 0) {\n          // boost to next if moving towards the right, and positive velocity\n          return 1;\n        } else if (distance < 0 && delta < 0) {\n          // boost to previous if moving towards the left, and negative velocity\n          return -1;\n        }\n\n        return 0;\n      }; // ----- staticClick ----- //\n\n      proto.staticClick = function (event, pointer) {\n        // get clickedCell, if cell was clicked\n        var clickedCell = this.getParentCell(event.target);\n        var cellElem = clickedCell && clickedCell.element;\n        var cellIndex = clickedCell && this.cells.indexOf(clickedCell);\n        this.dispatchEvent(\"staticClick\", event, [\n          pointer,\n          cellElem,\n          cellIndex,\n        ]);\n      }; // ----- scroll ----- //\n\n      proto.onscroll = function () {\n        var scroll = getScrollPosition();\n        var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n        var scrollMoveY = this.pointerDownScroll.y - scroll.y; // cancel click/tap if scroll is too much\n\n        if (Math.abs(scrollMoveX) > 3 || Math.abs(scrollMoveY) > 3) {\n          this._pointerDone();\n        }\n      }; // ----- utils ----- //\n\n      function getScrollPosition() {\n        return {\n          x: window.pageXOffset,\n          y: window.pageYOffset,\n        };\n      } // -----  ----- //\n\n      return Flickity;\n    });\n  });\n\n  var prevNextButton = createCommonjsModule(function (module) {\n    // prev/next buttons\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(window, flickity, unipointer, utils);\n      } else {\n        // browser global\n        factory(\n          window,\n          window.Flickity,\n          window.Unipointer,\n          window.fizzyUIUtils\n        );\n      }\n    })(window, function factory(window, Flickity, Unipointer, utils) {\n      var svgURI = \"http://www.w3.org/2000/svg\"; // -------------------------- PrevNextButton -------------------------- //\n\n      function PrevNextButton(direction, parent) {\n        this.direction = direction;\n        this.parent = parent;\n\n        this._create();\n      }\n\n      PrevNextButton.prototype = Object.create(Unipointer.prototype);\n\n      PrevNextButton.prototype._create = function () {\n        // properties\n        this.isEnabled = true;\n        this.isPrevious = this.direction == -1;\n        var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n        this.isLeft = this.direction == leftDirection;\n        var element = (this.element = document.createElement(\"button\"));\n        element.className = \"flickity-button flickity-prev-next-button\";\n        element.className += this.isPrevious ? \" previous\" : \" next\"; // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n\n        element.setAttribute(\"type\", \"button\"); // init as disabled\n\n        this.disable();\n        element.setAttribute(\n          \"aria-label\",\n          this.isPrevious ? \"Previous\" : \"Next\"\n        ); // create arrow\n\n        var svg = this.createSVG();\n        element.appendChild(svg); // events\n\n        this.parent.on(\"select\", this.update.bind(this));\n        this.on(\n          \"pointerDown\",\n          this.parent.childUIPointerDown.bind(this.parent)\n        );\n      };\n\n      PrevNextButton.prototype.activate = function () {\n        this.bindStartEvent(this.element);\n        this.element.addEventListener(\"click\", this); // add to DOM\n\n        this.parent.element.appendChild(this.element);\n      };\n\n      PrevNextButton.prototype.deactivate = function () {\n        // remove from DOM\n        this.parent.element.removeChild(this.element); // click events\n\n        this.unbindStartEvent(this.element);\n        this.element.removeEventListener(\"click\", this);\n      };\n\n      PrevNextButton.prototype.createSVG = function () {\n        var svg = document.createElementNS(svgURI, \"svg\");\n        svg.setAttribute(\"class\", \"flickity-button-icon\");\n        svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n        var path = document.createElementNS(svgURI, \"path\");\n        var pathMovements = getArrowMovements(this.parent.options.arrowShape);\n        path.setAttribute(\"d\", pathMovements);\n        path.setAttribute(\"class\", \"arrow\"); // rotate arrow\n\n        if (!this.isLeft) {\n          path.setAttribute(\"transform\", \"translate(100, 100) rotate(180) \");\n        }\n\n        svg.appendChild(path);\n        return svg;\n      }; // get SVG path movmement\n\n      function getArrowMovements(shape) {\n        // use shape as movement if string\n        if (typeof shape == \"string\") {\n          return shape;\n        } // create movement string\n\n        return (\n          \"M \" +\n          shape.x0 +\n          \",50\" +\n          \" L \" +\n          shape.x1 +\n          \",\" +\n          (shape.y1 + 50) +\n          \" L \" +\n          shape.x2 +\n          \",\" +\n          (shape.y2 + 50) +\n          \" L \" +\n          shape.x3 +\n          \",50 \" +\n          \" L \" +\n          shape.x2 +\n          \",\" +\n          (50 - shape.y2) +\n          \" L \" +\n          shape.x1 +\n          \",\" +\n          (50 - shape.y1) +\n          \" Z\"\n        );\n      }\n\n      PrevNextButton.prototype.handleEvent = utils.handleEvent;\n\n      PrevNextButton.prototype.onclick = function () {\n        if (!this.isEnabled) {\n          return;\n        }\n\n        this.parent.uiChange();\n        var method = this.isPrevious ? \"previous\" : \"next\";\n        this.parent[method]();\n      }; // -----  ----- //\n\n      PrevNextButton.prototype.enable = function () {\n        if (this.isEnabled) {\n          return;\n        }\n\n        this.element.disabled = false;\n        this.isEnabled = true;\n      };\n\n      PrevNextButton.prototype.disable = function () {\n        if (!this.isEnabled) {\n          return;\n        }\n\n        this.element.disabled = true;\n        this.isEnabled = false;\n      };\n\n      PrevNextButton.prototype.update = function () {\n        // index of first or last slide, if previous or next\n        var slides = this.parent.slides; // enable is wrapAround and at least 2 slides\n\n        if (this.parent.options.wrapAround && slides.length > 1) {\n          this.enable();\n          return;\n        }\n\n        var lastIndex = slides.length ? slides.length - 1 : 0;\n        var boundIndex = this.isPrevious ? 0 : lastIndex;\n        var method =\n          this.parent.selectedIndex == boundIndex ? \"disable\" : \"enable\";\n        this[method]();\n      };\n\n      PrevNextButton.prototype.destroy = function () {\n        this.deactivate();\n        this.allOff();\n      }; // -------------------------- Flickity prototype -------------------------- //\n\n      utils.extend(Flickity.defaults, {\n        prevNextButtons: true,\n        arrowShape: {\n          x0: 10,\n          x1: 60,\n          y1: 50,\n          x2: 70,\n          y2: 40,\n          x3: 30,\n        },\n      });\n      Flickity.createMethods.push(\"_createPrevNextButtons\");\n      var proto = Flickity.prototype;\n\n      proto._createPrevNextButtons = function () {\n        if (!this.options.prevNextButtons) {\n          return;\n        }\n\n        this.prevButton = new PrevNextButton(-1, this);\n        this.nextButton = new PrevNextButton(1, this);\n        this.on(\"activate\", this.activatePrevNextButtons);\n      };\n\n      proto.activatePrevNextButtons = function () {\n        this.prevButton.activate();\n        this.nextButton.activate();\n        this.on(\"deactivate\", this.deactivatePrevNextButtons);\n      };\n\n      proto.deactivatePrevNextButtons = function () {\n        this.prevButton.deactivate();\n        this.nextButton.deactivate();\n        this.off(\"deactivate\", this.deactivatePrevNextButtons);\n      }; // --------------------------  -------------------------- //\n\n      Flickity.PrevNextButton = PrevNextButton;\n      return Flickity;\n    });\n  });\n\n  var pageDots = createCommonjsModule(function (module) {\n    // page dots\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(window, flickity, unipointer, utils);\n      } else {\n        // browser global\n        factory(\n          window,\n          window.Flickity,\n          window.Unipointer,\n          window.fizzyUIUtils\n        );\n      }\n    })(window, function factory(window, Flickity, Unipointer, utils) {\n      function PageDots(parent) {\n        this.parent = parent;\n\n        this._create();\n      }\n\n      PageDots.prototype = Object.create(Unipointer.prototype);\n\n      PageDots.prototype._create = function () {\n        // create holder element\n        this.holder = document.createElement(\"ol\");\n        this.holder.className = \"flickity-page-dots\"; // create dots, array of elements\n\n        this.dots = []; // events\n\n        this.handleClick = this.onClick.bind(this);\n        this.on(\n          \"pointerDown\",\n          this.parent.childUIPointerDown.bind(this.parent)\n        );\n      };\n\n      PageDots.prototype.activate = function () {\n        this.setDots();\n        this.holder.addEventListener(\"click\", this.handleClick);\n        this.bindStartEvent(this.holder); // add to DOM\n\n        this.parent.element.appendChild(this.holder);\n      };\n\n      PageDots.prototype.deactivate = function () {\n        this.holder.removeEventListener(\"click\", this.handleClick);\n        this.unbindStartEvent(this.holder); // remove from DOM\n\n        this.parent.element.removeChild(this.holder);\n      };\n\n      PageDots.prototype.setDots = function () {\n        // get difference between number of slides and number of dots\n        var delta = this.parent.slides.length - this.dots.length;\n\n        if (delta > 0) {\n          this.addDots(delta);\n        } else if (delta < 0) {\n          this.removeDots(-delta);\n        }\n      };\n\n      PageDots.prototype.addDots = function (count) {\n        var fragment = document.createDocumentFragment();\n        var newDots = [];\n        var length = this.dots.length;\n        var max = length + count;\n\n        for (var i = length; i < max; i++) {\n          var dot = document.createElement(\"li\");\n          dot.className = \"dot\";\n          dot.setAttribute(\"aria-label\", \"Page dot \" + (i + 1));\n          fragment.appendChild(dot);\n          newDots.push(dot);\n        }\n\n        this.holder.appendChild(fragment);\n        this.dots = this.dots.concat(newDots);\n      };\n\n      PageDots.prototype.removeDots = function (count) {\n        // remove from this.dots collection\n        var removeDots = this.dots.splice(this.dots.length - count, count); // remove from DOM\n\n        removeDots.forEach(function (dot) {\n          this.holder.removeChild(dot);\n        }, this);\n      };\n\n      PageDots.prototype.updateSelected = function () {\n        // remove selected class on previous\n        if (this.selectedDot) {\n          this.selectedDot.className = \"dot\";\n          this.selectedDot.removeAttribute(\"aria-current\");\n        } // don't proceed if no dots\n\n        if (!this.dots.length) {\n          return;\n        }\n\n        this.selectedDot = this.dots[this.parent.selectedIndex];\n        this.selectedDot.className = \"dot is-selected\";\n        this.selectedDot.setAttribute(\"aria-current\", \"step\");\n      };\n\n      PageDots.prototype.onTap = // old method name, backwards-compatible\n        PageDots.prototype.onClick = function (event) {\n          var target = event.target; // only care about dot clicks\n\n          if (target.nodeName != \"LI\") {\n            return;\n          }\n\n          this.parent.uiChange();\n          var index = this.dots.indexOf(target);\n          this.parent.select(index);\n        };\n\n      PageDots.prototype.destroy = function () {\n        this.deactivate();\n        this.allOff();\n      };\n\n      Flickity.PageDots = PageDots; // -------------------------- Flickity -------------------------- //\n\n      utils.extend(Flickity.defaults, {\n        pageDots: true,\n      });\n      Flickity.createMethods.push(\"_createPageDots\");\n      var proto = Flickity.prototype;\n\n      proto._createPageDots = function () {\n        if (!this.options.pageDots) {\n          return;\n        }\n\n        this.pageDots = new PageDots(this); // events\n\n        this.on(\"activate\", this.activatePageDots);\n        this.on(\"select\", this.updateSelectedPageDots);\n        this.on(\"cellChange\", this.updatePageDots);\n        this.on(\"resize\", this.updatePageDots);\n        this.on(\"deactivate\", this.deactivatePageDots);\n      };\n\n      proto.activatePageDots = function () {\n        this.pageDots.activate();\n      };\n\n      proto.updateSelectedPageDots = function () {\n        this.pageDots.updateSelected();\n      };\n\n      proto.updatePageDots = function () {\n        this.pageDots.setDots();\n      };\n\n      proto.deactivatePageDots = function () {\n        this.pageDots.deactivate();\n      }; // -----  ----- //\n\n      Flickity.PageDots = PageDots;\n      return Flickity;\n    });\n  });\n\n  var player = createCommonjsModule(function (module) {\n    // player & autoPlay\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(evEmitter, utils, flickity);\n      } else {\n        // browser global\n        factory(window.EvEmitter, window.fizzyUIUtils, window.Flickity);\n      }\n    })(window, function factory(EvEmitter, utils, Flickity) {\n      function Player(parent) {\n        this.parent = parent;\n        this.state = \"stopped\"; // visibility change event handler\n\n        this.onVisibilityChange = this.visibilityChange.bind(this);\n        this.onVisibilityPlay = this.visibilityPlay.bind(this);\n      }\n\n      Player.prototype = Object.create(EvEmitter.prototype); // start play\n\n      Player.prototype.play = function () {\n        if (this.state == \"playing\") {\n          return;\n        } // do not play if page is hidden, start playing when page is visible\n\n        var isPageHidden = document.hidden;\n\n        if (isPageHidden) {\n          document.addEventListener(\"visibilitychange\", this.onVisibilityPlay);\n          return;\n        }\n\n        this.state = \"playing\"; // listen to visibility change\n\n        document.addEventListener(\"visibilitychange\", this.onVisibilityChange); // start ticking\n\n        this.tick();\n      };\n\n      Player.prototype.tick = function () {\n        // do not tick if not playing\n        if (this.state != \"playing\") {\n          return;\n        }\n\n        var time = this.parent.options.autoPlay; // default to 3 seconds\n\n        time = typeof time == \"number\" ? time : 3000;\n\n        var _this = this; // HACK: reset ticks if stopped and started within interval\n\n        this.clear();\n        this.timeout = setTimeout(function () {\n          _this.parent.next(true);\n\n          _this.tick();\n        }, time);\n      };\n\n      Player.prototype.stop = function () {\n        this.state = \"stopped\";\n        this.clear(); // remove visibility change event\n\n        document.removeEventListener(\n          \"visibilitychange\",\n          this.onVisibilityChange\n        );\n      };\n\n      Player.prototype.clear = function () {\n        clearTimeout(this.timeout);\n      };\n\n      Player.prototype.pause = function () {\n        if (this.state == \"playing\") {\n          this.state = \"paused\";\n          this.clear();\n        }\n      };\n\n      Player.prototype.unpause = function () {\n        // re-start play if paused\n        if (this.state == \"paused\") {\n          this.play();\n        }\n      }; // pause if page visibility is hidden, unpause if visible\n\n      Player.prototype.visibilityChange = function () {\n        var isPageHidden = document.hidden;\n        this[isPageHidden ? \"pause\" : \"unpause\"]();\n      };\n\n      Player.prototype.visibilityPlay = function () {\n        this.play();\n        document.removeEventListener(\"visibilitychange\", this.onVisibilityPlay);\n      }; // -------------------------- Flickity -------------------------- //\n\n      utils.extend(Flickity.defaults, {\n        pauseAutoPlayOnHover: true,\n      });\n      Flickity.createMethods.push(\"_createPlayer\");\n      var proto = Flickity.prototype;\n\n      proto._createPlayer = function () {\n        this.player = new Player(this);\n        this.on(\"activate\", this.activatePlayer);\n        this.on(\"uiChange\", this.stopPlayer);\n        this.on(\"pointerDown\", this.stopPlayer);\n        this.on(\"deactivate\", this.deactivatePlayer);\n      };\n\n      proto.activatePlayer = function () {\n        if (!this.options.autoPlay) {\n          return;\n        }\n\n        this.player.play();\n        this.element.addEventListener(\"mouseenter\", this);\n      }; // Player API, don't hate the ... thanks I know where the door is\n\n      proto.playPlayer = function () {\n        this.player.play();\n      };\n\n      proto.stopPlayer = function () {\n        this.player.stop();\n      };\n\n      proto.pausePlayer = function () {\n        this.player.pause();\n      };\n\n      proto.unpausePlayer = function () {\n        this.player.unpause();\n      };\n\n      proto.deactivatePlayer = function () {\n        this.player.stop();\n        this.element.removeEventListener(\"mouseenter\", this);\n      }; // ----- mouseenter/leave ----- //\n      // pause auto-play on hover\n\n      proto.onmouseenter = function () {\n        if (!this.options.pauseAutoPlayOnHover) {\n          return;\n        }\n\n        this.player.pause();\n        this.element.addEventListener(\"mouseleave\", this);\n      }; // resume auto-play on hover off\n\n      proto.onmouseleave = function () {\n        this.player.unpause();\n        this.element.removeEventListener(\"mouseleave\", this);\n      }; // -----  ----- //\n\n      Flickity.Player = Player;\n      return Flickity;\n    });\n  });\n\n  var addRemoveCell = createCommonjsModule(function (module) {\n    // add, remove cell\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(window, flickity, utils);\n      } else {\n        // browser global\n        factory(window, window.Flickity, window.fizzyUIUtils);\n      }\n    })(window, function factory(window, Flickity, utils) {\n      function getCellsFragment(cells) {\n        var fragment = document.createDocumentFragment();\n        cells.forEach(function (cell) {\n          fragment.appendChild(cell.element);\n        });\n        return fragment;\n      } // -------------------------- add/remove cell prototype -------------------------- //\n\n      var proto = Flickity.prototype;\n      /**\n       * Insert, prepend, or append cells\n       * @param {Element, Array, NodeList} elems\n       * @param {Integer} index\n       */\n\n      proto.insert = function (elems, index) {\n        var cells = this._makeCells(elems);\n\n        if (!cells || !cells.length) {\n          return;\n        }\n\n        var len = this.cells.length; // default to append\n\n        index = index === undefined ? len : index; // add cells with document fragment\n\n        var fragment = getCellsFragment(cells); // append to slider\n\n        var isAppend = index == len;\n\n        if (isAppend) {\n          this.slider.appendChild(fragment);\n        } else {\n          var insertCellElement = this.cells[index].element;\n          this.slider.insertBefore(fragment, insertCellElement);\n        } // add to this.cells\n\n        if (index === 0) {\n          // prepend, add to start\n          this.cells = cells.concat(this.cells);\n        } else if (isAppend) {\n          // append, add to end\n          this.cells = this.cells.concat(cells);\n        } else {\n          // insert in this.cells\n          var endCells = this.cells.splice(index, len - index);\n          this.cells = this.cells.concat(cells).concat(endCells);\n        }\n\n        this._sizeCells(cells);\n\n        this.cellChange(index, true);\n      };\n\n      proto.append = function (elems) {\n        this.insert(elems, this.cells.length);\n      };\n\n      proto.prepend = function (elems) {\n        this.insert(elems, 0);\n      };\n      /**\n       * Remove cells\n       * @param {Element, Array, NodeList} elems\n       */\n\n      proto.remove = function (elems) {\n        var cells = this.getCells(elems);\n\n        if (!cells || !cells.length) {\n          return;\n        }\n\n        var minCellIndex = this.cells.length - 1; // remove cells from collection & DOM\n\n        cells.forEach(function (cell) {\n          cell.remove();\n          var index = this.cells.indexOf(cell);\n          minCellIndex = Math.min(index, minCellIndex);\n          utils.removeFrom(this.cells, cell);\n        }, this);\n        this.cellChange(minCellIndex, true);\n      };\n      /**\n       * logic to be run after a cell's size changes\n       * @param {Element} elem - cell's element\n       */\n\n      proto.cellSizeChange = function (elem) {\n        var cell = this.getCell(elem);\n\n        if (!cell) {\n          return;\n        }\n\n        cell.getSize();\n        var index = this.cells.indexOf(cell);\n        this.cellChange(index);\n      };\n      /**\n       * logic any time a cell is changed: added, removed, or size changed\n       * @param {Integer} changedCellIndex - index of the changed cell, optional\n       */\n\n      proto.cellChange = function (changedCellIndex, isPositioningSlider) {\n        var prevSelectedElem = this.selectedElement;\n\n        this._positionCells(changedCellIndex);\n\n        this._getWrapShiftCells();\n\n        this.setGallerySize(); // update selectedIndex\n        // try to maintain position & select previous selected element\n\n        var cell = this.getCell(prevSelectedElem);\n\n        if (cell) {\n          this.selectedIndex = this.getCellSlideIndex(cell);\n        }\n\n        this.selectedIndex = Math.min(\n          this.slides.length - 1,\n          this.selectedIndex\n        );\n        this.emitEvent(\"cellChange\", [changedCellIndex]); // position slider\n\n        this.select(this.selectedIndex); // do not position slider after lazy load\n\n        if (isPositioningSlider) {\n          this.positionSliderAtSelected();\n        }\n      }; // -----  ----- //\n\n      return Flickity;\n    });\n  });\n\n  var lazyload = createCommonjsModule(function (module) {\n    // lazyload\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(window, flickity, utils);\n      } else {\n        // browser global\n        factory(window, window.Flickity, window.fizzyUIUtils);\n      }\n    })(window, function factory(window, Flickity, utils) {\n      Flickity.createMethods.push(\"_createLazyload\");\n      var proto = Flickity.prototype;\n\n      proto._createLazyload = function () {\n        this.on(\"select\", this.lazyLoad);\n      };\n\n      proto.lazyLoad = function () {\n        var lazyLoad = this.options.lazyLoad;\n\n        if (!lazyLoad) {\n          return;\n        } // get adjacent cells, use lazyLoad option for adjacent count\n\n        var adjCount = typeof lazyLoad == \"number\" ? lazyLoad : 0;\n        var cellElems = this.getAdjacentCellElements(adjCount); // get lazy images in those cells\n\n        var lazyImages = [];\n        cellElems.forEach(function (cellElem) {\n          var lazyCellImages = getCellLazyImages(cellElem);\n          lazyImages = lazyImages.concat(lazyCellImages);\n        }); // load lazy images\n\n        lazyImages.forEach(function (img) {\n          new LazyLoader(img, this);\n        }, this);\n      };\n\n      function getCellLazyImages(cellElem) {\n        // check if cell element is lazy image\n        if (cellElem.nodeName == \"IMG\") {\n          var lazyloadAttr = cellElem.getAttribute(\"data-flickity-lazyload\");\n          var srcAttr = cellElem.getAttribute(\"data-flickity-lazyload-src\");\n          var srcsetAttr = cellElem.getAttribute(\n            \"data-flickity-lazyload-srcset\"\n          );\n\n          if (lazyloadAttr || srcAttr || srcsetAttr) {\n            return [cellElem];\n          }\n        } // select lazy images in cell\n\n        var lazySelector =\n          \"img[data-flickity-lazyload], \" +\n          \"img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]\";\n        var imgs = cellElem.querySelectorAll(lazySelector);\n        return utils.makeArray(imgs);\n      } // -------------------------- LazyLoader -------------------------- //\n\n      /**\n       * class to handle loading images\n       */\n\n      function LazyLoader(img, flickity) {\n        this.img = img;\n        this.flickity = flickity;\n        this.load();\n      }\n\n      LazyLoader.prototype.handleEvent = utils.handleEvent;\n\n      LazyLoader.prototype.load = function () {\n        this.img.addEventListener(\"load\", this);\n        this.img.addEventListener(\"error\", this); // get src & srcset\n\n        var src =\n          this.img.getAttribute(\"data-flickity-lazyload\") ||\n          this.img.getAttribute(\"data-flickity-lazyload-src\");\n        var srcset = this.img.getAttribute(\"data-flickity-lazyload-srcset\"); // set src & serset\n\n        this.img.src = src;\n\n        if (srcset) {\n          this.img.setAttribute(\"srcset\", srcset);\n        } // remove attr\n\n        this.img.removeAttribute(\"data-flickity-lazyload\");\n        this.img.removeAttribute(\"data-flickity-lazyload-src\");\n        this.img.removeAttribute(\"data-flickity-lazyload-srcset\");\n      };\n\n      LazyLoader.prototype.onload = function (event) {\n        this.complete(event, \"flickity-lazyloaded\");\n      };\n\n      LazyLoader.prototype.onerror = function (event) {\n        this.complete(event, \"flickity-lazyerror\");\n      };\n\n      LazyLoader.prototype.complete = function (event, className) {\n        // unbind events\n        this.img.removeEventListener(\"load\", this);\n        this.img.removeEventListener(\"error\", this);\n        var cell = this.flickity.getParentCell(this.img);\n        var cellElem = cell && cell.element;\n        this.flickity.cellSizeChange(cellElem);\n        this.img.classList.add(className);\n        this.flickity.dispatchEvent(\"lazyLoad\", event, cellElem);\n      }; // -----  ----- //\n\n      Flickity.LazyLoader = LazyLoader;\n      return Flickity;\n    });\n  });\n\n  var js = createCommonjsModule(function (module) {\n    /*!\n     * Flickity v2.2.1\n     * Touch, responsive, flickable carousels\n     *\n     * Licensed GPLv3 for open source use\n     * or Flickity Commercial License for commercial use\n     *\n     * https://flickity.metafizzy.co\n     * Copyright 2015-2019 Metafizzy\n     */\n    (function (window, factory) {\n      // universal module definition\n\n      /* jshint strict: false */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(\n          flickity,\n          drag,\n          prevNextButton,\n          pageDots,\n          player,\n          addRemoveCell,\n          lazyload\n        );\n      }\n    })(window, function factory(Flickity) {\n      /*jshint strict: false*/\n      return Flickity;\n    });\n  });\n\n  var flickityFade = createCommonjsModule(function (module) {\n    /**\n     * Flickity fade v1.0.0\n     * Fade between Flickity slides\n     */\n\n    /* jshint browser: true, undef: true, unused: true */\n    (function (window, factory) {\n      // universal module definition\n\n      /*globals define, module, require */\n      if (module.exports) {\n        // CommonJS\n        module.exports = factory(js, utils);\n      } else {\n        // browser global\n        factory(window.Flickity, window.fizzyUIUtils);\n      }\n    })(commonjsGlobal, function factory(Flickity, utils) {\n      // ---- Slide ---- //\n      var Slide = Flickity.Slide;\n      var slideUpdateTarget = Slide.prototype.updateTarget;\n\n      Slide.prototype.updateTarget = function () {\n        slideUpdateTarget.apply(this, arguments);\n\n        if (!this.parent.options.fade) {\n          return;\n        } // position cells at selected target\n\n        var slideTargetX = this.target - this.x;\n        var firstCellX = this.cells[0].x;\n        this.cells.forEach(function (cell) {\n          var targetX = cell.x - firstCellX - slideTargetX;\n          cell.renderPosition(targetX);\n        });\n      };\n\n      Slide.prototype.setOpacity = function (alpha) {\n        this.cells.forEach(function (cell) {\n          cell.element.style.opacity = alpha;\n        });\n      }; // ---- Flickity ---- //\n\n      var proto = Flickity.prototype;\n      Flickity.createMethods.push(\"_createFade\");\n\n      proto._createFade = function () {\n        this.fadeIndex = this.selectedIndex;\n        this.prevSelectedIndex = this.selectedIndex;\n        this.on(\"select\", this.onSelectFade);\n        this.on(\"dragEnd\", this.onDragEndFade);\n        this.on(\"settle\", this.onSettleFade);\n        this.on(\"activate\", this.onActivateFade);\n        this.on(\"deactivate\", this.onDeactivateFade);\n      };\n\n      var updateSlides = proto.updateSlides;\n\n      proto.updateSlides = function () {\n        updateSlides.apply(this, arguments);\n\n        if (!this.options.fade) {\n          return;\n        } // set initial opacity\n\n        this.slides.forEach(function (slide, i) {\n          var alpha = i == this.selectedIndex ? 1 : 0;\n          slide.setOpacity(alpha);\n        }, this);\n      };\n      /* ---- events ---- */\n\n      proto.onSelectFade = function () {\n        // in case of resize, keep fadeIndex within current count\n        this.fadeIndex = Math.min(\n          this.prevSelectedIndex,\n          this.slides.length - 1\n        );\n        this.prevSelectedIndex = this.selectedIndex;\n      };\n\n      proto.onSettleFade = function () {\n        delete this.didDragEnd;\n\n        if (!this.options.fade) {\n          return;\n        } // set full and 0 opacity on selected & faded slides\n\n        this.selectedSlide.setOpacity(1);\n        var fadedSlide = this.slides[this.fadeIndex];\n\n        if (fadedSlide && this.fadeIndex != this.selectedIndex) {\n          this.slides[this.fadeIndex].setOpacity(0);\n        }\n      };\n\n      proto.onDragEndFade = function () {\n        // set flag\n        this.didDragEnd = true;\n      };\n\n      proto.onActivateFade = function () {\n        if (this.options.fade) {\n          this.element.classList.add(\"is-fade\");\n        }\n      };\n\n      proto.onDeactivateFade = function () {\n        if (!this.options.fade) {\n          return;\n        }\n\n        this.element.classList.remove(\"is-fade\"); // reset opacity\n\n        this.slides.forEach(function (slide) {\n          slide.setOpacity(\"\");\n        });\n      };\n      /* ---- position & fading ---- */\n\n      var positionSlider = proto.positionSlider;\n\n      proto.positionSlider = function () {\n        if (!this.options.fade) {\n          positionSlider.apply(this, arguments);\n          return;\n        }\n\n        this.fadeSlides();\n        this.dispatchScrollEvent();\n      };\n\n      var positionSliderAtSelected = proto.positionSliderAtSelected;\n\n      proto.positionSliderAtSelected = function () {\n        if (this.options.fade) {\n          // position fade slider at origin\n          this.setTranslateX(0);\n        }\n\n        positionSliderAtSelected.apply(this, arguments);\n      };\n\n      proto.fadeSlides = function () {\n        if (this.slides.length < 2) {\n          return;\n        } // get slides to fade-in & fade-out\n\n        var indexes = this.getFadeIndexes();\n        var fadeSlideA = this.slides[indexes.a];\n        var fadeSlideB = this.slides[indexes.b];\n        var distance = this.wrapDifference(\n          fadeSlideA.target,\n          fadeSlideB.target\n        );\n        var progress = this.wrapDifference(fadeSlideA.target, -this.x);\n        progress = progress / distance;\n        fadeSlideA.setOpacity(1 - progress);\n        fadeSlideB.setOpacity(progress); // hide previous slide\n\n        var fadeHideIndex = indexes.a;\n\n        if (this.isDragging) {\n          fadeHideIndex = progress > 0.5 ? indexes.a : indexes.b;\n        }\n\n        var isNewHideIndex =\n          this.fadeHideIndex != undefined &&\n          this.fadeHideIndex != fadeHideIndex &&\n          this.fadeHideIndex != indexes.a &&\n          this.fadeHideIndex != indexes.b;\n\n        if (isNewHideIndex) {\n          // new fadeHideSlide set, hide previous\n          this.slides[this.fadeHideIndex].setOpacity(0);\n        }\n\n        this.fadeHideIndex = fadeHideIndex;\n      };\n\n      proto.getFadeIndexes = function () {\n        if (!this.isDragging && !this.didDragEnd) {\n          return {\n            a: this.fadeIndex,\n            b: this.selectedIndex,\n          };\n        }\n\n        if (this.options.wrapAround) {\n          return this.getFadeDragWrapIndexes();\n        } else {\n          return this.getFadeDragLimitIndexes();\n        }\n      };\n\n      proto.getFadeDragWrapIndexes = function () {\n        var distances = this.slides.map(function (slide, i) {\n          return this.getSlideDistance(-this.x, i);\n        }, this);\n        var absDistances = distances.map(function (distance) {\n          return Math.abs(distance);\n        });\n        var minDistance = Math.min.apply(Math, absDistances);\n        var closestIndex = absDistances.indexOf(minDistance);\n        var distance = distances[closestIndex];\n        var len = this.slides.length;\n        var delta = distance >= 0 ? 1 : -1;\n        return {\n          a: closestIndex,\n          b: utils.modulo(closestIndex + delta, len),\n        };\n      };\n\n      proto.getFadeDragLimitIndexes = function () {\n        // calculate closest previous slide\n        var dragIndex = 0;\n\n        for (var i = 0; i < this.slides.length - 1; i++) {\n          var slide = this.slides[i];\n\n          if (-this.x < slide.target) {\n            break;\n          }\n\n          dragIndex = i;\n        }\n\n        return {\n          a: dragIndex,\n          b: dragIndex + 1,\n        };\n      };\n\n      proto.wrapDifference = function (a, b) {\n        var diff = b - a;\n\n        if (!this.options.wrapAround) {\n          return diff;\n        }\n\n        var diffPlus = diff + this.slideableWidth;\n        var diffMinus = diff - this.slideableWidth;\n\n        if (Math.abs(diffPlus) < Math.abs(diff)) {\n          diff = diffPlus;\n        }\n\n        if (Math.abs(diffMinus) < Math.abs(diff)) {\n          diff = diffMinus;\n        }\n\n        return diff;\n      }; // ---- wrapAround ---- //\n\n      var _getWrapShiftCells = proto._getWrapShiftCells;\n\n      proto._getWrapShiftCells = function () {\n        if (!this.options.fade) {\n          _getWrapShiftCells.apply(this, arguments);\n        }\n      };\n\n      var shiftWrapCells = proto.shiftWrapCells;\n\n      proto.shiftWrapCells = function () {\n        if (!this.options.fade) {\n          shiftWrapCells.apply(this, arguments);\n        }\n      };\n\n      return Flickity;\n    });\n  });\n\n  var photoswipe = createCommonjsModule(function (module, exports) {\n    /*! PhotoSwipe - v4.1.3 - 2019-01-08\n     * http://photoswipe.com\n     * Copyright (c) 2019 Dmitry Semenov; */\n    (function (root, factory) {\n      {\n        module.exports = factory();\n      }\n    })(commonjsGlobal, function () {\n      var PhotoSwipe = function PhotoSwipe(template, UiClass, items, options) {\n        /*>>framework-bridge*/\n\n        /**\n         *\n         * Set of generic functions used by gallery.\n         *\n         * You're free to modify anything here as long as functionality is kept.\n         *\n         */\n        var framework = {\n          features: null,\n          bind: function bind(target, type, listener, unbind) {\n            var methodName = (unbind ? \"remove\" : \"add\") + \"EventListener\";\n            type = type.split(\" \");\n\n            for (var i = 0; i < type.length; i++) {\n              if (type[i]) {\n                target[methodName](type[i], listener, false);\n              }\n            }\n          },\n          isArray: function isArray(obj) {\n            return obj instanceof Array;\n          },\n          createEl: function createEl(classes, tag) {\n            var el = document.createElement(tag || \"div\");\n\n            if (classes) {\n              el.className = classes;\n            }\n\n            return el;\n          },\n          getScrollY: function getScrollY() {\n            var yOffset = window.pageYOffset;\n            return yOffset !== undefined\n              ? yOffset\n              : document.documentElement.scrollTop;\n          },\n          unbind: function unbind(target, type, listener) {\n            framework.bind(target, type, listener, true);\n          },\n          removeClass: function removeClass(el, className) {\n            var reg = new RegExp(\"(\\\\s|^)\" + className + \"(\\\\s|$)\");\n            el.className = el.className\n              .replace(reg, \" \")\n              .replace(/^\\s\\s*/, \"\")\n              .replace(/\\s\\s*$/, \"\");\n          },\n          addClass: function addClass(el, className) {\n            if (!framework.hasClass(el, className)) {\n              el.className += (el.className ? \" \" : \"\") + className;\n            }\n          },\n          hasClass: function hasClass(el, className) {\n            return (\n              el.className &&\n              new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\").test(el.className)\n            );\n          },\n          getChildByClass: function getChildByClass(parentEl, childClassName) {\n            var node = parentEl.firstChild;\n\n            while (node) {\n              if (framework.hasClass(node, childClassName)) {\n                return node;\n              }\n\n              node = node.nextSibling;\n            }\n          },\n          arraySearch: function arraySearch(array, value, key) {\n            var i = array.length;\n\n            while (i--) {\n              if (array[i][key] === value) {\n                return i;\n              }\n            }\n\n            return -1;\n          },\n          extend: function extend(o1, o2, preventOverwrite) {\n            for (var prop in o2) {\n              if (o2.hasOwnProperty(prop)) {\n                if (preventOverwrite && o1.hasOwnProperty(prop)) {\n                  continue;\n                }\n\n                o1[prop] = o2[prop];\n              }\n            }\n          },\n          easing: {\n            sine: {\n              out: function out(k) {\n                return Math.sin(k * (Math.PI / 2));\n              },\n              inOut: function inOut(k) {\n                return -(Math.cos(Math.PI * k) - 1) / 2;\n              },\n            },\n            cubic: {\n              out: function out(k) {\n                return --k * k * k + 1;\n              },\n            },\n            /*\n            \telastic: {\n            \t\tout: function ( k ) {\n            \t\t\t\tvar s, a = 0.1, p = 0.4;\n            \t\t\tif ( k === 0 ) return 0;\n            \t\t\tif ( k === 1 ) return 1;\n            \t\t\tif ( !a || a < 1 ) { a = 1; s = p / 4; }\n            \t\t\telse s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n            \t\t\treturn ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );\n            \t\t\t},\n            \t},\n            \tback: {\n            \t\tout: function ( k ) {\n            \t\t\tvar s = 1.70158;\n            \t\t\treturn --k * k * ( ( s + 1 ) * k + s ) + 1;\n            \t\t}\n            \t}\n            */\n          },\n\n          /**\n           *\n           * @return {object}\n           *\n           * {\n           *  raf : request animation frame function\n           *  caf : cancel animation frame function\n           *  transfrom : transform property key (with vendor), or null if not supported\n           *  oldIE : IE8 or below\n           * }\n           *\n           */\n          detectFeatures: function detectFeatures() {\n            if (framework.features) {\n              return framework.features;\n            }\n\n            var helperEl = framework.createEl(),\n              helperStyle = helperEl.style,\n              vendor = \"\",\n              features = {}; // IE8 and below\n\n            features.oldIE = document.all && !document.addEventListener;\n            features.touch = \"ontouchstart\" in window;\n\n            if (window.requestAnimationFrame) {\n              features.raf = window.requestAnimationFrame;\n              features.caf = window.cancelAnimationFrame;\n            }\n\n            features.pointerEvent =\n              !!window.PointerEvent || navigator.msPointerEnabled; // fix false-positive detection of old Android in new IE\n            // (IE11 ua string contains \"Android 4.0\")\n\n            if (!features.pointerEvent) {\n              var ua = navigator.userAgent; // Detect if device is iPhone or iPod and if it's older than iOS 8\n              // http://stackoverflow.com/a/14223920\n              //\n              // This detection is made because of buggy top/bottom toolbars\n              // that don't trigger window.resize event.\n              // For more info refer to _isFixedPosition variable in core.js\n\n              if (/iP(hone|od)/.test(navigator.platform)) {\n                var v = navigator.appVersion.match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n\n                if (v && v.length > 0) {\n                  v = parseInt(v[1], 10);\n\n                  if (v >= 1 && v < 8) {\n                    features.isOldIOSPhone = true;\n                  }\n                }\n              } // Detect old Android (before KitKat)\n              // due to bugs related to position:fixed\n              // http://stackoverflow.com/questions/7184573/pick-up-the-android-version-in-the-browser-by-javascript\n\n              var match = ua.match(/Android\\s([0-9\\.]*)/);\n              var androidversion = match ? match[1] : 0;\n              androidversion = parseFloat(androidversion);\n\n              if (androidversion >= 1) {\n                if (androidversion < 4.4) {\n                  features.isOldAndroid = true; // for fixed position bug & performance\n                }\n\n                features.androidVersion = androidversion; // for touchend bug\n              }\n\n              features.isMobileOpera = /opera mini|opera mobi/i.test(ua); // p.s. yes, yes, UA sniffing is bad, propose your solution for above bugs.\n            }\n\n            var styleChecks = [\"transform\", \"perspective\", \"animationName\"],\n              vendors = [\"\", \"webkit\", \"Moz\", \"ms\", \"O\"],\n              styleCheckItem,\n              styleName;\n\n            for (var i = 0; i < 4; i++) {\n              vendor = vendors[i];\n\n              for (var a = 0; a < 3; a++) {\n                styleCheckItem = styleChecks[a]; // uppercase first letter of property name, if vendor is present\n\n                styleName =\n                  vendor +\n                  (vendor\n                    ? styleCheckItem.charAt(0).toUpperCase() +\n                      styleCheckItem.slice(1)\n                    : styleCheckItem);\n\n                if (!features[styleCheckItem] && styleName in helperStyle) {\n                  features[styleCheckItem] = styleName;\n                }\n              }\n\n              if (vendor && !features.raf) {\n                vendor = vendor.toLowerCase();\n                features.raf = window[vendor + \"RequestAnimationFrame\"];\n\n                if (features.raf) {\n                  features.caf =\n                    window[vendor + \"CancelAnimationFrame\"] ||\n                    window[vendor + \"CancelRequestAnimationFrame\"];\n                }\n              }\n            }\n\n            if (!features.raf) {\n              var lastTime = 0;\n\n              features.raf = function (fn) {\n                var currTime = new Date().getTime();\n                var timeToCall = Math.max(0, 16 - (currTime - lastTime));\n                var id = window.setTimeout(function () {\n                  fn(currTime + timeToCall);\n                }, timeToCall);\n                lastTime = currTime + timeToCall;\n                return id;\n              };\n\n              features.caf = function (id) {\n                clearTimeout(id);\n              };\n            } // Detect SVG support\n\n            features.svg =\n              !!document.createElementNS &&\n              !!document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\")\n                .createSVGRect;\n            framework.features = features;\n            return features;\n          },\n        };\n        framework.detectFeatures(); // Override addEventListener for old versions of IE\n\n        if (framework.features.oldIE) {\n          framework.bind = function (target, type, listener, unbind) {\n            type = type.split(\" \");\n\n            var methodName = (unbind ? \"detach\" : \"attach\") + \"Event\",\n              evName,\n              _handleEv = function _handleEv() {\n                listener.handleEvent.call(listener);\n              };\n\n            for (var i = 0; i < type.length; i++) {\n              evName = type[i];\n\n              if (evName) {\n                if (_typeof(listener) === \"object\" && listener.handleEvent) {\n                  if (!unbind) {\n                    listener[\"oldIE\" + evName] = _handleEv;\n                  } else {\n                    if (!listener[\"oldIE\" + evName]) {\n                      return false;\n                    }\n                  }\n\n                  target[methodName](\"on\" + evName, listener[\"oldIE\" + evName]);\n                } else {\n                  target[methodName](\"on\" + evName, listener);\n                }\n              }\n            }\n          };\n        }\n        /*>>framework-bridge*/\n\n        /*>>core*/\n        //function(template, UiClass, items, options)\n\n        var self = this;\n        /**\n         * Static vars, don't change unless you know what you're doing.\n         */\n\n        var DOUBLE_TAP_RADIUS = 25,\n          NUM_HOLDERS = 3;\n        /**\n         * Options\n         */\n\n        var _options = {\n          allowPanToNext: true,\n          spacing: 0.12,\n          bgOpacity: 1,\n          mouseUsed: false,\n          loop: true,\n          pinchToClose: true,\n          closeOnScroll: true,\n          closeOnVerticalDrag: true,\n          verticalDragRange: 0.75,\n          hideAnimationDuration: 333,\n          showAnimationDuration: 333,\n          showHideOpacity: false,\n          focus: true,\n          escKey: true,\n          arrowKeys: true,\n          mainScrollEndFriction: 0.35,\n          panEndFriction: 0.35,\n          isClickableElement: function isClickableElement(el) {\n            return el.tagName === \"A\";\n          },\n          getDoubleTapZoom: function getDoubleTapZoom(isMouseClick, item) {\n            if (isMouseClick) {\n              return 1;\n            } else {\n              return item.initialZoomLevel < 0.7 ? 1 : 1.33;\n            }\n          },\n          maxSpreadZoom: 1.33,\n          modal: true,\n          // not fully implemented yet\n          scaleMode: \"fit\", // TODO\n        };\n        framework.extend(_options, options);\n        /**\n         * Private helper variables & functions\n         */\n\n        var _getEmptyPoint = function _getEmptyPoint() {\n          return {\n            x: 0,\n            y: 0,\n          };\n        };\n\n        var _isOpen,\n          _isDestroying,\n          _closedByScroll,\n          _currentItemIndex,\n          _containerStyle,\n          _containerShiftIndex,\n          _currPanDist = _getEmptyPoint(),\n          _startPanOffset = _getEmptyPoint(),\n          _panOffset = _getEmptyPoint(),\n          _upMoveEvents,\n          // drag move, drag end & drag cancel events array\n          _downEvents,\n          // drag start events array\n          _globalEventHandlers,\n          _viewportSize = {},\n          _currZoomLevel,\n          _startZoomLevel,\n          _translatePrefix,\n          _translateSufix,\n          _updateSizeInterval,\n          _itemsNeedUpdate,\n          _currPositionIndex = 0,\n          _offset = {},\n          _slideSize = _getEmptyPoint(),\n          // size of slide area, including spacing\n          _itemHolders,\n          _prevItemIndex,\n          _indexDiff = 0,\n          // difference of indexes since last content update\n          _dragStartEvent,\n          _dragMoveEvent,\n          _dragEndEvent,\n          _dragCancelEvent,\n          _transformKey,\n          _pointerEventEnabled,\n          _isFixedPosition = true,\n          _likelyTouchDevice,\n          _modules = [],\n          _requestAF,\n          _cancelAF,\n          _initalClassName,\n          _initalWindowScrollY,\n          _oldIE,\n          _currentWindowScrollY,\n          _features,\n          _windowVisibleSize = {},\n          _renderMaxResolution = false,\n          _orientationChangeTimeout,\n          // Registers PhotoSWipe module (History, Controller ...)\n          _registerModule = function _registerModule(name, module) {\n            framework.extend(self, module.publicMethods);\n\n            _modules.push(name);\n          },\n          _getLoopedId = function _getLoopedId(index) {\n            var numSlides = _getNumItems();\n\n            if (index > numSlides - 1) {\n              return index - numSlides;\n            } else if (index < 0) {\n              return numSlides + index;\n            }\n\n            return index;\n          },\n          // Micro bind/trigger\n          _listeners = {},\n          _listen = function _listen(name, fn) {\n            if (!_listeners[name]) {\n              _listeners[name] = [];\n            }\n\n            return _listeners[name].push(fn);\n          },\n          _shout = function _shout(name) {\n            var listeners = _listeners[name];\n\n            if (listeners) {\n              var args = Array.prototype.slice.call(arguments);\n              args.shift();\n\n              for (var i = 0; i < listeners.length; i++) {\n                listeners[i].apply(self, args);\n              }\n            }\n          },\n          _getCurrentTime = function _getCurrentTime() {\n            return new Date().getTime();\n          },\n          _applyBgOpacity = function _applyBgOpacity(opacity) {\n            _bgOpacity = opacity;\n            self.bg.style.opacity = opacity * _options.bgOpacity;\n          },\n          _applyZoomTransform = function _applyZoomTransform(\n            styleObj,\n            x,\n            y,\n            zoom,\n            item\n          ) {\n            if (!_renderMaxResolution || (item && item !== self.currItem)) {\n              zoom = zoom / (item ? item.fitRatio : self.currItem.fitRatio);\n            }\n\n            styleObj[_transformKey] =\n              _translatePrefix +\n              x +\n              \"px, \" +\n              y +\n              \"px\" +\n              _translateSufix +\n              \" scale(\" +\n              zoom +\n              \")\";\n          },\n          _applyCurrentZoomPan = function _applyCurrentZoomPan(\n            allowRenderResolution\n          ) {\n            if (_currZoomElementStyle) {\n              if (allowRenderResolution) {\n                if (_currZoomLevel > self.currItem.fitRatio) {\n                  if (!_renderMaxResolution) {\n                    _setImageSize(self.currItem, false, true);\n\n                    _renderMaxResolution = true;\n                  }\n                } else {\n                  if (_renderMaxResolution) {\n                    _setImageSize(self.currItem);\n\n                    _renderMaxResolution = false;\n                  }\n                }\n              }\n\n              _applyZoomTransform(\n                _currZoomElementStyle,\n                _panOffset.x,\n                _panOffset.y,\n                _currZoomLevel\n              );\n            }\n          },\n          _applyZoomPanToItem = function _applyZoomPanToItem(item) {\n            if (item.container) {\n              _applyZoomTransform(\n                item.container.style,\n                item.initialPosition.x,\n                item.initialPosition.y,\n                item.initialZoomLevel,\n                item\n              );\n            }\n          },\n          _setTranslateX = function _setTranslateX(x, elStyle) {\n            elStyle[_transformKey] =\n              _translatePrefix + x + \"px, 0px\" + _translateSufix;\n          },\n          _moveMainScroll = function _moveMainScroll(x, dragging) {\n            if (!_options.loop && dragging) {\n              var newSlideIndexOffset =\n                  _currentItemIndex +\n                  (_slideSize.x * _currPositionIndex - x) / _slideSize.x,\n                delta = Math.round(x - _mainScrollPos.x);\n\n              if (\n                (newSlideIndexOffset < 0 && delta > 0) ||\n                (newSlideIndexOffset >= _getNumItems() - 1 && delta < 0)\n              ) {\n                x = _mainScrollPos.x + delta * _options.mainScrollEndFriction;\n              }\n            }\n\n            _mainScrollPos.x = x;\n\n            _setTranslateX(x, _containerStyle);\n          },\n          _calculatePanOffset = function _calculatePanOffset(axis, zoomLevel) {\n            var m = _midZoomPoint[axis] - _offset[axis];\n            return (\n              _startPanOffset[axis] +\n              _currPanDist[axis] +\n              m -\n              m * (zoomLevel / _startZoomLevel)\n            );\n          },\n          _equalizePoints = function _equalizePoints(p1, p2) {\n            p1.x = p2.x;\n            p1.y = p2.y;\n\n            if (p2.id) {\n              p1.id = p2.id;\n            }\n          },\n          _roundPoint = function _roundPoint(p) {\n            p.x = Math.round(p.x);\n            p.y = Math.round(p.y);\n          },\n          _mouseMoveTimeout = null,\n          _onFirstMouseMove = function _onFirstMouseMove() {\n            // Wait until mouse move event is fired at least twice during 100ms\n            // We do this, because some mobile browsers trigger it on touchstart\n            if (_mouseMoveTimeout) {\n              framework.unbind(document, \"mousemove\", _onFirstMouseMove);\n              framework.addClass(template, \"pswp--has_mouse\");\n              _options.mouseUsed = true;\n\n              _shout(\"mouseUsed\");\n            }\n\n            _mouseMoveTimeout = setTimeout(function () {\n              _mouseMoveTimeout = null;\n            }, 100);\n          },\n          _bindEvents = function _bindEvents() {\n            framework.bind(document, \"keydown\", self);\n\n            if (_features.transform) {\n              // don't bind click event in browsers that don't support transform (mostly IE8)\n              framework.bind(self.scrollWrap, \"click\", self);\n            }\n\n            if (!_options.mouseUsed) {\n              framework.bind(document, \"mousemove\", _onFirstMouseMove);\n            }\n\n            framework.bind(window, \"resize scroll orientationchange\", self);\n\n            _shout(\"bindEvents\");\n          },\n          _unbindEvents = function _unbindEvents() {\n            framework.unbind(window, \"resize scroll orientationchange\", self);\n            framework.unbind(window, \"scroll\", _globalEventHandlers.scroll);\n            framework.unbind(document, \"keydown\", self);\n            framework.unbind(document, \"mousemove\", _onFirstMouseMove);\n\n            if (_features.transform) {\n              framework.unbind(self.scrollWrap, \"click\", self);\n            }\n\n            if (_isDragging) {\n              framework.unbind(window, _upMoveEvents, self);\n            }\n\n            clearTimeout(_orientationChangeTimeout);\n\n            _shout(\"unbindEvents\");\n          },\n          _calculatePanBounds = function _calculatePanBounds(\n            zoomLevel,\n            update\n          ) {\n            var bounds = _calculateItemSize(\n              self.currItem,\n              _viewportSize,\n              zoomLevel\n            );\n\n            if (update) {\n              _currPanBounds = bounds;\n            }\n\n            return bounds;\n          },\n          _getMinZoomLevel = function _getMinZoomLevel(item) {\n            if (!item) {\n              item = self.currItem;\n            }\n\n            return item.initialZoomLevel;\n          },\n          _getMaxZoomLevel = function _getMaxZoomLevel(item) {\n            if (!item) {\n              item = self.currItem;\n            }\n\n            return item.w > 0 ? _options.maxSpreadZoom : 1;\n          },\n          // Return true if offset is out of the bounds\n          _modifyDestPanOffset = function _modifyDestPanOffset(\n            axis,\n            destPanBounds,\n            destPanOffset,\n            destZoomLevel\n          ) {\n            if (destZoomLevel === self.currItem.initialZoomLevel) {\n              destPanOffset[axis] = self.currItem.initialPosition[axis];\n              return true;\n            } else {\n              destPanOffset[axis] = _calculatePanOffset(axis, destZoomLevel);\n\n              if (destPanOffset[axis] > destPanBounds.min[axis]) {\n                destPanOffset[axis] = destPanBounds.min[axis];\n                return true;\n              } else if (destPanOffset[axis] < destPanBounds.max[axis]) {\n                destPanOffset[axis] = destPanBounds.max[axis];\n                return true;\n              }\n            }\n\n            return false;\n          },\n          _setupTransforms = function _setupTransforms() {\n            if (_transformKey) {\n              // setup 3d transforms\n              var allow3dTransform =\n                _features.perspective && !_likelyTouchDevice;\n              _translatePrefix = \"translate\" + (allow3dTransform ? \"3d(\" : \"(\");\n              _translateSufix = _features.perspective ? \", 0px)\" : \")\";\n              return;\n            } // Override zoom/pan/move functions in case old browser is used (most likely IE)\n            // (so they use left/top/width/height, instead of CSS transform)\n\n            _transformKey = \"left\";\n            framework.addClass(template, \"pswp--ie\");\n\n            _setTranslateX = function _setTranslateX(x, elStyle) {\n              elStyle.left = x + \"px\";\n            };\n\n            _applyZoomPanToItem = function _applyZoomPanToItem(item) {\n              var zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n                s = item.container.style,\n                w = zoomRatio * item.w,\n                h = zoomRatio * item.h;\n              s.width = w + \"px\";\n              s.height = h + \"px\";\n              s.left = item.initialPosition.x + \"px\";\n              s.top = item.initialPosition.y + \"px\";\n            };\n\n            _applyCurrentZoomPan = function _applyCurrentZoomPan() {\n              if (_currZoomElementStyle) {\n                var s = _currZoomElementStyle,\n                  item = self.currItem,\n                  zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,\n                  w = zoomRatio * item.w,\n                  h = zoomRatio * item.h;\n                s.width = w + \"px\";\n                s.height = h + \"px\";\n                s.left = _panOffset.x + \"px\";\n                s.top = _panOffset.y + \"px\";\n              }\n            };\n          },\n          _onKeyDown = function _onKeyDown(e) {\n            var keydownAction = \"\";\n\n            if (_options.escKey && e.keyCode === 27) {\n              keydownAction = \"close\";\n            } else if (_options.arrowKeys) {\n              if (e.keyCode === 37) {\n                keydownAction = \"prev\";\n              } else if (e.keyCode === 39) {\n                keydownAction = \"next\";\n              }\n            }\n\n            if (keydownAction) {\n              // don't do anything if special key pressed to prevent from overriding default browser actions\n              // e.g. in Chrome on Mac cmd+arrow-left returns to previous page\n              if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {\n                if (e.preventDefault) {\n                  e.preventDefault();\n                } else {\n                  e.returnValue = false;\n                }\n\n                self[keydownAction]();\n              }\n            }\n          },\n          _onGlobalClick = function _onGlobalClick(e) {\n            if (!e) {\n              return;\n            } // don't allow click event to pass through when triggering after drag or some other gesture\n\n            if (\n              _moved ||\n              _zoomStarted ||\n              _mainScrollAnimating ||\n              _verticalDragInitiated\n            ) {\n              e.preventDefault();\n              e.stopPropagation();\n            }\n          },\n          _updatePageScrollOffset = function _updatePageScrollOffset() {\n            self.setScrollOffset(0, framework.getScrollY());\n          }; // Micro animation engine\n\n        var _animations = {},\n          _numAnimations = 0,\n          _stopAnimation = function _stopAnimation(name) {\n            if (_animations[name]) {\n              if (_animations[name].raf) {\n                _cancelAF(_animations[name].raf);\n              }\n\n              _numAnimations--;\n              delete _animations[name];\n            }\n          },\n          _registerStartAnimation = function _registerStartAnimation(name) {\n            if (_animations[name]) {\n              _stopAnimation(name);\n            }\n\n            if (!_animations[name]) {\n              _numAnimations++;\n              _animations[name] = {};\n            }\n          },\n          _stopAllAnimations = function _stopAllAnimations() {\n            for (var prop in _animations) {\n              if (_animations.hasOwnProperty(prop)) {\n                _stopAnimation(prop);\n              }\n            }\n          },\n          _animateProp = function _animateProp(\n            name,\n            b,\n            endProp,\n            d,\n            easingFn,\n            onUpdate,\n            onComplete\n          ) {\n            var startAnimTime = _getCurrentTime(),\n              t;\n\n            _registerStartAnimation(name);\n\n            var animloop = function animloop() {\n              if (_animations[name]) {\n                t = _getCurrentTime() - startAnimTime; // time diff\n                //b - beginning (start prop)\n                //d - anim duration\n\n                if (t >= d) {\n                  _stopAnimation(name);\n\n                  onUpdate(endProp);\n\n                  if (onComplete) {\n                    onComplete();\n                  }\n\n                  return;\n                }\n\n                onUpdate((endProp - b) * easingFn(t / d) + b);\n                _animations[name].raf = _requestAF(animloop);\n              }\n            };\n\n            animloop();\n          };\n\n        var publicMethods = {\n          // make a few local variables and functions public\n          shout: _shout,\n          listen: _listen,\n          viewportSize: _viewportSize,\n          options: _options,\n          isMainScrollAnimating: function isMainScrollAnimating() {\n            return _mainScrollAnimating;\n          },\n          getZoomLevel: function getZoomLevel() {\n            return _currZoomLevel;\n          },\n          getCurrentIndex: function getCurrentIndex() {\n            return _currentItemIndex;\n          },\n          isDragging: function isDragging() {\n            return _isDragging;\n          },\n          isZooming: function isZooming() {\n            return _isZooming;\n          },\n          setScrollOffset: function setScrollOffset(x, y) {\n            _offset.x = x;\n            _currentWindowScrollY = _offset.y = y;\n\n            _shout(\"updateScrollOffset\", _offset);\n          },\n          applyZoomPan: function applyZoomPan(\n            zoomLevel,\n            panX,\n            panY,\n            allowRenderResolution\n          ) {\n            _panOffset.x = panX;\n            _panOffset.y = panY;\n            _currZoomLevel = zoomLevel;\n\n            _applyCurrentZoomPan(allowRenderResolution);\n          },\n          init: function init() {\n            if (_isOpen || _isDestroying) {\n              return;\n            }\n\n            var i;\n            self.framework = framework; // basic functionality\n\n            self.template = template; // root DOM element of PhotoSwipe\n\n            self.bg = framework.getChildByClass(template, \"pswp__bg\");\n            _initalClassName = template.className;\n            _isOpen = true;\n            _features = framework.detectFeatures();\n            _requestAF = _features.raf;\n            _cancelAF = _features.caf;\n            _transformKey = _features.transform;\n            _oldIE = _features.oldIE;\n            self.scrollWrap = framework.getChildByClass(\n              template,\n              \"pswp__scroll-wrap\"\n            );\n            self.container = framework.getChildByClass(\n              self.scrollWrap,\n              \"pswp__container\"\n            );\n            _containerStyle = self.container.style; // for fast access\n            // Objects that hold slides (there are only 3 in DOM)\n\n            self.itemHolders = _itemHolders = [\n              {\n                el: self.container.children[0],\n                wrap: 0,\n                index: -1,\n              },\n              {\n                el: self.container.children[1],\n                wrap: 0,\n                index: -1,\n              },\n              {\n                el: self.container.children[2],\n                wrap: 0,\n                index: -1,\n              },\n            ]; // hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\n\n            _itemHolders[0].el.style.display =\n              _itemHolders[2].el.style.display = \"none\";\n\n            _setupTransforms(); // Setup global events\n\n            _globalEventHandlers = {\n              resize: self.updateSize,\n              // Fixes: iOS 10.3 resize event\n              // does not update scrollWrap.clientWidth instantly after resize\n              // https://github.com/dimsemenov/PhotoSwipe/issues/1315\n              orientationchange: function orientationchange() {\n                clearTimeout(_orientationChangeTimeout);\n                _orientationChangeTimeout = setTimeout(function () {\n                  if (_viewportSize.x !== self.scrollWrap.clientWidth) {\n                    self.updateSize();\n                  }\n                }, 500);\n              },\n              scroll: _updatePageScrollOffset,\n              keydown: _onKeyDown,\n              click: _onGlobalClick,\n            }; // disable show/hide effects on old browsers that don't support CSS animations or transforms,\n            // old IOS, Android and Opera mobile. Blackberry seems to work fine, even older models.\n\n            var oldPhone =\n              _features.isOldIOSPhone ||\n              _features.isOldAndroid ||\n              _features.isMobileOpera;\n\n            if (!_features.animationName || !_features.transform || oldPhone) {\n              _options.showAnimationDuration =\n                _options.hideAnimationDuration = 0;\n            } // init modules\n\n            for (i = 0; i < _modules.length; i++) {\n              self[\"init\" + _modules[i]]();\n            } // init\n\n            if (UiClass) {\n              var ui = (self.ui = new UiClass(self, framework));\n              ui.init();\n            }\n\n            _shout(\"firstUpdate\");\n\n            _currentItemIndex = _currentItemIndex || _options.index || 0; // validate index\n\n            if (\n              isNaN(_currentItemIndex) ||\n              _currentItemIndex < 0 ||\n              _currentItemIndex >= _getNumItems()\n            ) {\n              _currentItemIndex = 0;\n            }\n\n            self.currItem = _getItemAt(_currentItemIndex);\n\n            if (_features.isOldIOSPhone || _features.isOldAndroid) {\n              _isFixedPosition = false;\n            }\n\n            template.setAttribute(\"aria-hidden\", \"false\");\n\n            if (_options.modal) {\n              if (!_isFixedPosition) {\n                template.style.position = \"absolute\";\n                template.style.top = framework.getScrollY() + \"px\";\n              } else {\n                template.style.position = \"fixed\";\n              }\n            }\n\n            if (_currentWindowScrollY === undefined) {\n              _shout(\"initialLayout\");\n\n              _currentWindowScrollY = _initalWindowScrollY =\n                framework.getScrollY();\n            } // add classes to root element of PhotoSwipe\n\n            var rootClasses = \"pswp--open \";\n\n            if (_options.mainClass) {\n              rootClasses += _options.mainClass + \" \";\n            }\n\n            if (_options.showHideOpacity) {\n              rootClasses += \"pswp--animate_opacity \";\n            }\n\n            rootClasses += _likelyTouchDevice ? \"pswp--touch\" : \"pswp--notouch\";\n            rootClasses += _features.animationName\n              ? \" pswp--css_animation\"\n              : \"\";\n            rootClasses += _features.svg ? \" pswp--svg\" : \"\";\n            framework.addClass(template, rootClasses);\n            self.updateSize(); // initial update\n\n            _containerShiftIndex = -1;\n            _indexDiff = null;\n\n            for (i = 0; i < NUM_HOLDERS; i++) {\n              _setTranslateX(\n                (i + _containerShiftIndex) * _slideSize.x,\n                _itemHolders[i].el.style\n              );\n            }\n\n            if (!_oldIE) {\n              framework.bind(self.scrollWrap, _downEvents, self); // no dragging for old IE\n            }\n\n            _listen(\"initialZoomInEnd\", function () {\n              self.setContent(_itemHolders[0], _currentItemIndex - 1);\n              self.setContent(_itemHolders[2], _currentItemIndex + 1);\n              _itemHolders[0].el.style.display =\n                _itemHolders[2].el.style.display = \"block\";\n\n              if (_options.focus) {\n                // focus causes layout,\n                // which causes lag during the animation,\n                // that's why we delay it untill the initial zoom transition ends\n                template.focus();\n              }\n\n              _bindEvents();\n            }); // set content for center slide (first time)\n\n            self.setContent(_itemHolders[1], _currentItemIndex);\n            self.updateCurrItem();\n\n            _shout(\"afterInit\");\n\n            if (!_isFixedPosition) {\n              // On all versions of iOS lower than 8.0, we check size of viewport every second.\n              //\n              // This is done to detect when Safari top & bottom bars appear,\n              // as this action doesn't trigger any events (like resize).\n              //\n              // On iOS8 they fixed this.\n              //\n              // 10 Nov 2014: iOS 7 usage ~40%. iOS 8 usage 56%.\n              _updateSizeInterval = setInterval(function () {\n                if (\n                  !_numAnimations &&\n                  !_isDragging &&\n                  !_isZooming &&\n                  _currZoomLevel === self.currItem.initialZoomLevel\n                ) {\n                  self.updateSize();\n                }\n              }, 1000);\n            }\n\n            framework.addClass(template, \"pswp--visible\");\n          },\n          // Close the gallery, then destroy it\n          close: function close() {\n            if (!_isOpen) {\n              return;\n            }\n\n            _isOpen = false;\n            _isDestroying = true;\n\n            _shout(\"close\");\n\n            _unbindEvents();\n\n            _showOrHide(self.currItem, null, true, self.destroy);\n          },\n          // destroys the gallery (unbinds events, cleans up intervals and timeouts to avoid memory leaks)\n          destroy: function destroy() {\n            _shout(\"destroy\");\n\n            if (_showOrHideTimeout) {\n              clearTimeout(_showOrHideTimeout);\n            }\n\n            template.setAttribute(\"aria-hidden\", \"true\");\n            template.className = _initalClassName;\n\n            if (_updateSizeInterval) {\n              clearInterval(_updateSizeInterval);\n            }\n\n            framework.unbind(self.scrollWrap, _downEvents, self); // we unbind scroll event at the end, as closing animation may depend on it\n\n            framework.unbind(window, \"scroll\", self);\n\n            _stopDragUpdateLoop();\n\n            _stopAllAnimations();\n\n            _listeners = null;\n          },\n\n          /**\n           * Pan image to position\n           * @param {Number} x\n           * @param {Number} y\n           * @param {Boolean} force Will ignore bounds if set to true.\n           */\n          panTo: function panTo(x, y, force) {\n            if (!force) {\n              if (x > _currPanBounds.min.x) {\n                x = _currPanBounds.min.x;\n              } else if (x < _currPanBounds.max.x) {\n                x = _currPanBounds.max.x;\n              }\n\n              if (y > _currPanBounds.min.y) {\n                y = _currPanBounds.min.y;\n              } else if (y < _currPanBounds.max.y) {\n                y = _currPanBounds.max.y;\n              }\n            }\n\n            _panOffset.x = x;\n            _panOffset.y = y;\n\n            _applyCurrentZoomPan();\n          },\n          handleEvent: function handleEvent(e) {\n            e = e || window.event;\n\n            if (_globalEventHandlers[e.type]) {\n              _globalEventHandlers[e.type](e);\n            }\n          },\n          goTo: function goTo(index) {\n            index = _getLoopedId(index);\n            var diff = index - _currentItemIndex;\n            _indexDiff = diff;\n            _currentItemIndex = index;\n            self.currItem = _getItemAt(_currentItemIndex);\n            _currPositionIndex -= diff;\n\n            _moveMainScroll(_slideSize.x * _currPositionIndex);\n\n            _stopAllAnimations();\n\n            _mainScrollAnimating = false;\n            self.updateCurrItem();\n          },\n          next: function next() {\n            self.goTo(_currentItemIndex + 1);\n          },\n          prev: function prev() {\n            self.goTo(_currentItemIndex - 1);\n          },\n          // update current zoom/pan objects\n          updateCurrZoomItem: function updateCurrZoomItem(emulateSetContent) {\n            if (emulateSetContent) {\n              _shout(\"beforeChange\", 0);\n            } // itemHolder[1] is middle (current) item\n\n            if (_itemHolders[1].el.children.length) {\n              var zoomElement = _itemHolders[1].el.children[0];\n\n              if (framework.hasClass(zoomElement, \"pswp__zoom-wrap\")) {\n                _currZoomElementStyle = zoomElement.style;\n              } else {\n                _currZoomElementStyle = null;\n              }\n            } else {\n              _currZoomElementStyle = null;\n            }\n\n            _currPanBounds = self.currItem.bounds;\n            _startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n            _panOffset.x = _currPanBounds.center.x;\n            _panOffset.y = _currPanBounds.center.y;\n\n            if (emulateSetContent) {\n              _shout(\"afterChange\");\n            }\n          },\n          invalidateCurrItems: function invalidateCurrItems() {\n            _itemsNeedUpdate = true;\n\n            for (var i = 0; i < NUM_HOLDERS; i++) {\n              if (_itemHolders[i].item) {\n                _itemHolders[i].item.needsUpdate = true;\n              }\n            }\n          },\n          updateCurrItem: function updateCurrItem(beforeAnimation) {\n            if (_indexDiff === 0) {\n              return;\n            }\n\n            var diffAbs = Math.abs(_indexDiff),\n              tempHolder;\n\n            if (beforeAnimation && diffAbs < 2) {\n              return;\n            }\n\n            self.currItem = _getItemAt(_currentItemIndex);\n            _renderMaxResolution = false;\n\n            _shout(\"beforeChange\", _indexDiff);\n\n            if (diffAbs >= NUM_HOLDERS) {\n              _containerShiftIndex +=\n                _indexDiff + (_indexDiff > 0 ? -NUM_HOLDERS : NUM_HOLDERS);\n              diffAbs = NUM_HOLDERS;\n            }\n\n            for (var i = 0; i < diffAbs; i++) {\n              if (_indexDiff > 0) {\n                tempHolder = _itemHolders.shift();\n                _itemHolders[NUM_HOLDERS - 1] = tempHolder; // move first to last\n\n                _containerShiftIndex++;\n\n                _setTranslateX(\n                  (_containerShiftIndex + 2) * _slideSize.x,\n                  tempHolder.el.style\n                );\n\n                self.setContent(\n                  tempHolder,\n                  _currentItemIndex - diffAbs + i + 1 + 1\n                );\n              } else {\n                tempHolder = _itemHolders.pop();\n\n                _itemHolders.unshift(tempHolder); // move last to first\n\n                _containerShiftIndex--;\n\n                _setTranslateX(\n                  _containerShiftIndex * _slideSize.x,\n                  tempHolder.el.style\n                );\n\n                self.setContent(\n                  tempHolder,\n                  _currentItemIndex + diffAbs - i - 1 - 1\n                );\n              }\n            } // reset zoom/pan on previous item\n\n            if (_currZoomElementStyle && Math.abs(_indexDiff) === 1) {\n              var prevItem = _getItemAt(_prevItemIndex);\n\n              if (prevItem.initialZoomLevel !== _currZoomLevel) {\n                _calculateItemSize(prevItem, _viewportSize);\n\n                _setImageSize(prevItem);\n\n                _applyZoomPanToItem(prevItem);\n              }\n            } // reset diff after update\n\n            _indexDiff = 0;\n            self.updateCurrZoomItem();\n            _prevItemIndex = _currentItemIndex;\n\n            _shout(\"afterChange\");\n          },\n          updateSize: function updateSize(force) {\n            if (!_isFixedPosition && _options.modal) {\n              var windowScrollY = framework.getScrollY();\n\n              if (_currentWindowScrollY !== windowScrollY) {\n                template.style.top = windowScrollY + \"px\";\n                _currentWindowScrollY = windowScrollY;\n              }\n\n              if (\n                !force &&\n                _windowVisibleSize.x === window.innerWidth &&\n                _windowVisibleSize.y === window.innerHeight\n              ) {\n                return;\n              }\n\n              _windowVisibleSize.x = window.innerWidth;\n              _windowVisibleSize.y = window.innerHeight; //template.style.width = _windowVisibleSize.x + 'px';\n\n              template.style.height = _windowVisibleSize.y + \"px\";\n            }\n\n            _viewportSize.x = self.scrollWrap.clientWidth;\n            _viewportSize.y = self.scrollWrap.clientHeight;\n\n            _updatePageScrollOffset();\n\n            _slideSize.x =\n              _viewportSize.x + Math.round(_viewportSize.x * _options.spacing);\n            _slideSize.y = _viewportSize.y;\n\n            _moveMainScroll(_slideSize.x * _currPositionIndex);\n\n            _shout(\"beforeResize\"); // even may be used for example to switch image sources\n            // don't re-calculate size on inital size update\n\n            if (_containerShiftIndex !== undefined) {\n              var holder, item, hIndex;\n\n              for (var i = 0; i < NUM_HOLDERS; i++) {\n                holder = _itemHolders[i];\n\n                _setTranslateX(\n                  (i + _containerShiftIndex) * _slideSize.x,\n                  holder.el.style\n                );\n\n                hIndex = _currentItemIndex + i - 1;\n\n                if (_options.loop && _getNumItems() > 2) {\n                  hIndex = _getLoopedId(hIndex);\n                } // update zoom level on items and refresh source (if needsUpdate)\n\n                item = _getItemAt(hIndex); // re-render gallery item if `needsUpdate`,\n                // or doesn't have `bounds` (entirely new slide object)\n\n                if (\n                  item &&\n                  (_itemsNeedUpdate || item.needsUpdate || !item.bounds)\n                ) {\n                  self.cleanSlide(item);\n                  self.setContent(holder, hIndex); // if \"center\" slide\n\n                  if (i === 1) {\n                    self.currItem = item;\n                    self.updateCurrZoomItem(true);\n                  }\n\n                  item.needsUpdate = false;\n                } else if (holder.index === -1 && hIndex >= 0) {\n                  // add content first time\n                  self.setContent(holder, hIndex);\n                }\n\n                if (item && item.container) {\n                  _calculateItemSize(item, _viewportSize);\n\n                  _setImageSize(item);\n\n                  _applyZoomPanToItem(item);\n                }\n              }\n\n              _itemsNeedUpdate = false;\n            }\n\n            _startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;\n            _currPanBounds = self.currItem.bounds;\n\n            if (_currPanBounds) {\n              _panOffset.x = _currPanBounds.center.x;\n              _panOffset.y = _currPanBounds.center.y;\n\n              _applyCurrentZoomPan(true);\n            }\n\n            _shout(\"resize\");\n          },\n          // Zoom current item to\n          zoomTo: function zoomTo(\n            destZoomLevel,\n            centerPoint,\n            speed,\n            easingFn,\n            updateFn\n          ) {\n            /*\n            \tif(destZoomLevel === 'fit') {\n            \t\tdestZoomLevel = self.currItem.fitRatio;\n            \t} else if(destZoomLevel === 'fill') {\n            \t\tdestZoomLevel = self.currItem.fillRatio;\n            \t}\n            */\n            if (centerPoint) {\n              _startZoomLevel = _currZoomLevel;\n              _midZoomPoint.x = Math.abs(centerPoint.x) - _panOffset.x;\n              _midZoomPoint.y = Math.abs(centerPoint.y) - _panOffset.y;\n\n              _equalizePoints(_startPanOffset, _panOffset);\n            }\n\n            var destPanBounds = _calculatePanBounds(destZoomLevel, false),\n              destPanOffset = {};\n\n            _modifyDestPanOffset(\n              \"x\",\n              destPanBounds,\n              destPanOffset,\n              destZoomLevel\n            );\n\n            _modifyDestPanOffset(\n              \"y\",\n              destPanBounds,\n              destPanOffset,\n              destZoomLevel\n            );\n\n            var initialZoomLevel = _currZoomLevel;\n            var initialPanOffset = {\n              x: _panOffset.x,\n              y: _panOffset.y,\n            };\n\n            _roundPoint(destPanOffset);\n\n            var onUpdate = function onUpdate(now) {\n              if (now === 1) {\n                _currZoomLevel = destZoomLevel;\n                _panOffset.x = destPanOffset.x;\n                _panOffset.y = destPanOffset.y;\n              } else {\n                _currZoomLevel =\n                  (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;\n                _panOffset.x =\n                  (destPanOffset.x - initialPanOffset.x) * now +\n                  initialPanOffset.x;\n                _panOffset.y =\n                  (destPanOffset.y - initialPanOffset.y) * now +\n                  initialPanOffset.y;\n              }\n\n              if (updateFn) {\n                updateFn(now);\n              }\n\n              _applyCurrentZoomPan(now === 1);\n            };\n\n            if (speed) {\n              _animateProp(\n                \"customZoomTo\",\n                0,\n                1,\n                speed,\n                easingFn || framework.easing.sine.inOut,\n                onUpdate\n              );\n            } else {\n              onUpdate(1);\n            }\n          },\n        };\n        /*>>core*/\n\n        /*>>gestures*/\n\n        /**\n         * Mouse/touch/pointer event handlers.\n         *\n         * separated from @core.js for readability\n         */\n\n        var MIN_SWIPE_DISTANCE = 30,\n          DIRECTION_CHECK_OFFSET = 10; // amount of pixels to drag to determine direction of swipe\n\n        var _gestureStartTime,\n          _gestureCheckSpeedTime,\n          // pool of objects that are used during dragging of zooming\n          p = {},\n          // first point\n          p2 = {},\n          // second point (for zoom gesture)\n          delta = {},\n          _currPoint = {},\n          _startPoint = {},\n          _currPointers = [],\n          _startMainScrollPos = {},\n          _releaseAnimData,\n          _posPoints = [],\n          // array of points during dragging, used to determine type of gesture\n          _tempPoint = {},\n          _isZoomingIn,\n          _verticalDragInitiated,\n          _oldAndroidTouchEndTimeout,\n          _currZoomedItemIndex = 0,\n          _centerPoint = _getEmptyPoint(),\n          _lastReleaseTime = 0,\n          _isDragging,\n          // at least one pointer is down\n          _isMultitouch,\n          // at least two _pointers are down\n          _zoomStarted,\n          // zoom level changed during zoom gesture\n          _moved,\n          _dragAnimFrame,\n          _mainScrollShifted,\n          _currentPoints,\n          // array of current touch points\n          _isZooming,\n          _currPointsDistance,\n          _startPointsDistance,\n          _currPanBounds,\n          _mainScrollPos = _getEmptyPoint(),\n          _currZoomElementStyle,\n          _mainScrollAnimating,\n          // true, if animation after swipe gesture is running\n          _midZoomPoint = _getEmptyPoint(),\n          _currCenterPoint = _getEmptyPoint(),\n          _direction,\n          _isFirstMove,\n          _opacityChanged,\n          _bgOpacity,\n          _wasOverInitialZoom,\n          _isEqualPoints = function _isEqualPoints(p1, p2) {\n            return p1.x === p2.x && p1.y === p2.y;\n          },\n          _isNearbyPoints = function _isNearbyPoints(touch0, touch1) {\n            return (\n              Math.abs(touch0.x - touch1.x) < DOUBLE_TAP_RADIUS &&\n              Math.abs(touch0.y - touch1.y) < DOUBLE_TAP_RADIUS\n            );\n          },\n          _calculatePointsDistance = function _calculatePointsDistance(p1, p2) {\n            _tempPoint.x = Math.abs(p1.x - p2.x);\n            _tempPoint.y = Math.abs(p1.y - p2.y);\n            return Math.sqrt(\n              _tempPoint.x * _tempPoint.x + _tempPoint.y * _tempPoint.y\n            );\n          },\n          _stopDragUpdateLoop = function _stopDragUpdateLoop() {\n            if (_dragAnimFrame) {\n              _cancelAF(_dragAnimFrame);\n\n              _dragAnimFrame = null;\n            }\n          },\n          _dragUpdateLoop = function _dragUpdateLoop() {\n            if (_isDragging) {\n              _dragAnimFrame = _requestAF(_dragUpdateLoop);\n\n              _renderMovement();\n            }\n          },\n          _canPan = function _canPan() {\n            return !(\n              _options.scaleMode === \"fit\" &&\n              _currZoomLevel === self.currItem.initialZoomLevel\n            );\n          },\n          // find the closest parent DOM element\n          _closestElement = function _closestElement(el, fn) {\n            if (!el || el === document) {\n              return false;\n            } // don't search elements above pswp__scroll-wrap\n\n            if (\n              el.getAttribute(\"class\") &&\n              el.getAttribute(\"class\").indexOf(\"pswp__scroll-wrap\") > -1\n            ) {\n              return false;\n            }\n\n            if (fn(el)) {\n              return el;\n            }\n\n            return _closestElement(el.parentNode, fn);\n          },\n          _preventObj = {},\n          _preventDefaultEventBehaviour =\n            function _preventDefaultEventBehaviour(e, isDown) {\n              _preventObj.prevent = !_closestElement(\n                e.target,\n                _options.isClickableElement\n              );\n\n              _shout(\"preventDragEvent\", e, isDown, _preventObj);\n\n              return _preventObj.prevent;\n            },\n          _convertTouchToPoint = function _convertTouchToPoint(touch, p) {\n            p.x = touch.pageX;\n            p.y = touch.pageY;\n            p.id = touch.identifier;\n            return p;\n          },\n          _findCenterOfPoints = function _findCenterOfPoints(p1, p2, pCenter) {\n            pCenter.x = (p1.x + p2.x) * 0.5;\n            pCenter.y = (p1.y + p2.y) * 0.5;\n          },\n          _pushPosPoint = function _pushPosPoint(time, x, y) {\n            if (time - _gestureCheckSpeedTime > 50) {\n              var o = _posPoints.length > 2 ? _posPoints.shift() : {};\n              o.x = x;\n              o.y = y;\n\n              _posPoints.push(o);\n\n              _gestureCheckSpeedTime = time;\n            }\n          },\n          _calculateVerticalDragOpacityRatio =\n            function _calculateVerticalDragOpacityRatio() {\n              var yOffset = _panOffset.y - self.currItem.initialPosition.y; // difference between initial and current position\n\n              return 1 - Math.abs(yOffset / (_viewportSize.y / 2));\n            },\n          // points pool, reused during touch events\n          _ePoint1 = {},\n          _ePoint2 = {},\n          _tempPointsArr = [],\n          _tempCounter,\n          _getTouchPoints = function _getTouchPoints(e) {\n            // clean up previous points, without recreating array\n            while (_tempPointsArr.length > 0) {\n              _tempPointsArr.pop();\n            }\n\n            if (!_pointerEventEnabled) {\n              if (e.type.indexOf(\"touch\") > -1) {\n                if (e.touches && e.touches.length > 0) {\n                  _tempPointsArr[0] = _convertTouchToPoint(\n                    e.touches[0],\n                    _ePoint1\n                  );\n\n                  if (e.touches.length > 1) {\n                    _tempPointsArr[1] = _convertTouchToPoint(\n                      e.touches[1],\n                      _ePoint2\n                    );\n                  }\n                }\n              } else {\n                _ePoint1.x = e.pageX;\n                _ePoint1.y = e.pageY;\n                _ePoint1.id = \"\";\n                _tempPointsArr[0] = _ePoint1; //_ePoint1;\n              }\n            } else {\n              _tempCounter = 0; // we can use forEach, as pointer events are supported only in modern browsers\n\n              _currPointers.forEach(function (p) {\n                if (_tempCounter === 0) {\n                  _tempPointsArr[0] = p;\n                } else if (_tempCounter === 1) {\n                  _tempPointsArr[1] = p;\n                }\n\n                _tempCounter++;\n              });\n            }\n\n            return _tempPointsArr;\n          },\n          _panOrMoveMainScroll = function _panOrMoveMainScroll(axis, delta) {\n            var panFriction,\n              overDiff = 0,\n              newOffset = _panOffset[axis] + delta[axis],\n              startOverDiff,\n              dir = delta[axis] > 0,\n              newMainScrollPosition = _mainScrollPos.x + delta.x,\n              mainScrollDiff = _mainScrollPos.x - _startMainScrollPos.x,\n              newPanPos,\n              newMainScrollPos; // calculate fdistance over the bounds and friction\n\n            if (\n              newOffset > _currPanBounds.min[axis] ||\n              newOffset < _currPanBounds.max[axis]\n            ) {\n              panFriction = _options.panEndFriction; // Linear increasing of friction, so at 1/4 of viewport it's at max value.\n              // Looks not as nice as was expected. Left for history.\n              // panFriction = (1 - (_panOffset[axis] + delta[axis] + panBounds.min[axis]) / (_viewportSize[axis] / 4) );\n            } else {\n              panFriction = 1;\n            }\n\n            newOffset = _panOffset[axis] + delta[axis] * panFriction; // move main scroll or start panning\n\n            if (\n              _options.allowPanToNext ||\n              _currZoomLevel === self.currItem.initialZoomLevel\n            ) {\n              if (!_currZoomElementStyle) {\n                newMainScrollPos = newMainScrollPosition;\n              } else if (_direction === \"h\" && axis === \"x\" && !_zoomStarted) {\n                if (dir) {\n                  if (newOffset > _currPanBounds.min[axis]) {\n                    panFriction = _options.panEndFriction;\n                    overDiff = _currPanBounds.min[axis] - newOffset;\n                    startOverDiff =\n                      _currPanBounds.min[axis] - _startPanOffset[axis];\n                  } // drag right\n\n                  if (\n                    (startOverDiff <= 0 || mainScrollDiff < 0) &&\n                    _getNumItems() > 1\n                  ) {\n                    newMainScrollPos = newMainScrollPosition;\n\n                    if (\n                      mainScrollDiff < 0 &&\n                      newMainScrollPosition > _startMainScrollPos.x\n                    ) {\n                      newMainScrollPos = _startMainScrollPos.x;\n                    }\n                  } else {\n                    if (_currPanBounds.min.x !== _currPanBounds.max.x) {\n                      newPanPos = newOffset;\n                    }\n                  }\n                } else {\n                  if (newOffset < _currPanBounds.max[axis]) {\n                    panFriction = _options.panEndFriction;\n                    overDiff = newOffset - _currPanBounds.max[axis];\n                    startOverDiff =\n                      _startPanOffset[axis] - _currPanBounds.max[axis];\n                  }\n\n                  if (\n                    (startOverDiff <= 0 || mainScrollDiff > 0) &&\n                    _getNumItems() > 1\n                  ) {\n                    newMainScrollPos = newMainScrollPosition;\n\n                    if (\n                      mainScrollDiff > 0 &&\n                      newMainScrollPosition < _startMainScrollPos.x\n                    ) {\n                      newMainScrollPos = _startMainScrollPos.x;\n                    }\n                  } else {\n                    if (_currPanBounds.min.x !== _currPanBounds.max.x) {\n                      newPanPos = newOffset;\n                    }\n                  }\n                } //\n              }\n\n              if (axis === \"x\") {\n                if (newMainScrollPos !== undefined) {\n                  _moveMainScroll(newMainScrollPos, true);\n\n                  if (newMainScrollPos === _startMainScrollPos.x) {\n                    _mainScrollShifted = false;\n                  } else {\n                    _mainScrollShifted = true;\n                  }\n                }\n\n                if (_currPanBounds.min.x !== _currPanBounds.max.x) {\n                  if (newPanPos !== undefined) {\n                    _panOffset.x = newPanPos;\n                  } else if (!_mainScrollShifted) {\n                    _panOffset.x += delta.x * panFriction;\n                  }\n                }\n\n                return newMainScrollPos !== undefined;\n              }\n            }\n\n            if (!_mainScrollAnimating) {\n              if (!_mainScrollShifted) {\n                if (_currZoomLevel > self.currItem.fitRatio) {\n                  _panOffset[axis] += delta[axis] * panFriction;\n                }\n              }\n            }\n          },\n          // Pointerdown/touchstart/mousedown handler\n          _onDragStart = function _onDragStart(e) {\n            // Allow dragging only via left mouse button.\n            // As this handler is not added in IE8 - we ignore e.which\n            //\n            // http://www.quirksmode.org/js/events_properties.html\n            // https://developer.mozilla.org/en-US/docs/Web/API/event.button\n            if (e.type === \"mousedown\" && e.button > 0) {\n              return;\n            }\n\n            if (_initialZoomRunning) {\n              e.preventDefault();\n              return;\n            }\n\n            if (_oldAndroidTouchEndTimeout && e.type === \"mousedown\") {\n              return;\n            }\n\n            if (_preventDefaultEventBehaviour(e, true)) {\n              e.preventDefault();\n            }\n\n            _shout(\"pointerDown\");\n\n            if (_pointerEventEnabled) {\n              var pointerIndex = framework.arraySearch(\n                _currPointers,\n                e.pointerId,\n                \"id\"\n              );\n\n              if (pointerIndex < 0) {\n                pointerIndex = _currPointers.length;\n              }\n\n              _currPointers[pointerIndex] = {\n                x: e.pageX,\n                y: e.pageY,\n                id: e.pointerId,\n              };\n            }\n\n            var startPointsList = _getTouchPoints(e),\n              numPoints = startPointsList.length;\n\n            _currentPoints = null;\n\n            _stopAllAnimations(); // init drag\n\n            if (!_isDragging || numPoints === 1) {\n              _isDragging = _isFirstMove = true;\n              framework.bind(window, _upMoveEvents, self);\n              _isZoomingIn =\n                _wasOverInitialZoom =\n                _opacityChanged =\n                _verticalDragInitiated =\n                _mainScrollShifted =\n                _moved =\n                _isMultitouch =\n                _zoomStarted =\n                  false;\n              _direction = null;\n\n              _shout(\"firstTouchStart\", startPointsList);\n\n              _equalizePoints(_startPanOffset, _panOffset);\n\n              _currPanDist.x = _currPanDist.y = 0;\n\n              _equalizePoints(_currPoint, startPointsList[0]);\n\n              _equalizePoints(_startPoint, _currPoint); //_equalizePoints(_startMainScrollPos, _mainScrollPos);\n\n              _startMainScrollPos.x = _slideSize.x * _currPositionIndex;\n              _posPoints = [\n                {\n                  x: _currPoint.x,\n                  y: _currPoint.y,\n                },\n              ];\n              _gestureCheckSpeedTime = _gestureStartTime = _getCurrentTime(); //_mainScrollAnimationEnd(true);\n\n              _calculatePanBounds(_currZoomLevel, true); // Start rendering\n\n              _stopDragUpdateLoop();\n\n              _dragUpdateLoop();\n            } // init zoom\n\n            if (\n              !_isZooming &&\n              numPoints > 1 &&\n              !_mainScrollAnimating &&\n              !_mainScrollShifted\n            ) {\n              _startZoomLevel = _currZoomLevel;\n              _zoomStarted = false; // true if zoom changed at least once\n\n              _isZooming = _isMultitouch = true;\n              _currPanDist.y = _currPanDist.x = 0;\n\n              _equalizePoints(_startPanOffset, _panOffset);\n\n              _equalizePoints(p, startPointsList[0]);\n\n              _equalizePoints(p2, startPointsList[1]);\n\n              _findCenterOfPoints(p, p2, _currCenterPoint);\n\n              _midZoomPoint.x = Math.abs(_currCenterPoint.x) - _panOffset.x;\n              _midZoomPoint.y = Math.abs(_currCenterPoint.y) - _panOffset.y;\n              _currPointsDistance = _startPointsDistance =\n                _calculatePointsDistance(p, p2);\n            }\n          },\n          // Pointermove/touchmove/mousemove handler\n          _onDragMove = function _onDragMove(e) {\n            e.preventDefault();\n\n            if (_pointerEventEnabled) {\n              var pointerIndex = framework.arraySearch(\n                _currPointers,\n                e.pointerId,\n                \"id\"\n              );\n\n              if (pointerIndex > -1) {\n                var p = _currPointers[pointerIndex];\n                p.x = e.pageX;\n                p.y = e.pageY;\n              }\n            }\n\n            if (_isDragging) {\n              var touchesList = _getTouchPoints(e);\n\n              if (!_direction && !_moved && !_isZooming) {\n                if (_mainScrollPos.x !== _slideSize.x * _currPositionIndex) {\n                  // if main scroll position is shifted \u2013 direction is always horizontal\n                  _direction = \"h\";\n                } else {\n                  var diff =\n                    Math.abs(touchesList[0].x - _currPoint.x) -\n                    Math.abs(touchesList[0].y - _currPoint.y); // check the direction of movement\n\n                  if (Math.abs(diff) >= DIRECTION_CHECK_OFFSET) {\n                    _direction = diff > 0 ? \"h\" : \"v\";\n                    _currentPoints = touchesList;\n                  }\n                }\n              } else {\n                _currentPoints = touchesList;\n              }\n            }\n          },\n          //\n          _renderMovement = function _renderMovement() {\n            if (!_currentPoints) {\n              return;\n            }\n\n            var numPoints = _currentPoints.length;\n\n            if (numPoints === 0) {\n              return;\n            }\n\n            _equalizePoints(p, _currentPoints[0]);\n\n            delta.x = p.x - _currPoint.x;\n            delta.y = p.y - _currPoint.y;\n\n            if (_isZooming && numPoints > 1) {\n              // Handle behaviour for more than 1 point\n              _currPoint.x = p.x;\n              _currPoint.y = p.y; // check if one of two points changed\n\n              if (\n                !delta.x &&\n                !delta.y &&\n                _isEqualPoints(_currentPoints[1], p2)\n              ) {\n                return;\n              }\n\n              _equalizePoints(p2, _currentPoints[1]);\n\n              if (!_zoomStarted) {\n                _zoomStarted = true;\n\n                _shout(\"zoomGestureStarted\");\n              } // Distance between two points\n\n              var pointsDistance = _calculatePointsDistance(p, p2);\n\n              var zoomLevel = _calculateZoomLevel(pointsDistance); // slightly over the of initial zoom level\n\n              if (\n                zoomLevel >\n                self.currItem.initialZoomLevel +\n                  self.currItem.initialZoomLevel / 15\n              ) {\n                _wasOverInitialZoom = true;\n              } // Apply the friction if zoom level is out of the bounds\n\n              var zoomFriction = 1,\n                minZoomLevel = _getMinZoomLevel(),\n                maxZoomLevel = _getMaxZoomLevel();\n\n              if (zoomLevel < minZoomLevel) {\n                if (\n                  _options.pinchToClose &&\n                  !_wasOverInitialZoom &&\n                  _startZoomLevel <= self.currItem.initialZoomLevel\n                ) {\n                  // fade out background if zooming out\n                  var minusDiff = minZoomLevel - zoomLevel;\n                  var percent = 1 - minusDiff / (minZoomLevel / 1.2);\n\n                  _applyBgOpacity(percent);\n\n                  _shout(\"onPinchClose\", percent);\n\n                  _opacityChanged = true;\n                } else {\n                  zoomFriction = (minZoomLevel - zoomLevel) / minZoomLevel;\n\n                  if (zoomFriction > 1) {\n                    zoomFriction = 1;\n                  }\n\n                  zoomLevel = minZoomLevel - zoomFriction * (minZoomLevel / 3);\n                }\n              } else if (zoomLevel > maxZoomLevel) {\n                // 1.5 - extra zoom level above the max. E.g. if max is x6, real max 6 + 1.5 = 7.5\n                zoomFriction = (zoomLevel - maxZoomLevel) / (minZoomLevel * 6);\n\n                if (zoomFriction > 1) {\n                  zoomFriction = 1;\n                }\n\n                zoomLevel = maxZoomLevel + zoomFriction * minZoomLevel;\n              }\n\n              if (zoomFriction < 0) {\n                zoomFriction = 0;\n              } // distance between touch points after friction is applied\n\n              _currPointsDistance = pointsDistance; // _centerPoint - The point in the middle of two pointers\n\n              _findCenterOfPoints(p, p2, _centerPoint); // paning with two pointers pressed\n\n              _currPanDist.x += _centerPoint.x - _currCenterPoint.x;\n              _currPanDist.y += _centerPoint.y - _currCenterPoint.y;\n\n              _equalizePoints(_currCenterPoint, _centerPoint);\n\n              _panOffset.x = _calculatePanOffset(\"x\", zoomLevel);\n              _panOffset.y = _calculatePanOffset(\"y\", zoomLevel);\n              _isZoomingIn = zoomLevel > _currZoomLevel;\n              _currZoomLevel = zoomLevel;\n\n              _applyCurrentZoomPan();\n            } else {\n              // handle behaviour for one point (dragging or panning)\n              if (!_direction) {\n                return;\n              }\n\n              if (_isFirstMove) {\n                _isFirstMove = false; // subtract drag distance that was used during the detection direction\n\n                if (Math.abs(delta.x) >= DIRECTION_CHECK_OFFSET) {\n                  delta.x -= _currentPoints[0].x - _startPoint.x;\n                }\n\n                if (Math.abs(delta.y) >= DIRECTION_CHECK_OFFSET) {\n                  delta.y -= _currentPoints[0].y - _startPoint.y;\n                }\n              }\n\n              _currPoint.x = p.x;\n              _currPoint.y = p.y; // do nothing if pointers position hasn't changed\n\n              if (delta.x === 0 && delta.y === 0) {\n                return;\n              }\n\n              if (_direction === \"v\" && _options.closeOnVerticalDrag) {\n                if (!_canPan()) {\n                  _currPanDist.y += delta.y;\n                  _panOffset.y += delta.y;\n\n                  var opacityRatio = _calculateVerticalDragOpacityRatio();\n\n                  _verticalDragInitiated = true;\n\n                  _shout(\"onVerticalDrag\", opacityRatio);\n\n                  _applyBgOpacity(opacityRatio);\n\n                  _applyCurrentZoomPan();\n\n                  return;\n                }\n              }\n\n              _pushPosPoint(_getCurrentTime(), p.x, p.y);\n\n              _moved = true;\n              _currPanBounds = self.currItem.bounds;\n\n              var mainScrollChanged = _panOrMoveMainScroll(\"x\", delta);\n\n              if (!mainScrollChanged) {\n                _panOrMoveMainScroll(\"y\", delta);\n\n                _roundPoint(_panOffset);\n\n                _applyCurrentZoomPan();\n              }\n            }\n          },\n          // Pointerup/pointercancel/touchend/touchcancel/mouseup event handler\n          _onDragRelease = function _onDragRelease(e) {\n            if (_features.isOldAndroid) {\n              if (_oldAndroidTouchEndTimeout && e.type === \"mouseup\") {\n                return;\n              } // on Android (v4.1, 4.2, 4.3 & possibly older)\n              // ghost mousedown/up event isn't preventable via e.preventDefault,\n              // which causes fake mousedown event\n              // so we block mousedown/up for 600ms\n\n              if (e.type.indexOf(\"touch\") > -1) {\n                clearTimeout(_oldAndroidTouchEndTimeout);\n                _oldAndroidTouchEndTimeout = setTimeout(function () {\n                  _oldAndroidTouchEndTimeout = 0;\n                }, 600);\n              }\n            }\n\n            _shout(\"pointerUp\");\n\n            if (_preventDefaultEventBehaviour(e, false)) {\n              e.preventDefault();\n            }\n\n            var releasePoint;\n\n            if (_pointerEventEnabled) {\n              var pointerIndex = framework.arraySearch(\n                _currPointers,\n                e.pointerId,\n                \"id\"\n              );\n\n              if (pointerIndex > -1) {\n                releasePoint = _currPointers.splice(pointerIndex, 1)[0];\n\n                if (navigator.msPointerEnabled) {\n                  var MSPOINTER_TYPES = {\n                    4: \"mouse\",\n                    // event.MSPOINTER_TYPE_MOUSE\n                    2: \"touch\",\n                    // event.MSPOINTER_TYPE_TOUCH\n                    3: \"pen\", // event.MSPOINTER_TYPE_PEN\n                  };\n                  releasePoint.type = MSPOINTER_TYPES[e.pointerType];\n\n                  if (!releasePoint.type) {\n                    releasePoint.type = e.pointerType || \"mouse\";\n                  }\n                } else {\n                  releasePoint.type = e.pointerType || \"mouse\";\n                }\n              }\n            }\n\n            var touchList = _getTouchPoints(e),\n              gestureType,\n              numPoints = touchList.length;\n\n            if (e.type === \"mouseup\") {\n              numPoints = 0;\n            } // Do nothing if there were 3 touch points or more\n\n            if (numPoints === 2) {\n              _currentPoints = null;\n              return true;\n            } // if second pointer released\n\n            if (numPoints === 1) {\n              _equalizePoints(_startPoint, touchList[0]);\n            } // pointer hasn't moved, send \"tap release\" point\n\n            if (numPoints === 0 && !_direction && !_mainScrollAnimating) {\n              if (!releasePoint) {\n                if (e.type === \"mouseup\") {\n                  releasePoint = {\n                    x: e.pageX,\n                    y: e.pageY,\n                    type: \"mouse\",\n                  };\n                } else if (e.changedTouches && e.changedTouches[0]) {\n                  releasePoint = {\n                    x: e.changedTouches[0].pageX,\n                    y: e.changedTouches[0].pageY,\n                    type: \"touch\",\n                  };\n                }\n              }\n\n              _shout(\"touchRelease\", e, releasePoint);\n            } // Difference in time between releasing of two last touch points (zoom gesture)\n\n            var releaseTimeDiff = -1; // Gesture completed, no pointers left\n\n            if (numPoints === 0) {\n              _isDragging = false;\n              framework.unbind(window, _upMoveEvents, self);\n\n              _stopDragUpdateLoop();\n\n              if (_isZooming) {\n                // Two points released at the same time\n                releaseTimeDiff = 0;\n              } else if (_lastReleaseTime !== -1) {\n                releaseTimeDiff = _getCurrentTime() - _lastReleaseTime;\n              }\n            }\n\n            _lastReleaseTime = numPoints === 1 ? _getCurrentTime() : -1;\n\n            if (releaseTimeDiff !== -1 && releaseTimeDiff < 150) {\n              gestureType = \"zoom\";\n            } else {\n              gestureType = \"swipe\";\n            }\n\n            if (_isZooming && numPoints < 2) {\n              _isZooming = false; // Only second point released\n\n              if (numPoints === 1) {\n                gestureType = \"zoomPointerUp\";\n              }\n\n              _shout(\"zoomGestureEnded\");\n            }\n\n            _currentPoints = null;\n\n            if (\n              !_moved &&\n              !_zoomStarted &&\n              !_mainScrollAnimating &&\n              !_verticalDragInitiated\n            ) {\n              // nothing to animate\n              return;\n            }\n\n            _stopAllAnimations();\n\n            if (!_releaseAnimData) {\n              _releaseAnimData = _initDragReleaseAnimationData();\n            }\n\n            _releaseAnimData.calculateSwipeSpeed(\"x\");\n\n            if (_verticalDragInitiated) {\n              var opacityRatio = _calculateVerticalDragOpacityRatio();\n\n              if (opacityRatio < _options.verticalDragRange) {\n                self.close();\n              } else {\n                var initalPanY = _panOffset.y,\n                  initialBgOpacity = _bgOpacity;\n\n                _animateProp(\n                  \"verticalDrag\",\n                  0,\n                  1,\n                  300,\n                  framework.easing.cubic.out,\n                  function (now) {\n                    _panOffset.y =\n                      (self.currItem.initialPosition.y - initalPanY) * now +\n                      initalPanY;\n\n                    _applyBgOpacity(\n                      (1 - initialBgOpacity) * now + initialBgOpacity\n                    );\n\n                    _applyCurrentZoomPan();\n                  }\n                );\n\n                _shout(\"onVerticalDrag\", 1);\n              }\n\n              return;\n            } // main scroll\n\n            if (\n              (_mainScrollShifted || _mainScrollAnimating) &&\n              numPoints === 0\n            ) {\n              var itemChanged = _finishSwipeMainScrollGesture(\n                gestureType,\n                _releaseAnimData\n              );\n\n              if (itemChanged) {\n                return;\n              }\n\n              gestureType = \"zoomPointerUp\";\n            } // prevent zoom/pan animation when main scroll animation runs\n\n            if (_mainScrollAnimating) {\n              return;\n            } // Complete simple zoom gesture (reset zoom level if it's out of the bounds)\n\n            if (gestureType !== \"swipe\") {\n              _completeZoomGesture();\n\n              return;\n            } // Complete pan gesture if main scroll is not shifted, and it's possible to pan current image\n\n            if (\n              !_mainScrollShifted &&\n              _currZoomLevel > self.currItem.fitRatio\n            ) {\n              _completePanGesture(_releaseAnimData);\n            }\n          },\n          // Returns object with data about gesture\n          // It's created only once and then reused\n          _initDragReleaseAnimationData =\n            function _initDragReleaseAnimationData() {\n              // temp local vars\n              var lastFlickDuration, tempReleasePos; // s = this\n\n              var s = {\n                lastFlickOffset: {},\n                lastFlickDist: {},\n                lastFlickSpeed: {},\n                slowDownRatio: {},\n                slowDownRatioReverse: {},\n                speedDecelerationRatio: {},\n                speedDecelerationRatioAbs: {},\n                distanceOffset: {},\n                backAnimDestination: {},\n                backAnimStarted: {},\n                calculateSwipeSpeed: function calculateSwipeSpeed(axis) {\n                  if (_posPoints.length > 1) {\n                    lastFlickDuration =\n                      _getCurrentTime() - _gestureCheckSpeedTime + 50;\n                    tempReleasePos = _posPoints[_posPoints.length - 2][axis];\n                  } else {\n                    lastFlickDuration = _getCurrentTime() - _gestureStartTime; // total gesture duration\n\n                    tempReleasePos = _startPoint[axis];\n                  }\n\n                  s.lastFlickOffset[axis] = _currPoint[axis] - tempReleasePos;\n                  s.lastFlickDist[axis] = Math.abs(s.lastFlickOffset[axis]);\n\n                  if (s.lastFlickDist[axis] > 20) {\n                    s.lastFlickSpeed[axis] =\n                      s.lastFlickOffset[axis] / lastFlickDuration;\n                  } else {\n                    s.lastFlickSpeed[axis] = 0;\n                  }\n\n                  if (Math.abs(s.lastFlickSpeed[axis]) < 0.1) {\n                    s.lastFlickSpeed[axis] = 0;\n                  }\n\n                  s.slowDownRatio[axis] = 0.95;\n                  s.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];\n                  s.speedDecelerationRatio[axis] = 1;\n                },\n                calculateOverBoundsAnimOffset:\n                  function calculateOverBoundsAnimOffset(axis, speed) {\n                    if (!s.backAnimStarted[axis]) {\n                      if (_panOffset[axis] > _currPanBounds.min[axis]) {\n                        s.backAnimDestination[axis] = _currPanBounds.min[axis];\n                      } else if (_panOffset[axis] < _currPanBounds.max[axis]) {\n                        s.backAnimDestination[axis] = _currPanBounds.max[axis];\n                      }\n\n                      if (s.backAnimDestination[axis] !== undefined) {\n                        s.slowDownRatio[axis] = 0.7;\n                        s.slowDownRatioReverse[axis] =\n                          1 - s.slowDownRatio[axis];\n\n                        if (s.speedDecelerationRatioAbs[axis] < 0.05) {\n                          s.lastFlickSpeed[axis] = 0;\n                          s.backAnimStarted[axis] = true;\n\n                          _animateProp(\n                            \"bounceZoomPan\" + axis,\n                            _panOffset[axis],\n                            s.backAnimDestination[axis],\n                            speed || 300,\n                            framework.easing.sine.out,\n                            function (pos) {\n                              _panOffset[axis] = pos;\n\n                              _applyCurrentZoomPan();\n                            }\n                          );\n                        }\n                      }\n                    }\n                  },\n                // Reduces the speed by slowDownRatio (per 10ms)\n                calculateAnimOffset: function calculateAnimOffset(axis) {\n                  if (!s.backAnimStarted[axis]) {\n                    s.speedDecelerationRatio[axis] =\n                      s.speedDecelerationRatio[axis] *\n                      (s.slowDownRatio[axis] +\n                        s.slowDownRatioReverse[axis] -\n                        (s.slowDownRatioReverse[axis] * s.timeDiff) / 10);\n                    s.speedDecelerationRatioAbs[axis] = Math.abs(\n                      s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis]\n                    );\n                    s.distanceOffset[axis] =\n                      s.lastFlickSpeed[axis] *\n                      s.speedDecelerationRatio[axis] *\n                      s.timeDiff;\n                    _panOffset[axis] += s.distanceOffset[axis];\n                  }\n                },\n                panAnimLoop: function panAnimLoop() {\n                  if (_animations.zoomPan) {\n                    _animations.zoomPan.raf = _requestAF(s.panAnimLoop);\n                    s.now = _getCurrentTime();\n                    s.timeDiff = s.now - s.lastNow;\n                    s.lastNow = s.now;\n                    s.calculateAnimOffset(\"x\");\n                    s.calculateAnimOffset(\"y\");\n\n                    _applyCurrentZoomPan();\n\n                    s.calculateOverBoundsAnimOffset(\"x\");\n                    s.calculateOverBoundsAnimOffset(\"y\");\n\n                    if (\n                      s.speedDecelerationRatioAbs.x < 0.05 &&\n                      s.speedDecelerationRatioAbs.y < 0.05\n                    ) {\n                      // round pan position\n                      _panOffset.x = Math.round(_panOffset.x);\n                      _panOffset.y = Math.round(_panOffset.y);\n\n                      _applyCurrentZoomPan();\n\n                      _stopAnimation(\"zoomPan\");\n\n                      return;\n                    }\n                  }\n                },\n              };\n              return s;\n            },\n          _completePanGesture = function _completePanGesture(animData) {\n            // calculate swipe speed for Y axis (paanning)\n            animData.calculateSwipeSpeed(\"y\");\n            _currPanBounds = self.currItem.bounds;\n            animData.backAnimDestination = {};\n            animData.backAnimStarted = {}; // Avoid acceleration animation if speed is too low\n\n            if (\n              Math.abs(animData.lastFlickSpeed.x) <= 0.05 &&\n              Math.abs(animData.lastFlickSpeed.y) <= 0.05\n            ) {\n              animData.speedDecelerationRatioAbs.x =\n                animData.speedDecelerationRatioAbs.y = 0; // Run pan drag release animation. E.g. if you drag image and release finger without momentum.\n\n              animData.calculateOverBoundsAnimOffset(\"x\");\n              animData.calculateOverBoundsAnimOffset(\"y\");\n              return true;\n            } // Animation loop that controls the acceleration after pan gesture ends\n\n            _registerStartAnimation(\"zoomPan\");\n\n            animData.lastNow = _getCurrentTime();\n            animData.panAnimLoop();\n          },\n          _finishSwipeMainScrollGesture =\n            function _finishSwipeMainScrollGesture(\n              gestureType,\n              _releaseAnimData\n            ) {\n              var itemChanged;\n\n              if (!_mainScrollAnimating) {\n                _currZoomedItemIndex = _currentItemIndex;\n              }\n\n              var itemsDiff;\n\n              if (gestureType === \"swipe\") {\n                var totalShiftDist = _currPoint.x - _startPoint.x,\n                  isFastLastFlick = _releaseAnimData.lastFlickDist.x < 10; // if container is shifted for more than MIN_SWIPE_DISTANCE,\n                // and last flick gesture was in right direction\n\n                if (\n                  totalShiftDist > MIN_SWIPE_DISTANCE &&\n                  (isFastLastFlick || _releaseAnimData.lastFlickOffset.x > 20)\n                ) {\n                  // go to prev item\n                  itemsDiff = -1;\n                } else if (\n                  totalShiftDist < -MIN_SWIPE_DISTANCE &&\n                  (isFastLastFlick || _releaseAnimData.lastFlickOffset.x < -20)\n                ) {\n                  // go to next item\n                  itemsDiff = 1;\n                }\n              }\n\n              var nextCircle;\n\n              if (itemsDiff) {\n                _currentItemIndex += itemsDiff;\n\n                if (_currentItemIndex < 0) {\n                  _currentItemIndex = _options.loop ? _getNumItems() - 1 : 0;\n                  nextCircle = true;\n                } else if (_currentItemIndex >= _getNumItems()) {\n                  _currentItemIndex = _options.loop ? 0 : _getNumItems() - 1;\n                  nextCircle = true;\n                }\n\n                if (!nextCircle || _options.loop) {\n                  _indexDiff += itemsDiff;\n                  _currPositionIndex -= itemsDiff;\n                  itemChanged = true;\n                }\n              }\n\n              var animateToX = _slideSize.x * _currPositionIndex;\n              var animateToDist = Math.abs(animateToX - _mainScrollPos.x);\n              var finishAnimDuration;\n\n              if (\n                !itemChanged &&\n                animateToX > _mainScrollPos.x !==\n                  _releaseAnimData.lastFlickSpeed.x > 0\n              ) {\n                // \"return to current\" duration, e.g. when dragging from slide 0 to -1\n                finishAnimDuration = 333;\n              } else {\n                finishAnimDuration =\n                  Math.abs(_releaseAnimData.lastFlickSpeed.x) > 0\n                    ? animateToDist /\n                      Math.abs(_releaseAnimData.lastFlickSpeed.x)\n                    : 333;\n                finishAnimDuration = Math.min(finishAnimDuration, 400);\n                finishAnimDuration = Math.max(finishAnimDuration, 250);\n              }\n\n              if (_currZoomedItemIndex === _currentItemIndex) {\n                itemChanged = false;\n              }\n\n              _mainScrollAnimating = true;\n\n              _shout(\"mainScrollAnimStart\");\n\n              _animateProp(\n                \"mainScroll\",\n                _mainScrollPos.x,\n                animateToX,\n                finishAnimDuration,\n                framework.easing.cubic.out,\n                _moveMainScroll,\n                function () {\n                  _stopAllAnimations();\n\n                  _mainScrollAnimating = false;\n                  _currZoomedItemIndex = -1;\n\n                  if (\n                    itemChanged ||\n                    _currZoomedItemIndex !== _currentItemIndex\n                  ) {\n                    self.updateCurrItem();\n                  }\n\n                  _shout(\"mainScrollAnimComplete\");\n                }\n              );\n\n              if (itemChanged) {\n                self.updateCurrItem(true);\n              }\n\n              return itemChanged;\n            },\n          _calculateZoomLevel = function _calculateZoomLevel(touchesDistance) {\n            return (\n              (1 / _startPointsDistance) * touchesDistance * _startZoomLevel\n            );\n          },\n          // Resets zoom if it's out of bounds\n          _completeZoomGesture = function _completeZoomGesture() {\n            var destZoomLevel = _currZoomLevel,\n              minZoomLevel = _getMinZoomLevel(),\n              maxZoomLevel = _getMaxZoomLevel();\n\n            if (_currZoomLevel < minZoomLevel) {\n              destZoomLevel = minZoomLevel;\n            } else if (_currZoomLevel > maxZoomLevel) {\n              destZoomLevel = maxZoomLevel;\n            }\n\n            var destOpacity = 1,\n              onUpdate,\n              initialOpacity = _bgOpacity;\n\n            if (\n              _opacityChanged &&\n              !_isZoomingIn &&\n              !_wasOverInitialZoom &&\n              _currZoomLevel < minZoomLevel\n            ) {\n              //_closedByScroll = true;\n              self.close();\n              return true;\n            }\n\n            if (_opacityChanged) {\n              onUpdate = function onUpdate(now) {\n                _applyBgOpacity(\n                  (destOpacity - initialOpacity) * now + initialOpacity\n                );\n              };\n            }\n\n            self.zoomTo(\n              destZoomLevel,\n              0,\n              200,\n              framework.easing.cubic.out,\n              onUpdate\n            );\n            return true;\n          };\n\n        _registerModule(\"Gestures\", {\n          publicMethods: {\n            initGestures: function initGestures() {\n              // helper function that builds touch/pointer/mouse events\n              var addEventNames = function addEventNames(\n                pref,\n                down,\n                move,\n                up,\n                cancel\n              ) {\n                _dragStartEvent = pref + down;\n                _dragMoveEvent = pref + move;\n                _dragEndEvent = pref + up;\n\n                if (cancel) {\n                  _dragCancelEvent = pref + cancel;\n                } else {\n                  _dragCancelEvent = \"\";\n                }\n              };\n\n              _pointerEventEnabled = _features.pointerEvent;\n\n              if (_pointerEventEnabled && _features.touch) {\n                // we don't need touch events, if browser supports pointer events\n                _features.touch = false;\n              }\n\n              if (_pointerEventEnabled) {\n                if (navigator.msPointerEnabled) {\n                  // IE10 pointer events are case-sensitive\n                  addEventNames(\"MSPointer\", \"Down\", \"Move\", \"Up\", \"Cancel\");\n                } else {\n                  addEventNames(\"pointer\", \"down\", \"move\", \"up\", \"cancel\");\n                }\n              } else if (_features.touch) {\n                addEventNames(\"touch\", \"start\", \"move\", \"end\", \"cancel\");\n                _likelyTouchDevice = true;\n              } else {\n                addEventNames(\"mouse\", \"down\", \"move\", \"up\");\n              }\n\n              _upMoveEvents =\n                _dragMoveEvent + \" \" + _dragEndEvent + \" \" + _dragCancelEvent;\n              _downEvents = _dragStartEvent;\n\n              if (_pointerEventEnabled && !_likelyTouchDevice) {\n                _likelyTouchDevice =\n                  navigator.maxTouchPoints > 1 ||\n                  navigator.msMaxTouchPoints > 1;\n              } // make variable public\n\n              self.likelyTouchDevice = _likelyTouchDevice;\n              _globalEventHandlers[_dragStartEvent] = _onDragStart;\n              _globalEventHandlers[_dragMoveEvent] = _onDragMove;\n              _globalEventHandlers[_dragEndEvent] = _onDragRelease; // the Kraken\n\n              if (_dragCancelEvent) {\n                _globalEventHandlers[_dragCancelEvent] =\n                  _globalEventHandlers[_dragEndEvent];\n              } // Bind mouse events on device with detected hardware touch support, in case it supports multiple types of input.\n\n              if (_features.touch) {\n                _downEvents += \" mousedown\";\n                _upMoveEvents += \" mousemove mouseup\";\n                _globalEventHandlers.mousedown =\n                  _globalEventHandlers[_dragStartEvent];\n                _globalEventHandlers.mousemove =\n                  _globalEventHandlers[_dragMoveEvent];\n                _globalEventHandlers.mouseup =\n                  _globalEventHandlers[_dragEndEvent];\n              }\n\n              if (!_likelyTouchDevice) {\n                // don't allow pan to next slide from zoomed state on Desktop\n                _options.allowPanToNext = false;\n              }\n            },\n          },\n        });\n        /*>>gestures*/\n\n        /*>>show-hide-transition*/\n\n        /**\n         * show-hide-transition.js:\n         *\n         * Manages initial opening or closing transition.\n         *\n         * If you're not planning to use transition for gallery at all,\n         * you may set options hideAnimationDuration and showAnimationDuration to 0,\n         * and just delete startAnimation function.\n         *\n         */\n\n        var _showOrHideTimeout,\n          _showOrHide = function _showOrHide(item, img, out, completeFn) {\n            if (_showOrHideTimeout) {\n              clearTimeout(_showOrHideTimeout);\n            }\n\n            _initialZoomRunning = true;\n            _initialContentSet = true; // dimensions of small thumbnail {x:,y:,w:}.\n            // Height is optional, as calculated based on large image.\n\n            var thumbBounds;\n\n            if (item.initialLayout) {\n              thumbBounds = item.initialLayout;\n              item.initialLayout = null;\n            } else {\n              thumbBounds =\n                _options.getThumbBoundsFn &&\n                _options.getThumbBoundsFn(_currentItemIndex);\n            }\n\n            var duration = out\n              ? _options.hideAnimationDuration\n              : _options.showAnimationDuration;\n\n            var onComplete = function onComplete() {\n              _stopAnimation(\"initialZoom\");\n\n              if (!out) {\n                _applyBgOpacity(1);\n\n                if (img) {\n                  img.style.display = \"block\";\n                }\n\n                framework.addClass(template, \"pswp--animated-in\");\n\n                _shout(\"initialZoom\" + (out ? \"OutEnd\" : \"InEnd\"));\n              } else {\n                self.template.removeAttribute(\"style\");\n                self.bg.removeAttribute(\"style\");\n              }\n\n              if (completeFn) {\n                completeFn();\n              }\n\n              _initialZoomRunning = false;\n            }; // if bounds aren't provided, just open gallery without animation\n\n            if (!duration || !thumbBounds || thumbBounds.x === undefined) {\n              _shout(\"initialZoom\" + (out ? \"Out\" : \"In\"));\n\n              _currZoomLevel = item.initialZoomLevel;\n\n              _equalizePoints(_panOffset, item.initialPosition);\n\n              _applyCurrentZoomPan();\n\n              template.style.opacity = out ? 0 : 1;\n\n              _applyBgOpacity(1);\n\n              if (duration) {\n                setTimeout(function () {\n                  onComplete();\n                }, duration);\n              } else {\n                onComplete();\n              }\n\n              return;\n            }\n\n            var startAnimation = function startAnimation() {\n              var closeWithRaf = _closedByScroll,\n                fadeEverything =\n                  !self.currItem.src ||\n                  self.currItem.loadError ||\n                  _options.showHideOpacity; // apply hw-acceleration to image\n\n              if (item.miniImg) {\n                item.miniImg.style.webkitBackfaceVisibility = \"hidden\";\n              }\n\n              if (!out) {\n                _currZoomLevel = thumbBounds.w / item.w;\n                _panOffset.x = thumbBounds.x;\n                _panOffset.y = thumbBounds.y - _initalWindowScrollY;\n                self[fadeEverything ? \"template\" : \"bg\"].style.opacity = 0.001;\n\n                _applyCurrentZoomPan();\n              }\n\n              _registerStartAnimation(\"initialZoom\");\n\n              if (out && !closeWithRaf) {\n                framework.removeClass(template, \"pswp--animated-in\");\n              }\n\n              if (fadeEverything) {\n                if (out) {\n                  framework[(closeWithRaf ? \"remove\" : \"add\") + \"Class\"](\n                    template,\n                    \"pswp--animate_opacity\"\n                  );\n                } else {\n                  setTimeout(function () {\n                    framework.addClass(template, \"pswp--animate_opacity\");\n                  }, 30);\n                }\n              }\n\n              _showOrHideTimeout = setTimeout(\n                function () {\n                  _shout(\"initialZoom\" + (out ? \"Out\" : \"In\"));\n\n                  if (!out) {\n                    // \"in\" animation always uses CSS transitions (instead of rAF).\n                    // CSS transition work faster here,\n                    // as developer may also want to animate other things,\n                    // like ui on top of sliding area, which can be animated just via CSS\n                    _currZoomLevel = item.initialZoomLevel;\n\n                    _equalizePoints(_panOffset, item.initialPosition);\n\n                    _applyCurrentZoomPan();\n\n                    _applyBgOpacity(1);\n\n                    if (fadeEverything) {\n                      template.style.opacity = 1;\n                    } else {\n                      _applyBgOpacity(1);\n                    }\n\n                    _showOrHideTimeout = setTimeout(onComplete, duration + 20);\n                  } else {\n                    // \"out\" animation uses rAF only when PhotoSwipe is closed by browser scroll, to recalculate position\n                    var destZoomLevel = thumbBounds.w / item.w,\n                      initialPanOffset = {\n                        x: _panOffset.x,\n                        y: _panOffset.y,\n                      },\n                      initialZoomLevel = _currZoomLevel,\n                      initalBgOpacity = _bgOpacity,\n                      onUpdate = function onUpdate(now) {\n                        if (now === 1) {\n                          _currZoomLevel = destZoomLevel;\n                          _panOffset.x = thumbBounds.x;\n                          _panOffset.y = thumbBounds.y - _currentWindowScrollY;\n                        } else {\n                          _currZoomLevel =\n                            (destZoomLevel - initialZoomLevel) * now +\n                            initialZoomLevel;\n                          _panOffset.x =\n                            (thumbBounds.x - initialPanOffset.x) * now +\n                            initialPanOffset.x;\n                          _panOffset.y =\n                            (thumbBounds.y -\n                              _currentWindowScrollY -\n                              initialPanOffset.y) *\n                              now +\n                            initialPanOffset.y;\n                        }\n\n                        _applyCurrentZoomPan();\n\n                        if (fadeEverything) {\n                          template.style.opacity = 1 - now;\n                        } else {\n                          _applyBgOpacity(\n                            initalBgOpacity - now * initalBgOpacity\n                          );\n                        }\n                      };\n\n                    if (closeWithRaf) {\n                      _animateProp(\n                        \"initialZoom\",\n                        0,\n                        1,\n                        duration,\n                        framework.easing.cubic.out,\n                        onUpdate,\n                        onComplete\n                      );\n                    } else {\n                      onUpdate(1);\n                      _showOrHideTimeout = setTimeout(\n                        onComplete,\n                        duration + 20\n                      );\n                    }\n                  }\n                },\n                out ? 25 : 90\n              ); // Main purpose of this delay is to give browser time to paint and\n              // create composite layers of PhotoSwipe UI parts (background, controls, caption, arrows).\n              // Which avoids lag at the beginning of scale transition.\n            };\n\n            startAnimation();\n          };\n        /*>>show-hide-transition*/\n\n        /*>>items-controller*/\n\n        /**\n         *\n         * Controller manages gallery items, their dimensions, and their content.\n         *\n         */\n\n        var _items,\n          _tempPanAreaSize = {},\n          _imagesToAppendPool = [],\n          _initialContentSet,\n          _initialZoomRunning,\n          _controllerDefaultOptions = {\n            index: 0,\n            errorMsg:\n              '<div class=\"pswp__error-msg\"><a href=\"%url%\" target=\"_blank\" rel=\"noopener noreferrer\">The image</a> could not be loaded.</div>',\n            forceProgressiveLoading: false,\n            // TODO\n            preload: [1, 1],\n            getNumItemsFn: function getNumItemsFn() {\n              return _items.length;\n            },\n          };\n\n        var _getItemAt,\n          _getNumItems,\n          _getZeroBounds = function _getZeroBounds() {\n            return {\n              center: {\n                x: 0,\n                y: 0,\n              },\n              max: {\n                x: 0,\n                y: 0,\n              },\n              min: {\n                x: 0,\n                y: 0,\n              },\n            };\n          },\n          _calculateSingleItemPanBounds =\n            function _calculateSingleItemPanBounds(\n              item,\n              realPanElementW,\n              realPanElementH\n            ) {\n              var bounds = item.bounds; // position of element when it's centered\n\n              bounds.center.x = Math.round(\n                (_tempPanAreaSize.x - realPanElementW) / 2\n              );\n              bounds.center.y =\n                Math.round((_tempPanAreaSize.y - realPanElementH) / 2) +\n                item.vGap.top; // maximum pan position\n\n              bounds.max.x =\n                realPanElementW > _tempPanAreaSize.x\n                  ? Math.round(_tempPanAreaSize.x - realPanElementW)\n                  : bounds.center.x;\n              bounds.max.y =\n                realPanElementH > _tempPanAreaSize.y\n                  ? Math.round(_tempPanAreaSize.y - realPanElementH) +\n                    item.vGap.top\n                  : bounds.center.y; // minimum pan position\n\n              bounds.min.x =\n                realPanElementW > _tempPanAreaSize.x ? 0 : bounds.center.x;\n              bounds.min.y =\n                realPanElementH > _tempPanAreaSize.y\n                  ? item.vGap.top\n                  : bounds.center.y;\n            },\n          _calculateItemSize = function _calculateItemSize(\n            item,\n            viewportSize,\n            zoomLevel\n          ) {\n            if (item.src && !item.loadError) {\n              var isInitial = !zoomLevel;\n\n              if (isInitial) {\n                if (!item.vGap) {\n                  item.vGap = {\n                    top: 0,\n                    bottom: 0,\n                  };\n                } // allows overriding vertical margin for individual items\n\n                _shout(\"parseVerticalMargin\", item);\n              }\n\n              _tempPanAreaSize.x = viewportSize.x;\n              _tempPanAreaSize.y =\n                viewportSize.y - item.vGap.top - item.vGap.bottom;\n\n              if (isInitial) {\n                var hRatio = _tempPanAreaSize.x / item.w;\n                var vRatio = _tempPanAreaSize.y / item.h;\n                item.fitRatio = hRatio < vRatio ? hRatio : vRatio; //item.fillRatio = hRatio > vRatio ? hRatio : vRatio;\n\n                var scaleMode = _options.scaleMode;\n\n                if (scaleMode === \"orig\") {\n                  zoomLevel = 1;\n                } else if (scaleMode === \"fit\") {\n                  zoomLevel = item.fitRatio;\n                }\n\n                if (zoomLevel > 1) {\n                  zoomLevel = 1;\n                }\n\n                item.initialZoomLevel = zoomLevel;\n\n                if (!item.bounds) {\n                  // reuse bounds object\n                  item.bounds = _getZeroBounds();\n                }\n              }\n\n              if (!zoomLevel) {\n                return;\n              }\n\n              _calculateSingleItemPanBounds(\n                item,\n                item.w * zoomLevel,\n                item.h * zoomLevel\n              );\n\n              if (isInitial && zoomLevel === item.initialZoomLevel) {\n                item.initialPosition = item.bounds.center;\n              }\n\n              return item.bounds;\n            } else {\n              item.w = item.h = 0;\n              item.initialZoomLevel = item.fitRatio = 1;\n              item.bounds = _getZeroBounds();\n              item.initialPosition = item.bounds.center; // if it's not image, we return zero bounds (content is not zoomable)\n\n              return item.bounds;\n            }\n          },\n          _appendImage = function _appendImage(\n            index,\n            item,\n            baseDiv,\n            img,\n            preventAnimation,\n            keepPlaceholder\n          ) {\n            if (item.loadError) {\n              return;\n            }\n\n            if (img) {\n              item.imageAppended = true;\n\n              _setImageSize(\n                item,\n                img,\n                item === self.currItem && _renderMaxResolution\n              );\n\n              baseDiv.appendChild(img);\n\n              if (keepPlaceholder) {\n                setTimeout(function () {\n                  if (item && item.loaded && item.placeholder) {\n                    item.placeholder.style.display = \"none\";\n                    item.placeholder = null;\n                  }\n                }, 500);\n              }\n            }\n          },\n          _preloadImage = function _preloadImage(item) {\n            item.loading = true;\n            item.loaded = false;\n            var img = (item.img = framework.createEl(\"pswp__img\", \"img\"));\n\n            var onComplete = function onComplete() {\n              item.loading = false;\n              item.loaded = true;\n\n              if (item.loadComplete) {\n                item.loadComplete(item);\n              } else {\n                item.img = null; // no need to store image object\n              }\n\n              img.onload = img.onerror = null;\n              img = null;\n            };\n\n            img.onload = onComplete;\n\n            img.onerror = function () {\n              item.loadError = true;\n              onComplete();\n            };\n\n            img.src = item.src; // + '?a=' + Math.random();\n\n            return img;\n          },\n          _checkForError = function _checkForError(item, cleanUp) {\n            if (item.src && item.loadError && item.container) {\n              if (cleanUp) {\n                item.container.innerHTML = \"\";\n              }\n\n              item.container.innerHTML = _options.errorMsg.replace(\n                \"%url%\",\n                item.src\n              );\n              return true;\n            }\n          },\n          _setImageSize = function _setImageSize(item, img, maxRes) {\n            if (!item.src) {\n              return;\n            }\n\n            if (!img) {\n              img = item.container.lastChild;\n            }\n\n            var w = maxRes ? item.w : Math.round(item.w * item.fitRatio),\n              h = maxRes ? item.h : Math.round(item.h * item.fitRatio);\n\n            if (item.placeholder && !item.loaded) {\n              item.placeholder.style.width = w + \"px\";\n              item.placeholder.style.height = h + \"px\";\n            }\n\n            img.style.width = w + \"px\";\n            img.style.height = h + \"px\";\n          },\n          _appendImagesPool = function _appendImagesPool() {\n            if (_imagesToAppendPool.length) {\n              var poolItem;\n\n              for (var i = 0; i < _imagesToAppendPool.length; i++) {\n                poolItem = _imagesToAppendPool[i];\n\n                if (poolItem.holder.index === poolItem.index) {\n                  _appendImage(\n                    poolItem.index,\n                    poolItem.item,\n                    poolItem.baseDiv,\n                    poolItem.img,\n                    false,\n                    poolItem.clearPlaceholder\n                  );\n                }\n              }\n\n              _imagesToAppendPool = [];\n            }\n          };\n\n        _registerModule(\"Controller\", {\n          publicMethods: {\n            lazyLoadItem: function lazyLoadItem(index) {\n              index = _getLoopedId(index);\n\n              var item = _getItemAt(index);\n\n              if (\n                !item ||\n                ((item.loaded || item.loading) && !_itemsNeedUpdate)\n              ) {\n                return;\n              }\n\n              _shout(\"gettingData\", index, item);\n\n              if (!item.src) {\n                return;\n              }\n\n              _preloadImage(item);\n            },\n            initController: function initController() {\n              framework.extend(_options, _controllerDefaultOptions, true);\n              self.items = _items = items;\n              _getItemAt = self.getItemAt;\n              _getNumItems = _options.getNumItemsFn; //self.getNumItems;\n\n              if (_getNumItems() < 3) {\n                _options.loop = false; // disable loop if less then 3 items\n              }\n\n              _listen(\"beforeChange\", function (diff) {\n                var p = _options.preload,\n                  isNext = diff === null ? true : diff >= 0,\n                  preloadBefore = Math.min(p[0], _getNumItems()),\n                  preloadAfter = Math.min(p[1], _getNumItems()),\n                  i;\n\n                for (i = 1; i <= (isNext ? preloadAfter : preloadBefore); i++) {\n                  self.lazyLoadItem(_currentItemIndex + i);\n                }\n\n                for (i = 1; i <= (isNext ? preloadBefore : preloadAfter); i++) {\n                  self.lazyLoadItem(_currentItemIndex - i);\n                }\n              });\n\n              _listen(\"initialLayout\", function () {\n                self.currItem.initialLayout =\n                  _options.getThumbBoundsFn &&\n                  _options.getThumbBoundsFn(_currentItemIndex);\n              });\n\n              _listen(\"mainScrollAnimComplete\", _appendImagesPool);\n\n              _listen(\"initialZoomInEnd\", _appendImagesPool);\n\n              _listen(\"destroy\", function () {\n                var item;\n\n                for (var i = 0; i < _items.length; i++) {\n                  item = _items[i]; // remove reference to DOM elements, for GC\n\n                  if (item.container) {\n                    item.container = null;\n                  }\n\n                  if (item.placeholder) {\n                    item.placeholder = null;\n                  }\n\n                  if (item.img) {\n                    item.img = null;\n                  }\n\n                  if (item.preloader) {\n                    item.preloader = null;\n                  }\n\n                  if (item.loadError) {\n                    item.loaded = item.loadError = false;\n                  }\n                }\n\n                _imagesToAppendPool = null;\n              });\n            },\n            getItemAt: function getItemAt(index) {\n              if (index >= 0) {\n                return _items[index] !== undefined ? _items[index] : false;\n              }\n\n              return false;\n            },\n            allowProgressiveImg: function allowProgressiveImg() {\n              // 1. Progressive image loading isn't working on webkit/blink\n              //    when hw-acceleration (e.g. translateZ) is applied to IMG element.\n              //    That's why in PhotoSwipe parent element gets zoom transform, not image itself.\n              //\n              // 2. Progressive image loading sometimes blinks in webkit/blink when applying animation to parent element.\n              //    That's why it's disabled on touch devices (mainly because of swipe transition)\n              //\n              // 3. Progressive image loading sometimes doesn't work in IE (up to 11).\n              // Don't allow progressive loading on non-large touch devices\n              return (\n                _options.forceProgressiveLoading ||\n                !_likelyTouchDevice ||\n                _options.mouseUsed ||\n                screen.width > 1200\n              ); // 1200 - to eliminate touch devices with large screen (like Chromebook Pixel)\n            },\n            setContent: function setContent(holder, index) {\n              if (_options.loop) {\n                index = _getLoopedId(index);\n              }\n\n              var prevItem = self.getItemAt(holder.index);\n\n              if (prevItem) {\n                prevItem.container = null;\n              }\n\n              var item = self.getItemAt(index),\n                img;\n\n              if (!item) {\n                holder.el.innerHTML = \"\";\n                return;\n              } // allow to override data\n\n              _shout(\"gettingData\", index, item);\n\n              holder.index = index;\n              holder.item = item; // base container DIV is created only once for each of 3 holders\n\n              var baseDiv = (item.container =\n                framework.createEl(\"pswp__zoom-wrap\"));\n\n              if (!item.src && item.html) {\n                if (item.html.tagName) {\n                  baseDiv.appendChild(item.html);\n                } else {\n                  baseDiv.innerHTML = item.html;\n                }\n              }\n\n              _checkForError(item);\n\n              _calculateItemSize(item, _viewportSize);\n\n              if (item.src && !item.loadError && !item.loaded) {\n                item.loadComplete = function (item) {\n                  // gallery closed before image finished loading\n                  if (!_isOpen) {\n                    return;\n                  } // check if holder hasn't changed while image was loading\n\n                  if (holder && holder.index === index) {\n                    if (_checkForError(item, true)) {\n                      item.loadComplete = item.img = null;\n\n                      _calculateItemSize(item, _viewportSize);\n\n                      _applyZoomPanToItem(item);\n\n                      if (holder.index === _currentItemIndex) {\n                        // recalculate dimensions\n                        self.updateCurrZoomItem();\n                      }\n\n                      return;\n                    }\n\n                    if (!item.imageAppended) {\n                      if (\n                        _features.transform &&\n                        (_mainScrollAnimating || _initialZoomRunning)\n                      ) {\n                        _imagesToAppendPool.push({\n                          item: item,\n                          baseDiv: baseDiv,\n                          img: item.img,\n                          index: index,\n                          holder: holder,\n                          clearPlaceholder: true,\n                        });\n                      } else {\n                        _appendImage(\n                          index,\n                          item,\n                          baseDiv,\n                          item.img,\n                          _mainScrollAnimating || _initialZoomRunning,\n                          true\n                        );\n                      }\n                    } else {\n                      // remove preloader & mini-img\n                      if (!_initialZoomRunning && item.placeholder) {\n                        item.placeholder.style.display = \"none\";\n                        item.placeholder = null;\n                      }\n                    }\n                  }\n\n                  item.loadComplete = null;\n                  item.img = null; // no need to store image element after it's added\n\n                  _shout(\"imageLoadComplete\", index, item);\n                };\n\n                if (framework.features.transform) {\n                  var placeholderClassName = \"pswp__img pswp__img--placeholder\";\n                  placeholderClassName += item.msrc\n                    ? \"\"\n                    : \" pswp__img--placeholder--blank\";\n                  var placeholder = framework.createEl(\n                    placeholderClassName,\n                    item.msrc ? \"img\" : \"\"\n                  );\n\n                  if (item.msrc) {\n                    placeholder.src = item.msrc;\n                  }\n\n                  _setImageSize(item, placeholder);\n\n                  baseDiv.appendChild(placeholder);\n                  item.placeholder = placeholder;\n                }\n\n                if (!item.loading) {\n                  _preloadImage(item);\n                }\n\n                if (self.allowProgressiveImg()) {\n                  // just append image\n                  if (!_initialContentSet && _features.transform) {\n                    _imagesToAppendPool.push({\n                      item: item,\n                      baseDiv: baseDiv,\n                      img: item.img,\n                      index: index,\n                      holder: holder,\n                    });\n                  } else {\n                    _appendImage(index, item, baseDiv, item.img, true, true);\n                  }\n                }\n              } else if (item.src && !item.loadError) {\n                // image object is created every time, due to bugs of image loading & delay when switching images\n                img = framework.createEl(\"pswp__img\", \"img\");\n                img.style.opacity = 1;\n                img.src = item.src;\n\n                _setImageSize(item, img);\n\n                _appendImage(index, item, baseDiv, img);\n              }\n\n              if (!_initialContentSet && index === _currentItemIndex) {\n                _currZoomElementStyle = baseDiv.style;\n\n                _showOrHide(item, img || item.img);\n              } else {\n                _applyZoomPanToItem(item);\n              }\n\n              holder.el.innerHTML = \"\";\n              holder.el.appendChild(baseDiv);\n            },\n            cleanSlide: function cleanSlide(item) {\n              if (item.img) {\n                item.img.onload = item.img.onerror = null;\n              }\n\n              item.loaded =\n                item.loading =\n                item.img =\n                item.imageAppended =\n                  false;\n            },\n          },\n        });\n        /*>>items-controller*/\n\n        /*>>tap*/\n\n        /**\n         * tap.js:\n         *\n         * Displatches tap and double-tap events.\n         *\n         */\n\n        var tapTimer,\n          tapReleasePoint = {},\n          _dispatchTapEvent = function _dispatchTapEvent(\n            origEvent,\n            releasePoint,\n            pointerType\n          ) {\n            var e = document.createEvent(\"CustomEvent\"),\n              eDetail = {\n                origEvent: origEvent,\n                target: origEvent.target,\n                releasePoint: releasePoint,\n                pointerType: pointerType || \"touch\",\n              };\n            e.initCustomEvent(\"pswpTap\", true, true, eDetail);\n            origEvent.target.dispatchEvent(e);\n          };\n\n        _registerModule(\"Tap\", {\n          publicMethods: {\n            initTap: function initTap() {\n              _listen(\"firstTouchStart\", self.onTapStart);\n\n              _listen(\"touchRelease\", self.onTapRelease);\n\n              _listen(\"destroy\", function () {\n                tapReleasePoint = {};\n                tapTimer = null;\n              });\n            },\n            onTapStart: function onTapStart(touchList) {\n              if (touchList.length > 1) {\n                clearTimeout(tapTimer);\n                tapTimer = null;\n              }\n            },\n            onTapRelease: function onTapRelease(e, releasePoint) {\n              if (!releasePoint) {\n                return;\n              }\n\n              if (!_moved && !_isMultitouch && !_numAnimations) {\n                var p0 = releasePoint;\n\n                if (tapTimer) {\n                  clearTimeout(tapTimer);\n                  tapTimer = null; // Check if taped on the same place\n\n                  if (_isNearbyPoints(p0, tapReleasePoint)) {\n                    _shout(\"doubleTap\", p0);\n\n                    return;\n                  }\n                }\n\n                if (releasePoint.type === \"mouse\") {\n                  _dispatchTapEvent(e, releasePoint, \"mouse\");\n\n                  return;\n                }\n\n                var clickedTagName = e.target.tagName.toUpperCase(); // avoid double tap delay on buttons and elements that have class pswp__single-tap\n\n                if (\n                  clickedTagName === \"BUTTON\" ||\n                  framework.hasClass(e.target, \"pswp__single-tap\")\n                ) {\n                  _dispatchTapEvent(e, releasePoint);\n\n                  return;\n                }\n\n                _equalizePoints(tapReleasePoint, p0);\n\n                tapTimer = setTimeout(function () {\n                  _dispatchTapEvent(e, releasePoint);\n\n                  tapTimer = null;\n                }, 300);\n              }\n            },\n          },\n        });\n        /*>>tap*/\n\n        /*>>desktop-zoom*/\n\n        /**\n         *\n         * desktop-zoom.js:\n         *\n         * - Binds mousewheel event for paning zoomed image.\n         * - Manages \"dragging\", \"zoomed-in\", \"zoom-out\" classes.\n         *   (which are used for cursors and zoom icon)\n         * - Adds toggleDesktopZoom function.\n         *\n         */\n\n        var _wheelDelta;\n\n        _registerModule(\"DesktopZoom\", {\n          publicMethods: {\n            initDesktopZoom: function initDesktopZoom() {\n              if (_oldIE) {\n                // no zoom for old IE (<=8)\n                return;\n              }\n\n              if (_likelyTouchDevice) {\n                // if detected hardware touch support, we wait until mouse is used,\n                // and only then apply desktop-zoom features\n                _listen(\"mouseUsed\", function () {\n                  self.setupDesktopZoom();\n                });\n              } else {\n                self.setupDesktopZoom(true);\n              }\n            },\n            setupDesktopZoom: function setupDesktopZoom(onInit) {\n              _wheelDelta = {};\n              var events = \"wheel mousewheel DOMMouseScroll\";\n\n              _listen(\"bindEvents\", function () {\n                framework.bind(template, events, self.handleMouseWheel);\n              });\n\n              _listen(\"unbindEvents\", function () {\n                if (_wheelDelta) {\n                  framework.unbind(template, events, self.handleMouseWheel);\n                }\n              });\n\n              self.mouseZoomedIn = false;\n\n              var hasDraggingClass,\n                updateZoomable = function updateZoomable() {\n                  if (self.mouseZoomedIn) {\n                    framework.removeClass(template, \"pswp--zoomed-in\");\n                    self.mouseZoomedIn = false;\n                  }\n\n                  if (_currZoomLevel < 1) {\n                    framework.addClass(template, \"pswp--zoom-allowed\");\n                  } else {\n                    framework.removeClass(template, \"pswp--zoom-allowed\");\n                  }\n\n                  removeDraggingClass();\n                },\n                removeDraggingClass = function removeDraggingClass() {\n                  if (hasDraggingClass) {\n                    framework.removeClass(template, \"pswp--dragging\");\n                    hasDraggingClass = false;\n                  }\n                };\n\n              _listen(\"resize\", updateZoomable);\n\n              _listen(\"afterChange\", updateZoomable);\n\n              _listen(\"pointerDown\", function () {\n                if (self.mouseZoomedIn) {\n                  hasDraggingClass = true;\n                  framework.addClass(template, \"pswp--dragging\");\n                }\n              });\n\n              _listen(\"pointerUp\", removeDraggingClass);\n\n              if (!onInit) {\n                updateZoomable();\n              }\n            },\n            handleMouseWheel: function handleMouseWheel(e) {\n              if (_currZoomLevel <= self.currItem.fitRatio) {\n                if (_options.modal) {\n                  if (\n                    !_options.closeOnScroll ||\n                    _numAnimations ||\n                    _isDragging\n                  ) {\n                    e.preventDefault();\n                  } else if (_transformKey && Math.abs(e.deltaY) > 2) {\n                    // close PhotoSwipe\n                    // if browser supports transforms & scroll changed enough\n                    _closedByScroll = true;\n                    self.close();\n                  }\n                }\n\n                return true;\n              } // allow just one event to fire\n\n              e.stopPropagation(); // https://developer.mozilla.org/en-US/docs/Web/Events/wheel\n\n              _wheelDelta.x = 0;\n\n              if (\"deltaX\" in e) {\n                if (\n                  e.deltaMode === 1\n                  /* DOM_DELTA_LINE */\n                ) {\n                  // 18 - average line height\n                  _wheelDelta.x = e.deltaX * 18;\n                  _wheelDelta.y = e.deltaY * 18;\n                } else {\n                  _wheelDelta.x = e.deltaX;\n                  _wheelDelta.y = e.deltaY;\n                }\n              } else if (\"wheelDelta\" in e) {\n                if (e.wheelDeltaX) {\n                  _wheelDelta.x = -0.16 * e.wheelDeltaX;\n                }\n\n                if (e.wheelDeltaY) {\n                  _wheelDelta.y = -0.16 * e.wheelDeltaY;\n                } else {\n                  _wheelDelta.y = -0.16 * e.wheelDelta;\n                }\n              } else if (\"detail\" in e) {\n                _wheelDelta.y = e.detail;\n              } else {\n                return;\n              }\n\n              _calculatePanBounds(_currZoomLevel, true);\n\n              var newPanX = _panOffset.x - _wheelDelta.x,\n                newPanY = _panOffset.y - _wheelDelta.y; // only prevent scrolling in nonmodal mode when not at edges\n\n              if (\n                _options.modal ||\n                (newPanX <= _currPanBounds.min.x &&\n                  newPanX >= _currPanBounds.max.x &&\n                  newPanY <= _currPanBounds.min.y &&\n                  newPanY >= _currPanBounds.max.y)\n              ) {\n                e.preventDefault();\n              } // TODO: use rAF instead of mousewheel?\n\n              self.panTo(newPanX, newPanY);\n            },\n            toggleDesktopZoom: function toggleDesktopZoom(centerPoint) {\n              centerPoint = centerPoint || {\n                x: _viewportSize.x / 2 + _offset.x,\n                y: _viewportSize.y / 2 + _offset.y,\n              };\n\n              var doubleTapZoomLevel = _options.getDoubleTapZoom(\n                true,\n                self.currItem\n              );\n\n              var zoomOut = _currZoomLevel === doubleTapZoomLevel;\n              self.mouseZoomedIn = !zoomOut;\n              self.zoomTo(\n                zoomOut ? self.currItem.initialZoomLevel : doubleTapZoomLevel,\n                centerPoint,\n                333\n              );\n              framework[(!zoomOut ? \"add\" : \"remove\") + \"Class\"](\n                template,\n                \"pswp--zoomed-in\"\n              );\n            },\n          },\n        });\n        /*>>desktop-zoom*/\n\n        /*>>history*/\n\n        /**\n         *\n         * history.js:\n         *\n         * - Back button to close gallery.\n         *\n         * - Unique URL for each slide: example.com/&pid=1&gid=3\n         *   (where PID is picture index, and GID and gallery index)\n         *\n         * - Switch URL when slides change.\n         *\n         */\n\n        var _historyDefaultOptions = {\n          history: true,\n          galleryUID: 1,\n        };\n\n        var _historyUpdateTimeout,\n          _hashChangeTimeout,\n          _hashAnimCheckTimeout,\n          _hashChangedByScript,\n          _hashChangedByHistory,\n          _hashReseted,\n          _initialHash,\n          _historyChanged,\n          _closedFromURL,\n          _urlChangedOnce,\n          _windowLoc,\n          _supportsPushState,\n          _getHash = function _getHash() {\n            return _windowLoc.hash.substring(1);\n          },\n          _cleanHistoryTimeouts = function _cleanHistoryTimeouts() {\n            if (_historyUpdateTimeout) {\n              clearTimeout(_historyUpdateTimeout);\n            }\n\n            if (_hashAnimCheckTimeout) {\n              clearTimeout(_hashAnimCheckTimeout);\n            }\n          },\n          // pid - Picture index\n          // gid - Gallery index\n          _parseItemIndexFromURL = function _parseItemIndexFromURL() {\n            var hash = _getHash(),\n              params = {};\n\n            if (hash.length < 5) {\n              // pid=1\n              return params;\n            }\n\n            var i,\n              vars = hash.split(\"&\");\n\n            for (i = 0; i < vars.length; i++) {\n              if (!vars[i]) {\n                continue;\n              }\n\n              var pair = vars[i].split(\"=\");\n\n              if (pair.length < 2) {\n                continue;\n              }\n\n              params[pair[0]] = pair[1];\n            }\n\n            if (_options.galleryPIDs) {\n              // detect custom pid in hash and search for it among the items collection\n              var searchfor = params.pid;\n              params.pid = 0; // if custom pid cannot be found, fallback to the first item\n\n              for (i = 0; i < _items.length; i++) {\n                if (_items[i].pid === searchfor) {\n                  params.pid = i;\n                  break;\n                }\n              }\n            } else {\n              params.pid = parseInt(params.pid, 10) - 1;\n            }\n\n            if (params.pid < 0) {\n              params.pid = 0;\n            }\n\n            return params;\n          },\n          _updateHash = function _updateHash() {\n            if (_hashAnimCheckTimeout) {\n              clearTimeout(_hashAnimCheckTimeout);\n            }\n\n            if (_numAnimations || _isDragging) {\n              // changing browser URL forces layout/paint in some browsers, which causes noticable lag during animation\n              // that's why we update hash only when no animations running\n              _hashAnimCheckTimeout = setTimeout(_updateHash, 500);\n              return;\n            }\n\n            if (_hashChangedByScript) {\n              clearTimeout(_hashChangeTimeout);\n            } else {\n              _hashChangedByScript = true;\n            }\n\n            var pid = _currentItemIndex + 1;\n\n            var item = _getItemAt(_currentItemIndex);\n\n            if (item.hasOwnProperty(\"pid\")) {\n              // carry forward any custom pid assigned to the item\n              pid = item.pid;\n            }\n\n            var newHash =\n              _initialHash +\n              \"&\" +\n              \"gid=\" +\n              _options.galleryUID +\n              \"&\" +\n              \"pid=\" +\n              pid;\n\n            if (!_historyChanged) {\n              if (_windowLoc.hash.indexOf(newHash) === -1) {\n                _urlChangedOnce = true;\n              } // first time - add new hisory record, then just replace\n            }\n\n            var newURL = _windowLoc.href.split(\"#\")[0] + \"#\" + newHash;\n\n            if (_supportsPushState) {\n              if (\"#\" + newHash !== window.location.hash) {\n                history[_historyChanged ? \"replaceState\" : \"pushState\"](\n                  \"\",\n                  document.title,\n                  newURL\n                );\n              }\n            } else {\n              if (_historyChanged) {\n                _windowLoc.replace(newURL);\n              } else {\n                _windowLoc.hash = newHash;\n              }\n            }\n\n            _historyChanged = true;\n            _hashChangeTimeout = setTimeout(function () {\n              _hashChangedByScript = false;\n            }, 60);\n          };\n\n        _registerModule(\"History\", {\n          publicMethods: {\n            initHistory: function initHistory() {\n              framework.extend(_options, _historyDefaultOptions, true);\n\n              if (!_options.history) {\n                return;\n              }\n\n              _windowLoc = window.location;\n              _urlChangedOnce = false;\n              _closedFromURL = false;\n              _historyChanged = false;\n              _initialHash = _getHash();\n              _supportsPushState = \"pushState\" in history;\n\n              if (_initialHash.indexOf(\"gid=\") > -1) {\n                _initialHash = _initialHash.split(\"&gid=\")[0];\n                _initialHash = _initialHash.split(\"?gid=\")[0];\n              }\n\n              _listen(\"afterChange\", self.updateURL);\n\n              _listen(\"unbindEvents\", function () {\n                framework.unbind(window, \"hashchange\", self.onHashChange);\n              });\n\n              var returnToOriginal = function returnToOriginal() {\n                _hashReseted = true;\n\n                if (!_closedFromURL) {\n                  if (_urlChangedOnce) {\n                    history.back();\n                  } else {\n                    if (_initialHash) {\n                      _windowLoc.hash = _initialHash;\n                    } else {\n                      if (_supportsPushState) {\n                        // remove hash from url without refreshing it or scrolling to top\n                        history.pushState(\n                          \"\",\n                          document.title,\n                          _windowLoc.pathname + _windowLoc.search\n                        );\n                      } else {\n                        _windowLoc.hash = \"\";\n                      }\n                    }\n                  }\n                }\n\n                _cleanHistoryTimeouts();\n              };\n\n              _listen(\"unbindEvents\", function () {\n                if (_closedByScroll) {\n                  // if PhotoSwipe is closed by scroll, we go \"back\" before the closing animation starts\n                  // this is done to keep the scroll position\n                  returnToOriginal();\n                }\n              });\n\n              _listen(\"destroy\", function () {\n                if (!_hashReseted) {\n                  returnToOriginal();\n                }\n              });\n\n              _listen(\"firstUpdate\", function () {\n                _currentItemIndex = _parseItemIndexFromURL().pid;\n              });\n\n              var index = _initialHash.indexOf(\"pid=\");\n\n              if (index > -1) {\n                _initialHash = _initialHash.substring(0, index);\n\n                if (_initialHash.slice(-1) === \"&\") {\n                  _initialHash = _initialHash.slice(0, -1);\n                }\n              }\n\n              setTimeout(function () {\n                if (_isOpen) {\n                  // hasn't destroyed yet\n                  framework.bind(window, \"hashchange\", self.onHashChange);\n                }\n              }, 40);\n            },\n            onHashChange: function onHashChange() {\n              if (_getHash() === _initialHash) {\n                _closedFromURL = true;\n                self.close();\n                return;\n              }\n\n              if (!_hashChangedByScript) {\n                _hashChangedByHistory = true;\n                self.goTo(_parseItemIndexFromURL().pid);\n                _hashChangedByHistory = false;\n              }\n            },\n            updateURL: function updateURL() {\n              // Delay the update of URL, to avoid lag during transition,\n              // and to not to trigger actions like \"refresh page sound\" or \"blinking favicon\" to often\n              _cleanHistoryTimeouts();\n\n              if (_hashChangedByHistory) {\n                return;\n              }\n\n              if (!_historyChanged) {\n                _updateHash(); // first time\n              } else {\n                _historyUpdateTimeout = setTimeout(_updateHash, 800);\n              }\n            },\n          },\n        });\n        /*>>history*/\n\n        framework.extend(self, publicMethods);\n      };\n\n      return PhotoSwipe;\n    });\n  });\n\n  function _typeof$1(obj) {\n    if (typeof Symbol === \"function\" && _typeof(Symbol.iterator) === \"symbol\") {\n      _typeof$1 = function _typeof$1(obj) {\n        return _typeof(obj);\n      };\n    } else {\n      _typeof$1 = function _typeof$1(obj) {\n        return obj &&\n          typeof Symbol === \"function\" &&\n          obj.constructor === Symbol &&\n          obj !== Symbol.prototype\n          ? \"symbol\"\n          : _typeof(obj);\n      };\n    }\n\n    return _typeof$1(obj);\n  } // This is not really a perfect check, but works fine.\n  // From http://stackoverflow.com/questions/384286\n\n  var HAS_DOM_2 =\n    (typeof HTMLElement === \"undefined\"\n      ? \"undefined\"\n      : _typeof$1(HTMLElement)) === \"object\";\n  function isDOMElement(obj) {\n    return HAS_DOM_2\n      ? obj instanceof HTMLElement\n      : obj &&\n          _typeof$1(obj) === \"object\" &&\n          obj !== null &&\n          obj.nodeType === 1 &&\n          typeof obj.nodeName === \"string\";\n  }\n  function addClasses(el, classNames) {\n    classNames.forEach(function (className) {\n      el.classList.add(className);\n    });\n  }\n  function removeClasses(el, classNames) {\n    classNames.forEach(function (className) {\n      el.classList.remove(className);\n    });\n  }\n\n  /* UNMINIFIED RULES\n\n  const RULES = `\n  @keyframes noop {\n    0% { zoom: 1; }\n  }\n\n  @-webkit-keyframes noop {\n    0% { zoom: 1; }\n  }\n\n  .drift-zoom-pane.drift-open {\n    display: block;\n  }\n\n  .drift-zoom-pane.drift-opening, .drift-zoom-pane.drift-closing {\n    animation: noop 1ms;\n    -webkit-animation: noop 1ms;\n  }\n\n  .drift-zoom-pane {\n    position: absolute;\n    overflow: hidden;\n    width: 100%;\n    height: 100%;\n    top: 0;\n    left: 0;\n    pointer-events: none;\n  }\n\n  .drift-zoom-pane-loader {\n    display: none;\n  }\n\n  .drift-zoom-pane img {\n    position: absolute;\n    display: block;\n    max-width: none;\n    max-height: none;\n  }\n\n  .drift-bounding-box {\n    position: absolute;\n    pointer-events: none;\n  }\n  `;\n\n  */\n  var RULES =\n    \".drift-bounding-box,.drift-zoom-pane{position:absolute;pointer-events:none}@keyframes noop{0%{zoom:1}}@-webkit-keyframes noop{0%{zoom:1}}.drift-zoom-pane.drift-open{display:block}.drift-zoom-pane.drift-closing,.drift-zoom-pane.drift-opening{animation:noop 1ms;-webkit-animation:noop 1ms}.drift-zoom-pane{overflow:hidden;width:100%;height:100%;top:0;left:0}.drift-zoom-pane-loader{display:none}.drift-zoom-pane img{position:absolute;display:block;max-width:none;max-height:none}\";\n  function injectBaseStylesheet() {\n    if (document.querySelector(\".drift-base-styles\")) {\n      return;\n    }\n\n    var styleEl = document.createElement(\"style\");\n    styleEl.type = \"text/css\";\n    styleEl.classList.add(\"drift-base-styles\");\n    styleEl.appendChild(document.createTextNode(RULES));\n    var head = document.head;\n    head.insertBefore(styleEl, head.firstChild);\n  }\n\n  function throwIfMissing() {\n    throw new Error(\"Missing parameter\");\n  }\n\n  function _classCallCheck$1(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties$1(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass$1(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties$1(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties$1(Constructor, staticProps);\n    return Constructor;\n  }\n\n  var BoundingBox = /*#__PURE__*/ (function () {\n    function BoundingBox(options) {\n      _classCallCheck$1(this, BoundingBox);\n\n      this.isShowing = false;\n      var _options$namespace = options.namespace,\n        namespace = _options$namespace === void 0 ? null : _options$namespace,\n        _options$zoomFactor = options.zoomFactor,\n        zoomFactor =\n          _options$zoomFactor === void 0\n            ? throwIfMissing()\n            : _options$zoomFactor,\n        _options$containerEl = options.containerEl,\n        containerEl =\n          _options$containerEl === void 0\n            ? throwIfMissing()\n            : _options$containerEl;\n      this.settings = {\n        namespace: namespace,\n        zoomFactor: zoomFactor,\n        containerEl: containerEl,\n      };\n      this.openClasses = this._buildClasses(\"open\");\n\n      this._buildElement();\n    }\n\n    _createClass$1(BoundingBox, [\n      {\n        key: \"_buildClasses\",\n        value: function _buildClasses(suffix) {\n          var classes = [\"drift-\".concat(suffix)];\n          var ns = this.settings.namespace;\n\n          if (ns) {\n            classes.push(\"\".concat(ns, \"-\").concat(suffix));\n          }\n\n          return classes;\n        },\n      },\n      {\n        key: \"_buildElement\",\n        value: function _buildElement() {\n          this.el = document.createElement(\"div\");\n          addClasses(this.el, this._buildClasses(\"bounding-box\"));\n        },\n      },\n      {\n        key: \"show\",\n        value: function show(zoomPaneWidth, zoomPaneHeight) {\n          this.isShowing = true;\n          this.settings.containerEl.appendChild(this.el);\n          var style = this.el.style;\n          style.width = \"\".concat(\n            Math.round(zoomPaneWidth / this.settings.zoomFactor),\n            \"px\"\n          );\n          style.height = \"\".concat(\n            Math.round(zoomPaneHeight / this.settings.zoomFactor),\n            \"px\"\n          );\n          addClasses(this.el, this.openClasses);\n        },\n      },\n      {\n        key: \"hide\",\n        value: function hide() {\n          if (this.isShowing) {\n            this.settings.containerEl.removeChild(this.el);\n          }\n\n          this.isShowing = false;\n          removeClasses(this.el, this.openClasses);\n        },\n      },\n      {\n        key: \"setPosition\",\n        value: function setPosition(\n          percentageOffsetX,\n          percentageOffsetY,\n          triggerRect\n        ) {\n          var pageXOffset = window.pageXOffset;\n          var pageYOffset = window.pageYOffset;\n          var inlineLeft =\n            triggerRect.left +\n            percentageOffsetX * triggerRect.width -\n            this.el.clientWidth / 2 +\n            pageXOffset;\n          var inlineTop =\n            triggerRect.top +\n            percentageOffsetY * triggerRect.height -\n            this.el.clientHeight / 2 +\n            pageYOffset;\n\n          if (inlineLeft < triggerRect.left + pageXOffset) {\n            inlineLeft = triggerRect.left + pageXOffset;\n          } else if (\n            inlineLeft + this.el.clientWidth >\n            triggerRect.left + triggerRect.width + pageXOffset\n          ) {\n            inlineLeft =\n              triggerRect.left +\n              triggerRect.width -\n              this.el.clientWidth +\n              pageXOffset;\n          }\n\n          if (inlineTop < triggerRect.top + pageYOffset) {\n            inlineTop = triggerRect.top + pageYOffset;\n          } else if (\n            inlineTop + this.el.clientHeight >\n            triggerRect.top + triggerRect.height + pageYOffset\n          ) {\n            inlineTop =\n              triggerRect.top +\n              triggerRect.height -\n              this.el.clientHeight +\n              pageYOffset;\n          }\n\n          this.el.style.left = \"\".concat(inlineLeft, \"px\");\n          this.el.style.top = \"\".concat(inlineTop, \"px\");\n        },\n      },\n    ]);\n\n    return BoundingBox;\n  })();\n\n  function _classCallCheck$2(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties$2(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass$2(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties$2(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties$2(Constructor, staticProps);\n    return Constructor;\n  }\n\n  var Trigger = /*#__PURE__*/ (function () {\n    function Trigger() {\n      var options =\n        arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      _classCallCheck$2(this, Trigger);\n\n      this._show = this._show.bind(this);\n      this._hide = this._hide.bind(this);\n      this._handleEntry = this._handleEntry.bind(this);\n      this._handleMovement = this._handleMovement.bind(this);\n      var _options$el = options.el,\n        el = _options$el === void 0 ? throwIfMissing() : _options$el,\n        _options$zoomPane = options.zoomPane,\n        zoomPane =\n          _options$zoomPane === void 0 ? throwIfMissing() : _options$zoomPane,\n        _options$sourceAttrib = options.sourceAttribute,\n        sourceAttribute =\n          _options$sourceAttrib === void 0\n            ? throwIfMissing()\n            : _options$sourceAttrib,\n        _options$handleTouch = options.handleTouch,\n        handleTouch =\n          _options$handleTouch === void 0\n            ? throwIfMissing()\n            : _options$handleTouch,\n        _options$onShow = options.onShow,\n        onShow = _options$onShow === void 0 ? null : _options$onShow,\n        _options$onHide = options.onHide,\n        onHide = _options$onHide === void 0 ? null : _options$onHide,\n        _options$hoverDelay = options.hoverDelay,\n        hoverDelay = _options$hoverDelay === void 0 ? 0 : _options$hoverDelay,\n        _options$touchDelay = options.touchDelay,\n        touchDelay = _options$touchDelay === void 0 ? 0 : _options$touchDelay,\n        _options$hoverBoundin = options.hoverBoundingBox,\n        hoverBoundingBox =\n          _options$hoverBoundin === void 0\n            ? throwIfMissing()\n            : _options$hoverBoundin,\n        _options$touchBoundin = options.touchBoundingBox,\n        touchBoundingBox =\n          _options$touchBoundin === void 0\n            ? throwIfMissing()\n            : _options$touchBoundin,\n        _options$namespace = options.namespace,\n        namespace = _options$namespace === void 0 ? null : _options$namespace,\n        _options$zoomFactor = options.zoomFactor,\n        zoomFactor =\n          _options$zoomFactor === void 0\n            ? throwIfMissing()\n            : _options$zoomFactor,\n        _options$boundingBoxC = options.boundingBoxContainer,\n        boundingBoxContainer =\n          _options$boundingBoxC === void 0\n            ? throwIfMissing()\n            : _options$boundingBoxC;\n      this.settings = {\n        el: el,\n        zoomPane: zoomPane,\n        sourceAttribute: sourceAttribute,\n        handleTouch: handleTouch,\n        onShow: onShow,\n        onHide: onHide,\n        hoverDelay: hoverDelay,\n        touchDelay: touchDelay,\n        hoverBoundingBox: hoverBoundingBox,\n        touchBoundingBox: touchBoundingBox,\n        namespace: namespace,\n        zoomFactor: zoomFactor,\n        boundingBoxContainer: boundingBoxContainer,\n      };\n\n      if (this.settings.hoverBoundingBox || this.settings.touchBoundingBox) {\n        this.boundingBox = new BoundingBox({\n          namespace: this.settings.namespace,\n          zoomFactor: this.settings.zoomFactor,\n          containerEl: this.settings.boundingBoxContainer,\n        });\n      }\n\n      this.enabled = true;\n\n      this._bindEvents();\n    }\n\n    _createClass$2(Trigger, [\n      {\n        key: \"_preventDefault\",\n        value: function _preventDefault(event) {\n          event.preventDefault();\n        },\n      },\n      {\n        key: \"_preventDefaultAllowTouchScroll\",\n        value: function _preventDefaultAllowTouchScroll(event) {\n          if (\n            !this.settings.touchDelay ||\n            !this._isTouchEvent(event) ||\n            this.isShowing\n          ) {\n            event.preventDefault();\n          }\n        },\n      },\n      {\n        key: \"_isTouchEvent\",\n        value: function _isTouchEvent(event) {\n          return !!event.touches;\n        },\n      },\n      {\n        key: \"_bindEvents\",\n        value: function _bindEvents() {\n          this.settings.el.addEventListener(\n            \"mouseenter\",\n            this._handleEntry,\n            false\n          );\n          this.settings.el.addEventListener(\"mouseleave\", this._hide, false);\n          this.settings.el.addEventListener(\n            \"mousemove\",\n            this._handleMovement,\n            false\n          );\n\n          if (this.settings.handleTouch) {\n            this.settings.el.addEventListener(\n              \"touchstart\",\n              this._handleEntry,\n              false\n            );\n            this.settings.el.addEventListener(\"touchend\", this._hide, false);\n            this.settings.el.addEventListener(\n              \"touchmove\",\n              this._handleMovement,\n              false\n            );\n          } else {\n            this.settings.el.addEventListener(\n              \"touchstart\",\n              this._preventDefault,\n              false\n            );\n            this.settings.el.addEventListener(\n              \"touchend\",\n              this._preventDefault,\n              false\n            );\n            this.settings.el.addEventListener(\n              \"touchmove\",\n              this._preventDefault,\n              false\n            );\n          }\n        },\n      },\n      {\n        key: \"_unbindEvents\",\n        value: function _unbindEvents() {\n          this.settings.el.removeEventListener(\n            \"mouseenter\",\n            this._handleEntry,\n            false\n          );\n          this.settings.el.removeEventListener(\"mouseleave\", this._hide, false);\n          this.settings.el.removeEventListener(\n            \"mousemove\",\n            this._handleMovement,\n            false\n          );\n\n          if (this.settings.handleTouch) {\n            this.settings.el.removeEventListener(\n              \"touchstart\",\n              this._handleEntry,\n              false\n            );\n            this.settings.el.removeEventListener(\"touchend\", this._hide, false);\n            this.settings.el.removeEventListener(\n              \"touchmove\",\n              this._handleMovement,\n              false\n            );\n          } else {\n            this.settings.el.removeEventListener(\n              \"touchstart\",\n              this._preventDefault,\n              false\n            );\n            this.settings.el.removeEventListener(\n              \"touchend\",\n              this._preventDefault,\n              false\n            );\n            this.settings.el.removeEventListener(\n              \"touchmove\",\n              this._preventDefault,\n              false\n            );\n          }\n        },\n      },\n      {\n        key: \"_handleEntry\",\n        value: function _handleEntry(e) {\n          this._preventDefaultAllowTouchScroll(e);\n\n          this._lastMovement = e;\n\n          if (e.type == \"mouseenter\" && this.settings.hoverDelay) {\n            this.entryTimeout = setTimeout(\n              this._show,\n              this.settings.hoverDelay\n            );\n          } else if (this.settings.touchDelay) {\n            this.entryTimeout = setTimeout(\n              this._show,\n              this.settings.touchDelay\n            );\n          } else {\n            this._show();\n          }\n        },\n      },\n      {\n        key: \"_show\",\n        value: function _show() {\n          if (!this.enabled) {\n            return;\n          }\n\n          var onShow = this.settings.onShow;\n\n          if (onShow && typeof onShow === \"function\") {\n            onShow();\n          }\n\n          this.settings.zoomPane.show(\n            this.settings.el.getAttribute(this.settings.sourceAttribute),\n            this.settings.el.clientWidth,\n            this.settings.el.clientHeight\n          );\n\n          if (this._lastMovement) {\n            var touchActivated = this._lastMovement.touches;\n\n            if (\n              (touchActivated && this.settings.touchBoundingBox) ||\n              (!touchActivated && this.settings.hoverBoundingBox)\n            ) {\n              this.boundingBox.show(\n                this.settings.zoomPane.el.clientWidth,\n                this.settings.zoomPane.el.clientHeight\n              );\n            }\n          }\n\n          this._handleMovement();\n        },\n      },\n      {\n        key: \"_hide\",\n        value: function _hide(e) {\n          if (e) {\n            this._preventDefaultAllowTouchScroll(e);\n          }\n\n          this._lastMovement = null;\n\n          if (this.entryTimeout) {\n            clearTimeout(this.entryTimeout);\n          }\n\n          if (this.boundingBox) {\n            this.boundingBox.hide();\n          }\n\n          var onHide = this.settings.onHide;\n\n          if (onHide && typeof onHide === \"function\") {\n            onHide();\n          }\n\n          this.settings.zoomPane.hide();\n        },\n      },\n      {\n        key: \"_handleMovement\",\n        value: function _handleMovement(e) {\n          if (e) {\n            this._preventDefaultAllowTouchScroll(e);\n\n            this._lastMovement = e;\n          } else if (this._lastMovement) {\n            e = this._lastMovement;\n          } else {\n            return;\n          }\n\n          var movementX;\n          var movementY;\n\n          if (e.touches) {\n            var firstTouch = e.touches[0];\n            movementX = firstTouch.clientX;\n            movementY = firstTouch.clientY;\n          } else {\n            movementX = e.clientX;\n            movementY = e.clientY;\n          }\n\n          var el = this.settings.el;\n          var rect = el.getBoundingClientRect();\n          var offsetX = movementX - rect.left;\n          var offsetY = movementY - rect.top;\n          var percentageOffsetX = offsetX / this.settings.el.clientWidth;\n          var percentageOffsetY = offsetY / this.settings.el.clientHeight;\n\n          if (this.boundingBox) {\n            this.boundingBox.setPosition(\n              percentageOffsetX,\n              percentageOffsetY,\n              rect\n            );\n          }\n\n          this.settings.zoomPane.setPosition(\n            percentageOffsetX,\n            percentageOffsetY,\n            rect\n          );\n        },\n      },\n      {\n        key: \"isShowing\",\n        get: function get() {\n          return this.settings.zoomPane.isShowing;\n        },\n      },\n    ]);\n\n    return Trigger;\n  })();\n\n  function _classCallCheck$3(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties$3(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass$3(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties$3(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties$3(Constructor, staticProps);\n    return Constructor;\n  }\n  // account for, just in case.\n\n  var divStyle = document.createElement(\"div\").style;\n  var HAS_ANIMATION =\n    typeof document === \"undefined\"\n      ? false\n      : \"animation\" in divStyle || \"webkitAnimation\" in divStyle;\n\n  var ZoomPane = /*#__PURE__*/ (function () {\n    function ZoomPane() {\n      var options =\n        arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      _classCallCheck$3(this, ZoomPane);\n\n      this._completeShow = this._completeShow.bind(this);\n      this._completeHide = this._completeHide.bind(this);\n      this._handleLoad = this._handleLoad.bind(this);\n      this.isShowing = false;\n      var _options$container = options.container,\n        container = _options$container === void 0 ? null : _options$container,\n        _options$zoomFactor = options.zoomFactor,\n        zoomFactor =\n          _options$zoomFactor === void 0\n            ? throwIfMissing()\n            : _options$zoomFactor,\n        _options$inline = options.inline,\n        inline =\n          _options$inline === void 0 ? throwIfMissing() : _options$inline,\n        _options$namespace = options.namespace,\n        namespace = _options$namespace === void 0 ? null : _options$namespace,\n        _options$showWhitespa = options.showWhitespaceAtEdges,\n        showWhitespaceAtEdges =\n          _options$showWhitespa === void 0\n            ? throwIfMissing()\n            : _options$showWhitespa,\n        _options$containInlin = options.containInline,\n        containInline =\n          _options$containInlin === void 0\n            ? throwIfMissing()\n            : _options$containInlin,\n        _options$inlineOffset = options.inlineOffsetX,\n        inlineOffsetX =\n          _options$inlineOffset === void 0 ? 0 : _options$inlineOffset,\n        _options$inlineOffset2 = options.inlineOffsetY,\n        inlineOffsetY =\n          _options$inlineOffset2 === void 0 ? 0 : _options$inlineOffset2,\n        _options$inlineContai = options.inlineContainer,\n        inlineContainer =\n          _options$inlineContai === void 0\n            ? document.body\n            : _options$inlineContai;\n      this.settings = {\n        container: container,\n        zoomFactor: zoomFactor,\n        inline: inline,\n        namespace: namespace,\n        showWhitespaceAtEdges: showWhitespaceAtEdges,\n        containInline: containInline,\n        inlineOffsetX: inlineOffsetX,\n        inlineOffsetY: inlineOffsetY,\n        inlineContainer: inlineContainer,\n      };\n      this.openClasses = this._buildClasses(\"open\");\n      this.openingClasses = this._buildClasses(\"opening\");\n      this.closingClasses = this._buildClasses(\"closing\");\n      this.inlineClasses = this._buildClasses(\"inline\");\n      this.loadingClasses = this._buildClasses(\"loading\");\n\n      this._buildElement();\n    }\n\n    _createClass$3(ZoomPane, [\n      {\n        key: \"_buildClasses\",\n        value: function _buildClasses(suffix) {\n          var classes = [\"drift-\".concat(suffix)];\n          var ns = this.settings.namespace;\n\n          if (ns) {\n            classes.push(\"\".concat(ns, \"-\").concat(suffix));\n          }\n\n          return classes;\n        },\n      },\n      {\n        key: \"_buildElement\",\n        value: function _buildElement() {\n          this.el = document.createElement(\"div\");\n          addClasses(this.el, this._buildClasses(\"zoom-pane\"));\n          var loaderEl = document.createElement(\"div\");\n          addClasses(loaderEl, this._buildClasses(\"zoom-pane-loader\"));\n          this.el.appendChild(loaderEl);\n          this.imgEl = document.createElement(\"img\");\n          this.el.appendChild(this.imgEl);\n        },\n      },\n      {\n        key: \"_setImageURL\",\n        value: function _setImageURL(imageURL) {\n          this.imgEl.setAttribute(\"src\", imageURL);\n        },\n      },\n      {\n        key: \"_setImageSize\",\n        value: function _setImageSize(triggerWidth, triggerHeight) {\n          this.imgEl.style.width = \"\".concat(\n            triggerWidth * this.settings.zoomFactor,\n            \"px\"\n          );\n          this.imgEl.style.height = \"\".concat(\n            triggerHeight * this.settings.zoomFactor,\n            \"px\"\n          );\n        }, // `percentageOffsetX` and `percentageOffsetY` must be percentages\n        // expressed as floats between `0' and `1`.\n      },\n      {\n        key: \"setPosition\",\n        value: function setPosition(\n          percentageOffsetX,\n          percentageOffsetY,\n          triggerRect\n        ) {\n          var imgElWidth = this.imgEl.offsetWidth;\n          var imgElHeight = this.imgEl.offsetHeight;\n          var elWidth = this.el.offsetWidth;\n          var elHeight = this.el.offsetHeight;\n          var centreOfContainerX = elWidth / 2;\n          var centreOfContainerY = elHeight / 2;\n          var targetImgXToBeCentre = imgElWidth * percentageOffsetX;\n          var targetImgYToBeCentre = imgElHeight * percentageOffsetY;\n          var left = centreOfContainerX - targetImgXToBeCentre;\n          var top = centreOfContainerY - targetImgYToBeCentre;\n          var differenceBetweenContainerWidthAndImgWidth = elWidth - imgElWidth;\n          var differenceBetweenContainerHeightAndImgHeight =\n            elHeight - imgElHeight;\n          var isContainerLargerThanImgX =\n            differenceBetweenContainerWidthAndImgWidth > 0;\n          var isContainerLargerThanImgY =\n            differenceBetweenContainerHeightAndImgHeight > 0;\n          var minLeft = isContainerLargerThanImgX\n            ? differenceBetweenContainerWidthAndImgWidth / 2\n            : 0;\n          var minTop = isContainerLargerThanImgY\n            ? differenceBetweenContainerHeightAndImgHeight / 2\n            : 0;\n          var maxLeft = isContainerLargerThanImgX\n            ? differenceBetweenContainerWidthAndImgWidth / 2\n            : differenceBetweenContainerWidthAndImgWidth;\n          var maxTop = isContainerLargerThanImgY\n            ? differenceBetweenContainerHeightAndImgHeight / 2\n            : differenceBetweenContainerHeightAndImgHeight;\n\n          if (this.el.parentElement === this.settings.inlineContainer) {\n            // This may be needed in the future to deal with browser event\n            // inconsistencies, but it's difficult to tell for sure.\n            // let scrollX = isTouch ? 0 : window.scrollX;\n            // let scrollY = isTouch ? 0 : window.scrollY;\n            var scrollX = window.pageXOffset;\n            var scrollY = window.pageYOffset;\n            var inlineLeft =\n              triggerRect.left +\n              percentageOffsetX * triggerRect.width -\n              elWidth / 2 +\n              this.settings.inlineOffsetX +\n              scrollX;\n            var inlineTop =\n              triggerRect.top +\n              percentageOffsetY * triggerRect.height -\n              elHeight / 2 +\n              this.settings.inlineOffsetY +\n              scrollY;\n\n            if (this.settings.containInline) {\n              if (inlineLeft < triggerRect.left + scrollX) {\n                inlineLeft = triggerRect.left + scrollX;\n              } else if (\n                inlineLeft + elWidth >\n                triggerRect.left + triggerRect.width + scrollX\n              ) {\n                inlineLeft =\n                  triggerRect.left + triggerRect.width - elWidth + scrollX;\n              }\n\n              if (inlineTop < triggerRect.top + scrollY) {\n                inlineTop = triggerRect.top + scrollY;\n              } else if (\n                inlineTop + elHeight >\n                triggerRect.top + triggerRect.height + scrollY\n              ) {\n                inlineTop =\n                  triggerRect.top + triggerRect.height - elHeight + scrollY;\n              }\n            }\n\n            this.el.style.left = \"\".concat(inlineLeft, \"px\");\n            this.el.style.top = \"\".concat(inlineTop, \"px\");\n          }\n\n          if (!this.settings.showWhitespaceAtEdges) {\n            if (left > minLeft) {\n              left = minLeft;\n            } else if (left < maxLeft) {\n              left = maxLeft;\n            }\n\n            if (top > minTop) {\n              top = minTop;\n            } else if (top < maxTop) {\n              top = maxTop;\n            }\n          }\n\n          this.imgEl.style.transform = \"translate(\"\n            .concat(left, \"px, \")\n            .concat(top, \"px)\");\n          this.imgEl.style.webkitTransform = \"translate(\"\n            .concat(left, \"px, \")\n            .concat(top, \"px)\");\n        },\n      },\n      {\n        key: \"_removeListenersAndResetClasses\",\n        value: function _removeListenersAndResetClasses() {\n          this.el.removeEventListener(\n            \"animationend\",\n            this._completeShow,\n            false\n          );\n          this.el.removeEventListener(\n            \"animationend\",\n            this._completeHide,\n            false\n          );\n          this.el.removeEventListener(\n            \"webkitAnimationEnd\",\n            this._completeShow,\n            false\n          );\n          this.el.removeEventListener(\n            \"webkitAnimationEnd\",\n            this._completeHide,\n            false\n          );\n          removeClasses(this.el, this.openClasses);\n          removeClasses(this.el, this.closingClasses);\n        },\n      },\n      {\n        key: \"show\",\n        value: function show(imageURL, triggerWidth, triggerHeight) {\n          this._removeListenersAndResetClasses();\n\n          this.isShowing = true;\n          addClasses(this.el, this.openClasses);\n\n          if (this.imgEl.getAttribute(\"src\") != imageURL) {\n            addClasses(this.el, this.loadingClasses);\n            this.imgEl.addEventListener(\"load\", this._handleLoad, false);\n\n            this._setImageURL(imageURL);\n          }\n\n          this._setImageSize(triggerWidth, triggerHeight);\n\n          if (this._isInline) {\n            this._showInline();\n          } else {\n            this._showInContainer();\n          }\n\n          if (HAS_ANIMATION) {\n            this.el.addEventListener(\"animationend\", this._completeShow, false);\n            this.el.addEventListener(\n              \"webkitAnimationEnd\",\n              this._completeShow,\n              false\n            );\n            addClasses(this.el, this.openingClasses);\n          }\n        },\n      },\n      {\n        key: \"_showInline\",\n        value: function _showInline() {\n          this.settings.inlineContainer.appendChild(this.el);\n          addClasses(this.el, this.inlineClasses);\n        },\n      },\n      {\n        key: \"_showInContainer\",\n        value: function _showInContainer() {\n          this.settings.container.appendChild(this.el);\n        },\n      },\n      {\n        key: \"hide\",\n        value: function hide() {\n          this._removeListenersAndResetClasses();\n\n          this.isShowing = false;\n\n          if (HAS_ANIMATION) {\n            this.el.addEventListener(\"animationend\", this._completeHide, false);\n            this.el.addEventListener(\n              \"webkitAnimationEnd\",\n              this._completeHide,\n              false\n            );\n            addClasses(this.el, this.closingClasses);\n          } else {\n            removeClasses(this.el, this.openClasses);\n            removeClasses(this.el, this.inlineClasses);\n          }\n        },\n      },\n      {\n        key: \"_completeShow\",\n        value: function _completeShow() {\n          this.el.removeEventListener(\n            \"animationend\",\n            this._completeShow,\n            false\n          );\n          this.el.removeEventListener(\n            \"webkitAnimationEnd\",\n            this._completeShow,\n            false\n          );\n          removeClasses(this.el, this.openingClasses);\n        },\n      },\n      {\n        key: \"_completeHide\",\n        value: function _completeHide() {\n          this.el.removeEventListener(\n            \"animationend\",\n            this._completeHide,\n            false\n          );\n          this.el.removeEventListener(\n            \"webkitAnimationEnd\",\n            this._completeHide,\n            false\n          );\n          removeClasses(this.el, this.openClasses);\n          removeClasses(this.el, this.closingClasses);\n          removeClasses(this.el, this.inlineClasses);\n          this.el.setAttribute(\"style\", \"\"); // The window could have been resized above or below `inline`\n          // limits since the ZoomPane was shown. Because of this, we\n          // can't rely on `this._isInline` here.\n\n          if (this.el.parentElement === this.settings.container) {\n            this.settings.container.removeChild(this.el);\n          } else if (this.el.parentElement === this.settings.inlineContainer) {\n            this.settings.inlineContainer.removeChild(this.el);\n          }\n        },\n      },\n      {\n        key: \"_handleLoad\",\n        value: function _handleLoad() {\n          this.imgEl.removeEventListener(\"load\", this._handleLoad, false);\n          removeClasses(this.el, this.loadingClasses);\n        },\n      },\n      {\n        key: \"_isInline\",\n        get: function get() {\n          var inline = this.settings.inline;\n          return (\n            inline === true ||\n            (typeof inline === \"number\" && window.innerWidth <= inline)\n          );\n        },\n      },\n    ]);\n\n    return ZoomPane;\n  })();\n\n  function _classCallCheck$4(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  function _defineProperties$4(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass$4(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties$4(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties$4(Constructor, staticProps);\n    return Constructor;\n  }\n\n  var Drift = /*#__PURE__*/ (function () {\n    function Drift(triggerEl) {\n      var options =\n        arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      _classCallCheck$4(this, Drift);\n\n      this.VERSION = \"1.4.0\";\n      this.triggerEl = triggerEl;\n      this.destroy = this.destroy.bind(this);\n\n      if (!isDOMElement(this.triggerEl)) {\n        throw new TypeError(\n          \"`new Drift` requires a DOM element as its first argument.\"\n        );\n      } // Prefix for generated element class names (e.g. `my-ns` will\n      // result in classes such as `my-ns-pane`. Default `drift-`\n      // prefixed classes will always be added as well.\n\n      var namespace = options[\"namespace\"] || null; // Whether the ZoomPane should show whitespace when near the edges.\n\n      var showWhitespaceAtEdges = options[\"showWhitespaceAtEdges\"] || false; // Whether the inline ZoomPane should stay inside\n      // the bounds of its image.\n\n      var containInline = options[\"containInline\"] || false; // How much to offset the ZoomPane from the\n      // interaction point when inline.\n\n      var inlineOffsetX = options[\"inlineOffsetX\"] || 0;\n      var inlineOffsetY = options[\"inlineOffsetY\"] || 0; // A DOM element to append the inline ZoomPane to\n\n      var inlineContainer = options[\"inlineContainer\"] || document.body; // Which trigger attribute to pull the ZoomPane image source from.\n\n      var sourceAttribute = options[\"sourceAttribute\"] || \"data-zoom\"; // How much to magnify the trigger by in the ZoomPane.\n      // (e.g., `zoomFactor: 3` will result in a 900 px wide ZoomPane imag\n      // if the trigger is displayed at 300 px wide)\n\n      var zoomFactor = options[\"zoomFactor\"] || 3; // A DOM element to append the non-inline ZoomPane to.\n      // Required if `inlinePane !== true`.\n\n      var paneContainer =\n        options[\"paneContainer\"] === undefined\n          ? document.body\n          : options[\"paneContainer\"]; // When to switch to an inline ZoomPane. This can be a boolean or\n      // an integer. If `true`, the ZoomPane will always be inline,\n      // if `false`, it will switch to inline when `windowWidth <= inlinePane`\n\n      var inlinePane = options[\"inlinePane\"] || 375; // If `true`, touch events will trigger the zoom, like mouse events.\n\n      var handleTouch =\n        \"handleTouch\" in options ? !!options[\"handleTouch\"] : true; // If present (and a function), this will be called\n      // whenever the ZoomPane is shown.\n\n      var onShow = options[\"onShow\"] || null; // If present (and a function), this will be called\n      // whenever the ZoomPane is hidden.\n\n      var onHide = options[\"onHide\"] || null; // Add base styles to the page. See the \"Theming\"\n      // section of README.md for more information.\n\n      var injectBaseStyles =\n        \"injectBaseStyles\" in options ? !!options[\"injectBaseStyles\"] : true; // An optional number that determines how long to wait before\n      // showing the ZoomPane because of a `mouseenter` event.\n\n      var hoverDelay = options[\"hoverDelay\"] || 0; // An optional number that determines how long to wait before\n      // showing the ZoomPane because of a `touchstart` event.\n      // It's unlikely that you would want to use this option, since\n      // \"tap and hold\" is much more intentional than a hover event.\n\n      var touchDelay = options[\"touchDelay\"] || 0; // If true, a bounding box will show the area currently being previewed\n      // during mouse hover\n\n      var hoverBoundingBox = options[\"hoverBoundingBox\"] || false; // If true, a bounding box will show the area currently being previewed\n      // during touch events\n\n      var touchBoundingBox = options[\"touchBoundingBox\"] || false; // A DOM element to append the bounding box to.\n\n      var boundingBoxContainer =\n        options[\"boundingBoxContainer\"] || document.body;\n\n      if (inlinePane !== true && !isDOMElement(paneContainer)) {\n        throw new TypeError(\n          \"`paneContainer` must be a DOM element when `inlinePane !== true`\"\n        );\n      }\n\n      if (!isDOMElement(inlineContainer)) {\n        throw new TypeError(\"`inlineContainer` must be a DOM element\");\n      }\n\n      this.settings = {\n        namespace: namespace,\n        showWhitespaceAtEdges: showWhitespaceAtEdges,\n        containInline: containInline,\n        inlineOffsetX: inlineOffsetX,\n        inlineOffsetY: inlineOffsetY,\n        inlineContainer: inlineContainer,\n        sourceAttribute: sourceAttribute,\n        zoomFactor: zoomFactor,\n        paneContainer: paneContainer,\n        inlinePane: inlinePane,\n        handleTouch: handleTouch,\n        onShow: onShow,\n        onHide: onHide,\n        injectBaseStyles: injectBaseStyles,\n        hoverDelay: hoverDelay,\n        touchDelay: touchDelay,\n        hoverBoundingBox: hoverBoundingBox,\n        touchBoundingBox: touchBoundingBox,\n        boundingBoxContainer: boundingBoxContainer,\n      };\n\n      if (this.settings.injectBaseStyles) {\n        injectBaseStylesheet();\n      }\n\n      this._buildZoomPane();\n\n      this._buildTrigger();\n    }\n\n    _createClass$4(Drift, [\n      {\n        key: \"_buildZoomPane\",\n        value: function _buildZoomPane() {\n          this.zoomPane = new ZoomPane({\n            container: this.settings.paneContainer,\n            zoomFactor: this.settings.zoomFactor,\n            showWhitespaceAtEdges: this.settings.showWhitespaceAtEdges,\n            containInline: this.settings.containInline,\n            inline: this.settings.inlinePane,\n            namespace: this.settings.namespace,\n            inlineOffsetX: this.settings.inlineOffsetX,\n            inlineOffsetY: this.settings.inlineOffsetY,\n            inlineContainer: this.settings.inlineContainer,\n          });\n        },\n      },\n      {\n        key: \"_buildTrigger\",\n        value: function _buildTrigger() {\n          this.trigger = new Trigger({\n            el: this.triggerEl,\n            zoomPane: this.zoomPane,\n            handleTouch: this.settings.handleTouch,\n            onShow: this.settings.onShow,\n            onHide: this.settings.onHide,\n            sourceAttribute: this.settings.sourceAttribute,\n            hoverDelay: this.settings.hoverDelay,\n            touchDelay: this.settings.touchDelay,\n            hoverBoundingBox: this.settings.hoverBoundingBox,\n            touchBoundingBox: this.settings.touchBoundingBox,\n            namespace: this.settings.namespace,\n            zoomFactor: this.settings.zoomFactor,\n            boundingBoxContainer: this.settings.boundingBoxContainer,\n          });\n        },\n      },\n      {\n        key: \"setZoomImageURL\",\n        value: function setZoomImageURL(imageURL) {\n          this.zoomPane._setImageURL(imageURL);\n        },\n      },\n      {\n        key: \"disable\",\n        value: function disable() {\n          this.trigger.enabled = false;\n        },\n      },\n      {\n        key: \"enable\",\n        value: function enable() {\n          this.trigger.enabled = true;\n        },\n      },\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          this.trigger._hide();\n\n          this.trigger._unbindEvents();\n        },\n      },\n      {\n        key: \"isShowing\",\n        get: function get() {\n          return this.zoomPane.isShowing;\n        },\n      },\n      {\n        key: \"zoomFactor\",\n        get: function get() {\n          return this.settings.zoomFactor;\n        },\n        set: function set(zf) {\n          this.settings.zoomFactor = zf;\n          this.zoomPane.settings.zoomFactor = zf;\n          this.trigger.settings.zoomFactor = zf;\n          this.boundingBox.settings.zoomFactor = zf;\n        },\n      },\n    ]);\n\n    return Drift;\n  })(); // Public API\n  Object.defineProperty(Drift.prototype, \"isShowing\", {\n    get: function get() {\n      return this.isShowing;\n    },\n  });\n  Object.defineProperty(Drift.prototype, \"zoomFactor\", {\n    get: function get() {\n      return this.zoomFactor;\n    },\n    set: function set(value) {\n      this.zoomFactor = value;\n    },\n  });\n  Drift.prototype[\"setZoomImageURL\"] = Drift.prototype.setZoomImageURL;\n  Drift.prototype[\"disable\"] = Drift.prototype.disable;\n  Drift.prototype[\"enable\"] = Drift.prototype.enable;\n  Drift.prototype[\"destroy\"] = Drift.prototype.destroy;\n  /* eslint-enable no-self-assign */\n\n  var ProductGallery = /*#__PURE__*/ (function () {\n    function ProductGallery(element, options) {\n      _classCallCheck(this, ProductGallery);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.viewInSpaceElement = this.element.querySelector(\"[data-shopify-xr]\");\n      this.options = options; // The media property will hold all the media manages by the gallery so we can easily turn them off. They are\n      // indexed by the media ID\n\n      this.media = {};\n      this.previouslySelectedMedia = null;\n\n      this._createCarousel();\n\n      this._createZoom();\n\n      this._attachListeners();\n    }\n\n    _createClass(ProductGallery, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          if (this.flickityInstance) {\n            this.flickityInstance.destroy();\n          }\n\n          for (var mediaId in this.media) {\n            if (this.media.hasOwnProperty(mediaId)) {\n              this.media[mediaId].destroy();\n            }\n          }\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.delegateElement.on(\"model:played\", this._disableDrag.bind(this));\n          this.delegateElement.on(\"video:played\", this._disableDrag.bind(this));\n          this.delegateElement.on(\"model:paused\", this._enableDrag.bind(this));\n          this.delegateElement.on(\"video:paused\", this._enableDrag.bind(this));\n\n          if (this.options[\"enableImageZoom\"]) {\n            window.addEventListener(\n              \"resize\",\n              this._handleZoomForMediaQuery.bind(this)\n            );\n            this.delegateElement.on(\n              \"click\",\n              \".product-gallery__image\",\n              this._openMobileZoom.bind(this)\n            );\n            this.delegateElement.on(\n              \"click\",\n              \".pswp__button\",\n              this._doPswpAction.bind(this)\n            );\n          }\n        },\n        /**\n         * This method must be called whenever the variant is changed\n         */\n      },\n      {\n        key: \"variantHasChanged\",\n        value: function variantHasChanged(newVariant) {\n          var _this = this;\n\n          // We may have selected a variant that will cause the set of images to change completely. To do that we need to iterate through all images,\n          // check for the attribute \"data-group-name\" and verify if some images need to be filtered or not\n          var shouldReload = false;\n          fastdom.mutate(function () {\n            _this.productGalleryCellsElements.forEach(function (\n              cell,\n              imageIndex\n            ) {\n              if (cell.hasAttribute(\"data-group-name\")) {\n                // If it has an attribute, we get the group name, and match it against the option\n                var groupName = cell.getAttribute(\"data-group-name\");\n\n                _this.options[\"productOptions\"].forEach(function (\n                  option,\n                  optionIndex\n                ) {\n                  if (option.toLowerCase() === groupName) {\n                    // groupName from attribute is already lowercased in Liquid\n                    // Now we compare the value: if it's the same or that the image is part of the variant we keep it, otherwise we filter it\n                    if (\n                      newVariant[\n                        \"option\".concat(optionIndex + 1)\n                      ].toLowerCase() ===\n                        cell.getAttribute(\"data-group-value\") ||\n                      (newVariant[\"featured_media\"] &&\n                        newVariant[\"featured_media\"][\"id\"] ===\n                          parseInt(cell.getAttribute(\"data-media-id\")))\n                    ) {\n                      cell.classList.remove(\"is-filtered\");\n\n                      _this.productThumbnailsCellsElements[\n                        imageIndex\n                      ].classList.remove(\"is-filtered\");\n                    } else {\n                      cell.classList.add(\"is-filtered\");\n\n                      _this.productThumbnailsCellsElements[\n                        imageIndex\n                      ].classList.add(\"is-filtered\");\n                    }\n                  }\n                });\n\n                shouldReload = true;\n              }\n            });\n\n            if (shouldReload) {\n              _this.flickityInstance.deactivate();\n\n              _this.flickityInstance.activate();\n            }\n\n            if (Responsive.matchesBreakpoint(\"lap-and-up\")) {\n              var slides = _this.element.querySelectorAll(\n                \".product-gallery__carousel-item\"\n              );\n\n              slides.forEach(function (slide) {\n                slide.classList.remove(\n                  \"product-gallery__carousel-item--hidden\"\n                );\n              });\n            }\n\n            if (newVariant && newVariant[\"featured_media\"]) {\n              _this.flickityInstance.selectCell(\n                '[data-media-id=\"'.concat(\n                  newVariant[\"featured_media\"][\"id\"],\n                  '\"]'\n                )\n              );\n            }\n          });\n        },\n      },\n      {\n        key: \"_createCarousel\",\n        value: function _createCarousel() {\n          var _this2 = this;\n\n          this.productGalleryElement = this.element.querySelector(\n            \".product-gallery__carousel\"\n          );\n          this.productGalleryCellsElements = this.productGalleryElement\n            ? this.productGalleryElement.querySelectorAll(\n                \".product-gallery__carousel-item\"\n              )\n            : [];\n\n          if (this.productGalleryElement) {\n            // We need to create a list of media (for now we only handle video and model a bit differently)\n            this.productGalleryCellsElements.forEach(function (item) {\n              switch (item.getAttribute(\"data-media-type\")) {\n                case \"external_video\":\n                case \"video\":\n                  _this2.media[item.getAttribute(\"data-media-id\")] =\n                    new ProductVideo(\n                      item,\n                      _this2.options[\"enableVideoLooping\"]\n                    );\n                  break;\n\n                case \"model\":\n                  _this2.media[item.getAttribute(\"data-media-id\")] =\n                    new ProductModel(item);\n                  break;\n              }\n            });\n\n            if (\n              parseInt(\n                this.productGalleryElement.getAttribute(\"data-media-count\")\n              ) > 1\n            ) {\n              // Due to the fact that some images may be filtered, we have to do additional logic to compute the initial index\n              var filteredCells = [].slice\n                .call(this.productGalleryCellsElements)\n                .filter(function (item) {\n                  return !item.classList.contains(\"is-filtered\");\n                });\n              var initialIndex = 0;\n              filteredCells.forEach(function (item, index) {\n                if (\n                  item.getAttribute(\"data-media-id\") ===\n                  _this2.productGalleryElement.getAttribute(\n                    \"data-initial-media-id\"\n                  )\n                ) {\n                  initialIndex = index;\n                }\n              }); // For some reason (and I have spent hours trying to understand), Flickity set a zero height at start, before\n              // replacing it with the correct height. Unfortunately this cause the carousel to jump, which is detrimental\n              // to both user experience and PageSpeed score. As a consequence, I am pre-setting the height\n\n              var firstSlide = filteredCells[initialIndex];\n              firstSlide.classList.add(\"is-selected\");\n              this.productGalleryElement.style.height = \"\".concat(\n                firstSlide.clientHeight,\n                \"px\"\n              );\n\n              if (this.flickityInstance) {\n              this.flickityInstance = new flickityFade(\n                this.productGalleryElement,\n                {\n                  accessibility: false,\n                  prevNextButtons: false,\n                  pageDots: false,\n                  adaptiveHeight: true,\n                  draggable: !Responsive.matchesBreakpoint(\"supports-hover\"),\n                  fade: this.options[\"galleryTransitionEffect\"] === \"fade\",\n                  cellSelector:\n                    \".product-gallery__carousel-item:not(.is-filtered)\",\n                  initialIndex: initialIndex,\n                  on: {\n                    ready: function ready() {\n                      // Remove the pre-set height (that was used to pre-allocate the space) so that it can react properly to\n                      // changes of height.\n                      setTimeout(function () {\n                        _this2.productGalleryElement.style.height = null;\n                      }, 1000);\n                    },\n                  },\n                }\n              );\n            }\n            }\n          } // If there are thumbnails, we need to synchronize the thumbnails\n\n          this.productThumbnailsListElement = this.element.querySelector(\n            \".product-gallery__thumbnail-list\"\n          );\n          this.delegateElement.on(\n            \"click\",\n            \".product-gallery__thumbnail\",\n            this._onThumbnailClicked.bind(this)\n          );\n\n          if (this.productThumbnailsListElement && this.flickityInstance) {\n            this.productThumbnailsCellsElements =\n              this.productThumbnailsListElement.querySelectorAll(\n                \".product-gallery__thumbnail\"\n              );\n            this.flickityInstance.on(\n              \"select\",\n              this._onGallerySlideChanged.bind(this)\n            );\n\n            if (this.options[\"galleryTransitionEffect\"] === \"fade\") {\n              this.flickityInstance.on(\n                \"select\",\n                this._onGallerySlideSettled.bind(this)\n              );\n            } else {\n              this.flickityInstance.on(\n                \"settle\",\n                this._onGallerySlideSettled.bind(this)\n              );\n            }\n\n            this._onGallerySlideChanged(false); // We call it once initially to force adjust the thumbnails\n\n            this._onGallerySlideSettled();\n          }\n        },\n      },\n      {\n        key: \"_createZoom\",\n        value: function _createZoom() {\n          var _this3 = this;\n\n          if (!this.options[\"enableImageZoom\"]) {\n            return;\n          } // On desktop, we uses Drift to power the zoom\n\n          if (Responsive.matchesBreakpoint(\"lap-and-up\")) {\n            this.driftObjects = [];\n            var zoomWrapper = this.element.querySelector(\n              \".product__zoom-wrapper\"\n            );\n            this.element\n              .querySelectorAll(\".product-gallery__image\")\n              .forEach(function (image) {\n                _this3.driftObjects.push(\n                  new Drift(image, {\n                    containInline: _this3.options[\"zoomEffect\"] === \"outside\",\n                    inlinePane:\n                      window.innerWidth < 1024\n                        ? true\n                        : _this3.options[\"zoomEffect\"] !== \"outside\",\n                    hoverBoundingBox:\n                      _this3.options[\"zoomEffect\"] === \"outside\",\n                    handleTouch: false,\n                    inlineOffsetY: window.innerWidth < 1024 ? -85 : 0,\n                    paneContainer: zoomWrapper,\n                  })\n                );\n              });\n          }\n        },\n      },\n      {\n        key: \"_openMobileZoom\",\n        value: function _openMobileZoom() {\n          var _this4 = this;\n\n          // On mobile, we use instead PhotoSwipe\n          var pswpElement = this.element.querySelector(\".pswp\");\n\n          if (!pswpElement || !Responsive.matchesBreakpoint(\"pocket\")) {\n            return;\n          }\n\n          var filteredItems = this.element.querySelectorAll(\n              '.product-gallery__carousel-item:not(.is-filtered)[data-media-type=\"image\"]'\n            ),\n            defaultIndex = 0,\n            items = [];\n          filteredItems.forEach(function (filteredItem, index) {\n            var image = filteredItem.querySelector(\".product-gallery__image\");\n            items.push({\n              src: image.getAttribute(\"data-zoom\"),\n              w: parseInt(image.getAttribute(\"data-zoom-width\")),\n              h:\n                parseInt(image.getAttribute(\"data-zoom-width\")) *\n                (image.height / image.width),\n              msrc: image.currentSrc,\n            });\n\n            if (filteredItem.classList.contains(\"is-selected\")) {\n              defaultIndex = index;\n            }\n          });\n          var prevNextElement = pswpElement.querySelector(\".pswp__prev-next\");\n          prevNextElement.style.display = items.length > 1 ? \"flex\" : \"none\"; // Initializes and opens PhotoSwipe\n\n          this.photoSwipeInstance = new photoswipe(pswpElement, false, items, {\n            index: defaultIndex,\n            closeOnVerticalDrag: false,\n            closeOnScroll: false,\n            history: false,\n            showHideOpacity: true,\n            pinchToClose: false,\n            maxSpreadZoom: 1,\n            showAnimationDuration: false,\n            allowPanToNext: false,\n          });\n          this.photoSwipeInstance.listen(\"destroy\", function () {\n            _this4.photoSwipeInstance = null;\n          });\n          this.photoSwipeInstance.listen(\"beforeChange\", function () {\n            var currentItem = _this4.element.querySelector(\n                \".pswp__pagination-current\"\n              ),\n              paginationCount = _this4.element.querySelector(\n                \".pswp__pagination-count\"\n              );\n\n            currentItem.textContent =\n              _this4.photoSwipeInstance.getCurrentIndex() + 1;\n            paginationCount.textContent =\n              _this4.photoSwipeInstance.options.getNumItemsFn();\n          });\n          this.photoSwipeInstance.init();\n        },\n      },\n      {\n        key: \"_doPswpAction\",\n        value: function _doPswpAction(event, element) {\n          if (!this.photoSwipeInstance) {\n            return;\n          }\n\n          if (element.classList.contains(\"pswp__button--close\")) {\n            this.photoSwipeInstance.close();\n          } else if (\n            element.classList.contains(\"pswp__button--arrow--left\") ||\n            element.classList.contains(\"gallery__button arrow__left\")\n          ) {\n            this.photoSwipeInstance.prev();\n          } else if (\n            element.classList.contains(\"pswp__button--arrow--right\") ||\n            element.classList.contains(\"gallery__button arrow__right\")\n          ) {\n            this.photoSwipeInstance.next();\n          }\n        },\n      },\n      {\n        key: \"_handleZoomForMediaQuery\",\n        value: function _handleZoomForMediaQuery() {\n          if (\n            Responsive.matchesBreakpoint(\"lap-and-up\") &&\n            this.photoSwipeInstance\n          ) {\n            this.photoSwipeInstance.close();\n            this.photoSwipeInstance = null;\n          }\n        },\n      },\n      {\n        key: \"_onGallerySlideChanged\",\n        value: function _onGallerySlideChanged() {\n          var _this5 = this;\n\n          var animate =\n            arguments.length > 0 && arguments[0] !== undefined\n              ? arguments[0]\n              : true;\n          var previousNavElement = null,\n            newNavElement = null;\n          this.productThumbnailsCellsElements.forEach(function (item) {\n            if (item.classList.contains(\"is-nav-selected\")) {\n              previousNavElement = item;\n            }\n\n            if (\n              item.getAttribute(\"data-media-id\") ===\n              _this5.flickityInstance.selectedElement.getAttribute(\n                \"data-media-id\"\n              )\n            ) {\n              newNavElement = item;\n            }\n          });\n          \n           if(previousNavElement != null){\n            previousNavElement.classList.remove(\"is-nav-selected\");\n          }\n          \n          newNavElement.classList.add(\"is-nav-selected\"); // We animate to move the selected nav item\n          \n          // DANIEL FRANCO - TASK 30818\n          var center = document.querySelector(\"#thumbnailList\").offsetLeft + document.querySelector(\"#thumbnailList\").offsetWidth / 2;\n          var scrollToPosition = newNavElement.offsetLeft < center ? 0 : center - (newNavElement.offsetLeft + (newNavElement.offsetWidth * 2));\n          $('.thumbsContainer').css('left', scrollToPosition);\n          \n          if (Responsive.matchesBreakpoint(\"pocket\")) {\n            var scrollX =\n              newNavElement.offsetLeft -\n              (this.productThumbnailsListElement.parentNode.clientWidth -\n                newNavElement.clientWidth) /\n                2;\n            this.productThumbnailsListElement.parentNode.scrollTo({\n              left: scrollX,\n              behavior: animate ? \"smooth\" : \"auto\",\n            });\n          } else {\n            var scrollY =\n              newNavElement.offsetTop -\n              (this.productThumbnailsListElement.clientHeight -\n                newNavElement.clientHeight) /\n                2;\n            this.productThumbnailsListElement.scrollTo({\n              top: scrollY,\n              behavior: animate ? \"smooth\" : \"auto\",\n            });\n          }\n        },\n        /**\n         * The difference with \"change\" is that this function is called after the item has transitioned\n         */\n      },\n      {\n        key: \"_onGallerySlideSettled\",\n        value: function _onGallerySlideSettled() {\n          this._handleMedia(this.flickityInstance.selectedElement);\n\n          if (Responsive.matchesBreakpoint(\"lap-and-up\")) {\n            var slides = this.element.querySelectorAll(\n              \".product-gallery__carousel-item:not(.is-selected)\"\n            );\n            slides.forEach(function (slide) {\n              slide.classList.add(\"product-gallery__carousel-item--hidden\");\n            });\n          }\n        },\n      },\n      {\n        key: \"_onThumbnailClicked\",\n        value: function _onThumbnailClicked(event, target) {\n          event.preventDefault();\n\n          $(\".product-gallery__image\").attr(\"srcset\", target.href);\n\n          if (this.flickityInstance) {\n            this.flickityInstance.selectCell(\n              '[data-media-id=\"'.concat(\n                target.getAttribute(\"data-media-id\"),\n                '\"]'\n              )\n            );\n\n            if (Responsive.matchesBreakpoint(\"lap-and-up\")) {\n              var slides = this.element.querySelectorAll(\n                \".product-gallery__carousel-item\"\n              );\n              slides.forEach(function (slide) {\n                slide.classList.remove(\n                  \"product-gallery__carousel-item--hidden\"\n                );\n              });\n            }\n          }\n        },\n      },\n      {\n        key: \"_disableDrag\",\n        value: function _disableDrag() {\n          this.flickityInstance.options.draggable = false;\n          this.flickityInstance.updateDraggable();\n        },\n      },\n      {\n        key: \"_enableDrag\",\n        value: function _enableDrag() {\n          this.flickityInstance.options.draggable =\n            !Responsive.matchesBreakpoint(\"supports-hover\");\n          this.flickityInstance.updateDraggable();\n        },\n        /**\n         * This method will handle the given media (for now model and video) to do the appropriate actions (such as launching\n         * a video for instance)\n         */\n      },\n      {\n        key: \"_handleMedia\",\n        value: function _handleMedia(item) {\n          var isInitialLoading = this.previouslySelectedMedia === null; // First, we need to turn off the previous media (if any)\n\n          if (\n            this.previouslySelectedMedia &&\n            this.previouslySelectedMedia !== item\n          ) {\n            switch (\n              this.previouslySelectedMedia.getAttribute(\"data-media-type\")\n            ) {\n              case \"video\":\n              case \"external_video\":\n              case \"model\":\n                this.media[\n                  this.previouslySelectedMedia.getAttribute(\"data-media-id\")\n                ].hasBeenDeselected();\n            } // If the previous media was a model, we need to adjust the \"view in space\" button to go back to initial value\n\n            if (\n              this.previouslySelectedMedia.getAttribute(\"data-media-type\") ===\n                \"model\" &&\n              this.viewInSpaceElement\n            ) {\n              this.viewInSpaceElement.setAttribute(\n                \"data-shopify-model3d-id\",\n                this.viewInSpaceElement.getAttribute(\n                  \"data-shopify-model3d-default-id\"\n                )\n              );\n            }\n          } // Then, we have to handle the currently selected media\n\n          switch (item.getAttribute(\"data-media-type\")) {\n            case \"video\":\n            case \"external_video\":\n            case \"model\":\n              this.media[item.getAttribute(\"data-media-id\")].hasBeenSelected(\n                isInitialLoading\n              );\n              this.element\n                .querySelector(\".product-gallery__carousel\")\n                .classList.remove(\"product-gallery__carousel--zoomable\");\n              break;\n\n            case \"image\":\n              this.element\n                .querySelector(\".product-gallery__carousel\")\n                .classList.add(\"product-gallery__carousel--zoomable\");\n              break;\n          } // If the media is a model, we need to adjust the \"view in space\" button\n\n          if (\n            item.getAttribute(\"data-media-type\") === \"model\" &&\n            this.viewInSpaceElement\n          ) {\n            this.viewInSpaceElement.setAttribute(\n              \"data-shopify-model3d-id\",\n              item.getAttribute(\"data-media-id\")\n            );\n          } // We set the previously selected media to the currently new one, so that when it changes it can be properly accounted\n\n          this.previouslySelectedMedia = item;\n        },\n      },\n    ]);\n\n    return ProductGallery;\n  })();\n\n  var QuantityPicker = /*#__PURE__*/ (function () {\n    function QuantityPicker(element) {\n      _classCallCheck(this, QuantityPicker);\n\n      if (!element) {\n        return;\n      }\n\n      this.element = element;\n      this.inputElement = this.element.querySelector('[name=\"quantity\"]');\n      this.delegateElement = new Delegate(this.element);\n\n      this._attachListeners();\n    }\n\n    _createClass(QuantityPicker, [\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"decrease-picker-quantity\"]',\n            this._onDecrease.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"increase-picker-quantity\"]',\n            this._onIncrease.bind(this)\n          );\n          this.delegateElement.on(\n            \"keyup\",\n            this._onInputValueChanged.bind(this)\n          );\n          this.delegateElement.on(\"focusout\", this._onInputFocusOut.bind(this));\n        },\n      },\n      {\n        key: \"_onDecrease\",\n        value: function _onDecrease() {\n          this.inputElement.value = Math.max(\n            1,\n            parseInt(this.inputElement.value) - 1\n          );\n        },\n      },\n      {\n        key: \"_onIncrease\",\n        value: function _onIncrease() {\n          this.inputElement.value = parseInt(this.inputElement.value) + 1;\n        },\n      },\n      {\n        key: \"_onInputValueChanged\",\n        value: function _onInputValueChanged(event) {\n          var value = event.target.value;\n\n          if (value !== \"\" && isNaN(value)) {\n            event.target.value = Math.max(1, parseInt(value) || 1);\n          }\n        },\n      },\n      {\n        key: \"_onInputFocusOut\",\n        value: function _onInputFocusOut(event) {\n          event.target.value = Math.max(1, parseInt(event.target.value) || 1);\n        },\n      },\n    ]);\n\n    return QuantityPicker;\n  })();\n\n  var ShippingEstimator = /*#__PURE__*/ (function () {\n    function ShippingEstimator(element, options) {\n      _classCallCheck(this, ShippingEstimator);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = options;\n      this.countrySelector = new CountrySelector(\n        this.element.querySelector('[name=\"country\"]'),\n        this.element.querySelector('[name=\"province\"]')\n      );\n\n      this._attachListeners();\n    }\n\n    _createClass(ShippingEstimator, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          this.delegateElement.off(\"click\");\n          this.countrySelector.destroy();\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"estimate-shipping\"]',\n            this._fetchRates.bind(this)\n          );\n        },\n      },\n      {\n        key: \"_fetchRates\",\n        value: function _fetchRates() {\n          document.dispatchEvent(new CustomEvent(\"theme:loading:start\"));\n\n          if (this.options[\"singleProduct\"]) {\n            this._fetchRatesForProduct();\n          } else {\n            this._fetchRatesForCart();\n          }\n        },\n      },\n      {\n        key: \"_fetchRatesForCart\",\n        value: function _fetchRatesForCart() {\n          var _this = this;\n\n          var country = this.element.querySelector('[name=\"country\"]').value,\n            province = this.element.querySelector('[name=\"province\"]').value,\n            zip = this.element.querySelector('[name=\"zip\"]').value;\n          fetch(\n            \"\"\n              .concat(\n                window.routes.cartUrl,\n                \"/shipping_rates.json?shipping_address[zip]=\"\n              )\n              .concat(zip, \"&shipping_address[country]=\")\n              .concat(country, \"&shipping_address[province]=\")\n              .concat(province),\n            {\n              credentials: \"same-origin\",\n              method: \"GET\",\n            }\n          ).then(function (response) {\n            document.dispatchEvent(new CustomEvent(\"theme:loading:end\"));\n            response.json().then(function (result) {\n              _this._formatResults(response.ok, result);\n            });\n          });\n        },\n        /**\n         * Technique is coming from this website: https://freakdesign.com.au/blogs/news/get-shipping-estimates-on-a-product-page\n         */\n      },\n      {\n        key: \"_fetchRatesForProduct\",\n        value: function _fetchRatesForProduct() {\n          var _this2 = this;\n\n          // grab the current cookie for the cart and we store it\n          var cartCookie = this._getCookie(\"cart\"),\n            tempCookieValue =\n              \"temp-cart-cookie___\" +\n              Date.now() +\n              parseInt(Math.random() * 1000),\n            fakeCookieValue =\n              \"fake-cart-cookie___\" +\n              Date.now() +\n              parseInt(Math.random() * 1000); // if not found, make a new temp cookie\n\n          if (!cartCookie) {\n            this._updateCartCookie(tempCookieValue);\n\n            cartCookie = this._getCookie(\"cart\");\n          } // if found but has a weird length, bail\n\n          if (cartCookie.length < 32) {\n            return;\n          } // change the cookie value to a new 32 character value\n\n          this._updateCartCookie(fakeCookieValue); // add the product to our fake cart\n\n          var formElement = document.querySelector('form[action*=\"/cart/add\"]');\n          fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n            body: JSON.stringify(Form.serialize(formElement)),\n            credentials: \"same-origin\",\n            headers: {\n              \"Content-Type\": \"application/json\",\n              \"X-Requested-With\": \"XMLHttpRequest\", // This is needed as currently there is a bug in Shopify that assumes this header\n            },\n            method: \"POST\",\n          }).then(function (response) {\n            response\n              .json()\n              .then(function () {\n                var country =\n                    _this2.element.querySelector('[name=\"country\"]').value,\n                  province =\n                    _this2.element.querySelector('[name=\"province\"]').value,\n                  zip = _this2.element.querySelector('[name=\"zip\"]').value;\n\n                fetch(\n                  \"\"\n                    .concat(\n                      window.routes.cartUrl,\n                      \"/shipping_rates.json?shipping_address[zip]=\"\n                    )\n                    .concat(zip, \"&shipping_address[country]=\")\n                    .concat(country, \"&shipping_address[province]=\")\n                    .concat(province),\n                  {\n                    credentials: \"same-origin\",\n                    method: \"GET\",\n                  }\n                )\n                  .then(function (response) {\n                    document.dispatchEvent(\n                      new CustomEvent(\"theme:loading:end\")\n                    );\n                    response.json().then(function (result) {\n                      _this2._formatResults(response.ok, result);\n                    });\n\n                    _this2._updateCartCookie(cartCookie); // We can restore the cookie\n                  })\n                  [\"catch\"](function () {\n                    _this2._updateCartCookie(cartCookie);\n                  });\n              })\n              [\"catch\"](function () {\n                // We have error so we have to reset cookie\n                _this2._updateCartCookie(cartCookie);\n\n                document.dispatchEvent(new CustomEvent(\"theme:loading:end\"));\n              });\n          });\n        },\n      },\n      {\n        key: \"_formatResults\",\n        value: function _formatResults(isOk, results) {\n          var resultsElement = this.element.querySelector(\n            \".shipping-estimator__results\"\n          );\n          resultsElement.innerHTML = \"\";\n\n          if (isOk) {\n            var shippingRates = results[\"shipping_rates\"];\n\n            if (shippingRates.length === 0) {\n              resultsElement.innerHTML = \"<p>\".concat(\n                window.languages.shippingEstimatorNoResults,\n                \"</p>\"\n              );\n            } else {\n              if (shippingRates.length === 1) {\n                resultsElement.innerHTML = \"<p>\".concat(\n                  window.languages.shippingEstimatorOneResult,\n                  \"</p>\"\n                );\n              } else {\n                resultsElement.innerHTML = \"<p>\".concat(\n                  window.languages.shippingEstimatorMultipleResults.replace(\n                    \"{{count}}\",\n                    shippingRates.length\n                  ),\n                  \"</p>\"\n                );\n              }\n\n              var listRatesHtml = \"\";\n              shippingRates.forEach(function (item) {\n                listRatesHtml += \"<li>\"\n                  .concat(item[\"name\"], \": \")\n                  .concat(\n                    Currency.formatMoney(\n                      item[\"price\"],\n                      window.theme.moneyFormat\n                    ),\n                    \"</li>\"\n                  );\n              });\n              resultsElement.innerHTML += \"<ul>\".concat(listRatesHtml, \"</ul>\");\n            }\n          } else {\n            resultsElement.innerHTML = \"<p>\".concat(\n              window.languages.shippingEstimatorErrors,\n              \"</p>\"\n            );\n            var errorHtml = \"\";\n            Object.keys(results).forEach(function (key) {\n              errorHtml += '<li class=\"alert__list-item\">'\n                .concat(key, \" \")\n                .concat(results[key], \"</li>\");\n            });\n            resultsElement.innerHTML += \"<ul>\".concat(errorHtml, \"</ul>\");\n          }\n\n          resultsElement.style.display = \"block\";\n        },\n      },\n      {\n        key: \"_getCookie\",\n        value: function _getCookie(name) {\n          var value = \"; \".concat(document.cookie),\n            parts = value.split(\"; \" + name + \"=\");\n\n          if (parts.length === 2) {\n            return parts.pop().split(\";\").shift();\n          }\n        },\n      },\n      {\n        key: \"_updateCartCookie\",\n        value: function _updateCartCookie(value) {\n          var date = new Date();\n          date.setTime(date.getTime() + 14 * 86400000);\n          document.cookie = \"cart=\"\n            .concat(value, \"; expires=\")\n            .concat(date.toUTCString(), \"; path=/\");\n        },\n      },\n    ]);\n\n    return ShippingEstimator;\n  })();\n\n  /**\n   * The given ID must be the value picker itself (the element that contains the class \"value-picker\", not the button that toggles it\n   */\n\n  var ValuePicker = /*#__PURE__*/ (function () {\n    function ValuePicker(id) {\n      var options =\n        arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      _classCallCheck(this, ValuePicker);\n\n      this.id = id;\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.isOpen = false;\n      this.togglerElement = document.querySelector(\n        '[data-action=\"open-value-picker\"][aria-controls=\"'.concat(\n          this.id,\n          '\"]'\n        )\n      );\n\n      this.onSelect = options[\"onValueSelect\"] || function () {};\n\n      this._attachListeners();\n    }\n\n    _createClass(ValuePicker, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          this.delegateRoot.off();\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.delegateRoot.on(\n            \"click\",\n            '[data-action=\"open-value-picker\"][aria-controls=\"'.concat(\n              this.id,\n              '\"]'\n            ),\n            this._toggle.bind(this)\n          );\n          this.delegateRoot.on(\n            \"click\",\n            '[data-action=\"close-value-picker\"][aria-controls=\"'.concat(\n              this.id,\n              '\"]'\n            ),\n            this._toggle.bind(this)\n          );\n          this.delegateRoot.on(\n            \"click\",\n            \"#\".concat(this.id, ' [data-action=\"select-value\"]'),\n            this._selectValue.bind(this)\n          );\n          this.delegateRoot.on(\n            \"click\",\n            this._detectOutsideClick.bind(this),\n            true\n          );\n          this.delegateRoot.on(\n            \"focusout\",\n            \"#\".concat(this.id),\n            this._onFocusOut.bind(this)\n          );\n        },\n      },\n      {\n        key: \"_toggle\",\n        value: function _toggle(event) {\n          if (this.isOpen) {\n            this._close(event);\n          } else {\n            this._open(event);\n          }\n        },\n      },\n      {\n        key: \"_open\",\n        value: function _open() {\n          document\n            .querySelector(\n              '[data-action=\"open-value-picker\"][aria-controls=\"'.concat(\n                this.id,\n                '\"]'\n              )\n            )\n            .setAttribute(\"aria-expanded\", \"true\");\n          document.getElementById(this.id).setAttribute(\"aria-hidden\", \"false\"); // This is quite ugly, but in order to avoid an issue with the header that has a higher z-index, we have to temporarily reduce\n          // it while we have the element open\n\n          if (Responsive.matchesBreakpoint(\"phone\")) {\n            var headerElement = document.querySelector(\n              \".shopify-section__header\"\n            );\n            headerElement.style.zIndex = \"3\";\n          }\n\n          this.isOpen = true;\n          document.body.classList.add(\"no-mobile-scroll\");\n        },\n      },\n      {\n        key: \"_close\",\n        value: function _close() {\n          document\n            .querySelector(\n              '[data-action=\"open-value-picker\"][aria-controls=\"'.concat(\n                this.id,\n                '\"]'\n              )\n            )\n            .setAttribute(\"aria-expanded\", \"false\");\n          document.getElementById(this.id).setAttribute(\"aria-hidden\", \"true\"); // This is quite ugly, but in order to avoid an issue with the header that has a higher z-index, we have to temporarily reduce\n          // it while we have the element open\n\n          var headerElement = document.querySelector(\n            \".shopify-section__header\"\n          );\n          headerElement.style.zIndex = \"\";\n          this.isOpen = false;\n          document.body.classList.remove(\"no-mobile-scroll\");\n        },\n      },\n      {\n        key: \"_selectValue\",\n        value: function _selectValue(event, target) {\n          this.onSelect(target.getAttribute(\"data-value\"));\n\n          this._close();\n        },\n      },\n      {\n        key: \"_onFocusOut\",\n        value: function _onFocusOut(event) {\n          var container = document.getElementById(this.id); // If the element that get the new focus is not contains within the value picker, we close it\n\n          if (!container.contains(event.relatedTarget)) {\n            this._close();\n          }\n        },\n      },\n      {\n        key: \"_detectOutsideClick\",\n        value: function _detectOutsideClick(event) {\n          // If already closed, nothing to do\n          if (\n            !this.isOpen ||\n            this.togglerElement === event.target ||\n            this.togglerElement.contains(event.target)\n          ) {\n            return;\n          }\n\n          if (!event.target.closest(\".value-picker__inner\") && this.isOpen) {\n            this._close(event);\n          }\n        },\n      },\n    ]);\n\n    return ValuePicker;\n  })();\n\n  var AccountSection = /*#__PURE__*/ (function () {\n    function AccountSection(element) {\n      _classCallCheck(this, AccountSection);\n\n      this.element = element;\n      this.domDelegate = new Delegate(this.element);\n      this.element\n        .querySelectorAll('[action*=\"/account/addresses\"]')\n        .forEach(function (addressForm) {\n          new CountrySelector(\n            addressForm.querySelector('[name=\"address[country]\"]'),\n            addressForm.querySelector('[name=\"address[province]\"]')\n          );\n        });\n      this.pageSelector = new ValuePicker(\"account-selector\");\n    }\n\n    _createClass(AccountSection, [\n      {\n        key: \"_onUnload\",\n        value: function _onUnload() {\n          this.pageSelector.destroy();\n        },\n      },\n    ]);\n\n    return AccountSection;\n  })();\n\n  var AnnouncementBarSection = /*#__PURE__*/ (function () {\n    function AnnouncementBarSection(element) {\n      _classCallCheck(this, AnnouncementBarSection);\n\n      console.log(\"AnnouncementBarSection\")\n      this.element = element;\n      this.domDelegate = new Delegate(this.element);\n      this.options = JSON.parse(\n        this.element.getAttribute(\"data-section-settings\")\n      );\n      this.isOpen = false; // We set the new width of the announcement bar button if any\n\n      if (this.options[\"showNewsletter\"]) {\n        document.documentElement.style.setProperty(\n          \"--announcement-bar-button-width\",\n          this.element.querySelector(\".announcement-bar__button\").clientWidth +\n            \"px\"\n        );\n      } else {\n        document.documentElement.style.removeProperty(\n          \"--announcement-bar-button-width\"\n        );\n      }\n\n      this._attachListeners();\n      \n    }\n\n    _createClass(AnnouncementBarSection, [\n      {\n        key: \"onSelect\",\n        value: function onSelect() {\n          if (this.options[\"showNewsletter\"] && !this.isOpen) {\n            this._toggleNewsletter();\n          }\n        },\n      },\n      {\n        key: \"onDeselect\",\n        value: function onDeselect() {\n          if (this.options[\"showNewsletter\"] && this.isOpen) {\n            this._toggleNewsletter();\n          }\n        },\n      },\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          this.domDelegate.off();\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.domDelegate.on(\n            \"click\",\n            '[data-action=\"toggle-newsletter\"]',\n            this._toggleNewsletter.bind(this)\n          );\n          this.domDelegate.on(\"keyup\", this._handleKey.bind(this));\n        },\n      },\n      {\n        key: \"_toggleNewsletter\",\n        value: function _toggleNewsletter() {\n          var togglerElement = this.element.querySelector(\n              \".announcement-bar__button\"\n            ),\n            newsletterElement = this.element.querySelector(\n              \".announcement-bar__newsletter\"\n            );\n\n          if (togglerElement.getAttribute(\"aria-expanded\") === \"false\") {\n            togglerElement.setAttribute(\"aria-expanded\", \"true\");\n            newsletterElement.setAttribute(\"aria-hidden\", \"false\");\n            Animation.slideDown(newsletterElement, function () {\n              Accessibility.trapFocus(newsletterElement, \"announcement-bar\");\n            });\n          } else {\n            togglerElement.setAttribute(\"aria-expanded\", \"false\");\n            newsletterElement.setAttribute(\"aria-hidden\", \"true\");\n            Animation.slideUp(newsletterElement);\n            Accessibility.removeTrapFocus(\n              newsletterElement,\n              \"announcement-bar\"\n            );\n          }\n\n          this.isOpen = !this.isOpen;\n        },\n      },\n      {\n        key: \"_handleKey\",\n        value: function _handleKey(event) {\n          if (event.key === \"Escape\" && this.isOpen) {\n            this._toggleNewsletter();\n          }\n        },\n      },\n    ]);\n\n    return AnnouncementBarSection;\n  })();\n\n  var BlogSection = /*#__PURE__*/ (function () {\n    function BlogSection(element) {\n      _classCallCheck(this, BlogSection);\n\n      this.element = element;\n      this.blogTagSelector = new ValuePicker(\"blog-tag-selector\");\n\n      if (Shopify.designMode) {\n        var elementToAdd = this.element.querySelector(\".page__header\");\n\n        if (elementToAdd) {\n          document\n            .querySelector(\".blog-container\")\n            .previousElementSibling.remove();\n          document\n            .querySelector(\".blog-container\")\n            .insertAdjacentElement(\"beforebegin\", elementToAdd);\n        }\n      }\n    }\n\n    _createClass(BlogSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          this.blogTagSelector.destroy();\n        },\n      },\n    ]);\n\n    return BlogSection;\n  })();\n\n  var BlogPostSection = function BlogPostSection(element) {\n    _classCallCheck(this, BlogPostSection);\n\n    this.element = element;\n\n    if (Shopify.designMode) {\n      var elementToAdd = this.element.querySelector(\".page__header\");\n\n      if (elementToAdd) {\n        document\n          .querySelector(\".blog-container\")\n          .previousElementSibling.remove();\n        document\n          .querySelector(\".blog-container\")\n          .insertAdjacentElement(\"beforebegin\", elementToAdd);\n      }\n    }\n  };\n\n  var BlogSidebarSection = /*#__PURE__*/ (function () {\n    function BlogSidebarSection(element) {\n      _classCallCheck(this, BlogSidebarSection);\n\n      this.element = element;\n\n      if (Shopify.designMode && window.SPR) {\n        window.SPR.initDomEls();\n        window.SPR.loadBadges();\n      }\n\n      if (window.theme.pageType === \"blog\") {\n        this._fixItemsPerRow();\n      }\n    }\n    /**\n     * If sidebar is not visible, then we must do some adjustments to the grid of article (especially, we must change how many items per row are displayed).\n     * Because Shopify sections are independent, I didn't find a better approach than changing it in JavaScript\n     */\n\n    _createClass(BlogSidebarSection, [\n      {\n        key: \"_fixItemsPerRow\",\n        value: function _fixItemsPerRow() {\n          var blocks = this.element.querySelectorAll(\".blog-sidebar__item\");\n\n          if (blocks.length === 0) {\n            document\n              .querySelector(\".blog-container\")\n              .classList.add(\"blog-container--without-sidebar\");\n            document\n              .querySelectorAll(\n                \".shopify-section__blog-posts .block-list__item\"\n              )\n              .forEach(function (item) {\n                if (item.classList.contains(\"1/2--lap-and-up\")) {\n                  item.classList.remove(\"1/2--lap-and-up\");\n                  item.classList.add(\"1/3--lap-and-up\");\n                }\n              });\n          } else {\n            document\n              .querySelector(\".blog-container\")\n              .classList.remove(\"blog-container--without-sidebar\");\n            document\n              .querySelectorAll(\n                \".shopify-section__blog-posts .block-list__item\"\n              )\n              .forEach(function (item) {\n                if (item.classList.contains(\"1/3--lap-and-up\")) {\n                  item.classList.remove(\"1/3--lap-and-up\");\n                  item.classList.add(\"1/2--lap-and-up\");\n                }\n              });\n          }\n        },\n      },\n    ]);\n\n    return BlogSidebarSection;\n  })();\n\n  var ProductSection = /*#__PURE__*/ (function () {\n    function ProductSection(element) {\n      var _this = this;\n\n      _classCallCheck(this, ProductSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(\n        this.element.getAttribute(\"data-section-settings\")\n      );\n      this.productGallery = new ProductGallery(this.element, this.options);\n\n      this._initShopifyReviews(); // If loaded by quick view, we need to do various initialization stuff\n\n      if (\n        this.options[\"isQuickView\"] &&\n        this.options[\"showPaymentButton\"] &&\n        window.Shopify.PaymentButton\n      ) {\n        Shopify.PaymentButton.init();\n      }\n\n      this.productVariants = new ProductVariants(this.element, this.options);\n\n      if (this.options[\"showShippingEstimator\"]) {\n        this.shippingEstimator = new ShippingEstimator(\n          this.element.querySelector(\".shipping-estimator\"),\n          {\n            singleProduct: true,\n          }\n        );\n      }\n\n      if (this.options[\"showQuantitySelector\"]) {\n        var quantityPickerElement = this.element.querySelector(\n          \".quantity-selector--product\"\n        );\n\n        if (quantityPickerElement) {\n          this.quantityPicker = new QuantityPicker(quantityPickerElement);\n        }\n      }\n\n      var productInfoElement = this.element.querySelector(\n        \".product-block-list__item--info .card\"\n      );\n\n      if (productInfoElement) {\n        this.element.querySelector(\n          \".product-block-list__wrapper\"\n        ).style.minHeight = \"\".concat(productInfoElement.clientHeight, \"px\");\n\n        if (window.ResizeObserver) {\n          this.productInfoResizeObserver = new ResizeObserver(function (event) {\n            if (event[0].contentBoxSize) {\n              _this.element.querySelector(\n                \".product-block-list__wrapper\"\n              ).style.minHeight = \"\".concat(\n                event[0].contentBoxSize[0].blockSize,\n                \"px\"\n              );\n            } else {\n              _this.element.querySelector(\n                \".product-block-list__wrapper\"\n              ).style.minHeight = \"\".concat(event[0].contentRect.height, \"px\");\n            }\n          });\n          this.productInfoResizeObserver.observe(productInfoElement);\n        }\n\n        if (this.options[\"infoOverflowScroll\"]) {\n          this.infoOverflowScroller = new OverflowScroller(productInfoElement, {\n            offsetTop:\n              document.documentElement.style.getPropertyValue(\n                \"--header-is-sticky\"\n              ) *\n              parseInt(\n                document.documentElement.style.getPropertyValue(\n                  \"--header-height\"\n                ) + 30\n              ),\n            offsetBottom: 30,\n          });\n        }\n      }\n\n      this._attachListeners();\n    }\n\n    _createClass(ProductSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          this.productVariants.destroy();\n          this.productGallery.destroy();\n\n          if (this.options[\"showShippingEstimator\"]) {\n            this.shippingEstimator.destroy();\n          }\n\n          if (this.options[\"infoOverflowScroll\"]) {\n            this.infoOverflowScroller.destroy();\n          }\n\n          if (window.ResizeObserver && this.productInfoResizeObserver) {\n            this.productInfoResizeObserver.disconnect();\n          }\n\n          this.delegateElement.off();\n          this.element.removeEventListener(\n            \"variant:changed\",\n            this._onVariantChangedListener\n          );\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this._onVariantChangedListener = this._onVariantChanged.bind(this);\n          this.element.addEventListener(\n            \"variant:changed\",\n            this._onVariantChangedListener\n          );\n        },\n        /**\n         * Shopify Reviews app is quite funky and hard to extend... excuse this code\n         */\n      },\n      {\n        key: \"_initShopifyReviews\",\n        value: function _initShopifyReviews() {\n          var _this2 = this;\n\n          if (Shopify.designMode && window.SPR) {\n            window.SPR.initDomEls();\n            window.SPR.loadBadges();\n            window.SPR.loadProducts();\n          }\n\n          window.SPRCallbacks = {}; // This allows us to add some class to adjust the styling\n\n          window.SPRCallbacks.onFormSuccess = function () {\n            _this2.element\n              .querySelector(\"#shopify-product-reviews .spr-form\")\n              .classList.add(\"spr-form-submitted\");\n          }; // If loaded by quick view, we need to do various initialization stuff\n\n          if (this.options[\"isQuickView\"] && window.SPR) {\n            window.SPR.initDomEls();\n            window.SPR.loadBadges();\n\n            if (\n              this.options[\"showPaymentButton\"] &&\n              window.Shopify.PaymentButton\n            ) {\n              Shopify.PaymentButton.init();\n            }\n          }\n        },\n        /**\n         * This method is called when the variant is changed due to option\n         */\n      },\n      {\n        key: \"_onVariantChanged\",\n        value: function _onVariantChanged(event) {\n          this.productGallery.variantHasChanged(event.detail.variant);\n        },\n      },\n    ]);\n\n    return ProductSection;\n  })();\n\n  var CartSection = /*#__PURE__*/ (function () {\n    function CartSection(element) {\n      _classCallCheck(this, CartSection);\n\n      this.element = element;\n      this.domDelegate = new Delegate(this.element);\n      this.delegateRoot = new Delegate(document.documentElement);\n      this.options = JSON.parse(\n        this.element.getAttribute(\"data-section-settings\")\n      );\n\n      if (this.options[\"showShippingEstimator\"]) {\n        this.shippingEstimator = new ShippingEstimator(\n          this.element.querySelector(\".shipping-estimator\"),\n          {\n            singleProduct: false,\n          }\n        );\n      }\n\n      this._attachListeners();\n\n      this._enforceMinimumHeight();\n    }\n\n    _createClass(CartSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          if (this.options[\"showShippingEstimator\"]) {\n            this.shippingEstimator.destroy();\n          }\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.domDelegate.on(\n            \"click\",\n            '[data-action=\"add-to-cart\"]',\n            this._addToCart.bind(this)\n          );\n          this.domDelegate.on(\n            \"click\",\n            '[data-action=\"save-note\"]',\n            this._saveNote.bind(this)\n          );\n          this.domDelegate.on(\n            \"click\",\n            '[data-secondary-action=\"open-quick-view\"]',\n            this._openQuickView.bind(this)\n          );\n          this.delegateRoot.on(\n            \"cart:rerendered\",\n            this._onCartRerendered.bind(this)\n          );\n        },\n      },\n      {\n        key: \"_saveNote\",\n        value: function _saveNote() {\n          var noteValue = this.element.querySelector('[name=\"note\"]').value;\n          fetch(\"\".concat(window.routes.cartUrl, \"/update.js\"), {\n            body: JSON.stringify({\n              note: noteValue,\n            }),\n            credentials: \"same-origin\",\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": \"application/json\",\n              \"X-Requested-With\": \"XMLHttpRequest\", // This is needed as currently there is a bug in Shopify that assumes this header\n            },\n          }); // Hide or show the note edit button depending on content\n\n          this.element\n            .querySelector(\".cart-recap__note-edit\")\n            .classList.toggle(\"is-visible\", noteValue !== \"\"); // Close the button by sending a global event\n\n          document.dispatchEvent(\n            new CustomEvent(\"collapsible:toggle\", {\n              detail: {\n                id: \"order-note\",\n              },\n            })\n          );\n        },\n      },\n      {\n        key: \"_addToCart\",\n        value: function _addToCart(event, target) {\n          var _this = this;\n\n          if (window.theme.cartType === \"page\") {\n            return; // When using a cart type of page, we just simply redirect to the cart page\n          }\n\n          event.preventDefault(); // Prevent form to be submitted\n\n          event.stopPropagation(); // First, we switch the status of the button\n\n          target.setAttribute(\"disabled\", \"disabled\");\n          document.dispatchEvent(new CustomEvent(\"theme:loading:start\")); // Then we add the product in Ajax\n\n          \n$('.quantity-selector__value').attr('data-current-value',$(\"#Quantity-product-template\").val());      \n$('.header__cart-count').text($(\"#Quantity-product-template\").val());      \n\n          var formElement = target.closest('form[action*=\"/cart/add\"]');\n          fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n            body: JSON.stringify(Form.serialize(formElement)),\n            credentials: \"same-origin\",\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": \"application/json\",\n              \"X-Requested-With\": \"XMLHttpRequest\", // This is needed as currently there is a bug in Shopify that assumes this header\n            },\n          }).then(function (response) {\n            if (response.ok) {\n              target.removeAttribute(\"disabled\"); // We simply trigger an event so the mini-cart can re-render\n\n              _this.element.dispatchEvent(\n                new CustomEvent(\"product:added\", {\n                  bubbles: true,\n                  detail: {\n                    variant: null,\n                    quantity: parseInt(\n                      formElement.querySelector('[name=\"quantity\"]').value\n                    ),\n                  },\n                })\n              );\n            } else {\n              target.removeAttribute(\"disabled\");\n            }\n          });\n          event.preventDefault();\n        },\n      },\n      {\n        key: \"_openQuickView\",\n        value: function _openQuickView(event, target) {\n          var modal = document.getElementById(\n            target.getAttribute(\"aria-controls\")\n          );\n          modal.classList.add(\"is-loading\");\n          fetch(\n            \"\".concat(\n              target.getAttribute(\"data-product-url\"),\n              \"?view=quick-view\"\n            ),\n            {\n              credentials: \"same-origin\",\n              method: \"GET\",\n            }\n          ).then(function (response) {\n            response.text().then(function (content) {\n              modal.querySelector(\".modal__inner\").innerHTML = content;\n              modal.classList.remove(\"is-loading\"); // Register a new section to power the JS\n\n              var modalProductSection = new ProductSection(\n                modal.querySelector('[data-section-type=\"product\"]')\n              ); // We set a listener so we can cleanup on close\n\n              var doCleanUp = function doCleanUp() {\n                modalProductSection.onUnload();\n                modal.removeEventListener(\"modal:closed\", doCleanUp);\n              };\n\n              modal.addEventListener(\"modal:closed\", doCleanUp);\n            });\n          });\n        },\n        /**\n         * On desktop we need to enforce a minimum height for the cart-wrapper\n         */\n      },\n      {\n        key: \"_enforceMinimumHeight\",\n        value: function _enforceMinimumHeight() {\n          var cartWrapperElement = this.element.querySelector(\".cart-wrapper\"),\n            cartRecapScrollerElement = this.element.querySelector(\n              \".cart-recap__scroller\"\n            );\n\n          if (cartWrapperElement && cartRecapScrollerElement) {\n            cartWrapperElement.style.minHeight = \"\".concat(\n              cartRecapScrollerElement.clientHeight,\n              \"px\"\n            );\n\n            if (window.ResizeObserver) {\n              var resizeObserver = new ResizeObserver(function (entries) {\n                var _iterator = _createForOfIteratorHelper(entries),\n                  _step;\n\n                try {\n                  for (_iterator.s(); !(_step = _iterator.n()).done; ) {\n                    var entry = _step.value;\n                    cartWrapperElement.style.minHeight = \"\".concat(\n                      parseInt(entry.contentRect.height),\n                      \"px\"\n                    );\n                  }\n                } catch (err) {\n                  _iterator.e(err);\n                } finally {\n                  _iterator.f();\n                }\n              });\n              resizeObserver.observe(cartRecapScrollerElement);\n            }\n          }\n        },\n        /* When the cart re-render, we have some operations to do */\n      },\n      {\n        key: \"_onCartRerendered\",\n        value: function _onCartRerendered() {\n          // For now the only thing we have to do is re-create the shipping estimator\n          if (this.options[\"showShippingEstimator\"]) {\n            this.shippingEstimator.destroy();\n            this.shippingEstimator = new ShippingEstimator(\n              this.element.querySelector(\".shipping-estimator\"),\n              {\n                singleProduct: false,\n              }\n            );\n          }\n\n          this._enforceMinimumHeight();\n        },\n      },\n    ]);\n\n    return CartSection;\n  })();\n\n  var CollectionListSection = /*#__PURE__*/ (function () {\n    function CollectionListSection(element) {\n      _classCallCheck(this, CollectionListSection);\n\n      this.element = element;\n      var collectionListElement =\n        this.element.querySelector(\".collection-list\");\n      this.flickityInstance = new js(collectionListElement, {\n        watchCSS: true,\n        prevNextButtons: true,\n        draggable: !window.matchMedia(\"(-moz-touch-enabled: 0), (hover: hover)\")\n          .matches,\n        pageDots: false,\n        cellAlign:\n          collectionListElement.childElementCount < 6 ? \"center\" : \"left\",\n        contain: true,\n        groupCells: true,\n      });\n    }\n\n    _createClass(CollectionListSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          this.flickityInstance.destroy();\n        },\n      },\n      {\n        key: \"onBlockSelect\",\n        value: function onBlockSelect(event) {\n          if (this.flickityInstance.isActive) {\n            this.flickityInstance.selectCell(\n              parseInt(event.target.getAttribute(\"data-collection-index\")),\n              null,\n              event.detail.load\n            );\n          }\n        },\n      },\n    ]);\n\n    return CollectionListSection;\n  })();\n\n  var CollectionSection = /*#__PURE__*/ (function () {\n    function CollectionSection(element) {\n      _classCallCheck(this, CollectionSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(\n        this.element.getAttribute(\"data-section-settings\")\n      );\n      this.collectionFilterTagElements =\n        this.element.querySelectorAll(\"[data-tag]\");\n      this.currentUrl = new URL(window.location.href);\n      this.currentTags = this.options[\"currentTags\"];\n\n      if (Shopify.designMode && window.SPR) {\n        window.SPR.initDomEls();\n        window.SPR.loadBadges();\n      }\n\n      this.mobileFilterDrawer = new CollectionFilterDrawer(this.options);\n      this.displayByValuePicker = new ValuePicker(\"display-by-selector\", {\n        onValueSelect: this._showingCountChanged.bind(this),\n      });\n      this.sortByValuePicker = new ValuePicker(\"sort-by-selector\", {\n        onValueSelect: this._sortByChanged.bind(this),\n      });\n      this.productItemColorSwatch = new ProductItemColorSwatch(this.element); // If we are in the template search and that we are supposed to show pages and blog posts, we do more work\n\n      if (\n        window.theme.pageType === \"search\" &&\n        window.theme.searchMode !== \"product\"\n      ) {\n        this._loadContentResults();\n      }\n\n      this._attachListeners();\n    }\n\n    _createClass(CollectionSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          this.delegateElement.off();\n          this.mobileFilterDrawer.destroy();\n          this.displayByValuePicker.destroy();\n          this.sortByValuePicker.destroy();\n          this.productItemColorSwatch.destroy();\n        },\n      },\n      {\n        key: \"onSelect\",\n        value: function onSelect(event) {\n          if (Shopify.designMode && event.detail.load) {\n            // We also force the layout and number of items per page in the editor, no matter if you have choose an explicit mode\n            this.element\n              .querySelector(\n                '.collection__layout-button[data-layout-mode=\"'.concat(\n                  this.options[\"defaultLayout\"],\n                  '\"]'\n                )\n              )\n              .click();\n\n            this._showingCountChanged(this.options[\"defaultProductsPerPage\"]);\n          }\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          var _this = this;\n\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"change-layout\"]',\n            this._changeLayout.bind(this)\n          );\n          this.delegateElement.on(\n            \"change\",\n            \"#mobile-sort-by, #desktop-sort-by\",\n            this._sortByChanged.bind(this)\n          );\n          this.delegateElement.on(\n            \"change\",\n            \"#showing-count\",\n            this._showingCountChanged.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            \".pagination [data-page]\",\n            this._paginationPageChanged.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"toggle-tag\"]',\n            this._tagToggled.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"clear-tags\"]',\n            this._clearTags.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-secondary-action=\"open-quick-view\"]',\n            this._openQuickView.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"add-to-cart\"]',\n            this._addToCart.bind(this)\n          );\n          window.addEventListener(\"popstate\", function (event) {\n            if (event.state.path) {\n              _this.currentUrl = new URL(event.state.path);\n\n              _this._reload(false);\n            }\n          });\n        },\n      },\n      {\n        key: \"_openQuickView\",\n        value: function _openQuickView(event, target) {\n          var productUrl = new URL(\n            \"\"\n              .concat(window.location.origin)\n              .concat(target.getAttribute(\"data-product-url\"))\n          ); // If we are on mobile or tablet, we redirect to product page directly\n\n          if (\n            Responsive.matchesBreakpoint(\"phone\") ||\n            Responsive.matchesBreakpoint(\"tablet\")\n          ) {\n            window.location.href = productUrl.href;\n            return false;\n          }\n\n          var modal = document.getElementById(\n            target.getAttribute(\"aria-controls\")\n          );\n          modal.classList.add(\"is-loading\");\n          productUrl.searchParams.set(\"view\", \"quick-view\");\n          fetch(productUrl.href, {\n            credentials: \"same-origin\",\n            method: \"GET\",\n          }).then(function (response) {\n            response.text().then(function (content) {\n              modal.querySelector(\".modal__inner\").innerHTML = content;\n              modal.classList.remove(\"is-loading\"); // Register a new section to power the JS\n\n              var modalProductSection = new ProductSection(\n                modal.querySelector('[data-section-type=\"product\"]')\n              ); // We set a listener so we can cleanup on close\n\n              var doCleanUp = function doCleanUp() {\n                modalProductSection.onUnload();\n                modal.removeEventListener(\"modal:closed\", doCleanUp);\n              };\n\n              modal.addEventListener(\"modal:closed\", doCleanUp);\n              typeof window.BOLD !== \"undefined\" &&\n                typeof window.BOLD.BsubWidget !== \"undefined\" &&\n                BOLD.BsubWidget.init();\n            });\n          });\n        },\n        /**\n         * Switch layout mode\n         */\n      },\n      {\n        key: \"_changeLayout\",\n        value: function _changeLayout(event, target) {\n          var _this2 = this;\n\n          if (target.classList.contains(\"is-selected\")) {\n            return;\n          }\n\n          var newLayoutMode = target.getAttribute(\"data-layout-mode\"); // We save the new attribute so that we can select the appropriate mode without causing reflow\n\n          fetch(\"\".concat(window.routes.cartUrl, \"/update.js\"), {\n            body: JSON.stringify({\n              attributes: {\n                collection_layout: newLayoutMode,\n              },\n            }),\n            credentials: \"same-origin\",\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": \"application/json\",\n              \"X-Requested-With\": \"XMLHttpRequest\", // This is needed as currently there is a bug in Shopify that assumes this header\n            },\n          }); // Finally, we change everything!\n\n          fastdom.mutate(function () {\n            Dom.getSiblings(target, \".is-selected\").forEach(function (button) {\n              return button.classList.remove(\"is-selected\");\n            });\n            target.classList.add(\"is-selected\");\n\n            _this2.element\n              .querySelectorAll(\".product-item\")\n              .forEach(function (item) {\n                if (newLayoutMode === \"grid\") {\n                  item.className =\n                    \"product-item product-item--vertical \".concat(\n                      _this2.options[\"gridClasses\"]\n                    );\n                } else {\n                  item.className = \"product-item product-item--list\";\n                }\n              }); // Reload the swatches\n\n            _this2.productItemColorSwatch.recalculateSwatches();\n          });\n        },\n        /**\n         * Update the URL and reload products\n         */\n      },\n      {\n        key: \"_sortByChanged\",\n        value: function _sortByChanged(value) {\n          this.currentUrl.searchParams.set(\"sort_by\", value);\n          this.currentUrl.searchParams[\"delete\"](\"page\");\n\n          this._reload(true);\n        },\n        /**\n         * When the number of items has changed\n         */\n      },\n      {\n        key: \"_showingCountChanged\",\n        value: function _showingCountChanged(value) {\n          var _this3 = this;\n\n          this.currentUrl.searchParams[\"delete\"](\"page\"); // We save the new value as a cart attribute, so it can be retrieved in Liquid easily :)\n\n          fetch(\"\".concat(window.routes.cartUrl, \"/update.js\"), {\n            body: JSON.stringify({\n              attributes: {\n                collection_products_per_page: value,\n              },\n            }),\n            credentials: \"same-origin\",\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": \"application/json\",\n              \"X-Requested-With\": \"XMLHttpRequest\", // This is needed as currently there is a bug in Shopify that assumes this header\n            },\n          }).then(function () {\n            _this3._reload(true);\n          });\n        },\n        /**\n         * When the page has changed\n         */\n      },\n      {\n        key: \"_paginationPageChanged\",\n        value: function _paginationPageChanged(event, target) {\n          event.preventDefault();\n          this.currentUrl.searchParams.set(\n            \"page\",\n            parseInt(target.getAttribute(\"data-page\"))\n          );\n\n          this._reload(true);\n        },\n        /**\n         * When a new tag is selected\n         */\n      },\n      {\n        key: \"_tagToggled\",\n        value: function _tagToggled(event, target) {\n          var _this4 = this;\n\n          var newTag = target.getAttribute(\"data-tag\"),\n            hadTags = this.currentTags.length > 0;\n\n          if (this.currentTags.includes(newTag)) {\n            this.currentTags = this.currentTags.filter(function (value) {\n              return value !== newTag;\n            });\n          } else {\n            if (this.options[\"filterType\"] === \"tag\") {\n              this.currentTags = [newTag]; // When using tag mode, we only allow one tag at maximum\n            } else {\n              // In the group mode, we need to make sure to remove the other tags that are matching the given group\n              var tagGroup = newTag.split(\"_\")[0];\n              this.currentTags.forEach(function (existingTag) {\n                if (existingTag.split(\"_\")[0] === tagGroup) {\n                  _this4.currentTags = _this4.currentTags.filter(function (\n                    value\n                  ) {\n                    return value !== existingTag;\n                  });\n                }\n              });\n              this.currentTags.push(newTag);\n            }\n          }\n\n          this.currentUrl.searchParams[\"delete\"](\"page\");\n\n          this._updateTagUrl(hadTags); // Finally, we can reload!\n\n          this._reload(true);\n        },\n      },\n      {\n        key: \"_clearTags\",\n        value: function _clearTags() {\n          var hadTags = this.currentTags.length > 0;\n          this.currentTags = [];\n          this.currentUrl.searchParams[\"delete\"](\"page\");\n\n          this._updateTagUrl(hadTags); // Finally, we can reload!\n\n          this._reload(true).then(function () {\n            document.dispatchEvent(new CustomEvent(\"collection-filter:close\"));\n          });\n        },\n      },\n      {\n        key: \"_updateTagUrl\",\n        value: function _updateTagUrl(hadTags) {\n          var _this5 = this;\n\n          // Then, we update the DOM\n          fastdom.mutate(function () {\n            _this5.collectionFilterTagElements.forEach(function (tagElement) {\n              if (\n                _this5.currentTags.includes(tagElement.getAttribute(\"data-tag\"))\n              ) {\n                tagElement.classList.add(\"is-selected\");\n\n                if (tagElement.tagName === \"INPUT\") {\n                  tagElement.checked = true;\n                }\n              } else {\n                tagElement.classList.remove(\"is-selected\");\n\n                if (tagElement.tagName === \"INPUT\") {\n                  tagElement.checked = false;\n                }\n              }\n            });\n          }); // Then, update the URL. When the collection is automatic (such as vendors and types collections), tags must be added\n          // within a constraint query parameter, otherwise they must be appended to the path\n\n          if (this.options[\"isAutomatic\"]) {\n            if (this.currentTags.length === 0) {\n              this.currentUrl.searchParams[\"delete\"](\"constraint\");\n            } else {\n              this.currentUrl.searchParams.set(\n                \"constraint\",\n                this.currentTags.join(\"+\")\n              );\n            }\n          } else {\n            var tagPath = this.currentTags.join(\"+\"),\n              currentPathName =\n                this.currentUrl.pathname.substr(-1) === \"/\"\n                  ? this.currentUrl.pathname.substr(\n                      0,\n                      this.currentUrl.pathname.length - 1\n                    )\n                  : this.currentUrl.pathname;\n\n            if (hadTags) {\n              var pathParts = currentPathName.split(\"/\");\n              pathParts.pop();\n              this.currentUrl.pathname = \"\"\n                .concat(pathParts.join(\"/\"), \"/\")\n                .concat(tagPath);\n            } else {\n              this.currentUrl.pathname = \"\"\n                .concat(currentPathName, \"/\")\n                .concat(tagPath);\n            }\n          }\n        },\n        /**\n         * Reload all products from the current URL\n         *\n         * @private\n         */\n      },\n      {\n        key: \"_reload\",\n        value: function _reload(pushState) {\n          var _this6 = this;\n\n          // Then, we replace the URL\n          if (pushState) {\n            window.history.pushState(\n              {\n                path: this.currentUrl.toString(),\n              },\n              \"\",\n              this.currentUrl.toString()\n            );\n          }\n\n          document.dispatchEvent(new CustomEvent(\"theme:loading:start\")); // We notify the mobile collection drawer that it has changed\n\n          this.mobileFilterDrawer._filtersHaveChanged(this.currentTags); // We scroll to the top\n\n          var computedStyles = window.getComputedStyle(\n            document.documentElement\n          ); // To load the content we use the newly introduced \"Sections API\", which also to get data much more efficiently\n\n          var sectionUrl = \"\";\n\n          if (this.currentUrl.search) {\n            sectionUrl = \"\"\n              .concat(this.currentUrl.pathname, \"/\")\n              .concat(this.currentUrl.search, \"&section_id=\")\n              .concat(this.element.getAttribute(\"data-section-id\"));\n          } else {\n            sectionUrl = \"\"\n              .concat(this.currentUrl.pathname, \"?section_id=\")\n              .concat(this.element.getAttribute(\"data-section-id\"));\n          }\n\n          return fetch(sectionUrl, {\n            credentials: \"same-origin\",\n            method: \"GET\",\n          }).then(function (response) {\n            response.text().then(function (content) {\n              var tempElement = document.createElement(\"div\");\n              tempElement.innerHTML = content;\n              _this6.element.querySelector(\n                \".collection__dynamic-part\"\n              ).innerHTML = tempElement.querySelector(\n                \".collection__dynamic-part\"\n              ).innerHTML;\n\n              var activeFilters = _this6.element.querySelector(\n                \".collection__active-filters\"\n              ); // A given collection may not have any filters\n\n              if (activeFilters) {\n                activeFilters.innerHTML = tempElement.querySelector(\n                  \".collection__active-filters\"\n                ).innerHTML;\n              } // Reload the Shopify Review badges\n\n              if (window.SPR) {\n                window.SPR.initDomEls();\n                window.SPR.loadBadges();\n              } // Reload the swatches\n\n              _this6.productItemColorSwatch.recalculateSwatches();\n\n              var elementOffset =\n                _this6.element\n                  .querySelector(\".collection\")\n                  .getBoundingClientRect().top -\n                25 -\n                parseInt(\n                  computedStyles.getPropertyValue(\"--header-is-sticky\")\n                ) *\n                  parseInt(computedStyles.getPropertyValue(\"--header-height\"));\n\n              if (elementOffset < 0) {\n                window.scrollBy({\n                  top: elementOffset,\n                  behavior: \"smooth\",\n                });\n              } // Finally, we scroll to the element\n\n              document.dispatchEvent(new CustomEvent(\"theme:loading:end\"));\n            });\n          });\n        },\n        /**\n         * ---------------------------------------------------------------------------------------------------\n         * SEARCH PAGE SPECIFIC METHOD\n         * ---------------------------------------------------------------------------------------------------\n         */\n      },\n      {\n        key: \"_loadContentResults\",\n        value: function _loadContentResults() {\n          var _this7 = this;\n\n          var currentUrl = new URL(window.location.href);\n          fetch(\n            \"\"\n              .concat(window.routes.searchUrl, \"?view=content&q=\")\n              .concat(currentUrl.searchParams.get(\"q\"), \"&type=\")\n              .concat(window.theme.searchMode.replace(\"product,\", \"\")),\n            {\n              credentials: \"same-origin\",\n            }\n          ).then(function (response) {\n            response.text().then(function (content) {\n              var linkSearchResults = _this7.element.querySelector(\n                \".link-search-results\"\n              );\n\n              if (linkSearchResults && content.trim() !== \"\") {\n                linkSearchResults.innerHTML = content;\n                linkSearchResults.style.display = \"block\";\n              }\n            });\n          });\n        },\n        /**\n         * ---------------------------------------------------------------------------------------------------\n         * INTERNAL CODE THAT HANDLE PRODUCT ADD TO CART\n         * ---------------------------------------------------------------------------------------------------\n         */\n      },\n      {\n        key: \"_addToCart\",\n        value: function _addToCart(event, target) {\n          var _this8 = this;\n\n          if (window.theme.cartType === \"page\") {\n            return; // When using a cart type of page, we just simply redirect to the cart page\n          }\n\n          event.preventDefault(); // Prevent form to be submitted\n\n          event.stopPropagation(); // First, we switch the status of the button\n\n          target.setAttribute(\"disabled\", \"disabled\");\n          document.dispatchEvent(new CustomEvent(\"theme:loading:start\")); // Then we add the product in Ajax\n      \n          var formElement = target.closest('form[action*=\"/cart/add\"]');\n          fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n            body: JSON.stringify(Form.serialize(formElement)),\n            credentials: \"same-origin\",\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": \"application/json\",\n              \"X-Requested-With\": \"XMLHttpRequest\", // This is needed as currently there is a bug in Shopify that assumes this header\n            },\n          }).then(function (response) {\n            target.removeAttribute(\"disabled\");\n\n            if (response.ok) {\n              // We simply trigger an event so the mini-cart can re-render\n              _this8.element.dispatchEvent(\n                new CustomEvent(\"product:added\", {\n                  bubbles: true,\n                  detail: {\n                    button: target,\n                    variant: null,\n                    quantity: parseInt(\n                      formElement.querySelector('[name=\"quantity\"]').value\n                    ),\n                  },\n                })\n              );\n            } else {\n              document.dispatchEvent(new CustomEvent(\"theme:loading:end\"));\n            }\n          });\n          event.preventDefault();\n        },\n      },\n    ]);\n\n    return CollectionSection;\n  })();\n\n  var FeaturedCollectionSection = /*#__PURE__*/ (function () {\n    function FeaturedCollectionSection(element) {\n      _classCallCheck(this, FeaturedCollectionSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(\n        this.element.getAttribute(\"data-section-settings\")\n      );\n\n      if (!this.options[\"stackable\"]) {\n        this.flickityInstance = new js(\n          this.element.querySelector(\".product-list\"),\n          {\n            watchCSS: true,\n            pageDots: false,\n            prevNextButtons: true,\n            contain: true,\n            groupCells: true,\n            cellAlign: \"left\",\n            draggable: !window.matchMedia(\n              \"(-moz-touch-enabled: 0), (hover: hover)\"\n            ).matches,\n          }\n        );\n      }\n\n      if (Shopify.designMode && window.SPR) {\n        window.SPR.initDomEls();\n        window.SPR.loadBadges();\n      }\n\n      this.productItemColorSwatch = new ProductItemColorSwatch(this.element);\n\n      this._fixSafari();\n\n      this._attachListeners();\n    }\n\n    _createClass(FeaturedCollectionSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          if (!this.options[\"stackable\"]) {\n            this.flickityInstance.destroy();\n          }\n\n          window.removeEventListener(\"resize\", this._fixSafariListener);\n          this.delegateElement.off(\"change\");\n          this.productItemColorSwatch.destroy();\n\n          if (this.resizeObserver) {\n            this.resizeObserver.disconnect();\n          }\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          var _this = this;\n\n          this._fixSafariListener = this._fixSafari.bind(this);\n          window.addEventListener(\"resize\", this._fixSafariListener);\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"add-to-cart\"]',\n            this._addToCart.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-secondary-action=\"open-quick-view\"]',\n            this._openQuickView.bind(this)\n          ); // If the browser supports ResizeObserver we use it to detect when the size of the items in the carousel change,\n          // and if that's the case we force Flickity to resize\n\n          if (window.ResizeObserver && this.flickityInstance) {\n            this.resizeObserver = new ResizeObserver(function () {\n              _this.flickityInstance.resize();\n            });\n            this.element\n              .querySelectorAll(\".product-item\")\n              .forEach(function (item) {\n                _this.resizeObserver.observe(item);\n              });\n          }\n        },\n        /**\n         * On Safari 11.1 and lower, the browser incorrectly calculate the height of flex and grid items due to a bug\n         * on how padding percentage is calculated (that we use for allocating image space). This is solved in Safari 11.1 and higher.\n         *\n         * For those browsers, we fix that in JavaScript by setting the height directly for each aspect ratio image\n         *\n         * @private\n         */\n      },\n      {\n        key: \"_fixSafari\",\n        value: function _fixSafari() {\n          var userAgent = window.navigator.userAgent.toLowerCase();\n\n          if (\n            userAgent.includes(\"safari\") &&\n            (userAgent.includes(\"version/10.1\") ||\n              userAgent.includes(\"version/10.3\") ||\n              userAgent.includes(\"version/11.0\"))\n          ) {\n            var isPhone = Responsive.matchesBreakpoint(\"phone\");\n            this.element\n              .querySelectorAll(\n                \".product-item__image-wrapper .aspect-ratio, .product-item__image-wrapper .placeholder-svg\"\n              )\n              .forEach(function (image) {\n                if (isPhone) {\n                  image.parentNode.style.height = null;\n                } else {\n                  image.parentNode.style.height = \"\".concat(\n                    image.clientHeight,\n                    \"px\"\n                  );\n                }\n              });\n          }\n        },\n      },\n      {\n        key: \"_openQuickView\",\n        value: function _openQuickView(event, target) {\n          var productUrl = new URL(\n            \"\"\n              .concat(window.location.origin)\n              .concat(target.getAttribute(\"data-product-url\"))\n          ); // If we are on mobile or tablet, we redirect to product page directly\n\n          if (\n            Responsive.matchesBreakpoint(\"phone\") ||\n            Responsive.matchesBreakpoint(\"tablet\")\n          ) {\n            window.location.href = productUrl.href;\n            return false;\n          }\n\n          var modal = document.getElementById(\n            target.getAttribute(\"aria-controls\")\n          );\n          modal.classList.add(\"is-loading\");\n          productUrl.searchParams.set(\"view\", \"quick-view\");\n          fetch(productUrl.href, {\n            credentials: \"same-origin\",\n            method: \"GET\",\n          }).then(function (response) {\n            response.text().then(function (content) {\n              modal.querySelector(\".modal__inner\").innerHTML = content;\n              modal.classList.remove(\"is-loading\"); // Register a new section to power the JS\n\n              var modalProductSection = new ProductSection(\n                modal.querySelector('[data-section-type=\"product\"]')\n              ); // We set a listener so we can cleanup on close\n\n              var doCleanUp = function doCleanUp() {\n                modalProductSection.onUnload();\n                modal.removeEventListener(\"modal:closed\", doCleanUp);\n              };\n\n              modal.addEventListener(\"modal:closed\", doCleanUp);\n            });\n          });\n        },\n        /**\n         * ---------------------------------------------------------------------------------------------------\n         * INTERNAL CODE THAT HANDLE PRODUCT ADD TO CART\n         * ---------------------------------------------------------------------------------------------------\n         */\n      },\n      {\n        key: \"_addToCart\",\n        value: function _addToCart(event, target) {\n          var _this2 = this;\n\n          if (window.theme.cartType === \"page\") {\n            return; // When using a cart type of page, we just simply redirect to the cart page\n          }\n\n          event.preventDefault(); // Prevent form to be submitted\n\n          event.stopPropagation(); // First, we switch the status of the button\n\n          target.setAttribute(\"disabled\", \"disabled\");\n          document.dispatchEvent(new CustomEvent(\"theme:loading:start\")); // Then we add the product in Ajax          \n          \n          var formElement = target.closest('form[action*=\"/cart/add\"]');\n          fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n            body: JSON.stringify(Form.serialize(formElement)),\n            credentials: \"same-origin\",\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": \"application/json\",\n              \"X-Requested-With\": \"XMLHttpRequest\", // This is needed as currently there is a bug in Shopify that assumes this header\n            },\n          }).then(function (response) {\n            target.removeAttribute(\"disabled\");\n\n            if (response.ok) {\n              // We simply trigger an event so the mini-cart can re-render\n              _this2.element.dispatchEvent(\n                new CustomEvent(\"product:added\", {\n                  bubbles: true,\n                  detail: {\n                    button: target,\n                    variant: null,\n                    quantity: parseInt(\n                      formElement.querySelector('[name=\"quantity\"]').value\n                    ),\n                  },\n                })\n              );\n            } else {\n              document.dispatchEvent(new CustomEvent(\"theme:loading:end\"));\n            }\n          });\n          event.preventDefault();\n        },\n      },\n    ]);\n\n    return FeaturedCollectionSection;\n  })();\n\n  var GiftCardSection = /*#__PURE__*/ (function () {\n    function GiftCardSection(container) {\n      _classCallCheck(this, GiftCardSection);\n\n      this.element = container;\n      this.delegateElement = new Delegate(this.element);\n\n      this._createQrCode();\n\n      this._attachListeners();\n    }\n\n    _createClass(GiftCardSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          this.delegateElement.off();\n        },\n      },\n      {\n        key: \"_createQrCode\",\n        value: function _createQrCode() {\n          var qrCodeElements = document.querySelectorAll(\".gift-card__qr\");\n          qrCodeElements.forEach(function (qrCodeElement) {\n            new QRCode(qrCodeElement, {\n              text: qrCodeElement.getAttribute(\"data-identifier\"),\n              width: 200,\n              height: 200,\n            });\n          });\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"print\"]',\n            this._print.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"select-code\"]',\n            this._selectCode.bind(this)\n          );\n        },\n      },\n      {\n        key: \"_print\",\n        value: function _print() {\n          window.print();\n        },\n      },\n      {\n        key: \"_selectCode\",\n        value: function _selectCode(event, element) {\n          element.select();\n        },\n      },\n    ]);\n\n    return GiftCardSection;\n  })();\n\n  var FooterSection = /*#__PURE__*/ (function () {\n    function FooterSection(element) {\n      _classCallCheck(this, FooterSection);\n\n      this.element = element;\n      this.domDelegate = new Delegate(this.element);\n      this.localeValuePicker = new ValuePicker(\"footer-locale-picker\");\n      this.currencyValuePicker = new ValuePicker(\"footer-currency-picker\");\n      this.cookieBarElement = this.element.querySelector(\".cookie-bar\");\n\n      if (this.cookieBarElement) {\n        this._setupCookieBar();\n      }\n\n      this._setupCollapsibles();\n\n      this._attachListeners();\n    }\n\n    _createClass(FooterSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          window.removeEventListener(\"resize\", this._setupCollapsiblesListener);\n          this.domDelegate.off();\n          this.localeValuePicker.destroy();\n          this.currencyValuePicker.destroy();\n        },\n      },\n      {\n        key: \"onSelect\",\n        value: function onSelect() {\n          if (this.cookieBarElement) {\n            this.cookieBarElement.setAttribute(\"aria-hidden\", \"false\");\n          }\n        },\n      },\n      {\n        key: \"onDeselect\",\n        value: function onDeselect() {\n          if (this.cookieBarElement) {\n            this.cookieBarElement.setAttribute(\"aria-hidden\", \"true\");\n          }\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this._setupCollapsiblesListener = this._setupCollapsibles.bind(this);\n          window.addEventListener(\"resize\", this._setupCollapsiblesListener);\n          this.domDelegate.on(\n            \"click\",\n            '[data-action=\"accept-terms\"]',\n            this._acceptCookieBarTerms.bind(this)\n          );\n        },\n        /**\n         * On mobile, some block items are collapsed, so we must slightly edit their HTML\n         */\n      },\n      {\n        key: \"_setupCollapsibles\",\n        value: function _setupCollapsibles() {\n          var collapsibleToggles = this.element.querySelectorAll(\n              '[data-action=\"toggle-collapsible\"]'\n            ),\n            isPhone = Responsive.matchesBreakpoint(\"phone\");\n          collapsibleToggles.forEach(function (collapsibleToggle) {\n            if (isPhone) {\n              collapsibleToggle.removeAttribute(\"disabled\");\n            } else {\n              collapsibleToggle.setAttribute(\"disabled\", \"disabled\");\n              document.getElementById(\n                collapsibleToggle.getAttribute(\"aria-controls\")\n              ).style.height = \"\";\n            }\n          });\n        },\n      },\n      {\n        key: \"_setupCookieBar\",\n        value: function _setupCookieBar() {\n          // We check if we should make it visible\n          try {\n            if (localStorage.getItem(\"cookieWasAccepted\") === null) {\n              this.cookieBarElement.setAttribute(\"aria-hidden\", \"false\");\n            }\n          } catch (exception) {\n            // Some browser may throw an exception when trying to access the local storage in private mode for instance, so we just ignore it\n          }\n        },\n      },\n      {\n        key: \"_acceptCookieBarTerms\",\n        value: function _acceptCookieBarTerms() {\n          // We close the cookie bar and we set a value in local storage to not show it again\n          this.cookieBarElement.setAttribute(\"aria-hidden\", \"true\");\n\n          try {\n            localStorage.setItem(\"cookieWasAccepted\", \"true\");\n          } catch (exception) {}\n        },\n      },\n    ]);\n\n    return FooterSection;\n  })();\n\n  var SearchBar = /*#__PURE__*/ (function () {\n    function SearchBar(element) {\n      _classCallCheck(this, SearchBar);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n\n      if(this.element == null){\n        return;\n      }\n      \n      this.headerElement = this.element.closest(\".header\");\n      this.searchBarElement = this.element.querySelector(\".search-bar\");\n      this.inputElement = this.element.querySelector('[name=\"q\"]');\n      this.searchMenuElement = this.element.querySelector(\n        \".search-bar__menu-wrapper\"\n      );\n      this.searchResultsElement = this.element.querySelector(\n        \".search-bar__results\"\n      );\n      this.closeButtonElement = this.element.querySelector(\n        \".search-bar__close-button\"\n      );\n      this.productTypeFilter = \"\";\n      this.isSearchOpen = false;\n\n      this._attachListeners();\n    }\n\n    _createClass(SearchBar, [\n      {\n        key: \"destroy\",\n        value: function destroy() {\n          this.delegateElement.off();\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"clear-input\"]',\n            this._clearInput.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"unfix-search\"]',\n            this._unfixMobileSearch.bind(this)\n          );\n          this.delegateElement.on(\n            \"focusin\",\n            '[name=\"q\"]',\n            this._onInputFocus.bind(this)\n          );\n          this.delegateElement.on(\"focusout\", this._onFocusOut.bind(this));\n          this.delegateElement.on(\n            \"keydown\",\n            '[name=\"q\"]',\n            this._handleTab.bind(this)\n          );\n          this.delegateElement.on(\n            \"input\",\n            '[name=\"q\"]',\n            this._debounce(this._doSearch.bind(this), 250)\n          );\n          this.delegateElement.on(\n            \"change\",\n            \"#search-product-type\",\n            this._productTypeChanged.bind(this)\n          );\n          this.delegateElement.on(\"submit\", this._onFormSubmit.bind(this));\n        },\n        /**\n         * Toggle the mobile search (only applicable if the show condensed search is shown)\n         */\n      },\n      {\n        key: \"toggleMobileSearch\",\n        value: function toggleMobileSearch() {\n          if (this.isSearchOpen) {\n            this.headerElement.classList.remove(\"header--search-expanded\");\n            this.element.classList.remove(\"is-visible\");\n          } else {\n            this.headerElement.classList.add(\"header--search-expanded\");\n            this.element.classList.add(\"is-visible\");\n          }\n\n          this.isSearchOpen = !this.isSearchOpen;\n        },\n      },\n      {\n        key: \"_unfixMobileSearch\",\n        value: function _unfixMobileSearch() {\n          this.element.classList.remove(\"is-fixed\");\n          this.closeButtonElement.style.width = \"\";\n          this.searchBarElement.classList.remove(\"is-expanded\");\n          this.searchResultsElement.setAttribute(\"aria-hidden\", \"true\");\n          this.inputElement.classList.remove(\"is-filled\");\n          document.body.classList.remove(\"no-mobile-scroll\");\n\n          if (this.searchMenuElement) {\n            this.searchMenuElement.setAttribute(\"aria-hidden\", \"true\");\n          }\n        },\n        /**\n         * Only on mobile\n         */\n      },\n      {\n        key: \"_clearInput\",\n        value: function _clearInput() {\n          this.inputElement.value = \"\";\n          this.inputElement.classList.remove(\"is-filled\");\n          this.searchResultsElement.setAttribute(\"aria-hidden\", \"true\");\n\n          if (this.searchMenuElement) {\n            this.searchMenuElement.setAttribute(\"aria-hidden\", \"false\");\n          }\n        },\n        /**\n         * When the input get focus, we display the quick links if they were specified by the merchant, or we open results if\n         * results were previously loaded\n         */\n      },\n      {\n        key: \"_onInputFocus\",\n        value: function _onInputFocus() {\n          this.element.classList.add(\"is-fixed\");\n          this.closeButtonElement.style.width = \"\".concat(\n            this.closeButtonElement.firstElementChild.offsetWidth,\n            \"px\"\n          );\n          document.body.classList.add(\"no-mobile-scroll\");\n\n          if (this.inputElement.value === \"\") {\n            if (this.searchMenuElement) {\n              this.searchMenuElement.setAttribute(\"aria-hidden\", \"false\");\n            }\n\n            this.searchResultsElement.setAttribute(\"aria-hidden\", \"true\");\n          } else {\n            if (this.searchMenuElement) {\n              this.searchMenuElement.setAttribute(\"aria-hidden\", \"true\");\n            }\n\n            this.searchResultsElement.setAttribute(\"aria-hidden\", \"false\");\n            this.inputElement.classList.add(\"is-filled\");\n            this.searchBarElement.classList.add(\"is-expanded\");\n          }\n\n          if (this.searchMenuElement) {\n            this.searchBarElement.classList.add(\"is-expanded\");\n          }\n        },\n        /**\n         * Whenever the focus leaves the search, we close everything (both search results and quick links)\n         */\n      },\n      {\n        key: \"_onFocusOut\",\n        value: function _onFocusOut(event) {\n          // On phone, nothing happens on focus out\n          if (Responsive.matchesBreakpoint(\"phone\")) {\n            return;\n          }\n\n          this.element.classList.remove(\"is-fixed\");\n          document.body.classList.remove(\"no-mobile-scroll\"); // event.relatedTarget allows to get the new element that get focus. If it's outside the div that contains the search, we close it\n\n          if (!this.element.contains(event.relatedTarget)) {\n            if (this.searchMenuElement) {\n              this.searchMenuElement.setAttribute(\"aria-hidden\", \"true\");\n            }\n\n            this.searchResultsElement.setAttribute(\"aria-hidden\", \"true\");\n            this.searchBarElement.classList.remove(\"is-expanded\");\n          }\n        },\n        /**\n         * This allows to slightly improve the accessibility and user experience by directly focusing on the first search results (if any)\n         */\n      },\n      {\n        key: \"_handleTab\",\n        value: function _handleTab(event) {\n          if (event.key !== \"Tab\") {\n            return;\n          } // Try to get the first link into the results to give focus to this element\n\n          var firstFocusableElement =\n            this.searchResultsElement.querySelector(\"a\");\n\n          if (firstFocusableElement) {\n            firstFocusableElement.focus();\n            event.preventDefault();\n          }\n        },\n        /**\n         * Fire the different Ajax requests\n         */\n      },\n      {\n        key: \"_doSearch\",\n        value: function _doSearch() {\n          var _this = this;\n\n          // Unfortunately, fetch does not support as of today cancelling a request. As a consequence what we do is that we manually\n          // keep track of sent requests, and only use the results of the last one\n          var currentInput = this.inputElement.value;\n          this.lastInputValue = currentInput;\n\n          if (currentInput === \"\") {\n            if (this.searchMenuElement) {\n              this.searchMenuElement.setAttribute(\"aria-hidden\", \"false\");\n            } else {\n              this.searchBarElement.classList.remove(\"is-expanded\");\n            }\n\n            this.searchResultsElement.setAttribute(\"aria-hidden\", \"true\");\n          } else {\n            if (this.searchMenuElement) {\n              this.searchMenuElement.setAttribute(\"aria-hidden\", \"true\");\n            }\n\n            this.searchResultsElement.setAttribute(\"aria-hidden\", \"false\");\n            this.searchBarElement.classList.add(\"is-expanded\", \"is-loading\");\n            var queryOptions = {\n                method: \"GET\",\n                credentials: \"same-origin\",\n              },\n              productQuery = \"\"\n                .concat(\n                  this.productTypeFilter !== \"\"\n                    ? \"product_type:\".concat(this.productTypeFilter, \" AND \")\n                    : \"\"\n                )\n                .concat(encodeURIComponent(this.lastInputValue)),\n              queries = [\n                fetch(\n                  \"\"\n                    .concat(window.routes.searchUrl, \"?view=ajax&q=\")\n                    .concat(\n                      productQuery,\n                      \"&options[prefix]=last&options[unavailable_products]=\"\n                    )\n                    .concat(\n                      window.theme.searchUnavailableProducts,\n                      \"&type=product\"\n                    ),\n                  queryOptions\n                ),\n              ];\n\n            if (window.theme.searchMode !== \"product\") {\n              queries.push(\n                fetch(\n                  \"\"\n                    .concat(window.routes.searchUrl, \"?view=ajax&q=\")\n                    .concat(\n                      encodeURIComponent(this.lastInputValue),\n                      \"&options[prefix]=last&type=\"\n                    )\n                    .concat(window.theme.searchMode.replace(\"product,\", \"\")),\n                  queryOptions\n                )\n              );\n            }\n\n            Promise.all(queries).then(function (responses) {\n              // If we receive the result for a query that is not the last one, we simply do not process the result\n              if (_this.lastInputValue !== currentInput) {\n                return;\n              }\n\n              Promise.all(\n                responses.map(function (response) {\n                  return response.text();\n                })\n              ).then(function (contents) {\n                _this.searchBarElement.classList.remove(\"is-loading\");\n\n                var searchContent = document.createElement(\"div\");\n                searchContent.innerHTML = contents.join(\"\").trim(); // If there is a \"view all\" button, we move it at the end of the results\n\n                var viewAll = searchContent.querySelector(\n                  \".search-bar__view-all\"\n                );\n\n                if (viewAll) {\n                  searchContent.insertAdjacentElement(\"beforeend\", viewAll);\n                }\n\n                _this.searchBarElement.querySelector(\n                  \".search-bar__results-inner\"\n                ).innerHTML = searchContent.innerHTML;\n              });\n            });\n          }\n        },\n        /**\n         * Warehouse allows to display a filter by type. When its value change, we re-do a new search to get the new data\n         */\n      },\n      {\n        key: \"_productTypeChanged\",\n        value: function _productTypeChanged(event, target) {\n          target\n            .closest(\".search-bar__filter\")\n            .querySelector(\".search-bar__filter-active\").innerText =\n            target.options[target.selectedIndex].innerText;\n          this.productTypeFilter = target.value;\n\n          if (this.inputElement.value !== \"\") {\n            this._doSearch();\n          }\n        },\n        /**\n         * Called when the form is submitted using the Enter key. We have to capture it and transform the query to include the wildcard\n         */\n      },\n      {\n        key: \"_onFormSubmit\",\n        value: function _onFormSubmit(event) {\n          // To prevent for the value to temporarily shows the \"*\", we clone the input as a hidden field\n          var cloneNode = this.inputElement.cloneNode();\n          cloneNode.setAttribute(\"type\", \"hidden\");\n          cloneNode.value = \"\";\n\n          if (this.productTypeFilter !== \"\") {\n            cloneNode.value += \"product_type:\".concat(this.productTypeFilter);\n\n            if (this.inputElement.value !== \"\") {\n              cloneNode.value += \" AND \";\n            }\n          }\n\n          cloneNode.value += this.inputElement.value; // We remove the \"q\" attribute on existing node so it's not submitted\n\n          this.inputElement.removeAttribute(\"name\"); // And we insert it into the DOM\n\n          this.inputElement.insertAdjacentElement(\"afterend\", cloneNode);\n        },\n        /**\n         * Simple function that allows to debounce\n         */\n      },\n      {\n        key: \"_debounce\",\n        value: function _debounce(fn, delay) {\n          var _this2 = this;\n\n          var timer = null;\n          return function () {\n            for (\n              var _len = arguments.length, args = new Array(_len), _key = 0;\n              _key < _len;\n              _key++\n            ) {\n              args[_key] = arguments[_key];\n            }\n\n            clearTimeout(timer);\n            timer = setTimeout(function () {\n              fn.apply(_this2, args);\n            }, delay);\n          };\n        },\n      },\n    ]);\n\n    return SearchBar;\n  })();\n\n  var HeaderSection = /*#__PURE__*/ (function () {\n    function HeaderSection(element) {\n      _classCallCheck(this, HeaderSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(\n        this.element.getAttribute(\"data-section-settings\")\n      );\n     \n      this.searchBar = new SearchBar(\n        this.element.querySelector(\".header__search-bar-wrapper\")\n      );\n              \n      this.cart = new Cart(\n        this.element.querySelector(\".header__action-item--cart\"),\n        {\n          useStickyHeader: this.options[\"useStickyHeader\"],\n        }\n      ); // We create the desktop and mobile navigation conditionally as we've found that some merchants may have no menu\n\n      var desktopNavigationElement = this.element.querySelector(\n        this.options[\"navigationLayout\"] === \"inline\"\n          ? \".nav-bar\"\n          : \".header__desktop-nav\"\n      );\n\n      if (desktopNavigationElement) {\n        this.desktopNavigation = new DesktopNavigation(\n          desktopNavigationElement,\n          this.options[\"navigationLayout\"],\n          this.options[\"desktopOpenTrigger\"]\n        );\n      }\n\n      var mobileNavigationElement = this.element.querySelector(\n        \".header__mobile-nav\"\n      );\n\n      if (mobileNavigationElement) {\n        this.mobileNavigation = new MobileNavigation(mobileNavigationElement);\n      }\n\n      this._setupCssVariables();\n\n      this._attachListeners();\n    }\n\n    _createClass(HeaderSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          this.searchBar.destroy();\n          this.cart.destroy();\n\n          if (this.desktopNavigation) {\n            this.desktopNavigation.destroy();\n          }\n\n          if (this.mobileNavigation) {\n            this.mobileNavigation.destroy();\n          }\n\n          window.removeEventListener(\"resize\", this._setupCssVariablesListener);\n        },\n      },\n      {\n        key: \"onBlockSelect\",\n        value: function onBlockSelect(event) {\n          if (this.desktopNavigation) {\n            this.desktopNavigation.onBlockSelect(event);\n          }\n        },\n      },\n      {\n        key: \"onBlockDeselect\",\n        value: function onBlockDeselect(event) {\n          if (this.desktopNavigation) {\n            this.desktopNavigation.onBlockDeselect(event);\n          }\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this._setupCssVariablesListener = this._setupCssVariables.bind(this);\n          window.addEventListener(\"resize\", this._setupCssVariablesListener);\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"toggle-search\"]',\n            this._toggleMobileSearch.bind(this)\n          );\n        },\n        /**\n         * We have some positioning that is based on the CSS variables, so we must make sure to update them whenever\n         * the section is reloaded into the editor\n         */\n      },\n      {\n        key: \"_setupCssVariables\",\n        value: function _setupCssVariables() {\n          document.documentElement.style.setProperty(\n            \"--header-height\",\n            this.element.parentNode.clientHeight + \"px\"\n          );\n        },\n        /**\n         * Toggle the mobile search\n         */\n      },\n      {\n        key: \"_toggleMobileSearch\",\n        value: function _toggleMobileSearch(event) {\n          this.searchBar.toggleMobileSearch();\n          event.preventDefault();\n        },\n      },\n    ]);\n\n    return HeaderSection;\n  })();\n\n  var LoginSection = /*#__PURE__*/ (function () {\n    function LoginSection(element) {\n      _classCallCheck(this, LoginSection);\n\n      this.element = element;\n      this.domDelegate = new Delegate(this.element);\n      this.customerLoginForm = this.element.querySelector(\"#customer_login\");\n      this.recoverPasswordForm = this.element.querySelector(\n        \"#recover_customer_password\"\n      );\n      this.domDelegate.on(\n        \"click\",\n        '[data-action=\"toggle-login-form\"]',\n        this._showRecoverPassword.bind(this)\n      );\n    }\n\n    _createClass(LoginSection, [\n      {\n        key: \"_showRecoverPassword\",\n        value: function _showRecoverPassword() {\n          var isLoginActive = this.customerLoginForm.style.display === \"block\";\n\n          if (isLoginActive) {\n            this.customerLoginForm.style.display = \"none\";\n            this.recoverPasswordForm.style.display = \"block\";\n          } else {\n            this.customerLoginForm.style.display = \"block\";\n            this.recoverPasswordForm.style.display = \"none\";\n          }\n        },\n      },\n    ]);\n\n    return LoginSection;\n  })();\n\n  var MapSection = /*#__PURE__*/ (function () {\n    function MapSection(element) {\n      _classCallCheck(this, MapSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(element.getAttribute(\"data-section-settings\"));\n      this.mapPositions = [];\n      this.desktopMarkers = [];\n      this.desktopMapElement = null;\n      this.mobileMarkers = [];\n      this.mobileMapElements = [];\n\n      if (this.options[\"apiKey\"] && this.options[\"mapAddresses\"].length > 0) {\n        this._loadScript().then(this._initMaps.bind(this));\n      }\n\n      this._attachListeners();\n    }\n\n    _createClass(MapSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          this.delegateElement.off(\"click\");\n\n          if (\n            this.options[\"apiKey\"] &&\n            this.options[\"mapAddresses\"].length > 0\n          ) {\n            google.maps.event.clearInstanceListeners(window);\n          }\n        },\n      },\n      {\n        key: \"onBlockSelect\",\n        value: function onBlockSelect(event) {\n          this._showStore(event.target);\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          var _this = this;\n\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"toggle-store\"]',\n            function (event, target) {\n              _this._showStore(target.closest(\".map__store-item\"));\n            }\n          );\n        },\n      },\n      {\n        key: \"_showStore\",\n        value: function _showStore(storeItem) {\n          var _this2 = this;\n\n          var toggleButton = storeItem.querySelector(\n            '[data-action=\"toggle-store\"]'\n          ); // If already open, we do nothing unless we are on mobile (as we need at least one store visible on desktop)\n\n          if (\n            Responsive.getCurrentBreakpoint() !== \"phone\" &&\n            toggleButton.getAttribute(\"aria-expanded\") === \"true\"\n          ) {\n            return;\n          } // Otherwise, we activate it\n\n          if (toggleButton.getAttribute(\"aria-expanded\") === \"true\") {\n            toggleButton.setAttribute(\"aria-expanded\", \"false\");\n            Animation.slideUp(\n              storeItem.querySelector(\".map__store-collapsible\")\n            );\n          } else {\n            toggleButton.setAttribute(\"aria-expanded\", \"true\");\n            Animation.slideDown(\n              storeItem.querySelector(\".map__store-collapsible\")\n            );\n          } // Finally, we close the other ones (if any is open)\n\n          Dom.getSiblings(storeItem).forEach(function (storeItemToClose) {\n            storeItemToClose\n              .querySelector('[data-action=\"toggle-store\"]')\n              .setAttribute(\"aria-expanded\", \"false\");\n            Animation.slideUp(\n              storeItemToClose.querySelector(\".map__store-collapsible\")\n            );\n          }); // We need to move the map to the new center, and we need to change its color to make it active\n\n          var storeIndex = parseInt(storeItem.getAttribute(\"data-store-index\"));\n          this.desktopMapElement.panTo(this.mapPositions[storeIndex]);\n          this.desktopMarkers.forEach(function (marker, index) {\n            marker.setMap(_this2.desktopMapElement);\n\n            if (index === storeIndex) {\n              marker.icon.fillColor = _this2.options[\"markerActiveColor\"];\n            } else {\n              marker.icon.fillColor = _this2.options[\"markerColor\"];\n            }\n          });\n        },\n      },\n      {\n        key: \"_loadScript\",\n        value: function _loadScript() {\n          var _this3 = this;\n\n          return new Promise(function (resolve, reject) {\n            var script = document.createElement(\"script\");\n            document.body.appendChild(script);\n            script.onload = resolve;\n            script.onerror = reject;\n            script.async = true;\n            script.src = \"https://maps.googleapis.com/maps/api/js?key=\".concat(\n              _this3.options[\"apiKey\"]\n            );\n          });\n        },\n      },\n      {\n        key: \"_initMaps\",\n        value: function _initMaps() {\n          var _this4 = this;\n\n          // First, we gather all the maps (desktop and mobile)\n          var mapOptions = {\n            zoom: this.options[\"zoom\"],\n            draggable: this.options[\"draggableMap\"],\n            clickableIcons: false,\n            scrollwheel: this.options[\"draggableMap\"],\n            disableDoubleClickZoom: true,\n            disableDefaultUI: !this.options[\"showMapControls\"],\n            styles: JSON.parse(\n              this.element.querySelector(\"[data-gmap-style]\").innerHTML\n            ),\n          };\n          this.desktopMapElement = new google.maps.Map(\n            this.element.querySelector(\n              \".map__map-container--desktop .map__gmap\"\n            ),\n            mapOptions\n          );\n          this.mobileMapElements = [];\n          this.element\n            .querySelectorAll(\".map__map-container--mobile .map__gmap\")\n            .forEach(function (item, index) {\n              _this4.mobileMapElements[index] = new google.maps.Map(\n                item,\n                mapOptions\n              );\n            }); // Then we geocode all addresses\n\n          this._geocodeAddresses(); // Make sure we attach the listeners so that it's properly resized\n\n          google.maps.event.addDomListener(window, \"resize\", function () {\n            var desktopCenter = _this4.desktopMapElement.getCenter();\n\n            google.maps.event.trigger(_this4.desktopMapElement, \"resize\");\n\n            _this4.desktopMapElement.setCenter(desktopCenter);\n\n            _this4.mobileMapElements.forEach(function (mobileMap) {\n              var mobileCenter = mobileMap.getCenter();\n              google.maps.event.trigger(mobileMap, \"resize\");\n              mobileMap.setCenter(mobileCenter);\n            });\n          });\n        },\n      },\n      {\n        key: \"_onMarkerClicked\",\n        value: function _onMarkerClicked(address) {\n          window.open(\n            \"https://www.google.com/maps/search/?api=1&query=\".concat(address),\n            \"_blank\",\n            \"noopener noreferrer\"\n          );\n        },\n      },\n      {\n        key: \"_geocodeAddresses\",\n        value: function _geocodeAddresses() {\n          var _this5 = this;\n\n          // Then, we geocode all the addresses, and place them on the map\n          var geocoder = new google.maps.Geocoder();\n          this.options[\"mapAddresses\"].forEach(function (address, index) {\n            geocoder.geocode(\n              {\n                address: address,\n              },\n              function (results, status) {\n                if (status !== google.maps.GeocoderStatus.OK) {\n                  if (Shopify.designMode);\n                } else {\n                  var position = results[0].geometry.location;\n                  _this5.mapPositions[index] = position; // The desktop map holds all the markers, so we add it to the desktop global map.\n\n                  _this5.desktopMarkers[index] = new google.maps.Marker({\n                    map: index === 0 ? _this5.desktopMapElement : null,\n                    position: position,\n                    icon: {\n                      path: \"M12.5,0 C6.388889,0 0,4.7304348 0,12.5217391 C0,19.8956522 11.111111,31.1652174 11.527778,31.5826087 C11.805556,31.8608696 12.083333,32 12.5,32 C12.916667,32 13.194444,31.8608696 13.472222,31.5826087 C13.888889,31.1652174 25,19.8956522 25,12.5217391 C25,4.7304348 18.611111,0 12.5,0 Z M12,16 C9.733333,16 8,14.2666667 8,12 C8,9.7333333 9.733333,8 12,8 C14.266667,8 16,9.7333333 16,12 C16,14.2666667 14.266667,16 12,16 Z\",\n                      fillColor:\n                        index === 0\n                          ? _this5.options[\"markerActiveColor\"]\n                          : _this5.options[\"markerColor\"],\n                      fillOpacity: 1,\n                      anchor: new google.maps.Point(12, 30),\n                      strokeWeight: 0,\n                    },\n                  }); // We then add it on the corresponding mobile map\n\n                  _this5.mobileMarkers[index] = new google.maps.Marker({\n                    map: _this5.mobileMapElements[index],\n                    position: position,\n                    icon: {\n                      path: \"M12.5,0 C6.388889,0 0,4.7304348 0,12.5217391 C0,19.8956522 11.111111,31.1652174 11.527778,31.5826087 C11.805556,31.8608696 12.083333,32 12.5,32 C12.916667,32 13.194444,31.8608696 13.472222,31.5826087 C13.888889,31.1652174 25,19.8956522 25,12.5217391 C25,4.7304348 18.611111,0 12.5,0 Z M12,16 C9.733333,16 8,14.2666667 8,12 C8,9.7333333 9.733333,8 12,8 C14.266667,8 16,9.7333333 16,12 C16,14.2666667 14.266667,16 12,16 Z\",\n                      fillColor: _this5.options[\"markerActiveColor\"],\n                      fillOpacity: 1,\n                      anchor: new google.maps.Point(12, 30),\n                      strokeWeight: 0,\n                    },\n                  });\n\n                  _this5.desktopMarkers[index].addListener(\n                    \"click\",\n                    _this5._onMarkerClicked.bind(_this5, address)\n                  );\n\n                  _this5.mobileMarkers[index].addListener(\n                    \"click\",\n                    _this5._onMarkerClicked.bind(_this5, address)\n                  );\n\n                  if (index === 0) {\n                    _this5.desktopMapElement.setCenter(position);\n                  }\n\n                  _this5.mobileMapElements[index].setCenter(position);\n                }\n              }\n            );\n          });\n        },\n      },\n    ]);\n\n    return MapSection;\n  })();\n\n  var MinimalHeaderSection = /*#__PURE__*/ (function () {\n    function MinimalHeaderSection(element) {\n      _classCallCheck(this, MinimalHeaderSection);\n\n      this.element = element;\n\n      this._setupCssVariables();\n\n      this._attachListeners();\n    }\n\n    _createClass(MinimalHeaderSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          window.removeEventListener(\"resize\", this._setupCssVariablesListener);\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this._setupCssVariablesListener = this._setupCssVariables.bind(this);\n          window.addEventListener(\"resize\", this._setupCssVariablesListener);\n        },\n        /**\n         * We have some positioning that is based on the CSS variables, so we must make sure to update them whenever\n         * the section is reloaded into the editor\n         */\n      },\n      {\n        key: \"_setupCssVariables\",\n        value: function _setupCssVariables() {\n          document.documentElement.style.setProperty(\n            \"--header-height\",\n            this.element.parentNode.clientHeight + \"px\"\n          );\n        },\n      },\n    ]);\n\n    return MinimalHeaderSection;\n  })();\n\n  var QuickLinksSection = function QuickLinksSection(element) {\n    _classCallCheck(this, QuickLinksSection);\n\n    this.element = element; // Make sure that the section is always visible in the editor, even if the option to hide it on desktop is checked\n\n    if (Shopify.designMode) {\n      this.element.classList.remove(\"hidden-lap-and-up\");\n    }\n  };\n\n  /**\n   * This class handles both the newsletter popup and exit popup\n   */\n\n  var PopupsSection = /*#__PURE__*/ (function () {\n    function PopupsSection(element) {\n      var _this = this;\n\n      _classCallCheck(this, PopupsSection);\n\n      element.querySelectorAll(\"[data-popup-type]\").forEach(function (popup) {\n        if (popup.getAttribute(\"data-popup-type\") === \"exit\") {\n          _this.exitPopup = new ExitPopup(popup);\n        } else if (popup.getAttribute(\"data-popup-type\") === \"newsletter\") {\n          _this.newsletterPopup = new NewsletterPopup(popup);\n        }\n      });\n    }\n\n    _createClass(PopupsSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          if (this.exitPopup) {\n            this.exitPopup.destroy();\n          }\n\n          if (this.newsletterPopup) {\n            this.newsletterPopup.destroy();\n          }\n        },\n      },\n      {\n        key: \"onBlockSelect\",\n        value: function onBlockSelect(event) {\n          if (\n            event.target.getAttribute(\"data-popup-type\") === \"exit\" &&\n            this.exitPopup\n          ) {\n            this.exitPopup._openPopup();\n          } else if (\n            event.target.getAttribute(\"data-popup-type\") === \"newsletter\" &&\n            this.newsletterPopup\n          ) {\n            this.newsletterPopup._openPopup();\n          }\n        },\n      },\n      {\n        key: \"onBlockDeselect\",\n        value: function onBlockDeselect() {\n          if (this.exitPopup) {\n            this.exitPopup._closePopup();\n          }\n\n          if (this.newsletterPopup) {\n            this.newsletterPopup._closePopup();\n          }\n        },\n      },\n    ]);\n\n    return PopupsSection;\n  })();\n\n  var ProductRecommendationsSection = /*#__PURE__*/ (function () {\n    function ProductRecommendationsSection(element) {\n      _classCallCheck(this, ProductRecommendationsSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(\n        this.element.getAttribute(\"data-section-settings\")\n      );\n\n      if (this.options[\"useRecommendations\"]) {\n        this._loadRecommendations().then(this._createSlideshow.bind(this));\n      } else {\n        this._createSlideshow();\n      }\n\n      this.productItemColorSwatch = new ProductItemColorSwatch(this.element);\n\n      this._fixSafari();\n\n      this._attachListeners();\n    }\n\n    _createClass(ProductRecommendationsSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          if (!this.options[\"stackable\"]) {\n            this.flickityInstance.destroy();\n          }\n\n          window.removeEventListener(\"resize\", this._fixSafariListener);\n          this.delegateElement.off(\"change\");\n          this.productItemColorSwatch.destroy();\n\n          if (this.resizeObserver) {\n            this.resizeObserver.disconnect();\n          }\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this._fixSafariListener = this._fixSafari.bind(this);\n          window.addEventListener(\"resize\", this._fixSafariListener);\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"add-to-cart\"]',\n            this._addToCart.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-secondary-action=\"open-quick-view\"]',\n            this._openQuickView.bind(this)\n          );\n        },\n        /**\n         * On Safari 11.1 and lower, the browser incorrectly calculate the height of flex and grid items due to a bug\n         * on how padding percentage is calculated (that we use for allocating image space). This is solved in Safari 11.1 and higher.\n         *\n         * For those browsers, we fix that in JavaScript by setting the height directly for each aspect ratio image\n         *\n         * @private\n         */\n      },\n      {\n        key: \"_fixSafari\",\n        value: function _fixSafari() {\n          var userAgent = window.navigator.userAgent.toLowerCase();\n\n          if (\n            userAgent.includes(\"safari\") &&\n            (userAgent.includes(\"version/10.1\") ||\n              userAgent.includes(\"version/10.3\") ||\n              userAgent.includes(\"version/11.0\"))\n          ) {\n            var isPhone = Responsive.matchesBreakpoint(\"phone\");\n            this.element\n              .querySelectorAll(\n                \".product-item__image-wrapper .aspect-ratio, .product-item__image-wrapper .placeholder-svg\"\n              )\n              .forEach(function (image) {\n                if (isPhone) {\n                  image.parentNode.style.height = null;\n                } else {\n                  image.parentNode.style.height = \"\".concat(\n                    image.clientHeight,\n                    \"px\"\n                  );\n                }\n              });\n          }\n        },\n        /**\n         * This section uses the native product recommendations feature of Shopify (https://help.shopify.com/en/themes/liquid/objects/recommendations)\n         */\n      },\n      {\n        key: \"_loadRecommendations\",\n        value: function _loadRecommendations() {\n          var _this = this;\n\n          var url = \"\"\n            .concat(\n              window.routes.productRecommendationsUrl,\n              \"?section_id=product-recommendations&product_id=\"\n            )\n            .concat(this.options[\"productId\"], \"&limit=\")\n            .concat(this.options[\"recommendationsCount\"]);\n          return fetch(url).then(function (response) {\n            return response.text().then(function (content) {\n              var container = document.createElement(\"div\");\n              container.innerHTML = content;\n              _this.element.querySelector(\n                \".product-recommendations\"\n              ).innerHTML = container.querySelector(\n                \".product-recommendations\"\n              ).innerHTML;\n\n              _this.productItemColorSwatch.recalculateSwatches();\n            });\n          });\n        },\n      },\n      {\n        key: \"_createSlideshow\",\n        value: function _createSlideshow() {\n          var _this2 = this;\n\n          if (!this.options[\"stackable\"]) {\n            this.flickityInstance = new js(\n              this.element.querySelector(\".product-list\"),\n              {\n                watchCSS: true,\n                pageDots: false,\n                prevNextButtons: true,\n                contain: true,\n                groupCells: true,\n                cellAlign: \"left\",\n                draggable: !window.matchMedia(\n                  \"(-moz-touch-enabled: 0), (hover: hover)\"\n                ).matches,\n              }\n            );\n          }\n\n          if (window.SPR) {\n            window.SPR.initDomEls();\n            window.SPR.loadBadges();\n          } // If the browser supports ResizeObserver we use it to detect when the size of the items in the carousel change,\n          // and if that's the case we force Flickity to resize\n\n          if (window.ResizeObserver && this.flickityInstance) {\n            this.resizeObserver = new ResizeObserver(function () {\n              _this2.flickityInstance.resize();\n            });\n            this.element\n              .querySelectorAll(\".product-item\")\n              .forEach(function (item) {\n                _this2.resizeObserver.observe(item);\n              });\n          }\n        },\n      },\n      {\n        key: \"_openQuickView\",\n        value: function _openQuickView(event, target) {\n          var productUrl = new URL(\n            \"\"\n              .concat(window.location.origin)\n              .concat(target.getAttribute(\"data-product-url\"))\n          ); // If we are on mobile or tablet, we redirect to product page directly\n\n          if (\n            Responsive.matchesBreakpoint(\"phone\") ||\n            Responsive.matchesBreakpoint(\"tablet\")\n          ) {\n            window.location.href = productUrl.href;\n            return false;\n          }\n\n          var modal = document.getElementById(\n            target.getAttribute(\"aria-controls\")\n          );\n          modal.classList.add(\"is-loading\");\n          productUrl.searchParams.set(\"view\", \"quick-view\");\n          fetch(productUrl.href, {\n            credentials: \"same-origin\",\n            method: \"GET\",\n          }).then(function (response) {\n            response.text().then(function (content) {\n              modal.querySelector(\".modal__inner\").innerHTML = content;\n              modal.classList.remove(\"is-loading\"); // Register a new section to power the JS\n\n              var modalProductSection = new ProductSection(\n                modal.querySelector('[data-section-type=\"product\"]')\n              ); // We set a listener so we can cleanup on close\n\n              var doCleanUp = function doCleanUp() {\n                modalProductSection.onUnload();\n                modal.removeEventListener(\"modal:closed\", doCleanUp);\n              };\n\n              modal.addEventListener(\"modal:closed\", doCleanUp);\n            });\n          });\n        },\n        /**\n         * ---------------------------------------------------------------------------------------------------\n         * INTERNAL CODE THAT HANDLE PRODUCT ADD TO CART\n         * ---------------------------------------------------------------------------------------------------\n         */\n      },\n      {\n        key: \"_addToCart\",\n        value: function _addToCart(event, target) {\n          var _this3 = this;\n\n          if (window.theme.cartType === \"page\") {\n            return; // When using a cart type of page, we just simply redirect to the cart page\n          }\n\n          event.preventDefault(); // Prevent form to be submitted\n\n          event.stopPropagation(); // First, we switch the status of the button\n\n          target.setAttribute(\"disabled\", \"disabled\");\n          document.dispatchEvent(new CustomEvent(\"theme:loading:start\")); // Then we add the product in Ajax\n\n          \n$('.quantity-selector__value').attr('data-current-value',$(\"#Quantity-product-template\").val());      \n$('.header__cart-count').text($(\"#Quantity-product-template\").val());      \n\n          \n          var formElement = target.closest('form[action*=\"/cart/add\"]');\n          fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n            body: JSON.stringify(Form.serialize(formElement)),\n            credentials: \"same-origin\",\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": \"application/json\",\n              \"X-Requested-With\": \"XMLHttpRequest\", // This is needed as currently there is a bug in Shopify that assumes this header\n            },\n          }).then(function (response) {\n            target.removeAttribute(\"disabled\");\n\n            if (response.ok) {\n              // We simply trigger an event so the mini-cart can re-render\n              _this3.element.dispatchEvent(\n                new CustomEvent(\"product:added\", {\n                  bubbles: true,\n                  detail: {\n                    button: target,\n                    variant: null,\n                    quantity: parseInt(\n                      formElement.querySelector('[name=\"quantity\"]').value\n                    ),\n                  },\n                })\n              );\n            } else {\n              document.dispatchEvent(new CustomEvent(\"theme:loading:end\"));\n            }\n          });\n          event.preventDefault();\n        },\n      },\n    ]);\n\n    return ProductRecommendationsSection;\n  })();\n\n  var RecentlyViewedProductsSection = /*#__PURE__*/ (function () {\n    function RecentlyViewedProductsSection(element) {\n      _classCallCheck(this, RecentlyViewedProductsSection);\n\n      this.element = element;\n      this.delegateElement = new Delegate(this.element);\n      this.options = JSON.parse(\n        this.element.getAttribute(\"data-section-settings\")\n      );\n\n      if (this.options[\"currentProductId\"]) {\n        this._saveCurrentProduct();\n      }\n\n      this.productItemColorSwatch = new ProductItemColorSwatch(this.element);\n\n      this._fetchProducts();\n\n      this._attachListeners();\n    }\n\n    _createClass(RecentlyViewedProductsSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          if (this.flickityInstance) {\n            this.flickityInstance.destroy();\n          }\n\n          this.productItemColorSwatch.destroy();\n\n          if (this.resizeObserver) {\n            this.resizeObserver.disconnect();\n          }\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.delegateElement.on(\n            \"click\",\n            '[data-action=\"add-to-cart\"]',\n            this._addToCart.bind(this)\n          );\n          this.delegateElement.on(\n            \"click\",\n            '[data-secondary-action=\"open-quick-view\"]',\n            this._openQuickView.bind(this)\n          );\n        },\n        /**\n         * When we are on a product page, we need to save the current product ID into local storage\n         */\n      },\n      {\n        key: \"_saveCurrentProduct\",\n        value: function _saveCurrentProduct() {\n          var items = JSON.parse(\n              localStorage.getItem(\"recentlyViewedProducts\") || \"[]\"\n            ),\n            currentProductId = this.options[\"currentProductId\"]; // We check if the current product already exists, and if it does not, we add it at the start\n\n          if (!items.includes(currentProductId)) {\n            items.unshift(currentProductId);\n          } // Then, we save the current product into the local storage, by keeping only the 18 most recent\n\n          try {\n            localStorage.setItem(\n              \"recentlyViewedProducts\",\n              JSON.stringify(items.slice(0, 18))\n            );\n          } catch (error) {\n            // Do nothing, this may happen in Safari in incognito mode\n          }\n        },\n        /**\n         * In order to get the products to display, we hit the search template with the given IDs.\n         */\n      },\n      {\n        key: \"_fetchProducts\",\n        value: function _fetchProducts() {\n          var _this = this;\n\n          var queryString = this._getSearchQueryString();\n\n          if (queryString === \"\") {\n            return;\n          }\n\n          var template =\n            window.theme.pageType === \"index\"\n              ? \"recently-viewed-products\"\n              : \"static-recently-viewed-products\";\n          fetch(\n            \"\"\n              .concat(window.routes.searchUrl, \"?view=\")\n              .concat(template, \"&type=product&q=\")\n              .concat(queryString),\n            {\n              credentials: \"same-origin\",\n              method: \"GET\",\n            }\n          ).then(function (response) {\n            response.text().then(function (content) {\n              var tempElement = document.createElement(\"div\");\n              tempElement.innerHTML = content; // Set the content\n\n              _this.element.querySelector(\n                \".recently-viewed-products-placeholder\"\n              ).innerHTML = tempElement.querySelector(\n                '[data-section-type=\"recently-viewed-products\"] .recently-viewed-products-placeholder'\n              ).innerHTML; // By default the section hide the products, so we force the section to be visible\n\n              _this.element.parentNode.style.display = \"block\";\n\n              _this.productItemColorSwatch.recalculateSwatches();\n\n              if (window.SPR) {\n                window.SPR.initDomEls();\n                window.SPR.loadBadges();\n              } // Create the slideshow\n\n              _this.flickityInstance = new js(\n                _this.element.querySelector(\".product-list\"),\n                {\n                  watchCSS: true,\n                  pageDots: false,\n                  prevNextButtons: true,\n                  contain: true,\n                  groupCells: true,\n                  cellAlign: \"left\",\n                  draggable: !window.matchMedia(\n                    \"(-moz-touch-enabled: 0), (hover: hover)\"\n                  ).matches,\n                }\n              ); // If the browser supports ResizeObserver we use it to detect when the size of the items in the carousel change,\n              // and if that's the case we force Flickity to resize\n\n              if (window.ResizeObserver && _this.flickityInstance) {\n                _this.resizeObserver = new ResizeObserver(function () {\n                  _this.flickityInstance.resize();\n                });\n\n                _this.element\n                  .querySelectorAll(\".product-item\")\n                  .forEach(function (item) {\n                    _this.resizeObserver.observe(item);\n                  });\n              }\n            });\n          });\n        },\n      },\n      {\n        key: \"_getSearchQueryString\",\n        value: function _getSearchQueryString() {\n          var items = JSON.parse(\n            localStorage.getItem(\"recentlyViewedProducts\") || \"[]\"\n          ); // If we are on a product template, we make sure to remove the main product from the related product\n\n          if (items.includes(this.options[\"currentProductId\"])) {\n            items.splice(items.indexOf(this.options[\"currentProductId\"]), 1);\n          }\n\n          return items\n            .map(function (item) {\n              return \"id:\" + item;\n            })\n            .join(\" OR \");\n        },\n      },\n      {\n        key: \"_openQuickView\",\n        value: function _openQuickView(event, target) {\n          var productUrl = new URL(\n            \"\"\n              .concat(window.location.origin)\n              .concat(target.getAttribute(\"data-product-url\"))\n          ); // If we are on mobile or tablet, we redirect to product page directly\n\n          if (\n            Responsive.matchesBreakpoint(\"phone\") ||\n            Responsive.matchesBreakpoint(\"tablet\")\n          ) {\n            window.location.href = productUrl.href;\n            return false;\n          }\n\n          var modal = document.getElementById(\n            target.getAttribute(\"aria-controls\")\n          );\n          modal.classList.add(\"is-loading\");\n          productUrl.searchParams.set(\"view\", \"quick-view\");\n          fetch(productUrl.href, {\n            credentials: \"same-origin\",\n            method: \"GET\",\n          }).then(function (response) {\n            response.text().then(function (content) {\n              modal.querySelector(\".modal__inner\").innerHTML = content;\n              modal.classList.remove(\"is-loading\"); // Register a new section to power the JS\n\n              var modalProductSection = new ProductSection(\n                modal.querySelector('[data-section-type=\"product\"]')\n              ); // We set a listener so we can cleanup on close\n\n              var doCleanUp = function doCleanUp() {\n                modalProductSection.onUnload();\n                modal.removeEventListener(\"modal:closed\", doCleanUp);\n              };\n\n              modal.addEventListener(\"modal:closed\", doCleanUp);\n            });\n          });\n        },\n        /**\n         * ---------------------------------------------------------------------------------------------------\n         * INTERNAL CODE THAT HANDLE PRODUCT ADD TO CART\n         * ---------------------------------------------------------------------------------------------------\n         */\n      },\n      {\n        key: \"_addToCart\",\n        value: function _addToCart(event, target) {\n          var _this2 = this;\n\n          if (window.theme.cartType === \"page\") {\n            return; // When using a cart type of page, we just simply redirect to the cart page\n          }\n\n          event.preventDefault(); // Prevent form to be submitted\n\n          event.stopPropagation(); // First, we switch the status of the button\n\n          target.setAttribute(\"disabled\", \"disabled\");\n          document.dispatchEvent(new CustomEvent(\"theme:loading:start\")); // Then we add the product in Ajax\n\n          \n          var formElement = target.closest('form[action*=\"/cart/add\"]');\n          fetch(\"\".concat(window.routes.cartAddUrl, \".js\"), {\n            body: JSON.stringify(Form.serialize(formElement)),\n            credentials: \"same-origin\",\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": \"application/json\",\n              \"X-Requested-With\": \"XMLHttpRequest\", // This is needed as currently there is a bug in Shopify that assumes this header\n            },\n          }).then(function (response) {\n            target.removeAttribute(\"disabled\");\n\n            if (response.ok) {\n              // We simply trigger an event so the mini-cart can re-render\n              _this2.element.dispatchEvent(\n                new CustomEvent(\"product:added\", {\n                  bubbles: true,\n                  detail: {\n                    button: target,\n                    variant: null,\n                    quantity: parseInt(\n                      formElement.querySelector('[name=\"quantity\"]').value\n                    ),\n                  },\n                })\n              );\n            } else {\n              document.dispatchEvent(new CustomEvent(\"theme:loading:end\"));\n            }\n          });\n          event.preventDefault();\n        },\n      },\n    ]);\n\n    return RecentlyViewedProductsSection;\n  })();\n\n  /**\n   * This code is extracted from Slate\n   */\n  var SectionContainer = /*#__PURE__*/ (function () {\n    function SectionContainer() {\n      _classCallCheck(this, SectionContainer);\n\n      this.constructors = [];\n      this.instances = [];\n\n      this._attachListeners();\n    }\n\n    _createClass(SectionContainer, [\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          document.addEventListener(\n            \"shopify:section:load\",\n            this._onSectionLoad.bind(this)\n          );\n          document.addEventListener(\n            \"shopify:section:unload\",\n            this._onSectionUnload.bind(this)\n          );\n          document.addEventListener(\n            \"shopify:section:select\",\n            this._onSelect.bind(this)\n          );\n          document.addEventListener(\n            \"shopify:section:deselect\",\n            this._onDeselect.bind(this)\n          );\n          document.addEventListener(\n            \"shopify:section:reorder\",\n            this._onReorder.bind(this)\n          );\n          document.addEventListener(\n            \"shopify:block:select\",\n            this._onBlockSelect.bind(this)\n          );\n          document.addEventListener(\n            \"shopify:block:deselect\",\n            this._onBlockDeselect.bind(this)\n          );\n        },\n      },\n      {\n        key: \"register\",\n        value: function register(type, constructor) {\n          var _this = this;\n\n          this.constructors[type] = constructor;\n          document\n            .querySelectorAll(\"[data-section-type=\".concat(type, \"]\"))\n            .forEach(function (container) {\n              _this._createInstance(container, constructor);\n            });\n        },\n        /**\n         * Return an object from an array of objects that matches the provided key and value\n         */\n      },\n      {\n        key: \"_findInstance\",\n        value: function _findInstance(array, key, value) {\n          for (var i = 0; i < array.length; i++) {\n            if (array[i][key] === value) {\n              return array[i];\n            }\n          }\n        },\n        /**\n         * Remove an object from an array of objects by matching the provided key and value\n         */\n      },\n      {\n        key: \"_removeInstance\",\n        value: function _removeInstance(array, key, value) {\n          var i = array.length;\n\n          while (i--) {\n            if (array[i][key] === value) {\n              array.splice(i, 1);\n              break;\n            }\n          }\n\n          return array;\n        },\n      },\n      {\n        key: \"_onSectionLoad\",\n        value: function _onSectionLoad(event) {\n          var container = event.target.querySelector(\"[data-section-id]\");\n\n          if (container) {\n            this._createInstance(container);\n          }\n        },\n      },\n      {\n        key: \"_onSectionUnload\",\n        value: function _onSectionUnload(event) {\n          var instance = this._findInstance(\n            this.instances,\n            \"id\",\n            event.detail.sectionId\n          );\n\n          if (!instance) {\n            return;\n          }\n\n          if (typeof instance.onUnload === \"function\") {\n            instance.onUnload(event);\n          }\n\n          this.instances = this._removeInstance(\n            this.instances,\n            \"id\",\n            event.detail.sectionId\n          );\n        },\n      },\n      {\n        key: \"_onSelect\",\n        value: function _onSelect(event) {\n          var instance = this._findInstance(\n            this.instances,\n            \"id\",\n            event.detail.sectionId\n          );\n\n          if (instance && typeof instance.onSelect === \"function\") {\n            instance.onSelect(event);\n          }\n        },\n      },\n      {\n        key: \"_onDeselect\",\n        value: function _onDeselect(event) {\n          var instance = this._findInstance(\n            this.instances,\n            \"id\",\n            event.detail.sectionId\n          );\n\n          if (instance && typeof instance.onDeselect === \"function\") {\n            instance.onDeselect(event);\n          }\n        },\n      },\n      {\n        key: \"_onReorder\",\n        value: function _onReorder(event) {\n          var instance = this._findInstance(\n            this.instances,\n            \"id\",\n            event.detail.sectionId\n          );\n\n          if (instance && typeof instance.onReorder === \"function\") {\n            instance.onReorder(event);\n          }\n        },\n      },\n      {\n        key: \"_onBlockSelect\",\n        value: function _onBlockSelect(event) {\n          var instance = this._findInstance(\n            this.instances,\n            \"id\",\n            event.detail.sectionId\n          );\n\n          if (instance && typeof instance.onBlockSelect === \"function\") {\n            instance.onBlockSelect(event);\n          }\n        },\n      },\n      {\n        key: \"_onBlockDeselect\",\n        value: function _onBlockDeselect(event) {\n          var instance = this._findInstance(\n            this.instances,\n            \"id\",\n            event.detail.sectionId\n          );\n\n          if (instance && typeof instance.onBlockDeselect === \"function\") {\n            instance.onBlockDeselect(event);\n          }\n        },\n      },\n      {\n        key: \"_createInstance\",\n        value: function _createInstance(container, constructor) {\n          var id = container.getAttribute(\"data-section-id\"),\n            type = container.getAttribute(\"data-section-type\");\n          constructor = constructor || this.constructors[type];\n\n          if (typeof constructor === \"undefined\") {\n            return;\n          }\n\n          try {\n            var instance = Object.assign(new constructor(container), {\n              id: id,\n              type: type,\n              container: container,\n            });\n            this.instances.push(instance);\n          } catch (exception) {\n            console.error(\n              \"Logged exception (this may happen if you have tried to edit the code without properly adjusting the JavaScript): \" +\n                exception.message\n            );\n          }\n        },\n      },\n    ]);\n\n    return SectionContainer;\n  })();\n\n  var SlideshowSection = /*#__PURE__*/ (function () {\n    function SlideshowSection(element) {\n      _classCallCheck(this, SlideshowSection);\n\n      this.element = element;\n      this.options = JSON.parse(\n        this.element.getAttribute(\"data-section-settings\")\n      );\n      this.flickityInstance = new flickityFade(\n        element.querySelector(\".slideshow\"),\n        {\n          pageDots: this.options[\"pageDots\"],\n          prevNextButtons: this.options[\"prevNextButtons\"],\n          wrapAround: true,\n          dragThreshold: 12,\n          draggable: \">1\",\n          fade: this.options[\"transitionEffect\"] === \"fade\",\n          setGallerySize: this.options[\"setGallerySize\"],\n          adaptiveHeight: this.options[\"adaptiveHeight\"],\n          autoPlay: this.options[\"autoPlay\"]\n            ? this.options[\"cycleSpeed\"]\n            : false,\n        }\n      );\n    }\n\n    _createClass(SlideshowSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          this.flickityInstance.destroy();\n        },\n      },\n      {\n        key: \"onBlockSelect\",\n        value: function onBlockSelect(event) {\n          if (this.flickityInstance.isActive) {\n            this.flickityInstance.selectCell(\n              parseInt(event.target.getAttribute(\"data-block-index\")),\n              false,\n              event.detail.load\n            );\n            this.flickityInstance.pausePlayer();\n          }\n        },\n      },\n      {\n        key: \"onBlockDeselect\",\n        value: function onBlockDeselect() {\n          if (this.flickityInstance.isActive) {\n            this.flickityInstance.unpausePlayer();\n          }\n        },\n      },\n    ]);\n\n    return SlideshowSection;\n  })();\n\n  var TextWithIconsSection = /*#__PURE__*/ (function () {\n    function TextWithIconsSection(element) {\n      _classCallCheck(this, TextWithIconsSection);\n\n      this.flickityInstance = new js(\n        element.querySelector(\".text-with-icons\"),\n        {\n          pageDots: true,\n          prevNextButtons: false,\n          wrapAround: true,\n          autoPlay: 5000,\n          watchCSS: true,\n        }\n      );\n    }\n\n    _createClass(TextWithIconsSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          this.flickityInstance.destroy();\n        },\n      },\n      {\n        key: \"onBlockSelect\",\n        value: function onBlockSelect(event) {\n          if (this.flickityInstance.isActive) {\n            this.flickityInstance.selectCell(\n              parseInt(event.target.getAttribute(\"data-block-index\")),\n              false,\n              event.detail.load\n            );\n            this.flickityInstance.pausePlayer();\n          }\n        },\n      },\n      {\n        key: \"onBlockDeselect\",\n        value: function onBlockDeselect() {\n          if (this.flickityInstance.isActive) {\n            this.flickityInstance.unpausePlayer();\n          }\n        },\n      },\n    ]);\n\n    return TextWithIconsSection;\n  })();\n\n  var VideoSection = /*#__PURE__*/ (function () {\n    function VideoSection(element) {\n      _classCallCheck(this, VideoSection);\n\n      this.element = element;\n      this.domDelegate = new Delegate(this.element);\n      this.options = JSON.parse(\n        this.element.getAttribute(\"data-section-settings\")\n      );\n\n      this._attachListeners();\n    }\n\n    _createClass(VideoSection, [\n      {\n        key: \"onUnload\",\n        value: function onUnload() {\n          this.domDelegate.off(\"click\");\n        },\n      },\n      {\n        key: \"_attachListeners\",\n        value: function _attachListeners() {\n          this.domDelegate.on(\n            \"click\",\n            '[data-action=\"play-video\"]',\n            this._playVideo.bind(this)\n          );\n        },\n      },\n      {\n        key: \"_playVideo\",\n        value: function _playVideo(event, target) {\n          // To start the video, we simply replace the iframe source\n          var iframe = target.querySelector(\"iframe\");\n          iframe.src = iframe.getAttribute(\"data-src\");\n          target.classList.add(\"is-playing\");\n        },\n      },\n    ]);\n\n    return VideoSection;\n  })();\n\n  var smoothscroll = createCommonjsModule(function (module, exports) {\n    /* smoothscroll v0.4.4 - 2019 - Dustan Kasten, Jeremias Menichelli - MIT License */\n    (function () {\n      function polyfill() {\n        // aliases\n        var w = window;\n        var d = document; // return if scroll behavior is supported and polyfill is not forced\n\n        if (\n          \"scrollBehavior\" in d.documentElement.style &&\n          w.__forceSmoothScrollPolyfill__ !== true\n        ) {\n          return;\n        } // globals\n\n        var Element = w.HTMLElement || w.Element;\n        var SCROLL_TIME = 468; // object gathering original scroll methods\n\n        var original = {\n          scroll: w.scroll || w.scrollTo,\n          scrollBy: w.scrollBy,\n          elementScroll: Element.prototype.scroll || scrollElement,\n          scrollIntoView: Element.prototype.scrollIntoView,\n        }; // define timing method\n\n        var now =\n          w.performance && w.performance.now\n            ? w.performance.now.bind(w.performance)\n            : Date.now;\n        /**\n         * indicates if a the current browser is made by Microsoft\n         * @method isMicrosoftBrowser\n         * @param {String} userAgent\n         * @returns {Boolean}\n         */\n\n        function isMicrosoftBrowser(userAgent) {\n          var userAgentPatterns = [\"MSIE \", \"Trident/\", \"Edge/\"];\n          return new RegExp(userAgentPatterns.join(\"|\")).test(userAgent);\n        }\n        /*\n         * IE has rounding bug rounding down clientHeight and clientWidth and\n         * rounding up scrollHeight and scrollWidth causing false positives\n         * on hasScrollableSpace\n         */\n\n        var ROUNDING_TOLERANCE = isMicrosoftBrowser(w.navigator.userAgent)\n          ? 1\n          : 0;\n        /**\n         * changes scroll position inside an element\n         * @method scrollElement\n         * @param {Number} x\n         * @param {Number} y\n         * @returns {undefined}\n         */\n\n        function scrollElement(x, y) {\n          this.scrollLeft = x;\n          this.scrollTop = y;\n        }\n        /**\n         * returns result of applying ease math function to a number\n         * @method ease\n         * @param {Number} k\n         * @returns {Number}\n         */\n\n        function ease(k) {\n          return 0.5 * (1 - Math.cos(Math.PI * k));\n        }\n        /**\n         * indicates if a smooth behavior should be applied\n         * @method shouldBailOut\n         * @param {Number|Object} firstArg\n         * @returns {Boolean}\n         */\n\n        function shouldBailOut(firstArg) {\n          if (\n            firstArg === null ||\n            _typeof(firstArg) !== \"object\" ||\n            firstArg.behavior === undefined ||\n            firstArg.behavior === \"auto\" ||\n            firstArg.behavior === \"instant\"\n          ) {\n            // first argument is not an object/null\n            // or behavior is auto, instant or undefined\n            return true;\n          }\n\n          if (\n            _typeof(firstArg) === \"object\" &&\n            firstArg.behavior === \"smooth\"\n          ) {\n            // first argument is an object and behavior is smooth\n            return false;\n          } // throw error when behavior is not supported\n\n          throw new TypeError(\n            \"behavior member of ScrollOptions \" +\n              firstArg.behavior +\n              \" is not a valid value for enumeration ScrollBehavior.\"\n          );\n        }\n        /**\n         * indicates if an element has scrollable space in the provided axis\n         * @method hasScrollableSpace\n         * @param {Node} el\n         * @param {String} axis\n         * @returns {Boolean}\n         */\n\n        function hasScrollableSpace(el, axis) {\n          if (axis === \"Y\") {\n            return el.clientHeight + ROUNDING_TOLERANCE < el.scrollHeight;\n          }\n\n          if (axis === \"X\") {\n            return el.clientWidth + ROUNDING_TOLERANCE < el.scrollWidth;\n          }\n        }\n        /**\n         * indicates if an element has a scrollable overflow property in the axis\n         * @method canOverflow\n         * @param {Node} el\n         * @param {String} axis\n         * @returns {Boolean}\n         */\n\n        function canOverflow(el, axis) {\n          var overflowValue = w.getComputedStyle(el, null)[\"overflow\" + axis];\n          return overflowValue === \"auto\" || overflowValue === \"scroll\";\n        }\n        /**\n         * indicates if an element can be scrolled in either axis\n         * @method isScrollable\n         * @param {Node} el\n         * @param {String} axis\n         * @returns {Boolean}\n         */\n\n        function isScrollable(el) {\n          var isScrollableY =\n            hasScrollableSpace(el, \"Y\") && canOverflow(el, \"Y\");\n          var isScrollableX =\n            hasScrollableSpace(el, \"X\") && canOverflow(el, \"X\");\n          return isScrollableY || isScrollableX;\n        }\n        /**\n         * finds scrollable parent of an element\n         * @method findScrollableParent\n         * @param {Node} el\n         * @returns {Node} el\n         */\n\n        function findScrollableParent(el) {\n          while (el !== d.body && isScrollable(el) === false) {\n            el = el.parentNode || el.host;\n          }\n\n          return el;\n        }\n        /**\n         * self invoked function that, given a context, steps through scrolling\n         * @method step\n         * @param {Object} context\n         * @returns {undefined}\n         */\n\n        function step(context) {\n          var time = now();\n          var value;\n          var currentX;\n          var currentY;\n          var elapsed = (time - context.startTime) / SCROLL_TIME; // avoid elapsed times higher than one\n\n          elapsed = elapsed > 1 ? 1 : elapsed; // apply easing to elapsed time\n\n          value = ease(elapsed);\n          currentX = context.startX + (context.x - context.startX) * value;\n          currentY = context.startY + (context.y - context.startY) * value;\n          context.method.call(context.scrollable, currentX, currentY); // scroll more if we have not reached our destination\n\n          if (currentX !== context.x || currentY !== context.y) {\n            w.requestAnimationFrame(step.bind(w, context));\n          }\n        }\n        /**\n         * scrolls window or element with a smooth behavior\n         * @method smoothScroll\n         * @param {Object|Node} el\n         * @param {Number} x\n         * @param {Number} y\n         * @returns {undefined}\n         */\n\n        function smoothScroll(el, x, y) {\n          var scrollable;\n          var startX;\n          var startY;\n          var method;\n          var startTime = now(); // define scroll context\n\n          if (el === d.body) {\n            scrollable = w;\n            startX = w.scrollX || w.pageXOffset;\n            startY = w.scrollY || w.pageYOffset;\n            method = original.scroll;\n          } else {\n            scrollable = el;\n            startX = el.scrollLeft;\n            startY = el.scrollTop;\n            method = scrollElement;\n          } // scroll looping over a frame\n\n          step({\n            scrollable: scrollable,\n            method: method,\n            startTime: startTime,\n            startX: startX,\n            startY: startY,\n            x: x,\n            y: y,\n          });\n        } // ORIGINAL METHODS OVERRIDES\n        // w.scroll and w.scrollTo\n\n        w.scroll = w.scrollTo = function () {\n          // avoid action when no arguments are passed\n          if (arguments[0] === undefined) {\n            return;\n          } // avoid smooth behavior if not required\n\n          if (shouldBailOut(arguments[0]) === true) {\n            original.scroll.call(\n              w,\n              arguments[0].left !== undefined\n                ? arguments[0].left\n                : _typeof(arguments[0]) !== \"object\"\n                ? arguments[0]\n                : w.scrollX || w.pageXOffset, // use top prop, second argument if present or fallback to scrollY\n              arguments[0].top !== undefined\n                ? arguments[0].top\n                : arguments[1] !== undefined\n                ? arguments[1]\n                : w.scrollY || w.pageYOffset\n            );\n            return;\n          } // LET THE SMOOTHNESS BEGIN!\n\n          smoothScroll.call(\n            w,\n            d.body,\n            arguments[0].left !== undefined\n              ? ~~arguments[0].left\n              : w.scrollX || w.pageXOffset,\n            arguments[0].top !== undefined\n              ? ~~arguments[0].top\n              : w.scrollY || w.pageYOffset\n          );\n        }; // w.scrollBy\n\n        w.scrollBy = function () {\n          // avoid action when no arguments are passed\n          if (arguments[0] === undefined) {\n            return;\n          } // avoid smooth behavior if not required\n\n          if (shouldBailOut(arguments[0])) {\n            original.scrollBy.call(\n              w,\n              arguments[0].left !== undefined\n                ? arguments[0].left\n                : _typeof(arguments[0]) !== \"object\"\n                ? arguments[0]\n                : 0,\n              arguments[0].top !== undefined\n                ? arguments[0].top\n                : arguments[1] !== undefined\n                ? arguments[1]\n                : 0\n            );\n            return;\n          } // LET THE SMOOTHNESS BEGIN!\n\n          smoothScroll.call(\n            w,\n            d.body,\n            ~~arguments[0].left + (w.scrollX || w.pageXOffset),\n            ~~arguments[0].top + (w.scrollY || w.pageYOffset)\n          );\n        }; // Element.prototype.scroll and Element.prototype.scrollTo\n\n        Element.prototype.scroll = Element.prototype.scrollTo = function () {\n          // avoid action when no arguments are passed\n          if (arguments[0] === undefined) {\n            return;\n          } // avoid smooth behavior if not required\n\n          if (shouldBailOut(arguments[0]) === true) {\n            // if one number is passed, throw error to match Firefox implementation\n            if (\n              typeof arguments[0] === \"number\" &&\n              arguments[1] === undefined\n            ) {\n              throw new SyntaxError(\"Value could not be converted\");\n            }\n\n            original.elementScroll.call(\n              this, // use left prop, first number argument or fallback to scrollLeft\n              arguments[0].left !== undefined\n                ? ~~arguments[0].left\n                : _typeof(arguments[0]) !== \"object\"\n                ? ~~arguments[0]\n                : this.scrollLeft, // use top prop, second argument or fallback to scrollTop\n              arguments[0].top !== undefined\n                ? ~~arguments[0].top\n                : arguments[1] !== undefined\n                ? ~~arguments[1]\n                : this.scrollTop\n            );\n            return;\n          }\n\n          var left = arguments[0].left;\n          var top = arguments[0].top; // LET THE SMOOTHNESS BEGIN!\n\n          smoothScroll.call(\n            this,\n            this,\n            typeof left === \"undefined\" ? this.scrollLeft : ~~left,\n            typeof top === \"undefined\" ? this.scrollTop : ~~top\n          );\n        }; // Element.prototype.scrollBy\n\n        Element.prototype.scrollBy = function () {\n          // avoid action when no arguments are passed\n          if (arguments[0] === undefined) {\n            return;\n          } // avoid smooth behavior if not required\n\n          if (shouldBailOut(arguments[0]) === true) {\n            original.elementScroll.call(\n              this,\n              arguments[0].left !== undefined\n                ? ~~arguments[0].left + this.scrollLeft\n                : ~~arguments[0] + this.scrollLeft,\n              arguments[0].top !== undefined\n                ? ~~arguments[0].top + this.scrollTop\n                : ~~arguments[1] + this.scrollTop\n            );\n            return;\n          }\n\n          this.scroll({\n            left: ~~arguments[0].left + this.scrollLeft,\n            top: ~~arguments[0].top + this.scrollTop,\n            behavior: arguments[0].behavior,\n          });\n        }; // Element.prototype.scrollIntoView\n\n        Element.prototype.scrollIntoView = function () {\n          // avoid smooth behavior if not required\n          if (shouldBailOut(arguments[0]) === true) {\n            original.scrollIntoView.call(\n              this,\n              arguments[0] === undefined ? true : arguments[0]\n            );\n            return;\n          } // LET THE SMOOTHNESS BEGIN!\n\n          var scrollableParent = findScrollableParent(this);\n          var parentRects = scrollableParent.getBoundingClientRect();\n          var clientRects = this.getBoundingClientRect();\n\n          if (scrollableParent !== d.body) {\n            // reveal element inside parent\n            smoothScroll.call(\n              this,\n              scrollableParent,\n              scrollableParent.scrollLeft + clientRects.left - parentRects.left,\n              scrollableParent.scrollTop + clientRects.top - parentRects.top\n            ); // reveal parent in viewport unless is fixed\n\n            if (w.getComputedStyle(scrollableParent).position !== \"fixed\") {\n              w.scrollBy({\n                left: parentRects.left,\n                top: parentRects.top,\n                behavior: \"smooth\",\n              });\n            }\n          } else {\n            // reveal element in viewport\n            w.scrollBy({\n              left: clientRects.left,\n              top: clientRects.top,\n              behavior: \"smooth\",\n            });\n          }\n        };\n      }\n\n      {\n        // commonjs\n        module.exports = {\n          polyfill: polyfill,\n        };\n      }\n    })();\n  });\n\n  /*! instant.page v5.1.0 - (C) 2019-2020 Alexandre Dieulot - https://instant.page/license */\n  var mouseoverTimer;\n  var lastTouchTimestamp;\n  var prefetches = new Set();\n  var prefetchElement = document.createElement(\"link\");\n  var isSupported =\n    prefetchElement.relList &&\n    prefetchElement.relList.supports &&\n    prefetchElement.relList.supports(\"prefetch\") &&\n    window.IntersectionObserver &&\n    \"isIntersecting\" in IntersectionObserverEntry.prototype;\n  var allowQueryString = \"instantAllowQueryString\" in document.body.dataset;\n  var allowExternalLinks = \"instantAllowExternalLinks\" in document.body.dataset;\n  var useWhitelist = \"instantWhitelist\" in document.body.dataset;\n  var mousedownShortcut = \"instantMousedownShortcut\" in document.body.dataset;\n  var DELAY_TO_NOT_BE_CONSIDERED_A_TOUCH_INITIATED_ACTION = 1111;\n  var delayOnHover = 65;\n  var useMousedown = false;\n  var useMousedownOnly = false;\n  var useViewport = false;\n\n  if (\"instantIntensity\" in document.body.dataset) {\n    var intensity = document.body.dataset.instantIntensity;\n\n    if (intensity.substr(0, \"mousedown\".length) == \"mousedown\") {\n      useMousedown = true;\n\n      if (intensity == \"mousedown-only\") {\n        useMousedownOnly = true;\n      }\n    } else if (intensity.substr(0, \"viewport\".length) == \"viewport\") {\n      if (\n        !(\n          navigator.connection &&\n          (navigator.connection.saveData ||\n            (navigator.connection.effectiveType &&\n              navigator.connection.effectiveType.includes(\"2g\")))\n        )\n      ) {\n        if (intensity == \"viewport\") {\n          /* Biggest iPhone resolution (which we want): 414 \u00D7 896 = 370944\n           * Small 7\" tablet resolution (which we don\u2019t want): 600 \u00D7 1024 = 614400\n           * Note that the viewport (which we check here) is smaller than the resolution due to the UI\u2019s chrome */\n          if (\n            document.documentElement.clientWidth *\n              document.documentElement.clientHeight <\n            450000\n          ) {\n            useViewport = true;\n          }\n        } else if (intensity == \"viewport-all\") {\n          useViewport = true;\n        }\n      }\n    } else {\n      var milliseconds = parseInt(intensity);\n\n      if (!isNaN(milliseconds)) {\n        delayOnHover = milliseconds;\n      }\n    }\n  }\n\n  if (isSupported) {\n    var eventListenersOptions = {\n      capture: true,\n      passive: true,\n    };\n\n    if (!useMousedownOnly) {\n      document.addEventListener(\n        \"touchstart\",\n        touchstartListener,\n        eventListenersOptions\n      );\n    }\n\n    if (!useMousedown) {\n      document.addEventListener(\n        \"mouseover\",\n        mouseoverListener,\n        eventListenersOptions\n      );\n    } else if (!mousedownShortcut) {\n      document.addEventListener(\n        \"mousedown\",\n        mousedownListener,\n        eventListenersOptions\n      );\n    }\n\n    if (mousedownShortcut) {\n      document.addEventListener(\n        \"mousedown\",\n        mousedownShortcutListener,\n        eventListenersOptions\n      );\n    }\n\n    if (useViewport) {\n      var triggeringFunction;\n\n      if (window.requestIdleCallback) {\n        triggeringFunction = function triggeringFunction(callback) {\n          requestIdleCallback(callback, {\n            timeout: 1500,\n          });\n        };\n      } else {\n        triggeringFunction = function triggeringFunction(callback) {\n          callback();\n        };\n      }\n\n      triggeringFunction(function () {\n        var intersectionObserver = new IntersectionObserver(function (entries) {\n          entries.forEach(function (entry) {\n            if (entry.isIntersecting) {\n              var linkElement = entry.target;\n              intersectionObserver.unobserve(linkElement);\n              preload(linkElement.href);\n            }\n          });\n        });\n        document.querySelectorAll(\"a\").forEach(function (linkElement) {\n          if (isPreloadable(linkElement)) {\n            intersectionObserver.observe(linkElement);\n          }\n        });\n      });\n    }\n  }\n\n  function touchstartListener(event) {\n    /* Chrome on Android calls mouseover before touchcancel so `lastTouchTimestamp`\n     * must be assigned on touchstart to be measured on mouseover. */\n    lastTouchTimestamp = performance.now();\n    var linkElement = event.target.closest(\"a\");\n\n    if (!isPreloadable(linkElement)) {\n      return;\n    }\n\n    preload(linkElement.href);\n  }\n\n  function mouseoverListener(event) {\n    if (\n      performance.now() - lastTouchTimestamp <\n      DELAY_TO_NOT_BE_CONSIDERED_A_TOUCH_INITIATED_ACTION\n    ) {\n      return;\n    }\n\n    var linkElement = event.target.closest(\"a\");\n\n    if (!isPreloadable(linkElement)) {\n      return;\n    }\n\n    linkElement.addEventListener(\"mouseout\", mouseoutListener, {\n      passive: true,\n    });\n    mouseoverTimer = setTimeout(function () {\n      preload(linkElement.href);\n      mouseoverTimer = undefined;\n    }, delayOnHover);\n  }\n\n  function mousedownListener(event) {\n    var linkElement = event.target.closest(\"a\");\n\n    if (!isPreloadable(linkElement)) {\n      return;\n    }\n\n    preload(linkElement.href);\n  }\n\n  function mouseoutListener(event) {\n    if (\n      event.relatedTarget &&\n      event.target.closest(\"a\") == event.relatedTarget.closest(\"a\")\n    ) {\n      return;\n    }\n\n    if (mouseoverTimer) {\n      clearTimeout(mouseoverTimer);\n      mouseoverTimer = undefined;\n    }\n  }\n\n  function mousedownShortcutListener(event) {\n    if (\n      performance.now() - lastTouchTimestamp <\n      DELAY_TO_NOT_BE_CONSIDERED_A_TOUCH_INITIATED_ACTION\n    ) {\n      return;\n    }\n\n    var linkElement = event.target.closest(\"a\");\n\n    if (event.which > 1 || event.metaKey || event.ctrlKey) {\n      return;\n    }\n\n    if (!linkElement) {\n      return;\n    }\n\n    linkElement.addEventListener(\n      \"click\",\n      function (event) {\n        if (event.detail == 1337) {\n          return;\n        }\n\n        event.preventDefault();\n      },\n      {\n        capture: true,\n        passive: false,\n        once: true,\n      }\n    );\n    var customEvent = new MouseEvent(\"click\", {\n      view: window,\n      bubbles: true,\n      cancelable: false,\n      detail: 1337,\n    });\n    linkElement.dispatchEvent(customEvent);\n  }\n\n  function isPreloadable(linkElement) {\n    if (!linkElement || !linkElement.href) {\n      return;\n    }\n\n    if (useWhitelist && !(\"instant\" in linkElement.dataset)) {\n      return;\n    }\n\n    if (\n      !allowExternalLinks &&\n      linkElement.origin != location.origin &&\n      !(\"instant\" in linkElement.dataset)\n    ) {\n      return;\n    }\n\n    if (![\"http:\", \"https:\"].includes(linkElement.protocol)) {\n      return;\n    }\n\n    if (linkElement.protocol == \"http:\" && location.protocol == \"https:\") {\n      return;\n    }\n\n    if (\n      !allowQueryString &&\n      linkElement.search &&\n      !(\"instant\" in linkElement.dataset)\n    ) {\n      return;\n    }\n\n    if (\n      linkElement.hash &&\n      linkElement.pathname + linkElement.search ==\n        location.pathname + location.search\n    ) {\n      return;\n    }\n\n    if (\"noInstant\" in linkElement.dataset) {\n      return;\n    }\n\n    return true;\n  }\n\n  function preload(url) {\n    if (prefetches.has(url)) {\n      return;\n    }\n\n    var prefetcher = document.createElement(\"link\");\n    prefetcher.rel = \"prefetch\";\n    prefetcher.href = url;\n    document.head.appendChild(prefetcher);\n    prefetches.add(url);\n  }\n\n  var lazysizes = createCommonjsModule(function (module) {\n    (function (window, factory) {\n      var lazySizes = factory(window, window.document, Date);\n      window.lazySizes = lazySizes;\n\n      if (module.exports) {\n        module.exports = lazySizes;\n      }\n    })(\n      typeof window != \"undefined\" ? window : {},\n      function l(window, document, Date) {\n        /*jshint eqnull:true */\n\n        var lazysizes, lazySizesCfg;\n\n        (function () {\n          var prop;\n          var lazySizesDefaults = {\n            lazyClass: \"lazyload\",\n            loadedClass: \"lazyloaded\",\n            loadingClass: \"lazyloading\",\n            preloadClass: \"lazypreload\",\n            errorClass: \"lazyerror\",\n            //strictClass: 'lazystrict',\n            autosizesClass: \"lazyautosizes\",\n            srcAttr: \"data-src\",\n            srcsetAttr: \"data-srcset\",\n            sizesAttr: \"data-sizes\",\n            //preloadAfterLoad: false,\n            minSize: 40,\n            customMedia: {},\n            init: true,\n            expFactor: 1.5,\n            hFac: 0.8,\n            loadMode: 2,\n            loadHidden: true,\n            ricTimeout: 0,\n            throttleDelay: 125,\n          };\n          lazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {};\n\n          for (prop in lazySizesDefaults) {\n            if (!(prop in lazySizesCfg)) {\n              lazySizesCfg[prop] = lazySizesDefaults[prop];\n            }\n          }\n        })();\n\n        if (!document || !document.getElementsByClassName) {\n          return {\n            init: function init() {},\n            cfg: lazySizesCfg,\n            noSupport: true,\n          };\n        }\n\n        var docElem = document.documentElement;\n        var supportPicture = window.HTMLPictureElement;\n        var _addEventListener = \"addEventListener\";\n        var _getAttribute = \"getAttribute\";\n        /**\n         * Update to bind to window because 'this' becomes null during SSR\n         * builds.\n         */\n\n        var addEventListener = window[_addEventListener].bind(window);\n\n        var setTimeout = window.setTimeout;\n        var requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n        var requestIdleCallback = window.requestIdleCallback;\n        var regPicture = /^picture$/i;\n        var loadEvents = [\"load\", \"error\", \"lazyincluded\", \"_lazyloaded\"];\n        var regClassCache = {};\n        var forEach = Array.prototype.forEach;\n\n        var hasClass = function hasClass(ele, cls) {\n          if (!regClassCache[cls]) {\n            regClassCache[cls] = new RegExp(\"(\\\\s|^)\" + cls + \"(\\\\s|$)\");\n          }\n\n          return (\n            regClassCache[cls].test(ele[_getAttribute](\"class\") || \"\") &&\n            regClassCache[cls]\n          );\n        };\n\n        var addClass = function addClass(ele, cls) {\n          if (!hasClass(ele, cls)) {\n            ele.setAttribute(\n              \"class\",\n              (ele[_getAttribute](\"class\") || \"\").trim() + \" \" + cls\n            );\n          }\n        };\n\n        var removeClass = function removeClass(ele, cls) {\n          var reg;\n\n          if ((reg = hasClass(ele, cls))) {\n            ele.setAttribute(\n              \"class\",\n              (ele[_getAttribute](\"class\") || \"\").replace(reg, \" \")\n            );\n          }\n        };\n\n        var addRemoveLoadEvents = function addRemoveLoadEvents(dom, fn, add) {\n          var action = add ? _addEventListener : \"removeEventListener\";\n\n          if (add) {\n            addRemoveLoadEvents(dom, fn);\n          }\n\n          loadEvents.forEach(function (evt) {\n            dom[action](evt, fn);\n          });\n        };\n\n        var triggerEvent = function triggerEvent(\n          elem,\n          name,\n          detail,\n          noBubbles,\n          noCancelable\n        ) {\n          var event = document.createEvent(\"Event\");\n\n          if (!detail) {\n            detail = {};\n          }\n\n          detail.instance = lazysizes;\n          event.initEvent(name, !noBubbles, !noCancelable);\n          event.detail = detail;\n          elem.dispatchEvent(event);\n          return event;\n        };\n\n        var updatePolyfill = function updatePolyfill(el, full) {\n          var polyfill;\n\n          if (\n            !supportPicture &&\n            (polyfill = window.picturefill || lazySizesCfg.pf)\n          ) {\n            if (full && full.src && !el[_getAttribute](\"srcset\")) {\n              el.setAttribute(\"srcset\", full.src);\n            }\n\n            polyfill({\n              reevaluate: true,\n              elements: [el],\n            });\n          } else if (full && full.src) {\n            el.src = full.src;\n          }\n        };\n\n        var getCSS = function getCSS(elem, style) {\n          return (getComputedStyle(elem, null) || {})[style];\n        };\n\n        var getWidth = function getWidth(elem, parent, width) {\n          width = width || elem.offsetWidth;\n\n          while (\n            width < lazySizesCfg.minSize &&\n            parent &&\n            !elem._lazysizesWidth\n          ) {\n            width = parent.offsetWidth;\n            parent = parent.parentNode;\n          }\n\n          return width;\n        };\n\n        var rAF = (function () {\n          var running, waiting;\n          var firstFns = [];\n          var secondFns = [];\n          var fns = firstFns;\n\n          var run = function run() {\n            var runFns = fns;\n            fns = firstFns.length ? secondFns : firstFns;\n            running = true;\n            waiting = false;\n\n            while (runFns.length) {\n              runFns.shift()();\n            }\n\n            running = false;\n          };\n\n          var rafBatch = function rafBatch(fn, queue) {\n            if (running && !queue) {\n              fn.apply(this, arguments);\n            } else {\n              fns.push(fn);\n\n              if (!waiting) {\n                waiting = true;\n                (document.hidden ? setTimeout : requestAnimationFrame)(run);\n              }\n            }\n          };\n\n          rafBatch._lsFlush = run;\n          return rafBatch;\n        })();\n\n        var rAFIt = function rAFIt(fn, simple) {\n          return simple\n            ? function () {\n                rAF(fn);\n              }\n            : function () {\n                var that = this;\n                var args = arguments;\n                rAF(function () {\n                  fn.apply(that, args);\n                });\n              };\n        };\n\n        var throttle = function throttle(fn) {\n          var running;\n          var lastTime = 0;\n          var gDelay = lazySizesCfg.throttleDelay;\n          var rICTimeout = lazySizesCfg.ricTimeout;\n\n          var run = function run() {\n            running = false;\n            lastTime = Date.now();\n            fn();\n          };\n\n          var idleCallback =\n            requestIdleCallback && rICTimeout > 49\n              ? function () {\n                  requestIdleCallback(run, {\n                    timeout: rICTimeout,\n                  });\n\n                  if (rICTimeout !== lazySizesCfg.ricTimeout) {\n                    rICTimeout = lazySizesCfg.ricTimeout;\n                  }\n                }\n              : rAFIt(function () {\n                  setTimeout(run);\n                }, true);\n          return function (isPriority) {\n            var delay;\n\n            if ((isPriority = isPriority === true)) {\n              rICTimeout = 33;\n            }\n\n            if (running) {\n              return;\n            }\n\n            running = true;\n            delay = gDelay - (Date.now() - lastTime);\n\n            if (delay < 0) {\n              delay = 0;\n            }\n\n            if (isPriority || delay < 9) {\n              idleCallback();\n            } else {\n              setTimeout(idleCallback, delay);\n            }\n          };\n        }; //based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html\n\n        var debounce = function debounce(func) {\n          var timeout, timestamp;\n          var wait = 99;\n\n          var run = function run() {\n            timeout = null;\n            func();\n          };\n\n          var later = function later() {\n            var last = Date.now() - timestamp;\n\n            if (last < wait) {\n              setTimeout(later, wait - last);\n            } else {\n              (requestIdleCallback || run)(run);\n            }\n          };\n\n          return function () {\n            timestamp = Date.now();\n\n            if (!timeout) {\n              timeout = setTimeout(later, wait);\n            }\n          };\n        };\n\n        var loader = (function () {\n          var preloadElems,\n            isCompleted,\n            resetPreloadingTimer,\n            loadMode,\n            started;\n          var eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;\n          var regImg = /^img$/i;\n          var regIframe = /^iframe$/i;\n          var supportScroll =\n            \"onscroll\" in window && !/(gle|ing)bot/.test(navigator.userAgent);\n          var shrinkExpand = 0;\n          var currentExpand = 0;\n          var isLoading = 0;\n          var lowRuns = -1;\n\n          var resetPreloading = function resetPreloading(e) {\n            isLoading--;\n\n            if (!e || isLoading < 0 || !e.target) {\n              isLoading = 0;\n            }\n          };\n\n          var isVisible = function isVisible(elem) {\n            if (isBodyHidden == null) {\n              isBodyHidden = getCSS(document.body, \"visibility\") == \"hidden\";\n            }\n\n            return (\n              isBodyHidden ||\n              !(\n                getCSS(elem.parentNode, \"visibility\") == \"hidden\" &&\n                getCSS(elem, \"visibility\") == \"hidden\"\n              )\n            );\n          };\n\n          var isNestedVisible = function isNestedVisible(elem, elemExpand) {\n            var outerRect;\n            var parent = elem;\n            var visible = isVisible(elem);\n            eLtop -= elemExpand;\n            eLbottom += elemExpand;\n            eLleft -= elemExpand;\n            eLright += elemExpand;\n\n            while (\n              visible &&\n              (parent = parent.offsetParent) &&\n              parent != document.body &&\n              parent != docElem\n            ) {\n              visible = (getCSS(parent, \"opacity\") || 1) > 0;\n\n              if (visible && getCSS(parent, \"overflow\") != \"visible\") {\n                outerRect = parent.getBoundingClientRect();\n                visible =\n                  eLright > outerRect.left &&\n                  eLleft < outerRect.right &&\n                  eLbottom > outerRect.top - 1 &&\n                  eLtop < outerRect.bottom + 1;\n              }\n            }\n\n            return visible;\n          };\n\n          var checkElements = function checkElements() {\n            var eLlen,\n              i,\n              rect,\n              autoLoadElem,\n              loadedSomething,\n              elemExpand,\n              elemNegativeExpand,\n              elemExpandVal,\n              beforeExpandVal,\n              defaultExpand,\n              preloadExpand,\n              hFac;\n            var lazyloadElems = lazysizes.elements;\n\n            if (\n              (loadMode = lazySizesCfg.loadMode) &&\n              isLoading < 8 &&\n              (eLlen = lazyloadElems.length)\n            ) {\n              i = 0;\n              lowRuns++;\n\n              for (; i < eLlen; i++) {\n                if (!lazyloadElems[i] || lazyloadElems[i]._lazyRace) {\n                  continue;\n                }\n\n                if (\n                  !supportScroll ||\n                  (lazysizes.prematureUnveil &&\n                    lazysizes.prematureUnveil(lazyloadElems[i]))\n                ) {\n                  unveilElement(lazyloadElems[i]);\n                  continue;\n                }\n\n                if (\n                  !(elemExpandVal =\n                    lazyloadElems[i][_getAttribute](\"data-expand\")) ||\n                  !(elemExpand = elemExpandVal * 1)\n                ) {\n                  elemExpand = currentExpand;\n                }\n\n                if (!defaultExpand) {\n                  defaultExpand =\n                    !lazySizesCfg.expand || lazySizesCfg.expand < 1\n                      ? docElem.clientHeight > 500 && docElem.clientWidth > 500\n                        ? 500\n                        : 370\n                      : lazySizesCfg.expand;\n                  lazysizes._defEx = defaultExpand;\n                  preloadExpand = defaultExpand * lazySizesCfg.expFactor;\n                  hFac = lazySizesCfg.hFac;\n                  isBodyHidden = null;\n\n                  if (\n                    currentExpand < preloadExpand &&\n                    isLoading < 1 &&\n                    lowRuns > 2 &&\n                    loadMode > 2 &&\n                    !document.hidden\n                  ) {\n                    currentExpand = preloadExpand;\n                    lowRuns = 0;\n                  } else if (loadMode > 1 && lowRuns > 1 && isLoading < 6) {\n                    currentExpand = defaultExpand;\n                  } else {\n                    currentExpand = shrinkExpand;\n                  }\n                }\n\n                if (beforeExpandVal !== elemExpand) {\n                  eLvW = innerWidth + elemExpand * hFac;\n                  elvH = innerHeight + elemExpand;\n                  elemNegativeExpand = elemExpand * -1;\n                  beforeExpandVal = elemExpand;\n                }\n\n                rect = lazyloadElems[i].getBoundingClientRect();\n\n                if (\n                  (eLbottom = rect.bottom) >= elemNegativeExpand &&\n                  (eLtop = rect.top) <= elvH &&\n                  (eLright = rect.right) >= elemNegativeExpand * hFac &&\n                  (eLleft = rect.left) <= eLvW &&\n                  (eLbottom || eLright || eLleft || eLtop) &&\n                  (lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) &&\n                  ((isCompleted &&\n                    isLoading < 3 &&\n                    !elemExpandVal &&\n                    (loadMode < 3 || lowRuns < 4)) ||\n                    isNestedVisible(lazyloadElems[i], elemExpand))\n                ) {\n                  unveilElement(lazyloadElems[i]);\n                  loadedSomething = true;\n\n                  if (isLoading > 9) {\n                    break;\n                  }\n                } else if (\n                  !loadedSomething &&\n                  isCompleted &&\n                  !autoLoadElem &&\n                  isLoading < 4 &&\n                  lowRuns < 4 &&\n                  loadMode > 2 &&\n                  (preloadElems[0] || lazySizesCfg.preloadAfterLoad) &&\n                  (preloadElems[0] ||\n                    (!elemExpandVal &&\n                      (eLbottom ||\n                        eLright ||\n                        eLleft ||\n                        eLtop ||\n                        lazyloadElems[i][_getAttribute](\n                          lazySizesCfg.sizesAttr\n                        ) != \"auto\")))\n                ) {\n                  autoLoadElem = preloadElems[0] || lazyloadElems[i];\n                }\n              }\n\n              if (autoLoadElem && !loadedSomething) {\n                unveilElement(autoLoadElem);\n              }\n            }\n          };\n\n          var throttledCheckElements = throttle(checkElements);\n\n          var switchLoadingClass = function switchLoadingClass(e) {\n            var elem = e.target;\n\n            if (elem._lazyCache) {\n              delete elem._lazyCache;\n              return;\n            }\n\n            resetPreloading(e);\n            addClass(elem, lazySizesCfg.loadedClass);\n            removeClass(elem, lazySizesCfg.loadingClass);\n            addRemoveLoadEvents(elem, rafSwitchLoadingClass);\n            triggerEvent(elem, \"lazyloaded\");\n          };\n\n          var rafedSwitchLoadingClass = rAFIt(switchLoadingClass);\n\n          var rafSwitchLoadingClass = function rafSwitchLoadingClass(e) {\n            rafedSwitchLoadingClass({\n              target: e.target,\n            });\n          };\n\n          var changeIframeSrc = function changeIframeSrc(elem, src) {\n            try {\n              elem.contentWindow.location.replace(src);\n            } catch (e) {\n              elem.src = src;\n            }\n          };\n\n          var handleSources = function handleSources(source) {\n            var customMedia;\n\n            var sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);\n\n            if (\n              (customMedia =\n                lazySizesCfg.customMedia[\n                  source[_getAttribute](\"data-media\") ||\n                    source[_getAttribute](\"media\")\n                ])\n            ) {\n              source.setAttribute(\"media\", customMedia);\n            }\n\n            if (sourceSrcset) {\n              source.setAttribute(\"srcset\", sourceSrcset);\n            }\n          };\n\n          var lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg) {\n            var src, srcset, parent, isPicture, event, firesLoad;\n\n            if (\n              !(event = triggerEvent(elem, \"lazybeforeunveil\", detail))\n                .defaultPrevented\n            ) {\n              if (sizes) {\n                if (isAuto) {\n                  addClass(elem, lazySizesCfg.autosizesClass);\n                } else {\n                  elem.setAttribute(\"sizes\", sizes);\n                }\n              }\n\n              srcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);\n              src = elem[_getAttribute](lazySizesCfg.srcAttr);\n\n              if (isImg) {\n                parent = elem.parentNode;\n                isPicture = parent && regPicture.test(parent.nodeName || \"\");\n              }\n\n              firesLoad =\n                detail.firesLoad ||\n                (\"src\" in elem && (srcset || src || isPicture));\n              event = {\n                target: elem,\n              };\n              addClass(elem, lazySizesCfg.loadingClass);\n\n              if (firesLoad) {\n                clearTimeout(resetPreloadingTimer);\n                resetPreloadingTimer = setTimeout(resetPreloading, 2500);\n                addRemoveLoadEvents(elem, rafSwitchLoadingClass, true);\n              }\n\n              if (isPicture) {\n                forEach.call(\n                  parent.getElementsByTagName(\"source\"),\n                  handleSources\n                );\n              }\n\n              if (srcset) {\n                elem.setAttribute(\"srcset\", srcset);\n              } else if (src && !isPicture) {\n                if (regIframe.test(elem.nodeName)) {\n                  changeIframeSrc(elem, src);\n                } else {\n                  elem.src = src;\n                }\n              }\n\n              if (isImg && (srcset || isPicture)) {\n                updatePolyfill(elem, {\n                  src: src,\n                });\n              }\n            }\n\n            if (elem._lazyRace) {\n              delete elem._lazyRace;\n            }\n\n            removeClass(elem, lazySizesCfg.lazyClass);\n            rAF(function () {\n              // Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015)\n              var isLoaded = elem.complete && elem.naturalWidth > 1;\n\n              if (!firesLoad || isLoaded) {\n                if (isLoaded) {\n                  addClass(elem, \"ls-is-cached\");\n                }\n\n                switchLoadingClass(event);\n                elem._lazyCache = true;\n                setTimeout(function () {\n                  if (\"_lazyCache\" in elem) {\n                    delete elem._lazyCache;\n                  }\n                }, 9);\n              }\n\n              if (elem.loading == \"lazy\") {\n                isLoading--;\n              }\n            }, true);\n          });\n\n          var unveilElement = function unveilElement(elem) {\n            if (elem._lazyRace) {\n              return;\n            }\n\n            var detail;\n            var isImg = regImg.test(elem.nodeName); //allow using sizes=\"auto\", but don't use. it's invalid. Use data-sizes=\"auto\" or a valid value for sizes instead (i.e.: sizes=\"80vw\")\n\n            var sizes =\n              isImg &&\n              (elem[_getAttribute](lazySizesCfg.sizesAttr) ||\n                elem[_getAttribute](\"sizes\"));\n\n            var isAuto = sizes == \"auto\";\n\n            if (\n              (isAuto || !isCompleted) &&\n              isImg &&\n              (elem[_getAttribute](\"src\") || elem.srcset) &&\n              !elem.complete &&\n              !hasClass(elem, lazySizesCfg.errorClass) &&\n              hasClass(elem, lazySizesCfg.lazyClass)\n            ) {\n              return;\n            }\n\n            detail = triggerEvent(elem, \"lazyunveilread\").detail;\n\n            if (isAuto) {\n              autoSizer.updateElem(elem, true, elem.offsetWidth);\n            }\n\n            elem._lazyRace = true;\n            isLoading++;\n            lazyUnveil(elem, detail, isAuto, sizes, isImg);\n          };\n\n          var afterScroll = debounce(function () {\n            lazySizesCfg.loadMode = 3;\n            throttledCheckElements();\n          });\n\n          var altLoadmodeScrollListner = function altLoadmodeScrollListner() {\n            if (lazySizesCfg.loadMode == 3) {\n              lazySizesCfg.loadMode = 2;\n            }\n\n            afterScroll();\n          };\n\n          var onload = function onload() {\n            if (isCompleted) {\n              return;\n            }\n\n            if (Date.now() - started < 999) {\n              setTimeout(onload, 999);\n              return;\n            }\n\n            isCompleted = true;\n            lazySizesCfg.loadMode = 3;\n            throttledCheckElements();\n            addEventListener(\"scroll\", altLoadmodeScrollListner, true);\n          };\n\n          return {\n            _: function _() {\n              started = Date.now();\n              lazysizes.elements = document.getElementsByClassName(\n                lazySizesCfg.lazyClass\n              );\n              preloadElems = document.getElementsByClassName(\n                lazySizesCfg.lazyClass + \" \" + lazySizesCfg.preloadClass\n              );\n              addEventListener(\"scroll\", throttledCheckElements, true);\n              addEventListener(\"resize\", throttledCheckElements, true);\n              addEventListener(\"pageshow\", function (e) {\n                if (e.persisted) {\n                  var loadingElements = document.querySelectorAll(\n                    \".\" + lazySizesCfg.loadingClass\n                  );\n\n                  if (loadingElements.length && loadingElements.forEach) {\n                    requestAnimationFrame(function () {\n                      loadingElements.forEach(function (img) {\n                        if (img.complete) {\n                          unveilElement(img);\n                        }\n                      });\n                    });\n                  }\n                }\n              });\n\n              if (window.MutationObserver) {\n                new MutationObserver(throttledCheckElements).observe(docElem, {\n                  childList: true,\n                  subtree: true,\n                  attributes: true,\n                });\n              } else {\n                docElem[_addEventListener](\n                  \"DOMNodeInserted\",\n                  throttledCheckElements,\n                  true\n                );\n\n                docElem[_addEventListener](\n                  \"DOMAttrModified\",\n                  throttledCheckElements,\n                  true\n                );\n\n                setInterval(throttledCheckElements, 999);\n              }\n\n              addEventListener(\"hashchange\", throttledCheckElements, true); //, 'fullscreenchange'\n\n              [\n                \"focus\",\n                \"mouseover\",\n                \"click\",\n                \"load\",\n                \"transitionend\",\n                \"animationend\",\n              ].forEach(function (name) {\n                document[_addEventListener](name, throttledCheckElements, true);\n              });\n\n              if (/d$|^c/.test(document.readyState)) {\n                onload();\n              } else {\n                addEventListener(\"load\", onload);\n\n                document[_addEventListener](\n                  \"DOMContentLoaded\",\n                  throttledCheckElements\n                );\n\n                setTimeout(onload, 20000);\n              }\n\n              if (lazysizes.elements.length) {\n                checkElements();\n\n                rAF._lsFlush();\n              } else {\n                throttledCheckElements();\n              }\n            },\n            checkElems: throttledCheckElements,\n            unveil: unveilElement,\n            _aLSL: altLoadmodeScrollListner,\n          };\n        })();\n\n        var autoSizer = (function () {\n          var autosizesElems;\n          var sizeElement = rAFIt(function (elem, parent, event, width) {\n            var sources, i, len;\n            elem._lazysizesWidth = width;\n            width += \"px\";\n            elem.setAttribute(\"sizes\", width);\n\n            if (regPicture.test(parent.nodeName || \"\")) {\n              sources = parent.getElementsByTagName(\"source\");\n\n              for (i = 0, len = sources.length; i < len; i++) {\n                sources[i].setAttribute(\"sizes\", width);\n              }\n            }\n\n            if (!event.detail.dataAttr) {\n              updatePolyfill(elem, event.detail);\n            }\n          });\n\n          var getSizeElement = function getSizeElement(elem, dataAttr, width) {\n            var event;\n            var parent = elem.parentNode;\n\n            if (parent) {\n              width = getWidth(elem, parent, width);\n              event = triggerEvent(elem, \"lazybeforesizes\", {\n                width: width,\n                dataAttr: !!dataAttr,\n              });\n\n              if (!event.defaultPrevented) {\n                width = event.detail.width;\n\n                if (width && width !== elem._lazysizesWidth) {\n                  sizeElement(elem, parent, event, width);\n                }\n              }\n            }\n          };\n\n          var updateElementsSizes = function updateElementsSizes() {\n            var i;\n            var len = autosizesElems.length;\n\n            if (len) {\n              i = 0;\n\n              for (; i < len; i++) {\n                getSizeElement(autosizesElems[i]);\n              }\n            }\n          };\n\n          var debouncedUpdateElementsSizes = debounce(updateElementsSizes);\n          return {\n            _: function _() {\n              autosizesElems = document.getElementsByClassName(\n                lazySizesCfg.autosizesClass\n              );\n              addEventListener(\"resize\", debouncedUpdateElementsSizes);\n            },\n            checkElems: debouncedUpdateElementsSizes,\n            updateElem: getSizeElement,\n          };\n        })();\n\n        var init = function init() {\n          if (!init.i && document.getElementsByClassName) {\n            init.i = true;\n\n            autoSizer._();\n\n            loader._();\n          }\n        };\n\n        setTimeout(function () {\n          if (lazySizesCfg.init) {\n            init();\n          }\n        });\n        lazysizes = {\n          cfg: lazySizesCfg,\n          autoSizer: autoSizer,\n          loader: loader,\n          init: init,\n          uP: updatePolyfill,\n          aC: addClass,\n          rC: removeClass,\n          hC: hasClass,\n          fire: triggerEvent,\n          gW: getWidth,\n          rAF: rAF,\n        };\n        return lazysizes;\n      }\n    );\n  });\n\n  var ls_rias = createCommonjsModule(function (module) {\n    (function (window, factory) {\n      var globalInstall = function globalInstall() {\n        factory(window.lazySizes);\n        window.removeEventListener(\"lazyunveilread\", globalInstall, true);\n      };\n\n      factory = factory.bind(null, window, window.document);\n\n      if (module.exports) {\n        factory(lazysizes);\n      } else if (window.lazySizes) {\n        globalInstall();\n      } else {\n        window.addEventListener(\"lazyunveilread\", globalInstall, true);\n      }\n    })(window, function (window, document, lazySizes) {\n      var config, riasCfg;\n      var lazySizesCfg = lazySizes.cfg;\n      var replaceTypes = {\n        string: 1,\n        number: 1,\n      };\n      var regNumber = /^\\-*\\+*\\d+\\.*\\d*$/;\n      var regPicture = /^picture$/i;\n      var regWidth = /\\s*\\{\\s*width\\s*\\}\\s*/i;\n      var regHeight = /\\s*\\{\\s*height\\s*\\}\\s*/i;\n      var regPlaceholder = /\\s*\\{\\s*([a-z0-9]+)\\s*\\}\\s*/gi;\n      var regObj = /^\\[.*\\]|\\{.*\\}$/;\n      var regAllowedSizes = /^(?:auto|\\d+(px)?)$/;\n      var anchor = document.createElement(\"a\");\n      var img = document.createElement(\"img\");\n      var buggySizes = \"srcset\" in img && !(\"sizes\" in img);\n      var supportPicture = !!window.HTMLPictureElement && !buggySizes;\n\n      (function () {\n        var prop;\n\n        var noop = function noop() {};\n\n        var riasDefaults = {\n          prefix: \"\",\n          postfix: \"\",\n          srcAttr: \"data-src\",\n          absUrl: false,\n          modifyOptions: noop,\n          widthmap: {},\n          ratio: false,\n          traditionalRatio: false,\n          aspectratio: false,\n        };\n        config = lazySizes && lazySizes.cfg;\n\n        if (!config.supportsType) {\n          config.supportsType = function (\n            type\n            /*, elem*/\n          ) {\n            return !type;\n          };\n        }\n\n        if (!config.rias) {\n          config.rias = {};\n        }\n\n        riasCfg = config.rias;\n\n        if (!(\"widths\" in riasCfg)) {\n          riasCfg.widths = [];\n\n          (function (widths) {\n            var width;\n            var i = 0;\n\n            while (!width || width < 3000) {\n              i += 5;\n\n              if (i > 30) {\n                i += 1;\n              }\n\n              width = 36 * i;\n              widths.push(width);\n            }\n          })(riasCfg.widths);\n        }\n\n        for (prop in riasDefaults) {\n          if (!(prop in riasCfg)) {\n            riasCfg[prop] = riasDefaults[prop];\n          }\n        }\n      })();\n\n      function getElementOptions(elem, src) {\n        var attr, parent, setOption, options;\n        var elemStyles = window.getComputedStyle(elem);\n        parent = elem.parentNode;\n        options = {\n          isPicture: !!(parent && regPicture.test(parent.nodeName || \"\")),\n        };\n\n        setOption = function setOption(attr, run) {\n          var attrVal = elem.getAttribute(\"data-\" + attr);\n\n          if (!attrVal) {\n            // no data- attr, get value from the CSS\n            var styles = elemStyles.getPropertyValue(\"--ls-\" + attr); // at least Safari 9 returns null rather than\n            // an empty string for getPropertyValue causing\n            // .trim() to fail\n\n            if (styles) {\n              attrVal = styles.trim();\n            }\n          }\n\n          if (attrVal) {\n            if (attrVal == \"true\") {\n              attrVal = true;\n            } else if (attrVal == \"false\") {\n              attrVal = false;\n            } else if (regNumber.test(attrVal)) {\n              attrVal = parseFloat(attrVal);\n            } else if (typeof riasCfg[attr] == \"function\") {\n              attrVal = riasCfg[attr](elem, attrVal);\n            } else if (regObj.test(attrVal)) {\n              try {\n                attrVal = JSON.parse(attrVal);\n              } catch (e) {}\n            }\n\n            options[attr] = attrVal;\n          } else if (attr in riasCfg && typeof riasCfg[attr] != \"function\") {\n            options[attr] = riasCfg[attr];\n          } else if (run && typeof riasCfg[attr] == \"function\") {\n            options[attr] = riasCfg[attr](elem, attrVal);\n          }\n        };\n\n        for (attr in riasCfg) {\n          setOption(attr);\n        }\n\n        src.replace(regPlaceholder, function (full, match) {\n          if (!(match in options)) {\n            setOption(match, true);\n          }\n        });\n        return options;\n      }\n\n      function replaceUrlProps(url, options) {\n        var candidates = [];\n\n        var replaceFn = function replaceFn(full, match) {\n          return replaceTypes[_typeof(options[match])] ? options[match] : full;\n        };\n\n        candidates.srcset = [];\n\n        if (options.absUrl) {\n          anchor.setAttribute(\"href\", url);\n          url = anchor.href;\n        }\n\n        url = ((options.prefix || \"\") + url + (options.postfix || \"\")).replace(\n          regPlaceholder,\n          replaceFn\n        );\n        options.widths.forEach(function (width) {\n          var widthAlias = options.widthmap[width] || width;\n          var ratio = options.aspectratio || options.ratio;\n          var traditionalRatio =\n            !options.aspectratio && riasCfg.traditionalRatio;\n          var candidate = {\n            u: url\n              .replace(regWidth, widthAlias)\n              .replace(\n                regHeight,\n                ratio\n                  ? traditionalRatio\n                    ? Math.round(width * ratio)\n                    : Math.round(width / ratio)\n                  : \"\"\n              ),\n            w: width,\n          };\n          candidates.push(candidate);\n          candidates.srcset.push(\n            (candidate.c = candidate.u + \" \" + width + \"w\")\n          );\n        });\n        return candidates;\n      }\n\n      function setSrc(src, opts, elem) {\n        var elemW = 0;\n        var elemH = 0;\n        var sizeElement = elem;\n\n        if (!src) {\n          return;\n        }\n\n        if (opts.ratio === \"container\") {\n          // calculate image or parent ratio\n          elemW = sizeElement.scrollWidth;\n          elemH = sizeElement.scrollHeight;\n\n          while ((!elemW || !elemH) && sizeElement !== document) {\n            sizeElement = sizeElement.parentNode;\n            elemW = sizeElement.scrollWidth;\n            elemH = sizeElement.scrollHeight;\n          }\n\n          if (elemW && elemH) {\n            opts.ratio = opts.traditionalRatio ? elemH / elemW : elemW / elemH;\n          }\n        }\n\n        src = replaceUrlProps(src, opts);\n        src.isPicture = opts.isPicture;\n\n        if (buggySizes && elem.nodeName.toUpperCase() == \"IMG\") {\n          elem.removeAttribute(config.srcsetAttr);\n        } else {\n          elem.setAttribute(config.srcsetAttr, src.srcset.join(\", \"));\n        }\n\n        Object.defineProperty(elem, \"_lazyrias\", {\n          value: src,\n          writable: true,\n        });\n      }\n\n      function createAttrObject(elem, src) {\n        var opts = getElementOptions(elem, src);\n        riasCfg.modifyOptions.call(elem, {\n          target: elem,\n          details: opts,\n          detail: opts,\n        });\n        lazySizes.fire(elem, \"lazyriasmodifyoptions\", opts);\n        return opts;\n      }\n\n      function getSrc(elem) {\n        return (\n          elem.getAttribute(\n            elem.getAttribute(\"data-srcattr\") || riasCfg.srcAttr\n          ) ||\n          elem.getAttribute(config.srcsetAttr) ||\n          elem.getAttribute(config.srcAttr) ||\n          elem.getAttribute(\"data-pfsrcset\") ||\n          \"\"\n        );\n      }\n\n      addEventListener(\n        \"lazybeforesizes\",\n        function (e) {\n          if (e.detail.instance != lazySizes) {\n            return;\n          }\n\n          var elem,\n            src,\n            elemOpts,\n            parent,\n            sources,\n            i,\n            len,\n            sourceSrc,\n            sizes,\n            detail,\n            hasPlaceholder,\n            modified,\n            emptyList;\n          elem = e.target;\n\n          if (\n            !e.detail.dataAttr ||\n            e.defaultPrevented ||\n            riasCfg.disabled ||\n            !(\n              (sizes =\n                elem.getAttribute(config.sizesAttr) ||\n                elem.getAttribute(\"sizes\")) && regAllowedSizes.test(sizes)\n            )\n          ) {\n            return;\n          }\n\n          src = getSrc(elem);\n          elemOpts = createAttrObject(elem, src);\n          hasPlaceholder =\n            regWidth.test(elemOpts.prefix) || regWidth.test(elemOpts.postfix);\n\n          if (elemOpts.isPicture && (parent = elem.parentNode)) {\n            sources = parent.getElementsByTagName(\"source\");\n\n            for (i = 0, len = sources.length; i < len; i++) {\n              if (\n                hasPlaceholder ||\n                regWidth.test((sourceSrc = getSrc(sources[i])))\n              ) {\n                setSrc(sourceSrc, elemOpts, sources[i]);\n                modified = true;\n              }\n            }\n          }\n\n          if (hasPlaceholder || regWidth.test(src)) {\n            setSrc(src, elemOpts, elem);\n            modified = true;\n          } else if (modified) {\n            emptyList = [];\n            emptyList.srcset = [];\n            emptyList.isPicture = true;\n            Object.defineProperty(elem, \"_lazyrias\", {\n              value: emptyList,\n              writable: true,\n            });\n          }\n\n          if (modified) {\n            if (supportPicture) {\n              elem.removeAttribute(config.srcAttr);\n            } else if (sizes != \"auto\") {\n              detail = {\n                width: parseInt(sizes, 10),\n              };\n              polyfill({\n                target: elem,\n                detail: detail,\n              });\n            }\n          }\n        },\n        true\n      ); // partial polyfill\n\n      var polyfill = (function () {\n        var ascendingSort = function ascendingSort(a, b) {\n          return a.w - b.w;\n        };\n\n        var reduceCandidate = function reduceCandidate(srces) {\n          var lowerCandidate, bonusFactor;\n          var len = srces.length;\n          var candidate = srces[len - 1];\n          var i = 0;\n\n          for (i; i < len; i++) {\n            candidate = srces[i];\n            candidate.d = candidate.w / srces.w;\n\n            if (candidate.d >= srces.d) {\n              if (\n                !candidate.cached &&\n                (lowerCandidate = srces[i - 1]) &&\n                lowerCandidate.d > srces.d - 0.13 * Math.pow(srces.d, 2.2)\n              ) {\n                bonusFactor = Math.pow(lowerCandidate.d - 0.6, 1.6);\n\n                if (lowerCandidate.cached) {\n                  lowerCandidate.d += 0.15 * bonusFactor;\n                }\n\n                if (\n                  lowerCandidate.d + (candidate.d - srces.d) * bonusFactor >\n                  srces.d\n                ) {\n                  candidate = lowerCandidate;\n                }\n              }\n\n              break;\n            }\n          }\n\n          return candidate;\n        };\n\n        var getWSet = function getWSet(elem, testPicture) {\n          var src;\n\n          if (\n            !elem._lazyrias &&\n            lazySizes.pWS &&\n            (src = lazySizes.pWS(elem.getAttribute(config.srcsetAttr || \"\")))\n              .length\n          ) {\n            Object.defineProperty(elem, \"_lazyrias\", {\n              value: src,\n              writable: true,\n            });\n\n            if (testPicture && elem.parentNode) {\n              src.isPicture =\n                elem.parentNode.nodeName.toUpperCase() == \"PICTURE\";\n            }\n          }\n\n          return elem._lazyrias;\n        };\n\n        var getX = function getX(elem) {\n          var dpr = window.devicePixelRatio || 1;\n          var optimum = lazySizes.getX && lazySizes.getX(elem);\n          return Math.min(optimum || dpr, 2.4, dpr);\n        };\n\n        var getCandidate = function getCandidate(elem, width) {\n          var sources, i, len, media, srces, src;\n          srces = elem._lazyrias;\n\n          if (srces.isPicture && window.matchMedia) {\n            for (\n              i = 0,\n                sources = elem.parentNode.getElementsByTagName(\"source\"),\n                len = sources.length;\n              i < len;\n              i++\n            ) {\n              if (\n                getWSet(sources[i]) &&\n                !sources[i].getAttribute(\"type\") &&\n                (!(media = sources[i].getAttribute(\"media\")) ||\n                  (matchMedia(media) || {}).matches)\n              ) {\n                srces = sources[i]._lazyrias;\n                break;\n              }\n            }\n          }\n\n          if (!srces.w || srces.w < width) {\n            srces.w = width;\n            srces.d = getX(elem);\n            src = reduceCandidate(srces.sort(ascendingSort));\n          }\n\n          return src;\n        };\n\n        var _polyfill = function polyfill(e) {\n          if (e.detail.instance != lazySizes) {\n            return;\n          }\n\n          var candidate;\n          var elem = e.target;\n\n          if (\n            !buggySizes &&\n            (window.respimage || window.picturefill || lazySizesCfg.pf)\n          ) {\n            document.removeEventListener(\"lazybeforesizes\", _polyfill);\n            return;\n          }\n\n          if (\n            !(\"_lazyrias\" in elem) &&\n            (!e.detail.dataAttr || !getWSet(elem, true))\n          ) {\n            return;\n          }\n\n          candidate = getCandidate(elem, e.detail.width);\n\n          if (candidate && candidate.u && elem._lazyrias.cur != candidate.u) {\n            elem._lazyrias.cur = candidate.u;\n            candidate.cached = true;\n            lazySizes.rAF(function () {\n              elem.setAttribute(config.srcAttr, candidate.u);\n              elem.setAttribute(\"src\", candidate.u);\n            });\n          }\n        };\n\n        if (!supportPicture) {\n          addEventListener(\"lazybeforesizes\", _polyfill);\n        } else {\n          _polyfill = function _polyfill() {};\n        }\n\n        return _polyfill;\n      })();\n    });\n  });\n\n  var ls_unveilhooks = createCommonjsModule(function (module) {\n    /*\n    This plugin extends lazySizes to lazyLoad:\n    background images, videos/posters and scripts\n    \n    Background-Image:\n    For background images, use data-bg attribute:\n    <div class=\"lazyload\" data-bg=\"bg-img.jpg\"></div>\n    \n     Video:\n     For video/audio use data-poster and preload=\"none\":\n     <video class=\"lazyload\" preload=\"none\" data-poster=\"poster.jpg\" src=\"src.mp4\">     \n     </video>\n    \n     For video that plays automatically if in view:\n     <video\n    \tclass=\"lazyload\"\n    \tpreload=\"none\"\n    \tmuted=\"\"\n    \tdata-autoplay=\"\"\n    \tdata-poster=\"poster.jpg\"\n    \tsrc=\"src.mp4\">\n    </video>\n    \n     Scripts:\n     For scripts use data-script:\n     <div class=\"lazyload\" data-script=\"module-name.js\"></div>\n    \n    \n     Script modules using require:\n     For modules using require use data-require:\n     <div class=\"lazyload\" data-require=\"module-name\"></div>\n    */\n    (function (window, factory) {\n      var globalInstall = function globalInstall() {\n        factory(window.lazySizes);\n        window.removeEventListener(\"lazyunveilread\", globalInstall, true);\n      };\n\n      factory = factory.bind(null, window, window.document);\n\n      if (module.exports) {\n        factory(lazysizes);\n      } else if (window.lazySizes) {\n        globalInstall();\n      } else {\n        window.addEventListener(\"lazyunveilread\", globalInstall, true);\n      }\n    })(window, function (window, document, lazySizes) {\n      var bgLoad, regBgUrlEscape;\n      var uniqueUrls = {};\n\n      if (document.addEventListener) {\n        regBgUrlEscape = /\\(|\\)|\\s|'/;\n\n        bgLoad = function bgLoad(url, cb) {\n          var img = document.createElement(\"img\");\n\n          img.onload = function () {\n            img.onload = null;\n            img.onerror = null;\n            img = null;\n            cb();\n          };\n\n          img.onerror = img.onload;\n          img.src = url;\n\n          if (img && img.complete && img.onload) {\n            img.onload();\n          }\n        };\n\n        addEventListener(\n          \"lazybeforeunveil\",\n          function (e) {\n            if (e.detail.instance != lazySizes) {\n              return;\n            }\n\n            var tmp, load, bg, poster;\n\n            if (!e.defaultPrevented) {\n              var target = e.target;\n\n              if (target.preload == \"none\") {\n                target.preload = target.getAttribute(\"data-preload\") || \"auto\";\n              }\n\n              if (target.getAttribute(\"data-autoplay\") != null) {\n                if (target.getAttribute(\"data-expand\") && !target.autoplay) {\n                  try {\n                    target.play();\n                  } catch (er) {}\n                } else {\n                  requestAnimationFrame(function () {\n                    target.setAttribute(\"data-expand\", \"-10\");\n                    lazySizes.aC(target, lazySizes.cfg.lazyClass);\n                  });\n                }\n              }\n\n              tmp = target.getAttribute(\"data-link\");\n\n              if (tmp) {\n                addStyleScript(tmp, true);\n              } // handle data-script\n\n              tmp = target.getAttribute(\"data-script\");\n\n              if (tmp) {\n                addStyleScript(tmp);\n              } // handle data-require\n\n              tmp = target.getAttribute(\"data-require\");\n\n              if (tmp) {\n                if (lazySizes.cfg.requireJs) {\n                  lazySizes.cfg.requireJs([tmp]);\n                } else {\n                  addStyleScript(tmp);\n                }\n              } // handle data-bg\n\n              bg = target.getAttribute(\"data-bg\");\n\n              if (bg) {\n                e.detail.firesLoad = true;\n\n                load = function load() {\n                  target.style.backgroundImage =\n                    \"url(\" +\n                    (regBgUrlEscape.test(bg) ? JSON.stringify(bg) : bg) +\n                    \")\";\n                  e.detail.firesLoad = false;\n                  lazySizes.fire(target, \"_lazyloaded\", {}, true, true);\n                };\n\n                bgLoad(bg, load);\n              } // handle data-poster\n\n              poster = target.getAttribute(\"data-poster\");\n\n              if (poster) {\n                e.detail.firesLoad = true;\n\n                load = function load() {\n                  target.poster = poster;\n                  e.detail.firesLoad = false;\n                  lazySizes.fire(target, \"_lazyloaded\", {}, true, true);\n                };\n\n                bgLoad(poster, load);\n              }\n            }\n          },\n          false\n        );\n      }\n\n      function addStyleScript(src, style) {\n        if (uniqueUrls[src]) {\n          return;\n        }\n\n        var elem = document.createElement(style ? \"link\" : \"script\");\n        var insertElem = document.getElementsByTagName(\"script\")[0];\n\n        if (style) {\n          elem.rel = \"stylesheet\";\n          elem.href = src;\n        } else {\n          elem.src = src;\n        }\n\n        uniqueUrls[src] = true;\n        uniqueUrls[elem.src || elem.href] = true;\n        insertElem.parentNode.insertBefore(elem, insertElem);\n      }\n    });\n  });\n\n  var ls_bgset = createCommonjsModule(function (module) {\n    (function (window, factory) {\n      var globalInstall = function globalInstall() {\n        factory(window.lazySizes);\n        window.removeEventListener(\"lazyunveilread\", globalInstall, true);\n      };\n\n      factory = factory.bind(null, window, window.document);\n\n      if (module.exports) {\n        factory(lazysizes);\n      } else if (window.lazySizes) {\n        globalInstall();\n      } else {\n        window.addEventListener(\"lazyunveilread\", globalInstall, true);\n      }\n    })(window, function (window, document, lazySizes) {\n      if (!window.addEventListener) {\n        return;\n      }\n\n      var lazySizesCfg = lazySizes.cfg;\n      var regWhite = /\\s+/g;\n      var regSplitSet = /\\s*\\|\\s+|\\s+\\|\\s*/g;\n      var regSource = /^(.+?)(?:\\s+\\[\\s*(.+?)\\s*\\])(?:\\s+\\[\\s*(.+?)\\s*\\])?$/;\n      var regType = /^\\s*\\(*\\s*type\\s*:\\s*(.+?)\\s*\\)*\\s*$/;\n      var regBgUrlEscape = /\\(|\\)|'/;\n      var allowedBackgroundSize = {\n        contain: 1,\n        cover: 1,\n      };\n\n      var proxyWidth = function proxyWidth(elem) {\n        var width = lazySizes.gW(elem, elem.parentNode);\n\n        if (!elem._lazysizesWidth || width > elem._lazysizesWidth) {\n          elem._lazysizesWidth = width;\n        }\n\n        return elem._lazysizesWidth;\n      };\n\n      var getBgSize = function getBgSize(elem) {\n        var bgSize;\n        bgSize = (\n          getComputedStyle(elem) || {\n            getPropertyValue: function getPropertyValue() {},\n          }\n        ).getPropertyValue(\"background-size\");\n\n        if (\n          !allowedBackgroundSize[bgSize] &&\n          allowedBackgroundSize[elem.style.backgroundSize]\n        ) {\n          bgSize = elem.style.backgroundSize;\n        }\n\n        return bgSize;\n      };\n\n      var setTypeOrMedia = function setTypeOrMedia(source, match) {\n        if (match) {\n          var typeMatch = match.match(regType);\n\n          if (typeMatch && typeMatch[1]) {\n            source.setAttribute(\"type\", typeMatch[1]);\n          } else {\n            source.setAttribute(\n              \"media\",\n              lazySizesCfg.customMedia[match] || match\n            );\n          }\n        }\n      };\n\n      var createPicture = function createPicture(sets, elem, img) {\n        var picture = document.createElement(\"picture\");\n        var sizes = elem.getAttribute(lazySizesCfg.sizesAttr);\n        var ratio = elem.getAttribute(\"data-ratio\");\n        var optimumx = elem.getAttribute(\"data-optimumx\");\n\n        if (elem._lazybgset && elem._lazybgset.parentNode == elem) {\n          elem.removeChild(elem._lazybgset);\n        }\n\n        Object.defineProperty(img, \"_lazybgset\", {\n          value: elem,\n          writable: true,\n        });\n        Object.defineProperty(elem, \"_lazybgset\", {\n          value: picture,\n          writable: true,\n        });\n        sets = sets.replace(regWhite, \" \").split(regSplitSet);\n        picture.style.display = \"none\";\n        img.className = lazySizesCfg.lazyClass;\n\n        if (sets.length == 1 && !sizes) {\n          sizes = \"auto\";\n        }\n\n        sets.forEach(function (set) {\n          var match;\n          var source = document.createElement(\"source\");\n\n          if (sizes && sizes != \"auto\") {\n            source.setAttribute(\"sizes\", sizes);\n          }\n\n          if ((match = set.match(regSource))) {\n            source.setAttribute(lazySizesCfg.srcsetAttr, match[1]);\n            setTypeOrMedia(source, match[2]);\n            setTypeOrMedia(source, match[3]);\n          } else {\n            source.setAttribute(lazySizesCfg.srcsetAttr, set);\n          }\n\n          picture.appendChild(source);\n        });\n\n        if (sizes) {\n          img.setAttribute(lazySizesCfg.sizesAttr, sizes);\n          elem.removeAttribute(lazySizesCfg.sizesAttr);\n          elem.removeAttribute(\"sizes\");\n        }\n\n        if (optimumx) {\n          img.setAttribute(\"data-optimumx\", optimumx);\n        }\n\n        if (ratio) {\n          img.setAttribute(\"data-ratio\", ratio);\n        }\n\n        picture.appendChild(img);\n        elem.appendChild(picture);\n      };\n\n      var proxyLoad = function proxyLoad(e) {\n        if (!e.target._lazybgset) {\n          return;\n        }\n\n        var image = e.target;\n        var elem = image._lazybgset;\n        var bg = image.currentSrc || image.src;\n\n        if (bg) {\n          var event = lazySizes.fire(elem, \"bgsetproxy\", {\n            src: bg,\n            useSrc: regBgUrlEscape.test(bg) ? JSON.stringify(bg) : bg,\n          });\n\n          if (!event.defaultPrevented) {\n            elem.style.backgroundImage = \"url(\" + event.detail.useSrc + \")\";\n          }\n        }\n\n        if (image._lazybgsetLoading) {\n          lazySizes.fire(elem, \"_lazyloaded\", {}, false, true);\n          delete image._lazybgsetLoading;\n        }\n      };\n\n      addEventListener(\"lazybeforeunveil\", function (e) {\n        var set, image, elem;\n\n        if (\n          e.defaultPrevented ||\n          !(set = e.target.getAttribute(\"data-bgset\"))\n        ) {\n          return;\n        }\n\n        elem = e.target;\n        image = document.createElement(\"img\");\n        image.alt = \"\";\n        image._lazybgsetLoading = true;\n        e.detail.firesLoad = true;\n        createPicture(set, elem, image);\n        setTimeout(function () {\n          lazySizes.loader.unveil(image);\n          lazySizes.rAF(function () {\n            lazySizes.fire(image, \"_lazyloaded\", {}, true, true);\n\n            if (image.complete) {\n              proxyLoad({\n                target: image,\n              });\n            }\n          });\n        });\n      });\n      document.addEventListener(\"load\", proxyLoad, true);\n      window.addEventListener(\n        \"lazybeforesizes\",\n        function (e) {\n          if (e.detail.instance != lazySizes) {\n            return;\n          }\n\n          if (e.target._lazybgset && e.detail.dataAttr) {\n            var elem = e.target._lazybgset;\n            var bgSize = getBgSize(elem);\n\n            if (allowedBackgroundSize[bgSize]) {\n              e.target._lazysizesParentFit = bgSize;\n              lazySizes.rAF(function () {\n                e.target.setAttribute(\"data-parent-fit\", bgSize);\n\n                if (e.target._lazysizesParentFit) {\n                  delete e.target._lazysizesParentFit;\n                }\n              });\n            }\n          }\n        },\n        true\n      );\n      document.documentElement.addEventListener(\n        \"lazybeforesizes\",\n        function (e) {\n          if (\n            e.defaultPrevented ||\n            !e.target._lazybgset ||\n            e.detail.instance != lazySizes\n          ) {\n            return;\n          }\n\n          e.detail.width = proxyWidth(e.target._lazybgset);\n        }\n      );\n    });\n  });\n\n  var ls_respimg = createCommonjsModule(function (module) {\n    (function (window, factory) {\n      if (!window) {\n        return;\n      }\n\n      var globalInstall = function globalInstall() {\n        factory(window.lazySizes);\n        window.removeEventListener(\"lazyunveilread\", globalInstall, true);\n      };\n\n      factory = factory.bind(null, window, window.document);\n\n      if (module.exports) {\n        factory(lazysizes);\n      } else if (window.lazySizes) {\n        globalInstall();\n      } else {\n        window.addEventListener(\"lazyunveilread\", globalInstall, true);\n      }\n    })(\n      typeof window != \"undefined\" ? window : 0,\n      function (window, document, lazySizes) {\n        var polyfill;\n        var lazySizesCfg = lazySizes.cfg;\n        var img = document.createElement(\"img\");\n        var supportSrcset = \"sizes\" in img && \"srcset\" in img;\n        var regHDesc = /\\s+\\d+h/g;\n\n        var fixEdgeHDescriptor = (function () {\n          var regDescriptors = /\\s+(\\d+)(w|h)\\s+(\\d+)(w|h)/;\n          var forEach = Array.prototype.forEach;\n          return function () {\n            var img = document.createElement(\"img\");\n\n            var removeHDescriptors = function removeHDescriptors(source) {\n              var ratio, match;\n              var srcset = source.getAttribute(lazySizesCfg.srcsetAttr);\n\n              if (srcset) {\n                if ((match = srcset.match(regDescriptors))) {\n                  if (match[2] == \"w\") {\n                    ratio = match[1] / match[3];\n                  } else {\n                    ratio = match[3] / match[1];\n                  }\n\n                  if (ratio) {\n                    source.setAttribute(\"data-aspectratio\", ratio);\n                  }\n\n                  source.setAttribute(\n                    lazySizesCfg.srcsetAttr,\n                    srcset.replace(regHDesc, \"\")\n                  );\n                }\n              }\n            };\n\n            var handler = function handler(e) {\n              if (e.detail.instance != lazySizes) {\n                return;\n              }\n\n              var picture = e.target.parentNode;\n\n              if (picture && picture.nodeName == \"PICTURE\") {\n                forEach.call(\n                  picture.getElementsByTagName(\"source\"),\n                  removeHDescriptors\n                );\n              }\n\n              removeHDescriptors(e.target);\n            };\n\n            var test = function test() {\n              if (!!img.currentSrc) {\n                document.removeEventListener(\"lazybeforeunveil\", handler);\n              }\n            };\n\n            document.addEventListener(\"lazybeforeunveil\", handler);\n            img.onload = test;\n            img.onerror = test;\n            img.srcset = \"data:,a 1w 1h\";\n\n            if (img.complete) {\n              test();\n            }\n          };\n        })();\n\n        if (!lazySizesCfg.supportsType) {\n          lazySizesCfg.supportsType = function (\n            type\n            /*, elem*/\n          ) {\n            return !type;\n          };\n        }\n\n        if (window.HTMLPictureElement && supportSrcset) {\n          if (!lazySizes.hasHDescriptorFix && document.msElementsFromPoint) {\n            lazySizes.hasHDescriptorFix = true;\n            fixEdgeHDescriptor();\n          }\n\n          return;\n        }\n\n        if (window.picturefill || lazySizesCfg.pf) {\n          return;\n        }\n\n        lazySizesCfg.pf = function (options) {\n          var i, len;\n\n          if (window.picturefill) {\n            return;\n          }\n\n          for (i = 0, len = options.elements.length; i < len; i++) {\n            polyfill(options.elements[i]);\n          }\n        }; // partial polyfill\n\n        polyfill = (function () {\n          var ascendingSort = function ascendingSort(a, b) {\n            return a.w - b.w;\n          };\n\n          var regPxLength = /^\\s*\\d+\\.*\\d*px\\s*$/;\n\n          var reduceCandidate = function reduceCandidate(srces) {\n            var lowerCandidate, bonusFactor;\n            var len = srces.length;\n            var candidate = srces[len - 1];\n            var i = 0;\n\n            for (i; i < len; i++) {\n              candidate = srces[i];\n              candidate.d = candidate.w / srces.w;\n\n              if (candidate.d >= srces.d) {\n                if (\n                  !candidate.cached &&\n                  (lowerCandidate = srces[i - 1]) &&\n                  lowerCandidate.d > srces.d - 0.13 * Math.pow(srces.d, 2.2)\n                ) {\n                  bonusFactor = Math.pow(lowerCandidate.d - 0.6, 1.6);\n\n                  if (lowerCandidate.cached) {\n                    lowerCandidate.d += 0.15 * bonusFactor;\n                  }\n\n                  if (\n                    lowerCandidate.d + (candidate.d - srces.d) * bonusFactor >\n                    srces.d\n                  ) {\n                    candidate = lowerCandidate;\n                  }\n                }\n\n                break;\n              }\n            }\n\n            return candidate;\n          };\n\n          var parseWsrcset = (function () {\n            var candidates;\n            var regWCandidates = /(([^,\\s].[^\\s]+)\\s+(\\d+)w)/g;\n            var regMultiple = /\\s/;\n\n            var addCandidate = function addCandidate(\n              match,\n              candidate,\n              url,\n              wDescriptor\n            ) {\n              candidates.push({\n                c: candidate,\n                u: url,\n                w: wDescriptor * 1,\n              });\n            };\n\n            return function (input) {\n              candidates = [];\n              input = input.trim();\n              input.replace(regHDesc, \"\").replace(regWCandidates, addCandidate);\n\n              if (!candidates.length && input && !regMultiple.test(input)) {\n                candidates.push({\n                  c: input,\n                  u: input,\n                  w: 99,\n                });\n              }\n\n              return candidates;\n            };\n          })();\n\n          var runMatchMedia = function runMatchMedia() {\n            if (runMatchMedia.init) {\n              return;\n            }\n\n            runMatchMedia.init = true;\n            addEventListener(\n              \"resize\",\n              (function () {\n                var timer;\n                var matchMediaElems =\n                  document.getElementsByClassName(\"lazymatchmedia\");\n\n                var run = function run() {\n                  var i, len;\n\n                  for (i = 0, len = matchMediaElems.length; i < len; i++) {\n                    polyfill(matchMediaElems[i]);\n                  }\n                };\n\n                return function () {\n                  clearTimeout(timer);\n                  timer = setTimeout(run, 66);\n                };\n              })()\n            );\n          };\n\n          var createSrcset = function createSrcset(elem, isImage) {\n            var parsedSet;\n            var srcSet =\n              elem.getAttribute(\"srcset\") ||\n              elem.getAttribute(lazySizesCfg.srcsetAttr);\n\n            if (!srcSet && isImage) {\n              srcSet = !elem._lazypolyfill\n                ? elem.getAttribute(lazySizesCfg.srcAttr) ||\n                  elem.getAttribute(\"src\")\n                : elem._lazypolyfill._set;\n            }\n\n            if (!elem._lazypolyfill || elem._lazypolyfill._set != srcSet) {\n              parsedSet = parseWsrcset(srcSet || \"\");\n\n              if (isImage && elem.parentNode) {\n                parsedSet.isPicture =\n                  elem.parentNode.nodeName.toUpperCase() == \"PICTURE\";\n\n                if (parsedSet.isPicture) {\n                  if (window.matchMedia) {\n                    lazySizes.aC(elem, \"lazymatchmedia\");\n                    runMatchMedia();\n                  }\n                }\n              }\n\n              parsedSet._set = srcSet;\n              Object.defineProperty(elem, \"_lazypolyfill\", {\n                value: parsedSet,\n                writable: true,\n              });\n            }\n          };\n\n          var getX = function getX(elem) {\n            var dpr = window.devicePixelRatio || 1;\n            var optimum = lazySizes.getX && lazySizes.getX(elem);\n            return Math.min(optimum || dpr, 2.5, dpr);\n          };\n\n          var _matchesMedia = function matchesMedia(media) {\n            if (window.matchMedia) {\n              _matchesMedia = function matchesMedia(media) {\n                return !media || (matchMedia(media) || {}).matches;\n              };\n            } else {\n              return !media;\n            }\n\n            return _matchesMedia(media);\n          };\n\n          var getCandidate = function getCandidate(elem) {\n            var sources, i, len, source, srces, src, width;\n            source = elem;\n            createSrcset(source, true);\n            srces = source._lazypolyfill;\n\n            if (srces.isPicture) {\n              for (\n                i = 0,\n                  sources = elem.parentNode.getElementsByTagName(\"source\"),\n                  len = sources.length;\n                i < len;\n                i++\n              ) {\n                if (\n                  lazySizesCfg.supportsType(\n                    sources[i].getAttribute(\"type\"),\n                    elem\n                  ) &&\n                  _matchesMedia(sources[i].getAttribute(\"media\"))\n                ) {\n                  source = sources[i];\n                  createSrcset(source);\n                  srces = source._lazypolyfill;\n                  break;\n                }\n              }\n            }\n\n            if (srces.length > 1) {\n              width = source.getAttribute(\"sizes\") || \"\";\n              width =\n                (regPxLength.test(width) && parseInt(width, 10)) ||\n                lazySizes.gW(elem, elem.parentNode);\n              srces.d = getX(elem);\n\n              if (!srces.src || !srces.w || srces.w < width) {\n                srces.w = width;\n                src = reduceCandidate(srces.sort(ascendingSort));\n                srces.src = src;\n              } else {\n                src = srces.src;\n              }\n            } else {\n              src = srces[0];\n            }\n\n            return src;\n          };\n\n          var p = function p(elem) {\n            if (\n              supportSrcset &&\n              elem.parentNode &&\n              elem.parentNode.nodeName.toUpperCase() != \"PICTURE\"\n            ) {\n              return;\n            }\n\n            var candidate = getCandidate(elem);\n\n            if (\n              candidate &&\n              candidate.u &&\n              elem._lazypolyfill.cur != candidate.u\n            ) {\n              elem._lazypolyfill.cur = candidate.u;\n              candidate.cached = true;\n              elem.setAttribute(lazySizesCfg.srcAttr, candidate.u);\n              elem.setAttribute(\"src\", candidate.u);\n            }\n          };\n\n          p.parse = parseWsrcset;\n          return p;\n        })();\n\n        if (lazySizesCfg.loadedClass && lazySizesCfg.loadingClass) {\n          (function () {\n            var sels = [];\n            [\n              'img[sizes$=\"px\"][srcset].',\n              \"picture > img:not([srcset]).\",\n            ].forEach(function (sel) {\n              sels.push(sel + lazySizesCfg.loadedClass);\n              sels.push(sel + lazySizesCfg.loadingClass);\n            });\n            lazySizesCfg.pf({\n              elements: document.querySelectorAll(sels.join(\", \")),\n            });\n          })();\n        }\n      }\n    );\n  });\n\n  (function () {\n    var bootTheme = function bootTheme() {      \n      // Some polyfills not provided yet by polyfills.io\n      if (window.NodeList && !NodeList.prototype.forEach) {\n        NodeList.prototype.forEach = function (callback, thisArg) {\n          thisArg = thisArg || window;\n\n          for (var i = 0; i < this.length; i++) {\n            callback.call(thisArg, this[i], i, this);\n          }\n        };\n      } // Use for the smooth scroll polyfill\n\n      smoothscroll.polyfill(); // Instantiate global plugins\n\n      new CollapsibleManager();\n      new LoadingBar();\n      new ModalManager();\n      new PopoverManager(); // Then, we instantiate specific sections that may appear in all pages, and then only the template specific sections\n\n      var sections = new SectionContainer();\n      sections.register(\"account\", AccountSection);\n      sections.register(\"announcement-bar\", AnnouncementBarSection); \n      sections.register(\"blog\", BlogSection);\n      sections.register(\"blog-sidebar\", BlogSidebarSection);\n      //sections.register(\"blog-post\", BlogPostSection);\n      sections.register(\"cart\", CartSection);\n      //sections.register('collection-list', CollectionListSection);\t\t\t\t//Removed - theme functionality changed from default theme\n      sections.register(\"collection\", CollectionSection);\n      //sections.register('featured-collection', FeaturedCollectionSection);\t\t//Removed - theme functionality changed from default theme\n      sections.register(\"footer\", FooterSection);\n      sections.register(\"gift-card\", GiftCardSection);\n      sections.register(\"header\", HeaderSection);\n      sections.register(\"login\", LoginSection);\n      sections.register(\"map\", MapSection);\n      sections.register(\"minimal-header\", MinimalHeaderSection);\n      sections.register(\"popups\", PopupsSection);\n      sections.register(\n        \"product-recommendations\",\n        ProductRecommendationsSection\n      );\n      sections.register(\"product\", ProductSection);\n      sections.register(\"quick-links\", QuickLinksSection);\n      sections.register(\n        \"recently-viewed-products\",\n        RecentlyViewedProductsSection\n      );\n      //sections.register('slideshow', SlideshowSection);\t\t\t\t\t\t\t//Removed - theme functionality changed from default theme\n      sections.register(\"text-with-icons\", TextWithIconsSection);\n      sections.register(\"video\", VideoSection);\n      /**\n       * ----------------------------------------------------------------------------\n       * RTE\n       * ----------------------------------------------------------------------------\n       */\n\n      (function () {\n        // We wrap each RTE table by a specific class to allow wrapping\n        document.querySelectorAll(\".rte table\").forEach(function (table) {\n          table.outerHTML =\n            '<div class=\"table-wrapper\">' + table.outerHTML + \"</div>\";\n        });\n        document.querySelectorAll(\".rte iframe\").forEach(function (iframe) {\n          // We scope the wrapping only for YouTube and Vimeo\n          if (\n            iframe.src.indexOf(\"youtube\") !== -1 ||\n            iframe.src.indexOf(\"youtu.be\") !== -1 ||\n            iframe.src.indexOf(\"vimeo\") !== -1\n          ) {\n            iframe.outerHTML =\n              '<div class=\"video-wrapper\">' + iframe.outerHTML + \"</div>\"; // Re-set the src attribute on each iframe after page load for Chrome's \"incorrect iFrame content on 'back'\" bug.\n            // https://code.google.com/p/chromium/issues/detail?id=395791. Need to specifically target video and admin bar\n\n            iframe.src = iframe.src;\n          }\n        });\n      })();\n      /**\n       * ----------------------------------------------------------------------------\n       * FLICKITY\n       *\n       * Starting from iOS 11, Safari on iOS is experiencing a bug that prevents\n       * event.preventDefault to be called on dynamically added listeners, which is\n       * what Flickity is using.\n       *\n       * The bug is coming from iOS but it impacts indirectly Flickity. A temporary\n       * fix has been suggested here: https://github.com/metafizzy/flickity/issues/740\n       * and that we are using here as a temporary workaround, that should be removed\n       * once the bug is fixed on iOS\n       * ----------------------------------------------------------------------------\n       */\n\n      (function () {\n        var touchingCarousel = false,\n          touchStartCoords;\n        document.body.addEventListener(\"touchstart\", function (e) {\n          var flickitySliderElement = e.target.closest(\".flickity-slider\");\n\n          if (flickitySliderElement) {\n            var flickity = js.data(\n              flickitySliderElement.closest(\".flickity-enabled\")\n            );\n\n            if (flickity.isDraggable) {\n              touchingCarousel = true;\n            } else {\n              touchingCarousel = false;\n              return;\n            }\n          } else {\n            touchingCarousel = false;\n            return;\n          }\n\n          touchStartCoords = {\n            x: e.touches[0].pageX,\n            y: e.touches[0].pageY,\n          };\n        });\n        document.body.addEventListener(\n          \"touchmove\",\n          function (e) {\n            if (!(touchingCarousel && e.cancelable)) {\n              return;\n            }\n\n            var moveVector = {\n              x: e.touches[0].pageX - touchStartCoords.x,\n              y: e.touches[0].pageY - touchStartCoords.y,\n            };\n            if (Math.abs(moveVector.x) > 8) e.preventDefault();\n          },\n          {\n            passive: false,\n          }\n        );\n      })();\n      /**\n       * ----------------------------------------------------------------------------\n       * UTILS\n       * ----------------------------------------------------------------------------\n       */\n\n      /**\n       * NOTE: I'm really not satisfied with the way this is handled, but this has been asked by design at the very\n       *       end of the process. This should be abstracted at some point to make it easier to re-use and with slightly\n       *       cleaner code!\n       */\n\n      (function () {\n        // In card, elements that have a \"card__section\" with a [aria-expanded] attribute can be clickable to open the content\n        // of the card itself\n        var documentDelegate = new Delegate(document.body);\n        documentDelegate.on(\n          \"click\",\n          \".expandable-content__toggle\",\n          function (item, expandableButton) {\n            var parentSection = expandableButton.closest(\".expandable-content\");\n\n            if (parentSection.getAttribute(\"aria-expanded\") === \"true\") {\n              // Previously expanded, so we have to close it\n              parentSection.setAttribute(\"aria-expanded\", \"false\");\n              parentSection.style[\"max-height\"] = \"\".concat(\n                parentSection.offsetHeight,\n                \"px\"\n              );\n              parentSection.offsetHeight; // Use to force a redraw\n\n              parentSection.style[\"max-height\"] = null; // Remove the attribute to let the CSS decide the max-height\n\n              var expandableText = expandableButton.querySelector(\n                \".expandable-content__toggle-text\"\n              );\n              expandableText.innerHTML =\n                expandableText.getAttribute(\"data-view-more\"); // We also have to scroll back to the top to preserve scroll position\n\n              var parentCard = parentSection.closest(\".card\");\n\n              if (parentCard) {\n                var amountToScroll =\n                  parentCard.getBoundingClientRect().top -\n                  15 -\n                  parseInt(\n                    getComputedStyle(document.documentElement).getPropertyValue(\n                      \"--header-height\"\n                    )\n                  );\n                window.scrollBy({\n                  top: amountToScroll,\n                  behavior: \"smooth\",\n                });\n              }\n            } else {\n              // Previously collapsed, so we have to open it\n              parentSection.setAttribute(\"aria-expanded\", \"true\"); // Because the expandable button is still positioned absolutely, we need to add margin to the sibling\n              // text to account the button. It's a bit ugly and hacky but this was the simplest I've found\n\n              if (expandableButton.previousElementSibling) {\n                expandableButton.previousElementSibling.style[\"margin-bottom\"] =\n                  \"\".concat(parseInt(expandableButton.clientHeight), \"px\");\n              }\n\n              Animation.slideDown(parentSection, null, \"max-height\");\n\n              var _expandableText = expandableButton.querySelector(\n                \".expandable-content__toggle-text\"\n              );\n\n              _expandableText.innerHTML =\n                _expandableText.getAttribute(\"data-view-less\");\n            }\n          }\n        );\n\n        var processCollapsibles = function processCollapsibles() {\n          document\n            .querySelectorAll(\".expandable-content[aria-expanded]\")\n            .forEach(function (item) {\n              if (item.scrollHeight > item.clientHeight) {\n                item.classList.add(\"expandable-content--expandable\");\n              } else {\n                item.setAttribute(\"aria-expanded\", \"true\");\n              }\n            });\n        };\n\n        document.addEventListener(\"shopify:section:load\", function (event) {\n          processCollapsibles();\n        });\n        processCollapsibles();\n      })();\n\n      (function () {\n        // Mobile browsers (like iOS) do not support opening keyboard, so we simply prevent the autofocus by unblurring\n        // all the fields\n        if (Responsive.getCurrentBreakpoint() === \"phone\") {\n          var autoFocusedElements =\n            document.querySelectorAll(\"input[autofocus]\");\n\n          for (var i = 0; i < autoFocusedElements.length; i++) {\n            autoFocusedElements[i].blur();\n            autoFocusedElements[i].removeAttribute(\"autofocus\");\n          }\n        }\n      })();\n\n      (function () {\n        var documentDelegate = new Delegate(document.body);\n        documentDelegate.on(\n          \"click\",\n          '[href^=\"#\"], [data-href]',\n          function (event, target) {\n            var selector = target.hasAttribute(\"href\")\n              ? target.getAttribute(\"href\")\n              : target.getAttribute(\"data-href\");\n\n            if (selector === \"#\" || selector === \"#main\") {\n              return;\n            }\n\n            var element = null;\n\n            try {\n              element = document.querySelector(selector);\n            } catch (exception) {\n              // We may have an invalid selector, so if we catch it we just return\n              return;\n            }\n\n            var offset = parseInt(target.getAttribute(\"data-offset\") || 0),\n              toTop = 0;\n\n            while (element.offsetParent.tagName !== \"BODY\") {\n              toTop += element.offsetTop;\n              element = element.offsetParent;\n            }\n\n            toTop += element.offsetTop;\n            window.scrollTo({\n              behavior: \"smooth\",\n              top: toTop - offset,\n            });\n            event.preventDefault();\n          }\n        );\n      })();\n\n      (function () {\n        function handleFirstTab(event) {\n          if (event.key === \"Tab\") {\n            document.body.classList.add(\"is-tabbing\");\n            window.removeEventListener(\"keydown\", handleFirstTab);\n          }\n        }\n\n        window.addEventListener(\"keydown\", handleFirstTab);\n      })();\n\n      (function () {\n        var documentDelegate = new Delegate(document.body);\n        documentDelegate.on(\n          \"keyup\",\n          \"input, textarea\",\n          function (event, target) {\n            target.classList.toggle(\"is-filled\", target.value !== \"\");\n          }\n        );\n        documentDelegate.on(\"change\", \"select\", function (event, target) {\n          target.parentNode.classList.toggle(\"is-filled\", target.value !== \"\");\n        });\n      })(); // This snippet allows to automatically adds a target=\"_blank\" to any link that is external. This is actually\n      // somewhat always desired by merchant and will allow to reduce support\n\n      (function () {\n        var links = document.links;\n        fastdom.mutate(function () {\n          for (var i = 0, linksLength = links.length; i < linksLength; i++) {\n            if (links[i].hostname !== window.location.hostname) {\n              links[i].target = \"_blank\";\n              links[i].relList.add(\"noopener\");\n              links[i].relList.add(\"noreferrer\");\n              links[i].setAttribute(\n                \"aria-describedby\",\n                \"a11y-new-window-message\"\n              );\n            }\n          }\n        });\n      })();\n    }; // In order to prevent loading polyfills on modern browser, we first detect if the browser support fetch and assign (if\n    // it does then it supports actually all the features we need). If that's not the case we first load the polyfill from\n    // polyfill.io and then boot the theme, otherwise we can skip this step completely\n\n    if (\"fetch\" in window && \"assign\" in Object) {\n      bootTheme();\n    } else {\n      var scriptEl = document.createElement(\"script\");\n      scriptEl.src =\n        \"//cdn.polyfill.io/v3/polyfill.min.js?unknown=polyfill&features=fetch,Element.prototype.closest,Element.prototype.matches,Element.prototype.remove,Element.prototype.classList,Array.prototype.includes,String.prototype.includes,Object.assign,CustomEvent,URL,DOMTokenList\";\n      scriptEl.async = false;\n\n      scriptEl.onload = function () {\n        bootTheme();\n      };\n\n      document.head.appendChild(scriptEl);\n    }\n  })();\n\n  // NEW PRODUCT DETAIL PAGE\n\n  // Accordion Function\n  var numAcn = 0;\n  var articleHeight = \"\";\n  var contentHeight = \"\";\n  $(\".product__accordion article\").each(function (numAcn) {\n    $(\".product__accordion .product__accordion__link\")\n      .eq(numAcn)\n      .click(function () {\n        articleHeight = 170;\n        contentHeight = Math.round(\n          $(\".product__accordion article\")\n            .eq(numAcn)\n            .find(\".product__accordion__content\")\n            .height()\n        );\n\n        $(\".product__accordion article\")\n          .eq(numAcn)\n          .toggleClass(\"accordionOpen\");\n\n        if (\n          $(\".product__accordion article\").eq(numAcn).hasClass(\"accordionOpen\")\n        ) {\n          $(\".product__accordion article\")\n            .eq(numAcn)\n            .css(\"height\", parseInt(articleHeight + contentHeight + 50) + \"px\");\n        } else {\n          $(\".product__accordion article\")\n            .eq(numAcn)\n            .css(\"height\", articleHeight);\n        }\n      });\n  });\n\n\n   $(\".product__accordion__link__spec\").click(function () {\n     \n        articleHeight = 170;\n        contentHeight = Math.round(\n          $(\"#ProductSpecifications\").find(\".product__accordion__content\").height()\n        );\n\n        $(\"#ProductSpecifications\").toggleClass(\"accordionOpen\");\n\n        if ($(\"#ProductSpecifications\").hasClass(\"accordionOpen\")) {\n          $(\"#ProductSpecifications\").css(\"height\", parseInt(articleHeight + contentHeight + 50) + \"px\");          \n          $(\"#ProductSpecifications > button > span.product__accordion__open\").css(\"transform\",\"rotate(45deg)\")\n        } else {\n          $(\"#ProductSpecifications\").css(\"height\", articleHeight);\n          $(\"#ProductSpecifications > button > span.product__accordion__open\").css(\"transform\",\"rotate(0deg)\")\n        }     \n     \n      });\n  // end: Accordion Function - Product Details Page\n\n  // LightBox Ziging - Product Details Page\n  $(\".sizingLink,.sizing__close\").on(\"click\", function () {\n    $(\".sizing__lighbox\").toggleClass(\"open\");\n    $(\"html\").toggleClass(\"noScroll\");\n  });\n\n  \n  // Fixed Gallery\n  var galleryFixed = $(\"#productGallery\");\n  var galleryHeight = Math.round(galleryFixed.innerHeight());\n  var galleryZoom = $(\".product__zoom-wrapper\");\n  var detailsColumn = $(\".newDetailsPage__details\");\n  var detailsHeight = \"\";\n  var detailsPosition = \"\";\n  var detailsWidth = \"\";\n\n  $(window).scroll(function () {\n    if(detailsColumn.length > 0){\n      detailsHeight = Math.round(detailsColumn.innerHeight());\n      detailsPosition = Math.round(\n        detailsColumn.offset().top - $(window).scrollTop()\n      );\n    }\n\n    if ($(this).scrollTop() > 281) {\n      galleryFixed.addClass(\"fixed__gallery\");\n      galleryZoom.addClass(\"fixed__zoom\");\n    } else {\n      galleryFixed.removeClass(\"fixed__gallery\");\n      galleryZoom.removeClass(\"fixed__zoom\");\n    }\n\n    if (detailsPosition + detailsHeight <= galleryHeight) {\n      galleryFixed.addClass(\"no__fixed__gallery\");\n      galleryZoom.addClass(\"no__fixed__zoom\");\n    } else {\n      galleryFixed.removeClass(\"no__fixed__gallery\");\n      galleryZoom.removeClass(\"no__fixed__zoom\");\n    }\n\n    if ($(document).width() > 1776) {\n      // console.log($(document).width());\n      if (galleryFixed.hasClass(\"fixed__gallery\")) {\n        $(\"#productGallery\").css(\n          \"left\",\n          ($(document).width() - 1640) / 2 - 8 + \"px\"\n        );\n      } else {\n        $(\"#productGallery\").css(\"left\", \"0px\");\n      }\n    } else {\n      if (galleryFixed.hasClass(\"fixed__gallery\")) {\n        $(\"#productGallery\").css(\"left\", \"40px\");\n      } else {\n        $(\"#productGallery\").css(\"left\", \"0px\");\n      }\n    }\n  });\n\n  $(window).resize(function () {\n    detailsWidth = detailsColumn.innerWidth();\n\n    if ($(document).width() > 1776) {\n      if (galleryFixed.hasClass(\"fixed__gallery\")) {\n        $(\"#productGallery\").css(\n          \"left\",\n          ($(document).width() - 1640) / 2 - 8 + \"px\"\n        );\n      } else {\n        $(\"#productGallery\").css(\"left\", \"0px\");\n      }\n    } else {\n      if (galleryFixed.hasClass(\"fixed__gallery\")) {\n        $(\"#productGallery\").css(\"left\", \"40px\");\n      } else {\n        $(\"#productGallery\").css(\"left\", \"0px\");\n      }\n    }\n  });\n\n  // end: Fixed Gallery\n\n  // Thumbnails Scroll X\n\n    const element = document.querySelector(\"#thumbnailList\");\n    if(element != null){\n      element.addEventListener(\"wheel\", (event) => {\n        event.preventDefault();\n        element.scrollBy({\n          left: event.deltaY < 0 ? -30 : 30,\n        });\n      });\n    }\n  \n});\n\n\nif (!customElements.get('quantity-input')) {\n  customElements.define(\n    'quantity-input',\n\nclass QuantityInput extends HTMLElement {\n  constructor() {\n    super();\n    this.input = this.querySelector('input');\n    this.changeEvent = new Event('change', { bubbles: true });\n    this.input.addEventListener('change', this.onInputChange.bind(this));\n    this.querySelectorAll('button').forEach((button) =>\n      button.addEventListener('click', this.onButtonClick.bind(this))\n    );\n  }\n\n  quantityUpdateUnsubscriber = undefined;\n\n  connectedCallback() {\n    this.validateQtyRules();\n    this.quantityUpdateUnsubscriber = subscribe(PUB_SUB_EVENTS.quantityUpdate, this.validateQtyRules.bind(this));\n  }\n\n  disconnectedCallback() {\n    if (this.quantityUpdateUnsubscriber) {\n      this.quantityUpdateUnsubscriber();\n    }\n  }\n\n  onInputChange(event) {\n    this.validateQtyRules();\n  }\n\n  onButtonClick(event) {\n    event.preventDefault();\n    const previousValue = this.input.value;\n\n    event.target.name === 'plus' ? this.input.stepUp() : this.input.stepDown();\n    if (previousValue !== this.input.value) this.input.dispatchEvent(this.changeEvent);\n  }\n\n  validateQtyRules() {\n    const value = parseInt(this.input.value);\n\n    $(\".quantity-selector__value\").val(value)\n    if (this.input.min) {\n      const min = parseInt(this.input.min);\n      const buttonMinus = this.querySelector(\".quantity__button[name='minus']\");\n      buttonMinus.classList.toggle('disabled', value <= min);\n    }\n    if (this.input.max) {\n      const max = parseInt(this.input.max);\n      const buttonPlus = this.querySelector(\".quantity__button[name='plus']\");\n      buttonPlus.classList.toggle('disabled', value >= max);\n    }\n  }\n}\n      );\n}\n"],
  "mappings": "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",
  "names": ["obj", "Animation", "element", "transitionEnded", "event", "Dom", "Delegate", "CollapsibleManager", "CountrySelector", "Responsive", "DesktopNavigation", "menuToClose", "index", "self", "fastdom", "CollectionFilterDrawer", "ExitPopup", "LoadingBar", "Accessibility", "Cart", "MobileNavigation", "ModalManager", "onOpen", "onClose", "NewsletterPopup", "OverflowScroller", "PopoverManager", "ProductItemColorSwatch", "Currency", "value", "Form", "StoreAvailability", "availabilityModal", "ProductVariants", "availableVariants", "variant", "valueIndex", "ProductModel", "ProductVideo", "global", "window", "getSize", "matchesSelector", "utils", "console", "cell", "getComputedStyle", "slide", "flickity", "distance", "module", "delta", "p2", "p", "_onFirstMouseMove", "animloop", "_dragUpdateLoop", "_closestElement", "_releaseAnimData", "item", "_updateHash", "BoundingBox", "Trigger", "ZoomPane", "Drift", "ProductGallery", "animate", "QuantityPicker", "ShippingEstimator", "response", "ValuePicker", "AccountSection", "AnnouncementBarSection", "BlogSection", "BlogPostSection", "BlogSidebarSection", "ProductSection", "CartSection", "doCleanUp", "CollectionListSection", "CollectionSection", "FeaturedCollectionSection", "GiftCardSection", "FooterSection", "SearchBar", "HeaderSection", "LoginSection", "MapSection", "MinimalHeaderSection", "QuickLinksSection", "PopupsSection", "ProductRecommendationsSection", "RecentlyViewedProductsSection", "SectionContainer", "SlideshowSection", "TextWithIconsSection", "VideoSection", "Element", "document", "Date", "lazysizes", "addEventListener", "setTimeout", "requestAnimationFrame", "requestIdleCallback", "addRemoveLoadEvents", "later", "onload", "init", "globalInstall", "attr", "img", "runMatchMedia", "media", "numAcn"]
}
